Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

drm/msm/mdp4: use msm_kms_init_vm() instead of duplicating it

Use the msm_kms_init_vm() function to allocate memory manager instead of
hand-coding a copy of it. Although MDP4 platforms don't have MDSS
device, it's still safe to use the function as all MDP4 devices have
IOMMU and the parent of the MDP4 is the root SoC device.

Signed-off-by: Dmitry Baryshkov <dmitry.baryshkov@oss.qualcomm.com>
Patchwork: https://patchwork.freedesktop.org/patch/672563/
Signed-off-by: Rob Clark <robin.clark@oss.qualcomm.com>

authored by

Dmitry Baryshkov and committed by
Rob Clark
e05edbcf 618c11ea

+9 -29
+1 -1
drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c
··· 1110 1110 { 1111 1111 struct drm_gpuvm *vm; 1112 1112 1113 - vm = msm_kms_init_vm(dpu_kms->dev); 1113 + vm = msm_kms_init_vm(dpu_kms->dev, dpu_kms->dev->dev->parent); 1114 1114 if (IS_ERR(vm)) 1115 1115 return PTR_ERR(vm); 1116 1116
+4 -23
drivers/gpu/drm/msm/disp/mdp4/mdp4_kms.c
··· 391 391 392 392 static int mdp4_kms_init(struct drm_device *dev) 393 393 { 394 - struct platform_device *pdev = to_platform_device(dev->dev); 395 394 struct msm_drm_private *priv = dev->dev_private; 396 395 struct mdp4_kms *mdp4_kms = to_mdp4_kms(to_mdp_kms(priv->kms)); 397 396 struct msm_kms *kms = NULL; 398 - struct msm_mmu *mmu; 399 397 struct drm_gpuvm *vm; 400 398 int ret; 401 399 u32 major, minor; ··· 456 458 mdp4_disable(mdp4_kms); 457 459 mdelay(16); 458 460 459 - if (!device_iommu_mapped(&pdev->dev)) { 460 - DRM_DEV_INFO(dev->dev, "no IOMMU, bailing out\n"); 461 - ret = -ENODEV; 461 + vm = msm_kms_init_vm(mdp4_kms->dev, NULL); 462 + if (IS_ERR(vm)) { 463 + ret = PTR_ERR(vm); 462 464 goto fail; 463 465 } 464 466 465 - mmu = msm_iommu_new(&pdev->dev, 0); 466 - if (IS_ERR(mmu)) { 467 - ret = PTR_ERR(mmu); 468 - goto fail; 469 - } else { 470 - vm = msm_gem_vm_create(dev, mmu, "mdp4", 471 - 0x1000, 0x100000000 - 0x1000, 472 - true); 473 - 474 - if (IS_ERR(vm)) { 475 - if (!IS_ERR(mmu)) 476 - mmu->funcs->destroy(mmu); 477 - ret = PTR_ERR(vm); 478 - goto fail; 479 - } 480 - 481 - kms->vm = vm; 482 - } 467 + kms->vm = vm; 483 468 484 469 ret = modeset_init(mdp4_kms); 485 470 if (ret) {
+1 -1
drivers/gpu/drm/msm/disp/mdp5/mdp5_kms.c
··· 534 534 } 535 535 mdelay(16); 536 536 537 - vm = msm_kms_init_vm(mdp5_kms->dev); 537 + vm = msm_kms_init_vm(mdp5_kms->dev, pdev->dev.parent); 538 538 if (IS_ERR(vm)) { 539 539 ret = PTR_ERR(vm); 540 540 goto fail;
+1 -1
drivers/gpu/drm/msm/msm_drv.h
··· 229 229 int msm_register_mmu(struct drm_device *dev, struct msm_mmu *mmu); 230 230 void msm_unregister_mmu(struct drm_device *dev, struct msm_mmu *mmu); 231 231 232 - struct drm_gpuvm *msm_kms_init_vm(struct drm_device *dev); 232 + struct drm_gpuvm *msm_kms_init_vm(struct drm_device *dev, struct device *mdss_dev); 233 233 bool msm_use_mmu(struct drm_device *dev); 234 234 235 235 int msm_ioctl_gem_submit(struct drm_device *dev, void *data,
+2 -3
drivers/gpu/drm/msm/msm_kms.c
··· 177 177 return -ENOSYS; 178 178 } 179 179 180 - struct drm_gpuvm *msm_kms_init_vm(struct drm_device *dev) 180 + struct drm_gpuvm *msm_kms_init_vm(struct drm_device *dev, struct device *mdss_dev) 181 181 { 182 182 struct drm_gpuvm *vm; 183 183 struct msm_mmu *mmu; 184 184 struct device *mdp_dev = dev->dev; 185 - struct device *mdss_dev = mdp_dev->parent; 186 185 struct msm_drm_private *priv = dev->dev_private; 187 186 struct msm_kms *kms = priv->kms; 188 187 struct device *iommu_dev; ··· 192 193 */ 193 194 if (device_iommu_mapped(mdp_dev)) 194 195 iommu_dev = mdp_dev; 195 - else if (device_iommu_mapped(mdss_dev)) 196 + else if (mdss_dev && device_iommu_mapped(mdss_dev)) 196 197 iommu_dev = mdss_dev; 197 198 else { 198 199 drm_info(dev, "no IOMMU, bailing out\n");