Changeset View
Changeset View
Standalone View
Standalone View
sys/x86/iommu/busdma_dmar.c
Show All 28 Lines | |||||
* SUCH DAMAGE. | * SUCH DAMAGE. | ||||
*/ | */ | ||||
#include <sys/cdefs.h> | #include <sys/cdefs.h> | ||||
__FBSDID("$FreeBSD$"); | __FBSDID("$FreeBSD$"); | ||||
#include <sys/param.h> | #include <sys/param.h> | ||||
#include <sys/systm.h> | #include <sys/systm.h> | ||||
#include <sys/domainset.h> | |||||
#include <sys/malloc.h> | #include <sys/malloc.h> | ||||
#include <sys/bus.h> | #include <sys/bus.h> | ||||
#include <sys/conf.h> | #include <sys/conf.h> | ||||
#include <sys/interrupt.h> | #include <sys/interrupt.h> | ||||
#include <sys/kernel.h> | #include <sys/kernel.h> | ||||
#include <sys/ktr.h> | #include <sys/ktr.h> | ||||
#include <sys/lock.h> | #include <sys/lock.h> | ||||
#include <sys/proc.h> | #include <sys/proc.h> | ||||
▲ Show 20 Lines • Show All 323 Lines • ▼ Show 20 Lines | |||||
dmar_bus_dmamap_create(bus_dma_tag_t dmat, int flags, bus_dmamap_t *mapp) | dmar_bus_dmamap_create(bus_dma_tag_t dmat, int flags, bus_dmamap_t *mapp) | ||||
{ | { | ||||
struct bus_dma_tag_dmar *tag; | struct bus_dma_tag_dmar *tag; | ||||
struct bus_dmamap_dmar *map; | struct bus_dmamap_dmar *map; | ||||
WITNESS_WARN(WARN_GIANTOK | WARN_SLEEPOK, NULL, "%s", __func__); | WITNESS_WARN(WARN_GIANTOK | WARN_SLEEPOK, NULL, "%s", __func__); | ||||
tag = (struct bus_dma_tag_dmar *)dmat; | tag = (struct bus_dma_tag_dmar *)dmat; | ||||
map = malloc_domain(sizeof(*map), M_DMAR_DMAMAP, | map = malloc_domainset(sizeof(*map), M_DMAR_DMAMAP, | ||||
tag->common.domain, M_NOWAIT | M_ZERO); | DOMAINSET_PREF(tag->common.domain), M_NOWAIT | M_ZERO); | ||||
if (map == NULL) { | if (map == NULL) { | ||||
*mapp = NULL; | *mapp = NULL; | ||||
return (ENOMEM); | return (ENOMEM); | ||||
} | } | ||||
if (tag->segments == NULL) { | if (tag->segments == NULL) { | ||||
tag->segments = malloc_domain(sizeof(bus_dma_segment_t) * | tag->segments = malloc_domainset(sizeof(bus_dma_segment_t) * | ||||
tag->common.nsegments, M_DMAR_DMAMAP, | tag->common.nsegments, M_DMAR_DMAMAP, | ||||
tag->common.domain, M_NOWAIT); | DOMAINSET_PREF(tag->common.domain), M_NOWAIT); | ||||
if (tag->segments == NULL) { | if (tag->segments == NULL) { | ||||
free_domain(map, M_DMAR_DMAMAP); | free_domain(map, M_DMAR_DMAMAP); | ||||
*mapp = NULL; | *mapp = NULL; | ||||
return (ENOMEM); | return (ENOMEM); | ||||
} | } | ||||
} | } | ||||
TAILQ_INIT(&map->map_entries); | TAILQ_INIT(&map->map_entries); | ||||
map->tag = tag; | map->tag = tag; | ||||
▲ Show 20 Lines • Show All 48 Lines • ▼ Show 20 Lines | attr = (flags & BUS_DMA_NOCACHE) != 0 ? VM_MEMATTR_UNCACHEABLE : | ||||
VM_MEMATTR_DEFAULT; | VM_MEMATTR_DEFAULT; | ||||
tag = (struct bus_dma_tag_dmar *)dmat; | tag = (struct bus_dma_tag_dmar *)dmat; | ||||
map = (struct bus_dmamap_dmar *)*mapp; | map = (struct bus_dmamap_dmar *)*mapp; | ||||
if (tag->common.maxsize < PAGE_SIZE && | if (tag->common.maxsize < PAGE_SIZE && | ||||
tag->common.alignment <= tag->common.maxsize && | tag->common.alignment <= tag->common.maxsize && | ||||
attr == VM_MEMATTR_DEFAULT) { | attr == VM_MEMATTR_DEFAULT) { | ||||
*vaddr = malloc_domain(tag->common.maxsize, M_DEVBUF, | *vaddr = malloc_domainset(tag->common.maxsize, M_DEVBUF, | ||||
tag->common.domain, mflags); | DOMAINSET_PREF(tag->common.domain), mflags); | ||||
map->flags |= BUS_DMAMAP_DMAR_MALLOC; | map->flags |= BUS_DMAMAP_DMAR_MALLOC; | ||||
} else { | } else { | ||||
*vaddr = (void *)kmem_alloc_attr_domain(tag->common.domain, | *vaddr = (void *)kmem_alloc_attr_domainset( | ||||
tag->common.maxsize, mflags, 0ul, BUS_SPACE_MAXADDR, | DOMAINSET_PREF(tag->common.domain), tag->common.maxsize, | ||||
attr); | mflags, 0ul, BUS_SPACE_MAXADDR, attr); | ||||
map->flags |= BUS_DMAMAP_DMAR_KMEM_ALLOC; | map->flags |= BUS_DMAMAP_DMAR_KMEM_ALLOC; | ||||
} | } | ||||
if (*vaddr == NULL) { | if (*vaddr == NULL) { | ||||
dmar_bus_dmamap_destroy(dmat, *mapp); | dmar_bus_dmamap_destroy(dmat, *mapp); | ||||
*mapp = NULL; | *mapp = NULL; | ||||
return (ENOMEM); | return (ENOMEM); | ||||
} | } | ||||
return (0); | return (0); | ||||
▲ Show 20 Lines • Show All 461 Lines • Show Last 20 Lines |