1ba74b106SEric Auger /* 2ba74b106SEric Auger * All ITS* defines are lifted from include/linux/irqchip/arm-gic-v3.h 3ba74b106SEric Auger * 4ba74b106SEric Auger * Copyright (C) 2020, Red Hat Inc, Eric Auger <eric.auger@redhat.com> 5ba74b106SEric Auger * 6ba74b106SEric Auger * This work is licensed under the terms of the GNU LGPL, version 2. 7ba74b106SEric Auger */ 8ba74b106SEric Auger #ifndef _ASMARM64_GIC_V3_ITS_H_ 9ba74b106SEric Auger #define _ASMARM64_GIC_V3_ITS_H_ 10ba74b106SEric Auger 11ba74b106SEric Auger #ifndef _ASMARM_GIC_H_ 12ba74b106SEric Auger #error Do not directly include <asm/gic-v3-its.h>. Include <asm/gic.h> 13ba74b106SEric Auger #endif 14ba74b106SEric Auger 15ba74b106SEric Auger struct its_typer { 16ba74b106SEric Auger unsigned int ite_size; 17ba74b106SEric Auger unsigned int eventid_bits; 18ba74b106SEric Auger unsigned int deviceid_bits; 19ba74b106SEric Auger unsigned int collid_bits; 20ba74b106SEric Auger bool pta; 21ba74b106SEric Auger bool phys_lpi; 22ba74b106SEric Auger bool virt_lpi; 23ba74b106SEric Auger }; 24ba74b106SEric Auger 25ba74b106SEric Auger struct its_baser { 26ba74b106SEric Auger int index; 27ba74b106SEric Auger size_t psz; 28ba74b106SEric Auger int esz; 29ba74b106SEric Auger bool indirect; 30ba74b106SEric Auger void *table_addr; 31ba74b106SEric Auger }; 32ba74b106SEric Auger 33ba74b106SEric Auger #define GITS_BASER_NR_REGS 8 340c87bc34SEric Auger #define GITS_MAX_DEVICES 8 350c87bc34SEric Auger #define GITS_MAX_COLLECTIONS 8 360c87bc34SEric Auger 370c87bc34SEric Auger struct its_device { 380c87bc34SEric Auger u32 device_id; /* device ID */ 390c87bc34SEric Auger u32 nr_ites; /* Max Interrupt Translation Entries */ 400c87bc34SEric Auger void *itt; /* Interrupt Translation Table GVA */ 410c87bc34SEric Auger }; 420c87bc34SEric Auger 430c87bc34SEric Auger struct its_collection { 440c87bc34SEric Auger u64 target_address; 450c87bc34SEric Auger u16 col_id; 460c87bc34SEric Auger }; 47ba74b106SEric Auger 48ba74b106SEric Auger struct its_data { 49ba74b106SEric Auger void *base; 50ba74b106SEric Auger struct its_typer typer; 51ba74b106SEric Auger struct its_baser device_baser; 52ba74b106SEric Auger struct its_baser coll_baser; 53ba74b106SEric Auger struct its_cmd_block *cmd_base; 54ba74b106SEric Auger struct its_cmd_block *cmd_write; 550c87bc34SEric Auger struct its_device devices[GITS_MAX_DEVICES]; 560c87bc34SEric Auger u32 nr_devices; /* Allocated Devices */ 570c87bc34SEric Auger struct its_collection collections[GITS_MAX_COLLECTIONS]; 580c87bc34SEric Auger u16 nr_collections; /* Allocated Collections */ 59ba74b106SEric Auger }; 60ba74b106SEric Auger 61ba74b106SEric Auger extern struct its_data its_data; 62ba74b106SEric Auger 63ba74b106SEric Auger #define gicv3_its_base() (its_data.base) 64ba74b106SEric Auger 65ba74b106SEric Auger #define GITS_CTLR 0x0000 66ba74b106SEric Auger #define GITS_IIDR 0x0004 67ba74b106SEric Auger #define GITS_TYPER 0x0008 68ba74b106SEric Auger #define GITS_CBASER 0x0080 69ba74b106SEric Auger #define GITS_CWRITER 0x0088 70ba74b106SEric Auger #define GITS_CREADR 0x0090 71ba74b106SEric Auger #define GITS_BASER 0x0100 72ba74b106SEric Auger 73ba74b106SEric Auger #define GITS_TYPER_PLPIS BIT(0) 74ba74b106SEric Auger #define GITS_TYPER_VLPIS BIT(1) 75ba74b106SEric Auger #define GITS_TYPER_ITT_ENTRY_SIZE GENMASK_ULL(7, 4) 76ba74b106SEric Auger #define GITS_TYPER_ITT_ENTRY_SIZE_SHIFT 4 77ba74b106SEric Auger #define GITS_TYPER_IDBITS GENMASK_ULL(12, 8) 78ba74b106SEric Auger #define GITS_TYPER_IDBITS_SHIFT 8 79ba74b106SEric Auger #define GITS_TYPER_DEVBITS GENMASK_ULL(17, 13) 80ba74b106SEric Auger #define GITS_TYPER_DEVBITS_SHIFT 13 81ba74b106SEric Auger #define GITS_TYPER_PTA BIT(19) 82ba74b106SEric Auger #define GITS_TYPER_CIDBITS GENMASK_ULL(35, 32) 83ba74b106SEric Auger #define GITS_TYPER_CIDBITS_SHIFT 32 84ba74b106SEric Auger #define GITS_TYPER_CIL BIT(36) 85ba74b106SEric Auger 86ba74b106SEric Auger #define GITS_CTLR_ENABLE (1U << 0) 87ba74b106SEric Auger 88ba74b106SEric Auger #define GITS_CBASER_VALID (1UL << 63) 89ba74b106SEric Auger 90ba74b106SEric Auger #define GITS_BASER_VALID BIT(63) 91ba74b106SEric Auger #define GITS_BASER_INDIRECT BIT(62) 92ba74b106SEric Auger #define GITS_BASER_TYPE_SHIFT (56) 93ba74b106SEric Auger #define GITS_BASER_TYPE(r) (((r) >> GITS_BASER_TYPE_SHIFT) & 7) 94ba74b106SEric Auger #define GITS_BASER_ENTRY_SIZE_SHIFT (48) 95ba74b106SEric Auger #define GITS_BASER_ENTRY_SIZE(r) ((((r) >> GITS_BASER_ENTRY_SIZE_SHIFT) & 0x1f) + 1) 96ba74b106SEric Auger #define GITS_BASER_PAGE_SIZE_SHIFT (8) 97ba74b106SEric Auger #define GITS_BASER_PAGE_SIZE_4K (0UL << GITS_BASER_PAGE_SIZE_SHIFT) 98ba74b106SEric Auger #define GITS_BASER_PAGE_SIZE_16K (1UL << GITS_BASER_PAGE_SIZE_SHIFT) 99ba74b106SEric Auger #define GITS_BASER_PAGE_SIZE_64K (2UL << GITS_BASER_PAGE_SIZE_SHIFT) 100ba74b106SEric Auger #define GITS_BASER_PAGE_SIZE_MASK (3UL << GITS_BASER_PAGE_SIZE_SHIFT) 101ba74b106SEric Auger #define GITS_BASER_PAGES_MAX 256 102ba74b106SEric Auger #define GITS_BASER_PAGES_SHIFT (0) 103ba74b106SEric Auger #define GITS_BASER_NR_PAGES(r) (((r) & 0xff) + 1) 104ba74b106SEric Auger #define GITS_BASER_PHYS_ADDR_MASK 0xFFFFFFFFF000 105ba74b106SEric Auger #define GITS_BASER_TYPE_NONE 0 106ba74b106SEric Auger #define GITS_BASER_TYPE_DEVICE 1 107ba74b106SEric Auger #define GITS_BASER_TYPE_COLLECTION 4 108ba74b106SEric Auger 109d62ae917SEric Auger /* 110d62ae917SEric Auger * ITS commands 111d62ae917SEric Auger */ 112d62ae917SEric Auger #define GITS_CMD_MAPD 0x08 113d62ae917SEric Auger #define GITS_CMD_MAPC 0x09 114d62ae917SEric Auger #define GITS_CMD_MAPTI 0x0a 115d62ae917SEric Auger #define GITS_CMD_MAPI 0x0b 116d62ae917SEric Auger #define GITS_CMD_MOVI 0x01 117d62ae917SEric Auger #define GITS_CMD_DISCARD 0x0f 118d62ae917SEric Auger #define GITS_CMD_INV 0x0c 119d62ae917SEric Auger #define GITS_CMD_MOVALL 0x0e 120d62ae917SEric Auger #define GITS_CMD_INVALL 0x0d 121d62ae917SEric Auger #define GITS_CMD_INT 0x03 122d62ae917SEric Auger #define GITS_CMD_CLEAR 0x04 123d62ae917SEric Auger #define GITS_CMD_SYNC 0x05 124d62ae917SEric Auger 125d62ae917SEric Auger struct its_cmd_block { 126d62ae917SEric Auger u64 raw_cmd[4]; 127d62ae917SEric Auger }; 128d62ae917SEric Auger 129ba74b106SEric Auger extern void its_parse_typer(void); 130ba74b106SEric Auger extern void its_init(void); 131ba74b106SEric Auger extern int its_baser_lookup(int i, struct its_baser *baser); 13280374e12SEric Auger extern void its_enable_defaults(void); 1330c87bc34SEric Auger extern struct its_device *its_create_device(u32 dev_id, int nr_ites); 1340c87bc34SEric Auger extern struct its_collection *its_create_collection(u16 col_id, u32 target_pe); 135ba74b106SEric Auger 136d62ae917SEric Auger extern void __its_send_mapd(struct its_device *dev, int valid, bool verbose); 137d62ae917SEric Auger extern void __its_send_mapc(struct its_collection *col, int valid, bool verbose); 138d62ae917SEric Auger extern void __its_send_mapti(struct its_device *dev, u32 irq_id, u32 event_id, 139d62ae917SEric Auger struct its_collection *col, bool verbose); 140d62ae917SEric Auger extern void __its_send_int(struct its_device *dev, u32 event_id, bool verbose); 141d62ae917SEric Auger extern void __its_send_inv(struct its_device *dev, u32 event_id, bool verbose); 142d62ae917SEric Auger extern void __its_send_discard(struct its_device *dev, u32 event_id, bool verbose); 143d62ae917SEric Auger extern void __its_send_clear(struct its_device *dev, u32 event_id, bool verbose); 144d62ae917SEric Auger extern void __its_send_invall(struct its_collection *col, bool verbose); 145d62ae917SEric Auger extern void __its_send_movi(struct its_device *dev, struct its_collection *col, 146d62ae917SEric Auger u32 id, bool verbose); 147d62ae917SEric Auger extern void __its_send_sync(struct its_collection *col, bool verbose); 148d62ae917SEric Auger 149d62ae917SEric Auger #define its_send_mapd(dev, valid) __its_send_mapd(dev, valid, true) 150d62ae917SEric Auger #define its_send_mapc(col, valid) __its_send_mapc(col, valid, true) 151d62ae917SEric Auger #define its_send_mapti(dev, irqid, eventid, col) __its_send_mapti(dev, irqid, eventid, col, true) 152d62ae917SEric Auger #define its_send_int(dev, eventid) __its_send_int(dev, eventid, true) 153d62ae917SEric Auger #define its_send_inv(dev, eventid) __its_send_inv(dev, eventid, true) 154d62ae917SEric Auger #define its_send_discard(dev, eventid) __its_send_discard(dev, eventid, true) 155d62ae917SEric Auger #define its_send_clear(dev, eventid) __its_send_clear(dev, eventid, true) 156d62ae917SEric Auger #define its_send_invall(col) __its_send_invall(col, true) 157d62ae917SEric Auger #define its_send_movi(dev, col, id) __its_send_movi(dev, col, id, true) 158d62ae917SEric Auger #define its_send_sync(col) __its_send_sync(col, true) 159d62ae917SEric Auger 160d62ae917SEric Auger #define its_send_mapd_nv(dev, valid) __its_send_mapd(dev, valid, false) 161d62ae917SEric Auger #define its_send_mapc_nv(col, valid) __its_send_mapc(col, valid, false) 162d62ae917SEric Auger #define its_send_mapti_nv(dev, irqid, eventid, col) __its_send_mapti(dev, irqid, eventid, col, false) 163d62ae917SEric Auger #define its_send_int_nv(dev, eventid) __its_send_int(dev, eventid, false) 164d62ae917SEric Auger #define its_send_inv_nv(dev, eventid) __its_send_inv(dev, eventid, false) 165d62ae917SEric Auger #define its_send_discard_nv(dev, eventid) __its_send_discard(dev, eventid, false) 166d62ae917SEric Auger #define its_send_clear_nv(dev, eventid) __its_send_clear(dev, eventidn false) 167d62ae917SEric Auger #define its_send_invall_nv(col) __its_send_invall(col, false) 168d62ae917SEric Auger #define its_send_movi_nv(dev, col, id) __its_send_movi(dev, col, id, false) 169d62ae917SEric Auger #define its_send_sync_nv(col) __its_send_sync(col, false) 170d62ae917SEric Auger 171*64260a5fSEric Auger extern struct its_device *its_get_device(u32 id); 172*64260a5fSEric Auger extern struct its_collection *its_get_collection(u32 id); 173*64260a5fSEric Auger 174ba74b106SEric Auger #endif /* _ASMARM64_GIC_V3_ITS_H_ */ 175