[PATCH] drm/exynos: enable iommu for mixer and not hdmi
Inki Dae
inki.dae at samsung.com
Mon Dec 3 22:03:10 PST 2012
And Below is my comments and please send them as code cleanup. Actually,
your patch includes code cleanup also.
Thanks,
Inki Dae
2012/12/3 Prathyush K <prathyush.k at samsung.com>
> According to the new IOMMU framework for exynos sysmmus, the owner
> of the sysmmu-tv is mixer (which is the actual device that does DMA)
> and not hdmi.
> The mmu-master in sysmmu-tv node is set as below in exynos5250.dtsi.
> sysmmu-tv {
> -
> mmu-master = <&mixer>;
> };
>
> This patch moves the iommu_on function from the hdmi context to the
> mixer context.
>
> And this patch is based on exynos-drm-next-iommu branch of
> git://git.kernel.org/pub/scm/linux/kernel/git/daeinki/drm-exynos
>
> Signed-off-by: Prathyush K <prathyush.k at samsung.com>
> ---
> drivers/gpu/drm/exynos/exynos_drm_hdmi.c | 8 ++++----
> drivers/gpu/drm/exynos/exynos_drm_hdmi.h | 2 +-
> drivers/gpu/drm/exynos/exynos_hdmi.c | 24 ------------------------
> drivers/gpu/drm/exynos/exynos_mixer.c | 23 +++++++++++++++++++++++
> 4 files changed, 28 insertions(+), 29 deletions(-)
>
> diff --git a/drivers/gpu/drm/exynos/exynos_drm_hdmi.c
> b/drivers/gpu/drm/exynos/exynos_drm_hdmi.c
> index 997fb6e..8b771a3 100644
> --- a/drivers/gpu/drm/exynos/exynos_drm_hdmi.c
> +++ b/drivers/gpu/drm/exynos/exynos_drm_hdmi.c
> @@ -368,8 +368,8 @@ static int hdmi_subdrv_probe(struct drm_device
> *drm_dev,
> ctx->hdmi_ctx->drm_dev = drm_dev;
> ctx->mixer_ctx->drm_dev = drm_dev;
>
> - if (hdmi_ops->iommu_on)
> - hdmi_ops->iommu_on(ctx->hdmi_ctx->ctx, true);
> + if (mixer_ops->iommu_on)
> + mixer_ops->iommu_on(ctx->mixer_ctx->ctx, true);
>
> return 0;
> }
> @@ -381,8 +381,8 @@ static void hdmi_subdrv_remove(struct drm_device
> *drm_dev, struct device *dev)
>
> ctx = get_ctx_from_subdrv(subdrv);
>
> - if (hdmi_ops->iommu_on)
> - hdmi_ops->iommu_on(ctx->hdmi_ctx->ctx, false);
> + if (mixer_ops->iommu_on)
> + mixer_ops->iommu_on(ctx->mixer_ctx->ctx, false);
> }
>
> static int __devinit exynos_drm_hdmi_probe(struct platform_device *pdev)
> diff --git a/drivers/gpu/drm/exynos/exynos_drm_hdmi.h
> b/drivers/gpu/drm/exynos/exynos_drm_hdmi.h
> index 5c033d1..54b5223 100644
> --- a/drivers/gpu/drm/exynos/exynos_drm_hdmi.h
> +++ b/drivers/gpu/drm/exynos/exynos_drm_hdmi.h
> @@ -50,7 +50,6 @@ struct exynos_hdmi_ops {
> int (*power_on)(void *ctx, int mode);
>
> /* manager */
> - int (*iommu_on)(void *ctx, bool enable);
> void (*mode_fixup)(void *ctx, struct drm_connector *connector,
> const struct drm_display_mode *mode,
> struct drm_display_mode *adjusted_mode);
> @@ -63,6 +62,7 @@ struct exynos_hdmi_ops {
>
> struct exynos_mixer_ops {
> /* manager */
> + int (*iommu_on)(void *ctx, bool enable);
> int (*enable_vblank)(void *ctx, int pipe);
> void (*disable_vblank)(void *ctx);
> void (*dpms)(void *ctx, int mode);
> diff --git a/drivers/gpu/drm/exynos/exynos_hdmi.c
> b/drivers/gpu/drm/exynos/exynos_hdmi.c
> index d1a1d71..7df1d85 100644
> --- a/drivers/gpu/drm/exynos/exynos_hdmi.c
> +++ b/drivers/gpu/drm/exynos/exynos_hdmi.c
> @@ -40,7 +40,6 @@
>
> #include "exynos_drm_drv.h"
> #include "exynos_drm_hdmi.h"
> -#include "exynos_drm_iommu.h"
>
> #include "exynos_hdmi.h"
>
> @@ -68,7 +67,6 @@ struct hdmi_resources {
>
> struct hdmi_context {
> struct device *dev;
> - struct drm_device *drm_dev;
>
this one.
> bool hpd;
> bool powered;
> bool dvi_mode;
> @@ -85,7 +83,6 @@ struct hdmi_context {
> int cur_conf;
>
> struct hdmi_resources res;
> - void *parent_ctx;
>
this one.
>
> int hpd_gpio;
>
> @@ -1947,25 +1944,6 @@ static void hdmi_conf_apply(struct hdmi_context
> *hdata)
> hdmi_regs_dump(hdata, "start");
> }
>
> -static int hdmi_iommu_on(void *ctx, bool enable)
> -{
> - struct exynos_drm_hdmi_context *drm_hdmi_ctx;
> - struct hdmi_context *hdata = ctx;
> - struct drm_device *drm_dev;
> -
> - drm_hdmi_ctx = hdata->parent_ctx;
> - drm_dev = drm_hdmi_ctx->drm_dev;
> -
> - if (is_drm_iommu_supported(drm_dev)) {
> - if (enable)
> - return drm_iommu_attach_device(drm_dev,
> hdata->dev);
> -
> - drm_iommu_detach_device(drm_dev, hdata->dev);
> - }
> -
> - return 0;
> -}
> -
> static void hdmi_mode_fixup(void *ctx, struct drm_connector *connector,
> const struct drm_display_mode *mode,
> struct drm_display_mode *adjusted_mode)
> @@ -2122,7 +2100,6 @@ static struct exynos_hdmi_ops hdmi_ops = {
> .check_timing = hdmi_check_timing,
>
> /* manager */
> - .iommu_on = hdmi_iommu_on,
> .mode_fixup = hdmi_mode_fixup,
> .mode_set = hdmi_mode_set,
> .get_max_resol = hdmi_get_max_resol,
> @@ -2379,7 +2356,6 @@ static int __devinit hdmi_probe(struct
> platform_device *pdev)
> mutex_init(&hdata->hdmi_mutex);
>
> drm_hdmi_ctx->ctx = (void *)hdata;
> - hdata->parent_ctx = (void *)drm_hdmi_ctx;
>
this one.
>
> platform_set_drvdata(pdev, drm_hdmi_ctx);
>
> diff --git a/drivers/gpu/drm/exynos/exynos_mixer.c
> b/drivers/gpu/drm/exynos/exynos_mixer.c
> index 614b2e9..574ed3f 100644
> --- a/drivers/gpu/drm/exynos/exynos_mixer.c
> +++ b/drivers/gpu/drm/exynos/exynos_mixer.c
> @@ -36,6 +36,7 @@
>
> #include "exynos_drm_drv.h"
> #include "exynos_drm_hdmi.h"
> +#include "exynos_drm_iommu.h"
>
> #define get_mixer_context(dev)
> platform_get_drvdata(to_platform_device(dev))
>
> @@ -80,6 +81,7 @@ enum mixer_version_id {
>
> struct mixer_context {
> struct device *dev;
> + struct drm_device *drm_dev;
> int pipe;
> bool interlace;
> bool powered;
> @@ -90,6 +92,7 @@ struct mixer_context {
> struct mixer_resources mixer_res;
> struct hdmi_win_data win_data[MIXER_WIN_NR];
> enum mixer_version_id mxr_ver;
> + void *parent_ctx;
> };
>
> struct mixer_drv_data {
> @@ -665,6 +668,24 @@ static void mixer_win_reset(struct mixer_context *ctx)
> spin_unlock_irqrestore(&res->reg_slock, flags);
> }
>
> +static int mixer_iommu_on(void *ctx, bool enable)
> +{
> + struct exynos_drm_hdmi_context *drm_hdmi_ctx;
> + struct mixer_context *mdata = ctx;
> + struct drm_device *drm_dev;
> +
> + drm_hdmi_ctx = mdata->parent_ctx;
> + drm_dev = drm_hdmi_ctx->drm_dev;
> +
> + if (is_drm_iommu_supported(drm_dev)) {
> + if (enable)
> + return drm_iommu_attach_device(drm_dev,
> mdata->dev);
> +
> + drm_iommu_detach_device(drm_dev, mdata->dev);
> + }
> + return 0;
> +}
> +
> static void mixer_poweron(struct mixer_context *ctx)
> {
> struct mixer_resources *res = &ctx->mixer_res;
> @@ -866,6 +887,7 @@ static void mixer_win_disable(void *ctx, int win)
>
> static struct exynos_mixer_ops mixer_ops = {
> /* manager */
> + .iommu_on = mixer_iommu_on,
> .enable_vblank = mixer_enable_vblank,
> .disable_vblank = mixer_disable_vblank,
> .dpms = mixer_dpms,
> @@ -1149,6 +1171,7 @@ static int __devinit mixer_probe(struct
> platform_device *pdev)
> }
>
> ctx->dev = &pdev->dev;
> + ctx->parent_ctx = (void *)drm_hdmi_ctx;
> drm_hdmi_ctx->ctx = (void *)ctx;
> ctx->vp_enabled = drv->is_vp_enabled;
> ctx->mxr_ver = drv->version;
> --
> 1.7.0.4
>
> _______________________________________________
> dri-devel mailing list
> dri-devel at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/dri-devel
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.freedesktop.org/archives/dri-devel/attachments/20121204/5f8a7a94/attachment-0001.html>
More information about the dri-devel
mailing list