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