Skip site navigation (1)Skip section navigation (2)
Date:      Fri, 1 May 2020 04:24:49 +0300
From:      Yuri Pankov <ypankov@fastmail.com>
To:        current@freebsd.org
Subject:   Re: nvme on 2019 macbooks
Message-ID:  <79fec490-d3b1-b91b-652c-e9bf0d121d7c@fastmail.com>
In-Reply-To: <cb02bcb1-482b-0920-507e-79213c1ba1ff@fastmail.com>
References:  <cb02bcb1-482b-0920-507e-79213c1ba1ff@fastmail.com>

index | next in thread | previous in thread | raw e-mail

[-- Attachment #1 --]
Yuri Pankov wrote:
> I have tried booting latest -current snapshot on 2019 macbook pro 16, 
> and noticed that nvme driver didn't attach, as class reported is 
> 0x018002 and not 0x010802 that we expect in nvme_pci.c.
> 
> The following linux changes seem to be related:
> https://github.com/torvalds/linux/commit/66341331ba0d2de4ff421cdc401a1e34de50502a 
> 
> https://github.com/torvalds/linux/commit/d38e9f04ebf667d9cb8185b45bff747485f1d3e9 
> 
> 
> I have tried adding the exact PCI IDs, but that also fails as number of 
> msix vectors seems to be 0 in nvme_ctrlr_setup_interrupts() and 
> nvme_ctrlr_configure_intx() fails with "unable to allocate shared IRQ".
> 
> Any hints on how to proceed here?

So it looks like we need to fallback to MSI if we failed to enable 
MSI-X.  With the attached patch we still fail to attach the target 
device (as below) most likely due to the quirks needed as seen in linux 
driver, but it's definitely a start:

nvme0: CREATE IO CQ (05) sqid:0 cid:15 nsid:0 cdw10:00800001 cdw11:00010003
nvme0: INVALID_FIELD (00/02) sqid:0 cid:15 cdw0:0
nvme0: nvme_create_io_cq failed!

[-- Attachment #2 --]
diff --git a/sys/dev/nvme/nvme_pci.c b/sys/dev/nvme/nvme_pci.c
index 448bfda6a718..e609967b53fe 100644
--- a/sys/dev/nvme/nvme_pci.c
+++ b/sys/dev/nvme/nvme_pci.c
@@ -90,6 +90,7 @@ static struct _pcsid
 	{ 0x05401c5f,		0, 0, "Memblaze Pblaze4", QUIRK_DELAY_B4_CHK_RDY },
 	{ 0xa821144d,		0, 0, "Samsung PM1725", QUIRK_DELAY_B4_CHK_RDY },
 	{ 0xa822144d,		0, 0, "Samsung PM1725a", QUIRK_DELAY_B4_CHK_RDY },
+	{ 0x2005106b,		0, 0, "ANS2 NVMe Controller" },
 	{ 0x00000000,		0, 0, NULL  }
 };
 
@@ -267,7 +268,7 @@ nvme_ctrlr_setup_interrupts(struct nvme_controller *ctrlr)
 
 	force_intx = 0;
 	TUNABLE_INT_FETCH("hw.nvme.force_intx", &force_intx);
-	if (force_intx || pci_msix_count(dev) < 2) {
+	if (force_intx) {
 		nvme_ctrlr_configure_intx(ctrlr);
 		return;
 	}
@@ -297,9 +298,14 @@ nvme_ctrlr_setup_interrupts(struct nvme_controller *ctrlr)
 	/* One vector for per core I/O queue, plus one vector for admin queue. */
 	num_vectors_requested = num_io_queues + 1;
 	num_vectors_allocated = num_vectors_requested;
+
+	/* Try MSI-X */
 	if (pci_alloc_msix(dev, &num_vectors_allocated) != 0) {
-		nvme_ctrlr_configure_intx(ctrlr);
-		return;
+		/* MSI-X failed, try MSI */
+		if (pci_alloc_msi(dev, &num_vectors_allocated) != 0) {
+			nvme_ctrlr_configure_intx(ctrlr);
+			return;
+		}
 	}
 	if (num_vectors_allocated < 2) {
 		pci_release_msi(dev);
help

Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?79fec490-d3b1-b91b-652c-e9bf0d121d7c>