* [PATCH v3 1/1] OvmfPkg/QemuVideoDxe: fix bochs mode init
@ 2022-09-07 9:15 Gerd Hoffmann
2022-09-07 9:44 ` Ard Biesheuvel
2022-09-07 9:54 ` Gerd Hoffmann
0 siblings, 2 replies; 3+ messages in thread
From: Gerd Hoffmann @ 2022-09-07 9:15 UTC (permalink / raw)
To: devel
Cc: Oliver Steffen, Pawel Polawski, Jiewen Yao, Ard Biesheuvel,
Jordan Justen, Gerd Hoffmann
Add VgaInb() helper function to read vga registers. With that in place
fix the unblanking. We need to put the ATT_ADDRESS_REGISTER flip flop
into a known state, which is done by reading the
INPUT_STATUS_1_REGISTER. Reading the INPUT_STATUS_1_REGISTER only works
when the device is in color mode, so make sure that bit (0x01) is set in
MISC_OUTPUT_REGISTER.
Currently the mode setting works more by luck because
ATT_ADDRESS_REGISTER flip flop happens to be in the state we need.
Signed-off-by: Gerd Hoffmann <kraxel@redhat.com>
---
OvmfPkg/QemuVideoDxe/Driver.c | 33 ++++++++++++++++++++++++++++++++-
1 file changed, 32 insertions(+), 1 deletion(-)
diff --git a/OvmfPkg/QemuVideoDxe/Driver.c b/OvmfPkg/QemuVideoDxe/Driver.c
index b91909a14e59..1f9ba046ef04 100644
--- a/OvmfPkg/QemuVideoDxe/Driver.c
+++ b/OvmfPkg/QemuVideoDxe/Driver.c
@@ -984,6 +984,33 @@ VgaOutb (
}
}
+UINT8
+VgaInb (
+ QEMU_VIDEO_PRIVATE_DATA *Private,
+ UINTN Reg
+ )
+{
+ EFI_STATUS Status;
+ UINT8 Data;
+
+ if (Private->Variant == QEMU_VIDEO_BOCHS_MMIO) {
+ Data = 0;
+ Status = Private->PciIo->Mem.Read (
+ Private->PciIo,
+ EfiPciIoWidthUint8,
+ PCI_BAR_IDX2,
+ 0x400 - 0x3c0 + Reg,
+ 1,
+ &Data
+ );
+ ASSERT_EFI_ERROR (Status);
+ } else {
+ Data = inb (Private, Reg);
+ }
+
+ return Data;
+}
+
VOID
InitializeBochsGraphicsMode (
QEMU_VIDEO_PRIVATE_DATA *Private,
@@ -998,7 +1025,11 @@ InitializeBochsGraphicsMode (
ModeData->ColorDepth
));
- /* unblank */
+ /* set color mode */
+ VgaOutb (Private, MISC_OUTPUT_REGISTER, 0x01);
+
+ /* reset flip flop + unblank */
+ VgaInb (Private, INPUT_STATUS_1_REGISTER);
VgaOutb (Private, ATT_ADDRESS_REGISTER, 0x20);
BochsWrite (Private, VBE_DISPI_INDEX_ENABLE, 0);
--
2.37.3
^ permalink raw reply related [flat|nested] 3+ messages in thread
* Re: [PATCH v3 1/1] OvmfPkg/QemuVideoDxe: fix bochs mode init
2022-09-07 9:15 [PATCH v3 1/1] OvmfPkg/QemuVideoDxe: fix bochs mode init Gerd Hoffmann
@ 2022-09-07 9:44 ` Ard Biesheuvel
2022-09-07 9:54 ` Gerd Hoffmann
1 sibling, 0 replies; 3+ messages in thread
From: Ard Biesheuvel @ 2022-09-07 9:44 UTC (permalink / raw)
To: Gerd Hoffmann
Cc: devel, Oliver Steffen, Pawel Polawski, Jiewen Yao, Jordan Justen
On Wed, 7 Sept 2022 at 11:15, Gerd Hoffmann <kraxel@redhat.com> wrote:
>
> Add VgaInb() helper function to read vga registers. With that in place
> fix the unblanking. We need to put the ATT_ADDRESS_REGISTER flip flop
> into a known state, which is done by reading the
> INPUT_STATUS_1_REGISTER. Reading the INPUT_STATUS_1_REGISTER only works
> when the device is in color mode, so make sure that bit (0x01) is set in
> MISC_OUTPUT_REGISTER.
>
> Currently the mode setting works more by luck because
> ATT_ADDRESS_REGISTER flip flop happens to be in the state we need.
>
> Signed-off-by: Gerd Hoffmann <kraxel@redhat.com>
Merged as #3310
Thanks,
> ---
> OvmfPkg/QemuVideoDxe/Driver.c | 33 ++++++++++++++++++++++++++++++++-
> 1 file changed, 32 insertions(+), 1 deletion(-)
>
> diff --git a/OvmfPkg/QemuVideoDxe/Driver.c b/OvmfPkg/QemuVideoDxe/Driver.c
> index b91909a14e59..1f9ba046ef04 100644
> --- a/OvmfPkg/QemuVideoDxe/Driver.c
> +++ b/OvmfPkg/QemuVideoDxe/Driver.c
> @@ -984,6 +984,33 @@ VgaOutb (
> }
> }
>
> +UINT8
> +VgaInb (
> + QEMU_VIDEO_PRIVATE_DATA *Private,
> + UINTN Reg
> + )
> +{
> + EFI_STATUS Status;
> + UINT8 Data;
> +
> + if (Private->Variant == QEMU_VIDEO_BOCHS_MMIO) {
> + Data = 0;
> + Status = Private->PciIo->Mem.Read (
> + Private->PciIo,
> + EfiPciIoWidthUint8,
> + PCI_BAR_IDX2,
> + 0x400 - 0x3c0 + Reg,
> + 1,
> + &Data
> + );
> + ASSERT_EFI_ERROR (Status);
> + } else {
> + Data = inb (Private, Reg);
> + }
> +
> + return Data;
> +}
> +
> VOID
> InitializeBochsGraphicsMode (
> QEMU_VIDEO_PRIVATE_DATA *Private,
> @@ -998,7 +1025,11 @@ InitializeBochsGraphicsMode (
> ModeData->ColorDepth
> ));
>
> - /* unblank */
> + /* set color mode */
> + VgaOutb (Private, MISC_OUTPUT_REGISTER, 0x01);
> +
> + /* reset flip flop + unblank */
> + VgaInb (Private, INPUT_STATUS_1_REGISTER);
> VgaOutb (Private, ATT_ADDRESS_REGISTER, 0x20);
>
> BochsWrite (Private, VBE_DISPI_INDEX_ENABLE, 0);
> --
> 2.37.3
>
^ permalink raw reply [flat|nested] 3+ messages in thread
* Re: [PATCH v3 1/1] OvmfPkg/QemuVideoDxe: fix bochs mode init
2022-09-07 9:15 [PATCH v3 1/1] OvmfPkg/QemuVideoDxe: fix bochs mode init Gerd Hoffmann
2022-09-07 9:44 ` Ard Biesheuvel
@ 2022-09-07 9:54 ` Gerd Hoffmann
1 sibling, 0 replies; 3+ messages in thread
From: Gerd Hoffmann @ 2022-09-07 9:54 UTC (permalink / raw)
To: devel
Cc: Oliver Steffen, Pawel Polawski, Jiewen Yao, Ard Biesheuvel,
Jordan Justen
On Wed, Sep 07, 2022 at 11:15:04AM +0200, Gerd Hoffmann wrote:
> Add VgaInb() helper function to read vga registers. With that in place
> fix the unblanking. We need to put the ATT_ADDRESS_REGISTER flip flop
> into a known state, which is done by reading the
> INPUT_STATUS_1_REGISTER. Reading the INPUT_STATUS_1_REGISTER only works
> when the device is in color mode, so make sure that bit (0x01) is set in
> MISC_OUTPUT_REGISTER.
>
> Currently the mode setting works more by luck because
> ATT_ADDRESS_REGISTER flip flop happens to be in the state we need.
The 'patch is small and simple enough that I can skip CI' plan didn't
went so well for v1+2, so: https://github.com/tianocore/edk2/pull/3311
take care,
Gerd
^ permalink raw reply [flat|nested] 3+ messages in thread
end of thread, other threads:[~2022-09-07 9:54 UTC | newest]
Thread overview: 3+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2022-09-07 9:15 [PATCH v3 1/1] OvmfPkg/QemuVideoDxe: fix bochs mode init Gerd Hoffmann
2022-09-07 9:44 ` Ard Biesheuvel
2022-09-07 9:54 ` Gerd Hoffmann
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox