OUT VOID *Buffer\r
)\r
{\r
- UINTN EndAddress;\r
+ UINTN ReturnValue;\r
\r
ASSERT_INVALID_PCI_ADDRESS (StartAddress, 0);\r
ASSERT (((StartAddress & 0xFFF) + Size) <= 0x100);\r
\r
if (Size == 0) {\r
- return 0;\r
+ return Size;\r
}\r
\r
ASSERT (Buffer != NULL);\r
\r
- EndAddress = StartAddress + Size;\r
+ //\r
+ // Save Size for return\r
+ //\r
+ ReturnValue = Size;\r
\r
if ((StartAddress & 1) != 0) {\r
//\r
// Read a byte if StartAddress is byte aligned\r
//\r
- *(UINT8*)Buffer = PciCf8Read8 (StartAddress);\r
+ *(volatile UINT8 *)Buffer = PciCf8Read8 (StartAddress);\r
StartAddress += sizeof (UINT8);\r
+ Size -= sizeof (UINT8);\r
Buffer = (UINT8*)Buffer + 1;\r
}\r
\r
- if ((StartAddress < EndAddress) && ((StartAddress & 2) != 0)) {\r
+ if (Size >= sizeof (UINT16) && (StartAddress & 2) != 0) {\r
//\r
// Read a word if StartAddress is word aligned\r
//\r
- *(UINT16*)Buffer = PciCf8Read16 (StartAddress);\r
+ *(volatile UINT16 *)Buffer = PciCf8Read16 (StartAddress);\r
StartAddress += sizeof (UINT16);\r
+ Size -= sizeof (UINT16);\r
Buffer = (UINT16*)Buffer + 1;\r
}\r
\r
- while ((EndAddress - StartAddress) >= 4) {\r
+ while (Size >= sizeof (UINT32)) {\r
//\r
// Read as many double words as possible\r
//\r
- *(UINT32*)Buffer = PciCf8Read32 (StartAddress);\r
+ *(volatile UINT32 *)Buffer = PciCf8Read32 (StartAddress);\r
StartAddress += sizeof (UINT32);\r
+ Size -= sizeof (UINT32);\r
Buffer = (UINT32*)Buffer + 1;\r
}\r
\r
- if ((EndAddress & 2) != 0) {\r
+ if (Size >= sizeof (UINT16)) {\r
//\r
// Read the last remaining word if exist\r
//\r
- *(UINT16*)Buffer = PciCf8Read16 (StartAddress);\r
+ *(volatile UINT16 *)Buffer = PciCf8Read16 (StartAddress);\r
StartAddress += sizeof (UINT16);\r
+ Size -= sizeof (UINT16);\r
Buffer = (UINT16*)Buffer + 1;\r
}\r
\r
- if ((EndAddress & 1) != 0) {\r
+ if (Size >= sizeof (UINT8)) {\r
//\r
// Read the last remaining byte if exist\r
//\r
- *(UINT8*)Buffer = PciCf8Read8 (StartAddress);\r
+ *(volatile UINT8 *)Buffer = PciCf8Read8 (StartAddress);\r
}\r
\r
- return Size;\r
+ return ReturnValue;\r
}\r
\r
/**\r
IN VOID *Buffer\r
)\r
{\r
- UINTN EndAddress;\r
+ UINTN ReturnValue;\r
\r
ASSERT_INVALID_PCI_ADDRESS (StartAddress, 0);\r
ASSERT (((StartAddress & 0xFFF) + Size) <= 0x100);\r
return 0;\r
}\r
\r
- ASSERT (Buffer != 0);\r
+ ASSERT (Buffer != NULL);\r
\r
- EndAddress = StartAddress + Size;\r
+ //\r
+ // Save Size for return\r
+ //\r
+ ReturnValue = Size;\r
\r
- if ((StartAddress & 1)!= 0) {\r
+ if ((StartAddress & 1) != 0) {\r
//\r
// Write a byte if StartAddress is byte aligned\r
//\r
PciCf8Write8 (StartAddress, *(UINT8*)Buffer);\r
StartAddress += sizeof (UINT8);\r
+ Size -= sizeof (UINT8);\r
Buffer = (UINT8*)Buffer + 1;\r
}\r
\r
- if ((StartAddress < EndAddress) && ((StartAddress & 2) != 0)) {\r
+ if (Size >= sizeof (UINT16) && (StartAddress & 2) != 0) {\r
//\r
// Write a word if StartAddress is word aligned\r
//\r
PciCf8Write16 (StartAddress, *(UINT16*)Buffer);\r
StartAddress += sizeof (UINT16);\r
+ Size -= sizeof (UINT16);\r
Buffer = (UINT16*)Buffer + 1;\r
}\r
\r
- while ((EndAddress - StartAddress) >= 4) {\r
+ while (Size >= sizeof (UINT32)) {\r
//\r
// Write as many double words as possible\r
//\r
PciCf8Write32 (StartAddress, *(UINT32*)Buffer);\r
StartAddress += sizeof (UINT32);\r
+ Size -= sizeof (UINT32);\r
Buffer = (UINT32*)Buffer + 1;\r
}\r
\r
- if ((EndAddress & 2) != 0) {\r
+ if (Size >= sizeof (UINT16)) {\r
//\r
// Write the last remaining word if exist\r
//\r
PciCf8Write16 (StartAddress, *(UINT16*)Buffer);\r
StartAddress += sizeof (UINT16);\r
+ Size -= sizeof (UINT16);\r
Buffer = (UINT16*)Buffer + 1;\r
}\r
\r
- if ((EndAddress & 1) != 0) {\r
+ if (Size >= sizeof (UINT8)) {\r
//\r
// Write the last remaining byte if exist\r
//\r
PciCf8Write8 (StartAddress, *(UINT8*)Buffer);\r
}\r
\r
- return Size;\r
+ return ReturnValue;\r
}\r