Commit 73e05284 authored by Antonio Nino Diaz's avatar Antonio Nino Diaz
Browse files

Add console_flush() to console API



This function ensures that console output is flushed, for example
before shutting down or use by another component

In line with other console APIs, console_flush() wraps
console_core_flush().

Also implement console_core_flush() for PL011.

Change-Id: I3db365065e4de04a454a5c2ce21be335a23a01e4
Signed-off-by: default avatarAntonio Nino Diaz <antonio.ninodiaz@arm.com>
parent e422f991
/* /*
* Copyright (c) 2016, ARM Limited and Contributors. All rights reserved. * Copyright (c) 2016-2017, ARM Limited and Contributors. All rights reserved.
* *
* Redistribution and use in source and binary forms, with or without * Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met: * modification, are permitted provided that the following conditions are met:
...@@ -40,6 +40,7 @@ ...@@ -40,6 +40,7 @@
.globl console_core_init .globl console_core_init
.globl console_core_putc .globl console_core_putc
.globl console_core_getc .globl console_core_getc
.globl console_core_flush
/* ----------------------------------------------- /* -----------------------------------------------
...@@ -158,3 +159,29 @@ getc_error: ...@@ -158,3 +159,29 @@ getc_error:
mov r0, #-1 mov r0, #-1
bx lr bx lr
endfunc console_core_getc endfunc console_core_getc
/* ---------------------------------------------
* int console_core_flush(uintptr_t base_addr)
* Function to force a write of all buffered
* data that hasn't been output.
* In : r0 - console base address
* Out : return -1 on error else return 0.
* Clobber list : r0, r1
* ---------------------------------------------
*/
func console_core_flush
cmp r0, #0
beq flush_error
1:
/* Loop while the transmit FIFO is busy */
ldr r1, [r0, #UARTFR]
tst r1, #PL011_UARTFR_BUSY
bne 1b
mov r0, #0
bx lr
flush_error:
mov r0, #-1
bx lr
endfunc console_core_flush
/* /*
* Copyright (c) 2013-2016, ARM Limited and Contributors. All rights reserved. * Copyright (c) 2013-2017, ARM Limited and Contributors. All rights reserved.
* *
* Redistribution and use in source and binary forms, with or without * Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met: * modification, are permitted provided that the following conditions are met:
...@@ -41,6 +41,7 @@ ...@@ -41,6 +41,7 @@
.globl console_core_init .globl console_core_init
.globl console_core_putc .globl console_core_putc
.globl console_core_getc .globl console_core_getc
.globl console_core_flush
/* ----------------------------------------------- /* -----------------------------------------------
...@@ -151,3 +152,27 @@ getc_error: ...@@ -151,3 +152,27 @@ getc_error:
mov w0, #-1 mov w0, #-1
ret ret
endfunc console_core_getc endfunc console_core_getc
/* ---------------------------------------------
* int console_core_flush(uintptr_t base_addr)
* Function to force a write of all buffered
* data that hasn't been output.
* In : x0 - console base address
* Out : return -1 on error else return 0.
* Clobber list : x0, x1
* ---------------------------------------------
*/
func console_core_flush
cbz x0, flush_error
1:
/* Loop until the transmit FIFO is empty */
ldr w1, [x0, #UARTFR]
tbnz w1, #PL011_UARTFR_BUSY_BIT, 1b
mov w0, #0
ret
flush_error:
mov w0, #-1
ret
endfunc console_core_flush
/* /*
* Copyright (c) 2016, ARM Limited and Contributors. All rights reserved. * Copyright (c) 2016-2017, ARM Limited and Contributors. All rights reserved.
* *
* Redistribution and use in source and binary forms, with or without * Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met: * modification, are permitted provided that the following conditions are met:
...@@ -33,6 +33,7 @@ ...@@ -33,6 +33,7 @@
.globl console_uninit .globl console_uninit
.globl console_putc .globl console_putc
.globl console_getc .globl console_getc
.globl console_flush
/* /*
* The console base is in the data section and not in .bss * The console base is in the data section and not in .bss
...@@ -112,3 +113,18 @@ func console_getc ...@@ -112,3 +113,18 @@ func console_getc
ldr r0, [r1] ldr r0, [r1]
b console_core_getc b console_core_getc
endfunc console_getc endfunc console_getc
/* ---------------------------------------------
* int console_flush(void)
* Function to force a write of all buffered
* data that hasn't been output. It returns 0
* upon successful completion, otherwise it
* returns -1.
* Clobber list : r0, r1
* ---------------------------------------------
*/
func console_flush
ldr r1, =console_base
ldr r0, [r1]
b console_core_flush
endfunc console_flush
/* /*
* Copyright (c) 2016, ARM Limited and Contributors. All rights reserved. * Copyright (c) 2016-2017, ARM Limited and Contributors. All rights reserved.
* *
* Redistribution and use in source and binary forms, with or without * Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met: * modification, are permitted provided that the following conditions are met:
...@@ -38,6 +38,7 @@ ...@@ -38,6 +38,7 @@
.globl console_core_init .globl console_core_init
.globl console_core_putc .globl console_core_putc
.globl console_core_getc .globl console_core_getc
.globl console_core_flush
/* ----------------------------------------------- /* -----------------------------------------------
* int console_core_init(uintptr_t base_addr, * int console_core_init(uintptr_t base_addr,
...@@ -109,3 +110,23 @@ getc_error: ...@@ -109,3 +110,23 @@ getc_error:
mov r0, #-1 mov r0, #-1
bx lr bx lr
endfunc console_core_getc endfunc console_core_getc
/* ---------------------------------------------
* int console_core_flush(uintptr_t base_addr)
* Function to force a write of all buffered
* data that hasn't been output.
* In : r0 - console base address
* Out : return -1 on error else return 0.
* Clobber list : r0, r1
* ---------------------------------------------
*/
func console_core_flush
cmp r0, #0
beq flush_error
/* Insert implementation here */
mov r0, #0
bx lr
flush_error:
mov r0, #-1
bx lr
endfunc console_core_flush
/* /*
* Copyright (c) 2015-2016, ARM Limited and Contributors. All rights reserved. * Copyright (c) 2015-2017, ARM Limited and Contributors. All rights reserved.
* *
* Redistribution and use in source and binary forms, with or without * Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met: * modification, are permitted provided that the following conditions are met:
...@@ -33,6 +33,7 @@ ...@@ -33,6 +33,7 @@
.globl console_uninit .globl console_uninit
.globl console_putc .globl console_putc
.globl console_getc .globl console_getc
.globl console_flush
/* /*
* The console base is in the data section and not in .bss * The console base is in the data section and not in .bss
...@@ -111,3 +112,18 @@ func console_getc ...@@ -111,3 +112,18 @@ func console_getc
ldr x0, [x1, :lo12:console_base] ldr x0, [x1, :lo12:console_base]
b console_core_getc b console_core_getc
endfunc console_getc endfunc console_getc
/* ---------------------------------------------
* int console_flush(void)
* Function to force a write of all buffered
* data that hasn't been output. It returns 0
* upon successful completion, otherwise it
* returns -1.
* Clobber list : x0, x1
* ---------------------------------------------
*/
func console_flush
adrp x1, console_base
ldr x0, [x1, :lo12:console_base]
b console_core_flush
endfunc console_flush
/* /*
* Copyright (c) 2015-2016, ARM Limited and Contributors. All rights reserved. * Copyright (c) 2015-2017, ARM Limited and Contributors. All rights reserved.
* *
* Redistribution and use in source and binary forms, with or without * Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met: * modification, are permitted provided that the following conditions are met:
...@@ -38,6 +38,7 @@ ...@@ -38,6 +38,7 @@
.globl console_core_init .globl console_core_init
.globl console_core_putc .globl console_core_putc
.globl console_core_getc .globl console_core_getc
.globl console_core_flush
/* ----------------------------------------------- /* -----------------------------------------------
* int console_core_init(uintptr_t base_addr, * int console_core_init(uintptr_t base_addr,
...@@ -104,3 +105,22 @@ getc_error: ...@@ -104,3 +105,22 @@ getc_error:
mov w0, #-1 mov w0, #-1
ret ret
endfunc console_core_getc endfunc console_core_getc
/* ---------------------------------------------
* int console_core_flush(uintptr_t base_addr)
* Function to force a write of all buffered
* data that hasn't been output.
* In : x0 - console base address
* Out : return -1 on error else return 0.
* Clobber list : x0, x1
* ---------------------------------------------
*/
func console_core_flush
cbz x0, flush_error
/* Insert implementation here */
mov w0, #0
ret
flush_error:
mov w0, #-1
ret
endfunc console_core_flush
/* /*
* Copyright (c) 2013-2014, ARM Limited and Contributors. All rights reserved. * Copyright (c) 2013-2017, ARM Limited and Contributors. All rights reserved.
* *
* Redistribution and use in source and binary forms, with or without * Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met: * modification, are permitted provided that the following conditions are met:
...@@ -38,6 +38,7 @@ int console_init(uintptr_t base_addr, ...@@ -38,6 +38,7 @@ int console_init(uintptr_t base_addr,
void console_uninit(void); void console_uninit(void);
int console_putc(int c); int console_putc(int c);
int console_getc(void); int console_getc(void);
int console_flush(void);
#endif /* __CONSOLE_H__ */ #endif /* __CONSOLE_H__ */
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment