1
linux/arch/sh/drivers/pci/pci-sh4.h
Greg Kroah-Hartman 1ba6ab11d8 PCI: remove initial bios sort of PCI devices on x86
We currently keep 2 lists of PCI devices in the system, one in the
driver core, and one all on its own.  This second list is sorted at boot
time, in "BIOS" order, to try to remain compatible with older kernels
(2.2 and earlier days).  There was also a "nosort" option to turn this
sorting off, to remain compatible with even older kernel versions, but
that just ends up being what we have been doing from 2.5 days...

Unfortunately, the second list of devices is not really ever used to 
determine the probing order of PCI devices or drivers[1].  That is done
using the driver core list instead.  This change happened back in the
early 2.5 days.

Relying on BIOS ording for the binding of drivers to specific device
names is problematic for many reasons, and userspace tools like udev
exist to properly name devices in a persistant manner if that is needed,
no reliance on the BIOS is needed.

Matt Domsch and others at Dell noticed this back in 2006, and added a
boot option to sort the PCI device lists (both of them) in a
breadth-first manner to help remain compatible with the 2.4 order, if
needed for any reason.  This option is not going away, as some systems
rely on them.

This patch removes the sorting of the internal PCI device list in "BIOS"
mode, as it's not needed at all anymore, and hasn't for many years.
I've also removed the PCI flags for this from some other arches that for
some reason defined them, but never used them.

This should not change the ordering of any drivers or device probing.

[1] The old-style pci_get_device and pci_find_device() still used this
sorting order, but there are very few drivers that use these functions,
as they are deprecated for use in this manner.  If for some reason, a
driver rely on the order and uses these functions, the breadth-first
boot option will resolve any problem.

Cc: Matt Domsch <Matt_Domsch@dell.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
2008-04-20 21:46:58 -07:00

181 lines
8.7 KiB
C

