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 ******************************************************************************/ 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 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 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 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 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 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