[v3,5/8] drm/panfrost: Split mmu_hw_do_operation into locked and unlocked version
diff mbox series

Message ID 20190826223317.28509-6-robh@kernel.org
State New
Headers show
Series
  • panfrost: Locking and runtime PM fixes
Related show

Commit Message

Rob Herring Aug. 26, 2019, 10:33 p.m. UTC
In preparation to call mmu_hw_do_operation with the as_lock already held,
Add a mmu_hw_do_operation_locked function.

Fixes: 7282f7645d06 ("drm/panfrost: Implement per FD address spaces")
Cc: Tomeu Vizoso <tomeu.vizoso@collabora.com>
Cc: Steven Price <steven.price@arm.com>
Cc: Alyssa Rosenzweig <alyssa.rosenzweig@collabora.com>
Cc: David Airlie <airlied@linux.ie>
Cc: Daniel Vetter <daniel@ffwll.ch>
Signed-off-by: Rob Herring <robh@kernel.org>
---
v3:
 - new patch

 drivers/gpu/drm/panfrost/panfrost_mmu.c | 26 ++++++++++++-------------
 1 file changed, 13 insertions(+), 13 deletions(-)

--
2.20.1

Comments

Steven Price Aug. 28, 2019, 10:54 a.m. UTC | #1
On 26/08/2019 23:33, Rob Herring wrote:
> In preparation to call mmu_hw_do_operation with the as_lock already held,
> Add a mmu_hw_do_operation_locked function.
> 
> Fixes: 7282f7645d06 ("drm/panfrost: Implement per FD address spaces")
> Cc: Tomeu Vizoso <tomeu.vizoso@collabora.com>
> Cc: Steven Price <steven.price@arm.com>
> Cc: Alyssa Rosenzweig <alyssa.rosenzweig@collabora.com>
> Cc: David Airlie <airlied@linux.ie>
> Cc: Daniel Vetter <daniel@ffwll.ch>
> Signed-off-by: Rob Herring <robh@kernel.org>

Reviewed-by: Steven Price <steven.price@arm.com>

Steve

> ---
> v3:
>  - new patch
> 
>  drivers/gpu/drm/panfrost/panfrost_mmu.c | 26 ++++++++++++-------------
>  1 file changed, 13 insertions(+), 13 deletions(-)
> 
> diff --git a/drivers/gpu/drm/panfrost/panfrost_mmu.c b/drivers/gpu/drm/panfrost/panfrost_mmu.c
> index 2204e60f7808..3407b00d0a3a 100644
> --- a/drivers/gpu/drm/panfrost/panfrost_mmu.c
> +++ b/drivers/gpu/drm/panfrost/panfrost_mmu.c
> @@ -80,19 +80,11 @@ static void lock_region(struct panfrost_device *pfdev, u32 as_nr,
>  }
> 
> 
> -static int mmu_hw_do_operation(struct panfrost_device *pfdev,
> -			       struct panfrost_mmu *mmu,
> -			       u64 iova, size_t size, u32 op)
> +static int mmu_hw_do_operation_locked(struct panfrost_device *pfdev, int as_nr,
> +				      u64 iova, size_t size, u32 op)
>  {
> -	int ret, as_nr;
> -
> -	spin_lock(&pfdev->as_lock);
> -	as_nr = mmu->as;
> -
> -	if (as_nr < 0) {
> -		spin_unlock(&pfdev->as_lock);
> +	if (as_nr < 0)
>  		return 0;
> -	}
> 
>  	if (op != AS_COMMAND_UNLOCK)
>  		lock_region(pfdev, as_nr, iova, size);
> @@ -101,10 +93,18 @@ static int mmu_hw_do_operation(struct panfrost_device *pfdev,
>  	write_cmd(pfdev, as_nr, op);
> 
>  	/* Wait for the flush to complete */
> -	ret = wait_ready(pfdev, as_nr);
> +	return wait_ready(pfdev, as_nr);
> +}
> 
> -	spin_unlock(&pfdev->as_lock);
> +static int mmu_hw_do_operation(struct panfrost_device *pfdev,
> +			       struct panfrost_mmu *mmu,
> +			       u64 iova, size_t size, u32 op)
> +{
> +	int ret;
> 
> +	spin_lock(&pfdev->as_lock);
> +	ret = mmu_hw_do_operation_locked(pfdev, mmu->as, iova, size, op);
> +	spin_unlock(&pfdev->as_lock);
>  	return ret;
>  }
> 
> --
> 2.20.1
> _______________________________________________
> dri-devel mailing list
> dri-devel@lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/dri-devel
>

Patch
diff mbox series

diff --git a/drivers/gpu/drm/panfrost/panfrost_mmu.c b/drivers/gpu/drm/panfrost/panfrost_mmu.c
index 2204e60f7808..3407b00d0a3a 100644
--- a/drivers/gpu/drm/panfrost/panfrost_mmu.c
+++ b/drivers/gpu/drm/panfrost/panfrost_mmu.c
@@ -80,19 +80,11 @@  static void lock_region(struct panfrost_device *pfdev, u32 as_nr,
 }


-static int mmu_hw_do_operation(struct panfrost_device *pfdev,
-			       struct panfrost_mmu *mmu,
-			       u64 iova, size_t size, u32 op)
+static int mmu_hw_do_operation_locked(struct panfrost_device *pfdev, int as_nr,
+				      u64 iova, size_t size, u32 op)
 {
-	int ret, as_nr;
-
-	spin_lock(&pfdev->as_lock);
-	as_nr = mmu->as;
-
-	if (as_nr < 0) {
-		spin_unlock(&pfdev->as_lock);
+	if (as_nr < 0)
 		return 0;
-	}

 	if (op != AS_COMMAND_UNLOCK)
 		lock_region(pfdev, as_nr, iova, size);
@@ -101,10 +93,18 @@  static int mmu_hw_do_operation(struct panfrost_device *pfdev,
 	write_cmd(pfdev, as_nr, op);

 	/* Wait for the flush to complete */
-	ret = wait_ready(pfdev, as_nr);
+	return wait_ready(pfdev, as_nr);
+}

-	spin_unlock(&pfdev->as_lock);
+static int mmu_hw_do_operation(struct panfrost_device *pfdev,
+			       struct panfrost_mmu *mmu,
+			       u64 iova, size_t size, u32 op)
+{
+	int ret;

+	spin_lock(&pfdev->as_lock);
+	ret = mmu_hw_do_operation_locked(pfdev, mmu->as, iova, size, op);
+	spin_unlock(&pfdev->as_lock);
 	return ret;
 }