]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
drm/i915/display: allocate struct intel_display dynamically
authorJani Nikula <jani.nikula@intel.com>
Thu, 22 May 2025 09:48:42 +0000 (12:48 +0300)
committerJani Nikula <jani.nikula@intel.com>
Tue, 27 May 2025 08:25:53 +0000 (11:25 +0300)
Allocate struct intel_display dynamically in
intel_display_device_probe() and free in intel_display_device_remove().

v2: Remove duplicate intel_display_device_remove() on error path (Lucas)

Reviewed-by: Rodrigo Vivi <rodrigo.vivi@intel.com>
Reviewed-by: Lucas De Marchi <lucas.demarchi@intel.com>
Link: https://lore.kernel.org/r/8cd526a177061cddf71db59bd0901bd1a24e77be.1747907216.git.jani.nikula@intel.com
Signed-off-by: Jani Nikula <jani.nikula@intel.com>
drivers/gpu/drm/i915/display/intel_display_device.c
drivers/gpu/drm/i915/i915_driver.c
drivers/gpu/drm/i915/i915_drv.h
drivers/gpu/drm/i915/selftests/mock_gem_device.c
drivers/gpu/drm/xe/display/xe_display.c
drivers/gpu/drm/xe/xe_device_types.h

index 90d7145986643c3011ecba9f2bb4daf59048564b..1d8c2036d967fbee6cc824a18bd90512bbf1ecea 100644 (file)
@@ -1621,13 +1621,17 @@ static void display_platforms_or(struct intel_display_platforms *dst,
 
 struct intel_display *intel_display_device_probe(struct pci_dev *pdev)
 {
-       struct intel_display *display = to_intel_display(pdev);
+       struct intel_display *display;
        const struct intel_display_device_info *info;
        struct intel_display_ip_ver ip_ver = {};
        const struct platform_desc *desc;
        const struct subplatform_desc *subdesc;
        enum intel_step step;
 
+       display = kzalloc(sizeof(*display), GFP_KERNEL);
+       if (!display)
+               return ERR_PTR(-ENOMEM);
+
        /* Add drm device backpointer as early as possible. */
        display->drm = pci_get_drvdata(pdev);
 
@@ -1708,7 +1712,11 @@ no_display:
 
 void intel_display_device_remove(struct intel_display *display)
 {
+       if (!display)
+               return;
+
        intel_display_params_free(&display->params);
+       kfree(display);
 }
 
 static void __intel_display_device_info_runtime_init(struct intel_display *display)
index 950b7ad8d675f55bf654ac9183dfb358846a7105..d33b0eb83a4f38b9bf5211f47b2cbcd985608fea 100644 (file)
@@ -293,6 +293,8 @@ static void i915_driver_late_release(struct drm_i915_private *dev_priv)
        intel_sbi_fini(dev_priv);
 
        i915_params_free(&dev_priv->params);
+
+       intel_display_device_remove(display);
 }
 
 /**
@@ -735,6 +737,7 @@ i915_driver_create(struct pci_dev *pdev, const struct pci_device_id *ent)
        const struct intel_device_info *match_info =
                (struct intel_device_info *)ent->driver_data;
        struct drm_i915_private *i915;
+       struct intel_display *display;
 
        i915 = devm_drm_dev_alloc(&pdev->dev, &i915_drm_driver,
                                  struct drm_i915_private, drm);
@@ -749,10 +752,11 @@ i915_driver_create(struct pci_dev *pdev, const struct pci_device_id *ent)
        /* Set up device info and initial runtime info. */
        intel_device_info_driver_create(i915, pdev->device, match_info);
 
-       /* TODO: Allocate display dynamically. */
-       i915->display = &i915->__display;
+       display = intel_display_device_probe(pdev);
+       if (IS_ERR(display))
+               return ERR_CAST(display);
 
-       intel_display_device_probe(pdev);
+       i915->display = display;
 
        return i915;
 }
