source: soft/giet_vm/giet_kernel/sys_handler.h @ 621

Last change on this file since 621 was 614, checked in by bellefin, 9 years ago

Change the syscalls related to the NIC and the CMA
1) In a CHBUF, every buffer is linked to a variable called “status” which is equal to 1 if the buffer is full or 0 if it is empty. The status occupies 64 bytes to simplify cache coherence
2) The CHBUF descriptor now contains the physical addresses of the buffer and its status. It only occupies 64 bits.

  • Property svn:executable set to *
File size: 8.8 KB
RevLine 
[519]1///////////////////////////////////////////////////////////////////////////////
[258]2// File     : sys_handler.h
3// Date     : 01/04/2012
[519]4// Author   : alain greiner
[258]5// Copyright (c) UPMC-LIP6
[519]6///////////////////////////////////////////////////////////////////////////////
7// The sys_handler.c and sys_handler.h files are part of the GIET-VM kernel.
[440]8// It define the syscall_vector[] (at the end of this file), as well as the
9// associated syscall handlers.
[519]10///////////////////////////////////////////////////////////////////////////////
[258]11
12#ifndef _SYS_HANDLER_H
13#define _SYS_HANDLER_H
14
[459]15#include "giet_config.h"
[494]16#include "kernel_locks.h"
[519]17#include "stdio.h"
[440]18
[505]19///////////////////////////////////////////////////////////////////////////////
[258]20//     Syscall Vector Table (indexed by syscall index)
[505]21///////////////////////////////////////////////////////////////////////////////
[258]22
23extern const void * _syscall_vector[64];
24
[505]25///////////////////////////////////////////////////////////////////////////////
[614]26// This structure is used by the CMA component to store the status of the
27// frame buffer (full or empty). The useful information is contained in the
28// "status" integer (1 for full and 0 for empty).
29// This structure must be aligned on a cache line (64 bytes) to simplify
[478]30// the software L2/L3 cache coherence when the IO bridge is used.
[505]31///////////////////////////////////////////////////////////////////////////////
[478]32
[614]33typedef struct buffer_status_s
[478]34{
[614]35    unsigned int status;
36    unsigned int padding[15];
37} buffer_status_t;
38
[505]39///////////////////////////////////////////////////////////////////////////////
[459]40// This structure is used by the CMA component to move a stream
[478]41// of images from two user buffers to the frame buffer in kernel space.
[459]42// It contains two chbuf arrays:
[478]43// - The SRC chbuf contains two buffers (buf0 & buf1), in user space.
[440]44// - The DST cbuf contains one single buffer (fbf), that is the frame buffer.
[614]45// Each buffer is described with a 64 bits buffer descriptor:
46// - the 26 LSB bits contain bits[6:31] of the buffer physical address
47// - the 26 following bits contain bits[6:31] of the physical address where the
48//   buffer status is located
49// - the 12 MSB bits contain the common address extension of the buffer and its
50//   status
51// The length field define the buffer size (bytes)
[494]52// This structure must be 64 bytes aligned.
[505]53///////////////////////////////////////////////////////////////////////////////
[440]54
55typedef struct fbf_chbuf_s
56{
[614]57    unsigned long long  buf0_desc;     // first user buffer descriptor
58    unsigned long long  buf1_desc;     // second user buffer descriptor
59    unsigned long long  fbf_desc;      // frame buffer descriptor
60    unsigned int        length;        // buffer length (bytes)
61    unsigned int        padding[9];    // padding for 64 bytes alignment
[440]62} fbf_chbuf_t;   
63
[505]64///////////////////////////////////////////////////////////////////////////////
[478]65// This structure is used by the CMA component to move a stream of containers
66// between the NIC chbuf containing 2 buffers, and a kernel chbuf
[494]67// containing up to (X_SIZE * Y_SIZE) buffers (one buffer per cluster).
[449]68// The same structure is used for both TX or RX transfers.
[494]69// The number of distributed containers can be smaller than (X_SIZE * YSIZE).
70// The actual number of buffers used in the chbuf is defined by (xmax * ymax).
[614]71// Each buffer is described with a 64 bits buffer descriptor:
72// - the 26 LSB bits contain bits[6:31] of the buffer physical address
73// - the 26 following bits contain bits[6:31] of the physical address where the
74//   buffer status is located
75// - the 12 MSB bits contain the common address extension of the buffer and its
76//   status
[494]77// This structure must be 64 bytes aligned.
[505]78///////////////////////////////////////////////////////////////////////////////
[449]79
[614]80typedef struct ker_chbuf_s
[449]81{
[614]82    unsigned long long   buf_desc[X_SIZE*Y_SIZE]; // kernel chbuf descriptor
83    unsigned int         xmax;                        // nb clusters in a row
84    unsigned int         ymax;                        // nb clusters in a column
85} ker_chbuf_t;
[449]86
[519]87
88
89
[505]90///////////////////////////////////////////////////////////////////////////////
[519]91//    Coprocessors related syscall handlers
92///////////////////////////////////////////////////////////////////////////////
93
94int _sys_coproc_alloc( unsigned int   coproc_type,
[556]95                       unsigned int*  coproc_info );
[519]96
[556]97int _sys_coproc_release( unsigned int coproc_reg_index );
[519]98
[556]99int _sys_coproc_channel_init( unsigned int            channel,
[519]100                              giet_coproc_channel_t*  desc );
101
[556]102int _sys_coproc_run( unsigned int coproc_reg_index );
[519]103
[556]104int _sys_coproc_completed();
[519]105
106///////////////////////////////////////////////////////////////////////////////
[440]107//    TTY related syscall handlers
[505]108///////////////////////////////////////////////////////////////////////////////
[258]109
[440]110int _sys_tty_alloc();
[294]111
[440]112int _sys_tty_write( const char*  buffer,
113                    unsigned int length,
114                    unsigned int channel );
[428]115
[440]116int _sys_tty_read(  char*        buffer,
117                    unsigned int length,
118                    unsigned int channel );
[294]119
[440]120int _sys_tty_get_lock( unsigned int   channel,
121                       unsigned int * save_sr_ptr );
[294]122
[440]123int _sys_tty_release_lock( unsigned int   channel,
124                           unsigned int * save_sr_ptr );
[294]125
[519]126int _sys_coproc_register_set( unsigned int cluster_xy,
127                              unsigned int reg_index,
128                              unsigned int value );
129
130int _sys_coproc_register_get( unsigned int  cluster_xy,
131                              unsigned int  reg_index,
132                              unsigned int* buffer );
133
[440]134//////////////////////////////////////////////////////////////////////////////
135//    TIM related syscall handlers
136//////////////////////////////////////////////////////////////////////////////
[294]137
[440]138int _sys_tim_alloc();
[258]139
[440]140int _sys_tim_start( unsigned int period );
[258]141
[440]142int _sys_tim_stop();
[258]143
[440]144//////////////////////////////////////////////////////////////////////////////
145//    NIC related syscall handlers
146//////////////////////////////////////////////////////////////////////////////
[294]147
[494]148int _sys_nic_alloc( unsigned int is_rx,
149                    unsigned int xmax,
150                    unsigned int ymax );
[396]151
[494]152
[489]153int _sys_nic_start( unsigned int is_rx,
154                    unsigned int channel );
[396]155
[449]156int _sys_nic_move( unsigned int is_rx,
[489]157                   unsigned int channel,
[449]158                   void*        buffer );
[440]159
[489]160int _sys_nic_stop( unsigned int is_rx,
161                   unsigned int channel );
[449]162
[489]163int _sys_nic_clear( unsigned int is_rx,
164                    unsigned int channel );
[459]165
[489]166int _sys_nic_stats( unsigned int is_rx,
167                    unsigned int channel );
[459]168
[440]169//////////////////////////////////////////////////////////////////////////////
170//    FBF related syscall handlers
171//////////////////////////////////////////////////////////////////////////////
172
173int _sys_fbf_sync_write( unsigned int offset,
174                         void*        buffer,
175                         unsigned int length );
176
177int _sys_fbf_sync_read(  unsigned int offset,
178                         void*        buffer,
179                         unsigned int length );
180
181int _sys_fbf_cma_alloc();
182
[614]183int _sys_fbf_cma_init_buf(void*        buf0_vbase, 
184                          void*        buf1_vbase, 
185                          void*        sts0_vaddr,
186                          void*        sts1_vaddr );
[440]187
[614]188int _sys_fbf_cma_start( unsigned int length );
189
[440]190int _sys_fbf_cma_display( unsigned int buffer_index );
191
192int _sys_fbf_cma_stop();
193
194//////////////////////////////////////////////////////////////////////////////
195//    Miscelaneous syscall handlers
196//////////////////////////////////////////////////////////////////////////////
197
198int _sys_ukn();
199
200int _sys_proc_xyp( unsigned int* x,
201                   unsigned int* y,
202                   unsigned int* p );
203
204int _sys_task_exit( char* string );
205
[528]206int _sys_context_switch();
[440]207
208int _sys_local_task_id();
209
210int _sys_global_task_id();
211
212int _sys_thread_id();
213
[494]214int _sys_procs_number( unsigned int* x_size,
215                       unsigned int* y_size, 
216                       unsigned int* nprocs );
[440]217
[516]218int _sys_vseg_get_vbase( char*         vspace_name,
219                         char*         vseg_name,
[440]220                         unsigned int* vbase );
221
[516]222int _sys_vseg_get_length( char*         vspace_name, 
223                          char*         vseg_name,
[440]224                          unsigned int* length );
225
226int _sys_xy_from_ptr( void*          ptr,
227                      unsigned int*  x,
228                      unsigned int*  y );
229
230int _sys_heap_info( unsigned int* vaddr, 
231                    unsigned int* length,
232                    unsigned int  x,
233                    unsigned int  y ); 
234
[258]235#endif
236
237// Local Variables:
238// tab-width: 4
239// c-basic-offset: 4
240// c-file-offsets:((innamespace . 0)(inline-open . 0))
241// indent-tabs-mode: nil
242// End:
243// vim: filetype=c:expandtab:shiftwidth=4:tabstop=4:softtabstop=4
244
Note: See TracBrowser for help on using the repository browser.