1 /* 2 * Copyright 2007 Freescale Semiconductor, Inc. 3 * 4 * See file CREDITS for list of people who contributed to this 5 * project. 6 * 7 * This program is free software; you can redistribute it and/or 8 * modify it under the terms of the GNU General Public License as 9 * published by the Free Software Foundation; either version 2 of 10 * the License, or (at your option) any later version. 11 * 12 * This program is distributed in the hope that it will be useful, 13 * but WITHOUT ANY WARRANTY; without even the implied warranty of 14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 15 * GNU General Public License for more details. 16 * 17 * You should have received a copy of the GNU General Public License 18 * along with this program; if not, write to the Free Software 19 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, 20 * MA 02111-1307 USA 21 */ 22 23 #include <common.h> 24 #include <command.h> 25 #include <pci.h> 26 #include <asm/processor.h> 27 #include <asm/mmu.h> 28 #include <asm/immap_85xx.h> 29 #include <asm/immap_fsl_pci.h> 30 #include <asm/fsl_ddr_sdram.h> 31 #include <asm/io.h> 32 #include <miiphy.h> 33 #include <libfdt.h> 34 #include <fdt_support.h> 35 #include <tsec.h> 36 #include <netdev.h> 37 38 #include "../common/pixis.h" 39 #include "../common/sgmii_riser.h" 40 41 #if defined(CONFIG_DDR_ECC) && !defined(CONFIG_ECC_INIT_VIA_DDRCONTROLLER) 42 extern void ddr_enable_ecc(unsigned int dram_size); 43 #endif 44 45 int checkboard (void) 46 { 47 volatile ccsr_gur_t *gur = (void *)(CFG_MPC85xx_GUTS_ADDR); 48 volatile ccsr_lbc_t *lbc = (void *)(CFG_MPC85xx_LBC_ADDR); 49 volatile ccsr_local_ecm_t *ecm = (void *)(CFG_MPC85xx_ECM_ADDR); 50 51 if ((uint)&gur->porpllsr != 0xe00e0000) { 52 printf("immap size error %lx\n",(ulong)&gur->porpllsr); 53 } 54 printf ("Board: MPC8544DS, System ID: 0x%02x, " 55 "System Version: 0x%02x, FPGA Version: 0x%02x\n", 56 in8(PIXIS_BASE + PIXIS_ID), in8(PIXIS_BASE + PIXIS_VER), 57 in8(PIXIS_BASE + PIXIS_PVER)); 58 59 lbc->ltesr = 0xffffffff; /* Clear LBC error interrupts */ 60 lbc->lteir = 0xffffffff; /* Enable LBC error interrupts */ 61 ecm->eedr = 0xffffffff; /* Clear ecm errors */ 62 ecm->eeer = 0xffffffff; /* Enable ecm errors */ 63 64 return 0; 65 } 66 67 phys_size_t 68 initdram(int board_type) 69 { 70 long dram_size = 0; 71 72 puts("Initializing\n"); 73 74 dram_size = fsl_ddr_sdram(); 75 76 dram_size = setup_ddr_tlbs(dram_size / 0x100000); 77 78 dram_size *= 0x100000; 79 80 #if defined(CONFIG_DDR_ECC) && !defined(CONFIG_ECC_INIT_VIA_DDRCONTROLLER) 81 /* 82 * Initialize and enable DDR ECC. 83 */ 84 ddr_enable_ecc(dram_size); 85 #endif 86 puts(" DDR: "); 87 return dram_size; 88 } 89 90 #ifdef CONFIG_PCI1 91 static struct pci_controller pci1_hose; 92 #endif 93 94 #ifdef CONFIG_PCIE1 95 static struct pci_controller pcie1_hose; 96 #endif 97 98 #ifdef CONFIG_PCIE2 99 static struct pci_controller pcie2_hose; 100 #endif 101 102 #ifdef CONFIG_PCIE3 103 static struct pci_controller pcie3_hose; 104 #endif 105 106 int first_free_busno=0; 107 108 void 109 pci_init_board(void) 110 { 111 volatile ccsr_gur_t *gur = (void *)(CFG_MPC85xx_GUTS_ADDR); 112 uint devdisr = gur->devdisr; 113 uint io_sel = (gur->pordevsr & MPC85xx_PORDEVSR_IO_SEL) >> 19; 114 uint host_agent = (gur->porbmsr & MPC85xx_PORBMSR_HA) >> 16; 115 116 debug (" pci_init_board: devdisr=%x, io_sel=%x, host_agent=%x\n", 117 devdisr, io_sel, host_agent); 118 119 if (io_sel & 1) { 120 if (!(gur->pordevsr & MPC85xx_PORDEVSR_SGMII1_DIS)) 121 printf (" eTSEC1 is in sgmii mode.\n"); 122 if (!(gur->pordevsr & MPC85xx_PORDEVSR_SGMII3_DIS)) 123 printf (" eTSEC3 is in sgmii mode.\n"); 124 } 125 126 #ifdef CONFIG_PCIE3 127 { 128 volatile ccsr_fsl_pci_t *pci = (ccsr_fsl_pci_t *) CFG_PCIE3_ADDR; 129 extern void fsl_pci_init(struct pci_controller *hose); 130 struct pci_controller *hose = &pcie3_hose; 131 int pcie_ep = (host_agent == 1); 132 int pcie_configured = io_sel >= 1; 133 134 if (pcie_configured && !(devdisr & MPC85xx_DEVDISR_PCIE)){ 135 printf ("\n PCIE3 connected to ULI as %s (base address %x)", 136 pcie_ep ? "End Point" : "Root Complex", 137 (uint)pci); 138 if (pci->pme_msg_det) { 139 pci->pme_msg_det = 0xffffffff; 140 debug (" with errors. Clearing. Now 0x%08x",pci->pme_msg_det); 141 } 142 printf ("\n"); 143 144 /* inbound */ 145 pci_set_region(hose->regions + 0, 146 CFG_PCI_MEMORY_BUS, 147 CFG_PCI_MEMORY_PHYS, 148 CFG_PCI_MEMORY_SIZE, 149 PCI_REGION_MEM | PCI_REGION_MEMORY); 150 151 /* outbound memory */ 152 pci_set_region(hose->regions + 1, 153 CFG_PCIE3_MEM_BASE, 154 CFG_PCIE3_MEM_PHYS, 155 CFG_PCIE3_MEM_SIZE, 156 PCI_REGION_MEM); 157 158 /* outbound io */ 159 pci_set_region(hose->regions + 2, 160 CFG_PCIE3_IO_BASE, 161 CFG_PCIE3_IO_PHYS, 162 CFG_PCIE3_IO_SIZE, 163 PCI_REGION_IO); 164 165 hose->region_count = 3; 166 #ifdef CFG_PCIE3_MEM_BASE2 167 /* outbound memory */ 168 pci_set_region(hose->regions + 3, 169 CFG_PCIE3_MEM_BASE2, 170 CFG_PCIE3_MEM_PHYS2, 171 CFG_PCIE3_MEM_SIZE2, 172 PCI_REGION_MEM); 173 hose->region_count++; 174 #endif 175 hose->first_busno=first_free_busno; 176 pci_setup_indirect(hose, (int) &pci->cfg_addr, (int) &pci->cfg_data); 177 178 fsl_pci_init(hose); 179 180 first_free_busno=hose->last_busno+1; 181 printf (" PCIE3 on bus %02x - %02x\n", 182 hose->first_busno,hose->last_busno); 183 184 /* 185 * Activate ULI1575 legacy chip by performing a fake 186 * memory access. Needed to make ULI RTC work. 187 */ 188 in_be32((u32 *)CFG_PCIE3_MEM_BASE); 189 } else { 190 printf (" PCIE3: disabled\n"); 191 } 192 193 } 194 #else 195 gur->devdisr |= MPC85xx_DEVDISR_PCIE3; /* disable */ 196 #endif 197 198 #ifdef CONFIG_PCIE1 199 { 200 volatile ccsr_fsl_pci_t *pci = (ccsr_fsl_pci_t *) CFG_PCIE1_ADDR; 201 extern void fsl_pci_init(struct pci_controller *hose); 202 struct pci_controller *hose = &pcie1_hose; 203 int pcie_ep = (host_agent == 5); 204 int pcie_configured = io_sel & 6; 205 206 if (pcie_configured && !(devdisr & MPC85xx_DEVDISR_PCIE)){ 207 printf ("\n PCIE1 connected to Slot2 as %s (base address %x)", 208 pcie_ep ? "End Point" : "Root Complex", 209 (uint)pci); 210 if (pci->pme_msg_det) { 211 pci->pme_msg_det = 0xffffffff; 212 debug (" with errors. Clearing. Now 0x%08x",pci->pme_msg_det); 213 } 214 printf ("\n"); 215 216 /* inbound */ 217 pci_set_region(hose->regions + 0, 218 CFG_PCI_MEMORY_BUS, 219 CFG_PCI_MEMORY_PHYS, 220 CFG_PCI_MEMORY_SIZE, 221 PCI_REGION_MEM | PCI_REGION_MEMORY); 222 223 /* outbound memory */ 224 pci_set_region(hose->regions + 1, 225 CFG_PCIE1_MEM_BASE, 226 CFG_PCIE1_MEM_PHYS, 227 CFG_PCIE1_MEM_SIZE, 228 PCI_REGION_MEM); 229 230 /* outbound io */ 231 pci_set_region(hose->regions + 2, 232 CFG_PCIE1_IO_BASE, 233 CFG_PCIE1_IO_PHYS, 234 CFG_PCIE1_IO_SIZE, 235 PCI_REGION_IO); 236 237 hose->region_count = 3; 238 #ifdef CFG_PCIE1_MEM_BASE2 239 /* outbound memory */ 240 pci_set_region(hose->regions + 3, 241 CFG_PCIE1_MEM_BASE2, 242 CFG_PCIE1_MEM_PHYS2, 243 CFG_PCIE1_MEM_SIZE2, 244 PCI_REGION_MEM); 245 hose->region_count++; 246 #endif 247 hose->first_busno=first_free_busno; 248 249 pci_setup_indirect(hose, (int) &pci->cfg_addr, (int) &pci->cfg_data); 250 251 fsl_pci_init(hose); 252 253 first_free_busno=hose->last_busno+1; 254 printf(" PCIE1 on bus %02x - %02x\n", 255 hose->first_busno,hose->last_busno); 256 257 } else { 258 printf (" PCIE1: disabled\n"); 259 } 260 261 } 262 #else 263 gur->devdisr |= MPC85xx_DEVDISR_PCIE; /* disable */ 264 #endif 265 266 #ifdef CONFIG_PCIE2 267 { 268 volatile ccsr_fsl_pci_t *pci = (ccsr_fsl_pci_t *) CFG_PCIE2_ADDR; 269 extern void fsl_pci_init(struct pci_controller *hose); 270 struct pci_controller *hose = &pcie2_hose; 271 int pcie_ep = (host_agent == 3); 272 int pcie_configured = io_sel & 4; 273 274 if (pcie_configured && !(devdisr & MPC85xx_DEVDISR_PCIE)){ 275 printf ("\n PCIE2 connected to Slot 1 as %s (base address %x)", 276 pcie_ep ? "End Point" : "Root Complex", 277 (uint)pci); 278 if (pci->pme_msg_det) { 279 pci->pme_msg_det = 0xffffffff; 280 debug (" with errors. Clearing. Now 0x%08x",pci->pme_msg_det); 281 } 282 printf ("\n"); 283 284 /* inbound */ 285 pci_set_region(hose->regions + 0, 286 CFG_PCI_MEMORY_BUS, 287 CFG_PCI_MEMORY_PHYS, 288 CFG_PCI_MEMORY_SIZE, 289 PCI_REGION_MEM | PCI_REGION_MEMORY); 290 291 /* outbound memory */ 292 pci_set_region(hose->regions + 1, 293 CFG_PCIE2_MEM_BASE, 294 CFG_PCIE2_MEM_PHYS, 295 CFG_PCIE2_MEM_SIZE, 296 PCI_REGION_MEM); 297 298 /* outbound io */ 299 pci_set_region(hose->regions + 2, 300 CFG_PCIE2_IO_BASE, 301 CFG_PCIE2_IO_PHYS, 302 CFG_PCIE2_IO_SIZE, 303 PCI_REGION_IO); 304 305 hose->region_count = 3; 306 #ifdef CFG_PCIE2_MEM_BASE2 307 /* outbound memory */ 308 pci_set_region(hose->regions + 3, 309 CFG_PCIE2_MEM_BASE2, 310 CFG_PCIE2_MEM_PHYS2, 311 CFG_PCIE2_MEM_SIZE2, 312 PCI_REGION_MEM); 313 hose->region_count++; 314 #endif 315 hose->first_busno=first_free_busno; 316 pci_setup_indirect(hose, (int) &pci->cfg_addr, (int) &pci->cfg_data); 317 318 fsl_pci_init(hose); 319 first_free_busno=hose->last_busno+1; 320 printf (" PCIE2 on bus %02x - %02x\n", 321 hose->first_busno,hose->last_busno); 322 323 } else { 324 printf (" PCIE2: disabled\n"); 325 } 326 327 } 328 #else 329 gur->devdisr |= MPC85xx_DEVDISR_PCIE2; /* disable */ 330 #endif 331 332 333 #ifdef CONFIG_PCI1 334 { 335 volatile ccsr_fsl_pci_t *pci = (ccsr_fsl_pci_t *) CFG_PCI1_ADDR; 336 extern void fsl_pci_init(struct pci_controller *hose); 337 struct pci_controller *hose = &pci1_hose; 338 339 uint pci_agent = (host_agent == 6); 340 uint pci_speed = 66666000; /*get_clock_freq (); PCI PSPEED in [4:5] */ 341 uint pci_32 = 1; 342 uint pci_arb = gur->pordevsr & MPC85xx_PORDEVSR_PCI1_ARB; /* PORDEVSR[14] */ 343 uint pci_clk_sel = gur->porpllsr & MPC85xx_PORDEVSR_PCI1_SPD; /* PORPLLSR[16] */ 344 345 346 if (!(devdisr & MPC85xx_DEVDISR_PCI1)) { 347 printf ("\n PCI: %d bit, %s MHz, %s, %s, %s (base address %x)\n", 348 (pci_32) ? 32 : 64, 349 (pci_speed == 33333000) ? "33" : 350 (pci_speed == 66666000) ? "66" : "unknown", 351 pci_clk_sel ? "sync" : "async", 352 pci_agent ? "agent" : "host", 353 pci_arb ? "arbiter" : "external-arbiter", 354 (uint)pci 355 ); 356 357 /* inbound */ 358 pci_set_region(hose->regions + 0, 359 CFG_PCI_MEMORY_BUS, 360 CFG_PCI_MEMORY_PHYS, 361 CFG_PCI_MEMORY_SIZE, 362 PCI_REGION_MEM | PCI_REGION_MEMORY); 363 364 /* outbound memory */ 365 pci_set_region(hose->regions + 1, 366 CFG_PCI1_MEM_BASE, 367 CFG_PCI1_MEM_PHYS, 368 CFG_PCI1_MEM_SIZE, 369 PCI_REGION_MEM); 370 371 /* outbound io */ 372 pci_set_region(hose->regions + 2, 373 CFG_PCI1_IO_BASE, 374 CFG_PCI1_IO_PHYS, 375 CFG_PCI1_IO_SIZE, 376 PCI_REGION_IO); 377 hose->region_count = 3; 378 #ifdef CFG_PCIE3_MEM_BASE2 379 /* outbound memory */ 380 pci_set_region(hose->regions + 3, 381 CFG_PCIE3_MEM_BASE2, 382 CFG_PCIE3_MEM_PHYS2, 383 CFG_PCIE3_MEM_SIZE2, 384 PCI_REGION_MEM); 385 hose->region_count++; 386 #endif 387 hose->first_busno=first_free_busno; 388 pci_setup_indirect(hose, (int) &pci->cfg_addr, (int) &pci->cfg_data); 389 390 fsl_pci_init(hose); 391 first_free_busno=hose->last_busno+1; 392 printf ("PCI on bus %02x - %02x\n", 393 hose->first_busno,hose->last_busno); 394 } else { 395 printf (" PCI: disabled\n"); 396 } 397 } 398 #else 399 gur->devdisr |= MPC85xx_DEVDISR_PCI1; /* disable */ 400 #endif 401 } 402 403 404 int last_stage_init(void) 405 { 406 return 0; 407 } 408 409 410 unsigned long 411 get_board_sys_clk(ulong dummy) 412 { 413 u8 i, go_bit, rd_clks; 414 ulong val = 0; 415 416 go_bit = in8(PIXIS_BASE + PIXIS_VCTL); 417 go_bit &= 0x01; 418 419 rd_clks = in8(PIXIS_BASE + PIXIS_VCFGEN0); 420 rd_clks &= 0x1C; 421 422 /* 423 * Only if both go bit and the SCLK bit in VCFGEN0 are set 424 * should we be using the AUX register. Remember, we also set the 425 * GO bit to boot from the alternate bank on the on-board flash 426 */ 427 428 if (go_bit) { 429 if (rd_clks == 0x1c) 430 i = in8(PIXIS_BASE + PIXIS_AUX); 431 else 432 i = in8(PIXIS_BASE + PIXIS_SPD); 433 } else { 434 i = in8(PIXIS_BASE + PIXIS_SPD); 435 } 436 437 i &= 0x07; 438 439 switch (i) { 440 case 0: 441 val = 33333333; 442 break; 443 case 1: 444 val = 40000000; 445 break; 446 case 2: 447 val = 50000000; 448 break; 449 case 3: 450 val = 66666666; 451 break; 452 case 4: 453 val = 83000000; 454 break; 455 case 5: 456 val = 100000000; 457 break; 458 case 6: 459 val = 133333333; 460 break; 461 case 7: 462 val = 166666666; 463 break; 464 } 465 466 return val; 467 } 468 469 int board_eth_init(bd_t *bis) 470 { 471 #ifdef CONFIG_TSEC_ENET 472 struct tsec_info_struct tsec_info[2]; 473 volatile ccsr_gur_t *gur = (void *)(CFG_MPC85xx_GUTS_ADDR); 474 uint io_sel = (gur->pordevsr & MPC85xx_PORDEVSR_IO_SEL) >> 19; 475 int num = 0; 476 477 #ifdef CONFIG_TSEC1 478 SET_STD_TSEC_INFO(tsec_info[num], 1); 479 if (!(gur->pordevsr & MPC85xx_PORDEVSR_SGMII1_DIS)) 480 tsec_info[num].flags |= TSEC_SGMII; 481 num++; 482 #endif 483 #ifdef CONFIG_TSEC3 484 SET_STD_TSEC_INFO(tsec_info[num], 3); 485 if (!(gur->pordevsr & MPC85xx_PORDEVSR_SGMII3_DIS)) 486 tsec_info[num].flags |= TSEC_SGMII; 487 num++; 488 #endif 489 490 if (!num) { 491 printf("No TSECs initialized\n"); 492 493 return 0; 494 } 495 496 if (io_sel & 1) 497 fsl_sgmii_riser_init(tsec_info, num); 498 499 500 tsec_eth_init(bis, tsec_info, num); 501 #endif 502 return pci_eth_init(bis); 503 } 504 505 #if defined(CONFIG_OF_BOARD_SETUP) 506 507 void 508 ft_board_setup(void *blob, bd_t *bd) 509 { 510 int node, tmp[2]; 511 const char *path; 512 513 ft_cpu_setup(blob, bd); 514 515 node = fdt_path_offset(blob, "/aliases"); 516 tmp[0] = 0; 517 if (node >= 0) { 518 #ifdef CONFIG_PCI1 519 path = fdt_getprop(blob, node, "pci0", NULL); 520 if (path) { 521 tmp[1] = pci1_hose.last_busno - pci1_hose.first_busno; 522 do_fixup_by_path(blob, path, "bus-range", &tmp, 8, 1); 523 } 524 #endif 525 #ifdef CONFIG_PCIE2 526 path = fdt_getprop(blob, node, "pci1", NULL); 527 if (path) { 528 tmp[1] = pcie2_hose.last_busno - pcie2_hose.first_busno; 529 do_fixup_by_path(blob, path, "bus-range", &tmp, 8, 1); 530 } 531 #endif 532 #ifdef CONFIG_PCIE1 533 path = fdt_getprop(blob, node, "pci2", NULL); 534 if (path) { 535 tmp[1] = pcie1_hose.last_busno - pcie1_hose.first_busno; 536 do_fixup_by_path(blob, path, "bus-range", &tmp, 8, 1); 537 } 538 #endif 539 #ifdef CONFIG_PCIE3 540 path = fdt_getprop(blob, node, "pci3", NULL); 541 if (path) { 542 tmp[1] = pcie3_hose.last_busno - pcie3_hose.first_busno; 543 do_fixup_by_path(blob, path, "bus-range", &tmp, 8, 1); 544 } 545 #endif 546 } 547 } 548 #endif 549