xref: /rk3399_ARM-atf/drivers/arm/gic/v3/gic600_multichip_private.h (revision 8924da1ed2eb6d289ef5f515f534647e91504100)
1fcc337cfSVijayenthiran Subramaniam /*
2*b6f3b4f1SGovindraj Raja  * Copyright (c) 2019-2025, ARM Limited. All rights reserved.
3fcc337cfSVijayenthiran Subramaniam  *
4fcc337cfSVijayenthiran Subramaniam  * SPDX-License-Identifier: BSD-3-Clause
5fcc337cfSVijayenthiran Subramaniam  */
6fcc337cfSVijayenthiran Subramaniam 
7fcc337cfSVijayenthiran Subramaniam #ifndef GIC600_MULTICHIP_PRIVATE_H
8fcc337cfSVijayenthiran Subramaniam #define GIC600_MULTICHIP_PRIVATE_H
9fcc337cfSVijayenthiran Subramaniam 
10fcc337cfSVijayenthiran Subramaniam #include <drivers/arm/gic600_multichip.h>
11fcc337cfSVijayenthiran Subramaniam 
12fcc337cfSVijayenthiran Subramaniam #include "gicv3_private.h"
13fcc337cfSVijayenthiran Subramaniam 
14fcc337cfSVijayenthiran Subramaniam /* GIC600 GICD multichip related offsets */
15fcc337cfSVijayenthiran Subramaniam #define GICD_CHIPSR			U(0xC000)
16fcc337cfSVijayenthiran Subramaniam #define GICD_DCHIPR			U(0xC004)
17fcc337cfSVijayenthiran Subramaniam #define GICD_CHIPR			U(0xC008)
18c89438bcSJerry Wang #define GICD_CFGID			U(0xF000)
19fcc337cfSVijayenthiran Subramaniam 
20fcc337cfSVijayenthiran Subramaniam /* GIC600 GICD multichip related masks */
21fcc337cfSVijayenthiran Subramaniam #define GICD_CHIPRx_PUP_BIT		BIT_64(1)
22fcc337cfSVijayenthiran Subramaniam #define GICD_CHIPRx_SOCKET_STATE	BIT_64(0)
23fcc337cfSVijayenthiran Subramaniam #define GICD_DCHIPR_PUP_BIT		BIT_32(0)
24fcc337cfSVijayenthiran Subramaniam #define GICD_CHIPSR_RTS_MASK		(BIT_32(4) | BIT_32(5))
25c89438bcSJerry Wang #define GICD_CFGID_LCA_BIT		BIT_64(21)
26fcc337cfSVijayenthiran Subramaniam 
27fcc337cfSVijayenthiran Subramaniam /* GIC600 GICD multichip related shifts */
28fcc337cfSVijayenthiran Subramaniam #define GICD_CHIPRx_ADDR_SHIFT		16
29fcc337cfSVijayenthiran Subramaniam #define GICD_CHIPSR_RTS_SHIFT		4
30fcc337cfSVijayenthiran Subramaniam #define GICD_DCHIPR_RT_OWNER_SHIFT	4
31fcc337cfSVijayenthiran Subramaniam 
32feb70818SAndre Przywara /* Other shifts and masks remain the same between GIC-600 and GIC-700. */
33feb70818SAndre Przywara #define GIC_700_SPI_BLOCK_MIN_SHIFT	9
34feb70818SAndre Przywara #define GIC_700_SPI_BLOCKS_SHIFT	3
35feb70818SAndre Przywara #define GIC_600_SPI_BLOCK_MIN_SHIFT	10
36feb70818SAndre Przywara #define GIC_600_SPI_BLOCKS_SHIFT	5
37b24ece54SVijayenthiran Subramaniam 
38fcc337cfSVijayenthiran Subramaniam #define GICD_CHIPSR_RTS_STATE_DISCONNECTED	U(0)
39fcc337cfSVijayenthiran Subramaniam #define GICD_CHIPSR_RTS_STATE_UPDATING		U(1)
40fcc337cfSVijayenthiran Subramaniam #define GICD_CHIPSR_RTS_STATE_CONSISTENT	U(2)
41fcc337cfSVijayenthiran Subramaniam 
42fcc337cfSVijayenthiran Subramaniam /* SPI interrupt id minimum and maximum range */
43fcc337cfSVijayenthiran Subramaniam #define GIC600_SPI_ID_MIN		32
4469ed7dc2Ssahil #define GIC600_SPI_ID_MAX		991
45fcc337cfSVijayenthiran Subramaniam 
46a78b3b38SVarun Wadekar #define GIC700_SPI_ID_MIN		32
47a78b3b38SVarun Wadekar #define GIC700_SPI_ID_MAX		991
48a78b3b38SVarun Wadekar #define GIC700_ESPI_ID_MIN		4096
49a78b3b38SVarun Wadekar #define GIC700_ESPI_ID_MAX		5119
50a78b3b38SVarun Wadekar 
51fcc337cfSVijayenthiran Subramaniam /* Number of retries for PUP update */
52fcc337cfSVijayenthiran Subramaniam #define GICD_PUP_UPDATE_RETRIES		10000
53fcc337cfSVijayenthiran Subramaniam 
54fcc337cfSVijayenthiran Subramaniam #define SPI_BLOCK_MIN_VALUE(spi_id_min) \
55fcc337cfSVijayenthiran Subramaniam 			(((spi_id_min) - GIC600_SPI_ID_MIN) / \
56fcc337cfSVijayenthiran Subramaniam 			GIC600_SPI_ID_MIN)
57fcc337cfSVijayenthiran Subramaniam #define SPI_BLOCKS_VALUE(spi_id_min, spi_id_max) \
58fcc337cfSVijayenthiran Subramaniam 			(((spi_id_max) - (spi_id_min) + 1) / \
59fcc337cfSVijayenthiran Subramaniam 			GIC600_SPI_ID_MIN)
60a78b3b38SVarun Wadekar #define ESPI_BLOCK_MIN_VALUE(spi_id_min) \
61a78b3b38SVarun Wadekar 			(((spi_id_min) - GIC700_ESPI_ID_MIN + 1) / \
62a78b3b38SVarun Wadekar 			GIC700_SPI_ID_MIN)
63feb70818SAndre Przywara #define GICD_CHIPR_VALUE_GIC_700(chip_addr, spi_block_min, spi_blocks) \
64*b6f3b4f1SGovindraj Raja 		(((uint64_t)(chip_addr) << GICD_CHIPRx_ADDR_SHIFT) | \
65*b6f3b4f1SGovindraj Raja 		((uint64_t)(spi_block_min) << GIC_700_SPI_BLOCK_MIN_SHIFT) | \
66*b6f3b4f1SGovindraj Raja 		((uint64_t)(spi_blocks) << GIC_700_SPI_BLOCKS_SHIFT))
67feb70818SAndre Przywara #define GICD_CHIPR_VALUE_GIC_600(chip_addr, spi_block_min, spi_blocks) \
68*b6f3b4f1SGovindraj Raja 		(((uint64_t)(chip_addr) << GICD_CHIPRx_ADDR_SHIFT) | \
69*b6f3b4f1SGovindraj Raja 		((uint64_t)(spi_block_min) << GIC_600_SPI_BLOCK_MIN_SHIFT) | \
70*b6f3b4f1SGovindraj Raja 		((uint64_t)(spi_blocks) << GIC_600_SPI_BLOCKS_SHIFT))
71fcc337cfSVijayenthiran Subramaniam 
72fcc337cfSVijayenthiran Subramaniam /*
73fcc337cfSVijayenthiran Subramaniam  * Multichip data assertion macros
74fcc337cfSVijayenthiran Subramaniam  */
75fcc337cfSVijayenthiran Subramaniam /* Set bits from 0 to ((spi_id_max + 1) / 32) */
766aea7624SVijayenthiran Subramaniam #define SPI_BLOCKS_TILL_MAX(spi_id_max) \
776aea7624SVijayenthiran Subramaniam 			((1ULL << (((spi_id_max) + 1) >> 5)) - 1)
78fcc337cfSVijayenthiran Subramaniam /* Set bits from 0 to (spi_id_min / 32) */
79fcc337cfSVijayenthiran Subramaniam #define SPI_BLOCKS_TILL_MIN(spi_id_min)	((1 << ((spi_id_min) >> 5)) - 1)
80fcc337cfSVijayenthiran Subramaniam /* Set bits from (spi_id_min / 32) to ((spi_id_max + 1) / 32) */
81fcc337cfSVijayenthiran Subramaniam #define BLOCKS_OF_32(spi_id_min, spi_id_max) \
82fcc337cfSVijayenthiran Subramaniam 					SPI_BLOCKS_TILL_MAX(spi_id_max) ^ \
83fcc337cfSVijayenthiran Subramaniam 					SPI_BLOCKS_TILL_MIN(spi_id_min)
84fcc337cfSVijayenthiran Subramaniam 
85fcc337cfSVijayenthiran Subramaniam /*******************************************************************************
86fcc337cfSVijayenthiran Subramaniam  * GIC-600 multichip operation related helper functions
87fcc337cfSVijayenthiran Subramaniam  ******************************************************************************/
read_gicd_dchipr(uintptr_t base)88fcc337cfSVijayenthiran Subramaniam static inline uint32_t read_gicd_dchipr(uintptr_t base)
89fcc337cfSVijayenthiran Subramaniam {
90fcc337cfSVijayenthiran Subramaniam 	return mmio_read_32(base + GICD_DCHIPR);
91fcc337cfSVijayenthiran Subramaniam }
92fcc337cfSVijayenthiran Subramaniam 
read_gicd_chipr_n(uintptr_t base,uint8_t n)93fcc337cfSVijayenthiran Subramaniam static inline uint64_t read_gicd_chipr_n(uintptr_t base, uint8_t n)
94fcc337cfSVijayenthiran Subramaniam {
95fcc337cfSVijayenthiran Subramaniam 	return mmio_read_64(base + (GICD_CHIPR + (8U * n)));
96fcc337cfSVijayenthiran Subramaniam }
97fcc337cfSVijayenthiran Subramaniam 
read_gicd_chipsr(uintptr_t base)98fcc337cfSVijayenthiran Subramaniam static inline uint32_t read_gicd_chipsr(uintptr_t base)
99fcc337cfSVijayenthiran Subramaniam {
100fcc337cfSVijayenthiran Subramaniam 	return mmio_read_32(base + GICD_CHIPSR);
101fcc337cfSVijayenthiran Subramaniam }
102fcc337cfSVijayenthiran Subramaniam 
read_gicd_cfgid(uintptr_t base)103c89438bcSJerry Wang static inline uint64_t read_gicd_cfgid(uintptr_t base)
104c89438bcSJerry Wang {
105c89438bcSJerry Wang 	return mmio_read_64(base + GICD_CFGID);
106c89438bcSJerry Wang }
107c89438bcSJerry Wang 
write_gicd_dchipr(uintptr_t base,uint32_t val)108fcc337cfSVijayenthiran Subramaniam static inline void write_gicd_dchipr(uintptr_t base, uint32_t val)
109fcc337cfSVijayenthiran Subramaniam {
110fcc337cfSVijayenthiran Subramaniam 	mmio_write_32(base + GICD_DCHIPR, val);
111fcc337cfSVijayenthiran Subramaniam }
112fcc337cfSVijayenthiran Subramaniam 
write_gicd_chipr_n(uintptr_t base,uint8_t n,uint64_t val)113fcc337cfSVijayenthiran Subramaniam static inline void write_gicd_chipr_n(uintptr_t base, uint8_t n, uint64_t val)
114fcc337cfSVijayenthiran Subramaniam {
115fcc337cfSVijayenthiran Subramaniam 	mmio_write_64(base + (GICD_CHIPR + (8U * n)), val);
116fcc337cfSVijayenthiran Subramaniam }
117fcc337cfSVijayenthiran Subramaniam 
118fcc337cfSVijayenthiran Subramaniam #endif /* GIC600_MULTICHIP_PRIVATE_H */
119