2005-04-17 02:20:36 +04:00
# include <linux/init.h>
# include <linux/pci.h>
2013-10-07 20:45:04 +04:00
# include <asm/mips-boards/piix4.h>
2005-04-17 02:20:36 +04:00
/* PCI interrupt pins */
# define PCIA 1
# define PCIB 2
# define PCIC 3
# define PCID 4
/* This table is filled in by interrogating the PIIX4 chip */
2012-12-22 02:04:39 +04:00
static char pci_irq [ 5 ] = {
2012-10-11 13:14:12 +04:00
} ;
2005-04-17 02:20:36 +04:00
static char irq_tab [ ] [ 5 ] __initdata = {
2013-01-22 15:59:30 +04:00
/* INTA INTB INTC INTD */
2005-04-17 02:20:36 +04:00
{ 0 , 0 , 0 , 0 , 0 } , /* 0: GT64120 PCI bridge */
{ 0 , 0 , 0 , 0 , 0 } , /* 1: Unused */
{ 0 , 0 , 0 , 0 , 0 } , /* 2: Unused */
{ 0 , 0 , 0 , 0 , 0 } , /* 3: Unused */
{ 0 , 0 , 0 , 0 , 0 } , /* 4: Unused */
{ 0 , 0 , 0 , 0 , 0 } , /* 5: Unused */
{ 0 , 0 , 0 , 0 , 0 } , /* 6: Unused */
{ 0 , 0 , 0 , 0 , 0 } , /* 7: Unused */
{ 0 , 0 , 0 , 0 , 0 } , /* 8: Unused */
{ 0 , 0 , 0 , 0 , 0 } , /* 9: Unused */
2013-01-22 15:59:30 +04:00
{ 0 , 0 , 0 , 0 , PCID } , /* 10: PIIX4 USB */
2005-04-17 02:20:36 +04:00
{ 0 , PCIB , 0 , 0 , 0 } , /* 11: AMD 79C973 Ethernet */
{ 0 , PCIC , 0 , 0 , 0 } , /* 12: Crystal 4281 Sound */
{ 0 , 0 , 0 , 0 , 0 } , /* 13: Unused */
{ 0 , 0 , 0 , 0 , 0 } , /* 14: Unused */
{ 0 , 0 , 0 , 0 , 0 } , /* 15: Unused */
{ 0 , 0 , 0 , 0 , 0 } , /* 16: Unused */
{ 0 , 0 , 0 , 0 , 0 } , /* 17: Bonito/SOC-it PCI Bridge*/
2013-01-22 15:59:30 +04:00
{ 0 , PCIA , PCIB , PCIC , PCID } , /* 18: PCI Slot 1 */
{ 0 , PCIB , PCIC , PCID , PCIA } , /* 19: PCI Slot 2 */
{ 0 , PCIC , PCID , PCIA , PCIB } , /* 20: PCI Slot 3 */
2005-04-17 02:20:36 +04:00
{ 0 , PCID , PCIA , PCIB , PCIC } /* 21: PCI Slot 4 */
} ;
2007-07-10 20:33:00 +04:00
int __init pcibios_map_irq ( const struct pci_dev * dev , u8 slot , u8 pin )
2005-04-17 02:20:36 +04:00
{
int virq ;
virq = irq_tab [ slot ] [ pin ] ;
return pci_irq [ virq ] ;
}
/* Do platform specific device initialization at pci_enable_device() time */
int pcibios_plat_dev_init ( struct pci_dev * dev )
{
return 0 ;
}
2012-12-22 02:04:39 +04:00
static void malta_piix_func0_fixup ( struct pci_dev * pdev )
2005-04-17 02:20:36 +04:00
{
unsigned char reg_val ;
2013-10-07 20:45:04 +04:00
/* PIIX PIRQC[A:D] irq mappings */
static int piixirqmap [ PIIX4_FUNC0_PIRQRC_IRQ_ROUTING_MAX ] = {
2013-01-22 15:59:30 +04:00
0 , 0 , 0 , 3 ,
4 , 5 , 6 , 7 ,
2005-04-17 02:20:36 +04:00
0 , 9 , 10 , 11 ,
2005-09-04 02:56:17 +04:00
12 , 0 , 14 , 15
2005-04-17 02:20:36 +04:00
} ;
int i ;
/* Interrogate PIIX4 to get PCI IRQ mapping */
for ( i = 0 ; i < = 3 ; i + + ) {
2013-10-07 20:45:04 +04:00
pci_read_config_byte ( pdev , PIIX4_FUNC0_PIRQRC + i , & reg_val ) ;
if ( reg_val & PIIX4_FUNC0_PIRQRC_IRQ_ROUTING_DISABLE )
2005-04-17 02:20:36 +04:00
pci_irq [ PCIA + i ] = 0 ; /* Disabled */
else
2013-10-07 20:45:04 +04:00
pci_irq [ PCIA + i ] = piixirqmap [ reg_val &
PIIX4_FUNC0_PIRQRC_IRQ_ROUTING_MASK ] ;
2005-04-17 02:20:36 +04:00
}
/* Done by YAMON 2.00 onwards */
if ( PCI_SLOT ( pdev - > devfn ) = = 10 ) {
/*
* Set top of main memory accessible by ISA or DMA
* devices to 16 Mb .
*/
2013-10-07 20:45:04 +04:00
pci_read_config_byte ( pdev , PIIX4_FUNC0_TOM , & reg_val ) ;
pci_write_config_byte ( pdev , PIIX4_FUNC0_TOM , reg_val |
PIIX4_FUNC0_TOM_TOP_OF_MEMORY_MASK ) ;
2005-04-17 02:20:36 +04:00
}
}
DECLARE_PCI_FIXUP_HEADER ( PCI_VENDOR_ID_INTEL , PCI_DEVICE_ID_INTEL_82371AB_0 ,
malta_piix_func0_fixup ) ;
2012-12-22 02:04:39 +04:00
static void malta_piix_func1_fixup ( struct pci_dev * pdev )
2005-04-17 02:20:36 +04:00
{
unsigned char reg_val ;
/* Done by YAMON 2.02 onwards */
if ( PCI_SLOT ( pdev - > devfn ) = = 10 ) {
/*
* IDE Decode enable .
*/
2013-10-07 20:45:04 +04:00
pci_read_config_byte ( pdev , PIIX4_FUNC1_IDETIM_PRIMARY_HI ,
& reg_val ) ;
pci_write_config_byte ( pdev , PIIX4_FUNC1_IDETIM_PRIMARY_HI ,
reg_val | PIIX4_FUNC1_IDETIM_PRIMARY_HI_IDE_DECODE_EN ) ;
pci_read_config_byte ( pdev , PIIX4_FUNC1_IDETIM_SECONDARY_HI ,
& reg_val ) ;
pci_write_config_byte ( pdev , PIIX4_FUNC1_IDETIM_SECONDARY_HI ,
reg_val | PIIX4_FUNC1_IDETIM_SECONDARY_HI_IDE_DECODE_EN ) ;
2005-04-17 02:20:36 +04:00
}
}
DECLARE_PCI_FIXUP_HEADER ( PCI_VENDOR_ID_INTEL , PCI_DEVICE_ID_INTEL_82371AB ,
malta_piix_func1_fixup ) ;
2012-06-06 14:14:08 +04:00
/* Enable PCI 2.1 compatibility in PIIX4 */
2012-12-22 02:04:39 +04:00
static void quirk_dlcsetup ( struct pci_dev * dev )
2012-06-06 14:14:08 +04:00
{
u8 odlc , ndlc ;
2013-10-07 20:45:04 +04:00
( void ) pci_read_config_byte ( dev , PIIX4_FUNC0_DLC , & odlc ) ;
2012-06-06 14:14:08 +04:00
/* Enable passive releases and delayed transaction */
2013-10-07 20:45:04 +04:00
ndlc = odlc | PIIX4_FUNC0_DLC_USBPR_EN |
PIIX4_FUNC0_DLC_PASSIVE_RELEASE_EN |
PIIX4_FUNC0_DLC_DELAYED_TRANSACTION_EN ;
( void ) pci_write_config_byte ( dev , PIIX4_FUNC0_DLC , ndlc ) ;
2012-06-06 14:14:08 +04:00
}
DECLARE_PCI_FIXUP_FINAL ( PCI_VENDOR_ID_INTEL , PCI_DEVICE_ID_INTEL_82371AB_0 ,
quirk_dlcsetup ) ;