On 23.03.21 07:25, peng....@nxp.com wrote:
> From: Peng Fan <peng....@nxp.com>
> 
> There is frequent start/shutdown operation in kernel reboot process.
> And at the end of kernel reboot, kernel will switch to use console
> output,saying imx_console_write on i.MX8MM.
> 
> imx_console_write will save/restore uart configuration.
> However before imx_console_write the UCR1_UARTEN already set to 0.
> when restore, it is also 0. Then when we runs into jailhouse
> disable, jailhouse write to uart will trigger errors.

What kind of errors? Hardware exceptions or what?

> 
> So let's add a check.
> 
> However to hypervisor itself, there is still risk that
> kernel disable uart, whenh jailhouse is going to write
> data registers even with this patch applied.
> 
> There is no good way to avoid such contention,
> the best way to avoid such issue is that
> use a different uart from Linux or remove
> `.type = JAILHOUSE_CON_TYPE_IMX,` from configs/arm64/imx8mm.c.
> 
> Remove `.type = JAILHOUSE_CON_TYPE_IMX,` means
> jailhouse hypervisor will not output to uart, but you still
> could see jailhouse log by `cat /dev/jailhouse`

There is no separate UART available, to have kernel and Jailhouse on
different channels?

Another alternative is to avoid using the UART as console under Linux,
right?

> 
> Signed-off-by: Peng Fan <peng....@nxp.com>
> ---
>  hypervisor/arch/arm-common/uart-imx.c | 4 ++++
>  inmates/lib/arm-common/uart-imx.c     | 4 ++++
>  2 files changed, 8 insertions(+)
> 
> diff --git a/hypervisor/arch/arm-common/uart-imx.c 
> b/hypervisor/arch/arm-common/uart-imx.c
> index 849f8fca..6485f36e 100644
> --- a/hypervisor/arch/arm-common/uart-imx.c
> +++ b/hypervisor/arch/arm-common/uart-imx.c
> @@ -15,6 +15,8 @@
>  
>  #define UTS                  0xb4
>  #define UTXD                 0x40
> +#define UCR1                 0x80
> +#define UCR1_UARTEN          (1<<0)
>  #define UTS_TXEMPTY          (1 << 6)
>  
>  static void uart_init(struct uart_chip *chip)
> @@ -29,6 +31,8 @@ static bool uart_is_busy(struct uart_chip *chip)
>  
>  static void uart_write_char(struct uart_chip *chip, char c)
>  {
> +     if ((mmio_read32(chip->virt_base + UCR1) & UCR1_UARTEN) != UCR1_UARTEN)

if (mmio_read32(chip->virt_base + UCR1) & UCR1_UARTEN)
        mmio_write32(chip->virt_base + UTXD, c);

And a comment on the "why" here would be good.

> +             return;
>       mmio_write32(chip->virt_base + UTXD, c);
>  }
>  
> diff --git a/inmates/lib/arm-common/uart-imx.c 
> b/inmates/lib/arm-common/uart-imx.c
> index 984dc218..9cdf9089 100644
> --- a/inmates/lib/arm-common/uart-imx.c
> +++ b/inmates/lib/arm-common/uart-imx.c
> @@ -39,6 +39,8 @@
>  
>  #define UTS                  0xb4
>  #define UTXD                 0x40
> +#define UCR1                 0x80
> +#define UCR1_UARTEN          (1<<0)
>  #define UTS_TXEMPTY          (1 << 6)
>  
>  static void uart_imx_init(struct uart_chip *chip)
> @@ -53,6 +55,8 @@ static bool uart_imx_is_busy(struct uart_chip *chip)
>  
>  static void uart_imx_write(struct uart_chip *chip, char c)
>  {
> +     if ((mmio_read32(chip->base + UCR1) & UCR1_UARTEN) != UCR1_UARTEN)
> +             return;
>       mmio_write32(chip->base + UTXD, c);
>  }
>  
> 

Jan

-- 
Siemens AG, T RDA IOT
Corporate Competence Center Embedded Linux

-- 
You received this message because you are subscribed to the Google Groups 
"Jailhouse" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to jailhouse-dev+unsubscr...@googlegroups.com.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/jailhouse-dev/69cf89e6-dc86-a3d7-01fa-1e5abee7f1e8%40siemens.com.

Reply via email to