uboot/arch/arm/mach-meson/board-common.c
<<
>>
Prefs
   1// SPDX-License-Identifier: GPL-2.0+
   2/*
   3 * (C) Copyright 2016 Beniamino Galvani <b.galvani@gmail.com>
   4 */
   5
   6#include <common.h>
   7#include <cpu_func.h>
   8#include <init.h>
   9#include <net.h>
  10#include <asm/arch/boot.h>
  11#include <env.h>
  12#include <asm/cache.h>
  13#include <asm/ptrace.h>
  14#include <linux/libfdt.h>
  15#include <linux/err.h>
  16#include <asm/arch/mem.h>
  17#include <asm/arch/sm.h>
  18#include <asm/armv8/mmu.h>
  19#include <asm/unaligned.h>
  20#include <efi_loader.h>
  21#include <u-boot/crc.h>
  22
  23#if CONFIG_IS_ENABLED(FASTBOOT)
  24#include <asm/psci.h>
  25#include <fastboot.h>
  26#endif
  27
  28DECLARE_GLOBAL_DATA_PTR;
  29
  30__weak int board_init(void)
  31{
  32        return 0;
  33}
  34
  35int dram_init(void)
  36{
  37        const fdt64_t *val;
  38        int offset;
  39        int len;
  40
  41        offset = fdt_path_offset(gd->fdt_blob, "/memory");
  42        if (offset < 0)
  43                return -EINVAL;
  44
  45        val = fdt_getprop(gd->fdt_blob, offset, "reg", &len);
  46        if (len < sizeof(*val) * 2)
  47                return -EINVAL;
  48
  49        /* Use unaligned access since cache is still disabled */
  50        gd->ram_size = get_unaligned_be64(&val[1]);
  51
  52        return 0;
  53}
  54
  55__weak int meson_ft_board_setup(void *blob, bd_t *bd)
  56{
  57        return 0;
  58}
  59
  60int ft_board_setup(void *blob, bd_t *bd)
  61{
  62        meson_init_reserved_memory(blob);
  63
  64        return meson_ft_board_setup(blob, bd);
  65}
  66
  67void meson_board_add_reserved_memory(void *fdt, u64 start, u64 size)
  68{
  69        int ret;
  70
  71        ret = fdt_add_mem_rsv(fdt, start, size);
  72        if (ret)
  73                printf("Could not reserve zone @ 0x%llx\n", start);
  74
  75        if (IS_ENABLED(CONFIG_EFI_LOADER))
  76                efi_add_memory_map(start, size, EFI_RESERVED_MEMORY_TYPE);
  77}
  78
  79int meson_generate_serial_ethaddr(void)
  80{
  81        u8 mac_addr[ARP_HLEN];
  82        char serial[SM_SERIAL_SIZE];
  83        u32 sid;
  84        u16 sid16;
  85
  86        if (!meson_sm_get_serial(serial, SM_SERIAL_SIZE)) {
  87                sid = crc32(0, (unsigned char *)serial, SM_SERIAL_SIZE);
  88                sid16 = crc16_ccitt(0, (unsigned char *)serial, SM_SERIAL_SIZE);
  89
  90                /* Ensure the NIC specific bytes of the mac are not all 0 */
  91                if ((sid & 0xffffff) == 0)
  92                        sid |= 0x800000;
  93
  94                /* Non OUI / registered MAC address */
  95                mac_addr[0] = ((sid16 >> 8) & 0xfc) | 0x02;
  96                mac_addr[1] = (sid16 >>  0) & 0xff;
  97                mac_addr[2] = (sid >> 24) & 0xff;
  98                mac_addr[3] = (sid >> 16) & 0xff;
  99                mac_addr[4] = (sid >>  8) & 0xff;
 100                mac_addr[5] = (sid >>  0) & 0xff;
 101
 102                eth_env_set_enetaddr("ethaddr", mac_addr);
 103        } else
 104                return -EINVAL;
 105
 106        return 0;
 107}
 108
 109static void meson_set_boot_source(void)
 110{
 111        const char *source;
 112
 113        switch (meson_get_boot_device()) {
 114        case BOOT_DEVICE_EMMC:
 115                source = "emmc";
 116                break;
 117
 118        case BOOT_DEVICE_NAND:
 119                source = "nand";
 120                break;
 121
 122        case BOOT_DEVICE_SPI:
 123                source = "spi";
 124                break;
 125
 126        case BOOT_DEVICE_SD:
 127                source = "sd";
 128                break;
 129
 130        case BOOT_DEVICE_USB:
 131                source = "usb";
 132                break;
 133
 134        default:
 135                source = "unknown";
 136        }
 137
 138        env_set("boot_source", source);
 139}
 140
 141__weak int meson_board_late_init(void)
 142{
 143        return 0;
 144}
 145
 146int board_late_init(void)
 147{
 148        meson_set_boot_source();
 149
 150        return meson_board_late_init();
 151}
 152
 153#if CONFIG_IS_ENABLED(FASTBOOT)
 154static unsigned int reboot_reason = REBOOT_REASON_NORMAL;
 155
 156int fastboot_set_reboot_flag()
 157{
 158        reboot_reason = REBOOT_REASON_BOOTLOADER;
 159
 160        printf("Using reboot reason: 0x%x\n", reboot_reason);
 161
 162        return 0;
 163}
 164
 165void reset_cpu(ulong addr)
 166{
 167        struct pt_regs regs;
 168
 169        regs.regs[0] = ARM_PSCI_0_2_FN_SYSTEM_RESET;
 170        regs.regs[1] = reboot_reason;
 171
 172        printf("Rebooting with reason: 0x%lx\n", regs.regs[1]);
 173
 174        smc_call(&regs);
 175
 176        while (1)
 177                ;
 178}
 179#else
 180void reset_cpu(ulong addr)
 181{
 182        psci_system_reset();
 183}
 184#endif
 185