Loading msm/msm_drv.h +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> * Loading Loading @@ -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); Loading msm/msm_fb.c +29 −0 Original line number Diff line number Diff line Loading @@ -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> Loading Loading @@ -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; } msm/sde/sde_plane.c +38 −0 Original line number Diff line number Diff line Loading @@ -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) { Loading Loading @@ -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; Loading Loading
msm/msm_drv.h +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> * Loading Loading @@ -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); Loading
msm/msm_fb.c +29 −0 Original line number Diff line number Diff line Loading @@ -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> Loading Loading @@ -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; }
msm/sde/sde_plane.c +38 −0 Original line number Diff line number Diff line Loading @@ -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) { Loading Loading @@ -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; Loading