blob: bdab83cc8b2f3586a93d02e4649a217a0621ca5e [file] [log] [blame]
/*
* Copyright 2020, Data61, CSIRO (ABN 41 687 119 230)
*
* SPDX-License-Identifier: BSD-2-Clause
*/
#include <camkes/dataport.h>
#include <camkes/dma.h>
#include <stdint.h>
#include <stdlib.h>
#include <utils/util.h>
/*? macros.show_includes(me.instance.type.includes) ?*/
/*- set paddr = configuration[me.parent.name].get('paddr') -*/
/*- set size = configuration[me.parent.name].get('size', 4096) -*/
/*- set page_size = 4096 -*/
/*- set page_size_bits = int(math.log(page_size, 2)) -*/
/*- set cached = configuration[me.instance.name].get('%s_cached' % (me.interface.name), True) -*/
/*- set dataport_symbol_name = "%s_data" % (me.interface.name) -*/
/*? macros.shared_buffer_symbol(sym=dataport_symbol_name, shmem_size=size, page_size=page_size) ?*/
/*- set perm = macros.get_perm(configuration, me.instance.name, me.interface.name) -*/
/*- set frame_caps = [] -*/
/*? register_shared_variable('%s_data' % me.parent.name, dataport_symbol_name, size, frame_size=page_size, perm=perm, cached=cached, with_mapping_caps=frame_caps, paddr=paddr) ?*/
/*# Expose the frames backing the DMA pool #*/
/*- for cap in frame_caps -*/
static dma_frame_t /*? me.interface.name ?*/_dma_/*? loop.index0 ?*/ = {
.cap = /*? cap ?*/,
.size = /*? page_size ?*/,
.vaddr = (uintptr_t) &/*? dataport_symbol_name ?*/.content[/*? loop.index0 * page_size ?*/],
.cached = /*? int(cached) ?*/,
};
/*- endfor -*/
static dma_frame_t */*? me.interface.name ?*/_dma_frames[] = {
/*- for cap in frame_caps -*/
&/*? me.interface ?*/_dma_/*? loop.index0 ?*/,
/*- endfor -*/
};
static dma_pool_t /*? me.interface.name ?*/_dma_pool = {
.start_vaddr = (uintptr_t) &/*? dataport_symbol_name ?*/.content[0],
.end_vaddr = (uintptr_t) &/*? dataport_symbol_name ?*/.content[0] + /*? size ?*/ - 1,
.frame_size = /*? page_size ?*/,
.pool_size = /*? size ?*/,
.num_frames = /*? len(frame_caps) ?*/,
.dma_frames = /*? me.interface.name ?*/_dma_frames,
};
USED SECTION("_dma_pools")
dma_pool_t */*? me.interface.name ?*/_dma_pool_ptr = &/*? me.interface.name ?*/_dma_pool;
static void *dataport_addr = (void *)&/*? dataport_symbol_name ?*/;
/*- set id = composition.connections.index(me.parent) -*/
int /*? me.interface.name ?*/_wrap_ptr(dataport_ptr_t *p, void *ptr) {
if ((uintptr_t)ptr < (uintptr_t)dataport_addr ||
(uintptr_t)ptr >= (uintptr_t)dataport_addr + /*? size ?*/) {
return -1;
}
p->id = /*? id ?*/;
p->offset = (off_t)((uintptr_t)ptr - (uintptr_t)dataport_addr);
return 0;
}
void * /*? me.interface.name ?*/_unwrap_ptr(dataport_ptr_t *p) {
if (p->id == /*? id ?*/) {
return (void*)((uintptr_t)dataport_addr + (uintptr_t)p->offset);
} else {
return NULL;
}
}
/*- if configuration[me.parent.name].get('controller') == str(me) -*/
static void __attribute__((constructor)) dma_init(void) {
int res = camkes_dma_init(/*? dataport_symbol_name ?*/.content, /*? size ?*/, /*? page_size ?*/, /*? int(cached) ?*/);
if (res) {
ZF_LOGE("Invalid arguments given to camkes_dma_init in str(me)");
}
}
/*- endif -*/