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

Last change on this file since 304 was 295, checked in by alain, 11 years ago

Introducing a major release, to suppoort the tsar_generic_leti platform
and the various (external or internal) peripherals configurations.
The map.xml format has been modified, in order to support the new
vci_iopic componentand a new policy for peripherals initialisation.
The IRQs are nom described in the XICU and IOPIC components
(and not anymore in the processors).
To enforce this major change, the map.xml file signature changed:
The signature value must be: 0xDACE2014

This new release has been tested on the tsar_generic_leti platform
for the following mappings:

  • 4c_4p_sort_leti
  • 4c_4p_sort_leti_ext
  • 4c_4p_transpose_leti
  • 4c_4p_transpose_leti_ext
  • 4c_1p_four_leti_ext
  • Property svn:executable set to *
File size: 13.5 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_vobj_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    0xDACE2014
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_WTI = 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_ICU       = 3,
107    PERIPH_TYPE_IOB       = 4,
108    PERIPH_TYPE_IOC       = 5,
109    PERIPH_TYPE_MMC       = 6,
110    PERIPH_TYPE_MWR       = 7,
111    PERIPH_TYPE_NIC       = 8,
112    PERIPH_TYPE_ROM       = 9,
113    PERIPH_TYPE_SIM       = 10,
114    PERIPH_TYPE_TIM       = 11,
115    PERIPH_TYPE_TTY       = 12,
116    PERIPH_TYPE_XCU       = 13,
117    PERIPH_TYPE_PIC       = 14,
118
119    PERIPH_TYPE_MAX_VALUE = 15,
120};
121
122enum periphSubtype
123{
124    PERIPH_SUBTYPE_BDV       = 0,
125    PERIPH_SUBTYPE_HBA       = 1,
126    PERIPH_SUBTYPE_SPI       = 2,
127
128    PERIPH_SUBTYPE_MAX_VALUE = 3,
129};
130
131enum mwmrPortDirection
132{
133    PORT_TO_COPROC   = 0, // status register
134    PORT_FROM_COPROC = 1, // config register
135};
136
137
138////////////////////////////////////////////////////////
139typedef struct __attribute__((packed))  mapping_header_s
140{
141    unsigned int signature;          // must contain MAPPING_SIGNATURE
142    unsigned int x_size;             // actual number of clusters in a row
143    unsigned int y_size;             // actual number of clusters in a column
144    unsigned int x_width;            // number of bits to encode x coordinate
145    unsigned int y_width;            // number of bits to encode y coordinate
146    unsigned int globals;            // number of vsegs mapped in all vspaces
147    unsigned int vspaces;            // number of virtual spaces
148    unsigned int x_io;               // x coordinate for cluster_io_ext
149    unsigned int y_io;               // y coordinate for cluster_io_ext
150    unsigned int irq_per_proc;       // number of IRQ per processor
151    unsigned int use_ramdisk;        // does not use IOC peripheral if non zero
152    unsigned int increment;          // vbase address increment (replicated peripherals)
153
154    unsigned int psegs;              // total number of physical segments (for all clusters)
155    unsigned int vsegs;              // total number of virtual segments (for all vspaces)
156    unsigned int vobjs;              // total number of virtual objects (for all vspaces)
157    unsigned int tasks;              // total number of tasks (for all vspaces)
158    unsigned int procs;              // total number of procs (for all clusters)
159    unsigned int irqs;               // total number of irqs (for all processors)
160    unsigned int coprocs;            // total number of coprocs (for all clusters)
161    unsigned int cp_ports;           // total number of cp_ports (for all coprocs)
162    unsigned int periphs;            // total number of peripherals (for all clusters)
163
164    char name[32];                   // mapping name
165} mapping_header_t;
166
167
168/////////////////////////////////////////////////////////
169typedef struct __attribute__((packed))  mapping_cluster_s
170{
171    unsigned int    x;               // x coordinate
172    unsigned int    y;               // y coordinate
173
174    unsigned int    psegs;           // number of psegs in cluster
175    unsigned int    pseg_offset;     // index of first pseg in pseg set
176
177    unsigned int    procs;           // number of processors in cluster
178    unsigned int    proc_offset;     // index of first proc in proc set
179 
180    unsigned int    coprocs;         // number of coprocessors in cluster
181    unsigned int    coproc_offset;   // index of first coproc in coproc set
182
183    unsigned int    periphs;         // number of peripherals in cluster
184    unsigned int    periph_offset;   // index of first coproc in coproc set
185} mapping_cluster_t;
186
187
188////////////////////////////////////////////////////////
189typedef struct __attribute__((packed))  mapping_vspace_s
190{
191    char            name[32];        // virtual space name
192    unsigned int    start_offset;    // offset of the vobj containing start vector
193    unsigned int    vsegs;           // number of vsegs in vspace
194    unsigned int    vobjs;           // number of vobjs in vspace
195    unsigned int    tasks;           // number of tasks in vspace
196    unsigned int    vseg_offset;     // index of first vseg in vspace
197    unsigned int    vobj_offset;     // index of first vobjs in vspace
198    unsigned int    task_offset;     // index of first task in vspace
199} mapping_vspace_t;
200
201
202//////////////////////////////////////////////////////
203typedef struct __attribute__((packed))  mapping_vseg_s
204{
205    char            name[32];        // vseg name (unique in vspace)
206    unsigned int    vbase;           // base address in virtual space
207    paddr_t         pbase;           // base address in physical space
208    unsigned int    length;          // size (bytes)
209    unsigned int    psegid;          // physical segment global index
210    unsigned int    mode;            // C-X-W-U flags
211    unsigned int    vobjs;           // number of vobjs in vseg
212    unsigned int    vobj_offset;     // index of first vobj in vseg
213    unsigned int    next_vseg;       // linked list of vsegs mapped on pseg
214    char            mapped;          // mapped if non zero
215    char            ident;           // identity mapping if non zero
216    char            rsvd0;           // reserved
217    char            rsvd1;           // reserved
218} mapping_vseg_t;
219
220
221//////////////////////////////////////////////////////
222typedef struct __attribute__((packed))  mapping_pseg_s 
223{
224    char            name[32];        // pseg name (unique in a cluster)
225    paddr_t         base;            // base address in physical space
226    paddr_t         length;          // size (bytes)
227    unsigned int    type;            // RAM / PERI
228    unsigned int    clusterid;       // linear index in array of clusters
229    unsigned int    next_vseg;       // linked list of vsegs mapped on pseg
230} mapping_pseg_t;
231
232
233//////////////////////////////////////////////////////
234typedef struct __attribute__((packed))  mapping_task_s
235{
236    char            name[32];        // task name (unique in vspace)
237    unsigned int    clusterid;       // linear index in array of clusters
238    unsigned int    proclocid;       // processor local index (inside cluster)
239    unsigned int    trdid;           // thread index in vspace
240    unsigned int    stack_vobjid;    // stack vobj index in vspace
241    unsigned int    heap_vobjid;     // heap vobj index in vspace
242    unsigned int    startid;         // index in start_vector
243    unsigned int    use_tty;         // TTY channel required (global)
244    unsigned int    use_nic;         // NIC channel required (global)
245    unsigned int    use_cma;         // CMA channel required (global)
246    unsigned int    use_hba;         // IOC channel required (global)
247    unsigned int    use_tim;         // user timer required (local)
248} mapping_task_t;
249
250
251//////////////////////////////////////////////////////
252typedef struct __attribute__((packed))  mapping_vobj_s
253{
254    char            name[32];        // vobj name (unique in a vspace)
255    char            binpath[64];     // path for the binary code ("*.elf")
256    unsigned int    type;            // type of vobj
257    unsigned int    length;          // size (bytes)
258    unsigned int    align;           // required alignement (logarithm of 2)
259    unsigned int    vaddr;           // virtual base addresse of the vobj
260    paddr_t         paddr;           // physical base addresse of the vobj
261    unsigned int    init;            // init value (used by barrier or mwmr channel)
262} mapping_vobj_t;
263
264
265//////////////////////////////////////////////////////
266typedef struct __attribute__((packed))  mapping_proc_s
267{
268    unsigned int    index;           // processor local index (in cluster)
269} mapping_proc_t;
270
271
272////////////////////////////////////////////////////////
273typedef struct __attribute__((packed))  mapping_coproc_s
274{
275    char            name[32];        // coprocessor name
276    unsigned int    psegid;          // global pseg index
277    unsigned int    ports;           // number of MWMR ports used by coprocessor
278    unsigned int    port_offset;     // index of first MWMR port used by coprocessor
279} mapping_coproc_t;
280
281
282/////////////////////////////////////////////////////////
283typedef struct __attribute__((packed))  mapping_cp_port_s
284{
285    unsigned int    direction;       // TO_COPROC == 0 / FROM_COPROC == 1
286    unsigned int    vspaceid;        // index of the vspace containing the MWMR channel
287    unsigned int    mwmr_vobjid;     // local index of the vobj containing the MWMR channel
288} mapping_cp_port_t;
289
290
291////////////////////////////////////////////////////////
292typedef struct __attribute__((packed))  mapping_periph_s
293{
294    unsigned int    type;            // legal values defined above
295    unsigned int    subtype;         // periph specialization
296    unsigned int    psegid;          // pseg index in cluster
297    unsigned int    channels;        // number of channels
298    unsigned int    irqs;            // number of input IRQs (for ICU, XCU or PIC)
299    unsigned int    irq_offset;      // index of first IRQ (can be HWI/PTI/WTI)
300} mapping_periph_t;
301
302
303/////////////////////////////////////////////////////
304typedef struct __attribute__((packed))  mapping_irq_s
305{
306    unsigned int    srctype;         // source IRQ type (HWI / WTI / PTI)
307    unsigned int    srcid;           // source IRQ index (for ICU/PIC component)
308    unsigned int    isr;             // ISR type (defined in irq_handler.h)
309    unsigned int    channel;         // channel index (for multi-channels peripherals)
310    unsigned int    dstx;            // x coordinate of destination cluster
311    unsigned int    dsty;            // y coordinate of destination cluster
312    unsigned int    dstid;           // destination IRQ index (can be PROC or ICU)
313} mapping_irq_t; 
314
315
316#endif
317
318// Local Variables:
319// tab-width: 4
320// c-basic-offset: 4
321// c-file-offsets:((innamespace . 0)(inline-open . 0))
322// indent-tabs-mode: nil
323// End:
324
325// vim: filetype=c:expandtab:shiftwidth=4:tabstop=4:softtabstop=4
326
Note: See TracBrowser for help on using the repository browser.