nvme: support 64 LBAF formats
Change-Id: Ia1cc446ba1985f5e3ce80a8046aac6947b20d710
Reviewed-on: https://review.haiku-os.org/c/haiku/+/9688
Reviewed-by: waddlesplash <waddlesplash@gmail.com>
Diff
src/add-ons/kernel/drivers/disk/nvme/libnvme/nvme_ns.c | 15 ++++++++++++++-
src/add-ons/kernel/drivers/disk/nvme/libnvme/nvme_spec.h | 10 +++++++---
2 files changed, 17 insertions(+), 8 deletions(-)
@@ -38,6 +38,14 @@
return &ns->ctrlr->nsdata[ns->id - 1];
}
static inline uint32_t nvme_ns_get_format_index(struct nvme_ns_data *nsdata)
{
uint32_t format_index = nsdata->flbas.format;
if (nsdata->nlbaf >= 16)
format_index += nsdata->flbas.msb_format << 4;
return format_index;
}
static int nvme_ns_identify_update(struct nvme_ns *ns)
{
struct nvme_ctrlr *ctrlr = ns->ctrlr;
@@ -51,7 +59,8 @@
return ret;
}
sector_size = 1 << nsdata->lbaf[nsdata->flbas.format].lbads;
uint32_t format_index = nvme_ns_get_format_index(nsdata);
sector_size = 1 << nsdata->lbaf[format_index].lbads;
ns->sector_size = sector_size;
ns->sectors_per_max_io = ctrlr->max_xfer_size / sector_size;
@@ -71,10 +80,10 @@
if (nsdata->nsrescap.raw)
ns->flags |= NVME_NS_RESERVATION_SUPPORTED;
ns->md_size = nsdata->lbaf[nsdata->flbas.format].ms;
ns->md_size = nsdata->lbaf[format_index].ms;
ns->pi_type = NVME_FMT_NVM_PROTECTION_DISABLE;
if (nsdata->lbaf[nsdata->flbas.format].ms && nsdata->dps.pit) {
if (nsdata->lbaf[format_index].ms && nsdata->dps.pit) {
ns->flags |= NVME_NS_DPS_PI_SUPPORTED;
ns->pi_type = nsdata->dps.pit;
if (nsdata->flbas.extended)
@@ -1446,7 +1446,8 @@
struct {
uint8_t format : 4;
uint8_t extended : 1;
uint8_t reserved2 : 3;
uint8_t msb_format: 2;
uint8_t reserved2 : 1;
} flbas;
/*
@@ -1646,10 +1647,8 @@
uint32_t rp : 2;
uint32_t reserved6 : 6;
} lbaf[16];
} lbaf[64];
uint8_t reserved6[192];
uint8_t vendor_specific[3712];
};
nvme_static_assert(sizeof(struct nvme_ns_data) == 4096, "Incorrect size");
@@ -2066,7 +2065,8 @@
uint32_t pi : 3;
uint32_t pil : 1;
uint32_t ses : 3;
uint32_t reserved : 20;
uint32_t lbafu : 2;
uint32_t reserved : 18;
};
nvme_static_assert(sizeof(struct nvme_format) == 4, "Incorrect size");