source: soft/giet_vm/giet_xml/mapping_info.h @ 279

Last change on this file since 279 was 267, checked in by cfuguet, 11 years ago
  • Adding new task context information: THREAD INDEX.

This value can be accessed by USER applications to get the
thread index of the current task. This thread index
corresponds to the index in a vspace.

The value of this index can be forced in the vspace part
of the XML description file using the trdid field in the
task description. When this value is missing, for each
task, a value from 0 to N-1 will be assigned, where N is
the number of task in the vspace.

The user application access this value through the
giet_thread_id() function defined in the stdio library
which uses the SYSCALL_THREAD_ID to access the task
context information.

  • Supporting mono TTY platforms

When the GIET_MONO_TTY constant defined in the giet_config
file, contains a value different than 0, all tasks will
share the TTY[0]. If this is the case, in the stdio
library, the giet_tty_printf() function will take the TTY
hardware lock before writing

  • Property svn:executable set to *
File size: 14.1 KB
RevLine 
[258]1////////////////////////////////////////////////////////////////////////////
2// File     : mapping_info.h
3// Date     : 01/04/2012
4// Author   : alain greiner
5// Copyright (c) UPMC-LIP6
6////////////////////////////////////////////////////////////////////////////
7// The MAPPING_INFO data structure, used by the GIET_VM kernel contains:
8//
9// 1) a description of a clusterized hardware architecture.
10// The number of cluster is variable (can be one). The number of processors
11// per cluster is variable (can be one). The number of peripherals per cluser
12// and coprocessor per cluster is variable. The number of physical memory
13// banks per cluster is variable.
14//
15// 2/ a description of the applications (called vspaces) to be - statically -
16// launched on the platform. The number of parallel tasks per application is
17// variable (can be one). Multi-Writer/Multi-Reader communication channels
18// betwwen tasks are supported. Each vspace contains a variable number
19// of virtual segments (called vsegs).
20//
21// 3/ the mapping directives: both tasks on processors, and software objects
22// (vobjs and vsegs) on the physical memory banks (called psegs).
23// and a variable number of tasks. The number of virtual space can be one.
24//
25// The mapping_info data structure is organised as the concatenation of
26// a fixed size header, and 11 variable size arrays:
27//
28// - mapping_cluster_t  cluster[] 
29// - mapping_pseg_t     pseg[]       
30// - mapping_vspace_t   vspace[] 
31// - mapping_vseg_t     vseg[]     
32// - mapping_vseg_t     vobj[]   
33// - mapping_task_t     task[] 
34// - mapping_proc_t     proc[] 
35// - mapping_irq_t      irq[]   
36// - mapping_coproc_t   coproc[]
37// - mapping_cp_port_t  cp_port[]
38// - mapping_periph_t   periph[]
39//
40// It is intended to be stored in memory in the seg_boot_mapping segment.
41////////////////////////////////////////////////////////////////////////////
42
43#ifndef _MAPPING_INFO_H_
44#define _MAPPING_INFO_H_
45
46#define MAPPING_HEADER_SIZE   sizeof(mapping_header_t)
47#define MAPPING_CLUSTER_SIZE  sizeof(mapping_cluster_t)
48#define MAPPING_VSPACE_SIZE   sizeof(mapping_vspace_t)
49#define MAPPING_VSEG_SIZE     sizeof(mapping_vseg_t)
50#define MAPPING_VOBJ_SIZE     sizeof(mapping_vobj_t)
51#define MAPPING_PSEG_SIZE     sizeof(mapping_pseg_t)
52#define MAPPING_TASK_SIZE     sizeof(mapping_task_t)
53#define MAPPING_PROC_SIZE     sizeof(mapping_proc_t)
54#define MAPPING_IRQ_SIZE      sizeof(mapping_irq_t)
55#define MAPPING_COPROC_SIZE   sizeof(mapping_coproc_t)
56#define MAPPING_CP_PORT_SIZE  sizeof(mapping_cp_port_t)
57
58#define C_MODE_MASK  0b1000   // cacheable
59#define X_MODE_MASK  0b0100   // executable
60#define W_MODE_MASK  0b0010   // writable
61#define U_MODE_MASK  0b0001   // user access
62
63#define IN_MAPPING_SIGNATURE    0xDEADBEEF
64#define OUT_MAPPING_SIGNATURE   0xBABEF00D
65
66typedef unsigned long long  paddr_t;
67
68enum vobjType
69{
70    VOBJ_TYPE_ELF      = 0,  // loadable code/data object of elf files
71    VOBJ_TYPE_BLOB     = 1,  // loadable blob object
72    VOBJ_TYPE_PTAB     = 2,  // page table
73    VOBJ_TYPE_PERI     = 3,  // hardware component
74    VOBJ_TYPE_MWMR     = 4,  // MWMR channel
75    VOBJ_TYPE_LOCK     = 5,  // Lock
76    VOBJ_TYPE_BUFFER   = 6,  // Any "no initialization" objects (stacks...)
77    VOBJ_TYPE_BARRIER  = 7,  // Barrier
78    VOBJ_TYPE_CONST    = 8,  // Constant
79    VOBJ_TYPE_MEMSPACE = 9,  // Memspace (descriptor must be initialised)
80    VOBJ_TYPE_SCHED    = 10, // Array of schedulers (one per cluster)
81    VOBJ_TYPE_BOOT     = 11, // loader by the preloader
82};
83
84enum irqType
85{
86    IRQ_TYPE_HWI = 0,        // HARD in map.xml file
87    IRQ_TYPE_SWI = 1,        // SOFT in map.xml file,
88    IRQ_TYPE_PTI = 2,        // TIME in map.xml file,
89};
90
91enum psegType
92{
93    PSEG_TYPE_RAM  = 0,
94    PSEG_TYPE_ROM  = 1,      // deprecated => you should use PSEG_TYPE_PERI 
95    PSEG_TYPE_PERI = 2,
96};
97
98// The enum definitions for psegType and periphType must be kept
99// consistent with the definitions in the xml_driver.c file...
100
101enum periphType
102{
103    PERIPH_TYPE_CMA       = 0,
104    PERIPH_TYPE_DMA       = 1,
105    PERIPH_TYPE_FBF       = 2,
106    PERIPH_TYPE_HBA       = 3,
107    PERIPH_TYPE_ICU       = 4,
108    PERIPH_TYPE_IOB       = 5,
109    PERIPH_TYPE_IOC       = 6,
110    PERIPH_TYPE_MMC       = 7,
111    PERIPH_TYPE_MWR       = 8,
112    PERIPH_TYPE_NIC       = 9,
113    PERIPH_TYPE_ROM       = 10,
114    PERIPH_TYPE_SIM       = 11,
115    PERIPH_TYPE_TIM       = 12,
116    PERIPH_TYPE_TTY       = 13,
117    PERIPH_TYPE_XCU       = 14,
118
119    PERIPH_TYPE_MAX_VALUE = 15,
120};
121
122
123enum mwmrPortDirection
124{
125    PORT_TO_COPROC   = 0, // status register
126    PORT_FROM_COPROC = 1, // config register
127};
128
129
130////////////////////////////////////////////////////////
131typedef struct __attribute__((packed))  mapping_header_s
132{
133    unsigned int signature;          // must contain MAPPING_SIGNATURE
[263]134    unsigned int x_size;             // actual number of clusters in a row
135    unsigned int y_size;             // actual number of clusters in a column
136    unsigned int x_width;            // number of bits to encode x coordinate
137    unsigned int y_width;            // number of bits to encode y coordinate
[258]138    unsigned int globals;            // number of vsegs mapped in all vspaces
139    unsigned int vspaces;            // number of virtual spaces
140    unsigned int increment;          // vseg cluster increment for replicated periphs
141
142    unsigned int cma_cluster;        // index of cluster containing CMA controler
143    unsigned int cma_cluster_bis;    // index of cluster containing second CMA controler
144
145    unsigned int fbf_cluster;        // index of cluster containing FBF controler
146    unsigned int fbf_cluster_bis;    // index of cluster containing second FBF controler
147
148    unsigned int hba_cluster;        // index of cluster containing HBA controler
149    unsigned int hba_cluster_bis;    // index of cluster containing second HBA controler
150
151    unsigned int iob_cluster;        // index of cluster containing IOB controler
152    unsigned int iob_cluster_bis;    // index of cluster containing second IOB controler
153
154    unsigned int ioc_cluster;        // index of cluster containing IOC controler
155    unsigned int ioc_cluster_bis;    // index of cluster containing second IOC controler
156
157    unsigned int nic_cluster;        // index of cluster containing NIC controler
158    unsigned int nic_cluster_bis;    // index of cluster containing second NIC controler
159
160    unsigned int rom_cluster;        // index of cluster containing ROM controler
161    unsigned int rom_cluster_bis;    // index of cluster containing second ROM controler
162
163    unsigned int sim_cluster;        // index of cluster containing SIM controler
164    unsigned int sim_cluster_bis;    // index of cluster containing second SIM controler
165
166    unsigned int tty_cluster;        // index of cluster containing TTY controler
167    unsigned int tty_cluster_bis;    // index of cluster containing second TTY controler
168
169    unsigned int psegs;              // total number of physical segments (for all clusters)
170    unsigned int vsegs;              // total number of virtual segments (for all vspaces)
171    unsigned int vobjs;              // total number of virtual objects (for all vspaces)
172    unsigned int tasks;              // total number of tasks (for all vspaces)
173    unsigned int procs;              // total number of procs (for all clusters)
174    unsigned int irqs;               // total number of irqs (for all processors)
175    unsigned int coprocs;            // total number of coprocs (for all clusters)
176    unsigned int cp_ports;           // total number of cp_ports (for all coprocs)
177    unsigned int periphs;            // total number of peripherals (for all clusters)
178
179    char name[32];                   // mapping name
180} mapping_header_t;
181
182
183/////////////////////////////////////////////////////////
184typedef struct __attribute__((packed))  mapping_cluster_s
185{
[263]186    unsigned int    x;               // x coordinate
187    unsigned int    y;               // y coordinate
188
[258]189    unsigned int    psegs;           // number of psegs in cluster
190    unsigned int    pseg_offset;     // index of first pseg in pseg set
191
192    unsigned int    procs;           // number of processors in cluster
193    unsigned int    proc_offset;     // index of first proc in proc set
194 
195    unsigned int    coprocs;         // number of coprocessors in cluster
196    unsigned int    coproc_offset;   // index of first coproc in coproc set
197
198    unsigned int    periphs;         // number of peripherals in cluster
199    unsigned int    periph_offset;   // index of first coproc in coproc set
200} mapping_cluster_t;
201
202
203////////////////////////////////////////////////////////
204typedef struct __attribute__((packed))  mapping_vspace_s
205{
206    char            name[32];        // virtual space name
207    unsigned int    start_offset;    // offset of the vobj containing start vector
208    unsigned int    vsegs;           // number of vsegs in vspace
209    unsigned int    vobjs;           // number of vobjs in vspace
210    unsigned int    tasks;           // number of tasks in vspace
211    unsigned int    vseg_offset;     // index of first vseg in vspace
212    unsigned int    vobj_offset;     // index of first vobjs in vspace
213    unsigned int    task_offset;     // index of first task in vspace
214} mapping_vspace_t;
215
216
217//////////////////////////////////////////////////////
218typedef struct __attribute__((packed))  mapping_vseg_s
219{
220    char            name[32];        // vseg name (unique in vspace)
221    unsigned int    vbase;           // base address in virtual space
222    paddr_t         pbase;           // base address in physical space
223    unsigned int    length;          // size (bytes)
224    unsigned int    psegid;          // physical segment global index
225    unsigned int    mode;            // C-X-W-U flags
226    unsigned int    vobjs;           // number of vobjs in vseg
227    unsigned int    vobj_offset;     // index of first vobj in vseg
228    unsigned int    next_vseg;       // linked list of vsegs mapped on pseg
229    char            mapped;          // mapped if non zero
230    char            ident;           // identity mapping if non zero
231    char            rsvd0;           // reserved
232    char            rsvd1;           // reserved
233} mapping_vseg_t;
234
235
236//////////////////////////////////////////////////////
237typedef struct __attribute__((packed))  mapping_pseg_s 
238{
239    char            name[32];        // pseg name (unique in a cluster)
240    paddr_t         base;            // base address in physical space
241    paddr_t         length;          // size (bytes)
242    unsigned int    type;            // RAM / PERI
[263]243    unsigned int    clusterid;       // linear index in array of clusters
[258]244    unsigned int    next_vseg;       // linked list of vsegs mapped on pseg
245} mapping_pseg_t;
246
247
248//////////////////////////////////////////////////////
249typedef struct __attribute__((packed))  mapping_task_s
250{
251    char            name[32];        // task name (unique in vspace)
[263]252    unsigned int    clusterid;       // linear index in array of clusters
[258]253    unsigned int    proclocid;       // processor local index (inside cluster)
[267]254    unsigned int    trdid;           // thread index in vspace
[258]255    unsigned int    stack_vobjid;    // stack vobj index in vspace
256    unsigned int    heap_vobjid;     // heap vobj index in vspace
257    unsigned int    startid;         // index in start_vector
258    unsigned int    use_tty;         // TTY channel required (global)
259    unsigned int    use_nic;         // NIC channel required (global)
260    unsigned int    use_cma;         // CMA channel required (global)
261    unsigned int    use_hba;         // IOC channel required (global)
262    unsigned int    use_tim;         // user timer required (local)
263} mapping_task_t;
264
265
266//////////////////////////////////////////////////////
267typedef struct __attribute__((packed))  mapping_vobj_s
268{
269    char            name[32];        // vobj name (unique in a vspace)
270    char            binpath[64];     // path for the binary code ("*.elf")
271    unsigned int    type;            // type of vobj
272    unsigned int    length;          // size (bytes)
273    unsigned int    align;           // required alignement (logarithm of 2)
274    unsigned int    vaddr;           // virtual base addresse of the vobj
275    paddr_t         paddr;           // physical base addresse of the vobj
276    unsigned int    init;            // init value (used by barrier or mwmr channel)
277} mapping_vobj_t;
278
279
280//////////////////////////////////////////////////////
281typedef struct __attribute__((packed))  mapping_proc_s
282{
283    unsigned int    irqs;            // number of IRQs allocated to processor
284    unsigned int    irq_offset;      // index of first IRQ allocated to processor
285} mapping_proc_t;
286
287
288/////////////////////////////////////////////////////
289typedef struct __attribute__((packed))  mapping_irq_s
290{
291    unsigned int    type;            // HWI / SWI / PTI
292    unsigned int    icuid;           // IRQ Index for the ICU component
293    unsigned int    isr;             // ISR Index (defined in irq_handler.h)
294    unsigned int    channel;         // Channel Index (for multi-channels peripherals)
295} mapping_irq_t; 
296
297
298////////////////////////////////////////////////////////
299typedef struct __attribute__((packed))  mapping_coproc_s
300{
301    char            name[32];        // coprocessor name
302    unsigned int    psegid;          // global pseg index
303    unsigned int    ports;           // number of MWMR ports used by coprocessor
304    unsigned int    port_offset;     // index of first MWMR port used by coprocessor
305} mapping_coproc_t;
306
307
308/////////////////////////////////////////////////////////
309typedef struct __attribute__((packed))  mapping_cp_port_s
310{
311    unsigned int    direction;       // TO_COPROC == 0 / FROM_COPROC == 1
312    unsigned int    vspaceid;        // index of the vspace containing the MWMR channel
313    unsigned int    mwmr_vobjid;     // local index of the vobj containing the MWMR channel
314} mapping_cp_port_t;
315
316
317////////////////////////////////////////////////////////
318typedef struct __attribute__((packed))  mapping_periph_s
319{
320    unsigned int    type;         
321    unsigned int    psegid;          // pseg index in cluster
322    unsigned int    channels;        // number of channels
323} mapping_periph_t;
324
325
326#endif
327
328// Local Variables:
329// tab-width: 4
330// c-basic-offset: 4
331// c-file-offsets:((innamespace . 0)(inline-open . 0))
332// indent-tabs-mode: nil
333// End:
334
335// vim: filetype=c:expandtab:shiftwidth=4:tabstop=4:softtabstop=4
336
Note: See TracBrowser for help on using the repository browser.