The fcode has code to read the BAR size from the BAR registers.
Code:
10 my-space + " config-l@" $call-parent -1 10 my-space + " config-l!" $call-parent 10 my-space + " config-l@" $call-parent 0f invert and invert 1+ to value_9f9_10000000 10 my-space + " config-l!" $call-parent
18 my-space + " config-l@" $call-parent -1 18 my-space + " config-l!" $call-parent 18 my-space + " config-l@" $call-parent 0f invert and invert 1+ to value_9fb_10000 18 my-space + " config-l!" $call-parent
value_9f9_10000000
contains the size for BAR 0x10. It was initialized to 0x10000000 but that gets changed by the above code in the fcode if the BAR size is different.
Have you checked the BAR to see what size it reports? Is the size controlled by a soft straps?
The fcode starts with some bytes that are ignored by the fcode. They may be used by the GPU for soft straps? What do the soft straps control?
Code:
fcode-version2
\ format: 0x08
\ checksum: 0xe504 (ok)
\ len: 0x83ac (33708 bytes)
" "(0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0098 065C 0048 0210 4072 4072 1890 0000)"
2drop
There is another value
value_bb0_10000000
which is also initialized to 0x10000000 but it is never modified. It is used by the
VRAM,totalsize
and
ATY,FCODE_MEM
properties. It is stored to register 0xf8
value_9fd_10
is the top 12 bits of the minimum of
value_9f9_10000000
and
value_bb0_10000000
. The initialized size of 0x10 would mean 16 MB.
Is there an Linux open source driver for the X1900? It will have a list of registers.