* Matt Dainty <m...@bodgit-n-scarper.com> [2013-02-20 19:30:43]:
> Attached are two patches for bios(4) on i386 & amd64 that add support
> for detecting the comBIOS on Soekris hardware, which then fills in the
> hw.vendor & hw.product sysctl variables as this hardware lacks any
> SMBIOS to provide them. The idea is then these can be used in the
> GPIO/LED driver for the net6501 I posted a while ago to simplify the
> match logic.

Are there any objections to this being committed? It seems to work on
all Soekris boards. I can send the revised GPIO/LED driver for the
net6501.

Thanks

Matt

> --- sys/arch/amd64/amd64/bios.c.orig  Tue Feb 19 01:56:56 2013
> +++ sys/arch/amd64/amd64/bios.c       Wed Feb 20 08:37:12 2013
> @@ -95,6 +95,7 @@
>       vaddr_t va;
>       paddr_t pa, end;
>       u_int8_t *p;
> +     int smbiosrev = 0;
>  
>       /* see if we have SMBIOS extentions */
>       for (p = ISA_HOLE_VADDR(SMBIOS_START);
> @@ -137,6 +138,10 @@
>               printf(": SMBIOS rev. %d.%d @ 0x%lx (%d entries)",
>                   hdr->majrev, hdr->minrev, hdr->addr, hdr->count);
>  
> +             smbiosrev = hdr->majrev * 100 + hdr->minrev;
> +             if (hdr->minrev < 10)
> +                     smbiosrev = hdr->majrev * 100 + hdr->minrev * 10;
> +
>               bios.cookie = 0;
>               if (smbios_find_table(SMBIOS_TYPE_BIOS, &bios)) {
>                       sb = bios.tblhdr;
> @@ -158,6 +163,39 @@
>               break;
>       }
>       printf("\n");
> +
> +     /* No SMBIOS extensions, go looking for Soekris comBIOS */
> +     if (!smbiosrev) {
> +             const char *signature = "Soekris Engineering";
> +
> +             for (p = ISA_HOLE_VADDR(SMBIOS_START);
> +                 p <= (u_int8_t *)ISA_HOLE_VADDR(SMBIOS_END -
> +                 (strlen(signature) - 1)); p++)
> +                     if (!memcmp(p, signature, strlen(signature))) {
> +                             hw_vendor = malloc(strlen(signature) + 1,
> +                                 M_DEVBUF, M_NOWAIT);
> +                             if (hw_vendor)
> +                                     strlcpy(hw_vendor, signature,
> +                                         strlen(signature) + 1);
> +                             p += strlen(signature);
> +                             break;
> +                     }
> +
> +             for (; hw_vendor &&
> +                 p <= (u_int8_t *)ISA_HOLE_VADDR(SMBIOS_END - 6); p++)
> +                     /*
> +                      * Search only for "net6501" in the comBIOS as that's
> +                      * the only Soekris platform that can run amd64
> +                      */
> +                     if (!memcmp(p, "net6501", 7)) {
> +                             hw_prod = malloc(8, M_DEVBUF, M_NOWAIT);
> +                             if (hw_prod) {
> +                                     memcpy(hw_prod, p, 7);
> +                                     hw_prod[7] = '\0';
> +                             }
> +                             break;
> +                     }
> +     }
>  
>  #if NACPI > 0
>       {
> --- sys/arch/i386/i386/bios.c.orig    Tue Feb 19 06:36:42 2013
> +++ sys/arch/i386/i386/bios.c Wed Feb 20 08:58:17 2013
> @@ -330,6 +330,43 @@
>  
>       printf("\n");
>  
> +     /* No SMBIOS extensions, go looking for Soekris comBIOS */
> +     if (!(flags & BIOSF_SMBIOS) && !smbiosrev) {
> +             const char *signature = "Soekris Engineering";
> +
> +             for (va = ISA_HOLE_VADDR(SMBIOS_START);
> +                 va <= (u_int8_t *)ISA_HOLE_VADDR(SMBIOS_END -
> +                 (strlen(signature) - 1)); va++)
> +                     if (!memcmp((u_int8_t *)va, signature,
> +                         strlen(signature))) {
> +                             hw_vendor = malloc(strlen(signature) + 1,
> +                                 M_DEVBUF, M_NOWAIT);
> +                             if (hw_vendor)
> +                                     strlcpy(hw_vendor, signature,
> +                                         strlen(signature) + 1);
> +                             va += strlen(signature);
> +                             break;
> +                     }
> +
> +             for (; hw_vendor &&
> +                 va <= (u_int8_t *)ISA_HOLE_VADDR(SMBIOS_END - 6); va++)
> +                     /*
> +                      * Search for "net(4(5xx|801)|[56]501)" which matches
> +                      * the strings found in the comBIOS images
> +                      */
> +                     if (!memcmp((u_int8_t *)va, "net45xx", 7) ||
> +                         !memcmp((u_int8_t *)va, "net4801", 7) ||
> +                         !memcmp((u_int8_t *)va, "net5501", 7) ||
> +                         !memcmp((u_int8_t *)va, "net6501", 7)) {
> +                             hw_prod = malloc(8, M_DEVBUF, M_NOWAIT);
> +                             if (hw_prod) {
> +                                     memcpy(hw_prod, (u_int8_t *)va, 7);
> +                                     hw_prod[7] = '\0';
> +                             }
> +                             break;
> +                     }
> +     }
> +
>  #if NAPM > 0
>       if (apm && ncpu < 2 && smbiosrev < 240) {
>               struct bios_attach_args ba;
> 

Reply via email to