X-Git-Url: https://git.proxmox.com/?p=mirror_edk2.git;a=blobdiff_plain;f=MdePkg%2FLibrary%2FBasePciExpressLib%2FPciLib.c;h=fab8107af38316ec5833a55e1229cde802f18e5b;hp=509a5e423fd528ce3a108b586693cad47324d8b2;hb=af2bb549adeefd4e4ae266b8574270218dd5da7c;hpb=1f33a17ff1678bb0e4c00757489aa417a18061e4 diff --git a/MdePkg/Library/BasePciExpressLib/PciLib.c b/MdePkg/Library/BasePciExpressLib/PciLib.c index 509a5e423f..fab8107af3 100644 --- a/MdePkg/Library/BasePciExpressLib/PciLib.c +++ b/MdePkg/Library/BasePciExpressLib/PciLib.c @@ -16,10 +16,18 @@ THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. - Module Name: PciLib.c - **/ + +#include + +#include +#include +#include +#include +#include + + /** Assert the validity of a PCI address. A valid PCI address should contain 1's only in the low 28 bits. @@ -40,12 +48,13 @@ @return The base address of PCI Express. **/ -UINTN +STATIC +volatile VOID* GetPciExpressBaseAddress ( VOID ) { - return (UINTN)PcdGet64 (PcdPciExpressBaseAddress); + return (VOID*)(UINTN) PcdGet64 (PcdPciExpressBaseAddress); } /** @@ -70,7 +79,7 @@ PciExpressRead8 ( ) { ASSERT_INVALID_PCI_ADDRESS (Address); - return MmioRead8 (GetPciExpressBaseAddress () + Address); + return MmioRead8 ((UINTN) GetPciExpressBaseAddress () + Address); } /** @@ -97,7 +106,7 @@ PciExpressWrite8 ( ) { ASSERT_INVALID_PCI_ADDRESS (Address); - return MmioWrite8 (GetPciExpressBaseAddress () + Address, Value); + return MmioWrite8 ((UINTN) GetPciExpressBaseAddress () + Address, Value); } /** @@ -128,7 +137,7 @@ PciExpressOr8 ( ) { ASSERT_INVALID_PCI_ADDRESS (Address); - return MmioOr8 (GetPciExpressBaseAddress () + Address, OrData); + return MmioOr8 ((UINTN) GetPciExpressBaseAddress () + Address, OrData); } /** @@ -159,7 +168,7 @@ PciExpressAnd8 ( ) { ASSERT_INVALID_PCI_ADDRESS (Address); - return MmioAnd8 (GetPciExpressBaseAddress () + Address, AndData); + return MmioAnd8 ((UINTN) GetPciExpressBaseAddress () + Address, AndData); } /** @@ -194,7 +203,7 @@ PciExpressAndThenOr8 ( { ASSERT_INVALID_PCI_ADDRESS (Address); return MmioAndThenOr8 ( - GetPciExpressBaseAddress () + Address, + (UINTN) GetPciExpressBaseAddress () + Address, AndData, OrData ); @@ -231,7 +240,7 @@ PciExpressBitFieldRead8 ( { ASSERT_INVALID_PCI_ADDRESS (Address); return MmioBitFieldRead8 ( - GetPciExpressBaseAddress () + Address, + (UINTN) GetPciExpressBaseAddress () + Address, StartBit, EndBit ); @@ -271,7 +280,7 @@ PciExpressBitFieldWrite8 ( { ASSERT_INVALID_PCI_ADDRESS (Address); return MmioBitFieldWrite8 ( - GetPciExpressBaseAddress () + Address, + (UINTN) GetPciExpressBaseAddress () + Address, StartBit, EndBit, Value @@ -315,7 +324,7 @@ PciExpressBitFieldOr8 ( { ASSERT_INVALID_PCI_ADDRESS (Address); return MmioBitFieldOr8 ( - GetPciExpressBaseAddress () + Address, + (UINTN) GetPciExpressBaseAddress () + Address, StartBit, EndBit, OrData @@ -359,7 +368,7 @@ PciExpressBitFieldAnd8 ( { ASSERT_INVALID_PCI_ADDRESS (Address); return MmioBitFieldAnd8 ( - GetPciExpressBaseAddress () + Address, + (UINTN) GetPciExpressBaseAddress () + Address, StartBit, EndBit, AndData @@ -407,7 +416,7 @@ PciExpressBitFieldAndThenOr8 ( { ASSERT_INVALID_PCI_ADDRESS (Address); return MmioBitFieldAndThenOr8 ( - GetPciExpressBaseAddress () + Address, + (UINTN) GetPciExpressBaseAddress () + Address, StartBit, EndBit, AndData, @@ -438,7 +447,7 @@ PciExpressRead16 ( ) { ASSERT_INVALID_PCI_ADDRESS (Address); - return MmioRead16 (GetPciExpressBaseAddress () + Address); + return MmioRead16 ((UINTN) GetPciExpressBaseAddress () + Address); } /** @@ -466,7 +475,7 @@ PciExpressWrite16 ( ) { ASSERT_INVALID_PCI_ADDRESS (Address); - return MmioWrite16 (GetPciExpressBaseAddress () + Address, Value); + return MmioWrite16 ((UINTN) GetPciExpressBaseAddress () + Address, Value); } /** @@ -498,7 +507,7 @@ PciExpressOr16 ( ) { ASSERT_INVALID_PCI_ADDRESS (Address); - return MmioOr16 (GetPciExpressBaseAddress () + Address, OrData); + return MmioOr16 ((UINTN) GetPciExpressBaseAddress () + Address, OrData); } /** @@ -530,7 +539,7 @@ PciExpressAnd16 ( ) { ASSERT_INVALID_PCI_ADDRESS (Address); - return MmioAnd16 (GetPciExpressBaseAddress () + Address, AndData); + return MmioAnd16 ((UINTN) GetPciExpressBaseAddress () + Address, AndData); } /** @@ -566,7 +575,7 @@ PciExpressAndThenOr16 ( { ASSERT_INVALID_PCI_ADDRESS (Address); return MmioAndThenOr16 ( - GetPciExpressBaseAddress () + Address, + (UINTN) GetPciExpressBaseAddress () + Address, AndData, OrData ); @@ -604,7 +613,7 @@ PciExpressBitFieldRead16 ( { ASSERT_INVALID_PCI_ADDRESS (Address); return MmioBitFieldRead16 ( - GetPciExpressBaseAddress () + Address, + (UINTN) GetPciExpressBaseAddress () + Address, StartBit, EndBit ); @@ -645,7 +654,7 @@ PciExpressBitFieldWrite16 ( { ASSERT_INVALID_PCI_ADDRESS (Address); return MmioBitFieldWrite16 ( - GetPciExpressBaseAddress () + Address, + (UINTN) GetPciExpressBaseAddress () + Address, StartBit, EndBit, Value @@ -690,7 +699,7 @@ PciExpressBitFieldOr16 ( { ASSERT_INVALID_PCI_ADDRESS (Address); return MmioBitFieldOr16 ( - GetPciExpressBaseAddress () + Address, + (UINTN) GetPciExpressBaseAddress () + Address, StartBit, EndBit, OrData @@ -735,7 +744,7 @@ PciExpressBitFieldAnd16 ( { ASSERT_INVALID_PCI_ADDRESS (Address); return MmioBitFieldAnd16 ( - GetPciExpressBaseAddress () + Address, + (UINTN) GetPciExpressBaseAddress () + Address, StartBit, EndBit, AndData @@ -784,7 +793,7 @@ PciExpressBitFieldAndThenOr16 ( { ASSERT_INVALID_PCI_ADDRESS (Address); return MmioBitFieldAndThenOr16 ( - GetPciExpressBaseAddress () + Address, + (UINTN) GetPciExpressBaseAddress () + Address, StartBit, EndBit, AndData, @@ -815,7 +824,7 @@ PciExpressRead32 ( ) { ASSERT_INVALID_PCI_ADDRESS (Address); - return MmioRead32 (GetPciExpressBaseAddress () + Address); + return MmioRead32 ((UINTN) GetPciExpressBaseAddress () + Address); } /** @@ -843,7 +852,7 @@ PciExpressWrite32 ( ) { ASSERT_INVALID_PCI_ADDRESS (Address); - return MmioWrite32 (GetPciExpressBaseAddress () + Address, Value); + return MmioWrite32 ((UINTN) GetPciExpressBaseAddress () + Address, Value); } /** @@ -875,7 +884,7 @@ PciExpressOr32 ( ) { ASSERT_INVALID_PCI_ADDRESS (Address); - return MmioOr32 (GetPciExpressBaseAddress () + Address, OrData); + return MmioOr32 ((UINTN) GetPciExpressBaseAddress () + Address, OrData); } /** @@ -907,7 +916,7 @@ PciExpressAnd32 ( ) { ASSERT_INVALID_PCI_ADDRESS (Address); - return MmioAnd32 (GetPciExpressBaseAddress () + Address, AndData); + return MmioAnd32 ((UINTN) GetPciExpressBaseAddress () + Address, AndData); } /** @@ -943,7 +952,7 @@ PciExpressAndThenOr32 ( { ASSERT_INVALID_PCI_ADDRESS (Address); return MmioAndThenOr32 ( - GetPciExpressBaseAddress () + Address, + (UINTN) GetPciExpressBaseAddress () + Address, AndData, OrData ); @@ -981,7 +990,7 @@ PciExpressBitFieldRead32 ( { ASSERT_INVALID_PCI_ADDRESS (Address); return MmioBitFieldRead32 ( - GetPciExpressBaseAddress () + Address, + (UINTN) GetPciExpressBaseAddress () + Address, StartBit, EndBit ); @@ -1022,7 +1031,7 @@ PciExpressBitFieldWrite32 ( { ASSERT_INVALID_PCI_ADDRESS (Address); return MmioBitFieldWrite32 ( - GetPciExpressBaseAddress () + Address, + (UINTN) GetPciExpressBaseAddress () + Address, StartBit, EndBit, Value @@ -1067,7 +1076,7 @@ PciExpressBitFieldOr32 ( { ASSERT_INVALID_PCI_ADDRESS (Address); return MmioBitFieldOr32 ( - GetPciExpressBaseAddress () + Address, + (UINTN) GetPciExpressBaseAddress () + Address, StartBit, EndBit, OrData @@ -1112,7 +1121,7 @@ PciExpressBitFieldAnd32 ( { ASSERT_INVALID_PCI_ADDRESS (Address); return MmioBitFieldAnd32 ( - GetPciExpressBaseAddress () + Address, + (UINTN) GetPciExpressBaseAddress () + Address, StartBit, EndBit, AndData @@ -1161,7 +1170,7 @@ PciExpressBitFieldAndThenOr32 ( { ASSERT_INVALID_PCI_ADDRESS (Address); return MmioBitFieldAndThenOr32 ( - GetPciExpressBaseAddress () + Address, + (UINTN) GetPciExpressBaseAddress () + Address, StartBit, EndBit, AndData, @@ -1200,7 +1209,7 @@ PciExpressReadBuffer ( OUT VOID *Buffer ) { - UINTN ReturnValue; + UINTN ReturnValue; ASSERT_INVALID_PCI_ADDRESS (StartAddress); ASSERT (((StartAddress & 0xFFF) + Size) <= 0x1000); @@ -1220,7 +1229,7 @@ PciExpressReadBuffer ( // // Read a byte if StartAddress is byte aligned // - *(UINT8*)Buffer = PciExpressRead8 (StartAddress); + *(volatile UINT8 *)Buffer = PciExpressRead8 (StartAddress); StartAddress += sizeof (UINT8); Size -= sizeof (UINT8); Buffer = (UINT8*)Buffer + 1; @@ -1230,7 +1239,8 @@ PciExpressReadBuffer ( // // Read a word if StartAddress is word aligned // - *(UINT16*)Buffer = PciExpressRead16 (StartAddress); + WriteUnaligned16 ((UINT16 *) Buffer, (UINT16) PciExpressRead16 (StartAddress)); + StartAddress += sizeof (UINT16); Size -= sizeof (UINT16); Buffer = (UINT16*)Buffer + 1; @@ -1240,7 +1250,8 @@ PciExpressReadBuffer ( // // Read as many double words as possible // - *(UINT32*)Buffer = PciExpressRead32 (StartAddress); + WriteUnaligned32 ((UINT32 *) Buffer, (UINT32) PciExpressRead32 (StartAddress)); + StartAddress += sizeof (UINT32); Size -= sizeof (UINT32); Buffer = (UINT32*)Buffer + 1; @@ -1250,7 +1261,7 @@ PciExpressReadBuffer ( // // Read the last remaining word if exist // - *(UINT16*)Buffer = PciExpressRead16 (StartAddress); + WriteUnaligned16 ((UINT16 *) Buffer, (UINT16) PciExpressRead16 (StartAddress)); StartAddress += sizeof (UINT16); Size -= sizeof (UINT16); Buffer = (UINT16*)Buffer + 1; @@ -1260,7 +1271,7 @@ PciExpressReadBuffer ( // // Read the last remaining byte if exist // - *(UINT8*)Buffer = PciExpressRead8 (StartAddress); + *(volatile UINT8 *)Buffer = PciExpressRead8 (StartAddress); } return ReturnValue; @@ -1328,7 +1339,7 @@ PciExpressWriteBuffer ( // // Write a word if StartAddress is word aligned // - PciExpressWrite16 (StartAddress, *(UINT16*)Buffer); + PciExpressWrite16 (StartAddress, ReadUnaligned16 ((UINT16*)Buffer)); StartAddress += sizeof (UINT16); Size -= sizeof (UINT16); Buffer = (UINT16*)Buffer + 1; @@ -1338,7 +1349,7 @@ PciExpressWriteBuffer ( // // Write as many double words as possible // - PciExpressWrite32 (StartAddress, *(UINT32*)Buffer); + PciExpressWrite32 (StartAddress, ReadUnaligned32 ((UINT32*)Buffer)); StartAddress += sizeof (UINT32); Size -= sizeof (UINT32); Buffer = (UINT32*)Buffer + 1; @@ -1348,7 +1359,7 @@ PciExpressWriteBuffer ( // // Write the last remaining word if exist // - PciExpressWrite16 (StartAddress, *(UINT16*)Buffer); + PciExpressWrite16 (StartAddress, ReadUnaligned16 ((UINT16*)Buffer)); StartAddress += sizeof (UINT16); Size -= sizeof (UINT16); Buffer = (UINT16*)Buffer + 1;