From: Michael Schmitz <schmitzmic@gmail.com>
To: Geert Uytterhoeven <geert@linux-m68k.org>
Cc: Petr Stehlik <pstehlik@sophics.cz>,
linux-m68k <linux-m68k@lists.linux-m68k.org>
Subject: Re: Wrong colors on ARAnyM
Date: Wed, 16 Feb 2022 09:49:25 +1300 [thread overview]
Message-ID: <baf33986-d02e-35e8-7381-a30e28089a0a@gmail.com> (raw)
In-Reply-To: <CAMuHMdWkxDMbS4D8wkEPAVgrFnoJzejUkxKCnvA+MA38vS6g9Q@mail.gmail.com>
Hi Geert,
On 15/02/22 21:11, Geert Uytterhoeven wrote:
>>> Linux' falcon_setcolreg() writes to both the Falcon palette registers
>>> and shifter_tt.color_reg[], so shouldn't the STE color palette contain
>>> the correct colors, too?
>> I don't think it will:
>>
>> The STe palette is set like this:
>>
>> shifter_tt.color_reg[regno] =
>> (((red & 0xe) >> 1) | ((red & 1) << 3) << 8) |
>> (((green & 0xe) >> 1) | ((green & 1) << 3) << 4) |
>> ((blue & 0xe) >> 1) | ((blue & 1) << 3);
>>
>> with all colours downshifted by 12 bits already. Rewriting that in the
>> same form as is used in falcon_setcolreg(), i.e. without the downshift:
>>
>> shifter_tt.color_reg[regno] =
>> (((red & 0xe000) >> 13) | ((red & 1000) >> 9)
>> << 8) |
>> (((green & 0xe000) >> 13) | ((green & 1000) >>
>> 9) << 4) |
>> ((blue & 0xe000) >> 13) | ((blue & 1000) >> 9);
>>
>>
>> Now look at falcon_setcolreg:
>>
>> shifter_tt.color_reg[regno] =
>> (((red & 0xe000) >> 13) | ((red & 0x1000) >>
>> 12) << 8) |
>> (((green & 0xe000) >> 13) | ((green & 0x1000)
>> >> 12) << 4) |
>> ((blue & 0xe000) >> 13) | ((blue & 0x1000) >> 12);
>>
>>
>> My guess would be the two ought to be identical, assuming the STe
>> palette registers provide backwards hardware compatibility.
The atafb driver references a 'linux/tools/hardware.txt' file for a
description of the Videl registers. Does anyone still have a copy of
that file?
Failing that - how would I go about setting specific text colours for
the console (or draw a test pattern showing the result of the four
palette entries)?
>>
>> Either way, I think we've got operator precedence wrong here. Shift
>> takes precedence over bitwise and / or? With that precedence, what we
>> have in summary is
>>
>> shifter_tt.color_reg[regno] =
>> (((red & 0xe000) >> 13) | ((red & 0x1000) >> 4)) |
>> (((green & 0xe000) >> 13) | ((green & 0x1000)
>> >> 8)) |
>> ((blue & 0xe000) >> 13) | ((blue & 0x1000) >> 12);
>>
>> Only the blue bits ever entirely seem to end up where they ought to.
>> Testing this hypothesis on ARAnyM (without getting it to boot all the
>> way, for some odd reason likely to do with my current .config) shows
>> that the current code results in the shifter_tt.color_reg entries either
>> 5 or 0x17, 0x113 or 0x117. Adding the missing parentheses results in
>> what I'd expect to see.
> Oops.
>
>> This bug has been present since at least 2.4.30. I do recall seeing this
>> odd blue console before on the Falcon, so it's been a real bug for ages.
> I recall seeing an odd blue console before, too.
> I always dismissed it as some artefact of redrawing the screen in
> a different color mode, like we used to have when switching from a
> 16-color to a monochrome text console (remember the underlined text?).
Can't say I do ... but I don't use the console much at all (keyboard
beginning to act up).
> Did/do you see it on the real Falcon, too?
Didn't try yet, sorry.
> Initially, I suspected the real Falcon always using the Falcon palette,
> so the bug was never seen on real hardware. But the following comment
> makes me think the colors have always been wrong if bpp == 2:
>
> /* 2 planes must use STE compatibility mode */
> par->hw.falcon.ste_mode = bpp == 2;
>
>> Did the operator precedence change sometime since?
> ;-)
>
>>>> As the problem is not 100% reproducible, it looks like a race condition
>>>> in ARAnyM, or a wrong initialization order in atafb.
>>>>
>>>> I'd have to test this on hardware but haven't got fbset on the Falcon. I'll try to locate a binary.
>>> Sorry, you do not need fbset to reproduce this:
>>>
>>> echo N > /sys/class/graphics/fb0/bits_per_pixel
>> Thanks, that's easy enough to try.
>>
>> Playing around with that command a bit, it does appear that the second
>> switch after selecting depth 2 turns the console blue (regardless of
>> what depth is set in that step). And the second switch after that (even
>> if setting depth 2) restores normal colours. No race that I can see
>> there, it's quite reproducible.
> Yes, it is quite reproducible, but it doesn't always happen every
> second switch. As my Atari DRM driver cannot switch mode on the fly,
> I have to initialize the driver with the mode I want to use. Booting
> with a mode with 2 bitplanes gives me the wrong colors in ca. 20%
> of the cases. So it is random.
Yes, the 'every second switch' does appear to be a little random, too.
One boot I get that behavior, the next it's behaving as it should.
>> Now what would cause us to miss every other palette update or depth change?
> That's a good question! Why does ARAnyM sometimes decide to use the
> Falcon palette, and sometimes the STe palette, and not only with
> bpp == 2, but also with other color depths?
I guess we'll have to wait and see whether I see that random behaviour
on the actual hardware.
Looking at getBpp() in the ARAnyM source, I see that ST shifter modes
are used if bits 10, 8 and 4 in f_shift are clear, but the selection of
mono vs. STe 2 bpp modes is different from what's used in the kernel driver:
The kernel uses videl.st_shift & 0x300 == 0x100 for STe mode, and ==
0x200 for mono. ARAnyM uses == 0x01 for STe mode in getBpp(). In
useStPalette(), == 0x100 is used. Both read from the same register
offset. The kernel never sets 0x01 for st_shift, so the code in getBpp()
can't work as far as I can see.
>
>> I can confirm that the bug is gone with additional parentheses to apply
>> the shifts (<<8 for red, <<4 for green) to the result of the bit-wise
>> or, not just the right-hand portion of it.
>>
>> Do you want me to prepare a patch, or would you prefer to do it yourself?
> Feel free to send a patch.
> If you don't get to it, I'll make one, eventually.
> Thanks!
My pleasure - checkpatch may grumble a litte over the additonal line
length but I think we can ignore that!
Cheers,
Michael
>
> Gr{oetje,eeting}s,
>
> Geert
>
> --
> Geert Uytterhoeven -- There's lots of Linux beyond ia32 -- geert@linux-m68k.org
>
> In personal conversations with technical people, I call myself a hacker. But
> when I'm talking to journalists I just say "programmer" or something like that.
> -- Linus Torvalds
next prev parent reply other threads:[~2022-02-15 20:49 UTC|newest]
Thread overview: 12+ messages / expand[flat|nested] mbox.gz Atom feed top
[not found] <cd0eadc8-2255-c905-d466-6514a3e1d6bd@physik.fu-berlin.de>
2022-02-12 14:59 ` Wrong colors on ARAnyM Geert Uytterhoeven
[not found] ` <b03160b6-7f3b-7765-49ee-c49b7dd2c4e0@gmail.com>
2022-02-14 7:41 ` Geert Uytterhoeven
2022-02-14 20:50 ` Michael Schmitz
2022-02-14 21:36 ` Michael Schmitz
2022-02-15 8:11 ` Geert Uytterhoeven
2022-02-15 9:16 ` Petr Stehlík
2022-02-21 1:54 ` Michael Schmitz
2022-02-15 20:49 ` Michael Schmitz [this message]
2022-02-16 8:24 ` Geert Uytterhoeven
2022-02-16 18:05 ` Michael Schmitz
2022-02-16 7:32 ` Michael Schmitz
[not found] ` <3dfea92e-baa1-6374-cdd-7aa8bd8c8ff@tarent.de>
2022-03-09 18:55 ` Wrong colours " Thorsten Glaser
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=baf33986-d02e-35e8-7381-a30e28089a0a@gmail.com \
--to=schmitzmic@gmail.com \
--cc=geert@linux-m68k.org \
--cc=linux-m68k@lists.linux-m68k.org \
--cc=pstehlik@sophics.cz \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox