mirror of
https://github.com/AsahiLinux/u-boot
synced 2025-02-26 04:17:09 +00:00
Secondary cores need to be released from holdoff by boot release registers. With GPP bootrom, they can boot from main memory directly. Individual spin table is used for each core. Spin table and the boot page is reserved in device tree so OS won't overwrite. Signed-off-by: York Sun <yorksun@freescale.com> Signed-off-by: Arnab Basu <arnab.basu@freescale.com>
58 lines
1.3 KiB
C
58 lines
1.3 KiB
C
/*
|
|
* Copyright 2014 Freescale Semiconductor, Inc.
|
|
*
|
|
* SPDX-License-Identifier: GPL-2.0+
|
|
*/
|
|
|
|
#include <common.h>
|
|
#include <libfdt.h>
|
|
#include <fdt_support.h>
|
|
#include "mp.h"
|
|
|
|
#ifdef CONFIG_MP
|
|
void ft_fixup_cpu(void *blob)
|
|
{
|
|
int off;
|
|
__maybe_unused u64 spin_tbl_addr = (u64)get_spin_tbl_addr();
|
|
fdt32_t *reg;
|
|
int addr_cells;
|
|
u64 val;
|
|
size_t *boot_code_size = &(__secondary_boot_code_size);
|
|
|
|
off = fdt_path_offset(blob, "/cpus");
|
|
if (off < 0) {
|
|
puts("couldn't find /cpus node\n");
|
|
return;
|
|
}
|
|
of_bus_default_count_cells(blob, off, &addr_cells, NULL);
|
|
|
|
off = fdt_node_offset_by_prop_value(blob, -1, "device_type", "cpu", 4);
|
|
while (off != -FDT_ERR_NOTFOUND) {
|
|
reg = (fdt32_t *)fdt_getprop(blob, off, "reg", 0);
|
|
if (reg) {
|
|
val = spin_tbl_addr;
|
|
val += id_to_core(of_read_number(reg, addr_cells))
|
|
* SPIN_TABLE_ELEM_SIZE;
|
|
val = cpu_to_fdt64(val);
|
|
fdt_setprop_string(blob, off, "enable-method",
|
|
"spin-table");
|
|
fdt_setprop(blob, off, "cpu-release-addr",
|
|
&val, sizeof(val));
|
|
} else {
|
|
puts("Warning: found cpu node without reg property\n");
|
|
}
|
|
off = fdt_node_offset_by_prop_value(blob, off, "device_type",
|
|
"cpu", 4);
|
|
}
|
|
|
|
fdt_add_mem_rsv(blob, (uintptr_t)&secondary_boot_code,
|
|
*boot_code_size);
|
|
}
|
|
#endif
|
|
|
|
void ft_cpu_setup(void *blob, bd_t *bd)
|
|
{
|
|
#ifdef CONFIG_MP
|
|
ft_fixup_cpu(blob);
|
|
#endif
|
|
}
|