CP0_CMGCRBASE is not always available on CPS enabled system such as early proAptiv. For early SMP bring up where we can't safely access memeory, we patch the entry of CPS NMI vector to inject CMGCR address directly into register during early core bringup. For VPE bringup as the core is already coherenct at that point we just read the variable to obtain the address. Signed-off-by: Jiaxun Yang <jiaxun.yang@flygoat.com> Signed-off-by: Thomas Bogendoerfer <tsbogend@alpha.franken.de>
52 lines
1.1 KiB
C
52 lines
1.1 KiB
C
/* SPDX-License-Identifier: GPL-2.0-or-later */
|
|
/*
|
|
* Copyright (C) 2013 Imagination Technologies
|
|
* Author: Paul Burton <paul.burton@mips.com>
|
|
*/
|
|
|
|
#ifndef __MIPS_ASM_SMP_CPS_H__
|
|
#define __MIPS_ASM_SMP_CPS_H__
|
|
|
|
#define CPS_ENTRY_PATCH_INSNS 6
|
|
|
|
#ifndef __ASSEMBLY__
|
|
|
|
struct vpe_boot_config {
|
|
unsigned long pc;
|
|
unsigned long sp;
|
|
unsigned long gp;
|
|
};
|
|
|
|
struct core_boot_config {
|
|
atomic_t vpe_mask;
|
|
struct vpe_boot_config *vpe_config;
|
|
};
|
|
|
|
extern struct core_boot_config *mips_cps_core_bootcfg;
|
|
|
|
extern void mips_cps_core_entry(void);
|
|
extern void mips_cps_core_init(void);
|
|
|
|
extern void mips_cps_boot_vpes(struct core_boot_config *cfg, unsigned vpe);
|
|
|
|
extern void mips_cps_pm_save(void);
|
|
extern void mips_cps_pm_restore(void);
|
|
|
|
extern void *mips_cps_core_entry_patch_end;
|
|
|
|
#ifdef CONFIG_MIPS_CPS
|
|
|
|
extern bool mips_cps_smp_in_use(void);
|
|
|
|
#else /* !CONFIG_MIPS_CPS */
|
|
|
|
static inline bool mips_cps_smp_in_use(void) { return false; }
|
|
|
|
#endif /* !CONFIG_MIPS_CPS */
|
|
|
|
#else /* __ASSEMBLY__ */
|
|
|
|
.extern mips_cps_bootcfg;
|
|
|
|
#endif /* __ASSEMBLY__ */
|
|
#endif /* __MIPS_ASM_SMP_CPS_H__ */
|