-/*++\r
- \r
-Copyright (c) 2006, Intel Corporation \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
-http://opensource.org/licenses/bsd-license.php \r
- \r
-THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, \r
-WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. \r
+/** @file\r
+ EFI PCI IO protocol functions implementation for PCI Bus module.\r
\r
-Module Name:\r
+Copyright (c) 2006 - 2009, Intel Corporation\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
+http://opensource.org/licenses/bsd-license.php\r
\r
- PciIo.c\r
- \r
-Abstract:\r
+THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
+WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
\r
- PCI I/O Abstraction Driver\r
+**/\r
\r
-Revision History\r
-\r
---*/\r
-\r
-#include "pcibus.h"\r
-\r
-//\r
-// Internal use only\r
-//\r
-STATIC\r
-EFI_STATUS\r
-ReportErrorStatusCode (\r
- IN PCI_IO_DEVICE *PciIoDevice,\r
- IN EFI_STATUS_CODE_VALUE Code\r
- );\r
+#include "PciBus.h"\r
\r
-//\r
-// PCI I/O Support Function Prototypes\r
-//\r
-//\r
//\r
// Pci Io Protocol Interface\r
//\r
-static EFI_PCI_IO_PROTOCOL PciIoInterface = {\r
+EFI_PCI_IO_PROTOCOL mPciIoInterface = {\r
PciIoPollMem,\r
PciIoPollIo,\r
{\r
NULL\r
};\r
\r
-STATIC\r
+/**\r
+ Report a error Status code of PCI bus driver controller.\r
+\r
+ @param PciIoDevice Pci device instance.\r
+ @param Code Status code value.\r
+\r
+**/\r
EFI_STATUS\r
ReportErrorStatusCode (\r
IN PCI_IO_DEVICE *PciIoDevice,\r
IN EFI_STATUS_CODE_VALUE Code\r
)\r
-/*++\r
-\r
-Routine Description:\r
-\r
- report a error Status code of PCI bus driver controller\r
-\r
-Arguments:\r
- \r
-Returns:\r
-\r
- None\r
-\r
---*/\r
-// TODO: PciIoDevice - add argument and description to function comment\r
-// TODO: Code - add argument and description to function comment\r
{\r
return REPORT_STATUS_CODE_WITH_DEVICE_PATH (\r
EFI_ERROR_CODE | EFI_ERROR_MINOR,\r
);\r
}\r
\r
-EFI_STATUS\r
-InitializePciIoInstance (\r
- PCI_IO_DEVICE *PciIoDevice\r
- )\r
-/*++\r
+/**\r
+ Initializes a PCI I/O Instance.\r
\r
-Routine Description:\r
+ @param PciIoDevice Pci device instance.\r
\r
- Initializes a PCI I/O Instance\r
+**/\r
+VOID\r
+InitializePciIoInstance (\r
+ IN PCI_IO_DEVICE *PciIoDevice\r
+ )\r
+{\r
+ CopyMem (&PciIoDevice->PciIo, &mPciIoInterface, sizeof (EFI_PCI_IO_PROTOCOL));\r
+}\r
\r
-Arguments:\r
- \r
-Returns:\r
+/**\r
+ Verifies access to a PCI Base Address Register (BAR).\r
\r
- None\r
+ @param PciIoDevice Pci device instance.\r
+ @param BarIndex The BAR index of the standard PCI Configuration header to use as the\r
+ base address for the memory or I/O operation to perform.\r
+ @param Type Operation type could be memory or I/O.\r
+ @param Width Signifies the width of the memory or I/O operations.\r
+ @param Count The number of memory or I/O operations to perform.\r
+ @param Offset The offset within the PCI configuration space for the PCI controller.\r
\r
---*/\r
-// TODO: PciIoDevice - add argument and description to function comment\r
-// TODO: EFI_SUCCESS - add return value to function comment\r
-{\r
- CopyMem (&PciIoDevice->PciIo, &PciIoInterface, sizeof (EFI_PCI_IO_PROTOCOL));\r
- return EFI_SUCCESS;\r
-}\r
+ @retval EFI_INVALID_PARAMETER Invalid Width/BarIndex or Bar type.\r
+ @retval EFI_SUCCESS Successfully verified.\r
\r
+**/\r
EFI_STATUS\r
PciIoVerifyBarAccess (\r
- PCI_IO_DEVICE *PciIoDevice,\r
- UINT8 BarIndex,\r
- PCI_BAR_TYPE Type,\r
- IN EFI_PCI_IO_PROTOCOL_WIDTH Width,\r
- IN UINTN Count,\r
- UINT64 *Offset\r
+ IN PCI_IO_DEVICE *PciIoDevice,\r
+ IN UINT8 BarIndex,\r
+ IN PCI_BAR_TYPE Type,\r
+ IN IN EFI_PCI_IO_PROTOCOL_WIDTH Width,\r
+ IN IN UINTN Count,\r
+ IN UINT64 *Offset\r
)\r
-/*++\r
-\r
-Routine Description:\r
-\r
- Verifies access to a PCI Base Address Register (BAR)\r
-\r
-Arguments:\r
-\r
-Returns:\r
-\r
- None\r
-\r
---*/\r
-// TODO: PciIoDevice - add argument and description to function comment\r
-// TODO: BarIndex - add argument and description to function comment\r
-// TODO: Type - add argument and description to function comment\r
-// TODO: Width - add argument and description to function comment\r
-// TODO: Count - add argument and description to function comment\r
-// TODO: Offset - add argument and description to function comment\r
-// TODO: EFI_INVALID_PARAMETER - add return value to function comment\r
-// TODO: EFI_SUCCESS - add return value to function comment\r
-// TODO: EFI_INVALID_PARAMETER - add return value to function comment\r
-// TODO: EFI_INVALID_PARAMETER - add return value to function comment\r
-// TODO: EFI_INVALID_PARAMETER - add return value to function comment\r
-// TODO: EFI_SUCCESS - add return value to function comment\r
{\r
if (Width < 0 || Width >= EfiPciIoWidthMaximum) {\r
return EFI_INVALID_PARAMETER;\r
return EFI_SUCCESS;\r
}\r
\r
+/**\r
+ Verifies access to a PCI Configuration Header.\r
+\r
+ @param PciIoDevice Pci device instance.\r
+ @param Width Signifies the width of the memory or I/O operations.\r
+ @param Count The number of memory or I/O operations to perform.\r
+ @param Offset The offset within the PCI configuration space for the PCI controller.\r
+\r
+ @retval EFI_INVALID_PARAMETER Invalid Width\r
+ @retval EFI_UNSUPPORTED Offset overflowed.\r
+ @retval EFI_SUCCESS Successfully verified.\r
+\r
+**/\r
EFI_STATUS\r
PciIoVerifyConfigAccess (\r
- PCI_IO_DEVICE *PciIoDevice,\r
+ IN PCI_IO_DEVICE *PciIoDevice,\r
IN EFI_PCI_IO_PROTOCOL_WIDTH Width,\r
IN UINTN Count,\r
IN UINT64 *Offset\r
)\r
-/*++\r
-\r
-Routine Description:\r
-\r
- Verifies access to a PCI Config Header\r
-\r
-Arguments:\r
-\r
-Returns:\r
-\r
- None\r
-\r
---*/\r
-// TODO: PciIoDevice - add argument and description to function comment\r
-// TODO: Width - add argument and description to function comment\r
-// TODO: Count - add argument and description to function comment\r
-// TODO: Offset - add argument and description to function comment\r
-// TODO: EFI_INVALID_PARAMETER - add return value to function comment\r
-// TODO: EFI_UNSUPPORTED - add return value to function comment\r
-// TODO: EFI_UNSUPPORTED - add return value to function comment\r
-// TODO: EFI_SUCCESS - add return value to function comment\r
{\r
UINT64 ExtendOffset;\r
\r
return EFI_SUCCESS;\r
}\r
\r
+/**\r
+ Reads from the memory space of a PCI controller. Returns either when the polling exit criteria is\r
+ satisfied or after a defined duration.\r
+\r
+ @param This A pointer to the EFI_PCI_IO_PROTOCOL instance.\r
+ @param Width Signifies the width of the memory or I/O operations.\r
+ @param BarIndex The BAR index of the standard PCI Configuration header to use as the\r
+ base address for the memory operation to perform.\r
+ @param Offset The offset within the selected BAR to start the memory operation.\r
+ @param Mask Mask used for the polling criteria.\r
+ @param Value The comparison value used for the polling exit criteria.\r
+ @param Delay The number of 100 ns units to poll.\r
+ @param Result Pointer to the last value read from the memory location.\r
+\r
+ @retval EFI_SUCCESS The last data returned from the access matched the poll exit criteria.\r
+ @retval EFI_UNSUPPORTED BarIndex not valid for this PCI controller.\r
+ @retval EFI_UNSUPPORTED Offset is not valid for the BarIndex of this PCI controller.\r
+ @retval EFI_TIMEOUT Delay expired before a match occurred.\r
+ @retval EFI_OUT_OF_RESOURCES The request could not be completed due to a lack of resources.\r
+ @retval EFI_INVALID_PARAMETER One or more parameters are invalid.\r
+\r
+**/\r
EFI_STATUS\r
EFIAPI\r
PciIoPollMem (\r
IN UINT64 Delay,\r
OUT UINT64 *Result\r
)\r
-/*++\r
-\r
-Routine Description:\r
-\r
- Poll PCI Memmory\r
-\r
-Arguments:\r
-\r
-Returns:\r
-\r
- None\r
-\r
---*/\r
-// TODO: This - add argument and description to function comment\r
-// TODO: Width - add argument and description to function comment\r
-// TODO: BarIndex - add argument and description to function comment\r
-// TODO: Offset - add argument and description to function comment\r
-// TODO: Mask - add argument and description to function comment\r
-// TODO: Value - add argument and description to function comment\r
-// TODO: Delay - add argument and description to function comment\r
-// TODO: Result - add argument and description to function comment\r
-// TODO: EFI_INVALID_PARAMETER - add return value to function comment\r
-// TODO: EFI_UNSUPPORTED - add return value to function comment\r
-// TODO: EFI_INVALID_PARAMETER - add return value to function comment\r
{\r
EFI_STATUS Status;\r
PCI_IO_DEVICE *PciIoDevice;\r
}\r
\r
Status = PciIoDevice->PciRootBridgeIo->PollMem (\r
- PciIoDevice->PciRootBridgeIo,\r
- (EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL_WIDTH) Width,\r
- Offset,\r
- Mask,\r
- Value,\r
- Delay,\r
- Result\r
- );\r
+ PciIoDevice->PciRootBridgeIo,\r
+ (EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL_WIDTH) Width,\r
+ Offset,\r
+ Mask,\r
+ Value,\r
+ Delay,\r
+ Result\r
+ );\r
\r
if (EFI_ERROR (Status)) {\r
ReportErrorStatusCode (PciIoDevice, EFI_IO_BUS_PCI | EFI_IOB_EC_CONTROLLER_ERROR);\r
return Status;\r
}\r
\r
+/**\r
+ Reads from the memory space of a PCI controller. Returns either when the polling exit criteria is\r
+ satisfied or after a defined duration.\r
+\r
+ @param This A pointer to the EFI_PCI_IO_PROTOCOL instance.\r
+ @param Width Signifies the width of the memory or I/O operations.\r
+ @param BarIndex The BAR index of the standard PCI Configuration header to use as the\r
+ base address for the memory operation to perform.\r
+ @param Offset The offset within the selected BAR to start the memory operation.\r
+ @param Mask Mask used for the polling criteria.\r
+ @param Value The comparison value used for the polling exit criteria.\r
+ @param Delay The number of 100 ns units to poll.\r
+ @param Result Pointer to the last value read from the memory location.\r
+\r
+ @retval EFI_SUCCESS The last data returned from the access matched the poll exit criteria.\r
+ @retval EFI_UNSUPPORTED BarIndex not valid for this PCI controller.\r
+ @retval EFI_UNSUPPORTED Offset is not valid for the BarIndex of this PCI controller.\r
+ @retval EFI_TIMEOUT Delay expired before a match occurred.\r
+ @retval EFI_OUT_OF_RESOURCES The request could not be completed due to a lack of resources.\r
+ @retval EFI_INVALID_PARAMETER One or more parameters are invalid.\r
+\r
+**/\r
EFI_STATUS\r
EFIAPI\r
PciIoPollIo (\r
IN UINT64 Delay,\r
OUT UINT64 *Result\r
)\r
-/*++\r
-\r
-Routine Description:\r
-\r
- Poll PCI IO\r
-\r
-Arguments:\r
-\r
-Returns:\r
-\r
- None\r
-\r
---*/\r
-// TODO: This - add argument and description to function comment\r
-// TODO: Width - add argument and description to function comment\r
-// TODO: BarIndex - add argument and description to function comment\r
-// TODO: Offset - add argument and description to function comment\r
-// TODO: Mask - add argument and description to function comment\r
-// TODO: Value - add argument and description to function comment\r
-// TODO: Delay - add argument and description to function comment\r
-// TODO: Result - add argument and description to function comment\r
-// TODO: EFI_INVALID_PARAMETER - add return value to function comment\r
-// TODO: EFI_UNSUPPORTED - add return value to function comment\r
-// TODO: EFI_INVALID_PARAMETER - add return value to function comment\r
{\r
EFI_STATUS Status;\r
PCI_IO_DEVICE *PciIoDevice;\r
}\r
\r
Status = PciIoDevice->PciRootBridgeIo->PollIo (\r
- PciIoDevice->PciRootBridgeIo,\r
- (EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL_WIDTH) Width,\r
- Offset,\r
- Mask,\r
- Value,\r
- Delay,\r
- Result\r
- );\r
+ PciIoDevice->PciRootBridgeIo,\r
+ (EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL_WIDTH) Width,\r
+ Offset,\r
+ Mask,\r
+ Value,\r
+ Delay,\r
+ Result\r
+ );\r
\r
if (EFI_ERROR (Status)) {\r
ReportErrorStatusCode (PciIoDevice, EFI_IO_BUS_PCI | EFI_IOB_EC_CONTROLLER_ERROR);\r
return Status;\r
}\r
\r
+/**\r
+ Enable a PCI driver to access PCI controller registers in the PCI memory or I/O space.\r
+\r
+ @param This A pointer to the EFI_PCI_IO_PROTOCOL instance.\r
+ @param Width Signifies the width of the memory or I/O operations.\r
+ @param BarIndex The BAR index of the standard PCI Configuration header to use as the\r
+ base address for the memory or I/O operation to perform.\r
+ @param Offset The offset within the selected BAR to start the memory or I/O operation.\r
+ @param Count The number of memory or I/O operations to perform.\r
+ @param Buffer For read operations, the destination buffer to store the results. For write\r
+ operations, the source buffer to write data from.\r
+\r
+ @retval EFI_SUCCESS The data was read from or written to the PCI controller.\r
+ @retval EFI_UNSUPPORTED BarIndex not valid for this PCI controller.\r
+ @retval EFI_UNSUPPORTED The address range specified by Offset, Width, and Count is not\r
+ valid for the PCI BAR specified by BarIndex.\r
+ @retval EFI_OUT_OF_RESOURCES The request could not be completed due to a lack of resources.\r
+ @retval EFI_INVALID_PARAMETER One or more parameters are invalid.\r
+\r
+**/\r
EFI_STATUS\r
EFIAPI\r
PciIoMemRead (\r
IN UINTN Count,\r
IN OUT VOID *Buffer\r
)\r
-/*++\r
-\r
-Routine Description:\r
-\r
- Performs a PCI Memory Read Cycle\r
-\r
-Arguments:\r
-\r
-Returns:\r
-\r
- None\r
-\r
---*/\r
-// TODO: This - add argument and description to function comment\r
-// TODO: Width - add argument and description to function comment\r
-// TODO: BarIndex - add argument and description to function comment\r
-// TODO: Offset - add argument and description to function comment\r
-// TODO: Count - add argument and description to function comment\r
-// TODO: Buffer - add argument and description to function comment\r
-// TODO: EFI_INVALID_PARAMETER - add return value to function comment\r
-// TODO: EFI_UNSUPPORTED - add return value to function comment\r
{\r
EFI_STATUS Status;\r
PCI_IO_DEVICE *PciIoDevice;\r
return EFI_INVALID_PARAMETER;\r
}\r
\r
+ if (Buffer == NULL) {\r
+ return EFI_INVALID_PARAMETER;\r
+ }\r
+\r
Status = PciIoVerifyBarAccess (PciIoDevice, BarIndex, PciBarTypeMem, Width, Count, &Offset);\r
if (EFI_ERROR (Status)) {\r
return EFI_UNSUPPORTED;\r
return Status;\r
}\r
\r
+/**\r
+ Enable a PCI driver to access PCI controller registers in the PCI memory or I/O space.\r
+\r
+ @param This A pointer to the EFI_PCI_IO_PROTOCOL instance.\r
+ @param Width Signifies the width of the memory or I/O operations.\r
+ @param BarIndex The BAR index of the standard PCI Configuration header to use as the\r
+ base address for the memory or I/O operation to perform.\r
+ @param Offset The offset within the selected BAR to start the memory or I/O operation.\r
+ @param Count The number of memory or I/O operations to perform.\r
+ @param Buffer For read operations, the destination buffer to store the results. For write\r
+ operations, the source buffer to write data from.\r
+\r
+ @retval EFI_SUCCESS The data was read from or written to the PCI controller.\r
+ @retval EFI_UNSUPPORTED BarIndex not valid for this PCI controller.\r
+ @retval EFI_UNSUPPORTED The address range specified by Offset, Width, and Count is not\r
+ valid for the PCI BAR specified by BarIndex.\r
+ @retval EFI_OUT_OF_RESOURCES The request could not be completed due to a lack of resources.\r
+ @retval EFI_INVALID_PARAMETER One or more parameters are invalid.\r
+\r
+**/\r
EFI_STATUS\r
EFIAPI\r
PciIoMemWrite (\r
IN UINTN Count,\r
IN OUT VOID *Buffer\r
)\r
-/*++\r
-\r
-Routine Description:\r
-\r
- Performs a PCI Memory Write Cycle\r
-\r
-Arguments:\r
-\r
-Returns:\r
-\r
- None\r
-\r
---*/\r
-// TODO: This - add argument and description to function comment\r
-// TODO: Width - add argument and description to function comment\r
-// TODO: BarIndex - add argument and description to function comment\r
-// TODO: Offset - add argument and description to function comment\r
-// TODO: Count - add argument and description to function comment\r
-// TODO: Buffer - add argument and description to function comment\r
-// TODO: EFI_INVALID_PARAMETER - add return value to function comment\r
-// TODO: EFI_UNSUPPORTED - add return value to function comment\r
{\r
EFI_STATUS Status;\r
PCI_IO_DEVICE *PciIoDevice;\r
return EFI_INVALID_PARAMETER;\r
}\r
\r
+ if (Buffer == NULL) {\r
+ return EFI_INVALID_PARAMETER;\r
+ }\r
+\r
Status = PciIoVerifyBarAccess (PciIoDevice, BarIndex, PciBarTypeMem, Width, Count, &Offset);\r
if (EFI_ERROR (Status)) {\r
return EFI_UNSUPPORTED;\r
return Status;\r
}\r
\r
+/**\r
+ Enable a PCI driver to access PCI controller registers in the PCI memory or I/O space.\r
+\r
+ @param This A pointer to the EFI_PCI_IO_PROTOCOL instance.\r
+ @param Width Signifies the width of the memory or I/O operations.\r
+ @param BarIndex The BAR index of the standard PCI Configuration header to use as the\r
+ base address for the memory or I/O operation to perform.\r
+ @param Offset The offset within the selected BAR to start the memory or I/O operation.\r
+ @param Count The number of memory or I/O operations to perform.\r
+ @param Buffer For read operations, the destination buffer to store the results. For write\r
+ operations, the source buffer to write data from.\r
+\r
+ @retval EFI_SUCCESS The data was read from or written to the PCI controller.\r
+ @retval EFI_UNSUPPORTED BarIndex not valid for this PCI controller.\r
+ @retval EFI_UNSUPPORTED The address range specified by Offset, Width, and Count is not\r
+ valid for the PCI BAR specified by BarIndex.\r
+ @retval EFI_OUT_OF_RESOURCES The request could not be completed due to a lack of resources.\r
+ @retval EFI_INVALID_PARAMETER One or more parameters are invalid.\r
+\r
+**/\r
EFI_STATUS\r
EFIAPI\r
PciIoIoRead (\r
IN UINTN Count,\r
IN OUT VOID *Buffer\r
)\r
-/*++\r
-\r
-Routine Description:\r
-\r
- Performs a PCI I/O Read Cycle\r
-\r
-Arguments:\r
-\r
-Returns:\r
-\r
- None\r
-\r
---*/\r
-// TODO: This - add argument and description to function comment\r
-// TODO: Width - add argument and description to function comment\r
-// TODO: BarIndex - add argument and description to function comment\r
-// TODO: Offset - add argument and description to function comment\r
-// TODO: Count - add argument and description to function comment\r
-// TODO: Buffer - add argument and description to function comment\r
-// TODO: EFI_INVALID_PARAMETER - add return value to function comment\r
-// TODO: EFI_UNSUPPORTED - add return value to function comment\r
{\r
EFI_STATUS Status;\r
PCI_IO_DEVICE *PciIoDevice;\r
return EFI_INVALID_PARAMETER;\r
}\r
\r
+ if (Buffer == NULL) {\r
+ return EFI_INVALID_PARAMETER;\r
+ }\r
+\r
Status = PciIoVerifyBarAccess (PciIoDevice, BarIndex, PciBarTypeIo, Width, Count, &Offset);\r
if (EFI_ERROR (Status)) {\r
return EFI_UNSUPPORTED;\r
return Status;\r
}\r
\r
+/**\r
+ Enable a PCI driver to access PCI controller registers in the PCI memory or I/O space.\r
+\r
+ @param This A pointer to the EFI_PCI_IO_PROTOCOL instance.\r
+ @param Width Signifies the width of the memory or I/O operations.\r
+ @param BarIndex The BAR index of the standard PCI Configuration header to use as the\r
+ base address for the memory or I/O operation to perform.\r
+ @param Offset The offset within the selected BAR to start the memory or I/O operation.\r
+ @param Count The number of memory or I/O operations to perform.\r
+ @param Buffer For read operations, the destination buffer to store the results. For write\r
+ operations, the source buffer to write data from.\r
+\r
+ @retval EFI_SUCCESS The data was read from or written to the PCI controller.\r
+ @retval EFI_UNSUPPORTED BarIndex not valid for this PCI controller.\r
+ @retval EFI_UNSUPPORTED The address range specified by Offset, Width, and Count is not\r
+ valid for the PCI BAR specified by BarIndex.\r
+ @retval EFI_OUT_OF_RESOURCES The request could not be completed due to a lack of resources.\r
+ @retval EFI_INVALID_PARAMETER One or more parameters are invalid.\r
+\r
+**/\r
EFI_STATUS\r
EFIAPI\r
PciIoIoWrite (\r
IN UINTN Count,\r
IN OUT VOID *Buffer\r
)\r
-/*++\r
-\r
-Routine Description:\r
-\r
- Performs a PCI I/O Write Cycle\r
-\r
-Arguments:\r
-\r
-Returns:\r
-\r
- None\r
-\r
---*/\r
-// TODO: This - add argument and description to function comment\r
-// TODO: Width - add argument and description to function comment\r
-// TODO: BarIndex - add argument and description to function comment\r
-// TODO: Offset - add argument and description to function comment\r
-// TODO: Count - add argument and description to function comment\r
-// TODO: Buffer - add argument and description to function comment\r
-// TODO: EFI_INVALID_PARAMETER - add return value to function comment\r
-// TODO: EFI_UNSUPPORTED - add return value to function comment\r
{\r
EFI_STATUS Status;\r
PCI_IO_DEVICE *PciIoDevice;\r
return EFI_INVALID_PARAMETER;\r
}\r
\r
+ if (Buffer == NULL) {\r
+ return EFI_INVALID_PARAMETER;\r
+ }\r
+\r
Status = PciIoVerifyBarAccess (PciIoDevice, BarIndex, PciBarTypeIo, Width, Count, &Offset);\r
if (EFI_ERROR (Status)) {\r
return EFI_UNSUPPORTED;\r
return Status;\r
}\r
\r
+/**\r
+ Enable a PCI driver to access PCI controller registers in PCI configuration space.\r
+\r
+ @param This A pointer to the EFI_PCI_IO_PROTOCOL instance.\r
+ @param Width Signifies the width of the memory operations.\r
+ @param Offset The offset within the PCI configuration space for the PCI controller.\r
+ @param Count The number of PCI configuration operations to perform.\r
+ @param Buffer For read operations, the destination buffer to store the results. For write\r
+ operations, the source buffer to write data from.\r
+\r
+\r
+ @retval EFI_SUCCESS The data was read from or written to the PCI controller.\r
+ @retval EFI_UNSUPPORTED The address range specified by Offset, Width, and Count is not\r
+ valid for the PCI configuration header of the PCI controller.\r
+ @retval EFI_OUT_OF_RESOURCES The request could not be completed due to a lack of resources.\r
+ @retval EFI_INVALID_PARAMETER Buffer is NULL or Width is invalid.\r
+\r
+**/\r
EFI_STATUS\r
EFIAPI\r
PciIoConfigRead (\r
IN UINTN Count,\r
IN OUT VOID *Buffer\r
)\r
-/*++\r
-\r
-Routine Description:\r
-\r
- Performs a PCI Configuration Read Cycle\r
-\r
-Arguments:\r
-\r
-Returns:\r
-\r
- None\r
-\r
---*/\r
-// TODO: This - add argument and description to function comment\r
-// TODO: Width - add argument and description to function comment\r
-// TODO: Offset - add argument and description to function comment\r
-// TODO: Count - add argument and description to function comment\r
-// TODO: Buffer - add argument and description to function comment\r
{\r
EFI_STATUS Status;\r
PCI_IO_DEVICE *PciIoDevice;\r
}\r
\r
Status = PciIoDevice->PciRootBridgeIo->Pci.Read (\r
- PciIoDevice->PciRootBridgeIo,\r
- (EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL_WIDTH) Width,\r
- Address,\r
- Count,\r
- Buffer\r
- );\r
+ PciIoDevice->PciRootBridgeIo,\r
+ (EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL_WIDTH) Width,\r
+ Address,\r
+ Count,\r
+ Buffer\r
+ );\r
\r
if (EFI_ERROR (Status)) {\r
ReportErrorStatusCode (PciIoDevice, EFI_IO_BUS_PCI | EFI_IOB_EC_READ_ERROR);\r
return Status;\r
}\r
\r
+/**\r
+ Enable a PCI driver to access PCI controller registers in PCI configuration space.\r
+\r
+ @param This A pointer to the EFI_PCI_IO_PROTOCOL instance.\r
+ @param Width Signifies the width of the memory operations.\r
+ @param Offset The offset within the PCI configuration space for the PCI controller.\r
+ @param Count The number of PCI configuration operations to perform.\r
+ @param Buffer For read operations, the destination buffer to store the results. For write\r
+ operations, the source buffer to write data from.\r
+\r
+\r
+ @retval EFI_SUCCESS The data was read from or written to the PCI controller.\r
+ @retval EFI_UNSUPPORTED The address range specified by Offset, Width, and Count is not\r
+ valid for the PCI configuration header of the PCI controller.\r
+ @retval EFI_OUT_OF_RESOURCES The request could not be completed due to a lack of resources.\r
+ @retval EFI_INVALID_PARAMETER Buffer is NULL or Width is invalid.\r
+\r
+**/\r
EFI_STATUS\r
EFIAPI\r
PciIoConfigWrite (\r
IN UINTN Count,\r
IN OUT VOID *Buffer\r
)\r
-/*++\r
-\r
-Routine Description:\r
-\r
- Performs a PCI Configuration Write Cycle\r
-\r
-Arguments:\r
-\r
-Returns:\r
-\r
- None\r
-\r
---*/\r
-// TODO: This - add argument and description to function comment\r
-// TODO: Width - add argument and description to function comment\r
-// TODO: Offset - add argument and description to function comment\r
-// TODO: Count - add argument and description to function comment\r
-// TODO: Buffer - add argument and description to function comment\r
{\r
EFI_STATUS Status;\r
PCI_IO_DEVICE *PciIoDevice;\r
return Status;\r
}\r
\r
+/**\r
+ Enables a PCI driver to copy one region of PCI memory space to another region of PCI\r
+ memory space.\r
+\r
+ @param This A pointer to the EFI_PCI_IO_PROTOCOL instance.\r
+ @param Width Signifies the width of the memory operations.\r
+ @param DestBarIndex The BAR index in the standard PCI Configuration header to use as the\r
+ base address for the memory operation to perform.\r
+ @param DestOffset The destination offset within the BAR specified by DestBarIndex to\r
+ start the memory writes for the copy operation.\r
+ @param SrcBarIndex The BAR index in the standard PCI Configuration header to use as the\r
+ base address for the memory operation to perform.\r
+ @param SrcOffset The source offset within the BAR specified by SrcBarIndex to start\r
+ the memory reads for the copy operation.\r
+ @param Count The number of memory operations to perform. Bytes moved is Width\r
+ size * Count, starting at DestOffset and SrcOffset.\r
+\r
+ @retval EFI_SUCCESS The data was copied from one memory region to another memory region.\r
+ @retval EFI_UNSUPPORTED DestBarIndex not valid for this PCI controller.\r
+ @retval EFI_UNSUPPORTED SrcBarIndex not valid for this PCI controller.\r
+ @retval EFI_UNSUPPORTED The address range specified by DestOffset, Width, and Count\r
+ is not valid for the PCI BAR specified by DestBarIndex.\r
+ @retval EFI_UNSUPPORTED The address range specified by SrcOffset, Width, and Count is\r
+ not valid for the PCI BAR specified by SrcBarIndex.\r
+ @retval EFI_INVALID_PARAMETER Width is invalid.\r
+ @retval EFI_OUT_OF_RESOURCES The request could not be completed due to a lack of resources.\r
+\r
+**/\r
EFI_STATUS\r
EFIAPI\r
PciIoCopyMem (\r
IN UINT64 SrcOffset,\r
IN UINTN Count\r
)\r
-/*++\r
-\r
-Routine Description:\r
-\r
- Copy PCI Memory\r
-\r
-Arguments:\r
-\r
-Returns:\r
-\r
- None\r
-\r
---*/\r
-// TODO: This - add argument and description to function comment\r
-// TODO: Width - add argument and description to function comment\r
-// TODO: DestBarIndex - add argument and description to function comment\r
-// TODO: DestOffset - add argument and description to function comment\r
-// TODO: SrcBarIndex - add argument and description to function comment\r
-// TODO: SrcOffset - add argument and description to function comment\r
-// TODO: Count - add argument and description to function comment\r
-// TODO: EFI_INVALID_PARAMETER - add return value to function comment\r
-// TODO: EFI_INVALID_PARAMETER - add return value to function comment\r
-// TODO: EFI_UNSUPPORTED - add return value to function comment\r
-// TODO: EFI_UNSUPPORTED - add return value to function comment\r
{\r
EFI_STATUS Status;\r
PCI_IO_DEVICE *PciIoDevice;\r
return Status;\r
}\r
\r
+/**\r
+ Provides the PCI controller-specific addresses needed to access system memory.\r
+\r
+ @param This A pointer to the EFI_PCI_IO_PROTOCOL instance.\r
+ @param Operation Indicates if the bus master is going to read or write to system memory.\r
+ @param HostAddress The system memory address to map to the PCI controller.\r
+ @param NumberOfBytes On input the number of bytes to map. On output the number of bytes\r
+ that were mapped.\r
+ @param DeviceAddress The resulting map address for the bus master PCI controller to use to\r
+ access the hosts HostAddress.\r
+ @param Mapping A resulting value to pass to Unmap().\r
+\r
+ @retval EFI_SUCCESS The range was mapped for the returned NumberOfBytes.\r
+ @retval EFI_UNSUPPORTED The HostAddress cannot be mapped as a common buffer.\r
+ @retval EFI_INVALID_PARAMETER One or more parameters are invalid.\r
+ @retval EFI_OUT_OF_RESOURCES The request could not be completed due to a lack of resources.\r
+ @retval EFI_DEVICE_ERROR The system hardware could not map the requested address.\r
+\r
+**/\r
EFI_STATUS\r
EFIAPI\r
PciIoMap (\r
OUT EFI_PHYSICAL_ADDRESS *DeviceAddress,\r
OUT VOID **Mapping\r
)\r
-/*++\r
-\r
-Routine Description:\r
-\r
- Maps a memory region for DMA\r
-\r
-Arguments:\r
-\r
-Returns:\r
-\r
- None\r
-\r
---*/\r
-// TODO: This - add argument and description to function comment\r
-// TODO: Operation - add argument and description to function comment\r
-// TODO: HostAddress - add argument and description to function comment\r
-// TODO: NumberOfBytes - add argument and description to function comment\r
-// TODO: DeviceAddress - add argument and description to function comment\r
-// TODO: Mapping - add argument and description to function comment\r
-// TODO: EFI_INVALID_PARAMETER - add return value to function comment\r
-// TODO: EFI_INVALID_PARAMETER - add return value to function comment\r
{\r
EFI_STATUS Status;\r
PCI_IO_DEVICE *PciIoDevice;\r
return EFI_INVALID_PARAMETER;\r
}\r
\r
- if (PciIoDevice->Attributes & EFI_PCI_IO_ATTRIBUTE_DUAL_ADDRESS_CYCLE) {\r
+ if ((PciIoDevice->Attributes & EFI_PCI_IO_ATTRIBUTE_DUAL_ADDRESS_CYCLE) != 0) {\r
Operation = (EFI_PCI_IO_PROTOCOL_OPERATION) (Operation + EfiPciOperationBusMasterRead64);\r
}\r
\r
return Status;\r
}\r
\r
+/**\r
+ Completes the Map() operation and releases any corresponding resources.\r
+\r
+ @param This A pointer to the EFI_PCI_IO_PROTOCOL instance.\r
+ @param Mapping The mapping value returned from Map().\r
+\r
+ @retval EFI_SUCCESS The range was unmapped.\r
+ @retval EFI_DEVICE_ERROR The data was not committed to the target system memory.\r
+\r
+**/\r
EFI_STATUS\r
EFIAPI\r
PciIoUnmap (\r
IN EFI_PCI_IO_PROTOCOL *This,\r
IN VOID *Mapping\r
)\r
-/*++\r
-\r
-Routine Description:\r
-\r
- Unmaps a memory region for DMA\r
-\r
-Arguments:\r
-\r
-Returns:\r
-\r
- None\r
-\r
---*/\r
-// TODO: This - add argument and description to function comment\r
-// TODO: Mapping - add argument and description to function comment\r
{\r
EFI_STATUS Status;\r
PCI_IO_DEVICE *PciIoDevice;\r
return Status;\r
}\r
\r
+/**\r
+ Allocates pages that are suitable for an EfiPciIoOperationBusMasterCommonBuffer\r
+ mapping.\r
+\r
+ @param This A pointer to the EFI_PCI_IO_PROTOCOL instance.\r
+ @param Type This parameter is not used and must be ignored.\r
+ @param MemoryType The type of memory to allocate, EfiBootServicesData or\r
+ EfiRuntimeServicesData.\r
+ @param Pages The number of pages to allocate.\r
+ @param HostAddress A pointer to store the base system memory address of the\r
+ allocated range.\r
+ @param Attributes The requested bit mask of attributes for the allocated range.\r
+\r
+ @retval EFI_SUCCESS The requested memory pages were allocated.\r
+ @retval EFI_UNSUPPORTED Attributes is unsupported. The only legal attribute bits are\r
+ MEMORY_WRITE_COMBINE and MEMORY_CACHED.\r
+ @retval EFI_INVALID_PARAMETER One or more parameters are invalid.\r
+ @retval EFI_OUT_OF_RESOURCES The memory pages could not be allocated.\r
+\r
+**/\r
EFI_STATUS\r
EFIAPI\r
PciIoAllocateBuffer (\r
OUT VOID **HostAddress,\r
IN UINT64 Attributes\r
)\r
-/*++\r
-\r
-Routine Description:\r
-\r
- Allocates a common buffer for DMA\r
-\r
-Arguments:\r
-\r
-Returns:\r
-\r
- None\r
-\r
---*/\r
-// TODO: This - add argument and description to function comment\r
-// TODO: Type - add argument and description to function comment\r
-// TODO: MemoryType - add argument and description to function comment\r
-// TODO: Pages - add argument and description to function comment\r
-// TODO: HostAddress - add argument and description to function comment\r
-// TODO: Attributes - add argument and description to function comment\r
-// TODO: EFI_UNSUPPORTED - add return value to function comment\r
{\r
EFI_STATUS Status;\r
PCI_IO_DEVICE *PciIoDevice;\r
\r
- if (Attributes &\r
- (~(EFI_PCI_ATTRIBUTE_MEMORY_WRITE_COMBINE | EFI_PCI_ATTRIBUTE_MEMORY_CACHED))) {\r
+ if ((Attributes &\r
+ (~(EFI_PCI_ATTRIBUTE_MEMORY_WRITE_COMBINE | EFI_PCI_ATTRIBUTE_MEMORY_CACHED))) != 0){\r
return EFI_UNSUPPORTED;\r
}\r
\r
PciIoDevice = PCI_IO_DEVICE_FROM_PCI_IO_THIS (This);\r
\r
- if (PciIoDevice->Attributes & EFI_PCI_IO_ATTRIBUTE_DUAL_ADDRESS_CYCLE) {\r
+ if ((PciIoDevice->Attributes & EFI_PCI_IO_ATTRIBUTE_DUAL_ADDRESS_CYCLE) != 0) {\r
Attributes |= EFI_PCI_ATTRIBUTE_DUAL_ADDRESS_CYCLE;\r
}\r
\r
return Status;\r
}\r
\r
+/**\r
+ Frees memory that was allocated with AllocateBuffer().\r
+\r
+ @param This A pointer to the EFI_PCI_IO_PROTOCOL instance.\r
+ @param Pages The number of pages to free.\r
+ @param HostAddress The base system memory address of the allocated range.\r
+\r
+ @retval EFI_SUCCESS The requested memory pages were freed.\r
+ @retval EFI_INVALID_PARAMETER The memory range specified by HostAddress and Pages\r
+ was not allocated with AllocateBuffer().\r
+\r
+**/\r
EFI_STATUS\r
EFIAPI\r
PciIoFreeBuffer (\r
IN UINTN Pages,\r
IN VOID *HostAddress\r
)\r
-/*++\r
-\r
-Routine Description:\r
-\r
- Frees a common buffer \r
-\r
-Arguments:\r
-\r
-Returns:\r
-\r
- None\r
-\r
---*/\r
-// TODO: This - add argument and description to function comment\r
-// TODO: Pages - add argument and description to function comment\r
-// TODO: HostAddress - add argument and description to function comment\r
{\r
EFI_STATUS Status;\r
PCI_IO_DEVICE *PciIoDevice;\r
return Status;\r
}\r
\r
+/**\r
+ Flushes all PCI posted write transactions from a PCI host bridge to system memory.\r
+\r
+ @param This A pointer to the EFI_PCI_IO_PROTOCOL instance.\r
+\r
+ @retval EFI_SUCCESS The PCI posted write transactions were flushed from the PCI host\r
+ bridge to system memory.\r
+ @retval EFI_DEVICE_ERROR The PCI posted write transactions were not flushed from the PCI\r
+ host bridge due to a hardware error.\r
+\r
+**/\r
EFI_STATUS\r
EFIAPI\r
PciIoFlush (\r
IN EFI_PCI_IO_PROTOCOL *This\r
)\r
-/*++\r
-\r
-Routine Description:\r
-\r
- Flushes a DMA buffer\r
-\r
-Arguments:\r
-\r
-Returns:\r
-\r
- None\r
-\r
---*/\r
-// TODO: This - add argument and description to function comment\r
{\r
EFI_STATUS Status;\r
PCI_IO_DEVICE *PciIoDevice;\r
return Status;\r
}\r
\r
+/**\r
+ Retrieves this PCI controller's current PCI bus number, device number, and function number.\r
+\r
+ @param This A pointer to the EFI_PCI_IO_PROTOCOL instance.\r
+ @param SegmentNumber The PCI controller's current PCI segment number.\r
+ @param BusNumber The PCI controller's current PCI bus number.\r
+ @param DeviceNumber The PCI controller's current PCI device number.\r
+ @param FunctionNumber The PCI controller's current PCI function number.\r
+\r
+ @retval EFI_SUCCESS The PCI controller location was returned.\r
+ @retval EFI_INVALID_PARAMETER One or more parameters are invalid.\r
+\r
+**/\r
EFI_STATUS\r
EFIAPI\r
PciIoGetLocation (\r
OUT UINTN *Device,\r
OUT UINTN *Function\r
)\r
-/*++\r
-\r
-Routine Description:\r
-\r
- Gets a PCI device's current bus number, device number, and function number.\r
-\r
-Arguments:\r
-\r
-Returns:\r
-\r
- None\r
-\r
---*/\r
-// TODO: This - add argument and description to function comment\r
-// TODO: Segment - add argument and description to function comment\r
-// TODO: Bus - add argument and description to function comment\r
-// TODO: Device - add argument and description to function comment\r
-// TODO: Function - add argument and description to function comment\r
-// TODO: EFI_INVALID_PARAMETER - add return value to function comment\r
-// TODO: EFI_SUCCESS - add return value to function comment\r
{\r
PCI_IO_DEVICE *PciIoDevice;\r
\r
return EFI_SUCCESS;\r
}\r
\r
-BOOLEAN\r
-CheckBarType (\r
- IN PCI_IO_DEVICE *PciIoDevice,\r
- UINT8 BarIndex,\r
- PCI_BAR_TYPE BarType\r
- )\r
-/*++\r
-\r
-Routine Description:\r
+/**\r
+ Check BAR type for PCI resource.\r
\r
- Sets a PCI controllers attributes on a resource range\r
+ @param PciIoDevice PCI device instance.\r
+ @param BarIndex The BAR index of the standard PCI Configuration header to use as the\r
+ base address for the memory or I/O operation to perform.\r
+ @param BarType Memory or I/O.\r
\r
-Arguments:\r
+ @retval TRUE Pci device's bar type is same with input BarType.\r
+ @retval TRUE Pci device's bar type is not same with input BarType.\r
\r
-Returns:\r
-\r
- None\r
-\r
---*/\r
-// TODO: PciIoDevice - add argument and description to function comment\r
-// TODO: BarIndex - add argument and description to function comment\r
-// TODO: BarType - add argument and description to function comment\r
+**/\r
+BOOLEAN\r
+CheckBarType (\r
+ IN PCI_IO_DEVICE *PciIoDevice,\r
+ IN UINT8 BarIndex,\r
+ IN PCI_BAR_TYPE BarType\r
+ )\r
{\r
switch (BarType) {\r
\r
return FALSE;\r
}\r
\r
+/**\r
+ Set/Disable new attributes to a Root Bridge.\r
+\r
+ @param PciIoDevice Pci device instance.\r
+ @param Attributes New attribute want to be set.\r
+ @param Operation Set or Disable.\r
+\r
+ @retval EFI_UNSUPPORTED If root bridge does not support change attribute.\r
+ @retval EFI_SUCCESS Successfully set new attributs.\r
+\r
+**/\r
EFI_STATUS\r
ModifyRootBridgeAttributes (\r
IN PCI_IO_DEVICE *PciIoDevice,\r
IN UINT64 Attributes,\r
IN EFI_PCI_IO_PROTOCOL_ATTRIBUTE_OPERATION Operation\r
)\r
-/*++\r
-\r
-Routine Description:\r
-\r
- Set new attributes to a Root Bridge\r
-\r
-Arguments:\r
-\r
-Returns:\r
-\r
- None\r
-\r
---*/\r
-// TODO: PciIoDevice - add argument and description to function comment\r
-// TODO: Attributes - add argument and description to function comment\r
-// TODO: Operation - add argument and description to function comment\r
-// TODO: EFI_UNSUPPORTED - add return value to function comment\r
-// TODO: EFI_UNSUPPORTED - add return value to function comment\r
-// TODO: EFI_SUCCESS - add return value to function comment\r
{\r
UINT64 PciRootBridgeSupports;\r
UINT64 PciRootBridgeAttributes;\r
if (EFI_ERROR (Status)) {\r
return EFI_UNSUPPORTED;\r
}\r
- \r
+\r
//\r
// Record the new attribute of the Root Bridge\r
//\r
} else {\r
NewPciRootBridgeAttributes = PciRootBridgeAttributes & (~Attributes);\r
}\r
- \r
+\r
//\r
// Call the PCI Root Bridge to attempt to modify the attributes\r
//\r
- if (NewPciRootBridgeAttributes ^ PciRootBridgeAttributes) {\r
+ if ((NewPciRootBridgeAttributes ^ PciRootBridgeAttributes) != 0) {\r
\r
Status = PciIoDevice->PciRootBridgeIo->SetAttributes (\r
PciIoDevice->PciRootBridgeIo,\r
return EFI_UNSUPPORTED;\r
}\r
}\r
- \r
+\r
//\r
// Also update the attributes for this Root Bridge structure\r
//\r
PciIoDevice->Attributes = NewPciRootBridgeAttributes;\r
- return EFI_SUCCESS;\r
\r
+ return EFI_SUCCESS;\r
}\r
\r
-EFI_STATUS\r
-SupportPaletteSnoopAttributes (\r
- IN PCI_IO_DEVICE *PciIoDevice,\r
- IN EFI_PCI_IO_PROTOCOL_ATTRIBUTE_OPERATION Operation\r
- )\r
-/*++\r
-\r
-Routine Description:\r
+/**\r
+ Check whether this device can be enable/disable to snoop.\r
\r
- Check whether this device can be enable/disable to snoop\r
+ @param PciIoDevice Pci device instance.\r
+ @param Operation Enable/Disable.\r
\r
-Arguments:\r
+ @retval EFI_UNSUPPORTED Pci device is not GFX device or not support snoop.\r
+ @retval EFI_SUCCESS Snoop can be supported.\r
\r
-Returns:\r
-\r
- None\r
-\r
---*/\r
-// TODO: PciIoDevice - add argument and description to function comment\r
-// TODO: Operation - add argument and description to function comment\r
-// TODO: EFI_UNSUPPORTED - add return value to function comment\r
-// TODO: EFI_SUCCESS - add return value to function comment\r
-// TODO: EFI_SUCCESS - add return value to function comment\r
-// TODO: EFI_UNSUPPORTED - add return value to function comment\r
-// TODO: EFI_UNSUPPORTED - add return value to function comment\r
-// TODO: EFI_SUCCESS - add return value to function comment\r
-// TODO: EFI_UNSUPPORTED - add return value to function comment\r
-// TODO: EFI_UNSUPPORTED - add return value to function comment\r
-// TODO: EFI_SUCCESS - add return value to function comment\r
+**/\r
+EFI_STATUS\r
+SupportPaletteSnoopAttributes (\r
+ IN PCI_IO_DEVICE *PciIoDevice,\r
+ IN EFI_PCI_IO_PROTOCOL_ATTRIBUTE_OPERATION Operation\r
+ )\r
{\r
PCI_IO_DEVICE *Temp;\r
UINT16 VGACommand;\r
//\r
Temp = ActiveVGADeviceOnTheSameSegment (PciIoDevice);\r
\r
- if (!Temp) {\r
+ if (Temp == NULL) {\r
//\r
// If there is no VGA device on the segement, set\r
// this graphics card to decode the palette range\r
//\r
return EFI_SUCCESS;\r
}\r
- \r
+\r
//\r
// Check these two agents are on the same path\r
//\r
//\r
if (Temp->Parent == PciIoDevice->Parent) {\r
\r
- PciReadCommandRegister (Temp, &VGACommand);\r
+ PCI_READ_COMMAND_REGISTER (Temp, &VGACommand);\r
\r
//\r
// If they are on the same bus, either one can\r
// be set to snoop, the other set to decode\r
//\r
- if (VGACommand & EFI_PCI_COMMAND_VGA_PALETTE_SNOOP) {\r
+ if ((VGACommand & EFI_PCI_COMMAND_VGA_PALETTE_SNOOP) != 0) {\r
//\r
// VGA has set to snoop, so GFX can be only set to disable snoop\r
//\r
\r
return EFI_SUCCESS;\r
}\r
- \r
+\r
//\r
// If they are on the same path but on the different bus\r
// The first agent is set to snoop, the second one set to\r
// decode\r
//\r
- \r
+\r
if (Temp->BusNumber < PciIoDevice->BusNumber) {\r
//\r
// GFX should be set to decode\r
//\r
if (Operation == EfiPciIoAttributeOperationDisable) {\r
- PciEnableCommandRegister (Temp, EFI_PCI_COMMAND_VGA_PALETTE_SNOOP);\r
+ PCI_ENABLE_COMMAND_REGISTER (Temp, EFI_PCI_COMMAND_VGA_PALETTE_SNOOP);\r
Temp->Attributes |= EFI_PCI_COMMAND_VGA_PALETTE_SNOOP;\r
} else {\r
return EFI_UNSUPPORTED;\r
// GFX should be set to snoop\r
//\r
if (Operation == EfiPciIoAttributeOperationEnable) {\r
- PciDisableCommandRegister (Temp, EFI_PCI_COMMAND_VGA_PALETTE_SNOOP);\r
+ PCI_DISABLE_COMMAND_REGISTER (Temp, EFI_PCI_COMMAND_VGA_PALETTE_SNOOP);\r
Temp->Attributes &= (~EFI_PCI_COMMAND_VGA_PALETTE_SNOOP);\r
} else {\r
return EFI_UNSUPPORTED;\r
return EFI_SUCCESS;\r
}\r
\r
+/**\r
+ Performs an operation on the attributes that this PCI controller supports. The operations include\r
+ getting the set of supported attributes, retrieving the current attributes, setting the current\r
+ attributes, enabling attributes, and disabling attributes.\r
+\r
+ @param This A pointer to the EFI_PCI_IO_PROTOCOL instance.\r
+ @param Operation The operation to perform on the attributes for this PCI controller.\r
+ @param Attributes The mask of attributes that are used for Set, Enable, and Disable\r
+ operations.\r
+ @param Result A pointer to the result mask of attributes that are returned for the Get\r
+ and Supported operations.\r
+\r
+ @retval EFI_SUCCESS The operation on the PCI controller's attributes was completed.\r
+ @retval EFI_INVALID_PARAMETER One or more parameters are invalid.\r
+ @retval EFI_UNSUPPORTED one or more of the bits set in\r
+ Attributes are not supported by this PCI controller or one of\r
+ its parent bridges when Operation is Set, Enable or Disable.\r
+\r
+**/\r
EFI_STATUS\r
EFIAPI\r
PciIoAttributes (\r
IN UINT64 Attributes,\r
OUT UINT64 *Result OPTIONAL\r
)\r
-/*++\r
-\r
-Routine Description:\r
-\r
-\r
-Arguments:\r
-\r
-Returns:\r
-\r
- None\r
-\r
---*/\r
-// TODO: This - add argument and description to function comment\r
-// TODO: Operation - add argument and description to function comment\r
-// TODO: Attributes - add argument and description to function comment\r
-// TODO: Result - add argument and description to function comment\r
-// TODO: EFI_INVALID_PARAMETER - add return value to function comment\r
-// TODO: EFI_SUCCESS - add return value to function comment\r
-// TODO: EFI_INVALID_PARAMETER - add return value to function comment\r
-// TODO: EFI_SUCCESS - add return value to function comment\r
-// TODO: EFI_UNSUPPORTED - add return value to function comment\r
-// TODO: EFI_UNSUPPORTED - add return value to function comment\r
-// TODO: EFI_SUCCESS - add return value to function comment\r
-// TODO: EFI_INVALID_PARAMETER - add return value to function comment\r
-// TODO: EFI_UNSUPPORTED - add return value to function comment\r
-// TODO: EFI_UNSUPPORTED - add return value to function comment\r
-// TODO: EFI_UNSUPPORTED - add return value to function comment\r
{\r
EFI_STATUS Status;\r
\r
}\r
//\r
// Just a trick for ENABLE attribute\r
+ // EFI_PCI_DEVICE_ENABLE is not defined in UEFI spec, which is the internal usage.\r
+ // So, this logic doesn't confrom to UEFI spec, which should be removed.\r
+ // But this trick logic is still kept for some binary drivers that depend on it.\r
//\r
if ((Attributes & EFI_PCI_DEVICE_ENABLE) == EFI_PCI_DEVICE_ENABLE) {\r
Attributes &= (PciIoDevice->Supports);\r
if (Supports != Attributes) {\r
return EFI_UNSUPPORTED;\r
}\r
- \r
+\r
//\r
// For Root Bridge, just call RootBridgeIo to set attributes;\r
//\r
- if (!PciIoDevice->Parent) {\r
+ if (PciIoDevice->Parent == NULL) {\r
Status = ModifyRootBridgeAttributes (PciIoDevice, Attributes, Operation);\r
return Status;\r
}\r
//\r
// Check VGA and VGA16, they can not be set at the same time\r
//\r
- if (((Attributes & EFI_PCI_IO_ATTRIBUTE_VGA_IO) &&\r
- (Attributes & EFI_PCI_IO_ATTRIBUTE_VGA_IO_16)) ||\r
- ((Attributes & EFI_PCI_IO_ATTRIBUTE_VGA_IO) &&\r
- (Attributes & EFI_PCI_IO_ATTRIBUTE_VGA_PALETTE_IO_16)) ||\r
- ((Attributes & EFI_PCI_IO_ATTRIBUTE_VGA_PALETTE_IO) &&\r
- (Attributes & EFI_PCI_IO_ATTRIBUTE_VGA_IO_16)) ||\r
- ((Attributes & EFI_PCI_IO_ATTRIBUTE_VGA_PALETTE_IO) &&\r
- (Attributes & EFI_PCI_IO_ATTRIBUTE_VGA_PALETTE_IO_16)) ) {\r
+ if (((Attributes & EFI_PCI_IO_ATTRIBUTE_VGA_IO) != 0 &&\r
+ (Attributes & EFI_PCI_IO_ATTRIBUTE_VGA_IO_16) != 0) ||\r
+ ((Attributes & EFI_PCI_IO_ATTRIBUTE_VGA_IO) != 0 &&\r
+ (Attributes & EFI_PCI_IO_ATTRIBUTE_VGA_PALETTE_IO_16) != 0) ||\r
+ ((Attributes & EFI_PCI_IO_ATTRIBUTE_VGA_PALETTE_IO) != 0 &&\r
+ (Attributes & EFI_PCI_IO_ATTRIBUTE_VGA_IO_16) != 0) ||\r
+ ((Attributes & EFI_PCI_IO_ATTRIBUTE_VGA_PALETTE_IO) != 0 &&\r
+ (Attributes & EFI_PCI_IO_ATTRIBUTE_VGA_PALETTE_IO_16) != 0) ) {\r
return EFI_UNSUPPORTED;\r
}\r
\r
//\r
if (IS_PCI_BRIDGE (&PciIoDevice->Pci) || IS_CARDBUS_BRIDGE (&PciIoDevice->Pci)) {\r
\r
- if (Attributes & (EFI_PCI_IO_ATTRIBUTE_VGA_IO | EFI_PCI_IO_ATTRIBUTE_VGA_IO_16)) {\r
+ if ((Attributes & (EFI_PCI_IO_ATTRIBUTE_VGA_IO | EFI_PCI_IO_ATTRIBUTE_VGA_IO_16)) != 0) {\r
BridgeControl |= EFI_PCI_BRIDGE_CONTROL_VGA;\r
}\r
\r
- if (Attributes & EFI_PCI_IO_ATTRIBUTE_ISA_IO) {\r
+ if ((Attributes & EFI_PCI_IO_ATTRIBUTE_ISA_IO) != 0) {\r
BridgeControl |= EFI_PCI_BRIDGE_CONTROL_ISA;\r
}\r
\r
- if (Attributes & (EFI_PCI_IO_ATTRIBUTE_VGA_PALETTE_IO | EFI_PCI_IO_ATTRIBUTE_VGA_PALETTE_IO_16)) {\r
+ if ((Attributes & (EFI_PCI_IO_ATTRIBUTE_VGA_PALETTE_IO | EFI_PCI_IO_ATTRIBUTE_VGA_PALETTE_IO_16)) != 0) {\r
Command |= EFI_PCI_IO_ATTRIBUTE_VGA_PALETTE_IO;\r
}\r
\r
- if (Attributes & (EFI_PCI_IO_ATTRIBUTE_VGA_PALETTE_IO_16 | EFI_PCI_IO_ATTRIBUTE_VGA_IO_16)) {\r
+ if ((Attributes & (EFI_PCI_IO_ATTRIBUTE_VGA_PALETTE_IO_16 | EFI_PCI_IO_ATTRIBUTE_VGA_IO_16)) != 0) {\r
BridgeControl |= EFI_PCI_BRIDGE_CONTROL_VGA_16;\r
}\r
\r
// Do with the attributes on VGA\r
// Only for VGA's legacy resource, we just can enable once.\r
//\r
- if (Attributes &\r
+ if ((Attributes &\r
(EFI_PCI_IO_ATTRIBUTE_VGA_IO |\r
EFI_PCI_IO_ATTRIBUTE_VGA_IO_16 |\r
- EFI_PCI_IO_ATTRIBUTE_VGA_MEMORY)) {\r
+ EFI_PCI_IO_ATTRIBUTE_VGA_MEMORY)) != 0) {\r
//\r
// Check if a VGA has been enabled before enabling a new one\r
//\r
// Check if there have been an active VGA device on the same segment\r
//\r
Temp = ActiveVGADeviceOnTheSameSegment (PciIoDevice);\r
- if (Temp && Temp != PciIoDevice) {\r
+ if (Temp != NULL && Temp != PciIoDevice) {\r
//\r
// An active VGA has been detected, so can not enable another\r
//\r
}\r
}\r
}\r
- \r
+\r
//\r
// Do with the attributes on GFX\r
//\r
- if (Attributes & (EFI_PCI_IO_ATTRIBUTE_VGA_PALETTE_IO | EFI_PCI_IO_ATTRIBUTE_VGA_PALETTE_IO_16)) {\r
+ if ((Attributes & (EFI_PCI_IO_ATTRIBUTE_VGA_PALETTE_IO | EFI_PCI_IO_ATTRIBUTE_VGA_PALETTE_IO_16)) != 0) {\r
\r
if (Operation == EfiPciIoAttributeOperationEnable) {\r
//\r
Status = SupportPaletteSnoopAttributes (PciIoDevice, Operation);\r
\r
if (EFI_ERROR (Status)) {\r
- \r
+\r
//\r
// Enable operation is forbidden, so mask the bit in attributes\r
// so as to keep consistent with the actual Status\r
}\r
}\r
\r
- if (Attributes & EFI_PCI_IO_ATTRIBUTE_IO) {\r
+ if ((Attributes & EFI_PCI_IO_ATTRIBUTE_IO) != 0) {\r
Command |= EFI_PCI_COMMAND_IO_SPACE;\r
}\r
\r
- if (Attributes & EFI_PCI_IO_ATTRIBUTE_MEMORY) {\r
+ if ((Attributes & EFI_PCI_IO_ATTRIBUTE_MEMORY) != 0) {\r
Command |= EFI_PCI_COMMAND_MEMORY_SPACE;\r
}\r
\r
- if (Attributes & EFI_PCI_IO_ATTRIBUTE_BUS_MASTER) {\r
+ if ((Attributes & EFI_PCI_IO_ATTRIBUTE_BUS_MASTER) != 0) {\r
Command |= EFI_PCI_COMMAND_BUS_MASTER;\r
}\r
//\r
// The upstream bridge should be also set to revelant attribute\r
// expect for IO, Mem and BusMaster\r
//\r
- UpStreamAttributes = Attributes & \r
+ UpStreamAttributes = Attributes &\r
(~(EFI_PCI_IO_ATTRIBUTE_IO |\r
EFI_PCI_IO_ATTRIBUTE_MEMORY |\r
EFI_PCI_IO_ATTRIBUTE_BUS_MASTER\r
//\r
// Enable relevant attributes to command register and bridge control register\r
//\r
- Status = PciEnableCommandRegister (PciIoDevice, Command);\r
- if (BridgeControl) {\r
- Status = PciEnableBridgeControlRegister (PciIoDevice, BridgeControl);\r
+ Status = PCI_ENABLE_COMMAND_REGISTER (PciIoDevice, Command);\r
+ if (BridgeControl != 0) {\r
+ Status = PCI_ENABLE_BRIDGE_CONTROL_REGISTER (PciIoDevice, BridgeControl);\r
}\r
\r
PciIoDevice->Attributes |= Attributes;\r
NULL\r
);\r
} else {\r
- \r
+\r
//\r
// Disable relevant attributes to command register and bridge control register\r
//\r
- Status = PciDisableCommandRegister (PciIoDevice, Command);\r
- if (BridgeControl) {\r
- Status = PciDisableBridgeControlRegister (PciIoDevice, BridgeControl);\r
+ Status = PCI_DISABLE_COMMAND_REGISTER (PciIoDevice, Command);\r
+ if (BridgeControl != 0) {\r
+ Status = PCI_DISABLE_BRIDGE_CONTROL_REGISTER (PciIoDevice, BridgeControl);\r
}\r
\r
PciIoDevice->Attributes &= (~Attributes);\r
return Status;\r
}\r
\r
+/**\r
+ Gets the attributes that this PCI controller supports setting on a BAR using\r
+ SetBarAttributes(), and retrieves the list of resource descriptors for a BAR.\r
+\r
+ @param This A pointer to the EFI_PCI_IO_PROTOCOL instance.\r
+ @param BarIndex The BAR index of the standard PCI Configuration header to use as the\r
+ base address for resource range. The legal range for this field is 0..5.\r
+ @param Supports A pointer to the mask of attributes that this PCI controller supports\r
+ setting for this BAR with SetBarAttributes().\r
+ @param Resources A pointer to the ACPI 2.0 resource descriptors that describe the current\r
+ configuration of this BAR of the PCI controller.\r
+\r
+ @retval EFI_SUCCESS If Supports is not NULL, then the attributes that the PCI\r
+ controller supports are returned in Supports. If Resources\r
+ is not NULL, then the ACPI 2.0 resource descriptors that the PCI\r
+ controller is currently using are returned in Resources.\r
+ @retval EFI_INVALID_PARAMETER Both Supports and Attributes are NULL.\r
+ @retval EFI_UNSUPPORTED BarIndex not valid for this PCI controller.\r
+ @retval EFI_OUT_OF_RESOURCES There are not enough resources available to allocate\r
+ Resources.\r
+\r
+**/\r
EFI_STATUS\r
EFIAPI\r
PciIoGetBarAttributes (\r
OUT UINT64 *Supports, OPTIONAL\r
OUT VOID **Resources OPTIONAL\r
)\r
-/*++\r
-\r
-Routine Description:\r
-\r
-\r
-Arguments:\r
-\r
-Returns:\r
-\r
- None\r
-\r
---*/\r
-// TODO: This - add argument and description to function comment\r
-// TODO: BarIndex - add argument and description to function comment\r
-// TODO: Supports - add argument and description to function comment\r
-// TODO: Resources - add argument and description to function comment\r
-// TODO: EFI_INVALID_PARAMETER - add return value to function comment\r
-// TODO: EFI_UNSUPPORTED - add return value to function comment\r
-// TODO: EFI_OUT_OF_RESOURCES - add return value to function comment\r
-// TODO: EFI_SUCCESS - add return value to function comment\r
{\r
\r
UINT8 *Configuration;\r
NumConfig = 1;\r
}\r
\r
- Configuration = AllocatePool (sizeof (EFI_ACPI_ADDRESS_SPACE_DESCRIPTOR) * NumConfig + sizeof (EFI_ACPI_END_TAG_DESCRIPTOR));\r
+ Configuration = AllocateZeroPool (sizeof (EFI_ACPI_ADDRESS_SPACE_DESCRIPTOR) * NumConfig + sizeof (EFI_ACPI_END_TAG_DESCRIPTOR));\r
if (Configuration == NULL) {\r
return EFI_OUT_OF_RESOURCES;\r
}\r
\r
- ZeroMem (\r
- Configuration,\r
- sizeof (EFI_ACPI_ADDRESS_SPACE_DESCRIPTOR) * NumConfig + sizeof (EFI_ACPI_END_TAG_DESCRIPTOR)\r
- );\r
-\r
Ptr = (EFI_ACPI_ADDRESS_SPACE_DESCRIPTOR *) Configuration;\r
\r
if (NumConfig == 1) {\r
\r
Ptr = (EFI_ACPI_ADDRESS_SPACE_DESCRIPTOR *) ((UINT8 *) Ptr + sizeof (EFI_ACPI_ADDRESS_SPACE_DESCRIPTOR));\r
}\r
- \r
+\r
//\r
// put the checksum\r
//\r
return EFI_SUCCESS;\r
}\r
\r
+/**\r
+ Sets the attributes for a range of a BAR on a PCI controller.\r
+\r
+ @param This A pointer to the EFI_PCI_IO_PROTOCOL instance.\r
+ @param Attributes The mask of attributes to set for the resource range specified by\r
+ BarIndex, Offset, and Length.\r
+ @param BarIndex The BAR index of the standard PCI Configuration header to use as the\r
+ base address for resource range. The legal range for this field is 0..5.\r
+ @param Offset A pointer to the BAR relative base address of the resource range to be\r
+ modified by the attributes specified by Attributes.\r
+ @param Length A pointer to the length of the resource range to be modified by the\r
+ attributes specified by Attributes.\r
+\r
+ @retval EFI_SUCCESS The set of attributes specified by Attributes for the resource\r
+ range specified by BarIndex, Offset, and Length were\r
+ set on the PCI controller, and the actual resource range is returned\r
+ in Offset and Length.\r
+ @retval EFI_INVALID_PARAMETER Offset or Length is NULL.\r
+ @retval EFI_UNSUPPORTED BarIndex not valid for this PCI controller.\r
+ @retval EFI_OUT_OF_RESOURCES There are not enough resources to set the attributes on the\r
+ resource range specified by BarIndex, Offset, and\r
+ Length.\r
+\r
+**/\r
EFI_STATUS\r
EFIAPI\r
PciIoSetBarAttributes (\r
IN OUT UINT64 *Offset,\r
IN OUT UINT64 *Length\r
)\r
-/*++\r
-\r
-Routine Description:\r
-\r
-\r
-Arguments:\r
-\r
-Returns:\r
-\r
- None\r
-\r
---*/\r
-// TODO: This - add argument and description to function comment\r
-// TODO: Attributes - add argument and description to function comment\r
-// TODO: BarIndex - add argument and description to function comment\r
-// TODO: Offset - add argument and description to function comment\r
-// TODO: Length - add argument and description to function comment\r
-// TODO: EFI_INVALID_PARAMETER - add return value to function comment\r
-// TODO: EFI_UNSUPPORTED - add return value to function comment\r
-// TODO: EFI_UNSUPPORTED - add return value to function comment\r
-// TODO: EFI_UNSUPPORTED - add return value to function comment\r
-// TODO: EFI_SUCCESS - add return value to function comment\r
{\r
EFI_STATUS Status;\r
PCI_IO_DEVICE *PciIoDevice;\r
return EFI_SUCCESS;\r
}\r
\r
-EFI_STATUS\r
-UpStreamBridgesAttributes (\r
- IN PCI_IO_DEVICE *PciIoDevice,\r
- IN EFI_PCI_IO_PROTOCOL_ATTRIBUTE_OPERATION Operation,\r
- IN UINT64 Attributes\r
- )\r
-/*++\r
-\r
-Routine Description:\r
-\r
-Arguments:\r
+/**\r
+ Program parent bridge's attribute recurrently.\r
\r
-Returns:\r
+ @param PciIoDevice Child Pci device instance\r
+ @param Operation The operation to perform on the attributes for this PCI controller.\r
+ @param Attributes The mask of attributes that are used for Set, Enable, and Disable\r
+ operations.\r
\r
- None\r
+ @retval EFI_SUCCESS The operation on the PCI controller's attributes was completed.\r
+ @retval EFI_INVALID_PARAMETER One or more parameters are invalid.\r
+ @retval EFI_UNSUPPORTED one or more of the bits set in\r
+ Attributes are not supported by this PCI controller or one of\r
+ its parent bridges when Operation is Set, Enable or Disable.\r
\r
---*/\r
-// TODO: PciIoDevice - add argument and description to function comment\r
-// TODO: Operation - add argument and description to function comment\r
-// TODO: Attributes - add argument and description to function comment\r
-// TODO: EFI_SUCCESS - add return value to function comment\r
+**/\r
+EFI_STATUS\r
+UpStreamBridgesAttributes (\r
+ IN PCI_IO_DEVICE *PciIoDevice,\r
+ IN EFI_PCI_IO_PROTOCOL_ATTRIBUTE_OPERATION Operation,\r
+ IN UINT64 Attributes\r
+ )\r
{\r
PCI_IO_DEVICE *Parent;\r
EFI_PCI_IO_PROTOCOL *PciIo;\r
\r
Parent = PciIoDevice->Parent;\r
\r
- while (Parent && IS_PCI_BRIDGE (&Parent->Pci)) {\r
+ while (Parent != NULL && IS_PCI_BRIDGE (&Parent->Pci)) {\r
\r
//\r
// Get the PciIo Protocol\r
return EFI_SUCCESS;\r
}\r
\r
+/**\r
+ Test whether two Pci devices has same parent bridge.\r
+\r
+ @param PciDevice1 The first pci device for testing.\r
+ @param PciDevice2 The second pci device for testing.\r
+\r
+ @retval TRUE Two Pci device has the same parent bridge.\r
+ @retval FALSE Two Pci device has not the same parent bridge.\r
+\r
+**/\r
BOOLEAN\r
PciDevicesOnTheSamePath (\r
IN PCI_IO_DEVICE *PciDevice1,\r
IN PCI_IO_DEVICE *PciDevice2\r
)\r
-/*++\r
-\r
-Routine Description:\r
-\r
-Arguments:\r
-\r
-Returns:\r
-\r
- None\r
-\r
---*/\r
-// TODO: PciDevice1 - add argument and description to function comment\r
-// TODO: PciDevice2 - add argument and description to function comment\r
{\r
BOOLEAN Existed1;\r
BOOLEAN Existed2;\r
\r
return (BOOLEAN) (Existed1 || Existed2);\r
}\r
+\r