Linear addressing and 16bpp/32bpp modes

# 5 Linear addressing and 16bpp/32bpp modes

Contents of this section

Currently the unaccelerated 16-bit and 32-bit pixel support in the SVGA server requires linear addressing. This restriction will hopefully be removed in a future version. Option "linear" can be specified in a depth-specific screen section to enable linear addressing; a MemBase setting (in the device section) is probably also required. There are a number of different card configurations.

If you have a 542x/543x on the ISA bus, and you have 16Mb or more of system memory, linear addressing is impossible. 16bpp is out, sorry. If you have less than 14Mb of memory, you may be able to map the framebuffer at 14Mb, using ``MemBase 0x00e00000`'. That's five zeros after the `e'. Unfortunately many ISA cards don't support linear addressing.

If you have a 5424/26/28/29 on VESA local bus, the situation is more complicated. There are two different types of cards w.r.t. linear addressing:

- Cards that can only map in the lower 16Mb, like cards on the ISA bus. This is the case with most cards. The same restrictions apply (i.e. you must have less than 16Mb of memory).
- Cards that connect address line A26 and always map at 64Mb + 14Mb. In this case specify ``MemBase 0x04e00000`'. This assumes you have a VLB motherboard implementation that implements A26. This has not been tested; it is not quite clear whether it maps at 0x04000000 or 0x04e00000.

You will probably have to rely on trial and error. If you have less than 16Mb memory, the `wrong' membase setting will result in no graphics being displayed, but you can probably exit with ctrl-alt-backspace.

If you have >= 16Mb memory, the first type of card (and even the second type with a stupid VLB motherboard) will result in a crash (probably a spontaneous hard reboot).

It may be possible to find out the type by visual inspection. If the card has a pin at A26, it is likely to map beyond 64Mb. To do this, take the card out. At the VESA local bus pins (this is the smaller strip of connector pins at the non-slot side of the card), consider the right side (this is the side of the board where all the chips are mounted). There are 45 pins here. They are numbered 1 to 45, from the inside (i.e. the one nearest to the card end is 45). Counting from the inside, the 17th pin is probably not present, then there are pins at 18-20. The 21st is A30, the 22nd is A28 and the 23rd is A26. So, if we have no pins at at 21-23, the card doesn't map beyond 64Mb. If there's only a gap of two pins at 21 and 22 (or they are both present) and there's a pin at 23, the card does probably map beyond 64Mb. If there's a little logic near that pin on the card, it's more likely.

With a 543x on the local bus things are simpler (the Cirrus Logic windows drivers use it), but it is not quite without problems.

With a card on the PCI bus, there is a PCI configuration register that holds the framebuffer base address. However, the driver currently does not read it out yet, so you'll have to specify the address with MemBase. On one system tested, it mapped at 0xa0000000, and it appeared addresses where assigned in 0x08000000 increments over the PCI devices. A program is most likely available to read out the PCI configuration.

On the VESA local bus, most 543x cards have a default mapping address of 64Mb, with jumper options for 2048Mb and 32Mb. This is probably described in the documentation that came with the card, or look in the MS-Windows system.ini file (something with linearaddr = <offset in megabytes>). These different settings were added by Cirrus Logic after finding that many VLB motherboard implementations don't implement different address pins (however, they failed to handle this smoothly in their initial Windows drivers). The driver assumes a default of 64Mb if MemBase isn't specified. A few examples for MemBase:

> `

>             MemBase 0x02000000      32Mb
>             MemBase 0x04000000      64Mb
>             MemBase 0x80000000      2048Mb

> `

The 16bpp and 32bpp modes have limited acceleration (scroll, text) which means they can be slow, although a good local bus host interface (like the 543x has) helps a lot. Note that the standard cfb framebuffer code can be very slow for monochrome stipples and bitmaps. 32bpp mode is only supported on a 5434 with 2Mb or more of memory.

In the `XF86Config` `"Screen"` section, a `"Display"` subsection must be defined for each depth that you want to run, with separates Modes and virtual screen size. Example (2Mb of video memory):

> `

>     Section "screen"
>         SubSection "Display"
>             Depth 8
>             Virtual 1152 900
>             ViewPort 0 0
>             Modes "640x480" "800x600" "1024x768"
>             Option "linear"
>         EndSubSection
>         SubSection "Display"
>             Depth 16
>             Virtual 1152 900
>             ViewPort 0 0
>             Modes "640x480" "800x600" "1024x768"
>             Option "linear"
>         EndSubSection
>         SubSection "Display"
>             Depth 32
>             Virtual 800 600
>             ViewPort 0 0
>             Modes "640x480" "800x600"
>             Option "linear"
>         EndSubSection
>     EndSection

> `

Next Chapter, Previous Chapter

Table of contents of this chapter, General table of contents

Top of the document, Beginning of this Chapter