|
@@ -179,9 +179,20 @@ static long mdp4_round_pixclk(struct msm_kms *kms, unsigned long rate,
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+static const char * const iommu_ports[] = {
|
|
|
+ "mdp_port0_cb0", "mdp_port1_cb0",
|
|
|
+};
|
|
|
+
|
|
|
static void mdp4_destroy(struct msm_kms *kms)
|
|
|
{
|
|
|
struct mdp4_kms *mdp4_kms = to_mdp4_kms(to_mdp_kms(kms));
|
|
|
+ struct msm_mmu *mmu = mdp4_kms->mmu;
|
|
|
+
|
|
|
+ if (mmu) {
|
|
|
+ mmu->funcs->detach(mmu, iommu_ports, ARRAY_SIZE(iommu_ports));
|
|
|
+ mmu->funcs->destroy(mmu);
|
|
|
+ }
|
|
|
+
|
|
|
if (mdp4_kms->blank_cursor_iova)
|
|
|
msm_gem_put_iova(mdp4_kms->blank_cursor_bo, mdp4_kms->id);
|
|
|
if (mdp4_kms->blank_cursor_bo)
|
|
@@ -446,10 +457,6 @@ fail:
|
|
|
return ret;
|
|
|
}
|
|
|
|
|
|
-static const char *iommu_ports[] = {
|
|
|
- "mdp_port0_cb0", "mdp_port1_cb0",
|
|
|
-};
|
|
|
-
|
|
|
struct msm_kms *mdp4_kms_init(struct drm_device *dev)
|
|
|
{
|
|
|
struct platform_device *pdev = dev->platformdev;
|
|
@@ -554,6 +561,8 @@ struct msm_kms *mdp4_kms_init(struct drm_device *dev)
|
|
|
ARRAY_SIZE(iommu_ports));
|
|
|
if (ret)
|
|
|
goto fail;
|
|
|
+
|
|
|
+ mdp4_kms->mmu = mmu;
|
|
|
} else {
|
|
|
dev_info(dev->dev, "no iommu, fallback to phys "
|
|
|
"contig buffers for scanout\n");
|