hw.c revision 1.1.1.1.10.2 1 1.1.1.1.10.2 tls /* $NetBSD: hw.c,v 1.1.1.1.10.2 2014/08/20 00:04:24 tls 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.2 tls EFI_STATUS Status;
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.2 tls EFI_STATUS Status;
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.2 tls EFI_STATUS Status;
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.2 tls EFI_STATUS Status;
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