NVMe driver init sequence

Kinjal Patel Kinjal.Patel at taec.toshiba.com
Fri Aug 18 21:04:03 UTC 2017


Created a bug #22166 (https://bugs.freebsd.org/bugzilla/show_bug.cgi?id=221616)
Updated the description and patch to it.

Regards,
Kinjal Patel

From: Kinjal Patel
Sent: Friday, August 18, 2017 1:51 PM
To: 'Warner Losh'
Cc: freebsd-drivers at freebsd.org
Subject: RE: NVMe driver init sequence

Here is a the change I propose. This will make the init sequence right.

Index: sys/dev/nvme/nvme.c
===================================================================
--- sys/dev/nvme/nvme.c (revision 322672)
+++ sys/dev/nvme/nvme.c (working copy)
@@ -253,6 +253,9 @@
                return (status);
        }

+    /* make device bus-master before attempting to enable controller */
+    pci_enable_busmaster(dev);
+
        /*
         * Reset controller twice to ensure we do a transition from cc.en==1
         *  to cc.en==0.  This is because we don't really know what status
@@ -270,8 +273,6 @@
                return (status);
        }

-       pci_enable_busmaster(dev);
-
        ctrlr->config_hook.ich_func = nvme_ctrlr_start_config_hook;
        ctrlr->config_hook.ich_arg = ctrlr;



regards,
Kinjal Patel

From: wlosh at bsdimp.com<mailto:wlosh at bsdimp.com> [mailto:wlosh at bsdimp.com] On Behalf Of Warner Losh
Sent: Thursday, August 17, 2017 3:10 PM
To: Kinjal Patel
Cc: freebsd-drivers at freebsd.org<mailto:freebsd-drivers at freebsd.org>
Subject: Re: NVMe driver init sequence

This sounds right to me....  Most BIOSes seem to enable BME=1.

Warner

On Thu, Aug 17, 2017 at 2:45 PM, Kinjal Patel <Kinjal.Patel at taec.toshiba.com<mailto:Kinjal.Patel at taec.toshiba.com>> wrote:
Hi,

I have a query on NVMe driver init sequence in FreeBSD 10.3(stable).

The driver init sequence is,

1)      Enable controller (CC.EN=1)

2)      Wait for controller ready (CSTS.RDY=1)

3)      Set PCI bus master enable (BME=1)

As per NVMe spec, when NVMe controller becomes ready it has to process command.

"Enable (EN): When set to '1', then the controller shall process commands based on Submission Queue Tail doorbell writes"

And per PCI Express spec when BME is not set, the PCI Express Function is not allowed to issue any Memory or I/O requests.
"Bus Master Enable - Controls the ability of a PCI Express Endpoint to issue Memory95 and I/O Read/Write Requests, and
the ability of a Root or Switch Port to forward Memory and I/O Read/Write Requests in the Upstream direction"

Enabling controller before setting BME=1 is violation of spec, as controller has to accept commands but BME is prerequisite for that.

The Linux device driver init sequence is,

1)     Set PCI bus master enable (BME=1)

2)     Enable Controller (CC.EN=1)

3)     Wait for controller ready (CSTS.RDY=1)

The FreeBSD NVMe driver sequence should be changed to set BME=1 before attempting to enable controller.


Regards,
Kinjal Patel
_______________________________________________
freebsd-drivers at freebsd.org<mailto:freebsd-drivers at freebsd.org> mailing list
https://lists.freebsd.org/mailman/listinfo/freebsd-drivers
To unsubscribe, send any mail to "freebsd-drivers-unsubscribe at freebsd.org<mailto:freebsd-drivers-unsubscribe at freebsd.org>"



More information about the freebsd-drivers mailing list