sh: pci: Consolidate pcibios_align_resource() definitions.
This introduces a saner pcibios_align_resource() that can be used regardless of whether pci-auto or pci-new are being used, and consolidates it in pci-lib.c. Signed-off-by: Paul Mundt <lethal@linux-sh.org>
This commit is contained in:
parent
9833385131
commit
a3c0e0d003
5 changed files with 49 additions and 53 deletions
|
@ -30,6 +30,9 @@
|
||||||
#define PCIC_WRITE(x,v) writel((v), PCI_REG(x))
|
#define PCIC_WRITE(x,v) writel((v), PCI_REG(x))
|
||||||
#define PCIC_READ(x) readl(PCI_REG(x))
|
#define PCIC_READ(x) readl(PCI_REG(x))
|
||||||
|
|
||||||
|
#define xPCIBIOS_MIN_IO board_pci_channels->io_resource->start
|
||||||
|
#define xPCIBIOS_MIN_MEM board_pci_channels->mem_resource->start
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Description: This function sets up and initializes the pcic, sets
|
* Description: This function sets up and initializes the pcic, sets
|
||||||
* up the BARS, maps the DRAM into the address space etc, etc.
|
* up the BARS, maps the DRAM into the address space etc, etc.
|
||||||
|
@ -97,12 +100,12 @@ int __init pcibios_init_platform(void)
|
||||||
* meaning all calls go straight through... use BUG_ON to
|
* meaning all calls go straight through... use BUG_ON to
|
||||||
* catch erroneous assumption.
|
* catch erroneous assumption.
|
||||||
*/
|
*/
|
||||||
BUG_ON(PCIBIOS_MIN_MEM != SH7751_PCI_MEMORY_BASE);
|
BUG_ON(xPCIBIOS_MIN_MEM != SH7751_PCI_MEMORY_BASE);
|
||||||
|
|
||||||
PCIC_WRITE(SH7751_PCIMBR, PCIBIOS_MIN_MEM);
|
PCIC_WRITE(SH7751_PCIMBR, xPCIBIOS_MIN_MEM);
|
||||||
|
|
||||||
/* Set IOBR for window containing area specified in pci.h */
|
/* Set IOBR for window containing area specified in pci.h */
|
||||||
PCIC_WRITE(SH7751_PCIIOBR, (PCIBIOS_MIN_IO & SH7751_PCIIOBR_MASK));
|
PCIC_WRITE(SH7751_PCIIOBR, (xPCIBIOS_MIN_IO & SH7751_PCIIOBR_MASK));
|
||||||
|
|
||||||
/* All done, may as well say so... */
|
/* All done, may as well say so... */
|
||||||
printk("SH7751 PCI: Finished initialization of the PCI controller\n");
|
printk("SH7751 PCI: Finished initialization of the PCI controller\n");
|
||||||
|
|
|
@ -4,6 +4,41 @@
|
||||||
#include <linux/types.h>
|
#include <linux/types.h>
|
||||||
#include <linux/pci.h>
|
#include <linux/pci.h>
|
||||||
|
|
||||||
|
unsigned long PCIBIOS_MIN_IO = 0x0000;
|
||||||
|
unsigned long PCIBIOS_MIN_MEM = 0;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* We need to avoid collisions with `mirrored' VGA ports
|
||||||
|
* and other strange ISA hardware, so we always want the
|
||||||
|
* addresses to be allocated in the 0x000-0x0ff region
|
||||||
|
* modulo 0x400.
|
||||||
|
*/
|
||||||
|
void pcibios_align_resource(void *data, struct resource *res,
|
||||||
|
resource_size_t size, resource_size_t align)
|
||||||
|
{
|
||||||
|
struct pci_dev *dev = data;
|
||||||
|
struct pci_channel *chan = dev->sysdata;
|
||||||
|
resource_size_t start = res->start;
|
||||||
|
|
||||||
|
if (res->flags & IORESOURCE_IO) {
|
||||||
|
if (start < PCIBIOS_MIN_IO + chan->io_resource->start)
|
||||||
|
start = PCIBIOS_MIN_IO + chan->io_resource->start;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Put everything into 0x00-0xff region modulo 0x400.
|
||||||
|
*/
|
||||||
|
if (start & 0x300) {
|
||||||
|
start = (start + 0x3ff) & ~0x3ff;
|
||||||
|
res->start = start;
|
||||||
|
}
|
||||||
|
} else if (res->flags & IORESOURCE_MEM) {
|
||||||
|
if (start < PCIBIOS_MIN_MEM + chan->mem_resource->start)
|
||||||
|
start = PCIBIOS_MIN_MEM + chan->mem_resource->start;
|
||||||
|
}
|
||||||
|
|
||||||
|
res->start = start;
|
||||||
|
}
|
||||||
|
|
||||||
int pci_mmap_page_range(struct pci_dev *dev, struct vm_area_struct *vma,
|
int pci_mmap_page_range(struct pci_dev *dev, struct vm_area_struct *vma,
|
||||||
enum pci_mmap_state mmap_state, int write_combine)
|
enum pci_mmap_state mmap_state, int write_combine)
|
||||||
{
|
{
|
||||||
|
@ -24,3 +59,10 @@ int pci_mmap_page_range(struct pci_dev *dev, struct vm_area_struct *vma,
|
||||||
vma->vm_end - vma->vm_start,
|
vma->vm_end - vma->vm_start,
|
||||||
vma->vm_page_prot);
|
vma->vm_page_prot);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef CONFIG_HOTPLUG
|
||||||
|
EXPORT_SYMBOL(pcibios_resource_to_bus);
|
||||||
|
EXPORT_SYMBOL(pcibios_bus_to_resource);
|
||||||
|
EXPORT_SYMBOL(PCIBIOS_MIN_IO);
|
||||||
|
EXPORT_SYMBOL(PCIBIOS_MIN_MEM);
|
||||||
|
#endif
|
||||||
|
|
|
@ -129,29 +129,6 @@ pcibios_bus_to_resource(struct pci_dev *dev, struct resource *res,
|
||||||
res->end = region->end + offset;
|
res->end = region->end + offset;
|
||||||
}
|
}
|
||||||
|
|
||||||
void pcibios_align_resource(void *data, struct resource *res,
|
|
||||||
resource_size_t size, resource_size_t align)
|
|
||||||
__attribute__ ((weak));
|
|
||||||
|
|
||||||
/*
|
|
||||||
* We need to avoid collisions with `mirrored' VGA ports
|
|
||||||
* and other strange ISA hardware, so we always want the
|
|
||||||
* addresses to be allocated in the 0x000-0x0ff region
|
|
||||||
* modulo 0x400.
|
|
||||||
*/
|
|
||||||
void pcibios_align_resource(void *data, struct resource *res,
|
|
||||||
resource_size_t size, resource_size_t align)
|
|
||||||
{
|
|
||||||
if (res->flags & IORESOURCE_IO) {
|
|
||||||
resource_size_t start = res->start;
|
|
||||||
|
|
||||||
if (start & 0x300) {
|
|
||||||
start = (start + 0x3ff) & ~0x3ff;
|
|
||||||
res->start = start;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
int pcibios_enable_device(struct pci_dev *dev, int mask)
|
int pcibios_enable_device(struct pci_dev *dev, int mask)
|
||||||
{
|
{
|
||||||
u16 cmd, old_cmd;
|
u16 cmd, old_cmd;
|
||||||
|
|
|
@ -86,29 +86,6 @@ void pcibios_bus_to_resource(struct pci_dev *dev, struct resource *res,
|
||||||
res->end = region->end;
|
res->end = region->end;
|
||||||
}
|
}
|
||||||
|
|
||||||
void pcibios_align_resource(void *data, struct resource *res,
|
|
||||||
resource_size_t size, resource_size_t align)
|
|
||||||
__attribute__ ((weak));
|
|
||||||
|
|
||||||
/*
|
|
||||||
* We need to avoid collisions with `mirrored' VGA ports
|
|
||||||
* and other strange ISA hardware, so we always want the
|
|
||||||
* addresses to be allocated in the 0x000-0x0ff region
|
|
||||||
* modulo 0x400.
|
|
||||||
*/
|
|
||||||
void pcibios_align_resource(void *data, struct resource *res,
|
|
||||||
resource_size_t size, resource_size_t align)
|
|
||||||
{
|
|
||||||
if (res->flags & IORESOURCE_IO) {
|
|
||||||
resource_size_t start = res->start;
|
|
||||||
|
|
||||||
if (start & 0x300) {
|
|
||||||
start = (start + 0x3ff) & ~0x3ff;
|
|
||||||
res->start = start;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
int pcibios_enable_device(struct pci_dev *dev, int mask)
|
int pcibios_enable_device(struct pci_dev *dev, int mask)
|
||||||
{
|
{
|
||||||
u16 cmd, old_cmd;
|
u16 cmd, old_cmd;
|
||||||
|
|
|
@ -33,10 +33,7 @@ struct pci_channel {
|
||||||
*/
|
*/
|
||||||
extern struct pci_channel board_pci_channels[];
|
extern struct pci_channel board_pci_channels[];
|
||||||
|
|
||||||
/* ugly as hell, but makes drivers/pci/setup-res.c compile and work */
|
extern unsigned long PCIBIOS_MIN_IO, PCIBIOS_MIN_MEM;
|
||||||
#define __PCI_CHAN(bus) ((struct pci_channel *)bus->sysdata)
|
|
||||||
#define PCIBIOS_MIN_IO __PCI_CHAN(bus)->io_resource->start
|
|
||||||
#define PCIBIOS_MIN_MEM __PCI_CHAN(bus)->mem_resource->start
|
|
||||||
|
|
||||||
struct pci_dev;
|
struct pci_dev;
|
||||||
|
|
||||||
|
|
Reference in a new issue