[U-Boot] [PATCH 09/15] malta: support for coreFPGA6 boards

Daniel Schwierzeck daniel.schwierzeck at gmail.com
Thu Oct 24 00:53:49 CEST 2013


2013/10/23 Paul Burton <paul.burton at imgtec.com>:
> This patch adds support for running on Malta boards using coreFPGA6
> core cards, including support for the msc01 system controller used
> with them. The system controller is detected at runtime allowing one
> U-boot binary to run on a Malta with either.
>
> Due to the PCI I/O base differing between Maltas using gt64120 & msc01
> system controllers, the UART setup is modified slightly. A second UART
> is added so that there is one pointing at the correct address for each
> system controller. The Malta board then defines its own
> default_serial_console function to select the correct one at runtime.
> The incorrect UART will simply not function.
>
> Tested on:
>   - A coreFPGA6 Malta running interAptiv and proAptiv bitstreams, both
>     with and without an L2 cache.
>   - QEMU, which seems to be broken but boots as far as it did before
>     this patch (including correctly printing CoreLV on serial).
>
> Signed-off-by: Paul Burton <paul.burton at imgtec.com>
> ---
>  arch/mips/include/asm/malta.h |  35 +++++++--
>  board/malta/lowlevel_init.S   | 164 +++++++++++++++++++++++++++++++++++++++++-
>  board/malta/malta.c           | 124 ++++++++++++++++++++++++++++++--
>  drivers/pci/Makefile          |   1 +
>  drivers/pci/pci_msc01.c       | 126 ++++++++++++++++++++++++++++++++
>  include/configs/malta.h       |   4 +-
>  include/msc01.h               | 135 ++++++++++++++++++++++++++++++++++
>  include/pci_ids.h             |   3 +
>  include/pci_msc01.h           |  17 +++++
>  9 files changed, 594 insertions(+), 15 deletions(-)
>  create mode 100644 drivers/pci/pci_msc01.c
>  create mode 100644 include/msc01.h
>  create mode 100644 include/pci_msc01.h
>
> diff --git a/arch/mips/include/asm/malta.h b/arch/mips/include/asm/malta.h
> index d4d44a2..0b50a66 100644
> --- a/arch/mips/include/asm/malta.h
> +++ b/arch/mips/include/asm/malta.h
> @@ -9,15 +9,38 @@
>  #ifndef _MIPS_ASM_MALTA_H
>  #define _MIPS_ASM_MALTA_H
>
> -#define MALTA_IO_PORT_BASE     0x18000000
> +#define MALTA_GT_BASE                  0x1be00000
> +#define MALTA_GT_PCIIO_BASE            0x18000000
> +#define MALTA_GT_UART0_BASE            (MALTA_GT_PCIIO_BASE + 0x3f8)
>
> -#define MALTA_UART_BASE                (MALTA_IO_PORT_BASE + 0x3f8)
> +#define MALTA_MSC01_BIU_BASE           0x1bc80000
> +#define MALTA_MSC01_PCI_BASE           0x1bd00000
> +#define MALTA_MSC01_PBC_BASE           0x1bd40000
> +#define MALTA_MSC01_IP1_BASE           0x1bc00000
> +#define MALTA_MSC01_IP1_SIZE           0x00400000
> +#define MALTA_MSC01_IP2_BASE1          0x10000000
> +#define MALTA_MSC01_IP2_SIZE1          0x08000000
> +#define MALTA_MSC01_IP2_BASE2          0x18000000
> +#define MALTA_MSC01_IP2_SIZE2          0x04000000
> +#define MALTA_MSC01_IP3_BASE           0x1c000000
> +#define MALTA_MSC01_IP3_SIZE           0x04000000
> +#define MALTA_MSC01_PCIMEM_BASE                0x10000000
> +#define MALTA_MSC01_PCIMEM_SIZE                0x10000000
> +#define MALTA_MSC01_PCIMEM_MAP         0x10000000
> +#define MALTA_MSC01_PCIIO_BASE         0x1b000000
> +#define MALTA_MSC01_PCIIO_SIZE         0x00800000
> +#define MALTA_MSC01_PCIIO_MAP          0x00000000
> +#define MALTA_MSC01_UART0_BASE         (MALTA_MSC01_PCIIO_BASE + 0x3f8)
>
> -#define MALTA_GT_BASE          0x1be00000
> +#define MALTA_RESET_BASE               0x1f000500
> +#define GORESET                                0x42
>
> -#define MALTA_RESET_BASE       0x1f000500
> -#define GORESET                        0x42
> +#define MALTA_FLASH_BASE               0x1fc00000
>
> -#define MALTA_FLASH_BASE       0x1fc00000
> +#define MALTA_REVISION                 0x1fc00010
> +#define MALTA_REVISION_CORID_SHF       10
> +#define MALTA_REVISION_CORID_MSK       (0x3f << MALTA_REVISION_CORID_SHF)
> +#define MALTA_REVISION_CORID_CORE_LV           1
> +#define MALTA_REVISION_CORID_CORE_FPGA6                14
>
>  #endif /* _MIPS_ASM_MALTA_H */
> diff --git a/board/malta/lowlevel_init.S b/board/malta/lowlevel_init.S
> index fa0b6a7..1af34f1 100644
> --- a/board/malta/lowlevel_init.S
> +++ b/board/malta/lowlevel_init.S
> @@ -6,6 +6,8 @@
>
>  #include <config.h>
>  #include <gt64120.h>
> +#include <msc01.h>
> +#include <pci.h>
>
>  #include <asm/addrspace.h>
>  #include <asm/regdef.h>
> @@ -25,6 +27,25 @@
>
>         .globl  lowlevel_init
>  lowlevel_init:
> +       /* detect the core card */
> +       li      t0, KSEG1ADDR(MALTA_REVISION)
> +       lw      t0, 0(t0)
> +       srl     t0, t0, MALTA_REVISION_CORID_SHF
> +       andi    t0, t0, (MALTA_REVISION_CORID_MSK >> \
> +                        MALTA_REVISION_CORID_SHF)
> +
> +       /* core cards using the gt64120 system controller */
> +       li      t1, MALTA_REVISION_CORID_CORE_LV
> +       beq     t0, t1, _gt64120
> +
> +       /* core cards using the MSC01 system controller */
> +        li     t1, MALTA_REVISION_CORID_CORE_FPGA6
> +       beq     t0, t1, _msc01
> +        nop
> +
> +       /* unknown system controller */
> +       b       .
> +        nop
>
>         /*
>          * Load BAR registers of GT64120 as done by YAMON
> @@ -39,7 +60,7 @@ lowlevel_init:
>          * based on write_bootloader() in qemu.git/hw/mips_malta.c
>          * see GT64120 manual and qemu.git/hw/gt64xxx.c for details
>          */
> -
> +_gt64120:
>         /* move GT64120 registers from 0x14000000 to 0x1be00000 */
>         li      t1, KSEG1ADDR(GT_DEF_BASE)
>         li      t0, CPU_TO_GT32(0xdf000000)
> @@ -67,3 +88,144 @@ lowlevel_init:
>
>         jr      ra
>          nop
> +
> +       /*
> +        *
> +        */
> +_msc01:
> +       /* setup peripheral bus controller clock divide */
> +       li      t0, KSEG1ADDR(MALTA_MSC01_PBC_BASE)
> +       li      t1, 0x1 << MSC01_PBC_CLKCFG_SHF
> +       sw      t1, MSC01_PBC_CLKCFG_OFS(t0)
> +
> +       /* tweak peripheral bus controller timings */
> +       li      t1, (0x1 << MSC01_PBC_CS0TIM_CDT_SHF) | \
> +                   (0x1 << MSC01_PBC_CS0TIM_CAT_SHF)
> +       sw      t1, MSC01_PBC_CS0TIM_OFS(t0)
> +       li      t1, (0x0 << MSC01_PBC_CS0RW_RDT_SHF) | \
> +                   (0x2 << MSC01_PBC_CS0RW_RAT_SHF) | \
> +                   (0x0 << MSC01_PBC_CS0RW_WDT_SHF) | \
> +                   (0x2 << MSC01_PBC_CS0RW_WAT_SHF)
> +       sw      t1, MSC01_PBC_CS0RW_OFS(t0)
> +       lw      t1, MSC01_PBC_CS0CFG_OFS(t0)
> +       li      t2, MSC01_PBC_CS0CFG_DTYP_MSK
> +       and     t1, t2
> +       ori     t1, (0x0 << MSC01_PBC_CS0CFG_ADM_SHF) | \
> +                   (0x3 << MSC01_PBC_CS0CFG_WSIDLE_SHF) | \
> +                   (0x10 << MSC01_PBC_CS0CFG_WS_SHF)
> +       sw      t1, MSC01_PBC_CS0CFG_OFS(t0)
> +
> +       /* setup basic address decode */
> +       li      t0, KSEG1ADDR(MALTA_MSC01_BIU_BASE)
> +       li      t1, 0x0
> +       li      t2, -CONFIG_SYS_MEM_SIZE
> +       sw      t1, MSC01_BIU_MCBAS1L_OFS(t0)
> +       sw      t2, MSC01_BIU_MCMSK1L_OFS(t0)
> +       sw      t1, MSC01_BIU_MCBAS2L_OFS(t0)
> +       sw      t2, MSC01_BIU_MCMSK2L_OFS(t0)
> +
> +       /* initialise IP1 - unused */
> +       li      t1, MALTA_MSC01_IP1_BASE
> +       li      t2, -MALTA_MSC01_IP1_SIZE
> +       sw      t1, MSC01_BIU_IP1BAS1L_OFS(t0)
> +       sw      t2, MSC01_BIU_IP1MSK1L_OFS(t0)
> +       sw      t1, MSC01_BIU_IP1BAS2L_OFS(t0)
> +       sw      t2, MSC01_BIU_IP1MSK2L_OFS(t0)
> +
> +       /* initialise IP2 - PCI */
> +       li      t1, MALTA_MSC01_IP2_BASE1
> +       li      t2, -MALTA_MSC01_IP2_SIZE1
> +       sw      t1, MSC01_BIU_IP2BAS1L_OFS(t0)
> +       sw      t2, MSC01_BIU_IP2MSK1L_OFS(t0)
> +       li      t1, MALTA_MSC01_IP2_BASE2
> +       li      t2, -MALTA_MSC01_IP2_SIZE2
> +       sw      t1, MSC01_BIU_IP2BAS2L_OFS(t0)
> +       sw      t2, MSC01_BIU_IP2MSK2L_OFS(t0)
> +
> +       /* initialise IP3 - peripheral bus controller */
> +       li      t1, MALTA_MSC01_IP3_BASE
> +       li      t2, -MALTA_MSC01_IP3_SIZE
> +       sw      t1, MSC01_BIU_IP3BAS1L_OFS(t0)
> +       sw      t2, MSC01_BIU_IP3MSK1L_OFS(t0)
> +       sw      t1, MSC01_BIU_IP3BAS2L_OFS(t0)
> +       sw      t2, MSC01_BIU_IP3MSK2L_OFS(t0)
> +
> +       /* setup PCI memory */
> +       li      t0, KSEG1ADDR(MALTA_MSC01_PCI_BASE)
> +       li      t1, MALTA_MSC01_PCIMEM_BASE
> +       li      t2, (-MALTA_MSC01_PCIMEM_SIZE) & MSC01_PCI_SC2PMMSKL_MSK_MSK
> +       li      t3, MALTA_MSC01_PCIMEM_MAP
> +       sw      t1, MSC01_PCI_SC2PMBASL_OFS(t0)
> +       sw      t2, MSC01_PCI_SC2PMMSKL_OFS(t0)
> +       sw      t3, MSC01_PCI_SC2PMMAPL_OFS(t0)
> +
> +       /* setup PCI I/O */
> +       li      t1, MALTA_MSC01_PCIIO_BASE
> +       li      t2, (-MALTA_MSC01_PCIIO_SIZE) & MSC01_PCI_SC2PIOMSKL_MSK_MSK
> +       li      t3, MALTA_MSC01_PCIIO_MAP
> +       sw      t1, MSC01_PCI_SC2PIOBASL_OFS(t0)
> +       sw      t2, MSC01_PCI_SC2PIOMSKL_OFS(t0)
> +       sw      t3, MSC01_PCI_SC2PIOMAPL_OFS(t0)
> +
> +       /* setup PCI_BAR0 memory window */
> +       li      t1, -CONFIG_SYS_MEM_SIZE
> +       sw      t1, MSC01_PCI_BAR0_OFS(t0)
> +
> +       /* setup PCI to SysCon/CPU translation */
> +       sw      t1, MSC01_PCI_P2SCMSKL_OFS(t0)
> +       sw      zero, MSC01_PCI_P2SCMAPL_OFS(t0)
> +
> +       /* setup PCI vendor & device IDs */
> +       li      t1, (PCI_VENDOR_ID_MIPS << MSC01_PCI_HEAD0_VENDORID_SHF) | \
> +                   (PCI_DEVICE_ID_MIPS_MSC01 << MSC01_PCI_HEAD0_DEVICEID_SHF)
> +       sw      t1, MSC01_PCI_HEAD0_OFS(t0)
> +
> +       /* setup PCI subsystem vendor & device IDs */
> +       sw      t1, MSC01_PCI_HEAD11_OFS(t0)
> +
> +       /* setup PCI class, revision */
> +       li      t1, (PCI_CLASS_BRIDGE_HOST << MSC01_PCI_HEAD2_CLASS_SHF) | \
> +                   (0x1 << MSC01_PCI_HEAD2_REV_SHF)
> +       sw      t1, MSC01_PCI_HEAD2_OFS(t0)
> +
> +       /* ensure a sane setup */
> +       sw      zero, MSC01_PCI_HEAD3_OFS(t0)
> +       sw      zero, MSC01_PCI_HEAD4_OFS(t0)
> +       sw      zero, MSC01_PCI_HEAD5_OFS(t0)
> +       sw      zero, MSC01_PCI_HEAD6_OFS(t0)
> +       sw      zero, MSC01_PCI_HEAD7_OFS(t0)
> +       sw      zero, MSC01_PCI_HEAD8_OFS(t0)
> +       sw      zero, MSC01_PCI_HEAD9_OFS(t0)
> +       sw      zero, MSC01_PCI_HEAD10_OFS(t0)
> +       sw      zero, MSC01_PCI_HEAD12_OFS(t0)
> +       sw      zero, MSC01_PCI_HEAD13_OFS(t0)
> +       sw      zero, MSC01_PCI_HEAD14_OFS(t0)
> +       sw      zero, MSC01_PCI_HEAD15_OFS(t0)
> +
> +       /* setup PCI command register */
> +       li      t1, (PCI_COMMAND_FAST_BACK | \
> +                    PCI_COMMAND_SERR | \
> +                    PCI_COMMAND_PARITY | \
> +                    PCI_COMMAND_MASTER | \
> +                    PCI_COMMAND_MEMORY)
> +       sw      t1, MSC01_PCI_HEAD1_OFS(t0)
> +
> +       /* setup PCI byte swapping */
> +#ifdef CONFIG_SYS_BIG_ENDIAN
> +       li      t1, (0x1 << MSC01_PCI_SWAP_BAR0_BSWAP_SHF) | \
> +                   (0x1 << MSC01_PCI_SWAP_IO_BSWAP_SHF)
> +       sw      t1, MSC01_PCI_SWAP_OFS(t0)
> +#else
> +       sw      zero, MSC01_PCI_SWAP_OFS(t0)
> +#endif
> +
> +       /* enable PCI host configuration cycles */
> +       lw      t1, MSC01_PCI_CFG_OFS(t0)
> +       li      t2, MSC01_PCI_CFG_RA_MSK | \
> +                   MSC01_PCI_CFG_G_MSK | \
> +                   MSC01_PCI_CFG_EN_MSK
> +       or      t1, t1, t2
> +       sw      t1, MSC01_PCI_CFG_OFS(t0)
> +
> +       jr      ra
> +        nop
> diff --git a/board/malta/malta.c b/board/malta/malta.c
> index 09da9ea..96c6f23 100644
> --- a/board/malta/malta.c
> +++ b/board/malta/malta.c
> @@ -1,19 +1,67 @@
>  /*
>   * Copyright (C) 2013 Gabor Juhos <juhosg at openwrt.org>
> + * Copyright (C) 2013 Imagination Technologies
>   *
>   * SPDX-License-Identifier:    GPL-2.0
>   */
>
>  #include <common.h>
>  #include <netdev.h>
> +#include <serial.h>
>
>  #include <asm/addrspace.h>
>  #include <asm/io.h>
>  #include <asm/malta.h>
>  #include <pci_gt64120.h>
> +#include <pci_msc01.h>
>
>  #include "superio.h"
>
> +enum core_card {
> +       CORE_UNKNOWN,
> +       CORE_LV,
> +       CORE_FPGA6,
> +};
> +
> +enum sys_con {
> +       SYSCON_UNKNOWN,
> +       SYSCON_GT64120,
> +       SYSCON_MSC01,
> +};
> +
> +static enum core_card malta_core_card(void)
> +{
> +       u32 corid, rev;
> +
> +       rev = __raw_readl(CKSEG1ADDR(MALTA_REVISION));
> +       corid = (rev & MALTA_REVISION_CORID_MSK) >> MALTA_REVISION_CORID_SHF;
> +
> +       switch (corid) {
> +       case MALTA_REVISION_CORID_CORE_LV:
> +               return CORE_LV;
> +
> +       case MALTA_REVISION_CORID_CORE_FPGA6:
> +               return CORE_FPGA6;
> +
> +       default:
> +               return CORE_UNKNOWN;
> +       }
> +}
> +
> +static enum sys_con malta_sys_con(void)
> +{
> +       switch (malta_core_card()) {
> +       case CORE_LV:
> +               return SYSCON_GT64120;
> +
> +       case CORE_FPGA6:
> +               return SYSCON_MSC01;
> +
> +       default:
> +               return SYSCON_UNKNOWN;
> +       }
> +}
> +
>  phys_size_t initdram(int board_type)
>  {
>         return CONFIG_SYS_MEM_SIZE;
> @@ -21,7 +69,25 @@ phys_size_t initdram(int board_type)
>
>  int checkboard(void)
>  {
> -       puts("Board: MIPS Malta CoreLV (Qemu)\n");
> +       enum core_card core;
> +
> +       puts("Board: MIPS Malta");
> +
> +       core = malta_core_card();
> +       switch (core) {
> +       case CORE_LV:
> +               puts(" CoreLV");
> +               break;
> +
> +       case CORE_FPGA6:
> +               puts(" CoreFPGA6");
> +               break;
> +
> +       default:
> +               puts(" CoreUnknown");
> +       }
> +
> +       putc('\n');
>         return 0;
>  }
>
> @@ -40,18 +106,62 @@ void _machine_restart(void)
>
>  int board_early_init_f(void)
>  {
> +       void *io_base;
> +
> +       /* choose correct PCI I/O base */
> +       switch (malta_sys_con()) {
> +       case SYSCON_GT64120:
> +               io_base = (void *)CKSEG1ADDR(MALTA_GT_PCIIO_BASE);
> +               break;
> +
> +       case SYSCON_MSC01:
> +               io_base = (void *)CKSEG1ADDR(MALTA_MSC01_PCIIO_BASE);
> +               break;
> +
> +       default:
> +               return -1;
> +       }
> +
>         /* setup FDC37M817 super I/O controller */
> -       malta_superio_init((void *)CKSEG1ADDR(MALTA_IO_PORT_BASE));
> +       malta_superio_init(io_base);
>
>         return 0;
>  }
>
> +struct serial_device *default_serial_console(void)
> +{
> +       switch (malta_sys_con()) {
> +       case SYSCON_GT64120:
> +               return &eserial1_device;
> +
> +       default:
> +       case SYSCON_MSC01:
> +               return &eserial2_device;
> +       }
> +}
> +
>  void pci_init_board(void)
>  {
> -       set_io_port_base(CKSEG1ADDR(MALTA_IO_PORT_BASE));
> +       switch (malta_sys_con()) {
> +       case SYSCON_GT64120:
> +               set_io_port_base(CKSEG1ADDR(MALTA_GT_PCIIO_BASE));
> +
> +               gt64120_pci_init((void *)CKSEG1ADDR(MALTA_GT_BASE),
> +                                0x00000000, 0x00000000, CONFIG_SYS_MEM_SIZE,
> +                                0x10000000, 0x10000000, 128 * 1024 * 1024,
> +                                0x00000000, 0x00000000, 0x20000);
> +               break;
> +
> +       default:
> +       case SYSCON_MSC01:
> +               set_io_port_base(CKSEG1ADDR(MALTA_MSC01_PCIIO_BASE));
>
> -       gt64120_pci_init((void *)CKSEG1ADDR(MALTA_GT_BASE),
> -                        0x00000000, 0x00000000, CONFIG_SYS_MEM_SIZE,
> -                        0x10000000, 0x10000000, 128 * 1024 * 1024,
> -                        0x00000000, 0x00000000, 0x20000);
> +               msc01_pci_init((void *)CKSEG1ADDR(MALTA_MSC01_PCI_BASE),
> +                              0x00000000, 0x00000000, CONFIG_SYS_MEM_SIZE,
> +                              MALTA_MSC01_PCIMEM_MAP,
> +                              CKSEG1ADDR(MALTA_MSC01_PCIMEM_BASE),
> +                              MALTA_MSC01_PCIMEM_SIZE, MALTA_MSC01_PCIIO_MAP,
> +                              0x00000000, MALTA_MSC01_PCIIO_SIZE);
> +               break;
> +       }
>  }
> diff --git a/drivers/pci/Makefile b/drivers/pci/Makefile
> index be26b60..77df010 100644
> --- a/drivers/pci/Makefile
> +++ b/drivers/pci/Makefile
> @@ -13,6 +13,7 @@ COBJS-$(CONFIG_FSL_PCI_INIT) += fsl_pci_init.o
>  COBJS-$(CONFIG_PCI) += pci.o pci_auto.o
>  COBJS-$(CONFIG_PCI_INDIRECT_BRIDGE) += pci_indirect.o
>  COBJS-$(CONFIG_PCI_GT64120) += pci_gt64120.o
> +COBJS-$(CONFIG_PCI_MSC01) += pci_msc01.o
>  COBJS-$(CONFIG_FTPCI100) += pci_ftpci100.o
>  COBJS-$(CONFIG_IXP_PCI) += pci_ixp.o
>  COBJS-$(CONFIG_SH4_PCI) += pci_sh4.o
> diff --git a/drivers/pci/pci_msc01.c b/drivers/pci/pci_msc01.c
> new file mode 100644
> index 0000000..7904378
> --- /dev/null
> +++ b/drivers/pci/pci_msc01.c
> @@ -0,0 +1,126 @@
> +/*
> + * Copyright (C) 2013 Imagination Technologies
> + * Author: Paul Burton <paul.burton at imgtec.com>
> + *
> + * SPDX-License-Identifier:    GPL-2.0+
> + */
> +
> +#include <common.h>
> +#include <msc01.h>
> +#include <pci.h>
> +#include <pci_msc01.h>
> +#include <asm/io.h>
> +
> +#define PCI_ACCESS_READ  0
> +#define PCI_ACCESS_WRITE 1
> +
> +struct msc01_pci_controller {
> +       struct pci_controller hose;
> +       void *base;
> +};
> +
> +static inline struct msc01_pci_controller *
> +hose_to_msc01(struct pci_controller *hose)
> +{
> +       return container_of(hose, struct msc01_pci_controller, hose);
> +}
> +
> +static int msc01_config_access(struct msc01_pci_controller *msc01,
> +                              unsigned char access_type, pci_dev_t bdf,
> +                              int where, u32 *data)
> +{
> +       const u32 aborts = MSC01_PCI_INTSTAT_MA_MSK | MSC01_PCI_INTSTAT_TA_MSK;
> +       void *intstat = msc01->base + MSC01_PCI_INTSTAT_OFS;
> +       void *cfgdata = msc01->base + MSC01_PCI_CFGDATA_OFS;
> +       unsigned int bus = PCI_BUS(bdf);
> +       unsigned int dev = PCI_DEV(bdf);
> +       unsigned int devfn = PCI_DEV(bdf) << 3 | PCI_FUNC(bdf);
> +       u32 status;

gcc-4.8 shows a warning:

pci_msc01.c: In function 'msc01_config_access':
pci_msc01.c:38:6: warning: unused variable 'status' [-Wunused-variable]
  u32 status;
      ^


> +
> +       /* clear abort status */
> +       __raw_writel(aborts, intstat);
> +
> +       /* setup address */
> +       __raw_writel((bus << MSC01_PCI_CFGADDR_BNUM_SHF) |
> +                    (dev << MSC01_PCI_CFGADDR_DNUM_SHF) |
> +                    (devfn << MSC01_PCI_CFGADDR_FNUM_SHF) |
> +                    ((where / 4) << MSC01_PCI_CFGADDR_RNUM_SHF),
> +                    msc01->base + MSC01_PCI_CFGADDR_OFS);

Contrary to the kernel U-Boot code must not use  base + offset in IO
primitives. Registers should be implemented with a struct.
For example:

struct foobar_regs {
    u32 foo;
    u32 bar;
};

struct foobar_regs *regs = (struct foobar_regs *)CKSEG1ADDR(FOOBAR_BASE);
u32 val = __raw_readl(&regs->foo);

> +
> +       /* perform access */
> +       if (access_type == PCI_ACCESS_WRITE)
> +               __raw_writel(*data, cfgdata);
> +       else
> +               *data = __raw_readl(cfgdata);
> +
> +       /* check for aborts */
> +       if (__raw_readl(intstat) & aborts) {
> +               /* clear abort status */
> +               __raw_writel(aborts, intstat);
> +               return -1;
> +       }
> +
> +       return 0;
> +}
> +
> +static int msc01_read_config_dword(struct pci_controller *hose, pci_dev_t dev,
> +                                  int where, u32 *value)
> +{
> +       struct msc01_pci_controller *msc01 = hose_to_msc01(hose);
> +
> +       *value = 0xffffffff;
> +       return msc01_config_access(msc01, PCI_ACCESS_READ, dev, where, value);
> +}
> +
> +static int msc01_write_config_dword(struct pci_controller *hose, pci_dev_t dev,
> +                                   int where, u32 value)
> +{
> +       struct msc01_pci_controller *gt = hose_to_msc01(hose);
> +       u32 data = value;
> +
> +       return msc01_config_access(gt, PCI_ACCESS_WRITE, dev, where, &data);
> +}
> +
> +void msc01_pci_init(void *base, unsigned long sys_bus, unsigned long sys_phys,
> +                   unsigned long sys_size, unsigned long mem_bus,
> +                   unsigned long mem_phys, unsigned long mem_size,
> +                   unsigned long io_bus, unsigned long io_phys,
> +                   unsigned long io_size)
> +{
> +       static struct msc01_pci_controller global_msc01;
> +       struct msc01_pci_controller *msc01;
> +       struct pci_controller *hose;
> +
> +       msc01 = &global_msc01;
> +       msc01->base = base;
> +
> +       hose = &msc01->hose;
> +
> +       hose->first_busno = 0;
> +       hose->last_busno = 0;
> +
> +       /* System memory space */
> +       pci_set_region(&hose->regions[0], sys_bus, sys_phys, sys_size,
> +                      PCI_REGION_MEM | PCI_REGION_SYS_MEMORY);
> +
> +       /* PCI memory space */
> +       pci_set_region(&hose->regions[1], mem_bus, mem_phys, mem_size,
> +                      PCI_REGION_MEM);
> +
> +       /* PCI I/O space */
> +       pci_set_region(&hose->regions[2], io_bus, io_phys, io_size,
> +                      PCI_REGION_IO);
> +
> +       hose->region_count = 3;
> +
> +       pci_set_ops(hose,
> +                   pci_hose_read_config_byte_via_dword,
> +                   pci_hose_read_config_word_via_dword,
> +                   msc01_read_config_dword,
> +                   pci_hose_write_config_byte_via_dword,
> +                   pci_hose_write_config_word_via_dword,
> +                   msc01_write_config_dword);
> +
> +       pci_register_hose(hose);
> +       hose->last_busno = pci_hose_scan(hose);
> +}
> diff --git a/include/configs/malta.h b/include/configs/malta.h
> index f6f6cc1..e347b38 100644
> --- a/include/configs/malta.h
> +++ b/include/configs/malta.h
> @@ -17,6 +17,7 @@
>
>  #define CONFIG_PCI
>  #define CONFIG_PCI_GT64120
> +#define CONFIG_PCI_MSC01
>  #define CONFIG_PCI_PNP
>  #define CONFIG_PCNET
>
> @@ -77,7 +78,8 @@
>  #define CONFIG_SYS_NS16550_SERIAL
>  #define CONFIG_SYS_NS16550_REG_SIZE    1
>  #define CONFIG_SYS_NS16550_CLK         115200
> -#define CONFIG_SYS_NS16550_COM1                CKSEG1ADDR(MALTA_UART_BASE)
> +#define CONFIG_SYS_NS16550_COM1                CKSEG1ADDR(MALTA_GT_UART0_BASE)
> +#define CONFIG_SYS_NS16550_COM2                CKSEG1ADDR(MALTA_MSC01_UART0_BASE)
>  #define CONFIG_CONS_INDEX              1
>
>  /*
> diff --git a/include/msc01.h b/include/msc01.h
> new file mode 100644
> index 0000000..37cf963
> --- /dev/null
> +++ b/include/msc01.h
> @@ -0,0 +1,135 @@
> +/*
> + * Copyright (C) 2013 Imagination Technologies
> + * Author: Paul Burton <paul.burton at imgtec.com>
> + *
> + * SPDX-License-Identifier:    GPL-2.0+
> + */
> +
> +#ifndef __MSC01_H__
> +#define __MSC01_H__
> +
> +/*
> + * Bus Interface Unit
> + */
> +
> +#define MSC01_BIU_IP1BAS1L_OFS         0x0208
> +#define MSC01_BIU_IP1MSK1L_OFS         0x0218
> +#define MSC01_BIU_IP1BAS2L_OFS         0x0248
> +#define MSC01_BIU_IP1MSK2L_OFS         0x0258
> +#define MSC01_BIU_IP2BAS1L_OFS         0x0288
> +#define MSC01_BIU_IP2MSK1L_OFS         0x0298
> +#define MSC01_BIU_IP2BAS2L_OFS         0x02c8
> +#define MSC01_BIU_IP2MSK2L_OFS         0x02d8
> +#define MSC01_BIU_IP3BAS1L_OFS         0x0308
> +#define MSC01_BIU_IP3MSK1L_OFS         0x0318
> +#define MSC01_BIU_IP3BAS2L_OFS         0x0348
> +#define MSC01_BIU_IP3MSK2L_OFS         0x0358
> +#define MSC01_BIU_MCBAS1L_OFS          0x0388
> +#define MSC01_BIU_MCMSK1L_OFS          0x0398
> +#define MSC01_BIU_MCBAS2L_OFS          0x03c8
> +#define MSC01_BIU_MCMSK2L_OFS          0x03d8
> +
> +/*
> + * PCI Bridge
> + */
> +
> +#define MSC01_PCI_SC2PMBASL_OFS                0x0208
> +#define MSC01_PCI_SC2PMMSKL_OFS                0x0218
> +#define MSC01_PCI_SC2PMMAPL_OFS                0x0228
> +#define MSC01_PCI_SC2PIOBASL_OFS       0x0248
> +#define MSC01_PCI_SC2PIOMSKL_OFS       0x0258
> +#define MSC01_PCI_SC2PIOMAPL_OFS       0x0268
> +#define MSC01_PCI_P2SCMSKL_OFS         0x0308
> +#define MSC01_PCI_P2SCMAPL_OFS         0x0318
> +#define MSC01_PCI_INTSTAT_OFS          0x0608
> +#define MSC01_PCI_CFGADDR_OFS          0x0610
> +#define MSC01_PCI_CFGDATA_OFS          0x0618
> +#define MSC01_PCI_HEAD0_OFS            0x2000
> +#define MSC01_PCI_HEAD1_OFS            0x2008
> +#define MSC01_PCI_HEAD2_OFS            0x2010
> +#define MSC01_PCI_HEAD3_OFS            0x2018
> +#define MSC01_PCI_HEAD4_OFS            0x2020
> +#define MSC01_PCI_HEAD5_OFS            0x2028
> +#define MSC01_PCI_HEAD6_OFS            0x2030
> +#define MSC01_PCI_HEAD7_OFS            0x2038
> +#define MSC01_PCI_HEAD8_OFS            0x2040
> +#define MSC01_PCI_HEAD9_OFS            0x2048
> +#define MSC01_PCI_HEAD10_OFS           0x2050
> +#define MSC01_PCI_HEAD11_OFS           0x2058
> +#define MSC01_PCI_HEAD12_OFS           0x2060
> +#define MSC01_PCI_HEAD13_OFS           0x2068
> +#define MSC01_PCI_HEAD14_OFS           0x2070
> +#define MSC01_PCI_HEAD15_OFS           0x2078
> +#define MSC01_PCI_BAR0_OFS             0x2220
> +#define MSC01_PCI_CFG_OFS              0x2380
> +#define MSC01_PCI_SWAP_OFS             0x2388
> +
> +#define MSC01_PCI_SC2PMMSKL_MSK_MSK    0xff000000
> +#define MSC01_PCI_SC2PIOMSKL_MSK_MSK   0xff000000
> +
> +#define MSC01_PCI_INTSTAT_TA_SHF       6
> +#define MSC01_PCI_INTSTAT_TA_MSK       (0x1 << MSC01_PCI_INTSTAT_TA_SHF)
> +#define MSC01_PCI_INTSTAT_MA_SHF       7
> +#define MSC01_PCI_INTSTAT_MA_MSK       (0x1 << MSC01_PCI_INTSTAT_MA_SHF)
> +
> +#define MSC01_PCI_CFGADDR_BNUM_SHF     16
> +#define MSC01_PCI_CFGADDR_BNUM_MSK     (0xff << MSC01_PCI_CFGADDR_BNUM_SHF)
> +#define MSC01_PCI_CFGADDR_DNUM_SHF     11
> +#define MSC01_PCI_CFGADDR_DNUM_MSK     (0x1f << MSC01_PCI_CFGADDR_DNUM_SHF)
> +#define MSC01_PCI_CFGADDR_FNUM_SHF     8
> +#define MSC01_PCI_CFGADDR_FNUM_MSK     (0x3 << MSC01_PCI_CFGADDR_FNUM_SHF)
> +#define MSC01_PCI_CFGADDR_RNUM_SHF     2
> +#define MSC01_PCI_CFGADDR_RNUM_MSK     (0x3f << MSC01_PCI_CFGADDR_RNUM_SHF)
> +
> +#define MSC01_PCI_HEAD0_VENDORID_SHF   0
> +#define MSC01_PCI_HEAD0_DEVICEID_SHF   16
> +
> +#define MSC01_PCI_HEAD2_REV_SHF                0
> +#define MSC01_PCI_HEAD2_CLASS_SHF      16
> +
> +#define MSC01_PCI_CFG_EN_SHF           15
> +#define MSC01_PCI_CFG_EN_MSK           (0x1 << MSC01_PCI_CFG_EN_SHF)
> +#define MSC01_PCI_CFG_G_SHF            16
> +#define MSC01_PCI_CFG_G_MSK            (0x1 << MSC01_PCI_CFG_G_SHF)
> +#define MSC01_PCI_CFG_RA_SHF           17
> +#define MSC01_PCI_CFG_RA_MSK           (0x1 << MSC01_PCI_CFG_RA_SHF)
> +
> +#define MSC01_PCI_SWAP_BAR0_BSWAP_SHF  0
> +#define MSC01_PCI_SWAP_IO_BSWAP_SHF    18
> +
> +/*
> + * Peripheral Bus Controller
> + */
> +
> +#define MSC01_PBC_CLKCFG_OFS           0x0100
> +#define MSC01_PBC_CS0CFG_OFS           0x0400
> +#define MSC01_PBC_CS0TIM_OFS           0x0500
> +#define MSC01_PBC_CS0RW_OFS            0x0600
> +
> +#define MSC01_PBC_CLKCFG_SHF           0
> +#define MSC01_PBC_CLKCFG_MSK           (0x1f << MSC01_PBC_CLKCFG_SHF)
> +
> +#define MSC01_PBC_CS0CFG_WS_SHF                0
> +#define MSC01_PBC_CS0CFG_WS_MSK                (0x1f << MSC01_PBC_CS0CFG_WS_SHF)
> +#define MSC01_PBC_CS0CFG_WSIDLE_SHF    8
> +#define MSC01_PBC_CS0CFG_WSIDLE_MSK    (0x1f << MSC01_PBC_CS0CFG_WSIDLE_SHF)
> +#define MSC01_PBC_CS0CFG_DTYP_SHF      16
> +#define MSC01_PBC_CS0CFG_DTYP_MSK      (0x3 << MSC01_PBC_CS0CFG_DTYP_SHF)
> +#define MSC01_PBC_CS0CFG_ADM_SHF       20
> +#define MSC01_PBC_CS0CFG_ADM_MSK       (0x1 << MSC01_PBC_CS0CFG_ADM_SHF)
> +
> +#define MSC01_PBC_CS0TIM_CAT_SHF       0
> +#define MSC01_PBC_CS0TIM_CAT_MSK       (0x1f << MSC01_PBC_CS0TIM_CAT_SHF)
> +#define MSC01_PBC_CS0TIM_CDT_SHF       8
> +#define MSC01_PBC_CS0TIM_CDT_MSK       (0x1f << MSC01_PBC_CS0TIM_CDT_SHF)
> +
> +#define MSC01_PBC_CS0RW_WAT_SHF                0
> +#define MSC01_PBC_CS0RW_WAT_MSK                (0x1f << MSC01_PBC_CS0RW_WAT_SHF)
> +#define MSC01_PBC_CS0RW_WDT_SHF                8
> +#define MSC01_PBC_CS0RW_WDT_MSK                (0x1f << MSC01_PBC_CS0RW_WDT_SHF)
> +#define MSC01_PBC_CS0RW_RAT_SHF                16
> +#define MSC01_PBC_CS0RW_RAT_MSK                (0x1f << MSC01_PBC_CS0RW_RAT_SHF)
> +#define MSC01_PBC_CS0RW_RDT_SHF                24
> +#define MSC01_PBC_CS0RW_RDT_MSK                (0x1f << MSC01_PBC_CS0RW_RDT_SHF)
> +
> +#endif /* __MSC01_H__ */
> diff --git a/include/pci_ids.h b/include/pci_ids.h
> index 2c6dfd4..6bab677 100644
> --- a/include/pci_ids.h
> +++ b/include/pci_ids.h
> @@ -2170,6 +2170,9 @@
>  #define PCI_DEVICE_ID_ENE_720          0x1421
>  #define PCI_DEVICE_ID_ENE_722          0x1422
>
> +#define PCI_VENDOR_ID_MIPS             0x153f
> +#define PCI_DEVICE_ID_MIPS_MSC01       0x0001
> +
>  #define PCI_SUBVENDOR_ID_PERLE          0x155f
>  #define PCI_SUBDEVICE_ID_PCI_RAS4       0xf001
>  #define PCI_SUBDEVICE_ID_PCI_RAS8       0xf010
> diff --git a/include/pci_msc01.h b/include/pci_msc01.h
> new file mode 100644
> index 0000000..54945a7
> --- /dev/null
> +++ b/include/pci_msc01.h
> @@ -0,0 +1,17 @@
> +/*
> + * Copyright (C) 2013 Imagination Technologies
> + * Author: Paul Burton <paul.burton at imgtec.com>
> + *
> + * SPDX-License-Identifier:    GPL-2.0+
> + */
> +
> +#ifndef __PCI_MSC01_H__
> +#define __PCI_MSC01_H__
> +
> +extern void msc01_pci_init(void *base, unsigned long sys_bus,
> +                          unsigned long sys_phys, unsigned long sys_size,
> +                          unsigned long mem_bus, unsigned long mem_phys,
> +                          unsigned long mem_size, unsigned long io_bus,
> +                          unsigned long io_phys, unsigned long io_size);
> +
> +#endif /* __PCI_MSC01_H__ */
> --
> 1.8.4
>
>



-- 
Best regards,
Daniel


More information about the U-Boot mailing list