public inbox for qemu-devel@nongnu.org
 help / color / mirror / Atom feed
* [PATCH v4 0/6] ati-vga fixes
@ 2026-03-18  1:35 BALATON Zoltan
  2026-03-18  1:35 ` [PATCH v4 1/6] ati-vga: Fix colors when frame buffer endianness does not match host BALATON Zoltan
                   ` (5 more replies)
  0 siblings, 6 replies; 13+ messages in thread
From: BALATON Zoltan @ 2026-03-18  1:35 UTC (permalink / raw)
  To: qemu-devel
  Cc: Gerd Hoffmann, marcandre.lureau, Chad Jablonski,
	Philippe Mathieu-Daudé

v4:
- compile fix in patch 5
- new patch 6 to work around fuloong2e issue:
https://lists.nongnu.org/archive/html/qemu-devel/2026-01/msg06308.html
v3:
- fix patch 1 to work with 8 and 16 bit modes too
- new patch 5 to fix display updates with 8 and 16 bit modes
v2:
- fix patch 4 to really avoid warnings

These are some fixes to ati-vga for 11.0.

Patch 1 fixes problem reported in
https://lists.nongnu.org/archive/html/qemu-ppc/2026-01/msg00105.html

Patch 2 fixes output from Solaris install iso
Rendering still not always correct as it uses some unimplemented
features but it's now readable. I did not test full install though.

Patch 3 fixes vram overrun errors seen with Solaris and MorphOS when
crtc offset is non-zero (this happens on MorphOS when additional
screen is opened)

Patch 4 tries to avoid Coverity warning matching what other places
already do

Patch 5 fixes dirty region tracking when guest display depth is not
the same as the host's

Patch 6 adds work around for fuloong2e to keep working with partial
machine model

BALATON Zoltan (6):
  ati-vga: Fix colors when frame buffer endianness does not match host
  ati-vga: Also switch mode on HW cursor enable bit change
  ati-vga: Do not add crtc offset to src and dst data address
  ati-vga: Avoid warnings about sign extension
  ati-vga: Fix display updates in non-32 bit modes
  ati-vga: Add work around for fuloong2e

 hw/display/ati.c     | 26 ++++++++++++++++--------
 hw/display/ati_2d.c  | 47 ++++++++++++++++++++++++++++++--------------
 hw/display/ati_int.h |  1 +
 hw/mips/fuloong2e.c  |  1 +
 4 files changed, 52 insertions(+), 23 deletions(-)

-- 
2.41.3



^ permalink raw reply	[flat|nested] 13+ messages in thread

* [PATCH v4 1/6] ati-vga: Fix colors when frame buffer endianness does not match host
  2026-03-18  1:35 [PATCH v4 0/6] ati-vga fixes BALATON Zoltan
@ 2026-03-18  1:35 ` BALATON Zoltan
  2026-03-18 17:28   ` Chad Jablonski
  2026-03-18  1:35 ` [PATCH v4 2/6] ati-vga: Also switch mode on HW cursor enable bit change BALATON Zoltan
                   ` (4 subsequent siblings)
  5 siblings, 1 reply; 13+ messages in thread
From: BALATON Zoltan @ 2026-03-18  1:35 UTC (permalink / raw)
  To: qemu-devel
  Cc: Gerd Hoffmann, marcandre.lureau, Chad Jablonski,
	Philippe Mathieu-Daudé

When writing pixels we have to take into account if the frame buffer
endianness matches the host endianness or we need to swap to correct
endianness. This caused wrong colors e.g. with PPC Linux guest that
uses big endian frame buffer when running on little endian host.

Signed-off-by: BALATON Zoltan <balaton@eik.bme.hu>
---
ROP3_BLACKNESS, ROP3_WHITENESS is probably still broken with <24 bit
modes but I don't know anything that uses it so I leave it for now
because I'm not sure which palette entries should that use in 15/16
bit modes so I'm not trying to fix that without a test case

 hw/display/ati_2d.c | 40 +++++++++++++++++++++++++++++-----------
 1 file changed, 29 insertions(+), 11 deletions(-)

