Changeset 722 for soft/giet_vm/giet_libs/mwmr_channel.c
- Timestamp:
- Nov 21, 2015, 1:57:51 PM (9 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
soft/giet_vm/giet_libs/mwmr_channel.c
r693 r722 9 9 #include "giet_config.h" 10 10 #include "stdio.h" 11 #include "stdint.h" 11 12 #include "user_lock.h" 12 13 13 14 ////////////////////////////////////// 14 15 void mwmr_init( mwmr_channel_t* mwmr, 15 u nsigned int*buffer, // buffer base address16 u nsigned intwidth, // number of words per item17 u nsigned intnitems ) // max number of items18 { 19 20 #if GIET_DEBUG_USER_MWMR 21 u nsigned int x;22 u nsigned int y;23 u nsigned int lpid;16 uint32_t* buffer, // buffer base address 17 uint32_t width, // number of words per item 18 uint32_t nitems ) // max number of items 19 { 20 21 #if GIET_DEBUG_USER_MWMR 22 uint32_t x; 23 uint32_t y; 24 uint32_t lpid; 24 25 giet_proc_xyp( &x, &y, &lpid ); 25 giet_tty_printf("\n[ MWMR DEBUG] Proc[%d,%d,%d] initialises fifo %x /"26 " buffer = %x / width = %d / nitems = %d\n",27 x, y, lpid, (u nsigned int)mwmr, (unsigned int)buffer, width, nitems );26 giet_tty_printf("\n[DEBUG MWMR] P[%d,%d,%d] initialises mwmr channel %x" 27 "\n buffer = %x / width = %d / nitems = %d\n", 28 x, y, lpid, (uint32_t)mwmr, (uint32_t)buffer, width, nitems ); 28 29 #endif 29 30 … … 39 40 40 41 41 /////////////////////////////////////////////////// 42 unsigned int nb_mwmr_write( mwmr_channel_t * mwmr, 43 unsigned int * buffer, 44 unsigned int items) 45 { 46 47 #if GIET_DEBUG_USER_MWMR 48 unsigned int x; 49 unsigned int y; 50 unsigned int lpid; 42 /////////////////////////////////////// 43 void mwmr_dump( mwmr_channel_t* mwmr ) 44 { 45 // get the lock 46 lock_acquire( &mwmr->lock ); 47 48 giet_tty_printf("\n[DEBUG MWMR] &fifo = %x / width = %d / depth = %d" 49 "\n sts = %d / ptr = %d / ptw = %d\n", 50 (uint32_t)mwmr, mwmr->width, mwmr->depth, 51 mwmr->sts, mwmr->ptr, mwmr->ptw ); 52 uint32_t line, word, value; 53 for ( line = 0 ; line < ((mwmr->depth)>>2) ; line++ ) 54 { 55 giet_tty_printf(" line %d : ", line ); 56 for ( word = 0 ; word < 4 ; word++ ) 57 { 58 value = mwmr->data[line*4+word]; 59 giet_tty_printf(" %x %x %x %x", 60 (value ) & 0xFF, 61 (value>>8 ) & 0xFF, 62 (value>>16) & 0xFF, 63 (value>>24) & 0xFF ); 64 } 65 giet_tty_printf("\n"); 66 } 67 68 // release the lock 69 lock_release( &mwmr->lock ); 70 71 } 72 73 74 ////////////////////////////////////////////// 75 uint32_t nb_mwmr_write( mwmr_channel_t* mwmr, 76 uint32_t* buffer, 77 uint32_t items) 78 { 79 80 #if GIET_DEBUG_USER_MWMR 81 uint32_t x; 82 uint32_t y; 83 uint32_t lpid; 51 84 giet_proc_xyp( &x, &y, &lpid ); 52 giet_tty_printf("\n[MWMR DEBUG] Proc[%d,%d,%d] enters nb_mwmr_write()" 53 " : mwmr = %x / buffer = %x / items = %d\n", 54 x, y, lpid, (unsigned int)mwmr, (unsigned int)buffer, items ); 55 #endif 56 57 unsigned int n; 58 unsigned int spaces; // number of empty slots (in words) 59 unsigned int nwords; // requested transfer length (in words) 60 unsigned int depth; // channel depth (in words) 61 unsigned int width; // channel width (in words) 62 unsigned int sts; // channel sts 63 unsigned int ptw; // channel ptw 85 #endif 86 87 uint32_t n; 88 uint32_t spaces; // number of empty slots (in words) 89 uint32_t nwords; // requested transfer length (in words) 90 uint32_t depth; // channel depth (in words) 91 uint32_t width; // channel width (in words) 92 uint32_t sts; // channel sts 93 uint32_t ptw; // channel ptw 64 94 65 95 if (items == 0) return 0; … … 88 118 89 119 #if GIET_DEBUG_USER_MWMR 90 giet_tty_printf("\n[MWMR DEBUG] Proc[%d,%d,%d] writes %d words in fifo %x : sts = %d\n", 91 x, y, lpid, nwords, (unsigned int)mwmr, mwmr->sts ); 120 giet_tty_printf("\n[DEBUG MWMR] P[%d,%d,%d] nb_mwmr_write() for %d words" 121 "\n %d words written / fifo %x / sts = %d\n", 122 x, y, lpid, items*width , nwords, (uint32_t)mwmr, mwmr->sts ); 92 123 #endif 93 124 … … 113 144 114 145 #if GIET_DEBUG_USER_MWMR 115 giet_tty_printf("\n[MWMR DEBUG] Proc[%d,%d,%d] writes %d words in fifo %x : sts = %d\n", 116 x, y, lpid, nwords, (unsigned int)mwmr, mwmr->sts ); 146 giet_tty_printf("\n[DEBUG MWMR] P[%d,%d,%d] nb_mwmr_write() for %d words" 147 "\n %d words written / fifo %x / sts = %d\n", 148 x, y, lpid, items*width , nwords, (uint32_t)mwmr, mwmr->sts ); 117 149 #endif 118 150 … … 125 157 126 158 ////////////////////////////////////////////////// 127 u nsigned int nb_mwmr_read( mwmr_channel_t *mwmr,128 unsigned int *buffer,129 unsigned intitems)130 { 131 132 #if GIET_DEBUG_USER_MWMR 133 u nsigned int x;134 u nsigned int y;135 u nsigned int lpid;159 uint32_t nb_mwmr_read( mwmr_channel_t* mwmr, 160 uint32_t* buffer, 161 uint32_t items) 162 { 163 164 #if GIET_DEBUG_USER_MWMR 165 uint32_t x; 166 uint32_t y; 167 uint32_t lpid; 136 168 giet_proc_xyp( &x, &y, &lpid ); 137 giet_tty_printf("\n[MWMR DEBUG] Proc[%d,%d,%d] enters nb_mwmr_read()" 138 " : mwmr = %x / buffer = %x / items = %d\n", 139 x, y, lpid, (unsigned int)mwmr, (unsigned int)buffer, items ); 140 #endif 141 142 unsigned int n; 143 unsigned int nwords; // requested transfer length (words) 144 unsigned int depth; // channel depth (words) 145 unsigned int width; // channel width (words) 146 unsigned int sts; // channel sts (words) 147 unsigned int ptr; // channel ptr (words) 169 #endif 170 171 uint32_t n; 172 uint32_t nwords; // requested transfer length (words) 173 uint32_t depth; // channel depth (words) 174 uint32_t width; // channel width (words) 175 uint32_t sts; // channel sts (words) 176 uint32_t ptr; // channel ptr (words) 148 177 149 178 if (items == 0) return 0; … … 171 200 172 201 #if GIET_DEBUG_USER_MWMR 173 giet_tty_printf("\n[MWMR DEBUG] Proc[%d,%d,%d] read %d words in fifo %x : sts = %d\n", 174 x, y, lpid, nwords, (unsigned int)mwmr, mwmr->sts ); 202 giet_tty_printf("\n[DEBUG MWMR] P[%d,%d,%d] nb_mwmr_read() for %d words" 203 "\n %d words read / fifo %x / sts = %d\n", 204 x, y, lpid, items*width , nwords, (uint32_t)mwmr, mwmr->sts ); 175 205 #endif 176 206 … … 180 210 else if (sts < width) // release lock and return 181 211 { 182 183 #if GIET_DEBUG_USER_MWMR184 giet_tty_printf("\n[MWMR DEBUG] Proc[%d,%d,%d] read nothing in fifo %x : sts = %d\n",185 x, y, lpid, (unsigned int)mwmr, mwmr->sts );186 #endif187 188 212 lock_release( &mwmr->lock ); 189 213 return 0; … … 202 226 203 227 #if GIET_DEBUG_USER_MWMR 204 giet_tty_printf("\n[MWMR DEBUG] Proc[%d,%d,%d] read %d words in fifo %x : sts = %d\n", 205 x, y, lpid, nwords, (unsigned int)mwmr, mwmr->sts ); 228 giet_tty_printf("\n[DEBUG MWMR] P[%d,%d,%d] nb_mwmr_read() for %d words" 229 "\n %d words read / fifo %x / sts = %d\n", 230 x, y, lpid, items*width , nwords, (uint32_t)mwmr, mwmr->sts ); 206 231 #endif 207 232 … … 214 239 215 240 //////////////////////////////////////// 216 void mwmr_write( mwmr_channel_t *mwmr,217 u nsigned int *buffer,218 u nsigned intitems )219 { 220 221 #if GIET_DEBUG_USER_MWMR 222 u nsigned int x;223 u nsigned int y;224 u nsigned int lpid;241 void mwmr_write( mwmr_channel_t* mwmr, 242 uint32_t * buffer, 243 uint32_t items ) 244 { 245 246 #if GIET_DEBUG_USER_MWMR 247 uint32_t x; 248 uint32_t y; 249 uint32_t lpid; 225 250 giet_proc_xyp( &x, &y, &lpid ); 226 giet_tty_printf("\n[MWMR DEBUG] Proc[%d,%d,%d] enters mwmr_write()" 227 " : mwmr = %x / buffer = %x / items = %d\n", 228 x, y, lpid, (unsigned int)mwmr, (unsigned int)buffer, items ); 229 #endif 230 231 unsigned int n; 232 unsigned int spaces; // number of empty slots (in words) 233 unsigned int nwords; // requested transfer length (in words) 234 unsigned int depth; // channel depth (in words) 235 unsigned int width; // channel width (in words) 236 unsigned int sts; // channel sts 237 unsigned int ptw; // channel ptw 251 #endif 252 253 uint32_t n; 254 uint32_t spaces; // number of empty slots (in words) 255 uint32_t nwords; // requested transfer length (in words) 256 uint32_t depth; // channel depth (in words) 257 uint32_t width; // channel width (in words) 258 uint32_t sts; // channel sts 259 uint32_t ptw; // channel ptw 238 260 239 261 if (items == 0) return; … … 264 286 265 287 #if GIET_DEBUG_USER_MWMR 266 giet_tty_printf("\n[MWMR DEBUG] Proc[%d,%d,%d] writes %d words in fifo %x : sts = %d\n", 267 x, y, lpid, nwords, (unsigned int)mwmr, mwmr->sts ); 288 giet_tty_printf("\n[DEBUG MWMR] P[%d,%d,%d] mwmr_write() for %d words" 289 "\n %d words written / fifo %x / sts = %d\n", 290 x, y, lpid, items*width , nwords, (uint32_t)mwmr, mwmr->sts ); 268 291 #endif 269 292 … … 290 313 291 314 #if GIET_DEBUG_USER_MWMR 292 giet_tty_printf("\n[MWMR DEBUG] Proc[%d,%d,%d] writes %d words in fifo %x : sts = %d\n", 293 x, y, lpid, nwords, (unsigned int)mwmr, mwmr->sts ); 315 giet_tty_printf("\n[DEBUG MWMR] P[%d,%d,%d] mwmr_write() for %d words" 316 "\n %d words written / fifo %x / sts = %d\n", 317 x, y, lpid, items*width , nwords, (uint32_t)mwmr, mwmr->sts ); 294 318 #endif 295 319 … … 304 328 305 329 ////////////////////////////////////// 306 void mwmr_read( mwmr_channel_t *mwmr,307 u nsigned int *buffer,308 u nsigned intitems)309 { 310 311 #if GIET_DEBUG_USER_MWMR 312 u nsigned int x;313 u nsigned int y;314 u nsigned int lpid;330 void mwmr_read( mwmr_channel_t* mwmr, 331 uint32_t* buffer, 332 uint32_t items) 333 { 334 335 #if GIET_DEBUG_USER_MWMR 336 uint32_t x; 337 uint32_t y; 338 uint32_t lpid; 315 339 giet_proc_xyp( &x, &y, &lpid ); 316 giet_tty_printf("\n[MWMR DEBUG] Proc[%d,%d,%d] enters mwmr_read()" 317 " : mwmr = %x / buffer = %x / items = %d\n", 318 x, y, lpid, (unsigned int)mwmr, (unsigned int)buffer, items ); 319 #endif 320 321 unsigned int n; 322 unsigned int nwords; // requested transfer length (in words) 323 unsigned int depth; // channel depth (in words) 324 unsigned int width; // channel width (in words) 325 unsigned int sts; // channel sts 326 unsigned int ptr; // channel ptr 340 #endif 341 342 uint32_t n; 343 uint32_t nwords; // requested transfer length (in words) 344 uint32_t depth; // channel depth (in words) 345 uint32_t width; // channel width (in words) 346 uint32_t sts; // channel sts 347 uint32_t ptr; // channel ptr 327 348 328 349 if (items == 0) return; … … 352 373 353 374 #if GIET_DEBUG_USER_MWMR 354 giet_tty_printf("\n[MWMR DEBUG] Proc[%d,%d,%d] read %d words in fifo %x : sts = %d\n", 355 x, y, lpid, nwords, (unsigned int)mwmr, mwmr->sts ); 375 giet_tty_printf("\n[DEBUG MWMR] P[%d,%d,%d] mwmr_read() for %d words" 376 "\n %d words read / fifo %x / sts = %d\n", 377 x, y, lpid, items*width , nwords, (uint32_t)mwmr, mwmr->sts ); 356 378 #endif 357 379 … … 378 400 379 401 #if GIET_DEBUG_USER_MWMR 380 giet_tty_printf("\n[MWMR DEBUG] Proc[%d,%d,%d] read %d words in fifo %x : sts = %d\n", 381 x, y, lpid, nwords, (unsigned int)mwmr, mwmr->sts ); 402 giet_tty_printf("\n[DEBUG MWMR] P[%d,%d,%d] mwmr_read() for %d words" 403 "\n %d words read / fifo %x / sts = %d\n", 404 x, y, lpid, items*width , nwords, (uint32_t)mwmr, mwmr->sts ); 382 405 #endif 383 406 … … 391 414 392 415 416 417 418 419 420 421 422 ///////////////////////////////////////////// 423 void mwmr_bufio_init( mwmr_bufio_t* bufio, 424 uint8_t* buffer, 425 uint32_t size, // number of bytes 426 uint32_t is_input, 427 mwmr_channel_t* mwmr ) 428 { 429 uint32_t bytes_per_item = (mwmr->width)<<2; 430 431 giet_pthread_assert( ((size % bytes_per_item) == 0) , 432 "ERROR in mwmr_bufio_init() : BUFIO size must be multiple of MWMR item size\n"); 433 434 bufio->mwmr = mwmr; 435 bufio->is_input = is_input; 436 bufio->base = buffer; 437 bufio->ptr = 0; 438 bufio->max = 0; 439 bufio->nitems = size / bytes_per_item; 440 bufio->nbytes = size; 441 } // end mwmr_bufio_init() 442 443 //////////////////////////////////////////// 444 void mwmr_bufio_dump( mwmr_bufio_t* bufio ) 445 { 446 giet_tty_printf("\n[DEBUG MWMR] &bufio = %x / &mwmr = %x / &buffer = %x" 447 "\n is_input = %d / nbytes = %d / ptr = %d / max = %d\n", 448 bufio , bufio->mwmr , bufio->base, 449 bufio->is_input , bufio->nbytes , bufio->ptr , bufio->max ); 450 uint32_t i = 0; 451 while ( i < bufio->nbytes ) 452 { 453 giet_tty_printf(" %x", bufio->base[i] ); 454 if ( (i & 0xF) == 0xF ) giet_tty_printf("\n"); 455 i++; 456 } 457 giet_tty_printf("\n"); 458 } // end mwmr_bufio_dump() 459 460 //////////////////////////////////////////////////// 461 uint8_t mwmr_bufio_read_byte( mwmr_bufio_t* bufio ) 462 { 463 giet_pthread_assert( ( bufio->is_input ) , 464 "ERROR in mwmr_bufio_read_byte() : bufio not input\n"); 465 466 uint8_t ret; 467 468 if ( bufio->ptr == 0 ) // refill 469 { 470 uint32_t items; 471 do 472 { 473 items = nb_mwmr_read( bufio->mwmr , (uint32_t*)bufio->base , bufio->nitems ); 474 } 475 while ( items == 0 ); 476 bufio->max = items * ((bufio->mwmr->width)<<2); 477 478 #if GIET_DEBUG_USER_MWMR 479 giet_tty_printf("\n[DEBUG MWMR] mwmr_bufio_read_byte() read %d bytes from mwmr\n", 480 bufio->max ); 481 uint32_t i = 0; 482 while ( i < bufio->max ) 483 { 484 giet_tty_printf(" %x", bufio->base[i] ); 485 if ( (i & 0xF) == 0xF ) giet_tty_printf("\n"); 486 i++; 487 } 488 giet_tty_printf("\n"); 489 #endif 490 491 } 492 493 ret = bufio->base[bufio->ptr]; 494 bufio->ptr++; 495 if ( bufio->ptr == bufio->max ) bufio->ptr = 0; 496 return ret; 497 498 } // end mwmr_bufio_read_byte() 499 500 /////////////////////////////////////////// 501 void mwmr_bufio_skip( mwmr_bufio_t* bufio, 502 uint32_t length ) 503 { 504 giet_pthread_assert( ( bufio->is_input ) , 505 "ERROR in mwmr_bufio_skip() : bufio not input\n"); 506 507 while ( length ) 508 { 509 if ( bufio->ptr == 0 ) // refill 510 { 511 uint32_t items; 512 do 513 { 514 items = nb_mwmr_read( bufio->mwmr , (uint32_t*)bufio->base , bufio->nitems ); 515 } 516 while ( items == 0 ); 517 bufio->max = items * ((bufio->mwmr->width)<<2); 518 519 #if GIET_DEBUG_USER_MWMR 520 giet_tty_printf("\n[DEBUG MWMR] mwmr_bufio_skip() read %d bytes from mwmr\n", 521 bufio->max ); 522 uint32_t i = 0; 523 while ( i < bufio->max ) 524 { 525 giet_tty_printf(" %x", bufio->base[i] ); 526 if ( (i & 0xF) == 0xF ) giet_tty_printf("\n"); 527 i++; 528 } 529 giet_tty_printf("\n"); 530 #endif 531 532 } 533 534 bufio->ptr++; 535 if ( bufio->ptr == bufio->max ) bufio->ptr = 0; 536 length--; 537 } 538 } // end mwmr_bufio_skip() 539 540 ///////////////////////////////////////////// 541 void mwmr_bufio_align( mwmr_bufio_t* bufio ) 542 { 543 giet_pthread_assert( ( bufio->is_input ) , 544 "ERROR in mwmr_bufio_align() : bufio not input\n"); 545 546 uint32_t bytes_per_item = (bufio->mwmr->width)<<2; 547 uint32_t offset = bufio->ptr % bytes_per_item; 548 549 // align ptr on next item boundary if required 550 if ( offset ) 551 { 552 bufio->ptr = bufio->ptr + bytes_per_item - offset; 553 if ( bufio-> ptr == bufio->max ) bufio->ptr = 0; 554 } 555 } // end mwmr_bufio_align() 556 557 558 ///////////////////////////////////////////////// 559 void mwmr_bufio_write_byte( mwmr_bufio_t* bufio, 560 uint8_t value ) 561 { 562 giet_pthread_assert( ( !bufio->is_input ) , 563 "ERROR in mwmr_bufio_write_byte() : bufio not output\n"); 564 565 bufio->base[bufio->ptr] = value; 566 567 bufio->ptr++; 568 if ( bufio->ptr == bufio->nbytes ) // flush bufio 569 { 570 // move data to mwmr channel 571 mwmr_write( bufio->mwmr , (uint32_t*)bufio->base , bufio->nitems ); 572 573 // reinitialise bufio 574 bufio->ptr = 0; 575 576 #if GIET_DEBUG_USER_MWMR 577 giet_tty_printf("\n[DEBUG MWMR] mwmr_bufio_write_byte() write %d bytes to mwmr\n", 578 bufio->nbytes ); 579 uint32_t i = 0; 580 while ( i < bufio->nbytes ) 581 { 582 giet_tty_printf(" %x", bufio->base[i] ); 583 if ( (i & 0xF) == 0xF ) giet_tty_printf("\n"); 584 i++; 585 } 586 giet_tty_printf("\n"); 587 #endif 588 } 589 } // end mwmr_bufio_write_byte() 590 591 ///////////////////////////////////////////// 592 void mwmr_bufio_flush( mwmr_bufio_t* bufio ) 593 { 594 giet_pthread_assert( ( !bufio->is_input ) , 595 "ERROR in mwmr_bufio_flush() : bufio not output\n"); 596 597 uint32_t i; 598 599 uint32_t bytes_per_item = (bufio->mwmr->width)<<2; 600 601 // do nothing if bufio empty 602 if ( bufio->ptr == 0 ) return; 603 604 // compute number of items and extra bytes to be moved to MWMR channel 605 uint32_t nitems = bufio->ptr / bytes_per_item; 606 uint32_t offset = bufio->ptr % bytes_per_item; 607 608 // completes last item with 0 if required 609 if ( offset ) 610 { 611 for( i = bufio->ptr; 612 i < bufio->ptr + bytes_per_item - offset ; 613 i++ ) bufio->base[i] = 0; 614 615 nitems++; 616 } 617 618 #if GIET_DEBUG_USER_MWMR 619 giet_tty_printf("\n[DEBUG MWMR] mwmr_bufio_flush() write %d bytes to mwmr\n", 620 nitems * bytes_per_item ); 621 uint32_t j = 0; 622 while ( j < (nitems * bytes_per_item) ) 623 { 624 giet_tty_printf(" %x", bufio->base[j] ); 625 if ( (j & 0xF) == 0xF ) giet_tty_printf("\n"); 626 j++; 627 } 628 giet_tty_printf("\n"); 629 #endif 630 631 // move nitems to mwmr channel 632 mwmr_write( bufio->mwmr , (uint32_t*)bufio->base , nitems ); 633 634 // reinitialise bufio 635 bufio->ptr = 0; 636 637 } // end mwmr_bufio_flush() 638 639 640 393 641 // Local Variables: 394 642 // tab-width: 4
Note: See TracChangeset
for help on using the changeset viewer.