Port-sparc archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

Re: Improved memory detection for cgsix


On Sat, 26 Feb 2022 16:48:07 -0800
foo bar <tokenalt%gmail.com@localhost> wrote:

> So recently I got my hands on a GX+ (501-2039) and when I tried it out
> on netbsd I noticed that it only detected 1M or vram instead of the 4M
> the card has. Looking through the source code I found this.
> src/sys/dev/sbus/cgsix_sbus.c: line 175
>     sc->sc_ramsize = prom_getpropint(node, "fbmapped", 1024 * 1024);
> However when I looked at the attributes of the GX+ I saw it didn't
> even define an fbmapped at all, but it does have a vmsize = 4. Then I
> checked a GX (501-1996) and it also does not have fbmapped but it does
> have vmsize = 1. Finally I check a TGX+ clone w/ 2M of vram and it
> does have fbmapped = 2M and it also has vmsize = 2. Based on this
> limited sample size I believe the fbmapped attribute was added in the
> TGX line. Attached below is a patch to check both attributes which
> correctly detects the memory size on the cards I have.
> After that I ran into a second problem in that the xserver would only
> map 2M of ram. Looking at the code I found the xdriver doesn't detect
> the memory size at all it just blindly tries to map memory til it
> succeeds. I wasn't sure how to add memory detection to the driver so I
> just raised the max amount it would try to 4M, patch below.
> With these changes my GX+ is now properly detected as shown here.
> [     1.000003] cgsix0 at sbus0 slot 1 offset 0x0 level 9:
> SUNW,501-1717, 1152 x 900, rev 7
> [     1.000003] cgsix0: attached to /dev/fb0
> [     1.000003] cgsix0: framebuffer size: 4 MB
> [   305.720] (II) SUNCG6(0): mapped 4096 KB video RAM
> ...
> [   305.916] (II) EXA(0): Offscreen pixmap area of 3156480 bytes

This isn't going to work, unfortunately, and here's why.
The 4MB CG6 all have two independent 2MB framebuffers, for double
buffering, which can not be combined into one big framebuffer.
That's why fbmapped never shows more than 2MB, even on 4MB boards.
There are bits which control what you access through the framebuffer
mapping - you can direct reads to either buffer, and writes can go to
either or both at the same time. 
If you try to map more than 2MB framebuffer you'll either hit unmapped
space or a repeat of the buffer after 2MB.
Same goes for the drawing engine.
The cg6 in the sparcstation LX is a special case - it's got 1MB
soldered in but you can add another 1MB as a VRAM module. This thing
can be used as either 2x 1MB with double buffering, or as a single 2MB.
Unfortunately we don't have that option with 4MB boards, those are
always double buffered.

I'd love to be proven wrong on this though.
I have a bunch of different cg6 here, at least a few of them are plus
variants. I'll do some experiments.
I'd suggest to write a program that maps the space, scribbles into it
beyond 2MB and checks where that scribbling actually ends up.

have fun

Home | Main Index | Thread Index | Old Index