#ifndef __PCI_SH4_H
#define __PCI_SH4_H
#if defined(CONFIG_CPU_SUBTYPE_SH7780) || \
defined(CONFIG_CPU_SUBTYPE_SH7785) || \
defined(CONFIG_CPU_SUBTYPE_SH7763)
#include "pci-sh7780.h"
#else
#include "pci-sh7751.h"
#endif
#include <asm/io.h>
/* startup values */
#define PCI_PROBE_BIOS 1
#define PCI_PROBE_CONF1 2
#define PCI_PROBE_CONF2 4
#define PCI_NO_CHECKS 0x400
#define PCI_ASSIGN_ROMS 0x1000
#define PCI_BIOS_IRQ_SCAN 0x2000
#define SH4_PCICR 0x100 /* PCI Control Register */
#define SH4_PCICR_PREFIX 0xA5000000 /* CR prefix for write */
#define SH4_PCICR_FTO 0x00000400 /* TRDY/IRDY Enable */
#define SH4_PCICR_TRSB 0x00000200 /* Target Read Single */
#define SH4_PCICR_BSWP 0x00000100 /* Target Byte Swap */
#define SH4_PCICR_PLUP 0x00000080 /* Enable PCI Pullup */
#define SH4_PCICR_ARBM 0x00000040 /* PCI Arbitration Mode */
#define SH4_PCICR_MD 0x00000030 /* MD9 and MD10 status */
#define SH4_PCICR_SERR 0x00000008 /* SERR output assert */
#define SH4_PCICR_INTA 0x00000004 /* INTA output assert */
#define SH4_PCICR_PRST 0x00000002 /* PCI Reset Assert */
#define SH4_PCICR_CFIN 0x00000001 /* Central Fun. Init Done */
#define SH4_PCILSR0 0x104 /* PCI Local Space Register0 */
#define SH4_PCILSR1 0x108 /* PCI Local Space Register1 */
#define SH4_PCILAR0 0x10C /* PCI Local Addr Register1 */
#define SH4_PCILAR1 0x110 /* PCI Local Addr Register1 */
#define SH4_PCIINT 0x114 /* PCI Interrupt Register */
#define SH4_PCIINT_MLCK 0x00008000 /* Master Lock Error */
#define SH4_PCIINT_TABT 0x00004000 /* Target Abort Error */
#define SH4_PCIINT_TRET 0x00000200 /* Target Retry Error */
#define SH4_PCIINT_MFDE 0x00000100 /* Master Func. Disable Error */
#define SH4_PCIINT_PRTY 0x00000080 /* Address Parity Error */
#define SH4_PCIINT_SERR 0x00000040 /* SERR Detection Error */
#define SH4_PCIINT_TWDP 0x00000020 /* Tgt. Write Parity Error */
#define SH4_PCIINT_TRDP 0x00000010 /* Tgt. Read Parity Err Det. */
#define SH4_PCIINT_MTABT 0x00000008 /* Master-Tgt. Abort Error */
#define SH4_PCIINT_MMABT 0x00000004 /* Master-Master Abort Error */
#define SH4_PCIINT_MWPD 0x00000002 /* Master Write PERR Detect */
#define SH4_PCIINT_MRPD 0x00000001 /* Master Read PERR Detect */
#define SH4_PCIINTM 0x118 /* PCI Interrupt Mask */
#define SH4_PCIALR 0x11C /* Error Address Register */
#define SH4_PCICLR 0x120 /* Error Command/Data */
#define SH4_PCICLR_MPIO 0x80000000
#define SH4_PCICLR_MDMA0 0x40000000 /* DMA0 Transfer Error */
#define SH4_PCICLR_MDMA1 0x20000000 /* DMA1 Transfer Error */
#define SH4_PCICLR_MDMA2 0x10000000 /* DMA2 Transfer Error */
#define SH4_PCICLR_MDMA3 0x08000000 /* DMA3 Transfer Error */
#define SH4_PCICLR_TGT 0x04000000 /* Target Transfer Error */
#define SH4_PCICLR_CMDL 0x0000000F /* PCI Command at Error */
#define SH4_PCIAINT 0x130 /* Arbiter Interrupt Register */
#define SH4_PCIAINT_MBKN 0x00002000 /* Master Broken Interrupt */
#define SH4_PCIAINT_TBTO 0x00001000 /* Target Bus Time Out */
#define SH4_PCIAINT_MBTO 0x00001000 /* Master Bus Time Out */
#define SH4_PCIAINT_TABT 0x00000008 /* Target Abort */
#define SH4_PCIAINT_MABT 0x00000004 /* Master Abort */
#define SH4_PCIAINT_RDPE 0x00000002 /* Read Data Parity Error */
#define SH4_PCIAINT_WDPE 0x00000001 /* Write Data Parity Error */
#define SH4_PCIAINTM 0x134 /* Arbiter Int. Mask Register */
#define SH4_PCIBMLR 0x138 /* Error Bus Master Register */
#define SH4_PCIBMLR_REQ4 0x00000010 /* REQ4 bus master at error */
#define SH4_PCIBMLR_REQ3 0x00000008 /* REQ3 bus master at error */
#define SH4_PCIBMLR_REQ2 0x00000004 /* REQ2 bus master at error */
#define SH4_PCIBMLR_REQ1 0x00000002 /* REQ1 bus master at error */
#define SH4_PCIBMLR_REQ0 0x00000001 /* REQ0 bus master at error */
#define SH4_PCIDMABT 0x140 /* DMA Transfer Arb. Register */
#define SH4_PCIDMABT_RRBN 0x00000001 /* DMA Arbitor Round-Robin */
#define SH4_PCIDPA0 0x180 /* DMA0 Transfer Addr. */
#define SH4_PCIDLA0 0x184 /* DMA0 Local Addr. */
#define SH4_PCIDTC0 0x188 /* DMA0 Transfer Cnt. */
#define SH4_PCIDCR0 0x18C /* DMA0 Control Register */
#define SH4_PCIDCR_ALGN 0x00000600 /* DMA Alignment Mode */
#define SH4_PCIDCR_MAST 0x00000100 /* DMA Termination Type */
#define SH4_PCIDCR_INTM 0x00000080 /* DMA Interrupt Done Mask*/
#define SH4_PCIDCR_INTS 0x00000040 /* DMA Interrupt Done Status */
#define SH4_PCIDCR_LHLD 0x00000020 /* Local Address Control */
#define SH4_PCIDCR_PHLD 0x00000010 /* PCI Address Control*/
#define SH4_PCIDCR_IOSEL 0x00000008 /* PCI Address Space Type */
#define SH4_PCIDCR_DIR 0x00000004 /* DMA Transfer Direction */
#define SH4_PCIDCR_STOP 0x00000002 /* Force DMA Stop */
#define SH4_PCIDCR_STRT 0x00000001 /* DMA Start */
#define SH4_PCIDPA1 0x190 /* DMA1 Transfer Addr. */
#define SH4_PCIDLA1 0x194 /* DMA1 Local Addr. */
#define SH4_PCIDTC1 0x198 /* DMA1 Transfer Cnt. */
#define SH4_PCIDCR1 0x19C /* DMA1 Control Register */
#define SH4_PCIDPA2 0x1A0 /* DMA2 Transfer Addr. */
#define SH4_PCIDLA2 0x1A4 /* DMA2 Local Addr. */
#define SH4_PCIDTC2 0x1A8 /* DMA2 Transfer Cnt. */
#define SH4_PCIDCR2 0x1AC /* DMA2 Control Register */
#define SH4_PCIDPA3 0x1B0 /* DMA3 Transfer Addr. */
#define SH4_PCIDLA3 0x1B4 /* DMA3 Local Addr. */
#define SH4_PCIDTC3 0x1B8 /* DMA3 Transfer Cnt. */
#define SH4_PCIDCR3 0x1BC /* DMA3 Control Register */
#define SH4_PCIPAR 0x1C0 /* PIO Address Register */
#define SH4_PCIPAR_CFGEN 0x80000000 /* Configuration Enable */
#define SH4_PCIPAR_BUSNO 0x00FF0000 /* Config. Bus Number */
#define SH4_PCIPAR_DEVNO 0x0000FF00 /* Config. Device Number */
#define SH4_PCIPAR_REGAD 0x000000FC /* Register Address Number */
#define SH4_PCIMBR 0x1C4 /* Memory Base Address */
#define SH4_PCIMBR_MASK 0xFF000000 /* Memory Space Mask */
#define SH4_PCIMBR_LOCK 0x00000001 /* Lock Memory Space */
#define SH4_PCIIOBR 0x1C8 /* I/O Base Address Register */
#define SH4_PCIIOBR_MASK 0xFFFC0000 /* IO Space Mask */
#define SH4_PCIIOBR_LOCK 0x00000001 /* Lock IO Space */
#define SH4_PCIPINT 0x1CC /* Power Mgmnt Int. Register */
#define SH4_PCIPINT_D3 0x00000002 /* D3 Pwr Mgmt. Interrupt */
#define SH4_PCIPINT_D0 0x00000001 /* D0 Pwr Mgmt. Interrupt */
#define SH4_PCIPINTM 0x1D0 /* Power Mgmnt Mask Register */
#define SH4_PCICLKR 0x1D4 /* Clock Ctrl. Register */
#define SH4_PCICLKR_PCSTP 0x00000002 /* PCI Clock Stop */
#define SH4_PCICLKR_BCSTP 0x00000001 /* BCLK Clock Stop */
/* For definitions of BCR, MCR see ... */
#define SH4_PCIBCR1 0x1E0 /* Memory BCR1 Register */
#define SH4_PCIMBR0 SH4_PCIBCR1
#define SH4_PCIBCR2 0x1E4 /* Memory BCR2 Register */
#define SH4_PCIMBMR0 SH4_PCIBCR2
#define SH4_PCIWCR1 0x1E8 /* Wait Control 1 Register */
#define SH4_PCIWCR2 0x1EC /* Wait Control 2 Register */
#define SH4_PCIWCR3 0x1F0 /* Wait Control 3 Register */
#define SH4_PCIMBR2 SH4_PCIWCR3
#define SH4_PCIMCR 0x1F4 /* Memory Control Register */
#define SH4_PCIBCR3 0x1f8 /* Memory BCR3 Register */
#define SH4_PCIPCTR 0x200 /* Port Control Register */
#define SH4_PCIPCTR_P2EN 0x000400000 /* Port 2 Enable */
#define SH4_PCIPCTR_P1EN 0x000200000 /* Port 1 Enable */
#define SH4_PCIPCTR_P0EN 0x000100000 /* Port 0 Enable */
#define SH4_PCIPCTR_P2UP 0x000000020 /* Port2 Pull Up Enable */
#define SH4_PCIPCTR_P2IO 0x000000010 /* Port2 Output Enable */
#define SH4_PCIPCTR_P1UP 0x000000008 /* Port1 Pull Up Enable */
#define SH4_PCIPCTR_P1IO 0x000000004 /* Port1 Output Enable */
#define SH4_PCIPCTR_P0UP 0x000000002 /* Port0 Pull Up Enable */
#define SH4_PCIPCTR_P0IO 0x000000001 /* Port0 Output Enable */
#define SH4_PCIPDTR 0x204 /* Port Data Register */
#define SH4_PCIPDTR_PB5 0x000000020 /* Port 5 Enable */
#define SH4_PCIPDTR_PB4 0x000000010 /* Port 4 Enable */
#define SH4_PCIPDTR_PB3 0x000000008 /* Port 3 Enable */
#define SH4_PCIPDTR_PB2 0x000000004 /* Port 2 Enable */
#define SH4_PCIPDTR_PB1 0x000000002 /* Port 1 Enable */
#define SH4_PCIPDTR_PB0 0x000000001 /* Port 0 Enable */
#define SH4_PCIPDR 0x220 /* Port IO Data Register */
/* Flags */
#define SH4_PCIC_NO_RESET 0x0001
/* arch/sh/kernel/drivers/pci/ops-sh4.c */
extern struct pci_ops sh4_pci_ops;
int sh4_pci_check_direct(void);
int pci_fixup_pcic(void);
struct sh4_pci_address_space {
unsigned long base;
unsigned long size;
};
struct sh4_pci_address_map {
struct sh4_pci_address_space window0;
struct sh4_pci_address_space window1;
unsigned long flags;
};
static inline void pci_write_reg(unsigned long val, unsigned long reg)
{
ctrl_outl(val, PCI_REG(reg));
}
static inline unsigned long pci_read_reg(unsigned long reg)
{
return ctrl_inl(PCI_REG(reg));
}
#endif /* __PCI_SH4_H */