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