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