On 11/29/2010 02:41 PM, Wolfgang Grandegger wrote: > Hello, > > I hit the send button too early, sorry... > > On 11/29/2010 02:23 PM, Wolfgang Grandegger wrote: >> On 11/29/2010 11:24 AM, tiejun.chen wrote: >>> Wolfgang Grandegger wrote: >>>> 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? >>> >>> 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. 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. >From 97fa0ab2beb1817785d017621ba2b6910006ed25 Mon Sep 17 00:00:00 2001 From: Wolfgang Grandegger <wg@xxxxxxx> Date: Mon, 13 Dec 2010 21:29:09 +0100 Subject: [PATCH] mips/pci: use pci_resource_to_user to map pci memory space properly Signed-off-by: Wolfgang Grandegger <wg@xxxxxxx> --- arch/mips/include/asm/pci.h | 12 ++++++++++++ 1 files changed, 12 insertions(+), 0 deletions(-) diff --git a/arch/mips/include/asm/pci.h b/arch/mips/include/asm/pci.h index 576397c..f38943b 100644 --- a/arch/mips/include/asm/pci.h +++ b/arch/mips/include/asm/pci.h @@ -82,6 +82,18 @@ static inline void pcibios_penalize_isa_irq(int irq, int active) extern int pci_mmap_page_range(struct pci_dev *dev, struct vm_area_struct *vma, enum pci_mmap_state mmap_state, int write_combine); +#define HAVE_ARCH_PCI_RESOURCE_TO_USER + +static inline void pci_resource_to_user(const struct pci_dev *dev, int bar, + const struct resource *rsrc, resource_size_t *start, + resource_size_t *end) +{ + phys_t size = resource_size(rsrc); + + *start = fixup_bigphys_addr(rsrc->start, size); + *end = rsrc->start + size; +} + /* * Dynamic DMA mapping stuff. * MIPS has everything mapped statically. -- 1.7.2.3