162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0 */ 262306a36Sopenharmony_ci/* 362306a36Sopenharmony_ci * Copyright (c) 2011 Samsung Electronics Co., Ltd. 462306a36Sopenharmony_ci * http://www.samsung.com 562306a36Sopenharmony_ci * 662306a36Sopenharmony_ci * Common Header for Exynos machines 762306a36Sopenharmony_ci */ 862306a36Sopenharmony_ci 962306a36Sopenharmony_ci#ifndef __ARCH_ARM_MACH_EXYNOS_COMMON_H 1062306a36Sopenharmony_ci#define __ARCH_ARM_MACH_EXYNOS_COMMON_H 1162306a36Sopenharmony_ci 1262306a36Sopenharmony_ci#include <linux/platform_data/cpuidle-exynos.h> 1362306a36Sopenharmony_ci 1462306a36Sopenharmony_ci#define EXYNOS3250_SOC_ID 0xE3472000 1562306a36Sopenharmony_ci#define EXYNOS3_SOC_MASK 0xFFFFF000 1662306a36Sopenharmony_ci 1762306a36Sopenharmony_ci#define EXYNOS4210_CPU_ID 0x43210000 1862306a36Sopenharmony_ci#define EXYNOS4212_CPU_ID 0x43220000 1962306a36Sopenharmony_ci#define EXYNOS4412_CPU_ID 0xE4412200 2062306a36Sopenharmony_ci#define EXYNOS4_CPU_MASK 0xFFFE0000 2162306a36Sopenharmony_ci 2262306a36Sopenharmony_ci#define EXYNOS5250_SOC_ID 0x43520000 2362306a36Sopenharmony_ci#define EXYNOS5410_SOC_ID 0xE5410000 2462306a36Sopenharmony_ci#define EXYNOS5420_SOC_ID 0xE5420000 2562306a36Sopenharmony_ci#define EXYNOS5800_SOC_ID 0xE5422000 2662306a36Sopenharmony_ci#define EXYNOS5_SOC_MASK 0xFFFFF000 2762306a36Sopenharmony_ci 2862306a36Sopenharmony_ciextern unsigned long exynos_cpu_id; 2962306a36Sopenharmony_ci 3062306a36Sopenharmony_ci#define IS_SAMSUNG_CPU(name, id, mask) \ 3162306a36Sopenharmony_cistatic inline int is_samsung_##name(void) \ 3262306a36Sopenharmony_ci{ \ 3362306a36Sopenharmony_ci return ((exynos_cpu_id & mask) == (id & mask)); \ 3462306a36Sopenharmony_ci} 3562306a36Sopenharmony_ci 3662306a36Sopenharmony_ciIS_SAMSUNG_CPU(exynos3250, EXYNOS3250_SOC_ID, EXYNOS3_SOC_MASK) 3762306a36Sopenharmony_ciIS_SAMSUNG_CPU(exynos4210, EXYNOS4210_CPU_ID, EXYNOS4_CPU_MASK) 3862306a36Sopenharmony_ciIS_SAMSUNG_CPU(exynos4212, EXYNOS4212_CPU_ID, EXYNOS4_CPU_MASK) 3962306a36Sopenharmony_ciIS_SAMSUNG_CPU(exynos4412, EXYNOS4412_CPU_ID, EXYNOS4_CPU_MASK) 4062306a36Sopenharmony_ciIS_SAMSUNG_CPU(exynos5250, EXYNOS5250_SOC_ID, EXYNOS5_SOC_MASK) 4162306a36Sopenharmony_ciIS_SAMSUNG_CPU(exynos5410, EXYNOS5410_SOC_ID, EXYNOS5_SOC_MASK) 4262306a36Sopenharmony_ciIS_SAMSUNG_CPU(exynos5420, EXYNOS5420_SOC_ID, EXYNOS5_SOC_MASK) 4362306a36Sopenharmony_ciIS_SAMSUNG_CPU(exynos5800, EXYNOS5800_SOC_ID, EXYNOS5_SOC_MASK) 4462306a36Sopenharmony_ci 4562306a36Sopenharmony_ci#if defined(CONFIG_SOC_EXYNOS3250) 4662306a36Sopenharmony_ci# define soc_is_exynos3250() is_samsung_exynos3250() 4762306a36Sopenharmony_ci#else 4862306a36Sopenharmony_ci# define soc_is_exynos3250() 0 4962306a36Sopenharmony_ci#endif 5062306a36Sopenharmony_ci 5162306a36Sopenharmony_ci#if defined(CONFIG_CPU_EXYNOS4210) 5262306a36Sopenharmony_ci# define soc_is_exynos4210() is_samsung_exynos4210() 5362306a36Sopenharmony_ci#else 5462306a36Sopenharmony_ci# define soc_is_exynos4210() 0 5562306a36Sopenharmony_ci#endif 5662306a36Sopenharmony_ci 5762306a36Sopenharmony_ci#if defined(CONFIG_SOC_EXYNOS4212) 5862306a36Sopenharmony_ci# define soc_is_exynos4212() is_samsung_exynos4212() 5962306a36Sopenharmony_ci#else 6062306a36Sopenharmony_ci# define soc_is_exynos4212() 0 6162306a36Sopenharmony_ci#endif 6262306a36Sopenharmony_ci 6362306a36Sopenharmony_ci#if defined(CONFIG_SOC_EXYNOS4412) 6462306a36Sopenharmony_ci# define soc_is_exynos4412() is_samsung_exynos4412() 6562306a36Sopenharmony_ci#else 6662306a36Sopenharmony_ci# define soc_is_exynos4412() 0 6762306a36Sopenharmony_ci#endif 6862306a36Sopenharmony_ci 6962306a36Sopenharmony_ci#define EXYNOS4210_REV_0 (0x0) 7062306a36Sopenharmony_ci#define EXYNOS4210_REV_1_0 (0x10) 7162306a36Sopenharmony_ci#define EXYNOS4210_REV_1_1 (0x11) 7262306a36Sopenharmony_ci 7362306a36Sopenharmony_ci#if defined(CONFIG_SOC_EXYNOS5250) 7462306a36Sopenharmony_ci# define soc_is_exynos5250() is_samsung_exynos5250() 7562306a36Sopenharmony_ci#else 7662306a36Sopenharmony_ci# define soc_is_exynos5250() 0 7762306a36Sopenharmony_ci#endif 7862306a36Sopenharmony_ci 7962306a36Sopenharmony_ci#if defined(CONFIG_SOC_EXYNOS5410) 8062306a36Sopenharmony_ci# define soc_is_exynos5410() is_samsung_exynos5410() 8162306a36Sopenharmony_ci#else 8262306a36Sopenharmony_ci# define soc_is_exynos5410() 0 8362306a36Sopenharmony_ci#endif 8462306a36Sopenharmony_ci 8562306a36Sopenharmony_ci#if defined(CONFIG_SOC_EXYNOS5420) 8662306a36Sopenharmony_ci# define soc_is_exynos5420() is_samsung_exynos5420() 8762306a36Sopenharmony_ci#else 8862306a36Sopenharmony_ci# define soc_is_exynos5420() 0 8962306a36Sopenharmony_ci#endif 9062306a36Sopenharmony_ci 9162306a36Sopenharmony_ci#if defined(CONFIG_SOC_EXYNOS5800) 9262306a36Sopenharmony_ci# define soc_is_exynos5800() is_samsung_exynos5800() 9362306a36Sopenharmony_ci#else 9462306a36Sopenharmony_ci# define soc_is_exynos5800() 0 9562306a36Sopenharmony_ci#endif 9662306a36Sopenharmony_ci 9762306a36Sopenharmony_ciextern u32 cp15_save_diag; 9862306a36Sopenharmony_ciextern u32 cp15_save_power; 9962306a36Sopenharmony_ci 10062306a36Sopenharmony_ciextern void __iomem *sysram_ns_base_addr; 10162306a36Sopenharmony_ciextern void __iomem *sysram_base_addr; 10262306a36Sopenharmony_ciextern phys_addr_t sysram_base_phys; 10362306a36Sopenharmony_ciextern void __iomem *pmu_base_addr; 10462306a36Sopenharmony_civoid exynos_sysram_init(void); 10562306a36Sopenharmony_ci 10662306a36Sopenharmony_cienum { 10762306a36Sopenharmony_ci FW_DO_IDLE_SLEEP, 10862306a36Sopenharmony_ci FW_DO_IDLE_AFTR, 10962306a36Sopenharmony_ci}; 11062306a36Sopenharmony_ci 11162306a36Sopenharmony_civoid exynos_firmware_init(void); 11262306a36Sopenharmony_ci 11362306a36Sopenharmony_ci/* CPU BOOT mode flag for Exynos3250 SoC bootloader */ 11462306a36Sopenharmony_ci#define C2_STATE (1 << 3) 11562306a36Sopenharmony_ci/* 11662306a36Sopenharmony_ci * Magic values for bootloader indicating chosen low power mode. 11762306a36Sopenharmony_ci * See also Documentation/arch/arm/samsung/bootloader-interface.rst 11862306a36Sopenharmony_ci */ 11962306a36Sopenharmony_ci#define EXYNOS_SLEEP_MAGIC 0x00000bad 12062306a36Sopenharmony_ci#define EXYNOS_AFTR_MAGIC 0xfcba0d10 12162306a36Sopenharmony_ci 12262306a36Sopenharmony_cibool __init exynos_secure_firmware_available(void); 12362306a36Sopenharmony_civoid exynos_set_boot_flag(unsigned int cpu, unsigned int mode); 12462306a36Sopenharmony_civoid exynos_clear_boot_flag(unsigned int cpu, unsigned int mode); 12562306a36Sopenharmony_ci 12662306a36Sopenharmony_ci#ifdef CONFIG_PM_SLEEP 12762306a36Sopenharmony_ciextern void __init exynos_pm_init(void); 12862306a36Sopenharmony_ci#else 12962306a36Sopenharmony_cistatic inline void exynos_pm_init(void) {} 13062306a36Sopenharmony_ci#endif 13162306a36Sopenharmony_ci 13262306a36Sopenharmony_ciextern void exynos_cpu_resume(void); 13362306a36Sopenharmony_ciextern void exynos_cpu_resume_ns(void); 13462306a36Sopenharmony_ci 13562306a36Sopenharmony_ciextern const struct smp_operations exynos_smp_ops; 13662306a36Sopenharmony_ci 13762306a36Sopenharmony_ciextern void exynos_cpu_power_down(int cpu); 13862306a36Sopenharmony_ciextern void exynos_cpu_power_up(int cpu); 13962306a36Sopenharmony_ciextern int exynos_cpu_power_state(int cpu); 14062306a36Sopenharmony_ciextern void exynos_cluster_power_down(int cluster); 14162306a36Sopenharmony_ciextern void exynos_cluster_power_up(int cluster); 14262306a36Sopenharmony_ciextern int exynos_cluster_power_state(int cluster); 14362306a36Sopenharmony_ciextern void exynos_cpu_save_register(void); 14462306a36Sopenharmony_ciextern void exynos_cpu_restore_register(void); 14562306a36Sopenharmony_ciextern void exynos_pm_central_suspend(void); 14662306a36Sopenharmony_ciextern int exynos_pm_central_resume(void); 14762306a36Sopenharmony_ciextern void exynos_enter_aftr(void); 14862306a36Sopenharmony_ci#ifdef CONFIG_SMP 14962306a36Sopenharmony_ciextern void exynos_scu_enable(void); 15062306a36Sopenharmony_ci#else 15162306a36Sopenharmony_cistatic inline void exynos_scu_enable(void) { } 15262306a36Sopenharmony_ci#endif 15362306a36Sopenharmony_ci 15462306a36Sopenharmony_ciextern struct cpuidle_exynos_data cpuidle_coupled_exynos_data; 15562306a36Sopenharmony_ci 15662306a36Sopenharmony_ciextern void exynos_set_delayed_reset_assertion(bool enable); 15762306a36Sopenharmony_ci 15862306a36Sopenharmony_ciextern unsigned int exynos_rev(void); 15962306a36Sopenharmony_ciextern void exynos_core_restart(u32 core_id); 16062306a36Sopenharmony_ciextern int exynos_set_boot_addr(u32 core_id, unsigned long boot_addr); 16162306a36Sopenharmony_ciextern int exynos_get_boot_addr(u32 core_id, unsigned long *boot_addr); 16262306a36Sopenharmony_ci 16362306a36Sopenharmony_cistatic inline void pmu_raw_writel(u32 val, u32 offset) 16462306a36Sopenharmony_ci{ 16562306a36Sopenharmony_ci writel_relaxed(val, pmu_base_addr + offset); 16662306a36Sopenharmony_ci} 16762306a36Sopenharmony_ci 16862306a36Sopenharmony_cistatic inline u32 pmu_raw_readl(u32 offset) 16962306a36Sopenharmony_ci{ 17062306a36Sopenharmony_ci return readl_relaxed(pmu_base_addr + offset); 17162306a36Sopenharmony_ci} 17262306a36Sopenharmony_ci 17362306a36Sopenharmony_ci#endif /* __ARCH_ARM_MACH_EXYNOS_COMMON_H */ 174