On Fri, Jul 12, 2019 at 02:27:15PM +1000, Jonathan Gray wrote:
> Use SMBIOS data for panel orientation.  Uses BIOS dates when other
> strings are generic.
> 
> There are orientation quirks in drm_panel_orientation_quirks.c for:
>       Acer One 10 (S1003)
>       Asus T100HA
>       GPD MicroPC (generic strings, also match on bios date)
>       GPD Pocket 2 (generic strings, also match on bios date)
>       GPD Win (same note on DMI match as GPD Pocket)
>       I.T.Works TW891
>       Lenovo Ideapad Miix 320
>       VIOS LTH17
> 
> This codepath is also called from
> 
> i915/vlv_dsi.c with the call to
> drm_connector_init_panel_orientation_property().
> 

ok mlarkin if you're looking for OKs.

-ml

> Index: arch/amd64/amd64/bios.c
> ===================================================================
> RCS file: /cvs/src/sys/arch/amd64/amd64/bios.c,v
> retrieving revision 1.37
> diff -u -p -r1.37 bios.c
> --- arch/amd64/amd64/bios.c   23 Oct 2018 17:51:32 -0000      1.37
> +++ arch/amd64/amd64/bios.c   12 Jul 2019 01:57:08 -0000
> @@ -67,6 +67,8 @@ const char *smbios_uninfo[] = {
>       "SYS-"
>  };
>  
> +char smbios_bios_date[64];
> +
>  int
>  bios_match(struct device *parent, void *match , void *aux)
>  {
> @@ -141,8 +143,11 @@ bios_attach(struct device *parent, struc
>                               printf(" version \"%s\"",
>                                   fixstring(scratch));
>                       if ((smbios_get_string(&bios, sb->release,
> -                         scratch, sizeof(scratch))) != NULL)
> +                         scratch, sizeof(scratch))) != NULL) {
> +                             strlcpy(smbios_bios_date, fixstring(scratch),
> +                                 sizeof(smbios_bios_date));
>                               printf(" date %s", fixstring(scratch));
> +                     }
>               }
>  
>               smbios_info(sc->sc_dev.dv_xname);
> Index: arch/i386/i386/bios.c
> ===================================================================
> RCS file: /cvs/src/sys/arch/i386/i386/bios.c,v
> retrieving revision 1.120
> diff -u -p -r1.120 bios.c
> --- arch/i386/i386/bios.c     23 Oct 2018 17:51:32 -0000      1.120
> +++ arch/i386/i386/bios.c     12 Jul 2019 03:45:03 -0000
> @@ -140,6 +140,8 @@ const char *smbios_uninfo[] = {
>  };
>  
>  
> +char smbios_bios_date[64];
> +
>  int
>  biosprobe(struct device *parent, void *match, void *aux)
>  {
> @@ -305,8 +307,12 @@ biosattach(struct device *parent, struct
>                                       printf(" version \"%s\"",
>                                           fixstring(scratch));
>                               if ((smbios_get_string(&bios, sb->release,
> -                                 scratch, sizeof(scratch))) != NULL)
> +                                 scratch, sizeof(scratch))) != NULL) {
> +                                     strlcpy(smbios_bios_date,
> +                                         fixstring(scratch),
> +                                         sizeof(smbios_bios_date));
>                                       printf(" date %s", fixstring(scratch));
> +                             }
>                       }
>                       smbios_info(sc->sc_dev.dv_xname);
>  
> Index: dev/pci/drm/drm_linux.c
> ===================================================================
> RCS file: /cvs/src/sys/dev/pci/drm/drm_linux.c,v
> retrieving revision 1.43
> diff -u -p -r1.43 drm_linux.c
> --- dev/pci/drm/drm_linux.c   10 Jul 2019 16:43:19 -0000      1.43
> +++ dev/pci/drm/drm_linux.c   12 Jul 2019 03:46:54 -0000
> @@ -394,6 +394,34 @@ dmi_found(const struct dmi_system_id *ds
>       return true;
>  }
>  
> +const struct dmi_system_id *
> +dmi_first_match(const struct dmi_system_id *sysid)
> +{
> +     const struct dmi_system_id *dsi;
> +
> +     for (dsi = sysid; dsi->matches[0].slot != 0 ; dsi++) {
> +             if (dmi_found(dsi))
> +                     return dsi;
> +     }
> +
> +     return NULL;
> +}
> +
> +#ifdef CONFIG_DMI
> +extern char smbios_bios_date[];
> +#endif
> +
> +const char *
> +dmi_get_system_info(int slot)
> +{
> +     WARN_ON(slot != DMI_BIOS_DATE);
> +#ifdef CONFIG_DMI
> +     if (slot == DMI_BIOS_DATE)
> +             return smbios_bios_date;
> +#endif
> +     return NULL;
> +}
> +
>  int
>  dmi_check_system(const struct dmi_system_id *sysid)
>  {
> Index: dev/pci/drm/i915/i915_drv.c
> ===================================================================
> RCS file: /cvs/src/sys/dev/pci/drm/i915/i915_drv.c,v
> retrieving revision 1.118
> diff -u -p -r1.118 i915_drv.c
> --- dev/pci/drm/i915/i915_drv.c       8 May 2019 15:55:56 -0000       1.118
> +++ dev/pci/drm/i915/i915_drv.c       12 Jul 2019 03:50:53 -0000
> @@ -45,6 +45,7 @@
>  #include <drm/drm_crtc_helper.h>
>  #include <drm/drm_atomic_helper.h>
>  #include <drm/i915_drm.h>
> +#include <drm/drm_utils.h>
>  
>  #include "i915_drv.h"
>  #include "i915_trace.h"
> @@ -3598,6 +3599,7 @@ inteldrm_attachhook(struct device *self)
>       struct wsemuldisplaydev_attach_args aa;
>       const struct drm_pcidev *id = dev_priv->id;
>       struct drm_device *dev = &dev_priv->drm;
> +     int orientation_quirk;
>  
>       if (i915_driver_load(dev_priv, id))
>               goto fail;
> @@ -3613,24 +3615,14 @@ inteldrm_attachhook(struct device *self)
>       inteldrm_init_backlight(dev_priv);
>  
>       ri->ri_flg = RI_CENTER | RI_WRONLY | RI_VCONS | RI_CLEAR;
> -     if (ri->ri_width < ri->ri_height) {
> -             pcireg_t subsys;
>  
> -#define PCI_PRODUCT_ASUSTEK_T100HA   0x1bdd
> +     orientation_quirk = drm_get_panel_orientation_quirk(ri->ri_width,
> +         ri->ri_height);
> +     if (orientation_quirk == DRM_MODE_PANEL_ORIENTATION_LEFT_UP)
> +             ri->ri_flg |= RI_ROTATE_CCW;
> +     else if (orientation_quirk == DRM_MODE_PANEL_ORIENTATION_RIGHT_UP)
> +             ri->ri_flg |= RI_ROTATE_CW;
>  
> -             /*
> -              * Asus T100HA needs to be rotated counter-clockwise.
> -              * Everybody else seems to mount their panels the
> -              * other way around.
> -              */
> -             subsys = pci_conf_read(dev_priv->pc, dev_priv->tag,
> -                 PCI_SUBSYS_ID_REG);
> -             if (PCI_VENDOR(subsys) == PCI_VENDOR_ASUSTEK &&
> -                 PCI_PRODUCT(subsys) == PCI_PRODUCT_ASUSTEK_T100HA)
> -                     ri->ri_flg |= RI_ROTATE_CCW;
> -             else
> -                     ri->ri_flg |= RI_ROTATE_CW;
> -     }
>       ri->ri_hw = dev_priv;
>       rasops_init(ri, 160, 160);
>  
> Index: dev/pci/drm/include/linux/dmi.h
> ===================================================================
> RCS file: /cvs/src/sys/dev/pci/drm/include/linux/dmi.h,v
> retrieving revision 1.1
> diff -u -p -r1.1 dmi.h
> --- dev/pci/drm/include/linux/dmi.h   14 Apr 2019 10:14:53 -0000      1.1
> +++ dev/pci/drm/include/linux/dmi.h   11 Jul 2019 04:11:08 -0000
> @@ -8,5 +8,7 @@
>  
>  int dmi_check_system(const struct dmi_system_id *);
>  bool dmi_match(int, const char *);
> +const struct dmi_system_id *dmi_first_match(const struct dmi_system_id *);
> +const char *dmi_get_system_info(int);
>  
>  #endif
> Index: dev/pci/drm/include/linux/kconfig.h
> ===================================================================
> RCS file: /cvs/src/sys/dev/pci/drm/include/linux/kconfig.h,v
> retrieving revision 1.2
> diff -u -p -r1.2 kconfig.h
> --- dev/pci/drm/include/linux/kconfig.h       21 May 2019 22:40:14 -0000      
> 1.2
> +++ dev/pci/drm/include/linux/kconfig.h       12 Jul 2019 03:47:24 -0000
> @@ -36,4 +36,8 @@
>  #define CONFIG_AGP                           1
>  #endif
>  
> +#if defined(__amd64__) || defined(__i386__)
> +#define CONFIG_DMI                           1
> +#endif
> +
>  #endif
> Index: dev/pci/drm/include/linux/mod_devicetable.h
> ===================================================================
> RCS file: /cvs/src/sys/dev/pci/drm/include/linux/mod_devicetable.h,v
> retrieving revision 1.1
> diff -u -p -r1.1 mod_devicetable.h
> --- dev/pci/drm/include/linux/mod_devicetable.h       14 Apr 2019 10:14:53 
> -0000      1.1
> +++ dev/pci/drm/include/linux/mod_devicetable.h       12 Jul 2019 01:43:29 
> -0000
> @@ -32,9 +32,10 @@ struct dmi_strmatch {
>  };
>  
>  struct dmi_system_id {
> -        int (*callback)(const struct dmi_system_id *);
> -        const char *ident;
> -        struct dmi_strmatch matches[4];
> +     int (*callback)(const struct dmi_system_id *);
> +     const char *ident;
> +     struct dmi_strmatch matches[4];
> +     void *driver_data;
>  };
>  #define      DMI_MATCH(a, b) {(a), (b)}
>  #define      DMI_EXACT_MATCH(a, b) {(a), (b)}
> 

Reply via email to