From 3673b8bf338f580396407d0804e93725555c4dd5 Mon Sep 17 00:00:00 2001 From: gtian Date: Tue, 14 Nov 2006 09:34:30 +0000 Subject: [PATCH] Add IPF support in Base IO Lib, and related change in fpd file git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@1952 6f19259b-4bc3-4df7-8a09-765794883524 --- EdkModulePkg/EdkModulePkg.fpd | 24 + EdkNt32Pkg/Nt32.fpd | 16 + .../BaseIoLibIntrinsic/BaseIoLibIntrinsic.msa | 15 +- MdePkg/Library/BaseIoLibIntrinsic/IoLibIpf.c | 433 ++++++++++++++++++ MdePkg/MdePkg.fpd | 20 + MdePkg/MdePkg.spd | 9 + 6 files changed, 516 insertions(+), 1 deletion(-) create mode 100644 MdePkg/Library/BaseIoLibIntrinsic/IoLibIpf.c diff --git a/EdkModulePkg/EdkModulePkg.fpd b/EdkModulePkg/EdkModulePkg.fpd index 52cd1e204d..5b11165607 100644 --- a/EdkModulePkg/EdkModulePkg.fpd +++ b/EdkModulePkg/EdkModulePkg.fpd @@ -5472,6 +5472,14 @@ 4 200000000 + + PcdIoBlockBaseAddressForIpf + 0x0000000c + gEfiMdePkgTokenSpaceGuid + UINT64 + 8 + 0x0ffffc000000 + NULL @@ -18592,6 +18600,14 @@ 4 10000000 + + PcdIoBlockBaseAddressForIpf + 0x0000000c + gEfiMdePkgTokenSpaceGuid + UINT64 + 8 + 0x0ffffc000000 + NULL @@ -18723,6 +18739,14 @@ 4 10000000 + + PcdIoBlockBaseAddressForIpf + 0x0000000c + gEfiMdePkgTokenSpaceGuid + UINT64 + 8 + 0x0ffffc000000 + NULL diff --git a/EdkNt32Pkg/Nt32.fpd b/EdkNt32Pkg/Nt32.fpd index 3d4496f730..210860d7df 100644 --- a/EdkNt32Pkg/Nt32.fpd +++ b/EdkNt32Pkg/Nt32.fpd @@ -586,6 +586,14 @@ 4 200000000 + + PcdIoBlockBaseAddressForIpf + 0x0000000c + gEfiMdePkgTokenSpaceGuid + UINT64 + 8 + 0x0ffffc000000 + FV_RECOVERY @@ -2545,6 +2553,14 @@ 4 200000000 + + PcdIoBlockBaseAddressForIpf + 0x0000000c + gEfiMdePkgTokenSpaceGuid + UINT64 + 8 + 0x0ffffc000000 + FV_RECOVERY diff --git a/MdePkg/Library/BaseIoLibIntrinsic/BaseIoLibIntrinsic.msa b/MdePkg/Library/BaseIoLibIntrinsic/BaseIoLibIntrinsic.msa index 1e8aceb2d0..f92ff9dd62 100644 --- a/MdePkg/Library/BaseIoLibIntrinsic/BaseIoLibIntrinsic.msa +++ b/MdePkg/Library/BaseIoLibIntrinsic/BaseIoLibIntrinsic.msa @@ -18,7 +18,7 @@ FRAMEWORK_BUILD_PACKAGING_SPECIFICATION 0x00000052 - IA32 X64 + IA32 X64 IPF false BaseIoLibIntrinsic @@ -32,6 +32,9 @@ DebugLib + + PcdLib + IoLib.c @@ -42,6 +45,8 @@ IoLibMsc.c IoLibGcc.c IoHighLevel.c + IoLibIpf.c + IoHighLevel.c @@ -50,4 +55,12 @@ EFI_SPECIFICATION_VERSION 0x00020000 EDK_RELEASE_VERSION 0x00020000 + + + PcdIoBlockBaseAddressForIpf + gEfiMdePkgTokenSpaceGuid + 0x0ffffc000000 + The base address of IPF IO Block + + \ No newline at end of file diff --git a/MdePkg/Library/BaseIoLibIntrinsic/IoLibIpf.c b/MdePkg/Library/BaseIoLibIntrinsic/IoLibIpf.c new file mode 100644 index 0000000000..234c3369b2 --- /dev/null +++ b/MdePkg/Library/BaseIoLibIntrinsic/IoLibIpf.c @@ -0,0 +1,433 @@ +/** @file + Common I/O Library routines. + + Copyright (c) 2006, Intel Corporation
+ All rights reserved. This program and the accompanying materials + are licensed and made available under the terms and conditions of the BSD License + which accompanies this distribution. The full text of the license may be found at + http://opensource.org/licenses/bsd-license.php + + 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: IoLibIpf.c + +**/ + +#define BIT63 0x8000000000000000ULL + +#define MAP_PORT_BASE_TO_MEM(_Port) \ + ((((_Port) & 0xfffc) << 10) | ((_Port) & 0x0fff)) + +/** + Reads a 8-bit I/O port. + + Reads the 8-bit I/O port specified by Port. The 8-bit read value is returned. + This function must guarantee that all I/O read and write operations are + serialized. + + @param Port The I/O port to read. + + @return The value read. + +**/ +UINT8 +EFIAPI +IoRead8 ( + IN UINT64 Port + ) +{ + UINT64 Address; + + // + // Add the 64MB aligned IO Port space to the IO address + // + Address = MAP_PORT_BASE_TO_MEM (Port); + Address += PcdGet64(PcdIoBlockBaseAddressForIpf); + + return MmioRead8 (Address); +} + +/** + Reads a 16-bit I/O port. + + Reads the 16-bit I/O port specified by Port. The 16-bit read value is returned. + This function must guarantee that all I/O read and write operations are + serialized. + + @param Port The I/O port to read. + + @return The value read. + +**/ +UINT16 +EFIAPI +IoRead16 ( + IN UINT64 Port + ) +{ + UINT64 Address; + + // + // Add the 64MB aligned IO Port space to the IO address + // + Address = MAP_PORT_BASE_TO_MEM (Port); + Address += PcdGet64(PcdIoBlockBaseAddressForIpf); + + return MmioRead16 (Address); +} + +/** + Reads a 32-bit I/O port. + + Reads the 32-bit I/O port specified by Port. The 32-bit read value is returned. + This function must guarantee that all I/O read and write operations are + serialized. + + @param Port The I/O port to read. + + @return The value read. + +**/ +UINT32 +EFIAPI +IoRead32 ( + IN UINT64 Port + ) +{ + UINT64 Address; + + // + // Add the 64MB aligned IO Port space to the IO address + // + Address = MAP_PORT_BASE_TO_MEM (Port); + Address += PcdGet64(PcdIoBlockBaseAddressForIpf); + + return MmioRead32 (Address); +} + +/** + Writes a 8-bit I/O port. + + Writes the 8-bit I/O port specified by Port with the value specified by Value + and returns Value. This function must guarantee that all I/O read and write + operations are serialized. + + @param Port The I/O port to write. + @param Value The value to write to the I/O port. + + @return The value written the I/O port. + +**/ +UINT8 +EFIAPI +IoWrite8 ( + IN UINT64 Port, + IN UINT8 Data + ) +{ + UINT64 Address; + + // + // Add the 64MB aligned IO Port space to the IO address + // + Address = MAP_PORT_BASE_TO_MEM (Port); + Address += PcdGet64(PcdIoBlockBaseAddressForIpf); + + return MmioWrite8 (Address, Data); +} + +/** + Writes a 16-bit I/O port. + + Writes the 16-bit I/O port specified by Port with the value specified by Value + and returns Value. This function must guarantee that all I/O read and write + operations are serialized. + + @param Port The I/O port to write. + @param Value The value to write to the I/O port. + + @return The value written the I/O port. + +**/ +UINT16 +EFIAPI +IoWrite16 ( + IN UINT64 Port, + IN UINT16 Data + ) +{ + UINT64 Address; + + // + // Add the 64MB aligned IO Port space to the IO address + // + Address = MAP_PORT_BASE_TO_MEM (Port); + Address += PcdGet64(PcdIoBlockBaseAddressForIpf); + + return MmioWrite16 (Address, Data); +} + +/** + Writes a 32-bit I/O port. + + Writes the 32-bit I/O port specified by Port with the value specified by Value + and returns Value. This function must guarantee that all I/O read and write + operations are serialized. + + @param Port The I/O port to write. + @param Value The value to write to the I/O port. + + @return The value written the I/O port. + +**/ +UINT32 +EFIAPI +IoWrite32 ( + IN UINT64 Port, + IN UINT32 Data + ) +{ + UINT64 Address; + + // + // Add the 64MB aligned IO Port space to the IO address + // + Address = MAP_PORT_BASE_TO_MEM (Port); + Address += PcdGet64(PcdIoBlockBaseAddressForIpf); + + return MmioWrite32 (Address, Data); +} + +/** + Reads a 8-bit MMIO register. + + Reads the 8-bit MMIO register specified by Address. The 8-bit read value is + returned. This function must guarantee that all MMIO read and write + operations are serialized. + + @param Address The MMIO register to read. + + @return The value read. + +**/ +UINT8 +EFIAPI +MmioRead8 ( + IN UINT64 Address + ) +{ + UINT8 Data; + + Address |= BIT63; + + MemoryFence (); + Data = *((volatile UINT8 *) Address); + MemoryFence (); + + return Data; +} + +/** + Reads a 16-bit MMIO register. + + Reads the 16-bit MMIO register specified by Address. The 16-bit read value is + returned. This function must guarantee that all MMIO read and write + operations are serialized. + + @param Address The MMIO register to read. + + @return The value read. + +**/ +UINT16 +EFIAPI +MmioRead16 ( + IN UINT64 Address + ) +{ + UINT16 Data; + + Address |= BIT63; + + MemoryFence (); + Data = *((volatile UINT16 *) Address); + MemoryFence (); + + return Data; +} + +/** + Reads a 32-bit MMIO register. + + Reads the 32-bit MMIO register specified by Address. The 32-bit read value is + returned. This function must guarantee that all MMIO read and write + operations are serialized. + + @param Address The MMIO register to read. + + @return The value read. + +**/ +UINT32 +EFIAPI +MmioRead32 ( + IN UINT64 Address + ) +{ + UINT32 Data; + + Address |= BIT63; + + MemoryFence (); + Data = *((volatile UINT32 *) Address); + MemoryFence (); + + return Data; +} + +/** + Reads a 64-bit MMIO register. + + Reads the 64-bit MMIO register specified by Address. The 64-bit read value is + returned. This function must guarantee that all MMIO read and write + operations are serialized. + + @param Address The MMIO register to read. + + @return The value read. + +**/ +UINT64 +EFIAPI +MmioRead64 ( + IN UINT64 Address + ) +{ + UINT64 Data; + + Address |= BIT63; + + MemoryFence (); + Data = *((volatile UINT64 *) Address); + MemoryFence (); + + return Data; + +} + +/** + Writes a 8-bit MMIO register. + + Writes the 8-bit MMIO register specified by Address with the value specified + by Value and returns Value. This function must guarantee that all MMIO read + and write operations are serialized. + + @param Address The MMIO register to write. + @param Data The value to write to the MMIO register. + + @return The value written the memory address. + +**/ +UINT8 +EFIAPI +MmioWrite8 ( + IN UINT64 Address, + IN UINT8 Data + ) +{ + Address |= BIT63; + + MemoryFence (); + *((volatile UINT8 *) Address) = Data; + MemoryFence (); + + return Data; +} + +/** + Writes a 16-bit MMIO register. + + Writes the 16-bit MMIO register specified by Address with the value specified + by Value and returns Value. This function must guarantee that all MMIO read + and write operations are serialized. + + @param Address The MMIO register to write. + @param Data The value to write to the MMIO register. + + @return The value written the memory address. + +**/ +UINT16 +EFIAPI +MmioWrite16 ( + IN UINT64 Address, + IN UINT16 Data + ) +{ + Address |= BIT63; + + MemoryFence (); + *((volatile UINT16 *) Address) = Data; + MemoryFence (); + + return Data; +} + +/** + Writes a 32-bit MMIO register. + + Writes the 32-bit MMIO register specified by Address with the value specified + by Value and returns Value. This function must guarantee that all MMIO read + and write operations are serialized. + + @param Address The MMIO register to write. + @param Data The value to write to the MMIO register. + + @return The value written the memory address. + +**/ +UINT32 +EFIAPI +MmioWrite32 ( + IN UINT64 Address, + IN UINT32 Data + ) +{ + Address |= BIT63; + + MemoryFence (); + *((volatile UINT32 *) Address) = Data; + MemoryFence (); + + return Data; +} + +/** + Writes a 64-bit MMIO register. + + Writes the 64-bit MMIO register specified by Address with the value specified + by Value and returns Value. This function must guarantee that all MMIO read + and write operations are serialized. + + @param Address The MMIO register to write. + @param Data The value to write to the MMIO register. + + @return The value written the memory address. + +**/ +UINT64 +EFIAPI +MmioWrite64 ( + IN UINT64 Address, + IN UINT64 Data + ) +{ + Address |= BIT63; + + MemoryFence (); + *((volatile UINT64 *) Address) = Data; + MemoryFence (); + + return Data; +} diff --git a/MdePkg/MdePkg.fpd b/MdePkg/MdePkg.fpd index 19681c25f0..f7188e114f 100644 --- a/MdePkg/MdePkg.fpd +++ b/MdePkg/MdePkg.fpd @@ -100,6 +100,16 @@
+ + + PcdIoBlockBaseAddressForIpf + 0x0000000c + gEfiMdePkgTokenSpaceGuid + UINT64 + 8 + 0x0ffffc000000 + + NULL LIBRARY @@ -1228,6 +1238,16 @@ + + + PcdIoBlockBaseAddressForIpf + 0x0000000c + gEfiMdePkgTokenSpaceGuid + UINT64 + 8 + 0x0ffffc000000 + + NULL LIBRARY diff --git a/MdePkg/MdePkg.spd b/MdePkg/MdePkg.spd index 21383c8896..cf56854fc8 100644 --- a/MdePkg/MdePkg.spd +++ b/MdePkg/MdePkg.spd @@ -2324,6 +2324,15 @@ 0xE0000000 The base address of PCI Express MMIO window. + + PcdIoBlockBaseAddressForIpf + 0x0000000c + gEfiMdePkgTokenSpaceGuid + UINT64 + FIXED_AT_BUILD + 0x0ffffc000000 + The base address of IPF IO Block + PcdFSBClock 0x0000000c