Commit d301001e authored by Russell King's avatar Russell King

[ARM] Update pcibios_enable_device, supply pci_mmap_page_range()

Update pcibios_enable_device to only enable requested resources,
mainly for IDE.  Supply a pci_mmap_page_range() function to allow
user space to mmap PCI regions.
parent 31d49a63
...@@ -599,7 +599,7 @@ void pcibios_align_resource(void *data, struct resource *res, ...@@ -599,7 +599,7 @@ void pcibios_align_resource(void *data, struct resource *res,
* pcibios_enable_device - Enable I/O and memory. * pcibios_enable_device - Enable I/O and memory.
* @dev: PCI device to be enabled * @dev: PCI device to be enabled
*/ */
int pcibios_enable_device(struct pci_dev *dev) int pcibios_enable_device(struct pci_dev *dev, int mask)
{ {
u16 cmd, old_cmd; u16 cmd, old_cmd;
int idx; int idx;
...@@ -608,6 +608,10 @@ int pcibios_enable_device(struct pci_dev *dev) ...@@ -608,6 +608,10 @@ int pcibios_enable_device(struct pci_dev *dev)
pci_read_config_word(dev, PCI_COMMAND, &cmd); pci_read_config_word(dev, PCI_COMMAND, &cmd);
old_cmd = cmd; old_cmd = cmd;
for (idx = 0; idx < 6; idx++) { for (idx = 0; idx < 6; idx++) {
/* Only set up the requested stuff */
if (!(mask & (1 << idx)))
continue;
r = dev->resource + idx; r = dev->resource + idx;
if (!r->start && r->end) { if (!r->start && r->end) {
printk(KERN_ERR "PCI: Device %s not available because" printk(KERN_ERR "PCI: Device %s not available because"
...@@ -626,3 +630,29 @@ int pcibios_enable_device(struct pci_dev *dev) ...@@ -626,3 +630,29 @@ int pcibios_enable_device(struct pci_dev *dev)
} }
return 0; return 0;
} }
int pci_mmap_page_range(struct pci_dev *dev, struct vm_area_struct *vma,
enum pci_mmap_state mmap_state, int write_combine)
{
struct pci_sys_data *root = dev->sysdata;
unsigned long prot, phys;
if (mmap_state == pci_mmap_io) {
return -EINVAL;
} else {
phys = root->mem_offset + (vma->vm_pgoff << PAGE_SHIFT);
}
/*
* Mark this as IO
*/
vma->vm_flags |= VM_SHM | VM_LOCKED | VM_IO;
vma->vm_page_prot = pgprot_noncached(vma->vm_page_prot);
if (remap_page_range(vma, vma->vm_start, phys,
vma->vm_end - vma->vm_start,
vma->vm_page_prot))
return -EAGAIN;
return 0;
}
...@@ -248,6 +248,10 @@ void *pci_pool_alloc (struct pci_pool *pool, int flags, dma_addr_t *handle); ...@@ -248,6 +248,10 @@ void *pci_pool_alloc (struct pci_pool *pool, int flags, dma_addr_t *handle);
void pci_pool_free (struct pci_pool *pool, void *vaddr, dma_addr_t addr); void pci_pool_free (struct pci_pool *pool, void *vaddr, dma_addr_t addr);
#endif #endif
#define HAVE_PCI_MMAP
extern int pci_mmap_page_range(struct pci_dev *dev, struct vm_area_struct *vma,
enum pci_mmap_state mmap_state, int write_combine);
#endif /* __KERNEL__ */ #endif /* __KERNEL__ */
#endif #endif
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment