1e5d8d54db25790524da34b0143f4e0176fb7677bScott Wood/* 2e5d8d54db25790524da34b0143f4e0176fb7677bScott Wood * Old U-boot compatibility for PowerQUICC II 3e5d8d54db25790524da34b0143f4e0176fb7677bScott Wood * (a.k.a. 82xx with CPM, not the 8240 family of chips) 4e5d8d54db25790524da34b0143f4e0176fb7677bScott Wood * 5e5d8d54db25790524da34b0143f4e0176fb7677bScott Wood * Author: Scott Wood <scottwood@freescale.com> 6e5d8d54db25790524da34b0143f4e0176fb7677bScott Wood * 7e5d8d54db25790524da34b0143f4e0176fb7677bScott Wood * Copyright (c) 2007 Freescale Semiconductor, Inc. 8e5d8d54db25790524da34b0143f4e0176fb7677bScott Wood * 9e5d8d54db25790524da34b0143f4e0176fb7677bScott Wood * This program is free software; you can redistribute it and/or modify it 10e5d8d54db25790524da34b0143f4e0176fb7677bScott Wood * under the terms of the GNU General Public License version 2 as published 11e5d8d54db25790524da34b0143f4e0176fb7677bScott Wood * by the Free Software Foundation. 12e5d8d54db25790524da34b0143f4e0176fb7677bScott Wood */ 13e5d8d54db25790524da34b0143f4e0176fb7677bScott Wood 14e5d8d54db25790524da34b0143f4e0176fb7677bScott Wood#include "ops.h" 15e5d8d54db25790524da34b0143f4e0176fb7677bScott Wood#include "stdio.h" 16e5d8d54db25790524da34b0143f4e0176fb7677bScott Wood#include "cuboot.h" 17e5d8d54db25790524da34b0143f4e0176fb7677bScott Wood#include "io.h" 18a94b89a4813bddf85c052f8d04021688c5dfe0d7Scott Wood#include "fsl-soc.h" 19e5d8d54db25790524da34b0143f4e0176fb7677bScott Wood 20e5d8d54db25790524da34b0143f4e0176fb7677bScott Wood#define TARGET_CPM2 21e5d8d54db25790524da34b0143f4e0176fb7677bScott Wood#define TARGET_HAS_ETH1 22e5d8d54db25790524da34b0143f4e0176fb7677bScott Wood#include "ppcboot.h" 23e5d8d54db25790524da34b0143f4e0176fb7677bScott Wood 24e5d8d54db25790524da34b0143f4e0176fb7677bScott Woodstatic bd_t bd; 25e5d8d54db25790524da34b0143f4e0176fb7677bScott Wood 26e5d8d54db25790524da34b0143f4e0176fb7677bScott Woodstruct cs_range { 27e5d8d54db25790524da34b0143f4e0176fb7677bScott Wood u32 csnum; 28e5d8d54db25790524da34b0143f4e0176fb7677bScott Wood u32 base; /* must be zero */ 29e5d8d54db25790524da34b0143f4e0176fb7677bScott Wood u32 addr; 30e5d8d54db25790524da34b0143f4e0176fb7677bScott Wood u32 size; 31e5d8d54db25790524da34b0143f4e0176fb7677bScott Wood}; 32e5d8d54db25790524da34b0143f4e0176fb7677bScott Wood 33e5d8d54db25790524da34b0143f4e0176fb7677bScott Woodstruct pci_range { 34e5d8d54db25790524da34b0143f4e0176fb7677bScott Wood u32 flags; 35e5d8d54db25790524da34b0143f4e0176fb7677bScott Wood u32 pci_addr[2]; 36e5d8d54db25790524da34b0143f4e0176fb7677bScott Wood u32 phys_addr; 37e5d8d54db25790524da34b0143f4e0176fb7677bScott Wood u32 size[2]; 38e5d8d54db25790524da34b0143f4e0176fb7677bScott Wood}; 39e5d8d54db25790524da34b0143f4e0176fb7677bScott Wood 40e5d8d54db25790524da34b0143f4e0176fb7677bScott Woodstruct cs_range cs_ranges_buf[MAX_PROP_LEN / sizeof(struct cs_range)]; 41e5d8d54db25790524da34b0143f4e0176fb7677bScott Woodstruct pci_range pci_ranges_buf[MAX_PROP_LEN / sizeof(struct pci_range)]; 42e5d8d54db25790524da34b0143f4e0176fb7677bScott Wood 43e5d8d54db25790524da34b0143f4e0176fb7677bScott Wood/* Different versions of u-boot put the BCSR in different places, and 44e5d8d54db25790524da34b0143f4e0176fb7677bScott Wood * some don't set up the PCI PIC at all, so we assume the device tree is 45e5d8d54db25790524da34b0143f4e0176fb7677bScott Wood * sane and update the BRx registers appropriately. 46e5d8d54db25790524da34b0143f4e0176fb7677bScott Wood * 4796fca1dea8f32e96668d55727d66416fdd67360bScott Wood * For any node defined as compatible with fsl,pq2-localbus, 4896fca1dea8f32e96668d55727d66416fdd67360bScott Wood * #address/#size must be 2/1 for the localbus, and 1/1 for the parent bus. 4996fca1dea8f32e96668d55727d66416fdd67360bScott Wood * Ranges must be for whole chip selects. 50e5d8d54db25790524da34b0143f4e0176fb7677bScott Wood */ 51e5d8d54db25790524da34b0143f4e0176fb7677bScott Woodstatic void update_cs_ranges(void) 52e5d8d54db25790524da34b0143f4e0176fb7677bScott Wood{ 5396fca1dea8f32e96668d55727d66416fdd67360bScott Wood void *bus_node, *parent_node; 54e5d8d54db25790524da34b0143f4e0176fb7677bScott Wood u32 *ctrl_addr; 55e5d8d54db25790524da34b0143f4e0176fb7677bScott Wood unsigned long ctrl_size; 56e5d8d54db25790524da34b0143f4e0176fb7677bScott Wood u32 naddr, nsize; 57e5d8d54db25790524da34b0143f4e0176fb7677bScott Wood int len; 58e5d8d54db25790524da34b0143f4e0176fb7677bScott Wood int i; 59e5d8d54db25790524da34b0143f4e0176fb7677bScott Wood 6096fca1dea8f32e96668d55727d66416fdd67360bScott Wood bus_node = finddevice("/localbus"); 6196fca1dea8f32e96668d55727d66416fdd67360bScott Wood if (!bus_node || !dt_is_compatible(bus_node, "fsl,pq2-localbus")) 62e5d8d54db25790524da34b0143f4e0176fb7677bScott Wood return; 63e5d8d54db25790524da34b0143f4e0176fb7677bScott Wood 64e5d8d54db25790524da34b0143f4e0176fb7677bScott Wood dt_get_reg_format(bus_node, &naddr, &nsize); 65e5d8d54db25790524da34b0143f4e0176fb7677bScott Wood if (naddr != 2 || nsize != 1) 66e5d8d54db25790524da34b0143f4e0176fb7677bScott Wood goto err; 67e5d8d54db25790524da34b0143f4e0176fb7677bScott Wood 68e5d8d54db25790524da34b0143f4e0176fb7677bScott Wood parent_node = get_parent(bus_node); 69e5d8d54db25790524da34b0143f4e0176fb7677bScott Wood if (!parent_node) 70e5d8d54db25790524da34b0143f4e0176fb7677bScott Wood goto err; 71e5d8d54db25790524da34b0143f4e0176fb7677bScott Wood 72e5d8d54db25790524da34b0143f4e0176fb7677bScott Wood dt_get_reg_format(parent_node, &naddr, &nsize); 73e5d8d54db25790524da34b0143f4e0176fb7677bScott Wood if (naddr != 1 || nsize != 1) 74e5d8d54db25790524da34b0143f4e0176fb7677bScott Wood goto err; 75e5d8d54db25790524da34b0143f4e0176fb7677bScott Wood 7696fca1dea8f32e96668d55727d66416fdd67360bScott Wood if (!dt_xlate_reg(bus_node, 0, (unsigned long *)&ctrl_addr, 77e5d8d54db25790524da34b0143f4e0176fb7677bScott Wood &ctrl_size)) 78e5d8d54db25790524da34b0143f4e0176fb7677bScott Wood goto err; 79e5d8d54db25790524da34b0143f4e0176fb7677bScott Wood 80e5d8d54db25790524da34b0143f4e0176fb7677bScott Wood len = getprop(bus_node, "ranges", cs_ranges_buf, sizeof(cs_ranges_buf)); 81e5d8d54db25790524da34b0143f4e0176fb7677bScott Wood 82e5d8d54db25790524da34b0143f4e0176fb7677bScott Wood for (i = 0; i < len / sizeof(struct cs_range); i++) { 83e5d8d54db25790524da34b0143f4e0176fb7677bScott Wood u32 base, option; 84e5d8d54db25790524da34b0143f4e0176fb7677bScott Wood int cs = cs_ranges_buf[i].csnum; 85e5d8d54db25790524da34b0143f4e0176fb7677bScott Wood if (cs >= ctrl_size / 8) 86e5d8d54db25790524da34b0143f4e0176fb7677bScott Wood goto err; 87e5d8d54db25790524da34b0143f4e0176fb7677bScott Wood 88e5d8d54db25790524da34b0143f4e0176fb7677bScott Wood if (cs_ranges_buf[i].base != 0) 89e5d8d54db25790524da34b0143f4e0176fb7677bScott Wood goto err; 90e5d8d54db25790524da34b0143f4e0176fb7677bScott Wood 91e5d8d54db25790524da34b0143f4e0176fb7677bScott Wood base = in_be32(&ctrl_addr[cs * 2]); 92e5d8d54db25790524da34b0143f4e0176fb7677bScott Wood 93e5d8d54db25790524da34b0143f4e0176fb7677bScott Wood /* If CS is already valid, use the existing flags. 94e5d8d54db25790524da34b0143f4e0176fb7677bScott Wood * Otherwise, guess a sane default. 95e5d8d54db25790524da34b0143f4e0176fb7677bScott Wood */ 96e5d8d54db25790524da34b0143f4e0176fb7677bScott Wood if (base & 1) { 97e5d8d54db25790524da34b0143f4e0176fb7677bScott Wood base &= 0x7fff; 98e5d8d54db25790524da34b0143f4e0176fb7677bScott Wood option = in_be32(&ctrl_addr[cs * 2 + 1]) & 0x7fff; 99e5d8d54db25790524da34b0143f4e0176fb7677bScott Wood } else { 100e5d8d54db25790524da34b0143f4e0176fb7677bScott Wood base = 0x1801; 101e5d8d54db25790524da34b0143f4e0176fb7677bScott Wood option = 0x10; 102e5d8d54db25790524da34b0143f4e0176fb7677bScott Wood } 103e5d8d54db25790524da34b0143f4e0176fb7677bScott Wood 104e5d8d54db25790524da34b0143f4e0176fb7677bScott Wood out_be32(&ctrl_addr[cs * 2], 0); 105e5d8d54db25790524da34b0143f4e0176fb7677bScott Wood out_be32(&ctrl_addr[cs * 2 + 1], 106e5d8d54db25790524da34b0143f4e0176fb7677bScott Wood option | ~(cs_ranges_buf[i].size - 1)); 107e5d8d54db25790524da34b0143f4e0176fb7677bScott Wood out_be32(&ctrl_addr[cs * 2], base | cs_ranges_buf[i].addr); 108e5d8d54db25790524da34b0143f4e0176fb7677bScott Wood } 109e5d8d54db25790524da34b0143f4e0176fb7677bScott Wood 110e5d8d54db25790524da34b0143f4e0176fb7677bScott Wood return; 111e5d8d54db25790524da34b0143f4e0176fb7677bScott Wood 112e5d8d54db25790524da34b0143f4e0176fb7677bScott Wooderr: 11396fca1dea8f32e96668d55727d66416fdd67360bScott Wood printf("Bad /localbus node\r\n"); 114e5d8d54db25790524da34b0143f4e0176fb7677bScott Wood} 115e5d8d54db25790524da34b0143f4e0176fb7677bScott Wood 116e5d8d54db25790524da34b0143f4e0176fb7677bScott Wood/* Older u-boots don't set PCI up properly. Update the hardware to match 117e5d8d54db25790524da34b0143f4e0176fb7677bScott Wood * the device tree. The prefetch mem region and non-prefetch mem region 118e5d8d54db25790524da34b0143f4e0176fb7677bScott Wood * must be contiguous in the host bus. As required by the PCI binding, 119e5d8d54db25790524da34b0143f4e0176fb7677bScott Wood * PCI #addr/#size must be 3/2. The parent bus must be 1/1. Only 120e5d8d54db25790524da34b0143f4e0176fb7677bScott Wood * 32-bit PCI is supported. All three region types (prefetchable mem, 121e5d8d54db25790524da34b0143f4e0176fb7677bScott Wood * non-prefetchable mem, and I/O) must be present. 122e5d8d54db25790524da34b0143f4e0176fb7677bScott Wood */ 123e5d8d54db25790524da34b0143f4e0176fb7677bScott Woodstatic void fixup_pci(void) 124e5d8d54db25790524da34b0143f4e0176fb7677bScott Wood{ 125e5d8d54db25790524da34b0143f4e0176fb7677bScott Wood struct pci_range *mem = NULL, *mmio = NULL, 126e5d8d54db25790524da34b0143f4e0176fb7677bScott Wood *io = NULL, *mem_base = NULL; 127e5d8d54db25790524da34b0143f4e0176fb7677bScott Wood u32 *pci_regs[3]; 128e5d8d54db25790524da34b0143f4e0176fb7677bScott Wood u8 *soc_regs; 129e5d8d54db25790524da34b0143f4e0176fb7677bScott Wood int i, len; 130a94b89a4813bddf85c052f8d04021688c5dfe0d7Scott Wood void *node, *parent_node; 131378458d8655056d3d04994cb2b1c0fabb1b35983Scott Wood u32 naddr, nsize, mem_pow2, mem_mask; 132e5d8d54db25790524da34b0143f4e0176fb7677bScott Wood 133568091512d464b06f17b88bfd2bdc1ec98a697bdScott Wood node = finddevice("/pci"); 134568091512d464b06f17b88bfd2bdc1ec98a697bdScott Wood if (!node || !dt_is_compatible(node, "fsl,pq2-pci")) 135e5d8d54db25790524da34b0143f4e0176fb7677bScott Wood return; 136e5d8d54db25790524da34b0143f4e0176fb7677bScott Wood 137e5d8d54db25790524da34b0143f4e0176fb7677bScott Wood for (i = 0; i < 3; i++) 138568091512d464b06f17b88bfd2bdc1ec98a697bdScott Wood if (!dt_xlate_reg(node, i, 139e5d8d54db25790524da34b0143f4e0176fb7677bScott Wood (unsigned long *)&pci_regs[i], NULL)) 140e5d8d54db25790524da34b0143f4e0176fb7677bScott Wood goto err; 141e5d8d54db25790524da34b0143f4e0176fb7677bScott Wood 142a94b89a4813bddf85c052f8d04021688c5dfe0d7Scott Wood soc_regs = (u8 *)fsl_get_immr(); 143a94b89a4813bddf85c052f8d04021688c5dfe0d7Scott Wood if (!soc_regs) 144378458d8655056d3d04994cb2b1c0fabb1b35983Scott Wood goto unhandled; 145e5d8d54db25790524da34b0143f4e0176fb7677bScott Wood 146568091512d464b06f17b88bfd2bdc1ec98a697bdScott Wood dt_get_reg_format(node, &naddr, &nsize); 147e5d8d54db25790524da34b0143f4e0176fb7677bScott Wood if (naddr != 3 || nsize != 2) 148e5d8d54db25790524da34b0143f4e0176fb7677bScott Wood goto err; 149e5d8d54db25790524da34b0143f4e0176fb7677bScott Wood 150568091512d464b06f17b88bfd2bdc1ec98a697bdScott Wood parent_node = get_parent(node); 151e5d8d54db25790524da34b0143f4e0176fb7677bScott Wood if (!parent_node) 152e5d8d54db25790524da34b0143f4e0176fb7677bScott Wood goto err; 153e5d8d54db25790524da34b0143f4e0176fb7677bScott Wood 154e5d8d54db25790524da34b0143f4e0176fb7677bScott Wood dt_get_reg_format(parent_node, &naddr, &nsize); 155e5d8d54db25790524da34b0143f4e0176fb7677bScott Wood if (naddr != 1 || nsize != 1) 156378458d8655056d3d04994cb2b1c0fabb1b35983Scott Wood goto unhandled; 157e5d8d54db25790524da34b0143f4e0176fb7677bScott Wood 158568091512d464b06f17b88bfd2bdc1ec98a697bdScott Wood len = getprop(node, "ranges", pci_ranges_buf, 159e5d8d54db25790524da34b0143f4e0176fb7677bScott Wood sizeof(pci_ranges_buf)); 160e5d8d54db25790524da34b0143f4e0176fb7677bScott Wood 161e5d8d54db25790524da34b0143f4e0176fb7677bScott Wood for (i = 0; i < len / sizeof(struct pci_range); i++) { 162e5d8d54db25790524da34b0143f4e0176fb7677bScott Wood u32 flags = pci_ranges_buf[i].flags & 0x43000000; 163e5d8d54db25790524da34b0143f4e0176fb7677bScott Wood 164e5d8d54db25790524da34b0143f4e0176fb7677bScott Wood if (flags == 0x42000000) 165e5d8d54db25790524da34b0143f4e0176fb7677bScott Wood mem = &pci_ranges_buf[i]; 166e5d8d54db25790524da34b0143f4e0176fb7677bScott Wood else if (flags == 0x02000000) 167e5d8d54db25790524da34b0143f4e0176fb7677bScott Wood mmio = &pci_ranges_buf[i]; 168e5d8d54db25790524da34b0143f4e0176fb7677bScott Wood else if (flags == 0x01000000) 169e5d8d54db25790524da34b0143f4e0176fb7677bScott Wood io = &pci_ranges_buf[i]; 170e5d8d54db25790524da34b0143f4e0176fb7677bScott Wood } 171e5d8d54db25790524da34b0143f4e0176fb7677bScott Wood 172e5d8d54db25790524da34b0143f4e0176fb7677bScott Wood if (!mem || !mmio || !io) 173378458d8655056d3d04994cb2b1c0fabb1b35983Scott Wood goto unhandled; 174378458d8655056d3d04994cb2b1c0fabb1b35983Scott Wood if (mem->size[1] != mmio->size[1]) 175378458d8655056d3d04994cb2b1c0fabb1b35983Scott Wood goto unhandled; 176378458d8655056d3d04994cb2b1c0fabb1b35983Scott Wood if (mem->size[1] & (mem->size[1] - 1)) 177378458d8655056d3d04994cb2b1c0fabb1b35983Scott Wood goto unhandled; 178378458d8655056d3d04994cb2b1c0fabb1b35983Scott Wood if (io->size[1] & (io->size[1] - 1)) 179378458d8655056d3d04994cb2b1c0fabb1b35983Scott Wood goto unhandled; 180e5d8d54db25790524da34b0143f4e0176fb7677bScott Wood 181e5d8d54db25790524da34b0143f4e0176fb7677bScott Wood if (mem->phys_addr + mem->size[1] == mmio->phys_addr) 182e5d8d54db25790524da34b0143f4e0176fb7677bScott Wood mem_base = mem; 183e5d8d54db25790524da34b0143f4e0176fb7677bScott Wood else if (mmio->phys_addr + mmio->size[1] == mem->phys_addr) 184e5d8d54db25790524da34b0143f4e0176fb7677bScott Wood mem_base = mmio; 185e5d8d54db25790524da34b0143f4e0176fb7677bScott Wood else 186378458d8655056d3d04994cb2b1c0fabb1b35983Scott Wood goto unhandled; 187e5d8d54db25790524da34b0143f4e0176fb7677bScott Wood 188e5d8d54db25790524da34b0143f4e0176fb7677bScott Wood out_be32(&pci_regs[1][0], mem_base->phys_addr | 1); 189e5d8d54db25790524da34b0143f4e0176fb7677bScott Wood out_be32(&pci_regs[2][0], ~(mem->size[1] + mmio->size[1] - 1)); 190e5d8d54db25790524da34b0143f4e0176fb7677bScott Wood 191e5d8d54db25790524da34b0143f4e0176fb7677bScott Wood out_be32(&pci_regs[1][1], io->phys_addr | 1); 192e5d8d54db25790524da34b0143f4e0176fb7677bScott Wood out_be32(&pci_regs[2][1], ~(io->size[1] - 1)); 193e5d8d54db25790524da34b0143f4e0176fb7677bScott Wood 194e5d8d54db25790524da34b0143f4e0176fb7677bScott Wood out_le32(&pci_regs[0][0], mem->pci_addr[1] >> 12); 195e5d8d54db25790524da34b0143f4e0176fb7677bScott Wood out_le32(&pci_regs[0][2], mem->phys_addr >> 12); 196e5d8d54db25790524da34b0143f4e0176fb7677bScott Wood out_le32(&pci_regs[0][4], (~(mem->size[1] - 1) >> 12) | 0xa0000000); 197e5d8d54db25790524da34b0143f4e0176fb7677bScott Wood 198e5d8d54db25790524da34b0143f4e0176fb7677bScott Wood out_le32(&pci_regs[0][6], mmio->pci_addr[1] >> 12); 199e5d8d54db25790524da34b0143f4e0176fb7677bScott Wood out_le32(&pci_regs[0][8], mmio->phys_addr >> 12); 200e5d8d54db25790524da34b0143f4e0176fb7677bScott Wood out_le32(&pci_regs[0][10], (~(mmio->size[1] - 1) >> 12) | 0x80000000); 201e5d8d54db25790524da34b0143f4e0176fb7677bScott Wood 202e5d8d54db25790524da34b0143f4e0176fb7677bScott Wood out_le32(&pci_regs[0][12], io->pci_addr[1] >> 12); 203e5d8d54db25790524da34b0143f4e0176fb7677bScott Wood out_le32(&pci_regs[0][14], io->phys_addr >> 12); 204e5d8d54db25790524da34b0143f4e0176fb7677bScott Wood out_le32(&pci_regs[0][16], (~(io->size[1] - 1) >> 12) | 0xc0000000); 205e5d8d54db25790524da34b0143f4e0176fb7677bScott Wood 206e5d8d54db25790524da34b0143f4e0176fb7677bScott Wood /* Inbound translation */ 207e5d8d54db25790524da34b0143f4e0176fb7677bScott Wood out_le32(&pci_regs[0][58], 0); 208e5d8d54db25790524da34b0143f4e0176fb7677bScott Wood out_le32(&pci_regs[0][60], 0); 209e5d8d54db25790524da34b0143f4e0176fb7677bScott Wood 210378458d8655056d3d04994cb2b1c0fabb1b35983Scott Wood mem_pow2 = 1 << (__ilog2_u32(bd.bi_memsize - 1) + 1); 211378458d8655056d3d04994cb2b1c0fabb1b35983Scott Wood mem_mask = ~(mem_pow2 - 1) >> 12; 212378458d8655056d3d04994cb2b1c0fabb1b35983Scott Wood out_le32(&pci_regs[0][62], 0xa0000000 | mem_mask); 213e5d8d54db25790524da34b0143f4e0176fb7677bScott Wood 214e5d8d54db25790524da34b0143f4e0176fb7677bScott Wood /* If PCI is disabled, drive RST high to enable. */ 215e5d8d54db25790524da34b0143f4e0176fb7677bScott Wood if (!(in_le32(&pci_regs[0][32]) & 1)) { 216e5d8d54db25790524da34b0143f4e0176fb7677bScott Wood /* Tpvrh (Power valid to RST# high) 100 ms */ 217e5d8d54db25790524da34b0143f4e0176fb7677bScott Wood udelay(100000); 218e5d8d54db25790524da34b0143f4e0176fb7677bScott Wood 219e5d8d54db25790524da34b0143f4e0176fb7677bScott Wood out_le32(&pci_regs[0][32], 1); 220e5d8d54db25790524da34b0143f4e0176fb7677bScott Wood 221e5d8d54db25790524da34b0143f4e0176fb7677bScott Wood /* Trhfa (RST# high to first cfg access) 2^25 clocks */ 222e5d8d54db25790524da34b0143f4e0176fb7677bScott Wood udelay(1020000); 223e5d8d54db25790524da34b0143f4e0176fb7677bScott Wood } 224e5d8d54db25790524da34b0143f4e0176fb7677bScott Wood 225e5d8d54db25790524da34b0143f4e0176fb7677bScott Wood /* Enable bus master and memory access */ 226e5d8d54db25790524da34b0143f4e0176fb7677bScott Wood out_le32(&pci_regs[0][64], 0x80000004); 227e5d8d54db25790524da34b0143f4e0176fb7677bScott Wood out_le32(&pci_regs[0][65], in_le32(&pci_regs[0][65]) | 6); 228e5d8d54db25790524da34b0143f4e0176fb7677bScott Wood 229e5d8d54db25790524da34b0143f4e0176fb7677bScott Wood /* Park the bus on PCI, and elevate PCI's arbitration priority, 230e5d8d54db25790524da34b0143f4e0176fb7677bScott Wood * as required by section 9.6 of the user's manual. 231e5d8d54db25790524da34b0143f4e0176fb7677bScott Wood */ 232e5d8d54db25790524da34b0143f4e0176fb7677bScott Wood out_8(&soc_regs[0x10028], 3); 233e5d8d54db25790524da34b0143f4e0176fb7677bScott Wood out_be32((u32 *)&soc_regs[0x1002c], 0x01236745); 234e5d8d54db25790524da34b0143f4e0176fb7677bScott Wood 235e5d8d54db25790524da34b0143f4e0176fb7677bScott Wood return; 236e5d8d54db25790524da34b0143f4e0176fb7677bScott Wood 237e5d8d54db25790524da34b0143f4e0176fb7677bScott Wooderr: 238378458d8655056d3d04994cb2b1c0fabb1b35983Scott Wood printf("Bad PCI node -- using existing firmware setup.\r\n"); 239378458d8655056d3d04994cb2b1c0fabb1b35983Scott Wood return; 240378458d8655056d3d04994cb2b1c0fabb1b35983Scott Wood 241378458d8655056d3d04994cb2b1c0fabb1b35983Scott Woodunhandled: 242378458d8655056d3d04994cb2b1c0fabb1b35983Scott Wood printf("Unsupported PCI node -- using existing firmware setup.\r\n"); 243e5d8d54db25790524da34b0143f4e0176fb7677bScott Wood} 244e5d8d54db25790524da34b0143f4e0176fb7677bScott Wood 245e5d8d54db25790524da34b0143f4e0176fb7677bScott Woodstatic void pq2_platform_fixups(void) 246e5d8d54db25790524da34b0143f4e0176fb7677bScott Wood{ 247e5d8d54db25790524da34b0143f4e0176fb7677bScott Wood void *node; 248e5d8d54db25790524da34b0143f4e0176fb7677bScott Wood 249e5d8d54db25790524da34b0143f4e0176fb7677bScott Wood dt_fixup_memory(bd.bi_memstart, bd.bi_memsize); 250e5d8d54db25790524da34b0143f4e0176fb7677bScott Wood dt_fixup_mac_addresses(bd.bi_enetaddr, bd.bi_enet1addr); 251e5d8d54db25790524da34b0143f4e0176fb7677bScott Wood dt_fixup_cpu_clocks(bd.bi_intfreq, bd.bi_busfreq / 4, bd.bi_busfreq); 252e5d8d54db25790524da34b0143f4e0176fb7677bScott Wood 253e5d8d54db25790524da34b0143f4e0176fb7677bScott Wood node = finddevice("/soc/cpm"); 2546d817aa71fddea859ba02d1a0b326da930ce6b50Scott Wood if (node) 255e5d8d54db25790524da34b0143f4e0176fb7677bScott Wood setprop(node, "clock-frequency", &bd.bi_cpmfreq, 4); 2566d817aa71fddea859ba02d1a0b326da930ce6b50Scott Wood 2576d817aa71fddea859ba02d1a0b326da930ce6b50Scott Wood node = finddevice("/soc/cpm/brg"); 2586d817aa71fddea859ba02d1a0b326da930ce6b50Scott Wood if (node) 2596d817aa71fddea859ba02d1a0b326da930ce6b50Scott Wood setprop(node, "clock-frequency", &bd.bi_brgfreq, 4); 260e5d8d54db25790524da34b0143f4e0176fb7677bScott Wood 261e5d8d54db25790524da34b0143f4e0176fb7677bScott Wood update_cs_ranges(); 262e5d8d54db25790524da34b0143f4e0176fb7677bScott Wood fixup_pci(); 263e5d8d54db25790524da34b0143f4e0176fb7677bScott Wood} 264e5d8d54db25790524da34b0143f4e0176fb7677bScott Wood 265e5d8d54db25790524da34b0143f4e0176fb7677bScott Woodvoid platform_init(unsigned long r3, unsigned long r4, unsigned long r5, 266e5d8d54db25790524da34b0143f4e0176fb7677bScott Wood unsigned long r6, unsigned long r7) 267e5d8d54db25790524da34b0143f4e0176fb7677bScott Wood{ 268e5d8d54db25790524da34b0143f4e0176fb7677bScott Wood CUBOOT_INIT(); 2692f0dfeaa84a8eea56218b77ffc61ed3dd7181847David Gibson fdt_init(_dtb_start); 270e5d8d54db25790524da34b0143f4e0176fb7677bScott Wood serial_console_init(); 271e5d8d54db25790524da34b0143f4e0176fb7677bScott Wood platform_ops.fixups = pq2_platform_fixups; 272e5d8d54db25790524da34b0143f4e0176fb7677bScott Wood} 273