blob: 30436dce734666691ba3ed9cf314382c98ffcfd7 [file] [log] [blame]
/* Copyright (c) 2019 Google Inc
* Barret Rhoden <brho@cs.berkeley.edu>
* See LICENSE for details.
*
* An arena for DMA-able memory and a 'pool' (slab/KC) for smaller objects.
* See dma.c for details.
*/
#pragma once
#include <arena.h>
#include <arch/pci.h>
typedef physaddr_t dma_addr_t;
struct dma_arena {
struct arena arena;
void *(*to_cpu_addr)(struct dma_arena *da, dma_addr_t dev_addr);
void *data;
};
/* Default arena: basically just physical pages */
extern struct dma_arena dma_phys_pages;
struct dma_arena *dev_to_dma_arena(struct device *d);
void dma_arena_init(void);
void *dma_arena_alloc(struct dma_arena *da, size_t size, dma_addr_t *dma_handle,
int mem_flags);
void *dma_arena_zalloc(struct dma_arena *da, size_t size,
dma_addr_t *dma_handle, int mem_flags);
void dma_arena_free(struct dma_arena *da, void *cpu_addr, dma_addr_t dma_handle,
size_t size);
/* Compatible with Linux's DMA pool */
struct dma_pool *dma_pool_create(const char *name, struct device *dev,
size_t size, size_t align, size_t allocation);
void dma_pool_destroy(struct dma_pool *pool);
void *dma_pool_alloc(struct dma_pool *pool, int mem_flags, dma_addr_t *handle);
void *dma_pool_zalloc(struct dma_pool *pool, int mem_flags, dma_addr_t *handle);
void dma_pool_free(struct dma_pool *pool, void *vaddr, dma_addr_t addr);
/* Proc DMA arenas: mmapped user addresses, added and removed by the kernel.
* When you attach this to a process, that arena can be used for a driver's DMA
* arena. */
struct proc;
void setup_dma_arena(struct proc *p);
void teardown_dma_arena(struct proc *p);