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

Commit 2bdc3a1a authored by qctecmdr's avatar qctecmdr Committed by Gerrit - the friendly Code Review server
Browse files

Merge "disp: msm: sde: validate plane mode and gem obj flags"

parents d403cd67 7e3076e5
Loading
Loading
Loading
Loading
+3 −2
Original line number Diff line number Diff line
/*
 * Copyright (c) 2016-2019, The Linux Foundation. All rights reserved.
 * Copyright (c) 2016-2020, The Linux Foundation. All rights reserved.
 * Copyright (C) 2013 Red Hat
 * Author: Rob Clark <robdclark@gmail.com>
 *
@@ -879,7 +879,8 @@ struct drm_framebuffer *msm_framebuffer_create(struct drm_device *dev,
		struct drm_file *file, const struct drm_mode_fb_cmd2 *mode_cmd);
struct drm_framebuffer * msm_alloc_stolen_fb(struct drm_device *dev,
		int w, int h, int p, uint32_t format);

int msm_fb_obj_get_attrs(struct drm_gem_object *obj, int *fb_ns,
		int *fb_sec, int *fb_sec_dir, unsigned long *flags);
struct drm_fb_helper *msm_fbdev_init(struct drm_device *dev);
void msm_fbdev_free(struct drm_device *dev);

+29 −0
Original line number Diff line number Diff line
@@ -18,6 +18,7 @@

#include <linux/dma-mapping.h>
#include <linux/dma-buf.h>
#include <linux/msm_ion.h>
#include <drm/drm_crtc.h>
#include <drm/drm_crtc_helper.h>
#include <drm/drm_gem_framebuffer_helper.h>
@@ -527,3 +528,31 @@ msm_alloc_stolen_fb(struct drm_device *dev, int w, int h, int p, uint32_t format

	return fb;
}

int msm_fb_obj_get_attrs(struct drm_gem_object *obj, int *fb_ns,
	 int *fb_sec, int *fb_sec_dir, unsigned long *flags)
{

	int ret = 0;

	if (!obj->import_attach) {
		DRM_ERROR("NULL attachment in drm gem object\n");
		return -EINVAL;
	}

	ret = dma_buf_get_flags(obj->import_attach->dmabuf, flags);
	if (ret) {
		DRM_ERROR("dma_buf_get_flags failure, err=%d\n", ret);
		return ret;
	}

	if (!(*flags & ION_FLAG_SECURE))
		*fb_ns = 1;
	else if (*flags & ION_FLAG_CP_PIXEL)
		*fb_sec = 1;
	else if (*flags & (ION_FLAG_CP_SEC_DISPLAY |
			ION_FLAG_CP_CAMERA_PREVIEW))
		*fb_sec_dir = 1;

	return ret;
}
+38 −0
Original line number Diff line number Diff line
@@ -2562,6 +2562,39 @@ static int _sde_plane_validate_shared_crtc(struct sde_plane *psde,

}

static int _sde_plane_validate_fb(struct sde_plane *psde,
				struct drm_plane_state *state)
{
	struct sde_plane_state *pstate;
	struct drm_framebuffer *fb;
	uint32_t fb_ns = 0, fb_sec = 0, fb_sec_dir = 0;
	unsigned long flags = 0;
	int mode, ret = 0, n, i;

	pstate = to_sde_plane_state(state);
	mode = sde_plane_get_property(pstate,
				PLANE_PROP_FB_TRANSLATION_MODE);

	fb = state->fb;
	n = fb->format->num_planes;
	for (i = 0; i < n; i++) {
		ret = msm_fb_obj_get_attrs(fb->obj[i], &fb_ns, &fb_sec,
			&fb_sec_dir, &flags);

		if ((fb_ns && (mode != SDE_DRM_FB_NON_SEC)) ||
			(fb_sec && (mode != SDE_DRM_FB_SEC)) ||
			(fb_sec_dir && (mode != SDE_DRM_FB_SEC_DIR_TRANS))) {
			SDE_ERROR_PLANE(psde, "mode:%d fb:%d flag:0x%x rc:%d\n",
			mode, fb->base.id, flags, ret);
			SDE_EVT32(psde->base.base.id, fb->base.id, flags,
			fb_ns, fb_sec, fb_sec_dir, ret, SDE_EVTLOG_ERROR);
			return -EINVAL;
		}
	}

	return 0;
}

static int sde_plane_sspp_atomic_check(struct drm_plane *plane,
		struct drm_plane_state *state)
{
@@ -2672,6 +2705,11 @@ static int sde_plane_sspp_atomic_check(struct drm_plane *plane,

	ret = _sde_plane_validate_shared_crtc(psde, state);

	if (ret)
		return ret;

	ret = _sde_plane_validate_fb(psde, state);

	if (ret)
		return ret;