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

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

This is a major release, including a deep restructuration of code.
The main evolutions are

  • use of the Tsar preloader to load the GIET boot-loader from disk
  • introduction of a FAT32 file system library,
  • use of this fat32 library by the boot-loader to load the map.bin data structure, and the various .elf files
  • reorganisation of drivers (one file per peripheral).
  • introduction of drivers for new peripherals: vci_chbuf_dma and vci_multi_ahci.
  • introduction of a new physical memory allocator in the boot code.

This release has been tested on the tsar_generic_iob architecture,
for the two following mappings: 4c_1p_iob_four.xml and 4c_1p_iob_sort.xml

  • Property svn:executable set to *
File size: 13.8 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
134    unsigned int clusters;           // number of clusters
135    unsigned int cluster_x;          // number of cluster in a row
136    unsigned int cluster_y;          // number of cluster in a column
137    unsigned int globals;            // number of vsegs mapped in all vspaces
138    unsigned int vspaces;            // number of virtual spaces
139    unsigned int increment;          // vseg cluster increment for replicated periphs
140
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
144    unsigned int fbf_cluster;        // index of cluster containing FBF controler
145    unsigned int fbf_cluster_bis;    // index of cluster containing second FBF controler
146
147    unsigned int hba_cluster;        // index of cluster containing HBA controler
148    unsigned int hba_cluster_bis;    // index of cluster containing second HBA controler
149
150    unsigned int iob_cluster;        // index of cluster containing IOB controler
151    unsigned int iob_cluster_bis;    // index of cluster containing second IOB controler
152
153    unsigned int ioc_cluster;        // index of cluster containing IOC controler
154    unsigned int ioc_cluster_bis;    // index of cluster containing second IOC controler
155
156    unsigned int nic_cluster;        // index of cluster containing NIC controler
157    unsigned int nic_cluster_bis;    // index of cluster containing second NIC controler
158
159    unsigned int rom_cluster;        // index of cluster containing ROM controler
160    unsigned int rom_cluster_bis;    // index of cluster containing second ROM controler
161
162    unsigned int sim_cluster;        // index of cluster containing SIM controler
163    unsigned int sim_cluster_bis;    // index of cluster containing second SIM controler
164
165    unsigned int tty_cluster;        // index of cluster containing TTY controler
166    unsigned int tty_cluster_bis;    // index of cluster containing second TTY controler
167
168    unsigned int psegs;              // total number of physical segments (for all clusters)
169    unsigned int vsegs;              // total number of virtual segments (for all vspaces)
170    unsigned int vobjs;              // total number of virtual objects (for all vspaces)
171    unsigned int tasks;              // total number of tasks (for all vspaces)
172    unsigned int procs;              // total number of procs (for all clusters)
173    unsigned int irqs;               // total number of irqs (for all processors)
174    unsigned int coprocs;            // total number of coprocs (for all clusters)
175    unsigned int cp_ports;           // total number of cp_ports (for all coprocs)
176    unsigned int periphs;            // total number of peripherals (for all clusters)
177
178    char name[32];                   // mapping name
179} mapping_header_t;
180
181
182/////////////////////////////////////////////////////////
183typedef struct __attribute__((packed))  mapping_cluster_s
184{
185    unsigned int    psegs;           // number of psegs in cluster
186    unsigned int    pseg_offset;     // index of first pseg in pseg set
187
188    unsigned int    procs;           // number of processors in cluster
189    unsigned int    proc_offset;     // index of first proc in proc set
190 
191    unsigned int    coprocs;         // number of coprocessors in cluster
192    unsigned int    coproc_offset;   // index of first coproc in coproc set
193
194    unsigned int    periphs;         // number of peripherals in cluster
195    unsigned int    periph_offset;   // index of first coproc in coproc set
196} mapping_cluster_t;
197
198
199////////////////////////////////////////////////////////
200typedef struct __attribute__((packed))  mapping_vspace_s
201{
202    char            name[32];        // virtual space name
203    unsigned int    start_offset;    // offset of the vobj containing start vector
204    unsigned int    vsegs;           // number of vsegs in vspace
205    unsigned int    vobjs;           // number of vobjs in vspace
206    unsigned int    tasks;           // number of tasks in vspace
207    unsigned int    vseg_offset;     // index of first vseg in vspace
208    unsigned int    vobj_offset;     // index of first vobjs in vspace
209    unsigned int    task_offset;     // index of first task in vspace
210} mapping_vspace_t;
211
212
213//////////////////////////////////////////////////////
214typedef struct __attribute__((packed))  mapping_vseg_s
215{
216    char            name[32];        // vseg name (unique in vspace)
217    unsigned int    vbase;           // base address in virtual space
218    paddr_t         pbase;           // base address in physical space
219    unsigned int    length;          // size (bytes)
220    unsigned int    psegid;          // physical segment global index
221    unsigned int    mode;            // C-X-W-U flags
222    unsigned int    vobjs;           // number of vobjs in vseg
223    unsigned int    vobj_offset;     // index of first vobj in vseg
224    unsigned int    next_vseg;       // linked list of vsegs mapped on pseg
225    char            mapped;          // mapped if non zero
226    char            ident;           // identity mapping if non zero
227    char            rsvd0;           // reserved
228    char            rsvd1;           // reserved
229} mapping_vseg_t;
230
231
232//////////////////////////////////////////////////////
233typedef struct __attribute__((packed))  mapping_pseg_s 
234{
235    char            name[32];        // pseg name (unique in a cluster)
236    paddr_t         base;            // base address in physical space
237    paddr_t         length;          // size (bytes)
238    unsigned int    type;            // RAM / PERI
239    unsigned int    cluster;         // index of cluster containing pseg
240    unsigned int    next_vseg;       // linked list of vsegs mapped on pseg
241} mapping_pseg_t;
242
243
244//////////////////////////////////////////////////////
245typedef struct __attribute__((packed))  mapping_task_s
246{
247    char            name[32];        // task name (unique in vspace)
248    unsigned int    clusterid;       // physical cluster index
249    unsigned int    proclocid;       // processor local index (inside cluster)
250    unsigned int    stack_vobjid;    // stack vobj index in vspace
251    unsigned int    heap_vobjid;     // heap vobj index in vspace
252    unsigned int    startid;         // index in start_vector
253    unsigned int    use_tty;         // TTY channel required (global)
254    unsigned int    use_nic;         // NIC channel required (global)
255    unsigned int    use_cma;         // CMA channel required (global)
256    unsigned int    use_hba;         // IOC channel required (global)
257    unsigned int    use_tim;         // user timer required (local)
258} mapping_task_t;
259
260
261//////////////////////////////////////////////////////
262typedef struct __attribute__((packed))  mapping_vobj_s
263{
264    char            name[32];        // vobj name (unique in a vspace)
265    char            binpath[64];     // path for the binary code ("*.elf")
266    unsigned int    type;            // type of vobj
267    unsigned int    length;          // size (bytes)
268    unsigned int    align;           // required alignement (logarithm of 2)
269    unsigned int    vaddr;           // virtual base addresse of the vobj
270    paddr_t         paddr;           // physical base addresse of the vobj
271    unsigned int    init;            // init value (used by barrier or mwmr channel)
272} mapping_vobj_t;
273
274
275//////////////////////////////////////////////////////
276typedef struct __attribute__((packed))  mapping_proc_s
277{
278    unsigned int    irqs;            // number of IRQs allocated to processor
279    unsigned int    irq_offset;      // index of first IRQ allocated to processor
280} mapping_proc_t;
281
282
283/////////////////////////////////////////////////////
284typedef struct __attribute__((packed))  mapping_irq_s
285{
286    unsigned int    type;            // HWI / SWI / PTI
287    unsigned int    icuid;           // IRQ Index for the ICU component
288    unsigned int    isr;             // ISR Index (defined in irq_handler.h)
289    unsigned int    channel;         // Channel Index (for multi-channels peripherals)
290} mapping_irq_t; 
291
292
293////////////////////////////////////////////////////////
294typedef struct __attribute__((packed))  mapping_coproc_s
295{
296    char            name[32];        // coprocessor name
297    unsigned int    psegid;          // global pseg index
298    unsigned int    ports;           // number of MWMR ports used by coprocessor
299    unsigned int    port_offset;     // index of first MWMR port used by coprocessor
300} mapping_coproc_t;
301
302
303/////////////////////////////////////////////////////////
304typedef struct __attribute__((packed))  mapping_cp_port_s
305{
306    unsigned int    direction;       // TO_COPROC == 0 / FROM_COPROC == 1
307    unsigned int    vspaceid;        // index of the vspace containing the MWMR channel
308    unsigned int    mwmr_vobjid;     // local index of the vobj containing the MWMR channel
309} mapping_cp_port_t;
310
311
312////////////////////////////////////////////////////////
313typedef struct __attribute__((packed))  mapping_periph_s
314{
315    unsigned int    type;         
316    unsigned int    psegid;          // pseg index in cluster
317    unsigned int    channels;        // number of channels
318} mapping_periph_t;
319
320
321#endif
322
323// Local Variables:
324// tab-width: 4
325// c-basic-offset: 4
326// c-file-offsets:((innamespace . 0)(inline-open . 0))
327// indent-tabs-mode: nil
328// End:
329
330// vim: filetype=c:expandtab:shiftwidth=4:tabstop=4:softtabstop=4
331
Note: See TracBrowser for help on using the repository browser.