[PATCH 3/6] drm/msm: pass address-space to _get_iova() and friends

Jordan Crouse jcrouse at codeaurora.org
Tue Jun 13 19:33:13 UTC 2017


On Tue, Jun 13, 2017 at 02:49:45PM -0400, Rob Clark wrote:
> No functional change, that will come later.  But this will make it
> easier to deal with dynamically created address spaces (ie. per-
> process pagetables for gpu).
> 
> Signed-off-by: Rob Clark <robdclark at gmail.com>

Acked-by: Jordan Crouse <jcrouse at codeaurora.org>
> ---
>  drivers/gpu/drm/msm/adreno/a5xx_gpu.c     |  8 ++++----
>  drivers/gpu/drm/msm/adreno/a5xx_power.c   |  5 +++--
>  drivers/gpu/drm/msm/adreno/adreno_gpu.c   |  6 +++---
>  drivers/gpu/drm/msm/dsi/dsi_host.c        |  4 ++--
>  drivers/gpu/drm/msm/mdp/mdp4/mdp4_crtc.c  |  6 +++---
>  drivers/gpu/drm/msm/mdp/mdp4/mdp4_kms.c   |  4 ++--
>  drivers/gpu/drm/msm/mdp/mdp4/mdp4_plane.c | 12 ++++++------
>  drivers/gpu/drm/msm/mdp/mdp5/mdp5_crtc.c  |  4 ++--
>  drivers/gpu/drm/msm/mdp/mdp5/mdp5_plane.c | 12 ++++++------
>  drivers/gpu/drm/msm/msm_drv.c             |  5 ++++-
>  drivers/gpu/drm/msm/msm_drv.h             | 22 ++++++++++++++--------
>  drivers/gpu/drm/msm/msm_fb.c              | 15 +++++++++------
>  drivers/gpu/drm/msm/msm_fbdev.c           |  2 +-
>  drivers/gpu/drm/msm/msm_gem.c             | 18 ++++++++++++------
>  drivers/gpu/drm/msm/msm_gem.h             |  1 +
>  drivers/gpu/drm/msm/msm_gem_submit.c      |  4 ++--
>  drivers/gpu/drm/msm/msm_gpu.c             |  6 +++---
>  17 files changed, 77 insertions(+), 57 deletions(-)
> 
> diff --git a/drivers/gpu/drm/msm/adreno/a5xx_gpu.c b/drivers/gpu/drm/msm/adreno/a5xx_gpu.c
> index d5d6198..899f3dd 100644
> --- a/drivers/gpu/drm/msm/adreno/a5xx_gpu.c
> +++ b/drivers/gpu/drm/msm/adreno/a5xx_gpu.c
> @@ -397,7 +397,7 @@ static struct drm_gem_object *a5xx_ucode_load_bo(struct msm_gpu *gpu,
>  	}
>  
>  	if (iova) {
> -		int ret = msm_gem_get_iova_locked(bo, gpu->id, iova);
> +		int ret = msm_gem_get_iova_locked(bo, gpu->aspace, iova);
>  
>  		if (ret) {
>  			drm_gem_object_unreference(bo);
> @@ -765,19 +765,19 @@ static void a5xx_destroy(struct msm_gpu *gpu)
>  
>  	if (a5xx_gpu->pm4_bo) {
>  		if (a5xx_gpu->pm4_iova)
> -			msm_gem_put_iova(a5xx_gpu->pm4_bo, gpu->id);
> +			msm_gem_put_iova(a5xx_gpu->pm4_bo, gpu->aspace);
>  		drm_gem_object_unreference_unlocked(a5xx_gpu->pm4_bo);
>  	}
>  
>  	if (a5xx_gpu->pfp_bo) {
>  		if (a5xx_gpu->pfp_iova)
> -			msm_gem_put_iova(a5xx_gpu->pfp_bo, gpu->id);
> +			msm_gem_put_iova(a5xx_gpu->pfp_bo, gpu->aspace);
>  		drm_gem_object_unreference_unlocked(a5xx_gpu->pfp_bo);
>  	}
>  
>  	if (a5xx_gpu->gpmu_bo) {
>  		if (a5xx_gpu->gpmu_iova)
> -			msm_gem_put_iova(a5xx_gpu->gpmu_bo, gpu->id);
> +			msm_gem_put_iova(a5xx_gpu->gpmu_bo, gpu->aspace);
>  		drm_gem_object_unreference_unlocked(a5xx_gpu->gpmu_bo);
>  	}
>  
> diff --git a/drivers/gpu/drm/msm/adreno/a5xx_power.c b/drivers/gpu/drm/msm/adreno/a5xx_power.c
> index 7838f5f..cff45c6 100644
> --- a/drivers/gpu/drm/msm/adreno/a5xx_power.c
> +++ b/drivers/gpu/drm/msm/adreno/a5xx_power.c
> @@ -298,7 +298,8 @@ void a5xx_gpmu_ucode_init(struct msm_gpu *gpu)
>  	if (IS_ERR(a5xx_gpu->gpmu_bo))
>  		goto err;
>  
> -	if (msm_gem_get_iova_locked(a5xx_gpu->gpmu_bo, gpu->id, &a5xx_gpu->gpmu_iova))
> +	if (msm_gem_get_iova_locked(a5xx_gpu->gpmu_bo, gpu->aspace,
> +			&a5xx_gpu->gpmu_iova))
>  		goto err;
>  
>  	ptr = msm_gem_get_vaddr_locked(a5xx_gpu->gpmu_bo);
> @@ -327,7 +328,7 @@ void a5xx_gpmu_ucode_init(struct msm_gpu *gpu)
>  
>  err:
>  	if (a5xx_gpu->gpmu_iova)
> -		msm_gem_put_iova(a5xx_gpu->gpmu_bo, gpu->id);
> +		msm_gem_put_iova(a5xx_gpu->gpmu_bo, gpu->aspace);
>  	if (a5xx_gpu->gpmu_bo)
>  		drm_gem_object_unreference(a5xx_gpu->gpmu_bo);
>  
> diff --git a/drivers/gpu/drm/msm/adreno/adreno_gpu.c b/drivers/gpu/drm/msm/adreno/adreno_gpu.c
> index 9e08b3e..b3dc704 100644
> --- a/drivers/gpu/drm/msm/adreno/adreno_gpu.c
> +++ b/drivers/gpu/drm/msm/adreno/adreno_gpu.c
> @@ -64,7 +64,7 @@ int adreno_hw_init(struct msm_gpu *gpu)
>  
>  	DBG("%s", gpu->name);
>  
> -	ret = msm_gem_get_iova_locked(gpu->rb->bo, gpu->id, &gpu->rb_iova);
> +	ret = msm_gem_get_iova_locked(gpu->rb->bo, gpu->aspace, &gpu->rb_iova);
>  	if (ret) {
>  		gpu->rb_iova = 0;
>  		dev_err(gpu->dev->dev, "could not map ringbuffer: %d\n", ret);
> @@ -409,7 +409,7 @@ int adreno_gpu_init(struct drm_device *drm, struct platform_device *pdev,
>  		return -ENOMEM;
>  	}
>  
> -	ret = msm_gem_get_iova(adreno_gpu->memptrs_bo, gpu->id,
> +	ret = msm_gem_get_iova(adreno_gpu->memptrs_bo, gpu->aspace,
>  			&adreno_gpu->memptrs_iova);
>  	if (ret) {
>  		dev_err(drm->dev, "could not map memptrs: %d\n", ret);
> @@ -428,7 +428,7 @@ void adreno_gpu_cleanup(struct adreno_gpu *adreno_gpu)
>  			msm_gem_put_vaddr(adreno_gpu->memptrs_bo);
>  
>  		if (adreno_gpu->memptrs_iova)
> -			msm_gem_put_iova(adreno_gpu->memptrs_bo, gpu->id);
> +			msm_gem_put_iova(adreno_gpu->memptrs_bo, gpu->aspace);
>  
>  		drm_gem_object_unreference_unlocked(adreno_gpu->memptrs_bo);
>  	}
> diff --git a/drivers/gpu/drm/msm/dsi/dsi_host.c b/drivers/gpu/drm/msm/dsi/dsi_host.c
> index 81ddf42..759de0e 100644
> --- a/drivers/gpu/drm/msm/dsi/dsi_host.c
> +++ b/drivers/gpu/drm/msm/dsi/dsi_host.c
> @@ -994,7 +994,7 @@ static int dsi_tx_buf_alloc(struct msm_dsi_host *msm_host, int size)
>  		}
>  
>  		ret = msm_gem_get_iova_locked(msm_host->tx_gem_obj,
> -				priv->kms->id, &iova);
> +				priv->kms->aspace, &iova);
>  		mutex_unlock(&dev->struct_mutex);
>  		if (ret) {
>  			pr_err("%s: failed to get iova, %d\n", __func__, ret);
> @@ -1152,7 +1152,7 @@ static int dsi_cmd_dma_tx(struct msm_dsi_host *msm_host, int len)
>  
>  	if (cfg_hnd->major == MSM_DSI_VER_MAJOR_6G) {
>  		ret = msm_gem_get_iova(msm_host->tx_gem_obj,
> -				priv->kms->id, &dma_base);
> +				priv->kms->aspace, &dma_base);
>  		if (ret) {
>  			pr_err("%s: failed to get iova: %d\n", __func__, ret);
>  			return ret;
> diff --git a/drivers/gpu/drm/msm/mdp/mdp4/mdp4_crtc.c b/drivers/gpu/drm/msm/mdp/mdp4/mdp4_crtc.c
> index 36b0a09..c38cfe7 100644
> --- a/drivers/gpu/drm/msm/mdp/mdp4/mdp4_crtc.c
> +++ b/drivers/gpu/drm/msm/mdp/mdp4/mdp4_crtc.c
> @@ -128,7 +128,7 @@ static void unref_cursor_worker(struct drm_flip_work *work, void *val)
>  	struct mdp4_kms *mdp4_kms = get_kms(&mdp4_crtc->base);
>  	struct msm_kms *kms = &mdp4_kms->base.base;
>  
> -	msm_gem_put_iova(val, kms->id);
> +	msm_gem_put_iova(val, kms->aspace);
>  	drm_gem_object_unreference_unlocked(val);
>  }
>  
> @@ -374,7 +374,7 @@ static void update_cursor(struct drm_crtc *crtc)
>  		if (next_bo) {
>  			/* take a obj ref + iova ref when we start scanning out: */
>  			drm_gem_object_reference(next_bo);
> -			msm_gem_get_iova_locked(next_bo, kms->id, &iova);
> +			msm_gem_get_iova_locked(next_bo, kms->aspace, &iova);
>  
>  			/* enable cursor: */
>  			mdp4_write(mdp4_kms, REG_MDP4_DMA_CURSOR_SIZE(dma),
> @@ -432,7 +432,7 @@ static int mdp4_crtc_cursor_set(struct drm_crtc *crtc,
>  	}
>  
>  	if (cursor_bo) {
> -		ret = msm_gem_get_iova(cursor_bo, kms->id, &iova);
> +		ret = msm_gem_get_iova(cursor_bo, kms->aspace, &iova);
>  		if (ret)
>  			goto fail;
>  	} else {
> diff --git a/drivers/gpu/drm/msm/mdp/mdp4/mdp4_kms.c b/drivers/gpu/drm/msm/mdp/mdp4/mdp4_kms.c
> index 5b1c4aa..d1f572f 100644
> --- a/drivers/gpu/drm/msm/mdp/mdp4/mdp4_kms.c
> +++ b/drivers/gpu/drm/msm/mdp/mdp4/mdp4_kms.c
> @@ -163,7 +163,7 @@ static void mdp4_destroy(struct msm_kms *kms)
>  	struct msm_gem_address_space *aspace = kms->aspace;
>  
>  	if (mdp4_kms->blank_cursor_iova)
> -		msm_gem_put_iova(mdp4_kms->blank_cursor_bo, kms->id);
> +		msm_gem_put_iova(mdp4_kms->blank_cursor_bo, kms->aspace);
>  	drm_gem_object_unreference_unlocked(mdp4_kms->blank_cursor_bo);
>  
>  	if (aspace) {
> @@ -571,7 +571,7 @@ struct msm_kms *mdp4_kms_init(struct drm_device *dev)
>  		goto fail;
>  	}
>  
> -	ret = msm_gem_get_iova(mdp4_kms->blank_cursor_bo, kms->id,
> +	ret = msm_gem_get_iova(mdp4_kms->blank_cursor_bo, kms->aspace,
>  			&mdp4_kms->blank_cursor_iova);
>  	if (ret) {
>  		dev_err(dev->dev, "could not pin blank-cursor bo: %d\n", ret);
> diff --git a/drivers/gpu/drm/msm/mdp/mdp4/mdp4_plane.c b/drivers/gpu/drm/msm/mdp/mdp4/mdp4_plane.c
> index 17fb1d6..a20e3d6 100644
> --- a/drivers/gpu/drm/msm/mdp/mdp4/mdp4_plane.c
> +++ b/drivers/gpu/drm/msm/mdp/mdp4/mdp4_plane.c
> @@ -110,7 +110,7 @@ static int mdp4_plane_prepare_fb(struct drm_plane *plane,
>  		return 0;
>  
>  	DBG("%s: prepare: FB[%u]", mdp4_plane->name, fb->base.id);
> -	return msm_framebuffer_prepare(fb, kms->id);
> +	return msm_framebuffer_prepare(fb, kms->aspace);
>  }
>  
>  static void mdp4_plane_cleanup_fb(struct drm_plane *plane,
> @@ -125,7 +125,7 @@ static void mdp4_plane_cleanup_fb(struct drm_plane *plane,
>  		return;
>  
>  	DBG("%s: cleanup: FB[%u]", mdp4_plane->name, fb->base.id);
> -	msm_framebuffer_cleanup(fb, kms->id);
> +	msm_framebuffer_cleanup(fb, kms->aspace);
>  }
>  
>  
> @@ -175,13 +175,13 @@ static void mdp4_plane_set_scanout(struct drm_plane *plane,
>  			MDP4_PIPE_SRC_STRIDE_B_P3(fb->pitches[3]));
>  
>  	mdp4_write(mdp4_kms, REG_MDP4_PIPE_SRCP0_BASE(pipe),
> -			msm_framebuffer_iova(fb, kms->id, 0));
> +			msm_framebuffer_iova(fb, kms->aspace, 0));
>  	mdp4_write(mdp4_kms, REG_MDP4_PIPE_SRCP1_BASE(pipe),
> -			msm_framebuffer_iova(fb, kms->id, 1));
> +			msm_framebuffer_iova(fb, kms->aspace, 1));
>  	mdp4_write(mdp4_kms, REG_MDP4_PIPE_SRCP2_BASE(pipe),
> -			msm_framebuffer_iova(fb, kms->id, 2));
> +			msm_framebuffer_iova(fb, kms->aspace, 2));
>  	mdp4_write(mdp4_kms, REG_MDP4_PIPE_SRCP3_BASE(pipe),
> -			msm_framebuffer_iova(fb, kms->id, 3));
> +			msm_framebuffer_iova(fb, kms->aspace, 3));
>  
>  	plane->fb = fb;
>  }
> diff --git a/drivers/gpu/drm/msm/mdp/mdp5/mdp5_crtc.c b/drivers/gpu/drm/msm/mdp/mdp5/mdp5_crtc.c
> index 373df76..49c0402 100644
> --- a/drivers/gpu/drm/msm/mdp/mdp5/mdp5_crtc.c
> +++ b/drivers/gpu/drm/msm/mdp/mdp5/mdp5_crtc.c
> @@ -162,7 +162,7 @@ static void unref_cursor_worker(struct drm_flip_work *work, void *val)
>  	struct mdp5_kms *mdp5_kms = get_kms(&mdp5_crtc->base);
>  	struct msm_kms *kms = &mdp5_kms->base.base;
>  
> -	msm_gem_put_iova(val, kms->id);
> +	msm_gem_put_iova(val, kms->aspace);
>  	drm_gem_object_unreference_unlocked(val);
>  }
>  
> @@ -760,7 +760,7 @@ static int mdp5_crtc_cursor_set(struct drm_crtc *crtc,
>  	if (!cursor_bo)
>  		return -ENOENT;
>  
> -	ret = msm_gem_get_iova(cursor_bo, kms->id, &cursor_addr);
> +	ret = msm_gem_get_iova(cursor_bo, kms->aspace, &cursor_addr);
>  	if (ret)
>  		return -EINVAL;
>  
> diff --git a/drivers/gpu/drm/msm/mdp/mdp5/mdp5_plane.c b/drivers/gpu/drm/msm/mdp/mdp5/mdp5_plane.c
> index e278693..98a7b2d 100644
> --- a/drivers/gpu/drm/msm/mdp/mdp5/mdp5_plane.c
> +++ b/drivers/gpu/drm/msm/mdp/mdp5/mdp5_plane.c
> @@ -277,7 +277,7 @@ static int mdp5_plane_prepare_fb(struct drm_plane *plane,
>  		return 0;
>  
>  	DBG("%s: prepare: FB[%u]", plane->name, fb->base.id);
> -	return msm_framebuffer_prepare(fb, kms->id);
> +	return msm_framebuffer_prepare(fb, kms->aspace);
>  }
>  
>  static void mdp5_plane_cleanup_fb(struct drm_plane *plane,
> @@ -291,7 +291,7 @@ static void mdp5_plane_cleanup_fb(struct drm_plane *plane,
>  		return;
>  
>  	DBG("%s: cleanup: FB[%u]", plane->name, fb->base.id);
> -	msm_framebuffer_cleanup(fb, kms->id);
> +	msm_framebuffer_cleanup(fb, kms->aspace);
>  }
>  
>  #define FRAC_16_16(mult, div)    (((mult) << 16) / (div))
> @@ -505,13 +505,13 @@ static void set_scanout_locked(struct mdp5_kms *mdp5_kms,
>  			MDP5_PIPE_SRC_STRIDE_B_P3(fb->pitches[3]));
>  
>  	mdp5_write(mdp5_kms, REG_MDP5_PIPE_SRC0_ADDR(pipe),
> -			msm_framebuffer_iova(fb, kms->id, 0));
> +			msm_framebuffer_iova(fb, kms->aspace, 0));
>  	mdp5_write(mdp5_kms, REG_MDP5_PIPE_SRC1_ADDR(pipe),
> -			msm_framebuffer_iova(fb, kms->id, 1));
> +			msm_framebuffer_iova(fb, kms->aspace, 1));
>  	mdp5_write(mdp5_kms, REG_MDP5_PIPE_SRC2_ADDR(pipe),
> -			msm_framebuffer_iova(fb, kms->id, 2));
> +			msm_framebuffer_iova(fb, kms->aspace, 2));
>  	mdp5_write(mdp5_kms, REG_MDP5_PIPE_SRC3_ADDR(pipe),
> -			msm_framebuffer_iova(fb, kms->id, 3));
> +			msm_framebuffer_iova(fb, kms->aspace, 3));
>  }
>  
>  /* Note: mdp5_plane->pipe_lock must be locked */
> diff --git a/drivers/gpu/drm/msm/msm_drv.c b/drivers/gpu/drm/msm/msm_drv.c
> index ea6d316..e938379 100644
> --- a/drivers/gpu/drm/msm/msm_drv.c
> +++ b/drivers/gpu/drm/msm/msm_drv.c
> @@ -51,6 +51,7 @@ static const struct drm_mode_config_funcs mode_config_funcs = {
>  	.atomic_state_free = msm_atomic_state_free,
>  };
>  
> +#include "msm_gem.h"  /* temporary */
>  int msm_register_address_space(struct drm_device *dev,
>  		struct msm_gem_address_space *aspace)
>  {
> @@ -61,7 +62,9 @@ int msm_register_address_space(struct drm_device *dev,
>  
>  	priv->aspace[priv->num_aspaces] = aspace;
>  
> -	return priv->num_aspaces++;
> +	aspace->id = priv->num_aspaces++;
> +
> +	return aspace->id;
>  }
>  
>  #ifdef CONFIG_DRM_MSM_REGISTER_LOGGING
> diff --git a/drivers/gpu/drm/msm/msm_drv.h b/drivers/gpu/drm/msm/msm_drv.h
> index ed0e355..f3f5d6a 100644
> --- a/drivers/gpu/drm/msm/msm_drv.h
> +++ b/drivers/gpu/drm/msm/msm_drv.h
> @@ -209,13 +209,16 @@ int msm_gem_mmap_obj(struct drm_gem_object *obj,
>  int msm_gem_mmap(struct file *filp, struct vm_area_struct *vma);
>  int msm_gem_fault(struct vm_fault *vmf);
>  uint64_t msm_gem_mmap_offset(struct drm_gem_object *obj);
> -int msm_gem_get_iova_locked(struct drm_gem_object *obj, int id,
> -		uint64_t *iova);
> -int msm_gem_get_iova(struct drm_gem_object *obj, int id, uint64_t *iova);
> -uint64_t msm_gem_iova(struct drm_gem_object *obj, int id);
> +int msm_gem_get_iova_locked(struct drm_gem_object *obj,
> +		struct msm_gem_address_space *aspace, uint64_t *iova);
> +int msm_gem_get_iova(struct drm_gem_object *obj,
> +		struct msm_gem_address_space *aspace, uint64_t *iova);
> +uint64_t msm_gem_iova(struct drm_gem_object *obj,
> +		struct msm_gem_address_space *aspace);
>  struct page **msm_gem_get_pages(struct drm_gem_object *obj);
>  void msm_gem_put_pages(struct drm_gem_object *obj);
> -void msm_gem_put_iova(struct drm_gem_object *obj, int id);
> +void msm_gem_put_iova(struct drm_gem_object *obj,
> +		struct msm_gem_address_space *aspace);
>  int msm_gem_dumb_create(struct drm_file *file, struct drm_device *dev,
>  		struct drm_mode_create_dumb *args);
>  int msm_gem_dumb_map_offset(struct drm_file *file, struct drm_device *dev,
> @@ -250,9 +253,12 @@ struct drm_gem_object *msm_gem_new(struct drm_device *dev,
>  struct drm_gem_object *msm_gem_import(struct drm_device *dev,
>  		struct dma_buf *dmabuf, struct sg_table *sgt);
>  
> -int msm_framebuffer_prepare(struct drm_framebuffer *fb, int id);
> -void msm_framebuffer_cleanup(struct drm_framebuffer *fb, int id);
> -uint32_t msm_framebuffer_iova(struct drm_framebuffer *fb, int id, int plane);
> +int msm_framebuffer_prepare(struct drm_framebuffer *fb,
> +		struct msm_gem_address_space *aspace);
> +void msm_framebuffer_cleanup(struct drm_framebuffer *fb,
> +		struct msm_gem_address_space *aspace);
> +uint32_t msm_framebuffer_iova(struct drm_framebuffer *fb,
> +		struct msm_gem_address_space *aspace, int plane);
>  struct drm_gem_object *msm_framebuffer_bo(struct drm_framebuffer *fb, int plane);
>  const struct msm_format *msm_framebuffer_format(struct drm_framebuffer *fb);
>  struct drm_framebuffer *msm_framebuffer_init(struct drm_device *dev,
> diff --git a/drivers/gpu/drm/msm/msm_fb.c b/drivers/gpu/drm/msm/msm_fb.c
> index 5cf165c..36505f3 100644
> --- a/drivers/gpu/drm/msm/msm_fb.c
> +++ b/drivers/gpu/drm/msm/msm_fb.c
> @@ -84,14 +84,15 @@ void msm_framebuffer_describe(struct drm_framebuffer *fb, struct seq_file *m)
>   * should be fine, since only the scanout (mdpN) side of things needs
>   * this, the gpu doesn't care about fb's.
>   */
> -int msm_framebuffer_prepare(struct drm_framebuffer *fb, int id)
> +int msm_framebuffer_prepare(struct drm_framebuffer *fb,
> +		struct msm_gem_address_space *aspace)
>  {
>  	struct msm_framebuffer *msm_fb = to_msm_framebuffer(fb);
>  	int ret, i, n = fb->format->num_planes;
>  	uint64_t iova;
>  
>  	for (i = 0; i < n; i++) {
> -		ret = msm_gem_get_iova(msm_fb->planes[i], id, &iova);
> +		ret = msm_gem_get_iova(msm_fb->planes[i], aspace, &iova);
>  		DBG("FB[%u]: iova[%d]: %08llx (%d)", fb->base.id, i, iova, ret);
>  		if (ret)
>  			return ret;
> @@ -100,21 +101,23 @@ int msm_framebuffer_prepare(struct drm_framebuffer *fb, int id)
>  	return 0;
>  }
>  
> -void msm_framebuffer_cleanup(struct drm_framebuffer *fb, int id)
> +void msm_framebuffer_cleanup(struct drm_framebuffer *fb,
> +		struct msm_gem_address_space *aspace)
>  {
>  	struct msm_framebuffer *msm_fb = to_msm_framebuffer(fb);
>  	int i, n = fb->format->num_planes;
>  
>  	for (i = 0; i < n; i++)
> -		msm_gem_put_iova(msm_fb->planes[i], id);
> +		msm_gem_put_iova(msm_fb->planes[i], aspace);
>  }
>  
> -uint32_t msm_framebuffer_iova(struct drm_framebuffer *fb, int id, int plane)
> +uint32_t msm_framebuffer_iova(struct drm_framebuffer *fb,
> +		struct msm_gem_address_space *aspace, int plane)
>  {
>  	struct msm_framebuffer *msm_fb = to_msm_framebuffer(fb);
>  	if (!msm_fb->planes[plane])
>  		return 0;
> -	return msm_gem_iova(msm_fb->planes[plane], id) + fb->offsets[plane];
> +	return msm_gem_iova(msm_fb->planes[plane], aspace) + fb->offsets[plane];
>  }
>  
>  struct drm_gem_object *msm_framebuffer_bo(struct drm_framebuffer *fb, int plane)
> diff --git a/drivers/gpu/drm/msm/msm_fbdev.c b/drivers/gpu/drm/msm/msm_fbdev.c
> index 365fd10..13497fa 100644
> --- a/drivers/gpu/drm/msm/msm_fbdev.c
> +++ b/drivers/gpu/drm/msm/msm_fbdev.c
> @@ -126,7 +126,7 @@ static int msm_fbdev_create(struct drm_fb_helper *helper,
>  	 * in panic (ie. lock-safe, etc) we could avoid pinning the
>  	 * buffer now:
>  	 */
> -	ret = msm_gem_get_iova_locked(fbdev->bo, priv->kms->id, &paddr);
> +	ret = msm_gem_get_iova_locked(fbdev->bo, priv->kms->aspace, &paddr);
>  	if (ret) {
>  		dev_err(dev->dev, "failed to get buffer obj iova: %d\n", ret);
>  		goto fail_unlock;
> diff --git a/drivers/gpu/drm/msm/msm_gem.c b/drivers/gpu/drm/msm/msm_gem.c
> index 139be54..2f470a6 100644
> --- a/drivers/gpu/drm/msm/msm_gem.c
> +++ b/drivers/gpu/drm/msm/msm_gem.c
> @@ -308,10 +308,11 @@ put_iova(struct drm_gem_object *obj)
>   * That means when I do eventually need to add support for unpinning
>   * the refcnt counter needs to be atomic_t.
>   */
> -int msm_gem_get_iova_locked(struct drm_gem_object *obj, int id,
> -		uint64_t *iova)
> +int msm_gem_get_iova_locked(struct drm_gem_object *obj,
> +		struct msm_gem_address_space *aspace, uint64_t *iova)
>  {
>  	struct msm_gem_object *msm_obj = to_msm_bo(obj);
> +	int id = aspace ? aspace->id : 0;
>  	int ret = 0;
>  
>  	WARN_ON(!mutex_is_locked(&obj->dev->struct_mutex));
> @@ -338,9 +339,11 @@ int msm_gem_get_iova_locked(struct drm_gem_object *obj, int id,
>  }
>  
>  /* get iova, taking a reference.  Should have a matching put */
> -int msm_gem_get_iova(struct drm_gem_object *obj, int id, uint64_t *iova)
> +int msm_gem_get_iova(struct drm_gem_object *obj,
> +		struct msm_gem_address_space *aspace, uint64_t *iova)
>  {
>  	struct msm_gem_object *msm_obj = to_msm_bo(obj);
> +	int id = aspace ? aspace->id : 0;
>  	int ret;
>  
>  	/* this is safe right now because we don't unmap until the
> @@ -353,7 +356,7 @@ int msm_gem_get_iova(struct drm_gem_object *obj, int id, uint64_t *iova)
>  	}
>  
>  	mutex_lock(&obj->dev->struct_mutex);
> -	ret = msm_gem_get_iova_locked(obj, id, iova);
> +	ret = msm_gem_get_iova_locked(obj, aspace, iova);
>  	mutex_unlock(&obj->dev->struct_mutex);
>  	return ret;
>  }
> @@ -361,14 +364,17 @@ int msm_gem_get_iova(struct drm_gem_object *obj, int id, uint64_t *iova)
>  /* get iova without taking a reference, used in places where you have
>   * already done a 'msm_gem_get_iova()'.
>   */
> -uint64_t msm_gem_iova(struct drm_gem_object *obj, int id)
> +uint64_t msm_gem_iova(struct drm_gem_object *obj,
> +		struct msm_gem_address_space *aspace)
>  {
>  	struct msm_gem_object *msm_obj = to_msm_bo(obj);
> +	int id = aspace ? aspace->id : 0;
>  	WARN_ON(!msm_obj->domain[id].iova);
>  	return msm_obj->domain[id].iova;
>  }
>  
> -void msm_gem_put_iova(struct drm_gem_object *obj, int id)
> +void msm_gem_put_iova(struct drm_gem_object *obj,
> +		struct msm_gem_address_space *aspace)
>  {
>  	// XXX TODO ..
>  	// NOTE: probably don't need a _locked() version.. we wouldn't
> diff --git a/drivers/gpu/drm/msm/msm_gem.h b/drivers/gpu/drm/msm/msm_gem.h
> index 1b4cf20..4b4b352 100644
> --- a/drivers/gpu/drm/msm/msm_gem.h
> +++ b/drivers/gpu/drm/msm/msm_gem.h
> @@ -33,6 +33,7 @@ struct msm_gem_address_space {
>  	struct drm_mm mm;
>  	struct msm_mmu *mmu;
>  	struct kref kref;
> +	int id;    /* temporary */
>  };
>  
>  struct msm_gem_vma {
> diff --git a/drivers/gpu/drm/msm/msm_gem_submit.c b/drivers/gpu/drm/msm/msm_gem_submit.c
> index 1c545eb..6355b64 100644
> --- a/drivers/gpu/drm/msm/msm_gem_submit.c
> +++ b/drivers/gpu/drm/msm/msm_gem_submit.c
> @@ -158,7 +158,7 @@ static void submit_unlock_unpin_bo(struct msm_gem_submit *submit, int i)
>  	struct msm_gem_object *msm_obj = submit->bos[i].obj;
>  
>  	if (submit->bos[i].flags & BO_PINNED)
> -		msm_gem_put_iova(&msm_obj->base, submit->gpu->id);
> +		msm_gem_put_iova(&msm_obj->base, submit->gpu->aspace);
>  
>  	if (submit->bos[i].flags & BO_LOCKED)
>  		ww_mutex_unlock(&msm_obj->resv->lock);
> @@ -246,7 +246,7 @@ static int submit_pin_objects(struct msm_gem_submit *submit)
>  
>  		/* if locking succeeded, pin bo: */
>  		ret = msm_gem_get_iova_locked(&msm_obj->base,
> -				submit->gpu->id, &iova);
> +				submit->gpu->aspace, &iova);
>  
>  		if (ret)
>  			break;
> diff --git a/drivers/gpu/drm/msm/msm_gpu.c b/drivers/gpu/drm/msm/msm_gpu.c
> index 9fceda8..de1d22c 100644
> --- a/drivers/gpu/drm/msm/msm_gpu.c
> +++ b/drivers/gpu/drm/msm/msm_gpu.c
> @@ -416,7 +416,7 @@ static void retire_submit(struct msm_gpu *gpu, struct msm_gem_submit *submit)
>  		struct msm_gem_object *msm_obj = submit->bos[i].obj;
>  		/* move to inactive: */
>  		msm_gem_move_to_inactive(&msm_obj->base);
> -		msm_gem_put_iova(&msm_obj->base, gpu->id);
> +		msm_gem_put_iova(&msm_obj->base, gpu->aspace);
>  		drm_gem_object_unreference(&msm_obj->base);
>  	}
>  
> @@ -498,7 +498,7 @@ void msm_gpu_submit(struct msm_gpu *gpu, struct msm_gem_submit *submit,
>  		/* submit takes a reference to the bo and iova until retired: */
>  		drm_gem_object_reference(&msm_obj->base);
>  		msm_gem_get_iova_locked(&msm_obj->base,
> -				submit->gpu->id, &iova);
> +				submit->gpu->aspace, &iova);
>  
>  		if (submit->bos[i].flags & MSM_SUBMIT_BO_WRITE)
>  			msm_gem_move_to_active(&msm_obj->base, gpu, true, submit->fence);
> @@ -695,7 +695,7 @@ void msm_gpu_cleanup(struct msm_gpu *gpu)
>  
>  	if (gpu->rb) {
>  		if (gpu->rb_iova)
> -			msm_gem_put_iova(gpu->rb->bo, gpu->id);
> +			msm_gem_put_iova(gpu->rb->bo, gpu->aspace);
>  		msm_ringbuffer_destroy(gpu->rb);
>  	}
>  
> -- 
> 2.9.4
> 

-- 
The Qualcomm Innovation Center, Inc. is a member of Code Aurora Forum,
a Linux Foundation Collaborative Project


More information about the dri-devel mailing list