drm/exynos: add iommu support for ipp
This patch adds iommu support for IPP subsystem framework. For this, it adds subdrv_probe/remove callback to enable or disable ipp iommu. We can get or put device address to a gem handle from user through exynos_drm_gem_get/put_dma_addr(). Signed-off-by: Eunchul Kim <chulspro.kim@samsung.com> Signed-off-by: Jinyoung Jeon <jy0.jeon@samsung.com> Signed-off-by: Inki Dae <inki.dae@samsung.com> Signed-off-by: Kyungmin Park <kyungmin.park@samsung.com>
This commit is contained in:
parent
cb471f14b5
commit
c12e2617b2
1 changed files with 18 additions and 0 deletions
|
@ -24,6 +24,7 @@
|
|||
#include "exynos_drm_drv.h"
|
||||
#include "exynos_drm_gem.h"
|
||||
#include "exynos_drm_ipp.h"
|
||||
#include "exynos_drm_iommu.h"
|
||||
|
||||
/*
|
||||
* IPP is stand for Image Post Processing and
|
||||
|
@ -1771,10 +1772,24 @@ static int ipp_subdrv_probe(struct drm_device *drm_dev, struct device *dev)
|
|||
ippdrv->event_workq = ctx->event_workq;
|
||||
ippdrv->sched_event = ipp_sched_event;
|
||||
INIT_LIST_HEAD(&ippdrv->cmd_list);
|
||||
|
||||
if (is_drm_iommu_supported(drm_dev)) {
|
||||
ret = drm_iommu_attach_device(drm_dev, ippdrv->dev);
|
||||
if (ret) {
|
||||
DRM_ERROR("failed to activate iommu\n");
|
||||
goto err_iommu;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
|
||||
err_iommu:
|
||||
/* get ipp driver entry */
|
||||
list_for_each_entry_reverse(ippdrv, &exynos_drm_ippdrv_list, drv_list)
|
||||
if (is_drm_iommu_supported(drm_dev))
|
||||
drm_iommu_detach_device(drm_dev, ippdrv->dev);
|
||||
|
||||
err_idr:
|
||||
idr_remove_all(&ctx->ipp_idr);
|
||||
idr_remove_all(&ctx->prop_idr);
|
||||
|
@ -1791,6 +1806,9 @@ static void ipp_subdrv_remove(struct drm_device *drm_dev, struct device *dev)
|
|||
|
||||
/* get ipp driver entry */
|
||||
list_for_each_entry(ippdrv, &exynos_drm_ippdrv_list, drv_list) {
|
||||
if (is_drm_iommu_supported(drm_dev))
|
||||
drm_iommu_detach_device(drm_dev, ippdrv->dev);
|
||||
|
||||
ippdrv->drm_dev = NULL;
|
||||
exynos_drm_ippdrv_unregister(ippdrv);
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue