xref: /rk3399_rockchip-uboot/arch/arm/include/asm/armv7.h (revision 1ea4fac5a34604e67504ee6537bb01e809528cd4)
12c451f78SAneesh V /*
22c451f78SAneesh V  * (C) Copyright 2010
32c451f78SAneesh V  * Texas Instruments, <www.ti.com>
42c451f78SAneesh V  * Aneesh V <aneesh@ti.com>
52c451f78SAneesh V  *
61a459660SWolfgang Denk  * SPDX-License-Identifier:	GPL-2.0+
72c451f78SAneesh V  */
82c451f78SAneesh V #ifndef ARMV7_H
92c451f78SAneesh V #define ARMV7_H
102c451f78SAneesh V 
11ad577c8aSAneesh V /* Cortex-A9 revisions */
12ad577c8aSAneesh V #define MIDR_CORTEX_A9_R0P1	0x410FC091
13ad577c8aSAneesh V #define MIDR_CORTEX_A9_R1P2	0x411FC092
14ad577c8aSAneesh V #define MIDR_CORTEX_A9_R1P3	0x411FC093
155ab12a9eSAneesh V #define MIDR_CORTEX_A9_R2P10	0x412FC09A
16ad577c8aSAneesh V 
17508a58faSSricharan /* Cortex-A15 revisions */
18508a58faSSricharan #define MIDR_CORTEX_A15_R0P0	0x410FC0F0
19eed7c0f7SSRICHARAN R #define MIDR_CORTEX_A15_R2P2	0x412FC0F2
20508a58faSSricharan 
2116212b59SAndre Przywara /* Cortex-A7 revisions */
2216212b59SAndre Przywara #define MIDR_CORTEX_A7_R0P0	0x410FC070
2316212b59SAndre Przywara 
2416212b59SAndre Przywara #define MIDR_PRIMARY_PART_MASK	0xFF0FFFF0
2516212b59SAndre Przywara 
2616212b59SAndre Przywara /* ID_PFR1 feature fields */
2716212b59SAndre Przywara #define CPUID_ARM_SEC_SHIFT		4
2816212b59SAndre Przywara #define CPUID_ARM_SEC_MASK		(0xF << CPUID_ARM_SEC_SHIFT)
2916212b59SAndre Przywara #define CPUID_ARM_VIRT_SHIFT		12
3016212b59SAndre Przywara #define CPUID_ARM_VIRT_MASK		(0xF << CPUID_ARM_VIRT_SHIFT)
3116212b59SAndre Przywara #define CPUID_ARM_GENTIMER_SHIFT	16
3216212b59SAndre Przywara #define CPUID_ARM_GENTIMER_MASK		(0xF << CPUID_ARM_GENTIMER_SHIFT)
3316212b59SAndre Przywara 
3416212b59SAndre Przywara /* valid bits in CBAR register / PERIPHBASE value */
3516212b59SAndre Przywara #define CBAR_MASK			0xFFFF8000
3616212b59SAndre Przywara 
372c451f78SAneesh V /* CCSIDR */
382c451f78SAneesh V #define CCSIDR_LINE_SIZE_OFFSET		0
392c451f78SAneesh V #define CCSIDR_LINE_SIZE_MASK		0x7
402c451f78SAneesh V #define CCSIDR_ASSOCIATIVITY_OFFSET	3
412c451f78SAneesh V #define CCSIDR_ASSOCIATIVITY_MASK	(0x3FF << 3)
422c451f78SAneesh V #define CCSIDR_NUM_SETS_OFFSET		13
432c451f78SAneesh V #define CCSIDR_NUM_SETS_MASK		(0x7FFF << 13)
442c451f78SAneesh V 
452c451f78SAneesh V /*
462c451f78SAneesh V  * Values for InD field in CSSELR
472c451f78SAneesh V  * Selects the type of cache
482c451f78SAneesh V  */
492c451f78SAneesh V #define ARMV7_CSSELR_IND_DATA_UNIFIED	0
502c451f78SAneesh V #define ARMV7_CSSELR_IND_INSTRUCTION	1
512c451f78SAneesh V 
522c451f78SAneesh V /* Values for Ctype fields in CLIDR */
532c451f78SAneesh V #define ARMV7_CLIDR_CTYPE_NO_CACHE		0
542c451f78SAneesh V #define ARMV7_CLIDR_CTYPE_INSTRUCTION_ONLY	1
552c451f78SAneesh V #define ARMV7_CLIDR_CTYPE_DATA_ONLY		2
562c451f78SAneesh V #define ARMV7_CLIDR_CTYPE_INSTRUCTION_DATA	3
572c451f78SAneesh V #define ARMV7_CLIDR_CTYPE_UNIFIED		4
582c451f78SAneesh V 
59d75ba503SAndre Przywara #ifndef __ASSEMBLY__
60d75ba503SAndre Przywara #include <linux/types.h>
61301c1283STom Rini #include <asm/io.h>
62*1ea4fac5SAndre Przywara #include <asm/barriers.h>
639ba379adSValentine Barshak 
640c08baf0SAkshay Saraswat /*
650c08baf0SAkshay Saraswat  * Workaround for ARM errata # 798870
660c08baf0SAkshay Saraswat  * Set L2ACTLR[7] to reissue any memory transaction in the L2 that has been
670c08baf0SAkshay Saraswat  * stalled for 1024 cycles to verify that its hazard condition still exists.
680c08baf0SAkshay Saraswat  */
690c08baf0SAkshay Saraswat static inline void v7_enable_l2_hazard_detect(void)
700c08baf0SAkshay Saraswat {
710c08baf0SAkshay Saraswat 	uint32_t val;
720c08baf0SAkshay Saraswat 
730c08baf0SAkshay Saraswat 	/* L2ACTLR[7]: Enable hazard detect timeout */
740c08baf0SAkshay Saraswat 	asm volatile ("mrc     p15, 1, %0, c15, c0, 0\n\t" : "=r"(val));
750c08baf0SAkshay Saraswat 	val |= (1 << 7);
760c08baf0SAkshay Saraswat 	asm volatile ("mcr     p15, 1, %0, c15, c0, 0\n\t" : : "r"(val));
770c08baf0SAkshay Saraswat }
780c08baf0SAkshay Saraswat 
79a3895314SAkshay Saraswat /*
80a3895314SAkshay Saraswat  * Workaround for ARM errata # 799270
81a3895314SAkshay Saraswat  * Ensure that the L2 logic has been used within the previous 256 cycles
82a3895314SAkshay Saraswat  * before modifying the ACTLR.SMP bit. This is required during boot before
83a3895314SAkshay Saraswat  * MMU has been enabled, or during a specified reset or power down sequence.
84a3895314SAkshay Saraswat  */
85a3895314SAkshay Saraswat static inline void v7_enable_smp(uint32_t address)
86a3895314SAkshay Saraswat {
87a3895314SAkshay Saraswat 	uint32_t temp, val;
88a3895314SAkshay Saraswat 
89a3895314SAkshay Saraswat 	/* Read auxiliary control register */
90a3895314SAkshay Saraswat 	asm volatile ("mrc     p15, 0, %0, c1, c0, 1\n\t" : "=r"(val));
91a3895314SAkshay Saraswat 
92a3895314SAkshay Saraswat 	/* Enable SMP */
93a3895314SAkshay Saraswat 	val |= (1 << 6);
94a3895314SAkshay Saraswat 
95a3895314SAkshay Saraswat 	/* Dummy read to assure L2 access */
96a3895314SAkshay Saraswat 	temp = readl(address);
97a3895314SAkshay Saraswat 	temp &= 0;
98a3895314SAkshay Saraswat 	val |= temp;
99a3895314SAkshay Saraswat 
100a3895314SAkshay Saraswat 	/* Write auxiliary control register */
101a3895314SAkshay Saraswat 	asm volatile ("mcr     p15, 0, %0, c1, c0, 1\n\t" : : "r"(val));
102a3895314SAkshay Saraswat 
103a3895314SAkshay Saraswat 	CP15DSB;
104a3895314SAkshay Saraswat 	CP15ISB;
105a3895314SAkshay Saraswat }
106a3895314SAkshay Saraswat 
1070c08baf0SAkshay Saraswat void v7_en_l2_hazard_detect(void);
1082c451f78SAneesh V void v7_outer_cache_enable(void);
1092c451f78SAneesh V void v7_outer_cache_disable(void);
1102c451f78SAneesh V void v7_outer_cache_flush_all(void);
1112c451f78SAneesh V void v7_outer_cache_inval_all(void);
1122c451f78SAneesh V void v7_outer_cache_flush_range(u32 start, u32 end);
1132c451f78SAneesh V void v7_outer_cache_inval_range(u32 start, u32 end);
1142c451f78SAneesh V 
115104d6fb6SJan Kiszka #ifdef CONFIG_ARMV7_NONSEC
1161ef92385SAndre Przywara 
117f510aeaeSMarc Zyngier int armv7_init_nonsec(void);
118d6b72da0SJan Kiszka int armv7_apply_memory_carveout(u64 *start, u64 *size);
11997a81964SIan Campbell bool armv7_boot_nonsec(void);
1201ef92385SAndre Przywara 
12116212b59SAndre Przywara /* defined in assembly file */
12216212b59SAndre Przywara unsigned int _nonsec_init(void);
123f510aeaeSMarc Zyngier void _do_nonsec_entry(void *target_pc, unsigned long r0,
124f510aeaeSMarc Zyngier 		      unsigned long r1, unsigned long r2);
125ba6a1698SAndre Przywara void _smp_pen(void);
126f510aeaeSMarc Zyngier 
127f510aeaeSMarc Zyngier extern char __secure_start[];
128f510aeaeSMarc Zyngier extern char __secure_end[];
129f510aeaeSMarc Zyngier 
130104d6fb6SJan Kiszka #endif /* CONFIG_ARMV7_NONSEC */
13116212b59SAndre Przywara 
132c616a0dfSNishanth Menon void v7_arch_cp15_set_l2aux_ctrl(u32 l2auxctrl, u32 cpu_midr,
133c616a0dfSNishanth Menon 				 u32 cpu_rev_comb, u32 cpu_variant,
134c616a0dfSNishanth Menon 				 u32 cpu_rev);
135b45c48a7SNishanth Menon void v7_arch_cp15_set_acr(u32 acr, u32 cpu_midr, u32 cpu_rev_comb,
136b45c48a7SNishanth Menon 			  u32 cpu_variant, u32 cpu_rev);
137d75ba503SAndre Przywara #endif /* ! __ASSEMBLY__ */
138d75ba503SAndre Przywara 
1392c451f78SAneesh V #endif
140