MCPcopy Create free account
hub / github.com/F-Stack/f-stack / smmu_init_cd

Function smmu_init_cd

freebsd/arm64/iommu/smmu.c:795–852  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

793}
794
795static int
796smmu_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}

Callers 1

smmu_domain_allocFunction · 0.85

Calls 3

mallocFunction · 0.85
contigmallocFunction · 0.85
device_printfFunction · 0.85

Tested by

no test coverage detected