[U-Boot] [PATCH 1/3] ppc4xx: Initial support of the AMCC dual PPC460GT Arches reference board.
Wolfgang Denk
wd at denx.de
Wed Sep 24 14:09:06 CEST 2008
Dear Adam Graham,
In message <1222243872-15226-1-git-send-email-agraham at amcc.com> you wrote:
>
> +/*
> + * FPGA read/write helper macros
> + */
> +#define FPGA_READ(offset) ({ \
> + in_8((void *)(CFG_FPGA_BASE + offset)); })
> +#define FPGA_WRITE(offset, data) ({ \
> + out_8((void *)(CFG_FPGA_BASE + offset), data); })
> +
> +/*
> + * CPLD read/write helper macros
> + */
> +#define CPLD_READ(offset) ({ \
> + out_8((void *)(CFG_CPLD_ADDR), offset); \
> + in_8((void *)(CFG_CPLD_DATA)); })
> +#define CPLD_WRITE(offset, data) ({ \
> + out_8((void *)(CFG_CPLD_ADDR), offset); \
> + out_8((void *)(CFG_CPLD_DATA), data); })
Please make these inline functions instead. (See CodingStyle
document: "Generally, inline functions are preferable to macros
resembling functions.").
> + mtdcr(uic0cr, 0x00000005); /* ATI & UIC1 crit are critical */
It would be nice to use symbolic constatnts instead of hardcoded
numeric valies here.
> + /*
> + * Configure PFC (Pin Function Control) registers
> + * UART0: 4 pins
> + */
> + mtsdr(SDR0_PFC1, 0x00040000);
Ditto.
> + /* Enable PCI host functionality in SDR0_PCI0 */
> + mtsdr(SDR0_PCI0, 0xe0000000);
Ditto.
> + return 0;
> +}
Hm... most of this code looks suspiciously similar to what we have in
"board/amcc/canyonlands/canyonlands.c" - which is not a big surprise,
given the fact how closely related these two boards are.
Do we really need a separate board directory for arches?
Wouldn't it make more sense to use a common source tree for both,
like we do in Linux, too?
> +/*
> + * pci_target_init
> + *
> + * The bootstrap configuration provides default settings for the pci
> + * inbound map (PIM). But the bootstrap config choices are limited and
> + * may not be sufficient for a given board.
> + */
> +#if defined(CONFIG_PCI) && defined(CFG_PCI_TARGET_INIT)
> +void pci_target_init(struct pci_controller *hose)
> +{
> + /*
> + * Disable everything
> + */
> + out_le32((void *)PCIX0_PIM0SA, 0); /* disable */
> + out_le32((void *)PCIX0_PIM1SA, 0); /* disable */
> + out_le32((void *)PCIX0_PIM2SA, 0); /* disable */
> + out_le32((void *)PCIX0_EROMBA, 0); /* disable expansion rom */
> +
> + /*
> + * Map all of SDRAM to PCI address 0x0000_0000. Note that the 440
> + * strapping options to not support sizes such as 128/256 MB.
> + */
> + out_le32((void *)PCIX0_PIM0LAL, CFG_SDRAM_BASE);
> + out_le32((void *)PCIX0_PIM0LAH, 0);
> + out_le32((void *)PCIX0_PIM0SA, ~(gd->ram_size - 1) | 1);
> + out_le32((void *)PCIX0_BAR0, 0);
> +
> + /*
> + * Program the board's subsystem id/vendor id
> + */
> + out_le16((void *)PCIX0_SBSYSVID, CFG_PCI_SUBSYS_VENDORID);
> + out_le16((void *)PCIX0_SBSYSID, CFG_PCI_SUBSYS_DEVICEID);
> +
> + out_le16((void *)PCIX0_CMD, in16r(PCIX0_CMD) | PCI_COMMAND_MEMORY);
> +}
> +#endif /* defined(CONFIG_PCI) && defined(CFG_PCI_TARGET_INIT) */
> +
> +#if defined(CONFIG_PCI)
> +/*
> + * is_pci_host
> + *
> + * This routine is called to determine if a pci scan should be
> + * performed. With various hardware environments (especially cPCI and
> + * PPMC) it's insufficient to depend on the state of the arbiter enable
> + * bit in the strap register, or generic host/adapter assumptions.
> + *
> + * Rather than hard-code a bad assumption in the general 440 code, the
> + * 440 pci code requires the board to decide at runtime.
> + *
> + * Return 0 for adapter mode, non-zero for host (monarch) mode.
> + */
> +int is_pci_host(struct pci_controller *hose)
> +{
> + /* Board is always configured as host. */
> + return 1;
> +}
> +
> +static struct pci_controller pcie_hose[2] = { {0}, {0} };
> +
> +void pcie_setup_hoses(int busno)
> +{
> + struct pci_controller *hose;
> + int i, bus;
> + int ret = 0;
> + char *env;
> + unsigned int delay;
> + int end;
> +
> + /*
> + * assume we're called after the PCIX hose is initialized, which takes
> + * bus ID 0 and therefore start numbering PCIe's from 1.
> + */
> + bus = busno;
> +
> +#if defined(CONFIG_RAPIDIO)
> + end = 0;
> +#else
> + end = 1;
> +#endif
> +
> + for (i = 0; i <= end; i++) {
> +
> + if (is_end_point(i))
> + ret = ppc4xx_init_pcie_endport(i);
> + else
> + ret = ppc4xx_init_pcie_rootport(i);
> + if (ret) {
> + printf("PCIE%d: initialization as %s failed\n", i,
> + is_end_point(i) ? "endpoint" : "root-complex");
> + continue;
> + }
> +
> + hose = &pcie_hose[i];
> + hose->first_busno = bus;
> + hose->last_busno = bus;
> + hose->current_busno = bus;
> +
> + /* setup mem resource */
> + pci_set_region(hose->regions + 0,
> + CFG_PCIE_MEMBASE + i * CFG_PCIE_MEMSIZE,
> + CFG_PCIE_MEMBASE + i * CFG_PCIE_MEMSIZE,
> + CFG_PCIE_MEMSIZE,
> + PCI_REGION_MEM);
> + hose->region_count = 1;
> + pci_register_hose(hose);
> +
> + if (is_end_point(i)) {
> + ppc4xx_setup_pcie_endpoint(hose, i);
> + /*
> + * Reson for no scanning is endpoint can not generate
> + * upstream configuration accesses.
> + */
> + } else {
> + ppc4xx_setup_pcie_rootpoint(hose, i);
> + env = getenv("pciscandelay");
> + if (env != NULL) {
> + delay = simple_strtoul(env, NULL, 10);
> + if (delay > 5)
> + printf("Warning, expect noticable "
> + "delay before PCIe scan due "
> + "to 'pciscandelay' value!\n");
> + mdelay(delay * 1000);
> + }
> +
> + /*
> + * Config access can only go down stream
> + */
> + hose->last_busno = pci_hose_scan(hose);
> + bus = hose->last_busno + 1;
> + }
> + }
> +}
> +#endif /* CONFIG_PCI */
All this looks liek verbatim copies of the canyonlands code.
Similar for the rest of the code.
I think we should avoid such an extensive code duplication.
NAK.
Best regards,
Wolfgang Denk
--
DENX Software Engineering GmbH, MD: Wolfgang Denk & Detlev Zundel
HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany
Phone: (+49)-8142-66989-10 Fax: (+49)-8142-66989-80 Email: wd at denx.de
"There's always been Tower of Babel sort of bickering inside Unix,
but this is the most extreme form ever. This means at least several
years of confusion." - Bill Gates, founder and chairman of Microsoft,
about the Open Systems Foundation
More information about the U-Boot
mailing list