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