drm/i915 & drm/xe: save struct drm_device to drvdata
authorJani Nikula <jani.nikula@intel.com>
Thu, 29 Aug 2024 14:47:43 +0000 (17:47 +0300)
committerJani Nikula <jani.nikula@intel.com>
Mon, 2 Sep 2024 12:01:59 +0000 (15:01 +0300)
In the future, the display code shall not have any idea about struct
xe_device or struct drm_i915_private, but will need to get at the struct
drm_device via drvdata. Store the struct drm_device pointer to drvdata
instead of the driver specific pointer.

Avoid passing NULL to container_of() via to_i915()/to_xe_device(). (It
does return NULL for NULL pointers when the offset happens to be 0, but
otherwise returns garbage pointers for NULL.)

Reviewed-by: Gustavo Sousa <gustavo.sousa@intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/946805b32e38d4785880cc7857e01e6a309126a9.1724942754.git.jani.nikula@intel.com
Signed-off-by: Jani Nikula <jani.nikula@intel.com>
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/compat-i915-headers/i915_drv.h
drivers/gpu/drm/xe/xe_device.h
drivers/gpu/drm/xe/xe_pci.c

index ccdd2983cfb516f703335ef3f0b19c1b644c9368..71ca02f7df9d10ac101b7d06efd6e06c01e96253 100644 (file)
@@ -723,7 +723,7 @@ i915_driver_create(struct pci_dev *pdev, const struct pci_device_id *ent)
        if (IS_ERR(i915))
                return i915;
 
-       pci_set_drvdata(pdev, i915);
+       pci_set_drvdata(pdev, &i915->drm);
 
        /* Device parameters start as a copy of module parameters. */
        i915_params_copy(&i915->params, &i915_modparams);
index d772cbe15fec12ab073a431a5b97fd8b1ee58fa9..39f6614a0a99a530857794eaeaf82e31eb9ca16e 100644 (file)
@@ -365,12 +365,16 @@ static inline struct drm_i915_private *to_i915(const struct drm_device *dev)
 
 static inline struct drm_i915_private *kdev_to_i915(struct device *kdev)
 {
-       return dev_get_drvdata(kdev);
+       struct drm_device *drm = dev_get_drvdata(kdev);
+
+       return drm ? to_i915(drm) : NULL;
 }
 
 static inline struct drm_i915_private *pdev_to_i915(struct pci_dev *pdev)
 {
-       return pci_get_drvdata(pdev);
+       struct drm_device *drm = pci_get_drvdata(pdev);
+
+       return drm ? to_i915(drm) : NULL;
 }
 
 static inline struct intel_gt *to_gt(const struct drm_i915_private *i915)
index 0bd29846873b3958e0d5b7968e184f71cae49479..91794ca17a588cb14e7d7a296e8a6e7095406e11 100644 (file)
@@ -172,7 +172,7 @@ struct drm_i915_private *mock_gem_device(void)
                return NULL;
        }
 
-       pci_set_drvdata(pdev, i915);
+       pci_set_drvdata(pdev, &i915->drm);
 
        /* Device parameters start as a copy of module parameters. */
        i915_params_copy(&i915->params, &i915_modparams);
index b7b12b20e390abd0a69c57a8f5554ec3f9a26f49..becb6a7ec9d73bff4123a344c452af0a0c996e44 100644 (file)
@@ -23,7 +23,9 @@ static inline struct drm_i915_private *to_i915(const struct drm_device *dev)
 
 static inline struct drm_i915_private *kdev_to_i915(struct device *kdev)
 {
-       return dev_get_drvdata(kdev);
+       struct drm_device *drm = dev_get_drvdata(kdev);
+
+       return drm ? to_i915(drm) : NULL;
 }
 
 #define IS_PLATFORM(xe, x) ((xe)->info.platform == x)
index f052c06a2d2f58bc414727e638cd29a53bd4b3f5..894f04770454f2df4e0683b7fae0726828822c1e 100644 (file)
@@ -17,12 +17,16 @@ static inline struct xe_device *to_xe_device(const struct drm_device *dev)
 
 static inline struct xe_device *kdev_to_xe_device(struct device *kdev)
 {
-       return dev_get_drvdata(kdev);
+       struct drm_device *drm = dev_get_drvdata(kdev);
+
+       return drm ? to_xe_device(drm) : NULL;
 }
 
 static inline struct xe_device *pdev_to_xe_device(struct pci_dev *pdev)
 {
-       return pci_get_drvdata(pdev);
+       struct drm_device *drm = pci_get_drvdata(pdev);
+
+       return drm ? to_xe_device(drm) : NULL;
 }
 
 static inline struct xe_device *xe_device_const_cast(const struct xe_device *xe)
index f276194d9c4e52d4a994babfda60e9c5a034a9f5..937c3e064f0df31aea0c2c75be3c928fbf887484 100644 (file)
@@ -793,7 +793,7 @@ static int xe_pci_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
        if (IS_ERR(xe))
                return PTR_ERR(xe);
 
-       pci_set_drvdata(pdev, xe);
+       pci_set_drvdata(pdev, &xe->drm);
 
        xe_pm_assert_unbounded_bridge(xe);
        subplatform_desc = find_subplatform(xe, desc);