uboot/board/imgtec/malta/malta.c
<<
>>
Prefs
   1// SPDX-License-Identifier: GPL-2.0
   2/*
   3 * Copyright (C) 2013 Gabor Juhos <juhosg@openwrt.org>
   4 * Copyright (C) 2013 Imagination Technologies
   5 */
   6
   7#include <common.h>
   8#include <ide.h>
   9#include <init.h>
  10#include <net.h>
  11#include <netdev.h>
  12#include <pci.h>
  13#include <pci_gt64120.h>
  14#include <pci_msc01.h>
  15#include <rtc.h>
  16#include <linux/delay.h>
  17
  18#include <asm/addrspace.h>
  19#include <asm/io.h>
  20#include <asm/malta.h>
  21
  22#include "superio.h"
  23
  24DECLARE_GLOBAL_DATA_PTR;
  25
  26enum core_card {
  27        CORE_UNKNOWN,
  28        CORE_LV,
  29        CORE_FPGA6,
  30};
  31
  32enum sys_con {
  33        SYSCON_UNKNOWN,
  34        SYSCON_GT64120,
  35        SYSCON_MSC01,
  36};
  37
  38static void malta_lcd_puts(const char *str)
  39{
  40        int i;
  41        void *reg = (void *)CKSEG1ADDR(MALTA_ASCIIPOS0);
  42
  43        /* print up to 8 characters of the string */
  44        for (i = 0; i < min((int)strlen(str), 8); i++) {
  45                __raw_writel(str[i], reg);
  46                reg += MALTA_ASCIIPOS1 - MALTA_ASCIIPOS0;
  47        }
  48
  49        /* fill the rest of the display with spaces */
  50        for (; i < 8; i++) {
  51                __raw_writel(' ', reg);
  52                reg += MALTA_ASCIIPOS1 - MALTA_ASCIIPOS0;
  53        }
  54}
  55
  56static enum core_card malta_core_card(void)
  57{
  58        u32 corid, rev;
  59        const void *reg = (const void *)CKSEG1ADDR(MALTA_REVISION);
  60
  61        rev = __raw_readl(reg);
  62        corid = (rev & MALTA_REVISION_CORID_MSK) >> MALTA_REVISION_CORID_SHF;
  63
  64        switch (corid) {
  65        case MALTA_REVISION_CORID_CORE_LV:
  66                return CORE_LV;
  67
  68        case MALTA_REVISION_CORID_CORE_FPGA6:
  69                return CORE_FPGA6;
  70
  71        default:
  72                return CORE_UNKNOWN;
  73        }
  74}
  75
  76static enum sys_con malta_sys_con(void)
  77{
  78        switch (malta_core_card()) {
  79        case CORE_LV:
  80                return SYSCON_GT64120;
  81
  82        case CORE_FPGA6:
  83                return SYSCON_MSC01;
  84
  85        default:
  86                return SYSCON_UNKNOWN;
  87        }
  88}
  89
  90int dram_init(void)
  91{
  92        gd->ram_size = CONFIG_SYS_MEM_SIZE;
  93
  94        return 0;
  95}
  96
  97int checkboard(void)
  98{
  99        enum core_card core;
 100
 101        malta_lcd_puts("U-Boot");
 102        puts("Board: MIPS Malta");
 103
 104        core = malta_core_card();
 105        switch (core) {
 106        case CORE_LV:
 107                puts(" CoreLV");
 108                break;
 109
 110        case CORE_FPGA6:
 111                puts(" CoreFPGA6");
 112                break;
 113
 114        default:
 115                puts(" CoreUnknown");
 116        }
 117
 118        putc('\n');
 119        return 0;
 120}
 121
 122int board_eth_init(struct bd_info *bis)
 123{
 124        return pci_eth_init(bis);
 125}
 126
 127void _machine_restart(void)
 128{
 129        void __iomem *reset_base;
 130
 131        reset_base = (void __iomem *)CKSEG1ADDR(MALTA_RESET_BASE);
 132        __raw_writel(GORESET, reset_base);
 133        mdelay(1000);
 134}
 135
 136int board_early_init_f(void)
 137{
 138        ulong io_base;
 139
 140        /* choose correct PCI I/O base */
 141        switch (malta_sys_con()) {
 142        case SYSCON_GT64120:
 143                io_base = CKSEG1ADDR(MALTA_GT_PCIIO_BASE);
 144                break;
 145
 146        case SYSCON_MSC01:
 147                io_base = CKSEG1ADDR(MALTA_MSC01_PCIIO_BASE);
 148                break;
 149
 150        default:
 151                return -1;
 152        }
 153
 154        set_io_port_base(io_base);
 155
 156        /* setup FDC37M817 super I/O controller */
 157        malta_superio_init();
 158
 159        return 0;
 160}
 161
 162int misc_init_r(void)
 163{
 164        rtc_reset();
 165
 166        return 0;
 167}
 168
 169void pci_init_board(void)
 170{
 171        pci_dev_t bdf;
 172        u32 val32;
 173        u8 val8;
 174
 175        switch (malta_sys_con()) {
 176        case SYSCON_GT64120:
 177                gt64120_pci_init((void *)CKSEG1ADDR(MALTA_GT_BASE),
 178                                 0x00000000, 0x00000000, CONFIG_SYS_MEM_SIZE,
 179                                 0x10000000, 0x10000000, 128 * 1024 * 1024,
 180                                 0x00000000, 0x00000000, 0x20000);
 181                break;
 182
 183        default:
 184        case SYSCON_MSC01:
 185                msc01_pci_init((void *)CKSEG1ADDR(MALTA_MSC01_PCI_BASE),
 186                               0x00000000, 0x00000000, CONFIG_SYS_MEM_SIZE,
 187                               MALTA_MSC01_PCIMEM_MAP,
 188                               CKSEG1ADDR(MALTA_MSC01_PCIMEM_BASE),
 189                               MALTA_MSC01_PCIMEM_SIZE, MALTA_MSC01_PCIIO_MAP,
 190                               0x00000000, MALTA_MSC01_PCIIO_SIZE);
 191                break;
 192        }
 193
 194        bdf = pci_find_device(PCI_VENDOR_ID_INTEL,
 195                              PCI_DEVICE_ID_INTEL_82371AB_0, 0);
 196        if (bdf == -1)
 197                panic("Failed to find PIIX4 PCI bridge\n");
 198
 199        /* setup PCI interrupt routing */
 200        pci_write_config_byte(bdf, PCI_CFG_PIIX4_PIRQRCA, 10);
 201        pci_write_config_byte(bdf, PCI_CFG_PIIX4_PIRQRCB, 10);
 202        pci_write_config_byte(bdf, PCI_CFG_PIIX4_PIRQRCC, 11);
 203        pci_write_config_byte(bdf, PCI_CFG_PIIX4_PIRQRCD, 11);
 204
 205        /* mux SERIRQ onto SERIRQ pin */
 206        pci_read_config_dword(bdf, PCI_CFG_PIIX4_GENCFG, &val32);
 207        val32 |= PCI_CFG_PIIX4_GENCFG_SERIRQ;
 208        pci_write_config_dword(bdf, PCI_CFG_PIIX4_GENCFG, val32);
 209
 210        /* enable SERIRQ - Linux currently depends upon this */
 211        pci_read_config_byte(bdf, PCI_CFG_PIIX4_SERIRQC, &val8);
 212        val8 |= PCI_CFG_PIIX4_SERIRQC_EN | PCI_CFG_PIIX4_SERIRQC_CONT;
 213        pci_write_config_byte(bdf, PCI_CFG_PIIX4_SERIRQC, val8);
 214
 215        bdf = pci_find_device(PCI_VENDOR_ID_INTEL,
 216                              PCI_DEVICE_ID_INTEL_82371AB, 0);
 217        if (bdf == -1)
 218                panic("Failed to find PIIX4 IDE controller\n");
 219
 220        /* enable bus master & IO access */
 221        val32 |= PCI_COMMAND_MASTER | PCI_COMMAND_IO;
 222        pci_write_config_dword(bdf, PCI_COMMAND, val32);
 223
 224        /* set latency */
 225        pci_write_config_byte(bdf, PCI_LATENCY_TIMER, 0x40);
 226
 227        /* enable IDE/ATA */
 228        pci_write_config_dword(bdf, PCI_CFG_PIIX4_IDETIM_PRI,
 229                               PCI_CFG_PIIX4_IDETIM_IDE);
 230        pci_write_config_dword(bdf, PCI_CFG_PIIX4_IDETIM_SEC,
 231                               PCI_CFG_PIIX4_IDETIM_IDE);
 232}
 233