8272ads:PCI prefetchable mem access problem

Anil Dhonde adhonde at yahoo.com
Thu Feb 16 01:59:54 EST 2006

Hi all:

We have plugged an ATI Radeon video card into a PCI
slot on our powerpc 8272ads evaluation board. The
linux kernel 2.6.15 comes up, detects the card on the
bus, rolls in the ATI Radeon framebuffer driver as it
should. All register/PCI config space access is fine.

The trouble starts when I try to access the 128MByte
video memory on the card. As you can see below, there
are three regions for this card - one pre-fetchable,
one non-prefetchable and one io. The 128MByte region
is flagged prefetchable.

I can:
 - mmap (in userland) or ioremap (in kernel space) the
non-prefetchable region and do what I want to with it
(read/write). User space I use either /proc or /sys
handles and in the kernel my driver does the remapping

I cannot:
 - mmap or remap the prefetchable region though the
calls to ioremap and mmap return success.
 - Kernel ioremap returns success but the powerpc
crashes as soon as I read or write to space that has
just been remapped. 
 - mmap using either /proc or /sys based pci resource
access from user space fails the same way. mmap call
returns success but access cases a bus error.

something that looks suspicious:
cat /proc/iomem below shows that the ATI cards
prefetchable memory does not land up in the
prefetchable region of the PCI map. It lands in the
PCI memory (non-prefetchable region).

what I have tried:
- forcing PREFETCH flags to be NONPREFETCH by hacking
the kernel - this hack didnt work though /proc/pci
reports all pre-fetchables as non-prefetchables
meaning that flags were set properly.

any help/pointers from you guys will be great,

thanks a ton,

Platform details:
- powerpc 8272ads board, 64MByte eval board with
kernel 2.6.15 
- ATI Radeon 7000 PCI based card with 128MByte mem

================== log ==============================
~ # cat /proc/pci
PCI devices found:
  Bus  0, device   0, function  0:
    Class 0600: PCI device 1057:18c1 (rev 16).
      Master Capable.  Latency=248.
      Non-prefetchable 32 bit memory at 0x0 [0x1ffff].
      Prefetchable 32 bit memory at 0x0 [0xfffffff].
  Bus  0, device  24, function  0:
    Class 0300: PCI device 1002:5159 (rev 0).
      IRQ 66.
      Master Capable.  Latency=128.  Min Gnt=8.
      Prefetchable 32 bit memory at 0xa8000000
      I/O at 0x1ffff00 [0x1ffffff].
      Non-prefetchable 32 bit memory at 0xa7ff0000
~ # ls -l /sys/devices/pci0000\:00/0000\:00\:18.0/
lrwxrwxrwx    1 root     root            0 Jan  1
00:03 bus ->
-r--r--r--    1 root     root         4096 Jan  1
00:03 class
-rw-r--r--    1 root     root          256 Jan  1
00:03 config
-r--r--r--    1 root     root         4096 Jan  1
00:03 device
-r--r--r--    1 root     root         4096 Jan  1
00:03 irq
-r--r--r--    1 root     root         4096 Jan  1
00:03 local_cpus
-r--r--r--    1 root     root         4096 Jan  1
00:03 modalias
-r--r--r--    1 root     root         4096 Jan  1
00:03 resource
-rw-------    1 root     root    134217728 Jan  1
00:03 resource0
-rw-------    1 root     root          256 Jan  1
00:03 resource1
-rw-------    1 root     root        65536 Jan  1
00:03 resource2
-r--------    1 root     root       131072 Jan  1
00:03 rom
-r--r--r--    1 root     root         4096 Jan  1
00:03 subsystem_device
-r--r--r--    1 root     root         4096 Jan  1
00:03 subsystem_vendor
--w-------    1 root     root         4096 Jan  1
00:03 uevent
-r--r--r--    1 root     root         4096 Jan  1
00:03 vendor
~ # cat /proc/iomem
80000000-9fffffff : PCI prefetchable memory
a0000000-afffffff : PCI memory
  a7ff0000-a7ffffff : 0000:00:18.0
  a8000000-afffffff : 0000:00:18.0
~ # cat /proc/ioports
00000000-01ffffff : PCI I/O
  01ffff00-01ffffff : 0000:00:18.0

Do You Yahoo!?
Tired of spam?  Yahoo! Mail has the best spam protection around 

More information about the Linuxppc-dev mailing list