/* 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);
