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().

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