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#include <camkes/dataport.h>
13#include <sel4/sel4.h>
14#include <utils/util.h>
15
16/*? macros.show_includes(me.instance.type.includes) ?*/
17
18/*# Assign client ids and badges #*/
19/*- set badges = namespace() -*/
20/*- if client_ids is not undefined -*/
21    /*- set badges.badges = client_ids.badges -*/
22/*- else -*/
23    /*- from 'rpc-connector.c' import allocate_badges with context -*/
24    /*- do allocate_badges(badges) -*/
25/*- endif -*/
26/*- set badges = badges.badges -*/
27
28/*# Enumerate all the incoming interfaces #*/
29/*- set shmems = [] -*/
30/*- set client_ids = set() -*/
31/*- for c in me.parent.from_ends -*/
32
33    /*- set client_id = badges[loop.index0] -*/
34
35    /*- if client_id not in client_ids -*/
36        /*- do client_ids.add(client_id) -*/
37
38        /*- set shmem_size = configuration[c.instance.name].get("%s_shmem_size" % c.interface.name, 4096) -*/
39        /*- set shmem_section = 'to_%s_%s' % (me.interface.name, client_id) -*/
40        /*- set shmem_symbol = 'to_%s_%s_data' % (me.interface.name, client_id) -*/
41        /*- set shmem_name = "%s_buf_%s" % (me.interface.name, client_id) -*/
42        /*- set page_size = macros.get_page_size(shmem_size, options.architecture) -*/
43        /*- if page_size == 0 -*/
44          /*? raise(TemplateError('Setting %s.%s_shmem_size does not meet minimum size and alignment requirements. %d must be at least %d and %d aligned' % (c.instance.name, c.interface.name, size, 4096, 4096))) ?*/
45        /*- endif -*/
46        /*- set page_size_bits = int(math.log(page_size, 2)) -*/
47
48        /*? macros.shared_buffer_symbol(sym=shmem_symbol, shmem_size=shmem_size, page_size=page_size) ?*/
49        /*? register_shared_variable('%s_%s_data' % (me.parent.name, client_id), shmem_symbol, shmem_size, frame_size=page_size) ?*/
50
51        volatile void * /*? shmem_name ?*/ = (volatile void *) & /*? shmem_symbol ?*/;
52
53        /*- do shmems.append((shmem_name, client_id, shmem_size)) -*/
54    /*- else -*/
55        /* skipping /*? client_id ?*/ */
56    /*- endif -*/
57
58/*- endfor -*/
59
60
61void * /*? me.interface.name ?*/_buf(seL4_Word client_id) {
62    /*- if len(shmems) == 0 -*/
63        return NULL;
64    /*- else -*/
65        switch (client_id) {
66            /*- for symbol, id, _ in shmems -*/
67            case /*? id ?*/:
68                return (void *) /*? symbol ?*/;
69            /*- endfor -*/
70        default:
71            return NULL;
72        }
73    /*- endif -*/
74}
75
76size_t /*? me.interface.name ?*/_buf_size(seL4_Word client_id) {
77    /*- if len(shmems) == 0 -*/
78        return 0;
79    /*- else -*/
80        switch (client_id) {
81            /*- for _, id, size in shmems -*/
82            case /*? id ?*/:
83                return ROUND_UP_UNSAFE(/*? size ?*/, PAGE_SIZE_4K);
84            /*- endfor -*/
85        default:
86            return 0;
87        }
88    /*- endif -*/
89}
90
91unsigned int /*? me.interface.name ?*/_num_badges(void) {
92    return /*? len(shmems) ?*/;
93}
94
95seL4_Word /*? me.interface.name ?*/_enumerate_badge(unsigned int i) {
96    /*- if len(shmems) == 0 -*/
97       return -1;
98    /*- else -*/
99        switch (i) {
100            /*- for _, id, _ in shmems -*/
101                case /*? loop.index0 ?*/:
102                    return /*? id ?*/;
103            /*- endfor -*/
104        default:
105            return -1;
106        }
107    /*- endif -*/
108}
109
110
111int /*? me.interface.name ?*/_wrap_ptr(dataport_ptr_t *p, void *ptr) {
112    return -1;
113}
114
115void * /*? me.interface.name ?*/_unwrap_ptr(dataport_ptr_t *p) {
116    return NULL;
117}
118