mirror of
https://github.com/ARM-software/arm-trusted-firmware.git
synced 2025-04-19 02:54:24 +00:00
feat(nxp-drivers): add Linflex flush callback
Implement a flush callback for the Linflex UART driver to avoid cases where the BL31 stage reinitializes the console while there is ongoing TX initiated by the BL2. Change-Id: Ic49852f809198362de1f993474c7c45f1439dc98 Signed-off-by: Ghennadi Procopciuc <ghennadi.procopciuc@nxp.com>
This commit is contained in:
parent
553b70c3ef
commit
95ac568b61
2 changed files with 43 additions and 1 deletions
|
@ -18,6 +18,7 @@
|
||||||
|
|
||||||
#define LINFLEX_LINSR (0x8)
|
#define LINFLEX_LINSR (0x8)
|
||||||
#define LINSR_LINS_INITMODE (0x00001000)
|
#define LINSR_LINS_INITMODE (0x00001000)
|
||||||
|
#define LINSR_LINS_RX_TX_MODE (0x00008000)
|
||||||
#define LINSR_LINS_MASK (0x0000F000)
|
#define LINSR_LINS_MASK (0x0000F000)
|
||||||
|
|
||||||
#define LINFLEX_UARTCR (0x10)
|
#define LINFLEX_UARTCR (0x10)
|
||||||
|
@ -48,9 +49,11 @@
|
||||||
*/
|
*/
|
||||||
.globl console_linflex_core_init
|
.globl console_linflex_core_init
|
||||||
.globl console_linflex_core_putc
|
.globl console_linflex_core_putc
|
||||||
|
.globl console_linflex_core_flush
|
||||||
|
|
||||||
.globl console_linflex_register
|
.globl console_linflex_register
|
||||||
.globl console_linflex_putc
|
.globl console_linflex_putc
|
||||||
|
.globl console_linflex_flush
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* uint32_t get_ldiv_mult(uintptr_t baseaddr, uint32_t clock,
|
* uint32_t get_ldiv_mult(uintptr_t baseaddr, uint32_t clock,
|
||||||
|
@ -175,9 +178,28 @@ func console_linflex_register
|
||||||
str x0, [x3, #CONSOLE_T_BASE]
|
str x0, [x3, #CONSOLE_T_BASE]
|
||||||
|
|
||||||
mov x0, x3
|
mov x0, x3
|
||||||
finish_console_register linflex, putc=1, getc=0, flush=0
|
finish_console_register linflex, putc=1, getc=0, flush=1
|
||||||
endfunc console_linflex_register
|
endfunc console_linflex_register
|
||||||
|
|
||||||
|
/**
|
||||||
|
* int console_linflex_core_flush(uintptr_t baseaddr);
|
||||||
|
*
|
||||||
|
* Loop while the TX fifo is not empty, depending on the selected UART mode.
|
||||||
|
*
|
||||||
|
* In: x0 - Linflex base address
|
||||||
|
* Clobber list : x0 - x1
|
||||||
|
*/
|
||||||
|
func console_linflex_core_flush
|
||||||
|
wait_rx_tx:
|
||||||
|
ldr w1, [x0, LINFLEX_LINSR]
|
||||||
|
and w1, w1, #LINSR_LINS_MASK
|
||||||
|
cmp w1, #LINSR_LINS_RX_TX_MODE
|
||||||
|
b.eq wait_rx_tx
|
||||||
|
|
||||||
|
mov x0, #0
|
||||||
|
ret
|
||||||
|
endfunc console_linflex_core_flush
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* int console_linflex_core_putc(int c, uintptr_t baseaddr);
|
* int console_linflex_core_putc(int c, uintptr_t baseaddr);
|
||||||
|
|
||||||
|
@ -257,3 +279,21 @@ puct_error:
|
||||||
mov x0, #-EINVAL
|
mov x0, #-EINVAL
|
||||||
ret
|
ret
|
||||||
endfunc console_linflex_putc
|
endfunc console_linflex_putc
|
||||||
|
|
||||||
|
/**
|
||||||
|
* int console_linflex_flush(console_t *console);
|
||||||
|
*
|
||||||
|
* Function to wait for the TX FIFO to be cleared.
|
||||||
|
* In : x0 - pointer to console_t struct
|
||||||
|
* Out: x0 - return -1 on error else return 0.
|
||||||
|
* Clobber list : x0 - x1
|
||||||
|
*/
|
||||||
|
func console_linflex_flush
|
||||||
|
cbz x0, flush_error
|
||||||
|
ldr x0, [x0, #CONSOLE_T_BASE]
|
||||||
|
|
||||||
|
b console_linflex_core_flush
|
||||||
|
flush_error:
|
||||||
|
mov x0, #-EINVAL
|
||||||
|
ret
|
||||||
|
endfunc console_linflex_flush
|
||||||
|
|
|
@ -38,6 +38,8 @@ endfunc plat_crash_console_putc
|
||||||
|
|
||||||
/* void plat_crash_console_flush(void); */
|
/* void plat_crash_console_flush(void); */
|
||||||
func plat_crash_console_flush
|
func plat_crash_console_flush
|
||||||
|
mov_imm x0, UART_BASE
|
||||||
|
b console_linflex_core_flush
|
||||||
ret
|
ret
|
||||||
endfunc plat_crash_console_flush
|
endfunc plat_crash_console_flush
|
||||||
|
|
||||||
|
|
Loading…
Add table
Reference in a new issue