]> git.proxmox.com Git - mirror_edk2.git/blobdiff - MdeModulePkg/Universal/Network/IScsiDxe/IScsiIbft.c
Enhance iSCSI ibft table for copy oemid and oemtableID from acpi tables.
[mirror_edk2.git] / MdeModulePkg / Universal / Network / IScsiDxe / IScsiIbft.c
index 83824331ba9697277d850b6358ad2a3dc15e3685..d712331189743d8b55aacf3b275630de8e90926e 100644 (file)
@@ -1,7 +1,7 @@
 /** @file\r
   Implementation for iSCSI Boot Firmware Table publication.\r
 \r
-Copyright (c) 2004 - 2008, Intel Corporation.<BR>\r
+Copyright (c) 2004 - 2009, Intel Corporation.<BR>\r
 All rights reserved. This program and the accompanying materials\r
 are licensed and made available under the terms and conditions of the BSD License\r
 which accompanies this distribution.  The full text of the license may be found at\r
@@ -14,6 +14,9 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
 \r
 #include "IScsiImpl.h"\r
 \r
+BOOLEAN mIbftInstalled = FALSE;\r
+UINTN   mTableKey;\r
+\r
 /**\r
   Initialize the header of the iSCSI Boot Firmware Table.\r
   \r
@@ -21,7 +24,9 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
 **/\r
 VOID\r
 IScsiInitIbfTableHeader (\r
-  OUT EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_HEADER  *Header\r
+  OUT EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_HEADER   *Header,\r
+  IN  UINT8                                       *OemId,\r
+  IN  UINT64                                      *OemTableId\r
   )\r
 {\r
   ZeroMem (Header, sizeof (EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_HEADER));\r
@@ -36,6 +41,9 @@ IScsiInitIbfTableHeader (
   Header->OemId[2]  = 'T';\r
   Header->OemId[3]  = 'E';\r
   Header->OemId[4]  = 'L';\r
+  \r
+  CopyMem (Header->OemId, OemId, sizeof (Header->OemId));\r
+  Header->OemTableId = *OemTableId;\r
 }\r
 \r
 /**\r
@@ -140,7 +148,7 @@ IScsiFillInitiatorSection (
   //\r
   // Get the identifier from the handle.\r
   //\r
-  Status = gBS->HandleProtocol (Handle, &mIScsiPrivateGuid, (VOID **) &IScsiIdentifier);\r
+  Status = gBS->HandleProtocol (Handle, &gIScsiPrivateGuid, (VOID **) &IScsiIdentifier);\r
   if (EFI_ERROR (Status)) {\r
     ASSERT (FALSE);\r
     return ;\r
@@ -302,7 +310,7 @@ IScsiFillNICAndTargetSections (
   SectionOffset = &Control->NIC0Offset;\r
 \r
   for (Index = 0; Index < HandleCount; Index++) {\r
-    Status = gBS->HandleProtocol (Handles[Index], &mIScsiPrivateGuid, (VOID **)&IScsiIdentifier);\r
+    Status = gBS->HandleProtocol (Handles[Index], &gIScsiPrivateGuid, (VOID **)&IScsiIdentifier);\r
     if (EFI_ERROR (Status)) {\r
       ASSERT (FALSE);\r
       return ;\r
@@ -436,66 +444,66 @@ IScsiFillNICAndTargetSections (
 **/\r
 VOID\r
 IScsiPublishIbft (\r
-  VOID  \r
+  VOID\r
   )\r
 {\r
   EFI_STATUS                                Status;\r
-  UINTN                                     TableHandle;\r
-  EFI_ACPI_SUPPORT_PROTOCOL                 *AcpiSupport;\r
+  EFI_ACPI_TABLE_PROTOCOL                   *AcpiTableProtocol;\r
   EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_HEADER *Table;\r
   UINTN                                     HandleCount;\r
   EFI_HANDLE                                *HandleBuffer;\r
   UINT8                                     *Heap;\r
-  INTN                                      Index;\r
-  EFI_ACPI_TABLE_VERSION                    Version;\r
-  UINT32                                    Signature;\r
+  UINT8                                     Checksum;\r
+  UINTN                                         Index;\r
+  EFI_ACPI_3_0_ROOT_SYSTEM_DESCRIPTION_POINTER  *Rsdp;\r
+  EFI_ACPI_DESCRIPTION_HEADER                   *Rsdt;\r
 \r
-  Status = gBS->LocateProtocol (&gEfiAcpiSupportProtocolGuid, NULL, (VOID **)&AcpiSupport);\r
+  Status = gBS->LocateProtocol (&gEfiAcpiTableProtocolGuid, NULL, (VOID **)&AcpiTableProtocol);\r
   if (EFI_ERROR (Status)) {\r
     return ;\r
   }\r
+\r
+\r
   //\r
-  // Try to remove the old iSCSI Boot Firmware Table.\r
+  // Find ACPI table RSD_PTR from system table\r
   //\r
-  for (Index = 0;; Index++) {\r
-    Status = AcpiSupport->GetAcpiTable (\r
-                            AcpiSupport,\r
-                            Index,\r
-                            (VOID **)&Table,\r
-                            &Version,\r
-                            &TableHandle\r
-                            );\r
-    if (EFI_ERROR (Status)) {\r
+  for (Index = 0, Rsdp = NULL; Index < gST->NumberOfTableEntries; Index++) {\r
+    if (CompareGuid (&(gST->ConfigurationTable[Index].VendorGuid), &gEfiAcpi20TableGuid) ||\r
+      CompareGuid (&(gST->ConfigurationTable[Index].VendorGuid), &gEfiAcpi10TableGuid) ||\r
+      CompareGuid (&(gST->ConfigurationTable[Index].VendorGuid), &gEfiAcpiTableGuid)\r
+      ) {\r
+      //\r
+      // A match was found.\r
+      //\r
+      Rsdp = (EFI_ACPI_3_0_ROOT_SYSTEM_DESCRIPTION_POINTER *) gST->ConfigurationTable[Index].VendorTable;\r
       break;\r
     }\r
+  }\r
 \r
-    Signature = Table->Signature;\r
-    gBS->FreePool (Table);\r
+  if (Rsdp == NULL) {\r
+    return ;\r
+  } else {\r
+    Rsdt = (EFI_ACPI_DESCRIPTION_HEADER *) (UINTN) Rsdp->RsdtAddress;\r
+  }\r
 \r
-    if (Signature == EFI_ACPI_3_0_ISCSI_BOOT_FIRMWARE_TABLE_SIGNATURE) {\r
-      //\r
-      // Remove the table.\r
-      //\r
-      Status = AcpiSupport->SetAcpiTable (\r
-                              AcpiSupport,\r
-                              NULL,\r
-                              FALSE,\r
-                              Version,\r
-                              &TableHandle\r
-                              );\r
-      if (EFI_ERROR (Status)) {\r
-        return ;\r
-      }\r
 \r
-      break;\r
+  if (mIbftInstalled) {\r
+    Status = AcpiTableProtocol->UninstallAcpiTable (\r
+                                  AcpiTableProtocol,\r
+                                  mTableKey\r
+                                  );\r
+    if (EFI_ERROR (Status)) {\r
+      return ;\r
     }\r
+    mIbftInstalled = FALSE;\r
   }\r
+\r
   //\r
   // Get all iSCSI private protocols.\r
   //\r
   Status = gBS->LocateHandleBuffer (\r
                   ByProtocol,\r
-                  &mIScsiPrivateGuid,\r
+                  &gIScsiPrivateGuid,\r
                   NULL,\r
                   &HandleCount,\r
                   &HandleBuffer\r
@@ -506,7 +514,7 @@ IScsiPublishIbft (
   //\r
   // Allocate 4k bytes to hold the ACPI table.\r
   //\r
-  Table = AllocatePool (IBFT_MAX_SIZE);\r
+  Table = AllocateZeroPool (IBFT_MAX_SIZE);\r
   if (Table == NULL) {\r
     return ;\r
   }\r
@@ -516,28 +524,29 @@ IScsiPublishIbft (
   //\r
   // Fill in the various section of the iSCSI Boot Firmware Table.\r
   //\r
-  IScsiInitIbfTableHeader (Table);\r
+  IScsiInitIbfTableHeader (Table, Rsdt->OemId, &Rsdt->OemTableId);\r
   IScsiInitControlSection (Table, HandleCount);\r
   IScsiFillInitiatorSection (Table, &Heap, HandleBuffer[0]);\r
   IScsiFillNICAndTargetSections (Table, &Heap, HandleCount, HandleBuffer);\r
 \r
-  gBS->FreePool (HandleBuffer);\r
+  Checksum = CalculateCheckSum8((UINT8 *)Table, Table->Length);\r
+  Table->Checksum = Checksum;\r
 \r
-  TableHandle = 0;\r
+  FreePool (HandleBuffer);\r
 \r
   //\r
   // Install or update the iBFT table.\r
   //\r
-  Status = AcpiSupport->SetAcpiTable (\r
-                          AcpiSupport,\r
-                          Table,\r
-                          TRUE,\r
-                          EFI_ACPI_TABLE_VERSION_3_0,\r
-                          &TableHandle\r
-                          );\r
-  if (!EFI_ERROR (Status)) {\r
-    AcpiSupport->PublishTables (AcpiSupport, EFI_ACPI_TABLE_VERSION_3_0);\r
+  Status = AcpiTableProtocol->InstallAcpiTable (\r
+                                AcpiTableProtocol,\r
+                                Table,\r
+                                Table->Length,\r
+                                &mTableKey\r
+                                );\r
+  if (EFI_ERROR(Status)) {\r
+    return;\r
   }\r
 \r
-  gBS->FreePool (Table);\r
+  mIbftInstalled = TRUE;\r
+  FreePool (Table);\r
 }\r