Changeset View
Changeset View
Standalone View
Standalone View
sys/dev/iommu/busdma_iommu.c
Show First 20 Lines • Show All 91 Lines • ▼ Show 20 Lines | |||||
entry = iommu_gas_alloc_entry(domain, waitok ? 0 : IOMMU_PGF_WAITOK); | entry = iommu_gas_alloc_entry(domain, waitok ? 0 : IOMMU_PGF_WAITOK); | ||||
if (entry == NULL) | if (entry == NULL) | ||||
return (ENOMEM); | return (ENOMEM); | ||||
entry->start = start; | entry->start = start; | ||||
entry->end = start + length; | entry->end = start + length; | ||||
ma = malloc(sizeof(vm_page_t) * atop(length), M_TEMP, waitok ? | ma = malloc(sizeof(vm_page_t) * atop(length), M_TEMP, waitok ? | ||||
M_WAITOK : M_NOWAIT); | M_WAITOK : M_NOWAIT); | ||||
if (ma == NULL) { | if (ma == NULL) { | ||||
iommu_gas_free_entry(domain, entry); | iommu_gas_free_entry(entry); | ||||
return (ENOMEM); | return (ENOMEM); | ||||
} | } | ||||
for (i = 0; i < atop(length); i++) { | for (i = 0; i < atop(length); i++) { | ||||
ma[i] = vm_page_getfake(entry->start + PAGE_SIZE * i, | ma[i] = vm_page_getfake(entry->start + PAGE_SIZE * i, | ||||
VM_MEMATTR_DEFAULT); | VM_MEMATTR_DEFAULT); | ||||
} | } | ||||
error = iommu_gas_map_region(domain, entry, IOMMU_MAP_ENTRY_READ | | error = iommu_gas_map_region(domain, entry, IOMMU_MAP_ENTRY_READ | | ||||
((flags & BUS_DMA_NOWRITE) ? 0 : IOMMU_MAP_ENTRY_WRITE) | | ((flags & BUS_DMA_NOWRITE) ? 0 : IOMMU_MAP_ENTRY_WRITE) | | ||||
IOMMU_MAP_ENTRY_MAP, waitok ? IOMMU_MF_CANWAIT : 0, ma); | IOMMU_MAP_ENTRY_MAP, waitok ? IOMMU_MF_CANWAIT : 0, ma); | ||||
if (error == 0) { | if (error == 0) { | ||||
IOMMU_DMAMAP_LOCK(map); | IOMMU_DMAMAP_LOCK(map); | ||||
TAILQ_INSERT_TAIL(&map->map_entries, entry, dmamap_link); | TAILQ_INSERT_TAIL(&map->map_entries, entry, dmamap_link); | ||||
IOMMU_DMAMAP_UNLOCK(map); | IOMMU_DMAMAP_UNLOCK(map); | ||||
} else { | } else { | ||||
iommu_gas_free_entry(domain, entry); | iommu_gas_free_entry(entry); | ||||
} | } | ||||
for (i = 0; i < atop(length); i++) | for (i = 0; i < atop(length); i++) | ||||
vm_page_putfake(ma[i]); | vm_page_putfake(ma[i]); | ||||
free(ma, M_TEMP); | free(ma, M_TEMP); | ||||
return (error); | return (error); | ||||
} | } | ||||
static void | static void | ||||
Show All 39 Lines |