diff options
author | Ian Moffett <ian@osmora.org> | 2024-07-10 22:00:27 -0400 |
---|---|---|
committer | Ian Moffett <ian@osmora.org> | 2024-07-10 22:04:21 -0400 |
commit | 26e17c070f845e4d93bff080eead9f5d22253319 (patch) | |
tree | 69a64015f8fc00d16c73c109d4304bea6af2617b /sys | |
parent | 67f9d3c5e58f1a958a2b1b7a102a71e3ce252fc4 (diff) |
kernel: nvme: Improve nvme_identify()
Require an NSID and CNS value to be passed to the nvme_identify()
function. This enables the caller to control what type of data is returned by
the NVMe controller.
Signed-off-by: Ian Moffett <ian@osmora.org>
Diffstat (limited to 'sys')
-rw-r--r-- | sys/dev/ic/nvme.c | 13 | ||||
-rw-r--r-- | sys/include/dev/ic/nvmevar.h | 4 |
2 files changed, 11 insertions, 6 deletions
diff --git a/sys/dev/ic/nvme.c b/sys/dev/ic/nvme.c index 5f92d0e..9eb302b 100644 --- a/sys/dev/ic/nvme.c +++ b/sys/dev/ic/nvme.c @@ -244,19 +244,19 @@ nvme_poll_submit_cmd(struct nvme_queue *q, struct nvme_cmd cmd) } static int -nvme_identify(struct nvme_ctrl *ctrl, struct nvme_id *id) +nvme_identify(struct nvme_ctrl *ctrl, void *buf, uint32_t nsid, uint8_t cns) { struct nvme_cmd cmd = {0}; struct nvme_identify_cmd *idcmd = &cmd.identify; - if (!is_4k_aligned(id)) { + if (!is_4k_aligned(buf)) { return -1; } idcmd->opcode = NVME_OP_IDENTIFY; - idcmd->nsid = 0; - idcmd->cns = 1; /* Identify controller */ - idcmd->prp1 = VIRT_TO_PHYS(id); + idcmd->nsid = nsid; + idcmd->cns = cns; /* Identify controller */ + idcmd->prp1 = VIRT_TO_PHYS(buf); idcmd->prp2 = 0; return nvme_poll_submit_cmd(&ctrl->adminq, cmd); } @@ -338,8 +338,9 @@ nvme_init_ctrl(struct nvme_bar *bar) return -ENOMEM; } - nvme_identify(&ctrl, id); + nvme_identify(&ctrl, id, 0, ID_CNS_CTRL); nvme_log_ctrl_id(id); + dynfree(id); return 0; } diff --git a/sys/include/dev/ic/nvmevar.h b/sys/include/dev/ic/nvmevar.h index aa68331..355abd8 100644 --- a/sys/include/dev/ic/nvmevar.h +++ b/sys/include/dev/ic/nvmevar.h @@ -37,6 +37,10 @@ #define NVME_OP_CREATE_IOCQ 0x05 #define NVME_OP_IDENTIFY 0x06 +/* Identify CNS values */ +#define ID_CNS_CTRL 0x01 /* Identify controller */ +#define ID_CNS_NSID_LIST 0x07 /* Active NSID list */ + struct nvme_identify_cmd { uint8_t opcode; uint8_t flags; |