@@ -911,7 +915,6 @@ void i915_driver_remove(struct drm_i915_private *i915)
 static void i915_driver_release(struct drm_device *dev)
 {
        struct drm_i915_private *dev_priv = to_i915(dev);
-       struct intel_display *display = dev_priv->display;
        struct intel_runtime_pm *rpm = &dev_priv->runtime_pm;
        intel_wakeref_t wakeref;
 
@@ -934,8 +937,6 @@ static void i915_driver_release(struct drm_device *dev)
        intel_runtime_pm_driver_release(rpm);
 
        i915_driver_late_release(dev_priv);
-
-       intel_display_device_remove(display);
 }
 
 static int i915_driver_open(struct drm_device *dev, struct drm_file *file)
index 0841988c4a671d05ee5957949dc96fe55eee6617..fd0274ec9c2c779bcaea13a1578308bdfc0e16c4 100644 (file)
@@ -178,7 +178,6 @@ struct drm_i915_private {
        struct drm_device drm;
 
        struct intel_display *display;
-       struct intel_display __display; /* Transitional. Do not use directly. */
 
        /* FIXME: Device release actions should all be moved to drmm_ */
        bool do_release;
index 0ea12c68cedb20974f07dc3891852e847a215d8f..dab2b71a2a8fc42fd9bb87842aafa3505cecace8 100644 (file)
@@ -141,6 +141,7 @@ struct drm_i915_private *mock_gem_device(void)
        static struct dev_iommu fake_iommu = { .priv = (void *)-1 };
 #endif
        struct drm_i915_private *i915;
+       struct intel_display *display;
        struct pci_dev *pdev;
        int ret;
 
@@ -180,10 +181,11 @@ struct drm_i915_private *mock_gem_device(void)
        /* Set up device info and initial runtime info. */
        intel_device_info_driver_create(i915, pdev->device, &mock_info);
 
-       /* TODO: Allocate display dynamically. */
-       i915->display = &i915->__display;
+       display = intel_display_device_probe(pdev);
+       if (IS_ERR(display))
+               goto err_device;
 
-       intel_display_device_probe(pdev);
+       i915->display = display;
 
        dev_pm_domain_set(&pdev->dev, &pm_domain);
        pm_runtime_enable(&pdev->dev);
@@ -260,6 +262,7 @@ err_ttm:
        intel_gt_driver_late_release_all(i915);
        intel_memory_regions_driver_release(i915);
        drm_mode_config_cleanup(&i915->drm);
+err_device:
        mock_destroy_device(i915);
 
        return NULL;
@@ -269,6 +272,8 @@ void mock_destroy_device(struct drm_i915_private *i915)
 {
        struct device *dev = i915->drm.dev;
 
+       intel_display_device_remove(i915->display);
+
        devres_release_group(dev, NULL);
        put_device(dev);
 }
index 1e59b6dd2c3bd6a7f3331f7737dca0b56297ec6e..db7ef8737e1d5bb624ed644ac8c71cd1fd08abb0 100644 (file)
@@ -529,15 +529,16 @@ int xe_display_probe(struct xe_device *xe)
        if (!xe->info.probe_display)
                goto no_display;
 
-       /* TODO: Allocate display dynamically. */
-       xe->display = &xe->__display;
-
        display = intel_display_device_probe(pdev);
+       if (IS_ERR(display))
+               return PTR_ERR(display);
 
        err = drmm_add_action_or_reset(&xe->drm, display_device_remove, display);
        if (err)
                return err;
 
+       xe->display = display;
+
        if (has_display(xe))
                return 0;
 
index 634ac4aa7674b0a95021bdbffdcf98cc20c8aafe..ae9243e409a67d7cd741f81f39908e4e522c4d0d 100644 (file)
@@ -588,7 +588,6 @@ struct xe_device {
         * migrating to the right sub-structs
         */
        struct intel_display *display;
-       struct intel_display __display; /* Transitional. Do not use directly. */
 
        struct dram_info {
                bool wm_lv_0_adjust_needed;