1e58fe957SKim Phillips /* 2e58fe957SKim Phillips * Copyright (C) Freescale Semiconductor, Inc. 2006. All rights reserved. 3e58fe957SKim Phillips * 4e58fe957SKim Phillips * See file CREDITS for list of people who contributed to this 5e58fe957SKim Phillips * project. 6e58fe957SKim Phillips * 7e58fe957SKim Phillips * This program is free software; you can redistribute it and/or 8e58fe957SKim Phillips * modify it under the terms of the GNU General Public License as 9e58fe957SKim Phillips * published by the Free Software Foundation; either version 2 of 10e58fe957SKim Phillips * the License, or (at your option) any later version. 11e58fe957SKim Phillips * 12e58fe957SKim Phillips * This program is distributed in the hope that it will be useful, 13e58fe957SKim Phillips * but WITHOUT ANY WARRANTY; without even the implied warranty of 14e58fe957SKim Phillips * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 15e58fe957SKim Phillips * GNU General Public License for more details. 16e58fe957SKim Phillips * 17e58fe957SKim Phillips * You should have received a copy of the GNU General Public License 18e58fe957SKim Phillips * along with this program; if not, write to the Free Software 19e58fe957SKim Phillips * Foundation, Inc., 59 Temple Place, Suite 330, Boston, 20e58fe957SKim Phillips * MA 02111-1307 USA 21e58fe957SKim Phillips */ 22e58fe957SKim Phillips 23e58fe957SKim Phillips #include <common.h> 24e58fe957SKim Phillips 25e58fe957SKim Phillips #ifdef CONFIG_PCI 26e58fe957SKim Phillips 27e58fe957SKim Phillips #include <asm/mmu.h> 28e58fe957SKim Phillips #include <asm/global_data.h> 29e58fe957SKim Phillips #include <pci.h> 30e58fe957SKim Phillips #include <asm/mpc8349_pci.h> 31e58fe957SKim Phillips #include <i2c.h> 3294fab25fSKim Phillips #if defined(CONFIG_OF_LIBFDT) 33e58fe957SKim Phillips #include <libfdt.h> 345b8bc606SKim Phillips #include <fdt_support.h> 35e58fe957SKim Phillips #endif 36e58fe957SKim Phillips 37e58fe957SKim Phillips DECLARE_GLOBAL_DATA_PTR; 38e58fe957SKim Phillips 39e58fe957SKim Phillips /* System RAM mapped to PCI space */ 40*6d0f6bcfSJean-Christophe PLAGNIOL-VILLARD #define CONFIG_PCI_SYS_MEM_BUS CONFIG_SYS_SDRAM_BASE 41*6d0f6bcfSJean-Christophe PLAGNIOL-VILLARD #define CONFIG_PCI_SYS_MEM_PHYS CONFIG_SYS_SDRAM_BASE 42e58fe957SKim Phillips 43e58fe957SKim Phillips #ifndef CONFIG_PCI_PNP 44e58fe957SKim Phillips static struct pci_config_table pci_mpc8349itx_config_table[] = { 45e58fe957SKim Phillips { 46e58fe957SKim Phillips PCI_ANY_ID, 47e58fe957SKim Phillips PCI_ANY_ID, 48e58fe957SKim Phillips PCI_ANY_ID, 49e58fe957SKim Phillips PCI_ANY_ID, 50e58fe957SKim Phillips PCI_IDSEL_NUMBER, 51e58fe957SKim Phillips PCI_ANY_ID, 52e58fe957SKim Phillips pci_cfgfunc_config_device, 53e58fe957SKim Phillips { 54e58fe957SKim Phillips PCI_ENET0_IOADDR, 55e58fe957SKim Phillips PCI_ENET0_MEMADDR, 56e58fe957SKim Phillips PCI_COMMAND_MEMORY | PCI_COMMAND_MASTER} 57e58fe957SKim Phillips }, 58e58fe957SKim Phillips {} 59e58fe957SKim Phillips }; 60e58fe957SKim Phillips #endif 61e58fe957SKim Phillips 62e58fe957SKim Phillips static struct pci_controller pci_hose[] = { 63e58fe957SKim Phillips { 64e58fe957SKim Phillips #ifndef CONFIG_PCI_PNP 65e58fe957SKim Phillips config_table:pci_mpc8349itx_config_table, 66e58fe957SKim Phillips #endif 67e58fe957SKim Phillips }, 68e58fe957SKim Phillips { 69e58fe957SKim Phillips #ifndef CONFIG_PCI_PNP 70e58fe957SKim Phillips config_table:pci_mpc8349itx_config_table, 71e58fe957SKim Phillips #endif 72e58fe957SKim Phillips } 73e58fe957SKim Phillips }; 74e58fe957SKim Phillips 75e58fe957SKim Phillips /************************************************************************** 76e58fe957SKim Phillips * pci_init_board() 77e58fe957SKim Phillips * 78e58fe957SKim Phillips * NOTICE: PCI2 is not currently supported 79e58fe957SKim Phillips * 80e58fe957SKim Phillips */ 81e58fe957SKim Phillips void pci_init_board(void) 82e58fe957SKim Phillips { 83e58fe957SKim Phillips volatile immap_t *immr; 84e58fe957SKim Phillips volatile clk83xx_t *clk; 85e58fe957SKim Phillips volatile law83xx_t *pci_law; 86e58fe957SKim Phillips volatile pot83xx_t *pci_pot; 87e58fe957SKim Phillips volatile pcictrl83xx_t *pci_ctrl; 88e58fe957SKim Phillips volatile pciconf83xx_t *pci_conf; 89e58fe957SKim Phillips u8 reg8; 90e58fe957SKim Phillips u16 reg16; 91e58fe957SKim Phillips u32 reg32; 92e58fe957SKim Phillips u32 dev; 93e58fe957SKim Phillips struct pci_controller *hose; 94e58fe957SKim Phillips 95*6d0f6bcfSJean-Christophe PLAGNIOL-VILLARD immr = (immap_t *) CONFIG_SYS_IMMR; 96e58fe957SKim Phillips clk = (clk83xx_t *) & immr->clk; 97e58fe957SKim Phillips pci_law = immr->sysconf.pcilaw; 98e58fe957SKim Phillips pci_pot = immr->ios.pot; 99e58fe957SKim Phillips pci_ctrl = immr->pci_ctrl; 100e58fe957SKim Phillips pci_conf = immr->pci_conf; 101e58fe957SKim Phillips 102e58fe957SKim Phillips hose = &pci_hose[0]; 103e58fe957SKim Phillips 104e58fe957SKim Phillips /* 105e58fe957SKim Phillips * Configure PCI controller and PCI_CLK_OUTPUT both in 66M mode 106e58fe957SKim Phillips */ 107e58fe957SKim Phillips 108e58fe957SKim Phillips reg32 = clk->occr; 109e58fe957SKim Phillips udelay(2000); 110e58fe957SKim Phillips 111e58fe957SKim Phillips #ifdef CONFIG_HARD_I2C 112e58fe957SKim Phillips i2c_set_bus_num(1); 113e58fe957SKim Phillips /* Read the PCI_M66EN jumper setting */ 114*6d0f6bcfSJean-Christophe PLAGNIOL-VILLARD if ((i2c_read(CONFIG_SYS_I2C_8574_ADDR2, 0, 0, ®8, sizeof(reg8)) == 0) || 115*6d0f6bcfSJean-Christophe PLAGNIOL-VILLARD (i2c_read(CONFIG_SYS_I2C_8574A_ADDR2, 0, 0, ®8, sizeof(reg8)) == 0)) { 116e58fe957SKim Phillips if (reg8 & I2C_8574_PCI66) 117e58fe957SKim Phillips clk->occr = 0xff000000; /* 66 MHz PCI */ 118e58fe957SKim Phillips else 119e58fe957SKim Phillips clk->occr = 0xff600001; /* 33 MHz PCI */ 120e58fe957SKim Phillips } else { 121e58fe957SKim Phillips clk->occr = 0xff600001; /* 33 MHz PCI */ 122e58fe957SKim Phillips } 123e58fe957SKim Phillips #else 124e58fe957SKim Phillips clk->occr = 0xff000000; /* 66 MHz PCI */ 125e58fe957SKim Phillips #endif 126e58fe957SKim Phillips 127e58fe957SKim Phillips udelay(2000); 128e58fe957SKim Phillips 129e58fe957SKim Phillips /* 130e58fe957SKim Phillips * Release PCI RST Output signal 131e58fe957SKim Phillips */ 132e58fe957SKim Phillips pci_ctrl[0].gcr = 0; 133e58fe957SKim Phillips udelay(2000); 134e58fe957SKim Phillips pci_ctrl[0].gcr = 1; 135e58fe957SKim Phillips 136e58fe957SKim Phillips #ifdef CONFIG_MPC83XX_PCI2 137e58fe957SKim Phillips pci_ctrl[1].gcr = 0; 138e58fe957SKim Phillips udelay(2000); 139e58fe957SKim Phillips pci_ctrl[1].gcr = 1; 140e58fe957SKim Phillips #endif 141e58fe957SKim Phillips 142e58fe957SKim Phillips /* We need to wait at least a 1sec based on PCI specs */ 143e58fe957SKim Phillips { 144e58fe957SKim Phillips int i; 145e58fe957SKim Phillips 146e58fe957SKim Phillips for (i = 0; i < 1000; i++) 147e58fe957SKim Phillips udelay(1000); 148e58fe957SKim Phillips } 149e58fe957SKim Phillips 150e58fe957SKim Phillips /* 151e58fe957SKim Phillips * Configure PCI Local Access Windows 152e58fe957SKim Phillips */ 153*6d0f6bcfSJean-Christophe PLAGNIOL-VILLARD pci_law[0].bar = CONFIG_SYS_PCI1_MEM_PHYS & LAWBAR_BAR; 154e58fe957SKim Phillips pci_law[0].ar = LAWAR_EN | LAWAR_SIZE_1G; 155e58fe957SKim Phillips 156*6d0f6bcfSJean-Christophe PLAGNIOL-VILLARD pci_law[1].bar = CONFIG_SYS_PCI1_IO_PHYS & LAWBAR_BAR; 157e58fe957SKim Phillips pci_law[1].ar = LAWAR_EN | LAWAR_SIZE_32M; 158e58fe957SKim Phillips 159e58fe957SKim Phillips /* 160e58fe957SKim Phillips * Configure PCI Outbound Translation Windows 161e58fe957SKim Phillips */ 162e58fe957SKim Phillips 163e58fe957SKim Phillips /* PCI1 mem space - prefetch */ 164*6d0f6bcfSJean-Christophe PLAGNIOL-VILLARD pci_pot[0].potar = (CONFIG_SYS_PCI1_MEM_BASE >> 12) & POTAR_TA_MASK; 165*6d0f6bcfSJean-Christophe PLAGNIOL-VILLARD pci_pot[0].pobar = (CONFIG_SYS_PCI1_MEM_PHYS >> 12) & POBAR_BA_MASK; 166e58fe957SKim Phillips pci_pot[0].pocmr = POCMR_EN | POCMR_PREFETCH_EN | POCMR_CM_256M; 167e58fe957SKim Phillips 168e58fe957SKim Phillips /* PCI1 IO space */ 169*6d0f6bcfSJean-Christophe PLAGNIOL-VILLARD pci_pot[1].potar = (CONFIG_SYS_PCI1_IO_BASE >> 12) & POTAR_TA_MASK; 170*6d0f6bcfSJean-Christophe PLAGNIOL-VILLARD pci_pot[1].pobar = (CONFIG_SYS_PCI1_IO_PHYS >> 12) & POBAR_BA_MASK; 171e58fe957SKim Phillips pci_pot[1].pocmr = POCMR_EN | POCMR_IO | POCMR_CM_16M; 172e58fe957SKim Phillips 173e58fe957SKim Phillips /* PCI1 mmio - non-prefetch mem space */ 174*6d0f6bcfSJean-Christophe PLAGNIOL-VILLARD pci_pot[2].potar = (CONFIG_SYS_PCI1_MMIO_BASE >> 12) & POTAR_TA_MASK; 175*6d0f6bcfSJean-Christophe PLAGNIOL-VILLARD pci_pot[2].pobar = (CONFIG_SYS_PCI1_MMIO_PHYS >> 12) & POBAR_BA_MASK; 176e58fe957SKim Phillips pci_pot[2].pocmr = POCMR_EN | POCMR_CM_256M; 177e58fe957SKim Phillips 178e58fe957SKim Phillips /* 179e58fe957SKim Phillips * Configure PCI Inbound Translation Windows 180e58fe957SKim Phillips */ 181e58fe957SKim Phillips 182e58fe957SKim Phillips /* we need RAM mapped to PCI space for the devices to 183e58fe957SKim Phillips * access main memory */ 184e58fe957SKim Phillips pci_ctrl[0].pitar1 = 0x0; 185e58fe957SKim Phillips pci_ctrl[0].pibar1 = 0x0; 186e58fe957SKim Phillips pci_ctrl[0].piebar1 = 0x0; 187e58fe957SKim Phillips pci_ctrl[0].piwar1 = PIWAR_EN | PIWAR_PF | PIWAR_RTT_SNOOP | 188e58fe957SKim Phillips PIWAR_WTT_SNOOP | (__ilog2(gd->ram_size) - 1); 189e58fe957SKim Phillips 190e58fe957SKim Phillips hose->first_busno = 0; 191e58fe957SKim Phillips hose->last_busno = 0xff; 192e58fe957SKim Phillips 193e58fe957SKim Phillips /* PCI memory prefetch space */ 194e58fe957SKim Phillips pci_set_region(hose->regions + 0, 195*6d0f6bcfSJean-Christophe PLAGNIOL-VILLARD CONFIG_SYS_PCI1_MEM_BASE, 196*6d0f6bcfSJean-Christophe PLAGNIOL-VILLARD CONFIG_SYS_PCI1_MEM_PHYS, 197*6d0f6bcfSJean-Christophe PLAGNIOL-VILLARD CONFIG_SYS_PCI1_MEM_SIZE, PCI_REGION_MEM | PCI_REGION_PREFETCH); 198e58fe957SKim Phillips 199e58fe957SKim Phillips /* PCI memory space */ 200e58fe957SKim Phillips pci_set_region(hose->regions + 1, 201*6d0f6bcfSJean-Christophe PLAGNIOL-VILLARD CONFIG_SYS_PCI1_MMIO_BASE, 202*6d0f6bcfSJean-Christophe PLAGNIOL-VILLARD CONFIG_SYS_PCI1_MMIO_PHYS, CONFIG_SYS_PCI1_MMIO_SIZE, PCI_REGION_MEM); 203e58fe957SKim Phillips 204e58fe957SKim Phillips /* PCI IO space */ 205e58fe957SKim Phillips pci_set_region(hose->regions + 2, 206*6d0f6bcfSJean-Christophe PLAGNIOL-VILLARD CONFIG_SYS_PCI1_IO_BASE, 207*6d0f6bcfSJean-Christophe PLAGNIOL-VILLARD CONFIG_SYS_PCI1_IO_PHYS, CONFIG_SYS_PCI1_IO_SIZE, PCI_REGION_IO); 208e58fe957SKim Phillips 209e58fe957SKim Phillips /* System memory space */ 210e58fe957SKim Phillips pci_set_region(hose->regions + 3, 211e58fe957SKim Phillips CONFIG_PCI_SYS_MEM_BUS, 212e58fe957SKim Phillips CONFIG_PCI_SYS_MEM_PHYS, 213e58fe957SKim Phillips gd->ram_size, PCI_REGION_MEM | PCI_REGION_MEMORY); 214e58fe957SKim Phillips 215e58fe957SKim Phillips hose->region_count = 4; 216e58fe957SKim Phillips 217e58fe957SKim Phillips pci_setup_indirect(hose, 218*6d0f6bcfSJean-Christophe PLAGNIOL-VILLARD (CONFIG_SYS_IMMR + 0x8300), (CONFIG_SYS_IMMR + 0x8304)); 219e58fe957SKim Phillips 220e58fe957SKim Phillips pci_register_hose(hose); 221e58fe957SKim Phillips 222e58fe957SKim Phillips /* 223e58fe957SKim Phillips * Write to Command register 224e58fe957SKim Phillips */ 225e58fe957SKim Phillips reg16 = 0xff; 226e58fe957SKim Phillips dev = PCI_BDF(hose->first_busno, 0, 0); 227e58fe957SKim Phillips pci_hose_read_config_word(hose, dev, PCI_COMMAND, ®16); 228e58fe957SKim Phillips reg16 |= PCI_COMMAND_SERR | PCI_COMMAND_MASTER | PCI_COMMAND_MEMORY; 229e58fe957SKim Phillips pci_hose_write_config_word(hose, dev, PCI_COMMAND, reg16); 230e58fe957SKim Phillips 231e58fe957SKim Phillips /* 232e58fe957SKim Phillips * Clear non-reserved bits in status register. 233e58fe957SKim Phillips */ 234e58fe957SKim Phillips pci_hose_write_config_word(hose, dev, PCI_STATUS, 0xffff); 235e58fe957SKim Phillips pci_hose_write_config_byte(hose, dev, PCI_LATENCY_TIMER, 0x80); 236e58fe957SKim Phillips pci_hose_write_config_byte(hose, dev, PCI_CACHE_LINE_SIZE, 0x08); 237e58fe957SKim Phillips 238e58fe957SKim Phillips #ifdef CONFIG_PCI_SCAN_SHOW 239e58fe957SKim Phillips printf("PCI: Bus Dev VenId DevId Class Int\n"); 240e58fe957SKim Phillips #endif 241e58fe957SKim Phillips /* 242e58fe957SKim Phillips * Hose scan. 243e58fe957SKim Phillips */ 244e58fe957SKim Phillips hose->last_busno = pci_hose_scan(hose); 245e58fe957SKim Phillips 246e58fe957SKim Phillips #ifdef CONFIG_MPC83XX_PCI2 247e58fe957SKim Phillips hose = &pci_hose[1]; 248e58fe957SKim Phillips 249e58fe957SKim Phillips /* 250e58fe957SKim Phillips * Configure PCI Outbound Translation Windows 251e58fe957SKim Phillips */ 252e58fe957SKim Phillips 253e58fe957SKim Phillips /* PCI2 mem space - prefetch */ 254*6d0f6bcfSJean-Christophe PLAGNIOL-VILLARD pci_pot[3].potar = (CONFIG_SYS_PCI2_MEM_BASE >> 12) & POTAR_TA_MASK; 255*6d0f6bcfSJean-Christophe PLAGNIOL-VILLARD pci_pot[3].pobar = (CONFIG_SYS_PCI2_MEM_PHYS >> 12) & POBAR_BA_MASK; 256e58fe957SKim Phillips pci_pot[3].pocmr = POCMR_EN | POCMR_PCI2 | POCMR_PREFETCH_EN | POCMR_CM_256M; 257e58fe957SKim Phillips 258e58fe957SKim Phillips /* PCI2 IO space */ 259*6d0f6bcfSJean-Christophe PLAGNIOL-VILLARD pci_pot[4].potar = (CONFIG_SYS_PCI2_IO_BASE >> 12) & POTAR_TA_MASK; 260*6d0f6bcfSJean-Christophe PLAGNIOL-VILLARD pci_pot[4].pobar = (CONFIG_SYS_PCI2_IO_PHYS >> 12) & POBAR_BA_MASK; 261e58fe957SKim Phillips pci_pot[4].pocmr = POCMR_EN | POCMR_PCI2 | POCMR_IO | POCMR_CM_16M; 262e58fe957SKim Phillips 263e58fe957SKim Phillips /* PCI2 mmio - non-prefetch mem space */ 264*6d0f6bcfSJean-Christophe PLAGNIOL-VILLARD pci_pot[5].potar = (CONFIG_SYS_PCI2_MMIO_BASE >> 12) & POTAR_TA_MASK; 265*6d0f6bcfSJean-Christophe PLAGNIOL-VILLARD pci_pot[5].pobar = (CONFIG_SYS_PCI2_MMIO_PHYS >> 12) & POBAR_BA_MASK; 266e58fe957SKim Phillips pci_pot[5].pocmr = POCMR_EN | POCMR_PCI2 | POCMR_CM_256M; 267e58fe957SKim Phillips 268e58fe957SKim Phillips /* 269e58fe957SKim Phillips * Configure PCI Inbound Translation Windows 270e58fe957SKim Phillips */ 271e58fe957SKim Phillips 272e58fe957SKim Phillips /* we need RAM mapped to PCI space for the devices to 273e58fe957SKim Phillips * access main memory */ 274e58fe957SKim Phillips pci_ctrl[1].pitar1 = 0x0; 275e58fe957SKim Phillips pci_ctrl[1].pibar1 = 0x0; 276e58fe957SKim Phillips pci_ctrl[1].piebar1 = 0x0; 277e58fe957SKim Phillips pci_ctrl[1].piwar1 = 278e58fe957SKim Phillips PIWAR_EN | PIWAR_PF | PIWAR_RTT_SNOOP | PIWAR_WTT_SNOOP | 279e58fe957SKim Phillips (__ilog2(gd->ram_size) - 1); 280e58fe957SKim Phillips 281e58fe957SKim Phillips hose->first_busno = pci_hose[0].last_busno + 1; 282e58fe957SKim Phillips hose->last_busno = 0xff; 283e58fe957SKim Phillips 284e58fe957SKim Phillips /* PCI memory prefetch space */ 285e58fe957SKim Phillips pci_set_region(hose->regions + 0, 286*6d0f6bcfSJean-Christophe PLAGNIOL-VILLARD CONFIG_SYS_PCI2_MEM_BASE, 287*6d0f6bcfSJean-Christophe PLAGNIOL-VILLARD CONFIG_SYS_PCI2_MEM_PHYS, 288*6d0f6bcfSJean-Christophe PLAGNIOL-VILLARD CONFIG_SYS_PCI2_MEM_SIZE, PCI_REGION_MEM | PCI_REGION_PREFETCH); 289e58fe957SKim Phillips 290e58fe957SKim Phillips /* PCI memory space */ 291e58fe957SKim Phillips pci_set_region(hose->regions + 1, 292*6d0f6bcfSJean-Christophe PLAGNIOL-VILLARD CONFIG_SYS_PCI2_MMIO_BASE, 293*6d0f6bcfSJean-Christophe PLAGNIOL-VILLARD CONFIG_SYS_PCI2_MMIO_PHYS, CONFIG_SYS_PCI2_MMIO_SIZE, PCI_REGION_MEM); 294e58fe957SKim Phillips 295e58fe957SKim Phillips /* PCI IO space */ 296e58fe957SKim Phillips pci_set_region(hose->regions + 2, 297*6d0f6bcfSJean-Christophe PLAGNIOL-VILLARD CONFIG_SYS_PCI2_IO_BASE, 298*6d0f6bcfSJean-Christophe PLAGNIOL-VILLARD CONFIG_SYS_PCI2_IO_PHYS, CONFIG_SYS_PCI2_IO_SIZE, PCI_REGION_IO); 299e58fe957SKim Phillips 300e58fe957SKim Phillips /* System memory space */ 301e58fe957SKim Phillips pci_set_region(hose->regions + 3, 302e58fe957SKim Phillips CONFIG_PCI_SYS_MEM_BUS, 303e58fe957SKim Phillips CONFIG_PCI_SYS_MEM_PHYS, 304e58fe957SKim Phillips gd->ram_size, PCI_REGION_MEM | PCI_REGION_MEMORY); 305e58fe957SKim Phillips 306e58fe957SKim Phillips hose->region_count = 4; 307e58fe957SKim Phillips 308e58fe957SKim Phillips pci_setup_indirect(hose, 309*6d0f6bcfSJean-Christophe PLAGNIOL-VILLARD (CONFIG_SYS_IMMR + 0x8380), (CONFIG_SYS_IMMR + 0x8384)); 310e58fe957SKim Phillips 311e58fe957SKim Phillips pci_register_hose(hose); 312e58fe957SKim Phillips 313e58fe957SKim Phillips /* 314e58fe957SKim Phillips * Write to Command register 315e58fe957SKim Phillips */ 316e58fe957SKim Phillips reg16 = 0xff; 317e58fe957SKim Phillips dev = PCI_BDF(hose->first_busno, 0, 0); 318e58fe957SKim Phillips pci_hose_read_config_word(hose, dev, PCI_COMMAND, ®16); 319e58fe957SKim Phillips reg16 |= PCI_COMMAND_SERR | PCI_COMMAND_MASTER | PCI_COMMAND_MEMORY; 320e58fe957SKim Phillips pci_hose_write_config_word(hose, dev, PCI_COMMAND, reg16); 321e58fe957SKim Phillips 322e58fe957SKim Phillips /* 323e58fe957SKim Phillips * Clear non-reserved bits in status register. 324e58fe957SKim Phillips */ 325e58fe957SKim Phillips pci_hose_write_config_word(hose, dev, PCI_STATUS, 0xffff); 326e58fe957SKim Phillips pci_hose_write_config_byte(hose, dev, PCI_LATENCY_TIMER, 0x80); 327e58fe957SKim Phillips pci_hose_write_config_byte(hose, dev, PCI_CACHE_LINE_SIZE, 0x08); 328e58fe957SKim Phillips 329e58fe957SKim Phillips /* 330e58fe957SKim Phillips * Hose scan. 331e58fe957SKim Phillips */ 332e58fe957SKim Phillips hose->last_busno = pci_hose_scan(hose); 333e58fe957SKim Phillips #endif 334e58fe957SKim Phillips } 335e58fe957SKim Phillips 336e58fe957SKim Phillips #if defined(CONFIG_OF_LIBFDT) 3375b8bc606SKim Phillips void ft_pci_setup(void *blob, bd_t *bd) 338e58fe957SKim Phillips { 339e58fe957SKim Phillips int nodeoffset; 340e58fe957SKim Phillips int tmp[2]; 3415b8bc606SKim Phillips const char *path; 342e58fe957SKim Phillips 3435b8bc606SKim Phillips nodeoffset = fdt_path_offset(blob, "/aliases"); 344e58fe957SKim Phillips if (nodeoffset >= 0) { 3455b8bc606SKim Phillips path = fdt_getprop(blob, nodeoffset, "pci0", NULL); 3465b8bc606SKim Phillips if (path) { 347e58fe957SKim Phillips tmp[0] = cpu_to_be32(pci_hose[0].first_busno); 348e58fe957SKim Phillips tmp[1] = cpu_to_be32(pci_hose[0].last_busno); 3495b8bc606SKim Phillips do_fixup_by_path(blob, path, "bus-range", 3505b8bc606SKim Phillips &tmp, sizeof(tmp), 1); 351e58fe957SKim Phillips 352e58fe957SKim Phillips tmp[0] = cpu_to_be32(gd->pci_clk); 3535b8bc606SKim Phillips do_fixup_by_path(blob, path, "clock-frequency", 3545b8bc606SKim Phillips &tmp, sizeof(tmp[0]), 1); 355e58fe957SKim Phillips } 356e58fe957SKim Phillips #ifdef CONFIG_MPC83XX_PCI2 3575b8bc606SKim Phillips path = fdt_getprop(blob, nodeoffset, "pci1", NULL); 3585b8bc606SKim Phillips if (path) { 3595b8bc606SKim Phillips tmp[0] = cpu_to_be32(pci_hose[0].first_busno); 3605b8bc606SKim Phillips tmp[1] = cpu_to_be32(pci_hose[0].last_busno); 3615b8bc606SKim Phillips do_fixup_by_path(blob, path, "bus-range", 3625b8bc606SKim Phillips &tmp, sizeof(tmp), 1); 363e58fe957SKim Phillips 364e58fe957SKim Phillips tmp[0] = cpu_to_be32(gd->pci_clk); 3655b8bc606SKim Phillips do_fixup_by_path(blob, path, "clock-frequency", 3665b8bc606SKim Phillips &tmp, sizeof(tmp[0]), 1); 367e58fe957SKim Phillips } 368e58fe957SKim Phillips #endif 369e58fe957SKim Phillips } 3705b8bc606SKim Phillips } 37194fab25fSKim Phillips #endif /* CONFIG_OF_LIBFDT */ 372e58fe957SKim Phillips #endif /* CONFIG_PCI */ 373