Thread (7 messages) 7 messages, 4 authors, 1999-01-03

Re: fbcon + X Server + Cirrus/Powerstack

From: Geert Uytterhoeven <hidden>
Date: 1998-12-28 18:52:08

On Mon, 28 Dec 1998, Jeff Rugen wrote:
On Sun, 27 Dec 1998, Geert Uytterhoeven wrote:
quoted
I suspect the address of the frame buffer in struct fb_fix_screeninfo. It must
be the _physical_ address of the frame buffer. If this is wrong, the X server
will map the wrong piece of memory space.
I think you're right in that the physical address is wrong, but from what I
can tell, for the console to work it has to be what it says (0x08000000).

I'm using the following code to give you an idea how the address is being
generated.

fb_info->fbmem = ioremap(0xC0000000, board_size);  /* returns 0xC8000000 */
fb_info->fbmem_phys = virt_to_phys((unsigned char *)fb_info->fbmem);
Try

    fb_info->fbmem_phys = 0xC0000000;

instead, i.e. use the address you passed to ioremap()[*].
I'll explain the 2nd line in a moment, which sets fbmem_phys to 0x08000000
as listed in the fbset --info output.

In clgen_encode_fix(), the code does the following (I didn't change this
from what it does now)

fix->smem_start     = (char*)_info->fbmem_phys;

Then in fbgen_set_disp() the code does the following:

display->screen_base = phys_to_virt((unsigned long)fix.smem_start);

This sets display->screen_base == fb_info->fbmem.
Which is correct.
When I had some test code to write directly to video memory in the driver, I
could only put pixels on the screen if I wrote to the block of memory
pointed to by the result of the ioremap call.
That's normal: before you can access video memory, you have to map it with
ioremap().
Could the problem be that ioremap doesn't return the same address as passed
into it?  It seems I remember seeing a comment or some documentation that
indicated it was supposed to...
It's normal that ioremap() doesn't return the same address as pased to it: it's
input is a _physical_ address, while it's output is a _virtual_ kernel address.

There seem to be problems with the phyiscal to virtual mapping and vice versa,
i.e. virt_to_phys(phys_to_virt(x)) and phys_to_virt(virt_to_phys(x)) are not
always x.

If `phys_to_virt(0xC0000000)' returns fb_info->fbmem again, [*] should work.

Greetings,

						Geert

--
Geert Uytterhoeven                     Geert.Uytterhoeven@cs.kuleuven.ac.be
Wavelets, Linux/{m68k~Amiga,PPC~CHRP}  http://www.cs.kuleuven.ac.be/~geert/
Department of Computer Science -- Katholieke Universiteit Leuven -- Belgium


[[ This message was sent via the linuxppc-dev mailing list. Replies are ]]
[[ not forced back to the list, so be sure to  Cc linuxppc-dev  if your ]]
[[ reply is of general interest. To unsubscribe from linuxppc-dev, send ]]
[[ the message 'unsubscribe' to linuxppc-dev-request@lists.linuxppc.org ]]
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help