| 793 | } |
| 794 | |
| 795 | static int |
| 796 | smmu_init_cd(struct smmu_softc *sc, struct smmu_domain *domain) |
| 797 | { |
| 798 | vm_paddr_t paddr; |
| 799 | uint64_t *ptr; |
| 800 | uint64_t val; |
| 801 | vm_size_t size; |
| 802 | struct smmu_cd *cd; |
| 803 | pmap_t p; |
| 804 | |
| 805 | size = 1 * (CD_DWORDS << 3); |
| 806 | |
| 807 | p = &domain->p; |
| 808 | cd = domain->cd = malloc(sizeof(struct smmu_cd), |
| 809 | M_SMMU, M_WAITOK | M_ZERO); |
| 810 | |
| 811 | cd->vaddr = contigmalloc(size, M_SMMU, |
| 812 | M_WAITOK | M_ZERO, /* flags */ |
| 813 | 0, /* low */ |
| 814 | (1ul << 40) - 1, /* high */ |
| 815 | size, /* alignment */ |
| 816 | 0); /* boundary */ |
| 817 | if (cd->vaddr == NULL) { |
| 818 | device_printf(sc->dev, "Failed to allocate CD\n"); |
| 819 | return (ENXIO); |
| 820 | } |
| 821 | |
| 822 | cd->size = size; |
| 823 | cd->paddr = vtophys(cd->vaddr); |
| 824 | |
| 825 | ptr = cd->vaddr; |
| 826 | |
| 827 | val = CD0_VALID; |
| 828 | val |= CD0_AA64; |
| 829 | val |= CD0_R; |
| 830 | val |= CD0_A; |
| 831 | val |= CD0_ASET; |
| 832 | val |= (uint64_t)domain->asid << CD0_ASID_S; |
| 833 | val |= CD0_TG0_4KB; |
| 834 | val |= CD0_EPD1; /* Disable TT1 */ |
| 835 | val |= ((64 - sc->ias) << CD0_T0SZ_S); |
| 836 | val |= CD0_IPS_48BITS; |
| 837 | |
| 838 | paddr = p->pm_l0_paddr & CD1_TTB0_M; |
| 839 | KASSERT(paddr == p->pm_l0_paddr, ("bad allocation 1")); |
| 840 | |
| 841 | ptr[1] = paddr; |
| 842 | ptr[2] = 0; |
| 843 | ptr[3] = MAIR_ATTR(MAIR_DEVICE_nGnRnE, VM_MEMATTR_DEVICE) | |
| 844 | MAIR_ATTR(MAIR_NORMAL_NC, VM_MEMATTR_UNCACHEABLE) | |
| 845 | MAIR_ATTR(MAIR_NORMAL_WB, VM_MEMATTR_WRITE_BACK) | |
| 846 | MAIR_ATTR(MAIR_NORMAL_WT, VM_MEMATTR_WRITE_THROUGH); |
| 847 | |
| 848 | /* Install the CD. */ |
| 849 | ptr[0] = val; |
| 850 | |
| 851 | return (0); |
| 852 | } |
no test coverage detected