Commit 23755696 authored by Andrzej Hajda's avatar Andrzej Hajda Committed by Inki Dae
Browse files

drm/exynos/iommu: integrate IOMMU/DMA internal API



Exynos DRM drivers should work with and without IOMMU. Providing common
API generic to both scenarios should make code cleaner and allow further
code improvements.
The patch removes including of exynos_drm_iommu.h as the file contains
mostly IOMMU specific stuff, instead it exposes exynos_drm_*_dma functions
and puts them into exynos_drm_dma.c.

Signed-off-by: default avatarAndrzej Hajda <a.hajda@samsung.com>
Signed-off-by: default avatarInki Dae <inki.dae@samsung.com>
parent 69908ed2
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -4,7 +4,7 @@
# Direct Rendering Infrastructure (DRI) in XFree86 4.1.0 and higher.

exynosdrm-y := exynos_drm_drv.o exynos_drm_crtc.o exynos_drm_fb.o \
		exynos_drm_gem.o exynos_drm_plane.o
		exynos_drm_gem.o exynos_drm_plane.o exynos_drm_dma.o

exynosdrm-$(CONFIG_DRM_FBDEV_EMULATION) += exynos_drm_fbdev.o
exynosdrm-$(CONFIG_EXYNOS_IOMMU) += exynos_drm_iommu.o
+1 −2
Original line number Diff line number Diff line
@@ -25,7 +25,6 @@
#include "exynos_drm_crtc.h"
#include "exynos_drm_fb.h"
#include "exynos_drm_plane.h"
#include "exynos_drm_iommu.h"
#include "regs-decon5433.h"

#define DSD_CFG_MUX 0x1004
@@ -579,7 +578,7 @@ static void decon_unbind(struct device *dev, struct device *master, void *data)
	decon_disable(ctx->crtc);

	/* detach this sub driver from iommu mapping if supported. */
	drm_iommu_detach_device(ctx->drm_dev, ctx->dev);
	exynos_drm_unregister_dma(ctx->drm_dev, ctx->dev);
}

static const struct component_ops decon_component_ops = {
+1 −2
Original line number Diff line number Diff line
@@ -30,7 +30,6 @@
#include "exynos_drm_plane.h"
#include "exynos_drm_drv.h"
#include "exynos_drm_fb.h"
#include "exynos_drm_iommu.h"
#include "regs-decon7.h"

/*
@@ -139,7 +138,7 @@ static int decon_ctx_initialize(struct decon_context *ctx,
static void decon_ctx_remove(struct decon_context *ctx)
{
	/* detach this sub driver from iommu mapping if supported. */
	drm_iommu_detach_device(ctx->drm_dev, ctx->dev);
	exynos_drm_unregister_dma(ctx->drm_dev, ctx->dev);
}

static u32 decon_calc_clkdiv(struct decon_context *ctx,
+40 −0
Original line number Diff line number Diff line
// SPDX-License-Identifier: GPL-2.0
//
// Copyright (c) 2012 Samsung Electronics Co., Ltd.
// Author: Andrzej Hajda <a.hajda@samsung.com>

#include "exynos_drm_drv.h"
#include "exynos_drm_iommu.h"

int exynos_drm_register_dma(struct drm_device *drm, struct device *dev)
{
	struct exynos_drm_private *priv = drm->dev_private;
	int ret;

	if (!priv->dma_dev) {
		priv->dma_dev = dev;
		DRM_INFO("Exynos DRM: using %s device for DMA mapping operations\n",
			 dev_name(dev));
		/* create common IOMMU mapping for all Exynos DRM devices */
		ret = drm_create_iommu_mapping(drm);
		if (ret < 0) {
			priv->dma_dev = NULL;
			DRM_ERROR("failed to create iommu mapping.\n");
			return -EINVAL;
		}
	}

	return drm_iommu_attach_device(drm, dev);
}

void exynos_drm_unregister_dma(struct drm_device *drm, struct device *dev)
{
	if (IS_ENABLED(CONFIG_EXYNOS_IOMMU))
		drm_iommu_detach_device(drm, dev);
}

void exynos_drm_cleanup_dma(struct drm_device *drm)
{
	if (IS_ENABLED(CONFIG_EXYNOS_IOMMU))
		drm_release_iommu_mapping(drm);
}
+2 −24
Original line number Diff line number Diff line
@@ -30,7 +30,6 @@
#include "exynos_drm_ipp.h"
#include "exynos_drm_vidi.h"
#include "exynos_drm_g2d.h"
#include "exynos_drm_iommu.h"

#define DRIVER_NAME	"exynos"
#define DRIVER_DESC	"Samsung SoC DRM"
@@ -45,27 +44,6 @@
#define DRIVER_MAJOR	1
#define DRIVER_MINOR	1

int exynos_drm_register_dma(struct drm_device *drm, struct device *dev)
{
	struct exynos_drm_private *priv = drm->dev_private;
	int ret;

	if (!priv->dma_dev) {
		priv->dma_dev = dev;
		DRM_INFO("Exynos DRM: using %s device for DMA mapping operations\n",
			 dev_name(dev));
		/* create common IOMMU mapping for all Exynos DRM devices */
		ret = drm_create_iommu_mapping(drm);
		if (ret < 0) {
			priv->dma_dev = NULL;
			DRM_ERROR("failed to create iommu mapping.\n");
			return -EINVAL;
		}
	}

	return drm_iommu_attach_device(drm, dev);
}

static int exynos_drm_open(struct drm_device *dev, struct drm_file *file)
{
	struct drm_exynos_file_private *file_priv;
@@ -367,7 +345,7 @@ err_unbind_all:
	component_unbind_all(drm->dev, drm);
err_mode_config_cleanup:
	drm_mode_config_cleanup(drm);
	drm_release_iommu_mapping(drm);
	exynos_drm_cleanup_dma(drm);
	kfree(private);
err_free_drm:
	drm_dev_put(drm);
@@ -386,7 +364,7 @@ static void exynos_drm_unbind(struct device *dev)

	component_unbind_all(drm->dev, drm);
	drm_mode_config_cleanup(drm);
	drm_release_iommu_mapping(drm);
	exynos_drm_cleanup_dma(drm);

	kfree(drm->dev_private);
	drm->dev_private = NULL;
Loading