[PATCH 3/7] drm/exynos: add IOMMU support to drm fimd
Inki Dae
inki.dae at samsung.com
Thu Jul 12 23:50:49 PDT 2012
> -----Original Message-----
> From: Prathyush K [mailto:prathyush.k at samsung.com]
> Sent: Wednesday, July 11, 2012 6:40 PM
> To: dri-devel at lists.freedesktop.org
> Cc: prathyush at chromium.org; m.szyprowski at samsung.com;
inki.dae at samsung.com;
> subash.ramaswamy at linaro.org
> Subject: [PATCH 3/7] drm/exynos: add IOMMU support to drm fimd
>
> This patch adds device tree based IOMMU support to DRM FIMD. During
> probe, the driver searches for a 'sysmmu' field in the device node. The
> sysmmu field points to the corresponding sysmmu device of fimd.
> This sysmmu device is retrieved and set as fimd's sysmmu. The common
> IOMMU mapping created during DRM init is then attached to drm fimd.
>
> Signed-off-by: Prathyush K <prathyush.k at samsung.com>
> ---
> drivers/gpu/drm/exynos/exynos_drm_fimd.c | 54
> +++++++++++++++++++++++++++++-
> 1 files changed, 53 insertions(+), 1 deletions(-)
>
> diff --git a/drivers/gpu/drm/exynos/exynos_drm_fimd.c
> b/drivers/gpu/drm/exynos/exynos_drm_fimd.c
> index 15b5286..6d4048a 100644
> --- a/drivers/gpu/drm/exynos/exynos_drm_fimd.c
> +++ b/drivers/gpu/drm/exynos/exynos_drm_fimd.c
> @@ -19,7 +19,7 @@
> #include <linux/clk.h>
> #include <linux/pm_runtime.h>
> #include <linux/of.h>
> -
> +#include <linux/of_platform.h>
> #include <drm/exynos_drm.h>
> #include <plat/regs-fb-v4.h>
>
> @@ -790,12 +790,56 @@ static int fimd_power_on(struct fimd_context *ctx,
> bool enable)
> }
>
> #ifdef CONFIG_OF
> +
> +#ifdef CONFIG_EXYNOS_IOMMU
> +static int iommu_init(struct device *dev)
> +{
> + struct platform_device *pds;
> + struct device_node *dn, *dns;
> + const __be32 *parp;
> + int ret;
> +
> + dn = dev->of_node;
> + parp = of_get_property(dn, "sysmmu", NULL);
> + if (parp == NULL) {
> + dev_err(dev, "failed to find sysmmu property\n");
> + return -EINVAL;
> + }
> + dns = of_find_node_by_phandle(be32_to_cpup(parp));
> + if (dns == NULL) {
> + dev_err(dev, "failed to find sysmmu node\n");
> + return -EINVAL;
> + }
> + pds = of_find_device_by_node(dns);
> + if (pds == NULL) {
> + dev_err(dev, "failed to find sysmmu platform device\n");
> + return -EINVAL;
> + }
> +
> + platform_set_sysmmu(&pds->dev, dev);
> + dev->dma_parms = kzalloc(sizeof(*dev->dma_parms), GFP_KERNEL);
> + if (!dev->dma_parms) {
> + dev_err(dev, "failed to allocate dma parms\n");
> + return -ENOMEM;
> + }
> + dma_set_max_seg_size(dev, 0xffffffffu);
> +
> + ret = arm_iommu_attach_device(dev, exynos_drm_common_mapping);
where is exynos_drm_common_mapping declared? you can get this point using
exynos_drm_private structure.
> + if (ret) {
> + dev_err(dev, "failed to attach device\n");
> + return ret;
> + }
> + return 0;
> +}
> +#endif
> +
with your patch, we can use iommu feature only with device tree. I think
iommu feature should be used commonly.
> static struct exynos_drm_fimd_pdata *drm_fimd_dt_parse_pdata(struct
> device *dev)
> {
> struct device_node *np = dev->of_node;
> struct device_node *disp_np;
> struct exynos_drm_fimd_pdata *pd;
> u32 data[4];
> + int ret;
>
> pd = kzalloc(sizeof(*pd), GFP_KERNEL);
> if (!pd) {
> @@ -803,6 +847,14 @@ static struct exynos_drm_fimd_pdata
> *drm_fimd_dt_parse_pdata(struct device *dev)
> return ERR_PTR(-ENOMEM);
> }
>
> +#ifdef CONFIG_EXYNOS_IOMMU
and please avoid such #ifdef in device driver.
> + ret = iommu_init(dev);
> + if (ret) {
> + dev_err(dev, "failed to initialize iommu\n");
> + return ERR_PTR(ret);
> + }
> +#endif
> +
> if (of_get_property(np, "samsung,fimd-vidout-rgb", NULL))
> pd->vidcon0 |= VIDCON0_VIDOUT_RGB | VIDCON0_PNRMODE_RGB;
> if (of_get_property(np, "samsung,fimd-vidout-tv", NULL))
> --
> 1.7.0.4
More information about the dri-devel
mailing list