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