Changeset 556
- Timestamp:
- Apr 13, 2015, 5:23:12 PM (10 years ago)
- Location:
- soft/giet_vm/giet_kernel
- Files:
-
- 3 edited
Legend:
- Unmodified
- Added
- Removed
-
soft/giet_vm/giet_kernel/ctx_handler.h
r528 r556 19 19 // allocated to the task (private peripheral channel) 20 20 ///////////////////////////////////////////////////////////////////////////////// 21 // ctx[0] <- *** |ctx[8] <- $8 |ctx[16]<- $16 |ctx[24]<- $2422 // ctx[1] <- $1 |ctx[9] <- $9 |ctx[17]<- $17 |ctx[25]<- $2523 // ctx[2] <- $2 |ctx[10]<- $10 |ctx[18]<- $18 |ctx[26]<- LO24 // ctx[3] <- $3 |ctx[11]<- $11 |ctx[19]<- $19 |ctx[27]<- HI25 // ctx[4] <- $4 |ctx[12]<- $12 |ctx[20]<- $20 |ctx[28]<- $2826 // ctx[5] <- $5 |ctx[13]<- $13 |ctx[21]<- $21 |ctx[29]<- SP27 // ctx[6] <- $6 |ctx[14]<- $14 |ctx[22]<- $22 |ctx[30]<- $3028 // ctx[7] <- $7 |ctx[15]<- $15 |ctx[23]<- $23 |ctx[31]<- RA21 // ctx[0] <- *** |ctx[8] <- $8 |ctx[16]<- $16 |ctx[24]<- $24 22 // ctx[1] <- $1 |ctx[9] <- $9 |ctx[17]<- $17 |ctx[25]<- $25 23 // ctx[2] <- $2 |ctx[10]<- $10 |ctx[18]<- $18 |ctx[26]<- LO 24 // ctx[3] <- $3 |ctx[11]<- $11 |ctx[19]<- $19 |ctx[27]<- HI 25 // ctx[4] <- $4 |ctx[12]<- $12 |ctx[20]<- $20 |ctx[28]<- $28 26 // ctx[5] <- $5 |ctx[13]<- $13 |ctx[21]<- $21 |ctx[29]<- SP 27 // ctx[6] <- $6 |ctx[14]<- $14 |ctx[22]<- $22 |ctx[30]<- $30 28 // ctx[7] <- $7 |ctx[15]<- $15 |ctx[23]<- $23 |ctx[31]<- RA 29 29 // 30 // ctx[32]<- EPC |ctx[40]<- TTY |ctx[48]<- TRDID |ctx[56]<- ***31 // ctx[33]<- CR |ctx[41]<- CMA_FB |ctx[49]<- GTID |ctx[57]<- ***32 // ctx[34]<- SR |ctx[42]<- CMA_RX |ctx[50]<- RUN |ctx[58]<- ***33 // ctx[35]<- BVAR |ctx[43]<- CMA_TX |ctx[51]<- ***|ctx[59]<- ***34 // ctx[36]<- PTAB |ctx[44]<- NIC_RX |ctx[52]<- *** |ctx[60]<- ***35 // ctx[37]<- LTID |ctx[45]<- NIC_TX |ctx[53]<- *** |ctx[61]<- ***36 // ctx[38]<- VSID |ctx[46]<- TIM |ctx[54]<- *** |ctx[62]<- ***37 // ctx[39]<- PTPR |ctx[47]<- HBA |ctx[55]<- *** |ctx[63]<- ***30 // ctx[32]<- EPC |ctx[40]<- TTY |ctx[48]<- TRDID |ctx[56]<- *** 31 // ctx[33]<- CR |ctx[41]<- CMA_FB |ctx[49]<- GTID |ctx[57]<- *** 32 // ctx[34]<- SR |ctx[42]<- CMA_RX |ctx[50]<- RUN |ctx[58]<- *** 33 // ctx[35]<- BVAR |ctx[43]<- CMA_TX |ctx[51]<- COPROC |ctx[59]<- *** 34 // ctx[36]<- PTAB |ctx[44]<- NIC_RX |ctx[52]<- *** |ctx[60]<- *** 35 // ctx[37]<- LTID |ctx[45]<- NIC_TX |ctx[53]<- *** |ctx[61]<- *** 36 // ctx[38]<- VSID |ctx[46]<- TIM |ctx[54]<- *** |ctx[62]<- *** 37 // ctx[39]<- PTPR |ctx[47]<- HBA |ctx[55]<- *** |ctx[63]<- *** 38 38 ///////////////////////////////////////////////////////////////////////////////// 39 39 … … 71 71 #define CTX_GTID_ID 49 // Global Task Index in all system 72 72 #define CTX_RUN_ID 50 // Boolean: task runable 73 #define CTX_COPROC_ID 51 // cluster_xy : coprocessor coordinates 73 74 74 75 ///////////////////////////////////////////////////////////////////////////////// -
soft/giet_vm/giet_kernel/sys_handler.c
r547 r556 70 70 // allocated in mwr_driver.c file. 71 71 extern simple_lock_t _coproc_lock[X_SIZE*Y_SIZE]; 72 extern unsigned int _coproc_done[X_SIZE*Y_SIZE]; 72 extern unsigned int _coproc_type[X_SIZE*Y_SIZE]; 73 extern unsigned int _coproc_info[X_SIZE*Y_SIZE]; 74 extern unsigned int _coproc_mode[X_SIZE*Y_SIZE]; 75 extern unsigned int _coproc_error[X_SIZE*Y_SIZE]; 76 extern unsigned int _coproc_gtid[X_SIZE*Y_SIZE]; 77 73 78 74 79 // allocated in tty_driver.c file. … … 125 130 const void * _syscall_vector[64] = 126 131 { 127 &_sys_proc_xyp, /* 0x00 */128 &_get_proctime, /* 0x01 */129 &_sys_tty_write, /* 0x02 */130 &_sys_tty_read, /* 0x03 */131 &_sys_tty_alloc, /* 0x04 */132 &_sys_tty_get_lock, /* 0x05 */133 &_sys_tty_release_lock, /* 0x06 */134 &_sys_heap_info, /* 0x07 */135 &_sys_local_task_id, /* 0x08 */136 &_sys_global_task_id, /* 0x09 */137 &_sys_fbf_cma_alloc, /* 0x0A */138 &_sys_fbf_cma_start, /* 0x0B */139 &_sys_fbf_cma_display, /* 0x0C */140 &_sys_fbf_cma_stop, /* 0x0D */141 &_sys_task_exit, /* 0x0E */142 &_sys_procs_number, /* 0x0F */143 144 &_sys_fbf_sync_write, /* 0x10 */145 &_sys_fbf_sync_read, /* 0x11 */146 &_sys_thread_id, /* 0x12 */147 &_sys_ukn, /* 0x13 */148 &_sys_tim_alloc, /* 0x14 */149 &_sys_tim_start, /* 0x15 */150 &_sys_tim_stop, /* 0x16 */151 &_sys_ukn, /* 0x17 */152 &_sys_ukn, /* 0x18 */153 &_sys_context_switch, /* 0x19 */154 &_sys_vseg_get_vbase, /* 0x1A */155 &_sys_vseg_get_length, /* 0x1B */156 &_sys_xy_from_ptr, /* 0x1C */157 &_sys_ukn, /* 0x1D */158 &_sys_ukn, /* 0x1E */159 &_sys_ukn, /* 0x1F */160 161 &_fat_user_open, /* 0x20 */162 &_fat_user_read, /* 0x21 */163 &_fat_user_write, /* 0x22 */164 &_fat_user_lseek, /* 0x23 */165 &_fat_fstat, /* 0x24 */166 &_fat_close, /* 0x25 */167 &_sys_ukn, /* 0x26 */168 &_sys_ukn, /* 0x27 */169 &_sys_ukn, /* 0x28 */170 &_sys_ukn, /* 0x29 */171 &_sys_ukn, /* 0x2A */172 &_sys_ukn, /* 0x2B */173 &_sys_ukn, /* 0x2C */174 &_sys_ukn, /* 0x2D */175 &_sys_ukn, /* 0x2E */176 &_sys_ukn, /* 0x2F */177 178 &_sys_nic_alloc, /* 0x30 */179 &_sys_nic_start, /* 0x31 */180 &_sys_nic_move, /* 0x32 */181 &_sys_nic_stop, /* 0x33 */182 &_sys_nic_stats, /* 0x34 */183 &_sys_nic_clear, /* 0x35 */184 &_sys_ukn, /* 0x36 */185 &_sys_ukn, /* 0x37 */186 &_sys_ coproc_register_get,/* 0x38 */187 &_sys_ coproc_register_set,/* 0x39 */188 &_sys_ coproc_release,/* 0x3A */189 &_sys_coproc_completed, /* 0x3B */190 &_sys_coproc_alloc, /* 0x3C */191 &_sys_coproc_channel_init, /* 0x3D */192 &_sys_coproc_ channel_start,/* 0x3E */193 &_sys_coproc_ channel_stop,/* 0x3F */132 &_sys_proc_xyp, /* 0x00 */ 133 &_get_proctime, /* 0x01 */ 134 &_sys_tty_write, /* 0x02 */ 135 &_sys_tty_read, /* 0x03 */ 136 &_sys_tty_alloc, /* 0x04 */ 137 &_sys_tty_get_lock, /* 0x05 */ 138 &_sys_tty_release_lock, /* 0x06 */ 139 &_sys_heap_info, /* 0x07 */ 140 &_sys_local_task_id, /* 0x08 */ 141 &_sys_global_task_id, /* 0x09 */ 142 &_sys_fbf_cma_alloc, /* 0x0A */ 143 &_sys_fbf_cma_start, /* 0x0B */ 144 &_sys_fbf_cma_display, /* 0x0C */ 145 &_sys_fbf_cma_stop, /* 0x0D */ 146 &_sys_task_exit, /* 0x0E */ 147 &_sys_procs_number, /* 0x0F */ 148 149 &_sys_fbf_sync_write, /* 0x10 */ 150 &_sys_fbf_sync_read, /* 0x11 */ 151 &_sys_thread_id, /* 0x12 */ 152 &_sys_ukn, /* 0x13 */ 153 &_sys_tim_alloc, /* 0x14 */ 154 &_sys_tim_start, /* 0x15 */ 155 &_sys_tim_stop, /* 0x16 */ 156 &_sys_ukn, /* 0x17 */ 157 &_sys_ukn, /* 0x18 */ 158 &_sys_context_switch, /* 0x19 */ 159 &_sys_vseg_get_vbase, /* 0x1A */ 160 &_sys_vseg_get_length, /* 0x1B */ 161 &_sys_xy_from_ptr, /* 0x1C */ 162 &_sys_ukn, /* 0x1D */ 163 &_sys_ukn, /* 0x1E */ 164 &_sys_ukn, /* 0x1F */ 165 166 &_fat_user_open, /* 0x20 */ 167 &_fat_user_read, /* 0x21 */ 168 &_fat_user_write, /* 0x22 */ 169 &_fat_user_lseek, /* 0x23 */ 170 &_fat_fstat, /* 0x24 */ 171 &_fat_close, /* 0x25 */ 172 &_sys_ukn, /* 0x26 */ 173 &_sys_ukn, /* 0x27 */ 174 &_sys_ukn, /* 0x28 */ 175 &_sys_ukn, /* 0x29 */ 176 &_sys_ukn, /* 0x2A */ 177 &_sys_ukn, /* 0x2B */ 178 &_sys_ukn, /* 0x2C */ 179 &_sys_ukn, /* 0x2D */ 180 &_sys_ukn, /* 0x2E */ 181 &_sys_ukn, /* 0x2F */ 182 183 &_sys_nic_alloc, /* 0x30 */ 184 &_sys_nic_start, /* 0x31 */ 185 &_sys_nic_move, /* 0x32 */ 186 &_sys_nic_stop, /* 0x33 */ 187 &_sys_nic_stats, /* 0x34 */ 188 &_sys_nic_clear, /* 0x35 */ 189 &_sys_ukn, /* 0x36 */ 190 &_sys_ukn, /* 0x37 */ 191 &_sys_ukn, /* 0x38 */ 192 &_sys_ukn, /* 0x39 */ 193 &_sys_ukn, /* 0x3A */ 194 &_sys_coproc_completed, /* 0x3B */ 195 &_sys_coproc_alloc, /* 0x3C */ 196 &_sys_coproc_channel_init, /* 0x3D */ 197 &_sys_coproc_run, /* 0x3E */ 198 &_sys_coproc_release, /* 0x3F */ 194 199 }; 195 200 … … 199 204 ////////////////////////////////////////////////////////////////////////////// 200 205 201 ///////////////////////////////////////////////////////202 int _sys_coproc_register_set( unsigned int cluster_xy,203 unsigned int reg_index,204 unsigned int value )205 {206 // TODO checking coprocessor ownership...207 208 _mwr_set_coproc_register( cluster_xy , reg_index , value );209 return 0;210 }211 212 ///////////////////////////////////////////////////////213 int _sys_coproc_register_get( unsigned int cluster_xy,214 unsigned int reg_index,215 unsigned int* buffer )216 {217 // TODO checking coprocessor ownership...218 219 *buffer = _mwr_get_coproc_register( cluster_xy , reg_index );220 return 0;221 }222 223 206 ////////////////////////////////////////////////// 224 207 int _sys_coproc_alloc( unsigned int coproc_type, 225 unsigned int* coproc_info, 226 unsigned int* cluster_xy ) 208 unsigned int* coproc_info ) 227 209 { 228 210 // In this implementation, the allocation policy is constrained: 229 211 // the coprocessor must be in the same cluster as the calling task, 230 // and ther is at most one coprocessor per cluster212 // and there is at most one coprocessor per cluster 231 213 232 214 mapping_header_t * header = (mapping_header_t *)SEG_BOOT_MAPPING_BASE; … … 238 220 unsigned int x = procid >> (Y_WIDTH + P_WIDTH); 239 221 unsigned int y = (procid >> P_WIDTH) & ((1<<Y_WIDTH)-1); 240 unsigned int cluster_id = x *Y_SIZE + y;222 unsigned int cluster_id = x * Y_SIZE + y; 241 223 242 224 // search coprocessor in cluster … … 259 241 // get the lock (at most one coproc per cluster) 260 242 _simple_lock_acquire( &_coproc_lock[cluster_id] ); 261 243 244 // register coproc characteristics in kernel arrays 245 _coproc_type[cluster_id] = coproc_type; 246 _coproc_info[cluster_id] = (found->arg0 & 0xFF) | 247 (found->arg1 & 0xFF)<<8 | 248 (found->arg2 & 0xFF)<<16 | 249 (found->arg3 & 0xFF)<<24 ; 250 262 251 // returns coprocessor info 263 *coproc_info = (found->arg0 & 0xFF) |264 (found->arg1 & 0xFF)<<8 | 265 (found->arg2 & 0xFF)<<16 |266 (found->arg3 & 0xFF)<<24;267 *cluster_xy = (x<<Y_WIDTH) + y;252 *coproc_info = _coproc_info[cluster_id]; 253 254 // register coprocessor coordinates in task context 255 unsigned int cluster_xy = (x<<Y_WIDTH) + y; 256 _set_context_slot( CTX_COPROC_ID , cluster_xy ); 268 257 269 258 #if GIET_DEBUG_COPROC 270 259 _printf("\n[GIET DEBUG COPROC] _sys_coproc_alloc() in cluster[%d,%d]\n" 271 260 " coproc_info = %x / cluster_xy = %x\n", 272 x , y , *coproc_info , *cluster_xy );261 x , y , *coproc_info , cluster_xy ); 273 262 #endif 274 263 return 0; … … 283 272 } // end _sys_coproc_alloc() 284 273 285 ////////////////////////////////////////////////// 286 int _sys_coproc_release( unsigned int cluster_xy ) 287 { 288 // TODO checking coprocessor ownership... 289 290 // check cluster coordinates 291 unsigned int cx = cluster_xy >> Y_WIDTH; 292 unsigned int cy = cluster_xy & ((1<<Y_WIDTH)-1); 274 //////////////////////////////////////////////////////// 275 int _sys_coproc_release( unsigned int coproc_reg_index ) 276 { 277 // processor coordinates 293 278 unsigned int procid = _get_procid(); 294 279 unsigned int x = procid >> (Y_WIDTH + P_WIDTH); 295 280 unsigned int y = (procid >> P_WIDTH) & ((1<<Y_WIDTH)-1); 296 if ( (x != cx) || (y != cy) ) 297 { 298 _printf("\n[GIET_ERROR] in _sys_coproc_channel_init(): " 299 "wrong cluster coordinates\n"); 281 unsigned int p = procid & ((1<<P_WIDTH)-1); 282 283 // get coprocessor coordinates 284 unsigned int cluster_xy = _get_context_slot( CTX_COPROC_ID ); 285 if ( cluster_xy > 0xFF ) 286 { 287 _printf("\n[GIET_ERROR] in _sys_coproc_release(): " 288 "no coprocessor allocated to task running on P[%d,%d,%d]\n", 289 x , y , p ); 300 290 return -1; 301 291 } 302 292 303 // compute coprocessor global index 304 unsigned int coproc_id = x * Y_SIZE + y; 305 306 // release coprocessor 307 _simple_lock_release( &_coproc_lock[coproc_id] ); 293 unsigned int cx = cluster_xy >> Y_WIDTH; 294 unsigned int cy = cluster_xy & ((1<<Y_WIDTH)-1); 295 unsigned int cluster_id = cx * Y_SIZE + cy; 296 unsigned int info = _coproc_info[cluster_id]; 297 unsigned int nb_to = info & 0xFF; 298 unsigned int nb_from = (info>>8) & 0xFF; 299 unsigned int channel; 300 301 // stops coprocessor and communication channels 302 _mwr_set_coproc_register( cluster_xy , coproc_reg_index , 0 ); 303 for ( channel = 0 ; channel < (nb_from + nb_to) ; channel++ ) 304 { 305 _mwr_set_channel_register( cluster_xy , channel , MWR_CHANNEL_RUNNING , 0 ); 306 } 307 308 // deallocates coprocessor coordinates in task context 309 _set_context_slot( CTX_COPROC_ID , 0xFFFFFFFF ); 310 311 // release coprocessor lock 312 _simple_lock_release( &_coproc_lock[cluster_id] ); 308 313 309 314 #if GIET_DEBUG_COPROC 310 315 _printf("\n[GIET DEBUG COPROC] _sys_coproc_release() in cluster[%d,%d]\n", 311 x,y );316 cx, cy ); 312 317 #endif 313 318 … … 315 320 } // end _sys_coproc_release() 316 321 317 ///////////////////////////////////////////////////////////////// 318 int _sys_coproc_channel_init( unsigned int cluster_xy, 319 unsigned int channel, 322 ////////////////////////////////////////////////////////////// 323 int _sys_coproc_channel_init( unsigned int channel, 320 324 giet_coproc_channel_t* desc ) 321 325 { 322 // TODO checking coprocessor ownership... 323 324 // check cluster coordinates 325 unsigned int cx = cluster_xy >> Y_WIDTH; 326 unsigned int cy = cluster_xy & ((1<<Y_WIDTH)-1); 326 // processor coordinates 327 327 unsigned int procid = _get_procid(); 328 328 unsigned int x = procid >> (Y_WIDTH + P_WIDTH); 329 329 unsigned int y = (procid >> P_WIDTH) & ((1<<Y_WIDTH)-1); 330 if ( (x != cx) || (y != cy) ) 330 unsigned int p = procid & ((1<<P_WIDTH)-1); 331 332 // get coprocessor coordinates 333 unsigned int cluster_xy = _get_context_slot( CTX_COPROC_ID ); 334 if ( cluster_xy > 0xFF ) 331 335 { 332 336 _printf("\n[GIET_ERROR] in _sys_coproc_channel_init(): " 333 "wrong cluster coordinates\n"); 337 "no coprocessor allocated to task running on P[%d,%d,%d]\n", 338 x , y , p ); 334 339 return -1; 335 340 } … … 341 346 (mode != MODE_DMA_NO_IRQ) ) 342 347 { 343 _printf("\n[GIET_ERROR] in _sys_coproc_channel_init(): "348 _printf("\n[GIET_ERROR] in _sys_coproc_channel_init(): " 344 349 " illegal mode\n"); 345 350 return -1; … … 353 358 unsigned int buffer_lsb; 354 359 unsigned int buffer_msb; 355 unsigned long long mwmr_paddr ;360 unsigned long long mwmr_paddr = 0; 356 361 unsigned int mwmr_lsb; 357 362 unsigned int mwmr_msb; 358 unsigned long long lock_paddr ;363 unsigned long long lock_paddr = 0; 359 364 unsigned int lock_lsb; 360 365 unsigned int lock_msb; … … 368 373 369 374 // call MWMR_DMA driver 370 _mwr_set_channel_register( cluster_xy, channel, CHANNEL_MODE, mode );371 _mwr_set_channel_register( cluster_xy, channel, CHANNEL_SIZE, size );372 _mwr_set_channel_register( cluster_xy, channel, CHANNEL_BUFFER_LSB, buffer_lsb );373 _mwr_set_channel_register( cluster_xy, channel, CHANNEL_BUFFER_MSB, buffer_msb );375 _mwr_set_channel_register( cluster_xy, channel, MWR_CHANNEL_MODE, mode ); 376 _mwr_set_channel_register( cluster_xy, channel, MWR_CHANNEL_SIZE, size ); 377 _mwr_set_channel_register( cluster_xy, channel, MWR_CHANNEL_BUFFER_LSB, buffer_lsb ); 378 _mwr_set_channel_register( cluster_xy, channel, MWR_CHANNEL_BUFFER_MSB, buffer_msb ); 374 379 375 380 if ( mode == MODE_MWMR ) … … 381 386 382 387 // call MWMR_DMA driver 383 _mwr_set_channel_register( cluster_xy, channel, CHANNEL_MWMR_LSB, mwmr_lsb );384 _mwr_set_channel_register( cluster_xy, channel, CHANNEL_MWMR_MSB, mwmr_msb );388 _mwr_set_channel_register( cluster_xy, channel, MWR_CHANNEL_MWMR_LSB, mwmr_lsb ); 389 _mwr_set_channel_register( cluster_xy, channel, MWR_CHANNEL_MWMR_MSB, mwmr_msb ); 385 390 386 391 // compute lock physical address … … 390 395 391 396 // call MWMR_DMA driver 392 _mwr_set_channel_register( cluster_xy, channel, CHANNEL_LOCK_LSB, lock_lsb );393 _mwr_set_channel_register( cluster_xy, channel, CHANNEL_LOCK_MSB, lock_msb );397 _mwr_set_channel_register( cluster_xy, channel, MWR_CHANNEL_LOCK_LSB, lock_lsb ); 398 _mwr_set_channel_register( cluster_xy, channel, MWR_CHANNEL_LOCK_MSB, lock_msb ); 394 399 } 395 400 396 401 #if GIET_DEBUG_COPROC 397 _printf("\n[GIET DEBUG COPROC] _sys_coproc_channel_init() in cluster[%d,%d]\n"402 _printf("\n[GIET DEBUG COPROC] _sys_coproc_channel_init() for coproc[%d,%d]\n" 398 403 " channel = %d / mode = %d / buffer_size = %d\n" 399 404 " buffer_paddr = %l / mwmr_paddr = %l / lock_paddr = %l\n", … … 405 410 } // end _sys_coproc_channel_init() 406 411 407 //////////////////////////////////////////////////////// 408 int _sys_coproc_channel_start( unsigned int cluster_xy, 409 unsigned int channel ) 410 { 411 // TODO checking coprocessor ownership... 412 413 // check cluster coordinates 414 unsigned int cx = cluster_xy >> Y_WIDTH; 415 unsigned int cy = cluster_xy & ((1<<Y_WIDTH)-1); 412 //////////////////////////////////////////////////// 413 int _sys_coproc_run( unsigned int coproc_reg_index ) 414 { 415 // processor coordinates 416 416 unsigned int procid = _get_procid(); 417 417 unsigned int x = procid >> (Y_WIDTH + P_WIDTH); 418 418 unsigned int y = (procid >> P_WIDTH) & ((1<<Y_WIDTH)-1); 419 if ( (x != cx) || (y != cy) ) 420 { 421 _printf("\n[GIET_ERROR] in _sys_coproc_channel_start():" 422 " wrong coordinates\n"); 419 unsigned int p = procid & ((1<<P_WIDTH)-1); 420 421 // get coprocessor coordinates 422 unsigned int cluster_xy = _get_context_slot( CTX_COPROC_ID ); 423 if ( cluster_xy > 0xFF ) 424 { 425 _printf("\n[GIET_ERROR] in _sys_coproc_run(): " 426 "no coprocessor allocated to task running on P[%d,%d,%d]\n", 427 x , y , p ); 423 428 return -1; 424 429 } 425 426 // reset synchronisation variable 427 unsigned int coproc_id = (x * Y_SIZE) + y; 428 _coproc_done[coproc_id] = 0; 429 430 // call MWMR_DMA driver 431 _mwr_set_channel_register( cluster_xy, channel, CHANNEL_RUNNING, 1 ); 430 431 unsigned int cx = cluster_xy >> Y_WIDTH; 432 unsigned int cy = cluster_xy & ((1<<Y_WIDTH)-1); 433 unsigned int cluster_id = cx * Y_SIZE + cy; 434 unsigned int info = _coproc_info[cluster_id]; 435 unsigned int nb_to = info & 0xFF; 436 unsigned int nb_from = (info>>8) & 0xFF; 437 unsigned int mode = 0xFFFFFFFF; 438 unsigned int channel; 439 440 // register coprocessor running mode 441 for ( channel = 0 ; channel < (nb_from + nb_to) ; channel++ ) 442 { 443 unsigned int temp; 444 temp = _mwr_get_channel_register( cluster_xy , channel , MWR_CHANNEL_MODE ); 445 446 if ( mode == 0xFFFFFFFF ) 447 { 448 mode = temp; 449 } 450 else if ( temp != mode ) 451 { 452 _printf("\n[GIET_ERROR] P[%d,%d,%d] in _sys_coproc_run() for coprocessor[%d,%d]\n" 453 " all channels don't have the same mode\n", x , y , p , cx , cy ); 454 return -1; 455 } 456 } 457 _coproc_mode[cluster_id] = mode; 458 459 // start all communication channels 460 for ( channel = 0 ; channel < (nb_from + nb_to) ; channel++ ) 461 { 462 _mwr_set_channel_register( cluster_xy , channel , MWR_CHANNEL_RUNNING , 1 ); 463 } 464 465 ////////////////////////////////////////////////////////////////////////// 466 if ( (mode == MODE_MWMR) || (mode == MODE_DMA_NO_IRQ) ) // no descheduling 467 { 468 // start coprocessor 469 _mwr_set_coproc_register( cluster_xy , coproc_reg_index , 1 ); 432 470 433 471 #if GIET_DEBUG_COPROC 434 _printf("\n[GIET DEBUG COPROC] _sys_coproc_channel_start() in cluster[%d,%d]" 435 " / channel = %d\n", x , y , channel ); 436 #endif 437 438 return 0; 439 } // end _sys_coproc_channel_start() 440 441 /////////////////////////////////////////////////////// 442 int _sys_coproc_channel_stop( unsigned int cluster_xy, 443 unsigned int channel ) 444 { 445 // TODO checking coprocessor ownership... 446 447 // check cluster coordinates 448 unsigned int cx = cluster_xy >> Y_WIDTH; 449 unsigned int cy = cluster_xy & ((1<<Y_WIDTH)-1); 472 if ( mode == MODE_MWMR ) 473 _printf("\n[GIET DEBUG COPROC] _sys_coproc_run() P[%d,%d,%d] starts coprocessor[%d,%d]\n" 474 " MODE_MWMR at cycle %d\n", x , y , p , cx , cy , _get_proctime() ); 475 else 476 _printf("\n[GIET DEBUG COPROC] _sys_coproc_run() P[%d,%d,%d] starts coprocessor[%d,%d]\n" 477 " MODE_DMA_NO_IRQ at cycle %d\n", x , y , p , cx , cy , _get_proctime() ); 478 #endif 479 480 return 0; 481 } 482 /////////////////////////////////////////////////////////////////////////// 483 else // mode == MODE_DMA_IRQ => descheduling 484 { 485 // set _coproc_gtid 486 unsigned int ltid = _get_current_task_id(); 487 _coproc_gtid[cluster_id] = (procid<<16) + ltid; 488 489 // enters critical section 490 unsigned int save_sr; 491 _it_disable( &save_sr ); 492 493 // reset runnable 494 _set_task_slot( x, y, p, ltid, CTX_RUN_ID, 0 ); 495 496 // start coprocessor 497 _mwr_set_coproc_register( cluster_xy , coproc_reg_index , 1 ); 498 499 #if GIET_DEBUG_COPROC 500 _printf("\n[GIET DEBUG COPROC] _sys_coproc_run() P[%d,%d,%d] starts coprocessor[%d,%d]\n" 501 " MODE_DMA_IRQ at cycle %d\n", x , y , p , cx , cy , _get_proctime() ); 502 #endif 503 504 // deschedule task 505 _ctx_switch(); 506 507 #if GIET_DEBUG_COPROC 508 _printf("\n[GIET DEBUG COPROC] _sys_coproc_run() P[%d,%d,%d] resume\n" 509 " coprocessor[%d,%d] completion at cycle %d\n", 510 x , y , p , cx , cy , _get_proctime() ); 511 #endif 512 513 // restore SR 514 _it_restore( &save_sr ); 515 516 // return error computed by mwr_isr() 517 return _coproc_error[cluster_id]; 518 } 519 } // end _sys_coproc_run() 520 521 /////////////////////////// 522 int _sys_coproc_completed() 523 { 524 // processor coordinates 450 525 unsigned int procid = _get_procid(); 451 526 unsigned int x = procid >> (Y_WIDTH + P_WIDTH); 452 527 unsigned int y = (procid >> P_WIDTH) & ((1<<Y_WIDTH)-1); 453 if ( (x != cx) || (y != cy) ) 454 { 455 _printf("\n[GIET_ERROR] in _sys_coproc_channel_stop(): wrong coordinates\n"); 528 unsigned int p = procid & ((1<<P_WIDTH)-1); 529 530 // get coprocessor coordinates 531 unsigned int cluster_xy = _get_context_slot( CTX_COPROC_ID ); 532 if ( cluster_xy > 0xFF ) 533 { 534 _printf("\n[GIET_ERROR] in _sys_coproc_completed(): " 535 "no coprocessor allocated to task running on P[%d,%d,%d]\n", 536 x , y , p ); 456 537 return -1; 457 538 } 458 459 // call MWMR_DMA driver 460 _mwr_set_channel_register( cluster_xy, channel, CHANNEL_RUNNING, 0 ); 539 540 unsigned int cx = cluster_xy >> Y_WIDTH; 541 unsigned int cy = cluster_xy & ((1<<Y_WIDTH)-1); 542 unsigned int cluster_id = cx * Y_SIZE + cy; 543 unsigned int mode = _coproc_mode[cluster_id]; 544 545 // analyse possible errors 546 if ( mode == MODE_DMA_NO_IRQ ) 547 { 548 unsigned int info = _coproc_info[cluster_id]; 549 unsigned int nb_to = info & 0xFF; 550 unsigned int nb_from = (info>>8) & 0xFF; 551 unsigned int error = 0; 552 unsigned int channel; 553 unsigned int status; 554 555 // get status for all channels, and signal all reported errors 556 for ( channel = 0 ; channel < (nb_to +nb_from) ; channel++ ) 557 { 558 do 559 { 560 status = _mwr_get_channel_register( cluster_xy , channel , MWR_CHANNEL_STATUS ); 561 if ( status == MWR_CHANNEL_ERROR_DATA ) 562 { 563 _printf("\n[GIET_ERROR] in _sys_coproc_completed()" 564 " / channel %d / DATA_ERROR\n", channel ); 565 error = 1; 566 break; 567 } 568 else if ( status == MWR_CHANNEL_ERROR_LOCK ) 569 { 570 _printf("\n[GIET_ERROR] in _sys_coproc_completed()" 571 " / channel %d / LOCK_ERROR\n", channel ); 572 error = 1; 573 break; 574 } 575 else if ( status == MWR_CHANNEL_ERROR_DESC ) 576 { 577 _printf("\n[GIET_ERROR] in _sys_coproc_completed()" 578 " / channel %d / DESC_ERROR\n", channel ); 579 error = 1; 580 break; 581 } 582 } while ( status == MWR_CHANNEL_BUSY ); 583 584 // reset channel 585 _mwr_set_channel_register( cluster_xy , channel , MWR_CHANNEL_RUNNING , 0 ); 586 587 } // end for channels 461 588 462 589 #if GIET_DEBUG_COPROC 463 _printf("\n[GIET DEBUG COPROC] _sys_coproc_channel_stop() in cluster[%d,%d]" 464 " / channel = %d\n", x , y , channel ); 465 #endif 466 467 return 0; 468 } // end _sys_coproc_channel_stop() 469 470 ///////////////////////////////////////////////////// 471 int _sys_coproc_completed( unsigned int cluster_xy ) 472 { 473 // TODO checking coprocessor ownership... 474 475 // check cluster coordinates 476 unsigned int cx = cluster_xy >> Y_WIDTH; 477 unsigned int cy = cluster_xy & ((1<<Y_WIDTH)-1); 478 unsigned int procid = _get_procid(); 479 unsigned int x = procid >> (Y_WIDTH + P_WIDTH); 480 unsigned int y = (procid >> P_WIDTH) & ((1<<Y_WIDTH)-1); 481 if ( (x != cx) || (y != cy) ) 482 { 483 _printf("\n[GIET_ERROR] in _sys_coproc_completed(): " 484 "wrong cluster coordinates\n"); 485 return -1; 486 } 487 488 // polling the synchronisation variable 489 unsigned int coproc_id = (x * Y_SIZE) + y; 490 while ( ioread32( &_coproc_done[coproc_id]) == 0 ) asm volatile("nop"); 491 492 _coproc_done[coproc_id] = 0; 493 494 #if GIET_DEBUG_COPROC 495 _printf("\n[GIET DEBUG COPROC] _sys_coproc_completed() in cluster[%d,%d]\n", 496 x, y ); 497 #endif 498 499 return 0; 590 _printf("\n[GIET DEBUG COPROC] _sys_coproc_completed() for coprocessor[%d,%d] error = %d\n", 591 cx , cy , error ); 592 #endif 593 594 return error; 595 } 596 else // mode == MODE_MWMR or MODE_DMA_IRQ 597 { 598 _printf("\n[GIET ERROR] sys_coproc_completed() should not be called for " 599 "coprocessor[%d,%d] running in MODE_MWMR or MODE_DMA_IRQ\n", cx , cy ); 600 return 1; 601 } 500 602 } // end _sys_coproc_completed() 501 603 -
soft/giet_vm/giet_kernel/sys_handler.h
r528 r556 83 83 84 84 int _sys_coproc_alloc( unsigned int coproc_type, 85 unsigned int* coproc_info, 86 unsigned int* cluster_xy ); 87 88 int _sys_coproc_release( unsigned int cluster_xy ); 89 90 int _sys_coproc_channel_init( unsigned int cluster_xy, 91 unsigned int channel, 85 unsigned int* coproc_info ); 86 87 int _sys_coproc_release( unsigned int coproc_reg_index ); 88 89 int _sys_coproc_channel_init( unsigned int channel, 92 90 giet_coproc_channel_t* desc ); 93 91 94 int _sys_coproc_channel_start( unsigned int cluster_xy, 95 unsigned int channel ); 96 97 int _sys_coproc_channel_stop( unsigned int cluster_xy, 98 unsigned int channel ); 99 100 int _sys_coproc_completed( unsigned int cluster_xy ); 92 int _sys_coproc_run( unsigned int coproc_reg_index ); 93 94 int _sys_coproc_completed(); 101 95 102 96 ///////////////////////////////////////////////////////////////////////////////
Note: See TracChangeset
for help on using the changeset viewer.