xref: /qemu/hw/arm/smmuv3-internal.h (revision 6a736033d343e0e5774849fa0eef88f2582c364a)
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 
142*6a736033SEric Auger static inline bool smmuv3_eventq_irq_enabled(SMMUv3State *s)
143*6a736033SEric Auger {
144*6a736033SEric Auger     return FIELD_EX32(s->irq_ctrl, IRQ_CTRL, EVENTQ_IRQEN);
145*6a736033SEric Auger }
146*6a736033SEric Auger 
147*6a736033SEric Auger static inline bool smmuv3_gerror_irq_enabled(SMMUv3State *s)
148*6a736033SEric Auger {
149*6a736033SEric Auger     return FIELD_EX32(s->irq_ctrl, IRQ_CTRL, GERROR_IRQEN);
150*6a736033SEric Auger }
151*6a736033SEric Auger 
152*6a736033SEric Auger /* public until callers get introduced */
153*6a736033SEric Auger void smmuv3_trigger_irq(SMMUv3State *s, SMMUIrq irq, uint32_t gerror_mask);
154*6a736033SEric Auger void smmuv3_write_gerrorn(SMMUv3State *s, uint32_t gerrorn);
155*6a736033SEric Auger 
15610a83cb9SPrem Mallappa #endif
157