kernel/apple_gmux: Unbreak loading i915.
authorPeeter Must <karu.pruun@gmail.com>
Tue, 28 Aug 2018 13:26:05 +0000 (16:26 +0300)
committerPeeter Must <karu.pruun@gmail.com>
Tue, 28 Aug 2018 13:26:05 +0000 (16:26 +0300)
* Commit 183e2373896e4ea605435a6bd8f943e8273bf8cd broke loading i915
  on Apple MacBookPro laptops with dual GPUs and the gmux chip. The
  reason is that whereas formely drm_init_pdev() and drm_fill_pdev()
  where mere bookkeeping routines, the above commit relocates
  assignment of irq from drm_drv.c:drm_attach() to drm_fill_pdev().
  Since apple_gmux is loaded before i915, and apple_gmux initializes
  a pdev structure including an irq for the graphics pci device, the
  i915 which is loaded afterwards will get zero for an irq and hence
  fails to attach.

* The temporary fix is to disable apple_gmux initializing a pci_dev
  structure for bookkeeping purposes. This is not needed at the
  moment since the primary purpose of apple_gmux is to switch to iGPU
  so the user is not left with a frozen screen after loading i915. We
  do not support switching between GPUs yet.

* When and if the initialization of graphics pci devices becomes
  independent from the drm subsystem, we can make apple_gmux aware of
  the various GPUs in the system.

sys/gnu/dev/misc/apple_gmux/apple-gmux.c

index 89869da..4e4ad68 100644 (file)
@@ -788,7 +788,10 @@ apple_gmux_attach(device_t dev)
                pr_err("Cannot find PCI device\n");
                goto err_release;
        }
+
+#if 0  /* collides with 915 */
        drm_init_pdev(pch_dev, &sc->pdev);
+#endif
 
 #if 0  /* no backlight infrastructure */
        memset(&props, 0, sizeof(props));
@@ -898,7 +901,9 @@ err_enable_gpe:
 err_notify:
        /* backlight_device_unregister(bdev); */
 err_release:
+#if 0  /* collides with i915 */
        drm_fini_pdev(&sc->pdev);
+#endif
        bus_release_resource(dev, SYS_RES_IOPORT, sc->io_rid, sc->io_res);
 
        return(ret);
@@ -918,7 +923,9 @@ apple_gmux_detach(device_t dev)
        }
 
        apple_gmux_softc_data = NULL;
+#if 0  /* collides with i915*/
        drm_fini_pdev(&sc->pdev);
+#endif
        return(bus_release_resource(dev, SYS_RES_IOPORT,
            sc->io_rid, sc->io_res));
 }