source: soft/giet_vm/xml/mapping_info.h @ 257

Last change on this file since 257 was 255, checked in by meunier, 11 years ago
  • Added a syscall and some user functions to manipulate the Simulation Helper
  • Changed the the way the Vseg -> Pseg mapping is made during the boot to better utilize the address space (+ adaptation of the algorithm in memo)
  • Fixed a bug in boot_init (vobj_init): the vobj initialization could only be made for the first application (ptpr was not changed)
File size: 12.4 KB
Line 
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 at address MAPPING_BOOT_BASE.
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};
82
83
84enum psegType
85{
86    PSEG_TYPE_RAM  = 0,
87    PSEG_TYPE_ROM  = 1,
88    PSEG_TYPE_PERI = 2,
89};
90
91// The enum definitions for psegType and periphType must be kept
92// consistent with the definitions in the xml_driver.c file...
93
94enum periphType
95{
96    PERIPH_TYPE_ICU       = 0,
97    PERIPH_TYPE_TIM       = 1,
98    PERIPH_TYPE_DMA       = 2,
99    PERIPH_TYPE_MMC       = 3,
100    PERIPH_TYPE_CMA       = 4,
101    PERIPH_TYPE_IOC       = 5,
102    PERIPH_TYPE_TTY       = 6,
103    PERIPH_TYPE_FBF       = 7,
104    PERIPH_TYPE_NIC       = 8,
105    PERIPH_TYPE_IOB       = 9,
106    PERIPH_TYPE_GCD       = 10,
107    PERIPH_TYPE_XCU       = 11,
108    PERIPH_TYPE_SIM       = 12,
109
110    PERIPH_TYPE_MAX_VALUE = 13,
111};
112
113
114enum mwmrPortDirection
115{
116    PORT_TO_COPROC   = 0, // status register
117    PORT_FROM_COPROC = 1, // config register
118};
119
120
121///////////////////////////////
122
123typedef struct __attribute__((packed))  mapping_header_s
124{
125    unsigned int signature;          // must contain MAPPING_SIGNATURE
126    unsigned int clusters;           // number of clusters
127    unsigned int cluster_x;          // number of cluster in a row
128    unsigned int cluster_y;          // number of cluster in a column
129    unsigned int globals;            // number of vsegs mapped in all vspaces
130    unsigned int vspaces;            // number of virtual spaces
131    unsigned int increment;          // vseg cluster increment for replicated periphs
132
133    unsigned int tty_cluster;        // index of cluster containing TTY controler
134    unsigned int tty_cluster_bis;    // index of cluster containing second TTY controler
135    unsigned int ioc_cluster;        // index of cluster containing IOC controler
136    unsigned int ioc_cluster_bis;    // index of cluster containing second IOC controler
137    unsigned int nic_cluster;        // index of cluster containing NIC controler
138    unsigned int nic_cluster_bis;    // index of cluster containing second NIC controler
139    unsigned int fbf_cluster;        // index of cluster containing FBF controler
140    unsigned int fbf_cluster_bis;    // index of cluster containing second FBF controler
141    unsigned int cma_cluster;        // index of cluster containing CMA controler
142    unsigned int cma_cluster_bis;    // index of cluster containing second CMA controler
143    unsigned int iob_cluster;        // index of cluster containing IOB controler
144    unsigned int iob_cluster_bis;    // index of cluster containing second IOB controler
145    unsigned int sim_cluster;        // index of cluster containing the Simulation Helper
146    unsigned int sim_cluster_bis;    // index of cluster containing the Simulation Helper
147
148    unsigned int psegs;              // total number of physical segments (for all clusters)
149    unsigned int vsegs;              // total number of virtual segments (for all vspaces)
150    unsigned int vobjs;              // total number of virtual objects (for all vspaces)
151    unsigned int tasks;              // total number of tasks (for all vspaces)
152    unsigned int procs;              // total number of procs (for all clusters)
153    unsigned int irqs;               // total number of irqs (for all processors)
154    unsigned int coprocs;            // total number of coprocs (for all clusters)
155    unsigned int cp_ports;           // total number of cp_ports (for all coprocs)
156    unsigned int periphs;            // total number of peripherals (for all clusters)
157
158    char name[32];                   // mapping name
159} mapping_header_t;
160
161
162////////////////////////////////
163typedef struct __attribute__((packed))  mapping_cluster_s
164{
165    unsigned int psegs;          // number of psegs in cluster
166    unsigned int pseg_offset;    // index of first pseg in pseg set
167
168    unsigned int procs;          // number of processors in cluster
169    unsigned int proc_offset;    // index of first proc in proc set
170
171    unsigned int coprocs;        // number of coprocessors in cluster
172    unsigned int coproc_offset;  // index of first coproc in coproc set
173
174    unsigned int periphs;        // number of peripherals in cluster
175    unsigned int periph_offset;  // index of first coproc in coproc set
176} mapping_cluster_t;
177
178
179/////////////////////////////
180typedef struct __attribute__((packed))  mapping_pseg_s 
181{
182    char         name[32];       // pseg name (unique in a cluster)
183    paddr_t      base;           // base address in physical space
184    paddr_t      length;         // size (bytes)
185    unsigned int type;           // RAM / ROM / PERI
186    unsigned int cluster;        // index of cluster containing pseg
187} mapping_pseg_t;
188
189
190///////////////////////////////
191typedef struct __attribute__((packed))  mapping_vspace_s
192{
193    char         name[32];       // virtual space name
194    unsigned int start_offset;   // offset of the vobj containing the start vector
195    unsigned int vsegs;          // number of vsegs in vspace
196    unsigned int vobjs;          // number of vobjs in vspace
197    unsigned int tasks;          // number of tasks in vspace
198    unsigned int vseg_offset;    // index of first vseg in vspace
199    unsigned int vobj_offset;    // index of first vobjs in vspace
200    unsigned int task_offset;    // index of first task in vspace
201} mapping_vspace_t;
202
203
204/////////////////////////////
205typedef struct __attribute__((packed))  mapping_vseg_s
206{
207    char         name[32];       // vseg name (unique in vspace)
208    unsigned int vbase;          // base address in virtual space
209    paddr_t      pbase;          // base address in physical space
210    unsigned int pbase_set;
211    unsigned int length;         // size (bytes)
212    unsigned int psegid;         // physical segment global index
213    unsigned int mode;           // C-X-W-U flags
214    unsigned int ident;          // identity mapping if non zero
215    unsigned int vobjs;          // number of vobjs in vseg
216    unsigned int vobj_offset;    // index of first vobj in vseg
217} mapping_vseg_t;
218
219
220/////////////////////////////
221typedef struct __attribute__((packed))  mapping_task_s
222{
223    char         name[32];       // task name (unique in vspace)
224    unsigned int clusterid;      // physical cluster index
225    unsigned int proclocid;      // processor local index (inside cluster)
226    unsigned int stack_vobjid;   // stack vobj index in vspace
227    unsigned int heap_vobjid;    // heap vobj index in vspace
228    unsigned int startid;        // index in start_vector
229    unsigned int use_tty;        // TTY channel required (global)
230    unsigned int use_nic;        // NIC channel required (global)
231    unsigned int use_cma;        // CMA channel required (global)
232    unsigned int use_ioc;        // IOC channel required (global)
233    unsigned int use_tim;        // user timer required (local)
234    unsigned int use_dma;        // DMA channel required (local)
235} mapping_task_t;
236
237
238/////////////////////////////
239typedef struct __attribute__((packed))  mapping_vobj_s
240{
241    char         name[32];       // vobj name (unique in a vspace)
242    char         binpath[64];    // path for the binary code ("*.elf")
243    unsigned int type;           // type of vobj
244    unsigned int length;         // size (bytes)
245    unsigned int align;          // required alignement (logarithm of 2)
246    unsigned int vaddr;          // virtual base addresse of the vobj
247    paddr_t      paddr;          // physical base addresse of the vobj
248    unsigned int init;           // init value (used by barrier or mwmr channel)
249} mapping_vobj_t;
250
251
252/////////////////////////////
253typedef struct __attribute__((packed))  mapping_proc_s
254{
255    unsigned int irqs;           // number of IRQs allocated to processor
256    unsigned int irq_offset;     // index of first IRQ allocated to processor
257} mapping_proc_t;
258
259
260/////////////////////////////
261typedef struct __attribute__((packed))  mapping_irq_s
262{
263    unsigned int type;           // 0 => HW_IRQ  / 1 => SW_IRQ
264    unsigned int icuid;          // IRQ Index for the ICU component
265    unsigned int isr;            // ISR Index (defined in irq_handler.h)
266    unsigned int channel;        // Channel Index (for multi-channels peripherals)
267} mapping_irq_t;
268
269
270///////////////////////////////
271typedef struct __attribute__((packed))  mapping_coproc_s
272{
273    char         name[32];       // coprocessor name
274    unsigned int psegid;         // global pseg index
275    unsigned int ports;          // number of MWMR ports used by coprocessor
276    unsigned int port_offset;    // index of first MWMR port used by coprocessor
277} mapping_coproc_t;
278
279
280////////////////////////////////
281typedef struct __attribute__((packed))  mapping_cp_port_s
282{
283    unsigned int direction;      // TO_COPROC == 0 / FROM_COPROC == 1
284    unsigned int vspaceid;       // index of the vspace containing the MWMR channel
285    unsigned int mwmr_vobjid;    // local index of the vobj containing the MWMR channel
286} mapping_cp_port_t;
287
288
289///////////////////////////////
290typedef struct __attribute__((packed))  mapping_periph_s
291{
292    unsigned int type;         
293    unsigned int psegid;         // pseg index in cluster
294    unsigned int channels;       // number of channels
295} mapping_periph_t;
296
297
298#endif
299
300// Local Variables:
301// tab-width: 4
302// c-basic-offset: 4
303// c-file-offsets:((innamespace . 0)(inline-open . 0))
304// indent-tabs-mode: nil
305// End:
306
307// vim: filetype=c:expandtab:shiftwidth=4:tabstop=4:softtabstop=4
308
Note: See TracBrowser for help on using the repository browser.