[U-Boot] [PATCH v2 28/50] x86: sysreset: Separate out the EFI code
Bin Meng
bmeng.cn at gmail.com
Wed May 1 13:42:02 UTC 2019
+Heinrich,
On Fri, Apr 26, 2019 at 12:00 PM Simon Glass <sjg at 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 <sjg at 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.cn at gmail.com>
More information about the U-Boot
mailing list