From mboxrd@z Thu Jan 1 00:00:00 1970 From: Heinrich Schuchardt Date: Wed, 30 Jan 2019 19:58:35 +0100 Subject: [U-Boot] [PATCH v3 1/2] x86: Add efi runtime reset In-Reply-To: <20190130104635.41372-2-agraf@suse.de> References: <20190130104635.41372-1-agraf@suse.de> <20190130104635.41372-2-agraf@suse.de> Message-ID: <1c09e323-5980-47c3-0576-a05baaa5024b@gmx.de> List-Id: MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit To: u-boot@lists.denx.de On 1/30/19 11:46 AM, Alexander Graf wrote: > Our selftest will soon test the actual runtime reset function rather than > the boot time one. For this, we need to ensure that the runtime version > actually succeeds on x86 to keep our travis tests work. > > So this patch implements an x86 runtime reset function. It is missing > shutdown functionality today, but OSs usually implement that via ACPI > and this function does more than the stub from before, so it's at least > an improvement. > > Eventually we will want to have full DM functionality in runtime services. > But this fixes a travis failure and doesn't clutter the code too heavily, so > we should pull it in without the amazing new RTS DM framework. > > Signed-off-by: Alexander Graf > > --- > > v2 -> v3: > > - support EFI_RESET_PLATFORM_SPECIFIC > - reuse existing x86_sysreset_request() function The v2->v3 update does not answer the question if the reset is correctly implemented. We would not want to call a function we do not trust. @Simon, Bin: x86_sysreset_request() loosely resembles BOOT_CF9_SAFE in native_machine_emergency_restart() in Linux arch/x86/kernel/reboot.c which is tried before using the keyboard controller as last resort. u8 reboot_code = reboot_mode == REBOOT_WARM ? 0x06 : 0x0E; u8 cf9 = inb(0xcf9) & ~reboot_code; outb(cf9|2, 0xcf9); /* Request hard reset */ udelay(50); /* Actually do the reset */ outb(cf9|reboot_code, 0xcf9); udelay(50); So the Kernel first switches bit 2 off and bit 1 on, waits, and then switches bit 2 on, cf. http://smackerelofopinion.blogspot.com/2011/02/resetting-pc-using-reset-control.html Shouldn't we do it the same way as the Kernel does it? Best regards Heinrich > --- > drivers/sysreset/sysreset_x86.c | 23 ++++++++++++++++++++++- > 1 file changed, 22 insertions(+), 1 deletion(-) > > diff --git a/drivers/sysreset/sysreset_x86.c b/drivers/sysreset/sysreset_x86.c > index 20b958cfd4..009f376602 100644 > --- a/drivers/sysreset/sysreset_x86.c > +++ b/drivers/sysreset/sysreset_x86.c > @@ -10,8 +10,10 @@ > #include > #include > #include > +#include > > -static int x86_sysreset_request(struct udevice *dev, enum sysreset_t type) > +static __efi_runtime int x86_sysreset_request(struct udevice *dev, > + enum sysreset_t type) > { > int value; > > @@ -31,6 +33,25 @@ static int x86_sysreset_request(struct udevice *dev, enum sysreset_t type) > return -EINPROGRESS; > } > > +#ifdef CONFIG_EFI_LOADER > +void __efi_runtime EFIAPI efi_reset_system( > + enum efi_reset_type reset_type, > + efi_status_t reset_status, > + unsigned long data_size, void *reset_data) > +{ > + 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); > + > + /* TODO EFI_RESET_SHUTDOWN */ > + > + while (1) { } > +} > +#endif > + > + > static const struct udevice_id x86_sysreset_ids[] = { > { .compatible = "x86,reset" }, > { } >