xref: /qemu/hw/arm/smmuv3-internal.h (revision fae4be38b35dcfae48494c023454e8988c15b69a)
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