Revision: 14657
          http://sourceforge.net/p/edk2/code/14657
Author:   erictian
Date:     2013-09-11 06:57:53 +0000 (Wed, 11 Sep 2013)
Log Message:
-----------
MdeModulePkg/NvmExpressDxe: Fix some bugs

1) The Queue size field in create I/O submission/completion queue cmds is 
0-based. the current code is 1-based.
2) a typo on allocated memory page size. it's inconsistent that some places is 
using 4 pages, but a place is using 6 pages.
3) a typo on PRP/SGL mechanism judgment. should directly use Psdt field rather 
than Opc field.
4) some platforms may not support UINT64 width access on MMIO register. Fix it 
to use two 32-bit width access.

Signed-off-by: Feng Tian <[email protected]>
Reviewed-by: Kinney Michael <[email protected]>

Modified Paths:
--------------
    trunk/edk2/MdeModulePkg/Bus/Pci/NvmExpressDxe/NvmExpress.c
    trunk/edk2/MdeModulePkg/Bus/Pci/NvmExpressDxe/NvmExpress.h
    trunk/edk2/MdeModulePkg/Bus/Pci/NvmExpressDxe/NvmExpressBlockIo.c
    trunk/edk2/MdeModulePkg/Bus/Pci/NvmExpressDxe/NvmExpressHci.c
    trunk/edk2/MdeModulePkg/Bus/Pci/NvmExpressDxe/NvmExpressPassthru.c

Modified: trunk/edk2/MdeModulePkg/Bus/Pci/NvmExpressDxe/NvmExpress.c
===================================================================
--- trunk/edk2/MdeModulePkg/Bus/Pci/NvmExpressDxe/NvmExpress.c  2013-09-11 
05:56:52 UTC (rev 14656)
+++ trunk/edk2/MdeModulePkg/Bus/Pci/NvmExpressDxe/NvmExpress.c  2013-09-11 
06:57:53 UTC (rev 14657)
@@ -215,6 +215,15 @@
            );
 
     //
+    // Dump NvmExpress Identify Namespace Data
+    //
+    DEBUG ((EFI_D_INFO, " == NVME IDENTIFY NAMESPACE [%d] DATA ==\n", 
NamespaceId));
+    DEBUG ((EFI_D_INFO, "    NSZE        : 0x%x\n", NamespaceData->Nsze));
+    DEBUG ((EFI_D_INFO, "    NCAP        : 0x%x\n", NamespaceData->Ncap));
+    DEBUG ((EFI_D_INFO, "    NUSE        : 0x%x\n", NamespaceData->Nuse));
+    DEBUG ((EFI_D_INFO, "    LBAF0.LBADS : 0x%x\n", 
(NamespaceData->LbaFormat[0].Lbads)));
+
+    //
     // Build controller name for Component Name (2) protocol.
     //
     UnicodeSPrintAsciiFormat (Device->ModelName, sizeof (Device->ModelName), 
"%a-%a-%x", Private->ControllerData->Sn, Private->ControllerData->Mn, 
NamespaceData->Eui64);
@@ -657,7 +666,7 @@
                       PciIo,
                       AllocateAnyPages,
                       EfiBootServicesData,
-                      6,
+                      4,
                       (VOID**)&Private->Buffer,
                       0
                       );

Modified: trunk/edk2/MdeModulePkg/Bus/Pci/NvmExpressDxe/NvmExpress.h
===================================================================
--- trunk/edk2/MdeModulePkg/Bus/Pci/NvmExpressDxe/NvmExpress.h  2013-09-11 
05:56:52 UTC (rev 14656)
+++ trunk/edk2/MdeModulePkg/Bus/Pci/NvmExpressDxe/NvmExpress.h  2013-09-11 
06:57:53 UTC (rev 14657)
@@ -56,11 +56,11 @@
 #define PCI_CLASS_MASS_STORAGE_NVM                0x08  // mass storage 
sub-class non-volatile memory.
 #define PCI_IF_NVMHCI                             0x02  // mass storage 
programming interface NVMHCI.
 
