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