TianoCore EDK2 master
Loading...
Searching...
No Matches
Qemu.h
Go to the documentation of this file.
1
9//
10// QEMU Video Controller Driver
11//
12
13#ifndef _QEMU_H_
14#define _QEMU_H_
15
16#include <PiDxe.h>
18#include <Protocol/PciIo.h>
20#include <Protocol/DevicePath.h>
21
22#include <Library/DebugLib.h>
24#include <Library/UefiLib.h>
25#include <Library/PcdLib.h>
30#include <Library/TimerLib.h>
32
35
36//
37// QEMU Video PCI Configuration Header values
38//
39#define CIRRUS_LOGIC_VENDOR_ID 0x1013
40#define CIRRUS_LOGIC_5430_DEVICE_ID 0x00a8
41#define CIRRUS_LOGIC_5430_ALTERNATE_DEVICE_ID 0x00a0
42#define CIRRUS_LOGIC_5446_DEVICE_ID 0x00b8
43
44//
45// QEMU Vide Graphical Mode Data
46//
47typedef struct {
48 UINT32 InternalModeIndex; // points into card-specific mode table
49 UINT32 HorizontalResolution;
50 UINT32 VerticalResolution;
51 UINT32 ColorDepth;
53
54#define PIXEL_RED_SHIFT 0
55#define PIXEL_GREEN_SHIFT 3
56#define PIXEL_BLUE_SHIFT 6
57
58#define PIXEL_RED_MASK (BIT7 | BIT6 | BIT5)
59#define PIXEL_GREEN_MASK (BIT4 | BIT3 | BIT2)
60#define PIXEL_BLUE_MASK (BIT1 | BIT0)
61
62#define PIXEL_TO_COLOR_BYTE(pixel, mask, shift) ((UINT8) ((pixel & mask) << shift))
63#define PIXEL_TO_RED_BYTE(pixel) PIXEL_TO_COLOR_BYTE(pixel, PIXEL_RED_MASK, PIXEL_RED_SHIFT)
64#define PIXEL_TO_GREEN_BYTE(pixel) PIXEL_TO_COLOR_BYTE(pixel, PIXEL_GREEN_MASK, PIXEL_GREEN_SHIFT)
65#define PIXEL_TO_BLUE_BYTE(pixel) PIXEL_TO_COLOR_BYTE(pixel, PIXEL_BLUE_MASK, PIXEL_BLUE_SHIFT)
66
67#define RGB_BYTES_TO_PIXEL(Red, Green, Blue) \
68 (UINT8) ( (((Red) >> PIXEL_RED_SHIFT) & PIXEL_RED_MASK) | \
69 (((Green) >> PIXEL_GREEN_SHIFT) & PIXEL_GREEN_MASK) | \
70 (((Blue) >> PIXEL_BLUE_SHIFT) & PIXEL_BLUE_MASK) )
71
72#define PIXEL24_RED_MASK 0x00ff0000
73#define PIXEL24_GREEN_MASK 0x0000ff00
74#define PIXEL24_BLUE_MASK 0x000000ff
75
76#define GRAPHICS_OUTPUT_INVALIDE_MODE_NUMBER 0xffff
77
78//
79// QEMU Video Private Data Structure
80//
81#define QEMU_VIDEO_PRIVATE_DATA_SIGNATURE SIGNATURE_32 ('Q', 'V', 'I', 'D')
82
83typedef enum {
84 QEMU_VIDEO_CIRRUS_5430 = 1,
85 QEMU_VIDEO_CIRRUS_5446,
86 QEMU_VIDEO_BOCHS,
87 QEMU_VIDEO_BOCHS_MMIO,
88 QEMU_VIDEO_VMWARE_SVGA,
89} QEMU_VIDEO_VARIANT;
90
91typedef struct {
92 UINT8 SubClass;
93 UINT16 VendorId;
94 UINT16 DeviceId;
95 QEMU_VIDEO_VARIANT Variant;
96 CHAR16 *Name;
98
99typedef struct {
100 UINT64 Signature;
101 EFI_HANDLE Handle;
102 EFI_PCI_IO_PROTOCOL *PciIo;
103 UINT64 OriginalPciAttributes;
104 EFI_GRAPHICS_OUTPUT_PROTOCOL GraphicsOutput;
105 EFI_DEVICE_PATH_PROTOCOL *GopDevicePath;
106
107 //
108 // The next two fields match the client-visible
109 // EFI_GRAPHICS_OUTPUT_PROTOCOL_MODE.MaxMode field.
110 //
111 UINTN MaxMode;
112 QEMU_VIDEO_MODE_DATA *ModeData;
113
114 QEMU_VIDEO_VARIANT Variant;
116 UINTN FrameBufferBltConfigureSize;
117 UINT8 FrameBufferVramBarIndex;
118
119 UINT8 Edid[128];
121
125typedef struct {
126 UINT32 Width;
127 UINT32 Height;
128 UINT32 ColorDepth;
129 UINT8 *CrtcSettings;
130 UINT16 *SeqSettings;
131 UINT8 MiscSetting;
133
134typedef struct {
135 UINT32 Width;
136 UINT32 Height;
138
139#define QEMU_VIDEO_PRIVATE_DATA_FROM_GRAPHICS_OUTPUT_THIS(a) \
140 CR(a, QEMU_VIDEO_PRIVATE_DATA, GraphicsOutput, QEMU_VIDEO_PRIVATE_DATA_SIGNATURE)
141
142//
143// Global Variables
144//
145extern UINT8 AttributeController[];
146extern UINT8 GraphicsController[];
147extern UINT8 Crtc_640_480_256_60[];
148extern UINT16 Seq_640_480_256_60[];
149extern UINT8 Crtc_800_600_256_60[];
150extern UINT16 Seq_800_600_256_60[];
151extern UINT8 Crtc_1024_768_256_60[];
152extern UINT16 Seq_1024_768_256_60[];
154extern EFI_DRIVER_BINDING_PROTOCOL gQemuVideoDriverBinding;
155extern EFI_COMPONENT_NAME_PROTOCOL gQemuVideoComponentName;
156extern EFI_COMPONENT_NAME2_PROTOCOL gQemuVideoComponentName2;
157
158//
159// Io Registers defined by VGA
160//
161#define CRTC_ADDRESS_REGISTER 0x3d4
162#define CRTC_DATA_REGISTER 0x3d5
163#define SEQ_ADDRESS_REGISTER 0x3c4
164#define SEQ_DATA_REGISTER 0x3c5
165#define GRAPH_ADDRESS_REGISTER 0x3ce
166#define GRAPH_DATA_REGISTER 0x3cf
167#define ATT_ADDRESS_REGISTER 0x3c0
168#define MISC_OUTPUT_REGISTER 0x3c2
169#define INPUT_STATUS_1_REGISTER 0x3da
170#define DAC_PIXEL_MASK_REGISTER 0x3c6
171#define PALETTE_INDEX_REGISTER 0x3c8
172#define PALETTE_DATA_REGISTER 0x3c9
173
174#define VBE_DISPI_IOPORT_INDEX 0x01CE
175#define VBE_DISPI_IOPORT_DATA 0x01D0
176
177#define VBE_DISPI_INDEX_ID 0x0
178#define VBE_DISPI_INDEX_XRES 0x1
179#define VBE_DISPI_INDEX_YRES 0x2
180#define VBE_DISPI_INDEX_BPP 0x3
181#define VBE_DISPI_INDEX_ENABLE 0x4
182#define VBE_DISPI_INDEX_BANK 0x5
183#define VBE_DISPI_INDEX_VIRT_WIDTH 0x6
184#define VBE_DISPI_INDEX_VIRT_HEIGHT 0x7
185#define VBE_DISPI_INDEX_X_OFFSET 0x8
186#define VBE_DISPI_INDEX_Y_OFFSET 0x9
187#define VBE_DISPI_INDEX_VIDEO_MEMORY_64K 0xa
188
189#define VBE_DISPI_ID0 0xB0C0
190#define VBE_DISPI_ID1 0xB0C1
191#define VBE_DISPI_ID2 0xB0C2
192#define VBE_DISPI_ID3 0xB0C3
193#define VBE_DISPI_ID4 0xB0C4
194#define VBE_DISPI_ID5 0xB0C5
195
196#define VBE_DISPI_DISABLED 0x00
197#define VBE_DISPI_ENABLED 0x01
198#define VBE_DISPI_GETCAPS 0x02
199#define VBE_DISPI_8BIT_DAC 0x20
200#define VBE_DISPI_LFB_ENABLED 0x40
201#define VBE_DISPI_NOCLEARMEM 0x80
202
203//
204// Graphics Output Hardware abstraction internal worker functions
205//
207QemuVideoGraphicsOutputConstructor (
209 );
210
212QemuVideoGraphicsOutputDestructor (
214 );
215
216//
217// EFI_DRIVER_BINDING_PROTOCOL Protocol Interface
218//
219
231EFIAPI
234 IN EFI_HANDLE Controller,
235 IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath
236 );
237
249EFIAPI
252 IN EFI_HANDLE Controller,
253 IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath
254 );
255
268EFIAPI
271 IN EFI_HANDLE Controller,
272 IN UINTN NumberOfChildren,
273 IN EFI_HANDLE *ChildHandleBuffer
274 );
275
276//
277// EFI Component Name Functions
278//
279
320EFIAPI
323 IN CHAR8 *Language,
324 OUT CHAR16 **DriverName
325 );
326
396EFIAPI
399 IN EFI_HANDLE ControllerHandle,
400 IN EFI_HANDLE ChildHandle OPTIONAL,
401 IN CHAR8 *Language,
402 OUT CHAR16 **ControllerName
403 );
404
405//
406// Local Function Prototypes
407//
408VOID
412 );
413
414VOID
415InitializeBochsGraphicsMode (
417 QEMU_VIDEO_MODE_DATA *ModeData
418 );
419
420VOID
423 UINTN Index,
424 UINT8 Red,
425 UINT8 Green,
426 UINT8 Blue
427 );
428
429VOID
432 );
433
434VOID
435DrawLogo (
437 UINTN ScreenWidth,
438 UINTN ScreenHeight
439 );
440
441VOID
442outb (
444 UINTN Address,
445 UINT8 Data
446 );
447
448VOID
449outw (
451 UINTN Address,
452 UINT16 Data
453 );
454
455UINT8
456inb (
458 UINTN Address
459 );
460
461UINT16
462inw (
464 UINTN Address
465 );
466
467VOID
468BochsWrite (
470 UINT16 Reg,
471 UINT16 Data
472 );
473
474UINT16
475BochsRead (
477 UINT16 Reg
478 );
479
480VOID
481VgaOutb (
483 UINTN Reg,
484 UINT8 Data
485 );
486
490 );
491
493QemuVideoBochsModeSetup (
495 BOOLEAN IsQxl
496 );
497
498#endif
UINT64 UINTN
RETURN_STATUS EFIAPI FrameBufferBltConfigure(IN VOID *FrameBuffer, IN EFI_GRAPHICS_OUTPUT_MODE_INFORMATION *FrameBufferInfo, IN OUT FRAME_BUFFER_CONFIGURE *Configure, IN OUT UINTN *ConfigureSize)
#define IN
Definition: Base.h:279
#define OUT
Definition: Base.h:284
VOID SetDefaultPalette(QEMU_VIDEO_PRIVATE_DATA *Private)
Definition: Driver.c:777
VOID outb(QEMU_VIDEO_PRIVATE_DATA *Private, UINTN Address, UINT8 Data)
Definition: Driver.c:642
UINT8 inb(QEMU_VIDEO_PRIVATE_DATA *Private, UINTN Address)
Definition: Driver.c:695
EFI_STATUS EFIAPI QemuVideoControllerDriverStart(IN EFI_DRIVER_BINDING_PROTOCOL *This, IN EFI_HANDLE Controller, IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath)
Definition: Driver.c:193
UINT8 AttributeController[]
Definition: Initialize.c:15
EFI_STATUS EFIAPI QemuVideoComponentNameGetControllerName(IN EFI_COMPONENT_NAME_PROTOCOL *This, IN EFI_HANDLE ControllerHandle, IN EFI_HANDLE ChildHandle OPTIONAL, IN CHAR8 *Language, OUT CHAR16 **ControllerName)
VOID DrawLogo(QEMU_VIDEO_PRIVATE_DATA *Private, UINTN ScreenWidth, UINTN ScreenHeight)
Definition: Driver.c:832
QEMU_VIDEO_CIRRUS_MODES QemuVideoCirrusModes[]
Definition: Initialize.c:139
UINT16 inw(QEMU_VIDEO_PRIVATE_DATA *Private, UINTN Address)
Definition: Driver.c:723
VOID InitializeCirrusGraphicsMode(QEMU_VIDEO_PRIVATE_DATA *Private, QEMU_VIDEO_CIRRUS_MODES *ModeData)
Definition: Driver.c:850
EFI_STATUS QemuVideoCirrusModeSetup(QEMU_VIDEO_PRIVATE_DATA *Private)
Definition: Initialize.c:158
VOID outw(QEMU_VIDEO_PRIVATE_DATA *Private, UINTN Address, UINT16 Data)
Definition: Driver.c:669
EFI_STATUS EFIAPI QemuVideoComponentNameGetDriverName(IN EFI_COMPONENT_NAME_PROTOCOL *This, IN CHAR8 *Language, OUT CHAR16 **DriverName)
Definition: ComponentName.c:81
EFI_STATUS EFIAPI QemuVideoControllerDriverStop(IN EFI_DRIVER_BINDING_PROTOCOL *This, IN EFI_HANDLE Controller, IN UINTN NumberOfChildren, IN EFI_HANDLE *ChildHandleBuffer)
Definition: Driver.c:535
VOID SetPaletteColor(QEMU_VIDEO_PRIVATE_DATA *Private, UINTN Index, UINT8 Red, UINT8 Green, UINT8 Blue)
Definition: Driver.c:754
UINT8 GraphicsController[]
Definition: Initialize.c:24
EFI_STATUS EFIAPI QemuVideoControllerDriverSupported(IN EFI_DRIVER_BINDING_PROTOCOL *This, IN EFI_HANDLE Controller, IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath)
Definition: Driver.c:113
RETURN_STATUS EFI_STATUS
Definition: UefiBaseType.h:29
VOID * EFI_HANDLE
Definition: UefiBaseType.h:33