From 2bd10f66c58803047c5cc5a2684e1d0cd21ad914 Mon Sep 17 00:00:00 2001 From: jmcmullan Date: Wed, 10 Oct 2012 04:34:20 +0000 Subject: [PATCH] ahci.device: Clean up some memory allocations Signed-off-by: Jason S. McMullan git-svn-id: https://svn.aros.org/svn/aros/trunk/AROS@45890 fb15a70f-31f2-0310-bbcc-cdcc74a49acc --- rom/devs/ahci/ahci_aros.c | 2 +- rom/devs/ahci/ahci_aros.h | 27 +++++++++++++++++++++------ 2 files changed, 22 insertions(+), 7 deletions(-) diff --git a/rom/devs/ahci/ahci_aros.c b/rom/devs/ahci/ahci_aros.c index 3f6ab57f2c..20e71b7dbd 100644 --- a/rom/devs/ahci/ahci_aros.c +++ b/rom/devs/ahci/ahci_aros.c @@ -240,7 +240,7 @@ AROS_INTH1(ahci_Interrupt, void **, fa) /* IRQ management */ int bus_setup_intr(device_t dev, struct resource *r, int flags, driver_intr_t func, void *arg, void **cookiep, void *serializer) { - struct Interrupt *handler = AllocVec(sizeof(struct Interrupt)+sizeof(void *)*2, MEMF_PUBLIC); + struct Interrupt *handler = AllocVec(sizeof(struct Interrupt)+sizeof(void *)*2, MEMF_PUBLIC | MEMF_CLEAR); void **fa; if (handler == NULL) diff --git a/rom/devs/ahci/ahci_aros.h b/rom/devs/ahci/ahci_aros.h index 31bbbffd53..5838819ded 100644 --- a/rom/devs/ahci/ahci_aros.h +++ b/rom/devs/ahci/ahci_aros.h @@ -226,6 +226,8 @@ typedef struct { } bus_dma_segment_t; typedef struct { + bus_size_t dt_alignment; + bus_size_t dt_maxsize; bus_size_t dt_size; } *bus_dma_tag_t; @@ -239,11 +241,14 @@ typedef int bus_dma_filter_t(void *arg, bus_addr_t paddr); static inline int bus_dma_tag_create(bus_dma_tag_t parent, bus_size_t alignment, bus_size_t boundary, bus_addr_t lowaddr, bus_addr_t highaddr, bus_dma_filter_t *filter, void *filterarg, bus_size_t maxsize, int nsegments, bus_size_t maxsegsz, int flags, bus_dma_tag_t *dmat) { + D(bug("%s: Allocating tag, %d objects of size %d, aligned by %d\n", __func__, nsegments, maxsegsz, alignment)); *dmat = AllocVec(sizeof(**dmat), MEMF_ANY); if (*dmat == NULL) return -ENOMEM; - (*dmat)->dt_size = maxsize; + (*dmat)->dt_alignment = alignment; + (*dmat)->dt_maxsize = maxsize; + (*dmat)->dt_size = maxsegsz; return 0; } @@ -256,13 +261,21 @@ static inline int bus_dma_tag_destroy(bus_dma_tag_t tag) #define BUS_DMA_ALLOCNOW (1 << 0) #define BUS_DMA_ZERO (1 << 1) +struct bus_chunk { + ULONG negoffset; +}; + static inline int bus_dmamem_alloc(bus_dma_tag_t tag, void **vaddr, unsigned flags, bus_dmamap_t *map) { - /* FIXME: Allocate DMAable memory */ - void *addr = AllocMem(tag->dt_size, MEMF_ANY); - if (addr == NULL) + struct bus_chunk *addr; + void *mem = AllocVec(sizeof(struct bus_chunk) + tag->dt_size + tag->dt_alignment, MEMF_ANY); + if (mem == NULL) return -ENOMEM; + addr = (struct bus_chunk *)(((IPTR)mem + sizeof(struct bus_chunk) + tag->dt_alignment - 1) & ~(tag->dt_alignment-1)); + addr[-1].negoffset = ((IPTR)addr - (IPTR)mem); + + D(bug("%s: Allocated %p: size %d, real start %p\n", __func__, addr, tag->dt_size, mem)); if (vaddr) *vaddr = addr; @@ -272,12 +285,14 @@ static inline int bus_dmamem_alloc(bus_dma_tag_t tag, void **vaddr, unsigned fla static inline bus_size_t bus_dma_tag_getmaxsize(bus_dma_tag_t tag) { - return tag->dt_size; + return tag->dt_maxsize; } static inline void bus_dmamem_free(bus_dma_tag_t tag, void *vaddr, bus_dmamap_t map) { - FreeMem(map, tag->dt_size); + struct bus_chunk *mem = (void *)map; + D(bug("%s: Free %p: size %d, real start %p\n", __func__, map, tag->dt_size, (APTR)((IPTR)mem - mem[-1].negoffset))); + FreeVec((APTR)((IPTR)mem - mem[-1].negoffset)); } static inline int bus_dmamap_create(bus_dma_tag_t tag, unsigned flags, bus_dmamap_t *map) -- 2.11.4.GIT