1 1.3 jmcneill /* $NetBSD: hw.c,v 1.3 2018/08/16 18:22:05 jmcneill Exp $ */ 2 1.1 jakllsch 3 1.1 jakllsch /*++ 4 1.1 jakllsch 5 1.1 jakllsch Copyright (c) 1998 Intel Corporation 6 1.1 jakllsch 7 1.1 jakllsch Module Name: 8 1.1 jakllsch 9 1.1 jakllsch hw.c 10 1.1 jakllsch 11 1.1 jakllsch Abstract: 12 1.1 jakllsch 13 1.1 jakllsch Debug library functions for Hardware IO access 14 1.1 jakllsch 15 1.1 jakllsch 16 1.1 jakllsch 17 1.1 jakllsch Revision History 18 1.1 jakllsch 19 1.1 jakllsch --*/ 20 1.1 jakllsch 21 1.1 jakllsch #include "lib.h" 22 1.1 jakllsch 23 1.1 jakllsch 24 1.1 jakllsch EFI_STATUS 25 1.1 jakllsch InitializeGlobalIoDevice ( 26 1.1 jakllsch IN EFI_DEVICE_PATH *DevicePath, 27 1.1 jakllsch IN EFI_GUID *Protocol, 28 1.3 jmcneill IN CHAR8 *ErrorStr EFI_UNUSED, 29 1.3 jmcneill OUT EFI_DEVICE_IO_INTERFACE **GlobalIoFncs 30 1.1 jakllsch ) 31 1.1 jakllsch /*++ 32 1.1 jakllsch 33 1.1 jakllsch Routine Description: 34 1.1 jakllsch 35 1.3 jmcneill Check to see if DevicePath exists for a given Protocol. Return Error if it 36 1.1 jakllsch exists. Return GlobalIoFuncs set match the DevicePath 37 1.1 jakllsch 38 1.1 jakllsch Arguments: 39 1.1 jakllsch 40 1.1 jakllsch DevicePath - to operate on 41 1.1 jakllsch Protocol - to check the DevicePath against 42 1.1 jakllsch ErrorStr - ASCII string to display on error 43 1.1 jakllsch GlobalIoFncs - Returned with DeviceIoProtocol for the DevicePath 44 1.1 jakllsch 45 1.1 jakllsch Returns: 46 1.1 jakllsch 47 1.1 jakllsch Pass or Fail based on wether GlobalIoFncs where found 48 1.1 jakllsch 49 1.1 jakllsch --*/ 50 1.1 jakllsch { 51 1.1 jakllsch EFI_STATUS Status; 52 1.1 jakllsch EFI_HANDLE Handle; 53 1.1 jakllsch 54 1.1 jakllsch // 55 1.1 jakllsch // Check to see if this device path already has Protocol on it. 56 1.1 jakllsch // if so we are loading recursivly and should exit with an error 57 1.1 jakllsch // 58 1.1 jakllsch Status = uefi_call_wrapper(BS->LocateDevicePath, 3, Protocol, &DevicePath, &Handle); 59 1.1 jakllsch if (!EFI_ERROR(Status)) { 60 1.1 jakllsch DEBUG ((D_INIT, "Device Already Loaded for %a device\n", ErrorStr)); 61 1.1 jakllsch return EFI_LOAD_ERROR; 62 1.1 jakllsch } 63 1.1 jakllsch 64 1.1 jakllsch Status = uefi_call_wrapper(BS->LocateDevicePath, 3, &DeviceIoProtocol, &DevicePath, &Handle); 65 1.1 jakllsch if (!EFI_ERROR(Status)) { 66 1.1 jakllsch Status = uefi_call_wrapper(BS->HandleProtocol, 3, Handle, &DeviceIoProtocol, (VOID*)GlobalIoFncs); 67 1.1 jakllsch } 68 1.1 jakllsch 69 1.1 jakllsch ASSERT (!EFI_ERROR(Status)); 70 1.1 jakllsch return Status; 71 1.1 jakllsch } 72 1.1 jakllsch 73 1.3 jmcneill UINT32 74 1.1 jakllsch ReadPort ( 75 1.3 jmcneill IN EFI_DEVICE_IO_INTERFACE *GlobalIoFncs, 76 1.1 jakllsch IN EFI_IO_WIDTH Width, 77 1.1 jakllsch IN UINTN Port 78 1.1 jakllsch ) 79 1.1 jakllsch { 80 1.1 jakllsch UINT32 Data; 81 1.3 jmcneill EFI_STATUS Status EFI_UNUSED; 82 1.1 jakllsch 83 1.1 jakllsch Status = uefi_call_wrapper(GlobalIoFncs->Io.Read, 5, GlobalIoFncs, Width, (UINT64)Port, 1, &Data); 84 1.1 jakllsch ASSERT(!EFI_ERROR(Status)); 85 1.1 jakllsch return Data; 86 1.1 jakllsch } 87 1.1 jakllsch 88 1.3 jmcneill UINT32 89 1.1 jakllsch WritePort ( 90 1.3 jmcneill IN EFI_DEVICE_IO_INTERFACE *GlobalIoFncs, 91 1.1 jakllsch IN EFI_IO_WIDTH Width, 92 1.1 jakllsch IN UINTN Port, 93 1.1 jakllsch IN UINTN Data 94 1.1 jakllsch ) 95 1.1 jakllsch { 96 1.3 jmcneill EFI_STATUS Status EFI_UNUSED; 97 1.1 jakllsch 98 1.1 jakllsch Status = uefi_call_wrapper(GlobalIoFncs->Io.Write, 5, GlobalIoFncs, Width, (UINT64)Port, 1, &Data); 99 1.1 jakllsch ASSERT(!EFI_ERROR(Status)); 100 1.1 jakllsch return (UINT32)Data; 101 1.1 jakllsch } 102 1.1 jakllsch 103 1.3 jmcneill UINT32 104 1.1 jakllsch ReadPciConfig ( 105 1.3 jmcneill IN EFI_DEVICE_IO_INTERFACE *GlobalIoFncs, 106 1.1 jakllsch IN EFI_IO_WIDTH Width, 107 1.1 jakllsch IN UINTN Address 108 1.1 jakllsch ) 109 1.1 jakllsch { 110 1.1 jakllsch UINT32 Data; 111 1.3 jmcneill EFI_STATUS Status EFI_UNUSED; 112 1.1 jakllsch 113 1.1 jakllsch Status = uefi_call_wrapper(GlobalIoFncs->Pci.Read, 5, GlobalIoFncs, Width, (UINT64)Address, 1, &Data); 114 1.1 jakllsch ASSERT(!EFI_ERROR(Status)); 115 1.1 jakllsch return Data; 116 1.1 jakllsch } 117 1.1 jakllsch 118 1.3 jmcneill UINT32 119 1.1 jakllsch WritePciConfig ( 120 1.3 jmcneill IN EFI_DEVICE_IO_INTERFACE *GlobalIoFncs, 121 1.1 jakllsch IN EFI_IO_WIDTH Width, 122 1.1 jakllsch IN UINTN Address, 123 1.1 jakllsch IN UINTN Data 124 1.1 jakllsch ) 125 1.1 jakllsch { 126 1.3 jmcneill EFI_STATUS Status EFI_UNUSED; 127 1.1 jakllsch 128 1.1 jakllsch Status = uefi_call_wrapper(GlobalIoFncs->Pci.Write, 5, GlobalIoFncs, Width, (UINT64)Address, 1, &Data); 129 1.1 jakllsch ASSERT(!EFI_ERROR(Status)); 130 1.1 jakllsch return (UINT32)Data; 131 1.1 jakllsch } 132 1.1 jakllsch 133 1.1 jakllsch 134 1.1 jakllsch 135