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>