Philippe Mathieu-Daudé <f4...@amsat.org> writes: > +Sven > > On 12/1/22 22:07, Helge Deller wrote: >> This patch fixes two problems which prevented Linux to access the >> artist graphics framebuffer: >> The check if the framebuffer or the color map should be accessed was >> incomplete. By using the vram_read/write_bufidx() functions we now check >> correctly if ARTIST_BUFFER_CMAP should be accessed. >> The second fix is to correctly calculate the X- and Y-coordinates >> and >> check against the graphics resolution. >> With this fix in place, the Linux stifb driver now works correctly, >> shows the penguins at bootup and uses the stifb as graphics console. > > Cool, could you add a test similar to these? > > $ git grep Tux tests/avocado/ > tests/avocado/machine_arm_integratorcp.py:69: Boot Linux and > verify the Tux logo is displayed on the framebuffer. > tests/avocado/machine_mips_malta.py:44: Boot Linux kernel and > check Tux logo is displayed on the framebuffer. > >> I haven't seen any negative side effects when running HP-UX.
Hmm, the patch below breaks hp-ux 10.20 for me, please see the attached screenshot.
>> Signed-off-by: Helge Deller <del...@gmx.de> >> Cc: qemu-sta...@nongnu.org >> --- >> hw/display/artist.c | 16 ++++++++-------- >> 1 file changed, 8 insertions(+), 8 deletions(-) >> diff --git a/hw/display/artist.c b/hw/display/artist.c >> index 6384076c60..fbf5525334 100644 >> --- a/hw/display/artist.c >> +++ b/hw/display/artist.c >> @@ -1186,7 +1186,7 @@ static void artist_vram_write(void *opaque, hwaddr >> addr, uint64_t val, >> unsigned int offset; >> trace_artist_vram_write(size, addr, val); >> - if (s->cmap_bm_access) { >> + if (vram_write_bufidx(s) == ARTIST_BUFFER_CMAP) { >> buf = &s->vram_buffer[ARTIST_BUFFER_CMAP]; >> if (addr + 3 < buf->size) { >> *(uint32_t *)(buf->data + addr) = val; >> @@ -1195,14 +1195,14 @@ static void artist_vram_write(void *opaque, hwaddr >> addr, uint64_t val, >> } >> buf = vram_write_buffer(s); >> - posy = ADDR_TO_Y(addr >> 2); >> - posx = ADDR_TO_X(addr >> 2); >> + posy = ADDR_TO_Y(addr); >> + posx = ADDR_TO_X(addr); >> if (!buf->size) { >> return; >> } >> - if (posy > buf->height || posx > buf->width) { >> + if (posy >= buf->height || posx >= buf->width) { >> return; >> } >> @@ -1242,7 +1242,7 @@ static uint64_t artist_vram_read(void *opaque, >> hwaddr addr, unsigned size) >> uint64_t val; >> unsigned int posy, posx; >> - if (s->cmap_bm_access) { >> + if (vram_read_bufidx(s) == ARTIST_BUFFER_CMAP) { >> buf = &s->vram_buffer[ARTIST_BUFFER_CMAP]; >> val = 0; >> if (addr < buf->size && addr + 3 < buf->size) { >> @@ -1257,10 +1257,10 @@ static uint64_t artist_vram_read(void *opaque, >> hwaddr addr, unsigned size) >> return 0; >> } >> - posy = ADDR_TO_Y(addr >> 2); >> - posx = ADDR_TO_X(addr >> 2); >> + posy = ADDR_TO_Y(addr); >> + posx = ADDR_TO_X(addr); >> - if (posy > buf->height || posx > buf->width) { >> + if (posy >= buf->height || posx >= buf->width) { >> return 0; >> } >> -- >> 2.31.1 >>