From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received-SPF: Pass (sender SPF authorized) identity=mailfrom; client-ip=59.124.61.242; helo=synology.com; envelope-from=yuchenlin@synology.com; receiver=edk2-devel@lists.01.org Received: from synology.com (synology.com [59.124.61.242]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ml01.01.org (Postfix) with ESMTPS id 82BE82118A5B2 for ; Thu, 1 Nov 2018 20:24:20 -0700 (PDT) From: yuchenlin@synology.com DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=synology.com; s=123; t=1541129059; bh=NJGva9Y8geIybfB8kWVyAl3f3pU926ZMA728UXHMd1c=; h=From:To:Cc:Subject:Date:In-Reply-To:References; b=EGTZqrvOwkPABVyt7A3pK5uDwDLBONDAdClLRZGSTpsmMgtlhayls5xZlIRkkfpJ0 2S10xSTfrpHNAymK07AJi+6aoEfJ4DPWGtztOBhtMIfoYkTQu1/h7JpQYYkzvrYZ0I KBWL/z2MqKFdnocAU42gY1v1+JtODV8ip2wx7xZ8= To: edk2-devel@lists.01.org Cc: jordan.l.justen@intel.com, lersek@redhat.com, ard.biesheuvel@linaro.org, anthony.perard@citrix.com, julien.grall@linaro.org, phil@philjordan.eu, kraxel@redhat.com, philmd@redhat.com, yuchenlin Date: Fri, 2 Nov 2018 11:24:02 +0800 Message-Id: <20181102032402.19686-6-yuchenlin@synology.com> In-Reply-To: <20181102032402.19686-1-yuchenlin@synology.com> References: <20181102032402.19686-1-yuchenlin@synology.com> X-Synology-MCP-Status: no X-Synology-Spam-Flag: no X-Synology-Spam-Status: score=0, required 6, WHITELIST_FROM_ADDRESS 0 X-Synology-Virus-Status: no Subject: [PATCH v2 5/5] OvmfPkg: simply use the Bochs interface for vmsvga X-BeenThere: edk2-devel@lists.01.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: EDK II Development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Fri, 02 Nov 2018 03:24:21 -0000 From: yuchenlin BAR | std vga | vmsvga --------------------------------- 0 | Framebuffer | I/O space 1 | Reserved | Framebuffer 2 | MMIO | FIFO Because of the PCI BARs difference between std vga and vmsvga, we can not simply recognize the "QEMU VMWare SVGA" as the QEMU_VIDEO_BOCHS_MMIO variant. Instead, we remain variant QEMU_VIDEO_VMWARE_SVGA, and use it for: (1) Get framebuffer from correct PCI BAR (2) Prevent using BAR2 for MMIO Contributed-under: TianoCore Contribution Agreement 1.1 Signed-off-by: yuchenlin --- OvmfPkg/QemuVideoDxe/Driver.c | 18 ++++++++++++++++-- OvmfPkg/QemuVideoDxe/Gop.c | 3 ++- OvmfPkg/QemuVideoDxe/Qemu.h | 2 ++ 3 files changed, 20 insertions(+), 3 deletions(-) diff --git a/OvmfPkg/QemuVideoDxe/Driver.c b/OvmfPkg/QemuVideoDxe/Driver.c index 2304afd1e6..76d4a2d27e 100644 --- a/OvmfPkg/QemuVideoDxe/Driver.c +++ b/OvmfPkg/QemuVideoDxe/Driver.c @@ -69,6 +69,12 @@ QEMU_VIDEO_CARD gQemuVideoCardList[] = { 0x1050, QEMU_VIDEO_BOCHS_MMIO, L"QEMU VirtIO VGA" + },{ + PCI_CLASS_DISPLAY_VGA, + 0x15ad, + 0x0405, + QEMU_VIDEO_VMWARE_SVGA, + L"QEMU VMWare SVGA" },{ 0 /* end of list */ } @@ -256,6 +262,12 @@ QemuVideoControllerDriverStart ( goto ClosePciIo; } Private->Variant = Card->Variant; + if (Private->Variant == QEMU_VIDEO_VMWARE_SVGA) { + Private->FrameBufferVramBarIndex = PCI_BAR_IDX1; + } else { + Private->FrameBufferVramBarIndex = PCI_BAR_IDX0; + } + // // IsQxl is based on the detected Card->Variant, which at a later point might @@ -320,7 +332,8 @@ QemuVideoControllerDriverStart ( // Check if accessing the bochs interface works. // if (Private->Variant == QEMU_VIDEO_BOCHS_MMIO || - Private->Variant == QEMU_VIDEO_BOCHS) { + Private->Variant == QEMU_VIDEO_BOCHS || + Private->Variant == QEMU_VIDEO_VMWARE_SVGA) { UINT16 BochsId; BochsId = BochsRead(Private, VBE_DISPI_INDEX_ID); if ((BochsId & 0xFFF0) != VBE_DISPI_ID0) { @@ -383,6 +396,7 @@ QemuVideoControllerDriverStart ( break; case QEMU_VIDEO_BOCHS_MMIO: case QEMU_VIDEO_BOCHS: + case QEMU_VIDEO_VMWARE_SVGA: Status = QemuVideoBochsModeSetup (Private, IsQxl); break; default: @@ -764,7 +778,7 @@ ClearScreen ( Private->PciIo->Mem.Write ( Private->PciIo, EfiPciIoWidthFillUint32, - 0, + Private->FrameBufferVramBarIndex, 0, 0x400000 >> 2, &Color diff --git a/OvmfPkg/QemuVideoDxe/Gop.c b/OvmfPkg/QemuVideoDxe/Gop.c index d490fa7a2e..3abc5eeb36 100644 --- a/OvmfPkg/QemuVideoDxe/Gop.c +++ b/OvmfPkg/QemuVideoDxe/Gop.c @@ -60,7 +60,7 @@ QemuVideoCompleteModeData ( Private->PciIo->GetBarAttributes ( Private->PciIo, - 0, + Private->FrameBufferVramBarIndex, NULL, (VOID**) &FrameBufDesc ); @@ -177,6 +177,7 @@ Routine Description: break; case QEMU_VIDEO_BOCHS_MMIO: case QEMU_VIDEO_BOCHS: + case QEMU_VIDEO_VMWARE_SVGA: InitializeBochsGraphicsMode (Private, &QemuVideoBochsModes[ModeData->InternalModeIndex]); break; default: diff --git a/OvmfPkg/QemuVideoDxe/Qemu.h b/OvmfPkg/QemuVideoDxe/Qemu.h index d7da761705..3aac9eeca6 100644 --- a/OvmfPkg/QemuVideoDxe/Qemu.h +++ b/OvmfPkg/QemuVideoDxe/Qemu.h @@ -92,6 +92,7 @@ typedef enum { QEMU_VIDEO_CIRRUS_5446, QEMU_VIDEO_BOCHS, QEMU_VIDEO_BOCHS_MMIO, + QEMU_VIDEO_VMWARE_SVGA, } QEMU_VIDEO_VARIANT; typedef struct { @@ -120,6 +121,7 @@ typedef struct { QEMU_VIDEO_VARIANT Variant; FRAME_BUFFER_CONFIGURE *FrameBufferBltConfigure; UINTN FrameBufferBltConfigureSize; + UINT8 FrameBufferVramBarIndex; } QEMU_VIDEO_PRIVATE_DATA; /// -- 2.18.0