617 lines
9.7 KiB
C
617 lines
9.7 KiB
C
|
||
/*++
|
||
|
||
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);
|
||
|
||
}
|