On Sat, Jan 21, 2023 at 09:59:13AM -0500, Dave Voutila wrote:
> I've long moaned about how my Go3 can't reboot. Woe is me. Now that
> kettenis@ landed some scaffolding for efi(4), I would love to get my Go3
> working in the reboot department.
>
> The approach I'm thinking, in the diff below, is to hook in via
> comparing the FirmwareVendor "string" to make sure we're doing this on
> amd64-based Microsoft EFI systems.
>
> The last time we went down this route, we found reports of arbitrarily
> switching EFI systems over to efi_reset caused reboots to break on
> machines that had been happily using acpi_reset. The struggle is real.
>
> I only have access to my Go3, so would appreciate someone else with a
> Surface brand device check for regression before I ask for OK. Feedback
> from kettenis@ also welcome.
>
> If your Surface has the same problem as mine, what you experience is
> having to do a powerdown (e.g. halt -p) in order to reset the machine. A
> reboot causes the machine to reset, but get stuck bringing itself back
> up and you stare at the MSFT logo splash until your battery runs out or
> you die of boredom.
>
> -dv
>

Following up on an old thread - do you want me to try this on my Go3 (which
does not have this issue)?

kettenis - any objection here?

-ml

>
> diff refs/heads/master refs/heads/efi-powerdown
> commit - 009dd187d54193e7f98e87ccd11c616924278c5e
> commit + c6f9dc35c81aa79313b1ad12bfcdacfb6074803d
> blob - 502bd70a7eddbb271ee54b5888867c4ffd7a8426
> blob + c53604d2c38321bd3151a9008560ce52d3034fec
> --- sys/arch/amd64/amd64/acpi_machdep.c
> +++ sys/arch/amd64/amd64/acpi_machdep.c
> @@ -334,7 +334,8 @@ acpi_attach_machdep(struct acpi_softc *sc)
>
>       sc->sc_interrupt = isa_intr_establish(NULL, sc->sc_fadt->sci_int,
>           IST_LEVEL, IPL_BIO, acpi_interrupt, sc, sc->sc_dev.dv_xname);
> -     cpuresetfn = acpi_reset;
> +     if (!cpuresetfn)
> +             cpuresetfn = acpi_reset;
>
>  #ifndef SMALL_KERNEL
>       /*
> blob - a5f4563ce7d54e53c9aaadf2823b35d36cd3b1e9
> blob + 88aa3f343f059136b1cfd842717ac1ff1fcec3c0
> --- sys/arch/amd64/amd64/efi_machdep.c
> +++ sys/arch/amd64/amd64/efi_machdep.c
> @@ -39,12 +39,18 @@ void      efi_map_runtime(struct efi_softc *);
>       sizeof(struct efi_softc), efi_match, efi_attach
>  };
>
> +extern struct cfdriver efi_cd;
> +
>  void efi_map_runtime(struct efi_softc *);
>  int  efi_gettime(struct todr_chip_handle *, struct timeval *);
>  int  efi_settime(struct todr_chip_handle *, struct timeval *);
> +void efi_reset(void);
>
>  label_t efi_jmpbuf;
>
> +const CHAR16 fv_msft[5] = { 'M', 'S', 'F', 'T', 0 };
> +extern void (*cpuresetfn)(void);
> +
>  int
>  efi_match(struct device *parent, void *match, void *aux)
>  {
> @@ -119,6 +125,9 @@ efi_attach(struct device *parent, struct device *self,
>               for (i = 0; st->FirmwareVendor[i]; i++)
>                       printf("%c", st->FirmwareVendor[i]);
>               printf(" rev 0x%x\n", st->FirmwareRevision);
> +
> +             if (memcmp(st->FirmwareVendor, fv_msft, sizeof(fv_msft)) == 0)
> +                     cpuresetfn = efi_reset;
>       }
>       efi_leave(sc);
>
> @@ -305,3 +314,14 @@ efi_settime(struct todr_chip_handle *handle, struct ti
>               return EIO;
>       return 0;
>  }
> +
> +void
> +efi_reset(void)
> +{
> +     struct efi_softc *sc = efi_cd.cd_devs[0];
> +
> +     printf("%s\n", __func__);
> +     efi_enter(sc);
> +     sc->sc_rs->ResetSystem(EfiResetCold, EFI_SUCCESS, 0, NULL);
> +     efi_leave(sc);
> +}
>

Reply via email to