linux/arch/powerpc/boot/cuboot-hotfoot.c
<<
>>
Prefs
   1// SPDX-License-Identifier: GPL-2.0-only
   2/*
   3 * Old U-boot compatibility for Esteem 195E Hotfoot CPU Board
   4 *
   5 * Author: Solomon Peachy <solomon@linux-wlan.com>
   6 */
   7
   8#include "ops.h"
   9#include "stdio.h"
  10#include "reg.h"
  11#include "dcr.h"
  12#include "4xx.h"
  13#include "cuboot.h"
  14
  15#define TARGET_4xx
  16#define TARGET_HOTFOOT
  17
  18#include "ppcboot-hotfoot.h"
  19
  20static bd_t bd;
  21
  22#define NUM_REGS 3
  23
  24static void hotfoot_fixups(void)
  25{
  26        u32 uart = mfdcr(DCRN_CPC0_UCR) & 0x7f;
  27
  28        dt_fixup_memory(bd.bi_memstart, bd.bi_memsize); 
  29
  30        dt_fixup_cpu_clocks(bd.bi_procfreq, bd.bi_procfreq, 0);
  31        dt_fixup_clock("/plb", bd.bi_plb_busfreq);
  32        dt_fixup_clock("/plb/opb", bd.bi_opbfreq);
  33        dt_fixup_clock("/plb/ebc", bd.bi_pci_busfreq);
  34        dt_fixup_clock("/plb/opb/serial@ef600300", bd.bi_procfreq / uart); 
  35        dt_fixup_clock("/plb/opb/serial@ef600400", bd.bi_procfreq / uart); 
  36        
  37        dt_fixup_mac_address_by_alias("ethernet0", bd.bi_enetaddr);
  38        dt_fixup_mac_address_by_alias("ethernet1", bd.bi_enet1addr);
  39
  40        /* Is this a single eth/serial board? */
  41        if ((bd.bi_enet1addr[0] == 0) && 
  42            (bd.bi_enet1addr[1] == 0) &&
  43            (bd.bi_enet1addr[2] == 0) &&
  44            (bd.bi_enet1addr[3] == 0) &&
  45            (bd.bi_enet1addr[4] == 0) &&
  46            (bd.bi_enet1addr[5] == 0)) {
  47                void *devp;
  48
  49                printf("Trimming devtree for single serial/eth board\n");
  50
  51                devp = finddevice("/plb/opb/serial@ef600300");
  52                if (!devp)
  53                        fatal("Can't find node for /plb/opb/serial@ef600300");
  54                del_node(devp);
  55
  56                devp = finddevice("/plb/opb/ethernet@ef600900");
  57                if (!devp)
  58                        fatal("Can't find node for /plb/opb/ethernet@ef600900");
  59                del_node(devp);
  60        }
  61
  62        ibm4xx_quiesce_eth((u32 *)0xef600800, (u32 *)0xef600900);
  63
  64        /* Fix up flash size in fdt for 4M boards. */
  65        if (bd.bi_flashsize < 0x800000) {
  66                u32 regs[NUM_REGS];
  67                void *devp = finddevice("/plb/ebc/nor_flash@0");
  68                if (!devp)
  69                        fatal("Can't find FDT node for nor_flash!??");
  70
  71                printf("Fixing devtree for 4M Flash\n");
  72                
  73                /* First fix up the base addresse */
  74                getprop(devp, "reg", regs, sizeof(regs));
  75                regs[0] = 0;
  76                regs[1] = 0xffc00000;
  77                regs[2] = 0x00400000;
  78                setprop(devp, "reg", regs, sizeof(regs));
  79                
  80                /* Then the offsets */
  81                devp = finddevice("/plb/ebc/nor_flash@0/partition@0");
  82                if (!devp)
  83                        fatal("Can't find FDT node for partition@0");
  84                getprop(devp, "reg", regs, 2*sizeof(u32));
  85                regs[0] -= 0x400000;
  86                setprop(devp, "reg", regs,  2*sizeof(u32));
  87
  88                devp = finddevice("/plb/ebc/nor_flash@0/partition@1");
  89                if (!devp)
  90                        fatal("Can't find FDT node for partition@1");
  91                getprop(devp, "reg", regs, 2*sizeof(u32));
  92                regs[0] -= 0x400000;
  93                setprop(devp, "reg", regs,  2*sizeof(u32));
  94
  95                devp = finddevice("/plb/ebc/nor_flash@0/partition@2");
  96                if (!devp)
  97                        fatal("Can't find FDT node for partition@2");
  98                getprop(devp, "reg", regs, 2*sizeof(u32));
  99                regs[0] -= 0x400000;
 100                setprop(devp, "reg", regs,  2*sizeof(u32));
 101
 102                devp = finddevice("/plb/ebc/nor_flash@0/partition@3");
 103                if (!devp)
 104                        fatal("Can't find FDT node for partition@3");
 105                getprop(devp, "reg", regs, 2*sizeof(u32));
 106                regs[0] -= 0x400000;
 107                setprop(devp, "reg", regs,  2*sizeof(u32));
 108
 109                devp = finddevice("/plb/ebc/nor_flash@0/partition@4");
 110                if (!devp)
 111                        fatal("Can't find FDT node for partition@4");
 112                getprop(devp, "reg", regs, 2*sizeof(u32));
 113                regs[0] -= 0x400000;
 114                setprop(devp, "reg", regs,  2*sizeof(u32));
 115
 116                devp = finddevice("/plb/ebc/nor_flash@0/partition@6");
 117                if (!devp)
 118                        fatal("Can't find FDT node for partition@6");
 119                getprop(devp, "reg", regs, 2*sizeof(u32));
 120                regs[0] -= 0x400000;
 121                setprop(devp, "reg", regs,  2*sizeof(u32));
 122
 123                /* Delete the FeatFS node */
 124                devp = finddevice("/plb/ebc/nor_flash@0/partition@5");
 125                if (!devp)
 126                        fatal("Can't find FDT node for partition@5");
 127                del_node(devp);
 128        }
 129}
 130
 131void platform_init(unsigned long r3, unsigned long r4, unsigned long r5,
 132                   unsigned long r6, unsigned long r7)
 133{
 134        CUBOOT_INIT();
 135        platform_ops.fixups = hotfoot_fixups;
 136        platform_ops.exit = ibm40x_dbcr_reset;
 137        fdt_init(_dtb_start);
 138        serial_console_init();
 139}
 140