Skip site navigation (1)Skip section navigation (2)
Date:      Thu, 17 Aug 2017 20:45:38 +0000
From:      Kinjal Patel <Kinjal.Patel@taec.toshiba.com>
To:        "freebsd-drivers@freebsd.org" <freebsd-drivers@freebsd.org>
Subject:   NVMe driver init sequence
Message-ID:  <FF0EFEF230D6F6409EC6998DBF26B91640483138@EXMAIL1.taec.toshiba.com>

next in thread | raw e-mail | index | archive | help
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=3D1)

2)      Wait for controller ready (CSTS.RDY=3D1)

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

As per NVMe spec, when NVMe controller becomes ready it has to process comm=
and.

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

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

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

The Linux device driver init sequence is,

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

2)     Enable Controller (CC.EN=3D1)

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

The FreeBSD NVMe driver sequence should be changed to set BME=3D1 before at=
tempting to enable controller.


Regards,
Kinjal Patel



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?FF0EFEF230D6F6409EC6998DBF26B91640483138>