Add more logging levels
This commit is contained in:
+58
-58
@@ -89,118 +89,118 @@ static uint16_t io_cq_head = 0;
|
||||
static void admin_exec_sync(nvme_sqe_t *cmd) {
|
||||
cmd->cid = admin_sq_tail;
|
||||
|
||||
TRACE_LN("Queueing submission...");
|
||||
TRACE_VAL_F(cmd->opc, "%hhx");
|
||||
TRACE_VAL_F(cmd->nsid, "%x");
|
||||
TRACE_VAL_F(cmd->cdw10, "%x");
|
||||
TRACE_VAL_F(cmd->cdw11, "%x");
|
||||
TRACE_VAL_F(cmd->cdw12, "%x");
|
||||
TRACE_VAL_F(cmd->prp1, "%lx");
|
||||
TRACE_VAL_F(cmd->prp2, "%lx");
|
||||
LOG_LN_STEP("Queueing submission...");
|
||||
LOG_VAL_TRACE(cmd->opc, "%hhx");
|
||||
LOG_VAL_TRACE(cmd->nsid, "%x");
|
||||
LOG_VAL_TRACE(cmd->cdw10, "%x");
|
||||
LOG_VAL_TRACE(cmd->cdw11, "%x");
|
||||
LOG_VAL_TRACE(cmd->cdw12, "%x");
|
||||
LOG_VAL_TRACE(cmd->prp1, "%lx");
|
||||
LOG_VAL_TRACE(cmd->prp2, "%lx");
|
||||
|
||||
memory_copy(cmd, sizeof(nvme_sqe_t), &admin_sq[admin_sq_tail]);
|
||||
|
||||
TRACE_LN("Advancing submission doorbell...");
|
||||
LOG_LN_STEP("Advancing submission doorbell...");
|
||||
db_regs[0] = admin_sq_tail = (admin_sq_tail + 1) % QUEUE_DEPTH;
|
||||
TRACE_VAL_F(admin_sq_tail, "%u");
|
||||
LOG_VAL_TRACE(admin_sq_tail, "%u");
|
||||
|
||||
TRACE_LN("Waiting for completion...");
|
||||
LOG_LN_STEP("Waiting for completion...");
|
||||
nvme_cqe_t *cmp = &admin_cq[admin_cq_head];
|
||||
while (NVME_CQE_P(cmp) != admin_cq_phase)
|
||||
;
|
||||
|
||||
TRACE_LN("Received completion...");
|
||||
TRACE_VAL_F(cmp->dw0, "%x");
|
||||
TRACE_VAL_F(cmp->reserved, "%x");
|
||||
TRACE_VAL_F(cmp->sqhd, "%hx");
|
||||
TRACE_VAL_F(cmp->sqid, "%hx");
|
||||
TRACE_VAL_F(cmp->cid, "%hx");
|
||||
TRACE_VAL_F(cmp->status, "%hx");
|
||||
LOG_LN_STEP("Received completion...");
|
||||
LOG_VAL_TRACE(cmp->dw0, "%x");
|
||||
LOG_VAL_TRACE(cmp->reserved, "%x");
|
||||
LOG_VAL_TRACE(cmp->sqhd, "%hx");
|
||||
LOG_VAL_TRACE(cmp->sqid, "%hx");
|
||||
LOG_VAL_TRACE(cmp->cid, "%hx");
|
||||
LOG_VAL_TRACE(cmp->status, "%hx");
|
||||
ASSERT(NVME_CQE_STATUS(cmp) == 0, "admin_exec_sync: NVMe command failed.");
|
||||
|
||||
TRACE_LN("Advancing completion doorbell...");
|
||||
LOG_LN_STEP("Advancing completion doorbell...");
|
||||
db_regs[1] = admin_cq_head = (admin_cq_head + 1) % QUEUE_DEPTH;
|
||||
admin_cq_phase ^= (admin_cq_head == 0);
|
||||
|
||||
TRACE_LN("Done.");
|
||||
LOG_LN_STEP("Done.");
|
||||
}
|
||||
|
||||
static void io_exec_sync(nvme_sqe_t *cmd) {
|
||||
cmd->cid = io_sq_tail;
|
||||
|
||||
TRACE_LN("Queueing submission...");
|
||||
TRACE_VAL_F(cmd->opc, "%hhx");
|
||||
TRACE_VAL_F(cmd->nsid, "%x");
|
||||
TRACE_VAL_F(cmd->cdw10, "%x");
|
||||
TRACE_VAL_F(cmd->cdw11, "%x");
|
||||
TRACE_VAL_F(cmd->cdw12, "%x");
|
||||
TRACE_VAL_F(cmd->prp1, "%x");
|
||||
TRACE_VAL_F(cmd->prp2, "%x");
|
||||
LOG_LN_STEP("Queueing submission...");
|
||||
LOG_VAL_TRACE(cmd->opc, "%hhx");
|
||||
LOG_VAL_TRACE(cmd->nsid, "%x");
|
||||
LOG_VAL_TRACE(cmd->cdw10, "%x");
|
||||
LOG_VAL_TRACE(cmd->cdw11, "%x");
|
||||
LOG_VAL_TRACE(cmd->cdw12, "%x");
|
||||
LOG_VAL_TRACE(cmd->prp1, "%x");
|
||||
LOG_VAL_TRACE(cmd->prp2, "%x");
|
||||
|
||||
memory_copy(cmd, sizeof(nvme_sqe_t), &io_sq[io_sq_tail]);
|
||||
|
||||
TRACE_LN("Advancing submission doorbell...");
|
||||
LOG_LN_STEP("Advancing submission doorbell...");
|
||||
db_regs[2] = io_sq_tail = (io_sq_tail + 1) % QUEUE_DEPTH;
|
||||
|
||||
TRACE_LN("Waiting for completion...");
|
||||
LOG_LN_STEP("Waiting for completion...");
|
||||
nvme_cqe_t *cmp = &io_cq[io_cq_head];
|
||||
while (NVME_CQE_P(cmp) != io_cq_phase)
|
||||
;
|
||||
|
||||
TRACE_LN("Received completion...");
|
||||
TRACE_VAL_F(cmp->dw0, "%x");
|
||||
TRACE_VAL_F(cmp->reserved, "%x");
|
||||
TRACE_VAL_F(cmp->sqhd, "%hx");
|
||||
TRACE_VAL_F(cmp->sqid, "%hx");
|
||||
TRACE_VAL_F(cmp->cid, "%hx");
|
||||
TRACE_VAL_F(cmp->status, "%hx");
|
||||
LOG_LN_STEP("Received completion...");
|
||||
LOG_VAL_TRACE(cmp->dw0, "%x");
|
||||
LOG_VAL_TRACE(cmp->reserved, "%x");
|
||||
LOG_VAL_TRACE(cmp->sqhd, "%hx");
|
||||
LOG_VAL_TRACE(cmp->sqid, "%hx");
|
||||
LOG_VAL_TRACE(cmp->cid, "%hx");
|
||||
LOG_VAL_TRACE(cmp->status, "%hx");
|
||||
|
||||
ASSERT(NVME_CQE_STATUS(cmp) == 0, "io_exec_sync: NVMe command failed.");
|
||||
|
||||
TRACE_LN("Advancing completion doorbell...");
|
||||
LOG_LN_STEP("Advancing completion doorbell...");
|
||||
db_regs[3] = io_cq_head = (io_cq_head + 1) % QUEUE_DEPTH;
|
||||
io_cq_phase ^= (io_cq_head == 0);
|
||||
|
||||
TRACE_LN("Done.");
|
||||
LOG_LN_STEP("Done.");
|
||||
}
|
||||
|
||||
void nvme_init() {
|
||||
TRACE_LN("Searching for suitable device...");
|
||||
LOG_LN_INFO("Searching for suitable device...");
|
||||
pci_bdf_t bdf = pci_find_by_class(NVME_PCI_CLASS, NVME_PCI_SUBCLASS, NUL);
|
||||
ASSERT(bdf, "nvme_init: No suitable devices found.");
|
||||
|
||||
TRACE_LN("Mapping device to virtual memory...");
|
||||
LOG_LN_INFO("Mapping device to virtual memory...");
|
||||
pci_map(bdf, regs, 4);
|
||||
ASSERT(NVME_REGS_NVME_CS_SUPPORTED(regs), "nvme_init: NVM command set not supported.");
|
||||
ASSERT(QUEUE_DEPTH <= NVME_REGS_MQES(regs), "nvme_init: Command queues are too big.")
|
||||
|
||||
TRACE_LN("Disabling device...");
|
||||
LOG_LN_INFO("Disabling device...");
|
||||
regs->cc = 0;
|
||||
TRACE_VAL_F(regs->cc, "%lx");
|
||||
LOG_VAL_DATA(regs->cc, "%lx");
|
||||
while (NVME_REGS_RDY(regs))
|
||||
;
|
||||
TRACE_VAL_F(regs->cc, "%lx");
|
||||
LOG_VAL_DATA(regs->cc, "%lx");
|
||||
|
||||
TRACE_LN("Configuring device...");
|
||||
LOG_LN_INFO("Configuring device...");
|
||||
NVME_REGS_ASQS_W(regs, QUEUE_DEPTH - 1);
|
||||
regs->asq = (uint64_t)(VIRT_TO_PHYS(admin_sq));
|
||||
NVME_REGS_ACQS_W(regs, QUEUE_DEPTH - 1);
|
||||
regs->acq = (uint64_t)(VIRT_TO_PHYS(admin_cq));
|
||||
TRACE_VAL_F(regs->asq, "%lx");
|
||||
TRACE_VAL_F(regs->acq, "%lx");
|
||||
TRACE_VAL_F(regs->aqa, "%lx");
|
||||
LOG_VAL_DATA(regs->asq, "%lx");
|
||||
LOG_VAL_DATA(regs->acq, "%lx");
|
||||
LOG_VAL_DATA(regs->aqa, "%lx");
|
||||
|
||||
TRACE_LN("Enabling device...");
|
||||
LOG_LN_INFO("Enabling device...");
|
||||
NVME_REGS_IOCQES_W(regs, 4);
|
||||
NVME_REGS_IOSQES_W(regs, 6);
|
||||
NVME_REGS_CSS_W(regs, 0);
|
||||
NVME_REGS_EN_W(regs, 1);
|
||||
TRACE_VAL_F(regs->cc, "%lx");
|
||||
LOG_VAL_DATA(regs->cc, "%lx");
|
||||
while (!NVME_REGS_RDY(regs))
|
||||
;
|
||||
TRACE_VAL_F(regs->cc, "%lx");
|
||||
LOG_VAL_DATA(regs->cc, "%lx");
|
||||
|
||||
TRACE_LN("Creating I/O completion queue...");
|
||||
LOG_LN_INFO("Creating I/O completion queue...");
|
||||
nvme_sqe_t create_io_cq = {
|
||||
.opc = 0x05,
|
||||
.prp1 = (uint64_t)VIRT_TO_PHYS(io_cq),
|
||||
@@ -209,7 +209,7 @@ void nvme_init() {
|
||||
};
|
||||
admin_exec_sync(&create_io_cq);
|
||||
|
||||
TRACE_LN("Creating I/O submission queue...");
|
||||
LOG_LN_INFO("Creating I/O submission queue...");
|
||||
nvme_sqe_t create_io_sq = {
|
||||
.opc = 0x01,
|
||||
.prp1 = (uint64_t)VIRT_TO_PHYS(io_sq),
|
||||
@@ -218,11 +218,11 @@ void nvme_init() {
|
||||
};
|
||||
admin_exec_sync(&create_io_sq);
|
||||
|
||||
TRACE_LN("Done.");
|
||||
LOG_LN_INFO("Done.");
|
||||
}
|
||||
|
||||
void nvme_read_sectors(uint32_t index, uint8_t count, void *to) {
|
||||
TRACE_LN("Reading %u sectors at %u...", count, index);
|
||||
LOG_LN_STEP("Reading %u sectors at %u...", count, index);
|
||||
|
||||
while (count) {
|
||||
uint64_t remainder = PAGE_SIZE - (uint64_t)to % PAGE_SIZE;
|
||||
@@ -246,11 +246,11 @@ void nvme_read_sectors(uint32_t index, uint8_t count, void *to) {
|
||||
to = (void *)((uint8_t *)to + i_count * SECTOR_SIZE);
|
||||
}
|
||||
|
||||
TRACE_LN("Done.");
|
||||
LOG_LN_STEP("Done.");
|
||||
}
|
||||
|
||||
void nvme_write_sectors(uint32_t index, uint8_t count, const void *from) {
|
||||
TRACE_LN("Writing %u sectors at %u...", count, index);
|
||||
LOG_LN_STEP("Writing %u sectors at %u...", count, index);
|
||||
|
||||
while (count) {
|
||||
uint64_t remainder = PAGE_SIZE - (uint64_t)from % PAGE_SIZE;
|
||||
@@ -274,5 +274,5 @@ void nvme_write_sectors(uint32_t index, uint8_t count, const void *from) {
|
||||
from = (void *)((uint8_t *)from + i_count * SECTOR_SIZE);
|
||||
}
|
||||
|
||||
TRACE_LN("Done.");
|
||||
LOG_LN_STEP("Done.");
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user