On Fri, Dec 05, 2008 at 11:43:42PM +0800, Zhang Le wrote:
> I have tried xorg-server-1.5.2 on loongson 2f recently.
> But I found it doesn't work.
> It's mainly because of this change:
> In short:
> "Rather than duplicating the efforts of kernel developers, X.org needs to use
> interfaces provided by the kernel as much as possible."
> I have read some code of libpciaccess, the new library utilizing kernel
> to access pci bus. It will try to mmap this file:
> (replace x with any digit appropriate)
> Note there is a 0 at the end of the file name. This file's permission is 600.
> However, I found on my loongson system, there is only
> Note there is no 0 at the end.
> Then I tried to read kernel code. I found it seems that for mips linux to have
> this file, HAVE_PCI_MMAP must be defined. However, it is currently not
> Since I am not familiar with PCI, yet.
> So could someone please shed some light on this?
> Why HAVE_PCI_MMAP is not defined?
Here is a quick'n'dirty solution which I've not tested beyond just
compiling. It should work but performance will be bad. Either way, I'm
interested in a test report with X.
Signed-off-by: Ralf Baechle <email@example.com>
diff --git a/arch/mips/include/asm/pci.h b/arch/mips/include/asm/pci.h
index 5510c53..053e463 100644
@@ -79,6 +79,11 @@ static inline void pcibios_penalize_isa_irq(int irq, int
/* We don't do dynamic PCI IRQ allocation */
+extern int pci_mmap_page_range(struct pci_dev *dev, struct vm_area_struct *vma,
+ enum pci_mmap_state mmap_state, int write_combine);
* Dynamic DMA mapping stuff.
* MIPS has everything mapped statically.
diff --git a/arch/mips/pci/pci.c b/arch/mips/pci/pci.c
index a377e9d..9233193 100644
@@ -354,6 +354,22 @@ EXPORT_SYMBOL(PCIBIOS_MIN_IO);
+int pci_mmap_page_range(struct pci_dev *dev, struct vm_area_struct *vma,
+ enum pci_mmap_state mmap_state, int write_combine)
+ unsigned long prot;
+ * Ignore write-combine; for now only return uncached mappings.
+ prot = pgprot_val(vma->vm_page_prot);
+ prot = (prot & ~_CACHE_MASK) | _CACHE_UNCACHED;
+ vma->vm_page_prot = __pgprot(prot);
+ return remap_pfn_range(vma, vma->vm_start, vma->vm_pgoff,
+ vma->vm_end - vma->vm_start, vma->vm_page_prot);
char * (*pcibios_plat_setup)(char *str) __devinitdata;
char *__devinit pcibios_setup(char *str)