[MIPS] Malta: Fix for SOCitSC based Maltas

And an attempt to tidy up the core/controller differences.

Signed-off-by: Chris Dearman <chris@mips.com>
Signed-off-by: Ralf Baechle <ralf@linux-mips.org>

authored by Chris Dearman and committed by Ralf Baechle b72c0526 eedab661

+87 -64
+44 -18
arch/mips/mips-boards/generic/init.c
··· 57 58 int init_debug = 0; 59 60 - unsigned int mips_revision_corid; 61 62 /* Bonito64 system controller register base. */ 63 unsigned long _pcictrl_bonito; ··· 276 else 277 mips_revision_corid = MIPS_REVISION_CORID_CORE_EMUL_MSC; 278 } 279 - switch(mips_revision_corid) { 280 u32 start, map, mask, data; 281 282 - case MIPS_REVISION_CORID_QED_RM5261: 283 - case MIPS_REVISION_CORID_CORE_LV: 284 - case MIPS_REVISION_CORID_CORE_FPGA: 285 - case MIPS_REVISION_CORID_CORE_FPGAR2: 286 /* 287 * Setup the North bridge to do Master byte-lane swapping 288 * when running in bigendian. ··· 331 set_io_port_base(MALTA_GT_PORT_BASE); 332 break; 333 334 - case MIPS_REVISION_CORID_CORE_EMUL_BON: 335 - case MIPS_REVISION_CORID_BONITO64: 336 - case MIPS_REVISION_CORID_CORE_20K: 337 _pcictrl_bonito_pcicfg = (unsigned long)ioremap(BONITO_PCICFG_BASE, BONITO_PCICFG_SIZE); 338 339 /* ··· 358 set_io_port_base(MALTA_BONITO_PORT_BASE); 359 break; 360 361 - case MIPS_REVISION_CORID_CORE_MSC: 362 - case MIPS_REVISION_CORID_CORE_FPGA2: 363 - case MIPS_REVISION_CORID_CORE_FPGA3: 364 - case MIPS_REVISION_CORID_CORE_24K: 365 - case MIPS_REVISION_CORID_CORE_EMUL_MSC: 366 _pcictrl_msc = (unsigned long)ioremap(MIPS_MSC01_PCI_REG_BASE, 0x2000); 367 - 368 mb(); 369 MSC_READ(MSC01_PCI_CFG, data); 370 MSC_WRITE(MSC01_PCI_CFG, data & ~MSC01_PCI_CFG_EN_BIT); ··· 395 set_io_port_base(MALTA_MSC_PORT_BASE); 396 break; 397 398 default: 399 - /* Unknown Core card */ 400 - mips_display_message("CC Error"); 401 - while(1); /* We die here... */ 402 } 403 #endif 404 board_nmi_handler_setup = mips_nmi_setup;
··· 57 58 int init_debug = 0; 59 60 + int mips_revision_corid; 61 + int mips_revision_sconid; 62 63 /* Bonito64 system controller register base. */ 64 unsigned long _pcictrl_bonito; ··· 275 else 276 mips_revision_corid = MIPS_REVISION_CORID_CORE_EMUL_MSC; 277 } 278 + 279 + mips_revision_sconid = MIPS_REVISION_SCONID; 280 + if (mips_revision_sconid == MIPS_REVISION_SCON_OTHER) { 281 + switch (mips_revision_corid) { 282 + case MIPS_REVISION_CORID_QED_RM5261: 283 + case MIPS_REVISION_CORID_CORE_LV: 284 + case MIPS_REVISION_CORID_CORE_FPGA: 285 + case MIPS_REVISION_CORID_CORE_FPGAR2: 286 + mips_revision_sconid = MIPS_REVISION_SCON_GT64120; 287 + break; 288 + case MIPS_REVISION_CORID_CORE_EMUL_BON: 289 + case MIPS_REVISION_CORID_BONITO64: 290 + case MIPS_REVISION_CORID_CORE_20K: 291 + mips_revision_sconid = MIPS_REVISION_SCON_BONITO; 292 + break; 293 + case MIPS_REVISION_CORID_CORE_MSC: 294 + case MIPS_REVISION_CORID_CORE_FPGA2: 295 + case MIPS_REVISION_CORID_CORE_FPGA3: 296 + case MIPS_REVISION_CORID_CORE_24K: 297 + case MIPS_REVISION_CORID_CORE_EMUL_MSC: 298 + mips_revision_sconid = MIPS_REVISION_SCON_SOCIT; 299 + break; 300 + default: 301 + mips_display_message("CC Error"); 302 + while (1); /* We die here... */ 303 + } 304 + } 305 + 306 + switch (mips_revision_sconid) { 307 u32 start, map, mask, data; 308 309 + case MIPS_REVISION_SCON_GT64120: 310 /* 311 * Setup the North bridge to do Master byte-lane swapping 312 * when running in bigendian. ··· 305 set_io_port_base(MALTA_GT_PORT_BASE); 306 break; 307 308 + case MIPS_REVISION_SCON_BONITO: 309 _pcictrl_bonito_pcicfg = (unsigned long)ioremap(BONITO_PCICFG_BASE, BONITO_PCICFG_SIZE); 310 311 /* ··· 334 set_io_port_base(MALTA_BONITO_PORT_BASE); 335 break; 336 337 + case MIPS_REVISION_SCON_SOCIT: 338 + case MIPS_REVISION_SCON_ROCIT: 339 _pcictrl_msc = (unsigned long)ioremap(MIPS_MSC01_PCI_REG_BASE, 0x2000); 340 + mips_pci_controller: 341 mb(); 342 MSC_READ(MSC01_PCI_CFG, data); 343 MSC_WRITE(MSC01_PCI_CFG, data & ~MSC01_PCI_CFG_EN_BIT); ··· 374 set_io_port_base(MALTA_MSC_PORT_BASE); 375 break; 376 377 + case MIPS_REVISION_SCON_SOCITSC: 378 + case MIPS_REVISION_SCON_SOCITSCP: 379 + _pcictrl_msc = (unsigned long)ioremap(MIPS_SOCITSC_PCI_REG_BASE, 0x2000); 380 + goto mips_pci_controller; 381 + 382 default: 383 + /* Unknown system controller */ 384 + mips_display_message("SC Error"); 385 + while (1); /* We die here... */ 386 } 387 #endif 388 board_nmi_handler_setup = mips_nmi_setup;
+7 -13
arch/mips/mips-boards/generic/pci.c
··· 92 struct pci_controller *controller; 93 resource_size_t start, end, map, start1, end1, map1, map2, map3, mask; 94 95 - switch (mips_revision_corid) { 96 - case MIPS_REVISION_CORID_QED_RM5261: 97 - case MIPS_REVISION_CORID_CORE_LV: 98 - case MIPS_REVISION_CORID_CORE_FPGA: 99 - case MIPS_REVISION_CORID_CORE_FPGAR2: 100 /* 101 * Due to a bug in the Galileo system controller, we need 102 * to setup the PCI BAR for the Galileo internal registers. ··· 158 controller = &gt64120_controller; 159 break; 160 161 - case MIPS_REVISION_CORID_BONITO64: 162 - case MIPS_REVISION_CORID_CORE_20K: 163 - case MIPS_REVISION_CORID_CORE_EMUL_BON: 164 /* Set up resource ranges from the controller's registers. */ 165 map = BONITO_PCIMAP; 166 map1 = (BONITO_PCIMAP & BONITO_PCIMAP_PCIMAP_LO0) >> ··· 190 controller = &bonito64_controller; 191 break; 192 193 - case MIPS_REVISION_CORID_CORE_MSC: 194 - case MIPS_REVISION_CORID_CORE_FPGA2: 195 - case MIPS_REVISION_CORID_CORE_FPGA3: 196 - case MIPS_REVISION_CORID_CORE_24K: 197 - case MIPS_REVISION_CORID_CORE_EMUL_MSC: 198 /* Set up resource ranges from the controller's registers. */ 199 MSC_READ(MSC01_PCI_SC2PMBASL, start); 200 MSC_READ(MSC01_PCI_SC2PMMSKL, mask);
··· 92 struct pci_controller *controller; 93 resource_size_t start, end, map, start1, end1, map1, map2, map3, mask; 94 95 + switch (mips_revision_sconid) { 96 + case MIPS_REVISION_SCON_GT64120: 97 /* 98 * Due to a bug in the Galileo system controller, we need 99 * to setup the PCI BAR for the Galileo internal registers. ··· 161 controller = &gt64120_controller; 162 break; 163 164 + case MIPS_REVISION_SCON_BONITO: 165 /* Set up resource ranges from the controller's registers. */ 166 map = BONITO_PCIMAP; 167 map1 = (BONITO_PCIMAP & BONITO_PCIMAP_PCIMAP_LO0) >> ··· 195 controller = &bonito64_controller; 196 break; 197 198 + case MIPS_REVISION_SCON_SOCIT: 199 + case MIPS_REVISION_SCON_ROCIT: 200 + case MIPS_REVISION_SCON_SOCITSC: 201 + case MIPS_REVISION_SCON_SOCITSCP: 202 /* Set up resource ranges from the controller's registers. */ 203 MSC_READ(MSC01_PCI_SC2PMBASL, start); 204 MSC_READ(MSC01_PCI_SC2PMMSKL, mask);
+15 -27
arch/mips/mips-boards/malta/malta_int.c
··· 53 * Determine highest priority pending interrupt by performing 54 * a PCI Interrupt Acknowledge cycle. 55 */ 56 - switch(mips_revision_corid) { 57 - case MIPS_REVISION_CORID_CORE_MSC: 58 - case MIPS_REVISION_CORID_CORE_FPGA2: 59 - case MIPS_REVISION_CORID_CORE_FPGA3: 60 - case MIPS_REVISION_CORID_CORE_24K: 61 - case MIPS_REVISION_CORID_CORE_EMUL_MSC: 62 MSC_READ(MSC01_PCI_IACK, irq); 63 irq &= 0xff; 64 break; 65 - case MIPS_REVISION_CORID_QED_RM5261: 66 - case MIPS_REVISION_CORID_CORE_LV: 67 - case MIPS_REVISION_CORID_CORE_FPGA: 68 - case MIPS_REVISION_CORID_CORE_FPGAR2: 69 irq = GT_READ(GT_PCI0_IACK_OFS); 70 irq &= 0xff; 71 break; 72 - case MIPS_REVISION_CORID_BONITO64: 73 - case MIPS_REVISION_CORID_CORE_20K: 74 - case MIPS_REVISION_CORID_CORE_EMUL_BON: 75 /* The following will generate a PCI IACK cycle on the 76 * Bonito controller. It's a little bit kludgy, but it 77 * was the easiest way to implement it in hardware at ··· 83 BONITO_PCIMAP_CFG = 0; 84 break; 85 default: 86 - printk("Unknown Core card, don't know the system controller.\n"); 87 return -1; 88 } 89 return irq; ··· 138 Do it for the others too. 139 */ 140 141 - switch(mips_revision_corid) { 142 - case MIPS_REVISION_CORID_CORE_MSC: 143 - case MIPS_REVISION_CORID_CORE_FPGA2: 144 - case MIPS_REVISION_CORID_CORE_FPGA3: 145 - case MIPS_REVISION_CORID_CORE_24K: 146 - case MIPS_REVISION_CORID_CORE_EMUL_MSC: 147 ll_msc_irq(); 148 break; 149 - case MIPS_REVISION_CORID_QED_RM5261: 150 - case MIPS_REVISION_CORID_CORE_LV: 151 - case MIPS_REVISION_CORID_CORE_FPGA: 152 - case MIPS_REVISION_CORID_CORE_FPGAR2: 153 intrcause = GT_READ(GT_INTRCAUSE_OFS); 154 datalo = GT_READ(GT_CPUERR_ADDRLO_OFS); 155 datahi = GT_READ(GT_CPUERR_ADDRHI_OFS); 156 printk("GT_INTRCAUSE = %08x\n", intrcause); 157 printk("GT_CPUERR_ADDR = %02x%08x\n", datahi, datalo); 158 break; 159 - case MIPS_REVISION_CORID_BONITO64: 160 - case MIPS_REVISION_CORID_CORE_20K: 161 - case MIPS_REVISION_CORID_CORE_EMUL_BON: 162 pcibadaddr = BONITO_PCIBADADDR; 163 pcimstat = BONITO_PCIMSTAT; 164 intisr = BONITO_INTISR;
··· 53 * Determine highest priority pending interrupt by performing 54 * a PCI Interrupt Acknowledge cycle. 55 */ 56 + switch (mips_revision_sconid) { 57 + case MIPS_REVISION_SCON_SOCIT: 58 + case MIPS_REVISION_SCON_ROCIT: 59 + case MIPS_REVISION_SCON_SOCITSC: 60 + case MIPS_REVISION_SCON_SOCITSCP: 61 MSC_READ(MSC01_PCI_IACK, irq); 62 irq &= 0xff; 63 break; 64 + case MIPS_REVISION_SCON_GT64120: 65 irq = GT_READ(GT_PCI0_IACK_OFS); 66 irq &= 0xff; 67 break; 68 + case MIPS_REVISION_SCON_BONITO: 69 /* The following will generate a PCI IACK cycle on the 70 * Bonito controller. It's a little bit kludgy, but it 71 * was the easiest way to implement it in hardware at ··· 89 BONITO_PCIMAP_CFG = 0; 90 break; 91 default: 92 + printk("Unknown system controller.\n"); 93 return -1; 94 } 95 return irq; ··· 144 Do it for the others too. 145 */ 146 147 + switch (mips_revision_sconid) { 148 + case MIPS_REVISION_SCON_SOCIT: 149 + case MIPS_REVISION_SCON_ROCIT: 150 + case MIPS_REVISION_SCON_SOCITSC: 151 + case MIPS_REVISION_SCON_SOCITSCP: 152 ll_msc_irq(); 153 break; 154 + case MIPS_REVISION_SCON_GT64120: 155 intrcause = GT_READ(GT_INTRCAUSE_OFS); 156 datalo = GT_READ(GT_CPUERR_ADDRLO_OFS); 157 datahi = GT_READ(GT_CPUERR_ADDRHI_OFS); 158 printk("GT_INTRCAUSE = %08x\n", intrcause); 159 printk("GT_CPUERR_ADDR = %02x%08x\n", datahi, datalo); 160 break; 161 + case MIPS_REVISION_SCON_BONITO: 162 pcibadaddr = BONITO_PCIBADADDR; 163 pcimstat = BONITO_PCIMSTAT; 164 intisr = BONITO_INTISR;
+1 -3
arch/mips/mips-boards/malta/malta_setup.c
··· 103 kgdb_config (); 104 #endif 105 106 - if ((mips_revision_corid == MIPS_REVISION_CORID_BONITO64) || 107 - (mips_revision_corid == MIPS_REVISION_CORID_CORE_20K) || 108 - (mips_revision_corid == MIPS_REVISION_CORID_CORE_EMUL_BON)) { 109 char *argptr; 110 111 argptr = prom_getcmdline();
··· 103 kgdb_config (); 104 #endif 105 106 + if (mips_revision_sconid == MIPS_REVISION_SCON_BONITO) { 107 char *argptr; 108 109 argptr = prom_getcmdline();
+19 -3
include/asm-mips/mips-boards/generic.h
··· 73 * CoreEMUL with Bonito System Controller is treated like a Core20K 74 * CoreEMUL with SOC-it 101 System Controller is treated like a CoreMSC 75 */ 76 - #define MIPS_REVISION_CORID_CORE_EMUL_BON 0x63 77 - #define MIPS_REVISION_CORID_CORE_EMUL_MSC 0x65 78 79 #define MIPS_REVISION_CORID (((*(volatile u32 *)ioremap(MIPS_REVISION_REG, 4)) >> 10) & 0x3f) 80 81 - extern unsigned int mips_revision_corid; 82 83 #ifdef CONFIG_PCI 84 extern void mips_pcibios_init(void);
··· 73 * CoreEMUL with Bonito System Controller is treated like a Core20K 74 * CoreEMUL with SOC-it 101 System Controller is treated like a CoreMSC 75 */ 76 + #define MIPS_REVISION_CORID_CORE_EMUL_BON -1 77 + #define MIPS_REVISION_CORID_CORE_EMUL_MSC -2 78 79 #define MIPS_REVISION_CORID (((*(volatile u32 *)ioremap(MIPS_REVISION_REG, 4)) >> 10) & 0x3f) 80 81 + extern int mips_revision_corid; 82 + 83 + #define MIPS_REVISION_SCON_OTHER 0 84 + #define MIPS_REVISION_SCON_SOCITSC 1 85 + #define MIPS_REVISION_SCON_SOCITSCP 2 86 + 87 + /* Artificial SCON defines for MIPS_REVISION_SCON_OTHER */ 88 + #define MIPS_REVISION_SCON_UNKNOWN -1 89 + #define MIPS_REVISION_SCON_GT64120 -2 90 + #define MIPS_REVISION_SCON_BONITO -3 91 + #define MIPS_REVISION_SCON_BRTL -4 92 + #define MIPS_REVISION_SCON_SOCIT -5 93 + #define MIPS_REVISION_SCON_ROCIT -6 94 + 95 + #define MIPS_REVISION_SCONID (((*(volatile u32 *)ioremap(MIPS_REVISION_REG, 4)) >> 24) & 0xff) 96 + 97 + extern int mips_revision_sconid; 98 99 #ifdef CONFIG_PCI 100 extern void mips_pcibios_init(void);
+1
include/asm-mips/mips-boards/msc01_pci.h
··· 208 * latter, they should be moved elsewhere. 209 */ 210 #define MIPS_MSC01_PCI_REG_BASE 0x1bd00000 211 212 extern unsigned long _pcictrl_msc; 213
··· 208 * latter, they should be moved elsewhere. 209 */ 210 #define MIPS_MSC01_PCI_REG_BASE 0x1bd00000 211 + #define MIPS_SOCITSC_PCI_REG_BASE 0x1ff10000 212 213 extern unsigned long _pcictrl_msc; 214