/** @file\r
-Module produces PciCfgPpi2 on top of PciCfgPpi. It also updates the \r
-PciCfg2Ppi pointer in the EFI_PEI_SERVICES upon a installation of\r
-EcpPeiPciCfgPpi. EcpPeiPciCfgPpi is installed in a framework module which\r
-produce PciCfgPpi originally. This framework module is updated based on the \r
-following rule:\r
-Search pattern:\r
- PeiServices->PciCfg = <*>;\r
-Replace pattern:\r
- {\r
- static EFI_PEI_PPI_DESCRIPTOR gEcpPeiPciCfgPpiList = {\r
- (EFI_PEI_PPI_DESCRIPTOR_PPI | EFI_PEI_PPI_DESCRIPTOR_TERMINATE_LIST),\r
- &gEcpPeiPciCfgPpiGuid,\r
- <*>\r
- };\r
- (**PeiServices).InstallPpi (PeiServices, gEcpPeiPciCfgPpiList);\r
- }\r
+ Module produces PciCfgPpi2 on top of PciCfgPpi. It also updates the \r
+ PciCfg2Ppi pointer in the EFI_PEI_SERVICES upon a installation of\r
+ EcpPeiPciCfgPpi. \r
+\r
+ EcpPeiPciCfgPpi is installed by a framework module which\r
+ produce PciCfgPpi originally. Such framework module is updated based on the \r
+ following rule to install EcpPeiPciCfgPpi instead of updating the PciCfg pointer\r
+ in the Framework PeiServicesTable: \r
+ \r
+ Search pattern:\r
+ PeiServices->PciCfg = <*>;\r
+ Replace pattern:\r
+ {\r
+ static EFI_PEI_PPI_DESCRIPTOR gEcpPeiPciCfgPpiList = {\r
+ (EFI_PEI_PPI_DESCRIPTOR_PPI | EFI_PEI_PPI_DESCRIPTOR_TERMINATE_LIST),\r
+ &gEcpPeiPciCfgPpiGuid,\r
+ <*>\r
+ };\r
+ (**PeiServices).InstallPpi (PeiServices, gEcpPeiPciCfgPpiList);\r
+ }\r
+ \r
+ In addition, the PeiServicesTable definition in PeiApi.h is updated to\r
+ \r
+ struct _EFI_PEI_SERVICES {\r
+ EFI_TABLE_HEADER Hdr;\r
+ ...\r
+ \r
+ //\r
+ // Pointer to PPI interface\r
+ //\r
+ if (PI_SPECIFICATION_VERSION < 0x00010000)\r
+ \r
+ PEI_CPU_IO_PPI *CpuIo;\r
+ ECP_PEI_PCI_CFG_PPI *PciCfg; //Changed.\r
+ else\r
+ ...\r
+ endif\r
+ \r
+ };\r
+ \r
+ This change enable the detection of code segment which invokes PeiServices->PciCfg->Modify.\r
+ Such code causes a build break as ECP_PEI_PCI_CFG_PPI does not has "Modify" field. \r
+ This should be updated to a call to PeiLibPciCfgModify as shown below:\r
+ \r
+ Search pattern:\r
+ *->Modify(<*>); \r
+ Replace pattern:\r
+ PeiLibPciCfgModify(<*>);\r
+\r
+\r
\r
PIWG's PI specification replaces Inte's EFI Specification 1.10.\r
EFI_PEI_PCI_CFG_PPI defined in Inte's EFI Specification 1.10 is replaced by\r
#/** @file\r
# Module produces PciCfgPpi2 on top of PciCfgPpi. It also updates the \r
# PciCfg2Ppi pointer in the EFI_PEI_SERVICES upon a installation of\r
-# EcpPeiPciCfgPpi. EcpPeiPciCfgPpi is installed in a framework module which\r
-# produce PciCfgPpi originally. This framework module is updated based on the \r
-# following rule:\r
+# EcpPeiPciCfgPpi. \r
+#\r
+# EcpPeiPciCfgPpi is installed by a framework module which\r
+# produce PciCfgPpi originally. Such framework module is updated based on the \r
+# following rule to install EcpPeiPciCfgPpi instead of updating the PciCfg pointer\r
+# in the Framework PeiServicesTable: \r
+# \r
# Search pattern:\r
# PeiServices->PciCfg = <*>;\r
# Replace pattern:\r
# };\r
# (**PeiServices).InstallPpi (PeiServices, gEcpPeiPciCfgPpiList);\r
# }\r
-\r
+# \r
+# In addition, the PeiServicesTable definition in PeiApi.h is updated to\r
+# \r
+# struct _EFI_PEI_SERVICES {\r
+# EFI_TABLE_HEADER Hdr;\r
+# ...\r
+# \r
+# //\r
+# // Pointer to PPI interface\r
+# //\r
+# #if (PI_SPECIFICATION_VERSION < 0x00010000)\r
+# \r
+# PEI_CPU_IO_PPI *CpuIo;\r
+# ECP_PEI_PCI_CFG_PPI *PciCfg; //Changed.\r
+# #else\r
+# ...\r
+# #endif\r
+# \r
+# };\r
+# \r
+# This change enable the detection of code segment which invokes PeiServices->PciCfg->Modify.\r
+# Such code causes a build break as ECP_PEI_PCI_CFG_PPI does not has "Modify" field. \r
+# This should be updated to a call to PeiLibPciCfgModify as shown below:\r
+# \r
+# Search pattern:\r
+# *->Modify(<*>); \r
+# Replace pattern:\r
+# PeiLibPciCfgModify(<*>);\r
+#\r
# PIWG's PI specification replaces Inte's EFI Specification 1.10.\r
# EFI_PEI_PCI_CFG_PPI defined in Inte's EFI Specification 1.10 is replaced by\r
# EFI_PEI_PCI_CFG2_PPI in PI 1.0.\r