⛏️ index : haiku.git

author Jérôme Duval <jerome.duval@gmail.com> 2025-10-11 19:22:56.0 +02:00:00
committer waddlesplash <waddlesplash@gmail.com> 2025-10-13 16:04:55.0 +00:00:00
commit
ba952ac9c02d487f07f43469f3da66059d288ddd [patch]
tree
d008b8667d444b9081c5f621adcde3420e0cef6c
parent
f7d2fc176e09b850909d6608ac60e9b9a6f1bcbc
download
ba952ac9c02d487f07f43469f3da66059d288ddd.tar.gz

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(-)

diff --git a/src/add-ons/kernel/drivers/disk/nvme/libnvme/nvme_ns.c b/src/add-ons/kernel/drivers/disk/nvme/libnvme/nvme_ns.c
index b9b50e3..3c4dab6 100644
--- a/src/add-ons/kernel/drivers/disk/nvme/libnvme/nvme_ns.c
+++ b/src/add-ons/kernel/drivers/disk/nvme/libnvme/nvme_ns.c
@@ -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)
diff --git a/src/add-ons/kernel/drivers/disk/nvme/libnvme/nvme_spec.h b/src/add-ons/kernel/drivers/disk/nvme/libnvme/nvme_spec.h
index 807de41..173c798 100644
--- a/src/add-ons/kernel/drivers/disk/nvme/libnvme/nvme_spec.h
+++ b/src/add-ons/kernel/drivers/disk/nvme/libnvme/nvme_spec.h
@@ -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");