drm - Add valleyview support
authorMatthew Dillon <dillon@apollo.backplane.com>
Mon, 20 Jul 2015 06:00:24 +0000 (23:00 -0700)
committerMatthew Dillon <dillon@apollo.backplane.com>
Mon, 20 Jul 2015 06:00:24 +0000 (23:00 -0700)
* Fix infininte loop during PCI iteration.  The previous code was not
  actually iterating, so any loop would wind up being infinite.  Valleyview
  triggers this issue.

* Fix improper register offset in intel_gpio_setup() (note, linux master
  also made this fix in April).

* Allow hw.drm.debug to be modified with a sysctl.

sys/dev/drm/drm_drv.c
sys/dev/drm/i915/i915_drv.c
sys/dev/drm/i915/intel_i2c.c

index 81aad3e..322035b 100644 (file)
@@ -232,6 +232,8 @@ SYSCTL_NODE(_hw, OID_AUTO, drm, CTLFLAG_RW, NULL, "DRM device");
 SYSCTL_NODE(_hw_drm, OID_AUTO, msi, CTLFLAG_RW, NULL, "DRM device msi");
 SYSCTL_INT(_hw_drm_msi, OID_AUTO, enable, CTLFLAG_RD, &drm_msi, 0,
     "Enable MSI interrupts for drm devices");
+SYSCTL_INT(_hw_drm, OID_AUTO, debug, CTLFLAG_RW, &drm_debug, 0,
+    "DRM debugging");
 
 static struct drm_msi_blacklist_entry drm_msi_blacklist[] = {
        {0x8086, 0x2772}, /* Intel i945G        */ \
@@ -1002,4 +1004,3 @@ dmi_check_system(const struct dmi_system_id *sysid)
        }
        return (num);
 }
-
index 2996193..f95a96a 100644 (file)
@@ -411,6 +411,7 @@ void intel_detect_pch(struct drm_device *dev)
 {
        struct drm_i915_private *dev_priv = dev->dev_private;
        struct device *pch = NULL;
+       struct pci_devinfo *di;
 
        /* In all current cases, num_pipes is equivalent to the PCH_NOP setting
         * (which really amounts to a PCH but no South Display).
@@ -435,7 +436,9 @@ void intel_detect_pch(struct drm_device *dev)
         * all the ISA bridge devices and check for the first match, instead
         * of only checking the first one.
         */
-       while ((pch = pci_find_class(PCIC_BRIDGE, PCIS_BRIDGE_ISA))) {
+       di = NULL;
+
+       while ((pch = pci_iterate_class(&di, PCIC_BRIDGE, PCIS_BRIDGE_ISA))) {
                if (pci_get_vendor(pch) == PCI_VENDOR_INTEL) {
                        unsigned short id = pci_get_device(pch) & INTEL_PCH_DEVICE_ID_MASK;
                        dev_priv->pch_id = id;
index 15d2918..8db69fe 100644 (file)
@@ -260,6 +260,7 @@ static void set_data(device_t idev, int val)
        dev_priv = sc->drm_dev->dev_private;
 
        reserved = get_reserved(idev);
+
        if (val)
                data_bits = GPIO_DATA_DIR_IN | GPIO_DATA_DIR_MASK;
        else
@@ -306,9 +307,7 @@ intel_gpio_setup(device_t idev)
        device_set_desc(idev, sc->name);
 
        sc->reg0 = (pin + 1) | GMBUS_RATE_100KHZ;
-       sc->reg = map_pin_to_reg[pin + 1];
-       if (HAS_PCH_SPLIT(dev_priv->dev))
-               sc->reg += PCH_GPIOA - GPIOA;
+       sc->reg = dev_priv->gpio_mmio_base + map_pin_to_reg[pin + 1];
 
        /* add generic bit-banging code */
        sc->iic_dev = device_add_child(idev, "iicbb", -1);