386c386
< switch (cmd.type) {
---
> switch (cmd.dw0.type) {
395,397c395,397
< case CMD_INV_STE:
< DPRINTF(SMMUv3, "CMD_INV_STE sid=%#x\n", cmd.data[0]);
< configCache.invalidateSID(cmd.data[0]);
---
> case CMD_CFGI_STE: {
> DPRINTF(SMMUv3, "CMD_CFGI_STE sid=%#x\n", cmd.dw0.sid);
> configCache.invalidateSID(cmd.dw0.sid);
398a399
> }
400,403c401,414
< case CMD_INV_CD:
< DPRINTF(SMMUv3, "CMD_INV_CD sid=%#x ssid=%#x\n",
< cmd.data[0], cmd.data[1]);
< configCache.invalidateSSID(cmd.data[0], cmd.data[1]);
---
> case CMD_CFGI_STE_RANGE: {
> const auto range = cmd.dw1.range;
> if (range == 31) {
> // CMD_CFGI_ALL is an alias of CMD_CFGI_STE_RANGE with
> // range = 31
> DPRINTF(SMMUv3, "CMD_CFGI_ALL\n");
> configCache.invalidateAll();
> } else {
> DPRINTF(SMMUv3, "CMD_CFGI_STE_RANGE\n");
> const auto start_sid = cmd.dw0.sid & ~((1 << (range + 1)) - 1);
> const auto end_sid = start_sid + (1 << (range + 1)) - 1;
> for (auto sid = start_sid; sid <= end_sid; sid++)
> configCache.invalidateSID(sid);
> }
404a416
> }
406,408c418,421
< case CMD_INV_CD_ALL:
< DPRINTF(SMMUv3, "CMD_INV_CD_ALL sid=%#x\n", cmd.data[0]);
< configCache.invalidateSID(cmd.data[0]);
---
> case CMD_CFGI_CD: {
> DPRINTF(SMMUv3, "CMD_CFGI_CD sid=%#x ssid=%#x\n",
> cmd.dw0.sid, cmd.dw0.ssid);
> configCache.invalidateSSID(cmd.dw0.sid, cmd.dw0.ssid);
409a423
> }
411,413c425,427
< case CMD_INV_ALL:
< DPRINTF(SMMUv3, "CMD_INV_ALL\n");
< configCache.invalidateAll();
---
> case CMD_CFGI_CD_ALL: {
> DPRINTF(SMMUv3, "CMD_CFGI_CD_ALL sid=%#x\n", cmd.dw0.sid);
> configCache.invalidateSID(cmd.dw0.sid);
414a429
> }
416,417c431,432
< case CMD_TLBI_ALL:
< DPRINTF(SMMUv3, "CMD_TLBI_ALL\n");
---
> case CMD_TLBI_NH_ALL: {
> DPRINTF(SMMUv3, "CMD_TLBI_NH_ALL vmid=%#x\n", cmd.dw0.vmid);
419,420c434,435
< slave_interface->microTLB->invalidateAll();
< slave_interface->mainTLB->invalidateAll();
---
> slave_interface->microTLB->invalidateVMID(cmd.dw0.vmid);
> slave_interface->mainTLB->invalidateVMID(cmd.dw0.vmid);
422,424c437,438
< tlb.invalidateAll();
< ipaCache.invalidateAll();
< walkCache.invalidateAll();
---
> tlb.invalidateVMID(cmd.dw0.vmid);
> walkCache.invalidateVMID(cmd.dw0.vmid);
425a440
> }
427,429c442,444
< case CMD_TLBI_ASID:
< DPRINTF(SMMUv3, "CMD_TLBI_ASID asid=%#x vmid=%#x\n",
< cmd.data[0], cmd.data[1]);
---
> case CMD_TLBI_NH_ASID: {
> DPRINTF(SMMUv3, "CMD_TLBI_NH_ASID asid=%#x vmid=%#x\n",
> cmd.dw0.asid, cmd.dw0.vmid);
432c447
< cmd.data[0], cmd.data[1]);
---
> cmd.dw0.asid, cmd.dw0.vmid);
434c449
< cmd.data[0], cmd.data[1]);
---
> cmd.dw0.asid, cmd.dw0.vmid);
436,437c451,452
< tlb.invalidateASID(cmd.data[0], cmd.data[1]);
< walkCache.invalidateASID(cmd.data[0], cmd.data[1]);
---
> tlb.invalidateASID(cmd.dw0.asid, cmd.dw0.vmid);
> walkCache.invalidateASID(cmd.dw0.asid, cmd.dw0.vmid);
438a454
> }
440,442c456,459
< case CMD_TLBI_VAAL:
< DPRINTF(SMMUv3, "CMD_TLBI_VAAL va=%#08x vmid=%#x\n",
< cmd.data[0], cmd.data[1]);
---
> case CMD_TLBI_NH_VAA: {
> const Addr addr = cmd.addr();
> DPRINTF(SMMUv3, "CMD_TLBI_NH_VAA va=%#08x vmid=%#x\n",
> addr, cmd.dw0.vmid);
445c462
< cmd.data[0], cmd.data[1]);
---
> addr, cmd.dw0.vmid);
447c464
< cmd.data[0], cmd.data[1]);
---
> addr, cmd.dw0.vmid);
449,450c466
< tlb.invalidateVAA(cmd.data[0], cmd.data[1]);
< break;
---
> tlb.invalidateVAA(addr, cmd.dw0.vmid);
452,462c468,469
< case CMD_TLBI_VAA:
< DPRINTF(SMMUv3, "CMD_TLBI_VAA va=%#08x vmid=%#x\n",
< cmd.data[0], cmd.data[1]);
< for (auto slave_interface : slaveInterfaces) {
< slave_interface->microTLB->invalidateVAA(
< cmd.data[0], cmd.data[1]);
< slave_interface->mainTLB->invalidateVAA(
< cmd.data[0], cmd.data[1]);
< }
< tlb.invalidateVAA(cmd.data[0], cmd.data[1]);
< walkCache.invalidateVAA(cmd.data[0], cmd.data[1]);
---
> if (!cmd.dw1.leaf)
> walkCache.invalidateVAA(addr, cmd.dw0.vmid);
463a471
> }
465,467c473,476
< case CMD_TLBI_VAL:
< DPRINTF(SMMUv3, "CMD_TLBI_VAL va=%#08x asid=%#x vmid=%#x\n",
< cmd.data[0], cmd.data[1], cmd.data[2]);
---
> case CMD_TLBI_NH_VA: {
> const Addr addr = cmd.addr();
> DPRINTF(SMMUv3, "CMD_TLBI_NH_VA va=%#08x asid=%#x vmid=%#x\n",
> addr, cmd.dw0.asid, cmd.dw0.vmid);
470c479
< cmd.data[0], cmd.data[1], cmd.data[2]);
---
> addr, cmd.dw0.asid, cmd.dw0.vmid);
472c481
< cmd.data[0], cmd.data[1], cmd.data[2]);
---
> addr, cmd.dw0.asid, cmd.dw0.vmid);
474,475c483
< tlb.invalidateVA(cmd.data[0], cmd.data[1], cmd.data[2]);
< break;
---
> tlb.invalidateVA(addr, cmd.dw0.asid, cmd.dw0.vmid);
477,487c485,486
< case CMD_TLBI_VA:
< DPRINTF(SMMUv3, "CMD_TLBI_VA va=%#08x asid=%#x vmid=%#x\n",
< cmd.data[0], cmd.data[1], cmd.data[2]);
< for (auto slave_interface : slaveInterfaces) {
< slave_interface->microTLB->invalidateVA(
< cmd.data[0], cmd.data[1], cmd.data[2]);
< slave_interface->mainTLB->invalidateVA(
< cmd.data[0], cmd.data[1], cmd.data[2]);
< }
< tlb.invalidateVA(cmd.data[0], cmd.data[1], cmd.data[2]);
< walkCache.invalidateVA(cmd.data[0], cmd.data[1], cmd.data[2]);
---
> if (!cmd.dw1.leaf)
> walkCache.invalidateVA(addr, cmd.dw0.asid, cmd.dw0.vmid);
488a488
> }
490,492c490,493
< case CMD_TLBI_VM_IPAL:
< DPRINTF(SMMUv3, "CMD_TLBI_VM_IPAL ipa=%#08x vmid=%#x\n",
< cmd.data[0], cmd.data[1]);
---
> case CMD_TLBI_S2_IPA: {
> const Addr addr = cmd.addr();
> DPRINTF(SMMUv3, "CMD_TLBI_S2_IPA ipa=%#08x vmid=%#x\n",
> addr, cmd.dw0.vmid);
495,496c496,499
< ipaCache.invalidateIPA(cmd.data[0], cmd.data[1]);
< walkCache.invalidateVMID(cmd.data[1]);
---
> ipaCache.invalidateIPA(addr, cmd.dw0.vmid);
>
> if (!cmd.dw1.leaf)
> walkCache.invalidateVMID(cmd.dw0.vmid);
497a501
> }
499,505c503,511
< case CMD_TLBI_VM_IPA:
< DPRINTF(SMMUv3, "CMD_TLBI_VM_IPA ipa=%#08x vmid=%#x\n",
< cmd.data[0], cmd.data[1]);
< // This does not invalidate TLBs containing
< // combined Stage1 + Stage2 translations, as per the spec.
< ipaCache.invalidateIPA(cmd.data[0], cmd.data[1]);
< walkCache.invalidateVMID(cmd.data[1]);
---
> case CMD_TLBI_S12_VMALL: {
> DPRINTF(SMMUv3, "CMD_TLBI_S12_VMALL vmid=%#x\n", cmd.dw0.vmid);
> for (auto slave_interface : slaveInterfaces) {
> slave_interface->microTLB->invalidateVMID(cmd.dw0.vmid);
> slave_interface->mainTLB->invalidateVMID(cmd.dw0.vmid);
> }
> tlb.invalidateVMID(cmd.dw0.vmid);
> ipaCache.invalidateVMID(cmd.dw0.vmid);
> walkCache.invalidateVMID(cmd.dw0.vmid);
506a513
> }
508,509c515,516
< case CMD_TLBI_VM_S12:
< DPRINTF(SMMUv3, "CMD_TLBI_VM_S12 vmid=%#x\n", cmd.data[0]);
---
> case CMD_TLBI_NSNH_ALL: {
> DPRINTF(SMMUv3, "CMD_TLBI_NSNH_ALL\n");
511,512c518,519
< slave_interface->microTLB->invalidateVMID(cmd.data[0]);
< slave_interface->mainTLB->invalidateVMID(cmd.data[0]);
---
> slave_interface->microTLB->invalidateAll();
> slave_interface->mainTLB->invalidateAll();
514,516c521,523
< tlb.invalidateVMID(cmd.data[0]);
< ipaCache.invalidateVMID(cmd.data[0]);
< walkCache.invalidateVMID(cmd.data[0]);
---
> tlb.invalidateAll();
> ipaCache.invalidateAll();
> walkCache.invalidateAll();
517a525
> }
519,520c527,528
< case CMD_RESUME_S:
< DPRINTF(SMMUv3, "CMD_RESUME_S\n");
---
> case CMD_RESUME:
> DPRINTF(SMMUv3, "CMD_RESUME\n");
525c533
< warn("Unimplemented command %#x\n", cmd.type);
---
> warn("Unimplemented command %#x\n", cmd.dw0.type);