> Date: Thu, 15 Oct 2015 01:03:10 +0200 (CEST)
> From: si...@slackware.it
> 
> Hello tech@,
> I'm sorry for resurrecting an old thread: I'm seeing intel drm errors in my 
> dmesg, they appeared with the same end of September -current snapshot as the 
> original poster mentioned but I'm having no visible issues other than some 
> noise in the logs.
> Hardware is an EeePC 701 (i915) running i386 -current, here's dmesg from 13th 
> October snapshot:
> 
...
> error: [drm:pid0:i915_gem_detect_bit_6_swizzle] *ERROR* Couldn't read from 
> MCHBAR.  Disabling tiling.

Hmm, does the diff below help?

Index: drm_linux.h
===================================================================
RCS file: /home/cvs/src/sys/dev/pci/drm/drm_linux.h,v
retrieving revision 1.41
diff -u -p -r1.41 drm_linux.h
--- drm_linux.h 27 Sep 2015 21:28:14 -0000      1.41
+++ drm_linux.h 15 Oct 2015 18:20:53 -0000
@@ -971,6 +971,10 @@ struct dmi_system_id {
 #define        DMI_EXACT_MATCH(a, b) {(a), (b)}
 int dmi_check_system(const struct dmi_system_id *);
 
+struct resource {
+       u_long  start;
+};
+
 struct pci_dev {
        uint16_t        vendor;
        uint16_t        device;
Index: i915/i915_dma.c
===================================================================
RCS file: /home/cvs/src/sys/dev/pci/drm/i915/i915_dma.c,v
retrieving revision 1.23
diff -u -p -r1.23 i915_dma.c
--- i915/i915_dma.c     23 Sep 2015 23:12:11 -0000      1.23
+++ i915/i915_dma.c     15 Oct 2015 19:15:44 -0000
@@ -1128,6 +1128,17 @@ static int i915_get_bridge_dev(struct dr
        }
        return 0;
 }
+#else
+int i915_get_bridge_dev(struct drm_device *dev)
+{
+       struct drm_i915_private *dev_priv = dev->dev_private;
+
+       dev_priv->bridge_dev = malloc(sizeof(*dev_priv->bridge_dev),
+                                     M_DEVBUF, M_WAITOK);
+       dev_priv->bridge_dev->pc = dev->pdev->pc;
+       dev_priv->bridge_dev->tag = pci_make_tag(dev->pdev->pc, 0, 0, 0);
+       return 0;
+}
 #endif
 
 #define MCHBAR_I915 0x44
@@ -1145,35 +1156,29 @@ intel_alloc_mchbar_resource(struct drm_d
        int reg = INTEL_INFO(dev)->gen >= 4 ? MCHBAR_I965 : MCHBAR_I915;
        u32 temp_lo, temp_hi = 0;
        u64 mchbar_addr;
-       u_long addr;
 
        if (INTEL_INFO(dev)->gen >= 4)
-               temp_hi = pci_conf_read(dev_priv->pc, dev_priv->tag, reg + 4);
-       temp_lo = pci_conf_read(dev_priv->pc, dev_priv->tag, reg);
+               pci_read_config_dword(dev_priv->bridge_dev, reg + 4, &temp_hi);
+       pci_read_config_dword(dev_priv->bridge_dev, reg, &temp_lo);
        mchbar_addr = ((u64)temp_hi << 32) | temp_lo;
 
-       if (mchbar_addr == 0) {
-               addr = (u_long)mchbar_addr;
-               if (dev_priv->memex == NULL || extent_alloc(dev_priv->memex,
-                   MCHBAR_SIZE, MCHBAR_SIZE, 0, 0, 0, &addr)) {
-                       return -ENOMEM;
-               } else {
-                       mchbar_addr = addr;
-                       /* We've allocated it, now fill in the BAR again */
-                       if (INTEL_INFO(dev)->gen >= 4)
-                               pci_conf_write(dev_priv->pc, dev_priv->tag,
-                                   reg + 4, upper_32_bits(mchbar_addr));
-                       pci_conf_write(dev_priv->pc, dev_priv->tag,
-                           reg, lower_32_bits(mchbar_addr));
-               }
+       if (mchbar_addr &&
+           extent_alloc_region(dev_priv->memex, mchbar_addr, MCHBAR_SIZE,
+                               EX_NOWAIT) == 0)
+               return 0;
+
+       /* Get some space for it */
+       if (dev_priv->memex == NULL || extent_alloc(dev_priv->memex,
+           MCHBAR_SIZE, MCHBAR_SIZE, 0, 0, 0, &dev_priv->mch_res.start)) {
+               return -ENOMEM;
        }
 
        if (INTEL_INFO(dev)->gen >= 4)
-               pci_conf_write(dev_priv->pc, dev_priv->tag, reg + 4,
-                   upper_32_bits(mchbar_addr));
+               pci_write_config_dword(dev_priv->bridge_dev, reg + 4,
+                                      upper_32_bits(dev_priv->mch_res.start));
 
-       pci_conf_write(dev_priv->pc, dev_priv->tag, reg,
-           lower_32_bits(mchbar_addr));
+       pci_write_config_dword(dev_priv->bridge_dev, reg,
+                              lower_32_bits(dev_priv->mch_res.start));
        return 0;
 }
 
@@ -1183,16 +1188,16 @@ intel_setup_mchbar(struct drm_device *de
 {
        drm_i915_private_t *dev_priv = dev->dev_private;
        int mchbar_reg = INTEL_INFO(dev)->gen >= 4 ? MCHBAR_I965 : MCHBAR_I915;
-       pcireg_t temp;
+       u32 temp;
        bool enabled;
 
        dev_priv->mchbar_need_disable = false;
 
        if (IS_I915G(dev) || IS_I915GM(dev)) {
-               temp = pci_conf_read(dev_priv->pc, dev_priv->tag, DEVEN_REG);
+               pci_read_config_dword(dev_priv->bridge_dev, DEVEN_REG, &temp);
                enabled = !!(temp & DEVEN_MCHBAR_EN);
        } else {
-               temp = pci_conf_read(dev_priv->pc, dev_priv->tag, mchbar_reg);
+               pci_read_config_dword(dev_priv->bridge_dev, mchbar_reg, &temp);
                enabled = temp & 1;
        }
 
@@ -1207,11 +1212,11 @@ intel_setup_mchbar(struct drm_device *de
 
        /* Space is allocated or reserved, so enable it. */
        if (IS_I915G(dev) || IS_I915GM(dev)) {
-               pci_conf_write(dev_priv->pc, dev_priv->tag, DEVEN_REG,
-                   temp | DEVEN_MCHBAR_EN);
+               pci_write_config_dword(dev_priv->bridge_dev, DEVEN_REG,
+                                      temp | DEVEN_MCHBAR_EN);
        } else {
-               temp = pci_conf_read(dev_priv->pc, dev_priv->tag, mchbar_reg);
-               pci_conf_write(dev_priv->pc, dev_priv->tag, mchbar_reg, temp | 
1);
+               pci_read_config_dword(dev_priv->bridge_dev, mchbar_reg, &temp);
+               pci_write_config_dword(dev_priv->bridge_dev, mchbar_reg, temp | 
1);
        }
 }
 
@@ -1220,28 +1225,23 @@ intel_teardown_mchbar(struct drm_device 
 {
        drm_i915_private_t *dev_priv = dev->dev_private;
        int mchbar_reg = INTEL_INFO(dev)->gen >= 4 ? MCHBAR_I965 : MCHBAR_I915;
-       pcireg_t temp;
-       u_int64_t mchbar_addr;
-       pcireg_t low, high = 0;
+       u32 temp;
 
        if (dev_priv->mchbar_need_disable) {
                if (IS_I915G(dev) || IS_I915GM(dev)) {
-                       temp = pci_conf_read(dev_priv->pc, dev_priv->tag, 
DEVEN_REG);
+                       pci_read_config_dword(dev_priv->bridge_dev, DEVEN_REG, 
&temp);
                        temp &= ~DEVEN_MCHBAR_EN;
-                       pci_conf_write(dev_priv->pc, dev_priv->tag, DEVEN_REG, 
temp);
+                       pci_write_config_dword(dev_priv->bridge_dev, DEVEN_REG, 
temp);
                } else {
-                       temp = pci_conf_read(dev_priv->pc, dev_priv->tag, 
mchbar_reg);
+                       pci_read_config_dword(dev_priv->bridge_dev, mchbar_reg, 
&temp);
                        temp &= ~1;
-                       pci_conf_write(dev_priv->pc, dev_priv->tag, mchbar_reg, 
temp);
+                       pci_write_config_dword(dev_priv->bridge_dev, 
mchbar_reg, temp);
                }
        }
 
-       if (INTEL_INFO(dev)->gen >= 4)
-               high = pci_conf_read(dev_priv->pc, dev_priv->tag, mchbar_reg + 
4);
-       low = pci_conf_read(dev_priv->pc, dev_priv->tag, mchbar_reg);
-       mchbar_addr = ((u_int64_t)high << 32) | low;
-       if (dev_priv->memex)
-               extent_free(dev_priv->memex, mchbar_addr, MCHBAR_SIZE, 0);
+       if (dev_priv->mch_res.start)
+               extent_free(dev_priv->memex, dev_priv->mch_res.start,
+                           MCHBAR_SIZE, 0);
 }
 
 #ifdef __linux__
Index: i915/i915_drv.c
===================================================================
RCS file: /home/cvs/src/sys/dev/pci/drm/i915/i915_drv.c,v
retrieving revision 1.93
diff -u -p -r1.93 i915_drv.c
--- i915/i915_drv.c     28 Sep 2015 17:29:56 -0000      1.93
+++ i915/i915_drv.c     15 Oct 2015 19:11:35 -0000
@@ -197,6 +197,7 @@ void        i965_alloc_ifp(struct inteldrm_soft
 void   intel_gtt_chipset_setup(struct drm_device *);
 
 /* i915_dma.c */
+int    i915_get_bridge_dev(struct drm_device *);
 void   intel_setup_mchbar(struct drm_device *);
 void   intel_teardown_mchbar(struct drm_device *);
 int    i915_load_modeset_init(struct drm_device *);
@@ -1240,12 +1241,12 @@ inteldrm_attach(struct device *parent, s
        if (IS_HSW_EARLY_SDV(dev))
                DRM_INFO("This is an early pre-production Haswell machine. "
                         "It may not be fully functional.\n");
+#endif
 
        if (i915_get_bridge_dev(dev)) {
                ret = -EIO;
                goto free_priv;
        }
-#endif
 
        mmio_bar = IS_GEN2(dev) ? 1 : 0;
        /* Before gen4, the registers and the GTT are behind different BARs.
Index: i915/i915_drv.h
===================================================================
RCS file: /home/cvs/src/sys/dev/pci/drm/i915/i915_drv.h,v
retrieving revision 1.69
diff -u -p -r1.69 i915_drv.h
--- i915/i915_drv.h     28 Sep 2015 17:29:56 -0000      1.69
+++ i915/i915_drv.h     15 Oct 2015 18:21:05 -0000
@@ -1498,9 +1498,7 @@ typedef struct inteldrm_softc {
        uint32_t last_seqno, next_seqno;
 
        drm_dma_handle_t *status_page_dmah;
-#ifdef __linux__
        struct resource mch_res;
-#endif
        union flush {
                struct {
                        bus_space_tag_t         bst;

Reply via email to