]> git.proxmox.com Git - mirror_edk2.git/blame - OvmfPkg/VirtioPciDeviceDxe/VirtioPciFunctions.c
FatBinPkg: Update EBC/IA32/X64/IPF binaries
[mirror_edk2.git] / OvmfPkg / VirtioPciDeviceDxe / VirtioPciFunctions.c
CommitLineData
3bb56c06
OM
1/** @file\r
2\r
3 This driver produces Virtio Device Protocol instances for Virtio PCI devices.\r
4\r
5 Copyright (C) 2012, Red Hat, Inc.\r
6 Copyright (c) 2012, Intel Corporation. All rights reserved.<BR>\r
7 Copyright (C) 2013, ARM Ltd.\r
8\r
9 This program and the accompanying materials are licensed and made available\r
10 under the terms and conditions of the BSD License which accompanies this\r
11 distribution. The full text of the license may be found at\r
12 http://opensource.org/licenses/bsd-license.php\r
13\r
14 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, WITHOUT\r
15 WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
16\r
17**/\r
18#include <Library/BaseMemoryLib.h>\r
19#include <Library/DebugLib.h>\r
20#include <Library/MemoryAllocationLib.h>\r
21#include <Library/UefiBootServicesTableLib.h>\r
22#include <Library/UefiLib.h>\r
23#include "VirtioPciDevice.h"\r
24\r
25/**\r
26\r
27 Read a word from Region 0 of the device specified by VirtIo Device protocol.\r
28\r
29 The function implements the ReadDevice protocol member of\r
30 VIRTIO_DEVICE_PROTOCOL.\r
31\r
32 @param[in] This VirtIo Device protocol.\r
33\r
34 @param[in] FieldOffset Source offset.\r
35\r
36 @param[in] FieldSize Source field size, must be in { 1, 2, 4, 8 }.\r
37\r
38 @param[in] BufferSize Number of bytes available in the target buffer. Must\r
39 equal FieldSize.\r
40\r
41 @param[out] Buffer Target buffer.\r
42\r
43\r
44 @return Status code returned by PciIo->Io.Read().\r
45\r
46**/\r
47EFI_STATUS\r
48EFIAPI\r
49VirtioPciDeviceRead (\r
50 IN VIRTIO_DEVICE_PROTOCOL *This,\r
51 IN UINTN FieldOffset,\r
52 IN UINTN FieldSize,\r
53 IN UINTN BufferSize,\r
54 OUT VOID *Buffer\r
55 )\r
56{\r
57 VIRTIO_PCI_DEVICE *Dev;\r
58\r
59 Dev = VIRTIO_PCI_DEVICE_FROM_VIRTIO_DEVICE (This);\r
60\r
61 return VirtioPciIoRead (Dev,\r
62 Dev->DeviceSpecificConfigurationOffset + FieldOffset,\r
63 FieldSize, BufferSize, Buffer);\r
64}\r
65\r
66/**\r
67\r
68 Write a word into Region 0 of the device specified by VirtIo Device protocol.\r
69\r
70 @param[in] This VirtIo Device protocol.\r
71\r
72 @param[in] FieldOffset Destination offset.\r
73\r
74 @param[in] FieldSize Destination field size, must be in { 1, 2, 4, 8 }.\r
75\r
76 @param[in] Value Little endian value to write, converted to UINT64.\r
77 The least significant FieldSize bytes will be used.\r
78\r
79\r
80 @return Status code returned by PciIo->Io.Write().\r
81\r
82**/\r
83EFI_STATUS\r
84EFIAPI\r
85VirtioPciDeviceWrite (\r
86 IN VIRTIO_DEVICE_PROTOCOL *This,\r
87 IN UINTN FieldOffset,\r
88 IN UINTN FieldSize,\r
89 IN UINT64 Value\r
90 )\r
91{\r
92 VIRTIO_PCI_DEVICE *Dev;\r
93\r
94 Dev = VIRTIO_PCI_DEVICE_FROM_VIRTIO_DEVICE (This);\r
95\r
96 return VirtioPciIoWrite (Dev,\r
97 Dev->DeviceSpecificConfigurationOffset + FieldOffset, FieldSize, Value);\r
98}\r
99\r
100EFI_STATUS\r
101EFIAPI\r
102VirtioPciGetDeviceFeatures (\r
103 IN VIRTIO_DEVICE_PROTOCOL *This,\r
104 OUT UINT32 *DeviceFeatures\r
105 )\r
106{\r
107 VIRTIO_PCI_DEVICE *Dev;\r
108\r
109 if (DeviceFeatures == NULL) {\r
110 return EFI_INVALID_PARAMETER;\r
111 }\r
112\r
113 Dev = VIRTIO_PCI_DEVICE_FROM_VIRTIO_DEVICE (This);\r
114\r
115 return VirtioPciIoRead (Dev, VIRTIO_PCI_OFFSET_DEVICE_FEATURES, sizeof (UINT32),\r
116 sizeof (UINT32), DeviceFeatures);\r
117}\r
118\r
119EFI_STATUS\r
120EFIAPI\r
121VirtioPciGetQueueAddress (\r
122 IN VIRTIO_DEVICE_PROTOCOL *This,\r
123 OUT UINT32 *QueueAddress\r
124 )\r
125{\r
126 VIRTIO_PCI_DEVICE *Dev;\r
127\r
128 if (QueueAddress == NULL) {\r
129 return EFI_INVALID_PARAMETER;\r
130 }\r
131\r
132 Dev = VIRTIO_PCI_DEVICE_FROM_VIRTIO_DEVICE (This);\r
133\r
134 return VirtioPciIoRead (Dev, VIRTIO_PCI_OFFSET_QUEUE_ADDRESS, sizeof (UINT32),\r
135 sizeof (UINT32), QueueAddress);\r
136}\r
137\r
138EFI_STATUS\r
139EFIAPI\r
140VirtioPciGetQueueSize (\r
141 IN VIRTIO_DEVICE_PROTOCOL *This,\r
142 OUT UINT16 *QueueNumMax\r
143 )\r
144{\r
145 VIRTIO_PCI_DEVICE *Dev;\r
146\r
147 if (QueueNumMax == NULL) {\r
148 return EFI_INVALID_PARAMETER;\r
149 }\r
150\r
151 Dev = VIRTIO_PCI_DEVICE_FROM_VIRTIO_DEVICE (This);\r
152\r
153 return VirtioPciIoRead (Dev, VIRTIO_PCI_OFFSET_QUEUE_SIZE, sizeof (UINT16),\r
154 sizeof (UINT16), QueueNumMax);\r
155}\r
156\r
157EFI_STATUS\r
158EFIAPI\r
159VirtioPciGetDeviceStatus (\r
160 IN VIRTIO_DEVICE_PROTOCOL *This,\r
161 OUT UINT8 *DeviceStatus\r
162 )\r
163{\r
164 VIRTIO_PCI_DEVICE *Dev;\r
165\r
166 if (DeviceStatus == NULL) {\r
167 return EFI_INVALID_PARAMETER;\r
168 }\r
169\r
170 Dev = VIRTIO_PCI_DEVICE_FROM_VIRTIO_DEVICE (This);\r
171\r
172 return VirtioPciIoRead (Dev, VIRTIO_PCI_OFFSET_QUEUE_DEVICE_STATUS,\r
173 sizeof (UINT8), sizeof (UINT8), DeviceStatus);\r
174}\r
175\r
176EFI_STATUS\r
177EFIAPI\r
178VirtioPciSetGuestFeatures (\r
179 IN VIRTIO_DEVICE_PROTOCOL *This,\r
180 IN UINT32 Features\r
181 )\r
182{\r
183 VIRTIO_PCI_DEVICE *Dev;\r
184\r
185 Dev = VIRTIO_PCI_DEVICE_FROM_VIRTIO_DEVICE (This);\r
186\r
187 return VirtioPciIoWrite (Dev, VIRTIO_PCI_OFFSET_GUEST_FEATURES,\r
188 sizeof (UINT32), Features);\r
189}\r
190\r
191EFI_STATUS\r
192EFIAPI\r
193VirtioPciSetQueueAddress (\r
194 VIRTIO_DEVICE_PROTOCOL *This,\r
195 UINT32 Address\r
196 )\r
197{\r
198 VIRTIO_PCI_DEVICE *Dev;\r
199\r
200 Dev = VIRTIO_PCI_DEVICE_FROM_VIRTIO_DEVICE (This);\r
201\r
202 return VirtioPciIoWrite (Dev, VIRTIO_PCI_OFFSET_QUEUE_ADDRESS, sizeof (UINT32),\r
203 Address);\r
204}\r
205\r
206EFI_STATUS\r
207EFIAPI\r
208VirtioPciSetQueueSel (\r
209 VIRTIO_DEVICE_PROTOCOL *This,\r
210 UINT16 Sel\r
211 )\r
212{\r
213 VIRTIO_PCI_DEVICE *Dev;\r
214\r
215 Dev = VIRTIO_PCI_DEVICE_FROM_VIRTIO_DEVICE (This);\r
216\r
217 return VirtioPciIoWrite (Dev, VIRTIO_PCI_OFFSET_QUEUE_SELECT, sizeof (UINT16),\r
218 Sel);\r
219}\r
220\r
221EFI_STATUS\r
222EFIAPI\r
223VirtioPciSetQueueAlignment (\r
224 VIRTIO_DEVICE_PROTOCOL *This,\r
225 UINT32 Alignment\r
226 )\r
227{\r
228 return EFI_SUCCESS;\r
229}\r
230\r
231EFI_STATUS\r
232EFIAPI\r
233VirtioPciSetPageSize (\r
234 VIRTIO_DEVICE_PROTOCOL *This,\r
235 UINT32 PageSize\r
236 )\r
237{\r
238 return (PageSize == EFI_PAGE_SIZE) ? EFI_SUCCESS : EFI_UNSUPPORTED;\r
239}\r
240\r
241EFI_STATUS\r
242EFIAPI\r
243VirtioPciSetQueueNotify (\r
244 VIRTIO_DEVICE_PROTOCOL *This,\r
245 UINT16 Index\r
246 )\r
247{\r
248 VIRTIO_PCI_DEVICE *Dev;\r
249\r
250 Dev = VIRTIO_PCI_DEVICE_FROM_VIRTIO_DEVICE (This);\r
251\r
252 return VirtioPciIoWrite (Dev, VIRTIO_PCI_OFFSET_QUEUE_NOTIFY, sizeof (UINT16),\r
253 Index);\r
254}\r
255\r
256EFI_STATUS\r
257EFIAPI\r
258VirtioPciSetQueueSize (\r
259 VIRTIO_DEVICE_PROTOCOL *This,\r
260 UINT16 Size\r
261 )\r
262{\r
263 //\r
264 // This function is only applicable in Virtio-MMIO.\r
265 // (The QueueSize field is read-only in Virtio proper (PCI))\r
266 //\r
267 return EFI_SUCCESS;\r
268}\r
269\r
270EFI_STATUS\r
271EFIAPI\r
272VirtioPciSetDeviceStatus (\r
273 VIRTIO_DEVICE_PROTOCOL *This,\r
274 UINT8 DeviceStatus\r
275 )\r
276{\r
277 VIRTIO_PCI_DEVICE *Dev;\r
278\r
279 Dev = VIRTIO_PCI_DEVICE_FROM_VIRTIO_DEVICE (This);\r
280\r
281 return VirtioPciIoWrite (Dev, VIRTIO_PCI_OFFSET_QUEUE_DEVICE_STATUS,\r
282 sizeof (UINT8), DeviceStatus);\r
283}\r