110a83cb9SPrem Mallappa /* 210a83cb9SPrem Mallappa * ARM SMMUv3 support - Internal API 310a83cb9SPrem Mallappa * 410a83cb9SPrem Mallappa * Copyright (C) 2014-2016 Broadcom Corporation 510a83cb9SPrem Mallappa * Copyright (c) 2017 Red Hat, Inc. 610a83cb9SPrem Mallappa * Written by Prem Mallappa, Eric Auger 710a83cb9SPrem Mallappa * 810a83cb9SPrem Mallappa * This program is free software; you can redistribute it and/or modify 910a83cb9SPrem Mallappa * it under the terms of the GNU General Public License version 2 as 1010a83cb9SPrem Mallappa * published by the Free Software Foundation. 1110a83cb9SPrem Mallappa * 1210a83cb9SPrem Mallappa * This program is distributed in the hope that it will be useful, 1310a83cb9SPrem Mallappa * but WITHOUT ANY WARRANTY; without even the implied warranty of 1410a83cb9SPrem Mallappa * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 1510a83cb9SPrem Mallappa * GNU General Public License for more details. 1610a83cb9SPrem Mallappa * 1710a83cb9SPrem Mallappa * You should have received a copy of the GNU General Public License along 1810a83cb9SPrem Mallappa * with this program; if not, see <http://www.gnu.org/licenses/>. 1910a83cb9SPrem Mallappa */ 2010a83cb9SPrem Mallappa 2110a83cb9SPrem Mallappa #ifndef HW_ARM_SMMU_V3_INTERNAL_H 2210a83cb9SPrem Mallappa #define HW_ARM_SMMU_V3_INTERNAL_H 2310a83cb9SPrem Mallappa 2410a83cb9SPrem Mallappa #include "hw/arm/smmu-common.h" 2510a83cb9SPrem Mallappa 2610a83cb9SPrem Mallappa /* MMIO Registers */ 2710a83cb9SPrem Mallappa 2810a83cb9SPrem Mallappa REG32(IDR0, 0x0) 2910a83cb9SPrem Mallappa FIELD(IDR0, S1P, 1 , 1) 3010a83cb9SPrem Mallappa FIELD(IDR0, TTF, 2 , 2) 3110a83cb9SPrem Mallappa FIELD(IDR0, COHACC, 4 , 1) 3210a83cb9SPrem Mallappa FIELD(IDR0, ASID16, 12, 1) 3310a83cb9SPrem Mallappa FIELD(IDR0, TTENDIAN, 21, 2) 3410a83cb9SPrem Mallappa FIELD(IDR0, STALL_MODEL, 24, 2) 3510a83cb9SPrem Mallappa FIELD(IDR0, TERM_MODEL, 26, 1) 3610a83cb9SPrem Mallappa FIELD(IDR0, STLEVEL, 27, 2) 3710a83cb9SPrem Mallappa 3810a83cb9SPrem Mallappa REG32(IDR1, 0x4) 3910a83cb9SPrem Mallappa FIELD(IDR1, SIDSIZE, 0 , 6) 4010a83cb9SPrem Mallappa FIELD(IDR1, EVENTQS, 16, 5) 4110a83cb9SPrem Mallappa FIELD(IDR1, CMDQS, 21, 5) 4210a83cb9SPrem Mallappa 4310a83cb9SPrem Mallappa #define SMMU_IDR1_SIDSIZE 16 4410a83cb9SPrem Mallappa #define SMMU_CMDQS 19 4510a83cb9SPrem Mallappa #define SMMU_EVENTQS 19 4610a83cb9SPrem Mallappa 4710a83cb9SPrem Mallappa REG32(IDR2, 0x8) 4810a83cb9SPrem Mallappa REG32(IDR3, 0xc) 4910a83cb9SPrem Mallappa REG32(IDR4, 0x10) 5010a83cb9SPrem Mallappa REG32(IDR5, 0x14) 5110a83cb9SPrem Mallappa FIELD(IDR5, OAS, 0, 3); 5210a83cb9SPrem Mallappa FIELD(IDR5, GRAN4K, 4, 1); 5310a83cb9SPrem Mallappa FIELD(IDR5, GRAN16K, 5, 1); 5410a83cb9SPrem Mallappa FIELD(IDR5, GRAN64K, 6, 1); 5510a83cb9SPrem Mallappa 5610a83cb9SPrem Mallappa #define SMMU_IDR5_OAS 4 5710a83cb9SPrem Mallappa 5810a83cb9SPrem Mallappa REG32(IIDR, 0x1c) 5910a83cb9SPrem Mallappa REG32(CR0, 0x20) 6010a83cb9SPrem Mallappa FIELD(CR0, SMMU_ENABLE, 0, 1) 6110a83cb9SPrem Mallappa FIELD(CR0, EVENTQEN, 2, 1) 6210a83cb9SPrem Mallappa FIELD(CR0, CMDQEN, 3, 1) 6310a83cb9SPrem Mallappa 6410a83cb9SPrem Mallappa REG32(CR0ACK, 0x24) 6510a83cb9SPrem Mallappa REG32(CR1, 0x28) 6610a83cb9SPrem Mallappa REG32(CR2, 0x2c) 6710a83cb9SPrem Mallappa REG32(STATUSR, 0x40) 6810a83cb9SPrem Mallappa REG32(IRQ_CTRL, 0x50) 6910a83cb9SPrem Mallappa FIELD(IRQ_CTRL, GERROR_IRQEN, 0, 1) 7010a83cb9SPrem Mallappa FIELD(IRQ_CTRL, PRI_IRQEN, 1, 1) 7110a83cb9SPrem Mallappa FIELD(IRQ_CTRL, EVENTQ_IRQEN, 2, 1) 7210a83cb9SPrem Mallappa 7310a83cb9SPrem Mallappa REG32(IRQ_CTRL_ACK, 0x54) 7410a83cb9SPrem Mallappa REG32(GERROR, 0x60) 7510a83cb9SPrem Mallappa FIELD(GERROR, CMDQ_ERR, 0, 1) 7610a83cb9SPrem Mallappa FIELD(GERROR, EVENTQ_ABT_ERR, 2, 1) 7710a83cb9SPrem Mallappa FIELD(GERROR, PRIQ_ABT_ERR, 3, 1) 7810a83cb9SPrem Mallappa FIELD(GERROR, MSI_CMDQ_ABT_ERR, 4, 1) 7910a83cb9SPrem Mallappa FIELD(GERROR, MSI_EVENTQ_ABT_ERR, 5, 1) 8010a83cb9SPrem Mallappa FIELD(GERROR, MSI_PRIQ_ABT_ERR, 6, 1) 8110a83cb9SPrem Mallappa FIELD(GERROR, MSI_GERROR_ABT_ERR, 7, 1) 8210a83cb9SPrem Mallappa FIELD(GERROR, MSI_SFM_ERR, 8, 1) 8310a83cb9SPrem Mallappa 8410a83cb9SPrem Mallappa REG32(GERRORN, 0x64) 8510a83cb9SPrem Mallappa 8610a83cb9SPrem Mallappa #define A_GERROR_IRQ_CFG0 0x68 /* 64b */ 8710a83cb9SPrem Mallappa REG32(GERROR_IRQ_CFG1, 0x70) 8810a83cb9SPrem Mallappa REG32(GERROR_IRQ_CFG2, 0x74) 8910a83cb9SPrem Mallappa 9010a83cb9SPrem Mallappa #define A_STRTAB_BASE 0x80 /* 64b */ 9110a83cb9SPrem Mallappa 9210a83cb9SPrem Mallappa #define SMMU_BASE_ADDR_MASK 0xffffffffffe0 9310a83cb9SPrem Mallappa 9410a83cb9SPrem Mallappa REG32(STRTAB_BASE_CFG, 0x88) 9510a83cb9SPrem Mallappa FIELD(STRTAB_BASE_CFG, FMT, 16, 2) 9610a83cb9SPrem Mallappa FIELD(STRTAB_BASE_CFG, SPLIT, 6 , 5) 9710a83cb9SPrem Mallappa FIELD(STRTAB_BASE_CFG, LOG2SIZE, 0 , 6) 9810a83cb9SPrem Mallappa 9910a83cb9SPrem Mallappa #define A_CMDQ_BASE 0x90 /* 64b */ 10010a83cb9SPrem Mallappa REG32(CMDQ_PROD, 0x98) 10110a83cb9SPrem Mallappa REG32(CMDQ_CONS, 0x9c) 10210a83cb9SPrem Mallappa FIELD(CMDQ_CONS, ERR, 24, 7) 10310a83cb9SPrem Mallappa 10410a83cb9SPrem Mallappa #define A_EVENTQ_BASE 0xa0 /* 64b */ 10510a83cb9SPrem Mallappa REG32(EVENTQ_PROD, 0xa8) 10610a83cb9SPrem Mallappa REG32(EVENTQ_CONS, 0xac) 10710a83cb9SPrem Mallappa 10810a83cb9SPrem Mallappa #define A_EVENTQ_IRQ_CFG0 0xb0 /* 64b */ 10910a83cb9SPrem Mallappa REG32(EVENTQ_IRQ_CFG1, 0xb8) 11010a83cb9SPrem Mallappa REG32(EVENTQ_IRQ_CFG2, 0xbc) 11110a83cb9SPrem Mallappa 11210a83cb9SPrem Mallappa #define A_IDREGS 0xfd0 11310a83cb9SPrem Mallappa 11410a83cb9SPrem Mallappa static inline int smmu_enabled(SMMUv3State *s) 11510a83cb9SPrem Mallappa { 11610a83cb9SPrem Mallappa return FIELD_EX32(s->cr[0], CR0, SMMU_ENABLE); 11710a83cb9SPrem Mallappa } 11810a83cb9SPrem Mallappa 11910a83cb9SPrem Mallappa /* Command Queue Entry */ 12010a83cb9SPrem Mallappa typedef struct Cmd { 12110a83cb9SPrem Mallappa uint32_t word[4]; 12210a83cb9SPrem Mallappa } Cmd; 12310a83cb9SPrem Mallappa 12410a83cb9SPrem Mallappa /* Event Queue Entry */ 12510a83cb9SPrem Mallappa typedef struct Evt { 12610a83cb9SPrem Mallappa uint32_t word[8]; 12710a83cb9SPrem Mallappa } Evt; 12810a83cb9SPrem Mallappa 12910a83cb9SPrem Mallappa static inline uint32_t smmuv3_idreg(int regoffset) 13010a83cb9SPrem Mallappa { 13110a83cb9SPrem Mallappa /* 13210a83cb9SPrem Mallappa * Return the value of the Primecell/Corelink ID registers at the 13310a83cb9SPrem Mallappa * specified offset from the first ID register. 13410a83cb9SPrem Mallappa * These value indicate an ARM implementation of MMU600 p1 13510a83cb9SPrem Mallappa */ 13610a83cb9SPrem Mallappa static const uint8_t smmuv3_ids[] = { 13710a83cb9SPrem Mallappa 0x04, 0, 0, 0, 0x84, 0xB4, 0xF0, 0x10, 0x0D, 0xF0, 0x05, 0xB1 13810a83cb9SPrem Mallappa }; 13910a83cb9SPrem Mallappa return smmuv3_ids[regoffset / 4]; 14010a83cb9SPrem Mallappa } 14110a83cb9SPrem Mallappa 1426a736033SEric Auger static inline bool smmuv3_eventq_irq_enabled(SMMUv3State *s) 1436a736033SEric Auger { 1446a736033SEric Auger return FIELD_EX32(s->irq_ctrl, IRQ_CTRL, EVENTQ_IRQEN); 1456a736033SEric Auger } 1466a736033SEric Auger 1476a736033SEric Auger static inline bool smmuv3_gerror_irq_enabled(SMMUv3State *s) 1486a736033SEric Auger { 1496a736033SEric Auger return FIELD_EX32(s->irq_ctrl, IRQ_CTRL, GERROR_IRQEN); 1506a736033SEric Auger } 1516a736033SEric Auger 1526a736033SEric Auger /* public until callers get introduced */ 1536a736033SEric Auger void smmuv3_trigger_irq(SMMUv3State *s, SMMUIrq irq, uint32_t gerror_mask); 1546a736033SEric Auger void smmuv3_write_gerrorn(SMMUv3State *s, uint32_t gerrorn); 1556a736033SEric Auger 156*dadd1a08SEric Auger /* Queue Handling */ 157*dadd1a08SEric Auger 158*dadd1a08SEric Auger #define Q_BASE(q) ((q)->base & SMMU_BASE_ADDR_MASK) 159*dadd1a08SEric Auger #define WRAP_MASK(q) (1 << (q)->log2size) 160*dadd1a08SEric Auger #define INDEX_MASK(q) (((1 << (q)->log2size)) - 1) 161*dadd1a08SEric Auger #define WRAP_INDEX_MASK(q) ((1 << ((q)->log2size + 1)) - 1) 162*dadd1a08SEric Auger 163*dadd1a08SEric Auger #define Q_CONS(q) ((q)->cons & INDEX_MASK(q)) 164*dadd1a08SEric Auger #define Q_PROD(q) ((q)->prod & INDEX_MASK(q)) 165*dadd1a08SEric Auger 166*dadd1a08SEric Auger #define Q_CONS_ENTRY(q) (Q_BASE(q) + (q)->entry_size * Q_CONS(q)) 167*dadd1a08SEric Auger #define Q_PROD_ENTRY(q) (Q_BASE(q) + (q)->entry_size * Q_PROD(q)) 168*dadd1a08SEric Auger 169*dadd1a08SEric Auger #define Q_CONS_WRAP(q) (((q)->cons & WRAP_MASK(q)) >> (q)->log2size) 170*dadd1a08SEric Auger #define Q_PROD_WRAP(q) (((q)->prod & WRAP_MASK(q)) >> (q)->log2size) 171*dadd1a08SEric Auger 172*dadd1a08SEric Auger static inline bool smmuv3_q_full(SMMUQueue *q) 173*dadd1a08SEric Auger { 174*dadd1a08SEric Auger return ((q->cons ^ q->prod) & WRAP_INDEX_MASK(q)) == WRAP_MASK(q); 175*dadd1a08SEric Auger } 176*dadd1a08SEric Auger 177*dadd1a08SEric Auger static inline bool smmuv3_q_empty(SMMUQueue *q) 178*dadd1a08SEric Auger { 179*dadd1a08SEric Auger return (q->cons & WRAP_INDEX_MASK(q)) == (q->prod & WRAP_INDEX_MASK(q)); 180*dadd1a08SEric Auger } 181*dadd1a08SEric Auger 182*dadd1a08SEric Auger static inline void queue_prod_incr(SMMUQueue *q) 183*dadd1a08SEric Auger { 184*dadd1a08SEric Auger q->prod = (q->prod + 1) & WRAP_INDEX_MASK(q); 185*dadd1a08SEric Auger } 186*dadd1a08SEric Auger 187*dadd1a08SEric Auger static inline void queue_cons_incr(SMMUQueue *q) 188*dadd1a08SEric Auger { 189*dadd1a08SEric Auger /* 190*dadd1a08SEric Auger * We have to use deposit for the CONS registers to preserve 191*dadd1a08SEric Auger * the ERR field in the high bits. 192*dadd1a08SEric Auger */ 193*dadd1a08SEric Auger q->cons = deposit32(q->cons, 0, q->log2size + 1, q->cons + 1); 194*dadd1a08SEric Auger } 195*dadd1a08SEric Auger 196*dadd1a08SEric Auger static inline bool smmuv3_cmdq_enabled(SMMUv3State *s) 197*dadd1a08SEric Auger { 198*dadd1a08SEric Auger return FIELD_EX32(s->cr[0], CR0, CMDQEN); 199*dadd1a08SEric Auger } 200*dadd1a08SEric Auger 201*dadd1a08SEric Auger static inline bool smmuv3_eventq_enabled(SMMUv3State *s) 202*dadd1a08SEric Auger { 203*dadd1a08SEric Auger return FIELD_EX32(s->cr[0], CR0, EVENTQEN); 204*dadd1a08SEric Auger } 205*dadd1a08SEric Auger 206*dadd1a08SEric Auger static inline void smmu_write_cmdq_err(SMMUv3State *s, uint32_t err_type) 207*dadd1a08SEric Auger { 208*dadd1a08SEric Auger s->cmdq.cons = FIELD_DP32(s->cmdq.cons, CMDQ_CONS, ERR, err_type); 209*dadd1a08SEric Auger } 210*dadd1a08SEric Auger 211*dadd1a08SEric Auger void smmuv3_write_eventq(SMMUv3State *s, Evt *evt); 212*dadd1a08SEric Auger 213*dadd1a08SEric Auger /* Commands */ 214*dadd1a08SEric Auger 215*dadd1a08SEric Auger typedef enum SMMUCommandType { 216*dadd1a08SEric Auger SMMU_CMD_NONE = 0x00, 217*dadd1a08SEric Auger SMMU_CMD_PREFETCH_CONFIG , 218*dadd1a08SEric Auger SMMU_CMD_PREFETCH_ADDR, 219*dadd1a08SEric Auger SMMU_CMD_CFGI_STE, 220*dadd1a08SEric Auger SMMU_CMD_CFGI_STE_RANGE, 221*dadd1a08SEric Auger SMMU_CMD_CFGI_CD, 222*dadd1a08SEric Auger SMMU_CMD_CFGI_CD_ALL, 223*dadd1a08SEric Auger SMMU_CMD_CFGI_ALL, 224*dadd1a08SEric Auger SMMU_CMD_TLBI_NH_ALL = 0x10, 225*dadd1a08SEric Auger SMMU_CMD_TLBI_NH_ASID, 226*dadd1a08SEric Auger SMMU_CMD_TLBI_NH_VA, 227*dadd1a08SEric Auger SMMU_CMD_TLBI_NH_VAA, 228*dadd1a08SEric Auger SMMU_CMD_TLBI_EL3_ALL = 0x18, 229*dadd1a08SEric Auger SMMU_CMD_TLBI_EL3_VA = 0x1a, 230*dadd1a08SEric Auger SMMU_CMD_TLBI_EL2_ALL = 0x20, 231*dadd1a08SEric Auger SMMU_CMD_TLBI_EL2_ASID, 232*dadd1a08SEric Auger SMMU_CMD_TLBI_EL2_VA, 233*dadd1a08SEric Auger SMMU_CMD_TLBI_EL2_VAA, 234*dadd1a08SEric Auger SMMU_CMD_TLBI_S12_VMALL = 0x28, 235*dadd1a08SEric Auger SMMU_CMD_TLBI_S2_IPA = 0x2a, 236*dadd1a08SEric Auger SMMU_CMD_TLBI_NSNH_ALL = 0x30, 237*dadd1a08SEric Auger SMMU_CMD_ATC_INV = 0x40, 238*dadd1a08SEric Auger SMMU_CMD_PRI_RESP, 239*dadd1a08SEric Auger SMMU_CMD_RESUME = 0x44, 240*dadd1a08SEric Auger SMMU_CMD_STALL_TERM, 241*dadd1a08SEric Auger SMMU_CMD_SYNC, 242*dadd1a08SEric Auger } SMMUCommandType; 243*dadd1a08SEric Auger 244*dadd1a08SEric Auger static const char *cmd_stringify[] = { 245*dadd1a08SEric Auger [SMMU_CMD_PREFETCH_CONFIG] = "SMMU_CMD_PREFETCH_CONFIG", 246*dadd1a08SEric Auger [SMMU_CMD_PREFETCH_ADDR] = "SMMU_CMD_PREFETCH_ADDR", 247*dadd1a08SEric Auger [SMMU_CMD_CFGI_STE] = "SMMU_CMD_CFGI_STE", 248*dadd1a08SEric Auger [SMMU_CMD_CFGI_STE_RANGE] = "SMMU_CMD_CFGI_STE_RANGE", 249*dadd1a08SEric Auger [SMMU_CMD_CFGI_CD] = "SMMU_CMD_CFGI_CD", 250*dadd1a08SEric Auger [SMMU_CMD_CFGI_CD_ALL] = "SMMU_CMD_CFGI_CD_ALL", 251*dadd1a08SEric Auger [SMMU_CMD_CFGI_ALL] = "SMMU_CMD_CFGI_ALL", 252*dadd1a08SEric Auger [SMMU_CMD_TLBI_NH_ALL] = "SMMU_CMD_TLBI_NH_ALL", 253*dadd1a08SEric Auger [SMMU_CMD_TLBI_NH_ASID] = "SMMU_CMD_TLBI_NH_ASID", 254*dadd1a08SEric Auger [SMMU_CMD_TLBI_NH_VA] = "SMMU_CMD_TLBI_NH_VA", 255*dadd1a08SEric Auger [SMMU_CMD_TLBI_NH_VAA] = "SMMU_CMD_TLBI_NH_VAA", 256*dadd1a08SEric Auger [SMMU_CMD_TLBI_EL3_ALL] = "SMMU_CMD_TLBI_EL3_ALL", 257*dadd1a08SEric Auger [SMMU_CMD_TLBI_EL3_VA] = "SMMU_CMD_TLBI_EL3_VA", 258*dadd1a08SEric Auger [SMMU_CMD_TLBI_EL2_ALL] = "SMMU_CMD_TLBI_EL2_ALL", 259*dadd1a08SEric Auger [SMMU_CMD_TLBI_EL2_ASID] = "SMMU_CMD_TLBI_EL2_ASID", 260*dadd1a08SEric Auger [SMMU_CMD_TLBI_EL2_VA] = "SMMU_CMD_TLBI_EL2_VA", 261*dadd1a08SEric Auger [SMMU_CMD_TLBI_EL2_VAA] = "SMMU_CMD_TLBI_EL2_VAA", 262*dadd1a08SEric Auger [SMMU_CMD_TLBI_S12_VMALL] = "SMMU_CMD_TLBI_S12_VMALL", 263*dadd1a08SEric Auger [SMMU_CMD_TLBI_S2_IPA] = "SMMU_CMD_TLBI_S2_IPA", 264*dadd1a08SEric Auger [SMMU_CMD_TLBI_NSNH_ALL] = "SMMU_CMD_TLBI_NSNH_ALL", 265*dadd1a08SEric Auger [SMMU_CMD_ATC_INV] = "SMMU_CMD_ATC_INV", 266*dadd1a08SEric Auger [SMMU_CMD_PRI_RESP] = "SMMU_CMD_PRI_RESP", 267*dadd1a08SEric Auger [SMMU_CMD_RESUME] = "SMMU_CMD_RESUME", 268*dadd1a08SEric Auger [SMMU_CMD_STALL_TERM] = "SMMU_CMD_STALL_TERM", 269*dadd1a08SEric Auger [SMMU_CMD_SYNC] = "SMMU_CMD_SYNC", 270*dadd1a08SEric Auger }; 271*dadd1a08SEric Auger 272*dadd1a08SEric Auger static inline const char *smmu_cmd_string(SMMUCommandType type) 273*dadd1a08SEric Auger { 274*dadd1a08SEric Auger if (type > SMMU_CMD_NONE && type < ARRAY_SIZE(cmd_stringify)) { 275*dadd1a08SEric Auger return cmd_stringify[type] ? cmd_stringify[type] : "UNKNOWN"; 276*dadd1a08SEric Auger } else { 277*dadd1a08SEric Auger return "INVALID"; 278*dadd1a08SEric Auger } 279*dadd1a08SEric Auger } 280*dadd1a08SEric Auger 281*dadd1a08SEric Auger /* CMDQ fields */ 282*dadd1a08SEric Auger 283*dadd1a08SEric Auger typedef enum { 284*dadd1a08SEric Auger SMMU_CERROR_NONE = 0, 285*dadd1a08SEric Auger SMMU_CERROR_ILL, 286*dadd1a08SEric Auger SMMU_CERROR_ABT, 287*dadd1a08SEric Auger SMMU_CERROR_ATC_INV_SYNC, 288*dadd1a08SEric Auger } SMMUCmdError; 289*dadd1a08SEric Auger 290*dadd1a08SEric Auger enum { /* Command completion notification */ 291*dadd1a08SEric Auger CMD_SYNC_SIG_NONE, 292*dadd1a08SEric Auger CMD_SYNC_SIG_IRQ, 293*dadd1a08SEric Auger CMD_SYNC_SIG_SEV, 294*dadd1a08SEric Auger }; 295*dadd1a08SEric Auger 296*dadd1a08SEric Auger #define CMD_TYPE(x) extract32((x)->word[0], 0 , 8) 297*dadd1a08SEric Auger #define CMD_SSEC(x) extract32((x)->word[0], 10, 1) 298*dadd1a08SEric Auger #define CMD_SSV(x) extract32((x)->word[0], 11, 1) 299*dadd1a08SEric Auger #define CMD_RESUME_AC(x) extract32((x)->word[0], 12, 1) 300*dadd1a08SEric Auger #define CMD_RESUME_AB(x) extract32((x)->word[0], 13, 1) 301*dadd1a08SEric Auger #define CMD_SYNC_CS(x) extract32((x)->word[0], 12, 2) 302*dadd1a08SEric Auger #define CMD_SSID(x) extract32((x)->word[0], 12, 20) 303*dadd1a08SEric Auger #define CMD_SID(x) ((x)->word[1]) 304*dadd1a08SEric Auger #define CMD_VMID(x) extract32((x)->word[1], 0 , 16) 305*dadd1a08SEric Auger #define CMD_ASID(x) extract32((x)->word[1], 16, 16) 306*dadd1a08SEric Auger #define CMD_RESUME_STAG(x) extract32((x)->word[2], 0 , 16) 307*dadd1a08SEric Auger #define CMD_RESP(x) extract32((x)->word[2], 11, 2) 308*dadd1a08SEric Auger #define CMD_LEAF(x) extract32((x)->word[2], 0 , 1) 309*dadd1a08SEric Auger #define CMD_STE_RANGE(x) extract32((x)->word[2], 0 , 5) 310*dadd1a08SEric Auger #define CMD_ADDR(x) ({ \ 311*dadd1a08SEric Auger uint64_t high = (uint64_t)(x)->word[3]; \ 312*dadd1a08SEric Auger uint64_t low = extract32((x)->word[2], 12, 20); \ 313*dadd1a08SEric Auger uint64_t addr = high << 32 | (low << 12); \ 314*dadd1a08SEric Auger addr; \ 315*dadd1a08SEric Auger }) 316*dadd1a08SEric Auger 317*dadd1a08SEric Auger int smmuv3_cmdq_consume(SMMUv3State *s); 318*dadd1a08SEric Auger 31910a83cb9SPrem Mallappa #endif 320