|
106 | 106 | #define ARM_LPAE_PTE_HAP_FAULT (((arm_lpae_iopte)0) << 6) |
107 | 107 | #define ARM_LPAE_PTE_HAP_READ (((arm_lpae_iopte)1) << 6) |
108 | 108 | #define ARM_LPAE_PTE_HAP_WRITE (((arm_lpae_iopte)2) << 6) |
| 109 | +/* |
| 110 | + * For !FWB these code to: |
| 111 | + * 1111 = Normal outer write back cachable / Inner Write Back Cachable |
| 112 | + * Permit S1 to override |
| 113 | + * 0101 = Normal Non-cachable / Inner Non-cachable |
| 114 | + * 0001 = Device / Device-nGnRE |
| 115 | + * For S2FWB these code: |
| 116 | + * 0110 Force Normal Write Back |
| 117 | + * 0101 Normal* is forced Normal-NC, Device unchanged |
| 118 | + * 0001 Force Device-nGnRE |
| 119 | + */ |
| 120 | +#define ARM_LPAE_PTE_MEMATTR_FWB_WB (((arm_lpae_iopte)0x6) << 2) |
109 | 121 | #define ARM_LPAE_PTE_MEMATTR_OIWB (((arm_lpae_iopte)0xf) << 2) |
110 | 122 | #define ARM_LPAE_PTE_MEMATTR_NC (((arm_lpae_iopte)0x5) << 2) |
111 | 123 | #define ARM_LPAE_PTE_MEMATTR_DEV (((arm_lpae_iopte)0x1) << 2) |
@@ -458,12 +470,16 @@ static arm_lpae_iopte arm_lpae_prot_to_pte(struct arm_lpae_io_pgtable *data, |
458 | 470 | */ |
459 | 471 | if (data->iop.fmt == ARM_64_LPAE_S2 || |
460 | 472 | data->iop.fmt == ARM_32_LPAE_S2) { |
461 | | - if (prot & IOMMU_MMIO) |
| 473 | + if (prot & IOMMU_MMIO) { |
462 | 474 | pte |= ARM_LPAE_PTE_MEMATTR_DEV; |
463 | | - else if (prot & IOMMU_CACHE) |
464 | | - pte |= ARM_LPAE_PTE_MEMATTR_OIWB; |
465 | | - else |
| 475 | + } else if (prot & IOMMU_CACHE) { |
| 476 | + if (data->iop.cfg.quirks & IO_PGTABLE_QUIRK_ARM_S2FWB) |
| 477 | + pte |= ARM_LPAE_PTE_MEMATTR_FWB_WB; |
| 478 | + else |
| 479 | + pte |= ARM_LPAE_PTE_MEMATTR_OIWB; |
| 480 | + } else { |
466 | 481 | pte |= ARM_LPAE_PTE_MEMATTR_NC; |
| 482 | + } |
467 | 483 | } else { |
468 | 484 | if (prot & IOMMU_MMIO) |
469 | 485 | pte |= (ARM_LPAE_MAIR_ATTR_IDX_DEV |
@@ -1035,8 +1051,7 @@ arm_64_lpae_alloc_pgtable_s2(struct io_pgtable_cfg *cfg, void *cookie) |
1035 | 1051 | struct arm_lpae_io_pgtable *data; |
1036 | 1052 | typeof(&cfg->arm_lpae_s2_cfg.vtcr) vtcr = &cfg->arm_lpae_s2_cfg.vtcr; |
1037 | 1053 |
|
1038 | | - /* The NS quirk doesn't apply at stage 2 */ |
1039 | | - if (cfg->quirks) |
| 1054 | + if (cfg->quirks & ~(IO_PGTABLE_QUIRK_ARM_S2FWB)) |
1040 | 1055 | return NULL; |
1041 | 1056 |
|
1042 | 1057 | data = arm_lpae_alloc_pgtable(cfg); |
|
0 commit comments