source: trunk/target/linux/brcm63xx/patches-2.6.27/011-add_preliminary_board_support.patch @ 13001

Last change on this file since 13001 was 13001, checked in by florian, 8 years ago

New Broadcom BCM63xx codebase, huge thanks to Maxime ;)

File size: 12.8 KB
  • arch/mips/bcm63xx/Kconfig

    From b95a2bbbcae5423e5404a7b3c8dd1685e1786f13 Mon Sep 17 00:00:00 2001
    From: Maxime Bizon <mbizon@freebox.fr>
    Date: Wed, 17 Sep 2008 15:55:36 +0200
    Subject: [PATCH] [MIPS] BCM63XX: Add preliminary board support.
    
    Signed-off-by: Maxime Bizon <mbizon@freebox.fr>
    ---
     arch/mips/bcm63xx/Kconfig                      |    2 +
     arch/mips/bcm63xx/Makefile                     |    2 +
     arch/mips/bcm63xx/boards/Kconfig               |   10 +
     arch/mips/bcm63xx/boards/Makefile              |    1 +
     arch/mips/bcm63xx/boards/board_bcm963xx.c      |  322 ++++++++++++++++++++++++
     arch/mips/bcm63xx/prom.c                       |    4 +
     arch/mips/bcm63xx/setup.c                      |   16 +-
     include/asm-mips/mach-bcm63xx/bcm63xx_board.h  |   12 +
     include/asm-mips/mach-bcm63xx/board_bcm963xx.h |   50 ++++
     9 files changed, 417 insertions(+), 2 deletions(-)
     create mode 100644 arch/mips/bcm63xx/boards/Kconfig
     create mode 100644 arch/mips/bcm63xx/boards/Makefile
     create mode 100644 arch/mips/bcm63xx/boards/board_bcm963xx.c
     create mode 100644 include/asm-mips/mach-bcm63xx/bcm63xx_board.h
     create mode 100644 include/asm-mips/mach-bcm63xx/board_bcm963xx.h
    
    diff --git a/arch/mips/bcm63xx/Kconfig b/arch/mips/bcm63xx/Kconfig
    index be120f7..8c192e7 100644
    a b config BCM63XX_CPU_6358 
    1717        select USB_ARCH_HAS_EHCI 
    1818        select USB_EHCI_BIG_ENDIAN_MMIO 
    1919endmenu 
     20 
     21source "arch/mips/bcm63xx/boards/Kconfig" 
  • arch/mips/bcm63xx/Makefile

    diff --git a/arch/mips/bcm63xx/Makefile b/arch/mips/bcm63xx/Makefile
    index 5358093..10462ae 100644
    a b obj-y += dev-usb-ohci.o 
    55obj-y           += dev-usb-ehci.o 
    66obj-y           += dev-enet.o 
    77obj-$(CONFIG_EARLY_PRINTK)      += early_printk.o 
     8 
     9obj-y           += boards/ 
  • new file arch/mips/bcm63xx/boards/Kconfig

    diff --git a/arch/mips/bcm63xx/boards/Kconfig b/arch/mips/bcm63xx/boards/Kconfig
    new file mode 100644
    index 0000000..da5eeaa
    - +  
     1choice 
     2        prompt "Board support" 
     3        depends on BCM63XX 
     4        default BOARD_BCM963XX 
     5 
     6config BOARD_BCM963XX 
     7       bool "Generic Broadcom 963xx boards" 
     8       help 
     9 
     10endchoice 
  • new file arch/mips/bcm63xx/boards/Makefile

    diff --git a/arch/mips/bcm63xx/boards/Makefile b/arch/mips/bcm63xx/boards/Makefile
    new file mode 100644
    index 0000000..af07c1a
    - +  
     1obj-$(CONFIG_BOARD_BCM963XX)            += board_bcm963xx.o 
  • new file arch/mips/bcm63xx/boards/board_bcm963xx.c

    diff --git a/arch/mips/bcm63xx/boards/board_bcm963xx.c b/arch/mips/bcm63xx/boards/board_bcm963xx.c
    new file mode 100644
    index 0000000..de52a2a
    - +  
     1/* 
     2 * This file is subject to the terms and conditions of the GNU General Public 
     3 * License.  See the file "COPYING" in the main directory of this archive 
     4 * for more details. 
     5 * 
     6 * Copyright (C) 2008 Maxime Bizon <mbizon@freebox.fr> 
     7 */ 
     8 
     9#include <linux/init.h> 
     10#include <linux/kernel.h> 
     11#include <linux/string.h> 
     12#include <linux/platform_device.h> 
     13#include <linux/mtd/mtd.h> 
     14#include <linux/mtd/partitions.h> 
     15#include <linux/mtd/physmap.h> 
     16#include <asm/addrspace.h> 
     17#include <bcm63xx_board.h> 
     18#include <bcm63xx_cpu.h> 
     19#include <bcm63xx_regs.h> 
     20#include <bcm63xx_io.h> 
     21#include <bcm63xx_board.h> 
     22#include <bcm63xx_dev_pci.h> 
     23#include <bcm63xx_dev_uart.h> 
     24#include <bcm63xx_dev_enet.h> 
     25#include <bcm63xx_dev_pcmcia.h> 
     26#include <bcm63xx_dev_usb_ohci.h> 
     27#include <bcm63xx_dev_usb_ehci.h> 
     28#include <board_bcm963xx.h> 
     29 
     30#define PFX     "board_bcm963xx: " 
     31 
     32static struct bcm963xx_nvram nvram; 
     33static unsigned int mac_addr_used = 0; 
     34static struct board_info board; 
     35 
     36/* 
     37 * known 6348 boards 
     38 */ 
     39#ifdef CONFIG_BCM63XX_CPU_6348 
     40static struct board_info __initdata board_96348r = { 
     41        .name                           = "96348R", 
     42        .expected_cpu_id                = 0x6348, 
     43 
     44        .has_enet0                      = 1, 
     45        .has_pci                        = 1, 
     46 
     47        .enet0 = { 
     48                .has_phy                = 1, 
     49                .use_internal_phy       = 1, 
     50        }, 
     51}; 
     52 
     53static struct board_info __initdata board_96348gw = { 
     54        .name                           = "96348GW", 
     55        .expected_cpu_id                = 0x6348, 
     56 
     57        .has_enet0                      = 1, 
     58        .has_pci                        = 1, 
     59 
     60        .enet0 = { 
     61                .has_phy                = 1, 
     62                .use_internal_phy       = 1, 
     63        }, 
     64}; 
     65#endif 
     66 
     67/* 
     68 * known 6358 boards 
     69 */ 
     70#ifdef CONFIG_BCM63XX_CPU_6358 
     71static struct board_info __initdata board_96358vw2 = { 
     72        .name                           = "96358VW2", 
     73        .expected_cpu_id                = 0x6358, 
     74 
     75        .has_enet0                      = 1, 
     76        .has_enet1                      = 1, 
     77        .has_pci                        = 1, 
     78 
     79        .enet0 = { 
     80                .has_phy                = 1, 
     81                .use_internal_phy       = 1, 
     82        }, 
     83 
     84        .enet1 = { 
     85                .force_speed_100        = 1, 
     86                .force_duplex_full      = 1, 
     87        }, 
     88 
     89 
     90        .has_ohci0 = 1, 
     91        .has_pccard = 1, 
     92        .has_ehci0 = 1, 
     93}; 
     94#endif 
     95 
     96/* 
     97 * all boards 
     98 */ 
     99static const struct board_info __initdata *bcm963xx_boards[] = { 
     100#ifdef CONFIG_BCM63XX_CPU_6348 
     101        &board_96348r, 
     102        &board_96348gw, 
     103#endif 
     104 
     105#ifdef CONFIG_BCM63XX_CPU_6358 
     106        &board_96358vw2, 
     107#endif 
     108}; 
     109 
     110/* 
     111 * early init callback, read nvram data from flash and checksum it 
     112 */ 
     113void __init board_prom_init(void) 
     114{ 
     115        unsigned int check_len, i; 
     116        u8 *boot_addr, *cfe, *p; 
     117        char cfe_version[32]; 
     118        u32 val; 
     119 
     120        /* read base address of boot chip select (0) */ 
     121        val = bcm_mpi_readl(MPI_CSBASE_REG(0)); 
     122        val &= MPI_CSBASE_BASE_MASK; 
     123        boot_addr = (u8 *)KSEG1ADDR(val); 
     124 
     125        /* dump cfe version */ 
     126        cfe = boot_addr + BCM963XX_CFE_VERSION_OFFSET; 
     127        if (!memcmp(cfe, "cfe-v", 5)) 
     128                snprintf(cfe_version, sizeof(cfe_version), "%u.%u.%u-%u.%u", 
     129                         cfe[5], cfe[6], cfe[7], cfe[8], cfe[9]); 
     130        else 
     131                strcpy(cfe_version, "unknown"); 
     132        printk(KERN_INFO PFX "CFE version: %s\n", cfe_version); 
     133 
     134        /* extract nvram data */ 
     135        memcpy(&nvram, boot_addr + BCM963XX_NVRAM_OFFSET, sizeof(nvram)); 
     136 
     137        /* check checksum before using data */ 
     138        if (nvram.version <= 4) 
     139                check_len = offsetof(struct bcm963xx_nvram, checksum_old); 
     140        else 
     141                check_len = sizeof(nvram); 
     142        val = 0; 
     143        p = (u8 *)&nvram; 
     144        while (check_len--) 
     145                val += *p; 
     146        if (val) { 
     147                printk(KERN_ERR PFX "invalid nvram checksum\n"); 
     148                return; 
     149        } 
     150 
     151        /* find board by name */ 
     152        for (i = 0; i < ARRAY_SIZE(bcm963xx_boards); i++) { 
     153                if (strncmp(nvram.name, bcm963xx_boards[i]->name, 
     154                            sizeof(nvram.name))) 
     155                        continue; 
     156                /* copy, board desc array is marked initdata */ 
     157                memcpy(&board, bcm963xx_boards[i], sizeof(board)); 
     158                break; 
     159        } 
     160 
     161        /* bail out if board is not found, will complain later */ 
     162        if (!board.name) 
     163                return; 
     164 
     165        /* setup pin multiplexing depending on board enabled device, 
     166         * this has to be done this early since PCI init is done 
     167         * inside arch_initcall */ 
     168        val = 0; 
     169 
     170        if (board.has_pci) { 
     171                bcm63xx_pci_enabled = 1; 
     172                if (BCMCPU_IS_6348()) 
     173                        val |= GPIO_MODE_6348_G2_PCI; 
     174        } 
     175 
     176        if (board.has_pccard) { 
     177                if (BCMCPU_IS_6348()) 
     178                        val |= GPIO_MODE_6348_G1_MII_PCCARD; 
     179        } 
     180 
     181        if (board.has_enet0 && !board.enet0.use_internal_phy) { 
     182                if (BCMCPU_IS_6348()) 
     183                        val |= GPIO_MODE_6348_G3_EXT_MII | 
     184                                GPIO_MODE_6348_G0_EXT_MII; 
     185        } 
     186 
     187        if (board.has_enet1 && !board.enet1.use_internal_phy) { 
     188                if (BCMCPU_IS_6348()) 
     189                        val |= GPIO_MODE_6348_G3_EXT_MII | 
     190                                GPIO_MODE_6348_G0_EXT_MII; 
     191        } 
     192 
     193        bcm_gpio_writel(val, GPIO_MODE_REG); 
     194} 
     195 
     196/* 
     197 * second stage init callback, good time to panic if we couldn't 
     198 * identify on which board we're running since early printk is working 
     199 */ 
     200void __init board_setup(void) 
     201{ 
     202        if (!board.name) 
     203                panic("unable to detect bcm963xx board"); 
     204        printk(KERN_INFO PFX "board name: %s\n", board.name); 
     205 
     206        /* make sure we're running on expected cpu */ 
     207        if (bcm63xx_get_cpu_id() != board.expected_cpu_id) 
     208                panic("unexpected CPU for bcm963xx board"); 
     209} 
     210 
     211/* 
     212 * return board name for /proc/cpuinfo 
     213 */ 
     214const char *board_get_name(void) 
     215{ 
     216        return board.name; 
     217} 
     218 
     219/* 
     220 * register & return a new board mac address 
     221 */ 
     222static int board_get_mac_address(u8 *mac) 
     223{ 
     224        u8 *p; 
     225        int count; 
     226 
     227        if (mac_addr_used >= nvram.mac_addr_count) { 
     228                printk(KERN_ERR PFX "not enough mac address\n"); 
     229                return -ENODEV; 
     230        } 
     231 
     232        memcpy(mac, nvram.mac_addr_base, ETH_ALEN); 
     233        p = mac + ETH_ALEN - 1; 
     234        count = mac_addr_used; 
     235 
     236        while (count--) { 
     237                do { 
     238                        (*p)++; 
     239                        if (*p != 0) 
     240                                break; 
     241                        p--; 
     242                } while (p != mac); 
     243        } 
     244 
     245        if (p == mac) { 
     246                printk(KERN_ERR PFX "unable to fetch mac address\n"); 
     247                return -ENODEV; 
     248        } 
     249 
     250        mac_addr_used++; 
     251        return 0; 
     252} 
     253 
     254static struct mtd_partition mtd_partitions[] = { 
     255        { 
     256                .name           = "cfe", 
     257                .offset         = 0x0, 
     258                .size           = 0x40000, 
     259        } 
     260}; 
     261 
     262static struct physmap_flash_data flash_data = { 
     263        .width                  = 2, 
     264        .nr_parts               = ARRAY_SIZE(mtd_partitions), 
     265        .parts                  = mtd_partitions, 
     266}; 
     267 
     268static struct resource mtd_resources[] = { 
     269        { 
     270                .start          = 0,    /* filled at runtime */ 
     271                .end            = 0,    /* filled at runtime */ 
     272                .flags          = IORESOURCE_MEM, 
     273        } 
     274}; 
     275 
     276static struct platform_device mtd_dev = { 
     277        .name                   = "physmap-flash", 
     278        .resource               = mtd_resources, 
     279        .num_resources          = ARRAY_SIZE(mtd_resources), 
     280        .dev                    = { 
     281                .platform_data  = &flash_data, 
     282        }, 
     283}; 
     284 
     285/* 
     286 * third stage init callback, register all board devices. 
     287 */ 
     288int __init board_register_devices(void) 
     289{ 
     290        u32 val; 
     291 
     292        bcm63xx_uart_register(); 
     293 
     294        if (board.has_pccard) 
     295                bcm63xx_pcmcia_register(); 
     296 
     297        if (board.has_enet0 && 
     298            !board_get_mac_address(board.enet0.mac_addr)) 
     299                bcm63xx_enet_register(0, &board.enet0); 
     300 
     301        if (board.has_enet1 && 
     302            !board_get_mac_address(board.enet1.mac_addr)) 
     303                bcm63xx_enet_register(1, &board.enet1); 
     304 
     305        if (board.has_ohci0) 
     306                bcm63xx_ohci_register(); 
     307 
     308        if (board.has_ehci0) 
     309                bcm63xx_ehci_register(); 
     310 
     311 
     312        /* read base address of boot chip select (0) */ 
     313        val = bcm_mpi_readl(MPI_CSBASE_REG(0)); 
     314        val &= MPI_CSBASE_BASE_MASK; 
     315        mtd_resources[0].start = val; 
     316        mtd_resources[0].end = 0x1FFFFFFF; 
     317 
     318        platform_device_register(&mtd_dev); 
     319 
     320        return 0; 
     321} 
     322 
  • arch/mips/bcm63xx/prom.c

    diff --git a/arch/mips/bcm63xx/prom.c b/arch/mips/bcm63xx/prom.c
    index f0b49e8..d97ceed 100644
    a b  
    99#include <linux/init.h> 
    1010#include <linux/bootmem.h> 
    1111#include <asm/bootinfo.h> 
     12#include <bcm63xx_board.h> 
    1213#include <bcm63xx_cpu.h> 
    1314#include <bcm63xx_io.h> 
    1415#include <bcm63xx_regs.h> 
    void __init prom_init(void) 
    3637 
    3738        /* assign command line from kernel config */ 
    3839        strcpy(arcs_cmdline, CONFIG_CMDLINE); 
     40 
     41        /* do low level board init */ 
     42        board_prom_init(); 
    3943} 
    4044 
    4145void __init prom_free_prom_memory(void) 
  • arch/mips/bcm63xx/setup.c

    diff --git a/arch/mips/bcm63xx/setup.c b/arch/mips/bcm63xx/setup.c
    index 4d8b127..c4516fb 100644
    a b  
    1616#include <asm/time.h> 
    1717#include <asm/reboot.h> 
    1818#include <asm/cacheflush.h> 
     19#include <bcm63xx_board.h> 
    1920#include <bcm63xx_cpu.h> 
    2021#include <bcm63xx_regs.h> 
    2122#include <bcm63xx_io.h> 
    static void __bcm63xx_machine_reboot(char *p) 
    8788const char *get_system_type(void) 
    8889{ 
    8990        static char buf[128]; 
    90         sprintf(buf, "bcm963xx (0x%04x/0x%04X)", 
    91                 bcm63xx_get_cpu_id(), bcm63xx_get_cpu_rev()); 
     91        snprintf(buf, sizeof (buf), "bcm63xx/%s (0x%04x/0x%04X)", 
     92                 board_get_name(), 
     93                 bcm63xx_get_cpu_id(), bcm63xx_get_cpu_rev()); 
    9294        return buf; 
    9395} 
    9496 
    void __init plat_time_init(void) 
    9698{ 
    9799        mips_hpt_frequency = bcm63xx_get_cpu_freq() / 2; 
    98100} 
     101 
    99102void __init plat_mem_setup(void) 
    100103{ 
    101104        add_memory_region(0, bcm63xx_get_memory_size(), BOOT_MEM_RAM); 
    void __init plat_mem_setup(void) 
    107110        set_io_port_base(0); 
    108111        ioport_resource.start = 0; 
    109112        ioport_resource.end = ~0; 
     113 
     114        board_setup(); 
     115} 
     116 
     117int __init bcm63xx_register_devices(void) 
     118{ 
     119        return board_register_devices(); 
    110120} 
     121 
     122device_initcall(bcm63xx_register_devices); 
  • new file include/asm-mips/mach-bcm63xx/bcm63xx_board.h

    diff --git a/include/asm-mips/mach-bcm63xx/bcm63xx_board.h b/include/asm-mips/mach-bcm63xx/bcm63xx_board.h
    new file mode 100644
    index 0000000..fa3e7e6
    - +  
     1#ifndef BCM63XX_BOARD_H_ 
     2#define BCM63XX_BOARD_H_ 
     3 
     4const char *board_get_name(void); 
     5 
     6void board_prom_init(void); 
     7 
     8void board_setup(void); 
     9 
     10int board_register_devices(void); 
     11 
     12#endif /* ! BCM63XX_BOARD_H_ */ 
  • new file include/asm-mips/mach-bcm63xx/board_bcm963xx.h

    diff --git a/include/asm-mips/mach-bcm63xx/board_bcm963xx.h b/include/asm-mips/mach-bcm63xx/board_bcm963xx.h
    new file mode 100644
    index 0000000..17e4e7e
    - +  
     1#ifndef BOARD_BCM963XX_H_ 
     2#define BOARD_BCM963XX_H_ 
     3 
     4#include <linux/types.h> 
     5#include <bcm63xx_dev_enet.h> 
     6 
     7/* 
     8 * flash mapping 
     9 */ 
     10#define BCM963XX_CFE_VERSION_OFFSET     0x570 
     11#define BCM963XX_NVRAM_OFFSET           0x580 
     12 
     13/* 
     14 * nvram structure 
     15 */ 
     16struct bcm963xx_nvram { 
     17        u32     version; 
     18        u8      reserved1[256]; 
     19        u8      name[16]; 
     20        u32     main_tp_number; 
     21        u32     psi_size; 
     22        u32     mac_addr_count; 
     23        u8      mac_addr_base[6]; 
     24        u8      reserved2[2]; 
     25        u32     checksum_old; 
     26        u8      reserved3[720]; 
     27        u32     checksum_high; 
     28}; 
     29 
     30/* 
     31 * board definition 
     32 */ 
     33struct board_info { 
     34        u8              name[16]; 
     35        unsigned int    expected_cpu_id; 
     36 
     37        /* enabled feature/device */ 
     38        unsigned int    has_enet0:1; 
     39        unsigned int    has_enet1:1; 
     40        unsigned int    has_pci:1; 
     41        unsigned int    has_pccard:1; 
     42        unsigned int    has_ohci0:1; 
     43        unsigned int    has_ehci0:1; 
     44 
     45        /* ethernet config */ 
     46        struct bcm63xx_enet_platform_data enet0; 
     47        struct bcm63xx_enet_platform_data enet1; 
     48}; 
     49 
     50#endif /* ! BOARD_BCM963XX_H_ */ 
Note: See TracBrowser for help on using the repository browser.