diff --git a/hw/display/ati_2d.c b/hw/display/ati_2d.c
index 37fe6c17ee..0cbbdc33f4 100644
--- a/hw/display/ati_2d.c
+++ b/hw/display/ati_2d.c
@@ -50,6 +50,7 @@ typedef struct {
     bool host_data_active;
     bool left_to_right;
     bool top_to_bottom;
+    bool need_swap;
     uint32_t frgd_clr;
     const uint8_t *palette;
     const uint8_t *vram_end;
@@ -89,6 +90,7 @@ static void setup_2d_blt_ctx(const ATIVGAState *s, ATI2DCtx *ctx)
     ctx->host_data_active = s->host_data.active;
     ctx->left_to_right = s->regs.dp_cntl & DST_X_LEFT_TO_RIGHT;
     ctx->top_to_bottom = s->regs.dp_cntl & DST_Y_TOP_TO_BOTTOM;
+    ctx->need_swap = HOST_BIG_ENDIAN != s->vga.big_endian_fb ? true : false;
     ctx->frgd_clr = s->regs.dp_brush_frgd_clr;
     ctx->palette = s->vga.palette;
     ctx->dst_offset = s->regs.dst_offset;
@@ -131,6 +133,17 @@ static void setup_2d_blt_ctx(const ATIVGAState *s, ATI2DCtx *ctx)
             (ctx->top_to_bottom ? 'v' : '^'));
 }
 
