diff options
| -rw-r--r-- | arch/mips/pci/ops-tx3927.c | 46 | ||||
| -rw-r--r-- | arch/mips/pci/ops-tx4927.c | 34 | 
2 files changed, 53 insertions, 27 deletions
| diff --git a/arch/mips/pci/ops-tx3927.c b/arch/mips/pci/ops-tx3927.c index 8a17a39e5bf2..c6bd79e71e26 100644 --- a/arch/mips/pci/ops-tx3927.c +++ b/arch/mips/pci/ops-tx3927.c @@ -41,41 +41,41 @@  #include <asm/addrspace.h>  #include <asm/txx9/tx3927.h> -static inline int mkaddr(unsigned char bus, unsigned char dev_fn, -	unsigned char where) +static int mkaddr(struct pci_bus *bus, unsigned char devfn, unsigned char where)  { -	if (bus == 0 && dev_fn >= PCI_DEVFN(TX3927_PCIC_MAX_DEVNU, 0)) -		return PCIBIOS_DEVICE_NOT_FOUND; - -	tx3927_pcicptr->ica = ((bus & 0xff) << 0x10) | -	                      ((dev_fn & 0xff) << 0x08) | -	                      (where & 0xfc); +	if (bus->parent == NULL && +	    devfn >= PCI_DEVFN(TX3927_PCIC_MAX_DEVNU, 0)) +		return -1; +	tx3927_pcicptr->ica = +		((bus->number & 0xff) << 0x10) | +		((devfn & 0xff) << 0x08) | +		(where & 0xfc) | (bus->parent ? 1 : 0);  	/* clear M_ABORT and Disable M_ABORT Int. */  	tx3927_pcicptr->pcistat |= PCI_STATUS_REC_MASTER_ABORT;  	tx3927_pcicptr->pcistatim &= ~PCI_STATUS_REC_MASTER_ABORT; - -	return PCIBIOS_SUCCESSFUL; +	return 0;  }  static inline int check_abort(void)  { -	if (tx3927_pcicptr->pcistat & PCI_STATUS_REC_MASTER_ABORT) +	if (tx3927_pcicptr->pcistat & PCI_STATUS_REC_MASTER_ABORT) {  		tx3927_pcicptr->pcistat |= PCI_STATUS_REC_MASTER_ABORT;  		tx3927_pcicptr->pcistatim |= PCI_STATUS_REC_MASTER_ABORT; +		/* flush write buffer */ +		iob();  		return PCIBIOS_DEVICE_NOT_FOUND; - +	}  	return PCIBIOS_SUCCESSFUL;  }  static int tx3927_pci_read_config(struct pci_bus *bus, unsigned int devfn,  	int where, int size, u32 * val)  { -	int ret; - -	ret = mkaddr(bus->number, devfn, where); -	if (ret) -		return ret; +	if (mkaddr(bus, devfn, where)) { +		*val = 0xffffffff; +		return PCIBIOS_DEVICE_NOT_FOUND; +	}  	switch (size) {  	case 1: @@ -97,11 +97,8 @@ static int tx3927_pci_read_config(struct pci_bus *bus, unsigned int devfn,  static int tx3927_pci_write_config(struct pci_bus *bus, unsigned int devfn,  	int where, int size, u32 val)  { -	int ret; - -	ret = mkaddr(bus->number, devfn, where); -	if (ret) -		return ret; +	if (mkaddr(bus, devfn, where)) +		return PCIBIOS_DEVICE_NOT_FOUND;  	switch (size) {  	case 1: @@ -117,11 +114,6 @@ static int tx3927_pci_write_config(struct pci_bus *bus, unsigned int devfn,  		tx3927_pcicptr->icd = cpu_to_le32(val);  	} -	if (tx3927_pcicptr->pcistat & PCI_STATUS_REC_MASTER_ABORT) -		tx3927_pcicptr->pcistat |= PCI_STATUS_REC_MASTER_ABORT; -		tx3927_pcicptr->pcistatim |= PCI_STATUS_REC_MASTER_ABORT; -		return PCIBIOS_DEVICE_NOT_FOUND; -  	return check_abort();  } diff --git a/arch/mips/pci/ops-tx4927.c b/arch/mips/pci/ops-tx4927.c index c6b49bccd274..6d844094ef5d 100644 --- a/arch/mips/pci/ops-tx4927.c +++ b/arch/mips/pci/ops-tx4927.c @@ -85,6 +85,8 @@ static int check_abort(struct tx4927_pcic_reg __iomem *pcicptr)  		__raw_writel((__raw_readl(&pcicptr->pcistatus) & 0x0000ffff)  			     | (PCI_STATUS_REC_MASTER_ABORT << 16),  			     &pcicptr->pcistatus); +		/* flush write buffer */ +		iob();  		code = PCIBIOS_DEVICE_NOT_FOUND;  	}  	return code; @@ -406,3 +408,35 @@ void tx4927_report_pcic_status(void)  			tx4927_report_pcic_status1(pcicptrs[i].pcicptr);  	}  } + +#ifdef CONFIG_TOSHIBA_FPCIB0 +static void __init tx4927_quirk_slc90e66_bridge(struct pci_dev *dev) +{ +	struct tx4927_pcic_reg __iomem *pcicptr = pci_bus_to_pcicptr(dev->bus); + +	if (!pcicptr) +		return; +	if (__raw_readl(&pcicptr->pbacfg) & TX4927_PCIC_PBACFG_PBAEN) { +		/* Reset Bus Arbiter */ +		__raw_writel(TX4927_PCIC_PBACFG_RPBA, &pcicptr->pbacfg); +		/* +		 * swap reqBP and reqXP (raise priority of SLC90E66). +		 * SLC90E66(PCI-ISA bridge) is connected to REQ2 on +		 * PCI Backplane board. +		 */ +		__raw_writel(0x72543610, &pcicptr->pbareqport); +		__raw_writel(0, &pcicptr->pbabm); +		/* Use Fixed ParkMaster (required by SLC90E66) */ +		__raw_writel(TX4927_PCIC_PBACFG_FIXPA, &pcicptr->pbacfg); +		/* Enable Bus Arbiter */ +		__raw_writel(TX4927_PCIC_PBACFG_FIXPA | +			     TX4927_PCIC_PBACFG_PBAEN, +			     &pcicptr->pbacfg); +		printk(KERN_INFO "PCI: Use Fixed Park Master (REQPORT %08x)\n", +		       __raw_readl(&pcicptr->pbareqport)); +	} +} +#define PCI_DEVICE_ID_EFAR_SLC90E66_0 0x9460 +DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_EFAR, PCI_DEVICE_ID_EFAR_SLC90E66_0, +	tx4927_quirk_slc90e66_bridge); +#endif | 
