1*ba74b106SEric Auger /* 2*ba74b106SEric Auger * All ITS* defines are lifted from include/linux/irqchip/arm-gic-v3.h 3*ba74b106SEric Auger * 4*ba74b106SEric Auger * Copyright (C) 2020, Red Hat Inc, Eric Auger <eric.auger@redhat.com> 5*ba74b106SEric Auger * 6*ba74b106SEric Auger * This work is licensed under the terms of the GNU LGPL, version 2. 7*ba74b106SEric Auger */ 8*ba74b106SEric Auger #ifndef _ASMARM64_GIC_V3_ITS_H_ 9*ba74b106SEric Auger #define _ASMARM64_GIC_V3_ITS_H_ 10*ba74b106SEric Auger 11*ba74b106SEric Auger #ifndef _ASMARM_GIC_H_ 12*ba74b106SEric Auger #error Do not directly include <asm/gic-v3-its.h>. Include <asm/gic.h> 13*ba74b106SEric Auger #endif 14*ba74b106SEric Auger 15*ba74b106SEric Auger struct its_typer { 16*ba74b106SEric Auger unsigned int ite_size; 17*ba74b106SEric Auger unsigned int eventid_bits; 18*ba74b106SEric Auger unsigned int deviceid_bits; 19*ba74b106SEric Auger unsigned int collid_bits; 20*ba74b106SEric Auger bool pta; 21*ba74b106SEric Auger bool phys_lpi; 22*ba74b106SEric Auger bool virt_lpi; 23*ba74b106SEric Auger }; 24*ba74b106SEric Auger 25*ba74b106SEric Auger struct its_baser { 26*ba74b106SEric Auger int index; 27*ba74b106SEric Auger size_t psz; 28*ba74b106SEric Auger int esz; 29*ba74b106SEric Auger bool indirect; 30*ba74b106SEric Auger void *table_addr; 31*ba74b106SEric Auger }; 32*ba74b106SEric Auger 33*ba74b106SEric Auger #define GITS_BASER_NR_REGS 8 34*ba74b106SEric Auger 35*ba74b106SEric Auger struct its_data { 36*ba74b106SEric Auger void *base; 37*ba74b106SEric Auger struct its_typer typer; 38*ba74b106SEric Auger struct its_baser device_baser; 39*ba74b106SEric Auger struct its_baser coll_baser; 40*ba74b106SEric Auger struct its_cmd_block *cmd_base; 41*ba74b106SEric Auger struct its_cmd_block *cmd_write; 42*ba74b106SEric Auger }; 43*ba74b106SEric Auger 44*ba74b106SEric Auger extern struct its_data its_data; 45*ba74b106SEric Auger 46*ba74b106SEric Auger #define gicv3_its_base() (its_data.base) 47*ba74b106SEric Auger 48*ba74b106SEric Auger #define GITS_CTLR 0x0000 49*ba74b106SEric Auger #define GITS_IIDR 0x0004 50*ba74b106SEric Auger #define GITS_TYPER 0x0008 51*ba74b106SEric Auger #define GITS_CBASER 0x0080 52*ba74b106SEric Auger #define GITS_CWRITER 0x0088 53*ba74b106SEric Auger #define GITS_CREADR 0x0090 54*ba74b106SEric Auger #define GITS_BASER 0x0100 55*ba74b106SEric Auger 56*ba74b106SEric Auger #define GITS_TYPER_PLPIS BIT(0) 57*ba74b106SEric Auger #define GITS_TYPER_VLPIS BIT(1) 58*ba74b106SEric Auger #define GITS_TYPER_ITT_ENTRY_SIZE GENMASK_ULL(7, 4) 59*ba74b106SEric Auger #define GITS_TYPER_ITT_ENTRY_SIZE_SHIFT 4 60*ba74b106SEric Auger #define GITS_TYPER_IDBITS GENMASK_ULL(12, 8) 61*ba74b106SEric Auger #define GITS_TYPER_IDBITS_SHIFT 8 62*ba74b106SEric Auger #define GITS_TYPER_DEVBITS GENMASK_ULL(17, 13) 63*ba74b106SEric Auger #define GITS_TYPER_DEVBITS_SHIFT 13 64*ba74b106SEric Auger #define GITS_TYPER_PTA BIT(19) 65*ba74b106SEric Auger #define GITS_TYPER_CIDBITS GENMASK_ULL(35, 32) 66*ba74b106SEric Auger #define GITS_TYPER_CIDBITS_SHIFT 32 67*ba74b106SEric Auger #define GITS_TYPER_CIL BIT(36) 68*ba74b106SEric Auger 69*ba74b106SEric Auger #define GITS_CTLR_ENABLE (1U << 0) 70*ba74b106SEric Auger 71*ba74b106SEric Auger #define GITS_CBASER_VALID (1UL << 63) 72*ba74b106SEric Auger 73*ba74b106SEric Auger #define GITS_BASER_VALID BIT(63) 74*ba74b106SEric Auger #define GITS_BASER_INDIRECT BIT(62) 75*ba74b106SEric Auger #define GITS_BASER_TYPE_SHIFT (56) 76*ba74b106SEric Auger #define GITS_BASER_TYPE(r) (((r) >> GITS_BASER_TYPE_SHIFT) & 7) 77*ba74b106SEric Auger #define GITS_BASER_ENTRY_SIZE_SHIFT (48) 78*ba74b106SEric Auger #define GITS_BASER_ENTRY_SIZE(r) ((((r) >> GITS_BASER_ENTRY_SIZE_SHIFT) & 0x1f) + 1) 79*ba74b106SEric Auger #define GITS_BASER_PAGE_SIZE_SHIFT (8) 80*ba74b106SEric Auger #define GITS_BASER_PAGE_SIZE_4K (0UL << GITS_BASER_PAGE_SIZE_SHIFT) 81*ba74b106SEric Auger #define GITS_BASER_PAGE_SIZE_16K (1UL << GITS_BASER_PAGE_SIZE_SHIFT) 82*ba74b106SEric Auger #define GITS_BASER_PAGE_SIZE_64K (2UL << GITS_BASER_PAGE_SIZE_SHIFT) 83*ba74b106SEric Auger #define GITS_BASER_PAGE_SIZE_MASK (3UL << GITS_BASER_PAGE_SIZE_SHIFT) 84*ba74b106SEric Auger #define GITS_BASER_PAGES_MAX 256 85*ba74b106SEric Auger #define GITS_BASER_PAGES_SHIFT (0) 86*ba74b106SEric Auger #define GITS_BASER_NR_PAGES(r) (((r) & 0xff) + 1) 87*ba74b106SEric Auger #define GITS_BASER_PHYS_ADDR_MASK 0xFFFFFFFFF000 88*ba74b106SEric Auger #define GITS_BASER_TYPE_NONE 0 89*ba74b106SEric Auger #define GITS_BASER_TYPE_DEVICE 1 90*ba74b106SEric Auger #define GITS_BASER_TYPE_COLLECTION 4 91*ba74b106SEric Auger 92*ba74b106SEric Auger extern void its_parse_typer(void); 93*ba74b106SEric Auger extern void its_init(void); 94*ba74b106SEric Auger extern int its_baser_lookup(int i, struct its_baser *baser); 95*ba74b106SEric Auger 96*ba74b106SEric Auger #endif /* _ASMARM64_GIC_V3_ITS_H_ */ 97