aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/gpu/drm/msm/adreno/a5xx_gpu.c8
-rw-r--r--drivers/gpu/drm/msm/adreno/a5xx_power.c5
-rw-r--r--drivers/gpu/drm/msm/adreno/adreno_gpu.c6
-rw-r--r--drivers/gpu/drm/msm/dsi/dsi_host.c4
-rw-r--r--drivers/gpu/drm/msm/mdp/mdp4/mdp4_crtc.c6
-rw-r--r--drivers/gpu/drm/msm/mdp/mdp4/mdp4_kms.c4
-rw-r--r--drivers/gpu/drm/msm/mdp/mdp4/mdp4_plane.c12
-rw-r--r--drivers/gpu/drm/msm/mdp/mdp5/mdp5_crtc.c4
-rw-r--r--drivers/gpu/drm/msm/mdp/mdp5/mdp5_plane.c12
-rw-r--r--drivers/gpu/drm/msm/msm_drv.c7
-rw-r--r--drivers/gpu/drm/msm/msm_drv.h22
-rw-r--r--drivers/gpu/drm/msm/msm_fb.c15
-rw-r--r--drivers/gpu/drm/msm/msm_fbdev.c2
-rw-r--r--drivers/gpu/drm/msm/msm_gem.c18
-rw-r--r--drivers/gpu/drm/msm/msm_gem.h1
-rw-r--r--drivers/gpu/drm/msm/msm_gem_submit.c4
-rw-r--r--drivers/gpu/drm/msm/msm_gpu.c6
17 files changed, 78 insertions, 58 deletions
diff --git a/drivers/gpu/drm/msm/adreno/a5xx_gpu.c b/drivers/gpu/drm/msm/adreno/a5xx_gpu.c
index 8d17f525c417..f6a9eec71fec 100644
--- a/drivers/gpu/drm/msm/adreno/a5xx_gpu.c
+++ b/drivers/gpu/drm/msm/adreno/a5xx_gpu.c
@@ -308,7 +308,7 @@ static struct drm_gem_object *a5xx_ucode_load_bo(struct msm_gpu *gpu,
308 } 308 }
309 309
310 if (iova) { 310 if (iova) {
311 int ret = msm_gem_get_iova_locked(bo, gpu->id, iova); 311 int ret = msm_gem_get_iova_locked(bo, gpu->aspace, iova);
312 312
313 if (ret) { 313 if (ret) {
314 drm_gem_object_unreference(bo); 314 drm_gem_object_unreference(bo);
@@ -696,19 +696,19 @@ static void a5xx_destroy(struct msm_gpu *gpu)
696 696
697 if (a5xx_gpu->pm4_bo) { 697 if (a5xx_gpu->pm4_bo) {
698 if (a5xx_gpu->pm4_iova) 698 if (a5xx_gpu->pm4_iova)
699 msm_gem_put_iova(a5xx_gpu->pm4_bo, gpu->id); 699 msm_gem_put_iova(a5xx_gpu->pm4_bo, gpu->aspace);
700 drm_gem_object_unreference_unlocked(a5xx_gpu->pm4_bo); 700 drm_gem_object_unreference_unlocked(a5xx_gpu->pm4_bo);
701 } 701 }
702 702
703 if (a5xx_gpu->pfp_bo) { 703 if (a5xx_gpu->pfp_bo) {
704 if (a5xx_gpu->pfp_iova) 704 if (a5xx_gpu->pfp_iova)
705 msm_gem_put_iova(a5xx_gpu->pfp_bo, gpu->id); 705 msm_gem_put_iova(a5xx_gpu->pfp_bo, gpu->aspace);
706 drm_gem_object_unreference_unlocked(a5xx_gpu->pfp_bo); 706 drm_gem_object_unreference_unlocked(a5xx_gpu->pfp_bo);
707 } 707 }
708 708
709 if (a5xx_gpu->gpmu_bo) { 709 if (a5xx_gpu->gpmu_bo) {
710 if (a5xx_gpu->gpmu_iova) 710 if (a5xx_gpu->gpmu_iova)
711 msm_gem_put_iova(a5xx_gpu->gpmu_bo, gpu->id); 711 msm_gem_put_iova(a5xx_gpu->gpmu_bo, gpu->aspace);
712 drm_gem_object_unreference_unlocked(a5xx_gpu->gpmu_bo); 712 drm_gem_object_unreference_unlocked(a5xx_gpu->gpmu_bo);
713 } 713 }
714 714
diff --git a/drivers/gpu/drm/msm/adreno/a5xx_power.c b/drivers/gpu/drm/msm/adreno/a5xx_power.c
index f3274b827a49..feb7f4fd42fb 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)
298 if (IS_ERR(a5xx_gpu->gpmu_bo)) 298 if (IS_ERR(a5xx_gpu->gpmu_bo))
299 goto err; 299 goto err;
300 300
301 if (msm_gem_get_iova_locked(a5xx_gpu->gpmu_bo, gpu->id, &a5xx_gpu->gpmu_iova)) 301 if (msm_gem_get_iova_locked(a5xx_gpu->gpmu_bo, gpu->aspace,
302 &a5xx_gpu->gpmu_iova))
302 goto err; 303 goto err;
303 304
304 ptr = msm_gem_get_vaddr_locked(a5xx_gpu->gpmu_bo); 305 ptr = msm_gem_get_vaddr_locked(a5xx_gpu->gpmu_bo);
@@ -327,7 +328,7 @@ void a5xx_gpmu_ucode_init(struct msm_gpu *gpu)
327 328
328err: 329err:
329 if (a5xx_gpu->gpmu_iova) 330 if (a5xx_gpu->gpmu_iova)
330 msm_gem_put_iova(a5xx_gpu->gpmu_bo, gpu->id); 331 msm_gem_put_iova(a5xx_gpu->gpmu_bo, gpu->aspace);
331 if (a5xx_gpu->gpmu_bo) 332 if (a5xx_gpu->gpmu_bo)
332 drm_gem_object_unreference(a5xx_gpu->gpmu_bo); 333 drm_gem_object_unreference(a5xx_gpu->gpmu_bo);
333 334
diff --git a/drivers/gpu/drm/msm/adreno/adreno_gpu.c b/drivers/gpu/drm/msm/adreno/adreno_gpu.c
index 30a2096ac9a2..6fa694e6ae8c 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)
64 64
65 DBG("%s", gpu->name); 65 DBG("%s", gpu->name);
66 66
67 ret = msm_gem_get_iova_locked(gpu->rb->bo, gpu->id, &gpu->rb_iova); 67 ret = msm_gem_get_iova_locked(gpu->rb->bo, gpu->aspace, &gpu->rb_iova);
68 if (ret) { 68 if (ret) {
69 gpu->rb_iova = 0; 69 gpu->rb_iova = 0;
70 dev_err(gpu->dev->dev, "could not map ringbuffer: %d\n", ret); 70 dev_err(gpu->dev->dev, "could not map ringbuffer: %d\n", ret);
@@ -414,7 +414,7 @@ int adreno_gpu_init(struct drm_device *drm, struct platform_device *pdev,
414 return -ENOMEM; 414 return -ENOMEM;
415 } 415 }
416 416
417 ret = msm_gem_get_iova(adreno_gpu->memptrs_bo, gpu->id, 417 ret = msm_gem_get_iova(adreno_gpu->memptrs_bo, gpu->aspace,
418 &adreno_gpu->memptrs_iova); 418 &adreno_gpu->memptrs_iova);
419 if (ret) { 419 if (ret) {
420 dev_err(drm->dev, "could not map memptrs: %d\n", ret); 420 dev_err(drm->dev, "could not map memptrs: %d\n", ret);
@@ -433,7 +433,7 @@ void adreno_gpu_cleanup(struct adreno_gpu *adreno_gpu)
433 msm_gem_put_vaddr(adreno_gpu->memptrs_bo); 433 msm_gem_put_vaddr(adreno_gpu->memptrs_bo);
434 434
435 if (adreno_gpu->memptrs_iova) 435 if (adreno_gpu->memptrs_iova)
436 msm_gem_put_iova(adreno_gpu->memptrs_bo, gpu->id); 436 msm_gem_put_iova(adreno_gpu->memptrs_bo, gpu->aspace);
437 437
438 drm_gem_object_unreference_unlocked(adreno_gpu->memptrs_bo); 438 drm_gem_object_unreference_unlocked(adreno_gpu->memptrs_bo);
439 } 439 }
diff --git a/drivers/gpu/drm/msm/dsi/dsi_host.c b/drivers/gpu/drm/msm/dsi/dsi_host.c
index 3c752cd0cc1c..2e7077194b21 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)
994 } 994 }
995 995
996 ret = msm_gem_get_iova_locked(msm_host->tx_gem_obj, 996 ret = msm_gem_get_iova_locked(msm_host->tx_gem_obj,
997 priv->kms->id, &iova); 997 priv->kms->aspace, &iova);
998 mutex_unlock(&dev->struct_mutex); 998 mutex_unlock(&dev->struct_mutex);
999 if (ret) { 999 if (ret) {
1000 pr_err("%s: failed to get iova, %d\n", __func__, ret); 1000 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)
1152 1152
1153 if (cfg_hnd->major == MSM_DSI_VER_MAJOR_6G) { 1153 if (cfg_hnd->major == MSM_DSI_VER_MAJOR_6G) {
1154 ret = msm_gem_get_iova(msm_host->tx_gem_obj, 1154 ret = msm_gem_get_iova(msm_host->tx_gem_obj,
1155 priv->kms->id, &dma_base); 1155 priv->kms->aspace, &dma_base);
1156 if (ret) { 1156 if (ret) {
1157 pr_err("%s: failed to get iova: %d\n", __func__, ret); 1157 pr_err("%s: failed to get iova: %d\n", __func__, ret);
1158 return ret; 1158 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 d9ee73c3672d..59153a4ebd18 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)
128 struct mdp4_kms *mdp4_kms = get_kms(&mdp4_crtc->base); 128 struct mdp4_kms *mdp4_kms = get_kms(&mdp4_crtc->base);
129 struct msm_kms *kms = &mdp4_kms->base.base; 129 struct msm_kms *kms = &mdp4_kms->base.base;
130 130
131 msm_gem_put_iova(val, kms->id); 131 msm_gem_put_iova(val, kms->aspace);
132 drm_gem_object_unreference_unlocked(val); 132 drm_gem_object_unreference_unlocked(val);
133} 133}
134 134
@@ -374,7 +374,7 @@ static void update_cursor(struct drm_crtc *crtc)
374 if (next_bo) { 374 if (next_bo) {
375 /* take a obj ref + iova ref when we start scanning out: */ 375 /* take a obj ref + iova ref when we start scanning out: */
376 drm_gem_object_reference(next_bo); 376 drm_gem_object_reference(next_bo);
377 msm_gem_get_iova_locked(next_bo, kms->id, &iova); 377 msm_gem_get_iova_locked(next_bo, kms->aspace, &iova);
378 378
379 /* enable cursor: */ 379 /* enable cursor: */
380 mdp4_write(mdp4_kms, REG_MDP4_DMA_CURSOR_SIZE(dma), 380 mdp4_write(mdp4_kms, REG_MDP4_DMA_CURSOR_SIZE(dma),
@@ -432,7 +432,7 @@ static int mdp4_crtc_cursor_set(struct drm_crtc *crtc,
432 } 432 }
433 433
434 if (cursor_bo) { 434 if (cursor_bo) {
435 ret = msm_gem_get_iova(cursor_bo, kms->id, &iova); 435 ret = msm_gem_get_iova(cursor_bo, kms->aspace, &iova);
436 if (ret) 436 if (ret)
437 goto fail; 437 goto fail;
438 } else { 438 } else {
diff --git a/drivers/gpu/drm/msm/mdp/mdp4/mdp4_kms.c b/drivers/gpu/drm/msm/mdp/mdp4/mdp4_kms.c
index 7cf4dd40de28..0c01f9fe0ef0 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)
163 struct msm_gem_address_space *aspace = kms->aspace; 163 struct msm_gem_address_space *aspace = kms->aspace;
164 164
165 if (mdp4_kms->blank_cursor_iova) 165 if (mdp4_kms->blank_cursor_iova)
166 msm_gem_put_iova(mdp4_kms->blank_cursor_bo, kms->id); 166 msm_gem_put_iova(mdp4_kms->blank_cursor_bo, kms->aspace);
167 drm_gem_object_unreference_unlocked(mdp4_kms->blank_cursor_bo); 167 drm_gem_object_unreference_unlocked(mdp4_kms->blank_cursor_bo);
168 168
169 if (aspace) { 169 if (aspace) {
@@ -545,7 +545,7 @@ struct msm_kms *mdp4_kms_init(struct drm_device *dev)
545 goto fail; 545 goto fail;
546 } 546 }
547 547
548 ret = msm_gem_get_iova(mdp4_kms->blank_cursor_bo, kms->id, 548 ret = msm_gem_get_iova(mdp4_kms->blank_cursor_bo, kms->aspace,
549 &mdp4_kms->blank_cursor_iova); 549 &mdp4_kms->blank_cursor_iova);
550 if (ret) { 550 if (ret) {
551 dev_err(dev->dev, "could not pin blank-cursor bo: %d\n", ret); 551 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 17fb1d6f2f23..a20e3d644523 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,
110 return 0; 110 return 0;
111 111
112 DBG("%s: prepare: FB[%u]", mdp4_plane->name, fb->base.id); 112 DBG("%s: prepare: FB[%u]", mdp4_plane->name, fb->base.id);
113 return msm_framebuffer_prepare(fb, kms->id); 113 return msm_framebuffer_prepare(fb, kms->aspace);
114} 114}
115 115
116static void mdp4_plane_cleanup_fb(struct drm_plane *plane, 116static void mdp4_plane_cleanup_fb(struct drm_plane *plane,
@@ -125,7 +125,7 @@ static void mdp4_plane_cleanup_fb(struct drm_plane *plane,
125 return; 125 return;
126 126
127 DBG("%s: cleanup: FB[%u]", mdp4_plane->name, fb->base.id); 127 DBG("%s: cleanup: FB[%u]", mdp4_plane->name, fb->base.id);
128 msm_framebuffer_cleanup(fb, kms->id); 128 msm_framebuffer_cleanup(fb, kms->aspace);
129} 129}
130 130
131 131
@@ -175,13 +175,13 @@ static void mdp4_plane_set_scanout(struct drm_plane *plane,
175 MDP4_PIPE_SRC_STRIDE_B_P3(fb->pitches[3])); 175 MDP4_PIPE_SRC_STRIDE_B_P3(fb->pitches[3]));
176 176
177 mdp4_write(mdp4_kms, REG_MDP4_PIPE_SRCP0_BASE(pipe), 177 mdp4_write(mdp4_kms, REG_MDP4_PIPE_SRCP0_BASE(pipe),
178 msm_framebuffer_iova(fb, kms->id, 0)); 178 msm_framebuffer_iova(fb, kms->aspace, 0));
179 mdp4_write(mdp4_kms, REG_MDP4_PIPE_SRCP1_BASE(pipe), 179 mdp4_write(mdp4_kms, REG_MDP4_PIPE_SRCP1_BASE(pipe),
180 msm_framebuffer_iova(fb, kms->id, 1)); 180 msm_framebuffer_iova(fb, kms->aspace, 1));
181 mdp4_write(mdp4_kms, REG_MDP4_PIPE_SRCP2_BASE(pipe), 181 mdp4_write(mdp4_kms, REG_MDP4_PIPE_SRCP2_BASE(pipe),
182 msm_framebuffer_iova(fb, kms->id, 2)); 182 msm_framebuffer_iova(fb, kms->aspace, 2));
183 mdp4_write(mdp4_kms, REG_MDP4_PIPE_SRCP3_BASE(pipe), 183 mdp4_write(mdp4_kms, REG_MDP4_PIPE_SRCP3_BASE(pipe),
184 msm_framebuffer_iova(fb, kms->id, 3)); 184 msm_framebuffer_iova(fb, kms->aspace, 3));
185 185
186 plane->fb = fb; 186 plane->fb = fb;
187} 187}
diff --git a/drivers/gpu/drm/msm/mdp/mdp5/mdp5_crtc.c b/drivers/gpu/drm/msm/mdp/mdp5/mdp5_crtc.c
index d79c5faba35e..cb5415d6c04b 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)
162 struct mdp5_kms *mdp5_kms = get_kms(&mdp5_crtc->base); 162 struct mdp5_kms *mdp5_kms = get_kms(&mdp5_crtc->base);
163 struct msm_kms *kms = &mdp5_kms->base.base; 163 struct msm_kms *kms = &mdp5_kms->base.base;
164 164
165 msm_gem_put_iova(val, kms->id); 165 msm_gem_put_iova(val, kms->aspace);
166 drm_gem_object_unreference_unlocked(val); 166 drm_gem_object_unreference_unlocked(val);
167} 167}
168 168
@@ -760,7 +760,7 @@ static int mdp5_crtc_cursor_set(struct drm_crtc *crtc,
760 if (!cursor_bo) 760 if (!cursor_bo)
761 return -ENOENT; 761 return -ENOENT;
762 762
763 ret = msm_gem_get_iova(cursor_bo, kms->id, &cursor_addr); 763 ret = msm_gem_get_iova(cursor_bo, kms->aspace, &cursor_addr);
764 if (ret) 764 if (ret)
765 return -EINVAL; 765 return -EINVAL;
766 766
diff --git a/drivers/gpu/drm/msm/mdp/mdp5/mdp5_plane.c b/drivers/gpu/drm/msm/mdp/mdp5/mdp5_plane.c
index b6a66befd1b7..fe3a4de1a433 100644
--- a/drivers/gpu/drm/msm/mdp/mdp5/mdp5_plane.c
+++ b/drivers/gpu/drm/msm/mdp/mdp5/mdp5_plane.c
@@ -279,7 +279,7 @@ static int mdp5_plane_prepare_fb(struct drm_plane *plane,
279 return 0; 279 return 0;
280 280
281 DBG("%s: prepare: FB[%u]", plane->name, fb->base.id); 281 DBG("%s: prepare: FB[%u]", plane->name, fb->base.id);
282 return msm_framebuffer_prepare(fb, kms->id); 282 return msm_framebuffer_prepare(fb, kms->aspace);
283} 283}
284 284
285static void mdp5_plane_cleanup_fb(struct drm_plane *plane, 285static void mdp5_plane_cleanup_fb(struct drm_plane *plane,
@@ -293,7 +293,7 @@ static void mdp5_plane_cleanup_fb(struct drm_plane *plane,
293 return; 293 return;
294 294
295 DBG("%s: cleanup: FB[%u]", plane->name, fb->base.id); 295 DBG("%s: cleanup: FB[%u]", plane->name, fb->base.id);
296 msm_framebuffer_cleanup(fb, kms->id); 296 msm_framebuffer_cleanup(fb, kms->aspace);
297} 297}
298 298
299#define FRAC_16_16(mult, div) (((mult) << 16) / (div)) 299#define FRAC_16_16(mult, div) (((mult) << 16) / (div))
@@ -511,13 +511,13 @@ static void set_scanout_locked(struct mdp5_kms *mdp5_kms,
511 MDP5_PIPE_SRC_STRIDE_B_P3(fb->pitches[3])); 511 MDP5_PIPE_SRC_STRIDE_B_P3(fb->pitches[3]));
512 512
513 mdp5_write(mdp5_kms, REG_MDP5_PIPE_SRC0_ADDR(pipe), 513 mdp5_write(mdp5_kms, REG_MDP5_PIPE_SRC0_ADDR(pipe),
514 msm_framebuffer_iova(fb, kms->id, 0)); 514 msm_framebuffer_iova(fb, kms->aspace, 0));
515 mdp5_write(mdp5_kms, REG_MDP5_PIPE_SRC1_ADDR(pipe), 515 mdp5_write(mdp5_kms, REG_MDP5_PIPE_SRC1_ADDR(pipe),
516 msm_framebuffer_iova(fb, kms->id, 1)); 516 msm_framebuffer_iova(fb, kms->aspace, 1));
517 mdp5_write(mdp5_kms, REG_MDP5_PIPE_SRC2_ADDR(pipe), 517 mdp5_write(mdp5_kms, REG_MDP5_PIPE_SRC2_ADDR(pipe),
518 msm_framebuffer_iova(fb, kms->id, 2)); 518 msm_framebuffer_iova(fb, kms->aspace, 2));
519 mdp5_write(mdp5_kms, REG_MDP5_PIPE_SRC3_ADDR(pipe), 519 mdp5_write(mdp5_kms, REG_MDP5_PIPE_SRC3_ADDR(pipe),
520 msm_framebuffer_iova(fb, kms->id, 3)); 520 msm_framebuffer_iova(fb, kms->aspace, 3));
521} 521}
522 522
523/* Note: mdp5_plane->pipe_lock must be locked */ 523/* 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 beb4f6b3ac70..a9c3c6b813d3 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 = {
51 .atomic_state_free = msm_atomic_state_free, 51 .atomic_state_free = msm_atomic_state_free,
52}; 52};
53 53
54#include "msm_gem.h" /* temporary */
54int msm_register_address_space(struct drm_device *dev, 55int msm_register_address_space(struct drm_device *dev,
55 struct msm_gem_address_space *aspace) 56 struct msm_gem_address_space *aspace)
56{ 57{
@@ -61,7 +62,9 @@ int msm_register_address_space(struct drm_device *dev,
61 62
62 priv->aspace[priv->num_aspaces] = aspace; 63 priv->aspace[priv->num_aspaces] = aspace;
63 64
64 return priv->num_aspaces++; 65 aspace->id = priv->num_aspaces++;
66
67 return aspace->id;
65} 68}
66 69
67#ifdef CONFIG_DRM_MSM_REGISTER_LOGGING 70#ifdef CONFIG_DRM_MSM_REGISTER_LOGGING
@@ -707,7 +710,7 @@ static int msm_ioctl_gem_info_iova(struct drm_device *dev,
707 if (!priv->gpu) 710 if (!priv->gpu)
708 return -EINVAL; 711 return -EINVAL;
709 712
710 return msm_gem_get_iova(obj, priv->gpu->id, iova); 713 return msm_gem_get_iova(obj, priv->gpu->aspace, iova);
711} 714}
712 715
713static int msm_ioctl_gem_info(struct drm_device *dev, void *data, 716static int msm_ioctl_gem_info(struct drm_device *dev, void *data,
diff --git a/drivers/gpu/drm/msm/msm_drv.h b/drivers/gpu/drm/msm/msm_drv.h
index 1b26ca626528..5570c5c91340 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,
209int msm_gem_mmap(struct file *filp, struct vm_area_struct *vma); 209int msm_gem_mmap(struct file *filp, struct vm_area_struct *vma);
210int msm_gem_fault(struct vm_fault *vmf); 210int msm_gem_fault(struct vm_fault *vmf);
211uint64_t msm_gem_mmap_offset(struct drm_gem_object *obj); 211uint64_t msm_gem_mmap_offset(struct drm_gem_object *obj);
212int msm_gem_get_iova_locked(struct drm_gem_object *obj, int id, 212int msm_gem_get_iova_locked(struct drm_gem_object *obj,
213 uint64_t *iova); 213 struct msm_gem_address_space *aspace, uint64_t *iova);
214int msm_gem_get_iova(struct drm_gem_object *obj, int id, uint64_t *iova); 214int msm_gem_get_iova(struct drm_gem_object *obj,
215uint64_t msm_gem_iova(struct drm_gem_object *obj, int id); 215 struct msm_gem_address_space *aspace, uint64_t *iova);
216uint64_t msm_gem_iova(struct drm_gem_object *obj,
217 struct msm_gem_address_space *aspace);
216struct page **msm_gem_get_pages(struct drm_gem_object *obj); 218struct page **msm_gem_get_pages(struct drm_gem_object *obj);
217void msm_gem_put_pages(struct drm_gem_object *obj); 219void msm_gem_put_pages(struct drm_gem_object *obj);
218void msm_gem_put_iova(struct drm_gem_object *obj, int id); 220void msm_gem_put_iova(struct drm_gem_object *obj,
221 struct msm_gem_address_space *aspace);
219int msm_gem_dumb_create(struct drm_file *file, struct drm_device *dev, 222int msm_gem_dumb_create(struct drm_file *file, struct drm_device *dev,
220 struct drm_mode_create_dumb *args); 223 struct drm_mode_create_dumb *args);
221int msm_gem_dumb_map_offset(struct drm_file *file, struct drm_device *dev, 224int msm_gem_dumb_map_offset(struct drm_file *file, struct drm_device *dev,
@@ -251,9 +254,12 @@ struct drm_gem_object *msm_gem_new(struct drm_device *dev,
251struct drm_gem_object *msm_gem_import(struct drm_device *dev, 254struct drm_gem_object *msm_gem_import(struct drm_device *dev,
252 struct dma_buf *dmabuf, struct sg_table *sgt); 255 struct dma_buf *dmabuf, struct sg_table *sgt);
253 256
254int msm_framebuffer_prepare(struct drm_framebuffer *fb, int id); 257int msm_framebuffer_prepare(struct drm_framebuffer *fb,
255void msm_framebuffer_cleanup(struct drm_framebuffer *fb, int id); 258 struct msm_gem_address_space *aspace);
256uint32_t msm_framebuffer_iova(struct drm_framebuffer *fb, int id, int plane); 259void msm_framebuffer_cleanup(struct drm_framebuffer *fb,
260 struct msm_gem_address_space *aspace);
261uint32_t msm_framebuffer_iova(struct drm_framebuffer *fb,
262 struct msm_gem_address_space *aspace, int plane);
257struct drm_gem_object *msm_framebuffer_bo(struct drm_framebuffer *fb, int plane); 263struct drm_gem_object *msm_framebuffer_bo(struct drm_framebuffer *fb, int plane);
258const struct msm_format *msm_framebuffer_format(struct drm_framebuffer *fb); 264const struct msm_format *msm_framebuffer_format(struct drm_framebuffer *fb);
259struct drm_framebuffer *msm_framebuffer_init(struct drm_device *dev, 265struct 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 ba2733a95a4f..6ecb7b170316 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)
84 * should be fine, since only the scanout (mdpN) side of things needs 84 * should be fine, since only the scanout (mdpN) side of things needs
85 * this, the gpu doesn't care about fb's. 85 * this, the gpu doesn't care about fb's.
86 */ 86 */
87int msm_framebuffer_prepare(struct drm_framebuffer *fb, int id) 87int msm_framebuffer_prepare(struct drm_framebuffer *fb,
88 struct msm_gem_address_space *aspace)
88{ 89{
89 struct msm_framebuffer *msm_fb = to_msm_framebuffer(fb); 90 struct msm_framebuffer *msm_fb = to_msm_framebuffer(fb);
90 int ret, i, n = fb->format->num_planes; 91 int ret, i, n = fb->format->num_planes;
91 uint64_t iova; 92 uint64_t iova;
92 93
93 for (i = 0; i < n; i++) { 94 for (i = 0; i < n; i++) {
94 ret = msm_gem_get_iova(msm_fb->planes[i], id, &iova); 95 ret = msm_gem_get_iova(msm_fb->planes[i], aspace, &iova);
95 DBG("FB[%u]: iova[%d]: %08llx (%d)", fb->base.id, i, iova, ret); 96 DBG("FB[%u]: iova[%d]: %08llx (%d)", fb->base.id, i, iova, ret);
96 if (ret) 97 if (ret)
97 return ret; 98 return ret;
@@ -100,21 +101,23 @@ int msm_framebuffer_prepare(struct drm_framebuffer *fb, int id)
100 return 0; 101 return 0;
101} 102}
102 103
103void msm_framebuffer_cleanup(struct drm_framebuffer *fb, int id) 104void msm_framebuffer_cleanup(struct drm_framebuffer *fb,
105 struct msm_gem_address_space *aspace)
104{ 106{
105 struct msm_framebuffer *msm_fb = to_msm_framebuffer(fb); 107 struct msm_framebuffer *msm_fb = to_msm_framebuffer(fb);
106 int i, n = fb->format->num_planes; 108 int i, n = fb->format->num_planes;
107 109
108 for (i = 0; i < n; i++) 110 for (i = 0; i < n; i++)
109 msm_gem_put_iova(msm_fb->planes[i], id); 111 msm_gem_put_iova(msm_fb->planes[i], aspace);
110} 112}
111 113
112uint32_t msm_framebuffer_iova(struct drm_framebuffer *fb, int id, int plane) 114uint32_t msm_framebuffer_iova(struct drm_framebuffer *fb,
115 struct msm_gem_address_space *aspace, int plane)
113{ 116{
114 struct msm_framebuffer *msm_fb = to_msm_framebuffer(fb); 117 struct msm_framebuffer *msm_fb = to_msm_framebuffer(fb);
115 if (!msm_fb->planes[plane]) 118 if (!msm_fb->planes[plane])
116 return 0; 119 return 0;
117 return msm_gem_iova(msm_fb->planes[plane], id) + fb->offsets[plane]; 120 return msm_gem_iova(msm_fb->planes[plane], aspace) + fb->offsets[plane];
118} 121}
119 122
120struct drm_gem_object *msm_framebuffer_bo(struct drm_framebuffer *fb, int plane) 123struct 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 3c08d6d35944..803ed272dc6d 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,
126 * in panic (ie. lock-safe, etc) we could avoid pinning the 126 * in panic (ie. lock-safe, etc) we could avoid pinning the
127 * buffer now: 127 * buffer now:
128 */ 128 */
129 ret = msm_gem_get_iova_locked(fbdev->bo, priv->kms->id, &paddr); 129 ret = msm_gem_get_iova_locked(fbdev->bo, priv->kms->aspace, &paddr);
130 if (ret) { 130 if (ret) {
131 dev_err(dev->dev, "failed to get buffer obj iova: %d\n", ret); 131 dev_err(dev->dev, "failed to get buffer obj iova: %d\n", ret);
132 goto fail_unlock; 132 goto fail_unlock;
diff --git a/drivers/gpu/drm/msm/msm_gem.c b/drivers/gpu/drm/msm/msm_gem.c
index 38fbaadccfb7..0a38c5b1a799 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)
308 * That means when I do eventually need to add support for unpinning 308 * That means when I do eventually need to add support for unpinning
309 * the refcnt counter needs to be atomic_t. 309 * the refcnt counter needs to be atomic_t.
310 */ 310 */
311int msm_gem_get_iova_locked(struct drm_gem_object *obj, int id, 311int msm_gem_get_iova_locked(struct drm_gem_object *obj,
312 uint64_t *iova) 312 struct msm_gem_address_space *aspace, uint64_t *iova)
313{ 313{
314 struct msm_gem_object *msm_obj = to_msm_bo(obj); 314 struct msm_gem_object *msm_obj = to_msm_bo(obj);
315 int id = aspace ? aspace->id : 0;
315 int ret = 0; 316 int ret = 0;
316 317
317 WARN_ON(!mutex_is_locked(&obj->dev->struct_mutex)); 318 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,
338} 339}
339 340
340/* get iova, taking a reference. Should have a matching put */ 341/* get iova, taking a reference. Should have a matching put */
341int msm_gem_get_iova(struct drm_gem_object *obj, int id, uint64_t *iova) 342int msm_gem_get_iova(struct drm_gem_object *obj,
343 struct msm_gem_address_space *aspace, uint64_t *iova)
342{ 344{
343 struct msm_gem_object *msm_obj = to_msm_bo(obj); 345 struct msm_gem_object *msm_obj = to_msm_bo(obj);
346 int id = aspace ? aspace->id : 0;
344 int ret; 347 int ret;
345 348
346 /* this is safe right now because we don't unmap until the 349 /* 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)
353 } 356 }
354 357
355 mutex_lock(&obj->dev->struct_mutex); 358 mutex_lock(&obj->dev->struct_mutex);
356 ret = msm_gem_get_iova_locked(obj, id, iova); 359 ret = msm_gem_get_iova_locked(obj, aspace, iova);
357 mutex_unlock(&obj->dev->struct_mutex); 360 mutex_unlock(&obj->dev->struct_mutex);
358 return ret; 361 return ret;
359} 362}
@@ -361,14 +364,17 @@ int msm_gem_get_iova(struct drm_gem_object *obj, int id, uint64_t *iova)
361/* get iova without taking a reference, used in places where you have 364/* get iova without taking a reference, used in places where you have
362 * already done a 'msm_gem_get_iova()'. 365 * already done a 'msm_gem_get_iova()'.
363 */ 366 */
364uint64_t msm_gem_iova(struct drm_gem_object *obj, int id) 367uint64_t msm_gem_iova(struct drm_gem_object *obj,
368 struct msm_gem_address_space *aspace)
365{ 369{
366 struct msm_gem_object *msm_obj = to_msm_bo(obj); 370 struct msm_gem_object *msm_obj = to_msm_bo(obj);
371 int id = aspace ? aspace->id : 0;
367 WARN_ON(!msm_obj->domain[id].iova); 372 WARN_ON(!msm_obj->domain[id].iova);
368 return msm_obj->domain[id].iova; 373 return msm_obj->domain[id].iova;
369} 374}
370 375
371void msm_gem_put_iova(struct drm_gem_object *obj, int id) 376void msm_gem_put_iova(struct drm_gem_object *obj,
377 struct msm_gem_address_space *aspace)
372{ 378{
373 // XXX TODO .. 379 // XXX TODO ..
374 // NOTE: probably don't need a _locked() version.. we wouldn't 380 // 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 1b4cf20043ea..4b4b352b5718 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 {
33 struct drm_mm mm; 33 struct drm_mm mm;
34 struct msm_mmu *mmu; 34 struct msm_mmu *mmu;
35 struct kref kref; 35 struct kref kref;
36 int id; /* temporary */
36}; 37};
37 38
38struct msm_gem_vma { 39struct msm_gem_vma {
diff --git a/drivers/gpu/drm/msm/msm_gem_submit.c b/drivers/gpu/drm/msm/msm_gem_submit.c
index 7832e6421d25..c8d01df993da 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)
158 struct msm_gem_object *msm_obj = submit->bos[i].obj; 158 struct msm_gem_object *msm_obj = submit->bos[i].obj;
159 159
160 if (submit->bos[i].flags & BO_PINNED) 160 if (submit->bos[i].flags & BO_PINNED)
161 msm_gem_put_iova(&msm_obj->base, submit->gpu->id); 161 msm_gem_put_iova(&msm_obj->base, submit->gpu->aspace);
162 162
163 if (submit->bos[i].flags & BO_LOCKED) 163 if (submit->bos[i].flags & BO_LOCKED)
164 ww_mutex_unlock(&msm_obj->resv->lock); 164 ww_mutex_unlock(&msm_obj->resv->lock);
@@ -246,7 +246,7 @@ static int submit_pin_objects(struct msm_gem_submit *submit)
246 246
247 /* if locking succeeded, pin bo: */ 247 /* if locking succeeded, pin bo: */
248 ret = msm_gem_get_iova_locked(&msm_obj->base, 248 ret = msm_gem_get_iova_locked(&msm_obj->base,
249 submit->gpu->id, &iova); 249 submit->gpu->aspace, &iova);
250 250
251 if (ret) 251 if (ret)
252 break; 252 break;
diff --git a/drivers/gpu/drm/msm/msm_gpu.c b/drivers/gpu/drm/msm/msm_gpu.c
index ebbaed442e8a..36f0f1e5fc81 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)
416 struct msm_gem_object *msm_obj = submit->bos[i].obj; 416 struct msm_gem_object *msm_obj = submit->bos[i].obj;
417 /* move to inactive: */ 417 /* move to inactive: */
418 msm_gem_move_to_inactive(&msm_obj->base); 418 msm_gem_move_to_inactive(&msm_obj->base);
419 msm_gem_put_iova(&msm_obj->base, gpu->id); 419 msm_gem_put_iova(&msm_obj->base, gpu->aspace);
420 drm_gem_object_unreference(&msm_obj->base); 420 drm_gem_object_unreference(&msm_obj->base);
421 } 421 }
422 422
@@ -498,7 +498,7 @@ void msm_gpu_submit(struct msm_gpu *gpu, struct msm_gem_submit *submit,
498 /* submit takes a reference to the bo and iova until retired: */ 498 /* submit takes a reference to the bo and iova until retired: */
499 drm_gem_object_reference(&msm_obj->base); 499 drm_gem_object_reference(&msm_obj->base);
500 msm_gem_get_iova_locked(&msm_obj->base, 500 msm_gem_get_iova_locked(&msm_obj->base,
501 submit->gpu->id, &iova); 501 submit->gpu->aspace, &iova);
502 502
503 if (submit->bos[i].flags & MSM_SUBMIT_BO_WRITE) 503 if (submit->bos[i].flags & MSM_SUBMIT_BO_WRITE)
504 msm_gem_move_to_active(&msm_obj->base, gpu, true, submit->fence); 504 msm_gem_move_to_active(&msm_obj->base, gpu, true, submit->fence);
@@ -694,7 +694,7 @@ void msm_gpu_cleanup(struct msm_gpu *gpu)
694 694
695 if (gpu->rb) { 695 if (gpu->rb) {
696 if (gpu->rb_iova) 696 if (gpu->rb_iova)
697 msm_gem_put_iova(gpu->rb->bo, gpu->id); 697 msm_gem_put_iova(gpu->rb->bo, gpu->aspace);
698 msm_ringbuffer_destroy(gpu->rb); 698 msm_ringbuffer_destroy(gpu->rb);
699 } 699 }
700 700