| /* |
| * (C) Copyright 2012 |
| * Marvell Semiconductor <www.marvell.com> |
| * Written-by: Xiaofan Tian <tianxf@marvell.com> |
| * |
| * SPDX-License-Identifier: GPL-2.0+ |
| */ |
| |
| #include <common.h> |
| #include <asm/arch/cpu.h> |
| |
| bool pxa_amp_uart_enabled(void) |
| { |
| return smp_hw_cpuid() == *(unsigned int *)CONFIG_AMP_SYNC_ADDR; |
| } |
| |
| static void pxa_amp_set_master(unsigned int cpuid) |
| { |
| *(unsigned int *)CONFIG_AMP_SYNC_ADDR = cpuid; |
| } |
| |
| bool pxa_is_warm_reset(void) |
| { |
| return *(unsigned int *)CONFIG_WARM_RESET; |
| } |
| |
| void pxa_amp_init(void) |
| { |
| if (!pxa_is_warm_reset()) { |
| BUG_ON(smp_hw_cpuid()); |
| pxa_amp_set_master(0); |
| } |
| } |
| |
| unsigned int pxa_amp_reloc_end(void) |
| { |
| unsigned int reloc_end[CONFIG_NR_CPUS - 1] = CONFIG_SYS_AMP_RELOC_END; |
| |
| if (smp_hw_cpuid()) |
| return reloc_end[smp_hw_cpuid() - 1]; |
| else |
| return CONFIG_SYS_RELOC_END; |
| } |
| |
| int do_amp(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) |
| { |
| unsigned int cpu; |
| |
| if (argc != 2) |
| return cmd_usage(cmdtp); |
| |
| /* Disable I&D cache */ |
| icache_disable(); |
| dcache_disable(); |
| |
| cpu = simple_strtoul(argv[1], NULL, 10); |
| pxa_cpu_reset(cpu, CONFIG_SYS_TEXT_BASE); |
| |
| /* Enable I&D cache */ |
| dcache_enable(); |
| icache_enable(); |
| return 0; |
| } |
| |
| U_BOOT_CMD( |
| amp, 2, 1, do_amp, |
| "Release other cpu from reset mode", |
| "Usage:\namp [cpu id]" |
| ); |
| |
| int do_uartsw(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) |
| { |
| unsigned int cpu; |
| |
| if (argc != 2) |
| return cmd_usage(cmdtp); |
| cpu = simple_strtoul(argv[1], NULL, 10); |
| if (cpu >= CONFIG_NR_CPUS) { |
| printf("Invalid CPU number\n"); |
| return -1; |
| } |
| |
| pxa_amp_set_master(cpu); |
| |
| return 0; |
| } |
| U_BOOT_CMD( |
| uartsw, 2, 1, do_uartsw, |
| "Switch UART to another cpu", |
| "Usage:\nuartsw [cpu id]" |
| ); |
| |
| int do_cpuid(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) |
| { |
| unsigned int cpu; |
| |
| cpu = smp_hw_cpuid(); |
| printf("This is cpu %d\n", cpu); |
| |
| return 0; |
| } |
| |
| U_BOOT_CMD( |
| cpuid, 1, 1, do_cpuid, |
| "Show current CPU ID", |
| "Usage:\ncpuid" |
| ); |