[PATCH xf86-video-vesa 2/4] Fall back to VGA if the palette API isn't supported

Dave Airlie airlied at gmail.com
Wed Jan 31 20:48:17 UTC 2018


On 1 February 2018 at 01:48, Adam Jackson <ajax at redhat.com> wrote:
> I ported vesa to use the VBE service back in:
>
>     commit 55f585a15f42ffe028ff37ea1f63543795dbf56e
>     Author: Adam Jackson <ajax at redhat.com>
>     Date:   Fri Sep 18 17:02:16 2009 -0400
>
>         Use VBE palette load, not VGA banging.
>
> I'm reasonably sure that worked on all the hardware I had handy at the
> time. But it doesn't work in seabios, which means 8bpp is broken under
> qemu.
>
> We query this API early in initialization, and if it fails ->savedPal
> will be NULL, so use that as the hint to fall back to VGA banging.
>
> Signed-off-by: Adam Jackson <ajax at redhat.com>

I can confirm I dug in seabios as well.

Reviewed-by: Dave Airlie <airlied at redhat.com>

> ---
>  src/vesa.c | 21 +++++++++++++++++++++
>  1 file changed, 21 insertions(+)
>
> diff --git a/src/vesa.c b/src/vesa.c
> index cbf6773..3f5b81c 100644
> --- a/src/vesa.c
> +++ b/src/vesa.c
> @@ -1356,6 +1356,27 @@ VESALoadPalette(ScrnInfoPtr pScrn, int numColors, int *indices,
>      int i, idx;
>      int base;
>
> +    if (!pVesa->savedPal) {
> +#define VESADACDelay()                                                        \
> +       do {                                                                   \
> +          (void)inb(pVesa->ioBase + VGA_IOBASE_COLOR + VGA_IN_STAT_1_OFFSET); \
> +          (void)inb(pVesa->ioBase + VGA_IOBASE_COLOR + VGA_IN_STAT_1_OFFSET); \
> +       } while (0)
> +
> +       for (i = 0; i < numColors; i++) {
> +          idx = indices[i];
> +          outb(pVesa->ioBase + VGA_DAC_WRITE_ADDR, idx);
> +          VESADACDelay();
> +          outb(pVesa->ioBase + VGA_DAC_DATA, colors[idx].red);
> +          VESADACDelay();
> +          outb(pVesa->ioBase + VGA_DAC_DATA, colors[idx].green);
> +          VESADACDelay();
> +          outb(pVesa->ioBase + VGA_DAC_DATA, colors[idx].blue);
> +          VESADACDelay();
> +       }
> +       return;
> +    }
> +
>      if (pVesa->pal == NULL)
>         pVesa->pal = calloc(1, sizeof(CARD32) * 256);
>
> --
> 2.14.3
>
> _______________________________________________
> xorg-devel at lists.x.org: X.Org development
> Archives: http://lists.x.org/archives/xorg-devel
> Info: https://lists.x.org/mailman/listinfo/xorg-devel


More information about the xorg-devel mailing list