1/* 2 * Copyright 2017, Data61 3 * Commonwealth Scientific and Industrial Research Organisation (CSIRO) 4 * ABN 41 687 119 230. 5 * 6 * This software may be distributed and modified according to the terms of 7 * the BSD 2-Clause license. Note that NO WARRANTY is provided. 8 * See "LICENSE_BSD2.txt" for details. 9 * 10 * @TAG(DATA61_BSD) 11 */ 12 13#include <camkes/dataport.h> 14#include <stdint.h> 15#include <stdlib.h> 16#include <utils/util.h> 17 18/*? macros.show_includes(me.instance.type.includes) ?*/ 19 20/*- if me in me.parent.from_ends -*/ 21 /*- set index = me.parent.from_ends.index(me) -*/ 22 /*- set end = 'from' -*/ 23/*- elif me in me.parent.to_ends -*/ 24 /*- set index = me.parent.to_ends.index(me) -*/ 25 /*- set end = 'to' -*/ 26/*- endif -*/ 27 28/*- set dataport_symbol_name = "%s_%d_%s_data" % (end, index, me.interface.name) -*/ 29/*- set type_size = macros.dataport_size(me.interface.type) -*/ 30/*- if type_size.startswith("sizeof") -*/ 31 /*- set size = configuration[me.parent.name].get('size', 4096) -*/ 32 /*- set page_size = macros.get_page_size(size, options.architecture) -*/ 33 /*- if page_size == 0 -*/ 34 /*? raise(TemplateError('Setting %s.size does not meet minimum size requirements. %d must be at least %d and %d aligned' % (me.parent.name, int(size), 4096, 4096))) ?*/ 35 /*- endif -*/ 36/*- else -*/ 37 /*- set size = type_size -*/ 38 /*- set page_size = macros.get_page_size(size, options.architecture) -*/ 39 /*- if page_size == 0 -*/ 40 /*? raise(TemplateError('Setting Buf(%d) does not meet minimum size requirements. %d must be at least %d and %d aligned' % (int(size), int(size), 4096, 4096))) ?*/ 41 /*- endif -*/ 42/*- endif -*/ 43 44/*- set shmem_symbol_size = "MAX_UNSAFE(%s, %s)" % (type_size, size) -*/ 45/*? macros.shared_buffer_symbol(sym=dataport_symbol_name, shmem_size=shmem_symbol_size, page_size=page_size) ?*/ 46/*- set perm = macros.get_perm(configuration, me.instance.name, me.interface.name) -*/ 47/*? register_shared_variable('%s_data' % me.parent.name, dataport_symbol_name, size, frame_size=page_size, perm=perm) ?*/ 48 49/*? macros.dataport_type(me.interface.type) ?*/ * /*? me.interface.name ?*/ = 50 (/*? macros.dataport_type(me.interface.type) ?*/ *) & /*? end ?*/_/*? index ?*/_/*? me.interface.name ?*/_data; 51 52/*- set id = composition.connections.index(me.parent) -*/ 53 54int /*? me.interface.name ?*/_wrap_ptr(dataport_ptr_t *p, void *ptr) { 55 if ((uintptr_t)ptr < (uintptr_t)/*? me.interface.name ?*/ || 56 (uintptr_t)ptr >= (uintptr_t)/*? me.interface.name ?*/ + /*? macros.dataport_size(me.interface.type) ?*/) { 57 return -1; 58 } 59 p->id = /*? id ?*/; 60 p->offset = (off_t)((uintptr_t)ptr - (uintptr_t)/*? me.interface.name ?*/); 61 return 0; 62} 63 64void * /*? me.interface.name ?*/_unwrap_ptr(dataport_ptr_t *p) { 65 if (p->id == /*? id ?*/) { 66 return (void*)((uintptr_t)/*? me.interface.name ?*/ + (uintptr_t)p->offset); 67 } else { 68 return NULL; 69 } 70} 71