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 64*fae4be38SEric Auger #define SMMU_CR0_RESERVED 0xFFFFFC20 65*fae4be38SEric Auger 6610a83cb9SPrem Mallappa REG32(CR0ACK, 0x24) 6710a83cb9SPrem Mallappa REG32(CR1, 0x28) 6810a83cb9SPrem Mallappa REG32(CR2, 0x2c) 6910a83cb9SPrem Mallappa REG32(STATUSR, 0x40) 7010a83cb9SPrem Mallappa REG32(IRQ_CTRL, 0x50) 7110a83cb9SPrem Mallappa FIELD(IRQ_CTRL, GERROR_IRQEN, 0, 1) 7210a83cb9SPrem Mallappa FIELD(IRQ_CTRL, PRI_IRQEN, 1, 1) 7310a83cb9SPrem Mallappa FIELD(IRQ_CTRL, EVENTQ_IRQEN, 2, 1) 7410a83cb9SPrem Mallappa 7510a83cb9SPrem Mallappa REG32(IRQ_CTRL_ACK, 0x54) 7610a83cb9SPrem Mallappa REG32(GERROR, 0x60) 7710a83cb9SPrem Mallappa FIELD(GERROR, CMDQ_ERR, 0, 1) 7810a83cb9SPrem Mallappa FIELD(GERROR, EVENTQ_ABT_ERR, 2, 1) 7910a83cb9SPrem Mallappa FIELD(GERROR, PRIQ_ABT_ERR, 3, 1) 8010a83cb9SPrem Mallappa FIELD(GERROR, MSI_CMDQ_ABT_ERR, 4, 1) 8110a83cb9SPrem Mallappa FIELD(GERROR, MSI_EVENTQ_ABT_ERR, 5, 1) 8210a83cb9SPrem Mallappa FIELD(GERROR, MSI_PRIQ_ABT_ERR, 6, 1) 8310a83cb9SPrem Mallappa FIELD(GERROR, MSI_GERROR_ABT_ERR, 7, 1) 8410a83cb9SPrem Mallappa FIELD(GERROR, MSI_SFM_ERR, 8, 1) 8510a83cb9SPrem Mallappa 8610a83cb9SPrem Mallappa REG32(GERRORN, 0x64) 8710a83cb9SPrem Mallappa 8810a83cb9SPrem Mallappa #define A_GERROR_IRQ_CFG0 0x68 /* 64b */ 8910a83cb9SPrem Mallappa REG32(GERROR_IRQ_CFG1, 0x70) 9010a83cb9SPrem Mallappa REG32(GERROR_IRQ_CFG2, 0x74) 9110a83cb9SPrem Mallappa 9210a83cb9SPrem Mallappa #define A_STRTAB_BASE 0x80 /* 64b */ 9310a83cb9SPrem Mallappa 9410a83cb9SPrem Mallappa #define SMMU_BASE_ADDR_MASK 0xffffffffffe0 9510a83cb9SPrem Mallappa 9610a83cb9SPrem Mallappa REG32(STRTAB_BASE_CFG, 0x88) 9710a83cb9SPrem Mallappa FIELD(STRTAB_BASE_CFG, FMT, 16, 2) 9810a83cb9SPrem Mallappa FIELD(STRTAB_BASE_CFG, SPLIT, 6 , 5) 9910a83cb9SPrem Mallappa FIELD(STRTAB_BASE_CFG, LOG2SIZE, 0 , 6) 10010a83cb9SPrem Mallappa 10110a83cb9SPrem Mallappa #define A_CMDQ_BASE 0x90 /* 64b */ 10210a83cb9SPrem Mallappa REG32(CMDQ_PROD, 0x98) 10310a83cb9SPrem Mallappa REG32(CMDQ_CONS, 0x9c) 10410a83cb9SPrem Mallappa FIELD(CMDQ_CONS, ERR, 24, 7) 10510a83cb9SPrem Mallappa 10610a83cb9SPrem Mallappa #define A_EVENTQ_BASE 0xa0 /* 64b */ 10710a83cb9SPrem Mallappa REG32(EVENTQ_PROD, 0xa8) 10810a83cb9SPrem Mallappa REG32(EVENTQ_CONS, 0xac) 10910a83cb9SPrem Mallappa 11010a83cb9SPrem Mallappa #define A_EVENTQ_IRQ_CFG0 0xb0 /* 64b */ 11110a83cb9SPrem Mallappa REG32(EVENTQ_IRQ_CFG1, 0xb8) 11210a83cb9SPrem Mallappa REG32(EVENTQ_IRQ_CFG2, 0xbc) 11310a83cb9SPrem Mallappa 11410a83cb9SPrem Mallappa #define A_IDREGS 0xfd0 11510a83cb9SPrem Mallappa 11610a83cb9SPrem Mallappa static inline int smmu_enabled(SMMUv3State *s) 11710a83cb9SPrem Mallappa { 11810a83cb9SPrem Mallappa return FIELD_EX32(s->cr[0], CR0, SMMU_ENABLE); 11910a83cb9SPrem Mallappa } 12010a83cb9SPrem Mallappa 12110a83cb9SPrem Mallappa /* Command Queue Entry */ 12210a83cb9SPrem Mallappa typedef struct Cmd { 12310a83cb9SPrem Mallappa uint32_t word[4]; 12410a83cb9SPrem Mallappa } Cmd; 12510a83cb9SPrem Mallappa 12610a83cb9SPrem Mallappa /* Event Queue Entry */ 12710a83cb9SPrem Mallappa typedef struct Evt { 12810a83cb9SPrem Mallappa uint32_t word[8]; 12910a83cb9SPrem Mallappa } Evt; 13010a83cb9SPrem Mallappa 13110a83cb9SPrem Mallappa static inline uint32_t smmuv3_idreg(int regoffset) 13210a83cb9SPrem Mallappa { 13310a83cb9SPrem Mallappa /* 13410a83cb9SPrem Mallappa * Return the value of the Primecell/Corelink ID registers at the 13510a83cb9SPrem Mallappa * specified offset from the first ID register. 13610a83cb9SPrem Mallappa * These value indicate an ARM implementation of MMU600 p1 13710a83cb9SPrem Mallappa */ 13810a83cb9SPrem Mallappa static const uint8_t smmuv3_ids[] = { 13910a83cb9SPrem Mallappa 0x04, 0, 0, 0, 0x84, 0xB4, 0xF0, 0x10, 0x0D, 0xF0, 0x05, 0xB1 14010a83cb9SPrem Mallappa }; 14110a83cb9SPrem Mallappa return smmuv3_ids[regoffset / 4]; 14210a83cb9SPrem Mallappa } 14310a83cb9SPrem Mallappa 1446a736033SEric Auger static inline bool smmuv3_eventq_irq_enabled(SMMUv3State *s) 1456a736033SEric Auger { 1466a736033SEric Auger return FIELD_EX32(s->irq_ctrl, IRQ_CTRL, EVENTQ_IRQEN); 1476a736033SEric Auger } 1486a736033SEric Auger 1496a736033SEric Auger static inline bool smmuv3_gerror_irq_enabled(SMMUv3State *s) 1506a736033SEric Auger { 1516a736033SEric Auger return FIELD_EX32(s->irq_ctrl, IRQ_CTRL, GERROR_IRQEN); 1526a736033SEric Auger } 1536a736033SEric Auger 154dadd1a08SEric Auger /* Queue Handling */ 155dadd1a08SEric Auger 156dadd1a08SEric Auger #define Q_BASE(q) ((q)->base & SMMU_BASE_ADDR_MASK) 157dadd1a08SEric Auger #define WRAP_MASK(q) (1 << (q)->log2size) 158dadd1a08SEric Auger #define INDEX_MASK(q) (((1 << (q)->log2size)) - 1) 159dadd1a08SEric Auger #define WRAP_INDEX_MASK(q) ((1 << ((q)->log2size + 1)) - 1) 160dadd1a08SEric Auger 161dadd1a08SEric Auger #define Q_CONS(q) ((q)->cons & INDEX_MASK(q)) 162dadd1a08SEric Auger #define Q_PROD(q) ((q)->prod & INDEX_MASK(q)) 163dadd1a08SEric Auger 164dadd1a08SEric Auger #define Q_CONS_ENTRY(q) (Q_BASE(q) + (q)->entry_size * Q_CONS(q)) 165dadd1a08SEric Auger #define Q_PROD_ENTRY(q) (Q_BASE(q) + (q)->entry_size * Q_PROD(q)) 166dadd1a08SEric Auger 167dadd1a08SEric Auger #define Q_CONS_WRAP(q) (((q)->cons & WRAP_MASK(q)) >> (q)->log2size) 168dadd1a08SEric Auger #define Q_PROD_WRAP(q) (((q)->prod & WRAP_MASK(q)) >> (q)->log2size) 169dadd1a08SEric Auger 170dadd1a08SEric Auger static inline bool smmuv3_q_full(SMMUQueue *q) 171dadd1a08SEric Auger { 172dadd1a08SEric Auger return ((q->cons ^ q->prod) & WRAP_INDEX_MASK(q)) == WRAP_MASK(q); 173dadd1a08SEric Auger } 174dadd1a08SEric Auger 175dadd1a08SEric Auger static inline bool smmuv3_q_empty(SMMUQueue *q) 176dadd1a08SEric Auger { 177dadd1a08SEric Auger return (q->cons & WRAP_INDEX_MASK(q)) == (q->prod & WRAP_INDEX_MASK(q)); 178dadd1a08SEric Auger } 179dadd1a08SEric Auger 180dadd1a08SEric Auger static inline void queue_prod_incr(SMMUQueue *q) 181dadd1a08SEric Auger { 182dadd1a08SEric Auger q->prod = (q->prod + 1) & WRAP_INDEX_MASK(q); 183dadd1a08SEric Auger } 184dadd1a08SEric Auger 185dadd1a08SEric Auger static inline void queue_cons_incr(SMMUQueue *q) 186dadd1a08SEric Auger { 187dadd1a08SEric Auger /* 188dadd1a08SEric Auger * We have to use deposit for the CONS registers to preserve 189dadd1a08SEric Auger * the ERR field in the high bits. 190dadd1a08SEric Auger */ 191dadd1a08SEric Auger q->cons = deposit32(q->cons, 0, q->log2size + 1, q->cons + 1); 192dadd1a08SEric Auger } 193dadd1a08SEric Auger 194dadd1a08SEric Auger static inline bool smmuv3_cmdq_enabled(SMMUv3State *s) 195dadd1a08SEric Auger { 196dadd1a08SEric Auger return FIELD_EX32(s->cr[0], CR0, CMDQEN); 197dadd1a08SEric Auger } 198dadd1a08SEric Auger 199dadd1a08SEric Auger static inline bool smmuv3_eventq_enabled(SMMUv3State *s) 200dadd1a08SEric Auger { 201dadd1a08SEric Auger return FIELD_EX32(s->cr[0], CR0, EVENTQEN); 202dadd1a08SEric Auger } 203dadd1a08SEric Auger 204dadd1a08SEric Auger static inline void smmu_write_cmdq_err(SMMUv3State *s, uint32_t err_type) 205dadd1a08SEric Auger { 206dadd1a08SEric Auger s->cmdq.cons = FIELD_DP32(s->cmdq.cons, CMDQ_CONS, ERR, err_type); 207dadd1a08SEric Auger } 208dadd1a08SEric Auger 209dadd1a08SEric Auger void smmuv3_write_eventq(SMMUv3State *s, Evt *evt); 210dadd1a08SEric Auger 211dadd1a08SEric Auger /* Commands */ 212dadd1a08SEric Auger 213dadd1a08SEric Auger typedef enum SMMUCommandType { 214dadd1a08SEric Auger SMMU_CMD_NONE = 0x00, 215dadd1a08SEric Auger SMMU_CMD_PREFETCH_CONFIG , 216dadd1a08SEric Auger SMMU_CMD_PREFETCH_ADDR, 217dadd1a08SEric Auger SMMU_CMD_CFGI_STE, 218dadd1a08SEric Auger SMMU_CMD_CFGI_STE_RANGE, 219dadd1a08SEric Auger SMMU_CMD_CFGI_CD, 220dadd1a08SEric Auger SMMU_CMD_CFGI_CD_ALL, 221dadd1a08SEric Auger SMMU_CMD_CFGI_ALL, 222dadd1a08SEric Auger SMMU_CMD_TLBI_NH_ALL = 0x10, 223dadd1a08SEric Auger SMMU_CMD_TLBI_NH_ASID, 224dadd1a08SEric Auger SMMU_CMD_TLBI_NH_VA, 225dadd1a08SEric Auger SMMU_CMD_TLBI_NH_VAA, 226dadd1a08SEric Auger SMMU_CMD_TLBI_EL3_ALL = 0x18, 227dadd1a08SEric Auger SMMU_CMD_TLBI_EL3_VA = 0x1a, 228dadd1a08SEric Auger SMMU_CMD_TLBI_EL2_ALL = 0x20, 229dadd1a08SEric Auger SMMU_CMD_TLBI_EL2_ASID, 230dadd1a08SEric Auger SMMU_CMD_TLBI_EL2_VA, 231dadd1a08SEric Auger SMMU_CMD_TLBI_EL2_VAA, 232dadd1a08SEric Auger SMMU_CMD_TLBI_S12_VMALL = 0x28, 233dadd1a08SEric Auger SMMU_CMD_TLBI_S2_IPA = 0x2a, 234dadd1a08SEric Auger SMMU_CMD_TLBI_NSNH_ALL = 0x30, 235dadd1a08SEric Auger SMMU_CMD_ATC_INV = 0x40, 236dadd1a08SEric Auger SMMU_CMD_PRI_RESP, 237dadd1a08SEric Auger SMMU_CMD_RESUME = 0x44, 238dadd1a08SEric Auger SMMU_CMD_STALL_TERM, 239dadd1a08SEric Auger SMMU_CMD_SYNC, 240dadd1a08SEric Auger } SMMUCommandType; 241dadd1a08SEric Auger 242dadd1a08SEric Auger static const char *cmd_stringify[] = { 243dadd1a08SEric Auger [SMMU_CMD_PREFETCH_CONFIG] = "SMMU_CMD_PREFETCH_CONFIG", 244dadd1a08SEric Auger [SMMU_CMD_PREFETCH_ADDR] = "SMMU_CMD_PREFETCH_ADDR", 245dadd1a08SEric Auger [SMMU_CMD_CFGI_STE] = "SMMU_CMD_CFGI_STE", 246dadd1a08SEric Auger [SMMU_CMD_CFGI_STE_RANGE] = "SMMU_CMD_CFGI_STE_RANGE", 247dadd1a08SEric Auger [SMMU_CMD_CFGI_CD] = "SMMU_CMD_CFGI_CD", 248dadd1a08SEric Auger [SMMU_CMD_CFGI_CD_ALL] = "SMMU_CMD_CFGI_CD_ALL", 249dadd1a08SEric Auger [SMMU_CMD_CFGI_ALL] = "SMMU_CMD_CFGI_ALL", 250dadd1a08SEric Auger [SMMU_CMD_TLBI_NH_ALL] = "SMMU_CMD_TLBI_NH_ALL", 251dadd1a08SEric Auger [SMMU_CMD_TLBI_NH_ASID] = "SMMU_CMD_TLBI_NH_ASID", 252dadd1a08SEric Auger [SMMU_CMD_TLBI_NH_VA] = "SMMU_CMD_TLBI_NH_VA", 253dadd1a08SEric Auger [SMMU_CMD_TLBI_NH_VAA] = "SMMU_CMD_TLBI_NH_VAA", 254dadd1a08SEric Auger [SMMU_CMD_TLBI_EL3_ALL] = "SMMU_CMD_TLBI_EL3_ALL", 255dadd1a08SEric Auger [SMMU_CMD_TLBI_EL3_VA] = "SMMU_CMD_TLBI_EL3_VA", 256dadd1a08SEric Auger [SMMU_CMD_TLBI_EL2_ALL] = "SMMU_CMD_TLBI_EL2_ALL", 257dadd1a08SEric Auger [SMMU_CMD_TLBI_EL2_ASID] = "SMMU_CMD_TLBI_EL2_ASID", 258dadd1a08SEric Auger [SMMU_CMD_TLBI_EL2_VA] = "SMMU_CMD_TLBI_EL2_VA", 259dadd1a08SEric Auger [SMMU_CMD_TLBI_EL2_VAA] = "SMMU_CMD_TLBI_EL2_VAA", 260dadd1a08SEric Auger [SMMU_CMD_TLBI_S12_VMALL] = "SMMU_CMD_TLBI_S12_VMALL", 261dadd1a08SEric Auger [SMMU_CMD_TLBI_S2_IPA] = "SMMU_CMD_TLBI_S2_IPA", 262dadd1a08SEric Auger [SMMU_CMD_TLBI_NSNH_ALL] = "SMMU_CMD_TLBI_NSNH_ALL", 263dadd1a08SEric Auger [SMMU_CMD_ATC_INV] = "SMMU_CMD_ATC_INV", 264dadd1a08SEric Auger [SMMU_CMD_PRI_RESP] = "SMMU_CMD_PRI_RESP", 265dadd1a08SEric Auger [SMMU_CMD_RESUME] = "SMMU_CMD_RESUME", 266dadd1a08SEric Auger [SMMU_CMD_STALL_TERM] = "SMMU_CMD_STALL_TERM", 267dadd1a08SEric Auger [SMMU_CMD_SYNC] = "SMMU_CMD_SYNC", 268dadd1a08SEric Auger }; 269dadd1a08SEric Auger 270dadd1a08SEric Auger static inline const char *smmu_cmd_string(SMMUCommandType type) 271dadd1a08SEric Auger { 272dadd1a08SEric Auger if (type > SMMU_CMD_NONE && type < ARRAY_SIZE(cmd_stringify)) { 273dadd1a08SEric Auger return cmd_stringify[type] ? cmd_stringify[type] : "UNKNOWN"; 274dadd1a08SEric Auger } else { 275dadd1a08SEric Auger return "INVALID"; 276dadd1a08SEric Auger } 277dadd1a08SEric Auger } 278dadd1a08SEric Auger 279dadd1a08SEric Auger /* CMDQ fields */ 280dadd1a08SEric Auger 281dadd1a08SEric Auger typedef enum { 282dadd1a08SEric Auger SMMU_CERROR_NONE = 0, 283dadd1a08SEric Auger SMMU_CERROR_ILL, 284dadd1a08SEric Auger SMMU_CERROR_ABT, 285dadd1a08SEric Auger SMMU_CERROR_ATC_INV_SYNC, 286dadd1a08SEric Auger } SMMUCmdError; 287dadd1a08SEric Auger 288dadd1a08SEric Auger enum { /* Command completion notification */ 289dadd1a08SEric Auger CMD_SYNC_SIG_NONE, 290dadd1a08SEric Auger CMD_SYNC_SIG_IRQ, 291dadd1a08SEric Auger CMD_SYNC_SIG_SEV, 292dadd1a08SEric Auger }; 293dadd1a08SEric Auger 294dadd1a08SEric Auger #define CMD_TYPE(x) extract32((x)->word[0], 0 , 8) 295dadd1a08SEric Auger #define CMD_SSEC(x) extract32((x)->word[0], 10, 1) 296dadd1a08SEric Auger #define CMD_SSV(x) extract32((x)->word[0], 11, 1) 297dadd1a08SEric Auger #define CMD_RESUME_AC(x) extract32((x)->word[0], 12, 1) 298dadd1a08SEric Auger #define CMD_RESUME_AB(x) extract32((x)->word[0], 13, 1) 299dadd1a08SEric Auger #define CMD_SYNC_CS(x) extract32((x)->word[0], 12, 2) 300dadd1a08SEric Auger #define CMD_SSID(x) extract32((x)->word[0], 12, 20) 301dadd1a08SEric Auger #define CMD_SID(x) ((x)->word[1]) 302dadd1a08SEric Auger #define CMD_VMID(x) extract32((x)->word[1], 0 , 16) 303dadd1a08SEric Auger #define CMD_ASID(x) extract32((x)->word[1], 16, 16) 304dadd1a08SEric Auger #define CMD_RESUME_STAG(x) extract32((x)->word[2], 0 , 16) 305dadd1a08SEric Auger #define CMD_RESP(x) extract32((x)->word[2], 11, 2) 306dadd1a08SEric Auger #define CMD_LEAF(x) extract32((x)->word[2], 0 , 1) 307dadd1a08SEric Auger #define CMD_STE_RANGE(x) extract32((x)->word[2], 0 , 5) 308dadd1a08SEric Auger #define CMD_ADDR(x) ({ \ 309dadd1a08SEric Auger uint64_t high = (uint64_t)(x)->word[3]; \ 310dadd1a08SEric Auger uint64_t low = extract32((x)->word[2], 12, 20); \ 311dadd1a08SEric Auger uint64_t addr = high << 32 | (low << 12); \ 312dadd1a08SEric Auger addr; \ 313dadd1a08SEric Auger }) 314dadd1a08SEric Auger 315*fae4be38SEric Auger #define SMMU_FEATURE_2LVL_STE (1 << 0) 316dadd1a08SEric Auger 31710a83cb9SPrem Mallappa #endif 318