diff options
Diffstat (limited to 'arch/sh/drivers/pci/fixups-dreamcast.c')
| -rw-r--r-- | arch/sh/drivers/pci/fixups-dreamcast.c | 18 | 
1 files changed, 15 insertions, 3 deletions
diff --git a/arch/sh/drivers/pci/fixups-dreamcast.c b/arch/sh/drivers/pci/fixups-dreamcast.c index d6cde700e31..1d1c5a227e5 100644 --- a/arch/sh/drivers/pci/fixups-dreamcast.c +++ b/arch/sh/drivers/pci/fixups-dreamcast.c @@ -31,6 +31,8 @@  static void gapspci_fixup_resources(struct pci_dev *dev)  {  	struct pci_channel *p = dev->sysdata; +	struct resource res; +	struct pci_bus_region region;  	printk(KERN_NOTICE "PCI: Fixing up device %s\n", pci_name(dev)); @@ -50,11 +52,21 @@ static void gapspci_fixup_resources(struct pci_dev *dev)  		/*  		 * Redirect dma memory allocations to special memory window. +		 * +		 * If this GAPSPCI region were mapped by a BAR, the CPU +		 * phys_addr_t would be pci_resource_start(), and the bus +		 * address would be pci_bus_address(pci_resource_start()). +		 * But apparently there's no BAR mapping it, so we just +		 * "know" its CPU address is GAPSPCI_DMA_BASE.  		 */ +		res.start = GAPSPCI_DMA_BASE; +		res.end = GAPSPCI_DMA_BASE + GAPSPCI_DMA_SIZE - 1; +		res.flags = IORESOURCE_MEM; +		pcibios_resource_to_bus(dev->bus, ®ion, &res);  		BUG_ON(!dma_declare_coherent_memory(&dev->dev, -						GAPSPCI_DMA_BASE, -						GAPSPCI_DMA_BASE, -						GAPSPCI_DMA_SIZE, +						res.start, +						region.start, +						resource_size(&res),  						DMA_MEMORY_MAP |  						DMA_MEMORY_EXCLUSIVE));  		break;  | 
