Changeset 647 for trunk/hal/tsar_mips32/drivers
- Timestamp:
- Oct 22, 2019, 1:48:51 PM (5 years ago)
- Location:
- trunk/hal/tsar_mips32/drivers
- Files:
-
- 3 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/hal/tsar_mips32/drivers/soclib_bdv.c
r626 r647 33 33 void soclib_bdv_init( chdev_t * chdev ) 34 34 { 35 // get extended pointer on SOCLIB_BDV peripheral base 36 xptr_t bdv_xp = chdev->base; 37 38 // set driver specific fields 35 // set driver specific fields in IOC chdev 39 36 chdev->cmd = &soclib_bdv_cmd; 40 37 chdev->isr = &soclib_bdv_isr; 41 38 39 // get extended pointer on SOCLIB_BDV peripheral base 40 xptr_t base_xp = chdev->base; 41 42 42 // get hardware device cluster and local pointer 43 cxy_t b dv_cxy = GET_CXY( bdv_xp );44 uint32_t * b dv_ptr = (uint32_t *)GET_PTR( bdv_xp );43 cxy_t base_cxy = GET_CXY( base_xp ); 44 uint32_t * base_ptr = GET_PTR( base_xp ); 45 45 46 46 // get block_size and block_count 47 uint32_t block_size = hal_remote_l32( XPTR( bdv_cxy , bdv_ptr + BDV_BLOCK_SIZE_REG ) );48 uint32_t block_count = hal_remote_l32( XPTR( b dv_cxy , bdv_ptr + BDV_SIZE_REG ) );49 50 // set IOC device descriptor extension47 uint32_t block_size = hal_remote_l32( XPTR( base_cxy , base_ptr + BDV_BLOCK_SIZE_REG ) ); 48 uint32_t block_count = hal_remote_l32( XPTR( base_cxy , base_ptr + BDV_SIZE_REG ) ); 49 50 // set IOC chdev extension fields 51 51 chdev->ext.ioc.size = block_size; 52 52 chdev->ext.ioc.count = block_count; … … 91 91 else assert( false , "illegal command" ); 92 92 93 // get IOC device cluster and local pointer93 // get cluster and local pointer on IOC chdev 94 94 cxy_t ioc_cxy = GET_CXY( ioc_xp ); 95 95 chdev_t * ioc_ptr = GET_PTR( ioc_xp ); … … 131 131 // waiting policy depends on the command type 132 132 // - for IOC_READ / IOC_WRITE commands, this function is called by the server thread 133 // that blocks and deschedules after launching the I/O transfer. 134 // The I/O operation status is reported in the command by the ISR. 135 // - for IOC_SYNC_READ / IOC_SYNC_WRITE command, this function is called by the client 136 // thread that polls the BDV status register until I/O transfer completion. 133 // => block and deschedule after launching the I/O transfer. 134 // The I/O operation status is reported in the command by the ISR, and the 135 // server thread is re-activated by the ISR. 136 // - for IOC_SYNC_READ / IOC_SYNC_WRITE, this function is called by the client thread 137 // => mask the IOC IRQ and poll the BDV status register until I/O transfer completion, 138 // and report status in the command. 137 139 138 140 if( (cmd_type == IOC_SYNC_READ) || (cmd_type == IOC_SYNC_WRITE) ) // polling policy 139 141 { 142 // get core handling the IOC IRQ 143 thread_t * server = (thread_t *)hal_remote_lpt( XPTR( ioc_cxy , &ioc_ptr->server ) ); 144 core_t * core = (core_t *)hal_remote_lpt( XPTR( ioc_cxy , &server->core ) ); 145 lid_t lid = (lid_t)hal_remote_l32( XPTR( ioc_cxy , &core->lid ) ); 146 147 // mask the IOC IRQ 148 dev_pic_disable_irq( lid , ioc_xp ); 149 140 150 // launch I/O operation on BDV device 141 151 hal_remote_s32( XPTR( seg_cxy , seg_ptr + BDV_OP_REG ) , op ); … … 149 159 (status == BDV_WRITE_SUCCESS) ) // successfully completed 150 160 { 161 // unmask IOC IRQ 162 dev_pic_enable_irq( lid , ioc_xp ); 163 164 // report success in command 151 165 hal_remote_s32( XPTR( th_cxy , &th_ptr->ioc_cmd.error ) , 0 ); 152 166 … … 154 168 cycle = (uint32_t)hal_get_cycles(); 155 169 if( (DEBUG_HAL_IOC_RX < cycle) && (cmd_type == IOC_SYNC_READ) ) 156 printk("\n[%s] thread[%x,%x] exit after SYNC_READfor client thread[%x,%x] / cycle %d\n",170 printk("\n[%s] thread[%x,%x] SYNC_READ success for client thread[%x,%x] / cycle %d\n", 157 171 __FUNCTION__, this->process->pid, this->trdid, client_pid, client_trdid, cycle ); 158 172 #endif … … 161 175 cycle = (uint32_t)hal_get_cycles(); 162 176 if( (DEBUG_HAL_IOC_TX < cycle) && (cmd_type == IOC_SYNC_WRITE) ) 163 printk("\n[%s] thread[%x,%x] exit after SYNC_WRITEfor client thread[%x,%x] / cycle %d\n",177 printk("\n[%s] thread[%x,%x] SYNC_WRITE success for client thread[%x,%x] / cycle %d\n", 164 178 __FUNCTION__, this->process->pid, this->trdid, client_pid, client_trdid, cycle ); 165 179 #endif … … 172 186 else // error reported 173 187 { 188 // unmask IOC IRQ 189 dev_pic_enable_irq( lid , ioc_xp ); 190 191 // report failure in command 174 192 hal_remote_s32( XPTR( th_cxy , &th_ptr->ioc_cmd.error ) , 1 ); 193 194 #if DEBUG_HAL_IOC_RX 195 cycle = (uint32_t)hal_get_cycles(); 196 if( (DEBUG_HAL_IOC_RX < cycle) && (cmd_type == IOC_SYNC_READ) ) 197 printk("\n[%s] thread[%x,%x] SYNC_READ failure for client thread[%x,%x] / cycle %d\n", 198 __FUNCTION__, this->process->pid, this->trdid, client_pid, client_trdid, cycle ); 199 #endif 200 201 #if DEBUG_HAL_IOC_TX 202 cycle = (uint32_t)hal_get_cycles(); 203 if( (DEBUG_HAL_IOC_TX < cycle) && (cmd_type == IOC_SYNC_WRITE) ) 204 printk("\n[%s] thread[%x,%x] SYNC_WRITE failure for client thread[%x,%x] / cycle %d\n", 205 __FUNCTION__, this->process->pid, this->trdid, client_pid, client_trdid, cycle ); 206 #endif 175 207 break; 176 208 } -
trunk/hal/tsar_mips32/drivers/soclib_fbf.c
r75 r647 2 2 * soclib_fbf.c - soclib frame-buffer driver implementation. 3 3 * 4 * Author Alain greiner (2016 )4 * Author Alain greiner (2016,2017,2018,2019) 5 5 * 6 6 * Copyright (c) UPMC Sorbonne Universites … … 22 22 */ 23 23 24 #include <soclib_fbf.h> 25 #include <hal_kernel_types.h> 26 #include <hal_uspace.h> 27 #include <chdev.h> 28 #include <dev_fbf.h> 29 #include <printk.h> 30 #include <thread.h> 31 32 /////////////////////////////////////// 33 void soclib_fbf_init( chdev_t * chdev ) 34 { 35 // set driver specific fields in FBF chdev 36 chdev->cmd = &soclib_fbf_cmd; 37 chdev->isr = NULL; 38 39 // get extended pointer on SOCLIB_FBF peripheral segment base 40 xptr_t base_xp = chdev->base; 41 42 // get cluster and local pointer for the SOCLIB_FBF peripheral segment 43 cxy_t base_cxy = GET_CXY( base_xp ); 44 uint32_t * base_ptr = GET_PTR( base_xp ); 45 46 // get frame buffer width, height, and type 47 uint32_t width = hal_remote_l32( XPTR( base_cxy , base_ptr + FBF_WIDTH_REG ) ); 48 uint32_t height = hal_remote_l32( XPTR( base_cxy , base_ptr + FBF_HEIGHT_REG ) ); 49 uint32_t type = hal_remote_l32( XPTR( base_cxy , base_ptr + FBF_SUBSAMPLING_REG ) ); 50 51 // set FBF chdev extension fields 52 chdev->ext.fbf.width = width; 53 chdev->ext.fbf.height = height; 54 chdev->ext.fbf.subsampling = type; 55 56 } // end soclib_fbf_init() 57 58 ///////////////////////////////////////////////////////////////// 59 void __attribute__((noinline)) soclib_fbf_cmd( xptr_t thread_xp ) 60 { 61 uint32_t cmd_type; // READ / WRITE / SYNC_READ / SYNC_WRITE 62 uint32_t offset; 63 uint32_t length; 64 void * buffer; // pointer on memory buffer in user space 65 xptr_t fbf_xp; 66 uint32_t status; // I/0 operation status (from BDV) 67 68 // get client thread cluster and local pointer 69 cxy_t th_cxy = GET_CXY( thread_xp ); 70 thread_t * th_ptr = GET_PTR( thread_xp ); 71 72 #if (DEBUG_HAL_FBF|| DEBUG_HAL_FBF) 73 uint32_t cycle = (uint32_t)hal_get_cycles(); 74 thread_t * this = CURRENT_THREAD; 75 process_t * process = hal_remote_lpt( XPTR( th_cxy , &th_ptr->process ) ); 76 pid_t client_pid = hal_remote_l32( XPTR( th_cxy , &process->pid ) ); 77 trdid_t client_trdid = hal_remote_l32( XPTR( th_cxy , &th_ptr->trdid ) ); 78 #endif 79 80 // get command arguments 81 cmd_type = hal_remote_l32( XPTR( th_cxy , &th_ptr->fbf_cmd.type ) ); 82 offset = hal_remote_l32( XPTR( th_cxy , &th_ptr->fbf_cmd.offset ) ); 83 length = hal_remote_l32( XPTR( th_cxy , &th_ptr->fbf_cmd.length ) ); 84 buffer = hal_remote_lpt( XPTR( th_cxy , &th_ptr->fbf_cmd.buffer ) ); 85 fbf_xp = (xptr_t)hal_remote_l64( XPTR( th_cxy , &th_ptr->fbf_cmd.dev_xp ) ); 86 87 // get cluster and local pointer on FBF chdev 88 cxy_t fbf_cxy = GET_CXY( fbf_xp ); 89 chdev_t * fbf_ptr = GET_PTR( fbf_xp ); 90 91 // get extended pointer on SOCLIB_FBF peripheral segment base 92 xptr_t base_xp = (xptr_t)hal_remote_l64( XPTR( fbf_cxy , &fbf_ptr->base ) ); 93 94 // execute command 95 if( cmd_type == FBF_READ ) // use a (kernel -> user) memcpy 96 { 97 98 #if DEBUG_HAL_FBF 99 if( DEBUG_HAL_FBF < cycle ) 100 printk("\n[%s] thread[%x,%x] / client[%x,%x] / READ / offset / length / buffer %x / cycle %d\n", 101 __FUNCTION__ , this->process->pid, this->trdid, client_pid, client_trdid, 102 offset, length, buffer, cycle ); 103 #endif 104 hal_copy_to_uspace( buffer, 105 base_xp + offset, 106 length ); 107 108 } 109 else // cmd_type == FBF_WRITE => use a (user -> kernel) memcpy 110 { 111 112 #if DEBUG_HAL_FBF 113 if( DEBUG_HAL_FBF < cycle ) 114 printk("\n[%s] thread[%x,%x] / client[%x,%x] / WRITE / offset / length / buffer %x / cycle %d\n", 115 __FUNCTION__ , this->process->pid, this->trdid, client_pid, client_trdid, 116 offset, length, buffer, cycle ); 117 #endif 118 hal_copy_from_uspace( base_xp + offset, 119 buffer, 120 length ); 121 } 122 123 // set success in command 124 hal_remote_s32( XPTR( th_cxy , &th_ptr->fbf_cmd.error ) , 0 ); 125 126 } // end soclib_fbf_cmd() 127 -
trunk/hal/tsar_mips32/drivers/soclib_fbf.h
r75 r647 1 1 /* 2 * soclib_fbf.h - soclib frame-buffer driver definition .2 * soclib_fbf.h - soclib frame-buffer driver definition (used in TSAR_IOB architecture). 3 3 * 4 * Author Alain greiner (2016 )4 * Author Alain greiner (2016,2017,2018,2019) 5 5 * 6 6 * Copyright (c) UPMC Sorbonne Universites … … 22 22 */ 23 23 24 #ifndef _SOCLIB_FB _H_25 #define _SOCLIB_FB _H_24 #ifndef _SOCLIB_FBF_H_ 25 #define _SOCLIB_FBF_H_ 26 26 27 #include <chdev.h> 28 #include <hal_kernel_types.h> 29 30 /**************************************************************************************** 31 * This driver supports the vci_fbf_tsar component. 32 * 33 * This hardware component supports both a frame buffer, and a set of addressable 34 * configuration status registers. 35 ***************************************************************************************/ 36 37 /**************************************************************************************** 38 * SOCLIB_FBF registers offsets 39 * The three addressables registers are on top of the 4 Mbytes allocated 40 * to the frame buffer itself. 41 ***************************************************************************************/ 42 43 enum SoclibFrameBufferRegisters 44 { 45 FBF_WIDTH_REG = 0x100000, 46 FBF_HEIGHT_REG = 0x100001, 47 FBF_SUBSAMPLING_REG = 0x100002, 48 }; 49 50 /**************************************************************************************** 51 * This function access the SOCLIB_FBF hardware registers, to get the frame buffer 52 * size and type, and update the FBF device extension. 53 **************************************************************************************** 54 * @ chdev : pointer on the FBF chdev descriptor. 55 ***************************************************************************************/ 56 void soclib_fbf_init( chdev_t * chdev ); 57 58 /**************************************************************************************** 59 * This function implements the FBF_READ and FBF_WRITE commands registered in the client 60 * thread descriptor identified by the <thread_xp> argument. 61 * It is called directly by the client thread. 62 * ************************************************************************************** 63 * @ thread_xp : extended pointer on client thread descriptor. 64 ***************************************************************************************/ 65 extern void soclib_fbf_cmd( xptr_t thread_xp ); 27 66 28 67 #endif
Note: See TracChangeset
for help on using the changeset viewer.