[PATCH] drm/amdgpu: drop the drm irq pre/post/un install callbacks

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Am 22.01.2018 um 18:22 schrieb Alex Deucher:
> The preinstall callback didn't do anything because not all
> of the IPs were initialized when it was called.
>
> Move the postinstall setup into sequence in the driver.
>
> The uninstall callback disabled all interrupt source, but
> it got called too late in the driver sequence and caused problems
> with IPs who already freed the relevant data structures.  Move
> the call into the right place in the driver sequence.
>
> Signed-off-by: Alex Deucher <alexander.deucher at amd.com>

Acked-by: Christian König <christian.koenig at amd.com>

> ---
>   drivers/gpu/drm/amd/amdgpu/amdgpu_device.c |  3 ++
>   drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c    |  3 --
>   drivers/gpu/drm/amd/amdgpu/amdgpu_irq.c    | 52 ++----------------------------
>   drivers/gpu/drm/amd/amdgpu/amdgpu_irq.h    |  4 +--
>   4 files changed, 6 insertions(+), 56 deletions(-)
>
> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c
> index d09c4ee9f7e1..02a9157e72ac 100644
> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c
> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c
> @@ -1483,6 +1483,9 @@ static int amdgpu_device_ip_fini(struct amdgpu_device *adev)
>   		adev->ip_blocks[i].status.hw = false;
>   	}
>   
> +	/* disable all interrupts */
> +	amdgpu_irq_disable_all(adev);
> +
>   	for (i = adev->num_ip_blocks - 1; i >= 0; i--) {
>   		if (!adev->ip_blocks[i].status.sw)
>   			continue;
> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c
> index 24bc3e9203e2..ab4cb4917565 100644
> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c
> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c
> @@ -856,9 +856,6 @@ static struct drm_driver kms_driver = {
>   	.disable_vblank = amdgpu_disable_vblank_kms,
>   	.get_vblank_timestamp = drm_calc_vbltimestamp_from_scanoutpos,
>   	.get_scanout_position = amdgpu_get_crtc_scanout_position,
> -	.irq_preinstall = amdgpu_irq_preinstall,
> -	.irq_postinstall = amdgpu_irq_postinstall,
> -	.irq_uninstall = amdgpu_irq_uninstall,
>   	.irq_handler = amdgpu_irq_handler,
>   	.ioctls = amdgpu_ioctls_kms,
>   	.gem_free_object_unlocked = amdgpu_gem_object_free,
> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_irq.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_irq.c
> index 56bcd59c3399..f6f2a662bb8f 100644
> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_irq.c
> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_irq.c
> @@ -92,7 +92,7 @@ static void amdgpu_irq_reset_work_func(struct work_struct *work)
>   }
>   
>   /* Disable *all* interrupts */
> -static void amdgpu_irq_disable_all(struct amdgpu_device *adev)
> +void amdgpu_irq_disable_all(struct amdgpu_device *adev)
>   {
>   	unsigned long irqflags;
>   	unsigned i, j, k;
> @@ -123,55 +123,6 @@ static void amdgpu_irq_disable_all(struct amdgpu_device *adev)
>   }
>   
>   /**
> - * amdgpu_irq_preinstall - drm irq preinstall callback
> - *
> - * @dev: drm dev pointer
> - *
> - * Gets the hw ready to enable irqs (all asics).
> - * This function disables all interrupt sources on the GPU.
> - */
> -void amdgpu_irq_preinstall(struct drm_device *dev)
> -{
> -	struct amdgpu_device *adev = dev->dev_private;
> -
> -	/* Disable *all* interrupts */
> -	amdgpu_irq_disable_all(adev);
> -	/* Clear bits */
> -	amdgpu_ih_process(adev);
> -}
> -
> -/**
> - * amdgpu_irq_postinstall - drm irq preinstall callback
> - *
> - * @dev: drm dev pointer
> - *
> - * Handles stuff to be done after enabling irqs (all asics).
> - * Returns 0 on success.
> - */
> -int amdgpu_irq_postinstall(struct drm_device *dev)
> -{
> -	dev->max_vblank_count = 0x00ffffff;
> -	return 0;
> -}
> -
> -/**
> - * amdgpu_irq_uninstall - drm irq uninstall callback
> - *
> - * @dev: drm dev pointer
> - *
> - * This function disables all interrupt sources on the GPU (all asics).
> - */
> -void amdgpu_irq_uninstall(struct drm_device *dev)
> -{
> -	struct amdgpu_device *adev = dev->dev_private;
> -
> -	if (adev == NULL) {
> -		return;
> -	}
> -	amdgpu_irq_disable_all(adev);
> -}
> -
> -/**
>    * amdgpu_irq_handler - irq handler
>    *
>    * @int irq, void *arg: args
> @@ -261,6 +212,7 @@ int amdgpu_irq_init(struct amdgpu_device *adev)
>   		cancel_work_sync(&adev->reset_work);
>   		return r;
>   	}
> +	adev->ddev->max_vblank_count = 0x00ffffff;
>   
>   	DRM_DEBUG("amdgpu: irq initialized.\n");
>   	return 0;
> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_irq.h b/drivers/gpu/drm/amd/amdgpu/amdgpu_irq.h
> index 0610cc4a9788..3375ad778edc 100644
> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_irq.h
> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_irq.h
> @@ -78,9 +78,7 @@ struct amdgpu_irq {
>   	uint32_t                        srbm_soft_reset;
>   };
>   
> -void amdgpu_irq_preinstall(struct drm_device *dev);
> -int amdgpu_irq_postinstall(struct drm_device *dev);
> -void amdgpu_irq_uninstall(struct drm_device *dev);
> +void amdgpu_irq_disable_all(struct amdgpu_device *adev);
>   irqreturn_t amdgpu_irq_handler(int irq, void *arg);
>   
>   int amdgpu_irq_init(struct amdgpu_device *adev);



[Index of Archives]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux