133 lines
3.1 KiB
C
133 lines
3.1 KiB
C
|
/*++
|
||
|
|
||
|
Copyright (c) 1998 Intel Corporation
|
||
|
|
||
|
Module Name:
|
||
|
|
||
|
hw.c
|
||
|
|
||
|
Abstract:
|
||
|
|
||
|
Debug library functions for Hardware IO access
|
||
|
|
||
|
|
||
|
|
||
|
Revision History
|
||
|
|
||
|
--*/
|
||
|
|
||
|
#include "lib.h"
|
||
|
|
||
|
|
||
|
EFI_STATUS
|
||
|
InitializeGlobalIoDevice (
|
||
|
IN EFI_DEVICE_PATH *DevicePath,
|
||
|
IN EFI_GUID *Protocol,
|
||
|
IN CHAR8 *ErrorStr,
|
||
|
OUT EFI_DEVICE_IO_INTERFACE **GlobalIoFncs
|
||
|
)
|
||
|
/*++
|
||
|
|
||
|
Routine Description:
|
||
|
|
||
|
Check to see if DevicePath exists for a given Protocol. Return Error if it
|
||
|
exists. Return GlobalIoFuncs set match the DevicePath
|
||
|
|
||
|
Arguments:
|
||
|
|
||
|
DevicePath - to operate on
|
||
|
Protocol - to check the DevicePath against
|
||
|
ErrorStr - ASCII string to display on error
|
||
|
GlobalIoFncs - Returned with DeviceIoProtocol for the DevicePath
|
||
|
|
||
|
Returns:
|
||
|
|
||
|
Pass or Fail based on wether GlobalIoFncs where found
|
||
|
|
||
|
--*/
|
||
|
{
|
||
|
EFI_STATUS Status;
|
||
|
EFI_HANDLE Handle;
|
||
|
|
||
|
/*
|
||
|
* Check to see if this device path already has Protocol on it.
|
||
|
* if so we are loading recursivly and should exit with an error
|
||
|
*/
|
||
|
Status = BS->LocateDevicePath (Protocol, &DevicePath, &Handle);
|
||
|
if (!EFI_ERROR(Status)) {
|
||
|
DEBUG ((D_INIT, "Device Already Loaded for %a device\n", ErrorStr));
|
||
|
return EFI_LOAD_ERROR;
|
||
|
}
|
||
|
|
||
|
Status = BS->LocateDevicePath (&DeviceIoProtocol, &DevicePath, &Handle);
|
||
|
if (!EFI_ERROR(Status)) {
|
||
|
Status = BS->HandleProtocol (Handle, &DeviceIoProtocol, (VOID*)GlobalIoFncs);
|
||
|
}
|
||
|
|
||
|
ASSERT (!EFI_ERROR(Status));
|
||
|
return Status;
|
||
|
}
|
||
|
|
||
|
UINT32
|
||
|
ReadPort (
|
||
|
IN EFI_DEVICE_IO_INTERFACE *GlobalIoFncs,
|
||
|
IN EFI_IO_WIDTH Width,
|
||
|
IN UINTN Port
|
||
|
)
|
||
|
{
|
||
|
UINT32 Data;
|
||
|
EFI_STATUS Status;
|
||
|
|
||
|
Status = GlobalIoFncs->Io.Read (GlobalIoFncs, Width, (UINT64)Port, 1, &Data);
|
||
|
ASSERT(!EFI_ERROR(Status));
|
||
|
return Data;
|
||
|
}
|
||
|
|
||
|
UINT32
|
||
|
WritePort (
|
||
|
IN EFI_DEVICE_IO_INTERFACE *GlobalIoFncs,
|
||
|
IN EFI_IO_WIDTH Width,
|
||
|
IN UINTN Port,
|
||
|
IN UINTN Data
|
||
|
)
|
||
|
{
|
||
|
EFI_STATUS Status;
|
||
|
|
||
|
Status = GlobalIoFncs->Io.Write (GlobalIoFncs, Width, (UINT64)Port, 1, &Data);
|
||
|
ASSERT(!EFI_ERROR(Status));
|
||
|
return (UINT32)Data;
|
||
|
}
|
||
|
|
||
|
UINT32
|
||
|
ReadPciConfig (
|
||
|
IN EFI_DEVICE_IO_INTERFACE *GlobalIoFncs,
|
||
|
IN EFI_IO_WIDTH Width,
|
||
|
IN UINTN Address
|
||
|
)
|
||
|
{
|
||
|
UINT32 Data;
|
||
|
EFI_STATUS Status;
|
||
|
|
||
|
Status = GlobalIoFncs->Pci.Read (GlobalIoFncs, Width, (UINT64)Address, 1, &Data);
|
||
|
ASSERT(!EFI_ERROR(Status));
|
||
|
return Data;
|
||
|
}
|
||
|
|
||
|
UINT32
|
||
|
WritePciConfig (
|
||
|
IN EFI_DEVICE_IO_INTERFACE *GlobalIoFncs,
|
||
|
IN EFI_IO_WIDTH Width,
|
||
|
IN UINTN Address,
|
||
|
IN UINTN Data
|
||
|
)
|
||
|
{
|
||
|
EFI_STATUS Status;
|
||
|
|
||
|
Status = GlobalIoFncs->Pci.Write (GlobalIoFncs, Width, (UINT64)Address, 1, &Data);
|
||
|
ASSERT(!EFI_ERROR(Status));
|
||
|
return (UINT32)Data;
|
||
|
}
|
||
|
|
||
|
|
||
|
|