+Heinrich,

On Fri, Apr 26, 2019 at 12:00 PM Simon Glass <s...@chromium.org> wrote:
>
> The EFI implementation of reset sits inside the driver and is called
> directly from outside the driver, breaking the normal driver-model
> conventions. Worse, it passed NULL as the device pointer, hoping that
> the called function won't use it, which breaks as soon as code is added
> to use it.
>
> Separate out the implementation to improve the situation enough to allow
> a future patch to add new sysreset features.
>
> Signed-off-by: Simon Glass <s...@chromium.org>
> ---
>
> Changes in v2:
> - Add new patch to separate out the EFI code in sysreset
>
>  drivers/sysreset/sysreset_x86.c | 16 +++++++++++-----
>  1 file changed, 11 insertions(+), 5 deletions(-)
>
> diff --git a/drivers/sysreset/sysreset_x86.c b/drivers/sysreset/sysreset_x86.c
> index 009f3766027..d484ec5de49 100644
> --- a/drivers/sysreset/sysreset_x86.c
> +++ b/drivers/sysreset/sysreset_x86.c
> @@ -12,8 +12,7 @@
>  #include <asm/processor.h>
>  #include <efi_loader.h>
>
> -static __efi_runtime int x86_sysreset_request(struct udevice *dev,
> -                                             enum sysreset_t type)

I remember last time I tried when booting Linux from EFI loader on
U-Boot, calling from kernel into the EFI runtime was broken. Not sure
what the latest status is.

> +static int x86_sysreset_request(struct udevice *dev, enum sysreset_t type)
>  {
>         int value;
>
> @@ -39,11 +38,18 @@ void __efi_runtime EFIAPI efi_reset_system(
>                         efi_status_t reset_status,
>                         unsigned long data_size, void *reset_data)
>  {
> +       int value;
> +
> +       /*
> +        * inline this code since we are not caused in the context of a
> +        * udevice and passing NULL to x86_sysreset_request() is too horrible.
> +        */
>         if (reset_type == EFI_RESET_COLD ||
>                  reset_type == EFI_RESET_PLATFORM_SPECIFIC)
> -               x86_sysreset_request(NULL, SYSRESET_COLD);
> -       else if (reset_type == EFI_RESET_WARM)
> -               x86_sysreset_request(NULL, SYSRESET_WARM);
> +               value = SYS_RST | RST_CPU | FULL_RST;
> +       else /* assume EFI_RESET_WARM since we cannot return an error */
> +               value = SYS_RST | RST_CPU;
> +       outb(value, IO_PORT_RESET);
>
>         /* TODO EFI_RESET_SHUTDOWN */
>
> --

Reviewed-by: Bin Meng <bmeng...@gmail.com>
_______________________________________________
U-Boot mailing list
U-Boot@lists.denx.de
https://lists.denx.de/listinfo/u-boot

Reply via email to