Le Wed, Jul 06, 2022 at 10:45:39PM +0200, Mark Kettenis a écrit :
> Now that the kernel supports the extended BOOTARG_CONSDEV struct and
> snaps with that change are out there, here is the diff that changes
> the amd64 bootloaders to switch to the extended struct and provide the
> parameters necessary for using the non-standard UART on the AMD Ryzen
> Embedded V1000 SoCs.
> 
> It would be good if someone can confirm this works on something like
> an APU.
> 

I don't have any other EFI appliance to test but it reads fine, applies and
builds OK.

Anyway, I could not make it work on the AMD Ryzen Embedded V1000. I might be
missing a step here. I built a kernel with the diff applied, built the ramdrive
and tried to boot it but it still reboots when in ELFNAME().

> ok?
> 



> 
> Index: stand/boot/conf.c
> ===================================================================
> RCS file: /cvs/src/sys/arch/amd64/stand/boot/conf.c,v
> retrieving revision 1.53
> diff -u -p -r1.53 conf.c
> --- stand/boot/conf.c 9 Dec 2020 18:10:17 -0000       1.53
> +++ stand/boot/conf.c 6 Jul 2022 20:02:13 -0000
> @@ -41,7 +41,7 @@
>  #include <biosdev.h>
>  #include <dev/cons.h>
>  
> -const char version[] = "3.53";
> +const char version[] = "3.54";
>  int  debug = 1;
>  
>  
> Index: stand/cdboot/conf.c
> ===================================================================
> RCS file: /cvs/src/sys/arch/amd64/stand/cdboot/conf.c,v
> retrieving revision 1.47
> diff -u -p -r1.47 conf.c
> --- stand/cdboot/conf.c       9 Dec 2020 18:10:18 -0000       1.47
> +++ stand/cdboot/conf.c       6 Jul 2022 20:02:13 -0000
> @@ -42,7 +42,7 @@
>  #include <biosdev.h>
>  #include <dev/cons.h>
>  
> -const char version[] = "3.53";
> +const char version[] = "3.54";
>  int  debug = 1;
>  
>  
> Index: stand/efiboot/conf.c
> ===================================================================
> RCS file: /cvs/src/sys/arch/amd64/stand/efiboot/conf.c,v
> retrieving revision 1.37
> diff -u -p -r1.37 conf.c
> --- stand/efiboot/conf.c      20 Jun 2022 02:22:05 -0000      1.37
> +++ stand/efiboot/conf.c      6 Jul 2022 20:02:13 -0000
> @@ -40,7 +40,7 @@
>  #include "efidev.h"
>  #include "efipxe.h"
>  
> -const char version[] = "3.60";
> +const char version[] = "3.61";
>  
>  #ifdef EFI_DEBUG
>  int  debug = 0;
> Index: stand/efiboot/efiboot.c
> ===================================================================
> RCS file: /cvs/src/sys/arch/amd64/stand/efiboot/efiboot.c,v
> retrieving revision 1.39
> diff -u -p -r1.39 efiboot.c
> --- stand/efiboot/efiboot.c   20 Jun 2022 02:22:05 -0000      1.39
> +++ stand/efiboot/efiboot.c   6 Jul 2022 20:02:13 -0000
> @@ -938,6 +938,70 @@ efi_makebootargs(void)
>       addbootarg(BOOTARG_EFIINFO, sizeof(bios_efiinfo), &bios_efiinfo);
>  }
>  
> +/* Vendor device path used to indicate the mmio UART on AMD SoCs. */
> +#define AMDSOC_DEVPATH \
> +     { 0xe76fd4e9, 0x0a30, 0x4ca9, \
> +         { 0x95, 0x40, 0xd7, 0x99, 0x53, 0x4c, 0xc4, 0xff } }
> +
> +void
> +efi_setconsdev(void)
> +{
> +     bios_consdev_t cd;
> +     EFI_STATUS status;
> +     UINT8 data[128];
> +     UINTN size = sizeof(data);
> +     EFI_DEVICE_PATH *dp = (void *)data;
> +     VENDOR_DEVICE_PATH *vdp;
> +     UART_DEVICE_PATH *udp;
> +     EFI_GUID global = EFI_GLOBAL_VARIABLE;
> +     EFI_GUID amdsoc = AMDSOC_DEVPATH;
> +
> +     memset(&cd, 0, sizeof(cd));
> +     cd.consdev = cn_tab->cn_dev;
> +     cd.conspeed = com_speed;
> +     cd.consaddr = com_addr;
> +
> +     /*
> +      * If the ConOut variable indicates we're using a serial
> +      * console, use it to determine the baud rate.
> +      */
> +     status = RS->GetVariable(L"ConOut", &global, NULL, &size, &data);
> +     if (status == EFI_SUCCESS) {
> +             for (dp = (void *)data; !IsDevicePathEnd(dp);
> +                  dp = NextDevicePathNode(dp)) {
> +                     /*
> +                      * AMD Ryzen Embedded V1000 SoCs integrate a
> +                      * Synopsys DesignWare UART that is not
> +                      * compatible with the traditional 8250 UART
> +                      * found on the IBM PC.  Pass the magic
> +                      * parameters to the kernel to make this UART
> +                      * work.
> +                      */
> +                     if (DevicePathType(dp) == HARDWARE_DEVICE_PATH &&
> +                         DevicePathSubType(dp) == HW_VENDOR_DP) {
> +                             vdp = (VENDOR_DEVICE_PATH *)dp;
> +                             if (efi_guidcmp(&vdp->Guid, &amdsoc) == 0) {
> +                                     cd.consdev = makedev(8, 4);
> +                                     cd.consaddr = *(uint64_t *)(vdp + 1);
> +                                     cd.consfreq = 48000000;
> +                                     cd.flags = BCD_MMIO;
> +                                     cd.reg_width = 4;
> +                                     cd.reg_shift = 2;
> +                             }
> +                     }
> +
> +                     if (DevicePathType(dp) == MESSAGING_DEVICE_PATH &&
> +                         DevicePathSubType(dp) == MSG_UART_DP) {
> +                             udp = (UART_DEVICE_PATH *)dp;
> +                             if (cd.conspeed == -1)
> +                                     cd.conspeed = udp->BaudRate;
> +                     }
> +             }
> +     }
> +
> +     addbootarg(BOOTARG_CONSDEV, sizeof(cd), &cd);
> +}
> +
>  void
>  _rtt(void)
>  {
> Index: stand/efiboot/efiboot.h
> ===================================================================
> RCS file: /cvs/src/sys/arch/amd64/stand/efiboot/efiboot.h,v
> retrieving revision 1.4
> diff -u -p -r1.4 efiboot.h
> --- stand/efiboot/efiboot.h   25 Nov 2017 19:02:07 -0000      1.4
> +++ stand/efiboot/efiboot.h   6 Jul 2022 20:02:13 -0000
> @@ -34,6 +34,7 @@ int  Xvideo_efi(void);
>  int   Xgop_efi(void);
>  int   Xexit_efi(void);
>  void  efi_makebootargs(void);
> +void  efi_setconsdev(void);
>  
>  int   Xpoweroff_efi(void);
>  
> Index: stand/efiboot/exec_i386.c
> ===================================================================
> RCS file: /cvs/src/sys/arch/amd64/stand/efiboot/exec_i386.c,v
> retrieving revision 1.8
> diff -u -p -r1.8 exec_i386.c
> --- stand/efiboot/exec_i386.c 30 Jun 2022 15:46:57 -0000      1.8
> +++ stand/efiboot/exec_i386.c 6 Jul 2022 20:02:13 -0000
> @@ -72,9 +72,6 @@ run_loadfile(uint64_t *marks, int howto)
>       dev_t bootdev = bootdev_dip->bootdev;
>       size_t ac = BOOTARG_LEN;
>       caddr_t av = (caddr_t)BOOTARG_OFF;
> -     bios_oconsdev_t cd;
> -     extern int com_speed; /* from bioscons.c */
> -     extern int com_addr;
>       bios_ddb_t ddb;
>       extern int db_console;
>       bios_bootduid_t bootduid;
> @@ -89,15 +86,10 @@ run_loadfile(uint64_t *marks, int howto)
>       if ((av = alloc(ac)) == NULL)
>               panic("alloc for bootarg");
>       efi_makebootargs();
> +     efi_setconsdev();
>       delta = DEFAULT_KERNEL_ADDRESS - efi_loadaddr;
>       if (sa_cleanup != NULL)
>               (*sa_cleanup)();
> -
> -     cd.consdev = cn_tab->cn_dev;
> -     cd.conspeed = com_speed;
> -     cd.consaddr = com_addr;
> -     cd.consfreq = 0;
> -     addbootarg(BOOTARG_CONSDEV, sizeof(cd), &cd);
>  
>       if (bootmac != NULL)
>               addbootarg(BOOTARG_BOOTMAC, sizeof(bios_bootmac_t), bootmac);
> Index: stand/libsa/exec_i386.c
> ===================================================================
> RCS file: /cvs/src/sys/arch/amd64/stand/libsa/exec_i386.c,v
> retrieving revision 1.36
> diff -u -p -r1.36 exec_i386.c
> --- stand/libsa/exec_i386.c   30 Jun 2022 15:46:57 -0000      1.36
> +++ stand/libsa/exec_i386.c   6 Jul 2022 20:02:13 -0000
> @@ -91,7 +91,7 @@ run_loadfile(uint64_t *marks, int howto)
>       dev_t bootdev = bootdev_dip->bootdev;
>       size_t ac = BOOTARG_LEN;
>       caddr_t av = (caddr_t)BOOTARG_OFF;
> -     bios_oconsdev_t cd;
> +     bios_consdev_t cd;
>       extern int com_speed; /* from bioscons.c */
>       extern int com_addr;
>       bios_ddb_t ddb;
> @@ -105,10 +105,10 @@ run_loadfile(uint64_t *marks, int howto)
>       if (sa_cleanup != NULL)
>               (*sa_cleanup)();
>  
> +     memset(&cd, 0, sizeof(cd));
>       cd.consdev = cn_tab->cn_dev;
>       cd.conspeed = com_speed;
>       cd.consaddr = com_addr;
> -     cd.consfreq = 0;
>       addbootarg(BOOTARG_CONSDEV, sizeof(cd), &cd);
>  
>       if (bootmac != NULL)
> Index: stand/pxeboot/conf.c
> ===================================================================
> RCS file: /cvs/src/sys/arch/amd64/stand/pxeboot/conf.c,v
> retrieving revision 1.52
> diff -u -p -r1.52 conf.c
> --- stand/pxeboot/conf.c      9 Dec 2020 18:10:18 -0000       1.52
> +++ stand/pxeboot/conf.c      6 Jul 2022 20:02:13 -0000
> @@ -44,7 +44,7 @@
>  #include "pxeboot.h"
>  #include "pxe_net.h"
>  
> -const char version[] = "3.53";
> +const char version[] = "3.54";
>  int  debug = 0;
>  
>  void (*sa_cleanup)(void) = pxe_shutdown;
> 

Reply via email to