windows-nt/Source/XPSP1/NT/base/boot/efi/ia64/i64ioacc.c
2020-09-26 16:20:57 +08:00

617 lines
9.7 KiB
C
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/*++
Copyright (c) 1995 Intel Corporation
Module Name:
i64ioacc.c
Abstract:
This module implements the I/O Register access routines.
Author:
Bernard Lint, M. Jayakumar Sep 16 '97
Environment:
Kernel mode
Revision History:
--*/
#include "halp.h"
#include "kxia64.h"
extern ULONGLONG IoPortPhysicalBase;
ULONGLONG HalpGetPortVirtualAddress(
UINT_PTR Port
)
{
/*++
Routine Description:
This routine gives 32 bit virtual address for the I/O Port specified.
Arguements:
PORT - Supplies PORT address of the I/O PORT.
Returned Value:
PUCHAR - 32bit virtual address value.
--*/
//
// PUCHAR VirtualIOBase;
//
UINT_PTR ShiftedPort,PortIndex;
//
// Shifting operation applicable to integrals only. ULONG for 32 bits
//
ShiftedPort = (UINT_PTR)Port;
//
// Limit arguement PORT to 16 bit quantity
//
ShiftedPort = ShiftedPort & IO_PORT_MASK;
//
// Capture bits [11:0]
//
PortIndex = ShiftedPort & BYTE_ADDRESS_MASK;
//
// Position it to point to 32 bit boundary
//
ShiftedPort = ShiftedPort & BYTE_ADDRESS_CLEAR;
//
// Shifted to page boundary. ShiftedPORT[[1:0] are zero.
// PORT[15:2] shifted to ShiftedPort[25:12]
//
ShiftedPort = ShiftedPort << 10;
//
// Bits 1:0 has now 4 byte PORT address
//
ShiftedPort = ShiftedPort | PortIndex;
// return (VIRTUAL_IO_BASE | ShiftedPort);
//
// Assume 1-to-to mapping of IO ports.
//
if (IsPsrDtOn()) {
return (VIRTUAL_IO_BASE | ShiftedPort);
} else {
return (IoPortPhysicalBase | ShiftedPort | 0x8000000000000000);
}
}
VOID
HalpFillTbForIOPortSpace(
ULONGLONG PhysicalAddress,
UINT_PTR VirtualAddress,
ULONG SlotNumber
)
{
/*++
Routine Description:
This routine fills the translation buffer for the translation requested
Arguements:
PhysicalAddress - Supplies Physical Address to be mapped for the virtual
address.
VirtualAddress - Supplies Virtual Address.
SlotNumber - Slot number of the Translation Buffer to be used.
--*/
ULONGLONG IITR,Attribute;
UINT_PTR IFA;
IFA = VirtualAddress;
IITR = PhysicalAddress & IITR_PPN_MASK;
IITR = IITR | (IO_SPACE_SIZE << IDTR_PS);
Attribute = PhysicalAddress & IITR_ATTRIBUTE_PPN_MASK;
Attribute = Attribute | IO_SPACE_ATTRIBUTE;
HalpInsertTranslationRegister(IFA,SlotNumber,Attribute,IITR);
return;
}
UCHAR
READ_PORT_UCHAR(
PUCHAR Port
)
{
/*++
Routine Description:
Reads a byte location from the PORT
Arguements:
PORT - Supplies the PORT address to read from
Return Value:
UCHAR - Returns the byte read from the PORT specified.
--*/
ULONGLONG VirtualPort;
UCHAR LoadData;
VirtualPort = HalpGetPortVirtualAddress((UINT_PTR)Port);
__mf();
LoadData = *(volatile UCHAR *)VirtualPort;
__mfa();
return (LoadData);
}
USHORT
READ_PORT_USHORT (
PUSHORT Port
)
{
/*++
Routine Description:
Reads a word location (16 bit unsigned value) from the PORT
Arguements:
PORT - Supplies the PORT address to read from.
Returned Value:
USHORT - Returns the 16 bit unsigned value from the PORT specified.
--*/
ULONGLONG VirtualPort;
USHORT LoadData;
VirtualPort = HalpGetPortVirtualAddress((UINT_PTR)Port);
__mf();
LoadData = *(volatile USHORT *)VirtualPort;
__mfa();
return (LoadData);
}
ULONG
READ_PORT_ULONG (
PULONG Port
)
{
/*++
Routine Description:
Reads a longword location (32bit unsigned value) from the PORT.
Arguements:
PORT - Supplies PORT address to read from.
Returned Value:
ULONG - Returns the 32 bit unsigned value (ULONG) from the PORT specified.
--*/
ULONGLONG VirtualPort;
ULONG LoadData;
VirtualPort = HalpGetPortVirtualAddress((UINT_PTR)Port);
__mf();
LoadData = *(volatile ULONG *)VirtualPort;
__mfa();
return (LoadData);
}
VOID
READ_PORT_BUFFER_UCHAR (
PUCHAR Port,
PUCHAR Buffer,
ULONG Count
)
{
/*++
Routine Description:
Reads multiple bytes from the specified PORT address into the
destination buffer.
Arguements:
PORT - The address of the PORT to read from.
Buffer - A pointer to the buffer to fill with the data read from the PORT.
Count - Supplies the number of bytes to read.
Return Value:
None.
--*/
ULONGLONG VirtualPort;
//
// PUCHAR ReadBuffer = Buffer;
//
//
// ULONG ReadCount;
//
VirtualPort = HalpGetPortVirtualAddress((UINT_PTR)Port);
HalpLoadBufferUCHAR((PUCHAR)VirtualPort, Buffer, Count);
}
VOID
READ_PORT_BUFFER_USHORT (
PUSHORT Port,
PUSHORT Buffer,
ULONG Count
)
{
/*++
Routine Description:
Reads multiple words (16bits) from the speicified PORT address into
the destination buffer.
Arguements:
Port - Supplies the address of the PORT to read from.
Buffer - A pointer to the buffer to fill with the data
read from the PORT.
Count - Supplies the number of words to read.
--*/
ULONGLONG VirtualPort;
//
// PUSHORT ReadBuffer = Buffer;
// ULONG ReadCount;
//
VirtualPort = HalpGetPortVirtualAddress((UINT_PTR)Port);
//
// We don't need memory fence in between INs?.
// So, it is out of the loop to improve performance.
//
HalpLoadBufferUSHORT((PUSHORT)VirtualPort, Buffer, Count);
}
VOID
READ_PORT_BUFFER_ULONG (
PULONG Port,
PULONG Buffer,
ULONG Count
)
{
/*++
Routine Description:
Reads multiple longwords (32bits) from the speicified PORT
address into the destination buffer.
Arguements:
Port - Supplies the address of the PORT to read from.
Buffer - A pointer to the buffer to fill with the data
read from the PORT.
Count - Supplies the number of long words to read.
--*/
ULONGLONG VirtualPort;
PULONG ReadBuffer = Buffer;
ULONG ReadCount;
VirtualPort = HalpGetPortVirtualAddress((UINT_PTR)Port);
//
// We don't need memory fence in between INs.
// So, it is out of the loop to improve performance.
//
HalpLoadBufferULONG((PULONG)VirtualPort, Buffer,Count);
}
VOID
WRITE_PORT_UCHAR (
PUCHAR Port,
UCHAR Value
)
{
/*++
Routine Description:
Writes a byte to the Port specified.
Arguements:
Port - The port address of the I/O Port.
Value - The value to be written to the I/O Port.
Return Value:
None.
--*/
ULONGLONG VirtualPort;
VirtualPort = HalpGetPortVirtualAddress((UINT_PTR)Port);
*(volatile UCHAR *)VirtualPort = Value;
__mf();
__mfa();
}
VOID
WRITE_PORT_USHORT (
PUSHORT Port,
USHORT Value
)
{
/*++
Routine Description:
Writes a 16 bit SHORT Integer to the Port specified.
Arguements:
Port - The port address of the I/O Port.
Value - The value to be written to the I/O Port.
Return Value:
None.
--*/
ULONGLONG VirtualPort;
VirtualPort = HalpGetPortVirtualAddress((UINT_PTR)Port);
*(volatile USHORT *)VirtualPort = Value;
__mf();
__mfa();
}
VOID
WRITE_PORT_ULONG (
PULONG Port,
ULONG Value
)
{
/*++
Routine Description:
Writes a 32 bit Long Word to the Port specified.
Arguements:
Port - The port address of the I/O Port.
Value - The value to be written to the I/O Port.
Return Value:
None.
--*/
ULONGLONG VirtualPort;
VirtualPort = HalpGetPortVirtualAddress((UINT_PTR)Port);
*(volatile ULONG *)VirtualPort = Value;
__mf();
__mfa();
}
VOID
WRITE_PORT_BUFFER_UCHAR (
PUCHAR Port,
PUCHAR Buffer,
ULONG Count
)
{
/*++
Routine Description:
Writes multiple bytes from the source buffer to the specified Port address.
Arguements:
Port - The address of the Port to write to.
Buffer - A pointer to the buffer containing the data to write to the Port.
Count - Supplies the number of bytes to write.
Return Value:
None.
--*/
ULONGLONG VirtualPort;
PUCHAR WriteBuffer = Buffer;
ULONG WriteCount;
VirtualPort = HalpGetPortVirtualAddress((UINT_PTR)Port);
HalpStoreBufferUCHAR((PUCHAR)VirtualPort,Buffer,Count);
}
VOID
WRITE_PORT_BUFFER_USHORT (
PUSHORT Port,
PUSHORT Buffer,
ULONG Count
)
{
/*++
Routine Description:
Writes multiple 16bit short integers from the source buffer to the specified Port address.
Arguements:
Port - The address of the Port to write to.
Buffer - A pointer to the buffer containing the data to write to the Port.
Count - Supplies the number of (16 bit) words to write.
Return Value:
None.
--*/
ULONGLONG VirtualPort;
PUSHORT WriteBuffer = Buffer;
ULONG WriteCount;
VirtualPort = HalpGetPortVirtualAddress((UINT_PTR)Port);
HalpStoreBufferUSHORT((PUSHORT)VirtualPort,Buffer, Count);
}
VOID
WRITE_PORT_BUFFER_ULONG (
PULONG Port,
PULONG Buffer,
ULONG Count
)
{
/*++
Routine Description:
Writes multiple 32bit long words from the source buffer to the specified Port address.
Arguements:
Port - The address of the Port to write to.
Buffer - A pointer to the buffer containing the data to write to the Port.
Count - Supplies the number of (32 bit) long words to write.
Return Value:
None.
--*/
ULONGLONG VirtualPort;
PULONG WriteBuffer = Buffer;
ULONG WriteCount;
VirtualPort = HalpGetPortVirtualAddress((UINT_PTR)Port);
HalpStoreBufferULONG((PULONG)VirtualPort,Buffer, Count);
}