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