Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit f59f62d5 authored by Rob Clark's avatar Rob Clark
Browse files

drm/msm/mdp4+5: move aspace/id to base class



Before we can shift to passing the address-space object to _get_iova(),
we need to fix a few places (dsi+fbdev) that were hard-coding the adress
space id.  That gets somewhat easier if we just move these to the kms
base class.

Prep work for next patch.

Signed-off-by: default avatarRob Clark <robdclark@gmail.com>
parent aa7cd242
Loading
Loading
Loading
Loading
+8 −2
Original line number Original line Diff line number Diff line
@@ -32,6 +32,7 @@
#include "dsi.xml.h"
#include "dsi.xml.h"
#include "sfpb.xml.h"
#include "sfpb.xml.h"
#include "dsi_cfg.h"
#include "dsi_cfg.h"
#include "msm_kms.h"


static int dsi_get_version(const void __iomem *base, u32 *major, u32 *minor)
static int dsi_get_version(const void __iomem *base, u32 *major, u32 *minor)
{
{
@@ -975,6 +976,7 @@ static void dsi_wait4video_eng_busy(struct msm_dsi_host *msm_host)
static int dsi_tx_buf_alloc(struct msm_dsi_host *msm_host, int size)
static int dsi_tx_buf_alloc(struct msm_dsi_host *msm_host, int size)
{
{
	struct drm_device *dev = msm_host->dev;
	struct drm_device *dev = msm_host->dev;
	struct msm_drm_private *priv = dev->dev_private;
	const struct msm_dsi_cfg_handler *cfg_hnd = msm_host->cfg_hnd;
	const struct msm_dsi_cfg_handler *cfg_hnd = msm_host->cfg_hnd;
	int ret;
	int ret;
	uint64_t iova;
	uint64_t iova;
@@ -991,7 +993,8 @@ static int dsi_tx_buf_alloc(struct msm_dsi_host *msm_host, int size)
			return ret;
			return ret;
		}
		}


		ret = msm_gem_get_iova_locked(msm_host->tx_gem_obj, 0, &iova);
		ret = msm_gem_get_iova_locked(msm_host->tx_gem_obj,
				priv->kms->id, &iova);
		mutex_unlock(&dev->struct_mutex);
		mutex_unlock(&dev->struct_mutex);
		if (ret) {
		if (ret) {
			pr_err("%s: failed to get iova, %d\n", __func__, ret);
			pr_err("%s: failed to get iova, %d\n", __func__, ret);
@@ -1141,12 +1144,15 @@ static int dsi_long_read_resp(u8 *buf, const struct mipi_dsi_msg *msg)
static int dsi_cmd_dma_tx(struct msm_dsi_host *msm_host, int len)
static int dsi_cmd_dma_tx(struct msm_dsi_host *msm_host, int len)
{
{
	const struct msm_dsi_cfg_handler *cfg_hnd = msm_host->cfg_hnd;
	const struct msm_dsi_cfg_handler *cfg_hnd = msm_host->cfg_hnd;
	struct drm_device *dev = msm_host->dev;
	struct msm_drm_private *priv = dev->dev_private;
	int ret;
	int ret;
	uint64_t dma_base;
	uint64_t dma_base;
	bool triggered;
	bool triggered;


	if (cfg_hnd->major == MSM_DSI_VER_MAJOR_6G) {
	if (cfg_hnd->major == MSM_DSI_VER_MAJOR_6G) {
		ret = msm_gem_get_iova(msm_host->tx_gem_obj, 0, &dma_base);
		ret = msm_gem_get_iova(msm_host->tx_gem_obj,
				priv->kms->id, &dma_base);
		if (ret) {
		if (ret) {
			pr_err("%s: failed to get iova: %d\n", __func__, ret);
			pr_err("%s: failed to get iova: %d\n", __func__, ret);
			return ret;
			return ret;
+6 −3
Original line number Original line Diff line number Diff line
@@ -126,8 +126,9 @@ static void unref_cursor_worker(struct drm_flip_work *work, void *val)
	struct mdp4_crtc *mdp4_crtc =
	struct mdp4_crtc *mdp4_crtc =
		container_of(work, struct mdp4_crtc, unref_cursor_work);
		container_of(work, struct mdp4_crtc, unref_cursor_work);
	struct mdp4_kms *mdp4_kms = get_kms(&mdp4_crtc->base);
	struct mdp4_kms *mdp4_kms = get_kms(&mdp4_crtc->base);
	struct msm_kms *kms = &mdp4_kms->base.base;


	msm_gem_put_iova(val, mdp4_kms->id);
	msm_gem_put_iova(val, kms->id);
	drm_gem_object_unreference_unlocked(val);
	drm_gem_object_unreference_unlocked(val);
}
}


@@ -360,6 +361,7 @@ static void update_cursor(struct drm_crtc *crtc)
{
{
	struct mdp4_crtc *mdp4_crtc = to_mdp4_crtc(crtc);
	struct mdp4_crtc *mdp4_crtc = to_mdp4_crtc(crtc);
	struct mdp4_kms *mdp4_kms = get_kms(crtc);
	struct mdp4_kms *mdp4_kms = get_kms(crtc);
	struct msm_kms *kms = &mdp4_kms->base.base;
	enum mdp4_dma dma = mdp4_crtc->dma;
	enum mdp4_dma dma = mdp4_crtc->dma;
	unsigned long flags;
	unsigned long flags;


@@ -372,7 +374,7 @@ static void update_cursor(struct drm_crtc *crtc)
		if (next_bo) {
		if (next_bo) {
			/* take a obj ref + iova ref when we start scanning out: */
			/* take a obj ref + iova ref when we start scanning out: */
			drm_gem_object_reference(next_bo);
			drm_gem_object_reference(next_bo);
			msm_gem_get_iova_locked(next_bo, mdp4_kms->id, &iova);
			msm_gem_get_iova_locked(next_bo, kms->id, &iova);


			/* enable cursor: */
			/* enable cursor: */
			mdp4_write(mdp4_kms, REG_MDP4_DMA_CURSOR_SIZE(dma),
			mdp4_write(mdp4_kms, REG_MDP4_DMA_CURSOR_SIZE(dma),
@@ -409,6 +411,7 @@ static int mdp4_crtc_cursor_set(struct drm_crtc *crtc,
{
{
	struct mdp4_crtc *mdp4_crtc = to_mdp4_crtc(crtc);
	struct mdp4_crtc *mdp4_crtc = to_mdp4_crtc(crtc);
	struct mdp4_kms *mdp4_kms = get_kms(crtc);
	struct mdp4_kms *mdp4_kms = get_kms(crtc);
	struct msm_kms *kms = &mdp4_kms->base.base;
	struct drm_device *dev = crtc->dev;
	struct drm_device *dev = crtc->dev;
	struct drm_gem_object *cursor_bo, *old_bo;
	struct drm_gem_object *cursor_bo, *old_bo;
	unsigned long flags;
	unsigned long flags;
@@ -429,7 +432,7 @@ static int mdp4_crtc_cursor_set(struct drm_crtc *crtc,
	}
	}


	if (cursor_bo) {
	if (cursor_bo) {
		ret = msm_gem_get_iova(cursor_bo, mdp4_kms->id, &iova);
		ret = msm_gem_get_iova(cursor_bo, kms->id, &iova);
		if (ret)
		if (ret)
			goto fail;
			goto fail;
	} else {
	} else {
+7 −7
Original line number Original line Diff line number Diff line
@@ -160,10 +160,10 @@ static void mdp4_destroy(struct msm_kms *kms)
{
{
	struct mdp4_kms *mdp4_kms = to_mdp4_kms(to_mdp_kms(kms));
	struct mdp4_kms *mdp4_kms = to_mdp4_kms(to_mdp_kms(kms));
	struct device *dev = mdp4_kms->dev->dev;
	struct device *dev = mdp4_kms->dev->dev;
	struct msm_gem_address_space *aspace = mdp4_kms->aspace;
	struct msm_gem_address_space *aspace = kms->aspace;


	if (mdp4_kms->blank_cursor_iova)
	if (mdp4_kms->blank_cursor_iova)
		msm_gem_put_iova(mdp4_kms->blank_cursor_bo, mdp4_kms->id);
		msm_gem_put_iova(mdp4_kms->blank_cursor_bo, kms->id);
	drm_gem_object_unreference_unlocked(mdp4_kms->blank_cursor_bo);
	drm_gem_object_unreference_unlocked(mdp4_kms->blank_cursor_bo);


	if (aspace) {
	if (aspace) {
@@ -510,7 +510,7 @@ struct msm_kms *mdp4_kms_init(struct drm_device *dev)
			goto fail;
			goto fail;
		}
		}


		mdp4_kms->aspace = aspace;
		kms->aspace = aspace;


		ret = aspace->mmu->funcs->attach(aspace->mmu, iommu_ports,
		ret = aspace->mmu->funcs->attach(aspace->mmu, iommu_ports,
				ARRAY_SIZE(iommu_ports));
				ARRAY_SIZE(iommu_ports));
@@ -522,9 +522,9 @@ struct msm_kms *mdp4_kms_init(struct drm_device *dev)
		aspace = NULL;
		aspace = NULL;
	}
	}


	mdp4_kms->id = msm_register_address_space(dev, aspace);
	kms->id = msm_register_address_space(dev, aspace);
	if (mdp4_kms->id < 0) {
	if (kms->id < 0) {
		ret = mdp4_kms->id;
		ret = kms->id;
		dev_err(dev->dev, "failed to register mdp4 iommu: %d\n", ret);
		dev_err(dev->dev, "failed to register mdp4 iommu: %d\n", ret);
		goto fail;
		goto fail;
	}
	}
@@ -545,7 +545,7 @@ struct msm_kms *mdp4_kms_init(struct drm_device *dev)
		goto fail;
		goto fail;
	}
	}


	ret = msm_gem_get_iova(mdp4_kms->blank_cursor_bo, mdp4_kms->id,
	ret = msm_gem_get_iova(mdp4_kms->blank_cursor_bo, kms->id,
			&mdp4_kms->blank_cursor_iova);
			&mdp4_kms->blank_cursor_iova);
	if (ret) {
	if (ret) {
		dev_err(dev->dev, "could not pin blank-cursor bo: %d\n", ret);
		dev_err(dev->dev, "could not pin blank-cursor bo: %d\n", ret);
+0 −4
Original line number Original line Diff line number Diff line
@@ -34,9 +34,6 @@ struct mdp4_kms {


	int rev;
	int rev;


	/* mapper-id used to request GEM buffer mapped for scanout: */
	int id;

	void __iomem *mmio;
	void __iomem *mmio;


	struct regulator *vdd;
	struct regulator *vdd;
@@ -45,7 +42,6 @@ struct mdp4_kms {
	struct clk *pclk;
	struct clk *pclk;
	struct clk *lut_clk;
	struct clk *lut_clk;
	struct clk *axi_clk;
	struct clk *axi_clk;
	struct msm_gem_address_space *aspace;


	struct mdp_irq error_handler;
	struct mdp_irq error_handler;


+9 −6
Original line number Original line Diff line number Diff line
@@ -103,13 +103,14 @@ static int mdp4_plane_prepare_fb(struct drm_plane *plane,
{
{
	struct mdp4_plane *mdp4_plane = to_mdp4_plane(plane);
	struct mdp4_plane *mdp4_plane = to_mdp4_plane(plane);
	struct mdp4_kms *mdp4_kms = get_kms(plane);
	struct mdp4_kms *mdp4_kms = get_kms(plane);
	struct msm_kms *kms = &mdp4_kms->base.base;
	struct drm_framebuffer *fb = new_state->fb;
	struct drm_framebuffer *fb = new_state->fb;


	if (!fb)
	if (!fb)
		return 0;
		return 0;


	DBG("%s: prepare: FB[%u]", mdp4_plane->name, fb->base.id);
	DBG("%s: prepare: FB[%u]", mdp4_plane->name, fb->base.id);
	return msm_framebuffer_prepare(fb, mdp4_kms->id);
	return msm_framebuffer_prepare(fb, kms->id);
}
}


static void mdp4_plane_cleanup_fb(struct drm_plane *plane,
static void mdp4_plane_cleanup_fb(struct drm_plane *plane,
@@ -117,13 +118,14 @@ static void mdp4_plane_cleanup_fb(struct drm_plane *plane,
{
{
	struct mdp4_plane *mdp4_plane = to_mdp4_plane(plane);
	struct mdp4_plane *mdp4_plane = to_mdp4_plane(plane);
	struct mdp4_kms *mdp4_kms = get_kms(plane);
	struct mdp4_kms *mdp4_kms = get_kms(plane);
	struct msm_kms *kms = &mdp4_kms->base.base;
	struct drm_framebuffer *fb = old_state->fb;
	struct drm_framebuffer *fb = old_state->fb;


	if (!fb)
	if (!fb)
		return;
		return;


	DBG("%s: cleanup: FB[%u]", mdp4_plane->name, fb->base.id);
	DBG("%s: cleanup: FB[%u]", mdp4_plane->name, fb->base.id);
	msm_framebuffer_cleanup(fb, mdp4_kms->id);
	msm_framebuffer_cleanup(fb, kms->id);
}
}




@@ -161,6 +163,7 @@ static void mdp4_plane_set_scanout(struct drm_plane *plane,
{
{
	struct mdp4_plane *mdp4_plane = to_mdp4_plane(plane);
	struct mdp4_plane *mdp4_plane = to_mdp4_plane(plane);
	struct mdp4_kms *mdp4_kms = get_kms(plane);
	struct mdp4_kms *mdp4_kms = get_kms(plane);
	struct msm_kms *kms = &mdp4_kms->base.base;
	enum mdp4_pipe pipe = mdp4_plane->pipe;
	enum mdp4_pipe pipe = mdp4_plane->pipe;


	mdp4_write(mdp4_kms, REG_MDP4_PIPE_SRC_STRIDE_A(pipe),
	mdp4_write(mdp4_kms, REG_MDP4_PIPE_SRC_STRIDE_A(pipe),
@@ -172,13 +175,13 @@ static void mdp4_plane_set_scanout(struct drm_plane *plane,
			MDP4_PIPE_SRC_STRIDE_B_P3(fb->pitches[3]));
			MDP4_PIPE_SRC_STRIDE_B_P3(fb->pitches[3]));


	mdp4_write(mdp4_kms, REG_MDP4_PIPE_SRCP0_BASE(pipe),
	mdp4_write(mdp4_kms, REG_MDP4_PIPE_SRCP0_BASE(pipe),
			msm_framebuffer_iova(fb, mdp4_kms->id, 0));
			msm_framebuffer_iova(fb, kms->id, 0));
	mdp4_write(mdp4_kms, REG_MDP4_PIPE_SRCP1_BASE(pipe),
	mdp4_write(mdp4_kms, REG_MDP4_PIPE_SRCP1_BASE(pipe),
			msm_framebuffer_iova(fb, mdp4_kms->id, 1));
			msm_framebuffer_iova(fb, kms->id, 1));
	mdp4_write(mdp4_kms, REG_MDP4_PIPE_SRCP2_BASE(pipe),
	mdp4_write(mdp4_kms, REG_MDP4_PIPE_SRCP2_BASE(pipe),
			msm_framebuffer_iova(fb, mdp4_kms->id, 2));
			msm_framebuffer_iova(fb, kms->id, 2));
	mdp4_write(mdp4_kms, REG_MDP4_PIPE_SRCP3_BASE(pipe),
	mdp4_write(mdp4_kms, REG_MDP4_PIPE_SRCP3_BASE(pipe),
			msm_framebuffer_iova(fb, mdp4_kms->id, 3));
			msm_framebuffer_iova(fb, kms->id, 3));


	plane->fb = fb;
	plane->fb = fb;
}
}
Loading