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