[Intel-gfx] [PATCH 14/23] drm/i915: Attach the pci match data to the device upon creation
Michal Wajdeczko
michal.wajdeczko at intel.com
Wed Sep 5 13:36:13 UTC 2018
On Tue, 04 Sep 2018 23:57:33 +0200, Chris Wilson
<chris at chris-wilson.co.uk> wrote:
> Attach our device_info to the our i915 private on creation so that it is
> always available for inspection.
>
> Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>
> ---
> drivers/gpu/drm/i915/i915_drv.c | 66 +++++++++++++++++++--------------
> 1 file changed, 38 insertions(+), 28 deletions(-)
>
> diff --git a/drivers/gpu/drm/i915/i915_drv.c
> b/drivers/gpu/drm/i915/i915_drv.c
> index 77a4a01ddc08..1dddd2f4f929 100644
> --- a/drivers/gpu/drm/i915/i915_drv.c
> +++ b/drivers/gpu/drm/i915/i915_drv.c
> @@ -870,7 +870,6 @@ static void intel_detect_preproduction_hw(struct
> drm_i915_private *dev_priv)
> /**
> * i915_driver_init_early - setup state not requiring device access
> * @dev_priv: device private
> - * @ent: the matching pci_device_id
> *
> * Initialize everything that is a "SW-only" state, that is state not
> * requiring accessing the device or exposing the driver via kernel
> internal
> @@ -878,25 +877,13 @@ static void intel_detect_preproduction_hw(struct
> drm_i915_private *dev_priv)
> * system memory allocation, setting up device specific attributes and
> * function hooks not requiring accessing the device.
> */
> -static int i915_driver_init_early(struct drm_i915_private *dev_priv,
> - const struct pci_device_id *ent)
> +static int i915_driver_init_early(struct drm_i915_private *dev_priv)
> {
> - const struct intel_device_info *match_info =
> - (struct intel_device_info *)ent->driver_data;
> - struct intel_device_info *device_info;
> int ret = 0;
> if (i915_inject_load_failure())
> return -ENODEV;
> - /* Setup the write-once "constant" device info */
> - device_info = mkwrite_device_info(dev_priv);
> - memcpy(device_info, match_info, sizeof(*device_info));
> - device_info->device_id = dev_priv->drm.pdev->device;
> -
> - BUILD_BUG_ON(INTEL_MAX_PLATFORMS >
> - sizeof(device_info->platform_mask) * BITS_PER_BYTE);
> - BUG_ON(device_info->gen > sizeof(device_info->gen_mask) *
> BITS_PER_BYTE);
> spin_lock_init(&dev_priv->irq_lock);
> spin_lock_init(&dev_priv->gpu_error.lock);
> mutex_init(&dev_priv->backlight_lock);
> @@ -1335,6 +1322,39 @@ static void i915_welcome_messages(struct
> drm_i915_private *dev_priv)
> DRM_INFO("DRM_I915_DEBUG_RUNTIME_PM enabled\n");
> }
> +static struct drm_i915_private *
> +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 intel_device_info *device_info;
> + struct drm_i915_private *i915;
> +
> + i915 = kzalloc(sizeof(*i915), GFP_KERNEL);
> + if (!i915)
> + return NULL;
> +
> + if (drm_dev_init(&i915->drm, &driver, &pdev->dev)) {
> + kfree(i915);
> + return NULL;
> + }
> +
> + i915->drm.pdev = pdev;
> + i915->drm.dev_private = i915;
> + pci_set_drvdata(pdev, &i915->drm);
> +
> + /* Setup the write-once "constant" device info */
> + device_info = mkwrite_device_info(i915);
> + memcpy(device_info, match_info, sizeof(*device_info));
> + device_info->device_id = pdev->device;
> +
> + BUILD_BUG_ON(INTEL_MAX_PLATFORMS >
> + sizeof(device_info->platform_mask) * BITS_PER_BYTE);
> + BUG_ON(device_info->gen > sizeof(device_info->gen_mask) *
> BITS_PER_BYTE);
> +
> + return i915;
> +}
> +
> /**
> * i915_driver_load - setup chip and create an initial config
> * @pdev: PCI device
> @@ -1357,24 +1377,15 @@ int i915_driver_load(struct pci_dev *pdev, const
> struct pci_device_id *ent)
> if (!i915_modparams.nuclear_pageflip && match_info->gen < 5)
> driver.driver_features &= ~DRIVER_ATOMIC;
> - ret = -ENOMEM;
> - dev_priv = kzalloc(sizeof(*dev_priv), GFP_KERNEL);
> - if (dev_priv)
> - ret = drm_dev_init(&dev_priv->drm, &driver, &pdev->dev);
> - if (ret) {
> - DRM_DEV_ERROR(&pdev->dev, "allocation failed\n");
> - goto out_free;
> - }
> -
> - dev_priv->drm.pdev = pdev;
> - dev_priv->drm.dev_private = dev_priv;
> + dev_priv = i915_driver_create(pdev, ent);
> + if (!dev_priv)
> + return -ENOMEM;
> ret = pci_enable_device(pdev);
> if (ret)
> goto out_fini;
> - pci_set_drvdata(pdev, &dev_priv->drm);
> - ret = i915_driver_init_early(dev_priv, ent);
> + ret = i915_driver_init_early(dev_priv);
> if (ret < 0)
> goto out_pci_disable;
> @@ -1426,7 +1437,6 @@ int i915_driver_load(struct pci_dev *pdev, const
> struct pci_device_id *ent)
> out_fini:
> i915_load_error(dev_priv, "Device initialization failed (%d)\n", ret);
> drm_dev_fini(&dev_priv->drm);
> -out_free:
> kfree(dev_priv);
> pci_set_drvdata(pdev, NULL);
I think you want drm_dev_fini, kfree and pci_set_drvdata to be moved to
void i915_driver_destroy(i915) { ... }
to keep symmetry with just added _create_ function.
with that,
Reviewed-by: Michal Wajdeczko <michal.wajdeczko at intel.com>
> return ret;
More information about the Intel-gfx
mailing list