Module Name: src Committed By: matt Date: Tue Feb 8 06:22:29 UTC 2011
Modified Files: src/sys/arch/evbppc/conf: files.mpc85xx src/sys/arch/evbppc/mpc85xx: machdep.c Log Message: Add MPC85xx variants. Move to having a common kernel for all MPC85xx variants (CADMUS/PIXIS still remain a problem). To generate a diff of this commit: cvs rdiff -u -r1.2 -r1.3 src/sys/arch/evbppc/conf/files.mpc85xx cvs rdiff -u -r1.2 -r1.3 src/sys/arch/evbppc/mpc85xx/machdep.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/sys/arch/evbppc/conf/files.mpc85xx diff -u src/sys/arch/evbppc/conf/files.mpc85xx:1.2 src/sys/arch/evbppc/conf/files.mpc85xx:1.3 --- src/sys/arch/evbppc/conf/files.mpc85xx:1.2 Tue Jan 18 01:10:25 2011 +++ src/sys/arch/evbppc/conf/files.mpc85xx Tue Feb 8 06:22:29 2011 @@ -1,8 +1,9 @@ -# $NetBSD: files.mpc85xx,v 1.2 2011/01/18 01:10:25 matt Exp $ +# $NetBSD: files.mpc85xx,v 1.3 2011/02/08 06:22:29 matt Exp $ # # mpc85xx-specific configuration info -defflag opt_mpc85xx.h MPC8536 MPC8544 MPC8548 MPC8572 CADMUS PIXIS +defflag opt_mpc85xx.h MPC8536 MPC8544 MPC8548 MPC8555 MPC8568 MPC8572 + P2020 CADMUS PIXIS defparam opt_mpc85xx.h SYS_CLK file arch/evbppc/mpc85xx/autoconf.c Index: src/sys/arch/evbppc/mpc85xx/machdep.c diff -u src/sys/arch/evbppc/mpc85xx/machdep.c:1.2 src/sys/arch/evbppc/mpc85xx/machdep.c:1.3 --- src/sys/arch/evbppc/mpc85xx/machdep.c:1.2 Tue Jan 18 01:10:25 2011 +++ src/sys/arch/evbppc/mpc85xx/machdep.c Tue Feb 8 06:22:29 2011 @@ -1,4 +1,4 @@ -/* $NetBSD: machdep.c,v 1.2 2011/01/18 01:10:25 matt Exp $ */ +/* $NetBSD: machdep.c,v 1.3 2011/02/08 06:22:29 matt Exp $ */ /*- * Copyright (c) 2010, 2011 The NetBSD Foundation, Inc. * All rights reserved. @@ -168,91 +168,156 @@ static const struct cpunode_locators mpc8548_cpunode_locs[] = { { "cpu" }, /* not a real device */ { "wdog" }, /* not a real device */ - { "duart", DUART1_BASE, 2*DUART_SIZE, 0, 1, - { ISOURCE_DUART }, + { "duart", DUART1_BASE, 2*DUART_SIZE, 0, + 1, { ISOURCE_DUART }, 1 + ilog2(DEVDISR_DUART) }, -#if defined(MPC8548) || defined(MPC8572) - { "tsec", ETSEC1_BASE, ETSEC_SIZE, 1, 3, - { ISOURCE_ETSEC1_TX, ISOURCE_ETSEC1_RX, ISOURCE_ETSEC1_ERR }, + { "tsec", ETSEC1_BASE, ETSEC_SIZE, 1, + 3, { ISOURCE_ETSEC1_TX, ISOURCE_ETSEC1_RX, ISOURCE_ETSEC1_ERR }, 1 + ilog2(DEVDISR_TSEC1) }, - { "tsec", ETSEC2_BASE, ETSEC_SIZE, 2, 3, - { ISOURCE_ETSEC2_TX, ISOURCE_ETSEC2_RX, ISOURCE_ETSEC2_ERR }, - 1 + ilog2(DEVDISR_TSEC2) }, - { "tsec", ETSEC3_BASE, ETSEC_SIZE, 3, 3, - { ISOURCE_ETSEC3_TX, ISOURCE_ETSEC3_RX, ISOURCE_ETSEC3_ERR }, - 1 + ilog2(DEVDISR_TSEC3) }, - { "tsec", ETSEC4_BASE, ETSEC_SIZE, 4, 3, - { ISOURCE_ETSEC4_TX, ISOURCE_ETSEC4_RX, ISOURCE_ETSEC4_ERR }, - 1 + ilog2(DEVDISR_TSEC4) }, +#if defined(MPC8548) || defined(MPC8555) || defined(MPC8572) || defined(P2020) + { "tsec", ETSEC2_BASE, ETSEC_SIZE, 2, + 3, { ISOURCE_ETSEC2_TX, ISOURCE_ETSEC2_RX, ISOURCE_ETSEC2_ERR }, + 1 + ilog2(DEVDISR_TSEC2), + { SVR_MPC8548v1 >> 16, SVR_MPC8555v1 >> 16, + SVR_MPC8572v1 >> 16, SVR_P2020v2 >> 16 } }, #endif #if defined(MPC8544) || defined(MPC8536) - { "tsec", ETSEC1_BASE, ETSEC_SIZE, 1, 3, - { ISOURCE_ETSEC1_TX, ISOURCE_ETSEC1_RX, ISOURCE_ETSEC1_ERR }, - 1 + ilog2(DEVDISR_TSEC1) }, - { "tsec", ETSEC3_BASE, ETSEC_SIZE, 2, 3, - { ISOURCE_ETSEC3_TX, ISOURCE_ETSEC3_RX, ISOURCE_ETSEC3_ERR }, - 1 + ilog2(DEVDISR_TSEC2) }, -#endif - { "diic", I2C1_BASE, 2*I2C_SIZE, 0, 1, - { ISOURCE_I2C }, - 1 + ilog2(DEVDISR_TSEC2) }, -#ifndef MPC8572 + { "tsec", ETSEC3_BASE, ETSEC_SIZE, 2, + 3, { ISOURCE_ETSEC3_TX, ISOURCE_ETSEC3_RX, ISOURCE_ETSEC3_ERR }, + 1 + ilog2(DEVDISR_TSEC3), + { SVR_MPC8536v1 >> 16, SVR_MPC8544v1 >> 16 } }, +#endif +#if defined(MPC8548) || defined(MPC8572) || defined(P2020) + { "tsec", ETSEC3_BASE, ETSEC_SIZE, 3, + 3, { ISOURCE_ETSEC3_TX, ISOURCE_ETSEC3_RX, ISOURCE_ETSEC3_ERR }, + 1 + ilog2(DEVDISR_TSEC3), + { SVR_MPC8548v1 >> 16, SVR_MPC8572v1 >> 16, + SVR_P2020v2 >> 16 } }, +#endif +#if defined(MPC8548) || defined(MPC8572) + { "tsec", ETSEC4_BASE, ETSEC_SIZE, 4, + 3, { ISOURCE_ETSEC4_TX, ISOURCE_ETSEC4_RX, ISOURCE_ETSEC4_ERR }, + 1 + ilog2(DEVDISR_TSEC4), + { SVR_MPC8548v1 >> 16, SVR_MPC8572v1 >> 16 } }, +#endif + { "diic", I2C1_BASE, 2*I2C_SIZE, 0, + 1, { ISOURCE_I2C }, + 1 + ilog2(DEVDISR_I2C) }, /* MPC8572 doesn't have any GPIO */ - { "gpio", GLOBAL_BASE, GLOBAL_SIZE, 0, 0 }, + { "gpio", GLOBAL_BASE, GLOBAL_SIZE, 0, + 1, { ISOURCE_GPIO }, + 0, + { 0xffff, SVR_MPC8572v1 >> 16 } }, + { "ddrc", DDRC1_BASE, DDRC_SIZE, 0, + 1, { ISOURCE_DDR }, + 1 + ilog2(DEVDISR_DDR_15), + { 0xffff, SVR_MPC8572v1 >> 16, SVR_MPC8536v1 >> 16 } }, +#if defined(MPC8536) + { "ddrc", DDRC1_BASE, DDRC_SIZE, 0, + 1, { ISOURCE_DDR }, + 1 + ilog2(DEVDISR_DDR_16), + { SVR_MPC8536v1 >> 16 } }, +#endif +#if defined(MPC8572) + { "ddrc", DDRC1_BASE, DDRC_SIZE, 1, + 1, { ISOURCE_DDR }, + 1 + ilog2(DEVDISR_DDR_15), + { SVR_MPC8572v1 >> 16 } }, + { "ddrc", DDRC1_BASE, DDRC_SIZE, 2, + 1, { ISOURCE_DDR }, + 1 + ilog2(DEVDISR_DDR2_14), + { SVR_MPC8572v1 >> 16 } }, #endif - { "ddrc", DDRC1_BASE, DDRC_SIZE, 0, 1, - { ISOURCE_DDR }, - 1 + ilog2(DEVDISR_TSEC2) }, #if defined(MPC8544) || defined(MPC8536) - { "pcie", PCIE1_BASE, PCI_SIZE, 1, 1, - { ISOURCE_PCIEX }, - 1 + ilog2(DEVDISR_PCIE) }, - { "pcie", PCIE2_MPC8544_BASE, PCI_SIZE, 2, 1, - { ISOURCE_PCIEX2 }, - 1 + ilog2(DEVDISR_PCIE3) }, - { "pcie", PCIE3_MPC8544_BASE, PCI_SIZE, 3, 1, - { ISOURCE_PCIEX3 }, - 1 + ilog2(DEVDISR_PCIE2) }, - { "pci", PCIX1_MPC8544_BASE, PCI_SIZE, 1, 1, - { ISOURCE_PCI1 }, - 1 + ilog2(DEVDISR_PCI1) }, + { "pcie", PCIE1_BASE, PCI_SIZE, 1, + 1, { ISOURCE_PCIEX }, + 1 + ilog2(DEVDISR_PCIE), + { SVR_MPC8536v1 >> 16, SVR_MPC8544v1 >> 16 } }, + { "pcie", PCIE2_MPC8544_BASE, PCI_SIZE, 2, + 1, { ISOURCE_PCIEX2 }, + 1 + ilog2(DEVDISR_PCIE2), + { SVR_MPC8536v1 >> 16, SVR_MPC8544v1 >> 16 } }, + { "pcie", PCIE3_MPC8544_BASE, PCI_SIZE, 3, + 1, { ISOURCE_PCIEX3 }, + 1 + ilog2(DEVDISR_PCIE3), + { SVR_MPC8536v1 >> 16, SVR_MPC8544v1 >> 16 } }, + { "pci", PCIX1_MPC8544_BASE, PCI_SIZE, 0, + 1, { ISOURCE_PCI1 }, + 1 + ilog2(DEVDISR_PCI1), + { SVR_MPC8536v1 >> 16, SVR_MPC8544v1 >> 16 } }, #endif #ifdef MPC8548 - { "pcie", PCIE1_BASE, PCI_SIZE, 0, 1, - { ISOURCE_PCIEX }, - 1 + ilog2(DEVDISR_PCIE) }, - { "pci", PCIX1_MPC8548_BASE, PCI_SIZE, 1, 1, - { ISOURCE_PCI1 }, - 1 + ilog2(DEVDISR_PCI1) }, - { "pci", PCIX2_MPC8548_BASE, PCI_SIZE, 2, 1, - { ISOURCE_PCI2 }, - 1 + ilog2(DEVDISR_PCI2) }, + { "pcie", PCIE1_BASE, PCI_SIZE, 0, + 1, { ISOURCE_PCIEX }, + 1 + ilog2(DEVDISR_PCIE), + { SVR_MPC8538v1 >> 16 }, }, + { "pci", PCIX1_MPC8548_BASE, PCI_SIZE, 1, + 1, { ISOURCE_PCI1 }, + 1 + ilog2(DEVDISR_PCI1), + { SVR_MPC8538v1 >> 16 }, }, + { "pci", PCIX2_MPC8548_BASE, PCI_SIZE, 2, + 1, { ISOURCE_PCI2 }, + 1 + ilog2(DEVDISR_PCI2), + { SVR_MPC8538v1 >> 16 }, }, +#endif +#if defined(MPC8572) || defined(P2020) + { "pcie", PCIE1_BASE, PCI_SIZE, 1, + 1, { ISOURCE_PCIEX }, + 1 + ilog2(DEVDISR_PCIE), + { SVR_MPC8572v1 >> 16, SVR_P2020v2 >> 16 } }, + { "pcie", PCIE2_MPC8572_BASE, PCI_SIZE, 2, + 1, { ISOURCE_PCIEX2 }, + 1 + ilog2(DEVDISR_PCIE2), + { SVR_MPC8572v1 >> 16, SVR_P2020v2 >> 16 } }, + { "pcie", PCIE3_MPC8572_BASE, PCI_SIZE, 3, + 1, { ISOURCE_PCIEX3_MPC8572 }, + 1 + ilog2(DEVDISR_PCIE3), + { SVR_MPC8572v1 >> 16, SVR_P2020v2 >> 16 } }, +#endif +#if defined(MPC8536) || defined(P2020) + { "ehci", USB1_BASE, USB_SIZE, 1, + 1, { ISOURCE_USB1 }, + 1 + ilog2(DEVDISR_USB1), + { SVR_MPC8536v1 >> 16, SVR_P2020v2 >> 16 } }, #endif #ifdef MPC8536 - { "ehci", USB1_BASE, USB_SIZE, 1, 1, - { ISOURCE_USB1 }, - 1 + ilog2(DEVDISR_USB1) }, - { "ehci", USB2_BASE, USB_SIZE, 2, 1, - { ISOURCE_USB2 }, - 1 + ilog2(DEVDISR_USB2) }, - { "ehci", USB3_BASE, USB_SIZE, 3, 1, - { ISOURCE_USB3 }, - 1 + ilog2(DEVDISR_USB3) }, - { "sata", SATA1_BASE, SATA_SIZE, 1, 1, - { ISOURCE_SATA1 }, - 1 + ilog2(DEVDISR_SATA1) }, - { "sata", SATA2_BASE, SATA_SIZE, 2, 1, - { ISOURCE_SATA2 }, - 1 + ilog2(DEVDISR_SATA2) }, - { "spi", SPI_BASE, SPI_SIZE, 0, 1, - { ISOURCE_SPI }, - 1 + ilog2(DEVDISR_SPI) }, - { "sdhc", ESDHC_BASE, ESDHC_SIZE, 0, 1, - { ISOURCE_ESDHC }, - 1 + ilog2(DEVDISR_ESDHC) }, + { "ehci", USB2_BASE, USB_SIZE, 2, + 1, { ISOURCE_USB2 }, + 1 + ilog2(DEVDISR_USB2), + { SVR_MPC8536v1 >> 16 }, }, + { "ehci", USB3_BASE, USB_SIZE, 3, + 1, { ISOURCE_USB3 }, + 1 + ilog2(DEVDISR_USB3), + { SVR_MPC8536v1 >> 16 }, }, + { "sata", SATA1_BASE, SATA_SIZE, 1, + 1, { ISOURCE_SATA1 }, + 1 + ilog2(DEVDISR_SATA1), + { SVR_MPC8536v1 >> 16 }, }, + { "sata", SATA2_BASE, SATA_SIZE, 2, + 1, { ISOURCE_SATA2 }, + 1 + ilog2(DEVDISR_SATA2), + { SVR_MPC8536v1 >> 16 }, }, + { "spi", SPI_BASE, SPI_SIZE, 0, + 1, { ISOURCE_SPI }, + 1 + ilog2(DEVDISR_SPI_15), + { SVR_MPC8536v1 >> 16 }, }, + { "sdhc", ESDHC_BASE, ESDHC_SIZE, 0, + 1, { ISOURCE_ESDHC }, + 1 + ilog2(DEVDISR_ESDHC_12), + { SVR_MPC8536v1 >> 16 }, }, +#endif +#if defined(P2020) + { "spi", SPI_BASE, SPI_SIZE, 0, + 1, { ISOURCE_SPI }, + 1 + ilog2(DEVDISR_SPI_28), + { SVR_P2020v2 >> 16 }, }, + { "sdhc", ESDHC_BASE, ESDHC_SIZE, 0, + 1, { ISOURCE_ESDHC }, + 1 + ilog2(DEVDISR_ESDHC_10), + { SVR_P2020v2 >> 16 }, }, #endif - { "lbc", LBC_BASE, LBC_SIZE, 0, 1, - { ISOURCE_LBC }, + { "lbc", LBC_BASE, LBC_SIZE, 0, + 1, { ISOURCE_LBC }, 1 + ilog2(DEVDISR_LBC) }, //{ "sec", RNG_BASE, RNG_SIZE, 0, 0, }, { NULL } @@ -438,18 +503,38 @@ #endif } +static uint16_t +getsvr(void) +{ + uint16_t svr = mfspr(SPR_SVR) >> 16; + + svr &= ~0x8; /* clear security bit */ + switch (svr) { + case SVR_MPC8543v1 >> 16: return SVR_MPC8548v1 >> 16; + case SVR_MPC8541v1 >> 16: return SVR_MPC8555v1 >> 16; + case SVR_P2010v2 >> 16: return SVR_P2020v2 >> 16; + default: return svr; + } +} + static const char * socname(uint32_t svr) { - svr &= ~0x80000; + svr &= ~0x80000; /* clear security bit */ switch (svr >> 8) { - case SVR_MPC8548v2 >> 8: return "MPC8548"; - case SVR_MPC8547v2 >> 8: return "MPC8547"; - case SVR_MPC8545v2 >> 8: return "MPC8545"; + case SVR_MPC8536v1 >> 8: return "MPC8536"; + case SVR_MPC8541v1 >> 8: return "MPC8541"; case SVR_MPC8543v2 >> 8: return "MPC8543"; case SVR_MPC8544v1 >> 8: return "MPC8544"; - case SVR_MPC8536v1 >> 8: return "MPC8536"; - case SVR_MPC8572 >> 8: return "MPC8572"; + case SVR_MPC8545v2 >> 8: return "MPC8545"; + case SVR_MPC8547v2 >> 8: return "MPC8547"; + case SVR_MPC8548v2 >> 8: return "MPC8548"; + case SVR_MPC8555v1 >> 8: return "MPC8555"; + case SVR_MPC8568v1 >> 8: return "MPC8568"; + case SVR_MPC8567v1 >> 8: return "MPC8567"; + case SVR_MPC8572v1 >> 8: return "MPC8572"; + case SVR_P2020v2 >> 8: return "P2020"; + case SVR_P2010v2 >> 8: return "P2010"; default: panic("%s: unknown SVR %#x", __func__, svr); } @@ -841,6 +926,7 @@ cpu_startup(void) { struct cpu_info * const ci = curcpu(); + const uint16_t svr = getsvr(); booke_cpu_startup(socname(mfspr(SPR_SVR))); @@ -854,13 +940,14 @@ ci->ci_khz = (cpu_freq + 500) / 1000; cpu_timebase = ci->ci_data.cpu_cc_freq = ccb_freq / 8; + board_info_add_number("my-id", svr); board_info_add_bool("pq3"); board_info_add_number("mem-size", pmemsize); const uint32_t l2ctl = cpu_read_4(L2CACHE_BASE + L2CTL); uint32_t l2siz = L2CTL_L2SIZ_GET(l2ctl); uint32_t l2banks = l2siz >> 16; #ifdef MPC85555 - if (e500_get_svr() == (MPC8555v1 >> 16)) { + if (svr == (MPC8555v1 >> 16)) { l2siz >>= 1; l2banks >>= 1; } @@ -908,21 +995,48 @@ * PCI-Express virtual wire interrupts on combined with * External IRQ0/1/2/3. */ + switch (svr) { #if defined(MPC8548) - mpc85xx_pci_setup("pcie0-interrupt-map", 0x001800, IST_LEVEL, 0, 1, 2, 3); -#endif -#if defined(MPC8544) || defined(MPC8572) || defined(MPC8536) - mpc85xx_pci_setup("pcie1-interrupt-map", 0x001800, IST_LEVEL, 0, 1, 2, 3); - mpc85xx_pci_setup("pcie2-interrupt-map", 0x001800, IST_LEVEL, 4, 5, 6, 7); - mpc85xx_pci_setup("pcie3-interrupt-map", 0x001800, IST_LEVEL, 8, 9, 10, 11); -#endif -#if defined(MPC8544) || defined(MPC8548) - mpc85xx_pci_setup("pci1-interrupt-map", 0x001800, IST_LEVEL, 0, 1, 2, 3); + case SVR_MPC8548v1 >> 16: + mpc85xx_pci_setup("pcie0-interrupt-map", 0x001800, + IST_LEVEL, 0, 1, 2, 3); + break; +#endif +#if defined(MPC8544) || defined(MPC8572) || defined(MPC8536) || defined(P2020) + case SVR_MPC8536v1 >> 16: + case SVR_MPC8544v1 >> 16: + case SVR_MPC8572v1 >> 16: + case SVR_P2010v2 >> 16: + case SVR_P2020v2 >> 16: + mpc85xx_pci_setup("pcie1-interrupt-map", 0x001800, IST_LEVEL, + 0, 1, 2, 3); + mpc85xx_pci_setup("pcie2-interrupt-map", 0x001800, IST_LEVEL, + 4, 5, 6, 7); + mpc85xx_pci_setup("pcie3-interrupt-map", 0x001800, IST_LEVEL, + 8, 9, 10, 11); + break; #endif + } + switch (svr) { #if defined(MPC8536) - mpc85xx_pci_setup("pci1-interrupt-map", 0x001800, IST_LEVEL, 1, 2, 3, 4); + case SVR_MPC8536v1 >> 16: + mpc85xx_pci_setup("pci1-interrupt-map", 0x001800, IST_LEVEL, + 1, 2, 3, 4); + break; +#endif +#if defined(MPC8544) + case SVR_MPC8544v1 >> 16: + mpc85xx_pci_setup("pci1-interrupt-map", 0x001800, IST_LEVEL, + 0, 1, 2, 3); + break; #endif #if defined(MPC8548) - mpc85xx_pci_setup("pci2-interrupt-map", 0x001800, IST_LEVEL, 11, 1, 2, 3); + case SVR_MPC8548v1 >> 16: + mpc85xx_pci_setup("pci1-interrupt-map", 0x001800, IST_LEVEL, + 0, 1, 2, 3); + mpc85xx_pci_setup("pci2-interrupt-map", 0x001800, IST_LEVEL, + 11, 1, 2, 3); + break; #endif + } }