Skip to contentSkip to conversation

Can't read from mmaped PCI memory space

DISCUSSION Wolfgang Grandegger 2 participants 5 messages Nov 28, 2010 – Dec 13, 2010 MIPS

lore
Share & tools
lore
#0 lore raw

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.

#1 lore raw
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.

#2 lore raw
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 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.

#3 lore raw

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 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?

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 given base_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.

#4 lore raw
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 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.

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 given base_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.

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.