Can't read from mmaped PCI memory space
Hello,
I'm trying to read from mmapped PCI memory space on an alchemy board, but I can't get it to work. Here's the lspci output of the PCI card:
bash-3.00# lspci -v
00:00.0 Class 0200: 168c:001b (rev 01)
Subsystem: 168c:2063 Flags: bus master, medium devsel, latency 168, IRQ 9 Memory at 0000000040000000 (32-bit, non-prefetchable) [size=64K] Capabilities: [44] Power Management version 2
I used mmap on "/dev/mem" and "/sys/bus/pci/.../resource0", but I do not read the expected values using "*(volatile u32 *)mmap_addr" from that region. The value also changes from read to read. Reading from kernel space just work fine. Am I doing something illegal? Any idea why it does not work?
TIA,
Wolfgang.
Quoted 12 lines · Wolfgang Grandegger
Hello,
I'm trying to read from mmapped PCI memory space on an alchemy board, but I can't get it to work. Here's the lspci output of the PCI card:
bash-3.00# lspci -v
00:00.0 Class 0200: 168c:001b (rev 01)Subsystem: 168c:2063 Flags: bus master, medium devsel, latency 168, IRQ 9 Memory at 0000000040000000 (32-bit, non-prefetchable) [size=64K] Capabilities: [44] Power Management version 2
Quoted 5 lines
I used mmap on "
/dev/mem" and "/sys/bus/pci/.../resource0", but I do not read the expected values using "*(volatile u32 *)mmap_addr" from that region. The value also changes from read to read. Reading from kernel space just work fine. Am I doing something illegal? Any idea why it does not work?
Form here I'm not sure how you did exactly.
Theoretically, you can mmap() directly that at least from the sys resource. But I think you have to notice the aligning requirement for a page. I means you should firstly map one given base_address & ~(PAGE_SIZE - 1). Then access the last destination address with adding the corresponding offset as you want.
Hope its useful.
Tiejun
Quoted 6 lines
TIA,
Wolfgang.
Quoted 39 lines · tiejun.chen
Quoted 12 lines · Wolfgang Grandegger
Hello,
I'm trying to read from mmapped PCI memory space on an alchemy board, but I can't get it to work. Here's the lspci output of the PCI card:
bash-3.00# lspci -v
00:00.0 Class 0200: 168c:001b (rev 01)Subsystem: 168c:2063 Flags: bus master, medium devsel, latency 168, IRQ 9 Memory at 0000000040000000 (32-bit, non-prefetchable) [size=64K] Capabilities: [44] Power Management version 2Quoted 5 lines
I used mmap on "
/dev/mem" and "/sys/bus/pci/.../resource0", but I do not read the expected values using "*(volatile u32 *)mmap_addr" from that region. The value also changes from read to read. Reading from kernel space just work fine. Am I doing something illegal? Any idea why it does not work?Form here I'm not sure how you did exactly.
Theoretically, you can
mmap()directly that at least from the sys resource. But I think you have to notice the aligning requirement for a page. I means you should firstly map one givenbase_address& ~(PAGE_SIZE - 1). Then access the last destination address with adding the corresponding offset as you want.Hope its useful.
Tiejun
Quoted 6 lines
TIA,
Wolfgang.
Hello,
I hit the send button too early, sorry...
Quoted 20 lines · Wolfgang Grandegger
Quoted 19 lines · tiejun.chen
Quoted 17 lines · Wolfgang Grandegger
Hello,
I'm trying to read from mmapped PCI memory space on an alchemy board, but I can't get it to work. Here's the lspci output of the PCI card:
bash-3.00# lspci -v
00:00.0 Class 0200: 168c:001b (rev 01)Subsystem: 168c:2063 Flags: bus master, medium devsel, latency 168, IRQ 9 Memory at 0000000040000000 (32-bit, non-prefetchable) [size=64K] Capabilities: [44] Power Management version 2I used mmap on "
/dev/mem" and "/sys/bus/pci/.../resource0", but I do not read the expected values using "*(volatile u32 *)mmap_addr" from that region. The value also changes from read to read. Reading from kernel space just work fine. Am I doing something illegal? Any idea why it does not work?
Quoted 6 lines
Quoted 6 lines
Form here I'm not sure how you did exactly.
Theoretically, you can
mmap()directly that at least from the sys resource. But I think you have to notice the aligning requirement for a page. I means you should firstly map one givenbase_address& ~(PAGE_SIZE - 1). Then access the last destination address with adding the corresponding offset as you want.
I'm aware of the alignment issue. Anyway, I'm mapping the above address, which is already aligned. It must be something else. I'm using the ath_info and devmem2 Program for testing.
Thanks,
Wolfgang.
Quoted 27 lines · Wolfgang Grandegger
Hello,
I hit the send button too early, sorry...
Quoted 22 lines · Wolfgang Grandegger
Quoted 21 lines · tiejun.chen
Quoted 12 lines · Wolfgang Grandegger
Hello,
I'm trying to read from mmapped PCI memory space on an alchemy board, but I can't get it to work. Here's the lspci output of the PCI card:
bash-3.00# lspci -v
00:00.0 Class 0200: 168c:001b (rev 01)Subsystem: 168c:2063 Flags: bus master, medium devsel, latency 168, IRQ 9 Memory at 0000000040000000 (32-bit, non-prefetchable) [size=64K] Capabilities: [44] Power Management version 2Quoted 5 lines
I used mmap on "
/dev/mem" and "/sys/bus/pci/.../resource0", but I do not read the expected values using "*(volatile u32 *)mmap_addr" from that region. The value also changes from read to read. Reading from kernel space just work fine. Am I doing something illegal? Any idea why it does not work?Form here I'm not sure how you did exactly.
Quoted 8 lines
Quoted 4 lines
Quoted 4 lines
Theoretically, you can
mmap()directly that at least from the sys resource. But I think you have to notice the aligning requirement for a page. I means you should firstly map one givenbase_address& ~(PAGE_SIZE - 1). Then access the last destination address with adding the corresponding offset as you want.I'm aware of the alignment issue. Anyway, I'm mapping the above address, which is already aligned. It must be something else. I'm using the
ath_infoand devmem2 Program for testing.
It's an issue with 64-bit address mapping. Currently mmap tries to map 0x4000'0000 but the physical address of the PCI memory space on my CPU is 0x4'4000'0000. I wonder why this problem has not yet been discovered. The attached patch below works for my board.
Wolfgang.