[PATCH V2 11/11] arm64: wait for transmit completion before next character transmission

Geoff Levand geoff at infradead.org
Mon Oct 19 15:29:55 PDT 2015


Hi,

I tested this on the foundation model and it hangs.

-Geoff

On Thu, 2015-05-14 at 11:25 +0530, Pratyush Anand wrote:
> Previous transmission must be completed before next character to be
> transmitted, otherwise TX buffer may saturate and we will not see all
> the characters on screen.
> 
> Signed-off-by: Pratyush Anand <panand at redhat.com>
> ---
>  purgatory/arch/arm64/purgatory-arm64.c | 24 +++++++++++++++++++++++-
>  1 file changed, 23 insertions(+), 1 deletion(-)
> 
> diff --git a/purgatory/arch/arm64/purgatory-arm64.c
> b/purgatory/arch/arm64/purgatory-arm64.c
> index 25960c30bd05..3a1c9243bfa2 100644
> --- a/purgatory/arch/arm64/purgatory-arm64.c
> +++ b/purgatory/arch/arm64/purgatory-arm64.c
> @@ -11,15 +11,37 @@ extern uint32_t *arm64_sink;
>  extern void (*arm64_kernel_entry)(uint64_t);
>  extern uint64_t arm64_dtb_addr;
>  
> +static void wait_for_xmit_complete(void)
> +{
> +	volatile uint32_t status;
> +	volatile uint32_t *status_reg;
> +
> +	/*
> +	 * Since most of the UART with ARM platform has LSR register
> at
> +	 * offset 0x14 and should have value as 0x60 for TX empty,
> so we
> +	 * have hardcoded these values. Can modify in future if need
> +	 * arises.
> +	 */
> +	status_reg = (volatile uint32_t *)((uint64_t)arm64_sink +
> 0x14);
> +	while (1) {
> +		status = *status_reg;
> +		if ((status & 0x60) == 0x60)
> +			break;
> +	}
> +}
> +
>  void putchar(int ch)
>  {
>  	if (!arm64_sink)
>  		return;
>  
> +	wait_for_xmit_complete();
>  	*arm64_sink = ch;
>  
> -	if (ch == '\n')
> +	if (ch == '\n') {
> +		wait_for_xmit_complete();
>  		*arm64_sink = '\r';
> +	}
>  }
>  
>  void setup_arch(void)



More information about the kexec mailing list