Changeset 457 for trunk/hal/tsar_mips32/drivers
- Timestamp:
- Aug 2, 2018, 11:47:13 AM (6 years ago)
- Location:
- trunk/hal/tsar_mips32/drivers
- Files:
-
- 3 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/hal/tsar_mips32/drivers/soclib_pic.c
r451 r457 137 137 #endif 138 138 139 // analyse status and handle up to 3 pending IRQ (one WTI, one HWI, one PTI)139 // analyse status and handle up to 3 pending IRQs (one WTI, one HWI, one PTI) 140 140 141 141 if( wti_status ) // pending WTI … … 150 150 #if DEBUG_HAL_IRQS 151 151 if (DEBUG_HAL_IRQS < cycle ) 152 printk("\n[DBG] %s : core[%x,%d] received anIPI\n", __FUNCTION__ , local_cxy , core->lid );152 printk("\n[DBG] %s : core[%x,%d] handling IPI\n", __FUNCTION__ , local_cxy , core->lid ); 153 153 #endif 154 154 // acknowledge IRQ (this require an XCU read) … … 156 156 157 157 // check RPC FIFO, and activate or create a RPC thread 158 // condition is always true, but we must use the ack value 158 // condition is always true, but we use the ack value 159 // to avoid a GCC warning 159 160 if( ack + 1 ) rpc_check(); 160 161 } … … 182 183 #if DEBUG_HAL_IRQS 183 184 if (DEBUG_HAL_IRQS < cycle ) 184 printk("\n[DBG] %s : core[%x,%d] receivedexternal WTI %d\n",185 printk("\n[DBG] %s : core[%x,%d] handling external WTI %d\n", 185 186 __FUNCTION__ , local_cxy , core->lid , index ); 186 187 #endif … … 216 217 #if DEBUG_HAL_IRQS 217 218 if (DEBUG_HAL_IRQS < cycle ) 218 printk("\n[DBG] %s : core[%x,%d] receivedHWI %d\n",219 printk("\n[DBG] %s : core[%x,%d] handling HWI %d\n", 219 220 __FUNCTION__ , local_cxy , core->lid , index ); 220 221 #endif … … 232 233 #if DEBUG_HAL_IRQS 233 234 if (DEBUG_HAL_IRQS < cycle ) 234 printk("\n[DBG] %s : core[%x,%d] receivedPTI %d\n",235 printk("\n[DBG] %s : core[%x,%d] handling PTI %d\n", 235 236 __FUNCTION__ , core->lid , local_cxy , index ); 236 237 #endif … … 239 240 240 241 // execute all actions related to TICK event 241 // condition is always true, but we must use the ack value 242 // condition is always true, but we use the ack value 243 // to avoid a GCC warning 242 244 if( ack + 1 ) core_clock( core ); 243 245 } … … 515 517 { 516 518 // calling core local index 517 lid_t lid = CURRENT_ CORE->lid;519 lid_t lid = CURRENT_THREAD->core->lid; 518 520 519 521 // get XCU segment base … … 533 535 { 534 536 // calling core local index 535 lid_t lid = CURRENT_ CORE->lid;537 lid_t lid = CURRENT_THREAD->core->lid; 536 538 537 539 // get XCU segment base -
trunk/hal/tsar_mips32/drivers/soclib_tty.c
r451 r457 272 272 xptr_t parent_main_xp; // local pointer on parent process main thread 273 273 274 // get TXT chdev channel, direction and server thread274 // get TXT chdev channel, direction, server thread, and server core 275 275 channel = chdev->channel; 276 276 is_rx = chdev->is_rx; … … 455 455 thread_unblock( XPTR( local_cxy , server ) , THREAD_BLOCKED_ISR ); 456 456 457 // send IPI to core running server thread 458 dev_pic_send_ipi( local_cxy , server_lid ); 457 // send IPI to core running server thread if required 458 if( server_lid != CURRENT_THREAD->core->lid ) 459 { 460 dev_pic_send_ipi( local_cxy , server_lid ); 461 } 459 462 } 460 463 else … … 501 504 thread_unblock( XPTR( local_cxy , server ) , THREAD_BLOCKED_ISR ); 502 505 503 // send IPI to core running server thread 504 dev_pic_send_ipi( local_cxy , server_lid ); 506 // send IPI to core running server thread if required 507 if( server_lid != CURRENT_THREAD->core->lid ) 508 { 509 dev_pic_send_ipi( local_cxy , server_lid ); 510 } 505 511 506 512 } // end TX -
trunk/hal/tsar_mips32/drivers/soclib_tty.h
r436 r457 2 2 * soclib_tty.c - soclib tty driver definition. 3 3 * 4 * Author Alain Greiner (2016 )4 * Author Alain Greiner (2016,2017,2018) 5 5 * 6 6 * Copyright (c) UPMC Sorbonne Universites … … 29 29 /**************************************************************************************** 30 30 * This driver supports the vci_tty_tsar component. 31 * It implements the generic TXT device API:31 * Regarding read/write request, it implements the generic TXT device API: 32 32 * - transfer one single character from TTY to command "buffer" if to_mem is non-zero. 33 33 * - transfer "count" characters from command "buffer" to TTY if "to_mem is zero. 34 * It handles asynchronous control characters (^C / ^Z), that are translated to signals 35 * transmited to the TXT owner process (foreground process). 34 36 ***************************************************************************************/ 35 37 … … 101 103 /**************************************************************************************** 102 104 * This ISR is executed to handle both the TTY_TX_IRQ and the TTY_RX_IRQ, even if 103 * The RX_IRQ is activated as soon as the TTY_STATUS_RX_FULL bit is 1 in the 105 * there is two different channel devices for TX and RX transfers. 106 * 107 * As the <chdev> argument is a local pointer, this ISR is always executed by a core 108 * that is in the same cluster as the core running the DEV server thread. 109 * 110 * - The RX_IRQ is activated as soon as the TTY_STATUS_RX_FULL bit is 1 in the 104 111 * TTY_STATUS register, when the TTY_RX_IRQ_ENABLE is non zero, indicating that 105 112 * the TTY_READ buffer is full and can be read. 106 * 113 * - The TX_IRQ is activated as soon as the TTY_STATUS_TX_FULL bit is 0 in the 107 114 * TTY_STATUS register, when the TTY_TX_IRQ_ENABLE is non zero, indicating that 108 115 * the TTY_WRITE buffer is empty, and can be written. 109 * WARNING : In ALMOS-MKH, the RX_IRQ is always enabled to catch the control signals, 116 * 117 * The RX_IRQ is always enabled to catch the control characters (^Z / ^C), 110 118 * but the TX_IRQ is dynamically enabled by the TXT_WRITE command, and disabled when 111 119 * the command is completed. 112 120 * 113 * 1) The ISR first read the TTY_STATUS to get the current state of the TTY_READ and 114 * the TTY_WRITE buffers. 121 * For normal characters The ISR uses two private TTY_RX and TTY_TX software FIFOs 122 * (two FIFOs per channel) to communicates with the DEV server thread executing the 123 * soclib_tty_cmd() function. 124 125 * For an RX transfer, this ISR executes a while loop moving bytes until the source 126 * TTY_READ buffer is empty: 127 * 1) The ISR read one byte from the TTY_READ register and acknowledge the RX_IRQ. 128 * 2) if the byte is a ^Z character, it uses a multicast RPC to block all treads of 129 * the TXT owner process, and transfer TXT ownership to another process of the group. 130 * 3) if the byte is a ^C character, it removes the process from the TXT group, and send 131 * a multicast RPC to delete all threads of the TXT owner process. 132 * 4) if the byte is a normal character and the destination TTY_RX_FIFO is not full, 133 * it writes the byte to this FIFO, unblock the TXT_RX server thread, and send an IPI 134 * to this server thread (only if it is running on another core than the ISR). 135 * 5) It discards the byte if the TTY_RX_FIFO is full, with a warning message on TXT0. 115 136 * 116 * 2) It try to read the first command registered in the server thread queue associated 117 * to the TTY channel 118 * 119 * 2) The ISR handles the RX when the TTY_READ buffer is full : 120 * . it read the available character from the TTY_READ buffer, and this 121 * acknowledges the RX_IRQ. 122 * . if it is a control character ( ^C / ^D / ^Z ) it translate it to the proper 123 * signal and execute the relevant sigaction for the foreground process. 124 * . if it is a normal character, it try to get the first command registered in the 125 * server thread queue. If it is a TXT_READ, it returns this character to the 126 * command buffer in the client thread. 127 * 128 * 3) The ISR handles the TX when the TTY_WRITE buffer is empty and a TXT_WRITE 129 * . it try to get it copies the 130 * character to the command buffer, acknowledges the TTY_RX_IRQ, and unblock the 131 * associated server thread. 132 133 * . the control characters ^C / ^D / ^Z are directly handled by the ISR and 134 * translated to the foreground process. 135 136 * - the 137 the TXT_READ and TXT_WRITE commands. 138 * It gets the command arguments from the first client thread in the TXT chdev queue: 139 * - if TXT_READ, it transfers one byte from the TTY_READ_REG to the command buffer. 140 * It simply returns for retry if TTY_READ_REG is empty. 141 * - if TXT_WRITE, it tries to transfer several bytes from the command buffer to the 142 * TTY_WRITE_REG. If the TTY_WRITE_REG is full, it updates the "count" and "buffer" 143 * command arguments and returns for retry. 144 * When the I/O operation is completed, it sets the status field in the command, unblocks 145 * the server thread, and unblocks the client thread. 137 * For a TX transfer, this ISR executes a while loop moving bytes until the source 138 * TTY_TX_FIFO is empty: 139 * 1) if the destination TTY_WRITE register is not full, it moves the byte from the 140 * TTY_TX_FIFO to the TTY_WRITE register. 141 * 2) if the TTY_WRITE register is full, it polls (busy waiting) the TTY_STATUS register, 142 * until the TTY_WRITE register is empty. 143 * 3) when the source TTY_TX_FIFO is empty, this ISR disable the TTY_TX_IRQ, unblock 144 * the TXT_TX server thread, and send an IPI to this server thread (only if it is 145 * running on another core than the ISR). 146 146 **************************************************************************************** 147 147 * @ chdev : local pointer on TXT chdev descriptor.
Note: See TracChangeset
for help on using the changeset viewer.