-#define NVME_ASQ_SIZE                             2     // Number of admin 
submission queue entries
-#define NVME_ACQ_SIZE                             2     // Number of admin 
completion queue entries
+#define NVME_ASQ_SIZE                             1     // Number of admin 
submission queue entries, which is 0-based
+#define NVME_ACQ_SIZE                             1     // Number of admin 
completion queue entries, which is 0-based
 
-#define NVME_CSQ_SIZE                             2     // Number of I/O 
submission queue entries
-#define NVME_CCQ_SIZE                             2     // Number of I/O 
completion queue entries
+#define NVME_CSQ_SIZE                             1     // Number of I/O 
submission queue entries, which is 0-based
+#define NVME_CCQ_SIZE                             1     // Number of I/O 
completion queue entries, which is 0-based
 
 #define NVME_MAX_IO_QUEUES                        2     // Number of I/O 
queues supported by the driver
 

Modified: trunk/edk2/MdeModulePkg/Bus/Pci/NvmExpressDxe/NvmExpressBlockIo.c
===================================================================
--- trunk/edk2/MdeModulePkg/Bus/Pci/NvmExpressDxe/NvmExpressBlockIo.c   
2013-09-11 05:56:52 UTC (rev 14656)
+++ trunk/edk2/MdeModulePkg/Bus/Pci/NvmExpressDxe/NvmExpressBlockIo.c   
2013-09-11 06:57:53 UTC (rev 14657)
@@ -172,10 +172,12 @@
   UINT32                           BlockSize;
   NVME_CONTROLLER_PRIVATE_DATA     *Controller;
   UINT32                           MaxTransferBlocks;
+  UINTN                            OrginalBlocks;
 
-  Status     = EFI_SUCCESS;
-  Controller = Device->Controller;
-  BlockSize  = Device->Media.BlockSize;
+  Status        = EFI_SUCCESS;
+  Controller    = Device->Controller;
+  BlockSize     = Device->Media.BlockSize;
+  OrginalBlocks = Blocks;
 
   if (Controller->ControllerData->Mdts != 0) {
     MaxTransferBlocks = (1 << (Controller->ControllerData->Mdts)) * (1 << 
(Controller->Cap.Mpsmin + 12)) / BlockSize;
@@ -200,7 +202,7 @@
     }
   }
 
-  DEBUG ((EFI_D_INFO, "NvmeRead()  Lba = %8d, Blocks = %8d, BlockSize = %d 
Status = %r\n", Lba, Blocks, BlockSize, Status));
+  DEBUG ((EFI_D_INFO, "NvmeRead()  Lba = 0x%08x, Original = 0x%08x, Remaining 
= 0x%08x, BlockSize = 0x%x Status = %r\n", Lba, OrginalBlocks, Blocks, 
BlockSize, Status));
 
   return Status;
 }
@@ -229,10 +231,12 @@
   UINT32                           BlockSize;
   NVME_CONTROLLER_PRIVATE_DATA     *Controller;
   UINT32                           MaxTransferBlocks;
+  UINTN                            OrginalBlocks;
 
-  Status     = EFI_SUCCESS;
-  Controller = Device->Controller;
-  BlockSize  = Device->Media.BlockSize;
+  Status        = EFI_SUCCESS;
+  Controller    = Device->Controller;
+  BlockSize     = Device->Media.BlockSize;
+  OrginalBlocks = Blocks;
 
   if (Controller->ControllerData->Mdts != 0) {
     MaxTransferBlocks = (1 << (Controller->ControllerData->Mdts)) * (1 << 
(Controller->Cap.Mpsmin + 12)) / BlockSize;
@@ -257,7 +261,7 @@
     }
   }
 
