4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/* $Id$ */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/** @file
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * VBoxVga.c
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/*
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * Copyright (C) 2009-2010 Oracle Corporation
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * This file is part of VirtualBox Open Source Edition (OSE), as
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * available from http://www.virtualbox.org. This file is free software;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * you can redistribute it and/or modify it under the terms of the GNU
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * General Public License (GPL) as published by the Free Software
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * Foundation, in version 2 as it comes in the "COPYING" file of the
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * The contents of this file may alternatively be used under the terms
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * of the Common Development and Distribution License Version 1.0
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * (CDDL) only, as it comes in the "COPYING.CDDL" file of the
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * VirtualBox OSE distribution, in which case the provisions of the
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * CDDL are applicable instead of those of the GPL.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * You may elect to license modified versions of this file under the
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * terms and conditions of either the GPL or the CDDL or both.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/*
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync This code is based on:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Cirrus Logic 5430 Controller Driver.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync This driver is a sample implementation of the UGA Draw and Graphics Output
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Protocols for the Cirrus Logic 5430 family of PCI video controllers.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync This driver is only usable in the EFI pre-boot environment.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync This sample is intended to show how the UGA Draw and Graphics output Protocol
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync is able to function.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync The UGA I/O Protocol is not implemented in this sample.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync A fully compliant EFI UGA driver requires both
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync the UGA Draw and the UGA I/O Protocol. Please refer to Microsoft's
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync documentation on UGA for details on how to write a UGA driver that is able
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync to function both in the EFI pre-boot environment and from the OS runtime.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Copyright (c) 2006 - 2009, Intel Corporation
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync All rights reserved. This program and the accompanying materials
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync are licensed and made available under the terms and conditions of the BSD License
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync which accompanies this distribution. The full text of the license may be found at
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync http://opensource.org/licenses/bsd-license.php
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync*/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync//
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync// Cirrus Logic 5430 Controller Driver
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync//
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#include "VBoxVga.h"
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#include "iprt/asm.h"
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#include <IndustryStandard/Acpi.h>
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFI_DRIVER_BINDING_PROTOCOL gVBoxVgaDriverBinding = {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync VBoxVgaControllerDriverSupported,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync VBoxVgaControllerDriverStart,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync VBoxVgaControllerDriverStop,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync 0x10,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync NULL,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync NULL
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync};
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync///
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/// Generic Attribute Controller Register Settings
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync///
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncUINT8 AttributeController[21] = {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync 0x41, 0x00, 0x0F, 0x00, 0x00
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync};
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync///
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/// Generic Graphics Controller Register Settings
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync///
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncUINT8 GraphicsController[9] = {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x05, 0x0F, 0xFF
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync};
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync//
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync// 640 x 480 x 256 color @ 60 Hertz
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync//
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncUINT8 Crtc_640_480_256_60[25] = {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /* r0 = */0x5f, /* r1 = */0x4f, /* r2 = */0x50, /* r3 = */0x82,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /* r4 = */0x54, /* r5 = */0x80, /* r6 = */0x0b, /* r7 = */0x3e,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /* r8 = */0x00, /* r9 = */0x40, /* r10 = */0x00, /* r11 = */0x00,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /* r12 = */0x00, /* r13 = */0x00, /* r14 = */0x00, /* r15 = */0x00,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /* r16 = */0xea, /* r17 = */0x0c, /* r18 = */0xdf, /* r19 = */0x28,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /* r20 = */0x4f, /* r21 = */0xe7, /* r22 = */0x04, /* r23 = */0xe3,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /* r24 = */0xff
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync};
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncUINT8 Seq_640_480_256_60[5] = {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync 0x01, 0x01, 0x0f, 0x00, 0x0a
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync};
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync//
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync// 800 x 600 x 256 color @ 60 Hertz
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync//
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncUINT8 Crtc_800_600_256_60[25] = {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /* r0 = */0x5f, /* r1 = */0x4f, /* r2 = */0x50, /* r3 = */0x82,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /* r4 = */0x54, /* r5 = */0x80, /* r6 = */0x0b, /* r7 = */0x3e,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /* r8 = */0x00, /* r9 = */0x40, /* r10 = */0x00, /* r11 = */0x00,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /* r12 = */0x00, /* r13 = */0x00, /* r14 = */0x00, /* r15 = */0x00,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /* r16 = */0xea, /* r17 = */0x0c, /* r18 = */0xdf, /* r19 = */0x28,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /* r20 = */0x4f, /* r21 = */0xe7, /* r22 = */0x04, /* r23 = */0xe3,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /* r24 = */0xff
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync};
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncUINT8 Seq_800_600_256_60[5] = {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync 0x01, 0x01, 0x0f, 0x00, 0x0a
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync};
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync//
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync// 1024 x 768 x 256 color @ 60 Hertz
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync//
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncUINT8 Crtc_1024_768_256_60[25] = {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /* r0 = */0xa3, /* r1 = */0x7f, /* r2 = */0x81, /* r3 = */0x90,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /* r4 = */0x88, /* r5 = */0x05, /* r6 = */0x28, /* r7 = */0xfd,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /* r8 = */0x00, /* r9 = */0x60, /* r10 = */0x00, /* r11 = */0x00,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /* r12 = */0x00, /* r13 = */0x00, /* r14 = */0x00, /* r15 = */0x00,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /* r16 = */0x06, /* r17 = */0x0f, /* r18 = */0xff, /* r19 = */0x40,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /* r20 = */0x4f, /* r21 = */0x05, /* r22 = */0x1a, /* r23 = */0xe3,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /* r24 = */0xff
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync};
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncUINT8 Seq_1024_768_256_60[5] = {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync 0x01, 0x01, 0x0f, 0x00, 0x0a
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync};
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync//
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync// 1280x1024
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync//
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncUINT8 Crtc_1280_1024_256_60[25] = {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /* r0 = */0xa3, /* r1 = */0x9f, /* r2 = */0x81, /* r3 = */0x90,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /* r4 = */0x88, /* r5 = */0x05, /* r6 = */0x28, /* r7 = */0xbd,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /* r8 = */0x00, /* r9 = */0x60, /* r10 = */0x00, /* r11 = */0x00,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /* r12 = */0x00, /* r13 = */0x00, /* r14 = */0x00, /* r15 = */0x00,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /* r16 = */0x06, /* r17 = */0x0f, /* r18 = */0x3f, /* r19 = */0x40,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /* r20 = */0x4f, /* r21 = */0x05, /* r22 = */0x1a, /* r23 = */0xe3,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /* r24 = */0xff
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync};
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncUINT8 Seq_1280_1024_256_60[5] = {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync 0x01, 0x01, 0x0f, 0x00, 0x0a
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync};
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync//
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync// 1440x900
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync//
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncUINT8 Crtc_1440_900_256_60[25] = {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /* r0 = */0xa3, /* r1 = */0xb3, /* r2 = */0x81, /* r3 = */0x90,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /* r4 = */0x88, /* r5 = */0x05, /* r6 = */0x28, /* r7 = */0xbd,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /* r8 = */0x00, /* r9 = */0x60, /* r10 = */0x00, /* r11 = */0x00,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /* r12 = */0x00, /* r13 = */0x00, /* r14 = */0x00, /* r15 = */0x00,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /* r16 = */0x06, /* r17 = */0x0f, /* r18 = */0x38, /* r19 = */0x40,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /* r20 = */0x4f, /* r21 = */0x05, /* r22 = */0x1a, /* r23 = */0xe3,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /* r24 = */0xff
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync};
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncUINT8 Seq_1440_900_256_60[5] = {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync 0x01, 0x01, 0x0f, 0x00, 0x0a
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync};
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync//
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync// 1920x1200
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync//
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncUINT8 Crtc_1920_1200_256_60[25] = {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /* r0 = */0xa3, /* r1 = */0xef, /* r2 = */0x81, /* r3 = */0x90,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /* r4 = */0x88, /* r5 = */0x05, /* r6 = */0x28, /* r7 = */0xbd,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /* r8 = */0x00, /* r9 = */0x60, /* r10 = */0x00, /* r11 = */0x00,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /* r12 = */0x00, /* r13 = */0x00, /* r14 = */0x00, /* r15 = */0x00,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /* r16 = */0x06, /* r17 = */0x0f, /* r18 = */0x50, /* r19 = */0x40,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /* r20 = */0x4f, /* r21 = */0x05, /* r22 = */0x1a, /* r23 = */0xe3,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /* r24 = */0xff
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync};
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncUINT8 Seq_1920_1200_256_60[5] = {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync 0x01, 0x01, 0x0f, 0x00, 0x0a
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync};
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync///
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/// Table of supported video modes
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync///
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncVBOX_VGA_VIDEO_MODES VBoxVgaVideoModes[] =
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync { 640, 480, 32, 60, Crtc_640_480_256_60, Seq_640_480_256_60, 0xe3 },
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync { 800, 600, 32, 60, Crtc_800_600_256_60, Seq_800_600_256_60, 0x23 },
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync { 1024, 768, 32, 60, Crtc_1024_768_256_60, Seq_1024_768_256_60, 0xef },
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync { 1280, 1024, 32, 60, Crtc_1280_1024_256_60, Seq_1280_1024_256_60, 0xef },
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync { 1440, 900, 32, 60, Crtc_1440_900_256_60, Seq_1440_900_256_60, 0xef },
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync { 1920, 1200, 32, 60, Crtc_1920_1200_256_60, Seq_1920_1200_256_60, 0xef }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync};
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsynctypedef struct _APPLE_FRAMEBUFFERINFO_PROTOCOL APPLE_FRAMEBUFFERINFO_PROTOCOL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsynctypedef
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFI_STATUS
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync(EFIAPI *APPLE_FRAMEBUFFERINFO_PROTOCOL_GET_INFO) (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN APPLE_FRAMEBUFFERINFO_PROTOCOL *This,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync OUT UINT32 *BaseAddr,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync OUT UINT32 *Something,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync OUT UINT32 *RowBytes,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync OUT UINT32 *Width,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync OUT UINT32 *Height,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync OUT UINT32 *Depth);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncstruct _APPLE_FRAMEBUFFERINFO_PROTOCOL {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync APPLE_FRAMEBUFFERINFO_PROTOCOL_GET_INFO GetInfo;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync VBOX_VGA_PRIVATE_DATA *Private;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync};
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFI_STATUS EFIAPI
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncGetFrameBufferInfo(IN APPLE_FRAMEBUFFERINFO_PROTOCOL *This,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync OUT UINT32 *BaseAddr,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync OUT UINT32 *Something,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync OUT UINT32 *RowBytes,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync OUT UINT32 *Width,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync OUT UINT32 *Height,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync OUT UINT32 *Depth);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncstatic APPLE_FRAMEBUFFERINFO_PROTOCOL gAppleFrameBufferInfo =
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync GetFrameBufferInfo,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync NULL
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync};
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync VBoxVgaControllerDriverSupported
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync TODO: This - add argument and description to function comment
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync TODO: Controller - add argument and description to function comment
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync TODO: RemainingDevicePath - add argument and description to function comment
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFI_STATUS
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFIAPI
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncVBoxVgaControllerDriverSupported (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN EFI_DRIVER_BINDING_PROTOCOL *This,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN EFI_HANDLE Controller,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_STATUS Status;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_PCI_IO_PROTOCOL *PciIo;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync PCI_TYPE00 Pci;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_DEV_PATH *Node;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Open the PCI I/O Protocol
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = gBS->OpenProtocol (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Controller,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync &gEfiPciIoProtocolGuid,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync (VOID **) &PciIo,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync This->DriverBindingHandle,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Controller,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_OPEN_PROTOCOL_BY_DRIVER
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync );
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (EFI_ERROR (Status)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DEBUG((DEBUG_INFO, "%a:%d status:%r\n", __FILE__, __LINE__, Status));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return Status;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Read the PCI Configuration Header from the PCI Device
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = PciIo->Pci.Read (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync PciIo,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EfiPciIoWidthUint32,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync 0,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync sizeof (Pci) / sizeof (UINT32),
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync &Pci
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync );
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (EFI_ERROR (Status)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DEBUG((DEBUG_INFO, "%a:%d status:%r\n", __FILE__, __LINE__, Status));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync goto Done;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = EFI_UNSUPPORTED;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // See if the I/O enable is on. Most systems only allow one VGA device to be turned on
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // at a time, so see if this is one that is turned on.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // if (((Pci.Hdr.Command & 0x01) == 0x01)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // See if this is a Cirrus Logic PCI controller
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Pci.Hdr.VendorId == VBOX_VENDOR_ID) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Pci.Hdr.DeviceId == VBOX_VGA_DEVICE_ID) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = EFI_SUCCESS;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (RemainingDevicePath != NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Node = (EFI_DEV_PATH *) RemainingDevicePath;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Check if RemainingDevicePath is the End of Device Path Node,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // if yes, return EFI_SUCCESS
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (!IsDevicePathEnd (Node)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // If RemainingDevicePath isn't the End of Device Path Node,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // check its validation
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Node->DevPath.Type != ACPI_DEVICE_PATH ||
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Node->DevPath.SubType != ACPI_ADR_DP ||
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DevicePathNodeLength(&Node->DevPath) != sizeof(ACPI_ADR_DEVICE_PATH)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DEBUG((DEBUG_INFO, "%a:%d status:%r\n", __FILE__, __LINE__, Status));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = EFI_UNSUPPORTED;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncDone:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Close the PCI I/O Protocol
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync gBS->CloseProtocol (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Controller,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync &gEfiPciIoProtocolGuid,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync This->DriverBindingHandle,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Controller
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync );
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DEBUG((DEBUG_INFO, "%a:%d status:%r\n", __FILE__, __LINE__, Status));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return Status;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync VBoxVgaControllerDriverStart
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync TODO: This - add argument and description to function comment
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync TODO: Controller - add argument and description to function comment
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync TODO: RemainingDevicePath - add argument and description to function comment
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFI_STATUS
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFIAPI
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncVBoxVgaControllerDriverStart (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN EFI_DRIVER_BINDING_PROTOCOL *This,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN EFI_HANDLE Controller,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_STATUS Status;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync VBOX_VGA_PRIVATE_DATA *Private;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync BOOLEAN PciAttributesSaved;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_DEVICE_PATH_PROTOCOL *ParentDevicePath;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ACPI_ADR_DEVICE_PATH AcpiDeviceNode;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync PciAttributesSaved = FALSE;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Allocate Private context data for UGA Draw interface.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Private = AllocateZeroPool (sizeof (VBOX_VGA_PRIVATE_DATA));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Private == NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = EFI_OUT_OF_RESOURCES;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync goto Error;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync gAppleFrameBufferInfo.Private = Private;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Set up context record
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Private->Signature = VBOX_VGA_PRIVATE_DATA_SIGNATURE;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Private->Handle = NULL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Open PCI I/O Protocol
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = gBS->OpenProtocol (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Controller,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync &gEfiPciIoProtocolGuid,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync (VOID **) &Private->PciIo,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync This->DriverBindingHandle,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Controller,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_OPEN_PROTOCOL_BY_DRIVER
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync );
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (EFI_ERROR (Status)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync goto Error;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Save original PCI attributes
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = Private->PciIo->Attributes (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Private->PciIo,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EfiPciIoAttributeOperationGet,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync 0,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync &Private->OriginalPciAttributes
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync );
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (EFI_ERROR (Status)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync goto Error;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync PciAttributesSaved = TRUE;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = Private->PciIo->Attributes (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Private->PciIo,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EfiPciIoAttributeOperationEnable,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_PCI_DEVICE_ENABLE | EFI_PCI_IO_ATTRIBUTE_VGA_MEMORY | EFI_PCI_IO_ATTRIBUTE_VGA_IO,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync NULL
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync );
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (EFI_ERROR (Status)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync goto Error;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Get ParentDevicePath
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = gBS->HandleProtocol (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Controller,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync &gEfiDevicePathProtocolGuid,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync (VOID **) &ParentDevicePath
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync );
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (EFI_ERROR (Status)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync goto Error;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (FeaturePcdGet (PcdSupportGop)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Set Gop Device Path
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (RemainingDevicePath == NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ZeroMem (&AcpiDeviceNode, sizeof (ACPI_ADR_DEVICE_PATH));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync AcpiDeviceNode.Header.Type = ACPI_DEVICE_PATH;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync AcpiDeviceNode.Header.SubType = ACPI_ADR_DP;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync AcpiDeviceNode.ADR = ACPI_DISPLAY_ADR (1, 0, 0, 1, 0, ACPI_ADR_DISPLAY_TYPE_VGA, 0, 0);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync SetDevicePathNodeLength (&AcpiDeviceNode.Header, sizeof (ACPI_ADR_DEVICE_PATH));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Private->GopDevicePath = AppendDevicePathNode (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ParentDevicePath,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync (EFI_DEVICE_PATH_PROTOCOL *) &AcpiDeviceNode
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync );
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else if (!IsDevicePathEnd (RemainingDevicePath)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // If RemainingDevicePath isn't the End of Device Path Node,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // only scan the specified device by RemainingDevicePath
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Private->GopDevicePath = AppendDevicePathNode (ParentDevicePath, RemainingDevicePath);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // If RemainingDevicePath is the End of Device Path Node,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // don't create child device and return EFI_SUCCESS
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Private->GopDevicePath = NULL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Private->GopDevicePath != NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Create child handle and device path protocol first
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Private->Handle = NULL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = gBS->InstallMultipleProtocolInterfaces (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync &Private->Handle,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync &gEfiDevicePathProtocolGuid,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Private->GopDevicePath,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync NULL
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync );
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Construct video mode buffer
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = VBoxVgaVideoModeSetup (Private);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (EFI_ERROR (Status)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync goto Error;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (FeaturePcdGet (PcdSupportUga)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Start the UGA Draw software stack.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = VBoxVgaUgaDrawConstructor (Private);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ASSERT_EFI_ERROR (Status);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Private->UgaDevicePath = ParentDevicePath;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = gBS->InstallMultipleProtocolInterfaces (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync &Controller,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //&gEfiUgaDrawProtocolGuid,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //&Private->UgaDraw,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync &gEfiDevicePathProtocolGuid,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Private->UgaDevicePath,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync NULL
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync );
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = gBS->InstallMultipleProtocolInterfaces (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync &Controller,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync &gEfiUgaDrawProtocolGuid,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync &Private->UgaDraw,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync NULL
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync );
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else if (FeaturePcdGet (PcdSupportGop)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Private->GopDevicePath == NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // If RemainingDevicePath is the End of Device Path Node,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // don't create child device and return EFI_SUCCESS
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = EFI_SUCCESS;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Start the GOP software stack.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = VBoxVgaGraphicsOutputConstructor (Private);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ASSERT_EFI_ERROR (Status);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = gBS->InstallMultipleProtocolInterfaces (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync &Private->Handle,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync &gEfiGraphicsOutputProtocolGuid,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync &Private->GraphicsOutput,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync &gEfiEdidDiscoveredProtocolGuid,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync &Private->EdidDiscovered,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync &gEfiEdidActiveProtocolGuid,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync &Private->EdidActive,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync NULL
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync );
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // This driver must support eithor GOP or UGA or both.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ASSERT (FALSE);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = EFI_UNSUPPORTED;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncError:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (EFI_ERROR (Status)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Private) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Private->PciIo) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (PciAttributesSaved == TRUE) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Restore original PCI attributes
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Private->PciIo->Attributes (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Private->PciIo,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EfiPciIoAttributeOperationSet,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Private->OriginalPciAttributes,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync NULL
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync );
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Close the PCI I/O Protocol
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync gBS->CloseProtocol (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Private->Handle,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync &gEfiPciIoProtocolGuid,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync This->DriverBindingHandle,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Private->Handle
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync );
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync gBS->FreePool (Private);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return Status;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync VBoxVgaControllerDriverStop
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync TODO: This - add argument and description to function comment
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync TODO: Controller - add argument and description to function comment
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync TODO: NumberOfChildren - add argument and description to function comment
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync TODO: ChildHandleBuffer - add argument and description to function comment
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync TODO: EFI_SUCCESS - add return value to function comment
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFI_STATUS
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFIAPI
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncVBoxVgaControllerDriverStop (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN EFI_DRIVER_BINDING_PROTOCOL *This,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN EFI_HANDLE Controller,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINTN NumberOfChildren,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN EFI_HANDLE *ChildHandleBuffer
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_UGA_DRAW_PROTOCOL *UgaDraw;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_GRAPHICS_OUTPUT_PROTOCOL *GraphicsOutput;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_STATUS Status;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync VBOX_VGA_PRIVATE_DATA *Private;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (FeaturePcdGet (PcdSupportUga)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = gBS->OpenProtocol (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Controller,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync &gEfiUgaDrawProtocolGuid,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync (VOID **) &UgaDraw,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync This->DriverBindingHandle,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Controller,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_OPEN_PROTOCOL_GET_PROTOCOL
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync );
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (EFI_ERROR (Status)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return Status;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Get our private context information
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Private = VBOX_VGA_PRIVATE_DATA_FROM_UGA_DRAW_THIS (UgaDraw);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync VBoxVgaUgaDrawDestructor (Private);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (FeaturePcdGet (PcdSupportGop)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync VBoxVgaGraphicsOutputDestructor (Private);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Remove the UGA and GOP protocol interface from the system
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = gBS->UninstallMultipleProtocolInterfaces (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Private->Handle,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync &gEfiUgaDrawProtocolGuid,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync &Private->UgaDraw,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync &gEfiGraphicsOutputProtocolGuid,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync &Private->GraphicsOutput,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync NULL
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync );
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Remove the UGA Draw interface from the system
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = gBS->UninstallMultipleProtocolInterfaces (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Private->Handle,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync &gEfiUgaDrawProtocolGuid,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync &Private->UgaDraw,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync NULL
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync );
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = gBS->OpenProtocol (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Controller,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync &gEfiGraphicsOutputProtocolGuid,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync (VOID **) &GraphicsOutput,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync This->DriverBindingHandle,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Controller,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_OPEN_PROTOCOL_GET_PROTOCOL
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync );
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (EFI_ERROR (Status)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return Status;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Get our private context information
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Private = VBOX_VGA_PRIVATE_DATA_FROM_GRAPHICS_OUTPUT_THIS (GraphicsOutput);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync VBoxVgaGraphicsOutputDestructor (Private);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Remove the GOP protocol interface from the system
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = gBS->UninstallMultipleProtocolInterfaces (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Private->Handle,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync &gEfiUgaDrawProtocolGuid,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync &Private->UgaDraw,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync &gEfiGraphicsOutputProtocolGuid,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync &Private->GraphicsOutput,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync NULL
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync );
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (EFI_ERROR (Status)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return Status;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Restore original PCI attributes
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Private->PciIo->Attributes (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Private->PciIo,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EfiPciIoAttributeOperationSet,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Private->OriginalPciAttributes,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync NULL
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync );
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Close the PCI I/O Protocol
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync gBS->CloseProtocol (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Controller,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync &gEfiPciIoProtocolGuid,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync This->DriverBindingHandle,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Controller
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync );
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Free our instance data
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync gBS->FreePool (Private);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return EFI_SUCCESS;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync VBoxVgaUgaDrawDestructor
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync TODO: Private - add argument and description to function comment
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync TODO: EFI_SUCCESS - add return value to function comment
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFI_STATUS
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncVBoxVgaUgaDrawDestructor (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync VBOX_VGA_PRIVATE_DATA *Private
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return EFI_SUCCESS;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#define inb(ignore, port) ASMInU8((port))
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#define inw(ignore, port) ASMInU16((port))
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#define outb(ignore, port, val) ASMOutU8((port), (val))
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#define outw(ignore, port, val) ASMOutU16((port), (val))
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync TODO: Add function description
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param Private TODO: add argument description
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param Index TODO: add argument description
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param Red TODO: add argument description
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param Green TODO: add argument description
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param Blue TODO: add argument description
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync TODO: add return values
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncVOID
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncSetPaletteColor (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync VBOX_VGA_PRIVATE_DATA *Private,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINTN Index,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINT8 Red,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINT8 Green,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINT8 Blue
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync outb (Private, PALETTE_INDEX_REGISTER, (UINT8) Index);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync outb (Private, PALETTE_DATA_REGISTER, (UINT8) (Red >> 2));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync outb (Private, PALETTE_DATA_REGISTER, (UINT8) (Green >> 2));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync outb (Private, PALETTE_DATA_REGISTER, (UINT8) (Blue >> 2));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync TODO: Add function description
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param Private TODO: add argument description
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync TODO: add return values
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncVOID
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncSetDefaultPalette (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync VBOX_VGA_PRIVATE_DATA *Private
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#if 1
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINTN Index;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINTN RedIndex;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINTN GreenIndex;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINTN BlueIndex;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Index = 0;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync for (RedIndex = 0; RedIndex < 8; RedIndex++) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync for (GreenIndex = 0; GreenIndex < 8; GreenIndex++) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync for (BlueIndex = 0; BlueIndex < 4; BlueIndex++) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync SetPaletteColor (Private, Index, (UINT8) (RedIndex << 5), (UINT8) (GreenIndex << 5), (UINT8) (BlueIndex << 6));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Index++;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#else
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync int i;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync static const UINT8 s_a3bVgaDac[64*3] =
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync 0x00, 0x00, 0x00,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync 0x00, 0x00, 0x2A,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync 0x00, 0x2A, 0x00,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync 0x00, 0x2A, 0x2A,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync 0x2A, 0x00, 0x00,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync 0x2A, 0x00, 0x2A,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync 0x2A, 0x2A, 0x00,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync 0x2A, 0x2A, 0x2A,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync 0x00, 0x00, 0x15,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync 0x00, 0x00, 0x3F,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync 0x00, 0x2A, 0x15,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync 0x00, 0x2A, 0x3F,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync 0x2A, 0x00, 0x15,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync 0x2A, 0x00, 0x3F,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync 0x2A, 0x2A, 0x15,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync 0x2A, 0x2A, 0x3F,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync 0x00, 0x15, 0x00,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync 0x00, 0x15, 0x2A,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync 0x00, 0x3F, 0x00,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync 0x00, 0x3F, 0x2A,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync 0x2A, 0x15, 0x00,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync 0x2A, 0x15, 0x2A,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync 0x2A, 0x3F, 0x00,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync 0x2A, 0x3F, 0x2A,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync 0x00, 0x15, 0x15,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync 0x00, 0x15, 0x3F,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync 0x00, 0x3F, 0x15,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync 0x00, 0x3F, 0x3F,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync 0x2A, 0x15, 0x15,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync 0x2A, 0x15, 0x3F,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync 0x2A, 0x3F, 0x15,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync 0x2A, 0x3F, 0x3F,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync 0x15, 0x00, 0x00,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync 0x15, 0x00, 0x2A,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync 0x15, 0x2A, 0x00,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync 0x15, 0x2A, 0x2A,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync 0x3F, 0x00, 0x00,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync 0x3F, 0x00, 0x2A,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync 0x3F, 0x2A, 0x00,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync 0x3F, 0x2A, 0x2A,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync 0x15, 0x00, 0x15,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync 0x15, 0x00, 0x3F,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync 0x15, 0x2A, 0x15,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync 0x15, 0x2A, 0x3F,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync 0x3F, 0x00, 0x15,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync 0x3F, 0x00, 0x3F,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync 0x3F, 0x2A, 0x15,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync 0x3F, 0x2A, 0x3F,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync 0x15, 0x15, 0x00,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync 0x15, 0x15, 0x2A,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync 0x15, 0x3F, 0x00,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync 0x15, 0x3F, 0x2A,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync 0x3F, 0x15, 0x00,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync 0x3F, 0x15, 0x2A,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync 0x3F, 0x3F, 0x00,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync 0x3F, 0x3F, 0x2A,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync 0x15, 0x15, 0x15,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync 0x15, 0x15, 0x3F,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync 0x15, 0x3F, 0x15,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync 0x15, 0x3F, 0x3F,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync 0x3F, 0x15, 0x15,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync 0x3F, 0x15, 0x3F,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync 0x3F, 0x3F, 0x15,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync 0x3F, 0x3F, 0x3F
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync };
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync for (i = 0; i < 64; ++i)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync outb(Private, 0x3c8, (UINT8)i);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync outb(Private, 0x3c9, s_a3bVgaDac[i*3 + 0]);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync outb(Private, 0x3c9, s_a3bVgaDac[i*3 + 1]);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync outb(Private, 0x3c9, s_a3bVgaDac[i*3 + 2]);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#endif
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync TODO: Add function description
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param Private TODO: add argument description
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync TODO: add return values
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncVOID
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncClearScreen (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync VBOX_VGA_PRIVATE_DATA *Private
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_GRAPHICS_OUTPUT_BLT_PIXEL blt;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync blt.Blue = 0;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync blt.Green = 0;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync blt.Red = 0;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync blt.Reserved = 0;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Private->PciIo->Mem.Write (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Private->PciIo,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EfiPciIoWidthFillUint32,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync 0,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync 0,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Private->ModeData[Private->CurrentMode].HorizontalResolution
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * Private->ModeData[Private->CurrentMode].VerticalResolution,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync &blt
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync );
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync TODO: Add function description
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param Private TODO: add argument description
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync TODO: add return values
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncVOID
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncDrawLogo (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync VBOX_VGA_PRIVATE_DATA *Private,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINTN ScreenWidth,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINTN ScreenHeight
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DEBUG((DEBUG_INFO, "UGA is %a GOP is %a\n",
68d3ad33cce3900667b967d02437b279040952f6vboxsync FeaturePcdGet(PcdSupportUga) ? "on" : "off",
68d3ad33cce3900667b967d02437b279040952f6vboxsync FeaturePcdGet(PcdSupportGop) ? "on" : "off"
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync TODO: Add function description
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param Private TODO: add argument description
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param ModeData TODO: add argument description
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync TODO: add return values
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncVOID
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncInitializeGraphicsMode (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync VBOX_VGA_PRIVATE_DATA *Private,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync VBOX_VGA_VIDEO_MODES *ModeData
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINT16 DeviceId;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_STATUS Status;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync int i;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = Private->PciIo->Pci.Read (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Private->PciIo,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EfiPciIoWidthUint16,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync PCI_DEVICE_ID_OFFSET,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync 1,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync &DeviceId
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync );
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync outb(Private, 0x3c2, 0xc3);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync outb(Private, 0x3c4, 0x04);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync outb(Private, 0x3c5, 0x02);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Read the PCI Configuration Header from the PCI Device
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#define BOUTB(storage, count, aport, dport) \
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync do { \
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync for (i = 0 ; i < count; ++i) \
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync { \
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync outb(Private, (aport), (UINT8)i);\
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync outb(Private, (dport), storage[i]); \
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } \
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } while (0)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ASSERT_EFI_ERROR (Status);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync inb(Private, INPUT_STATUS_1_REGISTER);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync outb(Private, ATT_ADDRESS_REGISTER, 0);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync outb(Private, CRTC_ADDRESS_REGISTER, 0x11);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync outb(Private, CRTC_DATA_REGISTER, 0x0);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /*
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * r0 = 1
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * boutb(1, 0x3c4, 0x3c5);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync outb(Private, SEQ_ADDRESS_REGISTER, 0);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync outb(Private, SEQ_DATA_REGISTER, 1);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync outw(Private, 0x1ce, 0x00); outw(Private, 0x1cf, 0xb0c0); // ENABLE
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync outw(Private, 0x1ce, 0x04); outw(Private, 0x1cf, 0); // ENABLE
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync outw(Private, 0x1ce, 0x01); outw(Private, 0x1cf, (UINT16)ModeData->Width); // XRES
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync outw(Private, 0x1ce, 0x02); outw(Private, 0x1cf, (UINT16)ModeData->Height); // YRES
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync outw(Private, 0x1ce, 0x03); outw(Private, 0x1cf, (UINT16)ModeData->ColorDepth); // BPP
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync outw(Private, 0x1ce, 0x05); outw(Private, 0x1cf, 0); // BANK
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync outw(Private, 0x1ce, 0x06); outw(Private, 0x1cf, (UINT16)ModeData->Width); // VIRT_WIDTH
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync outw(Private, 0x1ce, 0x07); outw(Private, 0x1cf, (UINT16)ModeData->Height); // VIRT_HEIGHT
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync outw(Private, 0x1ce, 0x08); outw(Private, 0x1cf, 0); // X_OFFSET
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync outw(Private, 0x1ce, 0x09); outw(Private, 0x1cf, 0); // Y_OFFSET
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync outw(Private, 0x1ce, 0x04); outw(Private, 0x1cf, 1); // ENABLE
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync outb(Private, MISC_OUTPUT_REGISTER, ModeData->MiscSetting);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync BOUTB(ModeData->SeqSettings, 5, SEQ_ADDRESS_REGISTER, SEQ_DATA_REGISTER);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /*
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * r0 = 3
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * boutb(1, 0x3c4, 0x3c5);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync outb(Private, SEQ_ADDRESS_REGISTER, 0);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync outb(Private, SEQ_DATA_REGISTER, 3);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync BOUTB(ModeData->CrtcSettings, 25, CRTC_ADDRESS_REGISTER, CRTC_DATA_REGISTER);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync BOUTB(GraphicsController, 9, GRAPH_ADDRESS_REGISTER , GRAPH_DATA_REGISTER);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync inb (Private, INPUT_STATUS_1_REGISTER);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync BOUTB(AttributeController, 21, ATT_ADDRESS_REGISTER, ATT_ADDRESS_REGISTER);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync outw(Private, 0x1ce, 0x05); outw(Private, 0x1cf, 0x0);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync outb (Private, ATT_ADDRESS_REGISTER, 0x20);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#if 0
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync outw (Private, GRAPH_ADDRESS_REGISTER, 0x0009);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync outw (Private, GRAPH_ADDRESS_REGISTER, 0x000a);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync outw (Private, GRAPH_ADDRESS_REGISTER, 0x000b);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync outb (Private, DAC_PIXEL_MASK_REGISTER, 0xff);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync SetDefaultPalette (Private);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#endif
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ClearScreen (Private);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
52ed26eebd4700cd43a05ed66178825c42ba99efvboxsync/** Aka know as AppleGraphInfoProtocolGuid in other sources. */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#define EFI_UNKNOWN_2_PROTOCOL_GUID \
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync { 0xE316E100, 0x0751, 0x4C49, {0x90, 0x56, 0x48, 0x6C, 0x7E, 0x47, 0x29, 0x03} }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFI_GUID gEfiAppleFrameBufferInfoGuid = EFI_UNKNOWN_2_PROTOCOL_GUID;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFI_STATUS EFIAPI
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncGetFrameBufferInfo(IN APPLE_FRAMEBUFFERINFO_PROTOCOL *This,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync OUT UINT32 *BaseAddr,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync OUT UINT32 *Something,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync OUT UINT32 *RowBytes,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync OUT UINT32 *Width,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync OUT UINT32 *Height,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync OUT UINT32 *Depth)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /* @todo: figure out from current running mode */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_ACPI_ADDRESS_SPACE_DESCRIPTOR *FrameBufDesc;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINT32 W, H, BPP;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync VBOX_VGA_PRIVATE_DATA *Private = This->Private;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINTN CurrentModeNumber = Private->CurrentMode;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync VBOX_VGA_MODE_DATA const *pCurrentMode = &Private->ModeData[CurrentModeNumber];
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync W = pCurrentMode->HorizontalResolution;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync H = pCurrentMode->VerticalResolution;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync BPP = pCurrentMode->ColorDepth;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DEBUG((DEBUG_INFO, "%a:%d GetFrameBufferInfo: %dx%d bpp:%d\n", __FILE__, __LINE__, W, H, BPP));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Private->PciIo->GetBarAttributes (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Private->PciIo,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync 0,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync NULL,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync (VOID**) &FrameBufDesc
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync );
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /* EFI firmware remaps it here */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *BaseAddr = (UINT32)FrameBufDesc->AddrRangeMin;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *RowBytes = W * BPP / 8;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *Width = W;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *Height = H;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *Depth = BPP;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // what *Something shall be?
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return EFI_SUCCESS;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFI_STATUS
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFIAPI
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncInitializeVBoxVga (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN EFI_HANDLE ImageHandle,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN EFI_SYSTEM_TABLE *SystemTable
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_STATUS Status;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = EfiLibInstallDriverBindingComponentName2 (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ImageHandle,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync SystemTable,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync &gVBoxVgaDriverBinding,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ImageHandle,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync &gVBoxVgaComponentName,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync &gVBoxVgaComponentName2
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync );
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ASSERT_EFI_ERROR (Status);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Install EFI Driver Supported EFI Version Protocol required for
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // EFI drivers that are on PCI and other plug in cards.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync gVBoxVgaDriverSupportedEfiVersion.FirmwareVersion = PcdGet32 (PcdDriverSupportedEfiVersion);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = gBS->InstallMultipleProtocolInterfaces (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync &ImageHandle,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync &gEfiDriverSupportedEfiVersionProtocolGuid,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync &gVBoxVgaDriverSupportedEfiVersion,
d8a59b2e6477144cb107e960be0570a4e46d5f8cvboxsync &gEfiAppleFrameBufferInfoGuid,
d8a59b2e6477144cb107e960be0570a4e46d5f8cvboxsync &gAppleFrameBufferInfo,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync NULL
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync );
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ASSERT_EFI_ERROR (Status);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return Status;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}