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

Last change on this file since 256 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
RevLine 
[158]1////////////////////////////////////////////////////////////////////////////
2// File     : mapping_info.h
3// Date     : 01/04/2012
4// Author   : alain greiner
5// Copyright (c) UPMC-LIP6
6////////////////////////////////////////////////////////////////////////////
[253]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).
[158]23// and a variable number of tasks. The number of virtual space can be one.
24//
[253]25// The mapping_info data structure is organised as the concatenation of
26// a fixed size header, and 11 variable size arrays:
[158]27//
[189]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[] 
[253]34// - mapping_proc_t     proc[] 
35// - mapping_irq_t      irq[]   
[189]36// - mapping_coproc_t   coproc[]
37// - mapping_cp_port_t  cp_port[]
38// - mapping_periph_t   periph[]
[158]39//
[253]40// It is intended to be stored in memory at address MAPPING_BOOT_BASE.
[158]41////////////////////////////////////////////////////////////////////////////
42
43#ifndef _MAPPING_INFO_H_
44#define _MAPPING_INFO_H_
45
[228]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)
[158]57
[228]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
[158]62
63#define IN_MAPPING_SIGNATURE    0xDEADBEEF
64#define OUT_MAPPING_SIGNATURE   0xBABEF00D
65
[238]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)
[160]81};
82
[228]83
[238]84enum psegType
85{
[228]86    PSEG_TYPE_RAM  = 0,
87    PSEG_TYPE_ROM  = 1,
88    PSEG_TYPE_PERI = 2,
[181]89};
[160]90
[253]91// The enum definitions for psegType and periphType must be kept
92// consistent with the definitions in the xml_driver.c file...
[228]93
[238]94enum periphType
95{
96    PERIPH_TYPE_ICU       = 0,
97    PERIPH_TYPE_TIM       = 1,
98    PERIPH_TYPE_DMA       = 2,
[249]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,
[253]107    PERIPH_TYPE_XCU       = 11,
[255]108    PERIPH_TYPE_SIM       = 12,
[249]109
[255]110    PERIPH_TYPE_MAX_VALUE = 13,
[181]111};
112
[228]113
[238]114enum mwmrPortDirection
115{
[228]116    PORT_TO_COPROC   = 0, // status register
117    PORT_FROM_COPROC = 1, // config register
[181]118};
119
[228]120
[158]121///////////////////////////////
[189]122
[244]123typedef struct __attribute__((packed))  mapping_header_s
[238]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
[253]131    unsigned int increment;          // vseg cluster increment for replicated periphs
[189]132
[238]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
[255]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
[189]147
[238]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)
[189]157
[238]158    char name[32];                   // mapping name
[158]159} mapping_header_t;
160
[228]161
[158]162////////////////////////////////
[244]163typedef struct __attribute__((packed))  mapping_cluster_s
[238]164{
[228]165    unsigned int psegs;          // number of psegs in cluster
166    unsigned int pseg_offset;    // index of first pseg in pseg set
[189]167
[228]168    unsigned int procs;          // number of processors in cluster
169    unsigned int proc_offset;    // index of first proc in proc set
[189]170
[228]171    unsigned int coprocs;        // number of coprocessors in cluster
172    unsigned int coproc_offset;  // index of first coproc in coproc set
[189]173
[228]174    unsigned int periphs;        // number of peripherals in cluster
175    unsigned int periph_offset;  // index of first coproc in coproc set
[158]176} mapping_cluster_t;
177
[228]178
[158]179/////////////////////////////
[244]180typedef struct __attribute__((packed))  mapping_pseg_s 
[238]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)
[228]185    unsigned int type;           // RAM / ROM / PERI
186    unsigned int cluster;        // index of cluster containing pseg
[158]187} mapping_pseg_t;
188
[228]189
[158]190///////////////////////////////
[244]191typedef struct __attribute__((packed))  mapping_vspace_s
[238]192{
193    char         name[32];       // virtual space name
[228]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
[158]201} mapping_vspace_t;
202
[228]203
[158]204/////////////////////////////
[244]205typedef struct __attribute__((packed))  mapping_vseg_s
[238]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
[255]210    unsigned int pbase_set;
[228]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
[238]216    unsigned int vobj_offset;    // index of first vobj in vseg
[158]217} mapping_vseg_t;
218
[228]219
[158]220/////////////////////////////
[244]221typedef struct __attribute__((packed))  mapping_task_s
[238]222{
223    char         name[32];       // task name (unique in vspace)
[228]224    unsigned int clusterid;      // physical cluster index
225    unsigned int proclocid;      // processor local index (inside cluster)
[232]226    unsigned int stack_vobjid;   // stack vobj index in vspace
227    unsigned int heap_vobjid;    // heap vobj index in vspace
[228]228    unsigned int startid;        // index in start_vector
[238]229    unsigned int use_tty;        // TTY channel required (global)
[228]230    unsigned int use_nic;        // NIC channel required (global)
[238]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)
[158]235} mapping_task_t;
236
[228]237
[160]238/////////////////////////////
[255]239typedef struct __attribute__((packed))  mapping_vobj_s
[238]240{
241    char         name[32];       // vobj name (unique in a vspace)
242    char         binpath[64];    // path for the binary code ("*.elf")
[228]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
[238]247    paddr_t      paddr;          // physical base addresse of the vobj
[228]248    unsigned int init;           // init value (used by barrier or mwmr channel)
[160]249} mapping_vobj_t;
250
[228]251
[181]252/////////////////////////////
[244]253typedef struct __attribute__((packed))  mapping_proc_s
[238]254{
[228]255    unsigned int irqs;           // number of IRQs allocated to processor
256    unsigned int irq_offset;     // index of first IRQ allocated to processor
[181]257} mapping_proc_t;
258
[228]259
[181]260/////////////////////////////
[244]261typedef struct __attribute__((packed))  mapping_irq_s
[238]262{
[228]263    unsigned int type;           // 0 => HW_IRQ  / 1 => SW_IRQ
264    unsigned int icuid;          // IRQ Index for the ICU component
[238]265    unsigned int isr;            // ISR Index (defined in irq_handler.h)
266    unsigned int channel;        // Channel Index (for multi-channels peripherals)
[181]267} mapping_irq_t;
268
[228]269
[181]270///////////////////////////////
[244]271typedef struct __attribute__((packed))  mapping_coproc_s
[238]272{
273    char         name[32];       // coprocessor name
[228]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
[181]277} mapping_coproc_t;
278
[228]279
[189]280////////////////////////////////
[244]281typedef struct __attribute__((packed))  mapping_cp_port_s
[238]282{
[228]283    unsigned int direction;      // TO_COPROC == 0 / FROM_COPROC == 1
284    unsigned int vspaceid;       // index of the vspace containing the MWMR channel
[238]285    unsigned int mwmr_vobjid;    // local index of the vobj containing the MWMR channel
[189]286} mapping_cp_port_t;
[181]287
[228]288
[189]289///////////////////////////////
[244]290typedef struct __attribute__((packed))  mapping_periph_s
[238]291{
[253]292    unsigned int type;         
[228]293    unsigned int psegid;         // pseg index in cluster
294    unsigned int channels;       // number of channels
[189]295} mapping_periph_t;
[181]296
[189]297
[158]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
[228]307// vim: filetype=c:expandtab:shiftwidth=4:tabstop=4:softtabstop=4
[158]308
Note: See TracBrowser for help on using the repository browser.