-  DEBUG ((EFI_D_INFO, "NvmeWrite() Lba = %8d, Blocks = %8d, BlockSize = %d 
Status = %r\n", Lba, Blocks, BlockSize, Status));
+  DEBUG ((EFI_D_INFO, "NvmeWrite() Lba = 0x%08x, Original = 0x%08x, Remaining 
= 0x%08x, BlockSize = 0x%x Status = %r\n", Lba, OrginalBlocks, Blocks, 
BlockSize, Status));
 
   return Status;
 }

Modified: trunk/edk2/MdeModulePkg/Bus/Pci/NvmExpressDxe/NvmExpressHci.c
===================================================================
--- trunk/edk2/MdeModulePkg/Bus/Pci/NvmExpressDxe/NvmExpressHci.c       
2013-09-11 05:56:52 UTC (rev 14656)
+++ trunk/edk2/MdeModulePkg/Bus/Pci/NvmExpressDxe/NvmExpressHci.c       
2013-09-11 06:57:53 UTC (rev 14657)
@@ -33,21 +33,23 @@
 {
   EFI_PCI_IO_PROTOCOL   *PciIo;
   EFI_STATUS            Status;
+  UINT64                Data;
 
   PciIo  = Private->PciIo;
   Status = PciIo->Mem.Read (
                         PciIo,
-                        EfiPciIoWidthUint64,
+                        EfiPciIoWidthUint32,
                         NVME_BAR,
                         NVME_CAP_OFFSET,
-                        1,
-                        Cap
+                        2,
+                        &Data
                         );
 
   if (EFI_ERROR(Status)) {
     return Status;
   }
 
+  WriteUnaligned64 ((UINT64*)Cap, Data);
   return EFI_SUCCESS;
 }
 
@@ -69,6 +71,7 @@
 {
   EFI_PCI_IO_PROTOCOL   *PciIo;
   EFI_STATUS            Status;
+  UINT32                Data;
 
   PciIo  = Private->PciIo;
   Status = PciIo->Mem.Read (
@@ -77,13 +80,14 @@
                         NVME_BAR,
                         NVME_CC_OFFSET,
                         1,
-                        Cc
+                        &Data
                         );
 
   if (EFI_ERROR(Status)) {
     return Status;
   }
 
+  WriteUnaligned32 ((UINT32*)Cc, Data);
   return EFI_SUCCESS;
 }
 
@@ -105,15 +109,17 @@
 {
   EFI_PCI_IO_PROTOCOL   *PciIo;
   EFI_STATUS            Status;
+  UINT32                Data;
 
   PciIo  = Private->PciIo;
+  Data   = ReadUnaligned32 ((UINT32*)Cc);
   Status = PciIo->Mem.Write (
                         PciIo,
                         EfiPciIoWidthUint32,
                         NVME_BAR,
                         NVME_CC_OFFSET,
                         1,
-                        Cc
+                        &Data
                         );
 
   if (EFI_ERROR(Status)) {
@@ -149,6 +155,7 @@
 {
   EFI_PCI_IO_PROTOCOL   *PciIo;
   EFI_STATUS            Status;
+  UINT32                Data;
 
   PciIo  = Private->PciIo;
   Status = PciIo->Mem.Read (
@@ -157,13 +164,14 @@
                         NVME_BAR,
                         NVME_CSTS_OFFSET,
                         1,
-                        Csts
+                        &Data
                         );
 
   if (EFI_ERROR(Status)) {
     return Status;
   }
 
+  WriteUnaligned32 ((UINT32*)Csts, Data);
   return EFI_SUCCESS;
 }
 
@@ -185,6 +193,7 @@
 {
   EFI_PCI_IO_PROTOCOL   *PciIo;
   EFI_STATUS            Status;
+  UINT32                Data;
 
   PciIo  = Private->PciIo;
   Status = PciIo->Mem.Read (
@@ -193,13 +202,14 @@
                         NVME_BAR,
                         NVME_AQA_OFFSET,
                         1,
-                        Aqa
+                        &Data
                         );
 
   if (EFI_ERROR(Status)) {
     return Status;
   }
 
+  WriteUnaligned32 ((UINT32*)Aqa, Data);
   return EFI_SUCCESS;
 }
 
@@ -221,15 +231,17 @@
 {
   EFI_PCI_IO_PROTOCOL   *PciIo;
   EFI_STATUS            Status;
+  UINT32                Data;
 
   PciIo  = Private->PciIo;
+  Data   = ReadUnaligned32 ((UINT32*)Aqa);
   Status = PciIo->Mem.Write (
                         PciIo,
                         EfiPciIoWidthUint32,
                         NVME_BAR,
                         NVME_AQA_OFFSET,
                         1,
-                        Aqa
+                        &Data
                         );
 
   if (EFI_ERROR(Status)) {
@@ -260,21 +272,23 @@
 {
   EFI_PCI_IO_PROTOCOL   *PciIo;
   EFI_STATUS            Status;
+  UINT64                Data;
 
   PciIo  = Private->PciIo;
   Status = PciIo->Mem.Read (
                         PciIo,
-                        EfiPciIoWidthUint64,
+                        EfiPciIoWidthUint32,
                         NVME_BAR,
                         NVME_ASQ_OFFSET,
-                        1,
-                        Asq
+                        2,
+                        &Data
                         );
 
   if (EFI_ERROR(Status)) {
     return Status;
   }
 
+  WriteUnaligned64 ((UINT64*)Asq, Data);
   return EFI_SUCCESS;
 }
 
@@ -296,15 +310,18 @@
 {
   EFI_PCI_IO_PROTOCOL   *PciIo;
   EFI_STATUS            Status;
+  UINT64                Data;
 
   PciIo  = Private->PciIo;
+  Data   = ReadUnaligned64 ((UINT64*)Asq);
+
   Status = PciIo->Mem.Write (
                         PciIo,
-                        EfiPciIoWidthUint64,
+                        EfiPciIoWidthUint32,
                         NVME_BAR,
                         NVME_ASQ_OFFSET,
-                        1,
-                        Asq
+                        2,
+                        &Data
                         );
 
   if (EFI_ERROR(Status)) {
@@ -334,21 +351,24 @@
 {
   EFI_PCI_IO_PROTOCOL   *PciIo;
   EFI_STATUS            Status;
+  UINT64                Data;
 
   PciIo  = Private->PciIo;
+
   Status = PciIo->Mem.Read (
                         PciIo,
-                        EfiPciIoWidthUint64,
+                        EfiPciIoWidthUint32,
                         NVME_BAR,
                         NVME_ACQ_OFFSET,
-                        1,
-                        Acq
+                        2,
+                        &Data
                         );
 
   if (EFI_ERROR(Status)) {
     return Status;
   }
 
+  WriteUnaligned64 ((UINT64*)Acq, Data);
   return EFI_SUCCESS;
 }
 
@@ -370,15 +390,18 @@
 {
   EFI_PCI_IO_PROTOCOL   *PciIo;
   EFI_STATUS            Status;
+  UINT64                Data;
 
   PciIo  = Private->PciIo;
+  Data   = ReadUnaligned64 ((UINT64*)Acq);
+
   Status = PciIo->Mem.Write (
                         PciIo,
-                        EfiPciIoWidthUint64,
+                        EfiPciIoWidthUint32,
                         NVME_BAR,
                         NVME_ACQ_OFFSET,
-                        1,
-                        Acq
+                        2,
+                        &Data
                         );
 
   if (EFI_ERROR(Status)) {
@@ -921,6 +944,25 @@
     Private->ControllerData = NULL;
     return EFI_NOT_FOUND;
   }
+
+  //
+  // Dump NvmExpress Identify Controller Data
+  //
+  Private->ControllerData->Sn[19] = 0;
+  Private->ControllerData->Mn[39] = 0;
+  DEBUG ((EFI_D_INFO, " == NVME IDENTIFY CONTROLLER DATA ==\n"));
+  DEBUG ((EFI_D_INFO, "    PCI VID   : 0x%x\n", Private->ControllerData->Vid));
+  DEBUG ((EFI_D_INFO, "    PCI SSVID : 0x%x\n", 
Private->ControllerData->Ssvid));
+  DEBUG ((EFI_D_INFO, "    SN        : %a\n",   (CHAR8 
*)(Private->ControllerData->Sn)));
+  DEBUG ((EFI_D_INFO, "    MN        : %a\n",   (CHAR8 
*)(Private->ControllerData->Mn)));
+  DEBUG ((EFI_D_INFO, "    FR        : 0x%x\n", 
*((UINT64*)Private->ControllerData->Fr)));
+  DEBUG ((EFI_D_INFO, "    RAB       : 0x%x\n", Private->ControllerData->Rab));
+  DEBUG ((EFI_D_INFO, "    IEEE      : 0x%x\n", 
*(UINT32*)Private->ControllerData->Ieee_oiu));
+  DEBUG ((EFI_D_INFO, "    AERL      : 0x%x\n", 
Private->ControllerData->Aerl));
+  DEBUG ((EFI_D_INFO, "    SQES      : 0x%x\n", 
Private->ControllerData->Sqes));
+  DEBUG ((EFI_D_INFO, "    CQES      : 0x%x\n", 
Private->ControllerData->Cqes));
+  DEBUG ((EFI_D_INFO, "    NN        : 0x%x\n", Private->ControllerData->Nn));
+
   return Status;
 }
 

Modified: trunk/edk2/MdeModulePkg/Bus/Pci/NvmExpressDxe/NvmExpressPassthru.c
===================================================================
--- trunk/edk2/MdeModulePkg/Bus/Pci/NvmExpressDxe/NvmExpressPassthru.c  
2013-09-11 05:56:52 UTC (rev 14656)
+++ trunk/edk2/MdeModulePkg/Bus/Pci/NvmExpressDxe/NvmExpressPassthru.c  
2013-09-11 06:57:53 UTC (rev 14657)
@@ -387,6 +387,7 @@
   UINT64                        *Prp;
   VOID                          *PrpListHost;
   UINTN                         PrpListNo;
+  UINT32                        Data;
 
   //
   // check the data fields in Packet parameter.
@@ -431,8 +432,8 @@
   //
   // Currently we only support PRP for data transfer, SGL is NOT supported.
   //
-  ASSERT ((Sq->Opc & BIT15) == 0);
-  if ((Sq->Opc & BIT15) != 0) {
+  ASSERT (Sq->Psdt == 0);
+  if (Sq->Psdt != 0) {
     DEBUG ((EFI_D_ERROR, "NvmExpressPassThru: doesn't support SGL 
mechanism\n"));
     return EFI_UNSUPPORTED;
   }
@@ -534,14 +535,14 @@
   // Ring the submission queue doorbell.
   //
   Private->SqTdbl[Qid].Sqt ^= 1;
-
+  Data = ReadUnaligned32 ((UINT32*)&Private->SqTdbl[Qid]);
   PciIo->Mem.Write (
                PciIo,
                EfiPciIoWidthUint32,
                NVME_BAR,
                NVME_SQTDBL_OFFSET(Qid, Private->Cap.Dstrd),
                1,
-               &Private->SqTdbl[Qid]
+               &Data
                );
 
   Status = gBS->CreateEvent (
@@ -591,13 +592,14 @@
     NvmeDumpStatus(Cq);
   DEBUG_CODE_END();
 
+  Data = ReadUnaligned32 ((UINT32*)&Private->CqHdbl[Qid]);
   PciIo->Mem.Write (
                PciIo,
                EfiPciIoWidthUint32,
                NVME_BAR,
                NVME_CQHDBL_OFFSET(Qid, Private->Cap.Dstrd),
                1,
-               &Private->CqHdbl[Qid]
+               &Data
                );
 
 EXIT:

This was sent by the SourceForge.net collaborative development platform, the 
world's largest Open Source development site.


------------------------------------------------------------------------------
How ServiceNow helps IT people transform IT departments:
1. Consolidate legacy IT systems to a single system of record for IT
2. Standardize and globalize service processes across IT
3. Implement zero-touch automation to replace manual, redundant tasks
http://pubads.g.doubleclick.net/gampad/clk?id=51271111&iu=/4140/ostg.clktrk
_______________________________________________
edk2-commits mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/edk2-commits

Reply via email to