Loading...
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 | // SPDX-License-Identifier: GPL-2.0+ /* * (C) Copyright 2018 Cisco Systems, Inc. * (C) Copyright 2019 Synamedia * * Author: Thomas Fitzsimmons <fitzsim@fitzsim.org> */ #include <cpu_func.h> #include <init.h> #include <log.h> #include <time.h> #include <asm/global_data.h> #include <linux/types.h> #include <env.h> #include <asm/io.h> #include <asm/bootm.h> #include <mach/timer.h> #include <mmc.h> #include <fdtdec.h> DECLARE_GLOBAL_DATA_PTR; #define BCMSTB_DATA_SECTION __section(".data") struct bcmstb_boot_parameters bcmstb_boot_parameters BCMSTB_DATA_SECTION; phys_addr_t prior_stage_fdt_address BCMSTB_DATA_SECTION; union reg_value_union { const char *data; const phys_addr_t *address; }; void reset_cpu(void) { } int print_cpuinfo(void) { return 0; } int dram_init(void) { if (fdtdec_setup_mem_size_base() != 0) return -EINVAL; return 0; } int dram_init_banksize(void) { fdtdec_setup_memory_banksize(); /* * On this SoC, U-Boot is running as an ELF file. Change the * relocation address to CONFIG_TEXT_BASE, so that in * setup_reloc, gd->reloc_off works out to 0, effectively * disabling relocation. Otherwise U-Boot hangs in the setup * instructions just before relocate_code in * arch/arm/lib/crt0.S. */ gd->relocaddr = CONFIG_TEXT_BASE; return 0; } void enable_caches(void) { /* * This port assumes that the prior stage bootloader has * enabled I-cache and D-cache already. Implementing this * function silences the warning in the default function. */ } int timer_init(void) { gd->arch.timer_rate_hz = readl(BCMSTB_TIMER_FREQUENCY); return 0; } ulong get_tbclk(void) { return gd->arch.timer_rate_hz; } uint64_t get_ticks(void) { gd->timebase_h = readl(BCMSTB_TIMER_HIGH); gd->timebase_l = readl(BCMSTB_TIMER_LOW); return ((uint64_t)gd->timebase_h << 32) | gd->timebase_l; } int board_late_init(void) { debug("Arguments from prior stage bootloader:\n"); debug("General Purpose Register 0: 0x%x\n", bcmstb_boot_parameters.r0); debug("General Purpose Register 1: 0x%x\n", bcmstb_boot_parameters.r1); debug("General Purpose Register 2: 0x%x\n", bcmstb_boot_parameters.r2); debug("General Purpose Register 3: 0x%x\n", bcmstb_boot_parameters.r3); debug("Stack Pointer Register: 0x%x\n", bcmstb_boot_parameters.sp); debug("Link Register: 0x%x\n", bcmstb_boot_parameters.lr); debug("Assuming timer frequency register at: 0x%p\n", (void *)BCMSTB_TIMER_FREQUENCY); debug("Read timer frequency (in Hz): %ld\n", gd->arch.timer_rate_hz); debug("Prior stage provided DTB at: 0x%p\n", (void *)prior_stage_fdt_address); /* * Set fdtcontroladdr in the environment so that scripts can * refer to it, for example, to reuse it for fdtaddr. */ env_set_hex("fdtcontroladdr", prior_stage_fdt_address); /* * Do not set machid to the machine identifier value provided * by the prior stage bootloader (bcmstb_boot_parameters.r1) * because we're using a device tree to boot Linux. */ return 0; } int board_fdt_blob_setup(void **fdtp) { /* Stored the DTB address there during our init */ *fdtp = (void *)prior_stage_fdt_address; return 0; } |