1/* 2 * Copyright (c) 2013, 2018-2019 ARM Limited 3 * All rights reserved 4 * 5 * The license below extends only to copyright in the software and shall 6 * not be construed as granting a license to any other intellectual 7 * property including but not limited to intellectual property relating 8 * to a hardware implementation of the functionality of the software 9 * licensed hereunder. You may use the software subject to the license 10 * terms below provided that you ensure that this notice is replicated 11 * unmodified and in its entirety in all distributions of the software, 12 * modified or unmodified, in source code or in binary form. 13 * 14 * Redistribution and use in source and binary forms, with or without 15 * modification, are permitted provided that the following conditions are 16 * met: redistributions of source code must retain the above copyright 17 * notice, this list of conditions and the following disclaimer; 18 * redistributions in binary form must reproduce the above copyright 19 * notice, this list of conditions and the following disclaimer in the 20 * documentation and/or other materials provided with the distribution; 21 * neither the name of the copyright holders nor the names of its 22 * contributors may be used to endorse or promote products derived from 23 * this software without specific prior written permission. 24 * 25 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 26 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 27 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 28 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 29 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 30 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 31 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 32 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 33 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 34 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 35 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 36 * 37 * Authors: Stan Czerniawski 38 */ 39 40#ifndef __DEV_ARM_SMMU_V3_DEFS_HH__ 41#define __DEV_ARM_SMMU_V3_DEFS_HH__ 42 43#include <stdint.h> 44 45#include "base/bitunion.hh" 46 47enum { 48 SMMU_SECURE_SZ = 0x184, // Secure regs are within page0 49 SMMU_PAGE_ZERO_SZ = 0x10000, 50 SMMU_PAGE_ONE_SZ = 0x10000, 51 SMMU_REG_SIZE = SMMU_PAGE_ONE_SZ + SMMU_PAGE_ZERO_SZ 52}; 53 54enum { 55 STE_CONFIG_ABORT = 0x0, 56 STE_CONFIG_BYPASS = 0x4, 57 STE_CONFIG_STAGE1_ONLY = 0x5, 58 STE_CONFIG_STAGE2_ONLY = 0x6, 59 STE_CONFIG_STAGE1_AND_2 = 0x7, 60}; 61 62enum { 63 STAGE1_CFG_1L = 0x0, 64 STAGE1_CFG_2L_4K = 0x1, 65 STAGE1_CFG_2L_64K = 0x2, 66}; 67 68enum { 69 ST_CFG_SPLIT_SHIFT = 6, 70 ST_CD_ADDR_SHIFT = 6, 71 CD_TTB_SHIFT = 4, 72 STE_S2TTB_SHIFT = 4, 73}; 74 75enum { 76 TRANS_GRANULE_4K = 0x0, 77 TRANS_GRANULE_64K = 0x1, 78 TRANS_GRANULE_16K = 0x2, 79 TRANS_GRANULE_INVALID = 0x3, 80}; 81 82enum { 83 ST_BASE_ADDR_MASK = 0x0000ffffffffffe0ULL, 84 ST_CFG_SIZE_MASK = 0x000000000000003fULL, 85 ST_CFG_SPLIT_MASK = 0x00000000000007c0ULL, 86 ST_CFG_FMT_MASK = 0x0000000000030000ULL, 87 ST_CFG_FMT_LINEAR = 0x0000000000000000ULL, 88 ST_CFG_FMT_2LEVEL = 0x0000000000010000ULL, 89 ST_L2_SPAN_MASK = 0x000000000000001fULL, 90 ST_L2_ADDR_MASK = 0x0000ffffffffffe0ULL, 91 92 VMT_BASE_ADDR_MASK = 0x0000ffffffffffe0ULL, 93 VMT_BASE_SIZE_MASK = 0x000000000000001fULL, 94 95 Q_BASE_ADDR_MASK = 0x0000ffffffffffe0ULL, 96 Q_BASE_SIZE_MASK = 0x000000000000001fULL, 97 98 E_BASE_ENABLE_MASK = 0x8000000000000000ULL, 99 E_BASE_ADDR_MASK = 0x0000fffffffffffcULL, 100}; 101 102union SMMURegs 103{ 104 uint8_t data[SMMU_REG_SIZE]; 105 106 struct 107 { 108 uint32_t idr0; // 0x0000 109 uint32_t idr1; // 0x0004 110 uint32_t idr2; // 0x0008 111 uint32_t idr3; // 0x000c 112 uint32_t idr4; // 0x0010 113 uint32_t idr5; // 0x0014 114 uint32_t iidr; // 0x0018 115 uint32_t aidr; // 0x001c 116 uint32_t cr0; // 0x0020 117 uint32_t cr0ack; // 0x0024 118 uint32_t cr1; // 0x0028 119 uint32_t cr2; // 0x002c 120 uint32_t _pad1; // 0x0030 121 uint32_t _pad2; // 0x0034 122 uint32_t _pad3; // 0x0038 123 uint32_t _pad4; // 0x003c 124 uint32_t statusr; // 0x0040 125 uint32_t gbpa; // 0x0044 126 uint32_t agbpa; // 0x0048 127 uint32_t _pad5; // 0x004c 128 uint32_t irq_ctrl; // 0x0050 129 uint32_t irq_ctrlack; // 0x0054 130 uint32_t _pad6; // 0x0058 131 uint32_t _pad7; // 0x005c 132 133 uint32_t gerror; // 0x0060 134 uint32_t gerrorn; // 0x0064 135 uint64_t gerror_irq_cfg0; // 0x0068, 64 bit 136 uint32_t gerror_irq_cfg1; // 0x0070 137 uint32_t gerror_irq_cfg2; // 0x0074 138 uint32_t _pad_1; // 0x0078 139 uint32_t _pad_2; // 0x007c 140 141 uint64_t strtab_base; // 0x0080, 64 bit 142 uint32_t strtab_base_cfg; // 0x0088 143 144 uint64_t cmdq_base; // 0x0090, 64 bit 145 uint32_t cmdq_prod; // 0x0098 146 uint32_t cmdq_cons; // 0x009c 147 uint64_t eventq_base; // 0x00a0, 64 bit 148 uint32_t _pad8; // 0x00a8 149 uint32_t _pad9; // 0x00ac 150 uint64_t eventq_irq_cfg0; // 0x00b0, 64 bit 151 uint32_t eventq_irq_cfg1; // 0x00b8 152 uint32_t eventq_irq_cfg2; // 0x00bc 153 uint64_t priq_base; // 0x00c0, 64 bit 154 uint32_t _pad10; // 0x00c8 155 uint32_t _pad11; // 0x00cc 156 157 uint64_t priq_irq_cfg0; // 0x00d0 158 uint32_t priq_irq_cfg1; // 0x00d8 159 uint32_t priq_irq_cfg2; // 0x00dc 160 161 uint32_t _pad12[8]; // 0x00e0 - 0x0100 162 uint32_t gatos_ctrl; // 0x0100 163 uint32_t _pad13; // 0x0104 164 uint64_t gatos_sid; // 0x0108 165 uint64_t gatos_addr; // 0x0110 166 uint64_t gatos_par; // 0x0118 167 uint32_t _pad14[24]; // 0x0120 168 uint32_t vatos_sel; // 0x0180 169 170 uint32_t _pad15[8095]; // 0x184 - 0x7ffc 171 172 uint8_t _secure_regs[SMMU_SECURE_SZ]; // 0x8000 - 0x8180 173 174 uint32_t _pad16[8095]; // 0x8184 - 0x10000 175 176 // Page 1 177 uint32_t _pad17[42]; // 0x10000 178 uint32_t eventq_prod; // 0x100A8 179 uint32_t eventq_cons; // 0x100AC 180 181 uint32_t _pad18[6]; // 0x100B0 182 uint32_t priq_prod; // 0x100C8 183 uint32_t priq_cons; // 0x100CC 184 }; 185}; 186 187struct StreamTableEntry 188{ 189 BitUnion64(DWORD0) 190 Bitfield<0> valid; 191 Bitfield<3, 1> config; 192 Bitfield<5, 4> s1fmt; 193 Bitfield<51, 6> s1ctxptr; 194 Bitfield<63, 59> s1cdmax; 195 EndBitUnion(DWORD0) 196 DWORD0 dw0; 197 198 BitUnion64(DWORD1) 199 Bitfield<1, 0> s1dss; 200 Bitfield<3, 2> s1cir; 201 Bitfield<5, 4> s1cor; 202 Bitfield<7, 6> s1csh; 203 Bitfield<8> s2hwu59; 204 Bitfield<9> s2hwu60; 205 Bitfield<10> s2hwu61; 206 Bitfield<11> s2hwu62; 207 Bitfield<12> dre; 208 Bitfield<16, 13> cont; 209 Bitfield<17> dcp; 210 Bitfield<18> ppar; 211 Bitfield<19> mev; 212 Bitfield<27> s1stalld; 213 Bitfield<29, 28> eats; 214 Bitfield<31, 30> strw; 215 Bitfield<35, 32> memattr; 216 Bitfield<36> mtcfg; 217 Bitfield<40, 37> alloccfg; 218 Bitfield<45, 44> shcfg; 219 Bitfield<47, 46> nscfg; 220 Bitfield<49, 48> privcfg; 221 Bitfield<51, 50> instcfg; 222 EndBitUnion(DWORD1) 223 DWORD1 dw1; 224 225 BitUnion64(DWORD2) 226 Bitfield<15, 0> s2vmid; 227 Bitfield<37, 32> s2t0sz; 228 Bitfield<39, 38> s2sl0; 229 Bitfield<41, 40> s2ir0; 230 Bitfield<43, 42> s2or0; 231 Bitfield<45, 44> s2sh0; 232 Bitfield<47, 46> s2tg; 233 Bitfield<50, 48> s2ps; 234 Bitfield<51> s2aa64; 235 Bitfield<52> s2endi; 236 Bitfield<53> s2affd; 237 Bitfield<54> s2ptw; 238 Bitfield<55> s2hd; 239 Bitfield<56> s2ha; 240 Bitfield<57> s2s; 241 Bitfield<58> s2r; 242 EndBitUnion(DWORD2) 243 DWORD2 dw2; 244 245 BitUnion64(DWORD3) 246 Bitfield<51, 4> s2ttb; 247 EndBitUnion(DWORD3) 248 DWORD3 dw3; 249 250 uint64_t _pad[4]; 251}; 252 253struct ContextDescriptor 254{ 255 BitUnion64(DWORD0) 256 Bitfield<5, 0> t0sz; 257 Bitfield<7, 6> tg0; 258 Bitfield<9, 8> ir0; 259 Bitfield<11, 10> or0; 260 Bitfield<13, 12> sh0; 261 Bitfield<14> epd0; 262 Bitfield<15> endi; 263 Bitfield<21, 16> t1sz; 264 Bitfield<23, 22> tg1; 265 Bitfield<25, 24> ir1; 266 Bitfield<27, 26> or1; 267 Bitfield<29, 28> sh1; 268 Bitfield<30> epd1; 269 Bitfield<31> valid; 270 Bitfield<34, 32> ips; 271 Bitfield<35> affd; 272 Bitfield<36> wxn; 273 Bitfield<37> uwxn; 274 Bitfield<39, 38> tbi; 275 Bitfield<40> pan; 276 Bitfield<41> aa64; 277 Bitfield<42> hd; 278 Bitfield<43> ha; 279 Bitfield<44> s; 280 Bitfield<45> r; 281 Bitfield<46> a; 282 Bitfield<47> aset; 283 Bitfield<63, 48> asid; 284 EndBitUnion(DWORD0) 285 DWORD0 dw0; 286 287 BitUnion64(DWORD1) 288 Bitfield<0> nscfg0; 289 Bitfield<1> had0; 290 Bitfield<51, 4> ttb0; 291 Bitfield<60> hwu0g59; 292 Bitfield<61> hwu0g60; 293 Bitfield<62> hwu0g61; 294 Bitfield<63> hwu0g62; 295 EndBitUnion(DWORD1) 296 DWORD1 dw1; 297 298 BitUnion64(DWORD2) 299 Bitfield<0> nscfg1; 300 Bitfield<1> had1; 301 Bitfield<51, 4> ttb1; 302 Bitfield<60> hwu1g59; 303 Bitfield<61> hwu1g60; 304 Bitfield<62> hwu1g61; 305 Bitfield<63> hwu1g62; 306 EndBitUnion(DWORD2) 307 DWORD2 dw2; 308 309 uint64_t mair; 310 uint64_t amair; 311 uint64_t _pad[3]; 312}; 313 314enum { 315 CR0_SMMUEN_MASK = 0x1, 316 CR0_PRIQEN_MASK = 0x2, 317 CR0_EVENTQEN_MASK = 0x4, 318 CR0_CMDQEN_MASK = 0x8, 319 CR0_ATSCHK_MASK = 0x10, 320 CR0_VMW_MASK = 0x1C0, 321}; 322 323enum SMMUCommandType { 324 CMD_PRF_CONFIG = 0x01, 325 CMD_PRF_ADDR = 0x02, 326 CMD_CFGI_STE = 0x03, 327 CMD_CFGI_STE_RANGE = 0x04, 328 CMD_CFGI_CD = 0x05, 329 CMD_CFGI_CD_ALL = 0x06, 330 CMD_TLBI_NH_ALL = 0x10, 331 CMD_TLBI_NH_ASID = 0x11, 332 CMD_TLBI_NH_VAA = 0x13, 333 CMD_TLBI_NH_VA = 0x12, 334 CMD_TLBI_EL3_ALL = 0x18, 335 CMD_TLBI_EL3_VA = 0x1A, 336 CMD_TLBI_EL2_ALL = 0x20, 337 CMD_TLBI_EL2_ASID = 0x21, 338 CMD_TLBI_EL2_VA = 0x22, 339 CMD_TLBI_EL2_VAA = 0x23, 340 CMD_TLBI_S2_IPA = 0x2a, 341 CMD_TLBI_S12_VMALL = 0x28, 342 CMD_TLBI_NSNH_ALL = 0x30, 343 CMD_ATC_INV = 0x40, 344 CMD_PRI_RESP = 0x41, 345 CMD_RESUME = 0x44, 346 CMD_STALL_TERM = 0x45, 347 CMD_SYNC = 0x46, 348}; 349 350struct SMMUCommand 351{ 352 BitUnion64(DWORD0) 353 Bitfield<7, 0> type; 354 Bitfield<10> ssec; 355 Bitfield<11> ssv; 356 Bitfield<31, 12> ssid; 357 Bitfield<47, 32> vmid; 358 Bitfield<63, 48> asid; 359 Bitfield<63, 32> sid; 360 EndBitUnion(DWORD0) 361 DWORD0 dw0; 362 363 BitUnion64(DWORD1) 364 Bitfield<0> leaf; 365 Bitfield<4, 0> size; 366 Bitfield<4, 0> range; 367 Bitfield<63, 12> address; 368 EndBitUnion(DWORD1) 369 DWORD1 dw1; 370 371 uint64_t addr() const 372 { 373 uint64_t address = (uint64_t)(dw1.address) << 12; 374 return address; 375 } 376}; 377 378enum SMMUEventTypes { 379 EVT_FAULT = 0x0001, 380}; 381 382enum SMMUEventFlags { 383 EVF_WRITE = 0x0001, 384}; 385 386struct SMMUEvent 387{ 388 uint16_t type; 389 uint16_t stag; 390 uint32_t flags; 391 uint32_t streamId; 392 uint32_t substreamId; 393 uint64_t va; 394 uint64_t ipa; 395}; 396 397enum { 398 SMMU_MAX_TRANS_ID = 64 399}; 400 401#endif /* __DEV_ARM_SMMU_V3_DEFS_HH__ */ 402