Changeset 289 for soft/giet_vm/giet_drivers
- Timestamp:
- Feb 4, 2014, 2:16:37 AM (11 years ago)
- Location:
- soft/giet_vm/giet_drivers
- Files:
-
- 4 edited
- 6 copied
Legend:
- Unmodified
- Added
- Removed
-
soft/giet_vm/giet_drivers/bdv_driver.c
r288 r289 64 64 // Arguments are: 65 65 // - to_mem : from external storage to memory when non 0. 66 // - kernel : kernel buffer with identity mapping when non 0.66 // - mode : BOOT / KERNEL / USER 67 67 // - lba : first block index on the external storage. 68 // - buf_ vaddr : virtual base address of the memory buffer.68 // - buf_paddr : physical base address of the memory buffer. 69 69 // - count : number of blocks to be transfered. 70 70 // Returns 0 if success, > 0 if error. … … 109 109 ioc_address[BLOCK_DEVICE_LBA] = lba; 110 110 111 // There istwo policies for transfer completion111 // There are two policies for transfer completion 112 112 // detection, depending on the mode argument: 113 113 … … 120 120 121 121 unsigned int status; 122 if ( _bdv_get_status(0, &status) ) return 1; 123 124 while( (status != BLOCK_DEVICE_READ_SUCCESS) && 125 (status != BLOCK_DEVICE_READ_ERROR) && 126 (status != BLOCK_DEVICE_WRITE_SUCCESS) && 127 (status != BLOCK_DEVICE_WRITE_ERROR) ) 122 do 128 123 { 129 if ( _bdv_get_status( 0, &status) ) return 1;124 if ( _bdv_get_status( 0, &status ) ) return 1; 130 125 131 126 #if GIET_DEBUG_IOC_DRIVER … … 134 129 _tty_release_lock( 0 ); 135 130 #endif 136 137 131 } 132 while( (status != BLOCK_DEVICE_READ_SUCCESS) && 133 (status != BLOCK_DEVICE_READ_ERROR) && 134 (status != BLOCK_DEVICE_WRITE_SUCCESS) && 135 (status != BLOCK_DEVICE_WRITE_ERROR) ); 136 138 137 // analyse status 139 138 error = ( (status == BLOCK_DEVICE_READ_ERROR) || -
soft/giet_vm/giet_drivers/hba_driver.c
r258 r289 77 77 #include <ctx_handler.h> 78 78 #include <mmc_driver.h> 79 #include <hba_driver.h> 79 80 #include <vmem.h> 80 81 … … 124 125 { 125 126 volatile unsigned int* hba_address; 126 hba_address = (unsigned int*)(&seg_ hba_base) + (HBA_SPAN*channel);127 hba_address = (unsigned int*)(&seg_ioc_base) + (HBA_SPAN*channel); 127 128 128 129 if( channel >= NB_HBA_CHANNELS ) 129 130 { 130 _ get_lock(&_tty_put_lock);131 _tty_get_lock( 0 ); 131 132 _puts("\n[GIET ERROR] in _hba_get_status() : illegal channel\n"); 132 _ release_lock(&_tty_put_lock);133 _tty_release_lock( 0 ); 133 134 return 1; 134 135 } … … 146 147 { 147 148 volatile unsigned int* hba_address; 148 hba_address = (unsigned int*)(&seg_ hba_base) + (HBA_SPAN*channel);149 hba_address = (unsigned int*)(&seg_ioc_base) + (HBA_SPAN*channel); 149 150 150 151 if( channel >= NB_HBA_CHANNELS ) 151 152 { 152 _ get_lock(&_tty_put_lock);153 _tty_get_lock( 0 ); 153 154 _puts("\n[GIET ERROR] in _hba_reset_status() : illegal channel\n"); 154 _ release_lock(&_tty_put_lock);155 _tty_release_lock( 0 ); 155 156 return 1; 156 157 } … … 191 192 hba_cmd_table_t* cmd_table; // command table pointer 192 193 193 // TODO The block size must be obtained from the hardware... 194 block_size = 512; 194 block_size = _hba_get_block_size(); 195 195 196 196 // check buffer alignment 197 197 if( buf_vaddr & (block_size-1) ) 198 198 { 199 _ get_lock(&_tty_put_lock);199 _tty_get_lock( 0 ); 200 200 _puts("\n[GIET ERROR] in _hba_set_cmd() : user buffer not block aligned\n"); 201 _ release_lock(&_tty_put_lock);201 _tty_release_lock( 0 ); 202 202 return 1; 203 203 } … … 207 207 if ( channel_id == 0xFFFFFFFF ) 208 208 { 209 _ get_lock(&_tty_put_lock);209 _tty_get_lock( 0 ); 210 210 _puts("\n[GIET ERROR] in _hba_set_cmd() : no HBA channel allocated\n"); 211 _ release_lock(&_tty_put_lock);211 _tty_release_lock( 0 ); 212 212 return 1; 213 213 } 214 214 215 215 // get hba device address 216 hba_address = (unsigned int*)(&seg_ hba_base) + (HBA_SPAN * channel_id);216 hba_address = (unsigned int*)(&seg_ioc_base) + (HBA_SPAN * channel_id); 217 217 218 218 // get command list status … … 223 223 if( pxci & (1<<cmd_id ) ) 224 224 { 225 _ get_lock(&_tty_put_lock);225 _tty_get_lock( 0 ); 226 226 _puts("\n[GIET ERROR] in _hba_set_cmd() : command list full in channel \n"); 227 227 _putd( channel_id ); 228 228 _puts("\n"); 229 _ release_lock(&_tty_put_lock);229 _tty_release_lock( 0 ); 230 230 return 1; 231 231 } … … 262 262 if ( ko ) 263 263 { 264 _ get_lock(&_tty_put_lock);264 _tty_get_lock( 0 ); 265 265 _puts("[GIET ERROR] in _hba_set_cmd() : user buffer unmapped\n"); 266 _ release_lock(&_tty_put_lock);266 _tty_release_lock( 0 ); 267 267 return 1; 268 268 } 269 269 if ((flags & PTE_U) == 0) 270 270 { 271 _ get_lock(&_tty_put_lock);271 _tty_get_lock( 0 ); 272 272 _puts("[GIET ERROR] in _hba_set_cmd() : user buffer not in user space\n"); 273 _ release_lock(&_tty_put_lock);273 _tty_release_lock( 0 ); 274 274 return 1; 275 275 } 276 276 if (((flags & PTE_W) == 0 ) && (is_read == 0) ) 277 277 { 278 _ get_lock(&_tty_put_lock);278 _tty_get_lock( 0 ); 279 279 _puts("[GIET ERROR] in _hba_set_cmd() : user buffer not writable\n"); 280 _ release_lock(&_tty_put_lock);280 _tty_release_lock( 0 ); 281 281 return 1; 282 282 } … … 285 285 if( buf_id > 245 ) 286 286 { 287 _ get_lock(&_tty_put_lock);287 _tty_get_lock( 0 ); 288 288 _puts("[GIET ERROR] in _hba_set_cmd() : max number of buffers is 248\n"); 289 _ release_lock(&_tty_put_lock);289 _tty_release_lock( 0 ); 290 290 return 1; 291 291 } … … 415 415 // Returns 0 if success, > 0 if error. 416 416 /////////////////////////////////////////////////////////////////// 417 unsigned int _hba_write( unsigned int lba, 417 unsigned int _hba_write( unsigned int mode, 418 unsigned int lba, 418 419 void* buffer, 419 420 unsigned int count ) … … 427 428 // Returns 0 if success, > 0 if error. 428 429 /////////////////////////////////////////////////////////////////// 429 unsigned int _hba_read( unsigned int lba, 430 unsigned int _hba_read( unsigned int mode, 431 unsigned int lba, 430 432 void* buffer, 431 433 unsigned int count ) … … 434 436 } 435 437 ////////////////////////////////////////////////////////////////// 436 // This function initializes for a given channel (k)438 // This function initializes for a given channel 437 439 // - the HBA hardware registers, 438 440 // - the command list pointer, … … 440 442 // - the command tables physical addresses array, 441 443 ////////////////////////////////////////////////////////////////// 442 void _hba_init( unsigned int k ) // k == channel_index 444 unsigned int _hba_init( unsigned int channel ) 443 445 { 444 446 unsigned int ppn; … … 452 454 453 455 // HBA registers 454 unsigned int* hba_address = (unsigned int*)(&seg_hba_base) + (HBA_SPAN*k);455 hba_address = (unsigned int*)&seg_ hba_base + HBA_SPAN * k;456 457 hba_address[HBA_PXCLB] = (unsigned int)(&hba_cmd_list[ k]);456 unsigned int* hba_address; 457 hba_address = (unsigned int*)&seg_ioc_base + HBA_SPAN * channel; 458 459 hba_address[HBA_PXCLB] = (unsigned int)(&hba_cmd_list[channel]); 458 460 hba_address[HBA_PXCLBU] = 0; 459 461 hba_address[HBA_PXIE] = 0x40000001; … … 463 465 464 466 // command list pointer 465 hba_cmd_slot[ k] = 0;467 hba_cmd_slot[channel] = 0; 466 468 467 469 // Command list physical addresse 468 vbase = (unsigned int)(&hba_cmd_list[ k]);470 vbase = (unsigned int)(&hba_cmd_list[channel]); 469 471 fail = _v2p_translate( (page_table_t*)pt, 470 472 vbase>>12, … … 473 475 if ( fail ) 474 476 { 475 _ get_lock(&_tty_put_lock);477 _tty_get_lock( 0 ); 476 478 _puts("[GIET ERROR] in _hba_init() : command list unmapped\n"); 477 _ release_lock(&_tty_put_lock);478 _exit();479 } 480 hba_cmd_list_paddr[ k] = ((paddr_t)ppn) | (vbase & 0xFFF);479 _tty_release_lock( 0 ); 480 return 1; 481 } 482 hba_cmd_list_paddr[channel] = ((paddr_t)ppn) | (vbase & 0xFFF); 481 483 482 484 // Command tables physical addresses 483 485 for( c=0 ; c<32 ; c++ ) 484 486 { 485 vbase = (unsigned int)(&hba_cmd_table[ k][c]);487 vbase = (unsigned int)(&hba_cmd_table[channel][c]); 486 488 fail = _v2p_translate( (page_table_t*)pt, 487 489 vbase>>12, … … 490 492 if ( fail ) 491 493 { 492 _ get_lock(&_tty_put_lock);494 _tty_get_lock( 0 ); 493 495 _puts("[GIET ERROR] in _hba_init() : command table unmapped\n"); 494 _release_lock(&_tty_put_lock); 495 _exit(); 496 } 497 hba_cmd_table_paddr[k][c] = ((paddr_t)ppn) | (vbase & 0xFFF); 498 } 496 _tty_release_lock( 0 ); 497 return 1; 498 } 499 hba_cmd_table_paddr[channel][c] = ((paddr_t)ppn) | (vbase & 0xFFF); 500 } 501 502 return 0; 499 503 } 500 504 505 /////////////////////////////////////////////////////////////////////////////// 506 // _hba_get_block_size() 507 // This function returns the block_size of HBA controller 508 /////////////////////////////////////////////////////////////////////////////// 509 unsigned int _hba_get_block_size() 510 { 511 // TODO The block size must be obtained from the hardware... 512 return 512; 513 } 501 514 502 515 -
soft/giet_vm/giet_drivers/hba_driver.h
r258 r289 94 94 95 95 /////////////////////////////////////////////////////////////////////////////////// 96 // HBA device access functions (vci_ multi_nic)96 // HBA device access functions (vci_hba) 97 97 /////////////////////////////////////////////////////////////////////////////////// 98 98 99 unsigned int _hba_write( unsigned int lba, // logic bloc address on device 99 unsigned int _hba_write( unsigned int mode, 100 unsigned int lba, // logic bloc address on device 100 101 void* buffer, // memory buffer base address 101 102 unsigned int count ); // number of blocs 102 103 103 unsigned int _hba_read ( unsigned int lba, // logic bloc address on device 104 unsigned int _hba_read ( unsigned int mode, 105 unsigned int lba, // logic bloc address on device 104 106 void* buffer, // memory buffer base address 105 107 unsigned int count ); // number of blocks 106 108 107 void _hba_init();109 unsigned int _hba_init ( unsigned int channel ); 108 110 109 111 unsigned int _hba_get_status( unsigned int channel, … … 111 113 112 114 unsigned int _hba_reset_status( unsigned int channel ); 115 116 unsigned int _hba_get_block_size (); 113 117 114 118 -
soft/giet_vm/giet_drivers/ioc_driver.c
r279 r289 1 1 /////////////////////////////////////////////////////////////////////////////////// 2 // File : ioc_driver.c 3 // Date : 23/05/2013 4 // Author : alain greiner 2 // File : ioc_driver.c 3 // Date : 23/05/2013 4 // Author : alain greiner 5 // Maintainer : cesar fuguet 5 6 // Copyright (c) UPMC-LIP6 6 7 /////////////////////////////////////////////////////////////////////////////////// … … 12 13 // 13 14 // The _ioc_read() and _ioc_write() functions use the _ioc_access() function, 14 // that is always blocking , but can be called in 4 modes:15 // 16 // - In BOOT_PA mode, the _ioc_access() function use the buffer virtual address17 // as a physical address (as the page tables are not build) and use a polling18 // policy on the IOC_STATUS register to detect transfer completion, as19 // hardware interrupts are not activated. This mode is used by the20 // boot code to load the map.bin file into memory.15 // that is always blocking. The _ioc_access function will call the read or 16 // write function in the driver of the choosen IOC peripheral, which can be for 17 // now: BDV, HBA and SPI. This function can be called in 4 modes: 18 // 19 // - In BOOT_PA mode, the _ioc_access() function use the buffer virtual address 20 // as a physical address (as the page tables are not build). This mode is 21 // used by the boot code to load the map.bin file into memory. 21 22 // 22 23 // - In BOOT_VA mode, the _ioc_access() function makes a V2P translation to 23 // compute the buffer physical address, and use a polling policy on IOC_STATUS 24 // register to detect transfer completion. This mode is used by the boot code 25 // to load the various .elf files into memory. 24 // compute the buffer physical address. This mode is used by the boot code to 25 // load the various .elf files into memory. 26 26 // 27 27 // - In KERNEL mode, the _ioc_access() function makes a V2P translation to 28 // compute the buffer physical address, and use a descheduling strategy: 29 // The ISR executed when transfer completes should restart the calling task. 30 // There is no checking of user access right to the memory buffer. 31 // This mode must be used to access IOC, for an "open" system call. 28 // compute the buffer physical address. There is no checking of user access 29 // right to the memory buffer. This mode must be used to access IOC, for an 30 // "open" system call. 32 31 // 33 32 // - In USER mode, the _ioc_access() function makes a V2P translation to 34 // compute the buffer physical address, and use a descheduling strategy: 35 // The ISR executed when transfer completes should restart the calling task, 36 // The user access right to the memory buffer must be checked. 37 // This mode must be used to access IOC, for a "read/write" system call. 38 // 39 // As the IOC component can be used by several programs running in parallel, 40 // the _ioc_lock variable guaranties exclusive access to the device. The 41 // _ioc_read() and _ioc_write() functions use atomic LL/SC to get the lock. 33 // compute the buffer physical address. The user access right to the memory 34 // buffer must be checked. This mode must be used to access IOC, for a 35 // "read/write" system call. 42 36 // 43 37 // The IOMMU can be activated or not: … … 87 81 #endif 88 82 83 #if (USE_BDV + USE_SPI + USE_HBA) != 1 84 # error: You must use only one IOC controller (BDV or SPI or HBA) 85 #endif 86 87 #if USE_BDV 88 # include <bdv_driver.h> 89 #endif 90 91 #if USE_SPI 92 # include <sdc_driver.h> 93 #endif 94 95 #if USE_HBA 96 # include <hba_driver.h> 97 #endif 98 99 89 100 #define in_unckdata __attribute__((section (".unckdata"))) 90 101 91 102 ///////////////////// IOC global variables 92 103 93 in_unckdata unsigned int 94 in_unckdata volatileunsigned int _ioc_status = 0;104 in_unckdata unsigned int _ioc_lock = 0; 105 in_unckdata unsigned int _ioc_status = 0; 95 106 in_unckdata volatile unsigned int _ioc_gtid; 96 107 in_unckdata volatile unsigned int _ioc_iommu_ix1 = 0; … … 155 166 } 156 167 157 volatile unsigned int * ioc_address = (unsigned int *) &seg_ioc_base ;158 159 168 unsigned int length = count << 9; // count * 512 bytes 160 169 … … 269 278 } 270 279 271 // get the lock protecting IOC 272 _get_lock(&_ioc_lock); 273 274 // set the _ioc_status polling variable 275 _ioc_status = BLOCK_DEVICE_BUSY; 276 277 #if GIET_DEBUG_IOC_DRIVER 278 _tty_get_lock( 0 ); 279 _puts("\n[IOC DEBUG] _ioc_access() : configure IOC\n"); 280 _puts(" - buf_paddr = "); 281 _putl( buf_paddr ); 282 _puts("\n"); 283 _puts(" - count = "); 284 _putd( count ); 285 _puts("\n"); 286 _puts(" - lba = "); 287 _putx( lba ); 288 _puts("\n"); 289 _tty_release_lock( 0 ); 290 #endif 291 292 // send command to IOC 293 if ( GIET_USE_IOMMU ) 294 { 295 ioc_address[BLOCK_DEVICE_BUFFER] = buf_xaddr; 296 ioc_address[BLOCK_DEVICE_COUNT] = count; 297 ioc_address[BLOCK_DEVICE_LBA] = lba; 298 } 299 else 300 { 301 ioc_address[BLOCK_DEVICE_BUFFER] = (unsigned int)buf_paddr; 302 ioc_address[BLOCK_DEVICE_BUFFER_EXT] = (unsigned int)(buf_paddr>>32); 303 ioc_address[BLOCK_DEVICE_COUNT] = count; 304 ioc_address[BLOCK_DEVICE_LBA] = lba; 305 } 306 307 // There is two policies for transfer completion 308 // detection, depending on the mode argument: 309 310 if ( (mode == IOC_BOOT_PA_MODE) || // We poll directly the IOC_STATUS register 311 (mode == IOC_BOOT_VA_MODE) ) // as IRQs are masked. 312 { 313 // Launch transfert 314 if (to_mem == 0) ioc_address[BLOCK_DEVICE_OP] = BLOCK_DEVICE_WRITE; 315 else ioc_address[BLOCK_DEVICE_OP] = BLOCK_DEVICE_READ; 316 317 unsigned int status; 318 if ( _ioc_get_status(0, &status) ) return 1; 319 320 while( (status != BLOCK_DEVICE_READ_SUCCESS) && 321 (status != BLOCK_DEVICE_READ_ERROR) && 322 (status != BLOCK_DEVICE_WRITE_SUCCESS) && 323 (status != BLOCK_DEVICE_WRITE_ERROR) ) 324 { 325 if ( _ioc_get_status(0, &status) ) return 1; 326 327 #if GIET_DEBUG_IOC_DRIVER 328 _tty_get_lock( 0 ); 329 _puts("\n[IOC DEBUG] _ioc_access() : ... waiting on IOC_STATUS register ...\n"); 330 _tty_release_lock( 0 ); 331 #endif 332 333 } 334 // analyse status 335 error = ( (status == BLOCK_DEVICE_READ_ERROR) || 336 (status == BLOCK_DEVICE_WRITE_ERROR) ); 337 338 // release lock 339 _release_lock(&_ioc_lock); 340 } 341 else // in USER or KERNEL mode, we deschedule the task. 342 // When the task is rescheduled by the ISR, we reset 343 // the _ioc_status variable, and release the lock 344 { 345 // We need a critical section, because we must reset the RUN bit 346 // before to launch the transfer, and we want to avoid to be descheduled 347 // between these two operations. 348 349 // Enter critical section 350 _it_disable(); 351 352 // set _ioc_gtid and reset runnable 353 unsigned int ltid = _get_proc_task_id(); 354 unsigned int pid = _get_procid(); 355 _ioc_gtid = (pid<<16) + ltid; 356 _set_task_slot( pid, ltid, CTX_RUN_ID, 0 ); 357 358 // Launch transfert 359 if (to_mem == 0) ioc_address[BLOCK_DEVICE_OP] = BLOCK_DEVICE_WRITE; 360 else ioc_address[BLOCK_DEVICE_OP] = BLOCK_DEVICE_READ; 361 362 // deschedule task 363 _ctx_switch(); 364 365 // analyse status 366 error = ( (_ioc_status == BLOCK_DEVICE_READ_ERROR) || 367 (_ioc_status == BLOCK_DEVICE_WRITE_ERROR) ); 368 369 // reset _ioc_status and release lock 370 _ioc_status = BLOCK_DEVICE_IDLE; 371 _release_lock(&_ioc_lock); 372 } 373 374 #if GIET_DEBUG_IOC_DRIVER 375 _tty_get_lock( 0 ); 376 _puts("\n[IOC DEBUG] _ioc_access completed at cycle "); 377 _putd( _get_proctime() ); 378 _puts(" for processor "); 379 _putd( _get_procid() ); 380 _puts(" : error = "); 381 _putd( (unsigned int)error ); 382 _puts("\n"); 383 _tty_release_lock( 0 ); 280 if ( GIET_USE_IOMMU ) buf_paddr = (paddr_t) buf_xaddr; 281 282 #if USE_BDV 283 if (to_mem) error = _bdv_read (mode, lba, buf_paddr, count); 284 else error = _bdv_write(mode, lba, buf_paddr, count); 285 #elif USE_SPI 286 if (to_mem) error = _sdc_read (mode, lba, buf_paddr, count); 287 else error = _sdc_write(mode, lba, buf_paddr, count); 288 #elif USE_HBA 289 if (to_mem) error = _hba_read (mode, lba, buf_paddr, count); 290 else error = _hba_write(mode, lba, buf_paddr, count); 384 291 #endif 385 292 … … 392 299 // Return 0 for success. 393 300 /////////////////////////////////////////////////////////////////////////////// 394 unsigned int _ioc_init() 395 { 396 volatile unsigned int * ioc_address = (unsigned int *) &seg_ioc_base ; 397 398 if ( ioc_address[BLOCK_DEVICE_BLOCK_SIZE] != 512 ) 399 { 400 _puts("\n[GIET ERROR] in _ioc_init() : block size must be 512 bytes\n"); 401 _exit(); 402 } 403 404 ioc_address[BLOCK_DEVICE_IRQ_ENABLE] = 1; 405 return 0; 301 unsigned int _ioc_init( unsigned int channel ) 302 { 303 #if USE_BDV 304 return _bdv_init( channel ); 305 #elif USE_SPI 306 return _sdc_init( channel ); 307 #elif USE_HBA 308 return _hba_init( channel ); 309 #endif 406 310 } 407 311 … … 457 361 unsigned int* status ) 458 362 { 459 if ( channel != 0 ) 460 { 461 _tty_get_lock( 0 ); 462 _puts("\n[GIET ERROR] in _ioc_get_status : illegal channel\n"); 463 _tty_release_lock( 0 ); 464 465 return 1; 466 } 467 468 // get IOC base address 469 volatile unsigned int * ioc_address = (unsigned int *) &seg_ioc_base; 470 *status = ioc_address[BLOCK_DEVICE_STATUS]; 471 472 return 0; 363 #if USE_BDV 364 return _bdv_get_status(channel, status); 365 #elif USE_SPI 366 return _sdc_get_status(channel, status); 367 #elif USE_HBA 368 return _hba_get_status(channel, status); 369 #endif 473 370 } 474 371 … … 479 376 unsigned int _ioc_get_block_size() 480 377 { 481 // get IOC base address 482 volatile unsigned int * ioc_address = (unsigned int *) &seg_ioc_base; 483 484 return ioc_address[BLOCK_DEVICE_BLOCK_SIZE]; 378 #if USE_BDV 379 return _bdv_get_block_size(); 380 #elif USE_SPI 381 return _sdc_get_block_size(); 382 #elif USE_HBA 383 return _hba_get_block_size(); 384 #endif 485 385 } 486 386 -
soft/giet_vm/giet_drivers/ioc_driver.h
r279 r289 6 6 /////////////////////////////////////////////////////////////////////////////////// 7 7 8 #ifndef _GIET_IOC_DRIVER S_H_9 #define _GIET_IOC_DRIVER S_H_8 #ifndef _GIET_IOC_DRIVER_H_ 9 #define _GIET_IOC_DRIVER_H_ 10 10 11 11 /////////////////////////////////////////////////////////////////////////////////// … … 53 53 /////////////////////////////////////////////////////////////////////////////////// 54 54 55 extern unsigned int 56 extern volatileunsigned int _ioc_status;55 extern unsigned int _ioc_lock; 56 extern unsigned int _ioc_status; 57 57 extern volatile unsigned int _ioc_gtid; 58 58 extern volatile unsigned int _ioc_iommu_ix1; 59 59 extern volatile unsigned int _ioc_iommu_npages; 60 60 61 extern unsigned int _ioc_init( );61 extern unsigned int _ioc_init( unsigned int channel ); 62 62 63 63 extern unsigned int _ioc_write( unsigned int mode,
Note: See TracChangeset
for help on using the changeset viewer.