+static uint32_t make_filler(int bpp, uint32_t color)
+{
+    if (bpp < 24) {
+        color |= color << 16;
+        if (bpp < 15) {
+            color |= color << 8;
+        }
+    }
+    return color;
+}
+
 static bool ati_2d_do_blt(ATI2DCtx *ctx, uint8_t use_pixman)
 {
     QemuRect vis_src, vis_dst;
@@ -255,7 +268,7 @@ static bool ati_2d_do_blt(ATI2DCtx *ctx, uint8_t use_pixman)
 
         switch (ctx->rop3) {
         case ROP3_PATCOPY:
-            filler = ctx->frgd_clr;
+            filler = make_filler(ctx->bpp, ctx->frgd_clr);
             break;
         case ROP3_BLACKNESS:
             filler = 0xffUL << 24 | rgb_to_pixel32(ctx->palette[0],
@@ -268,10 +281,12 @@ static bool ati_2d_do_blt(ATI2DCtx *ctx, uint8_t use_pixman)
                                                    ctx->palette[5]);
             break;
         }
-
         DPRINTF("pixman_fill(%p, %ld, %d, %d, %d, %d, %d, %x)\n",
                 ctx->dst_bits, ctx->dst_stride / sizeof(uint32_t), ctx->bpp,
                 vis_dst.x, vis_dst.y, vis_dst.width, vis_dst.height, filler);
+        if (ctx->need_swap) {
+            bswap32s(&filler);
+        }
 #ifdef CONFIG_PIXMAN
         if (!(use_pixman & BIT(0)) ||
             !pixman_fill((uint32_t *)ctx->dst_bits,
@@ -325,11 +340,8 @@ void ati_2d_blt(ATIVGAState *s)
 bool ati_host_data_flush(ATIVGAState *s)
 {
     ATI2DCtx ctx, chunk;
-    uint32_t fg = s->regs.dp_src_frgd_clr;
-    uint32_t bg = s->regs.dp_src_bkgd_clr;
     unsigned bypp, pix_count, row, col, idx;
     uint8_t pix_buf[ATI_HOST_DATA_ACC_BITS * sizeof(uint32_t)];
-    uint32_t byte_pix_order = s->regs.dp_datatype & DP_BYTE_PIX_ORDER;
     uint32_t src_source = s->regs.dp_mix & DP_SRC_SOURCE;
     uint32_t src_datatype = s->regs.dp_datatype & DP_SRC_DATATYPE;
 
@@ -360,21 +372,27 @@ bool ati_host_data_flush(ATIVGAState *s)
     }
 
     bypp = ctx.bpp / 8;
-
+    pix_count = ATI_HOST_DATA_ACC_BITS;
     if (src_datatype == SRC_COLOR) {
-        pix_count = ATI_HOST_DATA_ACC_BITS / ctx.bpp;
-        memcpy(pix_buf, &s->host_data.acc[0], sizeof(s->host_data.acc));
+        pix_count /= ctx.bpp;
+        memcpy(pix_buf, s->host_data.acc, sizeof(s->host_data.acc));
     } else {
-        pix_count = ATI_HOST_DATA_ACC_BITS;
         /* Expand monochrome bits to color pixels */
+        uint32_t byte_pix_order = s->regs.dp_datatype & DP_BYTE_PIX_ORDER;
+        uint32_t fg = make_filler(ctx.bpp, s->regs.dp_src_frgd_clr);
+        uint32_t bg = make_filler(ctx.bpp, s->regs.dp_src_bkgd_clr);
+
+        if (ctx.need_swap) {
+            bswap32s(&fg);
+            bswap32s(&bg);
+        }
         idx = 0;
         for (int word = 0; word < 4; word++) {
             for (int byte = 0; byte < 4; byte++) {
                 uint8_t byte_val = s->host_data.acc[word] >> (byte * 8);
                 for (int i = 0; i < 8; i++) {
                     bool is_fg = byte_val & BIT(byte_pix_order ? i : 7 - i);
-                    uint32_t color = is_fg ? fg : bg;
-                    stn_he_p(&pix_buf[idx], bypp, color);
+                    stn_he_p(&pix_buf[idx], bypp, is_fg ? fg : bg);
                     idx += bypp;
                 }
             }
-- 
2.41.3



^ permalink raw reply related	[flat|nested] 13+ messages in thread

* [PATCH v4 2/6] ati-vga: Also switch mode on HW cursor enable bit change
  2026-03-18  1:35 [PATCH v4 0/6] ati-vga fixes BALATON Zoltan
  2026-03-18  1:35 ` [PATCH v4 1/6] ati-vga: Fix colors when frame buffer endianness does not match host BALATON Zoltan
@ 2026-03-18  1:35 ` BALATON Zoltan
  2026-03-18  1:35 ` [PATCH v4 3/6] ati-vga: Do not add crtc offset to src and dst data address BALATON Zoltan
                   ` (3 subsequent siblings)
  5 siblings, 0 replies; 13+ messages in thread
From: BALATON Zoltan @ 2026-03-18  1:35 UTC (permalink / raw)
  To: qemu-devel
  Cc: Gerd Hoffmann, marcandre.lureau, Chad Jablonski,
	Philippe Mathieu-Daudé

This does nothing for most drivers but works around issue and fixes
output with the Solaris R128 driver that only sets display parameters
after enabling CRT controller which we would miss otherwise.

Signed-off-by: BALATON Zoltan <balaton@eik.bme.hu>
Tested-by: Chad Jablonski <chad@jablonski.xyz>
Reviewed-by: Chad Jablonski <chad@jablonski.xyz>
---
 hw/display/ati.c | 1 +
 1 file changed, 1 insertion(+)

diff --git a/hw/display/ati.c b/hw/display/ati.c
index c165434938..8286f67c1c 100644
--- a/hw/display/ati.c
+++ b/hw/display/ati.c
@@ -632,6 +632,7 @@ static void ati_mm_write(void *opaque, hwaddr addr,
         ati_reg_write_offs(&s->regs.crtc_gen_cntl,
                            addr - CRTC_GEN_CNTL, data, size);
         if ((val & CRTC2_CUR_EN) != (s->regs.crtc_gen_cntl & CRTC2_CUR_EN)) {
+            ati_vga_switch_mode(s);
             if (s->cursor_guest_mode) {
                 s->vga.force_shadow = !!(s->regs.crtc_gen_cntl & CRTC2_CUR_EN);
             } else {
-- 
2.41.3



^ permalink raw reply related	[flat|nested] 13+ messages in thread

* [PATCH v4 3/6] ati-vga: Do not add crtc offset to src and dst data address
  2026-03-18  1:35 [PATCH v4 0/6] ati-vga fixes BALATON Zoltan
  2026-03-18  1:35 ` [PATCH v4 1/6] ati-vga: Fix colors when frame buffer endianness does not match host BALATON Zoltan
  2026-03-18  1:35 ` [PATCH v4 2/6] ati-vga: Also switch mode on HW cursor enable bit change BALATON Zoltan
@ 2026-03-18  1:35 ` BALATON Zoltan
  2026-03-19  2:28   ` Chad Jablonski
  2026-03-18  1:35 ` [PATCH v4 4/6] ati-vga: Avoid warnings about sign extension BALATON Zoltan
                   ` (2 subsequent siblings)
  5 siblings, 1 reply; 13+ messages in thread
From: BALATON Zoltan @ 2026-03-18  1:35 UTC (permalink / raw)
  To: qemu-devel
  Cc: Gerd Hoffmann, marcandre.lureau, Chad Jablonski,
	Philippe Mathieu-Daudé

Drivers seem to program these registers with values that already
include the crtc offset so this is not needed. This fixes blit outside
of vram errors with non-0 crtc offset.

Signed-off-by: BALATON Zoltan <balaton@eik.bme.hu>
---
 hw/display/ati_2d.c | 2 --
 1 file changed, 2 deletions(-)

diff --git a/hw/display/ati_2d.c b/hw/display/ati_2d.c
index 0cbbdc33f4..cf2d4a08e2 100644
--- a/hw/display/ati_2d.c
+++ b/hw/display/ati_2d.c
@@ -110,7 +110,6 @@ static void setup_2d_blt_ctx(const ATIVGAState *s, ATI2DCtx *ctx)
     ctx->dst_stride = s->regs.dst_pitch;
     ctx->dst_bits = s->vga.vram_ptr + s->regs.dst_offset;
     if (s->dev_id == PCI_DEVICE_ID_ATI_RAGE128_PF) {
-        ctx->dst_bits += s->regs.crtc_offset & 0x07ffffff;
         ctx->dst_stride *= ctx->bpp;
     }
 
@@ -121,7 +120,6 @@ static void setup_2d_blt_ctx(const ATIVGAState *s, ATI2DCtx *ctx)
     ctx->src_stride = s->regs.src_pitch;
     ctx->src_bits = s->vga.vram_ptr + s->regs.src_offset;
     if (s->dev_id == PCI_DEVICE_ID_ATI_RAGE128_PF) {
-        ctx->src_bits += s->regs.crtc_offset & 0x07ffffff;
         ctx->src_stride *= ctx->bpp;
     }
     DPRINTF("%d %d %d, %d %d %d, (%d,%d) -> (%d,%d) %dx%d %c %c\n",
-- 
2.41.3



^ permalink raw reply related	[flat|nested] 13+ messages in thread

* [PATCH v4 4/6] ati-vga: Avoid warnings about sign extension
  2026-03-18  1:35 [PATCH v4 0/6] ati-vga fixes BALATON Zoltan
                   ` (2 preceding siblings ...)
  2026-03-18  1:35 ` [PATCH v4 3/6] ati-vga: Do not add crtc offset to src and dst data address BALATON Zoltan
@ 2026-03-18  1:35 ` BALATON Zoltan
  2026-03-18  1:35 ` [PATCH v4 5/6] ati-vga: Fix display updates in non-32 bit modes BALATON Zoltan
  2026-03-18  1:35 ` [PATCH v4 6/6] ati-vga: Add work around for fuloong2e BALATON Zoltan
  5 siblings, 0 replies; 13+ messages in thread
From: BALATON Zoltan @ 2026-03-18  1:35 UTC (permalink / raw)
  To: qemu-devel
  Cc: Gerd Hoffmann, marcandre.lureau, Chad Jablonski,
	Philippe Mathieu-Daudé

Coverity reports several possible sign extension errors (latest is CID
1645615). These cannot happen because the values are limited when
writing the registers and only 32 bits of the return value matter but
change type of the variable storing the return value to uint32_t to
avoid these warnings. Also change DEFAULT_SC_BOTTOM_RIGHT register
read to match what other similar registers do for consistency.

Signed-off-by: BALATON Zoltan <balaton@eik.bme.hu>
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
---
 hw/display/ati.c | 8 ++++----
 1 file changed, 4 insertions(+), 4 deletions(-)

diff --git a/hw/display/ati.c b/hw/display/ati.c
index 8286f67c1c..705e4db6e4 100644
--- a/hw/display/ati.c
+++ b/hw/display/ati.c
@@ -266,7 +266,7 @@ static void ati_vga_vblank_irq(void *opaque)
     ati_vga_update_irq(s);
 }
 
-static inline uint64_t ati_reg_read_offs(uint32_t reg, int offs,
+static inline uint32_t ati_reg_read_offs(uint32_t reg, int offs,
                                          unsigned int size)
 {
     if (offs == 0 && size == 4) {
@@ -279,7 +279,7 @@ static inline uint64_t ati_reg_read_offs(uint32_t reg, int offs,
 static uint64_t ati_mm_read(void *opaque, hwaddr addr, unsigned int size)
 {
     ATIVGAState *s = opaque;
-    uint64_t val = 0;
+    uint32_t val = 0;
 
     switch (addr) {
     case MM_INDEX:
@@ -514,8 +514,8 @@ static uint64_t ati_mm_read(void *opaque, hwaddr addr, unsigned int size)
         val |= s->regs.default_tile << 16;
         break;
     case DEFAULT_SC_BOTTOM_RIGHT:
-        val = (s->regs.default_sc_bottom << 16) |
-              s->regs.default_sc_right;
+        val = s->regs.default_sc_right;
+        val |= s->regs.default_sc_bottom << 16;
         break;
     case SC_TOP:
         val = s->regs.sc_top;
-- 
2.41.3



^ permalink raw reply related	[flat|nested] 13+ messages in thread

* [PATCH v4 5/6] ati-vga: Fix display updates in non-32 bit modes
  2026-03-18  1:35 [PATCH v4 0/6] ati-vga fixes BALATON Zoltan
                   ` (3 preceding siblings ...)
  2026-03-18  1:35 ` [PATCH v4 4/6] ati-vga: Avoid warnings about sign extension BALATON Zoltan
@ 2026-03-18  1:35 ` BALATON Zoltan
  2026-03-19  2:35   ` Chad Jablonski
  2026-03-18  1:35 ` [PATCH v4 6/6] ati-vga: Add work around for fuloong2e BALATON Zoltan
  5 siblings, 1 reply; 13+ messages in thread
From: BALATON Zoltan @ 2026-03-18  1:35 UTC (permalink / raw)
  To: qemu-devel
  Cc: Gerd Hoffmann, marcandre.lureau, Chad Jablonski,
	Philippe Mathieu-Daudé

The memory_region_set_dirty used to mark changes should use stride
value in vram which is normally only the same as surface_stride in 32
bit modes. This caused missed updates in 8 and 16 bit modes.

Signed-off-by: BALATON Zoltan <balaton@eik.bme.hu>
---
 hw/display/ati_2d.c | 5 +++--
 1 file changed, 3 insertions(+), 2 deletions(-)

diff --git a/hw/display/ati_2d.c b/hw/display/ati_2d.c
index cf2d4a08e2..23527b2c50 100644
--- a/hw/display/ati_2d.c
+++ b/hw/display/ati_2d.c
@@ -70,6 +70,7 @@ static void ati_set_dirty(VGACommonState *vga, const ATI2DCtx *ctx)
 {
     DisplaySurface *ds = qemu_console_surface(vga->con);
 
+    (void)ds;
     DPRINTF("%p %u ds: %p %d %d rop: %x\n", vga->vram_ptr, vga->vbe_start_addr,
             surface_data(ds), surface_stride(ds), surface_bits_per_pixel(ds),
             ctx->rop3 >> 16);
@@ -78,8 +79,8 @@ static void ati_set_dirty(VGACommonState *vga, const ATI2DCtx *ctx)
         vga->vbe_regs[VBE_DISPI_INDEX_YRES] * vga->vbe_line_offset) {
         memory_region_set_dirty(&vga->vram,
                                 vga->vbe_start_addr + ctx->dst_offset +
-                                ctx->dst.y * surface_stride(ds),
-                                ctx->dst.height * surface_stride(ds));
+                                ctx->dst.y * ctx->dst_stride,
+                                ctx->dst.height * ctx->dst_stride);
     }
 }
 
-- 
2.41.3



^ permalink raw reply related	[flat|nested] 13+ messages in thread

* [PATCH v4 6/6] ati-vga: Add work around for fuloong2e
  2026-03-18  1:35 [PATCH v4 0/6] ati-vga fixes BALATON Zoltan
                   ` (4 preceding siblings ...)
  2026-03-18  1:35 ` [PATCH v4 5/6] ati-vga: Fix display updates in non-32 bit modes BALATON Zoltan
@ 2026-03-18  1:35 ` BALATON Zoltan
  2026-03-19  2:44   ` Chad Jablonski
  5 siblings, 1 reply; 13+ messages in thread
From: BALATON Zoltan @ 2026-03-18  1:35 UTC (permalink / raw)
  To: qemu-devel
  Cc: Gerd Hoffmann, marcandre.lureau, Chad Jablonski,
	Philippe Mathieu-Daudé

With the linear aperture size fixed to match real card fuloong2e no
longer works due to running out of PCI memory because only one PCI bus
is emulated on that machine. Add a property to allow fuloong2e to set
a smaller linear aperture size to work around that problem until the
machine model is improved.

Signed-off-by: BALATON Zoltan <balaton@eik.bme.hu>
---
 hw/display/ati.c     | 17 +++++++++++++----
 hw/display/ati_int.h |  1 +
 hw/mips/fuloong2e.c  |  1 +
 3 files changed, 15 insertions(+), 4 deletions(-)

diff --git a/hw/display/ati.c b/hw/display/ati.c
index 705e4db6e4..7621303d0a 100644
--- a/hw/display/ati.c
+++ b/hw/display/ati.c
@@ -1074,7 +1074,6 @@ static void ati_vga_realize(PCIDevice *dev, Error **errp)
     ATIVGAState *s = ATI_VGA(dev);
     VGACommonState *vga = &s->vga;
     I2CBus *i2cbus;
-    uint64_t aper_size;
 
 #ifndef CONFIG_PIXMAN
     if (s->use_pixman != 0) {
@@ -1138,10 +1137,19 @@ static void ati_vga_realize(PCIDevice *dev, Error **errp)
      * Rage128 the upper half of the aperture is reserved for an AGP
      * window (which we do not emulate.)
      */
-    aper_size = s->dev_id == PCI_DEVICE_ID_ATI_RAGE128_PF ?
-                ATI_RAGE128_LINEAR_APER_SIZE : ATI_R100_LINEAR_APER_SIZE;
+    if (!s->linear_aper_sz) {
+        if (s->dev_id == PCI_DEVICE_ID_ATI_RAGE128_PF) {
+            s->linear_aper_sz = ATI_RAGE128_LINEAR_APER_SIZE;
+        } else {
+            s->linear_aper_sz = ATI_R100_LINEAR_APER_SIZE;
+        }
+    }
+    if (s->linear_aper_sz < 16 * MiB) {
+        error_setg(errp, "x-linear-aper-size is too small (minimum 16 MiB");
+        return;
+    }
     memory_region_init(&s->linear_aper, OBJECT(dev), "ati-linear-aperture0",
-                       aper_size);
+                       s->linear_aper_sz);
     memory_region_add_subregion(&s->linear_aper, 0, &vga->vram);
 
     pci_register_bar(dev, 0, PCI_BASE_ADDRESS_MEM_PREFETCH, &s->linear_aper);
@@ -1186,6 +1194,7 @@ static const Property ati_vga_properties[] = {
     DEFINE_PROP_BOOL("guest_hwcursor", ATIVGAState, cursor_guest_mode, false),
     /* this is a debug option, prefer PROP_UINT over PROP_BIT for simplicity */
     DEFINE_PROP_UINT8("x-pixman", ATIVGAState, use_pixman, DEFAULT_X_PIXMAN),
+    DEFINE_PROP_UINT64("x-linear-aper-size", ATIVGAState, linear_aper_sz, 0),
     DEFINE_EDID_PROPERTIES(ATIVGAState, i2cddc.edid_info),
 };
 
diff --git a/hw/display/ati_int.h b/hw/display/ati_int.h
index 21b74511e0..0c48934d33 100644
--- a/hw/display/ati_int.h
+++ b/hw/display/ati_int.h
@@ -119,6 +119,7 @@ struct ATIVGAState {
     QEMUTimer vblank_timer;
     bitbang_i2c_interface bbi2c;
     I2CDDCState i2cddc;
+    uint64_t linear_aper_sz;
     MemoryRegion linear_aper;
     MemoryRegion io;
     MemoryRegion mm;
diff --git a/hw/mips/fuloong2e.c b/hw/mips/fuloong2e.c
index d0efe36f7c..72ad4507df 100644
--- a/hw/mips/fuloong2e.c
+++ b/hw/mips/fuloong2e.c
@@ -316,6 +316,7 @@ static void mips_fuloong2e_init(MachineState *machine)
         dev = DEVICE(pci_dev);
         qdev_prop_set_uint32(dev, "vgamem_mb", 16);
         qdev_prop_set_uint16(dev, "x-device-id", 0x5159);
+        qdev_prop_set_uint64(dev, "x-linear-aper-size", 16 * MiB);
         pci_realize_and_unref(pci_dev, pci_bus, &error_fatal);
     }
 
-- 
2.41.3



^ permalink raw reply related	[flat|nested] 13+ messages in thread

* Re: [PATCH v4 1/6] ati-vga: Fix colors when frame buffer endianness does not match host
  2026-03-18  1:35 ` [PATCH v4 1/6] ati-vga: Fix colors when frame buffer endianness does not match host BALATON Zoltan
@ 2026-03-18 17:28   ` Chad Jablonski
  2026-03-18 19:50     ` BALATON Zoltan
  0 siblings, 1 reply; 13+ messages in thread
From: Chad Jablonski @ 2026-03-18 17:28 UTC (permalink / raw)
  To: BALATON Zoltan, qemu-devel
  Cc: Gerd Hoffmann, marcandre.lureau, Chad Jablonski,
	Philippe Mathieu-Daudé

>  
> +static uint32_t make_filler(int bpp, uint32_t color)
> +{
> +    if (bpp < 24) {
> +        color |= color << 16;
> +        if (bpp < 15) {
> +            color |= color << 8;
> +        }
> +    }
> +    return color;
> +}
> +

Does this assume that the upper bits of color are zeroed when bpp < 24? Is that
a safe assumption or could those bits be garbage?


^ permalink raw reply	[flat|nested] 13+ messages in thread

* Re: [PATCH v4 1/6] ati-vga: Fix colors when frame buffer endianness does not match host
  2026-03-18 17:28   ` Chad Jablonski
@ 2026-03-18 19:50     ` BALATON Zoltan
  2026-03-19  2:24       ` Chad Jablonski
  0 siblings, 1 reply; 13+ messages in thread
From: BALATON Zoltan @ 2026-03-18 19:50 UTC (permalink / raw)
  To: Chad Jablonski
  Cc: qemu-devel, Gerd Hoffmann, marcandre.lureau,
	Philippe Mathieu-Daudé

On Wed, 18 Mar 2026, Chad Jablonski wrote:
>> +static uint32_t make_filler(int bpp, uint32_t color)
>> +{
>> +    if (bpp < 24) {
>> +        color |= color << 16;
>> +        if (bpp < 15) {
>> +            color |= color << 8;
>> +        }
>> +    }
>> +    return color;
>> +}
>> +
>
> Does this assume that the upper bits of color are zeroed when bpp < 24? Is that
> a safe assumption or could those bits be garbage?

I think to be a valid <24 bit color the upper bits should be 0 here. In 
practice this is called with register values where we only support 32 bit 
writes so the only way to get garbage there if the guest does a 32 bit 
write with garbage bits. (I.e. it can't do an 8 or 16 bit write and leave 
garbage in upper bits from earier value.) It seems unlikely that a guest 
doing 32 bit write would leave garbage in upper bits and if this could 
happen it's better to take care of that at register write not here so I'd 
assume color is some valid color for the bpp and the caller should make 
sure if needed. This function just expands that to 32 bits so we don't 
have to care about other sizes later.

Regards,
BALATON Zoltan


^ permalink raw reply	[flat|nested] 13+ messages in thread

* Re: [PATCH v4 1/6] ati-vga: Fix colors when frame buffer endianness does not match host
  2026-03-18 19:50     ` BALATON Zoltan
@ 2026-03-19  2:24       ` Chad Jablonski
  0 siblings, 0 replies; 13+ messages in thread
From: Chad Jablonski @ 2026-03-19  2:24 UTC (permalink / raw)
  To: BALATON Zoltan, Chad Jablonski
  Cc: qemu-devel, Gerd Hoffmann, marcandre.lureau,
	Philippe Mathieu-Daudé

>
> I think to be a valid <24 bit color the upper bits should be 0 here. In 
> practice this is called with register values where we only support 32 bit 
> writes so the only way to get garbage there if the guest does a 32 bit 
> write with garbage bits. (I.e. it can't do an 8 or 16 bit write and leave 
> garbage in upper bits from earier value.) It seems unlikely that a guest 
> doing 32 bit write would leave garbage in upper bits and if this could 
> happen it's better to take care of that at register write not here so I'd 
> assume color is some valid color for the bpp and the caller should make 
> sure if needed. This function just expands that to 32 bits so we don't 
> have to care about other sizes later.
>

Makes sense, thanks. Tested again with 8, 16, and 32-bit XOrg modes and
all display a gray background in fluxbox now.

Tested-by: Chad Jablonski <chad@jablonski.xyz>
Reviewed-by: Chad Jablonski <chad@jablonski.xyz>


^ permalink raw reply	[flat|nested] 13+ messages in thread

* Re: [PATCH v4 3/6] ati-vga: Do not add crtc offset to src and dst data address
  2026-03-18  1:35 ` [PATCH v4 3/6] ati-vga: Do not add crtc offset to src and dst data address BALATON Zoltan
@ 2026-03-19  2:28   ` Chad Jablonski
  0 siblings, 0 replies; 13+ messages in thread
From: Chad Jablonski @ 2026-03-19  2:28 UTC (permalink / raw)
  To: BALATON Zoltan, qemu-devel
  Cc: Gerd Hoffmann, marcandre.lureau, Chad Jablonski,
	Philippe Mathieu-Daudé

Reviewed-by: Chad Jablonski <chad@jablonski.xyz>


^ permalink raw reply	[flat|nested] 13+ messages in thread

* Re: [PATCH v4 5/6] ati-vga: Fix display updates in non-32 bit modes
  2026-03-18  1:35 ` [PATCH v4 5/6] ati-vga: Fix display updates in non-32 bit modes BALATON Zoltan
@ 2026-03-19  2:35   ` Chad Jablonski
  0 siblings, 0 replies; 13+ messages in thread
From: Chad Jablonski @ 2026-03-19  2:35 UTC (permalink / raw)
  To: BALATON Zoltan, qemu-devel
  Cc: Gerd Hoffmann, marcandre.lureau, Chad Jablonski,
	Philippe Mathieu-Daudé

Reviewed-by: Chad Jablonski <chad@jablonski.xyz>


^ permalink raw reply	[flat|nested] 13+ messages in thread

* Re: [PATCH v4 6/6] ati-vga: Add work around for fuloong2e
  2026-03-18  1:35 ` [PATCH v4 6/6] ati-vga: Add work around for fuloong2e BALATON Zoltan
@ 2026-03-19  2:44   ` Chad Jablonski
  0 siblings, 0 replies; 13+ messages in thread
From: Chad Jablonski @ 2026-03-19  2:44 UTC (permalink / raw)
  To: BALATON Zoltan, qemu-devel
  Cc: Gerd Hoffmann, marcandre.lureau, Chad Jablonski,
	Philippe Mathieu-Daudé

> +    if (s->linear_aper_sz < 16 * MiB) {
> +        error_setg(errp, "x-linear-aper-size is too small (minimum 16 MiB");
> +        return;
> +    }

Small typo here missing the closing ")" in the error message. But
otherwise:

Reviewed-by: Chad Jablonski <chad@jablonski.xyz>


^ permalink raw reply	[flat|nested] 13+ messages in thread

end of thread, other threads:[~2026-03-19  2:45 UTC | newest]

Thread overview: 13+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2026-03-18  1:35 [PATCH v4 0/6] ati-vga fixes BALATON Zoltan
2026-03-18  1:35 ` [PATCH v4 1/6] ati-vga: Fix colors when frame buffer endianness does not match host BALATON Zoltan
2026-03-18 17:28   ` Chad Jablonski
2026-03-18 19:50     ` BALATON Zoltan
2026-03-19  2:24       ` Chad Jablonski
2026-03-18  1:35 ` [PATCH v4 2/6] ati-vga: Also switch mode on HW cursor enable bit change BALATON Zoltan
2026-03-18  1:35 ` [PATCH v4 3/6] ati-vga: Do not add crtc offset to src and dst data address BALATON Zoltan
2026-03-19  2:28   ` Chad Jablonski
2026-03-18  1:35 ` [PATCH v4 4/6] ati-vga: Avoid warnings about sign extension BALATON Zoltan
2026-03-18  1:35 ` [PATCH v4 5/6] ati-vga: Fix display updates in non-32 bit modes BALATON Zoltan
2026-03-19  2:35   ` Chad Jablonski
2026-03-18  1:35 ` [PATCH v4 6/6] ati-vga: Add work around for fuloong2e BALATON Zoltan
2026-03-19  2:44   ` Chad Jablonski

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox