* [DPU PATCH 0/7] clean up DPU custom properties
@ 2018-05-23 19:30 Jeykumar Sankaran
[not found] ` <1527103862-13934-1-git-send-email-jsanka-sgV2jX0FEOL9JmXXK+q4OQ@public.gmane.org>
2018-05-23 19:31 ` [DPU PATCH 7/7] drm/msm: remove dpu specific uapi header Jeykumar Sankaran
0 siblings, 2 replies; 18+ messages in thread
From: Jeykumar Sankaran @ 2018-05-23 19:30 UTC (permalink / raw)
To: dri-devel-PD4FTy7X32lNgt0PjOBp9y5qC8QIuHrW,
freedreno-PD4FTy7X32lNgt0PjOBp9y5qC8QIuHrW,
linux-arm-msm-u79uwXL29TY76Z2rM5mHXA
Cc: hoegsberg-hpIqsD4AKlfQT0dZR+AlfA, Jeykumar Sankaran,
seanpaul-F7+t8E8rja9g9hUCZPvPmw,
robdclark-Re5JQEeQqe8AvxtiuMwx3w
Submitting a series of patches to further clean up DPU driver by stripping
down a list of custom properties supporting proprietary features. It
removes the property installers/handlers and cleans up relevant files of
of some of the advanced features. This series is based on the patch[1]
available on the drm-next tip.
[1]https://patchwork.kernel.org/patch/10202847/
Thanks.
Jeykumar Sankaran (7):
drm/msm: remove connector custom properties
drm/msm/dpu: clean up dpu plane custom properties
drm/msm: enable zpos normalization
drm/msm/dpu: switch to drm zpos property
drm/msm/dpu: clean up dpu crtc custom properties
drm/msm: remove msm_prop files
drm/msm: remove dpu specific uapi header
Makefile | 2 +-
drivers/gpu/drm/msm/Makefile | 10 -
drivers/gpu/drm/msm/disp/dpu1/dpu_ad4.h | 99 --
.../gpu/drm/msm/disp/dpu1/dpu_color_processing.c | 1521 --------------------
.../gpu/drm/msm/disp/dpu1/dpu_color_processing.h | 120 --
drivers/gpu/drm/msm/disp/dpu1/dpu_core_perf.c | 30 -
drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c | 1271 +---------------
drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.h | 46 +-
drivers/gpu/drm/msm/disp/dpu1/dpu_encoder.c | 14 -
drivers/gpu/drm/msm/disp/dpu1/dpu_encoder.h | 2 -
.../gpu/drm/msm/disp/dpu1/dpu_encoder_phys_wb.c | 1 -
drivers/gpu/drm/msm/disp/dpu1/dpu_hw_ad4.c | 1443 -------------------
drivers/gpu/drm/msm/disp/dpu1/dpu_hw_catalog.c | 72 +-
drivers/gpu/drm/msm/disp/dpu1/dpu_hw_catalog.h | 89 --
.../msm/disp/dpu1/dpu_hw_color_proc_common_v4.h | 69 -
.../gpu/drm/msm/disp/dpu1/dpu_hw_color_proc_v4.c | 242 ----
.../gpu/drm/msm/disp/dpu1/dpu_hw_color_proc_v4.h | 40 -
.../drm/msm/disp/dpu1/dpu_hw_color_processing.h | 20 -
.../msm/disp/dpu1/dpu_hw_color_processing_v1_7.c | 565 --------
.../msm/disp/dpu1/dpu_hw_color_processing_v1_7.h | 92 --
drivers/gpu/drm/msm/disp/dpu1/dpu_hw_ctl.c | 44 -
drivers/gpu/drm/msm/disp/dpu1/dpu_hw_ctl.h | 15 -
drivers/gpu/drm/msm/disp/dpu1/dpu_hw_ds.c | 149 --
drivers/gpu/drm/msm/disp/dpu1/dpu_hw_ds.h | 111 --
drivers/gpu/drm/msm/disp/dpu1/dpu_hw_dspp.c | 209 ---
drivers/gpu/drm/msm/disp/dpu1/dpu_hw_dspp.h | 220 ---
drivers/gpu/drm/msm/disp/dpu1/dpu_hw_lm.c | 68 +-
drivers/gpu/drm/msm/disp/dpu1/dpu_hw_lm.h | 14 -
drivers/gpu/drm/msm/disp/dpu1/dpu_hw_mdss.h | 58 +-
drivers/gpu/drm/msm/disp/dpu1/dpu_hw_pingpong.c | 68 -
drivers/gpu/drm/msm/disp/dpu1/dpu_hw_pingpong.h | 6 -
drivers/gpu/drm/msm/disp/dpu1/dpu_hw_reg_dma_v1.c | 757 ----------
drivers/gpu/drm/msm/disp/dpu1/dpu_hw_reg_dma_v1.h | 27 -
.../msm/disp/dpu1/dpu_hw_reg_dma_v1_color_proc.c | 943 ------------
.../msm/disp/dpu1/dpu_hw_reg_dma_v1_color_proc.h | 75 -
drivers/gpu/drm/msm/disp/dpu1/dpu_hw_sspp.c | 219 ---
drivers/gpu/drm/msm/disp/dpu1/dpu_hw_sspp.h | 73 -
drivers/gpu/drm/msm/disp/dpu1/dpu_hw_util.c | 1 -
drivers/gpu/drm/msm/disp/dpu1/dpu_hw_util.h | 156 ++
drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c | 3 -
drivers/gpu/drm/msm/disp/dpu1/dpu_plane.c | 1404 ++----------------
drivers/gpu/drm/msm/disp/dpu1/dpu_plane.h | 43 -
drivers/gpu/drm/msm/disp/dpu1/dpu_reg_dma.c | 139 --
drivers/gpu/drm/msm/disp/dpu1/dpu_reg_dma.h | 310 ----
drivers/gpu/drm/msm/disp/dpu1/dpu_rm.c | 149 +-
drivers/gpu/drm/msm/disp/dpu1/dpu_rm.h | 2 -
drivers/gpu/drm/msm/disp/dpu1/dpu_wb.c | 2 -
drivers/gpu/drm/msm/msm_drv.c | 3 +
drivers/gpu/drm/msm/msm_drv.h | 86 +-
drivers/gpu/drm/msm/msm_prop.c | 688 ---------
drivers/gpu/drm/msm/msm_prop.h | 438 ------
include/uapi/drm/dpu_drm.h | 407 ------
include/uapi/drm/msm_drm.h | 1 -
include/uapi/drm/msm_drm_pp.h | 345 -----
54 files changed, 296 insertions(+), 12685 deletions(-)
delete mode 100644 drivers/gpu/drm/msm/disp/dpu1/dpu_ad4.h
delete mode 100644 drivers/gpu/drm/msm/disp/dpu1/dpu_color_processing.c
delete mode 100644 drivers/gpu/drm/msm/disp/dpu1/dpu_color_processing.h
delete mode 100644 drivers/gpu/drm/msm/disp/dpu1/dpu_hw_ad4.c
delete mode 100644 drivers/gpu/drm/msm/disp/dpu1/dpu_hw_color_proc_common_v4.h
delete mode 100644 drivers/gpu/drm/msm/disp/dpu1/dpu_hw_color_proc_v4.c
delete mode 100644 drivers/gpu/drm/msm/disp/dpu1/dpu_hw_color_proc_v4.h
delete mode 100644 drivers/gpu/drm/msm/disp/dpu1/dpu_hw_color_processing.h
delete mode 100644 drivers/gpu/drm/msm/disp/dpu1/dpu_hw_color_processing_v1_7.c
delete mode 100644 drivers/gpu/drm/msm/disp/dpu1/dpu_hw_color_processing_v1_7.h
delete mode 100644 drivers/gpu/drm/msm/disp/dpu1/dpu_hw_ds.c
delete mode 100644 drivers/gpu/drm/msm/disp/dpu1/dpu_hw_ds.h
delete mode 100644 drivers/gpu/drm/msm/disp/dpu1/dpu_hw_dspp.c
delete mode 100644 drivers/gpu/drm/msm/disp/dpu1/dpu_hw_dspp.h
delete mode 100644 drivers/gpu/drm/msm/disp/dpu1/dpu_hw_reg_dma_v1.c
delete mode 100644 drivers/gpu/drm/msm/disp/dpu1/dpu_hw_reg_dma_v1.h
delete mode 100644 drivers/gpu/drm/msm/disp/dpu1/dpu_hw_reg_dma_v1_color_proc.c
delete mode 100644 drivers/gpu/drm/msm/disp/dpu1/dpu_hw_reg_dma_v1_color_proc.h
delete mode 100644 drivers/gpu/drm/msm/disp/dpu1/dpu_reg_dma.c
delete mode 100644 drivers/gpu/drm/msm/disp/dpu1/dpu_reg_dma.h
delete mode 100644 drivers/gpu/drm/msm/msm_prop.c
delete mode 100644 drivers/gpu/drm/msm/msm_prop.h
delete mode 100644 include/uapi/drm/dpu_drm.h
delete mode 100644 include/uapi/drm/msm_drm_pp.h
--
The Qualcomm Innovation Center, Inc. is a member of the Code Aurora Forum,
a Linux Foundation Collaborative Project
_______________________________________________
Freedreno mailing list
Freedreno@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/freedreno
^ permalink raw reply [flat|nested] 18+ messages in thread
* [DPU PATCH 1/7] drm/msm: remove connector custom properties
[not found] ` <1527103862-13934-1-git-send-email-jsanka-sgV2jX0FEOL9JmXXK+q4OQ@public.gmane.org>
@ 2018-05-23 19:30 ` Jeykumar Sankaran
2018-06-04 19:53 ` Sean Paul
2018-05-23 19:30 ` [DPU PATCH 2/7] drm/msm/dpu: clean up dpu plane " Jeykumar Sankaran
` (4 subsequent siblings)
5 siblings, 1 reply; 18+ messages in thread
From: Jeykumar Sankaran @ 2018-05-23 19:30 UTC (permalink / raw)
To: dri-devel-PD4FTy7X32lNgt0PjOBp9y5qC8QIuHrW,
freedreno-PD4FTy7X32lNgt0PjOBp9y5qC8QIuHrW,
linux-arm-msm-u79uwXL29TY76Z2rM5mHXA
Cc: hoegsberg-hpIqsD4AKlfQT0dZR+AlfA, Jeykumar Sankaran,
seanpaul-F7+t8E8rja9g9hUCZPvPmw,
robdclark-Re5JQEeQqe8AvxtiuMwx3w
Cleanup residual connector property enumerations.
Signed-off-by: Jeykumar Sankaran <jsanka@codeaurora.org>
---
drivers/gpu/drm/msm/msm_drv.h | 27 ---------------------------
1 file changed, 27 deletions(-)
diff --git a/drivers/gpu/drm/msm/msm_drv.h b/drivers/gpu/drm/msm/msm_drv.h
index 90a2521..954ac12 100644
--- a/drivers/gpu/drm/msm/msm_drv.h
+++ b/drivers/gpu/drm/msm/msm_drv.h
@@ -140,32 +140,6 @@ enum msm_mdp_crtc_property {
CRTC_PROP_COUNT
};
-enum msm_mdp_conn_property {
- /* blob properties, always put these first */
- CONNECTOR_PROP_DPU_INFO,
- CONNECTOR_PROP_HDR_INFO,
- CONNECTOR_PROP_PP_DITHER,
-
- /* # of blob properties */
- CONNECTOR_PROP_BLOBCOUNT,
-
- /* range properties */
- CONNECTOR_PROP_OUT_FB = CONNECTOR_PROP_BLOBCOUNT,
- CONNECTOR_PROP_DST_X,
- CONNECTOR_PROP_DST_Y,
- CONNECTOR_PROP_DST_W,
- CONNECTOR_PROP_DST_H,
- CONNECTOR_PROP_BL_SCALE,
- CONNECTOR_PROP_AD_BL_SCALE,
-
- /* enum/bitmask properties */
- CONNECTOR_PROP_AUTOREFRESH,
- CONNECTOR_PROP_LP,
-
- /* total # of properties */
- CONNECTOR_PROP_COUNT
-};
-
struct msm_vblank_ctrl {
struct kthread_work work;
struct list_head event_list;
@@ -434,7 +408,6 @@ struct msm_drm_private {
/* Properties */
struct drm_property *plane_property[PLANE_PROP_COUNT];
struct drm_property *crtc_property[CRTC_PROP_COUNT];
- struct drm_property *conn_property[CONNECTOR_PROP_COUNT];
/* Color processing properties for the crtc */
struct drm_property **cp_property;
--
The Qualcomm Innovation Center, Inc. is a member of the Code Aurora Forum,
a Linux Foundation Collaborative Project
_______________________________________________
Freedreno mailing list
Freedreno@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/freedreno
^ permalink raw reply related [flat|nested] 18+ messages in thread
* [DPU PATCH 2/7] drm/msm/dpu: clean up dpu plane custom properties
[not found] ` <1527103862-13934-1-git-send-email-jsanka-sgV2jX0FEOL9JmXXK+q4OQ@public.gmane.org>
2018-05-23 19:30 ` [DPU PATCH 1/7] drm/msm: remove connector " Jeykumar Sankaran
@ 2018-05-23 19:30 ` Jeykumar Sankaran
[not found] ` <1527103862-13934-3-git-send-email-jsanka-sgV2jX0FEOL9JmXXK+q4OQ@public.gmane.org>
2018-05-23 19:30 ` [DPU PATCH 3/7] drm/msm: enable zpos normalization Jeykumar Sankaran
` (3 subsequent siblings)
5 siblings, 1 reply; 18+ messages in thread
From: Jeykumar Sankaran @ 2018-05-23 19:30 UTC (permalink / raw)
To: dri-devel-PD4FTy7X32lNgt0PjOBp9y5qC8QIuHrW,
freedreno-PD4FTy7X32lNgt0PjOBp9y5qC8QIuHrW,
linux-arm-msm-u79uwXL29TY76Z2rM5mHXA
Cc: hoegsberg-hpIqsD4AKlfQT0dZR+AlfA, Jeykumar Sankaran,
seanpaul-F7+t8E8rja9g9hUCZPvPmw,
robdclark-Re5JQEeQqe8AvxtiuMwx3w
This change removes all the dpu plane custom properties
and its handlers.
Signed-off-by: Jeykumar Sankaran <jsanka@codeaurora.org>
---
Makefile | 2 +-
drivers/gpu/drm/msm/Makefile | 8 -
drivers/gpu/drm/msm/disp/dpu1/dpu_ad4.h | 99 --
.../gpu/drm/msm/disp/dpu1/dpu_color_processing.c | 1521 --------------------
.../gpu/drm/msm/disp/dpu1/dpu_color_processing.h | 120 --
drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c | 148 +-
drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.h | 3 +-
drivers/gpu/drm/msm/disp/dpu1/dpu_encoder.c | 2 -
.../gpu/drm/msm/disp/dpu1/dpu_encoder_phys_wb.c | 1 -
drivers/gpu/drm/msm/disp/dpu1/dpu_hw_ad4.c | 1443 -------------------
drivers/gpu/drm/msm/disp/dpu1/dpu_hw_catalog.c | 72 +-
drivers/gpu/drm/msm/disp/dpu1/dpu_hw_catalog.h | 89 --
.../msm/disp/dpu1/dpu_hw_color_proc_common_v4.h | 69 -
.../gpu/drm/msm/disp/dpu1/dpu_hw_color_proc_v4.c | 242 ----
.../gpu/drm/msm/disp/dpu1/dpu_hw_color_proc_v4.h | 40 -
.../drm/msm/disp/dpu1/dpu_hw_color_processing.h | 20 -
.../msm/disp/dpu1/dpu_hw_color_processing_v1_7.c | 565 --------
.../msm/disp/dpu1/dpu_hw_color_processing_v1_7.h | 92 --
drivers/gpu/drm/msm/disp/dpu1/dpu_hw_ctl.c | 44 -
drivers/gpu/drm/msm/disp/dpu1/dpu_hw_ctl.h | 15 -
drivers/gpu/drm/msm/disp/dpu1/dpu_hw_dspp.c | 209 ---
drivers/gpu/drm/msm/disp/dpu1/dpu_hw_dspp.h | 220 ---
drivers/gpu/drm/msm/disp/dpu1/dpu_hw_lm.c | 1 +
drivers/gpu/drm/msm/disp/dpu1/dpu_hw_mdss.h | 44 +-
drivers/gpu/drm/msm/disp/dpu1/dpu_hw_pingpong.c | 68 -
drivers/gpu/drm/msm/disp/dpu1/dpu_hw_pingpong.h | 6 -
drivers/gpu/drm/msm/disp/dpu1/dpu_hw_reg_dma_v1.c | 757 ----------
drivers/gpu/drm/msm/disp/dpu1/dpu_hw_reg_dma_v1.h | 27 -
.../msm/disp/dpu1/dpu_hw_reg_dma_v1_color_proc.c | 943 ------------
.../msm/disp/dpu1/dpu_hw_reg_dma_v1_color_proc.h | 75 -
drivers/gpu/drm/msm/disp/dpu1/dpu_hw_sspp.c | 219 ---
drivers/gpu/drm/msm/disp/dpu1/dpu_hw_sspp.h | 73 -
drivers/gpu/drm/msm/disp/dpu1/dpu_hw_util.c | 1 -
drivers/gpu/drm/msm/disp/dpu1/dpu_hw_util.h | 156 ++
drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c | 3 -
drivers/gpu/drm/msm/disp/dpu1/dpu_plane.c | 1267 +---------------
drivers/gpu/drm/msm/disp/dpu1/dpu_plane.h | 31 -
drivers/gpu/drm/msm/disp/dpu1/dpu_reg_dma.c | 139 --
drivers/gpu/drm/msm/disp/dpu1/dpu_reg_dma.h | 310 ----
drivers/gpu/drm/msm/disp/dpu1/dpu_rm.c | 102 +-
drivers/gpu/drm/msm/disp/dpu1/dpu_rm.h | 2 -
drivers/gpu/drm/msm/disp/dpu1/dpu_wb.c | 2 -
drivers/gpu/drm/msm/msm_drv.h | 28 -
include/uapi/drm/dpu_drm.h | 187 ---
include/uapi/drm/msm_drm.h | 1 -
45 files changed, 277 insertions(+), 9189 deletions(-)
delete mode 100644 drivers/gpu/drm/msm/disp/dpu1/dpu_ad4.h
delete mode 100644 drivers/gpu/drm/msm/disp/dpu1/dpu_color_processing.c
delete mode 100644 drivers/gpu/drm/msm/disp/dpu1/dpu_color_processing.h
delete mode 100644 drivers/gpu/drm/msm/disp/dpu1/dpu_hw_ad4.c
delete mode 100644 drivers/gpu/drm/msm/disp/dpu1/dpu_hw_color_proc_common_v4.h
delete mode 100644 drivers/gpu/drm/msm/disp/dpu1/dpu_hw_color_proc_v4.c
delete mode 100644 drivers/gpu/drm/msm/disp/dpu1/dpu_hw_color_proc_v4.h
delete mode 100644 drivers/gpu/drm/msm/disp/dpu1/dpu_hw_color_processing.h
delete mode 100644 drivers/gpu/drm/msm/disp/dpu1/dpu_hw_color_processing_v1_7.c
delete mode 100644 drivers/gpu/drm/msm/disp/dpu1/dpu_hw_color_processing_v1_7.h
delete mode 100644 drivers/gpu/drm/msm/disp/dpu1/dpu_hw_dspp.c
delete mode 100644 drivers/gpu/drm/msm/disp/dpu1/dpu_hw_dspp.h
delete mode 100644 drivers/gpu/drm/msm/disp/dpu1/dpu_hw_reg_dma_v1.c
delete mode 100644 drivers/gpu/drm/msm/disp/dpu1/dpu_hw_reg_dma_v1.h
delete mode 100644 drivers/gpu/drm/msm/disp/dpu1/dpu_hw_reg_dma_v1_color_proc.c
delete mode 100644 drivers/gpu/drm/msm/disp/dpu1/dpu_hw_reg_dma_v1_color_proc.h
delete mode 100644 drivers/gpu/drm/msm/disp/dpu1/dpu_reg_dma.c
delete mode 100644 drivers/gpu/drm/msm/disp/dpu1/dpu_reg_dma.h
diff --git a/Makefile b/Makefile
index 3c00040..1f23c66 100644
--- a/Makefile
+++ b/Makefile
@@ -364,7 +364,7 @@ HOST_LFS_LIBS := $(shell getconf LFS_LIBS)
HOSTCC = gcc
HOSTCXX = g++
HOSTCFLAGS := -Wall -Wmissing-prototypes -Wstrict-prototypes -O2 \
- -fomit-frame-pointer -std=gnu89 $(HOST_LFS_CFLAGS)
+ -fomit-frame-pointer -std=gnu89 -Wmaybe-uninitialized $(HOST_LFS_CFLAGS)
HOSTCXXFLAGS := -O2 $(HOST_LFS_CFLAGS)
HOSTLDFLAGS := $(HOST_LFS_LDFLAGS)
HOST_LOADLIBES := $(HOST_LFS_LIBS)
diff --git a/drivers/gpu/drm/msm/Makefile b/drivers/gpu/drm/msm/Makefile
index d7558ed..7bc3921 100644
--- a/drivers/gpu/drm/msm/Makefile
+++ b/drivers/gpu/drm/msm/Makefile
@@ -46,7 +46,6 @@ msm-y := \
disp/mdp5/mdp5_mixer.o \
disp/mdp5/mdp5_plane.o \
disp/mdp5/mdp5_smp.o \
- disp/dpu1/dpu_color_processing.o \
disp/dpu1/dpu_core_irq.o \
disp/dpu1/dpu_core_perf.o \
disp/dpu1/dpu_crtc.o \
@@ -54,21 +53,15 @@ msm-y := \
disp/dpu1/dpu_encoder_phys_cmd.o \
disp/dpu1/dpu_encoder_phys_vid.o \
disp/dpu1/dpu_formats.o \
- disp/dpu1/dpu_hw_ad4.o \
disp/dpu1/dpu_hw_blk.o \
disp/dpu1/dpu_hw_catalog.o \
disp/dpu1/dpu_hw_cdm.o \
- disp/dpu1/dpu_hw_color_proc_v4.o \
- disp/dpu1/dpu_hw_color_processing_v1_7.o \
disp/dpu1/dpu_hw_ctl.o \
disp/dpu1/dpu_hw_ds.o \
- disp/dpu1/dpu_hw_dspp.o \
disp/dpu1/dpu_hw_interrupts.o \
disp/dpu1/dpu_hw_intf.o \
disp/dpu1/dpu_hw_lm.o \
disp/dpu1/dpu_hw_pingpong.o \
- disp/dpu1/dpu_hw_reg_dma_v1.o \
- disp/dpu1/dpu_hw_reg_dma_v1_color_proc.o \
disp/dpu1/dpu_hw_sspp.o \
disp/dpu1/dpu_hw_top.o \
disp/dpu1/dpu_hw_util.o \
@@ -78,7 +71,6 @@ msm-y := \
disp/dpu1/dpu_kms.o \
disp/dpu1/dpu_kms_utils.o \
disp/dpu1/dpu_plane.o \
- disp/dpu1/dpu_reg_dma.o \
disp/dpu1/dpu_rm.o \
disp/dpu1/dpu_vbif.o \
dpu_dbg.o \
diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_ad4.h b/drivers/gpu/drm/msm/disp/dpu1/dpu_ad4.h
deleted file mode 100644
index 5b70c4a..0000000
--- a/drivers/gpu/drm/msm/disp/dpu1/dpu_ad4.h
+++ /dev/null
@@ -1,99 +0,0 @@
-/* Copyright (c) 2017-2018, The Linux Foundation. All rights reserved.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 and
- * only version 2 as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- */
-#ifndef _DPU_AD4_H_
-#define _DPU_AD4_H_
-
-#include <drm/drm_mode.h>
-#include <drm/drm_property.h>
-#include "dpu_hw_dspp.h"
-
-/**
- * enum ad4_modes - ad4 modes supported by driver
- */
-enum ad4_modes {
- AD4_OFF,
- AD4_AUTO_STRENGTH,
- AD4_CALIBRATION,
- AD4_MANUAL,
-};
-
-/**
- * struct drm_prop_enum_list - drm structure for creating enum property and
- * enumerating values
- */
-static const struct drm_prop_enum_list ad4_modes[] = {
- {AD4_OFF, "off"},
- {AD4_AUTO_STRENGTH, "auto_strength_mode"},
- {AD4_CALIBRATION, "calibration_mode"},
- {AD4_MANUAL, "manual_mode"},
-};
-
-/**
- * enum ad_property - properties that can be set for ad
- */
-enum ad_property {
- AD_MODE,
- AD_INIT,
- AD_CFG,
- AD_INPUT,
- AD_SUSPEND,
- AD_ASSERTIVE,
- AD_BACKLIGHT,
- AD_IPC_SUSPEND,
- AD_IPC_RESUME,
- AD_IPC_RESET,
- AD_PROPMAX,
-};
-
-/**
- * enum ad_intr_resp_property - ad4 interrupt response enum
- */
-enum ad_intr_resp_property {
- AD4_BACKLIGHT,
- AD4_RESPMAX,
-};
-
-/**
- * struct dpu_ad_hw_cfg - structure for setting the ad properties
- * @prop: enum of ad property
- * @hw_cfg: payload for the prop being set.
- */
-struct dpu_ad_hw_cfg {
- enum ad_property prop;
- struct dpu_hw_cp_cfg *hw_cfg;
-};
-
-/**
- * dpu_validate_dspp_ad4() - api to validate if ad property is allowed for
- * the display with allocated dspp/mixers.
- * @dspp: pointer to dspp info structure.
- * @prop: pointer to u32 pointing to ad property
- */
-int dpu_validate_dspp_ad4(struct dpu_hw_dspp *dspp, u32 *prop);
-
-/**
- * dpu_setup_dspp_ad4 - api to apply the ad property, dpu_validate_dspp_ad4
- * should be called before call this function
- * @dspp: pointer to dspp info structure.
- * @cfg: pointer to struct dpu_ad_hw_cfg
- */
-void dpu_setup_dspp_ad4(struct dpu_hw_dspp *dspp, void *cfg);
-
-/**
- * dpu_read_intr_resp_ad4 - api to get ad4 interrupt status for event
- * @dspp: pointer to dspp object
- * @event: event for which response is needed
- * @resp: value of event requested
- */
-void dpu_read_intr_resp_ad4(struct dpu_hw_dspp *dspp, u32 event, u32 *resp);
-
-#endif /* _DPU_AD4_H_ */
diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_color_processing.c b/drivers/gpu/drm/msm/disp/dpu1/dpu_color_processing.c
deleted file mode 100644
index f13d1cc..0000000
--- a/drivers/gpu/drm/msm/disp/dpu1/dpu_color_processing.c
+++ /dev/null
@@ -1,1521 +0,0 @@
-/* Copyright (c) 2016-2018, The Linux Foundation. All rights reserved.
- *
- * This program is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 as published by
- * the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
- * more details.
- *
- * You should have received a copy of the GNU General Public License along with
- * this program. If not, see <http://www.gnu.org/licenses/>.
- */
-
-#define pr_fmt(fmt) "%s: " fmt, __func__
-
-#include <drm/msm_drm_pp.h>
-#include "dpu_color_processing.h"
-#include "dpu_kms.h"
-#include "dpu_crtc.h"
-#include "dpu_hw_dspp.h"
-#include "dpu_hw_lm.h"
-#include "dpu_ad4.h"
-#include "dpu_hw_interrupts.h"
-#include "dpu_core_irq.h"
-
-struct dpu_cp_node {
- u32 property_id;
- u32 prop_flags;
- u32 feature;
- void *blob_ptr;
- uint64_t prop_val;
- const struct dpu_pp_blk *pp_blk;
- struct list_head feature_list;
- struct list_head active_list;
- struct list_head dirty_list;
- bool is_dspp_feature;
- u32 prop_blob_sz;
- struct dpu_irq_callback *irq;
-};
-
-struct dpu_cp_prop_attach {
- struct drm_crtc *crtc;
- struct drm_property *prop;
- struct dpu_cp_node *prop_node;
- u32 feature;
- uint64_t val;
-};
-
-static void dspp_pcc_install_property(struct drm_crtc *crtc);
-
-static void dspp_hsic_install_property(struct drm_crtc *crtc);
-
-static void dspp_ad_install_property(struct drm_crtc *crtc);
-
-static void dspp_vlut_install_property(struct drm_crtc *crtc);
-
-static void dspp_gamut_install_property(struct drm_crtc *crtc);
-
-static void dspp_gc_install_property(struct drm_crtc *crtc);
-
-static void dspp_igc_install_property(struct drm_crtc *crtc);
-
-typedef void (*dspp_prop_install_func_t)(struct drm_crtc *crtc);
-
-static dspp_prop_install_func_t dspp_prop_install_func[DPU_DSPP_MAX];
-
-static void dpu_cp_update_list(struct dpu_cp_node *prop_node,
- struct dpu_crtc *crtc, bool dirty_list);
-
-static int dpu_cp_ad_validate_prop(struct dpu_cp_node *prop_node,
- struct dpu_crtc *crtc);
-
-static void dpu_cp_notify_ad_event(struct drm_crtc *crtc_drm, void *arg);
-
-static void dpu_cp_ad_set_prop(struct dpu_crtc *dpu_crtc,
- enum ad_property ad_prop);
-
-#define setup_dspp_prop_install_funcs(func) \
-do { \
- func[DPU_DSPP_PCC] = dspp_pcc_install_property; \
- func[DPU_DSPP_HSIC] = dspp_hsic_install_property; \
- func[DPU_DSPP_AD] = dspp_ad_install_property; \
- func[DPU_DSPP_VLUT] = dspp_vlut_install_property; \
- func[DPU_DSPP_GAMUT] = dspp_gamut_install_property; \
- func[DPU_DSPP_GC] = dspp_gc_install_property; \
- func[DPU_DSPP_IGC] = dspp_igc_install_property; \
-} while (0)
-
-typedef void (*lm_prop_install_func_t)(struct drm_crtc *crtc);
-
-static lm_prop_install_func_t lm_prop_install_func[DPU_MIXER_MAX];
-
-static void lm_gc_install_property(struct drm_crtc *crtc);
-
-#define setup_lm_prop_install_funcs(func) \
- (func[DPU_MIXER_GC] = lm_gc_install_property)
-
-enum {
- /* Append new DSPP features before DPU_CP_CRTC_DSPP_MAX */
- /* DSPP Features start */
- DPU_CP_CRTC_DSPP_IGC,
- DPU_CP_CRTC_DSPP_PCC,
- DPU_CP_CRTC_DSPP_GC,
- DPU_CP_CRTC_DSPP_HUE,
- DPU_CP_CRTC_DSPP_SAT,
- DPU_CP_CRTC_DSPP_VAL,
- DPU_CP_CRTC_DSPP_CONT,
- DPU_CP_CRTC_DSPP_MEMCOLOR,
- DPU_CP_CRTC_DSPP_SIXZONE,
- DPU_CP_CRTC_DSPP_GAMUT,
- DPU_CP_CRTC_DSPP_DITHER,
- DPU_CP_CRTC_DSPP_HIST,
- DPU_CP_CRTC_DSPP_AD,
- DPU_CP_CRTC_DSPP_VLUT,
- DPU_CP_CRTC_DSPP_AD_MODE,
- DPU_CP_CRTC_DSPP_AD_INIT,
- DPU_CP_CRTC_DSPP_AD_CFG,
- DPU_CP_CRTC_DSPP_AD_INPUT,
- DPU_CP_CRTC_DSPP_AD_ASSERTIVENESS,
- DPU_CP_CRTC_DSPP_AD_BACKLIGHT,
- DPU_CP_CRTC_DSPP_MAX,
- /* DSPP features end */
-
- /* Append new LM features before DPU_CP_CRTC_MAX_FEATURES */
- /* LM feature start*/
- DPU_CP_CRTC_LM_GC,
- /* LM feature end*/
-
- DPU_CP_CRTC_MAX_FEATURES,
-};
-
-#define INIT_PROP_ATTACH(p, crtc, prop, node, feature, val) \
- do { \
- (p)->crtc = crtc; \
- (p)->prop = prop; \
- (p)->prop_node = node; \
- (p)->feature = feature; \
- (p)->val = val; \
- } while (0)
-
-static void dpu_cp_get_hw_payload(struct dpu_cp_node *prop_node,
- struct dpu_hw_cp_cfg *hw_cfg,
- bool *feature_enabled)
-{
-
- struct drm_property_blob *blob = NULL;
-
- memset(hw_cfg, 0, sizeof(*hw_cfg));
- *feature_enabled = false;
-
- blob = prop_node->blob_ptr;
- if (prop_node->prop_flags & DRM_MODE_PROP_BLOB) {
- if (blob) {
- hw_cfg->len = blob->length;
- hw_cfg->payload = blob->data;
- *feature_enabled = true;
- }
- } else if (prop_node->prop_flags & DRM_MODE_PROP_RANGE) {
- /* Check if local blob is Set */
- if (!blob) {
- if (prop_node->prop_val) {
- hw_cfg->len = sizeof(prop_node->prop_val);
- hw_cfg->payload = &prop_node->prop_val;
- }
- } else {
- hw_cfg->len = (prop_node->prop_val) ? blob->length :
- 0;
- hw_cfg->payload = (prop_node->prop_val) ? blob->data
- : NULL;
- }
- if (prop_node->prop_val)
- *feature_enabled = true;
- } else if (prop_node->prop_flags & DRM_MODE_PROP_ENUM) {
- *feature_enabled = (prop_node->prop_val != 0);
- hw_cfg->len = sizeof(prop_node->prop_val);
- hw_cfg->payload = &prop_node->prop_val;
- } else {
- DRM_ERROR("property type is not supported\n");
- }
-}
-
-static int dpu_cp_disable_crtc_blob_property(struct dpu_cp_node *prop_node)
-{
- struct drm_property_blob *blob = prop_node->blob_ptr;
-
- if (!blob)
- return 0;
- drm_property_blob_put(blob);
- prop_node->blob_ptr = NULL;
- return 0;
-}
-
-static int dpu_cp_create_local_blob(struct drm_crtc *crtc, u32 feature, int len)
-{
- int ret = -EINVAL;
- bool found = false;
- struct dpu_cp_node *prop_node = NULL;
- struct drm_property_blob *blob_ptr;
- struct dpu_crtc *dpu_crtc = to_dpu_crtc(crtc);
-
- list_for_each_entry(prop_node, &dpu_crtc->feature_list, feature_list) {
- if (prop_node->feature == feature) {
- found = true;
- break;
- }
- }
-
- if (!found || !(prop_node->prop_flags & DRM_MODE_PROP_RANGE)) {
- DRM_ERROR("local blob create failed prop found %d flags %d\n",
- found, prop_node->prop_flags);
- return ret;
- }
-
- blob_ptr = drm_property_create_blob(crtc->dev, len, NULL);
- ret = (IS_ERR_OR_NULL(blob_ptr)) ? PTR_ERR(blob_ptr) : 0;
- if (!ret)
- prop_node->blob_ptr = blob_ptr;
-
- return ret;
-}
-
-static void dpu_cp_destroy_local_blob(struct dpu_cp_node *prop_node)
-{
- if (!(prop_node->prop_flags & DRM_MODE_PROP_BLOB) &&
- prop_node->blob_ptr)
- drm_property_blob_put(prop_node->blob_ptr);
-}
-
-static int dpu_cp_handle_range_property(struct dpu_cp_node *prop_node,
- uint64_t val)
-{
- int ret = 0;
- struct drm_property_blob *blob_ptr = prop_node->blob_ptr;
-
- if (!blob_ptr) {
- prop_node->prop_val = val;
- return 0;
- }
-
- if (!val) {
- prop_node->prop_val = 0;
- return 0;
- }
-
- ret = copy_from_user(blob_ptr->data, u64_to_user_ptr(val),
- blob_ptr->length);
- if (ret) {
- DRM_ERROR("failed to get the property info ret %d", ret);
- ret = -EFAULT;
- } else {
- prop_node->prop_val = val;
- }
-
- return ret;
-}
-
-static int dpu_cp_disable_crtc_property(struct drm_crtc *crtc,
- struct drm_property *property,
- struct dpu_cp_node *prop_node)
-{
- int ret = -EINVAL;
-
- if (property->flags & DRM_MODE_PROP_BLOB) {
- ret = dpu_cp_disable_crtc_blob_property(prop_node);
- } else if (property->flags & DRM_MODE_PROP_RANGE) {
- ret = dpu_cp_handle_range_property(prop_node, 0);
- } else if (property->flags & DRM_MODE_PROP_ENUM) {
- ret = 0;
- prop_node->prop_val = 0;
- }
- return ret;
-}
-
-static int dpu_cp_enable_crtc_blob_property(struct drm_crtc *crtc,
- struct dpu_cp_node *prop_node,
- uint64_t val)
-{
- struct drm_property_blob *blob = NULL;
-
- /**
- * For non-blob based properties add support to create a blob
- * using the val and store the blob_ptr in prop_node.
- */
- blob = drm_property_lookup_blob(crtc->dev, val);
- if (!blob) {
- DRM_ERROR("invalid blob id %lld\n", val);
- return -EINVAL;
- }
- if (blob->length != prop_node->prop_blob_sz) {
- DRM_ERROR("invalid blob len %zd exp %d feature %d\n",
- blob->length, prop_node->prop_blob_sz, prop_node->feature);
- drm_property_blob_put(blob);
- return -EINVAL;
- }
- /* Release refernce to existing payload of the property */
- if (prop_node->blob_ptr)
- drm_property_blob_put(prop_node->blob_ptr);
-
- prop_node->blob_ptr = blob;
- return 0;
-}
-
-static int dpu_cp_enable_crtc_property(struct drm_crtc *crtc,
- struct drm_property *property,
- struct dpu_cp_node *prop_node,
- uint64_t val)
-{
- int ret = -EINVAL;
-
- if (property->flags & DRM_MODE_PROP_BLOB) {
- ret = dpu_cp_enable_crtc_blob_property(crtc, prop_node, val);
- } else if (property->flags & DRM_MODE_PROP_RANGE) {
- ret = dpu_cp_handle_range_property(prop_node, val);
- } else if (property->flags & DRM_MODE_PROP_ENUM) {
- ret = 0;
- prop_node->prop_val = val;
- }
- return ret;
-}
-
-static struct dpu_kms *get_kms(struct drm_crtc *crtc)
-{
- struct msm_drm_private *priv = crtc->dev->dev_private;
-
- return to_dpu_kms(priv->kms);
-}
-
-static void dpu_cp_crtc_prop_attach(struct dpu_cp_prop_attach *prop_attach)
-{
-
- struct dpu_crtc *dpu_crtc = to_dpu_crtc(prop_attach->crtc);
-
- drm_object_attach_property(&prop_attach->crtc->base,
- prop_attach->prop, prop_attach->val);
-
- INIT_LIST_HEAD(&prop_attach->prop_node->active_list);
- INIT_LIST_HEAD(&prop_attach->prop_node->dirty_list);
-
- prop_attach->prop_node->property_id = prop_attach->prop->base.id;
- prop_attach->prop_node->prop_flags = prop_attach->prop->flags;
- prop_attach->prop_node->feature = prop_attach->feature;
-
- if (prop_attach->feature < DPU_CP_CRTC_DSPP_MAX)
- prop_attach->prop_node->is_dspp_feature = true;
- else
- prop_attach->prop_node->is_dspp_feature = false;
-
- list_add(&prop_attach->prop_node->feature_list,
- &dpu_crtc->feature_list);
-}
-
-void dpu_cp_crtc_init(struct drm_crtc *crtc)
-{
- struct dpu_crtc *dpu_crtc = NULL;
-
- if (!crtc) {
- DRM_ERROR("invalid crtc %pK\n", crtc);
- return;
- }
-
- dpu_crtc = to_dpu_crtc(crtc);
- if (!dpu_crtc) {
- DRM_ERROR("invalid dpu_crtc %pK\n", dpu_crtc);
- return;
- }
-
- INIT_LIST_HEAD(&dpu_crtc->active_list);
- INIT_LIST_HEAD(&dpu_crtc->dirty_list);
- INIT_LIST_HEAD(&dpu_crtc->feature_list);
- INIT_LIST_HEAD(&dpu_crtc->ad_dirty);
- INIT_LIST_HEAD(&dpu_crtc->ad_active);
-}
-
-static void dpu_cp_crtc_install_immutable_property(struct drm_crtc *crtc,
- char *name,
- u32 feature)
-{
- struct drm_property *prop;
- struct dpu_cp_node *prop_node = NULL;
- struct msm_drm_private *priv;
- struct dpu_cp_prop_attach prop_attach;
- uint64_t val = 0;
-
- if (feature >= DPU_CP_CRTC_MAX_FEATURES) {
- DRM_ERROR("invalid feature %d max %d\n", feature,
- DPU_CP_CRTC_MAX_FEATURES);
- return;
- }
-
- prop_node = kzalloc(sizeof(*prop_node), GFP_KERNEL);
- if (!prop_node)
- return;
-
- priv = crtc->dev->dev_private;
- prop = priv->cp_property[feature];
-
- if (!prop) {
- prop = drm_property_create_range(crtc->dev,
- DRM_MODE_PROP_IMMUTABLE, name, 0, 1);
- if (!prop) {
- DRM_ERROR("property create failed: %s\n", name);
- kfree(prop_node);
- return;
- }
- priv->cp_property[feature] = prop;
- }
-
- INIT_PROP_ATTACH(&prop_attach, crtc, prop, prop_node,
- feature, val);
- dpu_cp_crtc_prop_attach(&prop_attach);
-}
-
-static void dpu_cp_crtc_install_range_property(struct drm_crtc *crtc,
- char *name,
- u32 feature,
- uint64_t min, uint64_t max,
- uint64_t val)
-{
- struct drm_property *prop;
- struct dpu_cp_node *prop_node = NULL;
- struct msm_drm_private *priv;
- struct dpu_cp_prop_attach prop_attach;
-
- if (feature >= DPU_CP_CRTC_MAX_FEATURES) {
- DRM_ERROR("invalid feature %d max %d\n", feature,
- DPU_CP_CRTC_MAX_FEATURES);
- return;
- }
-
- prop_node = kzalloc(sizeof(*prop_node), GFP_KERNEL);
- if (!prop_node)
- return;
-
- priv = crtc->dev->dev_private;
- prop = priv->cp_property[feature];
-
- if (!prop) {
- prop = drm_property_create_range(crtc->dev, 0, name, min, max);
- if (!prop) {
- DRM_ERROR("property create failed: %s\n", name);
- kfree(prop_node);
- return;
- }
- priv->cp_property[feature] = prop;
- }
-
- INIT_PROP_ATTACH(&prop_attach, crtc, prop, prop_node,
- feature, val);
-
- dpu_cp_crtc_prop_attach(&prop_attach);
-}
-
-static void dpu_cp_crtc_install_blob_property(struct drm_crtc *crtc, char *name,
- u32 feature, u32 blob_sz)
-{
- struct drm_property *prop;
- struct dpu_cp_node *prop_node = NULL;
- struct msm_drm_private *priv;
- uint64_t val = 0;
- struct dpu_cp_prop_attach prop_attach;
-
- if (feature >= DPU_CP_CRTC_MAX_FEATURES) {
- DRM_ERROR("invalid feature %d max %d\n", feature,
- DPU_CP_CRTC_MAX_FEATURES);
- return;
- }
-
- prop_node = kzalloc(sizeof(*prop_node), GFP_KERNEL);
- if (!prop_node)
- return;
-
- priv = crtc->dev->dev_private;
- prop = priv->cp_property[feature];
-
- if (!prop) {
- prop = drm_property_create(crtc->dev,
- DRM_MODE_PROP_BLOB, name, 0);
- if (!prop) {
- DRM_ERROR("property create failed: %s\n", name);
- kfree(prop_node);
- return;
- }
- priv->cp_property[feature] = prop;
- }
-
- INIT_PROP_ATTACH(&prop_attach, crtc, prop, prop_node,
- feature, val);
- prop_node->prop_blob_sz = blob_sz;
-
- dpu_cp_crtc_prop_attach(&prop_attach);
-}
-
-static void dpu_cp_crtc_install_enum_property(struct drm_crtc *crtc,
- u32 feature, const struct drm_prop_enum_list *list, u32 enum_sz,
- char *name)
-{
- struct drm_property *prop;
- struct dpu_cp_node *prop_node = NULL;
- struct msm_drm_private *priv;
- uint64_t val = 0;
- struct dpu_cp_prop_attach prop_attach;
-
- if (feature >= DPU_CP_CRTC_MAX_FEATURES) {
- DRM_ERROR("invalid feature %d max %d\n", feature,
- DPU_CP_CRTC_MAX_FEATURES);
- return;
- }
-
- prop_node = kzalloc(sizeof(*prop_node), GFP_KERNEL);
- if (!prop_node)
- return;
-
- priv = crtc->dev->dev_private;
- prop = priv->cp_property[feature];
-
- if (!prop) {
- prop = drm_property_create_enum(crtc->dev, 0, name,
- list, enum_sz);
- if (!prop) {
- DRM_ERROR("property create failed: %s\n", name);
- kfree(prop_node);
- return;
- }
- priv->cp_property[feature] = prop;
- }
-
- INIT_PROP_ATTACH(&prop_attach, crtc, prop, prop_node,
- feature, val);
-
- dpu_cp_crtc_prop_attach(&prop_attach);
-}
-
-static void dpu_cp_crtc_setfeature(struct dpu_cp_node *prop_node,
- struct dpu_crtc *dpu_crtc)
-{
- struct dpu_hw_cp_cfg hw_cfg;
- struct dpu_hw_mixer *hw_lm;
- struct dpu_hw_dspp *hw_dspp;
- u32 num_mixers = dpu_crtc->num_mixers;
- int i = 0;
- bool feature_enabled = false;
- int ret = 0;
- struct dpu_ad_hw_cfg ad_cfg;
-
- dpu_cp_get_hw_payload(prop_node, &hw_cfg, &feature_enabled);
- hw_cfg.num_of_mixers = dpu_crtc->num_mixers;
- hw_cfg.displayh = dpu_crtc->base.mode.hdisplay;
- hw_cfg.displayv = dpu_crtc->base.mode.vdisplay;
- hw_cfg.last_feature = 0;
-
- for (i = 0; i < num_mixers && !ret; i++) {
- hw_lm = dpu_crtc->mixers[i].hw_lm;
- hw_dspp = dpu_crtc->mixers[i].hw_dspp;
- hw_cfg.ctl = dpu_crtc->mixers[i].hw_ctl;
- hw_cfg.mixer_info = hw_lm;
- switch (prop_node->feature) {
- case DPU_CP_CRTC_DSPP_VLUT:
- if (!hw_dspp || !hw_dspp->ops.setup_vlut) {
- ret = -EINVAL;
- continue;
- }
- hw_dspp->ops.setup_vlut(hw_dspp, &hw_cfg);
- break;
- case DPU_CP_CRTC_DSPP_PCC:
- if (!hw_dspp || !hw_dspp->ops.setup_pcc) {
- ret = -EINVAL;
- continue;
- }
- hw_dspp->ops.setup_pcc(hw_dspp, &hw_cfg);
- break;
- case DPU_CP_CRTC_DSPP_IGC:
- if (!hw_dspp || !hw_dspp->ops.setup_igc) {
- ret = -EINVAL;
- continue;
- }
- hw_dspp->ops.setup_igc(hw_dspp, &hw_cfg);
- break;
- case DPU_CP_CRTC_DSPP_GC:
- if (!hw_dspp || !hw_dspp->ops.setup_gc) {
- ret = -EINVAL;
- continue;
- }
- hw_dspp->ops.setup_gc(hw_dspp, &hw_cfg);
- break;
- case DPU_CP_CRTC_DSPP_HUE:
- if (!hw_dspp || !hw_dspp->ops.setup_hue) {
- ret = -EINVAL;
- continue;
- }
- hw_dspp->ops.setup_hue(hw_dspp, &hw_cfg);
- break;
- case DPU_CP_CRTC_DSPP_SAT:
- if (!hw_dspp || !hw_dspp->ops.setup_sat) {
- ret = -EINVAL;
- continue;
- }
- hw_dspp->ops.setup_sat(hw_dspp, &hw_cfg);
- break;
- case DPU_CP_CRTC_DSPP_VAL:
- if (!hw_dspp || !hw_dspp->ops.setup_val) {
- ret = -EINVAL;
- continue;
- }
- hw_dspp->ops.setup_val(hw_dspp, &hw_cfg);
- break;
- case DPU_CP_CRTC_DSPP_CONT:
- if (!hw_dspp || !hw_dspp->ops.setup_cont) {
- ret = -EINVAL;
- continue;
- }
- hw_dspp->ops.setup_cont(hw_dspp, &hw_cfg);
- break;
- case DPU_CP_CRTC_DSPP_MEMCOLOR:
- if (!hw_dspp || !hw_dspp->ops.setup_pa_memcolor) {
- ret = -EINVAL;
- continue;
- }
- hw_dspp->ops.setup_pa_memcolor(hw_dspp, &hw_cfg);
- break;
- case DPU_CP_CRTC_DSPP_SIXZONE:
- if (!hw_dspp || !hw_dspp->ops.setup_sixzone) {
- ret = -EINVAL;
- continue;
- }
- hw_dspp->ops.setup_sixzone(hw_dspp, &hw_cfg);
- break;
- case DPU_CP_CRTC_DSPP_GAMUT:
- if (!hw_dspp || !hw_dspp->ops.setup_gamut) {
- ret = -EINVAL;
- continue;
- }
- hw_dspp->ops.setup_gamut(hw_dspp, &hw_cfg);
- break;
- case DPU_CP_CRTC_LM_GC:
- if (!hw_lm || !hw_lm->ops.setup_gc) {
- ret = -EINVAL;
- continue;
- }
- hw_lm->ops.setup_gc(hw_lm, &hw_cfg);
- break;
- case DPU_CP_CRTC_DSPP_AD_MODE:
- if (!hw_dspp || !hw_dspp->ops.setup_ad) {
- ret = -EINVAL;
- continue;
- }
- ad_cfg.prop = AD_MODE;
- ad_cfg.hw_cfg = &hw_cfg;
- hw_dspp->ops.setup_ad(hw_dspp, &ad_cfg);
- break;
- case DPU_CP_CRTC_DSPP_AD_INIT:
- if (!hw_dspp || !hw_dspp->ops.setup_ad) {
- ret = -EINVAL;
- continue;
- }
- ad_cfg.prop = AD_INIT;
- ad_cfg.hw_cfg = &hw_cfg;
- hw_dspp->ops.setup_ad(hw_dspp, &ad_cfg);
- break;
- case DPU_CP_CRTC_DSPP_AD_CFG:
- if (!hw_dspp || !hw_dspp->ops.setup_ad) {
- ret = -EINVAL;
- continue;
- }
- ad_cfg.prop = AD_CFG;
- ad_cfg.hw_cfg = &hw_cfg;
- hw_dspp->ops.setup_ad(hw_dspp, &ad_cfg);
- break;
- case DPU_CP_CRTC_DSPP_AD_INPUT:
- if (!hw_dspp || !hw_dspp->ops.setup_ad) {
- ret = -EINVAL;
- continue;
- }
- ad_cfg.prop = AD_INPUT;
- ad_cfg.hw_cfg = &hw_cfg;
- hw_dspp->ops.setup_ad(hw_dspp, &ad_cfg);
- break;
- case DPU_CP_CRTC_DSPP_AD_ASSERTIVENESS:
- if (!hw_dspp || !hw_dspp->ops.setup_ad) {
- ret = -EINVAL;
- continue;
- }
- ad_cfg.prop = AD_ASSERTIVE;
- ad_cfg.hw_cfg = &hw_cfg;
- hw_dspp->ops.setup_ad(hw_dspp, &ad_cfg);
- break;
- case DPU_CP_CRTC_DSPP_AD_BACKLIGHT:
- if (!hw_dspp || !hw_dspp->ops.setup_ad) {
- ret = -EINVAL;
- continue;
- }
- ad_cfg.prop = AD_BACKLIGHT;
- ad_cfg.hw_cfg = &hw_cfg;
- hw_dspp->ops.setup_ad(hw_dspp, &ad_cfg);
- break;
- default:
- ret = -EINVAL;
- break;
- }
- }
-
- if (ret) {
- DRM_ERROR("failed to %s feature %d\n",
- ((feature_enabled) ? "enable" : "disable"),
- prop_node->feature);
- return;
- }
-
- if (feature_enabled) {
- DRM_DEBUG_DRIVER("Add feature to active list %d\n",
- prop_node->property_id);
- dpu_cp_update_list(prop_node, dpu_crtc, false);
- } else {
- DRM_DEBUG_DRIVER("remove feature from active list %d\n",
- prop_node->property_id);
- list_del_init(&prop_node->active_list);
- }
- /* Programming of feature done remove from dirty list */
- list_del_init(&prop_node->dirty_list);
-}
-
-void dpu_cp_crtc_apply_properties(struct drm_crtc *crtc)
-{
- struct dpu_crtc *dpu_crtc = NULL;
- bool set_dspp_flush = false, set_lm_flush = false;
- struct dpu_cp_node *prop_node = NULL, *n = NULL;
- struct dpu_hw_ctl *ctl;
- uint32_t flush_mask = 0;
- u32 num_mixers = 0, i = 0;
-
- if (!crtc || !crtc->dev) {
- DRM_ERROR("invalid crtc %pK dev %pK\n", crtc,
- (crtc ? crtc->dev : NULL));
- return;
- }
-
- dpu_crtc = to_dpu_crtc(crtc);
- if (!dpu_crtc) {
- DRM_ERROR("invalid dpu_crtc %pK\n", dpu_crtc);
- return;
- }
-
- num_mixers = dpu_crtc->num_mixers;
- if (!num_mixers) {
- DRM_DEBUG_DRIVER("no mixers for this crtc\n");
- return;
- }
-
- /* Check if dirty lists are empty and ad features are disabled for
- * early return. If ad properties are active then we need to issue
- * dspp flush.
- **/
- if (list_empty(&dpu_crtc->dirty_list) &&
- list_empty(&dpu_crtc->ad_dirty)) {
- if (list_empty(&dpu_crtc->ad_active)) {
- DRM_DEBUG_DRIVER("Dirty list is empty\n");
- return;
- }
- dpu_cp_ad_set_prop(dpu_crtc, AD_IPC_RESET);
- set_dspp_flush = true;
- }
-
- list_for_each_entry_safe(prop_node, n, &dpu_crtc->dirty_list,
- dirty_list) {
- dpu_cp_crtc_setfeature(prop_node, dpu_crtc);
- /* Set the flush flag to true */
- if (prop_node->is_dspp_feature)
- set_dspp_flush = true;
- else
- set_lm_flush = true;
- }
-
- list_for_each_entry_safe(prop_node, n, &dpu_crtc->ad_dirty,
- dirty_list) {
- set_dspp_flush = true;
- dpu_cp_crtc_setfeature(prop_node, dpu_crtc);
- }
-
- for (i = 0; i < num_mixers; i++) {
- ctl = dpu_crtc->mixers[i].hw_ctl;
- if (!ctl)
- continue;
- if (set_dspp_flush && ctl->ops.get_bitmask_dspp
- && dpu_crtc->mixers[i].hw_dspp) {
- ctl->ops.get_bitmask_dspp(ctl,
- &flush_mask,
- dpu_crtc->mixers[i].hw_dspp->idx);
- ctl->ops.update_pending_flush(ctl, flush_mask);
- }
- if (set_lm_flush && ctl->ops.get_bitmask_mixer
- && dpu_crtc->mixers[i].hw_lm) {
- flush_mask = ctl->ops.get_bitmask_mixer(ctl,
- dpu_crtc->mixers[i].hw_lm->idx);
- ctl->ops.update_pending_flush(ctl, flush_mask);
- }
- }
-}
-
-void dpu_cp_crtc_install_properties(struct drm_crtc *crtc)
-{
- struct dpu_kms *kms = NULL;
- struct dpu_crtc *dpu_crtc = NULL;
- struct dpu_mdss_cfg *catalog = NULL;
- unsigned long features = 0;
- int i = 0;
- struct msm_drm_private *priv;
-
- if (!crtc || !crtc->dev || !crtc->dev->dev_private) {
- DRM_ERROR("invalid crtc %pK dev %pK\n",
- crtc, ((crtc) ? crtc->dev : NULL));
- return;
- }
-
- dpu_crtc = to_dpu_crtc(crtc);
- if (!dpu_crtc) {
- DRM_ERROR("dpu_crtc %pK\n", dpu_crtc);
- return;
- }
-
- kms = get_kms(crtc);
- if (!kms || !kms->catalog) {
- DRM_ERROR("invalid dpu kms %pK catalog %pK dpu_crtc %pK\n",
- kms, ((kms) ? kms->catalog : NULL), dpu_crtc);
- return;
- }
-
- /**
- * Function can be called during the atomic_check with test_only flag
- * and actual commit. Allocate properties only if feature list is
- * empty during the atomic_check with test_only flag.
- */
- if (!list_empty(&dpu_crtc->feature_list))
- return;
-
- catalog = kms->catalog;
- priv = crtc->dev->dev_private;
- /**
- * DSPP/LM properties are global to all the CRTCS.
- * Properties are created for first CRTC and re-used for later
- * crtcs.
- */
- if (!priv->cp_property) {
- priv->cp_property = kzalloc((sizeof(priv->cp_property) *
- DPU_CP_CRTC_MAX_FEATURES), GFP_KERNEL);
- setup_dspp_prop_install_funcs(dspp_prop_install_func);
- setup_lm_prop_install_funcs(lm_prop_install_func);
- }
- if (!priv->cp_property)
- return;
-
- if (!catalog->dspp_count)
- goto lm_property;
-
- /* Check for all the DSPP properties and attach it to CRTC */
- features = catalog->dspp[0].features;
- for (i = 0; i < DPU_DSPP_MAX; i++) {
- if (!test_bit(i, &features))
- continue;
- if (dspp_prop_install_func[i])
- dspp_prop_install_func[i](crtc);
- }
-
-lm_property:
- if (!catalog->mixer_count)
- return;
-
- /* Check for all the LM properties and attach it to CRTC */
- features = catalog->mixer[0].features;
- for (i = 0; i < DPU_MIXER_MAX; i++) {
- if (!test_bit(i, &features))
- continue;
- if (lm_prop_install_func[i])
- lm_prop_install_func[i](crtc);
- }
-}
-
-int dpu_cp_crtc_set_property(struct drm_crtc *crtc,
- struct drm_property *property,
- uint64_t val)
-{
- struct dpu_cp_node *prop_node = NULL;
- struct dpu_crtc *dpu_crtc = NULL;
- int ret = 0, i = 0, dspp_cnt, lm_cnt;
- u8 found = 0;
-
- if (!crtc || !property) {
- DRM_ERROR("invalid crtc %pK property %pK\n", crtc, property);
- return -EINVAL;
- }
-
- dpu_crtc = to_dpu_crtc(crtc);
- if (!dpu_crtc) {
- DRM_ERROR("invalid dpu_crtc %pK\n", dpu_crtc);
- return -EINVAL;
- }
-
- list_for_each_entry(prop_node, &dpu_crtc->feature_list, feature_list) {
- if (property->base.id == prop_node->property_id) {
- found = 1;
- break;
- }
- }
-
- if (!found)
- return 0;
- /**
- * dpu_crtc is virtual ensure that hardware has been attached to the
- * crtc. Check LM and dspp counts based on whether feature is a
- * dspp/lm feature.
- */
- if (!dpu_crtc->num_mixers ||
- dpu_crtc->num_mixers > ARRAY_SIZE(dpu_crtc->mixers)) {
- DRM_ERROR("Invalid mixer config act cnt %d max cnt %zd\n",
- dpu_crtc->num_mixers, ARRAY_SIZE(dpu_crtc->mixers));
- return -EINVAL;
- }
-
- dspp_cnt = 0;
- lm_cnt = 0;
- for (i = 0; i < dpu_crtc->num_mixers; i++) {
- if (dpu_crtc->mixers[i].hw_dspp)
- dspp_cnt++;
- if (dpu_crtc->mixers[i].hw_lm)
- lm_cnt++;
- }
-
- if (prop_node->is_dspp_feature && dspp_cnt < dpu_crtc->num_mixers) {
- DRM_ERROR("invalid dspp cnt %d mixer cnt %d\n", dspp_cnt,
- dpu_crtc->num_mixers);
- return -EINVAL;
- } else if (lm_cnt < dpu_crtc->num_mixers) {
- DRM_ERROR("invalid lm cnt %d mixer cnt %d\n", lm_cnt,
- dpu_crtc->num_mixers);
- return -EINVAL;
- }
-
- ret = dpu_cp_ad_validate_prop(prop_node, dpu_crtc);
- if (ret) {
- DRM_ERROR("ad property validation failed ret %d\n", ret);
- return ret;
- }
-
- /* remove the property from dirty list */
- list_del_init(&prop_node->dirty_list);
-
- if (!val)
- ret = dpu_cp_disable_crtc_property(crtc, property, prop_node);
- else
- ret = dpu_cp_enable_crtc_property(crtc, property,
- prop_node, val);
-
- if (!ret) {
- /* remove the property from active list */
- list_del_init(&prop_node->active_list);
- /* Mark the feature as dirty */
- dpu_cp_update_list(prop_node, dpu_crtc, true);
- }
- return ret;
-}
-
-int dpu_cp_crtc_get_property(struct drm_crtc *crtc,
- struct drm_property *property, uint64_t *val)
-{
- struct dpu_cp_node *prop_node = NULL;
- struct dpu_crtc *dpu_crtc = NULL;
-
- if (!crtc || !property || !val) {
- DRM_ERROR("invalid crtc %pK property %pK val %pK\n",
- crtc, property, val);
- return -EINVAL;
- }
-
- dpu_crtc = to_dpu_crtc(crtc);
- if (!dpu_crtc) {
- DRM_ERROR("invalid dpu_crtc %pK\n", dpu_crtc);
- return -EINVAL;
- }
- /* Return 0 if property is not supported */
- *val = 0;
- list_for_each_entry(prop_node, &dpu_crtc->feature_list, feature_list) {
- if (property->base.id == prop_node->property_id) {
- *val = prop_node->prop_val;
- break;
- }
- }
- return 0;
-}
-
-void dpu_cp_crtc_destroy_properties(struct drm_crtc *crtc)
-{
- struct dpu_crtc *dpu_crtc = NULL;
- struct dpu_cp_node *prop_node = NULL, *n = NULL;
-
- if (!crtc) {
- DRM_ERROR("invalid crtc %pK\n", crtc);
- return;
- }
-
- dpu_crtc = to_dpu_crtc(crtc);
- if (!dpu_crtc) {
- DRM_ERROR("invalid dpu_crtc %pK\n", dpu_crtc);
- return;
- }
-
- list_for_each_entry_safe(prop_node, n, &dpu_crtc->feature_list,
- feature_list) {
- if (prop_node->prop_flags & DRM_MODE_PROP_BLOB
- && prop_node->blob_ptr)
- drm_property_blob_put(prop_node->blob_ptr);
-
- list_del_init(&prop_node->active_list);
- list_del_init(&prop_node->dirty_list);
- list_del_init(&prop_node->feature_list);
- dpu_cp_destroy_local_blob(prop_node);
- kfree(prop_node);
- }
-
- INIT_LIST_HEAD(&dpu_crtc->active_list);
- INIT_LIST_HEAD(&dpu_crtc->dirty_list);
- INIT_LIST_HEAD(&dpu_crtc->feature_list);
-}
-
-void dpu_cp_crtc_suspend(struct drm_crtc *crtc)
-{
- struct dpu_crtc *dpu_crtc = NULL;
- struct dpu_cp_node *prop_node = NULL, *n = NULL;
-
- if (!crtc) {
- DRM_ERROR("crtc %pK\n", crtc);
- return;
- }
- dpu_crtc = to_dpu_crtc(crtc);
- if (!dpu_crtc) {
- DRM_ERROR("dpu_crtc %pK\n", dpu_crtc);
- return;
- }
-
- list_for_each_entry_safe(prop_node, n, &dpu_crtc->active_list,
- active_list) {
- dpu_cp_update_list(prop_node, dpu_crtc, true);
- list_del_init(&prop_node->active_list);
- }
-
- list_for_each_entry_safe(prop_node, n, &dpu_crtc->ad_active,
- active_list) {
- dpu_cp_update_list(prop_node, dpu_crtc, true);
- list_del_init(&prop_node->active_list);
- }
-}
-
-void dpu_cp_crtc_resume(struct drm_crtc *crtc)
-{
- /* placeholder for operations needed during resume */
-}
-
-static void dspp_pcc_install_property(struct drm_crtc *crtc)
-{
- char feature_name[256];
- struct dpu_kms *kms = NULL;
- struct dpu_mdss_cfg *catalog = NULL;
- u32 version;
-
- kms = get_kms(crtc);
- catalog = kms->catalog;
-
- version = catalog->dspp[0].sblk->pcc.version >> 16;
- snprintf(feature_name, ARRAY_SIZE(feature_name), "%s%d",
- "DPU_DSPP_PCC_V", version);
- switch (version) {
- case 1:
- case 4:
- dpu_cp_crtc_install_blob_property(crtc, feature_name,
- DPU_CP_CRTC_DSPP_PCC, sizeof(struct drm_msm_pcc));
- break;
- default:
- DRM_ERROR("version %d not supported\n", version);
- break;
- }
-}
-
-static void dspp_hsic_install_property(struct drm_crtc *crtc)
-{
- char feature_name[256];
- struct dpu_kms *kms = NULL;
- struct dpu_mdss_cfg *catalog = NULL;
- u32 version;
-
- kms = get_kms(crtc);
- catalog = kms->catalog;
- version = catalog->dspp[0].sblk->hsic.version >> 16;
- switch (version) {
- case 1:
- snprintf(feature_name, ARRAY_SIZE(feature_name), "%s%d",
- "DPU_DSPP_HUE_V", version);
- dpu_cp_crtc_install_range_property(crtc, feature_name,
- DPU_CP_CRTC_DSPP_HUE, 0, U32_MAX, 0);
- break;
- default:
- DRM_ERROR("version %d not supported\n", version);
- break;
- }
-}
-
-static void dspp_vlut_install_property(struct drm_crtc *crtc)
-{
- char feature_name[256];
- struct dpu_kms *kms = NULL;
- struct dpu_mdss_cfg *catalog = NULL;
- u32 version;
-
- kms = get_kms(crtc);
- catalog = kms->catalog;
- version = catalog->dspp[0].sblk->vlut.version >> 16;
- snprintf(feature_name, ARRAY_SIZE(feature_name), "%s%d",
- "DPU_DSPP_VLUT_V", version);
- switch (version) {
- case 1:
- dpu_cp_crtc_install_range_property(crtc, feature_name,
- DPU_CP_CRTC_DSPP_VLUT, 0, U64_MAX, 0);
- dpu_cp_create_local_blob(crtc,
- DPU_CP_CRTC_DSPP_VLUT,
- sizeof(struct drm_msm_pa_vlut));
- break;
- default:
- DRM_ERROR("version %d not supported\n", version);
- break;
- }
-}
-
-static void dspp_ad_install_property(struct drm_crtc *crtc)
-{
- char feature_name[256];
- struct dpu_kms *kms = NULL;
- struct dpu_mdss_cfg *catalog = NULL;
- u32 version;
-
- kms = get_kms(crtc);
- catalog = kms->catalog;
- version = catalog->dspp[0].sblk->ad.version >> 16;
- snprintf(feature_name, ARRAY_SIZE(feature_name), "%s%d",
- "DPU_DSPP_AD_V", version);
- switch (version) {
- case 3:
- dpu_cp_crtc_install_immutable_property(crtc,
- feature_name, DPU_CP_CRTC_DSPP_AD);
- break;
- case 4:
- dpu_cp_crtc_install_immutable_property(crtc,
- feature_name, DPU_CP_CRTC_DSPP_AD);
-
- dpu_cp_crtc_install_enum_property(crtc,
- DPU_CP_CRTC_DSPP_AD_MODE, ad4_modes,
- ARRAY_SIZE(ad4_modes), "DPU_DSPP_AD_V4_MODE");
-
- dpu_cp_crtc_install_range_property(crtc, "DPU_DSPP_AD_V4_INIT",
- DPU_CP_CRTC_DSPP_AD_INIT, 0, U64_MAX, 0);
- dpu_cp_create_local_blob(crtc, DPU_CP_CRTC_DSPP_AD_INIT,
- sizeof(struct drm_msm_ad4_init));
-
- dpu_cp_crtc_install_range_property(crtc, "DPU_DSPP_AD_V4_CFG",
- DPU_CP_CRTC_DSPP_AD_CFG, 0, U64_MAX, 0);
- dpu_cp_create_local_blob(crtc, DPU_CP_CRTC_DSPP_AD_CFG,
- sizeof(struct drm_msm_ad4_cfg));
- dpu_cp_crtc_install_range_property(crtc,
- "DPU_DSPP_AD_V4_ASSERTIVENESS",
- DPU_CP_CRTC_DSPP_AD_ASSERTIVENESS, 0, (BIT(8) - 1), 0);
- dpu_cp_crtc_install_range_property(crtc, "DPU_DSPP_AD_V4_INPUT",
- DPU_CP_CRTC_DSPP_AD_INPUT, 0, U16_MAX, 0);
- dpu_cp_crtc_install_range_property(crtc,
- "DPU_DSPP_AD_V4_BACKLIGHT",
- DPU_CP_CRTC_DSPP_AD_BACKLIGHT, 0, (BIT(16) - 1),
- 0);
- break;
- default:
- DRM_ERROR("version %d not supported\n", version);
- break;
- }
-}
-
-static void lm_gc_install_property(struct drm_crtc *crtc)
-{
- char feature_name[256];
- struct dpu_kms *kms = NULL;
- struct dpu_mdss_cfg *catalog = NULL;
- u32 version;
-
- kms = get_kms(crtc);
- catalog = kms->catalog;
- version = catalog->mixer[0].sblk->gc.version >> 16;
- snprintf(feature_name, ARRAY_SIZE(feature_name), "%s%d",
- "DPU_LM_GC_V", version);
- switch (version) {
- case 1:
- dpu_cp_crtc_install_blob_property(crtc, feature_name,
- DPU_CP_CRTC_LM_GC, sizeof(struct drm_msm_pgc_lut));
- break;
- default:
- DRM_ERROR("version %d not supported\n", version);
- break;
- }
-}
-
-static void dspp_gamut_install_property(struct drm_crtc *crtc)
-{
- char feature_name[256];
- struct dpu_kms *kms = NULL;
- struct dpu_mdss_cfg *catalog = NULL;
- u32 version;
-
- kms = get_kms(crtc);
- catalog = kms->catalog;
-
- version = catalog->dspp[0].sblk->gamut.version >> 16;
- snprintf(feature_name, ARRAY_SIZE(feature_name), "%s%d",
- "DPU_DSPP_GAMUT_V", version);
- switch (version) {
- case 4:
- dpu_cp_crtc_install_blob_property(crtc, feature_name,
- DPU_CP_CRTC_DSPP_GAMUT,
- sizeof(struct drm_msm_3d_gamut));
- break;
- default:
- DRM_ERROR("version %d not supported\n", version);
- break;
- }
-}
-
-static void dspp_gc_install_property(struct drm_crtc *crtc)
-{
- char feature_name[256];
- struct dpu_kms *kms = NULL;
- struct dpu_mdss_cfg *catalog = NULL;
- u32 version;
-
- kms = get_kms(crtc);
- catalog = kms->catalog;
-
- version = catalog->dspp[0].sblk->gc.version >> 16;
- snprintf(feature_name, ARRAY_SIZE(feature_name), "%s%d",
- "DPU_DSPP_GC_V", version);
- switch (version) {
- case 1:
- dpu_cp_crtc_install_blob_property(crtc, feature_name,
- DPU_CP_CRTC_DSPP_GC, sizeof(struct drm_msm_pgc_lut));
- break;
- default:
- DRM_ERROR("version %d not supported\n", version);
- break;
- }
-}
-
-static void dspp_igc_install_property(struct drm_crtc *crtc)
-{
- char feature_name[256];
- struct dpu_kms *kms = NULL;
- struct dpu_mdss_cfg *catalog = NULL;
- u32 version;
-
- kms = get_kms(crtc);
- catalog = kms->catalog;
-
- version = catalog->dspp[0].sblk->igc.version >> 16;
- snprintf(feature_name, ARRAY_SIZE(feature_name), "%s%d",
- "DPU_DSPP_IGC_V", version);
- switch (version) {
- case 3:
- dpu_cp_crtc_install_blob_property(crtc, feature_name,
- DPU_CP_CRTC_DSPP_IGC, sizeof(struct drm_msm_igc_lut));
- break;
- default:
- DRM_ERROR("version %d not supported\n", version);
- break;
- }
-}
-
-static void dpu_cp_update_list(struct dpu_cp_node *prop_node,
- struct dpu_crtc *crtc, bool dirty_list)
-{
- switch (prop_node->feature) {
- case DPU_CP_CRTC_DSPP_AD_MODE:
- case DPU_CP_CRTC_DSPP_AD_INIT:
- case DPU_CP_CRTC_DSPP_AD_CFG:
- case DPU_CP_CRTC_DSPP_AD_INPUT:
- case DPU_CP_CRTC_DSPP_AD_ASSERTIVENESS:
- case DPU_CP_CRTC_DSPP_AD_BACKLIGHT:
- if (dirty_list)
- list_add_tail(&prop_node->dirty_list, &crtc->ad_dirty);
- else
- list_add_tail(&prop_node->active_list,
- &crtc->ad_active);
- break;
- default:
- /* color processing properties handle here */
- if (dirty_list)
- list_add_tail(&prop_node->dirty_list,
- &crtc->dirty_list);
- else
- list_add_tail(&prop_node->active_list,
- &crtc->active_list);
- break;
- };
-}
-
-static int dpu_cp_ad_validate_prop(struct dpu_cp_node *prop_node,
- struct dpu_crtc *crtc)
-{
- int i = 0, ret = 0;
- u32 ad_prop;
-
- for (i = 0; i < crtc->num_mixers && !ret; i++) {
- if (!crtc->mixers[i].hw_dspp) {
- ret = -EINVAL;
- continue;
- }
- switch (prop_node->feature) {
- case DPU_CP_CRTC_DSPP_AD_MODE:
- ad_prop = AD_MODE;
- break;
- case DPU_CP_CRTC_DSPP_AD_INIT:
- ad_prop = AD_INIT;
- break;
- case DPU_CP_CRTC_DSPP_AD_CFG:
- ad_prop = AD_CFG;
- break;
- case DPU_CP_CRTC_DSPP_AD_INPUT:
- ad_prop = AD_INPUT;
- break;
- case DPU_CP_CRTC_DSPP_AD_ASSERTIVENESS:
- ad_prop = AD_ASSERTIVE;
- break;
- case DPU_CP_CRTC_DSPP_AD_BACKLIGHT:
- ad_prop = AD_BACKLIGHT;
- break;
- default:
- /* Not an AD property */
- return 0;
- }
- if (!crtc->mixers[i].hw_dspp->ops.validate_ad)
- ret = -EINVAL;
- else
- ret = crtc->mixers[i].hw_dspp->ops.validate_ad(
- crtc->mixers[i].hw_dspp, &ad_prop);
- }
- return ret;
-}
-
-static void dpu_cp_ad_interrupt_cb(void *arg, int irq_idx)
-{
- struct dpu_crtc *crtc = arg;
-
- dpu_crtc_event_queue(&crtc->base, dpu_cp_notify_ad_event, NULL);
-}
-
-static void dpu_cp_notify_ad_event(struct drm_crtc *crtc_drm, void *arg)
-{
- uint32_t bl = 0;
- struct dpu_hw_mixer *hw_lm = NULL;
- struct dpu_hw_dspp *hw_dspp = NULL;
- u32 num_mixers;
- struct dpu_crtc *crtc;
- struct drm_event event;
- int i;
-
- crtc = to_dpu_crtc(crtc_drm);
- num_mixers = crtc->num_mixers;
- if (!num_mixers)
- return;
-
- for (i = 0; i < num_mixers; i++) {
- hw_lm = crtc->mixers[i].hw_lm;
- hw_dspp = crtc->mixers[i].hw_dspp;
- if (!hw_lm->cfg.right_mixer)
- break;
- }
-
- if (!hw_dspp)
- return;
-
- hw_dspp->ops.ad_read_intr_resp(hw_dspp, AD4_BACKLIGHT, &bl);
- event.length = sizeof(u32);
- event.type = DRM_EVENT_AD_BACKLIGHT;
- msm_mode_object_event_notify(&crtc_drm->base, crtc_drm->dev,
- &event, (u8 *)&bl);
-}
-
-int dpu_cp_ad_interrupt(struct drm_crtc *crtc_drm, bool en,
- struct dpu_irq_callback *ad_irq)
-{
- struct dpu_kms *kms = NULL;
- u32 num_mixers;
- struct dpu_hw_mixer *hw_lm;
- struct dpu_hw_dspp *hw_dspp = NULL;
- struct dpu_crtc *crtc;
- int i;
- int irq_idx, ret;
- struct dpu_cp_node prop_node;
-
- if (!crtc_drm || !ad_irq) {
- DRM_ERROR("invalid crtc %pK irq %pK\n", crtc_drm, ad_irq);
- return -EINVAL;
- }
-
- crtc = to_dpu_crtc(crtc_drm);
- if (!crtc) {
- DRM_ERROR("invalid dpu_crtc %pK\n", crtc);
- return -EINVAL;
- }
-
- kms = get_kms(crtc_drm);
- num_mixers = crtc->num_mixers;
-
- memset(&prop_node, 0, sizeof(prop_node));
- prop_node.feature = DPU_CP_CRTC_DSPP_AD_BACKLIGHT;
- ret = dpu_cp_ad_validate_prop(&prop_node, crtc);
- if (ret) {
- DRM_ERROR("Ad not supported ret %d\n", ret);
- goto exit;
- }
-
- for (i = 0; i < num_mixers; i++) {
- hw_lm = crtc->mixers[i].hw_lm;
- hw_dspp = crtc->mixers[i].hw_dspp;
- if (!hw_lm->cfg.right_mixer)
- break;
- }
-
- if (!hw_dspp) {
- DRM_ERROR("invalid dspp\n");
- ret = -EINVAL;
- goto exit;
- }
-
- irq_idx = dpu_core_irq_idx_lookup(kms, DPU_IRQ_TYPE_AD4_BL_DONE,
- hw_dspp->idx);
- if (irq_idx < 0) {
- DRM_ERROR("failed to get the irq idx ret %d\n", irq_idx);
- ret = irq_idx;
- goto exit;
- }
-
- if (!en) {
- dpu_core_irq_disable(kms, &irq_idx, 1);
- dpu_core_irq_unregister_callback(kms, irq_idx, ad_irq);
- ret = 0;
- goto exit;
- }
-
- ad_irq->arg = crtc;
- ad_irq->func = dpu_cp_ad_interrupt_cb;
- ret = dpu_core_irq_register_callback(kms, irq_idx, ad_irq);
- if (ret) {
- DRM_ERROR("failed to register the callback ret %d\n", ret);
- goto exit;
- }
- ret = dpu_core_irq_enable(kms, &irq_idx, 1);
- if (ret) {
- DRM_ERROR("failed to enable irq ret %d\n", ret);
- dpu_core_irq_unregister_callback(kms, irq_idx, ad_irq);
- }
-exit:
- return ret;
-}
-
-static void dpu_cp_ad_set_prop(struct dpu_crtc *dpu_crtc,
- enum ad_property ad_prop)
-{
- struct dpu_ad_hw_cfg ad_cfg;
- struct dpu_hw_cp_cfg hw_cfg;
- struct dpu_hw_dspp *hw_dspp = NULL;
- struct dpu_hw_mixer *hw_lm = NULL;
- u32 num_mixers = dpu_crtc->num_mixers;
- int i = 0, ret = 0;
-
- hw_cfg.num_of_mixers = dpu_crtc->num_mixers;
- hw_cfg.displayh = dpu_crtc->base.mode.hdisplay;
- hw_cfg.displayv = dpu_crtc->base.mode.vdisplay;
-
- for (i = 0; i < num_mixers && !ret; i++) {
- hw_lm = dpu_crtc->mixers[i].hw_lm;
- hw_dspp = dpu_crtc->mixers[i].hw_dspp;
- if (!hw_lm || !hw_dspp || !hw_dspp->ops.validate_ad ||
- !hw_dspp->ops.setup_ad) {
- ret = -EINVAL;
- continue;
- }
-
- hw_cfg.mixer_info = hw_lm;
- ad_cfg.prop = ad_prop;
- ad_cfg.hw_cfg = &hw_cfg;
- ret = hw_dspp->ops.validate_ad(hw_dspp, (u32 *)&ad_prop);
- if (!ret)
- hw_dspp->ops.setup_ad(hw_dspp, &ad_cfg);
- }
-}
-
-void dpu_cp_crtc_pre_ipc(struct drm_crtc *drm_crtc)
-{
- struct dpu_crtc *dpu_crtc;
-
- dpu_crtc = to_dpu_crtc(drm_crtc);
- if (!dpu_crtc) {
- DRM_ERROR("invalid dpu_crtc %pK\n", dpu_crtc);
- return;
- }
-
- dpu_cp_ad_set_prop(dpu_crtc, AD_IPC_SUSPEND);
-}
-
-void dpu_cp_crtc_post_ipc(struct drm_crtc *drm_crtc)
-{
- struct dpu_crtc *dpu_crtc;
-
- dpu_crtc = to_dpu_crtc(drm_crtc);
- if (!dpu_crtc) {
- DRM_ERROR("invalid dpu_crtc %pK\n", dpu_crtc);
- return;
- }
-
- dpu_cp_ad_set_prop(dpu_crtc, AD_IPC_RESUME);
-}
diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_color_processing.h b/drivers/gpu/drm/msm/disp/dpu1/dpu_color_processing.h
deleted file mode 100644
index 0fa546c..0000000
--- a/drivers/gpu/drm/msm/disp/dpu1/dpu_color_processing.h
+++ /dev/null
@@ -1,120 +0,0 @@
-/* Copyright (c) 2016-2018, The Linux Foundation. All rights reserved.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 and
- * only version 2 as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- */
-
-#ifndef _DPU_COLOR_PROCESSING_H
-#define _DPU_COLOR_PROCESSING_H
-#include <drm/drm_crtc.h>
-
-struct dpu_irq_callback;
-
-/*
- * PA MEMORY COLOR types
- * @MEMCOLOR_SKIN Skin memory color type
- * @MEMCOLOR_SKY Sky memory color type
- * @MEMCOLOR_FOLIAGE Foliage memory color type
- */
-enum dpu_memcolor_type {
- MEMCOLOR_SKIN = 0,
- MEMCOLOR_SKY,
- MEMCOLOR_FOLIAGE
-};
-
-/**
- * dpu_cp_crtc_init(): Initialize color processing lists for a crtc.
- * Should be called during crtc initialization.
- * @crtc: Pointer to dpu_crtc.
- */
-void dpu_cp_crtc_init(struct drm_crtc *crtc);
-
-/**
- * dpu_cp_crtc_install_properties(): Installs the color processing
- * properties for a crtc.
- * Should be called during crtc initialization.
- * @crtc: Pointer to crtc.
- */
-void dpu_cp_crtc_install_properties(struct drm_crtc *crtc);
-
-/**
- * dpu_cp_crtc_destroy_properties: Destroys color processing
- * properties for a crtc.
- * should be called during crtc de-initialization.
- * @crtc: Pointer to crtc.
- */
-void dpu_cp_crtc_destroy_properties(struct drm_crtc *crtc);
-
-/**
- * dpu_cp_crtc_set_property: Set a color processing property
- * for a crtc.
- * Should be during atomic set property.
- * @crtc: Pointer to crtc.
- * @property: Property that needs to enabled/disabled.
- * @val: Value of property.
- */
-int dpu_cp_crtc_set_property(struct drm_crtc *crtc,
- struct drm_property *property, uint64_t val);
-
-/**
- * dpu_cp_crtc_apply_properties: Enable/disable properties
- * for a crtc.
- * Should be called during atomic commit call.
- * @crtc: Pointer to crtc.
- */
-void dpu_cp_crtc_apply_properties(struct drm_crtc *crtc);
-
-/**
- * dpu_cp_crtc_get_property: Get value of color processing property
- * for a crtc.
- * Should be during atomic get property.
- * @crtc: Pointer to crtc.
- * @property: Property that needs to enabled/disabled.
- * @val: Value of property.
- *
- */
-int dpu_cp_crtc_get_property(struct drm_crtc *crtc,
- struct drm_property *property, uint64_t *val);
-
-/**
- * dpu_cp_crtc_suspend: Suspend the crtc features
- * @crtc: Pointer to crtc.
- */
-void dpu_cp_crtc_suspend(struct drm_crtc *crtc);
-
-/**
- * dpu_cp_crtc_resume: Resume the crtc features
- * @crtc: Pointer to crtc.
- */
-void dpu_cp_crtc_resume(struct drm_crtc *crtc);
-
-/**
- * dpu_cp_ad_interrupt: Api to enable/disable ad interrupt
- * @crtc: Pointer to crtc.
- * @en: Variable to enable/disable interrupt.
- * @irq: Pointer to irq callback
- */
-int dpu_cp_ad_interrupt(struct drm_crtc *crtc, bool en,
- struct dpu_irq_callback *irq);
-
-/**
- * dpu_cp_crtc_pre_ipc: Handle color processing features
- * before entering IPC
- * @crtc: Pointer to crtc.
- */
-void dpu_cp_crtc_pre_ipc(struct drm_crtc *crtc);
-
-/**
- * dpu_cp_crtc_post_ipc: Handle color processing features
- * after exiting IPC
- * @crtc: Pointer to crtc.
- */
-void dpu_cp_crtc_post_ipc(struct drm_crtc *crtc);
-#endif /*_DPU_COLOR_PROCESSING_H */
diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c b/drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c
index 48920b05..d439a9e 100644
--- a/drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c
+++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c
@@ -20,7 +20,6 @@
#include <linux/sort.h>
#include <linux/debugfs.h>
#include <linux/ktime.h>
-#include <uapi/drm/dpu_drm.h>
#include <drm/drm_mode.h>
#include <drm/drm_crtc.h>
#include <drm/drm_crtc_helper.h>
@@ -31,13 +30,18 @@
#include "dpu_hw_ctl.h"
#include "dpu_crtc.h"
#include "dpu_plane.h"
-#include "dpu_color_processing.h"
#include "dpu_encoder.h"
#include "dpu_vbif.h"
#include "dpu_power_handle.h"
#include "dpu_core_perf.h"
#include "dpu_trace.h"
+#define DPU_DRM_BLEND_OP_NOT_DEFINED 0
+#define DPU_DRM_BLEND_OP_OPAQUE 1
+#define DPU_DRM_BLEND_OP_PREMULTIPLIED 2
+#define DPU_DRM_BLEND_OP_COVERAGE 3
+#define DPU_DRM_BLEND_OP_MAX 4
+
/* layer mixer index on dpu_crtc */
#define LEFT_MIXER 0
#define RIGHT_MIXER 1
@@ -590,7 +594,6 @@ static void dpu_crtc_destroy(struct drm_crtc *crtc)
if (dpu_crtc->blob_info)
drm_property_blob_put(dpu_crtc->blob_info);
msm_property_destroy(&dpu_crtc->property_info);
- dpu_cp_crtc_destroy_properties(crtc);
_dpu_crtc_destroy_dest_scaler(dpu_crtc);
_dpu_crtc_deinit_events(dpu_crtc);
@@ -624,15 +627,11 @@ static void _dpu_crtc_setup_blend_cfg(struct dpu_crtc_mixer *mixer,
struct dpu_hw_mixer *lm = mixer->hw_lm;
/* default to opaque blending */
- fg_alpha = dpu_plane_get_property(pstate, PLANE_PROP_ALPHA);
+ fg_alpha = 0XFF;
bg_alpha = 0xFF - fg_alpha;
- blend_op = DPU_BLEND_FG_ALPHA_FG_CONST | DPU_BLEND_BG_ALPHA_BG_CONST;
- blend_type = dpu_plane_get_property(pstate, PLANE_PROP_BLEND_OP);
-
- DPU_DEBUG("blend type:0x%x blend alpha:0x%x\n", blend_type, fg_alpha);
+ blend_type = DPU_DRM_BLEND_OP_OPAQUE;
switch (blend_type) {
-
case DPU_DRM_BLEND_OP_OPAQUE:
blend_op = DPU_BLEND_FG_ALPHA_FG_CONST |
DPU_BLEND_BG_ALPHA_BG_CONST;
@@ -1814,11 +1813,10 @@ static void _dpu_crtc_setup_mixer_for_encoder(
struct dpu_crtc_mixer *mixer;
struct dpu_hw_ctl *last_valid_ctl = NULL;
int i;
- struct dpu_rm_hw_iter lm_iter, ctl_iter, dspp_iter, ds_iter;
+ struct dpu_rm_hw_iter lm_iter, ctl_iter, ds_iter;
dpu_rm_init_hw_iter(&lm_iter, enc->base.id, DPU_HW_BLK_LM);
dpu_rm_init_hw_iter(&ctl_iter, enc->base.id, DPU_HW_BLK_CTL);
- dpu_rm_init_hw_iter(&dspp_iter, enc->base.id, DPU_HW_BLK_DSPP);
dpu_rm_init_hw_iter(&ds_iter, enc->base.id, DPU_HW_BLK_DS);
/* Set up all the mixers and ctls reserved by this encoder */
@@ -1846,10 +1844,6 @@ static void _dpu_crtc_setup_mixer_for_encoder(
return;
}
- /* Dspp may be null */
- (void) dpu_rm_get_hw(rm, &dspp_iter);
- mixer->hw_dspp = (struct dpu_hw_dspp *)dspp_iter.hw;
-
/* DS may be null */
(void) dpu_rm_get_hw(rm, &ds_iter);
mixer->hw_ds = (struct dpu_hw_ds *)ds_iter.hw;
@@ -1982,17 +1976,6 @@ static void dpu_crtc_atomic_begin(struct drm_crtc *crtc,
_dpu_crtc_dest_scaler_setup(crtc);
/*
- * Since CP properties use AXI buffer to program the
- * HW, check if context bank is in attached
- * state,
- * apply color processing properties only if
- * smmu state is attached,
- */
- if ((smmu_state->state != DETACHED) &&
- (smmu_state->state != DETACH_ALL_REQ))
- dpu_cp_crtc_apply_properties(crtc);
-
- /*
* PP_DONE irq is only used by command mode for now.
* It is better to request pending before FLUSH and START trigger
* to make sure no pp_done irq missed.
@@ -2425,7 +2408,6 @@ static void dpu_crtc_handle_power_event(u32 event_type, void *arg)
{
struct drm_crtc *crtc = arg;
struct dpu_crtc *dpu_crtc;
- struct drm_plane *plane;
struct drm_encoder *encoder;
struct dpu_crtc_mixer *m;
u32 i, misr_status;
@@ -2450,8 +2432,6 @@ static void dpu_crtc_handle_power_event(u32 event_type, void *arg)
dpu_encoder_virt_restore(encoder);
}
- dpu_cp_crtc_post_ipc(crtc);
-
for (i = 0; i < dpu_crtc->num_mixers; ++i) {
m = &dpu_crtc->mixers[i];
if (!m->hw_lm || !m->hw_lm->ops.setup_misr ||
@@ -2473,18 +2453,12 @@ static void dpu_crtc_handle_power_event(u32 event_type, void *arg)
dpu_crtc->misr_data[i] = misr_status ? misr_status :
dpu_crtc->misr_data[i];
}
-
- dpu_cp_crtc_pre_ipc(crtc);
break;
case DPU_POWER_EVENT_POST_DISABLE:
- /*
- * set revalidate flag in planes, so it will be re-programmed
- * in the next frame update
+ /**
+ * Nothing to do. All the planes on the CRTC will be
+ * programmed for every frame
*/
- drm_atomic_crtc_for_each_plane(plane, crtc)
- dpu_plane_set_revalidate(plane, true);
-
- dpu_cp_crtc_suspend(crtc);
break;
default:
DPU_DEBUG("event:%d not handled\n", event_type);
@@ -2531,7 +2505,6 @@ static void dpu_crtc_disable(struct drm_crtc *crtc)
/* update color processing on suspend */
event.type = DRM_EVENT_CRTC_POWER;
event.length = sizeof(u32);
- dpu_cp_crtc_suspend(crtc);
power_on = 0;
msm_mode_object_event_notify(&crtc->base, crtc->dev, &event,
(u8 *)&power_on);
@@ -2635,7 +2608,6 @@ static void dpu_crtc_enable(struct drm_crtc *crtc,
/* update color processing on resume */
event.type = DRM_EVENT_CRTC_POWER;
event.length = sizeof(u32);
- dpu_cp_crtc_resume(crtc);
power_on = 1;
msm_mode_object_event_notify(&crtc->base, crtc->dev, &event,
(u8 *)&power_on);
@@ -2677,82 +2649,6 @@ static int pstate_cmp(const void *a, const void *b)
return rc;
}
-static int _dpu_crtc_excl_rect_overlap_check(struct plane_state pstates[],
- int cnt, int curr_cnt, struct dpu_rect *excl_rect, int z_pos)
-{
- struct dpu_rect dst_rect, intersect;
- int i, rc = -EINVAL;
- const struct drm_plane_state *pstate;
-
- /* start checking from next plane */
- for (i = curr_cnt; i < cnt; i++) {
- pstate = pstates[i].drm_pstate;
- POPULATE_RECT(&dst_rect, pstate->crtc_x, pstate->crtc_y,
- pstate->crtc_w, pstate->crtc_h, false);
- dpu_kms_rect_intersect(&dst_rect, excl_rect, &intersect);
-
- if (intersect.w == excl_rect->w && intersect.h == excl_rect->h
- /* next plane may be on same z-order */
- && z_pos != pstates[i].stage) {
- rc = 0;
- goto end;
- }
- }
-
- DPU_ERROR("excl rect does not find top overlapping rect\n");
-end:
- return rc;
-}
-
-/* no input validation - caller API has all the checks */
-static int _dpu_crtc_excl_dim_layer_check(struct drm_crtc_state *state,
- struct plane_state pstates[], int cnt)
-{
- struct dpu_crtc_state *cstate = to_dpu_crtc_state(state);
- struct drm_display_mode *mode = &state->adjusted_mode;
- const struct drm_plane_state *pstate;
- struct dpu_plane_state *dpu_pstate;
- int rc = 0, i;
-
- /* Check dim layer rect bounds and stage */
- for (i = 0; i < cstate->num_dim_layers; i++) {
- if ((CHECK_LAYER_BOUNDS(cstate->dim_layer[i].rect.y,
- cstate->dim_layer[i].rect.h, mode->vdisplay)) ||
- (CHECK_LAYER_BOUNDS(cstate->dim_layer[i].rect.x,
- cstate->dim_layer[i].rect.w, mode->hdisplay)) ||
- (cstate->dim_layer[i].stage >= DPU_STAGE_MAX) ||
- (!cstate->dim_layer[i].rect.w) ||
- (!cstate->dim_layer[i].rect.h)) {
- DPU_ERROR("invalid dim_layer:{%d,%d,%d,%d}, stage:%d\n",
- cstate->dim_layer[i].rect.x,
- cstate->dim_layer[i].rect.y,
- cstate->dim_layer[i].rect.w,
- cstate->dim_layer[i].rect.h,
- cstate->dim_layer[i].stage);
- DPU_ERROR("display: %dx%d\n", mode->hdisplay,
- mode->vdisplay);
- rc = -E2BIG;
- goto end;
- }
- }
-
- /* this is traversing on sorted z-order pstates */
- for (i = 0; i < cnt; i++) {
- pstate = pstates[i].drm_pstate;
- dpu_pstate = to_dpu_plane_state(pstate);
- if (dpu_pstate->excl_rect.w && dpu_pstate->excl_rect.h) {
- /* check overlap on all top z-order */
- rc = _dpu_crtc_excl_rect_overlap_check(pstates, cnt,
- i + 1, &dpu_pstate->excl_rect, pstates[i].stage);
- if (rc)
- goto end;
- }
- }
-
-end:
- return rc;
-}
-
static int dpu_crtc_atomic_check(struct drm_crtc *crtc,
struct drm_crtc_state *state)
{
@@ -2878,10 +2774,6 @@ static int dpu_crtc_atomic_check(struct drm_crtc *crtc,
/* assign mixer stages based on sorted zpos property */
sort(pstates, cnt, sizeof(pstates[0]), pstate_cmp, NULL);
- rc = _dpu_crtc_excl_dim_layer_check(state, pstates, cnt);
- if (rc)
- goto end;
-
if (!dpu_is_custom_client()) {
int stage_old = pstates[0].stage;
@@ -3301,11 +3193,8 @@ static int dpu_crtc_atomic_set_property(struct drm_crtc *crtc,
break;
}
} else {
- ret = dpu_cp_crtc_set_property(crtc,
- property, val);
- }
- if (ret)
DRM_ERROR("failed to set the property\n");
+ }
DPU_DEBUG("crtc%d %s[%d] <= 0x%llx ret=%d\n", crtc->base.id,
property->name, property->base.id, val, ret);
@@ -3370,9 +3259,6 @@ static int dpu_crtc_atomic_get_property(struct drm_crtc *crtc,
&cstate->property_state,
property, val);
if (ret)
- ret = dpu_cp_crtc_get_property(crtc,
- property, val);
- if (ret)
DRM_ERROR("get property failed\n");
}
return ret;
@@ -3487,10 +3373,6 @@ static int _dpu_debugfs_status_show(struct seq_file *s, void *data)
seq_printf(s, "\tmultirect: mode: %d index: %d\n",
pstate->multirect_mode, pstate->multirect_index);
- seq_printf(s, "\texcl_rect: x:%4d y:%4d w:%4d h:%4d\n",
- pstate->excl_rect.x, pstate->excl_rect.y,
- pstate->excl_rect.w, pstate->excl_rect.h);
-
seq_puts(s, "\n");
}
if (dpu_crtc->vblank_cb_count) {
@@ -3934,10 +3816,6 @@ struct drm_crtc *dpu_crtc_init(struct drm_device *dev, struct drm_plane *plane)
/* Init dest scaler */
_dpu_crtc_dest_scaler_init(dpu_crtc, kms->catalog);
- /* Install color processing properties */
- dpu_cp_crtc_init(crtc);
- dpu_cp_crtc_install_properties(crtc);
-
DPU_DEBUG("%s: successfully initialized crtc\n", dpu_crtc->name);
return crtc;
}
diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.h b/drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.h
index 9304058..5f380b8 100644
--- a/drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.h
+++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.h
@@ -20,6 +20,7 @@
#define _DPU_CRTC_H_
#include <linux/kthread.h>
+#include <uapi/drm/dpu_drm.h>
#include <drm/drm_crtc.h>
#include "msm_prop.h"
#include "dpu_kms.h"
@@ -86,7 +87,6 @@ struct dpu_crtc_smmu_state_data {
* struct dpu_crtc_mixer: stores the map for each virtual pipeline in the CRTC
* @hw_lm: LM HW Driver context
* @hw_ctl: CTL Path HW driver context
- * @hw_dspp: DSPP HW driver context
* @hw_ds: DS HW driver context
* @encoder: Encoder attached to this lm & ctl
* @mixer_op_mode: mixer blending operation mode
@@ -95,7 +95,6 @@ struct dpu_crtc_smmu_state_data {
struct dpu_crtc_mixer {
struct dpu_hw_mixer *hw_lm;
struct dpu_hw_ctl *hw_ctl;
- struct dpu_hw_dspp *hw_dspp;
struct dpu_hw_ds *hw_ds;
struct drm_encoder *encoder;
u32 mixer_op_mode;
diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_encoder.c b/drivers/gpu/drm/msm/disp/dpu1/dpu_encoder.c
index 4386360..77d3571 100644
--- a/drivers/gpu/drm/msm/disp/dpu1/dpu_encoder.c
+++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_encoder.c
@@ -1748,8 +1748,6 @@ static void _dpu_encoder_kickoff_phys(struct dpu_encoder_virt *dpu_enc)
if (phys->split_role != ENC_ROLE_SLAVE)
set_bit(i, dpu_enc->frame_busy_mask);
- if (phys->hw_ctl->ops.reg_dma_flush)
- phys->hw_ctl->ops.reg_dma_flush(phys->hw_ctl);
if (!phys->ops.needs_single_flush ||
!phys->ops.needs_single_flush(phys))
_dpu_encoder_trigger_flush(&dpu_enc->base, phys, 0x0);
diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_encoder_phys_wb.c b/drivers/gpu/drm/msm/disp/dpu1/dpu_encoder_phys_wb.c
index 3b1212b..d2e9cd9 100644
--- a/drivers/gpu/drm/msm/disp/dpu1/dpu_encoder_phys_wb.c
+++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_encoder_phys_wb.c
@@ -13,7 +13,6 @@
#define pr_fmt(fmt) "[drm:%s:%d] " fmt, __func__, __LINE__
#include <linux/debugfs.h>
-#include <uapi/drm/dpu_drm.h>
#include "dpu_encoder_phys.h"
#include "dpu_formats.h"
diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_ad4.c b/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_ad4.c
deleted file mode 100644
index 7f81c9a..0000000
--- a/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_ad4.c
+++ /dev/null
@@ -1,1443 +0,0 @@
-/* Copyright (c) 2017-2018, The Linux Foundation. All rights reserved.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 and
- * only version 2 as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- */
-#include <drm/msm_drm_pp.h>
-#include "dpu_hw_catalog.h"
-#include "dpu_hw_util.h"
-#include "dpu_hw_mdss.h"
-#include "dpu_hw_lm.h"
-#include "dpu_ad4.h"
-
-#define AD_STATE_READY(x) ((x) == (ad4_init | ad4_cfg | ad4_mode | ad4_input))
-#define MERGE_WIDTH_RIGHT 6
-#define MERGE_WIDTH_LEFT 5
-#define AD_IPC_FRAME_COUNT 2
-
-enum ad4_ops_bitmask {
- ad4_init = BIT(AD_INIT),
- ad4_cfg = BIT(AD_CFG),
- ad4_mode = BIT(AD_MODE),
- ad4_input = BIT(AD_INPUT),
- ad4_ops_max = BIT(31),
-};
-
-enum ad4_state {
- ad4_state_idle,
- ad4_state_startup,
- ad4_state_run,
- /* idle power collapse suspend state */
- ad4_state_ipcs,
- /* idle power collapse resume state */
- ad4_state_ipcr,
- ad4_state_max,
-};
-
-typedef int (*ad4_prop_setup)(struct dpu_hw_dspp *dspp,
- struct dpu_ad_hw_cfg *ad);
-
-static int ad4_params_check(struct dpu_hw_dspp *dspp,
- struct dpu_ad_hw_cfg *cfg);
-
-static int ad4_no_op_setup(struct dpu_hw_dspp *dspp, struct dpu_ad_hw_cfg *cfg);
-static int ad4_setup_debug(struct dpu_hw_dspp *dspp, struct dpu_ad_hw_cfg *cfg);
-static int ad4_mode_setup(struct dpu_hw_dspp *dspp, enum ad4_modes mode);
-static int ad4_mode_setup_common(struct dpu_hw_dspp *dspp,
- struct dpu_ad_hw_cfg *cfg);
-static int ad4_init_setup(struct dpu_hw_dspp *dspp, struct dpu_ad_hw_cfg *cfg);
-static int ad4_init_setup_idle(struct dpu_hw_dspp *dspp,
- struct dpu_ad_hw_cfg *cfg);
-static int ad4_init_setup_run(struct dpu_hw_dspp *dspp,
- struct dpu_ad_hw_cfg *cfg);
-static int ad4_init_setup_ipcr(struct dpu_hw_dspp *dspp,
- struct dpu_ad_hw_cfg *cfg);
-static int ad4_cfg_setup(struct dpu_hw_dspp *dspp, struct dpu_ad_hw_cfg *cfg);
-static int ad4_cfg_setup_idle(struct dpu_hw_dspp *dspp,
- struct dpu_ad_hw_cfg *cfg);
-static int ad4_cfg_setup_run(struct dpu_hw_dspp *dspp,
- struct dpu_ad_hw_cfg *cfg);
-static int ad4_cfg_setup_ipcr(struct dpu_hw_dspp *dspp,
- struct dpu_ad_hw_cfg *cfg);
-static int ad4_input_setup(struct dpu_hw_dspp *dspp,
- struct dpu_ad_hw_cfg *cfg);
-static int ad4_input_setup_idle(struct dpu_hw_dspp *dspp,
- struct dpu_ad_hw_cfg *cfg);
-static int ad4_input_setup_ipcr(struct dpu_hw_dspp *dspp,
- struct dpu_ad_hw_cfg *cfg);
-static int ad4_suspend_setup(struct dpu_hw_dspp *dspp,
- struct dpu_ad_hw_cfg *cfg);
-static int ad4_assertive_setup(struct dpu_hw_dspp *dspp,
- struct dpu_ad_hw_cfg *cfg);
-static int ad4_assertive_setup_ipcr(struct dpu_hw_dspp *dspp,
- struct dpu_ad_hw_cfg *cfg);
-static int ad4_backlight_setup(struct dpu_hw_dspp *dspp,
- struct dpu_ad_hw_cfg *cfg);
-static int ad4_backlight_setup_ipcr(struct dpu_hw_dspp *dspp,
- struct dpu_ad_hw_cfg *cfg);
-
-static int ad4_ipc_suspend_setup_run(struct dpu_hw_dspp *dspp,
- struct dpu_ad_hw_cfg *cfg);
-static int ad4_ipc_suspend_setup_ipcr(struct dpu_hw_dspp *dspp,
- struct dpu_ad_hw_cfg *cfg);
-static int ad4_ipc_resume_setup_ipcs(struct dpu_hw_dspp *dspp,
- struct dpu_ad_hw_cfg *cfg);
-static int ad4_ipc_reset_setup_startup(struct dpu_hw_dspp *dspp,
- struct dpu_ad_hw_cfg *cfg);
-static int ad4_ipc_reset_setup_ipcr(struct dpu_hw_dspp *dspp,
- struct dpu_ad_hw_cfg *cfg);
-static int ad4_cfg_ipc_reset(struct dpu_hw_dspp *dspp,
- struct dpu_ad_hw_cfg *cfg);
-
-static ad4_prop_setup prop_set_func[ad4_state_max][AD_PROPMAX] = {
- [ad4_state_idle][AD_MODE] = ad4_mode_setup_common,
- [ad4_state_idle][AD_INIT] = ad4_init_setup_idle,
- [ad4_state_idle][AD_CFG] = ad4_cfg_setup_idle,
- [ad4_state_idle][AD_INPUT] = ad4_input_setup_idle,
- [ad4_state_idle][AD_SUSPEND] = ad4_suspend_setup,
- [ad4_state_idle][AD_ASSERTIVE] = ad4_assertive_setup,
- [ad4_state_idle][AD_BACKLIGHT] = ad4_backlight_setup,
- [ad4_state_idle][AD_IPC_SUSPEND] = ad4_no_op_setup,
- [ad4_state_idle][AD_IPC_RESUME] = ad4_no_op_setup,
- [ad4_state_idle][AD_IPC_RESET] = ad4_no_op_setup,
-
- [ad4_state_startup][AD_MODE] = ad4_mode_setup_common,
- [ad4_state_startup][AD_INIT] = ad4_init_setup,
- [ad4_state_startup][AD_CFG] = ad4_cfg_setup,
- [ad4_state_startup][AD_INPUT] = ad4_input_setup,
- [ad4_state_startup][AD_SUSPEND] = ad4_suspend_setup,
- [ad4_state_startup][AD_ASSERTIVE] = ad4_assertive_setup,
- [ad4_state_startup][AD_BACKLIGHT] = ad4_backlight_setup,
- [ad4_state_startup][AD_IPC_SUSPEND] = ad4_no_op_setup,
- [ad4_state_startup][AD_IPC_RESUME] = ad4_no_op_setup,
- [ad4_state_startup][AD_IPC_RESET] = ad4_ipc_reset_setup_startup,
-
- [ad4_state_run][AD_MODE] = ad4_mode_setup_common,
- [ad4_state_run][AD_INIT] = ad4_init_setup_run,
- [ad4_state_run][AD_CFG] = ad4_cfg_setup_run,
- [ad4_state_run][AD_INPUT] = ad4_input_setup,
- [ad4_state_run][AD_SUSPEND] = ad4_suspend_setup,
- [ad4_state_run][AD_ASSERTIVE] = ad4_assertive_setup,
- [ad4_state_run][AD_BACKLIGHT] = ad4_backlight_setup,
- [ad4_state_run][AD_IPC_SUSPEND] = ad4_ipc_suspend_setup_run,
- [ad4_state_run][AD_IPC_RESUME] = ad4_no_op_setup,
- [ad4_state_run][AD_IPC_RESET] = ad4_setup_debug,
-
- [ad4_state_ipcs][AD_MODE] = ad4_no_op_setup,
- [ad4_state_ipcs][AD_INIT] = ad4_no_op_setup,
- [ad4_state_ipcs][AD_CFG] = ad4_no_op_setup,
- [ad4_state_ipcs][AD_INPUT] = ad4_no_op_setup,
- [ad4_state_ipcs][AD_SUSPEND] = ad4_no_op_setup,
- [ad4_state_ipcs][AD_ASSERTIVE] = ad4_no_op_setup,
- [ad4_state_ipcs][AD_BACKLIGHT] = ad4_no_op_setup,
- [ad4_state_ipcs][AD_IPC_SUSPEND] = ad4_no_op_setup,
- [ad4_state_ipcs][AD_IPC_RESUME] = ad4_ipc_resume_setup_ipcs,
- [ad4_state_ipcs][AD_IPC_RESET] = ad4_no_op_setup,
-
- [ad4_state_ipcr][AD_MODE] = ad4_mode_setup_common,
- [ad4_state_ipcr][AD_INIT] = ad4_init_setup_ipcr,
- [ad4_state_ipcr][AD_CFG] = ad4_cfg_setup_ipcr,
- [ad4_state_ipcr][AD_INPUT] = ad4_input_setup_ipcr,
- [ad4_state_ipcr][AD_SUSPEND] = ad4_suspend_setup,
- [ad4_state_ipcr][AD_ASSERTIVE] = ad4_assertive_setup_ipcr,
- [ad4_state_ipcr][AD_BACKLIGHT] = ad4_backlight_setup_ipcr,
- [ad4_state_ipcr][AD_IPC_SUSPEND] = ad4_ipc_suspend_setup_ipcr,
- [ad4_state_ipcr][AD_IPC_RESUME] = ad4_no_op_setup,
- [ad4_state_ipcr][AD_IPC_RESET] = ad4_ipc_reset_setup_ipcr,
-};
-
-struct ad4_info {
- enum ad4_state state;
- u32 completed_ops_mask;
- bool ad4_support;
- enum ad4_modes mode;
- bool is_master;
- u32 last_assertive;
- u32 cached_assertive;
- u64 last_als;
- u64 cached_als;
- u64 last_bl;
- u64 cached_bl;
- u32 last_str;
- u32 frame_count;
- u32 frmt_mode;
- u32 irdx_control_0;
- u32 tf_ctrl;
- u32 vc_control_0;
-};
-
-static struct ad4_info info[DSPP_MAX] = {
- [DSPP_0] = {ad4_state_idle, 0, true, AD4_OFF, false, 0x80, 0x80},
- [DSPP_1] = {ad4_state_idle, 0, true, AD4_OFF, false, 0x80, 0x80},
- [DSPP_2] = {ad4_state_max, 0, false, AD4_OFF, false, 0x80, 0x80},
- [DSPP_3] = {ad4_state_max, 0, false, AD4_OFF, false, 0x80, 0x80},
-};
-
-void dpu_setup_dspp_ad4(struct dpu_hw_dspp *dspp, void *ad_cfg)
-{
- int ret = 0;
- struct dpu_ad_hw_cfg *cfg = ad_cfg;
-
- ret = ad4_params_check(dspp, ad_cfg);
- if (ret)
- return;
-
- ret = prop_set_func[info[dspp->idx].state][cfg->prop](dspp, ad_cfg);
- if (ret)
- DRM_ERROR("op failed %d ret %d\n", cfg->prop, ret);
-}
-
-int dpu_validate_dspp_ad4(struct dpu_hw_dspp *dspp, u32 *prop)
-{
-
- if (!dspp || !prop) {
- DRM_ERROR("invalid params dspp %pK prop %pK\n", dspp, prop);
- return -EINVAL;
- }
-
- if (*prop >= AD_PROPMAX) {
- DRM_ERROR("invalid prop set %d\n", *prop);
- return -EINVAL;
- }
-
- if (dspp->idx >= DSPP_MAX || !info[dspp->idx].ad4_support) {
- DRM_ERROR("ad4 not supported for dspp idx %d\n", dspp->idx);
- return -EINVAL;
- }
-
- return 0;
-}
-
-static int ad4_params_check(struct dpu_hw_dspp *dspp,
- struct dpu_ad_hw_cfg *cfg)
-{
- struct dpu_hw_mixer *hw_lm;
-
- if (!dspp || !cfg || !cfg->hw_cfg) {
- DRM_ERROR("invalid dspp %pK cfg %pK hw_cfg %pK\n",
- dspp, cfg, ((cfg) ? (cfg->hw_cfg) : NULL));
- return -EINVAL;
- }
-
- if (!cfg->hw_cfg->mixer_info) {
- DRM_ERROR("invalid mixed info\n");
- return -EINVAL;
- }
-
- if (dspp->idx >= DSPP_MAX || !info[dspp->idx].ad4_support) {
- DRM_ERROR("ad4 not supported for dspp idx %d\n", dspp->idx);
- return -EINVAL;
- }
-
- if (cfg->prop >= AD_PROPMAX) {
- DRM_ERROR("invalid prop set %d\n", cfg->prop);
- return -EINVAL;
- }
-
- if (info[dspp->idx].state >= ad4_state_max) {
- DRM_ERROR("in max state for dspp idx %d\n", dspp->idx);
- return -EINVAL;
- }
-
- if (!prop_set_func[info[dspp->idx].state][cfg->prop]) {
- DRM_ERROR("prop set not implemented for state %d prop %d\n",
- info[dspp->idx].state, cfg->prop);
- return -EINVAL;
- }
-
- if (!cfg->hw_cfg->num_of_mixers ||
- cfg->hw_cfg->num_of_mixers > CRTC_DUAL_MIXERS) {
- DRM_ERROR("invalid mixer cnt %d\n",
- cfg->hw_cfg->num_of_mixers);
- return -EINVAL;
- }
- hw_lm = cfg->hw_cfg->mixer_info;
- if (!hw_lm) {
- DRM_ERROR("invalid mixer info\n");
- return -EINVAL;
- }
-
- if (cfg->hw_cfg->num_of_mixers == 1 &&
- hw_lm->cfg.out_height != cfg->hw_cfg->displayv &&
- hw_lm->cfg.out_width != cfg->hw_cfg->displayh) {
- DRM_ERROR("single_lm lmh %d lmw %d displayh %d displayw %d\n",
- hw_lm->cfg.out_height, hw_lm->cfg.out_width,
- cfg->hw_cfg->displayh, cfg->hw_cfg->displayv);
- return -EINVAL;
- } else if (hw_lm->cfg.out_height != cfg->hw_cfg->displayv &&
- hw_lm->cfg.out_width != (cfg->hw_cfg->displayh >> 1)) {
- DRM_ERROR("dual_lm lmh %d lmw %d displayh %d displayw %d\n",
- hw_lm->cfg.out_height, hw_lm->cfg.out_width,
- cfg->hw_cfg->displayh, cfg->hw_cfg->displayv);
- return -EINVAL;
- }
-
- return 0;
-}
-
-static int ad4_no_op_setup(struct dpu_hw_dspp *dspp, struct dpu_ad_hw_cfg *cfg)
-{
- return 0;
-}
-
-static int ad4_setup_debug(struct dpu_hw_dspp *dspp, struct dpu_ad_hw_cfg *cfg)
-{
- u32 strength = 0, i = 0;
- struct dpu_hw_mixer *hw_lm;
-
- hw_lm = cfg->hw_cfg->mixer_info;
- if ((cfg->hw_cfg->num_of_mixers == 2) && hw_lm->cfg.right_mixer) {
- /* this AD core is the salve core */
- for (i = DSPP_0; i < DSPP_MAX; i++) {
- if (info[i].is_master) {
- strength = info[i].last_str;
- break;
- }
- }
- } else {
- strength = DPU_REG_READ(&dspp->hw,
- dspp->cap->sblk->ad.base + 0x4c);
- pr_debug("%s(): AD strength = %d\n", __func__, strength);
- }
-
- return 0;
-}
-
-static int ad4_mode_setup(struct dpu_hw_dspp *dspp, enum ad4_modes mode)
-{
- u32 blk_offset;
-
- blk_offset = 0x04;
- if (mode == AD4_OFF) {
- DPU_REG_WRITE(&dspp->hw, dspp->cap->sblk->ad.base + blk_offset,
- 0x101);
- info[dspp->idx].state = ad4_state_idle;
- pr_debug("%s(): AD state move to idle\n", __func__);
- info[dspp->idx].completed_ops_mask = 0;
- /* reset last values to register default */
- info[dspp->idx].last_assertive = 0x80;
- info[dspp->idx].cached_assertive = U8_MAX;
- info[dspp->idx].last_bl = 0xFFFF;
- info[dspp->idx].cached_bl = U64_MAX;
- info[dspp->idx].last_als = 0x0;
- info[dspp->idx].cached_als = U64_MAX;
- } else {
- if (info[dspp->idx].state == ad4_state_idle) {
- info[dspp->idx].frame_count = 0;
- info[dspp->idx].state = ad4_state_startup;
- pr_debug("%s(): AD state move to startup\n", __func__);
- }
- DPU_REG_WRITE(&dspp->hw, dspp->cap->sblk->ad.base + blk_offset,
- 0x100);
- }
-
- return 0;
-}
-
-static int ad4_init_setup(struct dpu_hw_dspp *dspp, struct dpu_ad_hw_cfg *cfg)
-{
- u32 frame_start, frame_end, proc_start, proc_end;
- struct dpu_hw_mixer *hw_lm;
- u32 blk_offset, tile_ctl, val, i;
- u32 off1, off2, off3, off4, off5, off6;
- struct drm_msm_ad4_init *init;
-
- if (!cfg->hw_cfg->payload) {
- info[dspp->idx].completed_ops_mask &= ~ad4_init;
- return 0;
- }
-
- if (cfg->hw_cfg->len != sizeof(struct drm_msm_ad4_init)) {
- DRM_ERROR("invalid sz param exp %zd given %d cfg %pK\n",
- sizeof(struct drm_msm_ad4_init), cfg->hw_cfg->len,
- cfg->hw_cfg->payload);
- return -EINVAL;
- }
-
- hw_lm = cfg->hw_cfg->mixer_info;
- if (cfg->hw_cfg->num_of_mixers == 1) {
- frame_start = 0;
- frame_end = 0xffff;
- proc_start = 0;
- proc_end = 0xffff;
- tile_ctl = 0;
- info[dspp->idx].is_master = true;
- } else {
- tile_ctl = 0x5;
- if (hw_lm->cfg.right_mixer) {
- frame_start = (cfg->hw_cfg->displayh >> 1) -
- MERGE_WIDTH_RIGHT;
- frame_end = cfg->hw_cfg->displayh - 1;
- proc_start = (cfg->hw_cfg->displayh >> 1);
- proc_end = frame_end;
- tile_ctl |= 0x10;
- info[dspp->idx].is_master = false;
- } else {
- frame_start = 0;
- frame_end = (cfg->hw_cfg->displayh >> 1) +
- MERGE_WIDTH_LEFT;
- proc_start = 0;
- proc_end = (cfg->hw_cfg->displayh >> 1) - 1;
- tile_ctl |= 0x10;
- info[dspp->idx].is_master = true;
- }
- }
-
- init = cfg->hw_cfg->payload;
-
- info[dspp->idx].frmt_mode = (init->init_param_009 & (BIT(14) - 1));
-
- blk_offset = 0xc;
- DPU_REG_WRITE(&dspp->hw, dspp->cap->sblk->ad.base + blk_offset,
- init->init_param_010);
-
- init->init_param_012 = cfg->hw_cfg->displayv & (BIT(17) - 1);
- init->init_param_011 = cfg->hw_cfg->displayh & (BIT(17) - 1);
- blk_offset = 0x10;
- DPU_REG_WRITE(&dspp->hw, dspp->cap->sblk->ad.base + blk_offset,
- ((init->init_param_011 << 16) | init->init_param_012));
-
- blk_offset = 0x14;
- DPU_REG_WRITE(&dspp->hw, dspp->cap->sblk->ad.base + blk_offset,
- tile_ctl);
-
- blk_offset = 0x44;
- DPU_REG_WRITE(&dspp->hw, dspp->cap->sblk->ad.base + blk_offset,
- ((((init->init_param_013) & (BIT(17) - 1)) << 16) |
- (init->init_param_014 & (BIT(17) - 1))));
-
- blk_offset = 0x5c;
- DPU_REG_WRITE(&dspp->hw, dspp->cap->sblk->ad.base + blk_offset,
- (init->init_param_015 & (BIT(16) - 1)));
- blk_offset = 0x60;
- DPU_REG_WRITE(&dspp->hw, dspp->cap->sblk->ad.base + blk_offset,
- (init->init_param_016 & (BIT(8) - 1)));
- blk_offset = 0x64;
- DPU_REG_WRITE(&dspp->hw, dspp->cap->sblk->ad.base + blk_offset,
- (init->init_param_017 & (BIT(12) - 1)));
- blk_offset = 0x68;
- DPU_REG_WRITE(&dspp->hw, dspp->cap->sblk->ad.base + blk_offset,
- (init->init_param_018 & (BIT(12) - 1)));
- blk_offset = 0x6c;
- DPU_REG_WRITE(&dspp->hw, dspp->cap->sblk->ad.base + blk_offset,
- (init->init_param_019 & (BIT(12) - 1)));
- blk_offset = 0x70;
- DPU_REG_WRITE(&dspp->hw, dspp->cap->sblk->ad.base + blk_offset,
- (init->init_param_020 & (BIT(16) - 1)));
- blk_offset = 0x74;
- DPU_REG_WRITE(&dspp->hw, dspp->cap->sblk->ad.base + blk_offset,
- (init->init_param_021 & (BIT(8) - 1)));
- blk_offset = 0x78;
- DPU_REG_WRITE(&dspp->hw, dspp->cap->sblk->ad.base + blk_offset,
- (init->init_param_022 & (BIT(8) - 1)));
- blk_offset = 0x7c;
- DPU_REG_WRITE(&dspp->hw, dspp->cap->sblk->ad.base + blk_offset,
- (init->init_param_023 & (BIT(16) - 1)));
- blk_offset = 0x80;
- DPU_REG_WRITE(&dspp->hw, dspp->cap->sblk->ad.base + blk_offset,
- (((init->init_param_024 & (BIT(16) - 1)) << 16) |
- ((init->init_param_025 & (BIT(16) - 1)))));
- blk_offset = 0x84;
- DPU_REG_WRITE(&dspp->hw, dspp->cap->sblk->ad.base + blk_offset,
- (((init->init_param_026 & (BIT(16) - 1)) << 16) |
- ((init->init_param_027 & (BIT(16) - 1)))));
-
- blk_offset = 0x90;
- DPU_REG_WRITE(&dspp->hw, dspp->cap->sblk->ad.base + blk_offset,
- (init->init_param_028 & (BIT(16) - 1)));
- blk_offset = 0x94;
- DPU_REG_WRITE(&dspp->hw, dspp->cap->sblk->ad.base + blk_offset,
- (init->init_param_029 & (BIT(16) - 1)));
-
- blk_offset = 0x98;
- DPU_REG_WRITE(&dspp->hw, dspp->cap->sblk->ad.base + blk_offset,
- (((init->init_param_035 & (BIT(16) - 1)) << 16) |
- ((init->init_param_030 & (BIT(16) - 1)))));
-
- blk_offset = 0x9c;
- DPU_REG_WRITE(&dspp->hw, dspp->cap->sblk->ad.base + blk_offset,
- (((init->init_param_032 & (BIT(16) - 1)) << 16) |
- ((init->init_param_031 & (BIT(16) - 1)))));
- blk_offset = 0xa0;
- DPU_REG_WRITE(&dspp->hw, dspp->cap->sblk->ad.base + blk_offset,
- (((init->init_param_034 & (BIT(16) - 1)) << 16) |
- ((init->init_param_033 & (BIT(16) - 1)))));
-
- blk_offset = 0xb4;
- DPU_REG_WRITE(&dspp->hw, dspp->cap->sblk->ad.base + blk_offset,
- (init->init_param_036 & (BIT(8) - 1)));
- blk_offset = 0xcc;
- DPU_REG_WRITE(&dspp->hw, dspp->cap->sblk->ad.base + blk_offset,
- (init->init_param_037 & (BIT(8) - 1)));
- blk_offset = 0xc0;
- DPU_REG_WRITE(&dspp->hw, dspp->cap->sblk->ad.base + blk_offset,
- (init->init_param_038 & (BIT(8) - 1)));
- blk_offset = 0xd8;
- DPU_REG_WRITE(&dspp->hw, dspp->cap->sblk->ad.base + blk_offset,
- (init->init_param_039 & (BIT(8) - 1)));
-
- blk_offset = 0xe8;
- DPU_REG_WRITE(&dspp->hw, dspp->cap->sblk->ad.base + blk_offset,
- (init->init_param_040 & (BIT(16) - 1)));
-
- blk_offset = 0xf4;
- DPU_REG_WRITE(&dspp->hw, dspp->cap->sblk->ad.base + blk_offset,
- (init->init_param_041 & (BIT(8) - 1)));
-
- blk_offset = 0x100;
- DPU_REG_WRITE(&dspp->hw, dspp->cap->sblk->ad.base + blk_offset,
- (init->init_param_042 & (BIT(16) - 1)));
-
- blk_offset = 0x10c;
- DPU_REG_WRITE(&dspp->hw, dspp->cap->sblk->ad.base + blk_offset,
- (init->init_param_043 & (BIT(8) - 1)));
-
- blk_offset = 0x120;
- DPU_REG_WRITE(&dspp->hw, dspp->cap->sblk->ad.base + blk_offset,
- (init->init_param_044 & (BIT(16) - 1)));
- blk_offset = 0x124;
- DPU_REG_WRITE(&dspp->hw, dspp->cap->sblk->ad.base + blk_offset,
- (init->init_param_045 & (BIT(16) - 1)));
-
- blk_offset = 0x128;
- DPU_REG_WRITE(&dspp->hw, dspp->cap->sblk->ad.base + blk_offset,
- (init->init_param_046 & (BIT(1) - 1)));
- blk_offset = 0x12c;
- DPU_REG_WRITE(&dspp->hw, dspp->cap->sblk->ad.base + blk_offset,
- (init->init_param_047 & (BIT(8) - 1)));
-
- info[dspp->idx].irdx_control_0 = (init->init_param_048 & (BIT(5) - 1));
-
- blk_offset = 0x140;
- DPU_REG_WRITE(&dspp->hw, dspp->cap->sblk->ad.base + blk_offset,
- (init->init_param_049 & (BIT(8) - 1)));
-
- blk_offset = 0x144;
- DPU_REG_WRITE(&dspp->hw, dspp->cap->sblk->ad.base + blk_offset,
- (init->init_param_050 & (BIT(8) - 1)));
- blk_offset = 0x148;
- DPU_REG_WRITE(&dspp->hw, dspp->cap->sblk->ad.base + blk_offset,
- (((init->init_param_051 & (BIT(8) - 1)) << 8) |
- ((init->init_param_052 & (BIT(8) - 1)))));
-
- blk_offset = 0x14c;
- DPU_REG_WRITE(&dspp->hw, dspp->cap->sblk->ad.base + blk_offset,
- (init->init_param_053 & (BIT(10) - 1)));
- blk_offset = 0x150;
- DPU_REG_WRITE(&dspp->hw, dspp->cap->sblk->ad.base + blk_offset,
- (init->init_param_054 & (BIT(10) - 1)));
- blk_offset = 0x154;
- DPU_REG_WRITE(&dspp->hw, dspp->cap->sblk->ad.base + blk_offset,
- (init->init_param_055 & (BIT(8) - 1)));
-
- blk_offset = 0x158;
- DPU_REG_WRITE(&dspp->hw, dspp->cap->sblk->ad.base + blk_offset,
- (init->init_param_056 & (BIT(8) - 1)));
- blk_offset = 0x164;
- DPU_REG_WRITE(&dspp->hw, dspp->cap->sblk->ad.base + blk_offset,
- (init->init_param_057 & (BIT(8) - 1)));
- blk_offset = 0x168;
- DPU_REG_WRITE(&dspp->hw, dspp->cap->sblk->ad.base + blk_offset,
- (init->init_param_058 & (BIT(4) - 1)));
-
- blk_offset = 0x17c;
- DPU_REG_WRITE(&dspp->hw, dspp->cap->sblk->ad.base + blk_offset,
- (frame_start & (BIT(16) - 1)));
- blk_offset = 0x180;
- DPU_REG_WRITE(&dspp->hw, dspp->cap->sblk->ad.base + blk_offset,
- (frame_end & (BIT(16) - 1)));
- blk_offset = 0x184;
- DPU_REG_WRITE(&dspp->hw, dspp->cap->sblk->ad.base + blk_offset,
- (proc_start & (BIT(16) - 1)));
- blk_offset = 0x188;
- DPU_REG_WRITE(&dspp->hw, dspp->cap->sblk->ad.base + blk_offset,
- (proc_end & (BIT(16) - 1)));
-
- blk_offset = 0x18c;
- DPU_REG_WRITE(&dspp->hw, dspp->cap->sblk->ad.base + blk_offset,
- (init->init_param_059 & (BIT(4) - 1)));
-
- blk_offset = 0x190;
- DPU_REG_WRITE(&dspp->hw, dspp->cap->sblk->ad.base + blk_offset,
- (((init->init_param_061 & (BIT(8) - 1)) << 8) |
- ((init->init_param_060 & (BIT(8) - 1)))));
-
- blk_offset = 0x194;
- DPU_REG_WRITE(&dspp->hw, dspp->cap->sblk->ad.base + blk_offset,
- (init->init_param_062 & (BIT(10) - 1)));
-
- blk_offset = 0x1a0;
- DPU_REG_WRITE(&dspp->hw, dspp->cap->sblk->ad.base + blk_offset,
- (init->init_param_063 & (BIT(10) - 1)));
- blk_offset = 0x1a4;
- DPU_REG_WRITE(&dspp->hw, dspp->cap->sblk->ad.base + blk_offset,
- (init->init_param_064 & (BIT(10) - 1)));
- blk_offset = 0x1a8;
- DPU_REG_WRITE(&dspp->hw, dspp->cap->sblk->ad.base + blk_offset,
- (init->init_param_065 & (BIT(10) - 1)));
- blk_offset = 0x1ac;
- DPU_REG_WRITE(&dspp->hw, dspp->cap->sblk->ad.base + blk_offset,
- (init->init_param_066 & (BIT(8) - 1)));
- blk_offset = 0x1b0;
- DPU_REG_WRITE(&dspp->hw, dspp->cap->sblk->ad.base + blk_offset,
- (init->init_param_067 & (BIT(8) - 1)));
- blk_offset = 0x1b4;
- DPU_REG_WRITE(&dspp->hw, dspp->cap->sblk->ad.base + blk_offset,
- (init->init_param_068 & (BIT(6) - 1)));
-
- blk_offset = 0x460;
- DPU_REG_WRITE(&dspp->hw, dspp->cap->sblk->ad.base + blk_offset,
- (init->init_param_069 & (BIT(16) - 1)));
- blk_offset = 0x464;
- DPU_REG_WRITE(&dspp->hw, dspp->cap->sblk->ad.base + blk_offset,
- (init->init_param_070 & (BIT(10) - 1)));
- blk_offset = 0x468;
- DPU_REG_WRITE(&dspp->hw, dspp->cap->sblk->ad.base + blk_offset,
- (init->init_param_071 & (BIT(10) - 1)));
- blk_offset = 0x46c;
- DPU_REG_WRITE(&dspp->hw, dspp->cap->sblk->ad.base + blk_offset,
- (init->init_param_072 & (BIT(10) - 1)));
- blk_offset = 0x470;
- DPU_REG_WRITE(&dspp->hw, dspp->cap->sblk->ad.base + blk_offset,
- (init->init_param_073 & (BIT(8) - 1)));
- blk_offset = 0x474;
- DPU_REG_WRITE(&dspp->hw, dspp->cap->sblk->ad.base + blk_offset,
- (init->init_param_074 & (BIT(10) - 1)));
- blk_offset = 0x478;
- DPU_REG_WRITE(&dspp->hw, dspp->cap->sblk->ad.base + blk_offset,
- (init->init_param_075 & (BIT(10) - 1)));
-
- off1 = 0x1c0;
- off2 = 0x210;
- off3 = 0x260;
- off4 = 0x2b0;
- off5 = 0x380;
- off6 = 0x3d0;
- for (i = 0; i < AD4_LUT_GRP0_SIZE - 1; i = i + 2) {
- val = (init->init_param_001[i] & (BIT(16) - 1));
- val |= ((init->init_param_001[i + 1] & (BIT(16) - 1))
- << 16);
- DPU_REG_WRITE(&dspp->hw, dspp->cap->sblk->ad.base + off1, val);
- off1 += 4;
-
- val = (init->init_param_002[i] & (BIT(16) - 1));
- val |= ((init->init_param_002[i + 1] & (BIT(16) - 1))
- << 16);
- DPU_REG_WRITE(&dspp->hw, dspp->cap->sblk->ad.base + off2, val);
- off2 += 4;
-
- val = (init->init_param_003[i] & (BIT(16) - 1));
- val |= ((init->init_param_003[i + 1] & (BIT(16) - 1))
- << 16);
- DPU_REG_WRITE(&dspp->hw, dspp->cap->sblk->ad.base + off3, val);
- off3 += 4;
-
- val = (init->init_param_004[i] & (BIT(16) - 1));
- val |= ((init->init_param_004[i + 1] & (BIT(16) - 1))
- << 16);
- DPU_REG_WRITE(&dspp->hw, dspp->cap->sblk->ad.base + off4, val);
- off4 += 4;
-
- val = (init->init_param_007[i] & (BIT(16) - 1));
- val |= ((init->init_param_007[i + 1] &
- (BIT(16) - 1)) << 16);
- DPU_REG_WRITE(&dspp->hw, dspp->cap->sblk->ad.base + off5, val);
- off5 += 4;
-
- val = (init->init_param_008[i] & (BIT(12) - 1));
- val |= ((init->init_param_008[i + 1] &
- (BIT(12) - 1)) << 16);
- DPU_REG_WRITE(&dspp->hw, dspp->cap->sblk->ad.base + off6, val);
- off6 += 4;
- }
- /* write last index data */
- i = AD4_LUT_GRP0_SIZE - 1;
- val = ((init->init_param_001[i] & (BIT(16) - 1)) << 16);
- DPU_REG_WRITE(&dspp->hw, dspp->cap->sblk->ad.base + off1, val);
- val = ((init->init_param_002[i] & (BIT(16) - 1)) << 16);
- DPU_REG_WRITE(&dspp->hw, dspp->cap->sblk->ad.base + off2, val);
- val = ((init->init_param_003[i] & (BIT(16) - 1)) << 16);
- DPU_REG_WRITE(&dspp->hw, dspp->cap->sblk->ad.base + off3, val);
- val = ((init->init_param_004[i] & (BIT(16) - 1)) << 16);
- DPU_REG_WRITE(&dspp->hw, dspp->cap->sblk->ad.base + off4, val);
- val = ((init->init_param_007[i] & (BIT(16) - 1)) << 16);
- DPU_REG_WRITE(&dspp->hw, dspp->cap->sblk->ad.base + off5, val);
- val = ((init->init_param_008[i] & (BIT(12) - 1)) << 16);
- DPU_REG_WRITE(&dspp->hw, dspp->cap->sblk->ad.base + off6, val);
-
- off1 = 0x300;
- off2 = 0x340;
- for (i = 0; i < AD4_LUT_GRP1_SIZE; i = i + 2) {
- val = (init->init_param_005[i] & (BIT(16) - 1));
- val |= ((init->init_param_005[i + 1] &
- (BIT(16) - 1)) << 16);
- DPU_REG_WRITE(&dspp->hw, dspp->cap->sblk->ad.base + off1, val);
- off1 += 4;
-
- val = (init->init_param_006[i] & (BIT(16) - 1));
- val |= ((init->init_param_006[i + 1] & (BIT(16) - 1))
- << 16);
- DPU_REG_WRITE(&dspp->hw, dspp->cap->sblk->ad.base + off2, val);
- off2 += 4;
- }
-
- return 0;
-}
-
-static int ad4_cfg_setup(struct dpu_hw_dspp *dspp, struct dpu_ad_hw_cfg *cfg)
-{
- u32 blk_offset, val;
- struct drm_msm_ad4_cfg *ad_cfg;
-
- if (!cfg->hw_cfg->payload) {
- info[dspp->idx].completed_ops_mask &= ~ad4_cfg;
- return 0;
- }
-
- if (cfg->hw_cfg->len != sizeof(struct drm_msm_ad4_cfg)) {
- DRM_ERROR("invalid sz param exp %zd given %d cfg %pK\n",
- sizeof(struct drm_msm_ad4_cfg), cfg->hw_cfg->len,
- cfg->hw_cfg->payload);
- return -EINVAL;
- }
- ad_cfg = cfg->hw_cfg->payload;
-
- blk_offset = 0x18;
- val = (ad_cfg->cfg_param_002 & (BIT(16) - 1));
- val |= ((ad_cfg->cfg_param_001 & (BIT(16) - 1)) << 16);
- DPU_REG_WRITE(&dspp->hw, dspp->cap->sblk->ad.base + blk_offset, val);
- blk_offset += 4;
- val = (ad_cfg->cfg_param_004 & (BIT(16) - 1));
- val |= ((ad_cfg->cfg_param_003 & (BIT(16) - 1)) << 16);
- DPU_REG_WRITE(&dspp->hw, dspp->cap->sblk->ad.base + blk_offset, val);
-
- blk_offset = 0x20;
- val = (ad_cfg->cfg_param_005 & (BIT(8) - 1));
- DPU_REG_WRITE(&dspp->hw, dspp->cap->sblk->ad.base + blk_offset, val);
- blk_offset = 0x24;
- val = (ad_cfg->cfg_param_006 & (BIT(7) - 1));
- DPU_REG_WRITE(&dspp->hw, dspp->cap->sblk->ad.base + blk_offset, val);
-
- info[dspp->idx].tf_ctrl = (ad_cfg->cfg_param_008 & (BIT(8) - 1));
-
- blk_offset = 0x38;
- val = (ad_cfg->cfg_param_009 & (BIT(10) - 1));
- DPU_REG_WRITE(&dspp->hw, dspp->cap->sblk->ad.base + blk_offset, val);
-
- blk_offset = 0x3c;
- val = (ad_cfg->cfg_param_010 & (BIT(12) - 1));
- DPU_REG_WRITE(&dspp->hw, dspp->cap->sblk->ad.base + blk_offset, val);
- blk_offset += 4;
- val = ((ad_cfg->cfg_param_011 & (BIT(16) - 1)) << 16);
- val |= (ad_cfg->cfg_param_012 & (BIT(16) - 1));
- DPU_REG_WRITE(&dspp->hw, dspp->cap->sblk->ad.base + blk_offset, val);
-
- blk_offset = 0x88;
- val = (ad_cfg->cfg_param_013 & (BIT(8) - 1));
- DPU_REG_WRITE(&dspp->hw, dspp->cap->sblk->ad.base + blk_offset, val);
- blk_offset += 4;
- val = (ad_cfg->cfg_param_014 & (BIT(16) - 1));
- DPU_REG_WRITE(&dspp->hw, dspp->cap->sblk->ad.base + blk_offset, val);
-
- blk_offset = 0xa4;
- val = (ad_cfg->cfg_param_015 & (BIT(16) - 1));
- DPU_REG_WRITE(&dspp->hw, dspp->cap->sblk->ad.base + blk_offset, val);
- blk_offset += 4;
- val = (ad_cfg->cfg_param_016 & (BIT(10) - 1));
- DPU_REG_WRITE(&dspp->hw, dspp->cap->sblk->ad.base + blk_offset, val);
- blk_offset += 4;
- val = (ad_cfg->cfg_param_017 & (BIT(16) - 1));
- DPU_REG_WRITE(&dspp->hw, dspp->cap->sblk->ad.base + blk_offset, val);
- blk_offset += 4;
- val = (ad_cfg->cfg_param_018 & (BIT(16) - 1));
- DPU_REG_WRITE(&dspp->hw, dspp->cap->sblk->ad.base + blk_offset, val);
-
- blk_offset = 0xc4;
- val = (ad_cfg->cfg_param_019 & (BIT(16) - 1));
- DPU_REG_WRITE(&dspp->hw, dspp->cap->sblk->ad.base + blk_offset, val);
- blk_offset += 4;
- val = (ad_cfg->cfg_param_020 & (BIT(16) - 1));
- DPU_REG_WRITE(&dspp->hw, dspp->cap->sblk->ad.base + blk_offset, val);
-
- blk_offset = 0xb8;
- val = (ad_cfg->cfg_param_021 & (BIT(16) - 1));
- DPU_REG_WRITE(&dspp->hw, dspp->cap->sblk->ad.base + blk_offset, val);
- blk_offset += 4;
- val = (ad_cfg->cfg_param_022 & (BIT(16) - 1));
- DPU_REG_WRITE(&dspp->hw, dspp->cap->sblk->ad.base + blk_offset, val);
-
- blk_offset = 0xd0;
- val = (ad_cfg->cfg_param_023 & (BIT(16) - 1));
- DPU_REG_WRITE(&dspp->hw, dspp->cap->sblk->ad.base + blk_offset, val);
- blk_offset += 4;
- val = (ad_cfg->cfg_param_024 & (BIT(16) - 1));
- DPU_REG_WRITE(&dspp->hw, dspp->cap->sblk->ad.base + blk_offset, val);
-
- blk_offset = 0xdc;
- val = (ad_cfg->cfg_param_025 & (BIT(16) - 1));
- val |= ((ad_cfg->cfg_param_026 & (BIT(16) - 1)) << 16);
- DPU_REG_WRITE(&dspp->hw, dspp->cap->sblk->ad.base + blk_offset, val);
- blk_offset += 4;
- val = (ad_cfg->cfg_param_027 & (BIT(16) - 1));
- val |= ((ad_cfg->cfg_param_028 & (BIT(16) - 1)) << 16);
- blk_offset += 4;
- val = (ad_cfg->cfg_param_029 & (BIT(16) - 1));
- DPU_REG_WRITE(&dspp->hw, dspp->cap->sblk->ad.base + blk_offset, val);
-
- blk_offset = 0xec;
- val = (ad_cfg->cfg_param_030 & (BIT(16) - 1));
- DPU_REG_WRITE(&dspp->hw, dspp->cap->sblk->ad.base + blk_offset, val);
- blk_offset += 4;
- val = (ad_cfg->cfg_param_031 & (BIT(12) - 1));
- DPU_REG_WRITE(&dspp->hw, dspp->cap->sblk->ad.base + blk_offset, val);
-
- blk_offset = 0xf8;
- val = (ad_cfg->cfg_param_032 & (BIT(10) - 1));
- DPU_REG_WRITE(&dspp->hw, dspp->cap->sblk->ad.base + blk_offset, val);
- blk_offset += 4;
- val = (ad_cfg->cfg_param_033 & (BIT(8) - 1));
- DPU_REG_WRITE(&dspp->hw, dspp->cap->sblk->ad.base + blk_offset, val);
-
- blk_offset = 0x104;
- val = (ad_cfg->cfg_param_034 & (BIT(16) - 1));
- DPU_REG_WRITE(&dspp->hw, dspp->cap->sblk->ad.base + blk_offset, val);
- blk_offset += 4;
- val = (ad_cfg->cfg_param_035 & (BIT(12) - 1));
- DPU_REG_WRITE(&dspp->hw, dspp->cap->sblk->ad.base + blk_offset, val);
-
- blk_offset = 0x110;
- val = (ad_cfg->cfg_param_036 & (BIT(12) - 1));
- DPU_REG_WRITE(&dspp->hw, dspp->cap->sblk->ad.base + blk_offset, val);
- blk_offset += 4;
- val = (ad_cfg->cfg_param_037 & (BIT(12) - 1));
- DPU_REG_WRITE(&dspp->hw, dspp->cap->sblk->ad.base + blk_offset, val);
- blk_offset += 4;
- val = (ad_cfg->cfg_param_038 & (BIT(8) - 1));
- DPU_REG_WRITE(&dspp->hw, dspp->cap->sblk->ad.base + blk_offset, val);
- blk_offset += 4;
- val = (ad_cfg->cfg_param_039 & (BIT(8) - 1));
- DPU_REG_WRITE(&dspp->hw, dspp->cap->sblk->ad.base + blk_offset, val);
-
- blk_offset = 0x134;
- val = (ad_cfg->cfg_param_040 & (BIT(12) - 1));
- DPU_REG_WRITE(&dspp->hw, dspp->cap->sblk->ad.base + blk_offset, val);
-
- info[dspp->idx].vc_control_0 = (ad_cfg->cfg_param_041 & (BIT(7) - 1));
-
- blk_offset += 160;
- val = (ad_cfg->cfg_param_043 & (BIT(10) - 1));
- DPU_REG_WRITE(&dspp->hw, dspp->cap->sblk->ad.base + blk_offset, val);
-
- blk_offset = 0x16c;
- val = (ad_cfg->cfg_param_044 & (BIT(8) - 1));
- DPU_REG_WRITE(&dspp->hw, dspp->cap->sblk->ad.base + blk_offset, val);
- blk_offset += 4;
- val = (ad_cfg->cfg_param_045 & (BIT(8) - 1));
- DPU_REG_WRITE(&dspp->hw, dspp->cap->sblk->ad.base + blk_offset, val);
- blk_offset += 4;
- val = (ad_cfg->cfg_param_046 & (BIT(16) - 1));
- DPU_REG_WRITE(&dspp->hw, dspp->cap->sblk->ad.base + blk_offset, val);
-
- return 0;
-}
-
-static int ad4_input_setup(struct dpu_hw_dspp *dspp,
- struct dpu_ad_hw_cfg *cfg)
-{
- u64 *val, als;
- u32 blk_offset;
-
- if (cfg->hw_cfg->len != sizeof(u64) && cfg->hw_cfg->payload) {
- DRM_ERROR("invalid sz param exp %zd given %d cfg %pK\n",
- sizeof(u64), cfg->hw_cfg->len, cfg->hw_cfg->payload);
- return -EINVAL;
- }
-
- blk_offset = 0x28;
- if (cfg->hw_cfg->payload) {
- val = cfg->hw_cfg->payload;
- } else {
- als = 0;
- val = &als;
- }
- info[dspp->idx].last_als = (*val & (BIT(16) - 1));
- info[dspp->idx].completed_ops_mask |= ad4_input;
- DPU_REG_WRITE(&dspp->hw, dspp->cap->sblk->ad.base + blk_offset,
- info[dspp->idx].last_als);
- return 0;
-}
-
-static int ad4_suspend_setup(struct dpu_hw_dspp *dspp,
- struct dpu_ad_hw_cfg *cfg)
-{
- info[dspp->idx].state = ad4_state_idle;
- pr_debug("%s(): AD state move to idle\n", __func__);
- info[dspp->idx].completed_ops_mask = 0;
- return 0;
-}
-
-static int ad4_mode_setup_common(struct dpu_hw_dspp *dspp,
- struct dpu_ad_hw_cfg *cfg)
-{
-
- if (cfg->hw_cfg->len != sizeof(u64) || !cfg->hw_cfg->payload) {
- DRM_ERROR("invalid sz param exp %zd given %d cfg %pK\n",
- sizeof(u64), cfg->hw_cfg->len, cfg->hw_cfg->payload);
- return -EINVAL;
- }
-
- info[dspp->idx].mode = *((enum ad4_modes *)
- (cfg->hw_cfg->payload));
- info[dspp->idx].completed_ops_mask |= ad4_mode;
-
- if (AD_STATE_READY(info[dspp->idx].completed_ops_mask) ||
- info[dspp->idx].mode == AD4_OFF)
- ad4_mode_setup(dspp, info[dspp->idx].mode);
-
- return 0;
-}
-
-static int ad4_init_setup_idle(struct dpu_hw_dspp *dspp,
- struct dpu_ad_hw_cfg *cfg)
-{
- int ret;
- u32 blk_offset;
-
- if (!cfg->hw_cfg->payload) {
- info[dspp->idx].completed_ops_mask &= ~ad4_init;
- return 0;
- }
-
- ret = ad4_init_setup(dspp, cfg);
- if (ret)
- return ret;
-
- /* enable memory initialization*/
- /* frmt mode */
- blk_offset = 0x8;
- DPU_REG_WRITE(&dspp->hw, dspp->cap->sblk->ad.base + blk_offset,
- (info[dspp->idx].frmt_mode & 0x1fff));
- /* memory init */
- blk_offset = 0x450;
- DPU_REG_WRITE(&dspp->hw, dspp->cap->sblk->ad.base + blk_offset, 0x1);
-
- /* enforce 0 initial strength when powering up AD config */
- /* irdx_control_0 */
- blk_offset = 0x13c;
- DPU_REG_WRITE(&dspp->hw, dspp->cap->sblk->ad.base + blk_offset, 0x6);
-
- info[dspp->idx].completed_ops_mask |= ad4_init;
-
- if (AD_STATE_READY(info[dspp->idx].completed_ops_mask))
- ad4_mode_setup(dspp, info[dspp->idx].mode);
-
- return 0;
-}
-
-static int ad4_init_setup_run(struct dpu_hw_dspp *dspp,
- struct dpu_ad_hw_cfg *cfg)
-{
- int ret;
- u32 blk_offset;
-
- if (!cfg->hw_cfg->payload) {
- info[dspp->idx].completed_ops_mask &= ~ad4_init;
- return 0;
- }
-
- ret = ad4_init_setup(dspp, cfg);
- if (ret)
- return ret;
-
- /* disable memory initialization*/
- /* frmt mode */
- blk_offset = 0x8;
- DPU_REG_WRITE(&dspp->hw, dspp->cap->sblk->ad.base + blk_offset,
- (info[dspp->idx].frmt_mode | 0x2000));
- /* no need to explicitly set memory initialization sequence,
- * since AD hw were not powered off.
- */
-
- /* irdx_control_0 */
- blk_offset = 0x13c;
- DPU_REG_WRITE(&dspp->hw, dspp->cap->sblk->ad.base + blk_offset,
- info[dspp->idx].irdx_control_0);
-
- return 0;
-}
-
-static int ad4_init_setup_ipcr(struct dpu_hw_dspp *dspp,
- struct dpu_ad_hw_cfg *cfg)
-{
- int ret;
- u32 blk_offset;
-
- if (!cfg->hw_cfg->payload) {
- info[dspp->idx].completed_ops_mask &= ~ad4_init;
- return 0;
- }
-
- ret = ad4_init_setup(dspp, cfg);
- if (ret)
- return ret;
- /* no need to explicitly set memory initialization sequence,
- * since register reset values are the correct configuration
- */
- /* frmt mode */
- blk_offset = 0x8;
- DPU_REG_WRITE(&dspp->hw, dspp->cap->sblk->ad.base + blk_offset,
- (info[dspp->idx].frmt_mode | 0x2000));
- /* irdx_control_0 */
- blk_offset = 0x13c;
- DPU_REG_WRITE(&dspp->hw, dspp->cap->sblk->ad.base + blk_offset,
- info[dspp->idx].irdx_control_0);
-
- info[dspp->idx].completed_ops_mask |= ad4_init;
- if (AD_STATE_READY(info[dspp->idx].completed_ops_mask))
- ad4_mode_setup(dspp, info[dspp->idx].mode);
-
- return 0;
-}
-
-static int ad4_cfg_setup_idle(struct dpu_hw_dspp *dspp,
- struct dpu_ad_hw_cfg *cfg)
-{
- int ret;
- u32 blk_offset;
-
- if (!cfg->hw_cfg->payload) {
- info[dspp->idx].completed_ops_mask &= ~ad4_cfg;
- return 0;
- }
-
- ret = ad4_cfg_setup(dspp, cfg);
- if (ret)
- return ret;
-
- /* enforce 0 initial strength when powering up AD config */
- /* assertiveness */
- blk_offset = 0x30;
- DPU_REG_WRITE(&dspp->hw, dspp->cap->sblk->ad.base + blk_offset, 0x0);
- /* tf control */
- blk_offset = 0x34;
- DPU_REG_WRITE(&dspp->hw, dspp->cap->sblk->ad.base + blk_offset, 0x55);
-
- /* vc_control_0 */
- blk_offset = 0x138;
- DPU_REG_WRITE(&dspp->hw, dspp->cap->sblk->ad.base + blk_offset,
- info[dspp->idx].vc_control_0);
-
- info[dspp->idx].completed_ops_mask |= ad4_cfg;
- if (AD_STATE_READY(info[dspp->idx].completed_ops_mask))
- ad4_mode_setup(dspp, info[dspp->idx].mode);
- return 0;
-}
-
-static int ad4_cfg_setup_run(struct dpu_hw_dspp *dspp,
- struct dpu_ad_hw_cfg *cfg)
-{
- int ret;
- u32 blk_offset;
-
- if (!cfg->hw_cfg->payload) {
- info[dspp->idx].completed_ops_mask &= ~ad4_cfg;
- return 0;
- }
-
- ret = ad4_cfg_setup(dspp, cfg);
- if (ret)
- return ret;
-
- /* assertiveness */
- blk_offset = 0x30;
- DPU_REG_WRITE(&dspp->hw, dspp->cap->sblk->ad.base + blk_offset,
- info[dspp->idx].last_assertive);
- /* tf control */
- blk_offset = 0x34;
- DPU_REG_WRITE(&dspp->hw, dspp->cap->sblk->ad.base + blk_offset,
- info[dspp->idx].tf_ctrl);
- /* vc_control_0 */
- blk_offset = 0x138;
- DPU_REG_WRITE(&dspp->hw, dspp->cap->sblk->ad.base + blk_offset,
- info[dspp->idx].vc_control_0);
-
- return 0;
-}
-
-static int ad4_cfg_setup_ipcr(struct dpu_hw_dspp *dspp,
- struct dpu_ad_hw_cfg *cfg)
-{
- int ret;
- u32 blk_offset;
-
- if (!cfg->hw_cfg->payload) {
- info[dspp->idx].completed_ops_mask &= ~ad4_cfg;
- return 0;
- }
-
- ret = ad4_cfg_setup(dspp, cfg);
- if (ret)
- return ret;
-
- /* assertiveness */
- blk_offset = 0x30;
- DPU_REG_WRITE(&dspp->hw, dspp->cap->sblk->ad.base + blk_offset,
- info[dspp->idx].last_assertive);
-
- info[dspp->idx].completed_ops_mask |= ad4_cfg;
- if (AD_STATE_READY(info[dspp->idx].completed_ops_mask))
- ad4_mode_setup(dspp, info[dspp->idx].mode);
- return 0;
-}
-
-static int ad4_input_setup_idle(struct dpu_hw_dspp *dspp,
- struct dpu_ad_hw_cfg *cfg)
-{
- int ret;
-
- ret = ad4_input_setup(dspp, cfg);
- if (ret)
- return ret;
-
- info[dspp->idx].completed_ops_mask |= ad4_input;
- if (AD_STATE_READY(info[dspp->idx].completed_ops_mask))
- ad4_mode_setup(dspp, info[dspp->idx].mode);
-
- return 0;
-}
-
-static int ad4_input_setup_ipcr(struct dpu_hw_dspp *dspp,
- struct dpu_ad_hw_cfg *cfg)
-{
- u64 *val, als;
- u32 blk_offset;
-
- if (cfg->hw_cfg->len != sizeof(u64) && cfg->hw_cfg->payload) {
- DRM_ERROR("invalid sz param exp %zd given %d cfg %pK\n",
- sizeof(u64), cfg->hw_cfg->len, cfg->hw_cfg->payload);
- return -EINVAL;
- }
-
- blk_offset = 0x28;
- if (cfg->hw_cfg->payload) {
- val = cfg->hw_cfg->payload;
- } else {
- als = 0;
- val = &als;
- }
- info[dspp->idx].cached_als = *val & (BIT(16) - 1);
- info[dspp->idx].completed_ops_mask |= ad4_input;
- DPU_REG_WRITE(&dspp->hw, dspp->cap->sblk->ad.base + blk_offset,
- info[dspp->idx].last_als);
-
- if (AD_STATE_READY(info[dspp->idx].completed_ops_mask))
- ad4_mode_setup(dspp, info[dspp->idx].mode);
-
- return 0;
-}
-
-static int ad4_assertive_setup(struct dpu_hw_dspp *dspp,
- struct dpu_ad_hw_cfg *cfg)
-{
- u64 *val, assertive;
- u32 blk_offset;
-
- if (cfg->hw_cfg->len != sizeof(u64) && cfg->hw_cfg->payload) {
- DRM_ERROR("invalid sz param exp %zd given %d cfg %pK\n",
- sizeof(u64), cfg->hw_cfg->len, cfg->hw_cfg->payload);
- return -EINVAL;
- }
-
- blk_offset = 0x30;
- if (cfg->hw_cfg->payload) {
- val = cfg->hw_cfg->payload;
- } else {
- assertive = 0;
- val = &assertive;
- }
-
- info[dspp->idx].last_assertive = *val & (BIT(8) - 1);
- DPU_REG_WRITE(&dspp->hw, dspp->cap->sblk->ad.base + blk_offset,
- (info[dspp->idx].last_assertive));
- return 0;
-}
-
-static int ad4_assertive_setup_ipcr(struct dpu_hw_dspp *dspp,
- struct dpu_ad_hw_cfg *cfg)
-{
- u64 *val, assertive;
- u32 blk_offset;
-
- if (cfg->hw_cfg->len != sizeof(u64) && cfg->hw_cfg->payload) {
- DRM_ERROR("invalid sz param exp %zd given %d cfg %pK\n",
- sizeof(u64), cfg->hw_cfg->len, cfg->hw_cfg->payload);
- return -EINVAL;
- }
-
- blk_offset = 0x30;
- if (cfg->hw_cfg->payload) {
- val = cfg->hw_cfg->payload;
- } else {
- assertive = 0;
- val = &assertive;
- }
-
- info[dspp->idx].cached_assertive = *val & (BIT(8) - 1);
- DPU_REG_WRITE(&dspp->hw, dspp->cap->sblk->ad.base + blk_offset,
- info[dspp->idx].last_assertive);
-
- return 0;
-}
-
-static int ad4_backlight_setup(struct dpu_hw_dspp *dspp,
- struct dpu_ad_hw_cfg *cfg)
-{
- u64 *val, bl;
- u32 blk_offset;
-
- if (cfg->hw_cfg->len != sizeof(u64) && cfg->hw_cfg->payload) {
- DRM_ERROR("invalid sz param exp %zd given %d cfg %pK\n",
- sizeof(u64), cfg->hw_cfg->len, cfg->hw_cfg->payload);
- return -EINVAL;
- }
-
- blk_offset = 0x2c;
- if (cfg->hw_cfg->payload) {
- val = cfg->hw_cfg->payload;
- } else {
- bl = 0;
- val = &bl;
- }
-
- info[dspp->idx].last_bl = *val & (BIT(16) - 1);
- DPU_REG_WRITE(&dspp->hw, dspp->cap->sblk->ad.base + blk_offset,
- info[dspp->idx].last_bl);
- return 0;
-}
-
-static int ad4_backlight_setup_ipcr(struct dpu_hw_dspp *dspp,
- struct dpu_ad_hw_cfg *cfg)
-{
- u64 *val, bl;
- u32 blk_offset;
-
- if (cfg->hw_cfg->len != sizeof(u64) && cfg->hw_cfg->payload) {
- DRM_ERROR("invalid sz param exp %zd given %d cfg %pK\n",
- sizeof(u64), cfg->hw_cfg->len, cfg->hw_cfg->payload);
- return -EINVAL;
- }
-
- blk_offset = 0x2c;
- if (cfg->hw_cfg->payload) {
- val = cfg->hw_cfg->payload;
- } else {
- bl = 0;
- val = &bl;
- }
-
- info[dspp->idx].cached_bl = *val & (BIT(16) - 1);
- DPU_REG_WRITE(&dspp->hw, dspp->cap->sblk->ad.base + blk_offset,
- info[dspp->idx].last_bl);
-
- return 0;
-}
-
-void dpu_read_intr_resp_ad4(struct dpu_hw_dspp *dspp, u32 event, u32 *resp)
-{
- if (!dspp || !resp) {
- DRM_ERROR("invalid params dspp %pK resp %pK\n", dspp, resp);
- return;
- }
-
- switch (event) {
- case AD4_BACKLIGHT:
- *resp = DPU_REG_READ(&dspp->hw,
- dspp->cap->sblk->ad.base + 0x48);
- break;
- default:
- break;
- }
-}
-
-static int ad4_ipc_suspend_setup_run(struct dpu_hw_dspp *dspp,
- struct dpu_ad_hw_cfg *cfg)
-{
- u32 strength = 0, i = 0;
- struct dpu_hw_mixer *hw_lm;
-
- hw_lm = cfg->hw_cfg->mixer_info;
- if ((cfg->hw_cfg->num_of_mixers == 2) && hw_lm->cfg.right_mixer) {
- /* this AD core is the salve core */
- for (i = DSPP_0; i < DSPP_MAX; i++) {
- if (info[i].is_master) {
- strength = info[i].last_str;
- break;
- }
- }
- } else {
- strength = DPU_REG_READ(&dspp->hw,
- dspp->cap->sblk->ad.base + 0x4c);
- pr_debug("%s(): AD strength = %d\n", __func__, strength);
- }
- info[dspp->idx].last_str = strength;
- info[dspp->idx].state = ad4_state_ipcs;
- pr_debug("%s(): AD state move to ipcs\n", __func__);
-
- return 0;
-}
-
-static int ad4_ipc_resume_setup_ipcs(struct dpu_hw_dspp *dspp,
- struct dpu_ad_hw_cfg *cfg)
-{
- u32 blk_offset, val;
-
- info[dspp->idx].frame_count = 0;
- info[dspp->idx].state = ad4_state_ipcr;
- pr_debug("%s(): AD state move to ipcr\n", __func__);
-
- /* no need to rewrite frmt_mode bit 13 and mem_init,
- * since the default register values are exactly what
- * we wanted.
- */
-
- /* ipc resume with manual strength */
- /* tf control */
- blk_offset = 0x34;
- val = (0x55 & (BIT(8) - 1));
- DPU_REG_WRITE(&dspp->hw, dspp->cap->sblk->ad.base + blk_offset, val);
- /* set manual strength */
- blk_offset = 0x15c;
- val = (info[dspp->idx].last_str & (BIT(10) - 1));
- DPU_REG_WRITE(&dspp->hw, dspp->cap->sblk->ad.base + blk_offset, val);
- /* enable manual mode */
- blk_offset = 0x138;
- DPU_REG_WRITE(&dspp->hw, dspp->cap->sblk->ad.base + blk_offset, 0);
-
- return 0;
-}
-
-static int ad4_ipc_suspend_setup_ipcr(struct dpu_hw_dspp *dspp,
- struct dpu_ad_hw_cfg *cfg)
-{
- info[dspp->idx].state = ad4_state_ipcs;
- pr_debug("%s(): AD state move to ipcs\n", __func__);
- return 0;
-}
-
-static int ad4_ipc_reset_setup_ipcr(struct dpu_hw_dspp *dspp,
- struct dpu_ad_hw_cfg *cfg)
-{
- int ret;
- u32 strength = 0, i = 0;
- struct dpu_hw_mixer *hw_lm;
-
- /* Read AD calculator strength output during the 2 frames of manual
- * strength mode, and assign the strength output to last_str
- * when frame count reaches AD_IPC_FRAME_COUNT to avoid flickers
- * caused by strength was not converged before entering IPC mode
- */
- hw_lm = cfg->hw_cfg->mixer_info;
- if ((cfg->hw_cfg->num_of_mixers == 2) && hw_lm->cfg.right_mixer) {
- /* this AD core is the salve core */
- for (i = DSPP_0; i < DSPP_MAX; i++) {
- if (info[i].is_master) {
- strength = info[i].last_str;
- break;
- }
- }
- } else {
- strength = DPU_REG_READ(&dspp->hw,
- dspp->cap->sblk->ad.base + 0x4c);
- pr_debug("%s(): AD strength = %d\n", __func__, strength);
- }
-
- if (info[dspp->idx].frame_count == AD_IPC_FRAME_COUNT) {
- info[dspp->idx].state = ad4_state_run;
- pr_debug("%s(): AD state move to run\n", __func__);
- info[dspp->idx].last_str = strength;
- ret = ad4_cfg_ipc_reset(dspp, cfg);
- if (ret)
- return ret;
- } else {
- info[dspp->idx].frame_count++;
- }
-
- return 0;
-}
-
-static int ad4_cfg_ipc_reset(struct dpu_hw_dspp *dspp,
- struct dpu_ad_hw_cfg *cfg)
-{
- u32 blk_offset;
-
- /* revert manual strength */
- /* tf control */
- blk_offset = 0x34;
- DPU_REG_WRITE(&dspp->hw, dspp->cap->sblk->ad.base + blk_offset,
- info[dspp->idx].tf_ctrl);
- /* vc_control_0 */
- blk_offset = 0x138;
- DPU_REG_WRITE(&dspp->hw, dspp->cap->sblk->ad.base + blk_offset,
- info[dspp->idx].vc_control_0);
-
- /* reset cached ALS, backlight and assertiveness */
- if (info[dspp->idx].cached_als != U64_MAX) {
- DPU_REG_WRITE(&dspp->hw,
- dspp->cap->sblk->ad.base + 0x28,
- info[dspp->idx].cached_als);
- info[dspp->idx].last_als = info[dspp->idx].cached_als;
- info[dspp->idx].cached_als = U64_MAX;
- }
- if (info[dspp->idx].cached_bl != U64_MAX) {
- DPU_REG_WRITE(&dspp->hw,
- dspp->cap->sblk->ad.base + 0x2c,
- info[dspp->idx].cached_bl);
- info[dspp->idx].last_bl = info[dspp->idx].cached_bl;
- info[dspp->idx].cached_bl = U64_MAX;
- }
- if (info[dspp->idx].cached_assertive != U8_MAX) {
- DPU_REG_WRITE(&dspp->hw,
- dspp->cap->sblk->ad.base + 0x30,
- info[dspp->idx].cached_assertive);
- info[dspp->idx].last_assertive =
- info[dspp->idx].cached_assertive;
- info[dspp->idx].cached_assertive = U8_MAX;
- }
-
- return 0;
-}
-
-static int ad4_ipc_reset_setup_startup(struct dpu_hw_dspp *dspp,
- struct dpu_ad_hw_cfg *cfg)
-{
- u32 blk_offset;
-
- if (info[dspp->idx].frame_count == AD_IPC_FRAME_COUNT) {
- info[dspp->idx].state = ad4_state_run;
- pr_debug("%s(): AD state move to run\n", __func__);
-
- /* revert enforce 0 initial strength */
- /* irdx_control_0 */
- blk_offset = 0x13c;
- DPU_REG_WRITE(&dspp->hw, dspp->cap->sblk->ad.base + blk_offset,
- info[dspp->idx].irdx_control_0);
- /* assertiveness */
- blk_offset = 0x30;
- DPU_REG_WRITE(&dspp->hw, dspp->cap->sblk->ad.base + blk_offset,
- info[dspp->idx].last_assertive);
- /* tf control */
- blk_offset = 0x34;
- DPU_REG_WRITE(&dspp->hw, dspp->cap->sblk->ad.base + blk_offset,
- info[dspp->idx].tf_ctrl);
- } else {
- info[dspp->idx].frame_count++;
- }
-
- return 0;
-}
diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_catalog.c b/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_catalog.c
index 8e779c0..7a7c02a 100644
--- a/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_catalog.c
+++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_catalog.c
@@ -32,14 +32,6 @@
#define MIXER_SDM845_MASK \
(BIT(DPU_MIXER_SOURCESPLIT) | BIT(DPU_DIM_LAYER))
-#define DSPP_SDM845_MASK \
- (BIT(DPU_DSPP_IGC) | BIT(DPU_DSPP_PCC) | BIT(DPU_DSPP_GC) |\
- BIT(DPU_DSPP_HSIC) | BIT(DPU_DSPP_GAMUT) | BIT(DPU_DSPP_HIST) |\
- BIT(DPU_DSPP_MEMCOLOR) | BIT(DPU_DSPP_SIXZONE) | BIT(DPU_DSPP_VLUT))
-
-#define DSPP_AD_SDM845_MASK \
- (DSPP_SDM845_MASK | BIT(DPU_DSPP_AD))
-
#define PINGPONG_SDM845_MASK BIT(DPU_PINGPONG_DITHER)
#define PINGPONG_SDM845_SPLIT_MASK \
@@ -248,76 +240,33 @@
},
};
-#define LM_BLK(_name, _id, _base, _dspp, _ds, _pp, _lmpair) \
+#define LM_BLK(_name, _id, _base, _ds, _pp, _lmpair) \
{ \
.name = _name, .id = _id, \
.base = _base, .len = 0x320, \
.features = MIXER_SDM845_MASK, \
.sblk = &sdm845_lm_sblk, \
- .dspp = _dspp, .ds = _ds, \
+ .ds = _ds, \
.pingpong = _pp, \
.lm_pair_mask = (1 << _lmpair) \
}
+
static struct dpu_lm_cfg sdm845_lm[] = {
- LM_BLK("lm_0", LM_0, 0x45000, DSPP_0,
+ LM_BLK("lm_0", LM_0, 0x45000,
DS_0, PINGPONG_0, LM_1),
- LM_BLK("lm_1", LM_1, 0x46000, DSPP_1,
+ LM_BLK("lm_1", LM_1, 0x46000,
DS_1, PINGPONG_1, LM_0),
- LM_BLK("lm_2", LM_2, 0x47000, DSPP_2,
+ LM_BLK("lm_2", LM_2, 0x47000,
DS_MAX, PINGPONG_2, LM_5),
- LM_BLK("lm_3", LM_3, 0x0, DSPP_MAX,
+ LM_BLK("lm_3", LM_3, 0x0,
DS_MAX, PINGPONG_MAX, 0),
- LM_BLK("lm_4", LM_4, 0x0, DSPP_MAX,
+ LM_BLK("lm_4", LM_4, 0x0,
DS_MAX, PINGPONG_MAX, 0),
- LM_BLK("lm_5", LM_5, 0x4a000, DSPP_3,
+ LM_BLK("lm_5", LM_5, 0x4a000,
DS_MAX, PINGPONG_3, LM_2),
};
/*************************************************************
- * DSPP sub blocks config
- *************************************************************/
-static struct dpu_dspp_top_cfg sdm845_dspp_top = {
- .name = "dspp_top", .base = 0x1300, .len = 0xc
-};
-
-static const struct dpu_dspp_sub_blks sdm845_dspp_sblk = {
- .igc = {.id = DPU_DSPP_IGC, .base = 0x0,
- .len = 0x0, .version = 0x30001},
- .pcc = {.id = DPU_DSPP_PCC, .base = 0x1700,
- .len = 0x0, .version = 0x40000},
- .gc = {.id = DPU_DSPP_GC, .base = 0x17c0,
- .len = 0x0, .version = 0x10008},
- .hsic = {.id = DPU_DSPP_HSIC, .base = 0x800,
- .len = 0x0, .version = 0x10007},
- .memcolor = {.id = DPU_DSPP_MEMCOLOR, .base = 0x880,
- .len = 0x0, .version = 0x10007},
- .sixzone = {.id = DPU_DSPP_SIXZONE, .base = 0x900,
- .len = 0x0, .version = 0x10007},
- .gamut = {.id = DPU_DSPP_GAMUT, .base = 0x1000,
- .len = 0x0, .version = 0x40000},
- .hist = {.id = DPU_DSPP_HIST, .base = 0x800,
- .len = 0x0, .version = 0x10007},
- /* TODO : Move AD out of DSPP config */
- .vlut = {.id = DPU_DSPP_VLUT, .base = 0xa00,
- .len = 0x0, .version = 0x10008},
-};
-
-#define DSPP_BLK(_name, _id, _base) \
- {\
- .name = _name, .id = _id, \
- .base = _base, .len = 0x17e0, \
- .features = DSPP_SDM845_MASK, \
- .sblk = &sdm845_dspp_sblk, \
- }
-
-static struct dpu_dspp_cfg sdm845_dspp[] = {
- DSPP_BLK("dspp_0", DSPP_0, 0x55000),
- DSPP_BLK("dspp_1", DSPP_1, 0x57000),
- DSPP_BLK("dspp_2", DSPP_2, 0x59000),
- DSPP_BLK("dspp_3", DSPP_3, 0x5b000),
-};
-
-/*************************************************************
* DS sub blocks config
*************************************************************/
static const struct dpu_ds_top_cfg sdm845_ds_top = {
@@ -560,9 +509,6 @@ void sdm845_cfg_init(struct dpu_mdss_cfg *dpu_cfg)
.sspp = sdm845_sspp,
.mixer_count = ARRAY_SIZE(sdm845_lm),
.mixer = sdm845_lm,
- .dspp_top = sdm845_dspp_top,
- .dspp_count = ARRAY_SIZE(sdm845_dspp),
- .dspp = sdm845_dspp,
.ds_count = ARRAY_SIZE(sdm845_ds),
.ds = sdm845_ds,
.pingpong_count = ARRAY_SIZE(sdm845_pp),
diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_catalog.h b/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_catalog.h
index 39bec0a..cd4ed8b 100644
--- a/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_catalog.h
+++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_catalog.h
@@ -63,11 +63,6 @@
#define CRTC_DUAL_MIXERS 2
-#define DPU_COLOR_PROCESS_VER(MAJOR, MINOR) \
- ((((MAJOR) & 0xFFFF) << 16) | (((MINOR) & 0xFFFF)))
-#define DPU_COLOR_PROCESS_MAJOR(version) (((version) & 0xFFFF0000) >> 16)
-#define DPU_COLOR_PROCESS_MINOR(version) ((version) & 0xFFFF)
-
#define MAX_XIN_COUNT 16
/**
@@ -109,10 +104,6 @@ enum {
* @DPU_SSPP_SCALER_RGB, RGB Scaler, supported by RGB pipes
* @DPU_SSPP_CSC, Support of Color space converion
* @DPU_SSPP_CSC_10BIT, Support of 10-bit Color space conversion
- * @DPU_SSPP_HSIC, Global HSIC control
- * @DPU_SSPP_MEMCOLOR Memory Color Support
- * @DPU_SSPP_IGC, Inverse gamma correction
- * @DPU_SSPP_PCC, Color correction support
* @DPU_SSPP_CURSOR, SSPP can be used as a cursor layer
* @DPU_SSPP_QOS, SSPP support QoS control, danger/safe/creq
* @DPU_SSPP_QOS_8LVL, SSPP support 8-level QoS control
@@ -131,10 +122,6 @@ enum {
DPU_SSPP_SCALER_RGB,
DPU_SSPP_CSC,
DPU_SSPP_CSC_10BIT,
- DPU_SSPP_HSIC,
- DPU_SSPP_MEMCOLOR,
- DPU_SSPP_IGC,
- DPU_SSPP_PCC,
DPU_SSPP_CURSOR,
DPU_SSPP_QOS,
DPU_SSPP_QOS_8LVL,
@@ -164,36 +151,6 @@ enum {
};
/**
- * DSPP sub-blocks
- * @DPU_DSPP_IGC DSPP Inverse gamma correction block
- * @DPU_DSPP_PCC Panel color correction block
- * @DPU_DSPP_GC Gamma correction block
- * @DPU_DSPP_HSIC Global HSIC block
- * @DPU_DSPP_MEMCOLOR Memory Color block
- * @DPU_DSPP_SIXZONE Six zone block
- * @DPU_DSPP_GAMUT Gamut bloc
- * @DPU_DSPP_DITHER Dither block
- * @DPU_DSPP_HIST Histogram block
- * @DPU_DSPP_VLUT PA VLUT block
- * @DPU_DSPP_AD AD block
- * @DPU_DSPP_MAX maximum value
- */
-enum {
- DPU_DSPP_IGC = 0x1,
- DPU_DSPP_PCC,
- DPU_DSPP_GC,
- DPU_DSPP_HSIC,
- DPU_DSPP_MEMCOLOR,
- DPU_DSPP_SIXZONE,
- DPU_DSPP_GAMUT,
- DPU_DSPP_DITHER,
- DPU_DSPP_HIST,
- DPU_DSPP_VLUT,
- DPU_DSPP_AD,
- DPU_DSPP_MAX
-};
-
-/**
* PINGPONG sub-blocks
* @DPU_PINGPONG_TE Tear check block
* @DPU_PINGPONG_TE2 Additional tear check block for split pipes
@@ -468,20 +425,6 @@ struct dpu_lm_sub_blks {
struct dpu_pp_blk gc;
};
-struct dpu_dspp_sub_blks {
- struct dpu_pp_blk igc;
- struct dpu_pp_blk pcc;
- struct dpu_pp_blk gc;
- struct dpu_pp_blk hsic;
- struct dpu_pp_blk memcolor;
- struct dpu_pp_blk sixzone;
- struct dpu_pp_blk gamut;
- struct dpu_pp_blk dither;
- struct dpu_pp_blk hist;
- struct dpu_pp_blk ad;
- struct dpu_pp_blk vlut;
-};
-
struct dpu_pingpong_sub_blks {
struct dpu_pp_blk te;
struct dpu_pp_blk te2;
@@ -583,7 +526,6 @@ struct dpu_sspp_cfg {
* @base register offset of this block
* @features bit mask identifying sub-blocks/features
* @sblk: LM Sub-blocks information
- * @dspp: ID of connected DSPP, DSPP_MAX if unsupported
* @pingpong: ID of connected PingPong, PINGPONG_MAX if unsupported
* @ds: ID of connected DS, DS_MAX if unsupported
* @lm_pair_mask: Bitmask of LMs that can be controlled by same CTL
@@ -591,37 +533,12 @@ struct dpu_sspp_cfg {
struct dpu_lm_cfg {
DPU_HW_BLK_INFO;
const struct dpu_lm_sub_blks *sblk;
- u32 dspp;
u32 pingpong;
u32 ds;
unsigned long lm_pair_mask;
};
/**
- * struct dpu_dspp_cfg - information of DSPP top block
- * @id enum identifying this block
- * @base register offset of this block
- * @features bit mask identifying sub-blocks/features
- * supported by this block
- */
-struct dpu_dspp_top_cfg {
- DPU_HW_BLK_INFO;
-};
-
-/**
- * struct dpu_dspp_cfg - information of DSPP blocks
- * @id enum identifying this block
- * @base register offset of this block
- * @features bit mask identifying sub-blocks/features
- * supported by this block
- * @sblk sub-blocks information
- */
-struct dpu_dspp_cfg {
- DPU_HW_BLK_INFO;
- const struct dpu_dspp_sub_blks *sblk;
-};
-
-/**
* struct dpu_ds_top_cfg - information of dest scaler top
* @id enum identifying this block
* @base register offset of this block
@@ -890,11 +807,6 @@ struct dpu_mdss_cfg {
u32 mixer_count;
struct dpu_lm_cfg *mixer;
- struct dpu_dspp_top_cfg dspp_top;
-
- u32 dspp_count;
- struct dpu_dspp_cfg *dspp;
-
u32 ds_count;
struct dpu_ds_cfg *ds;
@@ -942,7 +854,6 @@ struct dpu_mdss_hw_cfg_handler {
#define BLK_DMA(s) ((s)->dma)
#define BLK_CURSOR(s) ((s)->cursor)
#define BLK_MIXER(s) ((s)->mixer)
-#define BLK_DSPP(s) ((s)->dspp)
#define BLK_DS(s) ((s)->ds)
#define BLK_PINGPONG(s) ((s)->pingpong)
#define BLK_CDM(s) ((s)->cdm)
diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_color_proc_common_v4.h b/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_color_proc_common_v4.h
deleted file mode 100644
index 495e675..0000000
--- a/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_color_proc_common_v4.h
+++ /dev/null
@@ -1,69 +0,0 @@
-/* Copyright (c) 2017-2018, The Linux Foundation. All rights reserved.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 and
- * only version 2 as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- */
-#ifndef _DPU_HW_COLOR_PROC_COMMON_V4_H_
-#define _DPU_HW_COLOR_PROC_COMMON_V4_H_
-
-#define GAMUT_TABLE_SEL_OFF 0x4
-#define GAMUT_UPPER_COLOR_OFF 0x8
-#define GAMUT_LOWER_COLOR_OFF 0xc
-#define GAMUT_SCALEA_OFFSET_OFF 0x10
-#define GAMUT_SCALEB_OFFSET_OFF 0xe0
-#define GAMUT_TABLE0_SEL BIT(12)
-#define GAMUT_MAP_EN BIT(1)
-#define GAMUT_EN BIT(0)
-#define GAMUT_MODE_13B_OFF 640
-#define GAMUT_MODE_5_OFF 1248
-
-enum {
- gamut_mode_17 = 0,
- gamut_mode_5,
- gamut_mode_13a,
- gamut_mode_13b,
-};
-
-#define GC_C0_OFF 0x4
-#define GC_C0_INDEX_OFF 0x8
-#define GC_8B_ROUND_EN BIT(1)
-#define GC_EN BIT(0)
-#define GC_TBL_NUM 3
-#define GC_LUT_SWAP_OFF 0x1c
-
-#define IGC_TBL_NUM 3
-#define IGC_DITHER_OFF 0x7e0
-#define IGC_OPMODE_OFF 0x0
-#define IGC_C0_OFF 0x0
-#define IGC_DATA_MASK (BIT(12) - 1)
-#define IGC_DSPP_SEL_MASK_MAX (BIT(4) - 1)
-#define IGC_DSPP_SEL_MASK(n) \
- ((IGC_DSPP_SEL_MASK_MAX & ~(1 << (n))) << 28)
-#define IGC_INDEX_UPDATE BIT(25)
-#define IGC_EN BIT(0)
-#define IGC_DIS 0
-#define IGC_DITHER_DATA_MASK (BIT(4) - 1)
-
-#define PCC_NUM_PLANES 3
-#define PCC_NUM_COEFF 11
-#define PCC_EN BIT(0)
-#define PCC_DIS 0
-#define PCC_C_OFF 0x4
-#define PCC_R_OFF 0x10
-#define PCC_G_OFF 0x1c
-#define PCC_B_OFF 0x28
-#define PCC_RG_OFF 0x34
-#define PCC_RB_OFF 0x40
-#define PCC_GB_OFF 0x4c
-#define PCC_RGB_OFF 0x58
-#define PCC_RR_OFF 0x64
-#define PCC_GG_OFF 0x70
-#define PCC_BB_OFF 0x7c
-
-#endif /* _DPU_HW_COLOR_PROC_COMMON_V4_H_ */
diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_color_proc_v4.c b/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_color_proc_v4.c
deleted file mode 100644
index 1c693a8..0000000
--- a/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_color_proc_v4.c
+++ /dev/null
@@ -1,242 +0,0 @@
-/* Copyright (c) 2017-2018, The Linux Foundation. All rights reserved.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 and
- * only version 2 as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- */
-#include <drm/msm_drm_pp.h>
-#include "dpu_hw_color_proc_common_v4.h"
-#include "dpu_hw_color_proc_v4.h"
-
-static int dpu_write_3d_gamut(struct dpu_hw_blk_reg_map *hw,
- struct drm_msm_3d_gamut *payload, u32 base,
- u32 *opcode)
-{
- u32 reg, tbl_len, tbl_off, scale_off, i, j;
- u32 scale_tbl_len, scale_tbl_off;
- u32 *scale_data;
-
- if (!payload || !opcode || !hw) {
- DRM_ERROR("invalid payload %pK opcode %pK hw %pK\n",
- payload, opcode, hw);
- return -EINVAL;
- }
-
- switch (payload->mode) {
- case GAMUT_3D_MODE_17:
- tbl_len = GAMUT_3D_MODE17_TBL_SZ;
- tbl_off = 0;
- scale_off = GAMUT_SCALEA_OFFSET_OFF;
- *opcode = gamut_mode_17 << 2;
- break;
- case GAMUT_3D_MODE_13:
- *opcode = (*opcode & (BIT(4) - 1)) >> 2;
- if (*opcode == gamut_mode_13a)
- *opcode = gamut_mode_13b;
- else
- *opcode = gamut_mode_13a;
- tbl_len = GAMUT_3D_MODE13_TBL_SZ;
- tbl_off = (*opcode == gamut_mode_13a) ? 0 :
- GAMUT_MODE_13B_OFF;
- scale_off = (*opcode == gamut_mode_13a) ?
- GAMUT_SCALEA_OFFSET_OFF : GAMUT_SCALEB_OFFSET_OFF;
- *opcode <<= 2;
- break;
- case GAMUT_3D_MODE_5:
- *opcode = gamut_mode_5 << 2;
- tbl_len = GAMUT_3D_MODE5_TBL_SZ;
- tbl_off = GAMUT_MODE_5_OFF;
- scale_off = GAMUT_SCALEB_OFFSET_OFF;
- break;
- default:
- DRM_ERROR("invalid mode %d\n", payload->mode);
- return -EINVAL;
- }
-
- if (payload->flags & GAMUT_3D_MAP_EN)
- *opcode |= GAMUT_MAP_EN;
- *opcode |= GAMUT_EN;
-
- for (i = 0; i < GAMUT_3D_TBL_NUM; i++) {
- reg = GAMUT_TABLE0_SEL << i;
- reg |= ((tbl_off) & (BIT(11) - 1));
- DPU_REG_WRITE(hw, base + GAMUT_TABLE_SEL_OFF, reg);
- for (j = 0; j < tbl_len; j++) {
- DPU_REG_WRITE(hw, base + GAMUT_LOWER_COLOR_OFF,
- payload->col[i][j].c2_c1);
- DPU_REG_WRITE(hw, base + GAMUT_UPPER_COLOR_OFF,
- payload->col[i][j].c0);
- }
- }
-
- if ((*opcode & GAMUT_MAP_EN)) {
- if (scale_off == GAMUT_SCALEA_OFFSET_OFF)
- scale_tbl_len = GAMUT_3D_SCALE_OFF_SZ;
- else
- scale_tbl_len = GAMUT_3D_SCALEB_OFF_SZ;
- for (i = 0; i < GAMUT_3D_SCALE_OFF_TBL_NUM; i++) {
- scale_tbl_off = base + scale_off +
- i * scale_tbl_len * sizeof(u32);
- scale_data = &payload->scale_off[i][0];
- for (j = 0; j < scale_tbl_len; j++)
- DPU_REG_WRITE(hw,
- scale_tbl_off + (j * sizeof(u32)),
- scale_data[j]);
- }
- }
- DPU_REG_WRITE(hw, base, *opcode);
- return 0;
-}
-
-void dpu_setup_dspp_3d_gamutv4(struct dpu_hw_dspp *ctx, void *cfg)
-{
- struct drm_msm_3d_gamut *payload;
- struct dpu_hw_cp_cfg *hw_cfg = cfg;
- u32 op_mode;
-
- if (!ctx || !cfg) {
- DRM_ERROR("invalid param ctx %pK cfg %pK\n", ctx, cfg);
- return;
- }
-
- op_mode = DPU_REG_READ(&ctx->hw, ctx->cap->sblk->gamut.base);
- if (!hw_cfg->payload) {
- DRM_DEBUG_DRIVER("disable gamut feature\n");
- DPU_REG_WRITE(&ctx->hw, ctx->cap->sblk->gamut.base, 0);
- return;
- }
-
- payload = hw_cfg->payload;
- dpu_write_3d_gamut(&ctx->hw, payload, ctx->cap->sblk->gamut.base,
- &op_mode);
-
-}
-
-void dpu_setup_dspp_igcv3(struct dpu_hw_dspp *ctx, void *cfg)
-{
- struct drm_msm_igc_lut *lut_cfg;
- struct dpu_hw_cp_cfg *hw_cfg = cfg;
- int i = 0, j = 0;
- u32 *addr = NULL;
- u32 offset = 0;
-
- if (!ctx || !cfg) {
- DRM_ERROR("invalid param ctx %pK cfg %pK\n", ctx, cfg);
- return;
- }
-
- if (!hw_cfg->payload) {
- DRM_DEBUG_DRIVER("disable igc feature\n");
- DPU_REG_WRITE(&ctx->hw, IGC_OPMODE_OFF, 0);
- return;
- }
-
- if (hw_cfg->len != sizeof(struct drm_msm_igc_lut)) {
- DRM_ERROR("invalid size of payload len %d exp %zd\n",
- hw_cfg->len, sizeof(struct drm_msm_igc_lut));
- return;
- }
-
- lut_cfg = hw_cfg->payload;
-
- for (i = 0; i < IGC_TBL_NUM; i++) {
- addr = lut_cfg->c0 + (i * ARRAY_SIZE(lut_cfg->c0));
- offset = IGC_C0_OFF + (i * sizeof(u32));
-
- for (j = 0; j < IGC_TBL_LEN; j++) {
- addr[j] &= IGC_DATA_MASK;
- addr[j] |= IGC_DSPP_SEL_MASK(ctx->idx - 1);
- if (j == 0)
- addr[j] |= IGC_INDEX_UPDATE;
- /* IGC lut registers are part of DSPP Top HW block */
- DPU_REG_WRITE(&ctx->hw_top, offset, addr[j]);
- }
- }
-
- if (lut_cfg->flags & IGC_DITHER_ENABLE) {
- DPU_REG_WRITE(&ctx->hw, IGC_DITHER_OFF,
- lut_cfg->strength & IGC_DITHER_DATA_MASK);
- }
-
- DPU_REG_WRITE(&ctx->hw, IGC_OPMODE_OFF, IGC_EN);
-}
-
-void dpu_setup_dspp_pccv4(struct dpu_hw_dspp *ctx, void *cfg)
-{
- struct dpu_hw_cp_cfg *hw_cfg = cfg;
- struct drm_msm_pcc *pcc_cfg;
- struct drm_msm_pcc_coeff *coeffs = NULL;
- int i = 0;
- u32 base = 0;
-
- if (!ctx || !cfg) {
- DRM_ERROR("invalid param ctx %pK cfg %pK\n", ctx, cfg);
- return;
- }
-
- if (!hw_cfg->payload) {
- DRM_DEBUG_DRIVER("disable pcc feature\n");
- DPU_REG_WRITE(&ctx->hw, ctx->cap->sblk->pcc.base, 0);
- return;
- }
-
- if (hw_cfg->len != sizeof(struct drm_msm_pcc)) {
- DRM_ERROR("invalid size of payload len %d exp %zd\n",
- hw_cfg->len, sizeof(struct drm_msm_pcc));
- return;
- }
-
- pcc_cfg = hw_cfg->payload;
-
- for (i = 0; i < PCC_NUM_PLANES; i++) {
- base = ctx->cap->sblk->pcc.base + (i * sizeof(u32));
- switch (i) {
- case 0:
- coeffs = &pcc_cfg->r;
- DPU_REG_WRITE(&ctx->hw,
- base + PCC_RR_OFF, pcc_cfg->r_rr);
- DPU_REG_WRITE(&ctx->hw,
- base + PCC_GG_OFF, pcc_cfg->r_gg);
- DPU_REG_WRITE(&ctx->hw,
- base + PCC_BB_OFF, pcc_cfg->r_bb);
- break;
- case 1:
- coeffs = &pcc_cfg->g;
- DPU_REG_WRITE(&ctx->hw,
- base + PCC_RR_OFF, pcc_cfg->g_rr);
- DPU_REG_WRITE(&ctx->hw,
- base + PCC_GG_OFF, pcc_cfg->g_gg);
- DPU_REG_WRITE(&ctx->hw,
- base + PCC_BB_OFF, pcc_cfg->g_bb);
- break;
- case 2:
- coeffs = &pcc_cfg->b;
- DPU_REG_WRITE(&ctx->hw,
- base + PCC_RR_OFF, pcc_cfg->b_rr);
- DPU_REG_WRITE(&ctx->hw,
- base + PCC_GG_OFF, pcc_cfg->b_gg);
- DPU_REG_WRITE(&ctx->hw,
- base + PCC_BB_OFF, pcc_cfg->b_bb);
- break;
- default:
- DRM_ERROR("invalid pcc plane: %d\n", i);
- return;
- }
-
- DPU_REG_WRITE(&ctx->hw, base + PCC_C_OFF, coeffs->c);
- DPU_REG_WRITE(&ctx->hw, base + PCC_R_OFF, coeffs->r);
- DPU_REG_WRITE(&ctx->hw, base + PCC_G_OFF, coeffs->g);
- DPU_REG_WRITE(&ctx->hw, base + PCC_B_OFF, coeffs->b);
- DPU_REG_WRITE(&ctx->hw, base + PCC_RG_OFF, coeffs->rg);
- DPU_REG_WRITE(&ctx->hw, base + PCC_RB_OFF, coeffs->rb);
- DPU_REG_WRITE(&ctx->hw, base + PCC_GB_OFF, coeffs->gb);
- DPU_REG_WRITE(&ctx->hw, base + PCC_RGB_OFF, coeffs->rgb);
- }
-
- DPU_REG_WRITE(&ctx->hw, ctx->cap->sblk->pcc.base, PCC_EN);
-}
diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_color_proc_v4.h b/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_color_proc_v4.h
deleted file mode 100644
index c2f447fb..0000000
--- a/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_color_proc_v4.h
+++ /dev/null
@@ -1,40 +0,0 @@
-/* Copyright (c) 2017-2018, The Linux Foundation. All rights reserved.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 and
- * only version 2 as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- */
-#ifndef _DPU_HW_COLOR_PROC_V4_H_
-#define _DPU_HW_COLOR_PROC_V4_H_
-
-#include "dpu_hw_util.h"
-#include "dpu_hw_catalog.h"
-#include "dpu_hw_dspp.h"
-/**
- * dpu_setup_dspp_3d_gamutv4 - Function for 3d gamut v4 version feature
- * programming.
- * @ctx: dspp ctx pointer
- * @cfg: pointer to dpu_hw_cp_cfg
- */
-void dpu_setup_dspp_3d_gamutv4(struct dpu_hw_dspp *ctx, void *cfg);
-/**
- * dpu_setup_dspp_igcv3 - Function for igc v3 version feature
- * programming.
- * @ctx: dspp ctx pointer
- * @cfg: pointer to dpu_hw_cp_cfg
- */
-void dpu_setup_dspp_igcv3(struct dpu_hw_dspp *ctx, void *cfg);
-/**
- * dpu_setup_dspp_pccv4 - Function for pcc v4 version feature
- * programming.
- * @ctx: dspp ctx pointer
- * @cfg: pointer to dpu_hw_cp_cfg
- */
-void dpu_setup_dspp_pccv4(struct dpu_hw_dspp *ctx, void *cfg);
-
-#endif /* _DPU_HW_COLOR_PROC_V4_H_ */
diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_color_processing.h b/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_color_processing.h
deleted file mode 100644
index e1bdffd..0000000
--- a/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_color_processing.h
+++ /dev/null
@@ -1,20 +0,0 @@
-/* Copyright (c) 2016-2018, The Linux Foundation. All rights reserved.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 and
- * only version 2 as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- */
-
-#ifndef _DPU_HW_COLOR_PROCESSING_H
-#define _DPU_HW_COLOR_PROCESSING_H
-
-#include "dpu_hw_color_processing_v1_7.h"
-#include "dpu_hw_reg_dma_v1_color_proc.h"
-#include "dpu_hw_color_proc_v4.h"
-
-#endif
diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_color_processing_v1_7.c b/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_color_processing_v1_7.c
deleted file mode 100644
index 6c67602..0000000
--- a/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_color_processing_v1_7.c
+++ /dev/null
@@ -1,565 +0,0 @@
-/* Copyright (c) 2016-2018, The Linux Foundation. All rights reserved.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 and
- * only version 2 as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- */
-
-#include <drm/msm_drm_pp.h>
-#include "dpu_hw_color_processing_v1_7.h"
-#include "dpu_hw_ctl.h"
-
-#define PA_HUE_VIG_OFF 0x110
-#define PA_SAT_VIG_OFF 0x114
-#define PA_VAL_VIG_OFF 0x118
-#define PA_CONT_VIG_OFF 0x11C
-
-#define PA_HUE_DSPP_OFF 0x238
-#define PA_SAT_DSPP_OFF 0x23C
-#define PA_VAL_DSPP_OFF 0x240
-#define PA_CONT_DSPP_OFF 0x244
-
-#define PA_LUTV_DSPP_OFF 0x1400
-#define PA_LUT_SWAP_OFF 0x234
-
-#define PA_LUTV_DSPP_CTRL_OFF 0x4c
-#define PA_LUTV_DSPP_SWAP_OFF 0x18
-
-#define PA_HUE_MASK 0xFFF
-#define PA_SAT_MASK 0xFFFF
-#define PA_VAL_MASK 0xFF
-#define PA_CONT_MASK 0xFF
-
-#define MEMCOL_PWL0_OFF 0x88
-#define MEMCOL_PWL0_MASK 0xFFFF07FF
-#define MEMCOL_PWL1_OFF 0x8C
-#define MEMCOL_PWL1_MASK 0xFFFFFFFF
-#define MEMCOL_HUE_REGION_OFF 0x90
-#define MEMCOL_HUE_REGION_MASK 0x7FF07FF
-#define MEMCOL_SAT_REGION_OFF 0x94
-#define MEMCOL_SAT_REGION_MASK 0xFFFFFF
-#define MEMCOL_VAL_REGION_OFF 0x98
-#define MEMCOL_VAL_REGION_MASK 0xFFFFFF
-#define MEMCOL_P0_LEN 0x14
-#define MEMCOL_P1_LEN 0x8
-#define MEMCOL_PWL2_OFF 0x218
-#define MEMCOL_PWL2_MASK 0xFFFFFFFF
-#define MEMCOL_BLEND_GAIN_OFF 0x21C
-#define MEMCOL_PWL_HOLD_OFF 0x214
-
-#define VIG_OP_PA_EN BIT(4)
-#define VIG_OP_PA_SKIN_EN BIT(5)
-#define VIG_OP_PA_FOL_EN BIT(6)
-#define VIG_OP_PA_SKY_EN BIT(7)
-#define VIG_OP_PA_HUE_EN BIT(25)
-#define VIG_OP_PA_SAT_EN BIT(26)
-#define VIG_OP_PA_VAL_EN BIT(27)
-#define VIG_OP_PA_CONT_EN BIT(28)
-
-#define DSPP_OP_SZ_VAL_EN BIT(31)
-#define DSPP_OP_SZ_SAT_EN BIT(30)
-#define DSPP_OP_SZ_HUE_EN BIT(29)
-#define DSPP_OP_PA_HUE_EN BIT(25)
-#define DSPP_OP_PA_SAT_EN BIT(26)
-#define DSPP_OP_PA_VAL_EN BIT(27)
-#define DSPP_OP_PA_CONT_EN BIT(28)
-#define DSPP_OP_PA_EN BIT(20)
-#define DSPP_OP_PA_LUTV_EN BIT(19)
-#define DSPP_OP_PA_SKIN_EN BIT(5)
-#define DSPP_OP_PA_FOL_EN BIT(6)
-#define DSPP_OP_PA_SKY_EN BIT(7)
-
-#define PA_VIG_DISABLE_REQUIRED(x) \
- !((x) & (VIG_OP_PA_SKIN_EN | VIG_OP_PA_SKY_EN | \
- VIG_OP_PA_FOL_EN | VIG_OP_PA_HUE_EN | \
- VIG_OP_PA_SAT_EN | VIG_OP_PA_VAL_EN | \
- VIG_OP_PA_CONT_EN))
-
-
-#define PA_DSPP_DISABLE_REQUIRED(x) \
- !((x) & (DSPP_OP_PA_SKIN_EN | DSPP_OP_PA_SKY_EN | \
- DSPP_OP_PA_FOL_EN | DSPP_OP_PA_HUE_EN | \
- DSPP_OP_PA_SAT_EN | DSPP_OP_PA_VAL_EN | \
- DSPP_OP_PA_CONT_EN | DSPP_OP_PA_LUTV_EN))
-
-#define DSPP_OP_PCC_ENABLE BIT(0)
-#define PCC_OP_MODE_OFF 0
-#define PCC_CONST_COEFF_OFF 4
-#define PCC_R_COEFF_OFF 0x10
-#define PCC_G_COEFF_OFF 0x1C
-#define PCC_B_COEFF_OFF 0x28
-#define PCC_RG_COEFF_OFF 0x34
-#define PCC_RB_COEFF_OFF 0x40
-#define PCC_GB_COEFF_OFF 0x4C
-#define PCC_RGB_COEFF_OFF 0x58
-#define PCC_CONST_COEFF_MASK 0xFFFF
-#define PCC_COEFF_MASK 0x3FFFF
-
-#define SSPP 0
-#define DSPP 1
-
-#define PGC_C0_OFF 0x4
-#define PGC_C0_INDEX_OFF 0x8
-#define PGC_8B_ROUND_EN BIT(1)
-#define PGC_EN BIT(0)
-#define PGC_TBL_NUM 3
-#define PGC_LUT_SWAP_OFF 0x1c
-
-
-static void __setup_pa_hue(struct dpu_hw_blk_reg_map *hw,
- const struct dpu_pp_blk *blk, uint32_t hue,
- int location)
-{
- u32 base = blk->base;
- u32 offset = (location == DSPP) ? PA_HUE_DSPP_OFF : PA_HUE_VIG_OFF;
- u32 op_hue_en = (location == DSPP) ? DSPP_OP_PA_HUE_EN :
- VIG_OP_PA_HUE_EN;
- u32 op_pa_en = (location == DSPP) ? DSPP_OP_PA_EN : VIG_OP_PA_EN;
- u32 disable_req;
- u32 opmode;
-
- DPU_REG_WRITE(hw, base + offset, hue & PA_HUE_MASK);
-
- opmode = DPU_REG_READ(hw, base);
-
- if (!hue) {
- opmode &= ~op_hue_en;
- disable_req = (location == DSPP) ?
- PA_DSPP_DISABLE_REQUIRED(opmode) :
- PA_VIG_DISABLE_REQUIRED(opmode);
- if (disable_req)
- opmode &= ~op_pa_en;
- } else {
- opmode |= op_hue_en | op_pa_en;
- }
-
- DPU_REG_WRITE(hw, base, opmode);
-}
-
-void dpu_setup_pipe_pa_hue_v1_7(struct dpu_hw_pipe *ctx, void *cfg)
-{
- uint32_t hue = *((uint32_t *)cfg);
-
- __setup_pa_hue(&ctx->hw, &ctx->cap->sblk->hsic_blk, hue, SSPP);
-}
-
-void dpu_setup_dspp_pa_hue_v1_7(struct dpu_hw_dspp *ctx, void *cfg)
-{
- uint32_t hue = *((uint32_t *)cfg);
-
- __setup_pa_hue(&ctx->hw, &ctx->cap->sblk->hsic, hue, DSPP);
-}
-
-static void __setup_pa_sat(struct dpu_hw_blk_reg_map *hw,
- const struct dpu_pp_blk *blk, uint32_t sat,
- int location)
-{
- u32 base = blk->base;
- u32 offset = (location == DSPP) ? PA_SAT_DSPP_OFF : PA_SAT_VIG_OFF;
- u32 op_sat_en = (location == DSPP) ?
- DSPP_OP_PA_SAT_EN : VIG_OP_PA_SAT_EN;
- u32 op_pa_en = (location == DSPP) ? DSPP_OP_PA_EN : VIG_OP_PA_EN;
- u32 disable_req;
- u32 opmode;
-
- DPU_REG_WRITE(hw, base + offset, sat & PA_SAT_MASK);
-
- opmode = DPU_REG_READ(hw, base);
-
- if (!sat) {
- opmode &= ~op_sat_en;
- disable_req = (location == DSPP) ?
- PA_DSPP_DISABLE_REQUIRED(opmode) :
- PA_VIG_DISABLE_REQUIRED(opmode);
- if (disable_req)
- opmode &= ~op_pa_en;
- } else {
- opmode |= op_sat_en | op_pa_en;
- }
-
- DPU_REG_WRITE(hw, base, opmode);
-}
-
-void dpu_setup_pipe_pa_sat_v1_7(struct dpu_hw_pipe *ctx, void *cfg)
-{
- uint32_t sat = *((uint32_t *)cfg);
-
- __setup_pa_sat(&ctx->hw, &ctx->cap->sblk->hsic_blk, sat, SSPP);
-}
-
-static void __setup_pa_val(struct dpu_hw_blk_reg_map *hw,
- const struct dpu_pp_blk *blk, uint32_t value,
- int location)
-{
- u32 base = blk->base;
- u32 offset = (location == DSPP) ? PA_VAL_DSPP_OFF : PA_VAL_VIG_OFF;
- u32 op_val_en = (location == DSPP) ?
- DSPP_OP_PA_VAL_EN : VIG_OP_PA_VAL_EN;
- u32 op_pa_en = (location == DSPP) ? DSPP_OP_PA_EN : VIG_OP_PA_EN;
- u32 disable_req;
- u32 opmode;
-
- DPU_REG_WRITE(hw, base + offset, value & PA_VAL_MASK);
-
- opmode = DPU_REG_READ(hw, base);
-
- if (!value) {
- opmode &= ~op_val_en;
- disable_req = (location == DSPP) ?
- PA_DSPP_DISABLE_REQUIRED(opmode) :
- PA_VIG_DISABLE_REQUIRED(opmode);
- if (disable_req)
- opmode &= ~op_pa_en;
- } else {
- opmode |= op_val_en | op_pa_en;
- }
-
- DPU_REG_WRITE(hw, base, opmode);
-}
-
-void dpu_setup_pipe_pa_val_v1_7(struct dpu_hw_pipe *ctx, void *cfg)
-{
- uint32_t value = *((uint32_t *)cfg);
-
- __setup_pa_val(&ctx->hw, &ctx->cap->sblk->hsic_blk, value, SSPP);
-}
-
-static void __setup_pa_cont(struct dpu_hw_blk_reg_map *hw,
- const struct dpu_pp_blk *blk, uint32_t contrast,
- int location)
-{
- u32 base = blk->base;
- u32 offset = (location == DSPP) ? PA_CONT_DSPP_OFF : PA_CONT_VIG_OFF;
- u32 op_cont_en = (location == DSPP) ? DSPP_OP_PA_CONT_EN :
- VIG_OP_PA_CONT_EN;
- u32 op_pa_en = (location == DSPP) ? DSPP_OP_PA_EN : VIG_OP_PA_EN;
- u32 disable_req;
- u32 opmode;
-
- DPU_REG_WRITE(hw, base + offset, contrast & PA_CONT_MASK);
-
- opmode = DPU_REG_READ(hw, base);
-
- if (!contrast) {
- opmode &= ~op_cont_en;
- disable_req = (location == DSPP) ?
- PA_DSPP_DISABLE_REQUIRED(opmode) :
- PA_VIG_DISABLE_REQUIRED(opmode);
- if (disable_req)
- opmode &= ~op_pa_en;
- } else {
- opmode |= op_cont_en | op_pa_en;
- }
-
- DPU_REG_WRITE(hw, base, opmode);
-}
-
-void dpu_setup_pipe_pa_cont_v1_7(struct dpu_hw_pipe *ctx, void *cfg)
-{
- uint32_t contrast = *((uint32_t *)cfg);
-
- __setup_pa_cont(&ctx->hw, &ctx->cap->sblk->hsic_blk, contrast, SSPP);
-}
-
-void dpu_setup_pipe_pa_memcol_v1_7(struct dpu_hw_pipe *ctx,
- enum dpu_memcolor_type type,
- void *cfg)
-{
- struct drm_msm_memcol *mc = cfg;
- u32 base = ctx->cap->sblk->memcolor_blk.base;
- u32 off, op, mc_en, hold = 0;
- u32 mc_i = 0;
-
- switch (type) {
- case MEMCOLOR_SKIN:
- mc_en = VIG_OP_PA_SKIN_EN;
- mc_i = 0;
- break;
- case MEMCOLOR_SKY:
- mc_en = VIG_OP_PA_SKY_EN;
- mc_i = 1;
- break;
- case MEMCOLOR_FOLIAGE:
- mc_en = VIG_OP_PA_FOL_EN;
- mc_i = 2;
- break;
- default:
- DRM_ERROR("Invalid memory color type %d\n", type);
- return;
- }
-
- op = DPU_REG_READ(&ctx->hw, base);
- if (!mc) {
- op &= ~mc_en;
- if (PA_VIG_DISABLE_REQUIRED(op))
- op &= ~VIG_OP_PA_EN;
- DPU_REG_WRITE(&ctx->hw, base, op);
- return;
- }
-
- off = base + (mc_i * MEMCOL_P0_LEN);
- DPU_REG_WRITE(&ctx->hw, (off + MEMCOL_PWL0_OFF),
- mc->color_adjust_p0 & MEMCOL_PWL0_MASK);
- DPU_REG_WRITE(&ctx->hw, (off + MEMCOL_PWL1_OFF),
- mc->color_adjust_p1 & MEMCOL_PWL1_MASK);
- DPU_REG_WRITE(&ctx->hw, (off + MEMCOL_HUE_REGION_OFF),
- mc->hue_region & MEMCOL_HUE_REGION_MASK);
- DPU_REG_WRITE(&ctx->hw, (off + MEMCOL_SAT_REGION_OFF),
- mc->sat_region & MEMCOL_SAT_REGION_MASK);
- DPU_REG_WRITE(&ctx->hw, (off + MEMCOL_VAL_REGION_OFF),
- mc->val_region & MEMCOL_VAL_REGION_MASK);
-
- off = base + (mc_i * MEMCOL_P1_LEN);
- DPU_REG_WRITE(&ctx->hw, (off + MEMCOL_PWL2_OFF),
- mc->color_adjust_p2 & MEMCOL_PWL2_MASK);
- DPU_REG_WRITE(&ctx->hw, (off + MEMCOL_BLEND_GAIN_OFF), mc->blend_gain);
-
- hold = DPU_REG_READ(&ctx->hw, off + MEMCOL_PWL_HOLD_OFF);
- hold &= ~(0xF << (mc_i * 4));
- hold |= ((mc->sat_hold & 0x3) << (mc_i * 4));
- hold |= ((mc->val_hold & 0x3) << ((mc_i * 4) + 2));
- DPU_REG_WRITE(&ctx->hw, (off + MEMCOL_PWL_HOLD_OFF), hold);
-
- op |= VIG_OP_PA_EN | mc_en;
- DPU_REG_WRITE(&ctx->hw, base, op);
-}
-
-void dpu_setup_dspp_pcc_v1_7(struct dpu_hw_dspp *ctx, void *cfg)
-{
- struct dpu_hw_cp_cfg *hw_cfg = cfg;
- struct drm_msm_pcc *pcc;
- void __iomem *base;
-
- if (!hw_cfg || (hw_cfg->len != sizeof(*pcc) && hw_cfg->payload)) {
- DRM_ERROR("invalid params hw %p payload %p payloadsize %d \"\
- exp size %zd\n",
- hw_cfg, ((hw_cfg) ? hw_cfg->payload : NULL),
- ((hw_cfg) ? hw_cfg->len : 0), sizeof(*pcc));
- return;
- }
- base = ctx->hw.base_off + ctx->cap->base;
-
- /* Turn off feature */
- if (!hw_cfg->payload) {
- DPU_REG_WRITE(&ctx->hw, ctx->cap->sblk->pcc.base,
- PCC_OP_MODE_OFF);
- return;
- }
- DRM_DEBUG_DRIVER("Enable PCC feature\n");
- pcc = hw_cfg->payload;
-
- DPU_REG_WRITE(&ctx->hw, ctx->cap->sblk->pcc.base + PCC_CONST_COEFF_OFF,
- pcc->r.c & PCC_CONST_COEFF_MASK);
- DPU_REG_WRITE(&ctx->hw,
- ctx->cap->sblk->pcc.base + PCC_CONST_COEFF_OFF + 4,
- pcc->g.c & PCC_CONST_COEFF_MASK);
- DPU_REG_WRITE(&ctx->hw,
- ctx->cap->sblk->pcc.base + PCC_CONST_COEFF_OFF + 8,
- pcc->b.c & PCC_CONST_COEFF_MASK);
-
- DPU_REG_WRITE(&ctx->hw, ctx->cap->sblk->pcc.base + PCC_R_COEFF_OFF,
- pcc->r.r & PCC_COEFF_MASK);
- DPU_REG_WRITE(&ctx->hw, ctx->cap->sblk->pcc.base + PCC_R_COEFF_OFF + 4,
- pcc->g.r & PCC_COEFF_MASK);
- DPU_REG_WRITE(&ctx->hw, ctx->cap->sblk->pcc.base + PCC_R_COEFF_OFF + 8,
- pcc->b.r & PCC_COEFF_MASK);
-
- DPU_REG_WRITE(&ctx->hw, ctx->cap->sblk->pcc.base + PCC_G_COEFF_OFF,
- pcc->r.g & PCC_COEFF_MASK);
- DPU_REG_WRITE(&ctx->hw, ctx->cap->sblk->pcc.base + PCC_G_COEFF_OFF + 4,
- pcc->g.g & PCC_COEFF_MASK);
- DPU_REG_WRITE(&ctx->hw, ctx->cap->sblk->pcc.base + PCC_G_COEFF_OFF + 8,
- pcc->b.g & PCC_COEFF_MASK);
-
- DPU_REG_WRITE(&ctx->hw, ctx->cap->sblk->pcc.base + PCC_B_COEFF_OFF,
- pcc->r.b & PCC_COEFF_MASK);
- DPU_REG_WRITE(&ctx->hw, ctx->cap->sblk->pcc.base + PCC_B_COEFF_OFF + 4,
- pcc->g.b & PCC_COEFF_MASK);
- DPU_REG_WRITE(&ctx->hw, ctx->cap->sblk->pcc.base + PCC_B_COEFF_OFF + 8,
- pcc->b.b & PCC_COEFF_MASK);
-
-
- DPU_REG_WRITE(&ctx->hw, ctx->cap->sblk->pcc.base + PCC_RG_COEFF_OFF,
- pcc->r.rg & PCC_COEFF_MASK);
- DPU_REG_WRITE(&ctx->hw, ctx->cap->sblk->pcc.base + PCC_RG_COEFF_OFF + 4,
- pcc->g.rg & PCC_COEFF_MASK);
- DPU_REG_WRITE(&ctx->hw, ctx->cap->sblk->pcc.base + PCC_RG_COEFF_OFF + 8,
- pcc->b.rg & PCC_COEFF_MASK);
-
- DPU_REG_WRITE(&ctx->hw, ctx->cap->sblk->pcc.base + PCC_RB_COEFF_OFF,
- pcc->r.rb & PCC_COEFF_MASK);
- DPU_REG_WRITE(&ctx->hw, ctx->cap->sblk->pcc.base + PCC_RB_COEFF_OFF + 4,
- pcc->g.rb & PCC_COEFF_MASK);
- DPU_REG_WRITE(&ctx->hw, ctx->cap->sblk->pcc.base + PCC_RB_COEFF_OFF + 8,
- pcc->b.rb & PCC_COEFF_MASK);
-
-
- DPU_REG_WRITE(&ctx->hw, ctx->cap->sblk->pcc.base + PCC_GB_COEFF_OFF,
- pcc->r.gb & PCC_COEFF_MASK);
- DPU_REG_WRITE(&ctx->hw, ctx->cap->sblk->pcc.base + PCC_GB_COEFF_OFF + 4,
- pcc->g.gb & PCC_COEFF_MASK);
- DPU_REG_WRITE(&ctx->hw, ctx->cap->sblk->pcc.base + PCC_GB_COEFF_OFF + 8,
- pcc->b.gb & PCC_COEFF_MASK);
-
- DPU_REG_WRITE(&ctx->hw, ctx->cap->sblk->pcc.base + PCC_RGB_COEFF_OFF,
- pcc->r.rgb & PCC_COEFF_MASK);
- DPU_REG_WRITE(&ctx->hw,
- ctx->cap->sblk->pcc.base + PCC_RGB_COEFF_OFF + 4,
- pcc->g.rgb & PCC_COEFF_MASK);
- DPU_REG_WRITE(&ctx->hw,
- ctx->cap->sblk->pcc.base + PCC_RGB_COEFF_OFF + 8,
- pcc->b.rgb & PCC_COEFF_MASK);
- DPU_REG_WRITE(&ctx->hw, ctx->cap->sblk->pcc.base, DSPP_OP_PCC_ENABLE);
-}
-
-void dpu_setup_dspp_pa_vlut_v1_7(struct dpu_hw_dspp *ctx, void *cfg)
-{
- struct drm_msm_pa_vlut *payload = NULL;
- struct dpu_hw_cp_cfg *hw_cfg = cfg;
- u32 base = ctx->cap->sblk->vlut.base;
- u32 offset = base + PA_LUTV_DSPP_OFF;
- u32 op_mode, tmp;
- int i = 0, j = 0;
-
- if (!hw_cfg || (hw_cfg->payload && hw_cfg->len !=
- sizeof(struct drm_msm_pa_vlut))) {
- DRM_ERROR("hw %pK payload %pK payloadsize %d exp size %zd\n",
- hw_cfg, ((hw_cfg) ? hw_cfg->payload : NULL),
- ((hw_cfg) ? hw_cfg->len : 0),
- sizeof(struct drm_msm_pa_vlut));
- return;
- }
- op_mode = DPU_REG_READ(&ctx->hw, base);
- if (!hw_cfg->payload) {
- DRM_DEBUG_DRIVER("Disable vlut feature\n");
- /**
- * In the PA_VLUT disable case, remove PA_VLUT enable bit(19)
- * first, then check whether any other PA sub-features are
- * enabled or not. If none of the sub-features are enabled,
- * remove the PA global enable bit(20).
- */
- op_mode &= ~((u32)DSPP_OP_PA_LUTV_EN);
- if (PA_DSPP_DISABLE_REQUIRED(op_mode))
- op_mode &= ~((u32)DSPP_OP_PA_EN);
- DPU_REG_WRITE(&ctx->hw, base, op_mode);
- return;
- }
- payload = hw_cfg->payload;
- DRM_DEBUG_DRIVER("Enable vlut feature flags %llx\n", payload->flags);
- for (i = 0, j = 0; i < ARRAY_SIZE(payload->val); i += 2, j += 4) {
- tmp = (payload->val[i] & REG_MASK(10)) |
- ((payload->val[i + 1] & REG_MASK(10)) << 16);
- DPU_REG_WRITE(&ctx->hw, (offset + j),
- tmp);
- }
- DPU_REG_WRITE(&ctx->hw, (base + PA_LUT_SWAP_OFF), 1);
- op_mode |= DSPP_OP_PA_EN | DSPP_OP_PA_LUTV_EN;
- DPU_REG_WRITE(&ctx->hw, base, op_mode);
-}
-
-void dpu_setup_dspp_pa_vlut_v1_8(struct dpu_hw_dspp *ctx, void *cfg)
-{
- struct drm_msm_pa_vlut *payload = NULL;
- struct dpu_hw_cp_cfg *hw_cfg = cfg;
- struct dpu_hw_ctl *ctl = NULL;
- u32 vlut_base, pa_hist_base;
- u32 ctrl_off, swap_off;
- u32 tmp = 0;
- int i = 0, j = 0;
- u32 flush_mask = 0;
-
- if (!ctx) {
- DRM_ERROR("invalid input parameter NULL ctx\n");
- return;
- }
-
- if (!hw_cfg || (hw_cfg->payload && hw_cfg->len !=
- sizeof(struct drm_msm_pa_vlut))) {
- DRM_ERROR("hw %pK payload %pK payloadsize %d exp size %zd\n",
- hw_cfg, ((hw_cfg) ? hw_cfg->payload : NULL),
- ((hw_cfg) ? hw_cfg->len : 0),
- sizeof(struct drm_msm_pa_vlut));
- return;
- }
-
- ctl = hw_cfg->ctl;
- vlut_base = ctx->cap->sblk->vlut.base;
- pa_hist_base = ctx->cap->sblk->hist.base;
- ctrl_off = pa_hist_base + PA_LUTV_DSPP_CTRL_OFF;
- swap_off = pa_hist_base + PA_LUTV_DSPP_SWAP_OFF;
-
- if (!hw_cfg->payload) {
- DRM_DEBUG_DRIVER("Disable vlut feature\n");
- DPU_REG_WRITE(&ctx->hw, ctrl_off, 0);
- goto exit;
- }
-
- payload = hw_cfg->payload;
- DRM_DEBUG_DRIVER("Enable vlut feature flags %llx\n", payload->flags);
- for (i = 0, j = 0; i < ARRAY_SIZE(payload->val); i += 2, j += 4) {
- tmp = (payload->val[i] & REG_MASK(10)) |
- ((payload->val[i + 1] & REG_MASK(10)) << 16);
- DPU_REG_WRITE(&ctx->hw, (vlut_base + j), tmp);
- }
- DPU_REG_WRITE(&ctx->hw, ctrl_off, 1);
- DPU_REG_WRITE(&ctx->hw, swap_off, 1);
-
-exit:
- /* update flush bit */
- if (ctl && ctl->ops.get_bitmask_dspp_pavlut) {
- ctl->ops.get_bitmask_dspp_pavlut(ctl, &flush_mask, ctx->idx);
- if (ctl->ops.update_pending_flush)
- ctl->ops.update_pending_flush(ctl, flush_mask);
- }
-}
-
-void dpu_setup_dspp_gc_v1_7(struct dpu_hw_dspp *ctx, void *cfg)
-{
- struct drm_msm_pgc_lut *payload = NULL;
- struct dpu_hw_cp_cfg *hw_cfg = cfg;
- u32 c0_off, c1_off, c2_off, i;
-
- if (!hw_cfg || (hw_cfg->payload && hw_cfg->len !=
- sizeof(struct drm_msm_pgc_lut))) {
- DRM_ERROR("hw %pK payload %pK payloadsize %d exp size %zd\n",
- hw_cfg, ((hw_cfg) ? hw_cfg->payload : NULL),
- ((hw_cfg) ? hw_cfg->len : 0),
- sizeof(struct drm_msm_pgc_lut));
- return;
- }
-
- if (!hw_cfg->payload) {
- DRM_DEBUG_DRIVER("Disable pgc feature\n");
- DPU_REG_WRITE(&ctx->hw, ctx->cap->sblk->gc.base, 0);
- return;
- }
- payload = hw_cfg->payload;
-
- /* Initialize index offsets */
- c0_off = ctx->cap->sblk->gc.base + PGC_C0_INDEX_OFF;
- c1_off = c0_off + (sizeof(u32) * 2);
- c2_off = c1_off + (sizeof(u32) * 2);
- DPU_REG_WRITE(&ctx->hw, c0_off, 0);
- DPU_REG_WRITE(&ctx->hw, c1_off, 0);
- DPU_REG_WRITE(&ctx->hw, c2_off, 0);
-
- /* Initialize table offsets */
- c0_off = ctx->cap->sblk->gc.base + PGC_C0_OFF;
- c1_off = c0_off + (sizeof(u32) * 2);
- c2_off = c1_off + (sizeof(u32) * 2);
-
- for (i = 0; i < PGC_TBL_LEN; i++) {
- DPU_REG_WRITE(&ctx->hw, c0_off, payload->c0[i]);
- DPU_REG_WRITE(&ctx->hw, c1_off, payload->c1[i]);
- DPU_REG_WRITE(&ctx->hw, c2_off, payload->c2[i]);
- }
- DPU_REG_WRITE(&ctx->hw, ctx->cap->sblk->gc.base + PGC_LUT_SWAP_OFF,
- BIT(0));
- i = BIT(0) | ((payload->flags & PGC_8B_ROUND) ? BIT(1) : 0);
- DPU_REG_WRITE(&ctx->hw, ctx->cap->sblk->gc.base, i);
-}
diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_color_processing_v1_7.h b/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_color_processing_v1_7.h
deleted file mode 100644
index 76807ae..0000000
--- a/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_color_processing_v1_7.h
+++ /dev/null
@@ -1,92 +0,0 @@
-/* Copyright (c) 2016-2018, The Linux Foundation. All rights reserved.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 and
- * only version 2 as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- */
-
-#ifndef _DPU_HW_COLOR_PROCESSING_V1_7_H
-#define _DPU_HW_COLOR_PROCESSING_V1_7_H
-
-#include "dpu_hw_sspp.h"
-#include "dpu_hw_dspp.h"
-
-/**
- * dpu_setup_pipe_pa_hue_v1_7 - setup SSPP hue feature in v1.7 hardware
- * @ctx: Pointer to pipe context
- * @cfg: Pointer to hue data
- */
-void dpu_setup_pipe_pa_hue_v1_7(struct dpu_hw_pipe *ctx, void *cfg);
-
-/**
- * dpu_setup_pipe_pa_sat_v1_7 - setup SSPP saturation feature in v1.7 hardware
- * @ctx: Pointer to pipe context
- * @cfg: Pointer to saturation data
- */
-void dpu_setup_pipe_pa_sat_v1_7(struct dpu_hw_pipe *ctx, void *cfg);
-
-/**
- * dpu_setup_pipe_pa_val_v1_7 - setup SSPP value feature in v1.7 hardware
- * @ctx: Pointer to pipe context
- * @cfg: Pointer to value data
- */
-void dpu_setup_pipe_pa_val_v1_7(struct dpu_hw_pipe *ctx, void *cfg);
-
-/**
- * dpu_setup_pipe_pa_cont_v1_7 - setup SSPP contrast feature in v1.7 hardware
- * @ctx: Pointer to pipe context
- * @cfg: Pointer to contrast data
- */
-void dpu_setup_pipe_pa_cont_v1_7(struct dpu_hw_pipe *ctx, void *cfg);
-
-/**
- * dpu_setup_pipe_pa_memcol_v1_7 - setup SSPP memory color in v1.7 hardware
- * @ctx: Pointer to pipe context
- * @type: Memory color type (Skin, sky, or foliage)
- * @cfg: Pointer to memory color config data
- */
-void dpu_setup_pipe_pa_memcol_v1_7(struct dpu_hw_pipe *ctx,
- enum dpu_memcolor_type type,
- void *cfg);
-
-/**
- * dpu_setup_dspp_pcc_v1_7 - setup DSPP PCC veature in v1.7 hardware
- * @ctx: Pointer to dspp context
- * @cfg: Pointer to PCC data
- */
-void dpu_setup_dspp_pcc_v1_7(struct dpu_hw_dspp *ctx, void *cfg);
-
-/**
- * dpu_setup_dspp_pa_hue_v1_7 - setup DSPP hue feature in v1.7 hardware
- * @ctx: Pointer to DSPP context
- * @cfg: Pointer to hue data
- */
-void dpu_setup_dspp_pa_hue_v1_7(struct dpu_hw_dspp *ctx, void *cfg);
-
-/**
- * dpu_setup_dspp_pa_vlut_v1_7 - setup DSPP PA vLUT feature in v1.7 hardware
- * @ctx: Pointer to DSPP context
- * @cfg: Pointer to vLUT data
- */
-void dpu_setup_dspp_pa_vlut_v1_7(struct dpu_hw_dspp *ctx, void *cfg);
-
-/**
- * dpu_setup_dspp_pa_vlut_v1_8 - setup DSPP PA vLUT feature in v1.8 hardware
- * @ctx: Pointer to DSPP context
- * @cfg: Pointer to vLUT data
- */
-void dpu_setup_dspp_pa_vlut_v1_8(struct dpu_hw_dspp *ctx, void *cfg);
-
-/**
- * dpu_setup_dspp_gc_v1_7 - setup DSPP gc feature in v1.7 hardware
- * @ctx: Pointer to DSPP context
- * @cfg: Pointer to gc data
- */
-void dpu_setup_dspp_gc_v1_7(struct dpu_hw_dspp *ctx, void *cfg);
-
-#endif
diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_ctl.c b/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_ctl.c
index 6922d8a..4865427 100644
--- a/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_ctl.c
+++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_ctl.c
@@ -15,7 +15,6 @@
#include "dpu_hw_ctl.h"
#include "dpu_dbg.h"
#include "dpu_kms.h"
-#include "dpu_reg_dma.h"
#define CTL_LAYER(lm) \
(((lm) == LM_5) ? (0x024) : (((lm) - LM_0) * 0x004))
@@ -203,38 +202,6 @@ static inline uint32_t dpu_hw_ctl_get_bitmask_mixer(struct dpu_hw_ctl *ctx,
return flushbits;
}
-static inline int dpu_hw_ctl_get_bitmask_dspp(struct dpu_hw_ctl *ctx,
- u32 *flushbits, enum dpu_dspp dspp)
-{
- switch (dspp) {
- case DSPP_0:
- *flushbits |= BIT(13);
- break;
- case DSPP_1:
- *flushbits |= BIT(14);
- break;
- default:
- return -EINVAL;
- }
- return 0;
-}
-
-static inline int dpu_hw_ctl_get_bitmask_dspp_pavlut(struct dpu_hw_ctl *ctx,
- u32 *flushbits, enum dpu_dspp dspp)
-{
- switch (dspp) {
- case DSPP_0:
- *flushbits |= BIT(3);
- break;
- case DSPP_1:
- *flushbits |= BIT(4);
- break;
- default:
- return -EINVAL;
- }
- return 0;
-}
-
static inline int dpu_hw_ctl_get_bitmask_intf(struct dpu_hw_ctl *ctx,
u32 *flushbits, enum dpu_intf intf)
{
@@ -518,14 +485,6 @@ static void dpu_hw_ctl_intf_cfg(struct dpu_hw_ctl *ctx,
DPU_REG_WRITE(c, CTL_TOP, intf_cfg);
}
-static void dpu_hw_reg_dma_flush(struct dpu_hw_ctl *ctx)
-{
- struct dpu_hw_reg_dma_ops *ops = dpu_reg_dma_get_ops();
-
- if (ops && ops->last_command)
- ops->last_command(ctx, DMA_CTL_QUEUE0);
-}
-
static void _setup_ctl_ops(struct dpu_hw_ctl_ops *ops,
unsigned long cap)
{
@@ -543,12 +502,9 @@ static void _setup_ctl_ops(struct dpu_hw_ctl_ops *ops,
ops->setup_blendstage = dpu_hw_ctl_setup_blendstage;
ops->get_bitmask_sspp = dpu_hw_ctl_get_bitmask_sspp;
ops->get_bitmask_mixer = dpu_hw_ctl_get_bitmask_mixer;
- ops->get_bitmask_dspp = dpu_hw_ctl_get_bitmask_dspp;
- ops->get_bitmask_dspp_pavlut = dpu_hw_ctl_get_bitmask_dspp_pavlut;
ops->get_bitmask_intf = dpu_hw_ctl_get_bitmask_intf;
ops->get_bitmask_cdm = dpu_hw_ctl_get_bitmask_cdm;
ops->get_bitmask_wb = dpu_hw_ctl_get_bitmask_wb;
- ops->reg_dma_flush = dpu_hw_reg_dma_flush;
};
static struct dpu_hw_blk_ops dpu_hw_ops = {
diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_ctl.h b/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_ctl.h
index d3435be..b773a5a 100644
--- a/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_ctl.h
+++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_ctl.h
@@ -140,14 +140,6 @@ struct dpu_hw_ctl_ops {
uint32_t (*get_bitmask_mixer)(struct dpu_hw_ctl *ctx,
enum dpu_lm blk);
- int (*get_bitmask_dspp)(struct dpu_hw_ctl *ctx,
- u32 *flushbits,
- enum dpu_dspp blk);
-
- int (*get_bitmask_dspp_pavlut)(struct dpu_hw_ctl *ctx,
- u32 *flushbits,
- enum dpu_dspp blk);
-
int (*get_bitmask_intf)(struct dpu_hw_ctl *ctx,
u32 *flushbits,
enum dpu_intf blk);
@@ -174,13 +166,6 @@ struct dpu_hw_ctl_ops {
*/
void (*setup_blendstage)(struct dpu_hw_ctl *ctx,
enum dpu_lm lm, struct dpu_hw_stage_cfg *cfg);
-
- /**
- * Flush the reg dma by sending last command.
- * @ctx : ctl path ctx pointer
- */
- void (*reg_dma_flush)(struct dpu_hw_ctl *ctx);
-
};
/**
diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_dspp.c b/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_dspp.c
deleted file mode 100644
index a042cab..0000000
--- a/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_dspp.c
+++ /dev/null
@@ -1,209 +0,0 @@
-/* Copyright (c) 2015-2018, The Linux Foundation. All rights reserved.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 and
- * only version 2 as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- */
-#include <drm/msm_drm_pp.h>
-#include "dpu_hw_mdss.h"
-#include "dpu_hwio.h"
-#include "dpu_hw_catalog.h"
-#include "dpu_hw_dspp.h"
-#include "dpu_hw_color_processing.h"
-#include "dpu_dbg.h"
-#include "dpu_ad4.h"
-#include "dpu_kms.h"
-
-static struct dpu_dspp_cfg *_dspp_offset(enum dpu_dspp dspp,
- struct dpu_mdss_cfg *m,
- void __iomem *addr,
- struct dpu_hw_blk_reg_map *b)
-{
- int i;
-
- if (!m || !addr || !b)
- return ERR_PTR(-EINVAL);
-
- for (i = 0; i < m->dspp_count; i++) {
- if (dspp == m->dspp[i].id) {
- b->base_off = addr;
- b->blk_off = m->dspp[i].base;
- b->length = m->dspp[i].len;
- b->hwversion = m->hwversion;
- b->log_mask = DPU_DBG_MASK_DSPP;
- return &m->dspp[i];
- }
- }
-
- return ERR_PTR(-EINVAL);
-}
-
-static void _setup_dspp_ops(struct dpu_hw_dspp *c, unsigned long features)
-{
- int i = 0, ret;
-
- if (!c || !c->cap || !c->cap->sblk)
- return;
-
- for (i = 0; i < DPU_DSPP_MAX; i++) {
- if (!test_bit(i, &features))
- continue;
- switch (i) {
- case DPU_DSPP_PCC:
- if (c->cap->sblk->pcc.version ==
- (DPU_COLOR_PROCESS_VER(0x1, 0x7)))
- c->ops.setup_pcc = dpu_setup_dspp_pcc_v1_7;
- else if (c->cap->sblk->pcc.version ==
- (DPU_COLOR_PROCESS_VER(0x4, 0x0))) {
- ret = reg_dmav1_init_dspp_op_v4(i, c->idx);
- if (!ret)
- c->ops.setup_pcc =
- reg_dmav1_setup_dspp_pccv4;
- else
- c->ops.setup_pcc =
- dpu_setup_dspp_pccv4;
- }
- break;
- case DPU_DSPP_HSIC:
- if (c->cap->sblk->hsic.version ==
- (DPU_COLOR_PROCESS_VER(0x1, 0x7)))
- c->ops.setup_hue = dpu_setup_dspp_pa_hue_v1_7;
- break;
- case DPU_DSPP_VLUT:
- if (c->cap->sblk->vlut.version ==
- (DPU_COLOR_PROCESS_VER(0x1, 0x7))) {
- c->ops.setup_vlut =
- dpu_setup_dspp_pa_vlut_v1_7;
- } else if (c->cap->sblk->vlut.version ==
- (DPU_COLOR_PROCESS_VER(0x1, 0x8))) {
- ret = reg_dmav1_init_dspp_op_v4(i, c->idx);
- if (!ret)
- c->ops.setup_vlut =
- reg_dmav1_setup_dspp_vlutv18;
- else
- c->ops.setup_vlut =
- dpu_setup_dspp_pa_vlut_v1_8;
- }
- break;
- case DPU_DSPP_GAMUT:
- if (c->cap->sblk->gamut.version ==
- DPU_COLOR_PROCESS_VER(0x4, 0)) {
- ret = reg_dmav1_init_dspp_op_v4(i, c->idx);
- if (!ret)
- c->ops.setup_gamut =
- reg_dmav1_setup_dspp_3d_gamutv4;
- else
- c->ops.setup_gamut =
- dpu_setup_dspp_3d_gamutv4;
- }
- break;
- case DPU_DSPP_GC:
- if (c->cap->sblk->gc.version ==
- DPU_COLOR_PROCESS_VER(0x1, 8)) {
- ret = reg_dmav1_init_dspp_op_v4(i, c->idx);
- if (!ret)
- c->ops.setup_gc =
- reg_dmav1_setup_dspp_gcv18;
- /** programming for v18 through ahb is same
- * as v17 hence assign v17 function
- */
- else
- c->ops.setup_gc =
- dpu_setup_dspp_gc_v1_7;
- }
- break;
- case DPU_DSPP_IGC:
- if (c->cap->sblk->igc.version ==
- DPU_COLOR_PROCESS_VER(0x3, 0x1)) {
- ret = reg_dmav1_init_dspp_op_v4(i, c->idx);
- if (!ret)
- c->ops.setup_igc =
- reg_dmav1_setup_dspp_igcv31;
- else
- c->ops.setup_igc =
- dpu_setup_dspp_igcv3;
- }
- break;
- case DPU_DSPP_AD:
- if (c->cap->sblk->ad.version ==
- DPU_COLOR_PROCESS_VER(4, 0)) {
- c->ops.setup_ad = dpu_setup_dspp_ad4;
- c->ops.ad_read_intr_resp =
- dpu_read_intr_resp_ad4;
- c->ops.validate_ad = dpu_validate_dspp_ad4;
- }
- break;
- default:
- break;
- }
- }
-}
-
-static struct dpu_hw_blk_ops dpu_hw_ops = {
- .start = NULL,
- .stop = NULL,
-};
-
-struct dpu_hw_dspp *dpu_hw_dspp_init(enum dpu_dspp idx,
- void __iomem *addr,
- struct dpu_mdss_cfg *m)
-{
- struct dpu_hw_dspp *c;
- struct dpu_dspp_cfg *cfg;
- int rc;
-
- if (!addr || !m)
- return ERR_PTR(-EINVAL);
-
- c = kzalloc(sizeof(*c), GFP_KERNEL);
- if (!c)
- return ERR_PTR(-ENOMEM);
-
- cfg = _dspp_offset(idx, m, addr, &c->hw);
- if (IS_ERR_OR_NULL(cfg)) {
- kfree(c);
- return ERR_PTR(-EINVAL);
- }
-
- /* Populate DSPP Top HW block */
- c->hw_top.base_off = addr;
- c->hw_top.blk_off = m->dspp_top.base;
- c->hw_top.length = m->dspp_top.len;
- c->hw_top.hwversion = m->hwversion;
- c->hw_top.log_mask = DPU_DBG_MASK_DSPP;
-
- /* Assign ops */
- c->idx = idx;
- c->cap = cfg;
- _setup_dspp_ops(c, c->cap->features);
-
- rc = dpu_hw_blk_init(&c->base, DPU_HW_BLK_DSPP, idx, &dpu_hw_ops);
- if (rc) {
- DPU_ERROR("failed to init hw blk %d\n", rc);
- goto blk_init_error;
- }
-
- dpu_dbg_reg_register_dump_range(DPU_DBG_NAME, cfg->name, c->hw.blk_off,
- c->hw.blk_off + c->hw.length, c->hw.xin_id);
-
- return c;
-
-blk_init_error:
- kzfree(c);
-
- return ERR_PTR(rc);
-}
-
-void dpu_hw_dspp_destroy(struct dpu_hw_dspp *dspp)
-{
- if (dspp) {
- reg_dmav1_deinit_dspp_ops(dspp->idx);
- dpu_hw_blk_destroy(&dspp->base);
- }
- kfree(dspp);
-}
diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_dspp.h b/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_dspp.h
deleted file mode 100644
index cc72490..0000000
--- a/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_dspp.h
+++ /dev/null
@@ -1,220 +0,0 @@
-/* Copyright (c) 2015-2018, The Linux Foundation. All rights reserved.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 and
- * only version 2 as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- */
-
-#ifndef _DPU_HW_DSPP_H
-#define _DPU_HW_DSPP_H
-
-#include "dpu_hw_blk.h"
-
-struct dpu_hw_dspp;
-
-/**
- * struct dpu_hw_dspp_ops - interface to the dspp hardware driver functions
- * Caller must call the init function to get the dspp context for each dspp
- * Assumption is these functions will be called after clocks are enabled
- */
-struct dpu_hw_dspp_ops {
- /**
- * setup_histogram - setup dspp histogram
- * @ctx: Pointer to dspp context
- * @cfg: Pointer to configuration
- */
- void (*setup_histogram)(struct dpu_hw_dspp *ctx, void *cfg);
-
- /**
- * read_histogram - read dspp histogram
- * @ctx: Pointer to dspp context
- * @cfg: Pointer to configuration
- */
- void (*read_histogram)(struct dpu_hw_dspp *ctx, void *cfg);
-
- /**
- * setup_igc - update dspp igc
- * @ctx: Pointer to dspp context
- * @cfg: Pointer to configuration
- */
- void (*setup_igc)(struct dpu_hw_dspp *ctx, void *cfg);
-
- /**
- * setup_pa - setup dspp pa
- * @ctx: Pointer to dspp context
- * @cfg: Pointer to configuration
- */
- void (*setup_pa)(struct dpu_hw_dspp *dspp, void *cfg);
-
- /**
- * setup_pcc - setup dspp pcc
- * @ctx: Pointer to dspp context
- * @cfg: Pointer to configuration
- */
- void (*setup_pcc)(struct dpu_hw_dspp *ctx, void *cfg);
-
- /**
- * setup_sharpening - setup dspp sharpening
- * @ctx: Pointer to dspp context
- * @cfg: Pointer to configuration
- */
- void (*setup_sharpening)(struct dpu_hw_dspp *ctx, void *cfg);
-
- /**
- * setup_pa_memcolor - setup dspp memcolor
- * @ctx: Pointer to dspp context
- * @cfg: Pointer to configuration
- */
- void (*setup_pa_memcolor)(struct dpu_hw_dspp *ctx, void *cfg);
-
- /**
- * setup_sixzone - setup dspp six zone
- * @ctx: Pointer to dspp context
- * @cfg: Pointer to configuration
- */
- void (*setup_sixzone)(struct dpu_hw_dspp *dspp, void *cfg);
-
- /**
- * setup_danger_safe - setup danger safe LUTS
- * @ctx: Pointer to dspp context
- * @cfg: Pointer to configuration
- */
- void (*setup_danger_safe)(struct dpu_hw_dspp *ctx, void *cfg);
-
- /**
- * setup_dither - setup dspp dither
- * @ctx: Pointer to dspp context
- * @cfg: Pointer to configuration
- */
- void (*setup_dither)(struct dpu_hw_dspp *ctx, void *cfg);
-
- /**
- * setup_hue - setup dspp PA hue
- * @ctx: Pointer to dspp context
- * @cfg: Pointer to configuration
- */
- void (*setup_hue)(struct dpu_hw_dspp *ctx, void *cfg);
-
- /**
- * setup_sat - setup dspp PA saturation
- * @ctx: Pointer to dspp context
- * @cfg: Pointer to configuration
- */
- void (*setup_sat)(struct dpu_hw_dspp *ctx, void *cfg);
-
- /**
- * setup_val - setup dspp PA value
- * @ctx: Pointer to dspp context
- * @cfg: Pointer to configuration
- */
- void (*setup_val)(struct dpu_hw_dspp *ctx, void *cfg);
-
- /**
- * setup_cont - setup dspp PA contrast
- * @ctx: Pointer to dspp context
- * @cfg: Pointer to configuration
- */
- void (*setup_cont)(struct dpu_hw_dspp *ctx, void *cfg);
-
- /**
- * setup_vlut - setup dspp PA VLUT
- * @ctx: Pointer to dspp context
- * @cfg: Pointer to configuration
- */
- void (*setup_vlut)(struct dpu_hw_dspp *ctx, void *cfg);
-
- /**
- * setup_gc - update dspp gc
- * @ctx: Pointer to dspp context
- * @cfg: Pointer to configuration
- */
- void (*setup_gc)(struct dpu_hw_dspp *ctx, void *cfg);
-
- /**
- * setup_gamut - update dspp gamut
- * @ctx: Pointer to dspp context
- * @cfg: Pointer to configuration
- */
- void (*setup_gamut)(struct dpu_hw_dspp *ctx, void *cfg);
-
- /**
- * validate_ad - check if ad property can be set
- * @ctx: Pointer to dspp context
- * @prop: Pointer to ad property being validated
- */
- int (*validate_ad)(struct dpu_hw_dspp *ctx, u32 *prop);
-
- /**
- * setup_ad - update the ad property
- * @ctx: Pointer to dspp context
- * @cfg: Pointer to ad configuration
- */
- void (*setup_ad)(struct dpu_hw_dspp *ctx, void *cfg);
-
- /**
- * ad_read_intr_resp - function to get interrupt response for ad
- * @event: Event for which response needs to be read
- * @resp: Pointer to u32 where response value is dumped.
- */
- void (*ad_read_intr_resp)(struct dpu_hw_dspp *ctx, u32 event,
- u32 *resp);
-
-};
-
-/**
- * struct dpu_hw_dspp - dspp description
- * @base: Hardware block base structure
- * @hw: Block hardware details
- * @hw_top: Block hardware top details
- * @idx: DSPP index
- * @cap: Pointer to layer_cfg
- * @ops: Pointer to operations possible for this DSPP
- */
-struct dpu_hw_dspp {
- struct dpu_hw_blk base;
- struct dpu_hw_blk_reg_map hw;
-
- /* dspp top */
- struct dpu_hw_blk_reg_map hw_top;
-
- /* dspp */
- enum dpu_dspp idx;
- const struct dpu_dspp_cfg *cap;
-
- /* Ops */
- struct dpu_hw_dspp_ops ops;
-};
-
-/**
- * dpu_hw_dspp - convert base object dpu_hw_base to container
- * @hw: Pointer to base hardware block
- * return: Pointer to hardware block container
- */
-static inline struct dpu_hw_dspp *to_dpu_hw_dspp(struct dpu_hw_blk *hw)
-{
- return container_of(hw, struct dpu_hw_dspp, base);
-}
-
-/**
- * dpu_hw_dspp_init - initializes the dspp hw driver object.
- * should be called once before accessing every dspp.
- * @idx: DSPP index for which driver object is required
- * @addr: Mapped register io address of MDP
- * @Return: pointer to structure or ERR_PTR
- */
-struct dpu_hw_dspp *dpu_hw_dspp_init(enum dpu_dspp idx,
- void __iomem *addr,
- struct dpu_mdss_cfg *m);
-
-/**
- * dpu_hw_dspp_destroy(): Destroys DSPP driver context
- * @dspp: Pointer to DSPP driver context
- */
-void dpu_hw_dspp_destroy(struct dpu_hw_dspp *dspp);
-
-#endif /*_DPU_HW_DSPP_H */
diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_lm.c b/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_lm.c
index ad21867..75a30db 100644
--- a/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_lm.c
+++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_lm.c
@@ -10,6 +10,7 @@
* GNU General Public License for more details.
*/
+#include <uapi/drm/dpu_drm.h>
#include "dpu_kms.h"
#include "dpu_hw_catalog.h"
#include "dpu_hwio.h"
diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_mdss.h b/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_mdss.h
index 70d57c9..fcd164f 100644
--- a/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_mdss.h
+++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_mdss.h
@@ -99,7 +99,6 @@ enum dpu_hw_blk_type {
DPU_HW_BLK_TOP = 0,
DPU_HW_BLK_SSPP,
DPU_HW_BLK_LM,
- DPU_HW_BLK_DSPP,
DPU_HW_BLK_DS,
DPU_HW_BLK_CTL,
DPU_HW_BLK_CDM,
@@ -461,39 +460,16 @@ struct dpu_mdss_color {
*/
#define DPU_DBG_MASK_NONE (1 << 0)
#define DPU_DBG_MASK_CDM (1 << 1)
-#define DPU_DBG_MASK_DSPP (1 << 2)
-#define DPU_DBG_MASK_INTF (1 << 3)
-#define DPU_DBG_MASK_LM (1 << 4)
-#define DPU_DBG_MASK_CTL (1 << 5)
-#define DPU_DBG_MASK_PINGPONG (1 << 6)
-#define DPU_DBG_MASK_SSPP (1 << 7)
-#define DPU_DBG_MASK_WB (1 << 8)
-#define DPU_DBG_MASK_TOP (1 << 9)
-#define DPU_DBG_MASK_VBIF (1 << 10)
-#define DPU_DBG_MASK_ROT (1 << 11)
-#define DPU_DBG_MASK_DS (1 << 12)
-
-/**
- * struct dpu_hw_cp_cfg: hardware dspp/lm feature payload.
- * @payload: Feature specific payload.
- * @len: Length of the payload.
- * @ctl: control pointer associated with dspp/lm.
- * @last_feature: last feature that will be set.
- * @num_of_mixers: number of layer mixers for the display.
- * @mixer_info: mixer info pointer associated with lm.
- * @displayv: height of the display.
- * @displayh: width of the display.
- */
-struct dpu_hw_cp_cfg {
- void *payload;
- u32 len;
- void *ctl;
- u32 last_feature;
- u32 num_of_mixers;
- void *mixer_info;
- u32 displayv;
- u32 displayh;
-};
+#define DPU_DBG_MASK_INTF (1 << 2)
+#define DPU_DBG_MASK_LM (1 << 3)
+#define DPU_DBG_MASK_CTL (1 << 4)
+#define DPU_DBG_MASK_PINGPONG (1 << 5)
+#define DPU_DBG_MASK_SSPP (1 << 6)
+#define DPU_DBG_MASK_WB (1 << 7)
+#define DPU_DBG_MASK_TOP (1 << 8)
+#define DPU_DBG_MASK_VBIF (1 << 9)
+#define DPU_DBG_MASK_ROT (1 << 10)
+#define DPU_DBG_MASK_DS (1 << 11)
/**
* struct dpu_hw_dim_layer: dim layer configs
diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_pingpong.c b/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_pingpong.c
index 0bfb511..84d2176 100644
--- a/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_pingpong.c
+++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_pingpong.c
@@ -36,11 +36,6 @@
#define PP_FBC_BUDGET_CTL 0x038
#define PP_FBC_LOSSY_MODE 0x03C
-#define DITHER_DEPTH_MAP_INDEX 9
-static u32 dither_depth_map[DITHER_DEPTH_MAP_INDEX] = {
- 0, 0, 0, 0, 0, 1, 2, 3, 3
-};
-
static struct dpu_pingpong_cfg *_pingpong_offset(enum dpu_pingpong pp,
struct dpu_mdss_cfg *m,
void __iomem *addr,
@@ -109,57 +104,6 @@ static int dpu_hw_pp_poll_timeout_wr_ptr(struct dpu_hw_pingpong *pp,
return rc;
}
-static int dpu_hw_pp_setup_dither_v1(struct dpu_hw_pingpong *pp,
- void *cfg, size_t len)
-{
- struct dpu_hw_blk_reg_map *c;
- struct drm_msm_dither *dither = (struct drm_msm_dither *)cfg;
- u32 base = 0, offset = 0, data = 0, i = 0;
-
- if (!pp)
- return -EINVAL;
-
- c = &pp->hw;
- base = pp->caps->sblk->dither.base;
- if (!dither) {
- /* dither property disable case */
- DPU_REG_WRITE(c, base, 0);
- return 0;
- }
-
- if (len != sizeof(struct drm_msm_dither)) {
- DRM_ERROR("input len %zu, expected len %zu\n", len,
- sizeof(struct drm_msm_dither));
- return -EINVAL;
- }
-
- if (dither->c0_bitdepth >= DITHER_DEPTH_MAP_INDEX ||
- dither->c1_bitdepth >= DITHER_DEPTH_MAP_INDEX ||
- dither->c2_bitdepth >= DITHER_DEPTH_MAP_INDEX ||
- dither->c3_bitdepth >= DITHER_DEPTH_MAP_INDEX)
- return -EINVAL;
-
- offset += 4;
- data = dither_depth_map[dither->c0_bitdepth] & REG_MASK(2);
- data |= (dither_depth_map[dither->c1_bitdepth] & REG_MASK(2)) << 2;
- data |= (dither_depth_map[dither->c2_bitdepth] & REG_MASK(2)) << 4;
- data |= (dither_depth_map[dither->c3_bitdepth] & REG_MASK(2)) << 6;
- data |= (dither->temporal_en) ? (1 << 8) : 0;
- DPU_REG_WRITE(c, base + offset, data);
-
- for (i = 0; i < DITHER_MATRIX_SZ - 3; i += 4) {
- offset += 4;
- data = (dither->matrix[i] & REG_MASK(4)) |
- ((dither->matrix[i + 1] & REG_MASK(4)) << 4) |
- ((dither->matrix[i + 2] & REG_MASK(4)) << 8) |
- ((dither->matrix[i + 3] & REG_MASK(4)) << 12);
- DPU_REG_WRITE(c, base + offset, data);
- }
- DPU_REG_WRITE(c, base, 1);
-
- return 0;
-}
-
static int dpu_hw_pp_enable_te(struct dpu_hw_pingpong *pp, bool enable)
{
struct dpu_hw_blk_reg_map *c;
@@ -248,24 +192,12 @@ static u32 dpu_hw_pp_get_line_count(struct dpu_hw_pingpong *pp)
static void _setup_pingpong_ops(struct dpu_hw_pingpong_ops *ops,
const struct dpu_pingpong_cfg *hw_cap)
{
- u32 version = 0;
-
ops->setup_tearcheck = dpu_hw_pp_setup_te_config;
ops->enable_tearcheck = dpu_hw_pp_enable_te;
ops->connect_external_te = dpu_hw_pp_connect_external_te;
ops->get_vsync_info = dpu_hw_pp_get_vsync_info;
ops->poll_timeout_wr_ptr = dpu_hw_pp_poll_timeout_wr_ptr;
ops->get_line_count = dpu_hw_pp_get_line_count;
-
- version = DPU_COLOR_PROCESS_MAJOR(hw_cap->sblk->dither.version);
- switch (version) {
- case 1:
- ops->setup_dither = dpu_hw_pp_setup_dither_v1;
- break;
- default:
- ops->setup_dither = NULL;
- break;
- }
};
static struct dpu_hw_blk_ops dpu_hw_ops = {
diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_pingpong.h b/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_pingpong.h
index 7dbfcae..3caccd7 100644
--- a/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_pingpong.h
+++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_pingpong.h
@@ -17,7 +17,6 @@
#include "dpu_hw_mdss.h"
#include "dpu_hw_util.h"
#include "dpu_hw_blk.h"
-#include <uapi/drm/msm_drm_pp.h>
struct dpu_hw_pingpong;
@@ -88,11 +87,6 @@ struct dpu_hw_pingpong_ops {
int (*poll_timeout_wr_ptr)(struct dpu_hw_pingpong *pp, u32 timeout_us);
/**
- * Program the dither hw block
- */
- int (*setup_dither)(struct dpu_hw_pingpong *pp, void *cfg, size_t len);
-
- /**
* Obtain current vertical line counter
*/
u32 (*get_line_count)(struct dpu_hw_pingpong *pp);
diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_reg_dma_v1.c b/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_reg_dma_v1.c
deleted file mode 100644
index 7c2772f..0000000
--- a/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_reg_dma_v1.c
+++ /dev/null
@@ -1,757 +0,0 @@
-/* Copyright (c) 2017-2018, The Linux Foundation. All rights reserved.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 and
- * only version 2 as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- */
-#include "dpu_hw_mdss.h"
-#include "dpu_hw_ctl.h"
-#include "dpu_hw_reg_dma_v1.h"
-#include "msm_drv.h"
-#include "msm_kms.h"
-#include "msm_mmu.h"
-
-#define GUARD_BYTES (BIT(8) - 1)
-#define ALIGNED_OFFSET (U32_MAX & ~(GUARD_BYTES))
-#define ADDR_ALIGN BIT(8)
-#define MAX_RELATIVE_OFF (BIT(20) - 1)
-
-#define DECODE_SEL_OP (BIT(HW_BLK_SELECT))
-#define REG_WRITE_OP ((BIT(REG_SINGLE_WRITE)) | (BIT(REG_BLK_WRITE_SINGLE)) | \
- (BIT(REG_BLK_WRITE_INC)) | (BIT(REG_BLK_WRITE_MULTIPLE)))
-
-#define REG_DMA_OPS (DECODE_SEL_OP | REG_WRITE_OP)
-#define IS_OP_ALLOWED(op, buf_op) (BIT(op) & buf_op)
-
-#define REG_DMA_OP_MODE_OFF 0x4
-
-#define REG_DMA_CTL0_QUEUE_0_CMD0_OFF 0x14
-#define REG_DMA_CTL0_RESET_OFF 0xE4
-#define REG_DMA_CTL_TRIGGER_OFF 0xD4
-
-#define SET_UP_REG_DMA_REG(hw, reg_dma) \
- do { \
- (hw).base_off = (reg_dma)->addr; \
- (hw).blk_off = (reg_dma)->caps->base; \
- (hw).hwversion = (reg_dma)->caps->version; \
-} while (0)
-
-#define SIZE_DWORD(x) ((x) / (sizeof(u32)))
-#define NOT_WORD_ALIGNED(x) ((x) & 0x3)
-
-
-#define GRP_VIG_HW_BLK_SELECT (VIG0 | VIG1 | VIG2 | VIG3)
-#define GRP_DSPP_HW_BLK_SELECT (DSPP0 | DSPP1 | DSPP2 | DSPP3)
-#define BUFFER_SPACE_LEFT(cfg) ((cfg)->dma_buf->buffer_size - \
- (cfg)->dma_buf->index)
-
-#define REG_DMA_DECODE_SEL 0x180AC060
-#define SINGLE_REG_WRITE_OPCODE (BIT(28))
-#define REL_ADDR_OPCODE (BIT(27))
-#define HW_INDEX_REG_WRITE_OPCODE (BIT(28) | BIT(29))
-#define AUTO_INC_REG_WRITE_OPCODE (BIT(30))
-#define BLK_REG_WRITE_OPCODE (BIT(30) | BIT(28))
-
-#define WRAP_MIN_SIZE 2
-#define WRAP_MAX_SIZE (BIT(4) - 1)
-#define MAX_DWORDS_SZ (BIT(14) - 1)
-#define REG_DMA_HEADERS_BUFFER_SZ (sizeof(u32) * 128)
-
-typedef int (*reg_dma_internal_ops) (struct dpu_reg_dma_setup_ops_cfg *cfg);
-
-static struct dpu_hw_reg_dma *reg_dma;
-static u32 ops_mem_size[REG_DMA_SETUP_OPS_MAX] = {
- [REG_BLK_WRITE_SINGLE] = sizeof(u32) * 2,
- [REG_BLK_WRITE_INC] = sizeof(u32) * 2,
- [REG_BLK_WRITE_MULTIPLE] = sizeof(u32) * 2,
- [HW_BLK_SELECT] = sizeof(u32) * 2,
- [REG_SINGLE_WRITE] = sizeof(u32) * 2
-};
-
-static u32 queue_sel[DMA_CTL_QUEUE_MAX] = {
- [DMA_CTL_QUEUE0] = BIT(0),
- [DMA_CTL_QUEUE1] = BIT(4),
-};
-
-static u32 reg_dma_ctl_queue_off[CTL_MAX];
-static u32 dspp_read_sel[DSPP_HIST_MAX] = {
- [DSPP0_HIST] = 0,
- [DSPP1_HIST] = 1,
- [DSPP2_HIST] = 2,
- [DSPP3_HIST] = 3,
-};
-
-static u32 v1_supported[REG_DMA_FEATURES_MAX] = {
- [GAMUT] = GRP_VIG_HW_BLK_SELECT | GRP_DSPP_HW_BLK_SELECT,
- [VLUT] = GRP_DSPP_HW_BLK_SELECT,
- [GC] = GRP_DSPP_HW_BLK_SELECT,
- [IGC] = DSPP_IGC | GRP_DSPP_HW_BLK_SELECT,
- [PCC] = GRP_DSPP_HW_BLK_SELECT,
-};
-
-static int validate_dma_cfg(struct dpu_reg_dma_setup_ops_cfg *cfg);
-static int validate_write_decode_sel(struct dpu_reg_dma_setup_ops_cfg *cfg);
-static int validate_write_reg(struct dpu_reg_dma_setup_ops_cfg *cfg);
-static int validate_write_multi_lut_reg(struct dpu_reg_dma_setup_ops_cfg *cfg);
-static int validate_last_cmd(struct dpu_reg_dma_setup_ops_cfg *cfg);
-static int write_decode_sel(struct dpu_reg_dma_setup_ops_cfg *cfg);
-static int write_single_reg(struct dpu_reg_dma_setup_ops_cfg *cfg);
-static int write_multi_reg_index(struct dpu_reg_dma_setup_ops_cfg *cfg);
-static int write_multi_reg_inc(struct dpu_reg_dma_setup_ops_cfg *cfg);
-static int write_multi_lut_reg(struct dpu_reg_dma_setup_ops_cfg *cfg);
-static int write_last_cmd(struct dpu_reg_dma_setup_ops_cfg *cfg);
-static int reset_reg_dma_buffer_v1(struct dpu_reg_dma_buffer *lut_buf);
-static int check_support_v1(enum dpu_reg_dma_features feature,
- enum dpu_reg_dma_blk blk, bool *is_supported);
-static int setup_payload_v1(struct dpu_reg_dma_setup_ops_cfg *cfg);
-static int kick_off_v1(struct dpu_reg_dma_kickoff_cfg *cfg);
-static int reset_v1(struct dpu_hw_ctl *ctl);
-static int last_cmd_v1(struct dpu_hw_ctl *ctl, enum dpu_reg_dma_queue q);
-static struct dpu_reg_dma_buffer *alloc_reg_dma_buf_v1(u32 size);
-static int dealloc_reg_dma_v1(struct dpu_reg_dma_buffer *lut_buf);
-
-static reg_dma_internal_ops write_dma_op_params[REG_DMA_SETUP_OPS_MAX] = {
- [HW_BLK_SELECT] = write_decode_sel,
- [REG_SINGLE_WRITE] = write_single_reg,
- [REG_BLK_WRITE_SINGLE] = write_multi_reg_inc,
- [REG_BLK_WRITE_INC] = write_multi_reg_index,
- [REG_BLK_WRITE_MULTIPLE] = write_multi_lut_reg,
-};
-
-static reg_dma_internal_ops validate_dma_op_params[REG_DMA_SETUP_OPS_MAX] = {
- [HW_BLK_SELECT] = validate_write_decode_sel,
- [REG_SINGLE_WRITE] = validate_write_reg,
- [REG_BLK_WRITE_SINGLE] = validate_write_reg,
- [REG_BLK_WRITE_INC] = validate_write_reg,
- [REG_BLK_WRITE_MULTIPLE] = validate_write_multi_lut_reg,
-};
-
-static struct dpu_reg_dma_buffer *last_cmd_buf;
-
-static void get_decode_sel(unsigned long blk, u32 *decode_sel)
-{
- int i = 0;
-
- *decode_sel = 0;
- for_each_set_bit(i, &blk, 31) {
- switch (BIT(i)) {
- case VIG0:
- *decode_sel |= BIT(0);
- break;
- case VIG1:
- *decode_sel |= BIT(1);
- break;
- case VIG2:
- *decode_sel |= BIT(2);
- break;
- case VIG3:
- *decode_sel |= BIT(3);
- break;
- case DSPP0:
- *decode_sel |= BIT(17);
- break;
- case DSPP1:
- *decode_sel |= BIT(18);
- break;
- case DSPP2:
- *decode_sel |= BIT(19);
- break;
- case DSPP3:
- *decode_sel |= BIT(20);
- break;
- case SSPP_IGC:
- *decode_sel |= BIT(4);
- break;
- case DSPP_IGC:
- *decode_sel |= BIT(21);
- break;
- default:
- DRM_ERROR("block not supported %lx\n", BIT(i));
- break;
- }
- }
-}
-
-static int write_multi_reg(struct dpu_reg_dma_setup_ops_cfg *cfg)
-{
- u8 *loc = NULL;
-
- loc = (u8 *)cfg->dma_buf->vaddr + cfg->dma_buf->index;
- memcpy(loc, cfg->data, cfg->data_size);
- cfg->dma_buf->index += cfg->data_size;
- cfg->dma_buf->next_op_allowed = REG_WRITE_OP | DECODE_SEL_OP;
- cfg->dma_buf->ops_completed |= REG_WRITE_OP;
-
- return 0;
-}
-
-int write_multi_reg_index(struct dpu_reg_dma_setup_ops_cfg *cfg)
-{
- u32 *loc = NULL;
-
- loc = (u32 *)((u8 *)cfg->dma_buf->vaddr +
- cfg->dma_buf->index);
- loc[0] = HW_INDEX_REG_WRITE_OPCODE;
- loc[0] |= (cfg->blk_offset & MAX_RELATIVE_OFF);
- loc[1] = SIZE_DWORD(cfg->data_size);
- cfg->dma_buf->index += ops_mem_size[cfg->ops];
-
- return write_multi_reg(cfg);
-}
-
-int write_multi_reg_inc(struct dpu_reg_dma_setup_ops_cfg *cfg)
-{
- u32 *loc = NULL;
-
- loc = (u32 *)((u8 *)cfg->dma_buf->vaddr +
- cfg->dma_buf->index);
- loc[0] = AUTO_INC_REG_WRITE_OPCODE;
- loc[0] |= (cfg->blk_offset & MAX_RELATIVE_OFF);
- loc[1] = SIZE_DWORD(cfg->data_size);
- cfg->dma_buf->index += ops_mem_size[cfg->ops];
-
- return write_multi_reg(cfg);
-}
-
-static int write_multi_lut_reg(struct dpu_reg_dma_setup_ops_cfg *cfg)
-{
- u32 *loc = NULL;
-
- loc = (u32 *)((u8 *)cfg->dma_buf->vaddr +
- cfg->dma_buf->index);
- loc[0] = BLK_REG_WRITE_OPCODE;
- loc[0] |= (cfg->blk_offset & MAX_RELATIVE_OFF);
- loc[1] = (cfg->inc) ? 0 : BIT(31);
- loc[1] |= (cfg->wrap_size & WRAP_MAX_SIZE) << 16;
- loc[1] |= ((SIZE_DWORD(cfg->data_size)) & MAX_DWORDS_SZ);
- cfg->dma_buf->next_op_allowed = REG_WRITE_OP;
- cfg->dma_buf->index += ops_mem_size[cfg->ops];
-
- return write_multi_reg(cfg);
-}
-
-static int write_single_reg(struct dpu_reg_dma_setup_ops_cfg *cfg)
-{
- u32 *loc = NULL;
-
- loc = (u32 *)((u8 *)cfg->dma_buf->vaddr +
- cfg->dma_buf->index);
- loc[0] = SINGLE_REG_WRITE_OPCODE;
- loc[0] |= (cfg->blk_offset & MAX_RELATIVE_OFF);
- loc[1] = *cfg->data;
- cfg->dma_buf->index += ops_mem_size[cfg->ops];
- cfg->dma_buf->ops_completed |= REG_WRITE_OP;
- cfg->dma_buf->next_op_allowed = REG_WRITE_OP | DECODE_SEL_OP;
-
- return 0;
-}
-
-static int write_decode_sel(struct dpu_reg_dma_setup_ops_cfg *cfg)
-{
- u32 *loc = NULL;
-
- loc = (u32 *)((u8 *)cfg->dma_buf->vaddr +
- cfg->dma_buf->index);
- loc[0] = REG_DMA_DECODE_SEL;
- get_decode_sel(cfg->blk, &loc[1]);
- cfg->dma_buf->index += sizeof(u32) * 2;
- cfg->dma_buf->ops_completed |= DECODE_SEL_OP;
- cfg->dma_buf->next_op_allowed = REG_WRITE_OP;
-
- return 0;
-}
-
-static int validate_write_multi_lut_reg(struct dpu_reg_dma_setup_ops_cfg *cfg)
-{
- int rc;
-
- rc = validate_write_reg(cfg);
- if (rc)
- return rc;
-
- if (cfg->wrap_size < WRAP_MIN_SIZE || cfg->wrap_size > WRAP_MAX_SIZE) {
- DRM_ERROR("invalid wrap sz %d min %d max %ld\n",
- cfg->wrap_size, WRAP_MIN_SIZE, WRAP_MAX_SIZE);
- rc = -EINVAL;
- }
-
- return rc;
-}
-
-static int validate_write_reg(struct dpu_reg_dma_setup_ops_cfg *cfg)
-{
- u32 remain_len, write_len;
-
- remain_len = BUFFER_SPACE_LEFT(cfg);
- write_len = ops_mem_size[cfg->ops] + cfg->data_size;
- if (remain_len < write_len) {
- DRM_ERROR("buffer is full sz %d needs %d bytes\n",
- remain_len, write_len);
- return -EINVAL;
- }
-
- if (!cfg->data) {
- DRM_ERROR("invalid data %pK size %d exp sz %d\n", cfg->data,
- cfg->data_size, write_len);
- return -EINVAL;
- }
- if ((SIZE_DWORD(cfg->data_size)) > MAX_DWORDS_SZ ||
- NOT_WORD_ALIGNED(cfg->data_size)) {
- DRM_ERROR("Invalid data size %d max %ld align %x\n",
- cfg->data_size, MAX_DWORDS_SZ,
- NOT_WORD_ALIGNED(cfg->data_size));
- return -EINVAL;
- }
-
- if (cfg->blk_offset > MAX_RELATIVE_OFF ||
- NOT_WORD_ALIGNED(cfg->blk_offset)) {
- DRM_ERROR("invalid offset %d max %ld align %x\n",
- cfg->blk_offset, MAX_RELATIVE_OFF,
- NOT_WORD_ALIGNED(cfg->blk_offset));
- return -EINVAL;
- }
-
- return 0;
-}
-
-static int validate_write_decode_sel(struct dpu_reg_dma_setup_ops_cfg *cfg)
-{
- u32 remain_len;
-
- remain_len = BUFFER_SPACE_LEFT(cfg);
- if (remain_len < ops_mem_size[HW_BLK_SELECT]) {
- DRM_ERROR("buffer is full needs %d bytes\n",
- ops_mem_size[HW_BLK_SELECT]);
- return -EINVAL;
- }
-
- if (!cfg->blk) {
- DRM_ERROR("blk set as 0\n");
- return -EINVAL;
- }
- /* DSPP and VIG can't be combined */
- if ((cfg->blk & GRP_VIG_HW_BLK_SELECT) &&
- (cfg->blk & GRP_DSPP_HW_BLK_SELECT)) {
- DRM_ERROR("invalid blk combination %x\n",
- cfg->blk);
- return -EINVAL;
- }
-
- return 0;
-}
-
-static int validate_dma_cfg(struct dpu_reg_dma_setup_ops_cfg *cfg)
-{
- int rc = 0;
- bool supported;
-
- if (!cfg || cfg->ops >= REG_DMA_SETUP_OPS_MAX || !cfg->dma_buf) {
- DRM_ERROR("invalid param cfg %pK ops %d dma_buf %pK\n",
- cfg, ((cfg) ? cfg->ops : REG_DMA_SETUP_OPS_MAX),
- ((cfg) ? cfg->dma_buf : NULL));
- return -EINVAL;
- }
-
- rc = check_support_v1(cfg->feature, cfg->blk, &supported);
- if (rc || !supported) {
- DRM_ERROR("check support failed rc %d supported %d\n",
- rc, supported);
- rc = -EINVAL;
- return rc;
- }
-
- if (cfg->dma_buf->index >= cfg->dma_buf->buffer_size ||
- NOT_WORD_ALIGNED(cfg->dma_buf->index)) {
- DRM_ERROR("Buf Overflow index %d max size %d align %x\n",
- cfg->dma_buf->index, cfg->dma_buf->buffer_size,
- NOT_WORD_ALIGNED(cfg->dma_buf->index));
- return -EINVAL;
- }
-
- if (cfg->dma_buf->iova & GUARD_BYTES || !cfg->dma_buf->vaddr) {
- DRM_ERROR("iova not aligned to %lx iova %llx kva %pK",
- ADDR_ALIGN, cfg->dma_buf->iova,
- cfg->dma_buf->vaddr);
- return -EINVAL;
- }
- if (!IS_OP_ALLOWED(cfg->ops, cfg->dma_buf->next_op_allowed)) {
- DRM_ERROR("invalid op %x allowed %x\n", cfg->ops,
- cfg->dma_buf->next_op_allowed);
- return -EINVAL;
- }
-
- if (!validate_dma_op_params[cfg->ops] ||
- !write_dma_op_params[cfg->ops]) {
- DRM_ERROR("invalid op %d validate %pK write %pK\n", cfg->ops,
- validate_dma_op_params[cfg->ops],
- write_dma_op_params[cfg->ops]);
- return -EINVAL;
- }
- return rc;
-}
-
-static int validate_kick_off_v1(struct dpu_reg_dma_kickoff_cfg *cfg)
-{
-
- if (!cfg || !cfg->ctl || !cfg->dma_buf) {
- DRM_ERROR("invalid cfg %pK ctl %pK dma_buf %pK\n",
- cfg, ((!cfg) ? NULL : cfg->ctl),
- ((!cfg) ? NULL : cfg->dma_buf));
- return -EINVAL;
- }
-
- if (cfg->ctl->idx < CTL_0 && cfg->ctl->idx >= CTL_MAX) {
- DRM_ERROR("invalid ctl idx %d\n", cfg->ctl->idx);
- return -EINVAL;
- }
-
- if (cfg->op >= REG_DMA_OP_MAX) {
- DRM_ERROR("invalid op %d\n", cfg->op);
- return -EINVAL;
- }
-
- if ((cfg->op == REG_DMA_WRITE) &&
- (!(cfg->dma_buf->ops_completed & DECODE_SEL_OP) ||
- !(cfg->dma_buf->ops_completed & REG_WRITE_OP))) {
- DRM_ERROR("incomplete write ops %x\n",
- cfg->dma_buf->ops_completed);
- return -EINVAL;
- }
-
- if (cfg->op == REG_DMA_READ && cfg->block_select >= DSPP_HIST_MAX) {
- DRM_ERROR("invalid block for read %d\n", cfg->block_select);
- return -EINVAL;
- }
-
- /* Only immediate triggers are supported now hence hardcode */
- cfg->trigger_mode = (cfg->op == REG_DMA_READ) ? (READ_TRIGGER) :
- (WRITE_TRIGGER);
-
- if (cfg->dma_buf->iova & GUARD_BYTES) {
- DRM_ERROR("Address is not aligned to %lx iova %llx", ADDR_ALIGN,
- cfg->dma_buf->iova);
- return -EINVAL;
- }
-
- if (cfg->queue_select >= DMA_CTL_QUEUE_MAX) {
- DRM_ERROR("invalid queue selected %d\n", cfg->queue_select);
- return -EINVAL;
- }
-
- if (SIZE_DWORD(cfg->dma_buf->index) > MAX_DWORDS_SZ ||
- !cfg->dma_buf->index) {
- DRM_ERROR("invalid dword size %zd max %ld\n",
- SIZE_DWORD(cfg->dma_buf->index), MAX_DWORDS_SZ);
- return -EINVAL;
- }
- return 0;
-}
-
-static int write_kick_off_v1(struct dpu_reg_dma_kickoff_cfg *cfg)
-{
- u32 cmd1;
- struct dpu_hw_blk_reg_map hw;
-
- memset(&hw, 0, sizeof(hw));
- cmd1 = (cfg->op == REG_DMA_READ) ?
- (dspp_read_sel[cfg->block_select] << 30) : 0;
- cmd1 |= (cfg->last_command) ? BIT(24) : 0;
- cmd1 |= (cfg->op == REG_DMA_READ) ? (2 << 22) : 0;
- cmd1 |= (cfg->op == REG_DMA_WRITE) ? (BIT(22)) : 0;
- cmd1 |= (SIZE_DWORD(cfg->dma_buf->index) & MAX_DWORDS_SZ);
-
- SET_UP_REG_DMA_REG(hw, reg_dma);
- DPU_REG_WRITE(&hw, REG_DMA_OP_MODE_OFF, BIT(0));
- DPU_REG_WRITE(&hw, reg_dma_ctl_queue_off[cfg->ctl->idx],
- cfg->dma_buf->iova);
- DPU_REG_WRITE(&hw, reg_dma_ctl_queue_off[cfg->ctl->idx] + 0x4,
- cmd1);
- if (cfg->last_command)
- DPU_REG_WRITE(&cfg->ctl->hw, REG_DMA_CTL_TRIGGER_OFF,
- queue_sel[cfg->queue_select]);
-
- return 0;
-}
-
-int init_v1(struct dpu_hw_reg_dma *cfg)
-{
- int i = 0;
-
- if (!cfg)
- return -EINVAL;
-
- reg_dma = cfg;
- if (!last_cmd_buf) {
- last_cmd_buf = alloc_reg_dma_buf_v1(REG_DMA_HEADERS_BUFFER_SZ);
- if (IS_ERR_OR_NULL(last_cmd_buf))
- return -EINVAL;
- }
- reg_dma->ops.check_support = check_support_v1;
- reg_dma->ops.setup_payload = setup_payload_v1;
- reg_dma->ops.kick_off = kick_off_v1;
- reg_dma->ops.reset = reset_v1;
- reg_dma->ops.alloc_reg_dma_buf = alloc_reg_dma_buf_v1;
- reg_dma->ops.dealloc_reg_dma = dealloc_reg_dma_v1;
- reg_dma->ops.reset_reg_dma_buf = reset_reg_dma_buffer_v1;
- reg_dma->ops.last_command = last_cmd_v1;
-
- reg_dma_ctl_queue_off[CTL_0] = REG_DMA_CTL0_QUEUE_0_CMD0_OFF;
- for (i = CTL_1; i < ARRAY_SIZE(reg_dma_ctl_queue_off); i++)
- reg_dma_ctl_queue_off[i] = reg_dma_ctl_queue_off[i - 1] +
- (sizeof(u32) * 4);
-
- return 0;
-}
-
-static int check_support_v1(enum dpu_reg_dma_features feature,
- enum dpu_reg_dma_blk blk,
- bool *is_supported)
-{
- int ret = 0;
-
- if (!is_supported)
- return -EINVAL;
-
- if (feature >= REG_DMA_FEATURES_MAX || blk >= MDSS) {
- *is_supported = false;
- return ret;
- }
-
- *is_supported = (blk & v1_supported[feature]) ? true : false;
- return ret;
-}
-
-static int setup_payload_v1(struct dpu_reg_dma_setup_ops_cfg *cfg)
-{
- int rc = 0;
-
- rc = validate_dma_cfg(cfg);
-
- if (!rc)
- rc = validate_dma_op_params[cfg->ops](cfg);
-
- if (!rc)
- rc = write_dma_op_params[cfg->ops](cfg);
-
- return rc;
-}
-
-
-static int kick_off_v1(struct dpu_reg_dma_kickoff_cfg *cfg)
-{
- int rc = 0;
-
- rc = validate_kick_off_v1(cfg);
- if (rc)
- return rc;
-
- rc = write_kick_off_v1(cfg);
- return rc;
-}
-
-int reset_v1(struct dpu_hw_ctl *ctl)
-{
- struct dpu_hw_blk_reg_map hw;
- u32 index, val;
-
- if (!ctl || ctl->idx > CTL_MAX) {
- DRM_ERROR("invalid ctl %pK ctl idx %d\n",
- ctl, ((ctl) ? ctl->idx : 0));
- return -EINVAL;
- }
-
- memset(&hw, 0, sizeof(hw));
- index = ctl->idx - CTL_0;
- SET_UP_REG_DMA_REG(hw, reg_dma);
- DPU_REG_WRITE(&hw, REG_DMA_OP_MODE_OFF, BIT(0));
- DPU_REG_WRITE(&hw, (REG_DMA_CTL0_RESET_OFF + index * sizeof(u32)),
- BIT(0));
-
- index = 0;
- do {
- udelay(1000);
- index++;
- val = DPU_REG_READ(&hw,
- (REG_DMA_CTL0_RESET_OFF + index * sizeof(u32)));
- } while (index < 2 && val);
-
- return 0;
-}
-
-static struct dpu_reg_dma_buffer *alloc_reg_dma_buf_v1(u32 size)
-{
- struct dpu_reg_dma_buffer *dma_buf = NULL;
- u32 iova_aligned, offset;
- u32 rsize = size + GUARD_BYTES;
- struct msm_drm_private *priv = reg_dma->drm_dev->dev_private;
- struct msm_gem_address_space *aspace = NULL;
- int rc = 0;
-
- if (!size || SIZE_DWORD(size) > MAX_DWORDS_SZ) {
- DRM_ERROR("invalid buffer size %d\n", size);
- return ERR_PTR(-EINVAL);
- }
-
- dma_buf = kzalloc(sizeof(*dma_buf), GFP_KERNEL);
- if (!dma_buf)
- return ERR_PTR(-ENOMEM);
-
- dma_buf->buf = msm_gem_new(reg_dma->drm_dev,
- rsize, MSM_BO_UNCACHED);
- if (IS_ERR_OR_NULL(dma_buf->buf)) {
- rc = -EINVAL;
- goto fail;
- }
-
- aspace = priv->kms->aspace;
- if (!aspace) {
- DRM_ERROR("failed to get aspace\n");
- rc = -EINVAL;
- goto free_gem;
- }
-
- dma_buf->aspace = aspace;
- rc = msm_gem_get_iova(dma_buf->buf, aspace, &dma_buf->iova);
- if (rc) {
- DRM_ERROR("failed to get the iova rc %d\n", rc);
- goto free_gem;
- }
-
- dma_buf->vaddr = msm_gem_get_vaddr(dma_buf->buf);
- if (IS_ERR_OR_NULL(dma_buf->vaddr)) {
- DRM_ERROR("failed to get va rc %d\n", rc);
- rc = -EINVAL;
- goto put_iova;
- }
-
- dma_buf->buffer_size = size;
- iova_aligned = (dma_buf->iova + GUARD_BYTES) & ALIGNED_OFFSET;
- offset = iova_aligned - dma_buf->iova;
- dma_buf->iova = dma_buf->iova + offset;
- dma_buf->vaddr = (void *)(((u8 *)dma_buf->vaddr) + offset);
- dma_buf->next_op_allowed = DECODE_SEL_OP;
-
- return dma_buf;
-
-put_iova:
- msm_gem_put_iova(dma_buf->buf, aspace);
-free_gem:
- mutex_lock(®_dma->drm_dev->struct_mutex);
- msm_gem_free_object(dma_buf->buf);
- mutex_unlock(®_dma->drm_dev->struct_mutex);
-fail:
- kfree(dma_buf);
- return ERR_PTR(rc);
-}
-
-static int dealloc_reg_dma_v1(struct dpu_reg_dma_buffer *dma_buf)
-{
- if (!dma_buf) {
- DRM_ERROR("invalid param reg_buf %pK\n", dma_buf);
- return -EINVAL;
- }
-
- if (dma_buf->buf) {
- msm_gem_put_iova(dma_buf->buf, 0);
- mutex_lock(®_dma->drm_dev->struct_mutex);
- msm_gem_free_object(dma_buf->buf);
- mutex_unlock(®_dma->drm_dev->struct_mutex);
- }
-
- kfree(dma_buf);
- return 0;
-}
-
-static int reset_reg_dma_buffer_v1(struct dpu_reg_dma_buffer *lut_buf)
-{
- if (!lut_buf)
- return -EINVAL;
-
- lut_buf->index = 0;
- lut_buf->ops_completed = 0;
- lut_buf->next_op_allowed = DECODE_SEL_OP;
- return 0;
-}
-
-static int validate_last_cmd(struct dpu_reg_dma_setup_ops_cfg *cfg)
-{
- u32 remain_len, write_len;
-
- remain_len = BUFFER_SPACE_LEFT(cfg);
- write_len = sizeof(u32);
- if (remain_len < write_len) {
- DRM_ERROR("buffer is full sz %d needs %d bytes\n",
- remain_len, write_len);
- return -EINVAL;
- }
- return 0;
-}
-
-static int write_last_cmd(struct dpu_reg_dma_setup_ops_cfg *cfg)
-{
- u32 *loc = NULL;
-
- loc = (u32 *)((u8 *)cfg->dma_buf->vaddr +
- cfg->dma_buf->index);
- loc[0] = REG_DMA_DECODE_SEL;
- loc[1] = 0;
- cfg->dma_buf->index = sizeof(u32) * 2;
- cfg->dma_buf->ops_completed = REG_WRITE_OP | DECODE_SEL_OP;
- cfg->dma_buf->next_op_allowed = REG_WRITE_OP;
-
- return 0;
-}
-
-static int last_cmd_v1(struct dpu_hw_ctl *ctl, enum dpu_reg_dma_queue q)
-{
- struct dpu_reg_dma_setup_ops_cfg cfg;
- struct dpu_reg_dma_kickoff_cfg kick_off;
-
- if (!last_cmd_buf || !ctl || q >= DMA_CTL_QUEUE_MAX) {
- DRM_ERROR("invalid param buf %pK ctl %pK q %d\n", last_cmd_buf,
- ctl, q);
- return -EINVAL;
- }
-
- if (!last_cmd_buf->iova) {
- DRM_DEBUG("iova not set, possible secure session\n");
- return 0;
- }
-
- cfg.dma_buf = last_cmd_buf;
- reset_reg_dma_buffer_v1(last_cmd_buf);
- if (validate_last_cmd(&cfg)) {
- DRM_ERROR("validate buf failed\n");
- return -EINVAL;
- }
-
- if (write_last_cmd(&cfg)) {
- DRM_ERROR("write buf failed\n");
- return -EINVAL;
- }
-
- kick_off.ctl = ctl;
- kick_off.queue_select = q;
- kick_off.trigger_mode = WRITE_IMMEDIATE;
- kick_off.last_command = 1;
- kick_off.op = REG_DMA_WRITE;
- kick_off.dma_buf = last_cmd_buf;
- if (kick_off_v1(&kick_off)) {
- DRM_ERROR("kick off last cmd failed\n");
- return -EINVAL;
- }
-
- return 0;
-}
-
-void deinit_v1(void)
-{
- if (last_cmd_buf)
- dealloc_reg_dma_v1(last_cmd_buf);
- last_cmd_buf = NULL;
-}
diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_reg_dma_v1.h b/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_reg_dma_v1.h
deleted file mode 100644
index 4d784eb..0000000
--- a/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_reg_dma_v1.h
+++ /dev/null
@@ -1,27 +0,0 @@
-/* Copyright (c) 2017-2018, The Linux Foundation. All rights reserved.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 and
- * only version 2 as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- */
-#ifndef _DPU_HW_REG_DMA_V1_H
-#define _DPU_HW_REG_DMA_V1_H
-
-#include "dpu_reg_dma.h"
-
-/**
- * init_v1() - initialize the reg dma v1 driver by installing v1 ops
- * @reg_dma - reg_dma hw info structure exposing capabilities.
- */
-int init_v1(struct dpu_hw_reg_dma *reg_dma);
-
-/**
- * deinit_v1() - free up any resources allocated during the v1 reg dma init
- */
-void deinit_v1(void);
-#endif /* _DPU_HW_REG_DMA_V1_H */
diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_reg_dma_v1_color_proc.c b/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_reg_dma_v1_color_proc.c
deleted file mode 100644
index d21aa6f..0000000
--- a/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_reg_dma_v1_color_proc.c
+++ /dev/null
@@ -1,943 +0,0 @@
-/* Copyright (c) 2017-2018, The Linux Foundation. All rights reserved.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 and
- * only version 2 as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- */
-#include <drm/msm_drm_pp.h>
-#include "dpu_reg_dma.h"
-#include "dpu_hw_reg_dma_v1_color_proc.h"
-#include "dpu_hw_color_proc_common_v4.h"
-
-/* Reserve space of 128 words for LUT dma payload set-up */
-#define REG_DMA_HEADERS_BUFFER_SZ (sizeof(u32) * 128)
-
-#define VLUT_MEM_SIZE ((128 * sizeof(u32)) + REG_DMA_HEADERS_BUFFER_SZ)
-#define VLUT_LEN (128 * sizeof(u32))
-#define PA_OP_MODE_OFF 0x800
-#define PA_LUTV_OPMODE_OFF 0x84c
-
-#define GAMUT_LUT_MEM_SIZE ((sizeof(struct drm_msm_3d_gamut)) + \
- REG_DMA_HEADERS_BUFFER_SZ)
-#define GAMUT_SCALE_OFF_LEN (GAMUT_3D_SCALE_OFF_SZ * \
- GAMUT_3D_SCALE_OFF_TBL_NUM * sizeof(u32))
-#define GAMUT_SCALE_OFF_LEN_12 (GAMUT_3D_SCALEB_OFF_SZ * sizeof(u32))
-
-#define GC_LUT_MEM_SIZE ((sizeof(struct drm_msm_pgc_lut)) + \
- REG_DMA_HEADERS_BUFFER_SZ)
-
-#define IGC_LUT_MEM_SIZE ((sizeof(struct drm_msm_igc_lut)) + \
- REG_DMA_HEADERS_BUFFER_SZ)
-
-#define PCC_LUT_ENTRIES (PCC_NUM_PLANES * PCC_NUM_COEFF)
-#define PCC_LEN (PCC_LUT_ENTRIES * sizeof(u32))
-#define PCC_MEM_SIZE (PCC_LEN + \
- REG_DMA_HEADERS_BUFFER_SZ)
-
-#define REG_MASK(n) ((BIT(n)) - 1)
-
-static struct dpu_reg_dma_buffer *dspp_buf[REG_DMA_FEATURES_MAX][DSPP_MAX];
-
-static u32 feature_map[DPU_DSPP_MAX] = {
- [DPU_DSPP_VLUT] = REG_DMA_FEATURES_MAX,
- [DPU_DSPP_GAMUT] = GAMUT,
- [DPU_DSPP_IGC] = IGC,
- [DPU_DSPP_PCC] = PCC,
- [DPU_DSPP_GC] = GC,
- [DPU_DSPP_HSIC] = REG_DMA_FEATURES_MAX,
- [DPU_DSPP_MEMCOLOR] = REG_DMA_FEATURES_MAX,
- [DPU_DSPP_SIXZONE] = REG_DMA_FEATURES_MAX,
- [DPU_DSPP_DITHER] = REG_DMA_FEATURES_MAX,
- [DPU_DSPP_HIST] = REG_DMA_FEATURES_MAX,
- [DPU_DSPP_AD] = REG_DMA_FEATURES_MAX,
-};
-
-static u32 feature_reg_dma_sz[DPU_DSPP_MAX] = {
- [DPU_DSPP_VLUT] = VLUT_MEM_SIZE,
- [DPU_DSPP_GAMUT] = GAMUT_LUT_MEM_SIZE,
- [DPU_DSPP_GC] = GC_LUT_MEM_SIZE,
- [DPU_DSPP_IGC] = IGC_LUT_MEM_SIZE,
- [DPU_DSPP_PCC] = PCC_MEM_SIZE,
-};
-
-static u32 dspp_mapping[DSPP_MAX] = {
- [DSPP_0] = DSPP0,
- [DSPP_1] = DSPP1,
- [DSPP_2] = DSPP2,
- [DSPP_3] = DSPP3,
-};
-
-#define REG_DMA_INIT_OPS(cfg, block, reg_dma_feature, feature_dma_buf) \
- do { \
- memset(&cfg, 0, sizeof(cfg)); \
- (cfg).blk = block; \
- (cfg).feature = reg_dma_feature; \
- (cfg).dma_buf = feature_dma_buf; \
- } while (0)
-
-#define REG_DMA_SETUP_OPS(cfg, block_off, data_ptr, data_len, op, \
- wrap_sz, wrap_inc) \
- do { \
- (cfg).ops = op; \
- (cfg).blk_offset = block_off; \
- (cfg).data_size = data_len; \
- (cfg).data = data_ptr; \
- (cfg).inc = wrap_inc; \
- (cfg).wrap_size = wrap_sz; \
- } while (0)
-
-#define REG_DMA_SETUP_KICKOFF(cfg, hw_ctl, feature_dma_buf, ops, ctl_q, \
- mode) \
- do { \
- memset(&cfg, 0, sizeof(cfg)); \
- (cfg).ctl = hw_ctl; \
- (cfg).dma_buf = feature_dma_buf; \
- (cfg).op = ops; \
- (cfg).queue_select = ctl_q; \
- (cfg).trigger_mode = mode; \
- } while (0)
-
-static int reg_dma_buf_init(struct dpu_reg_dma_buffer **buf, u32 sz);
-static int reg_dma_dspp_check(struct dpu_hw_dspp *ctx, void *cfg,
- enum dpu_reg_dma_features feature);
-static int reg_dma_blk_select(enum dpu_reg_dma_features feature,
- enum dpu_reg_dma_blk blk, struct dpu_reg_dma_buffer *dma_buf);
-static int reg_dma_write(enum dpu_reg_dma_setup_ops ops, u32 off, u32 data_sz,
- u32 *data, struct dpu_reg_dma_buffer *dma_buf,
- enum dpu_reg_dma_features feature,
- enum dpu_reg_dma_blk blk);
-static int reg_dma_kick_off(enum dpu_reg_dma_op op, enum dpu_reg_dma_queue q,
- enum dpu_reg_dma_trigger_mode mode,
- struct dpu_reg_dma_buffer *dma_buf, struct dpu_hw_ctl *ctl);
-
-static int reg_dma_buf_init(struct dpu_reg_dma_buffer **buf, u32 size)
-{
- struct dpu_hw_reg_dma_ops *dma_ops;
-
- dma_ops = dpu_reg_dma_get_ops();
- if (IS_ERR_OR_NULL(dma_ops))
- return -ENOTSUPP;
-
- if (!buf) {
- DRM_ERROR("invalid buf\n");
- return -EINVAL;
- }
-
- /* buffer already initialized */
- if (*buf)
- return 0;
-
- *buf = dma_ops->alloc_reg_dma_buf(size);
- if (IS_ERR_OR_NULL(*buf))
- return -EINVAL;
-
- return 0;
-}
-
-static int reg_dma_dspp_check(struct dpu_hw_dspp *ctx, void *cfg,
- enum dpu_reg_dma_features feature)
-{
- struct dpu_hw_reg_dma_ops *dma_ops;
- struct dpu_hw_cp_cfg *hw_cfg = cfg;
-
- if (!cfg || !ctx) {
- DRM_ERROR("invalid cfg %pK ctx %pK\n", cfg, ctx);
- return -EINVAL;
- }
-
- dma_ops = dpu_reg_dma_get_ops();
- if (IS_ERR_OR_NULL(dma_ops))
- return -EINVAL;
-
- if (!hw_cfg->ctl || ctx->idx >= DSPP_MAX ||
- feature >= REG_DMA_FEATURES_MAX) {
- DRM_ERROR("invalid ctl %pK dspp idx %d feature %d\n",
- hw_cfg->ctl, ctx->idx, feature);
- return -EINVAL;
- }
-
- if (!dspp_buf[feature][ctx->idx]) {
- DRM_ERROR("invalid dma_buf\n");
- return -EINVAL;
- }
-
- return 0;
-}
-
-static int reg_dma_blk_select(enum dpu_reg_dma_features feature,
- enum dpu_reg_dma_blk blk, struct dpu_reg_dma_buffer *dma_buf)
-{
- struct dpu_hw_reg_dma_ops *dma_ops;
- struct dpu_reg_dma_setup_ops_cfg dma_write_cfg;
- int rc = 0;
-
- dma_ops = dpu_reg_dma_get_ops();
- dma_ops->reset_reg_dma_buf(dma_buf);
- memset(&dma_write_cfg, 0, sizeof(dma_write_cfg));
- dma_write_cfg.blk = blk;
- dma_write_cfg.feature = feature;
- dma_write_cfg.ops = HW_BLK_SELECT;
- dma_write_cfg.dma_buf = dma_buf;
-
- rc = dma_ops->setup_payload(&dma_write_cfg);
- if (rc)
- DRM_ERROR("write decode select failed ret %d\n", rc);
-
- return rc;
-}
-
-static int reg_dma_write(enum dpu_reg_dma_setup_ops ops, u32 off, u32 data_sz,
- u32 *data, struct dpu_reg_dma_buffer *dma_buf,
- enum dpu_reg_dma_features feature,
- enum dpu_reg_dma_blk blk)
-{
- struct dpu_hw_reg_dma_ops *dma_ops;
- struct dpu_reg_dma_setup_ops_cfg dma_write_cfg;
- int rc;
-
- dma_ops = dpu_reg_dma_get_ops();
- memset(&dma_write_cfg, 0, sizeof(dma_write_cfg));
-
- dma_write_cfg.ops = ops;
- dma_write_cfg.blk_offset = off;
- dma_write_cfg.data_size = data_sz;
- dma_write_cfg.data = data;
- dma_write_cfg.dma_buf = dma_buf;
- dma_write_cfg.feature = feature;
- dma_write_cfg.blk = blk;
- rc = dma_ops->setup_payload(&dma_write_cfg);
- if (rc)
- DRM_ERROR("write single reg failed ret %d\n", rc);
-
- return rc;
-}
-
-static int reg_dma_kick_off(enum dpu_reg_dma_op op, enum dpu_reg_dma_queue q,
- enum dpu_reg_dma_trigger_mode mode,
- struct dpu_reg_dma_buffer *dma_buf, struct dpu_hw_ctl *ctl)
-{
- struct dpu_reg_dma_kickoff_cfg kick_off;
- struct dpu_hw_reg_dma_ops *dma_ops;
- int rc;
-
- dma_ops = dpu_reg_dma_get_ops();
- memset(&kick_off, 0, sizeof(kick_off));
- kick_off.ctl = ctl;
- kick_off.dma_buf = dma_buf;
- kick_off.op = op;
- kick_off.queue_select = q;
- kick_off.trigger_mode = mode;
- rc = dma_ops->kick_off(&kick_off);
- if (rc)
- DRM_ERROR("failed to kick off ret %d\n", rc);
-
- return rc;
-}
-
-int reg_dmav1_init_dspp_op_v4(int feature, enum dpu_dspp idx)
-{
- int rc = -ENOTSUPP;
- struct dpu_hw_reg_dma_ops *dma_ops;
- bool is_supported = false;
- u32 blk;
-
- if (feature >= DPU_DSPP_MAX || idx >= DSPP_MAX) {
- DRM_ERROR("invalid feature %x max %x dspp idx %x max %xd\n",
- feature, DPU_DSPP_MAX, idx, DSPP_MAX);
- return rc;
- }
-
- if (feature_map[feature] >= REG_DMA_FEATURES_MAX) {
- DRM_ERROR("invalid feature map %d for feature %d\n",
- feature_map[feature], feature);
- return -ENOTSUPP;
- }
-
- dma_ops = dpu_reg_dma_get_ops();
- if (IS_ERR_OR_NULL(dma_ops))
- return -ENOTSUPP;
-
- blk = (feature_map[feature] == IGC) ? DSPP_IGC : dspp_mapping[idx];
- rc = dma_ops->check_support(feature_map[feature], blk, &is_supported);
- if (!rc)
- rc = (is_supported) ? 0 : -ENOTSUPP;
-
- if (!rc)
- rc = reg_dma_buf_init(&dspp_buf[feature_map[feature]][idx],
- feature_reg_dma_sz[feature]);
-
- return rc;
-}
-
-int reg_dmav1_init_sspp_op_v4(int feature, enum dpu_sspp idx)
-{
- return -ENOTSUPP;
-}
-
-void reg_dmav1_setup_dspp_vlutv18(struct dpu_hw_dspp *ctx, void *cfg)
-{
- struct drm_msm_pa_vlut *payload = NULL;
- struct dpu_hw_cp_cfg *hw_cfg = cfg;
- u32 op_mode;
- u32 *data = NULL;
- int i, j, rc = 0;
-
- rc = reg_dma_dspp_check(ctx, cfg, VLUT);
- if (rc)
- return;
-
- op_mode = DPU_REG_READ(&ctx->hw, PA_OP_MODE_OFF);
- if (!hw_cfg->payload) {
- DRM_DEBUG_DRIVER("Disable vlut feature\n");
- DPU_REG_WRITE(&ctx->hw, PA_LUTV_OPMODE_OFF, 0);
- if (op_mode & (~(BIT(20))))
- op_mode = 0;
- DPU_REG_WRITE(&ctx->hw, PA_OP_MODE_OFF, op_mode);
- return;
- }
-
- rc = reg_dma_blk_select(VLUT, dspp_mapping[ctx->idx],
- dspp_buf[VLUT][ctx->idx]);
- if (rc) {
- DRM_ERROR("write decode select failed ret %d\n", rc);
- return;
- }
-
- data = kzalloc(VLUT_LEN, GFP_KERNEL);
- if (!data)
- return;
-
- payload = hw_cfg->payload;
- DRM_DEBUG_DRIVER("Enable vlut feature flags %llx\n", payload->flags);
- for (i = 0, j = 0; i < ARRAY_SIZE(payload->val); i += 2, j++)
- data[j] = (payload->val[i] & REG_MASK(10)) |
- ((payload->val[i + 1] & REG_MASK(10)) << 16);
-
- rc = reg_dma_write(REG_BLK_WRITE_SINGLE, ctx->cap->sblk->vlut.base,
- VLUT_LEN, data,
- dspp_buf[VLUT][ctx->idx], VLUT,
- dspp_mapping[ctx->idx]);
- if (rc) {
- DRM_ERROR("write single reg failed ret %d\n", rc);
- goto exit;
- }
-
- rc = reg_dma_kick_off(REG_DMA_WRITE, DMA_CTL_QUEUE0, WRITE_IMMEDIATE,
- dspp_buf[VLUT][ctx->idx], hw_cfg->ctl);
- if (rc) {
- DRM_ERROR("failed to kick off ret %d\n", rc);
- goto exit;
- }
- DPU_REG_WRITE(&ctx->hw, PA_LUTV_OPMODE_OFF, BIT(0));
- DPU_REG_WRITE(&ctx->hw, PA_OP_MODE_OFF, op_mode | BIT(20));
-
-exit:
- kfree(data);
-}
-
-static int dpu_gamut_get_mode_info(struct drm_msm_3d_gamut *payload,
- u32 *tbl_len, u32 *tbl_off, u32 *opcode, u32 *scale_off)
-{
- int rc = 0;
-
- if (payload->mode > GAMUT_3D_MODE_13) {
- DRM_ERROR("invalid mode %d", payload->mode);
- return -EINVAL;
- }
-
- switch (payload->mode) {
- case GAMUT_3D_MODE_17:
- *tbl_len = GAMUT_3D_MODE17_TBL_SZ * sizeof(u32) * 2;
- *tbl_off = 0;
- *scale_off = GAMUT_SCALEA_OFFSET_OFF;
- *opcode = gamut_mode_17 << 2;
- break;
- case GAMUT_3D_MODE_5:
- *tbl_len = GAMUT_3D_MODE5_TBL_SZ * sizeof(u32) * 2;
- *tbl_off = GAMUT_MODE_5_OFF;
- *scale_off = GAMUT_SCALEB_OFFSET_OFF;
- *opcode = gamut_mode_5 << 2;
- break;
- case GAMUT_3D_MODE_13:
- *tbl_len = GAMUT_3D_MODE13_TBL_SZ * sizeof(u32) * 2;
- *opcode = (*opcode & (BIT(4) - 1)) >> 2;
- if (*opcode == gamut_mode_13a)
- *opcode = gamut_mode_13b;
- else
- *opcode = gamut_mode_13a;
- *tbl_off = (*opcode == gamut_mode_13a) ? 0 :
- GAMUT_MODE_13B_OFF;
- *scale_off = (*opcode == gamut_mode_13a) ?
- GAMUT_SCALEA_OFFSET_OFF : GAMUT_SCALEB_OFFSET_OFF;
- *opcode <<= 2;
- break;
- default:
- rc = -EINVAL;
- break;
- }
- if (payload->flags & GAMUT_3D_MAP_EN)
- *opcode |= GAMUT_MAP_EN;
- *opcode |= GAMUT_EN;
-
- return rc;
-}
-
-static void dspp_3d_gamutv4_off(struct dpu_hw_dspp *ctx, void *cfg)
-{
- struct dpu_reg_dma_kickoff_cfg kick_off;
- struct dpu_hw_cp_cfg *hw_cfg = cfg;
- u32 op_mode = 0;
- struct dpu_hw_reg_dma_ops *dma_ops;
- struct dpu_reg_dma_setup_ops_cfg dma_write_cfg;
- int rc;
-
- dma_ops = dpu_reg_dma_get_ops();
- dma_ops->reset_reg_dma_buf(dspp_buf[GAMUT][ctx->idx]);
-
- REG_DMA_INIT_OPS(dma_write_cfg, dspp_mapping[ctx->idx], GAMUT,
- dspp_buf[GAMUT][ctx->idx]);
-
- REG_DMA_SETUP_OPS(dma_write_cfg, 0, NULL, 0, HW_BLK_SELECT, 0, 0);
- rc = dma_ops->setup_payload(&dma_write_cfg);
- if (rc) {
- DRM_ERROR("write decode select failed ret %d\n", rc);
- return;
- }
-
- REG_DMA_SETUP_OPS(dma_write_cfg,
- ctx->cap->sblk->gamut.base,
- &op_mode, sizeof(op_mode), REG_SINGLE_WRITE, 0, 0);
- rc = dma_ops->setup_payload(&dma_write_cfg);
- if (rc) {
- DRM_ERROR("opmode write single reg failed ret %d\n", rc);
- return;
- }
-
- REG_DMA_SETUP_KICKOFF(kick_off, hw_cfg->ctl, dspp_buf[GAMUT][ctx->idx],
- REG_DMA_WRITE, DMA_CTL_QUEUE0, WRITE_IMMEDIATE);
- rc = dma_ops->kick_off(&kick_off);
- if (rc)
- DRM_ERROR("failed to kick off ret %d\n", rc);
-}
-
-void reg_dmav1_setup_dspp_3d_gamutv4(struct dpu_hw_dspp *ctx, void *cfg)
-{
- struct drm_msm_3d_gamut *payload;
- struct dpu_reg_dma_kickoff_cfg kick_off;
- struct dpu_hw_cp_cfg *hw_cfg = cfg;
- u32 op_mode, reg, tbl_len, tbl_off, scale_off, i;
- u32 scale_tbl_len, scale_tbl_off;
- u32 *scale_data;
- struct dpu_reg_dma_setup_ops_cfg dma_write_cfg;
- struct dpu_hw_reg_dma_ops *dma_ops;
- int rc;
-
- rc = reg_dma_dspp_check(ctx, cfg, GAMUT);
- if (rc)
- return;
-
- op_mode = DPU_REG_READ(&ctx->hw, ctx->cap->sblk->gamut.base);
- if (!hw_cfg->payload) {
- DRM_DEBUG_DRIVER("disable gamut feature\n");
- dspp_3d_gamutv4_off(ctx, cfg);
- return;
- }
-
- if (hw_cfg->len != sizeof(struct drm_msm_3d_gamut)) {
- DRM_ERROR("invalid size of payload len %d exp %zd\n",
- hw_cfg->len, sizeof(struct drm_msm_3d_gamut));
- return;
- }
- payload = hw_cfg->payload;
- rc = dpu_gamut_get_mode_info(payload, &tbl_len, &tbl_off, &op_mode,
- &scale_off);
- if (rc) {
- DRM_ERROR("invalid mode info rc %d\n", rc);
- return;
- }
-
- dma_ops = dpu_reg_dma_get_ops();
- dma_ops->reset_reg_dma_buf(dspp_buf[GAMUT][ctx->idx]);
-
- REG_DMA_INIT_OPS(dma_write_cfg, dspp_mapping[ctx->idx], GAMUT,
- dspp_buf[GAMUT][ctx->idx]);
-
- REG_DMA_SETUP_OPS(dma_write_cfg, 0, NULL, 0, HW_BLK_SELECT, 0, 0);
- rc = dma_ops->setup_payload(&dma_write_cfg);
- if (rc) {
- DRM_ERROR("write decode select failed ret %d\n", rc);
- return;
- }
- for (i = 0; i < GAMUT_3D_TBL_NUM; i++) {
- reg = GAMUT_TABLE0_SEL << i;
- reg |= ((tbl_off) & (BIT(11) - 1));
- REG_DMA_SETUP_OPS(dma_write_cfg,
- ctx->cap->sblk->gamut.base + GAMUT_TABLE_SEL_OFF,
- ®, sizeof(reg), REG_SINGLE_WRITE, 0, 0);
- rc = dma_ops->setup_payload(&dma_write_cfg);
- if (rc) {
- DRM_ERROR("write tbl sel reg failed ret %d\n", rc);
- return;
- }
- REG_DMA_SETUP_OPS(dma_write_cfg,
- ctx->cap->sblk->gamut.base + GAMUT_LOWER_COLOR_OFF,
- &payload->col[i][0].c2_c1, tbl_len,
- REG_BLK_WRITE_MULTIPLE, 2, 0);
- rc = dma_ops->setup_payload(&dma_write_cfg);
- if (rc) {
- DRM_ERROR("write color reg failed ret %d\n", rc);
- return;
- }
- }
-
- if (op_mode & GAMUT_MAP_EN) {
- if (scale_off == GAMUT_SCALEA_OFFSET_OFF)
- scale_tbl_len = GAMUT_SCALE_OFF_LEN;
- else
- scale_tbl_len = GAMUT_SCALE_OFF_LEN_12;
-
- for (i = 0; i < GAMUT_3D_SCALE_OFF_TBL_NUM; i++) {
- scale_tbl_off = ctx->cap->sblk->gamut.base + scale_off +
- (i * scale_tbl_len);
- scale_data = &payload->scale_off[i][0];
- REG_DMA_SETUP_OPS(dma_write_cfg, scale_tbl_off,
- scale_data, scale_tbl_len,
- REG_BLK_WRITE_SINGLE, 0, 0);
- rc = dma_ops->setup_payload(&dma_write_cfg);
- if (rc) {
- DRM_ERROR("write scale/off reg failed ret %d\n",
- rc);
- return;
- }
- }
- }
-
- REG_DMA_SETUP_OPS(dma_write_cfg,
- ctx->cap->sblk->gamut.base,
- &op_mode, sizeof(op_mode), REG_SINGLE_WRITE, 0, 0);
- rc = dma_ops->setup_payload(&dma_write_cfg);
- if (rc) {
- DRM_ERROR("opmode write single reg failed ret %d\n", rc);
- return;
- }
-
- REG_DMA_SETUP_KICKOFF(kick_off, hw_cfg->ctl, dspp_buf[GAMUT][ctx->idx],
- REG_DMA_WRITE, DMA_CTL_QUEUE0, WRITE_IMMEDIATE);
- rc = dma_ops->kick_off(&kick_off);
- if (rc)
- DRM_ERROR("failed to kick off ret %d\n", rc);
-}
-
-void reg_dmav1_setup_dspp_gcv18(struct dpu_hw_dspp *ctx, void *cfg)
-{
- struct drm_msm_pgc_lut *lut_cfg;
- struct dpu_hw_reg_dma_ops *dma_ops;
- struct dpu_reg_dma_kickoff_cfg kick_off;
- struct dpu_hw_cp_cfg *hw_cfg = cfg;
- struct dpu_reg_dma_setup_ops_cfg dma_write_cfg;
- int rc, i = 0;
- u32 reg;
-
- rc = reg_dma_dspp_check(ctx, cfg, GC);
- if (rc)
- return;
-
- if (!hw_cfg->payload) {
- DRM_DEBUG_DRIVER("disable pgc feature\n");
- DPU_REG_WRITE(&ctx->hw, ctx->cap->sblk->gc.base, 0);
- return;
- }
-
- if (hw_cfg->len != sizeof(struct drm_msm_pgc_lut)) {
- DRM_ERROR("invalid size of payload len %d exp %zd\n",
- hw_cfg->len, sizeof(struct drm_msm_pgc_lut));
- return;
- }
- lut_cfg = hw_cfg->payload;
-
- dma_ops = dpu_reg_dma_get_ops();
- dma_ops->reset_reg_dma_buf(dspp_buf[GC][ctx->idx]);
-
- REG_DMA_INIT_OPS(dma_write_cfg, dspp_mapping[ctx->idx], GC,
- dspp_buf[GC][ctx->idx]);
-
- REG_DMA_SETUP_OPS(dma_write_cfg, 0, NULL, 0, HW_BLK_SELECT, 0, 0);
- rc = dma_ops->setup_payload(&dma_write_cfg);
- if (rc) {
- DRM_ERROR("write decode select failed ret %d\n", rc);
- return;
- }
-
- for (i = 0; i < GC_TBL_NUM; i++) {
- reg = 0;
- REG_DMA_SETUP_OPS(dma_write_cfg,
- ctx->cap->sblk->gc.base + GC_C0_INDEX_OFF +
- (i * sizeof(u32) * 2),
- ®, sizeof(reg), REG_SINGLE_WRITE, 0, 0);
- rc = dma_ops->setup_payload(&dma_write_cfg);
- if (rc) {
- DRM_ERROR("index init failed ret %d\n", rc);
- return;
- }
-
- REG_DMA_SETUP_OPS(dma_write_cfg,
- ctx->cap->sblk->gc.base + GC_C0_OFF +
- (i * sizeof(u32) * 2),
- lut_cfg->c0 + (ARRAY_SIZE(lut_cfg->c0) * i),
- PGC_TBL_LEN * sizeof(u32),
- REG_BLK_WRITE_INC, 0, 0);
- rc = dma_ops->setup_payload(&dma_write_cfg);
- if (rc) {
- DRM_ERROR("lut write failed ret %d\n", rc);
- return;
- }
- }
-
- reg = BIT(0);
- REG_DMA_SETUP_OPS(dma_write_cfg,
- ctx->cap->sblk->gc.base + GC_LUT_SWAP_OFF,
- ®, sizeof(reg), REG_SINGLE_WRITE, 0, 0);
- rc = dma_ops->setup_payload(&dma_write_cfg);
- if (rc) {
- DRM_ERROR("setting swap offset failed ret %d\n", rc);
- return;
- }
-
- reg = GC_EN | ((lut_cfg->flags & PGC_8B_ROUND) ? GC_8B_ROUND_EN : 0);
- REG_DMA_SETUP_OPS(dma_write_cfg,
- ctx->cap->sblk->gc.base,
- ®, sizeof(reg), REG_SINGLE_WRITE, 0, 0);
- rc = dma_ops->setup_payload(&dma_write_cfg);
- if (rc) {
- DRM_ERROR("enabling gamma correction failed ret %d\n", rc);
- return;
- }
-
- REG_DMA_SETUP_KICKOFF(kick_off, hw_cfg->ctl, dspp_buf[GC][ctx->idx],
- REG_DMA_WRITE, DMA_CTL_QUEUE0, WRITE_IMMEDIATE);
- rc = dma_ops->kick_off(&kick_off);
- if (rc) {
- DRM_ERROR("failed to kick off ret %d\n", rc);
- return;
- }
-}
-
-static void _dspp_igcv31_off(struct dpu_hw_dspp *ctx, void *cfg)
-{
- struct dpu_reg_dma_kickoff_cfg kick_off;
- struct dpu_hw_cp_cfg *hw_cfg = cfg;
- struct dpu_hw_reg_dma_ops *dma_ops;
- struct dpu_reg_dma_setup_ops_cfg dma_write_cfg;
- int rc;
- u32 reg;
-
- dma_ops = dpu_reg_dma_get_ops();
- dma_ops->reset_reg_dma_buf(dspp_buf[IGC][ctx->idx]);
-
- REG_DMA_INIT_OPS(dma_write_cfg, dspp_mapping[ctx->idx], IGC,
- dspp_buf[IGC][ctx->idx]);
-
- REG_DMA_SETUP_OPS(dma_write_cfg, 0, NULL, 0, HW_BLK_SELECT, 0, 0);
- rc = dma_ops->setup_payload(&dma_write_cfg);
- if (rc) {
- DRM_ERROR("write decode select failed ret %d\n", rc);
- return;
- }
-
- reg = IGC_DIS;
- REG_DMA_SETUP_OPS(dma_write_cfg,
- ctx->cap->sblk->igc.base + IGC_OPMODE_OFF,
- ®, sizeof(reg), REG_SINGLE_WRITE, 0, 0);
- rc = dma_ops->setup_payload(&dma_write_cfg);
- if (rc) {
- DRM_ERROR("setting opcode failed ret %d\n", rc);
- return;
- }
-
- REG_DMA_SETUP_KICKOFF(kick_off, hw_cfg->ctl, dspp_buf[IGC][ctx->idx],
- REG_DMA_WRITE, DMA_CTL_QUEUE0, WRITE_IMMEDIATE);
- rc = dma_ops->kick_off(&kick_off);
- if (rc)
- DRM_ERROR("failed to kick off ret %d\n", rc);
-}
-
-void reg_dmav1_setup_dspp_igcv31(struct dpu_hw_dspp *ctx, void *cfg)
-{
- struct drm_msm_igc_lut *lut_cfg;
- struct dpu_hw_reg_dma_ops *dma_ops;
- struct dpu_reg_dma_kickoff_cfg kick_off;
- struct dpu_hw_cp_cfg *hw_cfg = cfg;
- struct dpu_reg_dma_setup_ops_cfg dma_write_cfg;
- int rc, i = 0, j = 0;
- u32 *addr = NULL;
- u32 offset = 0;
- u32 reg;
-
- rc = reg_dma_dspp_check(ctx, cfg, IGC);
- if (rc)
- return;
-
- if (!hw_cfg->payload) {
- DRM_DEBUG_DRIVER("disable igc feature\n");
- _dspp_igcv31_off(ctx, cfg);
- return;
- }
-
- if (hw_cfg->len != sizeof(struct drm_msm_igc_lut)) {
- DRM_ERROR("invalid size of payload len %d exp %zd\n",
- hw_cfg->len, sizeof(struct drm_msm_igc_lut));
- return;
- }
-
- lut_cfg = hw_cfg->payload;
-
- dma_ops = dpu_reg_dma_get_ops();
- dma_ops->reset_reg_dma_buf(dspp_buf[IGC][ctx->idx]);
-
- REG_DMA_INIT_OPS(dma_write_cfg, DSPP_IGC, IGC, dspp_buf[IGC][ctx->idx]);
-
- REG_DMA_SETUP_OPS(dma_write_cfg, 0, NULL, 0, HW_BLK_SELECT, 0, 0);
- rc = dma_ops->setup_payload(&dma_write_cfg);
- if (rc) {
- DRM_ERROR("write decode select failed ret %d\n", rc);
- return;
- }
-
- for (i = 0; i < IGC_TBL_NUM; i++) {
- addr = lut_cfg->c0 + (i * ARRAY_SIZE(lut_cfg->c0));
- offset = IGC_C0_OFF + (i * sizeof(u32));
-
- for (j = 0; j < IGC_TBL_LEN; j++) {
- addr[j] &= IGC_DATA_MASK;
- addr[j] |= IGC_DSPP_SEL_MASK(ctx->idx - 1);
- if (j == 0)
- addr[j] |= IGC_INDEX_UPDATE;
- }
-
- REG_DMA_SETUP_OPS(dma_write_cfg, offset, addr,
- IGC_TBL_LEN * sizeof(u32),
- REG_BLK_WRITE_INC, 0, 0);
- rc = dma_ops->setup_payload(&dma_write_cfg);
- if (rc) {
- DRM_ERROR("lut write failed ret %d\n", rc);
- return;
- }
- }
-
- REG_DMA_INIT_OPS(dma_write_cfg, dspp_mapping[ctx->idx], IGC,
- dspp_buf[IGC][ctx->idx]);
-
- REG_DMA_SETUP_OPS(dma_write_cfg, 0, NULL, 0, HW_BLK_SELECT, 0, 0);
- rc = dma_ops->setup_payload(&dma_write_cfg);
- if (rc) {
- DRM_ERROR("write decode select failed ret %d\n", rc);
- return;
- }
-
- if (lut_cfg->flags & IGC_DITHER_ENABLE) {
- reg = lut_cfg->strength & IGC_DITHER_DATA_MASK;
- REG_DMA_SETUP_OPS(dma_write_cfg,
- ctx->cap->sblk->igc.base + IGC_DITHER_OFF,
- ®, sizeof(reg), REG_SINGLE_WRITE, 0, 0);
- rc = dma_ops->setup_payload(&dma_write_cfg);
- if (rc) {
- DRM_ERROR("dither strength failed ret %d\n", rc);
- return;
- }
- }
-
- reg = IGC_EN;
- REG_DMA_SETUP_OPS(dma_write_cfg,
- ctx->cap->sblk->igc.base + IGC_OPMODE_OFF,
- ®, sizeof(reg), REG_SINGLE_WRITE, 0, 0);
- rc = dma_ops->setup_payload(&dma_write_cfg);
- if (rc) {
- DRM_ERROR("setting opcode failed ret %d\n", rc);
- return;
- }
-
- REG_DMA_SETUP_KICKOFF(kick_off, hw_cfg->ctl, dspp_buf[IGC][ctx->idx],
- REG_DMA_WRITE, DMA_CTL_QUEUE0, WRITE_IMMEDIATE);
- rc = dma_ops->kick_off(&kick_off);
- if (rc)
- DRM_ERROR("failed to kick off ret %d\n", rc);
-}
-
-static void _dspp_pccv4_off(struct dpu_hw_dspp *ctx, void *cfg)
-{
- struct dpu_reg_dma_kickoff_cfg kick_off;
- struct dpu_hw_cp_cfg *hw_cfg = cfg;
- struct dpu_hw_reg_dma_ops *dma_ops;
- struct dpu_reg_dma_setup_ops_cfg dma_write_cfg;
- int rc;
- u32 reg;
-
- dma_ops = dpu_reg_dma_get_ops();
- dma_ops->reset_reg_dma_buf(dspp_buf[PCC][ctx->idx]);
-
- REG_DMA_INIT_OPS(dma_write_cfg, dspp_mapping[ctx->idx], PCC,
- dspp_buf[PCC][ctx->idx]);
-
- REG_DMA_SETUP_OPS(dma_write_cfg, 0, NULL, 0, HW_BLK_SELECT, 0, 0);
- rc = dma_ops->setup_payload(&dma_write_cfg);
- if (rc) {
- DRM_ERROR("write decode select failed ret %d\n", rc);
- return;
- }
-
- reg = PCC_DIS;
- REG_DMA_SETUP_OPS(dma_write_cfg,
- ctx->cap->sblk->pcc.base,
- ®, sizeof(reg), REG_SINGLE_WRITE, 0, 0);
- rc = dma_ops->setup_payload(&dma_write_cfg);
- if (rc) {
- DRM_ERROR("setting opcode failed ret %d\n", rc);
- return;
- }
-
- REG_DMA_SETUP_KICKOFF(kick_off, hw_cfg->ctl, dspp_buf[PCC][ctx->idx],
- REG_DMA_WRITE, DMA_CTL_QUEUE0, WRITE_IMMEDIATE);
- rc = dma_ops->kick_off(&kick_off);
- if (rc)
- DRM_ERROR("failed to kick off ret %d\n", rc);
-}
-
-void reg_dmav1_setup_dspp_pccv4(struct dpu_hw_dspp *ctx, void *cfg)
-{
- struct dpu_hw_reg_dma_ops *dma_ops;
- struct dpu_reg_dma_kickoff_cfg kick_off;
- struct dpu_hw_cp_cfg *hw_cfg = cfg;
- struct dpu_reg_dma_setup_ops_cfg dma_write_cfg;
- struct drm_msm_pcc *pcc_cfg;
- struct drm_msm_pcc_coeff *coeffs = NULL;
- u32 *data = NULL;
- int rc, i = 0;
- u32 reg = 0;
-
- rc = reg_dma_dspp_check(ctx, cfg, PCC);
- if (rc)
- return;
-
- if (!hw_cfg->payload) {
- DRM_DEBUG_DRIVER("disable pcc feature\n");
- _dspp_pccv4_off(ctx, cfg);
- return;
- }
-
- if (hw_cfg->len != sizeof(struct drm_msm_pcc)) {
- DRM_ERROR("invalid size of payload len %d exp %zd\n",
- hw_cfg->len, sizeof(struct drm_msm_pcc));
- return;
- }
-
- pcc_cfg = hw_cfg->payload;
-
- dma_ops = dpu_reg_dma_get_ops();
- dma_ops->reset_reg_dma_buf(dspp_buf[PCC][ctx->idx]);
-
- REG_DMA_INIT_OPS(dma_write_cfg, dspp_mapping[ctx->idx],
- PCC, dspp_buf[PCC][ctx->idx]);
-
- REG_DMA_SETUP_OPS(dma_write_cfg, 0, NULL, 0, HW_BLK_SELECT, 0, 0);
- rc = dma_ops->setup_payload(&dma_write_cfg);
- if (rc) {
- DRM_ERROR("write decode select failed ret %d\n", rc);
- return;
- }
-
- data = kzalloc(PCC_LEN, GFP_KERNEL);
- if (!data)
- return;
-
- for (i = 0; i < PCC_NUM_PLANES; i++) {
- switch (i) {
- case 0:
- coeffs = &pcc_cfg->r;
- data[i + 24] = pcc_cfg->r_rr;
- data[i + 27] = pcc_cfg->r_gg;
- data[i + 30] = pcc_cfg->r_bb;
- break;
- case 1:
- coeffs = &pcc_cfg->g;
- data[i + 24] = pcc_cfg->g_rr;
- data[i + 27] = pcc_cfg->g_gg;
- data[i + 30] = pcc_cfg->g_bb;
- break;
- case 2:
- coeffs = &pcc_cfg->b;
- data[i + 24] = pcc_cfg->b_rr;
- data[i + 27] = pcc_cfg->b_gg;
- data[i + 30] = pcc_cfg->b_bb;
- break;
- default:
- DRM_ERROR("invalid pcc plane: %d\n", i);
- goto exit;
- }
-
- data[i] = coeffs->c;
- data[i + 3] = coeffs->r;
- data[i + 6] = coeffs->g;
- data[i + 9] = coeffs->b;
- data[i + 12] = coeffs->rg;
- data[i + 15] = coeffs->rb;
- data[i + 18] = coeffs->gb;
- data[i + 21] = coeffs->rgb;
- }
-
- REG_DMA_SETUP_OPS(dma_write_cfg,
- ctx->cap->sblk->pcc.base + PCC_C_OFF,
- data, PCC_LEN,
- REG_BLK_WRITE_SINGLE, 0, 0);
- rc = dma_ops->setup_payload(&dma_write_cfg);
- if (rc) {
- DRM_ERROR("write pcc lut failed ret %d\n", rc);
- goto exit;
- }
-
- reg = PCC_EN;
- REG_DMA_SETUP_OPS(dma_write_cfg,
- ctx->cap->sblk->pcc.base,
- ®, sizeof(reg), REG_SINGLE_WRITE, 0, 0);
- rc = dma_ops->setup_payload(&dma_write_cfg);
- if (rc) {
- DRM_ERROR("setting opcode failed ret %d\n", rc);
- goto exit;
- }
-
- REG_DMA_SETUP_KICKOFF(kick_off, hw_cfg->ctl, dspp_buf[PCC][ctx->idx],
- REG_DMA_WRITE, DMA_CTL_QUEUE0, WRITE_IMMEDIATE);
- rc = dma_ops->kick_off(&kick_off);
- if (rc)
- DRM_ERROR("failed to kick off ret %d\n", rc);
-
-exit:
- kfree(data);
-}
-
-int reg_dmav1_deinit_dspp_ops(enum dpu_dspp idx)
-{
- int i;
- struct dpu_hw_reg_dma_ops *dma_ops;
-
- dma_ops = dpu_reg_dma_get_ops();
- if (IS_ERR_OR_NULL(dma_ops))
- return -ENOTSUPP;
-
- if (idx >= DSPP_MAX) {
- DRM_ERROR("invalid dspp idx %x max %xd\n", idx, DSPP_MAX);
- return -EINVAL;
- }
-
- for (i = 0; i < REG_DMA_FEATURES_MAX; i++) {
- if (!dspp_buf[i][idx])
- continue;
- dma_ops->dealloc_reg_dma(dspp_buf[i][idx]);
- dspp_buf[i][idx] = NULL;
- }
- return 0;
-}
diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_reg_dma_v1_color_proc.h b/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_reg_dma_v1_color_proc.h
deleted file mode 100644
index 5c33399..0000000
--- a/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_reg_dma_v1_color_proc.h
+++ /dev/null
@@ -1,75 +0,0 @@
-/* Copyright (c) 2017-2018, The Linux Foundation. All rights reserved.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 and
- * only version 2 as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- */
-#ifndef _DPU_HW_REG_DMA_V1_COLOR_PROC_H
-#define _DPU_HW_REG_DMA_V1_COLOR_PROC_H
-
-#include "dpu_hw_util.h"
-#include "dpu_hw_catalog.h"
-#include "dpu_hw_dspp.h"
-
-/**
- * reg_dmav1_init_dspp_op_v4() - initialize the dspp feature op for dpu v4
- * using reg dma v1.
- * @feature: dspp feature
- * idx: dspp idx
- */
-int reg_dmav1_init_dspp_op_v4(int feature, enum dpu_dspp idx);
-
-/**
- * reg_dma_init_sspp_op_v4() - initialize the sspp feature op for dpu v4
- * @feature: sspp feature
- * @idx: sspp idx
- */
-int reg_dmav1_init_sspp_op_v4(int feature, enum dpu_sspp idx);
-
-/**
- * reg_dmav1_setup_dspp_vlutv18() - vlut v18 implementation using reg dma v1.
- * @ctx: dspp ctx info
- * @cfg: pointer to struct dpu_hw_cp_cfg
- */
-void reg_dmav1_setup_dspp_vlutv18(struct dpu_hw_dspp *ctx, void *cfg);
-
-/**
- * reg_dmav1_setup_3d_gamutv4() - gamut v4 implementation using reg dma v1.
- * @ctx: dspp ctx info
- * @cfg: pointer to struct dpu_hw_cp_cfg
- */
-void reg_dmav1_setup_dspp_3d_gamutv4(struct dpu_hw_dspp *ctx, void *cfg);
-
-/**
- * reg_dmav1_setup_dspp_gcv18() - gc v18 implementation using reg dma v1.
- * @ctx: dspp ctx info
- * @cfg: pointer to struct dpu_hw_cp_cfg
- */
-void reg_dmav1_setup_dspp_gcv18(struct dpu_hw_dspp *ctx, void *cfg);
-
-/**
- * reg_dmav1_setup_dspp_igcv31() - igc v31 implementation using reg dma v1.
- * @ctx: dspp ctx info
- * @cfg: pointer to struct dpu_hw_cp_cfg
- */
-void reg_dmav1_setup_dspp_igcv31(struct dpu_hw_dspp *ctx, void *cfg);
-
-/**
- * reg_dmav1_setup_dspp_pccv4() - pcc v4 implementation using reg dma v1.
- * @ctx: dspp ctx info
- * @cfg: pointer to struct dpu_hw_cp_cfg
- */
-void reg_dmav1_setup_dspp_pccv4(struct dpu_hw_dspp *ctx, void *cfg);
-
-/**
- * reg_dmav1_deinit_dspp_ops() - deinitialize the dspp feature op for dpu v4
- * which were initialized.
- * @idx: dspp idx
- */
-int reg_dmav1_deinit_dspp_ops(enum dpu_dspp idx);
-#endif /* _DPU_HW_REG_DMA_V1_COLOR_PROC_H */
diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_sspp.c b/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_sspp.c
index 10bdce3..6640906 100644
--- a/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_sspp.c
+++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_sspp.c
@@ -14,7 +14,6 @@
#include "dpu_hw_catalog.h"
#include "dpu_hw_lm.h"
#include "dpu_hw_sspp.h"
-#include "dpu_hw_color_processing.h"
#include "dpu_dbg.h"
#include "dpu_kms.h"
@@ -165,15 +164,6 @@ static inline int _sspp_subblk_offset(struct dpu_hw_pipe *ctx,
case DPU_SSPP_CSC_10BIT:
*idx = sblk->csc_blk.base;
break;
- case DPU_SSPP_HSIC:
- *idx = sblk->hsic_blk.base;
- break;
- case DPU_SSPP_PCC:
- *idx = sblk->pcc_blk.base;
- break;
- case DPU_SSPP_MEMCOLOR:
- *idx = sblk->memcolor_blk.base;
- break;
default:
rc = -EINVAL;
}
@@ -413,64 +403,6 @@ static void dpu_hw_sspp_setup_pe_config(struct dpu_hw_pipe *ctx,
tot_req_pixels[3]);
}
-static void _dpu_hw_sspp_setup_scaler(struct dpu_hw_pipe *ctx,
- struct dpu_hw_pipe_cfg *sspp,
- struct dpu_hw_pixel_ext *pe,
- void *scaler_cfg)
-{
- struct dpu_hw_blk_reg_map *c;
- int config_h = 0x0;
- int config_v = 0x0;
- u32 idx;
-
- (void)sspp;
- (void)scaler_cfg;
- if (_sspp_subblk_offset(ctx, DPU_SSPP_SCALER_QSEED2, &idx) || !pe)
- return;
-
- c = &ctx->hw;
-
- /* enable scaler(s) if valid filter set */
- if (pe->horz_filter[DPU_SSPP_COMP_0] < DPU_SCALE_FILTER_MAX)
- config_h |= pe->horz_filter[DPU_SSPP_COMP_0] << 8;
- if (pe->horz_filter[DPU_SSPP_COMP_1_2] < DPU_SCALE_FILTER_MAX)
- config_h |= pe->horz_filter[DPU_SSPP_COMP_1_2] << 12;
- if (pe->horz_filter[DPU_SSPP_COMP_3] < DPU_SCALE_FILTER_MAX)
- config_h |= pe->horz_filter[DPU_SSPP_COMP_3] << 16;
-
- if (config_h)
- config_h |= BIT(0);
-
- if (pe->vert_filter[DPU_SSPP_COMP_0] < DPU_SCALE_FILTER_MAX)
- config_v |= pe->vert_filter[DPU_SSPP_COMP_0] << 10;
- if (pe->vert_filter[DPU_SSPP_COMP_1_2] < DPU_SCALE_FILTER_MAX)
- config_v |= pe->vert_filter[DPU_SSPP_COMP_1_2] << 14;
- if (pe->vert_filter[DPU_SSPP_COMP_3] < DPU_SCALE_FILTER_MAX)
- config_v |= pe->vert_filter[DPU_SSPP_COMP_3] << 18;
-
- if (config_v)
- config_v |= BIT(1);
-
- DPU_REG_WRITE(c, SCALE_CONFIG + idx, config_h | config_v);
- DPU_REG_WRITE(c, COMP0_3_INIT_PHASE_X + idx,
- pe->init_phase_x[DPU_SSPP_COMP_0]);
- DPU_REG_WRITE(c, COMP0_3_INIT_PHASE_Y + idx,
- pe->init_phase_y[DPU_SSPP_COMP_0]);
- DPU_REG_WRITE(c, COMP0_3_PHASE_STEP_X + idx,
- pe->phase_step_x[DPU_SSPP_COMP_0]);
- DPU_REG_WRITE(c, COMP0_3_PHASE_STEP_Y + idx,
- pe->phase_step_y[DPU_SSPP_COMP_0]);
-
- DPU_REG_WRITE(c, COMP1_2_INIT_PHASE_X + idx,
- pe->init_phase_x[DPU_SSPP_COMP_1_2]);
- DPU_REG_WRITE(c, COMP1_2_INIT_PHASE_Y + idx,
- pe->init_phase_y[DPU_SSPP_COMP_1_2]);
- DPU_REG_WRITE(c, COMP1_2_PHASE_STEP_X + idx,
- pe->phase_step_x[DPU_SSPP_COMP_1_2]);
- DPU_REG_WRITE(c, COMP1_2_PHASE_STEP_Y + idx,
- pe->phase_step_y[DPU_SSPP_COMP_1_2]);
-}
-
static void _dpu_hw_sspp_setup_scaler3(struct dpu_hw_pipe *ctx,
struct dpu_hw_pipe_cfg *sspp,
struct dpu_hw_pixel_ext *pe,
@@ -509,7 +441,6 @@ static void dpu_hw_sspp_setup_rects(struct dpu_hw_pipe *ctx,
struct dpu_hw_blk_reg_map *c;
u32 src_size, src_xy, dst_size, dst_xy, ystride0, ystride1;
u32 src_size_off, src_xy_off, out_size_off, out_xy_off;
- u32 decimation = 0;
u32 idx;
if (_sspp_subblk_offset(ctx, DPU_SSPP_SRC, &idx) || !cfg)
@@ -560,13 +491,6 @@ static void dpu_hw_sspp_setup_rects(struct dpu_hw_pipe *ctx,
}
}
- /* program scaler, phase registers, if pipes supporting scaling */
- if (ctx->cap->features & DPU_SSPP_SCALER) {
- /* program decimation */
- decimation = ((1 << cfg->horz_decimation) - 1) << 8;
- decimation |= ((1 << cfg->vert_decimation) - 1);
- }
-
/* rectangle register programming */
DPU_REG_WRITE(c, src_size_off + idx, src_size);
DPU_REG_WRITE(c, src_xy_off + idx, src_xy);
@@ -575,52 +499,6 @@ static void dpu_hw_sspp_setup_rects(struct dpu_hw_pipe *ctx,
DPU_REG_WRITE(c, SSPP_SRC_YSTRIDE0 + idx, ystride0);
DPU_REG_WRITE(c, SSPP_SRC_YSTRIDE1 + idx, ystride1);
- DPU_REG_WRITE(c, SSPP_DECIMATION_CONFIG + idx, decimation);
-}
-
-/**
- * _dpu_hw_sspp_setup_excl_rect() - set exclusion rect configs
- * @ctx: Pointer to pipe context
- * @excl_rect: Exclusion rect configs
- */
-static void _dpu_hw_sspp_setup_excl_rect(struct dpu_hw_pipe *ctx,
- struct dpu_rect *excl_rect,
- enum dpu_sspp_multirect_index rect_index)
-{
- struct dpu_hw_blk_reg_map *c;
- u32 size, xy;
- u32 idx;
- u32 reg_xy, reg_size;
- u32 excl_ctrl, enable_bit;
-
- if (_sspp_subblk_offset(ctx, DPU_SSPP_SRC, &idx) || !excl_rect)
- return;
-
- if (rect_index == DPU_SSPP_RECT_0 || rect_index == DPU_SSPP_RECT_SOLO) {
- reg_xy = SSPP_EXCL_REC_XY;
- reg_size = SSPP_EXCL_REC_SIZE;
- enable_bit = BIT(0);
- } else {
- reg_xy = SSPP_EXCL_REC_XY_REC1;
- reg_size = SSPP_EXCL_REC_SIZE_REC1;
- enable_bit = BIT(1);
- }
-
- c = &ctx->hw;
-
- xy = (excl_rect->y << 16) | (excl_rect->x);
- size = (excl_rect->h << 16) | (excl_rect->w);
-
- excl_ctrl = DPU_REG_READ(c, SSPP_EXCL_REC_CTL + idx);
- if (!size) {
- DPU_REG_WRITE(c, SSPP_EXCL_REC_CTL + idx,
- excl_ctrl & ~enable_bit);
- } else {
- DPU_REG_WRITE(c, SSPP_EXCL_REC_CTL + idx,
- excl_ctrl | enable_bit);
- DPU_REG_WRITE(c, reg_size + idx, size);
- DPU_REG_WRITE(c, reg_xy + idx, xy);
- }
}
static void dpu_hw_sspp_setup_sourceaddress(struct dpu_hw_pipe *ctx,
@@ -667,24 +545,6 @@ static void dpu_hw_sspp_setup_csc(struct dpu_hw_pipe *ctx,
dpu_hw_csc_setup(&ctx->hw, idx, data, csc10);
}
-static void dpu_hw_sspp_setup_sharpening(struct dpu_hw_pipe *ctx,
- struct dpu_hw_sharp_cfg *cfg)
-{
- struct dpu_hw_blk_reg_map *c;
- u32 idx;
-
- if (_sspp_subblk_offset(ctx, DPU_SSPP_SCALER_QSEED2, &idx) || !cfg ||
- !test_bit(DPU_SSPP_SCALER_QSEED2, &ctx->cap->features))
- return;
-
- c = &ctx->hw;
-
- DPU_REG_WRITE(c, VIG_0_QSEED2_SHARP + idx, cfg->strength);
- DPU_REG_WRITE(c, VIG_0_QSEED2_SHARP + idx + 0x4, cfg->edge_thr);
- DPU_REG_WRITE(c, VIG_0_QSEED2_SHARP + idx + 0x8, cfg->smooth_thr);
- DPU_REG_WRITE(c, VIG_0_QSEED2_SHARP + idx + 0xC, cfg->noise_thr);
-}
-
static void dpu_hw_sspp_setup_solidfill(struct dpu_hw_pipe *ctx, u32 color, enum
dpu_sspp_multirect_index rect_index)
{
@@ -754,56 +614,6 @@ static void dpu_hw_sspp_setup_qos_ctrl(struct dpu_hw_pipe *ctx,
DPU_REG_WRITE(&ctx->hw, SSPP_QOS_CTRL + idx, qos_ctrl);
}
-static void dpu_hw_sspp_setup_ts_prefill(struct dpu_hw_pipe *ctx,
- struct dpu_hw_pipe_ts_cfg *cfg,
- enum dpu_sspp_multirect_index index)
-{
- u32 idx;
- u32 ts_offset, ts_prefill_offset;
- u32 ts_count = 0, ts_bytes = 0;
- const struct dpu_sspp_cfg *cap;
-
- if (!ctx || !cfg || !ctx->cap)
- return;
-
- if (_sspp_subblk_offset(ctx, DPU_SSPP_SRC, &idx))
- return;
-
- cap = ctx->cap;
-
- if (index == DPU_SSPP_RECT_0 &&
- test_bit(DPU_SSPP_TS_PREFILL, &cap->features)) {
- ts_offset = SSPP_TRAFFIC_SHAPER;
- ts_prefill_offset = SSPP_TRAFFIC_SHAPER_PREFILL;
- } else if (index == DPU_SSPP_RECT_1 &&
- test_bit(DPU_SSPP_TS_PREFILL_REC1, &cap->features)) {
- ts_offset = SSPP_TRAFFIC_SHAPER_REC1;
- ts_prefill_offset = SSPP_TRAFFIC_SHAPER_REC1_PREFILL;
- } else {
- return;
- }
-
- if (cfg->time) {
- /* this does mult_frac in a 64-bit safe manner */
- u64 rate = TS_CLK * 1000000ULL;
- u32 rem;
- u64 quot = div_u64_rem(rate, cfg->time, &rem);
- ts_bytes = (quot * cfg->size) +
- div_u64(rem * cfg->size, cfg->time);
-
- if (ts_bytes > SSPP_TRAFFIC_SHAPER_BPC_MAX)
- ts_bytes = SSPP_TRAFFIC_SHAPER_BPC_MAX;
- }
-
- if (ts_bytes) {
- ts_count = DIV_ROUND_UP_ULL(cfg->size, ts_bytes);
- ts_bytes |= BIT(31) | BIT(27);
- }
-
- DPU_REG_WRITE(&ctx->hw, ts_offset, ts_bytes);
- DPU_REG_WRITE(&ctx->hw, ts_prefill_offset, ts_count);
-}
-
static void dpu_hw_sspp_setup_cdp(struct dpu_hw_pipe *ctx,
struct dpu_hw_pipe_cdp_cfg *cfg)
{
@@ -839,9 +649,6 @@ static void _setup_layer_ops(struct dpu_hw_pipe *c,
c->ops.setup_pe = dpu_hw_sspp_setup_pe_config;
}
- if (test_bit(DPU_SSPP_EXCL_RECT, &features))
- c->ops.setup_excl_rect = _dpu_hw_sspp_setup_excl_rect;
-
if (test_bit(DPU_SSPP_QOS, &features)) {
c->ops.setup_danger_safe_lut =
dpu_hw_sspp_setup_danger_safe_lut;
@@ -849,18 +656,10 @@ static void _setup_layer_ops(struct dpu_hw_pipe *c,
c->ops.setup_qos_ctrl = dpu_hw_sspp_setup_qos_ctrl;
}
- if (test_bit(DPU_SSPP_TS_PREFILL, &features))
- c->ops.setup_ts_prefill = dpu_hw_sspp_setup_ts_prefill;
-
if (test_bit(DPU_SSPP_CSC, &features) ||
test_bit(DPU_SSPP_CSC_10BIT, &features))
c->ops.setup_csc = dpu_hw_sspp_setup_csc;
- if (test_bit(DPU_SSPP_SCALER_QSEED2, &features)) {
- c->ops.setup_sharpening = dpu_hw_sspp_setup_sharpening;
- c->ops.setup_scaler = _dpu_hw_sspp_setup_scaler;
- }
-
if (dpu_hw_sspp_multirect_enabled(c->cap))
c->ops.setup_multirect = dpu_hw_sspp_setup_multirect;
@@ -869,24 +668,6 @@ static void _setup_layer_ops(struct dpu_hw_pipe *c,
c->ops.get_scaler_ver = _dpu_hw_sspp_get_scaler3_ver;
}
- if (test_bit(DPU_SSPP_HSIC, &features)) {
- /* TODO: add version based assignment here as inline or macro */
- if (c->cap->sblk->hsic_blk.version ==
- (DPU_COLOR_PROCESS_VER(0x1, 0x7))) {
- c->ops.setup_pa_hue = dpu_setup_pipe_pa_hue_v1_7;
- c->ops.setup_pa_sat = dpu_setup_pipe_pa_sat_v1_7;
- c->ops.setup_pa_val = dpu_setup_pipe_pa_val_v1_7;
- c->ops.setup_pa_cont = dpu_setup_pipe_pa_cont_v1_7;
- }
- }
-
- if (test_bit(DPU_SSPP_MEMCOLOR, &features)) {
- if (c->cap->sblk->memcolor_blk.version ==
- (DPU_COLOR_PROCESS_VER(0x1, 0x7)))
- c->ops.setup_pa_memcolor =
- dpu_setup_pipe_pa_memcol_v1_7;
- }
-
if (test_bit(DPU_SSPP_CDP, &features))
c->ops.setup_cdp = dpu_hw_sspp_setup_cdp;
}
diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_sspp.h b/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_sspp.h
index a32ecc6..0bb5ecb 100644
--- a/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_sspp.h
+++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_sspp.h
@@ -18,7 +18,6 @@
#include "dpu_hw_util.h"
#include "dpu_hw_blk.h"
#include "dpu_formats.h"
-#include "dpu_color_processing.h"
struct dpu_hw_pipe;
@@ -160,12 +159,6 @@ struct dpu_hw_pixel_ext {
* @src_rect: src ROI, caller takes into account the different operations
* such as decimation, flip etc to program this field
* @dest_rect: destination ROI.
- * @ horz_decimation : horizontal decimation factor( 0, 2, 4, 8, 16)
- * @ vert_decimation : vertical decimation factor( 0, 2, 4, 8, 16)
- * 2: Read 1 line/pixel drop 1 line/pixel
- * 4: Read 1 line/pixel drop 3 lines/pixels
- * 8: Read 1 line/pixel drop 7 lines/pixels
- * 16: Read 1 line/pixel drop 15 line/pixels
* @index: index of the rectangle of SSPP
* @mode: parallel or time multiplex multirect mode
*/
@@ -173,8 +166,6 @@ struct dpu_hw_pipe_cfg {
struct dpu_hw_fmt_layout layout;
struct dpu_rect src_rect;
struct dpu_rect dst_rect;
- u8 horz_decimation;
- u8 vert_decimation;
enum dpu_sspp_multirect_index index;
enum dpu_sspp_multirect_mode mode;
};
@@ -269,16 +260,6 @@ struct dpu_hw_sspp_ops {
struct dpu_hw_pixel_ext *pe_ext);
/**
- * setup_excl_rect - setup pipe exclusion rectangle
- * @ctx: Pointer to pipe context
- * @excl_rect: Pointer to exclclusion rect structure
- * @index: rectangle index in multirect
- */
- void (*setup_excl_rect)(struct dpu_hw_pipe *ctx,
- struct dpu_rect *excl_rect,
- enum dpu_sspp_multirect_index index);
-
- /**
* setup_sourceaddress - setup pipe source addresses
* @ctx: Pointer to pipe context
* @cfg: Pointer to pipe config structure
@@ -324,50 +305,6 @@ struct dpu_hw_sspp_ops {
void (*setup_sharpening)(struct dpu_hw_pipe *ctx,
struct dpu_hw_sharp_cfg *cfg);
-
- /**
- * setup_pa_hue(): Setup source hue adjustment
- * @ctx: Pointer to pipe context
- * @cfg: Pointer to hue data
- */
- void (*setup_pa_hue)(struct dpu_hw_pipe *ctx, void *cfg);
-
- /**
- * setup_pa_sat(): Setup source saturation adjustment
- * @ctx: Pointer to pipe context
- * @cfg: Pointer to saturation data
- */
- void (*setup_pa_sat)(struct dpu_hw_pipe *ctx, void *cfg);
-
- /**
- * setup_pa_val(): Setup source value adjustment
- * @ctx: Pointer to pipe context
- * @cfg: Pointer to value data
- */
- void (*setup_pa_val)(struct dpu_hw_pipe *ctx, void *cfg);
-
- /**
- * setup_pa_cont(): Setup source contrast adjustment
- * @ctx: Pointer to pipe context
- * @cfg: Pointer contrast data
- */
- void (*setup_pa_cont)(struct dpu_hw_pipe *ctx, void *cfg);
-
- /**
- * setup_pa_memcolor - setup source color processing
- * @ctx: Pointer to pipe context
- * @type: Memcolor type (Skin, sky or foliage)
- * @cfg: Pointer to memory color config data
- */
- void (*setup_pa_memcolor)(struct dpu_hw_pipe *ctx,
- enum dpu_memcolor_type type, void *cfg);
-
- /**
- * setup_igc - setup inverse gamma correction
- * @ctx: Pointer to pipe context
- */
- void (*setup_igc)(struct dpu_hw_pipe *ctx);
-
/**
* setup_danger_safe_lut - setup danger safe LUTs
* @ctx: Pointer to pipe context
@@ -422,16 +359,6 @@ struct dpu_hw_sspp_ops {
u32 (*get_scaler_ver)(struct dpu_hw_pipe *ctx);
/**
- * setup_ts_prefill - setup prefill traffic shaper
- * @ctx: Pointer to pipe context
- * @cfg: Pointer to traffic shaper configuration
- * @index: rectangle index in multirect
- */
- void (*setup_ts_prefill)(struct dpu_hw_pipe *ctx,
- struct dpu_hw_pipe_ts_cfg *cfg,
- enum dpu_sspp_multirect_index index);
-
- /**
* setup_cdp - setup client driven prefetch
* @ctx: Pointer to pipe context
* @cfg: Pointer to cdp configuration
diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_util.c b/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_util.c
index 019a8fa..1ba571e 100644
--- a/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_util.c
+++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_util.c
@@ -11,7 +11,6 @@
*/
#define pr_fmt(fmt) "[drm:%s:%d] " fmt, __func__, __LINE__
-#include <uapi/drm/dpu_drm.h>
#include "msm_drv.h"
#include "dpu_kms.h"
#include "dpu_hw_mdss.h"
diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_util.h b/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_util.h
index d92cafb..42f1b22 100644
--- a/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_util.h
+++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_util.h
@@ -158,6 +158,162 @@ struct dpu_hw_scaler3_lut_cfg {
size_t sep_len;
};
+/**
+ * struct dpu_drm_pix_ext_v1 - version 1 of pixel ext structure
+ * @num_ext_pxls_lr: Number of total horizontal pixels
+ * @num_ext_pxls_tb: Number of total vertical lines
+ * @left_ftch: Number of extra pixels to overfetch from left
+ * @right_ftch: Number of extra pixels to overfetch from right
+ * @top_ftch: Number of extra lines to overfetch from top
+ * @btm_ftch: Number of extra lines to overfetch from bottom
+ * @left_rpt: Number of extra pixels to repeat from left
+ * @right_rpt: Number of extra pixels to repeat from right
+ * @top_rpt: Number of extra lines to repeat from top
+ * @btm_rpt: Number of extra lines to repeat from bottom
+ */
+struct dpu_drm_pix_ext_v1 {
+ /*
+ * Number of pixels ext in left, right, top and bottom direction
+ * for all color components.
+ */
+ int32_t num_ext_pxls_lr[DPU_MAX_PLANES];
+ int32_t num_ext_pxls_tb[DPU_MAX_PLANES];
+
+ /*
+ * Number of pixels needs to be overfetched in left, right, top
+ * and bottom directions from source image for scaling.
+ */
+ int32_t left_ftch[DPU_MAX_PLANES];
+ int32_t right_ftch[DPU_MAX_PLANES];
+ int32_t top_ftch[DPU_MAX_PLANES];
+ int32_t btm_ftch[DPU_MAX_PLANES];
+ /*
+ * Number of pixels needs to be repeated in left, right, top and
+ * bottom directions for scaling.
+ */
+ int32_t left_rpt[DPU_MAX_PLANES];
+ int32_t right_rpt[DPU_MAX_PLANES];
+ int32_t top_rpt[DPU_MAX_PLANES];
+ int32_t btm_rpt[DPU_MAX_PLANES];
+
+};
+
+/**
+ * struct dpu_drm_de_v1 - version 1 of detail enhancer structure
+ * @enable: Enables/disables detail enhancer
+ * @sharpen_level1: Sharpening strength for noise
+ * @sharpen_level2: Sharpening strength for context
+ * @clip: Clip coefficient
+ * @limit: Detail enhancer limit factor
+ * @thr_quiet: Quite zone threshold
+ * @thr_dieout: Die-out zone threshold
+ * @thr_low: Linear zone left threshold
+ * @thr_high: Linear zone right threshold
+ * @prec_shift: Detail enhancer precision
+ * @adjust_a: Mapping curves A coefficients
+ * @adjust_b: Mapping curves B coefficients
+ * @adjust_c: Mapping curves C coefficients
+ */
+struct dpu_drm_de_v1 {
+ uint32_t enable;
+ int16_t sharpen_level1;
+ int16_t sharpen_level2;
+ uint16_t clip;
+ uint16_t limit;
+ uint16_t thr_quiet;
+ uint16_t thr_dieout;
+ uint16_t thr_low;
+ uint16_t thr_high;
+ uint16_t prec_shift;
+ int16_t adjust_a[DPU_MAX_DE_CURVES];
+ int16_t adjust_b[DPU_MAX_DE_CURVES];
+ int16_t adjust_c[DPU_MAX_DE_CURVES];
+};
+
+/**
+ * struct dpu_drm_scaler_v2 - version 2 of struct dpu_drm_scaler
+ * @enable: Scaler enable
+ * @dir_en: Detail enhancer enable
+ * @pe: Pixel extension settings
+ * @horz_decimate: Horizontal decimation factor
+ * @vert_decimate: Vertical decimation factor
+ * @init_phase_x: Initial scaler phase values for x
+ * @phase_step_x: Phase step values for x
+ * @init_phase_y: Initial scaler phase values for y
+ * @phase_step_y: Phase step values for y
+ * @preload_x: Horizontal preload value
+ * @preload_y: Vertical preload value
+ * @src_width: Source width
+ * @src_height: Source height
+ * @dst_width: Destination width
+ * @dst_height: Destination height
+ * @y_rgb_filter_cfg: Y/RGB plane filter configuration
+ * @uv_filter_cfg: UV plane filter configuration
+ * @alpha_filter_cfg: Alpha filter configuration
+ * @blend_cfg: Selection of blend coefficients
+ * @lut_flag: LUT configuration flags
+ * @dir_lut_idx: 2d 4x4 LUT index
+ * @y_rgb_cir_lut_idx: Y/RGB circular LUT index
+ * @uv_cir_lut_idx: UV circular LUT index
+ * @y_rgb_sep_lut_idx: Y/RGB separable LUT index
+ * @uv_sep_lut_idx: UV separable LUT index
+ * @de: Detail enhancer settings
+ */
+struct dpu_drm_scaler_v2 {
+ /*
+ * General definitions
+ */
+ uint32_t enable;
+ uint32_t dir_en;
+
+ /*
+ * Pix ext settings
+ */
+ struct dpu_drm_pix_ext_v1 pe;
+
+ /*
+ * Decimation settings
+ */
+ uint32_t horz_decimate;
+ uint32_t vert_decimate;
+
+ /*
+ * Phase settings
+ */
+ int32_t init_phase_x[DPU_MAX_PLANES];
+ int32_t phase_step_x[DPU_MAX_PLANES];
+ int32_t init_phase_y[DPU_MAX_PLANES];
+ int32_t phase_step_y[DPU_MAX_PLANES];
+
+ uint32_t preload_x[DPU_MAX_PLANES];
+ uint32_t preload_y[DPU_MAX_PLANES];
+ uint32_t src_width[DPU_MAX_PLANES];
+ uint32_t src_height[DPU_MAX_PLANES];
+
+ uint32_t dst_width;
+ uint32_t dst_height;
+
+ uint32_t y_rgb_filter_cfg;
+ uint32_t uv_filter_cfg;
+ uint32_t alpha_filter_cfg;
+ uint32_t blend_cfg;
+
+ uint32_t lut_flag;
+ uint32_t dir_lut_idx;
+
+ /* for Y(RGB) and UV planes*/
+ uint32_t y_rgb_cir_lut_idx;
+ uint32_t uv_cir_lut_idx;
+ uint32_t y_rgb_sep_lut_idx;
+ uint32_t uv_sep_lut_idx;
+
+ /*
+ * Detail enhancer settings
+ */
+ struct dpu_drm_de_v1 de;
+};
+
+
u32 *dpu_hw_util_get_log_mask_ptr(void);
void dpu_reg_write(struct dpu_hw_blk_reg_map *c,
diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c b/drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c
index 06adb38..e43e1dd 100644
--- a/drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c
+++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c
@@ -35,7 +35,6 @@
#include "dpu_encoder.h"
#include "dpu_plane.h"
#include "dpu_crtc.h"
-#include "dpu_reg_dma.h"
#define CREATE_TRACE_POINTS
#include "dpu_trace.h"
@@ -1107,8 +1106,6 @@ static void _dpu_kms_hw_destroy(struct dpu_kms *dpu_kms,
if (dpu_kms->mmio)
msm_iounmap(pdev, dpu_kms->mmio);
dpu_kms->mmio = NULL;
-
- dpu_reg_dma_deinit();
}
int dpu_kms_mmu_detach(struct dpu_kms *dpu_kms, bool secure_only)
diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_plane.c b/drivers/gpu/drm/msm/disp/dpu1/dpu_plane.c
index ba5230d..b033653 100644
--- a/drivers/gpu/drm/msm/disp/dpu1/dpu_plane.c
+++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_plane.c
@@ -20,9 +20,6 @@
#include <linux/debugfs.h>
#include <linux/dma-buf.h>
-#include <uapi/drm/dpu_drm.h>
-#include <uapi/drm/msm_drm_pp.h>
-
#include "msm_prop.h"
#include "msm_drv.h"
@@ -34,7 +31,6 @@
#include "dpu_crtc.h"
#include "dpu_vbif.h"
#include "dpu_plane.h"
-#include "dpu_color_processing.h"
static bool suspend_blank = true;
module_param(suspend_blank, bool, 0400);
@@ -93,8 +89,6 @@ enum dpu_plane_qos {
/*
* struct dpu_plane - local dpu plane structure
* @aspace: address space pointer
- * @csc_cfg: Decoded user configuration for csc
- * @csc_usr_ptr: Points to csc_cfg if valid user config available
* @csc_ptr: Points to dpu_csc_cfg structure to use for current
* @mplane_list: List of multirect planes of the same pipe
* @catalog: Points to dpu catalog structure
@@ -112,7 +106,6 @@ struct dpu_plane {
struct dpu_hw_pipe *pipe_hw;
struct dpu_hw_pipe_cfg pipe_cfg;
- struct dpu_hw_sharp_cfg sharp_cfg;
struct dpu_hw_pipe_qos_cfg pipe_qos_cfg;
uint32_t color_fill;
bool is_error;
@@ -120,16 +113,11 @@ struct dpu_plane {
bool is_virtual;
struct list_head mplane_list;
struct dpu_mdss_cfg *catalog;
- bool revalidate;
- struct dpu_csc_cfg csc_cfg;
- struct dpu_csc_cfg *csc_usr_ptr;
struct dpu_csc_cfg *csc_ptr;
const struct dpu_sspp_sub_blks *pipe_sblk;
-
char pipe_name[DPU_NAME_SIZE];
-
struct msm_property_info property_info;
struct msm_property_data property_data[PLANE_PROP_COUNT];
struct drm_property_blob *blob_info;
@@ -442,17 +430,6 @@ static void _dpu_plane_set_qos_ctrl(struct drm_plane *plane,
&pdpu->pipe_qos_cfg);
}
-void dpu_plane_set_revalidate(struct drm_plane *plane, bool enable)
-{
- struct dpu_plane *pdpu;
-
- if (!plane)
- return;
-
- pdpu = to_dpu_plane(plane);
- pdpu->revalidate = enable;
-}
-
int dpu_plane_danger_signal_ctrl(struct drm_plane *plane, bool enable)
{
struct dpu_plane *pdpu;
@@ -578,55 +555,6 @@ static void _dpu_plane_set_qos_remap(struct drm_plane *plane)
}
/**
- * _dpu_plane_set_ts_prefill - set prefill with traffic shaper
- * @plane: Pointer to drm plane
- * @pstate: Pointer to dpu plane state
- */
-static void _dpu_plane_set_ts_prefill(struct drm_plane *plane,
- struct dpu_plane_state *pstate)
-{
- struct dpu_plane *pdpu;
- struct dpu_hw_pipe_ts_cfg cfg;
- struct msm_drm_private *priv;
- struct dpu_kms *dpu_kms;
-
- if (!plane || !plane->dev) {
- DPU_ERROR("invalid arguments");
- return;
- }
-
- priv = plane->dev->dev_private;
- if (!priv || !priv->kms) {
- DPU_ERROR("invalid KMS reference\n");
- return;
- }
-
- dpu_kms = to_dpu_kms(priv->kms);
- pdpu = to_dpu_plane(plane);
- if (!pdpu->pipe_hw) {
- DPU_ERROR("invalid pipe reference\n");
- return;
- }
-
- if (!pdpu->pipe_hw || !pdpu->pipe_hw->ops.setup_ts_prefill)
- return;
-
- _dpu_plane_set_qos_ctrl(plane, false, DPU_PLANE_QOS_VBLANK_AMORTIZE);
-
- memset(&cfg, 0, sizeof(cfg));
- cfg.size = dpu_plane_get_property(pstate,
- PLANE_PROP_PREFILL_SIZE);
- cfg.time = dpu_plane_get_property(pstate,
- PLANE_PROP_PREFILL_TIME);
-
- DPU_DEBUG("plane%d size:%llu time:%llu\n",
- plane->base.id, cfg.size, cfg.time);
- DPU_EVT32_VERBOSE(DRMID(plane), cfg.size, cfg.time);
- pdpu->pipe_hw->ops.setup_ts_prefill(pdpu->pipe_hw, &cfg,
- pstate->multirect_index);
-}
-
-/**
* _dpu_plane_get_aspace: gets the address space
*/
static int _dpu_plane_get_aspace(
@@ -703,36 +631,6 @@ static inline void _dpu_plane_set_scanout(struct drm_plane *plane,
}
}
-static int _dpu_plane_setup_scaler3_lut(struct dpu_plane *pdpu,
- struct dpu_plane_state *pstate)
-{
- struct dpu_hw_scaler3_cfg *cfg;
- int ret = 0;
-
- if (!pdpu || !pstate) {
- DPU_ERROR("invalid args\n");
- return -EINVAL;
- }
-
- cfg = &pstate->scaler3_cfg;
-
- cfg->dir_lut = msm_property_get_blob(
- &pdpu->property_info,
- &pstate->property_state, &cfg->dir_len,
- PLANE_PROP_SCALER_LUT_ED);
- cfg->cir_lut = msm_property_get_blob(
- &pdpu->property_info,
- &pstate->property_state, &cfg->cir_len,
- PLANE_PROP_SCALER_LUT_CIR);
- cfg->sep_lut = msm_property_get_blob(
- &pdpu->property_info,
- &pstate->property_state, &cfg->sep_len,
- PLANE_PROP_SCALER_LUT_SEP);
- if (!cfg->dir_lut || !cfg->cir_lut || !cfg->sep_lut)
- ret = -ENODATA;
- return ret;
-}
-
static void _dpu_plane_setup_scaler3(struct dpu_plane *pdpu,
struct dpu_plane_state *pstate,
uint32_t src_w, uint32_t src_h, uint32_t dst_w, uint32_t dst_h,
@@ -740,7 +638,7 @@ static void _dpu_plane_setup_scaler3(struct dpu_plane *pdpu,
const struct dpu_format *fmt,
uint32_t chroma_subsmpl_h, uint32_t chroma_subsmpl_v)
{
- uint32_t decimated, i;
+ uint32_t i;
if (!pdpu || !pstate || !scale_cfg || !fmt || !chroma_subsmpl_h ||
!chroma_subsmpl_v) {
@@ -754,14 +652,10 @@ static void _dpu_plane_setup_scaler3(struct dpu_plane *pdpu,
memset(scale_cfg, 0, sizeof(*scale_cfg));
memset(&pstate->pixel_ext, 0, sizeof(struct dpu_hw_pixel_ext));
- decimated = DECIMATED_DIMENSION(src_w,
- pdpu->pipe_cfg.horz_decimation);
scale_cfg->phase_step_x[DPU_SSPP_COMP_0] =
- mult_frac((1 << PHASE_STEP_SHIFT), decimated, dst_w);
- decimated = DECIMATED_DIMENSION(src_h,
- pdpu->pipe_cfg.vert_decimation);
+ mult_frac((1 << PHASE_STEP_SHIFT), src_w, dst_w);
scale_cfg->phase_step_y[DPU_SSPP_COMP_0] =
- mult_frac((1 << PHASE_STEP_SHIFT), decimated, dst_h);
+ mult_frac((1 << PHASE_STEP_SHIFT), src_h, dst_h);
scale_cfg->phase_step_y[DPU_SSPP_COMP_1_2] =
@@ -780,10 +674,8 @@ static void _dpu_plane_setup_scaler3(struct dpu_plane *pdpu,
scale_cfg->phase_step_y[DPU_SSPP_COMP_0];
for (i = 0; i < DPU_MAX_PLANES; i++) {
- scale_cfg->src_width[i] = DECIMATED_DIMENSION(src_w,
- pdpu->pipe_cfg.horz_decimation);
- scale_cfg->src_height[i] = DECIMATED_DIMENSION(src_h,
- pdpu->pipe_cfg.vert_decimation);
+ scale_cfg->src_width[i] = src_w;
+ scale_cfg->src_height[i] = src_h;
if (i == DPU_SSPP_COMP_1_2 || i == DPU_SSPP_COMP_2) {
scale_cfg->src_width[i] /= chroma_subsmpl_h;
scale_cfg->src_height[i] /= chroma_subsmpl_v;
@@ -809,154 +701,6 @@ static void _dpu_plane_setup_scaler3(struct dpu_plane *pdpu,
scale_cfg->enable = 1;
}
-/**
- * _dpu_plane_setup_scaler2 - determine default scaler phase steps/filter type
- * @pdpu: Pointer to DPU plane object
- * @src: Source size
- * @dst: Destination size
- * @phase_steps: Pointer to output array for phase steps
- * @filter: Pointer to output array for filter type
- * @fmt: Pointer to format definition
- * @chroma_subsampling: Subsampling amount for chroma channel
- *
- * Returns: 0 on success
- */
-static int _dpu_plane_setup_scaler2(struct dpu_plane *pdpu,
- uint32_t src, uint32_t dst, uint32_t *phase_steps,
- enum dpu_hw_filter *filter, const struct dpu_format *fmt,
- uint32_t chroma_subsampling)
-{
- if (!pdpu || !phase_steps || !filter || !fmt) {
- DPU_ERROR(
- "invalid arg(s), plane %d phase %d filter %d fmt %d\n",
- pdpu != 0, phase_steps != 0, filter != 0, fmt != 0);
- return -EINVAL;
- }
-
- /* calculate phase steps, leave init phase as zero */
- phase_steps[DPU_SSPP_COMP_0] =
- mult_frac(1 << PHASE_STEP_SHIFT, src, dst);
- phase_steps[DPU_SSPP_COMP_1_2] =
- phase_steps[DPU_SSPP_COMP_0] / chroma_subsampling;
- phase_steps[DPU_SSPP_COMP_2] = phase_steps[DPU_SSPP_COMP_1_2];
- phase_steps[DPU_SSPP_COMP_3] = phase_steps[DPU_SSPP_COMP_0];
-
- /* calculate scaler config, if necessary */
- if (DPU_FORMAT_IS_YUV(fmt) || src != dst) {
- filter[DPU_SSPP_COMP_3] =
- (src <= dst) ? DPU_SCALE_FILTER_BIL :
- DPU_SCALE_FILTER_PCMN;
-
- if (DPU_FORMAT_IS_YUV(fmt)) {
- filter[DPU_SSPP_COMP_0] = DPU_SCALE_FILTER_CA;
- filter[DPU_SSPP_COMP_1_2] = filter[DPU_SSPP_COMP_3];
- } else {
- filter[DPU_SSPP_COMP_0] = filter[DPU_SSPP_COMP_3];
- filter[DPU_SSPP_COMP_1_2] =
- DPU_SCALE_FILTER_NEAREST;
- }
- } else {
- /* disable scaler */
- filter[DPU_SSPP_COMP_0] = DPU_SCALE_FILTER_MAX;
- filter[DPU_SSPP_COMP_1_2] = DPU_SCALE_FILTER_MAX;
- filter[DPU_SSPP_COMP_3] = DPU_SCALE_FILTER_MAX;
- }
- return 0;
-}
-
-/**
- * _dpu_plane_setup_pixel_ext - determine default pixel extension values
- * @pdpu: Pointer to DPU plane object
- * @src: Source size
- * @dst: Destination size
- * @decimated_src: Source size after decimation, if any
- * @phase_steps: Pointer to output array for phase steps
- * @out_src: Output array for pixel extension values
- * @out_edge1: Output array for pixel extension first edge
- * @out_edge2: Output array for pixel extension second edge
- * @filter: Pointer to array for filter type
- * @fmt: Pointer to format definition
- * @chroma_subsampling: Subsampling amount for chroma channel
- * @post_compare: Whether to chroma subsampled source size for comparisions
- */
-static void _dpu_plane_setup_pixel_ext(struct dpu_plane *pdpu,
- uint32_t src, uint32_t dst, uint32_t decimated_src,
- uint32_t *phase_steps, uint32_t *out_src, int *out_edge1,
- int *out_edge2, enum dpu_hw_filter *filter,
- const struct dpu_format *fmt, uint32_t chroma_subsampling,
- bool post_compare)
-{
- int64_t edge1, edge2, caf;
- uint32_t src_work;
- int i, tmp;
-
- if (pdpu && phase_steps && out_src && out_edge1 &&
- out_edge2 && filter && fmt) {
- /* handle CAF for YUV formats */
- if (DPU_FORMAT_IS_YUV(fmt) && *filter == DPU_SCALE_FILTER_CA)
- caf = PHASE_STEP_UNIT_SCALE;
- else
- caf = 0;
-
- for (i = 0; i < DPU_MAX_PLANES; i++) {
- src_work = decimated_src;
- if (i == DPU_SSPP_COMP_1_2 || i == DPU_SSPP_COMP_2)
- src_work /= chroma_subsampling;
- if (post_compare)
- src = src_work;
- if (!DPU_FORMAT_IS_YUV(fmt) && (src == dst)) {
- /* unity */
- edge1 = 0;
- edge2 = 0;
- } else if (dst >= src) {
- /* upscale */
- edge1 = (1 << PHASE_RESIDUAL);
- edge1 -= caf;
- edge2 = (1 << PHASE_RESIDUAL);
- edge2 += (dst - 1) * *(phase_steps + i);
- edge2 -= (src_work - 1) * PHASE_STEP_UNIT_SCALE;
- edge2 += caf;
- edge2 = -(edge2);
- } else {
- /* downscale */
- edge1 = 0;
- edge2 = (dst - 1) * *(phase_steps + i);
- edge2 -= (src_work - 1) * PHASE_STEP_UNIT_SCALE;
- edge2 += *(phase_steps + i);
- edge2 = -(edge2);
- }
-
- /* only enable CAF for luma plane */
- caf = 0;
-
- /* populate output arrays */
- *(out_src + i) = src_work;
-
- /* edge updates taken from __pxl_extn_helper */
- if (edge1 >= 0) {
- tmp = (uint32_t)edge1;
- tmp >>= PHASE_STEP_SHIFT;
- *(out_edge1 + i) = -tmp;
- } else {
- tmp = (uint32_t)(-edge1);
- *(out_edge1 + i) =
- (tmp + PHASE_STEP_UNIT_SCALE - 1) >>
- PHASE_STEP_SHIFT;
- }
- if (edge2 >= 0) {
- tmp = (uint32_t)edge2;
- tmp >>= PHASE_STEP_SHIFT;
- *(out_edge2 + i) = -tmp;
- } else {
- tmp = (uint32_t)(-edge2);
- *(out_edge2 + i) =
- (tmp + PHASE_STEP_UNIT_SCALE - 1) >>
- PHASE_STEP_SHIFT;
- }
- }
- }
-}
-
static inline void _dpu_plane_setup_csc(struct dpu_plane *pdpu)
{
static const struct dpu_csc_cfg dpu_csc_YUV2RGB_601L = {
@@ -993,10 +737,7 @@ static inline void _dpu_plane_setup_csc(struct dpu_plane *pdpu)
return;
}
- /* revert to kernel default if override not available */
- if (pdpu->csc_usr_ptr)
- pdpu->csc_ptr = pdpu->csc_usr_ptr;
- else if (BIT(DPU_SSPP_CSC_10BIT) & pdpu->features)
+ if (BIT(DPU_SSPP_CSC_10BIT) & pdpu->features)
pdpu->csc_ptr = (struct dpu_csc_cfg *)&dpu_csc10_YUV2RGB_601L;
else
pdpu->csc_ptr = (struct dpu_csc_cfg *)&dpu_csc_YUV2RGB_601L;
@@ -1007,60 +748,6 @@ static inline void _dpu_plane_setup_csc(struct dpu_plane *pdpu)
pdpu->csc_ptr->csc_mv[2]);
}
-static void dpu_color_process_plane_setup(struct drm_plane *plane)
-{
- struct dpu_plane *pdpu;
- struct dpu_plane_state *pstate;
- uint32_t hue, saturation, value, contrast;
- struct drm_msm_memcol *memcol = NULL;
- size_t memcol_sz = 0;
-
- pdpu = to_dpu_plane(plane);
- pstate = to_dpu_plane_state(plane->state);
-
- hue = (uint32_t) dpu_plane_get_property(pstate, PLANE_PROP_HUE_ADJUST);
- if (pdpu->pipe_hw->ops.setup_pa_hue)
- pdpu->pipe_hw->ops.setup_pa_hue(pdpu->pipe_hw, &hue);
- saturation = (uint32_t) dpu_plane_get_property(pstate,
- PLANE_PROP_SATURATION_ADJUST);
- if (pdpu->pipe_hw->ops.setup_pa_sat)
- pdpu->pipe_hw->ops.setup_pa_sat(pdpu->pipe_hw, &saturation);
- value = (uint32_t) dpu_plane_get_property(pstate,
- PLANE_PROP_VALUE_ADJUST);
- if (pdpu->pipe_hw->ops.setup_pa_val)
- pdpu->pipe_hw->ops.setup_pa_val(pdpu->pipe_hw, &value);
- contrast = (uint32_t) dpu_plane_get_property(pstate,
- PLANE_PROP_CONTRAST_ADJUST);
- if (pdpu->pipe_hw->ops.setup_pa_cont)
- pdpu->pipe_hw->ops.setup_pa_cont(pdpu->pipe_hw, &contrast);
-
- if (pdpu->pipe_hw->ops.setup_pa_memcolor) {
- /* Skin memory color setup */
- memcol = msm_property_get_blob(&pdpu->property_info,
- &pstate->property_state,
- &memcol_sz,
- PLANE_PROP_SKIN_COLOR);
- pdpu->pipe_hw->ops.setup_pa_memcolor(pdpu->pipe_hw,
- MEMCOLOR_SKIN, memcol);
-
- /* Sky memory color setup */
- memcol = msm_property_get_blob(&pdpu->property_info,
- &pstate->property_state,
- &memcol_sz,
- PLANE_PROP_SKY_COLOR);
- pdpu->pipe_hw->ops.setup_pa_memcolor(pdpu->pipe_hw,
- MEMCOLOR_SKY, memcol);
-
- /* Foliage memory color setup */
- memcol = msm_property_get_blob(&pdpu->property_info,
- &pstate->property_state,
- &memcol_sz,
- PLANE_PROP_FOLIAGE_COLOR);
- pdpu->pipe_hw->ops.setup_pa_memcolor(pdpu->pipe_hw,
- MEMCOLOR_FOLIAGE, memcol);
- }
-}
-
static void _dpu_plane_setup_scaler(struct dpu_plane *pdpu,
struct dpu_plane_state *pstate,
const struct dpu_format *fmt, bool color_fill)
@@ -1076,99 +763,20 @@ static void _dpu_plane_setup_scaler(struct dpu_plane *pdpu,
pe = &pstate->pixel_ext;
- pdpu->pipe_cfg.horz_decimation =
- dpu_plane_get_property(pstate, PLANE_PROP_H_DECIMATE);
- pdpu->pipe_cfg.vert_decimation =
- dpu_plane_get_property(pstate, PLANE_PROP_V_DECIMATE);
-
/* don't chroma subsample if decimating */
- chroma_subsmpl_h = pdpu->pipe_cfg.horz_decimation ? 1 :
+ chroma_subsmpl_h =
drm_format_horz_chroma_subsampling(fmt->base.pixel_format);
- chroma_subsmpl_v = pdpu->pipe_cfg.vert_decimation ? 1 :
+ chroma_subsmpl_v =
drm_format_vert_chroma_subsampling(fmt->base.pixel_format);
- /* update scaler */
- if (pdpu->features & BIT(DPU_SSPP_SCALER_QSEED3)) {
- int rc;
-
- if (!color_fill && !pdpu->debugfs_default_scale)
- rc = _dpu_plane_setup_scaler3_lut(pdpu, pstate);
- else
- rc = -EINVAL;
- if (rc || pstate->scaler_check_state !=
- DPU_PLANE_SCLCHECK_SCALER_V2) {
- /* calculate default config for QSEED3 */
- _dpu_plane_setup_scaler3(pdpu, pstate,
- pdpu->pipe_cfg.src_rect.w,
- pdpu->pipe_cfg.src_rect.h,
- pdpu->pipe_cfg.dst_rect.w,
- pdpu->pipe_cfg.dst_rect.h,
- &pstate->scaler3_cfg, fmt,
- chroma_subsmpl_h, chroma_subsmpl_v);
- }
- } else if (pstate->scaler_check_state != DPU_PLANE_SCLCHECK_SCALER_V1 ||
- color_fill || pdpu->debugfs_default_scale) {
- uint32_t deci_dim, i;
-
- /* calculate default configuration for QSEED2 */
- memset(pe, 0, sizeof(struct dpu_hw_pixel_ext));
-
- DPU_DEBUG_PLANE(pdpu, "default config\n");
- deci_dim = DECIMATED_DIMENSION(pdpu->pipe_cfg.src_rect.w,
- pdpu->pipe_cfg.horz_decimation);
- _dpu_plane_setup_scaler2(pdpu,
- deci_dim,
- pdpu->pipe_cfg.dst_rect.w,
- pe->phase_step_x,
- pe->horz_filter, fmt, chroma_subsmpl_h);
-
- if (DPU_FORMAT_IS_YUV(fmt))
- deci_dim &= ~0x1;
- _dpu_plane_setup_pixel_ext(pdpu, pdpu->pipe_cfg.src_rect.w,
- pdpu->pipe_cfg.dst_rect.w, deci_dim,
- pe->phase_step_x,
- pe->roi_w,
- pe->num_ext_pxls_left,
- pe->num_ext_pxls_right, pe->horz_filter, fmt,
- chroma_subsmpl_h, 0);
-
- deci_dim = DECIMATED_DIMENSION(pdpu->pipe_cfg.src_rect.h,
- pdpu->pipe_cfg.vert_decimation);
- _dpu_plane_setup_scaler2(pdpu,
- deci_dim,
- pdpu->pipe_cfg.dst_rect.h,
- pe->phase_step_y,
- pe->vert_filter, fmt, chroma_subsmpl_v);
- _dpu_plane_setup_pixel_ext(pdpu, pdpu->pipe_cfg.src_rect.h,
- pdpu->pipe_cfg.dst_rect.h, deci_dim,
- pe->phase_step_y,
- pe->roi_h,
- pe->num_ext_pxls_top,
- pe->num_ext_pxls_btm, pe->vert_filter, fmt,
- chroma_subsmpl_v, 1);
-
- for (i = 0; i < DPU_MAX_PLANES; i++) {
- if (pe->num_ext_pxls_left[i] >= 0)
- pe->left_rpt[i] = pe->num_ext_pxls_left[i];
- else
- pe->left_ftch[i] = pe->num_ext_pxls_left[i];
-
- if (pe->num_ext_pxls_right[i] >= 0)
- pe->right_rpt[i] = pe->num_ext_pxls_right[i];
- else
- pe->right_ftch[i] = pe->num_ext_pxls_right[i];
-
- if (pe->num_ext_pxls_top[i] >= 0)
- pe->top_rpt[i] = pe->num_ext_pxls_top[i];
- else
- pe->top_ftch[i] = pe->num_ext_pxls_top[i];
-
- if (pe->num_ext_pxls_btm[i] >= 0)
- pe->btm_rpt[i] = pe->num_ext_pxls_btm[i];
- else
- pe->btm_ftch[i] = pe->num_ext_pxls_btm[i];
- }
- }
+ /* update scaler. calculate default config for QSEED3 */
+ _dpu_plane_setup_scaler3(pdpu, pstate,
+ pdpu->pipe_cfg.src_rect.w,
+ pdpu->pipe_cfg.src_rect.h,
+ pdpu->pipe_cfg.dst_rect.w,
+ pdpu->pipe_cfg.dst_rect.h,
+ &pstate->scaler3_cfg, fmt,
+ chroma_subsmpl_h, chroma_subsmpl_v);
}
/**
@@ -1465,189 +1073,6 @@ static void dpu_plane_cleanup_fb(struct drm_plane *plane,
msm_framebuffer_cleanup(old_state->fb, old_pstate->aspace);
}
-static void _dpu_plane_sspp_atomic_check_mode_changed(struct dpu_plane *pdpu,
- struct drm_plane_state *state,
- struct drm_plane_state *old_state)
-{
- struct dpu_plane_state *pstate = to_dpu_plane_state(state);
- struct dpu_plane_state *old_pstate = to_dpu_plane_state(old_state);
- struct drm_framebuffer *fb, *old_fb;
-
- /* no need to check it again */
- if (pstate->dirty == DPU_PLANE_DIRTY_ALL)
- return;
-
- if (!dpu_plane_enabled(state) || !dpu_plane_enabled(old_state)
- || pdpu->is_error) {
- DPU_DEBUG_PLANE(pdpu,
- "enabling/disabling full modeset required\n");
- pstate->dirty |= DPU_PLANE_DIRTY_ALL;
- } else if (to_dpu_plane_state(old_state)->pending) {
- DPU_DEBUG_PLANE(pdpu, "still pending\n");
- pstate->dirty |= DPU_PLANE_DIRTY_ALL;
- } else if (pstate->multirect_index != old_pstate->multirect_index ||
- pstate->multirect_mode != old_pstate->multirect_mode) {
- DPU_DEBUG_PLANE(pdpu, "multirect config updated\n");
- pstate->dirty |= DPU_PLANE_DIRTY_ALL;
- } else if (state->crtc_w != old_state->crtc_w ||
- state->crtc_h != old_state->crtc_h ||
- state->crtc_x != old_state->crtc_x ||
- state->crtc_y != old_state->crtc_y) {
- DPU_DEBUG_PLANE(pdpu, "crtc rect updated\n");
- pstate->dirty |= DPU_PLANE_DIRTY_RECTS;
- } else if (pstate->excl_rect.w != old_pstate->excl_rect.w ||
- pstate->excl_rect.h != old_pstate->excl_rect.h ||
- pstate->excl_rect.x != old_pstate->excl_rect.x ||
- pstate->excl_rect.y != old_pstate->excl_rect.y) {
- DPU_DEBUG_PLANE(pdpu, "excl_rect updated\n");
- pstate->dirty |= DPU_PLANE_DIRTY_RECTS;
- }
-
- fb = state->fb;
- old_fb = old_state->fb;
-
- if (!fb || !old_fb) {
- DPU_DEBUG_PLANE(pdpu, "can't compare fb handles\n");
- } else if (fb->format->format != old_fb->format->format) {
- DPU_DEBUG_PLANE(pdpu, "format change\n");
- pstate->dirty |= DPU_PLANE_DIRTY_FORMAT | DPU_PLANE_DIRTY_RECTS;
- } else {
- uint64_t new_mod = fb->modifier;
- uint64_t old_mod = old_fb->modifier;
- uint32_t *new_pitches = fb->pitches;
- uint32_t *old_pitches = old_fb->pitches;
- uint32_t *new_offset = fb->offsets;
- uint32_t *old_offset = old_fb->offsets;
- int i;
-
- if (new_mod != old_mod) {
- DPU_DEBUG_PLANE(pdpu,
- "format modifiers change\"\
- new_mode:%llu old_mode:%llu\n",
- new_mod, old_mod);
- pstate->dirty |= DPU_PLANE_DIRTY_FORMAT |
- DPU_PLANE_DIRTY_RECTS;
- }
-
- for (i = 0; i < ARRAY_SIZE(fb->pitches); i++) {
- if (new_pitches[i] != old_pitches[i]) {
- DPU_DEBUG_PLANE(pdpu,
- "pitches change plane:%d\"\
- old_pitches:%u new_pitches:%u\n",
- i, old_pitches[i], new_pitches[i]);
- pstate->dirty |= DPU_PLANE_DIRTY_RECTS;
- break;
- }
- }
- for (i = 0; i < ARRAY_SIZE(fb->offsets); i++) {
- if (new_offset[i] != old_offset[i]) {
- DPU_DEBUG_PLANE(pdpu,
- "offset change plane:%d\"\
- old_offset:%u new_offset:%u\n",
- i, old_offset[i], new_offset[i]);
- pstate->dirty |= DPU_PLANE_DIRTY_FORMAT |
- DPU_PLANE_DIRTY_RECTS;
- break;
- }
- }
- }
-}
-
-static int _dpu_plane_validate_scaler_v2(struct dpu_plane *pdpu,
- struct dpu_plane_state *pstate,
- const struct dpu_format *fmt,
- uint32_t img_w, uint32_t img_h,
- uint32_t src_w, uint32_t src_h,
- uint32_t deci_w, uint32_t deci_h)
-{
- int i;
-
- if (!pdpu || !pstate || !fmt) {
- DPU_ERROR_PLANE(pdpu, "invalid arguments\n");
- return -EINVAL;
- }
-
- /* don't run checks unless scaler data was changed */
- if (pstate->scaler_check_state != DPU_PLANE_SCLCHECK_SCALER_V2_CHECK)
- return 0;
-
- pstate->scaler_check_state = DPU_PLANE_SCLCHECK_INVALID;
-
- for (i = 0; i < DPU_MAX_PLANES; i++) {
- uint32_t hor_req_pixels, hor_fetch_pixels;
- uint32_t vert_req_pixels, vert_fetch_pixels;
- uint32_t src_w_tmp, src_h_tmp;
-
- /* re-use color plane 1's config for plane 2 */
- if (i == 2)
- continue;
-
- src_w_tmp = src_w;
- src_h_tmp = src_h;
-
- /*
- * For chroma plane, width is half for the following sub sampled
- * formats. Except in case of decimation, where hardware avoids
- * 1 line of decimation instead of downsampling.
- */
- if (i == 1) {
- if (!deci_w &&
- (fmt->chroma_sample == DPU_CHROMA_420 ||
- fmt->chroma_sample == DPU_CHROMA_H2V1))
- src_w_tmp >>= 1;
- if (!deci_h &&
- (fmt->chroma_sample == DPU_CHROMA_420 ||
- fmt->chroma_sample == DPU_CHROMA_H1V2))
- src_h_tmp >>= 1;
- }
-
- hor_req_pixels = pstate->pixel_ext.roi_w[i];
- vert_req_pixels = pstate->pixel_ext.roi_h[i];
-
- hor_fetch_pixels = DECIMATED_DIMENSION(src_w_tmp +
- (int8_t)(pstate->pixel_ext.left_ftch[i] & 0xFF) +
- (int8_t)(pstate->pixel_ext.right_ftch[i] & 0xFF),
- deci_w);
- vert_fetch_pixels = DECIMATED_DIMENSION(src_h_tmp +
- (int8_t)(pstate->pixel_ext.top_ftch[i] & 0xFF) +
- (int8_t)(pstate->pixel_ext.btm_ftch[i] & 0xFF),
- deci_h);
-
- if ((hor_req_pixels != hor_fetch_pixels) ||
- (hor_fetch_pixels > img_w) ||
- (vert_req_pixels != vert_fetch_pixels) ||
- (vert_fetch_pixels > img_h)) {
- DPU_ERROR_PLANE(pdpu,
- "req %d/%d, fetch %d/%d, src %dx%d\n",
- hor_req_pixels, vert_req_pixels,
- hor_fetch_pixels, vert_fetch_pixels,
- img_w, img_h);
- return -EINVAL;
- }
-
- /*
- * Alpha plane can only be scaled using bilinear or pixel
- * repeat/drop, src_width and src_height are only specified
- * for Y and UV plane
- */
- if (i != 3 &&
- (hor_req_pixels != pstate->scaler3_cfg.src_width[i] ||
- vert_req_pixels != pstate->scaler3_cfg.src_height[i])) {
- DPU_ERROR_PLANE(pdpu,
- "roi[%d] %d/%d, scaler src %dx%d, src %dx%d\n",
- i, pstate->pixel_ext.roi_w[i],
- pstate->pixel_ext.roi_h[i],
- pstate->scaler3_cfg.src_width[i],
- pstate->scaler3_cfg.src_height[i],
- src_w, src_h);
- return -EINVAL;
- }
- }
-
- pstate->scaler_check_state = DPU_PLANE_SCLCHECK_SCALER_V2;
- return 0;
-}
-
static int dpu_plane_sspp_atomic_check(struct drm_plane *plane,
struct drm_plane_state *state)
{
@@ -1656,7 +1081,6 @@ static int dpu_plane_sspp_atomic_check(struct drm_plane *plane,
struct dpu_plane_state *pstate;
const struct dpu_format *fmt;
struct dpu_rect src, dst;
- uint32_t deci_w, deci_h, src_deci_w, src_deci_h;
uint32_t max_upscale, max_downscale, min_src_size, max_linewidth;
bool q16_data = true;
@@ -1676,18 +1100,12 @@ static int dpu_plane_sspp_atomic_check(struct drm_plane *plane,
goto exit;
}
- deci_w = dpu_plane_get_property(pstate, PLANE_PROP_H_DECIMATE);
- deci_h = dpu_plane_get_property(pstate, PLANE_PROP_V_DECIMATE);
-
/* src values are in Q16 fixed point, convert to integer */
POPULATE_RECT(&src, state->src_x, state->src_y, state->src_w,
state->src_h, q16_data);
POPULATE_RECT(&dst, state->crtc_x, state->crtc_y, state->crtc_w,
state->crtc_h, !q16_data);
- src_deci_w = DECIMATED_DIMENSION(src.w, deci_w);
- src_deci_h = DECIMATED_DIMENSION(src.h, deci_h);
-
max_upscale = pdpu->pipe_sblk->maxupscale;
max_downscale = pdpu->pipe_sblk->maxdwnscale;
max_linewidth = pdpu->pipe_sblk->common->maxlinewidth;
@@ -1696,7 +1114,7 @@ static int dpu_plane_sspp_atomic_check(struct drm_plane *plane,
dpu_plane_enabled(plane->state), dpu_plane_enabled(state));
if (!dpu_plane_enabled(state))
- goto modeset_update;
+ goto exit;
fmt = to_dpu_format(msm_framebuffer_format(state->fb));
@@ -1734,18 +1152,6 @@ static int dpu_plane_sspp_atomic_check(struct drm_plane *plane,
ret = -EINVAL;
/* decimation validation */
- } else if (deci_w || deci_h) {
- if ((deci_w > pdpu->pipe_sblk->common->maxhdeciexp) ||
- (deci_h > pdpu->pipe_sblk->common->maxvdeciexp)) {
- DPU_ERROR_PLANE(pdpu,
- "too much decimation requested\n");
- ret = -EINVAL;
- } else if (fmt->fetch_mode != DPU_FETCH_LINEAR) {
- DPU_ERROR_PLANE(pdpu,
- "decimation requires linear fetch\n");
- ret = -EINVAL;
- }
-
} else if (!(pdpu->features & DPU_SSPP_SCALER) &&
((src.w != dst.w) || (src.h != dst.h))) {
DPU_ERROR_PLANE(pdpu,
@@ -1754,57 +1160,23 @@ static int dpu_plane_sspp_atomic_check(struct drm_plane *plane,
ret = -EINVAL;
/* check decimated source width */
- } else if (src_deci_w > max_linewidth) {
+ } else if (src.w > max_linewidth) {
DPU_ERROR_PLANE(pdpu,
- "invalid src w:%u, deci w:%u, line w:%u\n",
- src.w, src_deci_w, max_linewidth);
+ "invalid src w:%u, line w:%u\n",
+ src.w, max_linewidth);
ret = -E2BIG;
/* check max scaler capability */
- } else if (((src_deci_w * max_upscale) < dst.w) ||
- ((src_deci_h * max_upscale) < dst.h) ||
- ((dst.w * max_downscale) < src_deci_w) ||
- ((dst.h * max_downscale) < src_deci_h)) {
+ } else if (((src.w * max_upscale) < dst.w) ||
+ ((src.h * max_upscale) < dst.h) ||
+ ((dst.w * max_downscale) < src.w) ||
+ ((dst.h * max_downscale) < src.h)) {
DPU_ERROR_PLANE(pdpu,
"too much scaling requested %ux%u->%ux%u\n",
- src_deci_w, src_deci_h, dst.w, dst.h);
+ src.w, src.h, dst.w, dst.h);
ret = -E2BIG;
- } else if (_dpu_plane_validate_scaler_v2(pdpu, pstate, fmt,
- state->fb->width,
- state->fb->height,
- src.w, src.h, deci_w, deci_h)) {
- ret = -EINVAL;
- }
-
- /* check excl rect configs */
- if (!ret && pstate->excl_rect.w && pstate->excl_rect.h) {
- struct dpu_rect intersect;
-
- /*
- * Check exclusion rect against src rect.
- * it must intersect with source rect.
- */
- dpu_kms_rect_intersect(&src, &pstate->excl_rect, &intersect);
- if (intersect.w != pstate->excl_rect.w ||
- intersect.h != pstate->excl_rect.h ||
- DPU_FORMAT_IS_YUV(fmt)) {
- DPU_ERROR_PLANE(pdpu,
- "invalid excl_rect:{%d,%d,%d,%d} src:{%d,%d,%d,%d}, fmt: %4.4s\n",
- pstate->excl_rect.x, pstate->excl_rect.y,
- pstate->excl_rect.w, pstate->excl_rect.h,
- src.x, src.y, src.w, src.h,
- (char *)&fmt->base.pixel_format);
- ret = -EINVAL;
- }
- DPU_DEBUG_PLANE(pdpu, "excl_rect: {%d,%d,%d,%d}\n",
- pstate->excl_rect.x, pstate->excl_rect.y,
- pstate->excl_rect.w, pstate->excl_rect.h);
}
-modeset_update:
- if (!ret)
- _dpu_plane_sspp_atomic_check_mode_changed(pdpu,
- state, plane->state);
exit:
return ret;
}
@@ -1897,7 +1269,6 @@ static int dpu_plane_sspp_atomic_update(struct drm_plane *plane,
struct drm_framebuffer *fb;
struct dpu_rect src, dst;
bool q16_data = true;
- int idx;
if (!plane) {
DPU_ERROR("invalid plane\n");
@@ -1927,150 +1298,69 @@ static int dpu_plane_sspp_atomic_update(struct drm_plane *plane,
fmt = to_dpu_format(msm_framebuffer_format(fb));
nplanes = fmt->num_planes;
- /* force reprogramming of all the parameters, if the flag is set */
- if (pdpu->revalidate) {
- DPU_DEBUG("plane:%d - reconfigure all the parameters\n",
- plane->base.id);
- pstate->dirty = DPU_PLANE_DIRTY_ALL;
- pdpu->revalidate = false;
- }
-
- /* determine what needs to be refreshed */
- while ((idx = msm_property_pop_dirty(&pdpu->property_info,
- &pstate->property_state)) >= 0) {
- switch (idx) {
- case PLANE_PROP_SCALER_V1:
- case PLANE_PROP_SCALER_V2:
- case PLANE_PROP_SCALER_LUT_ED:
- case PLANE_PROP_SCALER_LUT_CIR:
- case PLANE_PROP_SCALER_LUT_SEP:
- case PLANE_PROP_H_DECIMATE:
- case PLANE_PROP_V_DECIMATE:
- case PLANE_PROP_SRC_CONFIG:
- case PLANE_PROP_ZPOS:
- case PLANE_PROP_EXCL_RECT_V1:
- pstate->dirty |= DPU_PLANE_DIRTY_RECTS;
- break;
- case PLANE_PROP_CSC_V1:
- pstate->dirty |= DPU_PLANE_DIRTY_FORMAT;
- break;
- case PLANE_PROP_COLOR_FILL:
- /* potentially need to refresh everything */
- pstate->dirty = DPU_PLANE_DIRTY_ALL;
- break;
- case PLANE_PROP_INFO:
- case PLANE_PROP_ALPHA:
- case PLANE_PROP_BLEND_OP:
- /* no special action required */
- break;
- case PLANE_PROP_PREFILL_SIZE:
- case PLANE_PROP_PREFILL_TIME:
- pstate->dirty |= DPU_PLANE_DIRTY_PERF;
- break;
- default:
- /* unknown property, refresh everything */
- pstate->dirty |= DPU_PLANE_DIRTY_ALL;
- DPU_ERROR("executing full mode set, prp_idx %d\n", idx);
- break;
- }
- }
-
- /**
- * since plane_atomic_check is invoked before crtc_atomic_check
- * in the commit sequence, all the parameters for updating the
- * plane dirty flag will not be available during
- * plane_atomic_check as some features params are updated
- * in crtc_atomic_check (eg.:sDMA). So check for mode_change
- * before sspp update.
- */
- _dpu_plane_sspp_atomic_check_mode_changed(pdpu, state,
- old_state);
-
- if (pstate->dirty & DPU_PLANE_DIRTY_RECTS)
- memset(&(pdpu->pipe_cfg), 0, sizeof(struct dpu_hw_pipe_cfg));
+ memset(&(pdpu->pipe_cfg), 0, sizeof(struct dpu_hw_pipe_cfg));
_dpu_plane_set_scanout(plane, pstate, &pdpu->pipe_cfg, fb);
- /* early out if nothing dirty */
- if (!pstate->dirty)
- return 0;
pstate->pending = true;
pdpu->is_rt_pipe = (dpu_crtc_get_client_type(crtc) != NRT_CLIENT);
_dpu_plane_set_qos_ctrl(plane, false, DPU_PLANE_QOS_PANIC_CTRL);
/* update roi config */
- if (pstate->dirty & DPU_PLANE_DIRTY_RECTS) {
- POPULATE_RECT(&src, state->src_x, state->src_y,
- state->src_w, state->src_h, q16_data);
- POPULATE_RECT(&dst, state->crtc_x, state->crtc_y,
- state->crtc_w, state->crtc_h, !q16_data);
-
- DPU_DEBUG_PLANE(pdpu,
- "FB[%u] %u,%u,%ux%u->crtc%u %d,%d,%ux%u, %4.4s ubwc %d\n",
- fb->base.id, src.x, src.y, src.w, src.h,
- crtc->base.id, dst.x, dst.y, dst.w, dst.h,
- (char *)&fmt->base.pixel_format,
- DPU_FORMAT_IS_UBWC(fmt));
-
- if (dpu_plane_get_property(pstate, PLANE_PROP_SRC_CONFIG) &
- BIT(DPU_DRM_DEINTERLACE)) {
- DPU_DEBUG_PLANE(pdpu, "deinterlace\n");
- for (idx = 0; idx < DPU_MAX_PLANES; ++idx)
- pdpu->pipe_cfg.layout.plane_pitch[idx] <<= 1;
- src.h /= 2;
- src.y = DIV_ROUND_UP(src.y, 2);
- src.y &= ~0x1;
- }
-
- pdpu->pipe_cfg.src_rect = src;
- pdpu->pipe_cfg.dst_rect = dst;
+ POPULATE_RECT(&src, state->src_x, state->src_y,
+ state->src_w, state->src_h, q16_data);
+ POPULATE_RECT(&dst, state->crtc_x, state->crtc_y,
+ state->crtc_w, state->crtc_h, !q16_data);
+
+ DPU_DEBUG_PLANE(pdpu,
+ "FB[%u] %u,%u,%ux%u->crtc%u %d,%d,%ux%u, %4.4s ubwc %d\n",
+ fb->base.id, src.x, src.y, src.w, src.h,
+ crtc->base.id, dst.x, dst.y, dst.w, dst.h,
+ (char *)&fmt->base.pixel_format,
+ DPU_FORMAT_IS_UBWC(fmt));
- _dpu_plane_setup_scaler(pdpu, pstate, fmt, false);
- /* check for color fill */
- pdpu->color_fill = (uint32_t)dpu_plane_get_property(pstate,
- PLANE_PROP_COLOR_FILL);
- if (pdpu->color_fill & DPU_PLANE_COLOR_FILL_FLAG) {
- /* skip remaining processing on color fill */
- pstate->dirty = 0x0;
- } else if (pdpu->pipe_hw->ops.setup_rects) {
- pdpu->pipe_hw->ops.setup_rects(pdpu->pipe_hw,
- &pdpu->pipe_cfg,
- pstate->multirect_index);
- }
+ pdpu->pipe_cfg.src_rect = src;
+ pdpu->pipe_cfg.dst_rect = dst;
- if (pdpu->pipe_hw->ops.setup_pe &&
- (pstate->multirect_index != DPU_SSPP_RECT_1))
- pdpu->pipe_hw->ops.setup_pe(pdpu->pipe_hw,
- &pstate->pixel_ext);
+ _dpu_plane_setup_scaler(pdpu, pstate, fmt, false);
- /**
- * when programmed in multirect mode, scalar block will be
- * bypassed. Still we need to update alpha and bitwidth
- * ONLY for RECT0
- */
- if (pdpu->pipe_hw->ops.setup_scaler &&
- pstate->multirect_index != DPU_SSPP_RECT_1)
- pdpu->pipe_hw->ops.setup_scaler(pdpu->pipe_hw,
- &pdpu->pipe_cfg, &pstate->pixel_ext,
- &pstate->scaler3_cfg);
-
- /* update excl rect */
- if (pdpu->pipe_hw->ops.setup_excl_rect)
- pdpu->pipe_hw->ops.setup_excl_rect(pdpu->pipe_hw,
- &pstate->excl_rect,
- pstate->multirect_index);
+ /* override for color fill */
+ if (pdpu->color_fill & DPU_PLANE_COLOR_FILL_FLAG) {
+ /* skip remaining processing on color fill */
+ return 0;
+ }
- if (pdpu->pipe_hw->ops.setup_multirect)
- pdpu->pipe_hw->ops.setup_multirect(
- pdpu->pipe_hw,
- pstate->multirect_index,
- pstate->multirect_mode);
+ if (pdpu->pipe_hw->ops.setup_rects) {
+ pdpu->pipe_hw->ops.setup_rects(pdpu->pipe_hw,
+ &pdpu->pipe_cfg,
+ pstate->multirect_index);
}
- if ((pstate->dirty & DPU_PLANE_DIRTY_FORMAT) &&
- pdpu->pipe_hw->ops.setup_format) {
+ if (pdpu->pipe_hw->ops.setup_pe &&
+ (pstate->multirect_index != DPU_SSPP_RECT_1))
+ pdpu->pipe_hw->ops.setup_pe(pdpu->pipe_hw,
+ &pstate->pixel_ext);
+
+ /**
+ * when programmed in multirect mode, scalar block will be
+ * bypassed. Still we need to update alpha and bitwidth
+ * ONLY for RECT0
+ */
+ if (pdpu->pipe_hw->ops.setup_scaler &&
+ pstate->multirect_index != DPU_SSPP_RECT_1)
+ pdpu->pipe_hw->ops.setup_scaler(pdpu->pipe_hw,
+ &pdpu->pipe_cfg, &pstate->pixel_ext,
+ &pstate->scaler3_cfg);
+
+ if (pdpu->pipe_hw->ops.setup_multirect)
+ pdpu->pipe_hw->ops.setup_multirect(
+ pdpu->pipe_hw,
+ pstate->multirect_index,
+ pstate->multirect_mode);
+
+ if (pdpu->pipe_hw->ops.setup_format) {
src_flags = 0x0;
/* update format */
@@ -2101,35 +1391,16 @@ static int dpu_plane_sspp_atomic_update(struct drm_plane *plane,
pdpu->csc_ptr = 0;
}
- dpu_color_process_plane_setup(plane);
-
- /* update sharpening */
- if ((pstate->dirty & DPU_PLANE_DIRTY_SHARPEN) &&
- pdpu->pipe_hw->ops.setup_sharpening) {
- pdpu->sharp_cfg.strength = SHARP_STRENGTH_DEFAULT;
- pdpu->sharp_cfg.edge_thr = SHARP_EDGE_THR_DEFAULT;
- pdpu->sharp_cfg.smooth_thr = SHARP_SMOOTH_THR_DEFAULT;
- pdpu->sharp_cfg.noise_thr = SHARP_NOISE_THR_DEFAULT;
-
- pdpu->pipe_hw->ops.setup_sharpening(pdpu->pipe_hw,
- &pdpu->sharp_cfg);
- }
-
_dpu_plane_set_qos_lut(plane, fb);
_dpu_plane_set_danger_lut(plane, fb);
if (plane->type != DRM_PLANE_TYPE_CURSOR) {
_dpu_plane_set_qos_ctrl(plane, true, DPU_PLANE_QOS_PANIC_CTRL);
_dpu_plane_set_ot_limit(plane, crtc);
- if (pstate->dirty & DPU_PLANE_DIRTY_PERF)
- _dpu_plane_set_ts_prefill(plane, pstate);
}
_dpu_plane_set_qos_remap(plane);
- /* clear dirty */
- pstate->dirty = 0x0;
-
return 0;
}
@@ -2208,13 +1479,6 @@ void dpu_plane_restore(struct drm_plane *plane)
pdpu = to_dpu_plane(plane);
- /*
- * Revalidate is only true here if idle PC occurred and
- * there is no plane state update in current commit cycle.
- */
- if (!pdpu->revalidate)
- return;
-
DPU_DEBUG_PLANE(pdpu, "\n");
/* last plane state is same as current state */
@@ -2225,21 +1489,9 @@ void dpu_plane_restore(struct drm_plane *plane)
static void _dpu_plane_install_properties(struct drm_plane *plane,
struct dpu_mdss_cfg *catalog, u32 master_plane_id)
{
- static const struct drm_prop_enum_list e_blend_op[] = {
- {DPU_DRM_BLEND_OP_NOT_DEFINED, "not_defined"},
- {DPU_DRM_BLEND_OP_OPAQUE, "opaque"},
- {DPU_DRM_BLEND_OP_PREMULTIPLIED, "premultiplied"},
- {DPU_DRM_BLEND_OP_COVERAGE, "coverage"}
- };
- static const struct drm_prop_enum_list e_src_config[] = {
- {DPU_DRM_DEINTERLACE, "deinterlace"}
- };
- const struct dpu_format_extended *format_list;
- struct dpu_kms_info *info;
struct dpu_plane *pdpu = to_dpu_plane(plane);
int zpos_max = 255;
int zpos_def = 0;
- char feature_name[256];
if (!plane || !pdpu) {
DPU_ERROR("invalid plane\n");
@@ -2269,353 +1521,6 @@ static void _dpu_plane_install_properties(struct drm_plane *plane,
msm_property_install_range(&pdpu->property_info, "zpos",
0x0, 0, zpos_max, zpos_def, PLANE_PROP_ZPOS);
-
- msm_property_install_range(&pdpu->property_info, "alpha",
- 0x0, 0, 255, 255, PLANE_PROP_ALPHA);
-
- if (!master_plane_id) {
- if (pdpu->pipe_sblk->common->maxhdeciexp) {
- msm_property_install_range(&pdpu->property_info,
- "h_decimate", 0x0, 0,
- pdpu->pipe_sblk->common->maxhdeciexp, 0,
- PLANE_PROP_H_DECIMATE);
- }
-
- if (pdpu->pipe_sblk->common->maxvdeciexp) {
- msm_property_install_range(&pdpu->property_info,
- "v_decimate", 0x0, 0,
- pdpu->pipe_sblk->common->maxvdeciexp, 0,
- PLANE_PROP_V_DECIMATE);
- }
-
- if (pdpu->features & BIT(DPU_SSPP_SCALER_QSEED3)) {
- msm_property_install_range(
- &pdpu->property_info, "scaler_v2",
- 0x0, 0, ~0, 0, PLANE_PROP_SCALER_V2);
- msm_property_install_blob(&pdpu->property_info,
- "lut_ed", 0, PLANE_PROP_SCALER_LUT_ED);
- msm_property_install_blob(&pdpu->property_info,
- "lut_cir", 0,
- PLANE_PROP_SCALER_LUT_CIR);
- msm_property_install_blob(&pdpu->property_info,
- "lut_sep", 0,
- PLANE_PROP_SCALER_LUT_SEP);
- } else if (pdpu->features & DPU_SSPP_SCALER) {
- msm_property_install_range(
- &pdpu->property_info, "scaler_v1", 0x0,
- 0, ~0, 0, PLANE_PROP_SCALER_V1);
- }
-
- if (pdpu->features & BIT(DPU_SSPP_CSC) ||
- pdpu->features & BIT(DPU_SSPP_CSC_10BIT))
- msm_property_install_volatile_range(
- &pdpu->property_info, "csc_v1", 0x0,
- 0, ~0, 0, PLANE_PROP_CSC_V1);
-
- if (pdpu->features & BIT(DPU_SSPP_HSIC)) {
- snprintf(feature_name, sizeof(feature_name), "%s%d",
- "DPU_SSPP_HUE_V",
- pdpu->pipe_sblk->hsic_blk.version >> 16);
- msm_property_install_range(&pdpu->property_info,
- feature_name, 0, 0, 0xFFFFFFFF, 0,
- PLANE_PROP_HUE_ADJUST);
- snprintf(feature_name, sizeof(feature_name), "%s%d",
- "DPU_SSPP_SATURATION_V",
- pdpu->pipe_sblk->hsic_blk.version >> 16);
- msm_property_install_range(&pdpu->property_info,
- feature_name, 0, 0, 0xFFFFFFFF, 0,
- PLANE_PROP_SATURATION_ADJUST);
- snprintf(feature_name, sizeof(feature_name), "%s%d",
- "DPU_SSPP_VALUE_V",
- pdpu->pipe_sblk->hsic_blk.version >> 16);
- msm_property_install_range(&pdpu->property_info,
- feature_name, 0, 0, 0xFFFFFFFF, 0,
- PLANE_PROP_VALUE_ADJUST);
- snprintf(feature_name, sizeof(feature_name), "%s%d",
- "DPU_SSPP_CONTRAST_V",
- pdpu->pipe_sblk->hsic_blk.version >> 16);
- msm_property_install_range(&pdpu->property_info,
- feature_name, 0, 0, 0xFFFFFFFF, 0,
- PLANE_PROP_CONTRAST_ADJUST);
- }
- }
-
- if (pdpu->features & BIT(DPU_SSPP_EXCL_RECT))
- msm_property_install_volatile_range(&pdpu->property_info,
- "excl_rect_v1", 0x0, 0, ~0, 0, PLANE_PROP_EXCL_RECT_V1);
-
- msm_property_install_enum(&pdpu->property_info, "blend_op", 0x0, 0,
- e_blend_op, ARRAY_SIZE(e_blend_op), PLANE_PROP_BLEND_OP);
-
- msm_property_install_enum(&pdpu->property_info, "src_config", 0x0, 1,
- e_src_config, ARRAY_SIZE(e_src_config), PLANE_PROP_SRC_CONFIG);
-
- if (pdpu->pipe_hw->ops.setup_solidfill)
- msm_property_install_range(&pdpu->property_info, "color_fill",
- 0, 0, 0xFFFFFFFF, 0, PLANE_PROP_COLOR_FILL);
-
- msm_property_install_range(&pdpu->property_info,
- "prefill_size", 0x0, 0, ~0, 0,
- PLANE_PROP_PREFILL_SIZE);
- msm_property_install_range(&pdpu->property_info,
- "prefill_time", 0x0, 0, ~0, 0,
- PLANE_PROP_PREFILL_TIME);
-
- info = kzalloc(sizeof(struct dpu_kms_info), GFP_KERNEL);
- if (!info) {
- DPU_ERROR("failed to allocate info memory\n");
- return;
- }
-
- msm_property_install_blob(&pdpu->property_info, "capabilities",
- DRM_MODE_PROP_IMMUTABLE, PLANE_PROP_INFO);
- dpu_kms_info_reset(info);
-
- if (!master_plane_id) {
- format_list = pdpu->pipe_sblk->format_list;
- } else {
- format_list = pdpu->pipe_sblk->virt_format_list;
- dpu_kms_info_add_keyint(info, "primary_smart_plane_id",
- master_plane_id);
- }
-
- if (format_list) {
- dpu_kms_info_start(info, "pixel_formats");
- while (format_list->fourcc_format) {
- dpu_kms_info_append_format(info,
- format_list->fourcc_format,
- format_list->modifier);
- ++format_list;
- }
- dpu_kms_info_stop(info);
- }
-
- if (pdpu->pipe_hw && pdpu->pipe_hw->ops.get_scaler_ver)
- dpu_kms_info_add_keyint(info, "scaler_step_ver",
- pdpu->pipe_hw->ops.get_scaler_ver(pdpu->pipe_hw));
-
- dpu_kms_info_add_keyint(info, "max_linewidth",
- pdpu->pipe_sblk->common->maxlinewidth);
- dpu_kms_info_add_keyint(info, "max_upscale",
- pdpu->pipe_sblk->maxupscale);
- dpu_kms_info_add_keyint(info, "max_downscale",
- pdpu->pipe_sblk->maxdwnscale);
- dpu_kms_info_add_keyint(info, "max_horizontal_deci",
- pdpu->pipe_sblk->common->maxhdeciexp);
- dpu_kms_info_add_keyint(info, "max_vertical_deci",
- pdpu->pipe_sblk->common->maxvdeciexp);
- dpu_kms_info_add_keyint(info, "max_per_pipe_bw",
- pdpu->pipe_sblk->max_per_pipe_bw * 1000LL);
- msm_property_set_blob(&pdpu->property_info, &pdpu->blob_info,
- info->data, DPU_KMS_INFO_DATALEN(info),
- PLANE_PROP_INFO);
-
- kfree(info);
-
- if (pdpu->features & BIT(DPU_SSPP_MEMCOLOR)) {
- snprintf(feature_name, sizeof(feature_name), "%s%d",
- "DPU_SSPP_SKIN_COLOR_V",
- pdpu->pipe_sblk->memcolor_blk.version >> 16);
- msm_property_install_blob(&pdpu->property_info, feature_name, 0,
- PLANE_PROP_SKIN_COLOR);
- snprintf(feature_name, sizeof(feature_name), "%s%d",
- "DPU_SSPP_SKY_COLOR_V",
- pdpu->pipe_sblk->memcolor_blk.version >> 16);
- msm_property_install_blob(&pdpu->property_info, feature_name, 0,
- PLANE_PROP_SKY_COLOR);
- snprintf(feature_name, sizeof(feature_name), "%s%d",
- "DPU_SSPP_FOLIAGE_COLOR_V",
- pdpu->pipe_sblk->memcolor_blk.version >> 16);
- msm_property_install_blob(&pdpu->property_info, feature_name, 0,
- PLANE_PROP_FOLIAGE_COLOR);
- }
-}
-
-static inline void _dpu_plane_set_csc_v1(struct dpu_plane *pdpu, void *usr_ptr)
-{
- struct dpu_drm_csc_v1 csc_v1;
- int i;
-
- if (!pdpu) {
- DPU_ERROR("invalid plane\n");
- return;
- }
-
- pdpu->csc_usr_ptr = NULL;
- if (!usr_ptr) {
- DPU_DEBUG_PLANE(pdpu, "csc data removed\n");
- return;
- }
-
- if (copy_from_user(&csc_v1, usr_ptr, sizeof(csc_v1))) {
- DPU_ERROR_PLANE(pdpu, "failed to copy csc data\n");
- return;
- }
-
- /* populate from user space */
- for (i = 0; i < DPU_CSC_MATRIX_COEFF_SIZE; ++i)
- pdpu->csc_cfg.csc_mv[i] = csc_v1.ctm_coeff[i] >> 16;
- for (i = 0; i < DPU_CSC_BIAS_SIZE; ++i) {
- pdpu->csc_cfg.csc_pre_bv[i] = csc_v1.pre_bias[i];
- pdpu->csc_cfg.csc_post_bv[i] = csc_v1.post_bias[i];
- }
- for (i = 0; i < DPU_CSC_CLAMP_SIZE; ++i) {
- pdpu->csc_cfg.csc_pre_lv[i] = csc_v1.pre_clamp[i];
- pdpu->csc_cfg.csc_post_lv[i] = csc_v1.post_clamp[i];
- }
- pdpu->csc_usr_ptr = &pdpu->csc_cfg;
-}
-
-static inline void _dpu_plane_set_scaler_v1(struct dpu_plane *pdpu,
- struct dpu_plane_state *pstate, void *usr)
-{
- struct dpu_drm_scaler_v1 scale_v1;
- struct dpu_hw_pixel_ext *pe;
- int i;
-
- if (!pdpu || !pstate) {
- DPU_ERROR("invalid argument(s)\n");
- return;
- }
-
- pstate->scaler_check_state = DPU_PLANE_SCLCHECK_NONE;
- if (!usr) {
- DPU_DEBUG_PLANE(pdpu, "scale data removed\n");
- return;
- }
-
- if (copy_from_user(&scale_v1, usr, sizeof(scale_v1))) {
- DPU_ERROR_PLANE(pdpu, "failed to copy scale data\n");
- return;
- }
-
- /* force property to be dirty, even if the pointer didn't change */
- msm_property_set_dirty(&pdpu->property_info,
- &pstate->property_state, PLANE_PROP_SCALER_V1);
-
- /* populate from user space */
- pe = &pstate->pixel_ext;
- memset(pe, 0, sizeof(struct dpu_hw_pixel_ext));
- for (i = 0; i < DPU_MAX_PLANES; i++) {
- pe->init_phase_x[i] = scale_v1.init_phase_x[i];
- pe->phase_step_x[i] = scale_v1.phase_step_x[i];
- pe->init_phase_y[i] = scale_v1.init_phase_y[i];
- pe->phase_step_y[i] = scale_v1.phase_step_y[i];
-
- pe->horz_filter[i] = scale_v1.horz_filter[i];
- pe->vert_filter[i] = scale_v1.vert_filter[i];
- }
- for (i = 0; i < DPU_MAX_PLANES; i++) {
- pe->left_ftch[i] = scale_v1.pe.left_ftch[i];
- pe->right_ftch[i] = scale_v1.pe.right_ftch[i];
- pe->left_rpt[i] = scale_v1.pe.left_rpt[i];
- pe->right_rpt[i] = scale_v1.pe.right_rpt[i];
- pe->roi_w[i] = scale_v1.pe.num_ext_pxls_lr[i];
-
- pe->top_ftch[i] = scale_v1.pe.top_ftch[i];
- pe->btm_ftch[i] = scale_v1.pe.btm_ftch[i];
- pe->top_rpt[i] = scale_v1.pe.top_rpt[i];
- pe->btm_rpt[i] = scale_v1.pe.btm_rpt[i];
- pe->roi_h[i] = scale_v1.pe.num_ext_pxls_tb[i];
- }
-
- pstate->scaler_check_state = DPU_PLANE_SCLCHECK_SCALER_V1;
-
- DPU_EVT32_VERBOSE(DRMID(&pdpu->base));
- DPU_DEBUG_PLANE(pdpu, "user property data copied\n");
-}
-
-static inline void _dpu_plane_set_scaler_v2(struct dpu_plane *pdpu,
- struct dpu_plane_state *pstate, void *usr)
-{
- struct dpu_drm_scaler_v2 scale_v2;
- struct dpu_hw_pixel_ext *pe;
- int i;
- struct dpu_hw_scaler3_cfg *cfg;
-
- if (!pdpu || !pstate) {
- DPU_ERROR("invalid argument(s)\n");
- return;
- }
-
- cfg = &pstate->scaler3_cfg;
- pstate->scaler_check_state = DPU_PLANE_SCLCHECK_NONE;
- if (!usr) {
- DPU_DEBUG_PLANE(pdpu, "scale data removed\n");
- return;
- }
-
- if (copy_from_user(&scale_v2, usr, sizeof(scale_v2))) {
- DPU_ERROR_PLANE(pdpu, "failed to copy scale data\n");
- return;
- }
-
- /* detach/ignore user data if 'disabled' */
- if (!scale_v2.enable) {
- DPU_DEBUG_PLANE(pdpu, "scale data removed\n");
- return;
- }
-
- /* force property to be dirty, even if the pointer didn't change */
- msm_property_set_dirty(&pdpu->property_info,
- &pstate->property_state, PLANE_PROP_SCALER_V2);
-
- /* populate from user space */
- dpu_set_scaler_v2(cfg, &scale_v2);
-
- pe = &pstate->pixel_ext;
- memset(pe, 0, sizeof(struct dpu_hw_pixel_ext));
-
- for (i = 0; i < DPU_MAX_PLANES; i++) {
- pe->left_ftch[i] = scale_v2.pe.left_ftch[i];
- pe->right_ftch[i] = scale_v2.pe.right_ftch[i];
- pe->left_rpt[i] = scale_v2.pe.left_rpt[i];
- pe->right_rpt[i] = scale_v2.pe.right_rpt[i];
- pe->roi_w[i] = scale_v2.pe.num_ext_pxls_lr[i];
-
- pe->top_ftch[i] = scale_v2.pe.top_ftch[i];
- pe->btm_ftch[i] = scale_v2.pe.btm_ftch[i];
- pe->top_rpt[i] = scale_v2.pe.top_rpt[i];
- pe->btm_rpt[i] = scale_v2.pe.btm_rpt[i];
- pe->roi_h[i] = scale_v2.pe.num_ext_pxls_tb[i];
- }
- pstate->scaler_check_state = DPU_PLANE_SCLCHECK_SCALER_V2_CHECK;
-
- DPU_EVT32_VERBOSE(DRMID(&pdpu->base), cfg->enable, cfg->de.enable,
- cfg->src_width[0], cfg->src_height[0],
- cfg->dst_width, cfg->dst_height);
- DPU_DEBUG_PLANE(pdpu, "user property data copied\n");
-}
-
-static void _dpu_plane_set_excl_rect_v1(struct dpu_plane *pdpu,
- struct dpu_plane_state *pstate, void *usr_ptr)
-{
- struct drm_clip_rect excl_rect_v1;
-
- if (!pdpu) {
- DPU_ERROR("invalid plane\n");
- return;
- }
-
- if (!usr_ptr) {
- DPU_DEBUG_PLANE(pdpu, "invalid excl_rect user data\n");
- return;
- }
-
- if (copy_from_user(&excl_rect_v1, usr_ptr, sizeof(excl_rect_v1))) {
- DPU_ERROR_PLANE(pdpu, "failed to copy excl_rect data\n");
- return;
- }
-
- /* populate from user space */
- pstate->excl_rect.x = excl_rect_v1.x1;
- pstate->excl_rect.y = excl_rect_v1.y1;
- pstate->excl_rect.w = excl_rect_v1.x2 - excl_rect_v1.x1;
- pstate->excl_rect.h = excl_rect_v1.y2 - excl_rect_v1.y1;
-
- DPU_DEBUG_PLANE(pdpu, "excl_rect: {%d,%d,%d,%d}\n",
- pstate->excl_rect.x, pstate->excl_rect.y,
- pstate->excl_rect.w, pstate->excl_rect.h);
}
static int dpu_plane_atomic_set_property(struct drm_plane *plane,
@@ -2624,7 +1529,7 @@ static int dpu_plane_atomic_set_property(struct drm_plane *plane,
{
struct dpu_plane *pdpu = plane ? to_dpu_plane(plane) : NULL;
struct dpu_plane_state *pstate;
- int idx, ret = -EINVAL;
+ int ret = -EINVAL;
DPU_DEBUG_PLANE(pdpu, "\n");
@@ -2636,31 +1541,6 @@ static int dpu_plane_atomic_set_property(struct drm_plane *plane,
pstate = to_dpu_plane_state(state);
ret = msm_property_atomic_set(&pdpu->property_info,
&pstate->property_state, property, val);
- if (!ret) {
- idx = msm_property_index(&pdpu->property_info,
- property);
- switch (idx) {
- case PLANE_PROP_CSC_V1:
- _dpu_plane_set_csc_v1(pdpu,
- u64_to_user_ptr(val));
- break;
- case PLANE_PROP_SCALER_V1:
- _dpu_plane_set_scaler_v1(pdpu, pstate,
- u64_to_user_ptr(val));
- break;
- case PLANE_PROP_SCALER_V2:
- _dpu_plane_set_scaler_v2(pdpu, pstate,
- u64_to_user_ptr(val));
- break;
- case PLANE_PROP_EXCL_RECT_V1:
- _dpu_plane_set_excl_rect_v1(pdpu, pstate,
- u64_to_user_ptr(val));
- break;
- default:
- /* nothing to do */
- break;
- }
- }
}
DPU_DEBUG_PLANE(pdpu, "%s[%d] <= 0x%llx ret=%d\n",
@@ -2772,7 +1652,6 @@ static void dpu_plane_destroy_state(struct drm_plane *plane,
msm_property_duplicate_state(&pdpu->property_info, old_state, pstate,
&pstate->property_state, pstate->property_values);
- pstate->dirty = 0x0;
pstate->pending = false;
__drm_atomic_helper_plane_duplicate_state(plane, &pstate->base);
diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_plane.h b/drivers/gpu/drm/msm/disp/dpu1/dpu_plane.h
index 25b6b15..a06c8b4 100644
--- a/drivers/gpu/drm/msm/disp/dpu1/dpu_plane.h
+++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_plane.h
@@ -26,32 +26,6 @@
#include "dpu_hw_mdss.h"
#include "dpu_hw_sspp.h"
-/* dirty bits for update function */
-#define DPU_PLANE_DIRTY_RECTS 0x1
-#define DPU_PLANE_DIRTY_FORMAT 0x2
-#define DPU_PLANE_DIRTY_SHARPEN 0x4
-#define DPU_PLANE_DIRTY_PERF 0x8
-#define DPU_PLANE_DIRTY_ALL 0xFFFFFFFF
-
-/**
- * enum dpu_plane_sclcheck_state - User scaler data status
- *
- * @DPU_PLANE_SCLCHECK_NONE: No user data provided
- * @DPU_PLANE_SCLCHECK_INVALID: Invalid user data provided
- * @DPU_PLANE_SCLCHECK_SCALER_V1: Valid scaler v1 data
- * @DPU_PLANE_SCLCHECK_SCALER_V1_CHECK: Unchecked scaler v1 data
- * @DPU_PLANE_SCLCHECK_SCALER_V2: Valid scaler v2 data
- * @DPU_PLANE_SCLCHECK_SCALER_V2_CHECK: Unchecked scaler v2 data
- */
-enum dpu_plane_sclcheck_state {
- DPU_PLANE_SCLCHECK_NONE,
- DPU_PLANE_SCLCHECK_INVALID,
- DPU_PLANE_SCLCHECK_SCALER_V1,
- DPU_PLANE_SCLCHECK_SCALER_V1_CHECK,
- DPU_PLANE_SCLCHECK_SCALER_V2,
- DPU_PLANE_SCLCHECK_SCALER_V2_CHECK,
-};
-
/**
* struct dpu_plane_state: Define dpu extension of drm plane state object
* @base: base drm plane state object
@@ -60,8 +34,6 @@ enum dpu_plane_sclcheck_state {
* @aspace: pointer to address space for input/output buffers
* @input_fence: dereferenced input fence pointer
* @stage: assigned by crtc blender
- * @excl_rect: exclusion rect values
- * @dirty: bitmask for which pipe h/w config functions need to be updated
* @multirect_index: index of the rectangle of SSPP
* @multirect_mode: parallel or time multiplex multirect mode
* @pending: whether the current update is still pending
@@ -77,8 +49,6 @@ struct dpu_plane_state {
struct msm_gem_address_space *aspace;
void *input_fence;
enum dpu_stage stage;
- struct dpu_rect excl_rect;
- uint32_t dirty;
uint32_t multirect_index;
uint32_t multirect_mode;
bool pending;
@@ -86,7 +56,6 @@ struct dpu_plane_state {
/* scaler configuration */
struct dpu_hw_scaler3_cfg scaler3_cfg;
struct dpu_hw_pixel_ext pixel_ext;
- enum dpu_plane_sclcheck_state scaler_check_state;
struct dpu_hw_pipe_cdp_cfg cdp_cfg;
};
diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_reg_dma.c b/drivers/gpu/drm/msm/disp/dpu1/dpu_reg_dma.c
deleted file mode 100644
index b81e071..0000000
--- a/drivers/gpu/drm/msm/disp/dpu1/dpu_reg_dma.c
+++ /dev/null
@@ -1,139 +0,0 @@
-/* Copyright (c) 2017-2018, The Linux Foundation. All rights reserved.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 and
- * only version 2 as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- */
-
-#include "dpu_reg_dma.h"
-#include "dpu_hw_reg_dma_v1.h"
-#include "dpu_dbg.h"
-
-static int default_check_support(enum dpu_reg_dma_features feature,
- enum dpu_reg_dma_blk blk,
- bool *is_supported)
-{
-
- if (!is_supported)
- return -EINVAL;
-
- *is_supported = false;
- return 0;
-}
-
-static int default_setup_payload(struct dpu_reg_dma_setup_ops_cfg *cfg)
-{
- DRM_ERROR("not implemented\n");
- return -EINVAL;
-}
-
-static int default_kick_off(struct dpu_reg_dma_kickoff_cfg *cfg)
-{
- DRM_ERROR("not implemented\n");
- return -EINVAL;
-
-}
-
-static int default_reset(struct dpu_hw_ctl *ctl)
-{
- DRM_ERROR("not implemented\n");
- return -EINVAL;
-}
-
-struct dpu_reg_dma_buffer *default_alloc_reg_dma_buf(u32 size)
-{
- DRM_ERROR("not implemented\n");
- return ERR_PTR(-EINVAL);
-}
-
-int default_dealloc_reg_dma(struct dpu_reg_dma_buffer *lut_buf)
-{
- DRM_ERROR("not implemented\n");
- return -EINVAL;
-}
-
-static int default_buf_reset_reg_dma(struct dpu_reg_dma_buffer *lut_buf)
-{
- DRM_ERROR("not implemented\n");
- return -EINVAL;
-}
-
-static int default_last_command(struct dpu_hw_ctl *ctl,
- enum dpu_reg_dma_queue q)
-{
- return 0;
-}
-
-static struct dpu_hw_reg_dma reg_dma = {
- .ops = {default_check_support, default_setup_payload,
- default_kick_off, default_reset, default_alloc_reg_dma_buf,
- default_dealloc_reg_dma, default_buf_reset_reg_dma,
- default_last_command},
-};
-
-int dpu_reg_dma_init(void __iomem *addr, struct dpu_mdss_cfg *m,
- struct drm_device *dev)
-{
- int rc = 0;
-
- if (!addr || !m || !dev) {
- DRM_DEBUG("invalid addr %pK catalog %pK dev %pK\n", addr, m,
- dev);
- return 0;
- }
-
- reg_dma.drm_dev = dev;
- reg_dma.caps = &m->dma_cfg;
- reg_dma.addr = addr;
-
- if (!m->reg_dma_count)
- return 0;
-
- switch (reg_dma.caps->version) {
- case 1:
- rc = init_v1(®_dma);
- if (rc)
- DRM_DEBUG("init v1 dma ops failed\n");
- else
- dpu_dbg_reg_register_base("reg_dma", addr,
- reg_dma.caps->len);
- break;
- default:
- break;
- }
-
- return 0;
-}
-
-struct dpu_hw_reg_dma_ops *dpu_reg_dma_get_ops(void)
-{
- return ®_dma.ops;
-}
-
-void dpu_reg_dma_deinit(void)
-{
- struct dpu_hw_reg_dma op = {
- .ops = {default_check_support, default_setup_payload,
- default_kick_off, default_reset, default_alloc_reg_dma_buf,
- default_dealloc_reg_dma, default_buf_reset_reg_dma,
- default_last_command},
- };
-
- if (!reg_dma.drm_dev || !reg_dma.caps)
- return;
-
- switch (reg_dma.caps->version) {
- case 1:
- deinit_v1();
- break;
- default:
- break;
- }
- memset(®_dma, 0, sizeof(reg_dma));
- memcpy(®_dma.ops, &op.ops, sizeof(op.ops));
-}
diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_reg_dma.h b/drivers/gpu/drm/msm/disp/dpu1/dpu_reg_dma.h
deleted file mode 100644
index 1fb92ed..0000000
--- a/drivers/gpu/drm/msm/disp/dpu1/dpu_reg_dma.h
+++ /dev/null
@@ -1,310 +0,0 @@
-/* Copyright (c) 2017-2018, The Linux Foundation. All rights reserved.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 and
- * only version 2 as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- */
-
-#ifndef _DPU_REG_DMA_H
-#define _DPU_REG_DMA_H
-
-#include "msm_drv.h"
-#include "dpu_hw_catalog.h"
-#include "dpu_hw_mdss.h"
-#include "dpu_hw_top.h"
-#include "dpu_hw_util.h"
-
-/**
- * enum dpu_reg_dma_op - defines operations supported by reg dma
- * @REG_DMA_READ: Read the histogram into buffer provided
- * @REG_DMA_WRITE: Write the reg dma configuration into MDP block
- * @REG_DMA_OP_MAX: Max operation which indicates that op is invalid
- */
-enum dpu_reg_dma_op {
- REG_DMA_READ,
- REG_DMA_WRITE,
- REG_DMA_OP_MAX
-};
-
-/**
- * enum dpu_reg_dma_read_sel - defines the blocks for histogram read
- * @DSPP0_HIST: select dspp0
- * @DSPP1_HIST: select dspp1
- * @DSPP2_HIST: select dspp2
- * @DSPP3_HIST: select dspp3
- * @DSPP_HIST_MAX: invalid selection
- */
-enum dpu_reg_dma_read_sel {
- DSPP0_HIST,
- DSPP1_HIST,
- DSPP2_HIST,
- DSPP3_HIST,
- DSPP_HIST_MAX,
-};
-
-/**
- * enum dpu_reg_dma_features - defines features supported by reg dma
- * @QSEED: qseed feature
- * @GAMUT: gamut feature
- * @IGC: inverse gamma correction
- * @PCC: polynomical color correction
- * @VLUT: PA vlut
- * @MEM_COLOR: memory color
- * @SIX_ZONE: six zone
- * @HSIC: Hue, saturation and contrast
- * @GC: gamma correction
- * @REG_DMA_FEATURES_MAX: invalid selection
- */
-enum dpu_reg_dma_features {
- QSEED,
- GAMUT,
- IGC,
- PCC,
- VLUT,
- MEM_COLOR,
- SIX_ZONE,
- HSIC,
- GC,
- REG_DMA_FEATURES_MAX,
-};
-
-/**
- * enum dpu_reg_dma_queue - defines reg dma write queue values
- * @DMA_CTL_QUEUE0: select queue0
- * @DMA_CTL_QUEUE1: select queue1
- * @DMA_CTL_QUEUE_MAX: invalid selection
- */
-enum dpu_reg_dma_queue {
- DMA_CTL_QUEUE0,
- DMA_CTL_QUEUE1,
- DMA_CTL_QUEUE_MAX,
-};
-
-/**
- * enum dpu_reg_dma_trigger_mode - defines reg dma ops trigger mode
- * @WRITE_IMMEDIATE: trigger write op immediately
- * @WRITE_TRIGGER: trigger write op when sw trigger is issued
- * @READ_IMMEDIATE: trigger read op immediately
- * @READ_TRIGGER: trigger read op when sw trigger is issued
- * @TIGGER_MAX: invalid trigger selection
- */
-enum dpu_reg_dma_trigger_mode {
- WRITE_IMMEDIATE,
- WRITE_TRIGGER,
- READ_IMMEDIATE,
- READ_TRIGGER,
- TIGGER_MAX,
-};
-
-/**
- * enum dpu_reg_dma_setup_ops - defines reg dma write configuration
- * @HW_BLK_SELECT: op for selecting the hardware block
- * @REG_SINGLE_WRITE: op for writing single register value
- * at the address provided
- * @REG_BLK_WRITE_SINGLE: op for writing multiple registers using hw index
- * register
- * @REG_BLK_WRITE_INC: op for writing multiple registers using auto address
- * increment
- * @REG_BLK_WRITE_MULTIPLE: op for writing hw index based registers at
- * non-consecutive location
- * @REG_DMA_SETUP_OPS_MAX: invalid operation
- */
-enum dpu_reg_dma_setup_ops {
- HW_BLK_SELECT,
- REG_SINGLE_WRITE,
- REG_BLK_WRITE_SINGLE,
- REG_BLK_WRITE_INC,
- REG_BLK_WRITE_MULTIPLE,
- REG_DMA_SETUP_OPS_MAX,
-};
-
-/**
- * enum dpu_reg_dma_blk - defines blocks for which reg dma op should be
- * performed
- * @VIG0: select vig0 block
- * @VIG1: select vig1 block
- * @VIG2: select vig2 block
- * @VIG3: select vig3 block
- * @LM0: select lm0 block
- * @LM1: select lm1 block
- * @LM2: select lm2 block
- * @LM3: select lm3 block
- * @DSPP0: select dspp0 block
- * @DSPP1: select dspp1 block
- * @DSPP2: select dspp2 block
- * @DSPP3: select dspp3 block
- * @DMA0: select dma0 block
- * @DMA1: select dma1 block
- * @DMA2: select dma2 block
- * @DMA3: select dma3 block
- * @SSPP_IGC: select sspp igc block
- * @DSPP_IGC: select dspp igc block
- * @MDSS: select mdss block
- */
-enum dpu_reg_dma_blk {
- VIG0 = BIT(0),
- VIG1 = BIT(1),
- VIG2 = BIT(2),
- VIG3 = BIT(3),
- LM0 = BIT(4),
- LM1 = BIT(5),
- LM2 = BIT(6),
- LM3 = BIT(7),
- DSPP0 = BIT(8),
- DSPP1 = BIT(9),
- DSPP2 = BIT(10),
- DSPP3 = BIT(11),
- DMA0 = BIT(12),
- DMA1 = BIT(13),
- DMA2 = BIT(14),
- DMA3 = BIT(15),
- SSPP_IGC = BIT(16),
- DSPP_IGC = BIT(17),
- MDSS = BIT(31)
-};
-
-/**
- * struct dpu_reg_dma_buffer - defines reg dma buffer structure.
- * @drm_gem_object *buf: drm gem handle for the buffer
- * @asapce : pointer to address space
- * @buffer_size: buffer size
- * @index: write pointer index
- * @iova: device address
- * @vaddr: cpu address
- * @next_op_allowed: operation allowed on the buffer
- * @ops_completed: operations completed on buffer
- */
-struct dpu_reg_dma_buffer {
- struct drm_gem_object *buf;
- struct msm_gem_address_space *aspace;
- u32 buffer_size;
- u32 index;
- u64 iova;
- void *vaddr;
- u32 next_op_allowed;
- u32 ops_completed;
-};
-
-/**
- * struct dpu_reg_dma_setup_ops_cfg - defines structure for reg dma ops on the
- * reg dma buffer.
- * @dpu_reg_dma_setup_ops ops: ops to be performed
- * @dpu_reg_dma_blk blk: block on which op needs to be performed
- * @dpu_reg_dma_features feature: feature on which op needs to be done
- * @wrap_size: valid for REG_BLK_WRITE_MULTIPLE, indicates reg index location
- * size
- * @inc: valid for REG_BLK_WRITE_MULTIPLE indicates whether reg index location
- * needs an increment or decrement.
- * 0 - decrement
- * 1 - increment
- * @blk_offset: offset for blk, valid for HW_BLK_SELECT op only
- * @dpu_reg_dma_buffer *dma_buf: reg dma buffer on which op needs to be
- * performed
- * @data: pointer to payload which has to be written into reg dma buffer for
- * selected op.
- * @data_size: size of payload in data
- */
-struct dpu_reg_dma_setup_ops_cfg {
- enum dpu_reg_dma_setup_ops ops;
- enum dpu_reg_dma_blk blk;
- enum dpu_reg_dma_features feature;
- u32 wrap_size;
- u32 inc;
- u32 blk_offset;
- struct dpu_reg_dma_buffer *dma_buf;
- u32 *data;
- u32 data_size;
-};
-
-/**
- * struct dpu_reg_dma_kickoff_cfg - commit reg dma buffer to hw engine
- * @ctl: ctl for which reg dma buffer needs to be committed.
- * @dma_buf: reg dma buffer with iova address and size info
- * @block_select: histogram read select
- * @trigger_mode: reg dma ops trigger mode
- * @queue_select: queue on which reg dma buffer will be submitted
- * @last_command: last command for this vsync
- */
-struct dpu_reg_dma_kickoff_cfg {
- struct dpu_hw_ctl *ctl;
- enum dpu_reg_dma_op op;
- struct dpu_reg_dma_buffer *dma_buf;
- enum dpu_reg_dma_read_sel block_select;
- enum dpu_reg_dma_trigger_mode trigger_mode;
- enum dpu_reg_dma_queue queue_select;
- u32 last_command;
-};
-
-/**
- * struct dpu_hw_reg_dma_ops - ops supported by reg dma frame work, based on
- * version of reg dma appropriate ops will be
- * installed during driver probe.
- * @check_support: checks if reg dma is supported on this platform for a
- * feature
- * @setup_payload: setup reg dma buffer based on ops and payload provided by
- * client
- * @kick_off: submit the reg dma buffer to hw enginge
- * @reset: reset the reg dma hw enginge for a ctl
- * @alloc_reg_dma_buf: allocate reg dma buffer
- * @dealloc_reg_dma: de-allocate reg dma buffer
- * @reset_reg_dma_buf: reset the buffer to init state
- * @last_command: notify control that last command is queued
- */
-struct dpu_hw_reg_dma_ops {
- int (*check_support)(enum dpu_reg_dma_features feature,
- enum dpu_reg_dma_blk blk,
- bool *is_supported);
- int (*setup_payload)(struct dpu_reg_dma_setup_ops_cfg *cfg);
- int (*kick_off)(struct dpu_reg_dma_kickoff_cfg *cfg);
- int (*reset)(struct dpu_hw_ctl *ctl);
- struct dpu_reg_dma_buffer* (*alloc_reg_dma_buf)(u32 size);
- int (*dealloc_reg_dma)(struct dpu_reg_dma_buffer *lut_buf);
- int (*reset_reg_dma_buf)(struct dpu_reg_dma_buffer *buf);
- int (*last_command)(struct dpu_hw_ctl *ctl, enum dpu_reg_dma_queue q);
-};
-
-/**
- * struct dpu_hw_reg_dma - structure to hold reg dma hw info
- * @drm_dev: drm driver dev handle
- * @caps: reg dma hw caps on the platform
- * @ops: reg dma ops supported on the platform
- * @addr: reg dma hw block base address
- */
-struct dpu_hw_reg_dma {
- struct drm_device *drm_dev;
- const struct dpu_reg_dma_cfg *caps;
- struct dpu_hw_reg_dma_ops ops;
- void __iomem *addr;
-};
-
-/**
- * dpu_reg_dma_init() - function called to initialize reg dma during dpu
- * drm driver probe. If reg dma is supported by dpu
- * ops for reg dma version will be installed.
- * if reg dma is not supported by dpu default ops will
- * be installed. check_support of default ops will
- * return false, hence the clients should fall back to
- * AHB programming.
- * @addr: reg dma block base address
- * @m: catalog which contains dpu hw capabilities and offsets
- * @dev: drm driver device handle
- */
-int dpu_reg_dma_init(void __iomem *addr, struct dpu_mdss_cfg *m,
- struct drm_device *dev);
-
-/**
- * dpu_reg_dma_get_ops() - singleton module, ops is returned to the clients
- * who call this api.
- */
-struct dpu_hw_reg_dma_ops *dpu_reg_dma_get_ops(void);
-
-/**
- * dpu_reg_dma_deinit() - de-initialize the reg dma
- */
-void dpu_reg_dma_deinit(void);
-#endif /* _DPU_REG_DMA_H */
diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_rm.c b/drivers/gpu/drm/msm/disp/dpu1/dpu_rm.c
index af8205f..f467bf1 100644
--- a/drivers/gpu/drm/msm/disp/dpu1/dpu_rm.c
+++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_rm.c
@@ -17,7 +17,6 @@
#include "dpu_hw_lm.h"
#include "dpu_hw_ctl.h"
#include "dpu_hw_cdm.h"
-#include "dpu_hw_dspp.h"
#include "dpu_hw_ds.h"
#include "dpu_hw_pingpong.h"
#include "dpu_hw_intf.h"
@@ -29,7 +28,6 @@
#define RM_RQ_LOCK(r) ((r)->top_ctrl & BIT(DPU_RM_TOPCTL_RESERVE_LOCK))
#define RM_RQ_CLEAR(r) ((r)->top_ctrl & BIT(DPU_RM_TOPCTL_RESERVE_CLEAR))
-#define RM_RQ_DSPP(r) ((r)->top_ctrl & BIT(DPU_RM_TOPCTL_DSPP))
#define RM_RQ_DS(r) ((r)->top_ctrl & BIT(DPU_RM_TOPCTL_DS))
#define RM_IS_TOPOLOGY_MATCH(t, r) ((t).num_lm == (r).num_lm && \
(t).num_comp_enc == (r).num_enc && \
@@ -237,9 +235,6 @@ static void _dpu_rm_hw_destroy(enum dpu_hw_blk_type type, void *hw)
case DPU_HW_BLK_LM:
dpu_hw_lm_destroy(hw);
break;
- case DPU_HW_BLK_DSPP:
- dpu_hw_dspp_destroy(hw);
- break;
case DPU_HW_BLK_DS:
dpu_hw_ds_destroy(hw);
break;
@@ -322,9 +317,6 @@ static int _dpu_rm_hw_blk_create(
case DPU_HW_BLK_LM:
hw = dpu_hw_lm_init(id, mmio, cat);
break;
- case DPU_HW_BLK_DSPP:
- hw = dpu_hw_dspp_init(id, mmio, cat);
- break;
case DPU_HW_BLK_DS:
hw = dpu_hw_ds_init(id, mmio, cat);
break;
@@ -435,15 +427,6 @@ int dpu_rm_init(struct dpu_rm *rm,
}
}
- for (i = 0; i < cat->dspp_count; i++) {
- rc = _dpu_rm_hw_blk_create(rm, cat, mmio, DPU_HW_BLK_DSPP,
- cat->dspp[i].id, &cat->dspp[i]);
- if (rc) {
- DPU_ERROR("failed: dspp hw not available\n");
- goto fail;
- }
- }
-
if (cat->mdp[0].has_dest_scaler) {
for (i = 0; i < cat->ds_count; i++) {
rc = _dpu_rm_hw_blk_create(rm, cat, mmio, DPU_HW_BLK_DS,
@@ -516,16 +499,14 @@ int dpu_rm_init(struct dpu_rm *rm,
/**
* _dpu_rm_check_lm_and_get_connected_blks - check if proposed layer mixer meets
* proposed use case requirements, incl. hardwired dependent blocks like
- * pingpong, and dspp.
+ * pingpong
* @rm: dpu resource manager handle
* @rsvp: reservation currently being created
* @reqs: proposed use case requirements
* @lm: proposed layer mixer, function checks if lm, and all other hardwired
- * blocks connected to the lm (pp, dspp) are available and appropriate
- * @dspp: output parameter, dspp block attached to the layer mixer.
- * NULL if dspp was not available, or not matching requirements.
+ * blocks connected to the lm (pp) is available and appropriate
* @pp: output parameter, pingpong block attached to the layer mixer.
- * NULL if dspp was not available, or not matching requirements.
+ * NULL if pp was not available, or not matching requirements.
* @primary_lm: if non-null, this function check if lm is compatible primary_lm
* as well as satisfying all other requirements
* @Return: true if lm matches all requirements, false otherwise
@@ -535,21 +516,19 @@ static bool _dpu_rm_check_lm_and_get_connected_blks(
struct dpu_rm_rsvp *rsvp,
struct dpu_rm_requirements *reqs,
struct dpu_rm_hw_blk *lm,
- struct dpu_rm_hw_blk **dspp,
struct dpu_rm_hw_blk **ds,
struct dpu_rm_hw_blk **pp,
struct dpu_rm_hw_blk *primary_lm)
{
const struct dpu_lm_cfg *lm_cfg = to_dpu_hw_mixer(lm->hw)->cap;
struct dpu_rm_hw_iter iter;
- bool is_valid_dspp, is_valid_ds, ret;
+ bool is_valid_ds;
- *dspp = NULL;
*ds = NULL;
*pp = NULL;
- DPU_DEBUG("check lm %d: dspp %d ds %d pp %d\n",
- lm_cfg->id, lm_cfg->dspp,
+ DPU_DEBUG("check lm %d ds %d pp %d\n",
+ lm_cfg->id,
lm_cfg->ds, lm_cfg->pingpong);
/* Check if this layer mixer is a peer of the proposed primary LM */
@@ -564,28 +543,13 @@ static bool _dpu_rm_check_lm_and_get_connected_blks(
}
}
- is_valid_dspp = (lm_cfg->dspp != DSPP_MAX) ? true : false;
is_valid_ds = (lm_cfg->ds != DS_MAX) ? true : false;
- /**
- * RM_RQ_X: specification of which LMs to choose
- * is_valid_X: indicates whether LM is tied with block X
- * ret: true if given LM matches the user requirement, false otherwise
- */
- if (RM_RQ_DSPP(reqs) && RM_RQ_DS(reqs))
- ret = (is_valid_dspp && is_valid_ds);
- else if (RM_RQ_DSPP(reqs))
- ret = is_valid_dspp;
- else if (RM_RQ_DS(reqs))
- ret = is_valid_ds;
- else
- ret = !(is_valid_dspp || is_valid_ds);
+ if (RM_RQ_DS(reqs) && !is_valid_ds) {
+ DPU_DEBUG("fail:lm(%d)req_ds(%d)ds(%d)\n",
+ lm_cfg->id, (bool)(RM_RQ_DS(reqs)), lm_cfg->ds);
- if (!ret) {
- DPU_DEBUG("fail:lm(%d)req_dspp(%d)dspp(%d)req_ds(%d)ds(%d)\n",
- lm_cfg->id, (bool)(RM_RQ_DSPP(reqs)), lm_cfg->dspp,
- (bool)(RM_RQ_DS(reqs)), lm_cfg->ds);
- return ret;
+ return false;
}
/* Already reserved? */
@@ -594,28 +558,6 @@ static bool _dpu_rm_check_lm_and_get_connected_blks(
return false;
}
- if (lm_cfg->dspp != DSPP_MAX) {
- dpu_rm_init_hw_iter(&iter, 0, DPU_HW_BLK_DSPP);
- while (_dpu_rm_get_hw_locked(rm, &iter)) {
- if (iter.blk->id == lm_cfg->dspp) {
- *dspp = iter.blk;
- break;
- }
- }
-
- if (!*dspp) {
- DPU_DEBUG("lm %d failed to retrieve dspp %d\n", lm->id,
- lm_cfg->dspp);
- return false;
- }
-
- if (RESERVED_BY_OTHER(*dspp, rsvp)) {
- DPU_DEBUG("lm %d dspp %d already reserved\n",
- lm->id, (*dspp)->id);
- return false;
- }
- }
-
if (lm_cfg->ds != DS_MAX) {
dpu_rm_init_hw_iter(&iter, 0, DPU_HW_BLK_DS);
while (_dpu_rm_get_hw_locked(rm, &iter)) {
@@ -654,7 +596,6 @@ static bool _dpu_rm_check_lm_and_get_connected_blks(
if (RESERVED_BY_OTHER(*pp, rsvp)) {
DPU_DEBUG("lm %d pp %d already reserved\n", lm->id,
(*pp)->id);
- *dspp = NULL;
*ds = NULL;
return false;
}
@@ -669,7 +610,6 @@ static int _dpu_rm_reserve_lms(
{
struct dpu_rm_hw_blk *lm[MAX_BLOCKS];
- struct dpu_rm_hw_blk *dspp[MAX_BLOCKS];
struct dpu_rm_hw_blk *ds[MAX_BLOCKS];
struct dpu_rm_hw_blk *pp[MAX_BLOCKS];
struct dpu_rm_hw_iter iter_i, iter_j;
@@ -686,7 +626,6 @@ static int _dpu_rm_reserve_lms(
while (lm_count != reqs->topology->num_lm &&
_dpu_rm_get_hw_locked(rm, &iter_i)) {
memset(&lm, 0, sizeof(lm));
- memset(&dspp, 0, sizeof(dspp));
memset(&ds, 0, sizeof(ds));
memset(&pp, 0, sizeof(pp));
@@ -694,8 +633,7 @@ static int _dpu_rm_reserve_lms(
lm[lm_count] = iter_i.blk;
if (!_dpu_rm_check_lm_and_get_connected_blks(
- rm, rsvp, reqs, lm[lm_count],
- &dspp[lm_count], &ds[lm_count],
+ rm, rsvp, reqs, lm[lm_count], &ds[lm_count],
&pp[lm_count], NULL))
continue;
@@ -711,8 +649,8 @@ static int _dpu_rm_reserve_lms(
if (!_dpu_rm_check_lm_and_get_connected_blks(
rm, rsvp, reqs, iter_j.blk,
- &dspp[lm_count], &ds[lm_count],
- &pp[lm_count], iter_i.blk))
+ &ds[lm_count], &pp[lm_count],
+ iter_i.blk))
continue;
lm[lm_count] = iter_j.blk;
@@ -731,14 +669,11 @@ static int _dpu_rm_reserve_lms(
lm[i]->rsvp_nxt = rsvp;
pp[i]->rsvp_nxt = rsvp;
- if (dspp[i])
- dspp[i]->rsvp_nxt = rsvp;
if (ds[i])
ds[i]->rsvp_nxt = rsvp;
DPU_EVT32(lm[i]->type, rsvp->enc_id, lm[i]->id, pp[i]->id,
- dspp[i] ? dspp[i]->id : 0,
ds[i] ? ds[i]->id : 0);
}
@@ -919,18 +854,7 @@ static int _dpu_rm_make_next_rsvp(
rsvp->topology = reqs->topology->top_name;
list_add_tail(&rsvp->list, &rm->rsvps);
- /*
- * Assign LMs and blocks whose usage is tied to them: DSPP & Pingpong.
- * Do assignment preferring to give away low-resource mixers first:
- * - Check mixers without DSPPs
- * - Only then allow to grab from mixers with DSPP capability
- */
ret = _dpu_rm_reserve_lms(rm, rsvp, reqs);
- if (ret && !RM_RQ_DSPP(reqs)) {
- reqs->top_ctrl |= BIT(DPU_RM_TOPCTL_DSPP);
- ret = _dpu_rm_reserve_lms(rm, rsvp, reqs);
- }
-
if (ret) {
DPU_ERROR("unable to find appropriate mixers\n");
return ret;
diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_rm.h b/drivers/gpu/drm/msm/disp/dpu1/dpu_rm.h
index 4c77874..ef3f67b 100644
--- a/drivers/gpu/drm/msm/disp/dpu1/dpu_rm.h
+++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_rm.h
@@ -45,13 +45,11 @@ enum dpu_rm_topology_name {
* release any reservation held by this display.
* Normal behavior would not impact the
* reservation list during the AtomicTest phase.
- * @DPU_RM_TOPCTL_DSPP: Require layer mixers with DSPP capabilities
* @DPU_RM_TOPCTL_DS : Require layer mixers with DS capabilities
*/
enum dpu_rm_topology_control {
DPU_RM_TOPCTL_RESERVE_LOCK,
DPU_RM_TOPCTL_RESERVE_CLEAR,
- DPU_RM_TOPCTL_DSPP,
DPU_RM_TOPCTL_DS,
};
diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_wb.c b/drivers/gpu/drm/msm/disp/dpu1/dpu_wb.c
index cc78786..9b47bb2 100644
--- a/drivers/gpu/drm/msm/disp/dpu1/dpu_wb.c
+++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_wb.c
@@ -13,8 +13,6 @@
#define pr_fmt(fmt) "[drm:%s:%d] " fmt, __func__, __LINE__
-#include <uapi/drm/dpu_drm.h>
-
#include "msm_kms.h"
#include "dpu_kms.h"
#include "dpu_wb.h"
diff --git a/drivers/gpu/drm/msm/msm_drv.h b/drivers/gpu/drm/msm/msm_drv.h
index 954ac12..5baff27 100644
--- a/drivers/gpu/drm/msm/msm_drv.h
+++ b/drivers/gpu/drm/msm/msm_drv.h
@@ -77,39 +77,11 @@ struct msm_file_private {
};
enum msm_mdp_plane_property {
- /* blob properties, always put these first */
- PLANE_PROP_SCALER_V1,
- PLANE_PROP_SCALER_V2,
- PLANE_PROP_CSC_V1,
- PLANE_PROP_INFO,
- PLANE_PROP_SCALER_LUT_ED,
- PLANE_PROP_SCALER_LUT_CIR,
- PLANE_PROP_SCALER_LUT_SEP,
- PLANE_PROP_SKIN_COLOR,
- PLANE_PROP_SKY_COLOR,
- PLANE_PROP_FOLIAGE_COLOR,
- PLANE_PROP_ROT_CAPS_V1,
-
/* # of blob properties */
PLANE_PROP_BLOBCOUNT,
/* range properties */
PLANE_PROP_ZPOS = PLANE_PROP_BLOBCOUNT,
- PLANE_PROP_ALPHA,
- PLANE_PROP_COLOR_FILL,
- PLANE_PROP_H_DECIMATE,
- PLANE_PROP_V_DECIMATE,
- PLANE_PROP_HUE_ADJUST,
- PLANE_PROP_SATURATION_ADJUST,
- PLANE_PROP_VALUE_ADJUST,
- PLANE_PROP_CONTRAST_ADJUST,
- PLANE_PROP_EXCL_RECT_V1,
- PLANE_PROP_PREFILL_SIZE,
- PLANE_PROP_PREFILL_TIME,
-
- /* enum/bitmask properties */
- PLANE_PROP_BLEND_OP,
- PLANE_PROP_SRC_CONFIG,
/* total # of properties */
PLANE_PROP_COUNT
diff --git a/include/uapi/drm/dpu_drm.h b/include/uapi/drm/dpu_drm.h
index da73279..93af1fb 100644
--- a/include/uapi/drm/dpu_drm.h
+++ b/include/uapi/drm/dpu_drm.h
@@ -66,193 +66,6 @@
/* DRM bitmasks are restricted to 0..63 */
#define DPU_DRM_BITMASK_COUNT 64
-/**
- * struct dpu_drm_pix_ext_v1 - version 1 of pixel ext structure
- * @num_ext_pxls_lr: Number of total horizontal pixels
- * @num_ext_pxls_tb: Number of total vertical lines
- * @left_ftch: Number of extra pixels to overfetch from left
- * @right_ftch: Number of extra pixels to overfetch from right
- * @top_ftch: Number of extra lines to overfetch from top
- * @btm_ftch: Number of extra lines to overfetch from bottom
- * @left_rpt: Number of extra pixels to repeat from left
- * @right_rpt: Number of extra pixels to repeat from right
- * @top_rpt: Number of extra lines to repeat from top
- * @btm_rpt: Number of extra lines to repeat from bottom
- */
-struct dpu_drm_pix_ext_v1 {
- /*
- * Number of pixels ext in left, right, top and bottom direction
- * for all color components.
- */
- int32_t num_ext_pxls_lr[DPU_MAX_PLANES];
- int32_t num_ext_pxls_tb[DPU_MAX_PLANES];
-
- /*
- * Number of pixels needs to be overfetched in left, right, top
- * and bottom directions from source image for scaling.
- */
- int32_t left_ftch[DPU_MAX_PLANES];
- int32_t right_ftch[DPU_MAX_PLANES];
- int32_t top_ftch[DPU_MAX_PLANES];
- int32_t btm_ftch[DPU_MAX_PLANES];
- /*
- * Number of pixels needs to be repeated in left, right, top and
- * bottom directions for scaling.
- */
- int32_t left_rpt[DPU_MAX_PLANES];
- int32_t right_rpt[DPU_MAX_PLANES];
- int32_t top_rpt[DPU_MAX_PLANES];
- int32_t btm_rpt[DPU_MAX_PLANES];
-
-};
-
-/**
- * struct dpu_drm_scaler_v1 - version 1 of struct dpu_drm_scaler
- * @lr: Pixel extension settings for left/right
- * @tb: Pixel extension settings for top/botton
- * @init_phase_x: Initial scaler phase values for x
- * @phase_step_x: Phase step values for x
- * @init_phase_y: Initial scaler phase values for y
- * @phase_step_y: Phase step values for y
- * @horz_filter: Horizontal filter array
- * @vert_filter: Vertical filter array
- */
-struct dpu_drm_scaler_v1 {
- /*
- * Pix ext settings
- */
- struct dpu_drm_pix_ext_v1 pe;
- /*
- * Phase settings
- */
- int32_t init_phase_x[DPU_MAX_PLANES];
- int32_t phase_step_x[DPU_MAX_PLANES];
- int32_t init_phase_y[DPU_MAX_PLANES];
- int32_t phase_step_y[DPU_MAX_PLANES];
-
- /*
- * Filter type to be used for scaling in horizontal and vertical
- * directions
- */
- uint32_t horz_filter[DPU_MAX_PLANES];
- uint32_t vert_filter[DPU_MAX_PLANES];
-};
-
-/**
- * struct dpu_drm_de_v1 - version 1 of detail enhancer structure
- * @enable: Enables/disables detail enhancer
- * @sharpen_level1: Sharpening strength for noise
- * @sharpen_level2: Sharpening strength for context
- * @clip: Clip coefficient
- * @limit: Detail enhancer limit factor
- * @thr_quiet: Quite zone threshold
- * @thr_dieout: Die-out zone threshold
- * @thr_low: Linear zone left threshold
- * @thr_high: Linear zone right threshold
- * @prec_shift: Detail enhancer precision
- * @adjust_a: Mapping curves A coefficients
- * @adjust_b: Mapping curves B coefficients
- * @adjust_c: Mapping curves C coefficients
- */
-struct dpu_drm_de_v1 {
- uint32_t enable;
- int16_t sharpen_level1;
- int16_t sharpen_level2;
- uint16_t clip;
- uint16_t limit;
- uint16_t thr_quiet;
- uint16_t thr_dieout;
- uint16_t thr_low;
- uint16_t thr_high;
- uint16_t prec_shift;
- int16_t adjust_a[DPU_MAX_DE_CURVES];
- int16_t adjust_b[DPU_MAX_DE_CURVES];
- int16_t adjust_c[DPU_MAX_DE_CURVES];
-};
-
-/**
- * struct dpu_drm_scaler_v2 - version 2 of struct dpu_drm_scaler
- * @enable: Scaler enable
- * @dir_en: Detail enhancer enable
- * @pe: Pixel extension settings
- * @horz_decimate: Horizontal decimation factor
- * @vert_decimate: Vertical decimation factor
- * @init_phase_x: Initial scaler phase values for x
- * @phase_step_x: Phase step values for x
- * @init_phase_y: Initial scaler phase values for y
- * @phase_step_y: Phase step values for y
- * @preload_x: Horizontal preload value
- * @preload_y: Vertical preload value
- * @src_width: Source width
- * @src_height: Source height
- * @dst_width: Destination width
- * @dst_height: Destination height
- * @y_rgb_filter_cfg: Y/RGB plane filter configuration
- * @uv_filter_cfg: UV plane filter configuration
- * @alpha_filter_cfg: Alpha filter configuration
- * @blend_cfg: Selection of blend coefficients
- * @lut_flag: LUT configuration flags
- * @dir_lut_idx: 2d 4x4 LUT index
- * @y_rgb_cir_lut_idx: Y/RGB circular LUT index
- * @uv_cir_lut_idx: UV circular LUT index
- * @y_rgb_sep_lut_idx: Y/RGB separable LUT index
- * @uv_sep_lut_idx: UV separable LUT index
- * @de: Detail enhancer settings
- */
-struct dpu_drm_scaler_v2 {
- /*
- * General definitions
- */
- uint32_t enable;
- uint32_t dir_en;
-
- /*
- * Pix ext settings
- */
- struct dpu_drm_pix_ext_v1 pe;
-
- /*
- * Decimation settings
- */
- uint32_t horz_decimate;
- uint32_t vert_decimate;
-
- /*
- * Phase settings
- */
- int32_t init_phase_x[DPU_MAX_PLANES];
- int32_t phase_step_x[DPU_MAX_PLANES];
- int32_t init_phase_y[DPU_MAX_PLANES];
- int32_t phase_step_y[DPU_MAX_PLANES];
-
- uint32_t preload_x[DPU_MAX_PLANES];
- uint32_t preload_y[DPU_MAX_PLANES];
- uint32_t src_width[DPU_MAX_PLANES];
- uint32_t src_height[DPU_MAX_PLANES];
-
- uint32_t dst_width;
- uint32_t dst_height;
-
- uint32_t y_rgb_filter_cfg;
- uint32_t uv_filter_cfg;
- uint32_t alpha_filter_cfg;
- uint32_t blend_cfg;
-
- uint32_t lut_flag;
- uint32_t dir_lut_idx;
-
- /* for Y(RGB) and UV planes*/
- uint32_t y_rgb_cir_lut_idx;
- uint32_t uv_cir_lut_idx;
- uint32_t y_rgb_sep_lut_idx;
- uint32_t uv_sep_lut_idx;
-
- /*
- * Detail enhancer settings
- */
- struct dpu_drm_de_v1 de;
-};
-
/* Number of dest scalers supported */
#define DPU_MAX_DS_COUNT 2
diff --git a/include/uapi/drm/msm_drm.h b/include/uapi/drm/msm_drm.h
index 404f201..60b1a30 100644
--- a/include/uapi/drm/msm_drm.h
+++ b/include/uapi/drm/msm_drm.h
@@ -26,7 +26,6 @@
#define __MSM_DRM_H__
#include "drm.h"
-#include "dpu_drm.h"
#if defined(__cplusplus)
extern "C" {
--
The Qualcomm Innovation Center, Inc. is a member of the Code Aurora Forum,
a Linux Foundation Collaborative Project
_______________________________________________
Freedreno mailing list
Freedreno@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/freedreno
^ permalink raw reply related [flat|nested] 18+ messages in thread
* [DPU PATCH 3/7] drm/msm: enable zpos normalization
[not found] ` <1527103862-13934-1-git-send-email-jsanka-sgV2jX0FEOL9JmXXK+q4OQ@public.gmane.org>
2018-05-23 19:30 ` [DPU PATCH 1/7] drm/msm: remove connector " Jeykumar Sankaran
2018-05-23 19:30 ` [DPU PATCH 2/7] drm/msm/dpu: clean up dpu plane " Jeykumar Sankaran
@ 2018-05-23 19:30 ` Jeykumar Sankaran
[not found] ` <1527103862-13934-4-git-send-email-jsanka-sgV2jX0FEOL9JmXXK+q4OQ@public.gmane.org>
2018-05-23 19:30 ` [DPU PATCH 4/7] drm/msm/dpu: switch to drm zpos property Jeykumar Sankaran
` (2 subsequent siblings)
5 siblings, 1 reply; 18+ messages in thread
From: Jeykumar Sankaran @ 2018-05-23 19:30 UTC (permalink / raw)
To: dri-devel-PD4FTy7X32lNgt0PjOBp9y5qC8QIuHrW,
freedreno-PD4FTy7X32lNgt0PjOBp9y5qC8QIuHrW,
linux-arm-msm-u79uwXL29TY76Z2rM5mHXA
Cc: hoegsberg-hpIqsD4AKlfQT0dZR+AlfA, Jeykumar Sankaran,
seanpaul-F7+t8E8rja9g9hUCZPvPmw,
robdclark-Re5JQEeQqe8AvxtiuMwx3w
Enable drm core zpos normalization for planes.
Signed-off-by: Jeykumar Sankaran <jsanka@codeaurora.org>
---
drivers/gpu/drm/msm/msm_drv.c | 3 +++
1 file changed, 3 insertions(+)
diff --git a/drivers/gpu/drm/msm/msm_drv.c b/drivers/gpu/drm/msm/msm_drv.c
index ebc40a9..549359e 100644
--- a/drivers/gpu/drm/msm/msm_drv.c
+++ b/drivers/gpu/drm/msm/msm_drv.c
@@ -592,6 +592,9 @@ static int msm_drm_init(struct device *dev, struct drm_driver *drv)
ddev->mode_config.funcs = &mode_config_funcs;
ddev->mode_config.helper_private = &mode_config_helper_funcs;
+ /* Enable normalization of plane zpos */
+ ddev->mode_config.normalize_zpos = true;
+
if (kms) {
ret = kms->funcs->hw_init(kms);
if (ret) {
--
The Qualcomm Innovation Center, Inc. is a member of the Code Aurora Forum,
a Linux Foundation Collaborative Project
_______________________________________________
Freedreno mailing list
Freedreno@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/freedreno
^ permalink raw reply related [flat|nested] 18+ messages in thread
* [DPU PATCH 4/7] drm/msm/dpu: switch to drm zpos property
[not found] ` <1527103862-13934-1-git-send-email-jsanka-sgV2jX0FEOL9JmXXK+q4OQ@public.gmane.org>
` (2 preceding siblings ...)
2018-05-23 19:30 ` [DPU PATCH 3/7] drm/msm: enable zpos normalization Jeykumar Sankaran
@ 2018-05-23 19:30 ` Jeykumar Sankaran
[not found] ` <1527103862-13934-5-git-send-email-jsanka-sgV2jX0FEOL9JmXXK+q4OQ@public.gmane.org>
2018-05-23 19:31 ` [DPU PATCH 5/7] drm/msm/dpu: clean up dpu crtc custom properties Jeykumar Sankaran
2018-05-23 19:31 ` [DPU PATCH 6/7] drm/msm: remove msm_prop files Jeykumar Sankaran
5 siblings, 1 reply; 18+ messages in thread
From: Jeykumar Sankaran @ 2018-05-23 19:30 UTC (permalink / raw)
To: dri-devel-PD4FTy7X32lNgt0PjOBp9y5qC8QIuHrW,
freedreno-PD4FTy7X32lNgt0PjOBp9y5qC8QIuHrW,
linux-arm-msm-u79uwXL29TY76Z2rM5mHXA
Cc: hoegsberg-hpIqsD4AKlfQT0dZR+AlfA, Jeykumar Sankaran,
seanpaul-F7+t8E8rja9g9hUCZPvPmw,
robdclark-Re5JQEeQqe8AvxtiuMwx3w
Replace custom plane zpos property with drm core zpos
property. CRTC relies on the normalized zpos values
to configure blend stages of each plane.
Signed-off-by: Jeykumar Sankaran <jsanka@codeaurora.org>
---
drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c | 36 +------------------------------
drivers/gpu/drm/msm/disp/dpu1/dpu_plane.c | 18 +++++++++++++---
2 files changed, 16 insertions(+), 38 deletions(-)
diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c b/drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c
index d439a9e..a0b702f 100644
--- a/drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c
+++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c
@@ -2631,24 +2631,6 @@ struct plane_state {
u32 pipe_id;
};
-static int pstate_cmp(const void *a, const void *b)
-{
- struct plane_state *pa = (struct plane_state *)a;
- struct plane_state *pb = (struct plane_state *)b;
- int rc = 0;
- int pa_zpos, pb_zpos;
-
- pa_zpos = dpu_plane_get_property(pa->dpu_pstate, PLANE_PROP_ZPOS);
- pb_zpos = dpu_plane_get_property(pb->dpu_pstate, PLANE_PROP_ZPOS);
-
- if (pa_zpos != pb_zpos)
- rc = pa_zpos - pb_zpos;
- else
- rc = pa->drm_pstate->crtc_x - pb->drm_pstate->crtc_x;
-
- return rc;
-}
-
static int dpu_crtc_atomic_check(struct drm_crtc *crtc,
struct drm_crtc_state *state)
{
@@ -2714,8 +2696,7 @@ static int dpu_crtc_atomic_check(struct drm_crtc *crtc,
pstates[cnt].dpu_pstate = to_dpu_plane_state(pstate);
pstates[cnt].drm_pstate = pstate;
- pstates[cnt].stage = dpu_plane_get_property(
- pstates[cnt].dpu_pstate, PLANE_PROP_ZPOS);
+ pstates[cnt].stage = pstate->normalized_zpos;
pstates[cnt].pipe_id = dpu_plane_pipe(plane);
/* check dim layer stage with every plane */
@@ -2771,21 +2752,6 @@ static int dpu_crtc_atomic_check(struct drm_crtc *crtc,
}
}
- /* assign mixer stages based on sorted zpos property */
- sort(pstates, cnt, sizeof(pstates[0]), pstate_cmp, NULL);
-
- if (!dpu_is_custom_client()) {
- int stage_old = pstates[0].stage;
-
- z_pos = 0;
- for (i = 0; i < cnt; i++) {
- if (stage_old != pstates[i].stage)
- ++z_pos;
- stage_old = pstates[i].stage;
- pstates[i].stage = z_pos;
- }
- }
-
z_pos = -1;
for (i = 0; i < cnt; i++) {
/* reset counts at every new blend stage */
diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_plane.c b/drivers/gpu/drm/msm/disp/dpu1/dpu_plane.c
index b033653..28735c8 100644
--- a/drivers/gpu/drm/msm/disp/dpu1/dpu_plane.c
+++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_plane.c
@@ -59,6 +59,7 @@
#define DPU_NAME_SIZE 12
#define DPU_PLANE_COLOR_FILL_FLAG BIT(31)
+#define DPU_ZPOS_MAX 255
/* multirect rect index */
enum {
@@ -1518,9 +1519,6 @@ static void _dpu_plane_install_properties(struct drm_plane *plane,
/* reserve zpos == 0 for primary planes */
zpos_def = drm_plane_index(plane) + 1;
}
-
- msm_property_install_range(&pdpu->property_info, "zpos",
- 0x0, 0, zpos_max, zpos_def, PLANE_PROP_ZPOS);
}
static int dpu_plane_atomic_set_property(struct drm_plane *plane,
@@ -1958,6 +1956,7 @@ struct drm_plane *dpu_plane_init(struct drm_device *dev,
struct msm_drm_private *priv;
struct dpu_kms *kms;
enum drm_plane_type type;
+ int zpos_max = DPU_ZPOS_MAX;
int ret = -EINVAL;
if (!dev) {
@@ -2049,6 +2048,19 @@ struct drm_plane *dpu_plane_init(struct drm_device *dev,
if (ret)
goto clean_sspp;
+ pdpu->catalog = kms->catalog;
+
+ if (kms->catalog->mixer_count &&
+ kms->catalog->mixer[0].sblk->maxblendstages) {
+ zpos_max = kms->catalog->mixer[0].sblk->maxblendstages - 1;
+ if (zpos_max > DPU_STAGE_MAX - DPU_STAGE_0 - 1)
+ zpos_max = DPU_STAGE_MAX - DPU_STAGE_0 - 1;
+ }
+
+ ret = drm_plane_create_zpos_property(plane, 0, 0, zpos_max);
+ if (ret)
+ DPU_ERROR("failed to install zpos property, rc = %d\n", ret);
+
/* success! finalize initialization */
drm_plane_helper_add(plane, &dpu_plane_helper_funcs);
--
The Qualcomm Innovation Center, Inc. is a member of the Code Aurora Forum,
a Linux Foundation Collaborative Project
_______________________________________________
Freedreno mailing list
Freedreno@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/freedreno
^ permalink raw reply related [flat|nested] 18+ messages in thread
* [DPU PATCH 5/7] drm/msm/dpu: clean up dpu crtc custom properties
[not found] ` <1527103862-13934-1-git-send-email-jsanka-sgV2jX0FEOL9JmXXK+q4OQ@public.gmane.org>
` (3 preceding siblings ...)
2018-05-23 19:30 ` [DPU PATCH 4/7] drm/msm/dpu: switch to drm zpos property Jeykumar Sankaran
@ 2018-05-23 19:31 ` Jeykumar Sankaran
[not found] ` <1527103862-13934-6-git-send-email-jsanka-sgV2jX0FEOL9JmXXK+q4OQ@public.gmane.org>
2018-05-23 19:31 ` [DPU PATCH 6/7] drm/msm: remove msm_prop files Jeykumar Sankaran
5 siblings, 1 reply; 18+ messages in thread
From: Jeykumar Sankaran @ 2018-05-23 19:31 UTC (permalink / raw)
To: dri-devel-PD4FTy7X32lNgt0PjOBp9y5qC8QIuHrW,
freedreno-PD4FTy7X32lNgt0PjOBp9y5qC8QIuHrW,
linux-arm-msm-u79uwXL29TY76Z2rM5mHXA
Cc: hoegsberg-hpIqsD4AKlfQT0dZR+AlfA, Jeykumar Sankaran,
seanpaul-F7+t8E8rja9g9hUCZPvPmw,
robdclark-Re5JQEeQqe8AvxtiuMwx3w
Remove dpu crtc custom properties and its handlers.
Signed-off-by: Jeykumar Sankaran <jsanka@codeaurora.org>
---
drivers/gpu/drm/msm/Makefile | 1 -
drivers/gpu/drm/msm/disp/dpu1/dpu_core_perf.c | 28 -
drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c | 856 +-------------------------
drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.h | 27 +-
drivers/gpu/drm/msm/disp/dpu1/dpu_encoder.c | 12 -
drivers/gpu/drm/msm/disp/dpu1/dpu_hw_ds.c | 149 -----
drivers/gpu/drm/msm/disp/dpu1/dpu_hw_ds.h | 111 ----
drivers/gpu/drm/msm/disp/dpu1/dpu_hw_lm.c | 67 --
drivers/gpu/drm/msm/disp/dpu1/dpu_hw_lm.h | 14 -
drivers/gpu/drm/msm/disp/dpu1/dpu_hw_mdss.h | 16 -
drivers/gpu/drm/msm/disp/dpu1/dpu_rm.c | 71 +--
drivers/gpu/drm/msm/msm_drv.h | 15 -
12 files changed, 11 insertions(+), 1356 deletions(-)
delete mode 100644 drivers/gpu/drm/msm/disp/dpu1/dpu_hw_ds.c
delete mode 100644 drivers/gpu/drm/msm/disp/dpu1/dpu_hw_ds.h
diff --git a/drivers/gpu/drm/msm/Makefile b/drivers/gpu/drm/msm/Makefile
index 7bc3921..d289503 100644
--- a/drivers/gpu/drm/msm/Makefile
+++ b/drivers/gpu/drm/msm/Makefile
@@ -57,7 +57,6 @@ msm-y := \
disp/dpu1/dpu_hw_catalog.o \
disp/dpu1/dpu_hw_cdm.o \
disp/dpu1/dpu_hw_ctl.o \
- disp/dpu1/dpu_hw_ds.o \
disp/dpu1/dpu_hw_interrupts.o \
disp/dpu1/dpu_hw_intf.o \
disp/dpu1/dpu_hw_lm.o \
diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_core_perf.c b/drivers/gpu/drm/msm/disp/dpu1/dpu_core_perf.c
index 981f77f..c4820de 100644
--- a/drivers/gpu/drm/msm/disp/dpu1/dpu_core_perf.c
+++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_core_perf.c
@@ -102,34 +102,6 @@ static void _dpu_core_perf_calc_crtc(struct dpu_kms *kms,
dpu_cstate = to_dpu_crtc_state(state);
memset(perf, 0, sizeof(struct dpu_core_perf_params));
- perf->bw_ctl[DPU_POWER_HANDLE_DBUS_ID_MNOC] =
- dpu_crtc_get_property(dpu_cstate, CRTC_PROP_CORE_AB);
- perf->max_per_pipe_ib[DPU_POWER_HANDLE_DBUS_ID_MNOC] =
- dpu_crtc_get_property(dpu_cstate, CRTC_PROP_CORE_IB);
-
- if (dpu_cstate->bw_split_vote) {
- perf->bw_ctl[DPU_POWER_HANDLE_DBUS_ID_LLCC] =
- dpu_crtc_get_property(dpu_cstate, CRTC_PROP_LLCC_AB);
- perf->max_per_pipe_ib[DPU_POWER_HANDLE_DBUS_ID_LLCC] =
- dpu_crtc_get_property(dpu_cstate, CRTC_PROP_LLCC_IB);
- perf->bw_ctl[DPU_POWER_HANDLE_DBUS_ID_EBI] =
- dpu_crtc_get_property(dpu_cstate, CRTC_PROP_DRAM_AB);
- perf->max_per_pipe_ib[DPU_POWER_HANDLE_DBUS_ID_EBI] =
- dpu_crtc_get_property(dpu_cstate, CRTC_PROP_DRAM_IB);
- } else {
- perf->bw_ctl[DPU_POWER_HANDLE_DBUS_ID_LLCC] =
- dpu_crtc_get_property(dpu_cstate, CRTC_PROP_CORE_AB);
- perf->max_per_pipe_ib[DPU_POWER_HANDLE_DBUS_ID_LLCC] =
- dpu_crtc_get_property(dpu_cstate, CRTC_PROP_CORE_IB);
- perf->bw_ctl[DPU_POWER_HANDLE_DBUS_ID_EBI] =
- dpu_crtc_get_property(dpu_cstate, CRTC_PROP_CORE_AB);
- perf->max_per_pipe_ib[DPU_POWER_HANDLE_DBUS_ID_EBI] =
- dpu_crtc_get_property(dpu_cstate, CRTC_PROP_CORE_IB);
- }
-
- perf->core_clk_rate =
- dpu_crtc_get_property(dpu_cstate, CRTC_PROP_CORE_CLK);
-
if (!dpu_cstate->bw_control) {
for (i = 0; i < DPU_POWER_HANDLE_DBUS_ID_MAX; i++) {
perf->bw_ctl[i] = kms->catalog->perf.max_bw_high *
diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c b/drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c
index a0b702f..b0a3a30 100644
--- a/drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c
+++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c
@@ -570,18 +570,6 @@ static void _dpu_crtc_deinit_events(struct dpu_crtc *dpu_crtc)
return;
}
-/**
- * dpu_crtc_destroy_dest_scaler - free memory allocated for scaler lut
- * @dpu_crtc: Pointer to dpu crtc
- */
-static void _dpu_crtc_destroy_dest_scaler(struct dpu_crtc *dpu_crtc)
-{
- if (!dpu_crtc)
- return;
-
- kfree(dpu_crtc->scl3_lut_cfg);
-}
-
static void dpu_crtc_destroy(struct drm_crtc *crtc)
{
struct dpu_crtc *dpu_crtc = to_dpu_crtc(crtc);
@@ -594,7 +582,6 @@ static void dpu_crtc_destroy(struct drm_crtc *crtc)
if (dpu_crtc->blob_info)
drm_property_blob_put(dpu_crtc->blob_info);
msm_property_destroy(&dpu_crtc->property_info);
- _dpu_crtc_destroy_dest_scaler(dpu_crtc);
_dpu_crtc_deinit_events(dpu_crtc);
@@ -679,71 +666,6 @@ static void _dpu_crtc_setup_blend_cfg(struct dpu_crtc_mixer *mixer,
format->alpha_enable, fg_alpha, bg_alpha, blend_op);
}
-static void _dpu_crtc_setup_dim_layer_cfg(struct drm_crtc *crtc,
- struct dpu_crtc *dpu_crtc, struct dpu_crtc_mixer *mixer,
- struct dpu_hw_dim_layer *dim_layer)
-{
- struct dpu_crtc_state *cstate;
- struct dpu_hw_mixer *lm;
- struct dpu_hw_dim_layer split_dim_layer;
- int i;
-
- if (!dim_layer->rect.w || !dim_layer->rect.h) {
- DPU_DEBUG("empty dim_layer\n");
- return;
- }
-
- cstate = to_dpu_crtc_state(crtc->state);
-
- DPU_DEBUG("dim_layer - flags:%d, stage:%d\n",
- dim_layer->flags, dim_layer->stage);
-
- split_dim_layer.stage = dim_layer->stage;
- split_dim_layer.color_fill = dim_layer->color_fill;
-
- /*
- * traverse through the layer mixers attached to crtc and find the
- * intersecting dim layer rect in each LM and program accordingly.
- */
- for (i = 0; i < dpu_crtc->num_mixers; i++) {
- split_dim_layer.flags = dim_layer->flags;
-
- dpu_kms_rect_intersect(&cstate->lm_bounds[i], &dim_layer->rect,
- &split_dim_layer.rect);
- if (dpu_kms_rect_is_null(&split_dim_layer.rect)) {
- /*
- * no extra programming required for non-intersecting
- * layer mixers with INCLUSIVE dim layer
- */
- if (split_dim_layer.flags & DPU_DRM_DIM_LAYER_INCLUSIVE)
- continue;
-
- /*
- * program the other non-intersecting layer mixers with
- * INCLUSIVE dim layer of full size for uniformity
- * with EXCLUSIVE dim layer config.
- */
- split_dim_layer.flags &= ~DPU_DRM_DIM_LAYER_EXCLUSIVE;
- split_dim_layer.flags |= DPU_DRM_DIM_LAYER_INCLUSIVE;
- memcpy(&split_dim_layer.rect, &cstate->lm_bounds[i],
- sizeof(split_dim_layer.rect));
-
- } else {
- split_dim_layer.rect.x =
- split_dim_layer.rect.x -
- cstate->lm_bounds[i].x;
- }
-
- DPU_DEBUG("split_dim_layer - LM:%d, rect:{%d,%d,%d,%d}}\n",
- i, split_dim_layer.rect.x, split_dim_layer.rect.y,
- split_dim_layer.rect.w, split_dim_layer.rect.h);
-
- lm = mixer[i].hw_lm;
- mixer[i].mixer_op_mode |= 1 << split_dim_layer.stage;
- lm->ops.setup_dim_layer(lm, &split_dim_layer);
- }
-}
-
static void _dpu_crtc_program_lm_output_roi(struct drm_crtc *crtc)
{
struct dpu_crtc *dpu_crtc;
@@ -787,7 +709,6 @@ static void _dpu_crtc_blend_setup_mixer(struct drm_crtc *crtc,
u32 flush_mask;
uint32_t stage_idx, lm_idx;
int zpos_cnt[DPU_STAGE_MAX + 1] = { 0 };
- int i;
bool bg_alpha_enable = false;
if (!dpu_crtc || !mixer) {
@@ -863,13 +784,6 @@ static void _dpu_crtc_blend_setup_mixer(struct drm_crtc *crtc,
}
}
- if (lm && lm->ops.setup_dim_layer) {
- cstate = to_dpu_crtc_state(crtc->state);
- for (i = 0; i < cstate->num_dim_layers; i++)
- _dpu_crtc_setup_dim_layer_cfg(crtc, dpu_crtc,
- mixer, &cstate->dim_layer[i]);
- }
-
_dpu_crtc_program_lm_output_roi(crtc);
}
@@ -911,11 +825,6 @@ static void _dpu_crtc_blend_setup(struct drm_crtc *crtc)
if (mixer[i].hw_ctl->ops.clear_all_blendstages)
mixer[i].hw_ctl->ops.clear_all_blendstages(
mixer[i].hw_ctl);
-
- /* clear dim_layer settings */
- lm = mixer[i].hw_lm;
- if (lm->ops.clear_dim_layer)
- lm->ops.clear_dim_layer(lm);
}
/* initialize stage cfg */
@@ -947,163 +856,6 @@ static void _dpu_crtc_blend_setup(struct drm_crtc *crtc)
}
/**
- * _dpu_crtc_setup_scaler3_lut - Set up scaler lut
- * LUTs are configured only once during boot
- * @dpu_crtc: Pointer to dpu crtc
- * @cstate: Pointer to dpu crtc state
- */
-static int _dpu_crtc_set_dest_scaler_lut(struct dpu_crtc *dpu_crtc,
- struct dpu_crtc_state *cstate, uint32_t lut_idx)
-{
- struct dpu_hw_scaler3_lut_cfg *cfg;
- u32 *lut_data = NULL;
- size_t len = 0;
- int ret = 0;
-
- if (!dpu_crtc || !cstate || !dpu_crtc->scl3_lut_cfg) {
- DPU_ERROR("invalid args\n");
- return -EINVAL;
- }
-
- if (dpu_crtc->scl3_lut_cfg->is_configured) {
- DPU_DEBUG("lut already configured\n");
- return 0;
- }
-
- lut_data = msm_property_get_blob(&dpu_crtc->property_info,
- &cstate->property_state, &len, lut_idx);
- if (!lut_data || !len) {
- DPU_ERROR("lut(%d): no data, len(%zu)\n", lut_idx, len);
- return -ENODATA;
- }
-
- cfg = dpu_crtc->scl3_lut_cfg;
-
- switch (lut_idx) {
- case CRTC_PROP_DEST_SCALER_LUT_ED:
- cfg->dir_lut = lut_data;
- cfg->dir_len = len;
- break;
- case CRTC_PROP_DEST_SCALER_LUT_CIR:
- cfg->cir_lut = lut_data;
- cfg->cir_len = len;
- break;
- case CRTC_PROP_DEST_SCALER_LUT_SEP:
- cfg->sep_lut = lut_data;
- cfg->sep_len = len;
- break;
- default:
- ret = -EINVAL;
- DPU_ERROR("invalid LUT index = %d", lut_idx);
- break;
- }
-
- if (cfg->dir_lut && cfg->cir_lut && cfg->sep_lut)
- cfg->is_configured = true;
-
- return ret;
-}
-
-/**
- * _dpu_crtc_dest_scaler_setup - Set up dest scaler block
- * @crtc: Pointer to drm crtc
- */
-static void _dpu_crtc_dest_scaler_setup(struct drm_crtc *crtc)
-{
- struct dpu_crtc *dpu_crtc;
- struct dpu_crtc_state *cstate;
- struct dpu_hw_mixer *hw_lm;
- struct dpu_hw_ctl *hw_ctl;
- struct dpu_hw_ds *hw_ds;
- struct dpu_hw_ds_cfg *cfg;
- struct dpu_kms *kms;
- u32 flush_mask = 0, op_mode = 0;
- u32 lm_idx = 0, num_mixers = 0;
- int i, count = 0;
-
- if (!crtc)
- return;
-
- dpu_crtc = to_dpu_crtc(crtc);
- cstate = to_dpu_crtc_state(crtc->state);
- kms = _dpu_crtc_get_kms(crtc);
- num_mixers = dpu_crtc->num_mixers;
-
- DPU_DEBUG("crtc%d\n", crtc->base.id);
-
- if (!cstate->ds_dirty) {
- DPU_DEBUG("no change in settings, skip commit\n");
- } else if (!kms || !kms->catalog) {
- DPU_ERROR("invalid parameters\n");
- } else if (!kms->catalog->mdp[0].has_dest_scaler) {
- DPU_DEBUG("dest scaler feature not supported\n");
- } else if (num_mixers > CRTC_DUAL_MIXERS) {
- DPU_ERROR("invalid number mixers: %d\n", num_mixers);
- } else if (!dpu_crtc->scl3_lut_cfg->is_configured) {
- DPU_DEBUG("no LUT data available\n");
- } else {
- count = cstate->num_ds_enabled ? cstate->num_ds : num_mixers;
-
- for (i = 0; i < count; i++) {
- cfg = &cstate->ds_cfg[i];
-
- if (!cfg->flags)
- continue;
-
- lm_idx = cfg->ndx;
- hw_lm = dpu_crtc->mixers[lm_idx].hw_lm;
- hw_ctl = dpu_crtc->mixers[lm_idx].hw_ctl;
- hw_ds = dpu_crtc->mixers[lm_idx].hw_ds;
-
- /* Setup op mode - Dual/single */
- if (cfg->flags & DPU_DRM_DESTSCALER_ENABLE)
- op_mode |= BIT(hw_ds->idx - DS_0);
-
- if ((i == count-1) && hw_ds->ops.setup_opmode) {
- op_mode |= (cstate->num_ds_enabled ==
- CRTC_DUAL_MIXERS) ?
- DPU_DS_OP_MODE_DUAL : 0;
- hw_ds->ops.setup_opmode(hw_ds, op_mode);
- DPU_EVT32(DRMID(crtc), op_mode);
- }
-
- /* Setup scaler */
- if ((cfg->flags & DPU_DRM_DESTSCALER_SCALE_UPDATE) ||
- (cfg->flags &
- DPU_DRM_DESTSCALER_ENHANCER_UPDATE)) {
- if (hw_ds->ops.setup_scaler)
- hw_ds->ops.setup_scaler(hw_ds,
- cfg->scl3_cfg,
- dpu_crtc->scl3_lut_cfg);
-
- /**
- * Clear the flags as the block doesn't have to
- * be programmed in each commit if no updates
- */
- cfg->flags &= ~DPU_DRM_DESTSCALER_SCALE_UPDATE;
- cfg->flags &=
- ~DPU_DRM_DESTSCALER_ENHANCER_UPDATE;
- }
-
- /*
- * Dest scaler shares the flush bit of the LM in control
- */
- if (cfg->set_lm_flush && hw_lm && hw_ctl &&
- hw_ctl->ops.get_bitmask_mixer) {
- flush_mask = hw_ctl->ops.get_bitmask_mixer(
- hw_ctl, hw_lm->idx);
- DPU_DEBUG("Set lm[%d] flush = %d",
- hw_lm->idx, flush_mask);
- hw_ctl->ops.update_pending_flush(hw_ctl,
- flush_mask);
- }
- cfg->set_lm_flush = false;
- }
- cstate->ds_dirty = false;
- }
-}
-
-/**
* _dpu_crtc_complete_flip - signal pending page_flip events
* Any pending vblank events are added to the vblank_event_list
* so that the next vblank interrupt shall signal them.
@@ -1361,448 +1113,6 @@ void dpu_crtc_complete_commit(struct drm_crtc *crtc,
DPU_EVT32_VERBOSE(DRMID(crtc));
}
-/* _dpu_crtc_set_idle_timeout - update idle timeout wait duration */
-static void _dpu_crtc_set_idle_timeout(struct drm_crtc *crtc, u64 val)
-{
- struct drm_encoder *encoder;
-
- if (!crtc) {
- DPU_ERROR("invalid crtc\n");
- return;
- }
-
- drm_for_each_encoder(encoder, crtc->dev) {
- if (encoder->crtc != crtc)
- continue;
-
- dpu_encoder_set_idle_timeout(encoder, (u32) val);
- }
-}
-
-/**
- * _dpu_crtc_set_dim_layer_v1 - copy dim layer settings from userspace
- * @cstate: Pointer to dpu crtc state
- * @user_ptr: User ptr for dpu_drm_dim_layer_v1 struct
- */
-static void _dpu_crtc_set_dim_layer_v1(struct dpu_crtc_state *cstate,
- void __user *usr_ptr)
-{
- struct dpu_drm_dim_layer_v1 dim_layer_v1;
- struct dpu_drm_dim_layer_cfg *user_cfg;
- struct dpu_hw_dim_layer *dim_layer;
- u32 count, i;
-
- if (!cstate) {
- DPU_ERROR("invalid cstate\n");
- return;
- }
- dim_layer = cstate->dim_layer;
-
- if (!usr_ptr) {
- DPU_DEBUG("dim_layer data removed\n");
- return;
- }
-
- if (copy_from_user(&dim_layer_v1, usr_ptr, sizeof(dim_layer_v1))) {
- DPU_ERROR("failed to copy dim_layer data\n");
- return;
- }
-
- count = dim_layer_v1.num_layers;
- if (count > DPU_MAX_DIM_LAYERS) {
- DPU_ERROR("invalid number of dim_layers:%d", count);
- return;
- }
-
- /* populate from user space */
- cstate->num_dim_layers = count;
- for (i = 0; i < count; i++) {
- user_cfg = &dim_layer_v1.layer_cfg[i];
-
- dim_layer[i].flags = user_cfg->flags;
- dim_layer[i].stage = user_cfg->stage + DPU_STAGE_0;
-
- dim_layer[i].rect.x = user_cfg->rect.x1;
- dim_layer[i].rect.y = user_cfg->rect.y1;
- dim_layer[i].rect.w = user_cfg->rect.x2 - user_cfg->rect.x1;
- dim_layer[i].rect.h = user_cfg->rect.y2 - user_cfg->rect.y1;
-
- dim_layer[i].color_fill = (struct dpu_mdss_color) {
- user_cfg->color_fill.color_0,
- user_cfg->color_fill.color_1,
- user_cfg->color_fill.color_2,
- user_cfg->color_fill.color_3,
- };
-
- DPU_DEBUG("dim_layer[%d] - flags:%d, stage:%d\n",
- i, dim_layer[i].flags, dim_layer[i].stage);
- DPU_DEBUG(" rect:{%d,%d,%d,%d}, color:{%d,%d,%d,%d}\n",
- dim_layer[i].rect.x, dim_layer[i].rect.y,
- dim_layer[i].rect.w, dim_layer[i].rect.h,
- dim_layer[i].color_fill.color_0,
- dim_layer[i].color_fill.color_1,
- dim_layer[i].color_fill.color_2,
- dim_layer[i].color_fill.color_3);
- }
-}
-
-/**
- * _dpu_crtc_dest_scaler_init - allocate memory for scaler lut
- * @dpu_crtc : Pointer to dpu crtc
- * @catalog : Pointer to mdss catalog info
- */
-static void _dpu_crtc_dest_scaler_init(struct dpu_crtc *dpu_crtc,
- struct dpu_mdss_cfg *catalog)
-{
- if (!dpu_crtc || !catalog)
- return;
-
- if (!catalog->mdp[0].has_dest_scaler) {
- DPU_DEBUG("dest scaler feature not supported\n");
- return;
- }
-
- dpu_crtc->scl3_lut_cfg = kzalloc(sizeof(struct dpu_hw_scaler3_lut_cfg),
- GFP_KERNEL);
- if (!dpu_crtc->scl3_lut_cfg)
- DPU_ERROR("failed to create scale LUT for dest scaler");
-}
-
-/**
- * _dpu_crtc_set_dest_scaler - copy dest scaler settings from userspace
- * @dpu_crtc : Pointer to dpu crtc
- * @cstate : Pointer to dpu crtc state
- * @usr_ptr: User ptr for dpu_drm_dest_scaler_data struct
- */
-static int _dpu_crtc_set_dest_scaler(struct dpu_crtc *dpu_crtc,
- struct dpu_crtc_state *cstate,
- void __user *usr_ptr)
-{
- struct dpu_drm_dest_scaler_data ds_data;
- struct dpu_drm_dest_scaler_cfg *ds_cfg_usr;
- struct dpu_drm_scaler_v2 scaler_v2;
- void __user *scaler_v2_usr;
- int i, count, ret = 0;
-
- if (!dpu_crtc || !cstate) {
- DPU_ERROR("invalid dpu_crtc/state\n");
- return -EINVAL;
- }
-
- DPU_DEBUG("crtc %s\n", dpu_crtc->name);
-
- cstate->num_ds = 0;
- cstate->ds_dirty = false;
- if (!usr_ptr) {
- DPU_DEBUG("ds data removed\n");
- return 0;
- }
-
- if (copy_from_user(&ds_data, usr_ptr, sizeof(ds_data))) {
- DPU_ERROR("failed to copy dest scaler data from user\n");
- return -EINVAL;
- }
-
- count = ds_data.num_dest_scaler;
- if (!dpu_crtc->num_mixers || count > dpu_crtc->num_mixers ||
- (count && (count != dpu_crtc->num_mixers) &&
- !(ds_data.ds_cfg[0].flags & DPU_DRM_DESTSCALER_PU_ENABLE))) {
- DPU_ERROR("invalid config:num ds(%d), mixers(%d),flags(%d)\n",
- count, dpu_crtc->num_mixers, ds_data.ds_cfg[0].flags);
- return -EINVAL;
- }
-
- /* Populate from user space */
- for (i = 0; i < count; i++) {
- ds_cfg_usr = &ds_data.ds_cfg[i];
-
- cstate->ds_cfg[i].ndx = ds_cfg_usr->index;
- cstate->ds_cfg[i].flags = ds_cfg_usr->flags;
- cstate->ds_cfg[i].lm_width = ds_cfg_usr->lm_width;
- cstate->ds_cfg[i].lm_height = ds_cfg_usr->lm_height;
- cstate->ds_cfg[i].scl3_cfg = NULL;
-
- if (ds_cfg_usr->scaler_cfg) {
- scaler_v2_usr =
- (void __user *)((uintptr_t)ds_cfg_usr->scaler_cfg);
-
- memset(&scaler_v2, 0, sizeof(scaler_v2));
-
- cstate->ds_cfg[i].scl3_cfg =
- kzalloc(sizeof(struct dpu_hw_scaler3_cfg),
- GFP_KERNEL);
-
- if (!cstate->ds_cfg[i].scl3_cfg) {
- ret = -ENOMEM;
- goto err;
- }
-
- if (copy_from_user(&scaler_v2, scaler_v2_usr,
- sizeof(scaler_v2))) {
- DPU_ERROR("scale data:copy from user failed\n");
- ret = -EINVAL;
- goto err;
- }
-
- dpu_set_scaler_v2(cstate->ds_cfg[i].scl3_cfg,
- &scaler_v2);
-
- DPU_DEBUG("en(%d)dir(%d)de(%d) src(%dx%d) dst(%dx%d)\n",
- scaler_v2.enable, scaler_v2.dir_en,
- scaler_v2.de.enable, scaler_v2.src_width[0],
- scaler_v2.src_height[0], scaler_v2.dst_width,
- scaler_v2.dst_height);
- DPU_EVT32_VERBOSE(DRMID(&dpu_crtc->base),
- scaler_v2.enable, scaler_v2.dir_en,
- scaler_v2.de.enable, scaler_v2.src_width[0],
- scaler_v2.src_height[0], scaler_v2.dst_width,
- scaler_v2.dst_height);
- }
-
- DPU_DEBUG("ds cfg[%d]-ndx(%d) flags(%d) lm(%dx%d)\n",
- i, ds_cfg_usr->index, ds_cfg_usr->flags,
- ds_cfg_usr->lm_width, ds_cfg_usr->lm_height);
- DPU_EVT32_VERBOSE(DRMID(&dpu_crtc->base), i, ds_cfg_usr->index,
- ds_cfg_usr->flags, ds_cfg_usr->lm_width,
- ds_cfg_usr->lm_height);
- }
-
- cstate->num_ds = count;
- cstate->ds_dirty = true;
- return 0;
-
-err:
- for (; i >= 0; i--)
- kfree(cstate->ds_cfg[i].scl3_cfg);
-
- return ret;
-}
-
-/**
- * _dpu_crtc_check_dest_scaler_data - validate the dest scaler data
- * @crtc : Pointer to drm crtc
- * @state : Pointer to drm crtc state
- */
-static int _dpu_crtc_check_dest_scaler_data(struct drm_crtc *crtc,
- struct drm_crtc_state *state)
-{
- struct dpu_crtc *dpu_crtc;
- struct dpu_crtc_state *cstate;
- struct drm_display_mode *mode;
- struct dpu_kms *kms;
- struct dpu_hw_ds *hw_ds;
- struct dpu_hw_ds_cfg *cfg;
- u32 i, ret = 0, lm_idx;
- u32 num_ds_enable = 0;
- u32 max_in_width = 0, max_out_width = 0;
- u32 prev_lm_width = 0, prev_lm_height = 0;
-
- if (!crtc || !state)
- return -EINVAL;
-
- dpu_crtc = to_dpu_crtc(crtc);
- cstate = to_dpu_crtc_state(state);
- kms = _dpu_crtc_get_kms(crtc);
- mode = &state->adjusted_mode;
-
- DPU_DEBUG("crtc%d\n", crtc->base.id);
-
- if (!cstate->ds_dirty && !cstate->num_ds_enabled) {
- DPU_DEBUG("dest scaler property not set, skip validation\n");
- return 0;
- }
-
- if (!kms || !kms->catalog) {
- DPU_ERROR("invalid parameters\n");
- return -EINVAL;
- }
-
- if (!kms->catalog->mdp[0].has_dest_scaler) {
- DPU_DEBUG("dest scaler feature not supported\n");
- return 0;
- }
-
- if (!dpu_crtc->num_mixers) {
- DPU_ERROR("mixers not allocated\n");
- return -EINVAL;
- }
-
- /**
- * Check if sufficient hw resources are
- * available as per target caps & topology
- */
- if (dpu_crtc->num_mixers > CRTC_DUAL_MIXERS) {
- DPU_ERROR("invalid config: mixers(%d) max(%d)\n",
- dpu_crtc->num_mixers, CRTC_DUAL_MIXERS);
- ret = -EINVAL;
- goto err;
- }
-
- for (i = 0; i < dpu_crtc->num_mixers; i++) {
- if (!dpu_crtc->mixers[i].hw_lm || !dpu_crtc->mixers[i].hw_ds) {
- DPU_ERROR("insufficient HW resources allocated\n");
- ret = -EINVAL;
- goto err;
- }
- }
-
- /**
- * Check if DS needs to be enabled or disabled
- * In case of enable, validate the data
- */
- if (!cstate->ds_dirty || !cstate->num_ds ||
- !(cstate->ds_cfg[0].flags & DPU_DRM_DESTSCALER_ENABLE)) {
- DPU_DEBUG("disable dest scaler,dirty(%d)num(%d)flags(%d)\n",
- cstate->ds_dirty, cstate->num_ds,
- cstate->ds_cfg[0].flags);
- goto disable;
- }
-
- /**
- * No of dest scalers shouldn't exceed hw ds block count and
- * also, match the num of mixers unless it is partial update
- * left only/right only use case - currently PU + DS is not supported
- */
- if (cstate->num_ds > kms->catalog->ds_count ||
- ((cstate->num_ds != dpu_crtc->num_mixers) &&
- !(cstate->ds_cfg[0].flags & DPU_DRM_DESTSCALER_PU_ENABLE))) {
- DPU_ERROR("invalid cfg: num_ds(%d), hw_ds_cnt(%d) flags(%d)\n",
- cstate->num_ds, kms->catalog->ds_count,
- cstate->ds_cfg[0].flags);
- ret = -EINVAL;
- goto err;
- }
-
- /* Validate the DS data */
- for (i = 0; i < cstate->num_ds; i++) {
- cfg = &cstate->ds_cfg[i];
- lm_idx = cfg->ndx;
-
- /**
- * Validate against topology
- * No of dest scalers should match the num of mixers
- * unless it is partial update left only/right only use case
- */
- if (lm_idx >= dpu_crtc->num_mixers || (i != lm_idx &&
- !(cfg->flags & DPU_DRM_DESTSCALER_PU_ENABLE))) {
- DPU_ERROR("invalid user data(%d):idx(%d), flags(%d)\n",
- i, lm_idx, cfg->flags);
- ret = -EINVAL;
- goto err;
- }
-
- hw_ds = dpu_crtc->mixers[lm_idx].hw_ds;
-
- if (!max_in_width && !max_out_width) {
- max_in_width = hw_ds->scl->top->maxinputwidth;
- max_out_width = hw_ds->scl->top->maxoutputwidth;
-
- if (cstate->num_ds == CRTC_DUAL_MIXERS)
- max_in_width -= DPU_DS_OVERFETCH_SIZE;
-
- DPU_DEBUG("max DS width [%d,%d] for num_ds = %d\n",
- max_in_width, max_out_width, cstate->num_ds);
- }
-
- /* Check LM width and height */
- if (cfg->lm_width > (mode->hdisplay/dpu_crtc->num_mixers) ||
- cfg->lm_height > mode->vdisplay ||
- !cfg->lm_width || !cfg->lm_height) {
- DPU_ERROR("invalid lm size[%d,%d] display [%d,%d]\n",
- cfg->lm_width,
- cfg->lm_height,
- mode->hdisplay/dpu_crtc->num_mixers,
- mode->vdisplay);
- ret = -E2BIG;
- goto err;
- }
-
- if (!prev_lm_width && !prev_lm_height) {
- prev_lm_width = cfg->lm_width;
- prev_lm_height = cfg->lm_height;
- } else {
- if (cfg->lm_width != prev_lm_width ||
- cfg->lm_height != prev_lm_height) {
- DPU_ERROR("lm size:left[%d,%d], right[%d %d]\n",
- cfg->lm_width, cfg->lm_height,
- prev_lm_width, prev_lm_height);
- ret = -EINVAL;
- goto err;
- }
- }
-
- /* Check scaler data */
- if (cfg->flags & DPU_DRM_DESTSCALER_SCALE_UPDATE ||
- cfg->flags & DPU_DRM_DESTSCALER_ENHANCER_UPDATE) {
- if (!cfg->scl3_cfg) {
- ret = -EINVAL;
- DPU_ERROR("null scale data\n");
- goto err;
- }
- if (cfg->scl3_cfg->src_width[0] > max_in_width ||
- cfg->scl3_cfg->dst_width > max_out_width ||
- !cfg->scl3_cfg->src_width[0] ||
- !cfg->scl3_cfg->dst_width) {
- DPU_ERROR("scale width(%d %d) for ds-%d:\n",
- cfg->scl3_cfg->src_width[0],
- cfg->scl3_cfg->dst_width,
- hw_ds->idx - DS_0);
- DPU_ERROR("scale_en = %d, DE_en =%d\n",
- cfg->scl3_cfg->enable,
- cfg->scl3_cfg->de.enable);
-
- cfg->flags &=
- ~DPU_DRM_DESTSCALER_SCALE_UPDATE;
- cfg->flags &=
- ~DPU_DRM_DESTSCALER_ENHANCER_UPDATE;
-
- ret = -EINVAL;
- goto err;
- }
- }
-
- if (cfg->flags & DPU_DRM_DESTSCALER_ENABLE)
- num_ds_enable++;
-
- /**
- * Validation successful, indicator for flush to be issued
- */
- cfg->set_lm_flush = true;
-
- DPU_DEBUG("ds[%d]: flags = 0x%X\n",
- hw_ds->idx - DS_0, cfg->flags);
- }
-
-disable:
- DPU_DEBUG("dest scaler enable status, old = %d, new = %d",
- cstate->num_ds_enabled, num_ds_enable);
- DPU_EVT32(DRMID(crtc), cstate->num_ds_enabled, num_ds_enable,
- cstate->ds_dirty);
-
- if (cstate->num_ds_enabled != num_ds_enable) {
- /* Disabling destination scaler */
- if (!num_ds_enable) {
- for (i = 0; i < dpu_crtc->num_mixers; i++) {
- cfg = &cstate->ds_cfg[i];
- cfg->ndx = i;
- /* Update scaler settings in disable case */
- cfg->flags = DPU_DRM_DESTSCALER_SCALE_UPDATE;
- cfg->scl3_cfg->enable = 0;
- cfg->scl3_cfg->de.enable = 0;
- cfg->set_lm_flush = true;
- }
- }
- cstate->num_ds_enabled = num_ds_enable;
- cstate->ds_dirty = true;
- }
-
- return 0;
-
-err:
- cstate->ds_dirty = false;
- return ret;
-}
-
static void _dpu_crtc_setup_mixer_for_encoder(
struct drm_crtc *crtc,
struct drm_encoder *enc)
@@ -1813,11 +1123,10 @@ static void _dpu_crtc_setup_mixer_for_encoder(
struct dpu_crtc_mixer *mixer;
struct dpu_hw_ctl *last_valid_ctl = NULL;
int i;
- struct dpu_rm_hw_iter lm_iter, ctl_iter, ds_iter;
+ struct dpu_rm_hw_iter lm_iter, ctl_iter;
dpu_rm_init_hw_iter(&lm_iter, enc->base.id, DPU_HW_BLK_LM);
dpu_rm_init_hw_iter(&ctl_iter, enc->base.id, DPU_HW_BLK_CTL);
- dpu_rm_init_hw_iter(&ds_iter, enc->base.id, DPU_HW_BLK_DS);
/* Set up all the mixers and ctls reserved by this encoder */
for (i = dpu_crtc->num_mixers; i < ARRAY_SIZE(dpu_crtc->mixers); i++) {
@@ -1844,10 +1153,6 @@ static void _dpu_crtc_setup_mixer_for_encoder(
return;
}
- /* DS may be null */
- (void) dpu_rm_get_hw(rm, &ds_iter);
- mixer->hw_ds = (struct dpu_hw_ds *)ds_iter.hw;
-
mixer->encoder = enc;
dpu_crtc->num_mixers++;
@@ -1855,9 +1160,6 @@ static void _dpu_crtc_setup_mixer_for_encoder(
i, mixer->hw_lm->idx - LM_0);
DPU_DEBUG("setup mixer %d: ctl %d\n",
i, mixer->hw_ctl->idx - CTL_0);
- if (mixer->hw_ds)
- DPU_DEBUG("setup mixer %d: ds %d\n",
- i, mixer->hw_ds->idx - DS_0);
}
}
@@ -1973,7 +1275,6 @@ static void dpu_crtc_atomic_begin(struct drm_crtc *crtc,
return;
_dpu_crtc_blend_setup(crtc);
- _dpu_crtc_dest_scaler_setup(crtc);
/*
* PP_DONE irq is only used by command mode for now.
@@ -2672,13 +1973,6 @@ static int dpu_crtc_atomic_check(struct drm_crtc *crtc,
memset(pipe_staged, 0, sizeof(pipe_staged));
- rc = _dpu_crtc_check_dest_scaler_data(crtc, state);
- if (rc) {
- DPU_ERROR("crtc%d failed dest scaler check %d\n",
- crtc->base.id, rc);
- goto end;
- }
-
mixer_width = dpu_crtc_get_mixer_width(dpu_crtc, cstate, mode);
_dpu_crtc_setup_lm_bounds(crtc, state);
@@ -2699,19 +1993,6 @@ static int dpu_crtc_atomic_check(struct drm_crtc *crtc,
pstates[cnt].stage = pstate->normalized_zpos;
pstates[cnt].pipe_id = dpu_plane_pipe(plane);
- /* check dim layer stage with every plane */
- for (i = 0; i < cstate->num_dim_layers; i++) {
- if (cstate->dim_layer[i].stage
- == (pstates[cnt].stage + DPU_STAGE_0)) {
- DPU_ERROR(
- "plane:%d/dim_layer:%i-same stage:%d\n",
- plane->base.id, i,
- cstate->dim_layer[i].stage);
- rc = -EINVAL;
- goto end;
- }
- }
-
if (pipe_staged[pstates[cnt].pipe_id]) {
multirect_plane[multirect_count].r0 =
pipe_staged[pstates[cnt].pipe_id];
@@ -2947,52 +2228,11 @@ static void dpu_crtc_install_properties(struct drm_crtc *crtc,
return;
}
- /* range properties */
- msm_property_install_range(&dpu_crtc->property_info,
- "core_clk", 0x0, 0, U64_MAX,
- dpu_kms->perf.max_core_clk_rate,
- CRTC_PROP_CORE_CLK);
- msm_property_install_range(&dpu_crtc->property_info,
- "core_ab", 0x0, 0, U64_MAX,
- catalog->perf.max_bw_high * 1000ULL,
- CRTC_PROP_CORE_AB);
- msm_property_install_range(&dpu_crtc->property_info,
- "core_ib", 0x0, 0, U64_MAX,
- catalog->perf.max_bw_high * 1000ULL,
- CRTC_PROP_CORE_IB);
- msm_property_install_range(&dpu_crtc->property_info,
- "llcc_ab", 0x0, 0, U64_MAX,
- catalog->perf.max_bw_high * 1000ULL,
- CRTC_PROP_LLCC_AB);
- msm_property_install_range(&dpu_crtc->property_info,
- "llcc_ib", 0x0, 0, U64_MAX,
- catalog->perf.max_bw_high * 1000ULL,
- CRTC_PROP_LLCC_IB);
- msm_property_install_range(&dpu_crtc->property_info,
- "dram_ab", 0x0, 0, U64_MAX,
- catalog->perf.max_bw_high * 1000ULL,
- CRTC_PROP_DRAM_AB);
- msm_property_install_range(&dpu_crtc->property_info,
- "dram_ib", 0x0, 0, U64_MAX,
- catalog->perf.max_bw_high * 1000ULL,
- CRTC_PROP_DRAM_IB);
-
- msm_property_install_range(&dpu_crtc->property_info,
- "idle_timeout", IDLE_TIMEOUT, 0, U64_MAX, 0,
- CRTC_PROP_IDLE_TIMEOUT);
-
msm_property_install_blob(&dpu_crtc->property_info, "capabilities",
DRM_MODE_PROP_IMMUTABLE, CRTC_PROP_INFO);
dpu_kms_info_reset(info);
- if (catalog->caps->has_dim_layer) {
- msm_property_install_volatile_range(&dpu_crtc->property_info,
- "dim_layer_v1", 0x0, 0, ~0, 0, CRTC_PROP_DIM_LAYER_V1);
- dpu_kms_info_add_keyint(info, "dim_layer_v1_max_layers",
- DPU_MAX_DIM_LAYERS);
- }
-
dpu_kms_info_add_keyint(info, "hw_version", catalog->hwversion);
dpu_kms_info_add_keyint(info, "max_linewidth",
catalog->caps->max_mixer_width);
@@ -3012,39 +2252,6 @@ static void dpu_crtc_install_properties(struct drm_crtc *crtc,
"smart_dma_rev", "smart_dma_v2");
}
- if (catalog->mdp[0].has_dest_scaler) {
- dpu_kms_info_add_keyint(info, "has_dest_scaler",
- catalog->mdp[0].has_dest_scaler);
- dpu_kms_info_add_keyint(info, "dest_scaler_count",
- catalog->ds_count);
-
- if (catalog->ds[0].top) {
- dpu_kms_info_add_keyint(info,
- "max_dest_scaler_input_width",
- catalog->ds[0].top->maxinputwidth);
- dpu_kms_info_add_keyint(info,
- "max_dest_scaler_output_width",
- catalog->ds[0].top->maxinputwidth);
- dpu_kms_info_add_keyint(info, "max_dest_scale_up",
- catalog->ds[0].top->maxupscale);
- }
-
- if (catalog->ds[0].features & BIT(DPU_SSPP_SCALER_QSEED3)) {
- msm_property_install_volatile_range(
- &dpu_crtc->property_info, "dest_scaler",
- 0x0, 0, ~0, 0, CRTC_PROP_DEST_SCALER);
- msm_property_install_blob(&dpu_crtc->property_info,
- "ds_lut_ed", 0,
- CRTC_PROP_DEST_SCALER_LUT_ED);
- msm_property_install_blob(&dpu_crtc->property_info,
- "ds_lut_cir", 0,
- CRTC_PROP_DEST_SCALER_LUT_CIR);
- msm_property_install_blob(&dpu_crtc->property_info,
- "ds_lut_sep", 0,
- CRTC_PROP_DEST_SCALER_LUT_SEP);
- }
- }
-
dpu_kms_info_add_keyint(info, "has_src_split",
catalog->caps->has_src_split);
if (catalog->perf.max_bw_low)
@@ -3113,7 +2320,7 @@ static int dpu_crtc_atomic_set_property(struct drm_crtc *crtc,
{
struct dpu_crtc *dpu_crtc;
struct dpu_crtc_state *cstate;
- int idx, ret = -EINVAL;
+ int ret = -EINVAL;
if (!crtc || !state || !property) {
DPU_ERROR("invalid argument(s)\n");
@@ -3122,45 +2329,8 @@ static int dpu_crtc_atomic_set_property(struct drm_crtc *crtc,
cstate = to_dpu_crtc_state(state);
ret = msm_property_atomic_set(&dpu_crtc->property_info,
&cstate->property_state, property, val);
- if (!ret) {
- idx = msm_property_index(&dpu_crtc->property_info,
- property);
- switch (idx) {
- case CRTC_PROP_DIM_LAYER_V1:
- _dpu_crtc_set_dim_layer_v1(cstate,
- u64_to_user_ptr(val));
- break;
- case CRTC_PROP_DEST_SCALER:
- ret = _dpu_crtc_set_dest_scaler(dpu_crtc,
- cstate, u64_to_user_ptr(val));
- break;
- case CRTC_PROP_DEST_SCALER_LUT_ED:
- case CRTC_PROP_DEST_SCALER_LUT_CIR:
- case CRTC_PROP_DEST_SCALER_LUT_SEP:
- ret = _dpu_crtc_set_dest_scaler_lut(dpu_crtc,
- cstate, idx);
- break;
- case CRTC_PROP_CORE_CLK:
- case CRTC_PROP_CORE_AB:
- case CRTC_PROP_CORE_IB:
- cstate->bw_control = true;
- break;
- case CRTC_PROP_LLCC_AB:
- case CRTC_PROP_LLCC_IB:
- case CRTC_PROP_DRAM_AB:
- case CRTC_PROP_DRAM_IB:
- cstate->bw_control = true;
- cstate->bw_split_vote = true;
- break;
- case CRTC_PROP_IDLE_TIMEOUT:
- _dpu_crtc_set_idle_timeout(crtc, val);
- default:
- /* nothing to do */
- break;
- }
- } else {
+ if (ret)
DRM_ERROR("failed to set the property\n");
- }
DPU_DEBUG("crtc%d %s[%d] <= 0x%llx ret=%d\n", crtc->base.id,
property->name, property->base.id, val, ret);
@@ -3276,23 +2446,6 @@ static int _dpu_debugfs_status_show(struct seq_file *s, void *data)
seq_puts(s, "\n");
- for (i = 0; i < cstate->num_dim_layers; i++) {
- struct dpu_hw_dim_layer *dim_layer = &cstate->dim_layer[i];
-
- seq_printf(s, "\tdim_layer:%d] stage:%d flags:%d\n",
- i, dim_layer->stage, dim_layer->flags);
- seq_printf(s, "\tdst_x:%d dst_y:%d dst_w:%d dst_h:%d\n",
- dim_layer->rect.x, dim_layer->rect.y,
- dim_layer->rect.w, dim_layer->rect.h);
- seq_printf(s,
- "\tcolor_0:%d color_1:%d color_2:%d color_3:%d\n",
- dim_layer->color_fill.color_0,
- dim_layer->color_fill.color_1,
- dim_layer->color_fill.color_2,
- dim_layer->color_fill.color_3);
- seq_puts(s, "\n");
- }
-
drm_atomic_crtc_for_each_plane(plane, crtc) {
pstate = to_dpu_plane_state(plane->state);
state = plane->state;
@@ -3779,9 +2932,6 @@ struct drm_crtc *dpu_crtc_init(struct drm_device *dev, struct drm_plane *plane)
dpu_crtc_install_properties(crtc, kms->catalog);
- /* Init dest scaler */
- _dpu_crtc_dest_scaler_init(dpu_crtc, kms->catalog);
-
DPU_DEBUG("%s: successfully initialized crtc\n", dpu_crtc->name);
return crtc;
}
diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.h b/drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.h
index 5f380b8..6628eb3 100644
--- a/drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.h
+++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.h
@@ -26,7 +26,6 @@
#include "dpu_kms.h"
#include "dpu_core_perf.h"
#include "dpu_hw_blk.h"
-#include "dpu_hw_ds.h"
#define DPU_CRTC_NAME_SIZE 12
@@ -87,7 +86,6 @@ struct dpu_crtc_smmu_state_data {
* struct dpu_crtc_mixer: stores the map for each virtual pipeline in the CRTC
* @hw_lm: LM HW Driver context
* @hw_ctl: CTL Path HW driver context
- * @hw_ds: DS HW driver context
* @encoder: Encoder attached to this lm & ctl
* @mixer_op_mode: mixer blending operation mode
* @flush_mask: mixer flush mask for ctl, mixer and pipe
@@ -95,7 +93,6 @@ struct dpu_crtc_smmu_state_data {
struct dpu_crtc_mixer {
struct dpu_hw_mixer *hw_lm;
struct dpu_hw_ctl *hw_ctl;
- struct dpu_hw_ds *hw_ds;
struct drm_encoder *encoder;
u32 mixer_op_mode;
u32 flush_mask;
@@ -314,12 +311,6 @@ struct dpu_crtc_respool {
* @property_state: Local storage for msm_prop properties
* @property_values: Current crtc property values
* @input_fence_timeout_ns : Cached input fence timeout, in ns
- * @num_dim_layers: Number of dim layers
- * @dim_layer: Dim layer configs
- * @num_ds: Number of destination scalers to be configured
- * @num_ds_enabled: Number of destination scalers enabled
- * @ds_dirty: Boolean to indicate if dirty or not
- * @ds_cfg: Destination scaler config
* @new_perf: new performance state being requested
*/
struct dpu_crtc_state {
@@ -336,12 +327,6 @@ struct dpu_crtc_state {
struct msm_property_state property_state;
struct msm_property_value property_values[CRTC_PROP_COUNT];
uint64_t input_fence_timeout_ns;
- uint32_t num_dim_layers;
- struct dpu_hw_dim_layer dim_layer[DPU_MAX_DIM_LAYERS];
- uint32_t num_ds;
- uint32_t num_ds_enabled;
- bool ds_dirty;
- struct dpu_hw_ds_cfg ds_cfg[DPU_MAX_DS_COUNT];
struct dpu_core_perf_params new_perf;
struct dpu_crtc_respool rp;
@@ -362,7 +347,6 @@ struct dpu_crtc_state {
/**
* dpu_crtc_get_mixer_width - get the mixer width
* Mixer width will be same as panel width(/2 for split)
- * unless destination scaler feature is enabled
*/
static inline int dpu_crtc_get_mixer_width(struct dpu_crtc *dpu_crtc,
struct dpu_crtc_state *cstate, struct drm_display_mode *mode)
@@ -372,10 +356,7 @@ static inline int dpu_crtc_get_mixer_width(struct dpu_crtc *dpu_crtc,
if (!dpu_crtc || !cstate || !mode)
return 0;
- if (cstate->num_ds_enabled)
- mixer_width = cstate->ds_cfg[0].lm_width;
- else
- mixer_width = (dpu_crtc->num_mixers == CRTC_DUAL_MIXERS ?
+ mixer_width = (dpu_crtc->num_mixers == CRTC_DUAL_MIXERS ?
mode->hdisplay / CRTC_DUAL_MIXERS : mode->hdisplay);
return mixer_width;
@@ -383,8 +364,7 @@ static inline int dpu_crtc_get_mixer_width(struct dpu_crtc *dpu_crtc,
/**
* dpu_crtc_get_mixer_height - get the mixer height
- * Mixer height will be same as panel height unless
- * destination scaler feature is enabled
+ * Mixer height will be same as panel height
*/
static inline int dpu_crtc_get_mixer_height(struct dpu_crtc *dpu_crtc,
struct dpu_crtc_state *cstate, struct drm_display_mode *mode)
@@ -392,8 +372,7 @@ static inline int dpu_crtc_get_mixer_height(struct dpu_crtc *dpu_crtc,
if (!dpu_crtc || !cstate || !mode)
return 0;
- return (cstate->num_ds_enabled ?
- cstate->ds_cfg[0].lm_height : mode->vdisplay);
+ return mode->vdisplay;
}
/**
diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_encoder.c b/drivers/gpu/drm/msm/disp/dpu1/dpu_encoder.c
index 77d3571..62660e0 100644
--- a/drivers/gpu/drm/msm/disp/dpu1/dpu_encoder.c
+++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_encoder.c
@@ -230,18 +230,6 @@ struct dpu_encoder_virt {
};
#define to_dpu_encoder_virt(x) container_of(x, struct dpu_encoder_virt, base)
-
-void dpu_encoder_set_idle_timeout(struct drm_encoder *drm_enc, u32 idle_timeout)
-{
- struct dpu_encoder_virt *dpu_enc;
-
- if (!drm_enc)
- return;
-
- dpu_enc = to_dpu_encoder_virt(drm_enc);
- dpu_enc->idle_timeout = idle_timeout;
-}
-
static inline int _dpu_encoder_power_enable(struct dpu_encoder_virt *dpu_enc,
bool enable)
{
diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_ds.c b/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_ds.c
deleted file mode 100644
index fad19fb..0000000
--- a/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_ds.c
+++ /dev/null
@@ -1,149 +0,0 @@
-/* Copyright (c) 2017-2018, The Linux Foundation. All rights reserved.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 and
- * only version 2 as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- */
-
-#include "dpu_hw_ds.h"
-#include "dpu_formats.h"
-#include "dpu_dbg.h"
-#include "dpu_kms.h"
-
-/* Destination scaler TOP registers */
-#define DEST_SCALER_OP_MODE 0x00
-#define DEST_SCALER_HW_VERSION 0x10
-
-static void dpu_hw_ds_setup_opmode(struct dpu_hw_ds *hw_ds,
- u32 op_mode)
-{
- struct dpu_hw_blk_reg_map *hw = &hw_ds->hw;
-
- DPU_REG_WRITE(hw, DEST_SCALER_OP_MODE, op_mode);
-}
-
-static void dpu_hw_ds_setup_scaler3(struct dpu_hw_ds *hw_ds,
- void *scaler_cfg, void *scaler_lut_cfg)
-{
- struct dpu_hw_scaler3_cfg *scl3_cfg = scaler_cfg;
- struct dpu_hw_scaler3_lut_cfg *scl3_lut_cfg = scaler_lut_cfg;
-
- if (!hw_ds || !hw_ds->scl || !scl3_cfg || !scl3_lut_cfg)
- return;
-
- /*
- * copy LUT values to scaler structure
- */
- if (scl3_lut_cfg->is_configured) {
- scl3_cfg->dir_lut = scl3_lut_cfg->dir_lut;
- scl3_cfg->dir_len = scl3_lut_cfg->dir_len;
- scl3_cfg->cir_lut = scl3_lut_cfg->cir_lut;
- scl3_cfg->cir_len = scl3_lut_cfg->cir_len;
- scl3_cfg->sep_lut = scl3_lut_cfg->sep_lut;
- scl3_cfg->sep_len = scl3_lut_cfg->sep_len;
- }
-
- dpu_hw_setup_scaler3(&hw_ds->hw, scl3_cfg,
- hw_ds->scl->base,
- hw_ds->scl->version,
- dpu_get_dpu_format(DRM_FORMAT_XBGR2101010));
-}
-
-static void _setup_ds_ops(struct dpu_hw_ds_ops *ops, unsigned long features)
-{
- ops->setup_opmode = dpu_hw_ds_setup_opmode;
-
- if (test_bit(DPU_SSPP_SCALER_QSEED3, &features))
- ops->setup_scaler = dpu_hw_ds_setup_scaler3;
-}
-
-static struct dpu_ds_cfg *_ds_offset(enum dpu_ds ds,
- struct dpu_mdss_cfg *m,
- void __iomem *addr,
- struct dpu_hw_blk_reg_map *b)
-{
- int i;
-
- if (!m || !addr || !b)
- return ERR_PTR(-EINVAL);
-
- for (i = 0; i < m->ds_count; i++) {
- if ((ds == m->ds[i].id) &&
- (m->ds[i].top)) {
- b->base_off = addr;
- b->blk_off = m->ds[i].top->base;
- b->length = m->ds[i].top->len;
- b->hwversion = m->hwversion;
- b->log_mask = DPU_DBG_MASK_DS;
- return &m->ds[i];
- }
- }
-
- return ERR_PTR(-EINVAL);
-}
-
-static struct dpu_hw_blk_ops dpu_hw_ops = {
- .start = NULL,
- .stop = NULL,
-};
-
-struct dpu_hw_ds *dpu_hw_ds_init(enum dpu_ds idx,
- void __iomem *addr,
- struct dpu_mdss_cfg *m)
-{
- struct dpu_hw_ds *hw_ds;
- struct dpu_ds_cfg *cfg;
- int rc;
-
- if (!addr || !m)
- return ERR_PTR(-EINVAL);
-
- hw_ds = kzalloc(sizeof(*hw_ds), GFP_KERNEL);
- if (!hw_ds)
- return ERR_PTR(-ENOMEM);
-
- cfg = _ds_offset(idx, m, addr, &hw_ds->hw);
- if (IS_ERR_OR_NULL(cfg)) {
- DPU_ERROR("failed to get ds cfg\n");
- kfree(hw_ds);
- return ERR_PTR(-EINVAL);
- }
-
- /* Assign ops */
- hw_ds->idx = idx;
- hw_ds->scl = cfg;
- _setup_ds_ops(&hw_ds->ops, hw_ds->scl->features);
-
- rc = dpu_hw_blk_init(&hw_ds->base, DPU_HW_BLK_DS, idx, &dpu_hw_ops);
- if (rc) {
- DPU_ERROR("failed to init hw blk %d\n", rc);
- goto blk_init_error;
- }
-
- if (cfg->len) {
- dpu_dbg_reg_register_dump_range(DPU_DBG_NAME, cfg->name,
- hw_ds->hw.blk_off + cfg->base,
- hw_ds->hw.blk_off + cfg->base + cfg->len,
- hw_ds->hw.xin_id);
- }
-
- return hw_ds;
-
-blk_init_error:
- kzfree(hw_ds);
-
- return ERR_PTR(rc);
-
-}
-
-void dpu_hw_ds_destroy(struct dpu_hw_ds *hw_ds)
-{
- if (hw_ds)
- dpu_hw_blk_destroy(&hw_ds->base);
- kfree(hw_ds);
-}
diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_ds.h b/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_ds.h
deleted file mode 100644
index 2455920..0000000
--- a/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_ds.h
+++ /dev/null
@@ -1,111 +0,0 @@
-/* Copyright (c) 2017-2018, The Linux Foundation. All rights reserved.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 and
- * only version 2 as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- */
-
-#ifndef _DPU_HW_DS_H
-#define _DPU_HW_DS_H
-
-#include "dpu_hw_mdss.h"
-#include "dpu_hw_util.h"
-#include "dpu_hw_catalog.h"
-#include "dpu_hw_blk.h"
-
-struct dpu_hw_ds;
-
-/* Destination Scaler DUAL mode overfetch pixel count */
-#define DPU_DS_OVERFETCH_SIZE 5
-
-/* Destination scaler DUAL mode operation bit */
-#define DPU_DS_OP_MODE_DUAL BIT(16)
-
-/* struct dpu_hw_ds_cfg - destination scaler config
- * @ndx : DS selection index
- * @flags : Flag to switch between mode for DS
- * @lm_width : Layer mixer width configuration
- * @lm_heigh : Layer mixer height configuration
- * @set_lm_flush : LM flush bit
- * @scl3_cfg : Pointer to dpu_hw_scaler3_cfg.
- */
-struct dpu_hw_ds_cfg {
- u32 ndx;
- int flags;
- u32 lm_width;
- u32 lm_height;
- bool set_lm_flush;
- struct dpu_hw_scaler3_cfg *scl3_cfg;
-};
-
-/**
- * struct dpu_hw_ds_ops - interface to the destination scaler
- * hardware driver functions
- * Caller must call the init function to get the ds context for each ds
- * Assumption is these functions will be called after clocks are enabled
- */
-struct dpu_hw_ds_ops {
- /**
- * setup_opmode - destination scaler op mode setup
- * @hw_ds : Pointer to ds context
- * @op_mode : Op mode configuration
- */
- void (*setup_opmode)(struct dpu_hw_ds *hw_ds,
- u32 op_mode);
-
- /**
- * setup_scaler - destination scaler block setup
- * @hw_ds : Pointer to ds context
- * @scaler_cfg : Pointer to scaler data
- * @scaler_lut_cfg : Pointer to scaler lut
- */
- void (*setup_scaler)(struct dpu_hw_ds *hw_ds,
- void *scaler_cfg,
- void *scaler_lut_cfg);
-
-};
-
-/**
- * struct dpu_hw_ds - destination scaler description
- * @base : Hardware block base structure
- * @hw : Block hardware details
- * @idx : Destination scaler index
- * @scl : Pointer to
- * - scaler offset relative to top offset
- * - capabilities
- * @ops : Pointer to operations for this DS
- */
-struct dpu_hw_ds {
- struct dpu_hw_blk base;
- struct dpu_hw_blk_reg_map hw;
- enum dpu_ds idx;
- const struct dpu_ds_cfg *scl;
- struct dpu_hw_ds_ops ops;
-};
-
-/**
- * dpu_hw_ds_init - initializes the destination scaler
- * hw driver object and should be called once before
- * accessing every destination scaler
- * @idx : DS index for which driver object is required
- * @addr: Mapped register io address of MDP
- * @m : MDSS catalog information
- * @Return: pointer to structure or ERR_PTR
- */
-struct dpu_hw_ds *dpu_hw_ds_init(enum dpu_ds idx,
- void __iomem *addr,
- struct dpu_mdss_cfg *m);
-
-/**
- * dpu_hw_ds_destroy - destroys destination scaler
- * driver context
- * @hw_ds: Pointer to DS context
- */
-void dpu_hw_ds_destroy(struct dpu_hw_ds *hw_ds);
-
-#endif /*_DPU_HW_DS_H */
diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_lm.c b/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_lm.c
index 75a30db..830b69e 100644
--- a/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_lm.c
+++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_lm.c
@@ -172,68 +172,6 @@ static void dpu_hw_lm_gc(struct dpu_hw_mixer *mixer,
{
}
-static void dpu_hw_lm_clear_dim_layer(struct dpu_hw_mixer *ctx)
-{
- struct dpu_hw_blk_reg_map *c = &ctx->hw;
- const struct dpu_lm_sub_blks *sblk = ctx->cap->sblk;
- int stage_off, i;
- u32 reset = BIT(16), val;
-
- reset = ~reset;
- for (i = DPU_STAGE_0; i < sblk->maxblendstages; i++) {
- stage_off = _stage_offset(ctx, i);
- if (WARN_ON(stage_off < 0))
- return;
-
- /*
- * read the existing blendn_op register and clear only DIM layer
- * bit (color_fill bit)
- */
- val = DPU_REG_READ(c, LM_BLEND0_OP + stage_off);
- val &= reset;
- DPU_REG_WRITE(c, LM_BLEND0_OP + stage_off, val);
- }
-}
-
-static void dpu_hw_lm_setup_dim_layer(struct dpu_hw_mixer *ctx,
- struct dpu_hw_dim_layer *dim_layer)
-{
- struct dpu_hw_blk_reg_map *c = &ctx->hw;
- int stage_off;
- u32 val = 0, alpha = 0;
-
- stage_off = _stage_offset(ctx, dim_layer->stage);
- if (stage_off < 0) {
- DPU_ERROR("invalid stage_off:%d for dim layer\n", stage_off);
- return;
- }
-
- alpha = dim_layer->color_fill.color_3 & 0xFF;
- val = ((dim_layer->color_fill.color_1 << 2) & 0xFFF) << 16 |
- ((dim_layer->color_fill.color_0 << 2) & 0xFFF);
- DPU_REG_WRITE(c, LM_FG_COLOR_FILL_COLOR_0 + stage_off, val);
-
- val = (alpha << 4) << 16 |
- ((dim_layer->color_fill.color_2 << 2) & 0xFFF);
- DPU_REG_WRITE(c, LM_FG_COLOR_FILL_COLOR_1 + stage_off, val);
-
- val = dim_layer->rect.h << 16 | dim_layer->rect.w;
- DPU_REG_WRITE(c, LM_FG_COLOR_FILL_SIZE + stage_off, val);
-
- val = dim_layer->rect.y << 16 | dim_layer->rect.x;
- DPU_REG_WRITE(c, LM_FG_COLOR_FILL_XY + stage_off, val);
-
- val = BIT(16); /* enable dim layer */
- val |= DPU_BLEND_FG_ALPHA_FG_CONST | DPU_BLEND_BG_ALPHA_BG_CONST;
- if (dim_layer->flags & DPU_DRM_DIM_LAYER_EXCLUSIVE)
- val |= BIT(17);
- else
- val &= ~BIT(17);
- DPU_REG_WRITE(c, LM_BLEND0_OP + stage_off, val);
- val = (alpha << 16) | (0xff - alpha);
- DPU_REG_WRITE(c, LM_BLEND0_CONST_ALPHA + stage_off, val);
-}
-
static void dpu_hw_lm_setup_misr(struct dpu_hw_mixer *ctx,
bool enable, u32 frame_count)
{
@@ -272,11 +210,6 @@ static void _setup_mixer_ops(struct dpu_mdss_cfg *m,
ops->setup_gc = dpu_hw_lm_gc;
ops->setup_misr = dpu_hw_lm_setup_misr;
ops->collect_misr = dpu_hw_lm_collect_misr;
-
- if (test_bit(DPU_DIM_LAYER, &features)) {
- ops->setup_dim_layer = dpu_hw_lm_setup_dim_layer;
- ops->clear_dim_layer = dpu_hw_lm_clear_dim_layer;
- }
};
static struct dpu_hw_blk_ops dpu_hw_ops = {
diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_lm.h b/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_lm.h
index ef22c86..e29e5da 100644
--- a/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_lm.h
+++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_lm.h
@@ -67,20 +67,6 @@ struct dpu_hw_lm_ops {
void (*setup_gc)(struct dpu_hw_mixer *mixer,
void *cfg);
- /**
- * setup_dim_layer: configure dim layer settings
- * @ctx: Pointer to layer mixer context
- * @dim_layer: dim layer configs
- */
- void (*setup_dim_layer)(struct dpu_hw_mixer *ctx,
- struct dpu_hw_dim_layer *dim_layer);
-
- /**
- * clear_dim_layer: clear dim layer settings
- * @ctx: Pointer to layer mixer context
- */
- void (*clear_dim_layer)(struct dpu_hw_mixer *ctx);
-
/* setup_misr: enables/disables MISR in HW register */
void (*setup_misr)(struct dpu_hw_mixer *ctx,
bool enable, u32 frame_count);
diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_mdss.h b/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_mdss.h
index fcd164f..836ff9e 100644
--- a/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_mdss.h
+++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_mdss.h
@@ -99,7 +99,6 @@ enum dpu_hw_blk_type {
DPU_HW_BLK_TOP = 0,
DPU_HW_BLK_SSPP,
DPU_HW_BLK_LM,
- DPU_HW_BLK_DS,
DPU_HW_BLK_CTL,
DPU_HW_BLK_CDM,
DPU_HW_BLK_PINGPONG,
@@ -469,20 +468,5 @@ struct dpu_mdss_color {
#define DPU_DBG_MASK_TOP (1 << 8)
#define DPU_DBG_MASK_VBIF (1 << 9)
#define DPU_DBG_MASK_ROT (1 << 10)
-#define DPU_DBG_MASK_DS (1 << 11)
-
-/**
- * struct dpu_hw_dim_layer: dim layer configs
- * @flags: Flag to represent INCLUSIVE/EXCLUSIVE
- * @stage: Blending stage of dim layer
- * @color_fill: Color fill to be used for the layer
- * @rect: Dim layer coordinates
- */
-struct dpu_hw_dim_layer {
- uint32_t flags;
- uint32_t stage;
- struct dpu_mdss_color color_fill;
- struct dpu_rect rect;
-};
#endif /* _DPU_HW_MDSS_H */
diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_rm.c b/drivers/gpu/drm/msm/disp/dpu1/dpu_rm.c
index f467bf1..0af2996 100644
--- a/drivers/gpu/drm/msm/disp/dpu1/dpu_rm.c
+++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_rm.c
@@ -17,7 +17,6 @@
#include "dpu_hw_lm.h"
#include "dpu_hw_ctl.h"
#include "dpu_hw_cdm.h"
-#include "dpu_hw_ds.h"
#include "dpu_hw_pingpong.h"
#include "dpu_hw_intf.h"
#include "dpu_hw_wb.h"
@@ -235,9 +234,6 @@ static void _dpu_rm_hw_destroy(enum dpu_hw_blk_type type, void *hw)
case DPU_HW_BLK_LM:
dpu_hw_lm_destroy(hw);
break;
- case DPU_HW_BLK_DS:
- dpu_hw_ds_destroy(hw);
- break;
case DPU_HW_BLK_CTL:
dpu_hw_ctl_destroy(hw);
break;
@@ -317,9 +313,6 @@ static int _dpu_rm_hw_blk_create(
case DPU_HW_BLK_LM:
hw = dpu_hw_lm_init(id, mmio, cat);
break;
- case DPU_HW_BLK_DS:
- hw = dpu_hw_ds_init(id, mmio, cat);
- break;
case DPU_HW_BLK_CTL:
hw = dpu_hw_ctl_init(id, mmio, cat);
break;
@@ -427,17 +420,6 @@ int dpu_rm_init(struct dpu_rm *rm,
}
}
- if (cat->mdp[0].has_dest_scaler) {
- for (i = 0; i < cat->ds_count; i++) {
- rc = _dpu_rm_hw_blk_create(rm, cat, mmio, DPU_HW_BLK_DS,
- cat->ds[i].id, &cat->ds[i]);
- if (rc) {
- DPU_ERROR("failed: ds hw not available\n");
- goto fail;
- }
- }
- }
-
for (i = 0; i < cat->pingpong_count; i++) {
rc = _dpu_rm_hw_blk_create(rm, cat, mmio, DPU_HW_BLK_PINGPONG,
cat->pingpong[i].id, &cat->pingpong[i]);
@@ -516,20 +498,16 @@ static bool _dpu_rm_check_lm_and_get_connected_blks(
struct dpu_rm_rsvp *rsvp,
struct dpu_rm_requirements *reqs,
struct dpu_rm_hw_blk *lm,
- struct dpu_rm_hw_blk **ds,
struct dpu_rm_hw_blk **pp,
struct dpu_rm_hw_blk *primary_lm)
{
const struct dpu_lm_cfg *lm_cfg = to_dpu_hw_mixer(lm->hw)->cap;
struct dpu_rm_hw_iter iter;
- bool is_valid_ds;
- *ds = NULL;
*pp = NULL;
- DPU_DEBUG("check lm %d ds %d pp %d\n",
- lm_cfg->id,
- lm_cfg->ds, lm_cfg->pingpong);
+ DPU_DEBUG("check lm %d pp %d\n",
+ lm_cfg->id, lm_cfg->pingpong);
/* Check if this layer mixer is a peer of the proposed primary LM */
if (primary_lm) {
@@ -543,43 +521,12 @@ static bool _dpu_rm_check_lm_and_get_connected_blks(
}
}
- is_valid_ds = (lm_cfg->ds != DS_MAX) ? true : false;
-
- if (RM_RQ_DS(reqs) && !is_valid_ds) {
- DPU_DEBUG("fail:lm(%d)req_ds(%d)ds(%d)\n",
- lm_cfg->id, (bool)(RM_RQ_DS(reqs)), lm_cfg->ds);
-
- return false;
- }
-
/* Already reserved? */
if (RESERVED_BY_OTHER(lm, rsvp)) {
DPU_DEBUG("lm %d already reserved\n", lm_cfg->id);
return false;
}
- if (lm_cfg->ds != DS_MAX) {
- dpu_rm_init_hw_iter(&iter, 0, DPU_HW_BLK_DS);
- while (_dpu_rm_get_hw_locked(rm, &iter)) {
- if (iter.blk->id == lm_cfg->ds) {
- *ds = iter.blk;
- break;
- }
- }
-
- if (!*ds) {
- DPU_DEBUG("lm %d failed to retrieve ds %d\n", lm->id,
- lm_cfg->ds);
- return false;
- }
-
- if (RESERVED_BY_OTHER(*ds, rsvp)) {
- DPU_DEBUG("lm %d ds %d already reserved\n",
- lm->id, (*ds)->id);
- return false;
- }
- }
-
dpu_rm_init_hw_iter(&iter, 0, DPU_HW_BLK_PINGPONG);
while (_dpu_rm_get_hw_locked(rm, &iter)) {
if (iter.blk->id == lm_cfg->pingpong) {
@@ -596,7 +543,6 @@ static bool _dpu_rm_check_lm_and_get_connected_blks(
if (RESERVED_BY_OTHER(*pp, rsvp)) {
DPU_DEBUG("lm %d pp %d already reserved\n", lm->id,
(*pp)->id);
- *ds = NULL;
return false;
}
@@ -610,7 +556,6 @@ static int _dpu_rm_reserve_lms(
{
struct dpu_rm_hw_blk *lm[MAX_BLOCKS];
- struct dpu_rm_hw_blk *ds[MAX_BLOCKS];
struct dpu_rm_hw_blk *pp[MAX_BLOCKS];
struct dpu_rm_hw_iter iter_i, iter_j;
int lm_count = 0;
@@ -626,14 +571,13 @@ static int _dpu_rm_reserve_lms(
while (lm_count != reqs->topology->num_lm &&
_dpu_rm_get_hw_locked(rm, &iter_i)) {
memset(&lm, 0, sizeof(lm));
- memset(&ds, 0, sizeof(ds));
memset(&pp, 0, sizeof(pp));
lm_count = 0;
lm[lm_count] = iter_i.blk;
if (!_dpu_rm_check_lm_and_get_connected_blks(
- rm, rsvp, reqs, lm[lm_count], &ds[lm_count],
+ rm, rsvp, reqs, lm[lm_count],
&pp[lm_count], NULL))
continue;
@@ -649,8 +593,7 @@ static int _dpu_rm_reserve_lms(
if (!_dpu_rm_check_lm_and_get_connected_blks(
rm, rsvp, reqs, iter_j.blk,
- &ds[lm_count], &pp[lm_count],
- iter_i.blk))
+ &pp[lm_count], iter_i.blk))
continue;
lm[lm_count] = iter_j.blk;
@@ -670,11 +613,7 @@ static int _dpu_rm_reserve_lms(
lm[i]->rsvp_nxt = rsvp;
pp[i]->rsvp_nxt = rsvp;
- if (ds[i])
- ds[i]->rsvp_nxt = rsvp;
-
- DPU_EVT32(lm[i]->type, rsvp->enc_id, lm[i]->id, pp[i]->id,
- ds[i] ? ds[i]->id : 0);
+ DPU_EVT32(lm[i]->type, rsvp->enc_id, lm[i]->id, pp[i]->id);
}
return rc;
diff --git a/drivers/gpu/drm/msm/msm_drv.h b/drivers/gpu/drm/msm/msm_drv.h
index 5baff27..8e80b4b 100644
--- a/drivers/gpu/drm/msm/msm_drv.h
+++ b/drivers/gpu/drm/msm/msm_drv.h
@@ -89,25 +89,10 @@ enum msm_mdp_plane_property {
enum msm_mdp_crtc_property {
CRTC_PROP_INFO,
- CRTC_PROP_DEST_SCALER_LUT_ED,
- CRTC_PROP_DEST_SCALER_LUT_CIR,
- CRTC_PROP_DEST_SCALER_LUT_SEP,
/* # of blob properties */
CRTC_PROP_BLOBCOUNT,
- /* range properties */
- CRTC_PROP_DIM_LAYER_V1 = CRTC_PROP_BLOBCOUNT,
- CRTC_PROP_CORE_CLK,
- CRTC_PROP_CORE_AB,
- CRTC_PROP_CORE_IB,
- CRTC_PROP_LLCC_AB,
- CRTC_PROP_LLCC_IB,
- CRTC_PROP_DRAM_AB,
- CRTC_PROP_DRAM_IB,
- CRTC_PROP_IDLE_TIMEOUT,
- CRTC_PROP_DEST_SCALER,
-
/* total # of properties */
CRTC_PROP_COUNT
};
--
The Qualcomm Innovation Center, Inc. is a member of the Code Aurora Forum,
a Linux Foundation Collaborative Project
_______________________________________________
Freedreno mailing list
Freedreno@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/freedreno
^ permalink raw reply related [flat|nested] 18+ messages in thread
* [DPU PATCH 6/7] drm/msm: remove msm_prop files
[not found] ` <1527103862-13934-1-git-send-email-jsanka-sgV2jX0FEOL9JmXXK+q4OQ@public.gmane.org>
` (4 preceding siblings ...)
2018-05-23 19:31 ` [DPU PATCH 5/7] drm/msm/dpu: clean up dpu crtc custom properties Jeykumar Sankaran
@ 2018-05-23 19:31 ` Jeykumar Sankaran
2018-06-04 19:59 ` Sean Paul
5 siblings, 1 reply; 18+ messages in thread
From: Jeykumar Sankaran @ 2018-05-23 19:31 UTC (permalink / raw)
To: dri-devel-PD4FTy7X32lNgt0PjOBp9y5qC8QIuHrW,
freedreno-PD4FTy7X32lNgt0PjOBp9y5qC8QIuHrW,
linux-arm-msm-u79uwXL29TY76Z2rM5mHXA
Cc: hoegsberg-hpIqsD4AKlfQT0dZR+AlfA, Jeykumar Sankaran,
seanpaul-F7+t8E8rja9g9hUCZPvPmw,
robdclark-Re5JQEeQqe8AvxtiuMwx3w
Remove hand rolled msm property caching to handle DPU
custom properties. This change also cleans up all its
dependencies to cache and restore respective drm
states.
Signed-off-by: Jeykumar Sankaran <jsanka@codeaurora.org>
---
drivers/gpu/drm/msm/Makefile | 1 -
drivers/gpu/drm/msm/disp/dpu1/dpu_core_perf.c | 2 -
drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c | 239 +--------
drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.h | 16 -
drivers/gpu/drm/msm/disp/dpu1/dpu_encoder.h | 2 -
drivers/gpu/drm/msm/disp/dpu1/dpu_plane.c | 123 +----
drivers/gpu/drm/msm/disp/dpu1/dpu_plane.h | 12 -
drivers/gpu/drm/msm/msm_drv.h | 16 +-
drivers/gpu/drm/msm/msm_prop.c | 688 --------------------------
drivers/gpu/drm/msm/msm_prop.h | 438 ----------------
10 files changed, 8 insertions(+), 1529 deletions(-)
delete mode 100644 drivers/gpu/drm/msm/msm_prop.c
delete mode 100644 drivers/gpu/drm/msm/msm_prop.h
diff --git a/drivers/gpu/drm/msm/Makefile b/drivers/gpu/drm/msm/Makefile
index d289503..5331188 100644
--- a/drivers/gpu/drm/msm/Makefile
+++ b/drivers/gpu/drm/msm/Makefile
@@ -76,7 +76,6 @@ msm-y := \
dpu_io_util.o \
dpu_dbg_evtlog.o \
dpu_power_handle.o \
- msm_prop.o \
msm_atomic.o \
msm_debugfs.o \
msm_drv.o \
diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_core_perf.c b/drivers/gpu/drm/msm/disp/dpu1/dpu_core_perf.c
index c4820de..e4b82d5 100644
--- a/drivers/gpu/drm/msm/disp/dpu1/dpu_core_perf.c
+++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_core_perf.c
@@ -19,8 +19,6 @@
#include <linux/clk.h>
#include <linux/bitmap.h>
-#include "msm_prop.h"
-
#include "dpu_kms.h"
#include "dpu_trace.h"
#include "dpu_crtc.h"
diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c b/drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c
index b0a3a30..43d9985 100644
--- a/drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c
+++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c
@@ -579,10 +579,6 @@ static void dpu_crtc_destroy(struct drm_crtc *crtc)
if (!crtc)
return;
- if (dpu_crtc->blob_info)
- drm_property_blob_put(dpu_crtc->blob_info);
- msm_property_destroy(&dpu_crtc->property_info);
-
_dpu_crtc_deinit_events(dpu_crtc);
drm_crtc_cleanup(crtc);
@@ -1390,9 +1386,7 @@ static void dpu_crtc_destroy_state(struct drm_crtc *crtc,
__drm_atomic_helper_crtc_destroy_state(state);
- /* destroy value helper */
- msm_property_destroy_state(&dpu_crtc->property_info, cstate,
- &cstate->property_state);
+ kfree(cstate);
}
static int _dpu_crtc_wait_for_frame_done(struct drm_crtc *crtc)
@@ -1641,17 +1635,12 @@ static struct drm_crtc_state *dpu_crtc_duplicate_state(struct drm_crtc *crtc)
dpu_crtc = to_dpu_crtc(crtc);
old_cstate = to_dpu_crtc_state(crtc->state);
- cstate = msm_property_alloc_state(&dpu_crtc->property_info);
+ cstate = kmemdup(old_cstate, sizeof(*old_cstate), GFP_KERNEL);
if (!cstate) {
DPU_ERROR("failed to allocate state\n");
return NULL;
}
- /* duplicate value helper */
- msm_property_duplicate_state(&dpu_crtc->property_info,
- old_cstate, cstate,
- &cstate->property_state, cstate->property_values);
-
/* duplicate base helper */
__drm_atomic_helper_crtc_duplicate_state(crtc, &cstate->base);
@@ -1687,17 +1676,12 @@ static void dpu_crtc_reset(struct drm_crtc *crtc)
}
dpu_crtc = to_dpu_crtc(crtc);
- cstate = msm_property_alloc_state(&dpu_crtc->property_info);
+ cstate = kzalloc(sizeof(*cstate), GFP_KERNEL);
if (!cstate) {
DPU_ERROR("failed to allocate state\n");
return;
}
- /* reset value helper */
- msm_property_reset_state(&dpu_crtc->property_info, cstate,
- &cstate->property_state,
- cstate->property_values);
-
_dpu_crtc_rp_reset(&cstate->rp, &dpu_crtc->rp_lock,
&dpu_crtc->rp_head);
@@ -2194,212 +2178,6 @@ void dpu_crtc_cancel_pending_flip(struct drm_crtc *crtc, struct drm_file *file)
_dpu_crtc_complete_flip(crtc, file);
}
-/**
- * dpu_crtc_install_properties - install all drm properties for crtc
- * @crtc: Pointer to drm crtc structure
- */
-static void dpu_crtc_install_properties(struct drm_crtc *crtc,
- struct dpu_mdss_cfg *catalog)
-{
- struct dpu_crtc *dpu_crtc;
- struct drm_device *dev;
- struct dpu_kms_info *info;
- struct dpu_kms *dpu_kms;
-
- DPU_DEBUG("\n");
-
- if (!crtc || !catalog) {
- DPU_ERROR("invalid crtc or catalog\n");
- return;
- }
-
- dpu_crtc = to_dpu_crtc(crtc);
- dev = crtc->dev;
- dpu_kms = _dpu_crtc_get_kms(crtc);
-
- if (!dpu_kms) {
- DPU_ERROR("invalid argument\n");
- return;
- }
-
- info = kzalloc(sizeof(struct dpu_kms_info), GFP_KERNEL);
- if (!info) {
- DPU_ERROR("failed to allocate info memory\n");
- return;
- }
-
- msm_property_install_blob(&dpu_crtc->property_info, "capabilities",
- DRM_MODE_PROP_IMMUTABLE, CRTC_PROP_INFO);
-
- dpu_kms_info_reset(info);
-
- dpu_kms_info_add_keyint(info, "hw_version", catalog->hwversion);
- dpu_kms_info_add_keyint(info, "max_linewidth",
- catalog->caps->max_mixer_width);
- dpu_kms_info_add_keyint(info, "max_blendstages",
- catalog->caps->max_mixer_blendstages);
- if (catalog->caps->qseed_type == DPU_SSPP_SCALER_QSEED2)
- dpu_kms_info_add_keystr(info, "qseed_type", "qseed2");
- if (catalog->caps->qseed_type == DPU_SSPP_SCALER_QSEED3)
- dpu_kms_info_add_keystr(info, "qseed_type", "qseed3");
-
- if (dpu_is_custom_client()) {
- if (catalog->caps->smart_dma_rev == DPU_SSPP_SMART_DMA_V1)
- dpu_kms_info_add_keystr(info,
- "smart_dma_rev", "smart_dma_v1");
- if (catalog->caps->smart_dma_rev == DPU_SSPP_SMART_DMA_V2)
- dpu_kms_info_add_keystr(info,
- "smart_dma_rev", "smart_dma_v2");
- }
-
- dpu_kms_info_add_keyint(info, "has_src_split",
- catalog->caps->has_src_split);
- if (catalog->perf.max_bw_low)
- dpu_kms_info_add_keyint(info, "max_bandwidth_low",
- catalog->perf.max_bw_low * 1000LL);
- if (catalog->perf.max_bw_high)
- dpu_kms_info_add_keyint(info, "max_bandwidth_high",
- catalog->perf.max_bw_high * 1000LL);
- if (catalog->perf.min_core_ib)
- dpu_kms_info_add_keyint(info, "min_core_ib",
- catalog->perf.min_core_ib * 1000LL);
- if (catalog->perf.min_llcc_ib)
- dpu_kms_info_add_keyint(info, "min_llcc_ib",
- catalog->perf.min_llcc_ib * 1000LL);
- if (catalog->perf.min_dram_ib)
- dpu_kms_info_add_keyint(info, "min_dram_ib",
- catalog->perf.min_dram_ib * 1000LL);
- if (dpu_kms->perf.max_core_clk_rate)
- dpu_kms_info_add_keyint(info, "max_mdp_clk",
- dpu_kms->perf.max_core_clk_rate);
- dpu_kms_info_add_keystr(info, "core_ib_ff",
- catalog->perf.core_ib_ff);
- dpu_kms_info_add_keystr(info, "core_clk_ff",
- catalog->perf.core_clk_ff);
- dpu_kms_info_add_keystr(info, "comp_ratio_rt",
- catalog->perf.comp_ratio_rt);
- dpu_kms_info_add_keystr(info, "comp_ratio_nrt",
- catalog->perf.comp_ratio_nrt);
- dpu_kms_info_add_keyint(info, "dest_scale_prefill_lines",
- catalog->perf.dest_scale_prefill_lines);
- dpu_kms_info_add_keyint(info, "undersized_prefill_lines",
- catalog->perf.undersized_prefill_lines);
- dpu_kms_info_add_keyint(info, "macrotile_prefill_lines",
- catalog->perf.macrotile_prefill_lines);
- dpu_kms_info_add_keyint(info, "yuv_nv12_prefill_lines",
- catalog->perf.yuv_nv12_prefill_lines);
- dpu_kms_info_add_keyint(info, "linear_prefill_lines",
- catalog->perf.linear_prefill_lines);
- dpu_kms_info_add_keyint(info, "downscaling_prefill_lines",
- catalog->perf.downscaling_prefill_lines);
- dpu_kms_info_add_keyint(info, "xtra_prefill_lines",
- catalog->perf.xtra_prefill_lines);
- dpu_kms_info_add_keyint(info, "amortizable_threshold",
- catalog->perf.amortizable_threshold);
- dpu_kms_info_add_keyint(info, "min_prefill_lines",
- catalog->perf.min_prefill_lines);
-
- msm_property_set_blob(&dpu_crtc->property_info, &dpu_crtc->blob_info,
- info->data, DPU_KMS_INFO_DATALEN(info), CRTC_PROP_INFO);
-
- kfree(info);
-}
-
-/**
- * dpu_crtc_atomic_set_property - atomically set a crtc drm property
- * @crtc: Pointer to drm crtc structure
- * @state: Pointer to drm crtc state structure
- * @property: Pointer to targeted drm property
- * @val: Updated property value
- * @Returns: Zero on success
- */
-static int dpu_crtc_atomic_set_property(struct drm_crtc *crtc,
- struct drm_crtc_state *state,
- struct drm_property *property,
- uint64_t val)
-{
- struct dpu_crtc *dpu_crtc;
- struct dpu_crtc_state *cstate;
- int ret = -EINVAL;
-
- if (!crtc || !state || !property) {
- DPU_ERROR("invalid argument(s)\n");
- } else {
- dpu_crtc = to_dpu_crtc(crtc);
- cstate = to_dpu_crtc_state(state);
- ret = msm_property_atomic_set(&dpu_crtc->property_info,
- &cstate->property_state, property, val);
- if (ret)
- DRM_ERROR("failed to set the property\n");
-
- DPU_DEBUG("crtc%d %s[%d] <= 0x%llx ret=%d\n", crtc->base.id,
- property->name, property->base.id, val, ret);
- }
-
- return ret;
-}
-
-/**
- * dpu_crtc_set_property - set a crtc drm property
- * @crtc: Pointer to drm crtc structure
- * @property: Pointer to targeted drm property
- * @val: Updated property value
- * @Returns: Zero on success
- */
-static int dpu_crtc_set_property(struct drm_crtc *crtc,
- struct drm_property *property, uint64_t val)
-{
- DPU_DEBUG("\n");
-
- return dpu_crtc_atomic_set_property(crtc, crtc->state, property, val);
-}
-
-/**
- * dpu_crtc_atomic_get_property - retrieve a crtc drm property
- * @crtc: Pointer to drm crtc structure
- * @state: Pointer to drm crtc state structure
- * @property: Pointer to targeted drm property
- * @val: Pointer to variable for receiving property value
- * @Returns: Zero on success
- */
-static int dpu_crtc_atomic_get_property(struct drm_crtc *crtc,
- const struct drm_crtc_state *state,
- struct drm_property *property,
- uint64_t *val)
-{
- struct dpu_crtc *dpu_crtc;
- struct dpu_crtc_state *cstate;
- struct drm_encoder *encoder;
- int i, ret = -EINVAL;
- bool is_cmd = true;
-
- if (!crtc || !state) {
- DPU_ERROR("invalid argument(s)\n");
- } else {
- dpu_crtc = to_dpu_crtc(crtc);
- cstate = to_dpu_crtc_state(state);
-
- /**
- * set the cmd flag only when all the encoders attached
- * to the crtc are in cmd mode. Consider all other cases
- * as video mode.
- */
- drm_for_each_encoder(encoder, crtc->dev) {
- if (encoder->crtc == crtc)
- is_cmd = dpu_encoder_check_mode(encoder,
- MSM_DISPLAY_CAP_CMD_MODE);
- }
-
- i = msm_property_index(&dpu_crtc->property_info, property);
- ret = msm_property_atomic_get(&dpu_crtc->property_info,
- &cstate->property_state,
- property, val);
- if (ret)
- DRM_ERROR("get property failed\n");
- }
- return ret;
-}
-
#ifdef CONFIG_DEBUG_FS
static int _dpu_debugfs_status_show(struct seq_file *s, void *data)
{
@@ -2759,9 +2537,6 @@ static void dpu_crtc_early_unregister(struct drm_crtc *crtc)
.set_config = drm_atomic_helper_set_config,
.destroy = dpu_crtc_destroy,
.page_flip = drm_atomic_helper_page_flip,
- .set_property = dpu_crtc_set_property,
- .atomic_set_property = dpu_crtc_atomic_set_property,
- .atomic_get_property = dpu_crtc_atomic_get_property,
.reset = dpu_crtc_reset,
.atomic_duplicate_state = dpu_crtc_duplicate_state,
.atomic_destroy_state = dpu_crtc_destroy_state,
@@ -2924,14 +2699,6 @@ struct drm_crtc *dpu_crtc_init(struct drm_device *dev, struct drm_plane *plane)
return ERR_PTR(rc);
}
- /* create CRTC properties */
- msm_property_init(&dpu_crtc->property_info, &crtc->base, dev,
- priv->crtc_property, dpu_crtc->property_data,
- CRTC_PROP_COUNT, CRTC_PROP_BLOBCOUNT,
- sizeof(struct dpu_crtc_state));
-
- dpu_crtc_install_properties(crtc, kms->catalog);
-
DPU_DEBUG("%s: successfully initialized crtc\n", dpu_crtc->name);
return crtc;
}
diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.h b/drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.h
index 6628eb3..f752101 100644
--- a/drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.h
+++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.h
@@ -22,7 +22,6 @@
#include <linux/kthread.h>
#include <uapi/drm/dpu_drm.h>
#include <drm/drm_crtc.h>
-#include "msm_prop.h"
#include "dpu_kms.h"
#include "dpu_core_perf.h"
#include "dpu_hw_blk.h"
@@ -200,10 +199,6 @@ struct dpu_crtc {
struct drm_pending_vblank_event *event;
u32 vsync_count;
- struct msm_property_info property_info;
- struct msm_property_data property_data[CRTC_PROP_COUNT];
- struct drm_property_blob *blob_info;
-
struct dpu_hw_stage_cfg stage_cfg;
struct dentry *debugfs_root;
@@ -324,8 +319,6 @@ struct dpu_crtc_state {
bool is_ppsplit;
struct dpu_rect lm_bounds[CRTC_DUAL_MIXERS];
- struct msm_property_state property_state;
- struct msm_property_value property_values[CRTC_PROP_COUNT];
uint64_t input_fence_timeout_ns;
struct dpu_core_perf_params new_perf;
@@ -336,15 +329,6 @@ struct dpu_crtc_state {
container_of(x, struct dpu_crtc_state, base)
/**
- * dpu_crtc_get_property - query integer value of crtc property
- * @S: Pointer to crtc state
- * @X: Property index, from enum msm_mdp_crtc_property
- * Returns: Integer value of requested property
- */
-#define dpu_crtc_get_property(S, X) \
- ((S) && ((X) < CRTC_PROP_COUNT) ? ((S)->property_values[(X)].value) : 0)
-
-/**
* dpu_crtc_get_mixer_width - get the mixer width
* Mixer width will be same as panel width(/2 for split)
*/
diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_encoder.h b/drivers/gpu/drm/msm/disp/dpu1/dpu_encoder.h
index d853ad9..0339dfd 100644
--- a/drivers/gpu/drm/msm/disp/dpu1/dpu_encoder.h
+++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_encoder.h
@@ -20,8 +20,6 @@
#define __DPU_ENCODER_H__
#include <drm/drm_crtc.h>
-
-#include "msm_prop.h"
#include "dpu_hw_mdss.h"
#define DPU_ENCODER_FRAME_EVENT_DONE BIT(0)
diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_plane.c b/drivers/gpu/drm/msm/disp/dpu1/dpu_plane.c
index 28735c8..faf5903 100644
--- a/drivers/gpu/drm/msm/disp/dpu1/dpu_plane.c
+++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_plane.c
@@ -20,9 +20,8 @@
#include <linux/debugfs.h>
#include <linux/dma-buf.h>
-#include "msm_prop.h"
-#include "msm_drv.h"
+#include "msm_drv.h"
#include "dpu_kms.h"
#include "dpu_formats.h"
#include "dpu_hw_sspp.h"
@@ -119,9 +118,6 @@ struct dpu_plane {
const struct dpu_sspp_sub_blks *pipe_sblk;
char pipe_name[DPU_NAME_SIZE];
- struct msm_property_info property_info;
- struct msm_property_data property_data[PLANE_PROP_COUNT];
- struct drm_property_blob *blob_info;
/* debugfs related stuff */
struct dentry *debugfs_root;
@@ -1401,7 +1397,6 @@ static int dpu_plane_sspp_atomic_update(struct drm_plane *plane,
}
_dpu_plane_set_qos_remap(plane);
-
return 0;
}
@@ -1486,89 +1481,6 @@ void dpu_plane_restore(struct drm_plane *plane)
dpu_plane_atomic_update(plane, plane->state);
}
-/* helper to install properties which are common to planes and crtcs */
-static void _dpu_plane_install_properties(struct drm_plane *plane,
- struct dpu_mdss_cfg *catalog, u32 master_plane_id)
-{
- struct dpu_plane *pdpu = to_dpu_plane(plane);
- int zpos_max = 255;
- int zpos_def = 0;
-
- if (!plane || !pdpu) {
- DPU_ERROR("invalid plane\n");
- return;
- } else if (!pdpu->pipe_hw || !pdpu->pipe_sblk) {
- DPU_ERROR("invalid plane, pipe_hw %d pipe_sblk %d\n",
- pdpu->pipe_hw != 0, pdpu->pipe_sblk != 0);
- return;
- } else if (!catalog) {
- DPU_ERROR("invalid catalog\n");
- return;
- }
-
- pdpu->catalog = catalog;
-
- if (dpu_is_custom_client()) {
- if (catalog->mixer_count &&
- catalog->mixer[0].sblk->maxblendstages) {
- zpos_max = catalog->mixer[0].sblk->maxblendstages - 1;
- if (zpos_max > DPU_STAGE_MAX - DPU_STAGE_0 - 1)
- zpos_max = DPU_STAGE_MAX - DPU_STAGE_0 - 1;
- }
- } else if (plane->type != DRM_PLANE_TYPE_PRIMARY) {
- /* reserve zpos == 0 for primary planes */
- zpos_def = drm_plane_index(plane) + 1;
- }
-}
-
-static int dpu_plane_atomic_set_property(struct drm_plane *plane,
- struct drm_plane_state *state, struct drm_property *property,
- uint64_t val)
-{
- struct dpu_plane *pdpu = plane ? to_dpu_plane(plane) : NULL;
- struct dpu_plane_state *pstate;
- int ret = -EINVAL;
-
- DPU_DEBUG_PLANE(pdpu, "\n");
-
- if (!plane) {
- DPU_ERROR("invalid plane\n");
- } else if (!state) {
- DPU_ERROR_PLANE(pdpu, "invalid state\n");
- } else {
- pstate = to_dpu_plane_state(state);
- ret = msm_property_atomic_set(&pdpu->property_info,
- &pstate->property_state, property, val);
- }
-
- DPU_DEBUG_PLANE(pdpu, "%s[%d] <= 0x%llx ret=%d\n",
- property->name, property->base.id, val, ret);
-
- return ret;
-}
-
-static int dpu_plane_atomic_get_property(struct drm_plane *plane,
- const struct drm_plane_state *state,
- struct drm_property *property, uint64_t *val)
-{
- struct dpu_plane *pdpu = plane ? to_dpu_plane(plane) : NULL;
- struct dpu_plane_state *pstate;
- int ret = -EINVAL;
-
- if (!plane) {
- DPU_ERROR("invalid plane\n");
- } else if (!state) {
- DPU_ERROR("invalid state\n");
- } else {
- DPU_DEBUG_PLANE(pdpu, "\n");
- pstate = to_dpu_plane_state(state);
- ret = msm_property_atomic_get(&pdpu->property_info,
- &pstate->property_state, property, val);
- }
-
- return ret;
-}
-
static void dpu_plane_destroy(struct drm_plane *plane)
{
struct dpu_plane *pdpu = plane ? to_dpu_plane(plane) : NULL;
@@ -1578,9 +1490,6 @@ static void dpu_plane_destroy(struct drm_plane *plane)
if (pdpu) {
_dpu_plane_set_qos_ctrl(plane, false, DPU_PLANE_QOS_PANIC_CTRL);
- if (pdpu->blob_info)
- drm_property_blob_put(pdpu->blob_info);
- msm_property_destroy(&pdpu->property_info);
mutex_destroy(&pdpu->lock);
drm_plane_helper_disable(plane);
@@ -1598,7 +1507,6 @@ static void dpu_plane_destroy(struct drm_plane *plane)
static void dpu_plane_destroy_state(struct drm_plane *plane,
struct drm_plane_state *state)
{
- struct dpu_plane *pdpu;
struct dpu_plane_state *pstate;
if (!plane || !state) {
@@ -1607,18 +1515,13 @@ static void dpu_plane_destroy_state(struct drm_plane *plane,
return;
}
- pdpu = to_dpu_plane(plane);
pstate = to_dpu_plane_state(state);
- DPU_DEBUG_PLANE(pdpu, "\n");
-
/* remove ref count for frame buffers */
if (state->fb)
drm_framebuffer_put(state->fb);
- /* destroy value helper */
- msm_property_destroy_state(&pdpu->property_info, pstate,
- &pstate->property_state);
+ kfree(pstate);
}
static struct drm_plane_state *
@@ -1638,7 +1541,7 @@ static void dpu_plane_destroy_state(struct drm_plane *plane,
old_state = to_dpu_plane_state(plane->state);
pdpu = to_dpu_plane(plane);
- pstate = msm_property_alloc_state(&pdpu->property_info);
+ pstate = kmemdup(old_state, sizeof(*old_state), GFP_KERNEL);
if (!pstate) {
DPU_ERROR_PLANE(pdpu, "failed to allocate state\n");
return NULL;
@@ -1646,10 +1549,6 @@ static void dpu_plane_destroy_state(struct drm_plane *plane,
DPU_DEBUG_PLANE(pdpu, "\n");
- /* duplicate value helper */
- msm_property_duplicate_state(&pdpu->property_info, old_state, pstate,
- &pstate->property_state, pstate->property_values);
-
pstate->pending = false;
__drm_atomic_helper_plane_duplicate_state(plane, &pstate->base);
@@ -1676,17 +1575,12 @@ static void dpu_plane_reset(struct drm_plane *plane)
plane->state = 0;
}
- pstate = msm_property_alloc_state(&pdpu->property_info);
+ pstate = kzalloc(sizeof(*pstate), GFP_KERNEL);
if (!pstate) {
DPU_ERROR_PLANE(pdpu, "failed to allocate state\n");
return;
}
- /* reset value helper */
- msm_property_reset_state(&pdpu->property_info, pstate,
- &pstate->property_state,
- pstate->property_values);
-
pstate->base.plane = plane;
plane->state = &pstate->base;
@@ -1919,8 +1813,6 @@ static void dpu_plane_early_unregister(struct drm_plane *plane)
.update_plane = drm_atomic_helper_update_plane,
.disable_plane = drm_atomic_helper_disable_plane,
.destroy = dpu_plane_destroy,
- .atomic_set_property = dpu_plane_atomic_set_property,
- .atomic_get_property = dpu_plane_atomic_get_property,
.reset = dpu_plane_reset,
.atomic_duplicate_state = dpu_plane_duplicate_state,
.atomic_destroy_state = dpu_plane_destroy_state,
@@ -2064,13 +1956,6 @@ struct drm_plane *dpu_plane_init(struct drm_device *dev,
/* success! finalize initialization */
drm_plane_helper_add(plane, &dpu_plane_helper_funcs);
- msm_property_init(&pdpu->property_info, &plane->base, dev,
- priv->plane_property, pdpu->property_data,
- PLANE_PROP_COUNT, PLANE_PROP_BLOBCOUNT,
- sizeof(struct dpu_plane_state));
-
- _dpu_plane_install_properties(plane, kms->catalog, master_plane_id);
-
/* save user friendly pipe name for later */
snprintf(pdpu->pipe_name, DPU_NAME_SIZE, "plane%u", plane->base.id);
diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_plane.h b/drivers/gpu/drm/msm/disp/dpu1/dpu_plane.h
index a06c8b4..f6fe6dd 100644
--- a/drivers/gpu/drm/msm/disp/dpu1/dpu_plane.h
+++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_plane.h
@@ -21,7 +21,6 @@
#include <drm/drm_crtc.h>
-#include "msm_prop.h"
#include "dpu_kms.h"
#include "dpu_hw_mdss.h"
#include "dpu_hw_sspp.h"
@@ -44,8 +43,6 @@
*/
struct dpu_plane_state {
struct drm_plane_state base;
- struct msm_property_state property_state;
- struct msm_property_value property_values[PLANE_PROP_COUNT];
struct msm_gem_address_space *aspace;
void *input_fence;
enum dpu_stage stage;
@@ -74,15 +71,6 @@ struct dpu_multirect_plane_states {
container_of(x, struct dpu_plane_state, base)
/**
- * dpu_plane_get_property - Query integer value of plane property
- * @S: Pointer to plane state
- * @X: Property index, from enum msm_mdp_plane_property
- * Returns: Integer value of requested property
- */
-#define dpu_plane_get_property(S, X) ((S) && ((X) < PLANE_PROP_COUNT) ? \
- ((S)->property_values[(X)].value) : 0)
-
-/**
* dpu_plane_pipe - return sspp identifier for the given plane
* @plane: Pointer to DRM plane object
* Returns: sspp identifier of the given plane
diff --git a/drivers/gpu/drm/msm/msm_drv.h b/drivers/gpu/drm/msm/msm_drv.h
index 8e80b4b..edb395d 100644
--- a/drivers/gpu/drm/msm/msm_drv.h
+++ b/drivers/gpu/drm/msm/msm_drv.h
@@ -77,26 +77,13 @@ struct msm_file_private {
};
enum msm_mdp_plane_property {
- /* # of blob properties */
- PLANE_PROP_BLOBCOUNT,
-
/* range properties */
- PLANE_PROP_ZPOS = PLANE_PROP_BLOBCOUNT,
+ PLANE_PROP_ZPOS,
/* total # of properties */
PLANE_PROP_COUNT
};
-enum msm_mdp_crtc_property {
- CRTC_PROP_INFO,
-
- /* # of blob properties */
- CRTC_PROP_BLOBCOUNT,
-
- /* total # of properties */
- CRTC_PROP_COUNT
-};
-
struct msm_vblank_ctrl {
struct kthread_work work;
struct list_head event_list;
@@ -364,7 +351,6 @@ struct msm_drm_private {
/* Properties */
struct drm_property *plane_property[PLANE_PROP_COUNT];
- struct drm_property *crtc_property[CRTC_PROP_COUNT];
/* Color processing properties for the crtc */
struct drm_property **cp_property;
diff --git a/drivers/gpu/drm/msm/msm_prop.c b/drivers/gpu/drm/msm/msm_prop.c
deleted file mode 100644
index 8f27cde..0000000
--- a/drivers/gpu/drm/msm/msm_prop.c
+++ /dev/null
@@ -1,688 +0,0 @@
-/* Copyright (c) 2016-2018, The Linux Foundation. All rights reserved.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 and
- * only version 2 as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- */
-
-#include "msm_prop.h"
-
-void msm_property_init(struct msm_property_info *info,
- struct drm_mode_object *base,
- struct drm_device *dev,
- struct drm_property **property_array,
- struct msm_property_data *property_data,
- uint32_t property_count,
- uint32_t blob_count,
- uint32_t state_size)
-{
- /* prevent access if any of these are NULL */
- if (!base || !dev || !property_array || !property_data) {
- property_count = 0;
- blob_count = 0;
-
- DRM_ERROR("invalid arguments, forcing zero properties\n");
- return;
- }
-
- /* can't have more blob properties than total properties */
- if (blob_count > property_count) {
- blob_count = property_count;
-
- DBG("Capping number of blob properties to %d", blob_count);
- }
-
- if (!info) {
- DRM_ERROR("info pointer is NULL\n");
- } else {
- info->base = base;
- info->dev = dev;
- info->property_array = property_array;
- info->property_data = property_data;
- info->property_count = property_count;
- info->blob_count = blob_count;
- info->install_request = 0;
- info->install_count = 0;
- info->recent_idx = 0;
- info->is_active = false;
- info->state_size = state_size;
- info->state_cache_size = 0;
- mutex_init(&info->property_lock);
-
- memset(property_data,
- 0,
- sizeof(struct msm_property_data) *
- property_count);
- }
-}
-
-void msm_property_destroy(struct msm_property_info *info)
-{
- if (!info)
- return;
-
- /* free state cache */
- while (info->state_cache_size > 0)
- kfree(info->state_cache[--(info->state_cache_size)]);
-
- mutex_destroy(&info->property_lock);
-}
-
-int msm_property_pop_dirty(struct msm_property_info *info,
- struct msm_property_state *property_state)
-{
- struct list_head *item;
- int rc = 0;
-
- if (!info || !property_state || !property_state->values) {
- DRM_ERROR("invalid argument(s)\n");
- return -EINVAL;
- }
-
- mutex_lock(&info->property_lock);
- if (list_empty(&property_state->dirty_list)) {
- rc = -EAGAIN;
- } else {
- item = property_state->dirty_list.next;
- list_del_init(item);
- rc = container_of(item, struct msm_property_value, dirty_node)
- - property_state->values;
- DRM_DEBUG_KMS("property %d dirty\n", rc);
- }
- mutex_unlock(&info->property_lock);
-
- return rc;
-}
-
-/**
- * _msm_property_set_dirty_no_lock - flag given property as being dirty
- * This function doesn't mutex protect the
- * dirty linked list.
- * @info: Pointer to property info container struct
- * @property_state: Pointer to property state container struct
- * @property_idx: Property index
- */
-static void _msm_property_set_dirty_no_lock(
- struct msm_property_info *info,
- struct msm_property_state *property_state,
- uint32_t property_idx)
-{
- if (!info || !property_state || !property_state->values ||
- property_idx >= info->property_count) {
- DRM_ERROR("invalid argument(s), idx %u\n", property_idx);
- return;
- }
-
- /* avoid re-inserting if already dirty */
- if (!list_empty(&property_state->values[property_idx].dirty_node)) {
- DRM_DEBUG_KMS("property %u already dirty\n", property_idx);
- return;
- }
-
- list_add_tail(&property_state->values[property_idx].dirty_node,
- &property_state->dirty_list);
-}
-
-/**
- * _msm_property_install_integer - install standard drm range property
- * @info: Pointer to property info container struct
- * @name: Property name
- * @flags: Other property type flags, e.g. DRM_MODE_PROP_IMMUTABLE
- * @min: Min property value
- * @max: Max property value
- * @init: Default Property value
- * @property_idx: Property index
- * @force_dirty: Whether or not to filter 'dirty' status on unchanged values
- */
-static void _msm_property_install_integer(struct msm_property_info *info,
- const char *name, int flags, uint64_t min, uint64_t max,
- uint64_t init, uint32_t property_idx, bool force_dirty)
-{
- struct drm_property **prop;
-
- if (!info)
- return;
-
- ++info->install_request;
-
- if (!name || (property_idx >= info->property_count)) {
- DRM_ERROR("invalid argument(s), %s\n", name ? name : "null");
- } else {
- prop = &info->property_array[property_idx];
- /*
- * Properties need to be attached to each drm object that
- * uses them, but only need to be created once
- */
- if (*prop == 0) {
- *prop = drm_property_create_range(info->dev,
- flags, name, min, max);
- if (*prop == 0)
- DRM_ERROR("create %s property failed\n", name);
- }
-
- /* save init value for later */
- info->property_data[property_idx].default_value = init;
- info->property_data[property_idx].force_dirty = force_dirty;
-
- /* always attach property, if created */
- if (*prop) {
- drm_object_attach_property(info->base, *prop, init);
- ++info->install_count;
- }
- }
-}
-
-void msm_property_install_range(struct msm_property_info *info,
- const char *name, int flags, uint64_t min, uint64_t max,
- uint64_t init, uint32_t property_idx)
-{
- _msm_property_install_integer(info, name, flags,
- min, max, init, property_idx, false);
-}
-
-void msm_property_install_volatile_range(struct msm_property_info *info,
- const char *name, int flags, uint64_t min, uint64_t max,
- uint64_t init, uint32_t property_idx)
-{
- _msm_property_install_integer(info, name, flags,
- min, max, init, property_idx, true);
-}
-
-void msm_property_install_rotation(struct msm_property_info *info,
- struct drm_plane *plane, unsigned int rotation,
- unsigned int supported_rotations, uint32_t property_idx)
-{
- if (!info || !plane)
- return;
-
- ++info->install_request;
-
- if (property_idx >= info->property_count) {
- DRM_ERROR("invalid property index %d\n", property_idx);
- return;
- }
-
- if (drm_plane_create_rotation_property(plane,
- rotation, supported_rotations)) {
- DRM_ERROR("create rotation property failed\n");
- return;
- }
-
- if (plane->rotation_property) {
- info->property_array[property_idx] = plane->rotation_property;
-
- /* save init value for later */
- info->property_data[property_idx].default_value = rotation;
- info->property_data[property_idx].force_dirty = false;
-
- ++info->install_count;
- }
-}
-
-void msm_property_install_enum(struct msm_property_info *info,
- const char *name, int flags, int is_bitmask,
- const struct drm_prop_enum_list *values, int num_values,
- uint32_t property_idx)
-{
- struct drm_property **prop;
-
- if (!info)
- return;
-
- ++info->install_request;
-
- if (!name || !values || !num_values ||
- (property_idx >= info->property_count)) {
- DRM_ERROR("invalid argument(s), %s\n", name ? name : "null");
- } else {
- prop = &info->property_array[property_idx];
- /*
- * Properties need to be attached to each drm object that
- * uses them, but only need to be created once
- */
- if (*prop == 0) {
- /* 'bitmask' is a special type of 'enum' */
- if (is_bitmask)
- *prop = drm_property_create_bitmask(info->dev,
- DRM_MODE_PROP_BITMASK | flags,
- name, values, num_values, -1);
- else
- *prop = drm_property_create_enum(info->dev,
- DRM_MODE_PROP_ENUM | flags,
- name, values, num_values);
- if (*prop == 0)
- DRM_ERROR("create %s property failed\n", name);
- }
-
- /* save init value for later */
- info->property_data[property_idx].default_value = 0;
- info->property_data[property_idx].force_dirty = false;
-
- /* select first defined value for enums */
- if (!is_bitmask)
- info->property_data[property_idx].default_value =
- values->type;
-
- /* always attach property, if created */
- if (*prop) {
- drm_object_attach_property(info->base, *prop,
- info->property_data
- [property_idx].default_value);
- ++info->install_count;
- }
- }
-}
-
-void msm_property_install_blob(struct msm_property_info *info,
- const char *name, int flags, uint32_t property_idx)
-{
- struct drm_property **prop;
-
- if (!info)
- return;
-
- ++info->install_request;
-
- if (!name || (property_idx >= info->blob_count)) {
- DRM_ERROR("invalid argument(s), %s\n", name ? name : "null");
- } else {
- prop = &info->property_array[property_idx];
- /*
- * Properties need to be attached to each drm object that
- * uses them, but only need to be created once
- */
- if (*prop == 0) {
- /* use 'create' for blob property place holder */
- *prop = drm_property_create(info->dev,
- DRM_MODE_PROP_BLOB | flags, name, 0);
- if (*prop == 0)
- DRM_ERROR("create %s property failed\n", name);
- }
-
- /* save init value for later */
- info->property_data[property_idx].default_value = 0;
- info->property_data[property_idx].force_dirty = true;
-
- /* always attach property, if created */
- if (*prop) {
- drm_object_attach_property(info->base, *prop, -1);
- ++info->install_count;
- }
- }
-}
-
-int msm_property_install_get_status(struct msm_property_info *info)
-{
- int rc = -ENOMEM;
-
- if (info && (info->install_request == info->install_count))
- rc = 0;
-
- return rc;
-}
-
-int msm_property_index(struct msm_property_info *info,
- struct drm_property *property)
-{
- uint32_t count;
- int32_t idx;
- int rc = -EINVAL;
-
- if (!info || !property) {
- DRM_ERROR("invalid argument(s)\n");
- } else {
- /*
- * Linear search, but start from last found index. This will
- * help if any single property is accessed multiple times in a
- * row. Ideally, we could keep a list of properties sorted in
- * the order of most recent access, but that may be overkill
- * for now.
- */
- mutex_lock(&info->property_lock);
- idx = info->recent_idx;
- count = info->property_count;
- while (count) {
- --count;
-
- /* stop searching on match */
- if (info->property_array[idx] == property) {
- info->recent_idx = idx;
- rc = idx;
- break;
- }
-
- /* move to next valid index */
- if (--idx < 0)
- idx = info->property_count - 1;
- }
- mutex_unlock(&info->property_lock);
- }
-
- return rc;
-}
-
-int msm_property_set_dirty(struct msm_property_info *info,
- struct msm_property_state *property_state,
- int property_idx)
-{
- if (!info || !property_state || !property_state->values) {
- DRM_ERROR("invalid argument(s)\n");
- return -EINVAL;
- }
- mutex_lock(&info->property_lock);
- _msm_property_set_dirty_no_lock(info, property_state, property_idx);
- mutex_unlock(&info->property_lock);
- return 0;
-}
-
-int msm_property_atomic_set(struct msm_property_info *info,
- struct msm_property_state *property_state,
- struct drm_property *property, uint64_t val)
-{
- struct drm_property_blob *blob;
- int property_idx, rc = -EINVAL;
-
- property_idx = msm_property_index(info, property);
- if (!info || !property_state ||
- (property_idx == -EINVAL) || !property_state->values) {
- DRM_DEBUG("invalid argument(s)\n");
- } else {
- /* extra handling for incoming properties */
- mutex_lock(&info->property_lock);
- if ((property->flags & DRM_MODE_PROP_BLOB) &&
- (property_idx < info->blob_count)) {
- /* DRM lookup also takes a reference */
- blob = drm_property_lookup_blob(info->dev,
- (uint32_t)val);
- if (!blob) {
- DRM_ERROR("blob not found\n");
- val = 0;
- } else {
- DBG("Blob %u saved", blob->base.id);
- val = blob->base.id;
-
- /* save blob - need to clear previous ref */
- if (property_state->values[property_idx].blob)
- drm_property_blob_put(
- property_state->values[
- property_idx].blob);
- property_state->values[property_idx].blob =
- blob;
- }
- }
-
- /* update value and flag as dirty */
- if (property_state->values[property_idx].value != val ||
- info->property_data[property_idx].force_dirty) {
- property_state->values[property_idx].value = val;
- _msm_property_set_dirty_no_lock(info, property_state,
- property_idx);
-
- DBG("%s - %lld", property->name, val);
- }
- mutex_unlock(&info->property_lock);
- rc = 0;
- }
-
- return rc;
-}
-
-int msm_property_atomic_get(struct msm_property_info *info,
- struct msm_property_state *property_state,
- struct drm_property *property, uint64_t *val)
-{
- int property_idx, rc = -EINVAL;
-
- property_idx = msm_property_index(info, property);
- if (!info || (property_idx == -EINVAL) ||
- !property_state->values || !val) {
- DRM_DEBUG("Invalid argument(s)\n");
- } else {
- mutex_lock(&info->property_lock);
- *val = property_state->values[property_idx].value;
- mutex_unlock(&info->property_lock);
- rc = 0;
- }
-
- return rc;
-}
-
-void *msm_property_alloc_state(struct msm_property_info *info)
-{
- void *state = NULL;
-
- if (!info) {
- DRM_ERROR("invalid property info\n");
- return NULL;
- }
-
- mutex_lock(&info->property_lock);
- if (info->state_cache_size)
- state = info->state_cache[--(info->state_cache_size)];
- mutex_unlock(&info->property_lock);
-
- if (!state && info->state_size)
- state = kmalloc(info->state_size, GFP_KERNEL);
-
- if (!state)
- DRM_ERROR("failed to allocate state\n");
-
- return state;
-}
-
-/**
- * _msm_property_free_state - helper function for freeing local state objects
- * @info: Pointer to property info container struct
- * @st: Pointer to state object
- */
-static void _msm_property_free_state(struct msm_property_info *info, void *st)
-{
- if (!info || !st)
- return;
-
- mutex_lock(&info->property_lock);
- if (info->state_cache_size < MSM_PROP_STATE_CACHE_SIZE)
- info->state_cache[(info->state_cache_size)++] = st;
- else
- kfree(st);
- mutex_unlock(&info->property_lock);
-}
-
-void msm_property_reset_state(struct msm_property_info *info, void *state,
- struct msm_property_state *property_state,
- struct msm_property_value *property_values)
-{
- uint32_t i;
-
- if (!info) {
- DRM_ERROR("invalid property info\n");
- return;
- }
-
- if (state)
- memset(state, 0, info->state_size);
-
- if (property_state) {
- property_state->property_count = info->property_count;
- property_state->values = property_values;
- INIT_LIST_HEAD(&property_state->dirty_list);
- }
-
- /*
- * Assign default property values. This helper is mostly used
- * to initialize newly created state objects.
- */
- if (property_values)
- for (i = 0; i < info->property_count; ++i) {
- property_values[i].value =
- info->property_data[i].default_value;
- property_values[i].blob = NULL;
- INIT_LIST_HEAD(&property_values[i].dirty_node);
- }
-}
-
-void msm_property_duplicate_state(struct msm_property_info *info,
- void *old_state, void *state,
- struct msm_property_state *property_state,
- struct msm_property_value *property_values)
-{
- uint32_t i;
-
- if (!info || !old_state || !state) {
- DRM_ERROR("invalid argument(s)\n");
- return;
- }
-
- memcpy(state, old_state, info->state_size);
-
- if (!property_state)
- return;
-
- INIT_LIST_HEAD(&property_state->dirty_list);
- property_state->values = property_values;
-
- if (property_state->values)
- /* add ref count for blobs and initialize dirty nodes */
- for (i = 0; i < info->property_count; ++i) {
- if (property_state->values[i].blob)
- drm_property_blob_get(
- property_state->values[i].blob);
- INIT_LIST_HEAD(&property_state->values[i].dirty_node);
- }
-}
-
-void msm_property_destroy_state(struct msm_property_info *info, void *state,
- struct msm_property_state *property_state)
-{
- uint32_t i;
-
- if (!info || !state) {
- DRM_ERROR("invalid argument(s)\n");
- return;
- }
- if (property_state && property_state->values) {
- /* remove ref count for blobs */
- for (i = 0; i < info->property_count; ++i)
- if (property_state->values[i].blob) {
- drm_property_blob_put(
- property_state->values[i].blob);
- property_state->values[i].blob = NULL;
- }
- }
-
- _msm_property_free_state(info, state);
-}
-
-void *msm_property_get_blob(struct msm_property_info *info,
- struct msm_property_state *property_state,
- size_t *byte_len,
- uint32_t property_idx)
-{
- struct drm_property_blob *blob;
- size_t len = 0;
- void *rc = 0;
-
- if (!info || !property_state || !property_state->values ||
- (property_idx >= info->blob_count)) {
- DRM_ERROR("invalid argument(s)\n");
- } else {
- blob = property_state->values[property_idx].blob;
- if (blob) {
- len = blob->length;
- rc = &blob->data;
- }
- }
-
- if (byte_len)
- *byte_len = len;
-
- return rc;
-}
-
-int msm_property_set_blob(struct msm_property_info *info,
- struct drm_property_blob **blob_reference,
- void *blob_data,
- size_t byte_len,
- uint32_t property_idx)
-{
- struct drm_property_blob *blob = NULL;
- int rc = -EINVAL;
-
- if (!info || !blob_reference || (property_idx >= info->blob_count)) {
- DRM_ERROR("invalid argument(s)\n");
- } else {
- /* create blob */
- if (blob_data && byte_len) {
- blob = drm_property_create_blob(info->dev,
- byte_len,
- blob_data);
- if (IS_ERR_OR_NULL(blob)) {
- rc = PTR_ERR(blob);
- DRM_ERROR("failed to create blob, %d\n", rc);
- goto exit;
- }
- }
-
- /* update drm object */
- rc = drm_object_property_set_value(info->base,
- info->property_array[property_idx],
- blob ? blob->base.id : 0);
- if (rc) {
- DRM_ERROR("failed to set blob to property\n");
- if (blob)
- drm_property_blob_put(blob);
- goto exit;
- }
-
- /* update local reference */
- if (*blob_reference)
- drm_property_blob_put(*blob_reference);
- *blob_reference = blob;
- }
-
-exit:
- return rc;
-}
-
-int msm_property_set_property(struct msm_property_info *info,
- struct msm_property_state *property_state,
- uint32_t property_idx,
- uint64_t val)
-{
- int rc = -EINVAL;
-
- if (!info || (property_idx >= info->property_count) ||
- property_idx < info->blob_count ||
- !property_state || !property_state->values) {
- DRM_ERROR("invalid argument(s)\n");
- } else {
- struct drm_property *drm_prop;
-
- mutex_lock(&info->property_lock);
-
- /* update cached value */
- property_state->values[property_idx].value = val;
-
- /* update the new default value for immutables */
- drm_prop = info->property_array[property_idx];
- if (drm_prop->flags & DRM_MODE_PROP_IMMUTABLE)
- info->property_data[property_idx].default_value = val;
-
- mutex_unlock(&info->property_lock);
-
- /* update drm object */
- rc = drm_object_property_set_value(info->base, drm_prop, val);
- if (rc)
- DRM_ERROR("failed set property value, idx %d rc %d\n",
- property_idx, rc);
-
- }
-
- return rc;
-}
-
diff --git a/drivers/gpu/drm/msm/msm_prop.h b/drivers/gpu/drm/msm/msm_prop.h
deleted file mode 100644
index 6785955..0000000
--- a/drivers/gpu/drm/msm/msm_prop.h
+++ /dev/null
@@ -1,438 +0,0 @@
-/* Copyright (c) 2016-2018, The Linux Foundation. All rights reserved.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 and
- * only version 2 as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- */
-
-#ifndef _MSM_PROP_H_
-#define _MSM_PROP_H_
-
-#include <linux/list.h>
-#include "msm_drv.h"
-
-#define MSM_PROP_STATE_CACHE_SIZE 2
-
-/**
- * struct msm_property_data - opaque structure for tracking per
- * drm-object per property stuff
- * @default_value: Default property value for this drm object
- * @force_dirty: Always dirty property on incoming sets, rather than checking
- * for modified values
- */
-struct msm_property_data {
- uint64_t default_value;
- bool force_dirty;
-};
-
-/**
- * struct msm_property_value - opaque structure for tracking per
- * drm-object per property stuff
- * @value: Current property value for this drm object
- * @blob: Pointer to associated blob data, if available
- * @dirty_node: Linked list node to track if property is dirty or not
- */
-struct msm_property_value {
- uint64_t value;
- struct drm_property_blob *blob;
- struct list_head dirty_node;
-};
-
-/**
- * struct msm_property_info: Structure for property/state helper functions
- * @base: Pointer to base drm object (plane/crtc/etc.)
- * @dev: Pointer to drm device object
- * @property_array: Pointer to array for storing created property objects
- * @property_data: Pointer to array for storing private property data
- * @property_count: Total number of properties
- * @blob_count: Total number of blob properties, should be <= count
- * @install_request: Total number of property 'install' requests
- * @install_count: Total number of successful 'install' requests
- * @recent_idx: Index of property most recently accessed by set/get
- * @is_active: Whether or not drm component properties are 'active'
- * @state_cache: Cache of local states, to prevent alloc/free thrashing
- * @state_size: Size of local state structures
- * @state_cache_size: Number of state structures currently stored in state_cache
- * @property_lock: Mutex to protect local variables
- */
-struct msm_property_info {
- struct drm_mode_object *base;
- struct drm_device *dev;
-
- struct drm_property **property_array;
- struct msm_property_data *property_data;
- uint32_t property_count;
- uint32_t blob_count;
- uint32_t install_request;
- uint32_t install_count;
-
- int32_t recent_idx;
-
- bool is_active;
-
- void *state_cache[MSM_PROP_STATE_CACHE_SIZE];
- uint32_t state_size;
- int32_t state_cache_size;
- struct mutex property_lock;
-};
-
-/**
- * struct msm_property_state - Structure for local property state information
- * @property_count: Total number of properties
- * @values: Pointer to array of msm_property_value objects
- * @dirty_list: List of all properties that have been 'atomic_set' but not
- * yet cleared with 'msm_property_pop_dirty'
- */
-struct msm_property_state {
- uint32_t property_count;
- struct msm_property_value *values;
- struct list_head dirty_list;
-};
-
-/**
- * msm_property_index_to_drm_property - get drm property struct from prop index
- * @info: Pointer to property info container struct
- * @property_idx: Property index
- * Returns: drm_property pointer associated with property index
- */
-static inline
-struct drm_property *msm_property_index_to_drm_property(
- struct msm_property_info *info, uint32_t property_idx)
-{
- if (!info || property_idx >= info->property_count)
- return NULL;
-
- return info->property_array[property_idx];
-}
-
-/**
- * msm_property_get_default - query default value of a property
- * @info: Pointer to property info container struct
- * @property_idx: Property index
- * Returns: Default value for specified property
- */
-static inline
-uint64_t msm_property_get_default(struct msm_property_info *info,
- uint32_t property_idx)
-{
- uint64_t rc = 0;
-
- if (!info)
- return 0;
-
- mutex_lock(&info->property_lock);
- if (property_idx < info->property_count)
- rc = info->property_data[property_idx].default_value;
- mutex_unlock(&info->property_lock);
-
- return rc;
-}
-
-/**
- * msm_property_set_is_active - set overall 'active' status for all properties
- * @info: Pointer to property info container struct
- * @is_active: New 'is active' status
- */
-static inline
-void msm_property_set_is_active(struct msm_property_info *info, bool is_active)
-{
- if (info) {
- mutex_lock(&info->property_lock);
- info->is_active = is_active;
- mutex_unlock(&info->property_lock);
- }
-}
-
-/**
- * msm_property_get_is_active - query property 'is active' status
- * @info: Pointer to property info container struct
- * Returns: Current 'is active's status
- */
-static inline
-bool msm_property_get_is_active(struct msm_property_info *info)
-{
- bool rc = false;
-
- if (info) {
- mutex_lock(&info->property_lock);
- rc = info->is_active;
- mutex_unlock(&info->property_lock);
- }
-
- return rc;
-}
-
-/**
- * msm_property_pop_dirty - determine next dirty property and clear
- * its dirty flag
- * @info: Pointer to property info container struct
- * @property_state: Pointer to property state container struct
- * Returns: Valid msm property index on success,
- * -EAGAIN if no dirty properties are available
- * Property indicies returned from this function are similar
- * to those returned by the msm_property_index function.
- */
-int msm_property_pop_dirty(struct msm_property_info *info,
- struct msm_property_state *property_state);
-
-/**
- * msm_property_init - initialize property info structure
- * @info: Pointer to property info container struct
- * @base: Pointer to base drm object (plane/crtc/etc.)
- * @dev: Pointer to drm device object
- * @property_array: Pointer to array for storing created property objects
- * @property_data: Pointer to array for storing private property data
- * @property_count: Total number of properties
- * @blob_count: Total number of blob properties, should be <= count
- * @state_size: Size of local state object
- */
-void msm_property_init(struct msm_property_info *info,
- struct drm_mode_object *base,
- struct drm_device *dev,
- struct drm_property **property_array,
- struct msm_property_data *property_data,
- uint32_t property_count,
- uint32_t blob_count,
- uint32_t state_size);
-
-/**
- * msm_property_destroy - destroy helper info structure
- *
- * @info: Pointer to property info container struct
- */
-void msm_property_destroy(struct msm_property_info *info);
-
-/**
- * msm_property_install_range - install standard drm range property
- * @info: Pointer to property info container struct
- * @name: Property name
- * @flags: Other property type flags, e.g. DRM_MODE_PROP_IMMUTABLE
- * @min: Min property value
- * @max: Max property value
- * @init: Default Property value
- * @property_idx: Property index
- */
-void msm_property_install_range(struct msm_property_info *info,
- const char *name,
- int flags,
- uint64_t min,
- uint64_t max,
- uint64_t init,
- uint32_t property_idx);
-
-/**
- * msm_property_install_volatile_range - install drm range property
- * This function is similar to msm_property_install_range, but assumes
- * that the property is meant for holding user pointers or descriptors
- * that may reference volatile data without having an updated value.
- * @info: Pointer to property info container struct
- * @name: Property name
- * @flags: Other property type flags, e.g. DRM_MODE_PROP_IMMUTABLE
- * @min: Min property value
- * @max: Max property value
- * @init: Default Property value
- * @property_idx: Property index
- */
-void msm_property_install_volatile_range(struct msm_property_info *info,
- const char *name,
- int flags,
- uint64_t min,
- uint64_t max,
- uint64_t init,
- uint32_t property_idx);
-
-/**
- * msm_property_install_rotation - install standard drm rotation property
- * @info: Pointer to property info container struct
- * @plane: Pointer to drm_plane which this property is installed on
- * @rotation: The default value for this new property
- * @supported_rotations: Bitmask of supported rotation values (see
- * drm_plane_create_rotation_property for more details)
- * @property_idx: Property index
- */
-void msm_property_install_rotation(struct msm_property_info *info,
- struct drm_plane *plane,
- unsigned int rotation,
- unsigned int supported_rotations,
- uint32_t property_idx);
-
-/**
- * msm_property_install_enum - install standard drm enum/bitmask property
- * @info: Pointer to property info container struct
- * @name: Property name
- * @flags: Other property type flags, e.g. DRM_MODE_PROP_IMMUTABLE
- * @is_bitmask: Set to non-zero to create a bitmask property, rather than an
- * enumeration one
- * @values: Array of allowable enumeration/bitmask values
- * @num_values: Size of values array
- * @property_idx: Property index
- */
-void msm_property_install_enum(struct msm_property_info *info,
- const char *name,
- int flags,
- int is_bitmask,
- const struct drm_prop_enum_list *values,
- int num_values,
- uint32_t property_idx);
-
-/**
- * msm_property_install_blob - install standard drm blob property
- * @info: Pointer to property info container struct
- * @name: Property name
- * @flags: Extra flags for property creation
- * @property_idx: Property index
- */
-void msm_property_install_blob(struct msm_property_info *info,
- const char *name,
- int flags,
- uint32_t property_idx);
-
-/**
- * msm_property_install_get_status - query overal status of property additions
- * @info: Pointer to property info container struct
- * Returns: Zero if previous property install calls were all successful
- */
-int msm_property_install_get_status(struct msm_property_info *info);
-
-/**
- * msm_property_index - determine property index from drm_property ptr
- * @info: Pointer to property info container struct
- * @property: Incoming property pointer
- * Returns: Valid property index, or -EINVAL on error
- */
-int msm_property_index(struct msm_property_info *info,
- struct drm_property *property);
-
-/**
- * msm_property_set_dirty - forcibly flag a property as dirty
- * @info: Pointer to property info container struct
- * @property_state: Pointer to property state container struct
- * @property_idx: Property index
- * Returns: Zero on success
- */
-int msm_property_set_dirty(struct msm_property_info *info,
- struct msm_property_state *property_state,
- int property_idx);
-
-/**
- * msm_property_atomic_set - helper function for atomic property set callback
- * @info: Pointer to property info container struct
- * @property_state: Pointer to local state structure
- * @property: Incoming property pointer
- * @val: Incoming property value
- * Returns: Zero on success
- */
-int msm_property_atomic_set(struct msm_property_info *info,
- struct msm_property_state *property_state,
- struct drm_property *property,
- uint64_t val);
-
-/**
- * msm_property_atomic_get - helper function for atomic property get callback
- * @info: Pointer to property info container struct
- * @property_state: Pointer to local state structure
- * @property: Incoming property pointer
- * @val: Pointer to variable for receiving property value
- * Returns: Zero on success
- */
-int msm_property_atomic_get(struct msm_property_info *info,
- struct msm_property_state *property_state,
- struct drm_property *property,
- uint64_t *val);
-
-/**
- * msm_property_alloc_state - helper function for allocating local state objects
- * @info: Pointer to property info container struct
- */
-void *msm_property_alloc_state(struct msm_property_info *info);
-
-/**
- * msm_property_reset_state - helper function for state reset callback
- * @info: Pointer to property info container struct
- * @state: Pointer to local state structure
- * @property_state: Pointer to property state container struct
- * @property_values: Pointer to property values cache array
- */
-void msm_property_reset_state(struct msm_property_info *info, void *state,
- struct msm_property_state *property_state,
- struct msm_property_value *property_values);
-
-/**
- * msm_property_duplicate_state - helper function for duplicate state cb
- * @info: Pointer to property info container struct
- * @old_state: Pointer to original state structure
- * @state: Pointer to newly created state structure
- * @property_state: Pointer to destination property state container struct
- * @property_values: Pointer to property values cache array
- */
-void msm_property_duplicate_state(struct msm_property_info *info,
- void *old_state,
- void *state,
- struct msm_property_state *property_state,
- struct msm_property_value *property_values);
-
-/**
- * msm_property_destroy_state - helper function for destroy state cb
- * @info: Pointer to property info container struct
- * @state: Pointer to local state structure
- * @property_state: Pointer to property state container struct
- */
-void msm_property_destroy_state(struct msm_property_info *info,
- void *state,
- struct msm_property_state *property_state);
-
-/**
- * msm_property_get_blob - obtain cached data pointer for drm blob property
- * @info: Pointer to property info container struct
- * @property_state: Pointer to property state container struct
- * @byte_len: Optional pointer to variable for accepting blob size
- * @property_idx: Property index
- * Returns: Pointer to blob data
- */
-void *msm_property_get_blob(struct msm_property_info *info,
- struct msm_property_state *property_state,
- size_t *byte_len,
- uint32_t property_idx);
-
-/**
- * msm_property_set_blob - update blob property on a drm object
- * This function updates the blob property value of the given drm object. Its
- * intended use is to update blob properties that have been created with the
- * DRM_MODE_PROP_IMMUTABLE flag set.
- * @info: Pointer to property info container struct
- * @blob_reference: Reference to a pointer that holds the created data blob
- * @blob_data: Pointer to blob data
- * @byte_len: Length of blob data, in bytes
- * @property_idx: Property index
- * Returns: Zero on success
- */
-int msm_property_set_blob(struct msm_property_info *info,
- struct drm_property_blob **blob_reference,
- void *blob_data,
- size_t byte_len,
- uint32_t property_idx);
-
-/**
- * msm_property_set_property - update property on a drm object
- * This function updates the property value of the given drm object. Its
- * intended use is to update properties that have been created with the
- * DRM_MODE_PROP_IMMUTABLE flag set.
- * Note: This function cannot be called on a blob.
- * @info: Pointer to property info container struct
- * @property_state: Pointer to property state container struct
- * @property_idx: Property index
- * @val: value of the property to set
- * Returns: Zero on success
- */
-int msm_property_set_property(struct msm_property_info *info,
- struct msm_property_state *property_state,
- uint32_t property_idx,
- uint64_t val);
-
-#endif /* _MSM_PROP_H_ */
-
--
The Qualcomm Innovation Center, Inc. is a member of the Code Aurora Forum,
a Linux Foundation Collaborative Project
_______________________________________________
Freedreno mailing list
Freedreno@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/freedreno
^ permalink raw reply related [flat|nested] 18+ messages in thread
* [DPU PATCH 7/7] drm/msm: remove dpu specific uapi header
2018-05-23 19:30 [DPU PATCH 0/7] clean up DPU custom properties Jeykumar Sankaran
[not found] ` <1527103862-13934-1-git-send-email-jsanka-sgV2jX0FEOL9JmXXK+q4OQ@public.gmane.org>
@ 2018-05-23 19:31 ` Jeykumar Sankaran
2018-06-04 19:59 ` [Freedreno] " Sean Paul
1 sibling, 1 reply; 18+ messages in thread
From: Jeykumar Sankaran @ 2018-05-23 19:31 UTC (permalink / raw)
To: dri-devel, freedreno, linux-arm-msm; +Cc: hoegsberg
remove unwanted dpu uapi headers exposing custom
payload layouts for custom properties
Signed-off-by: Jeykumar Sankaran <jsanka@codeaurora.org>
---
include/uapi/drm/dpu_drm.h | 220 ---------------------------
include/uapi/drm/msm_drm_pp.h | 345 ------------------------------------------
2 files changed, 565 deletions(-)
delete mode 100644 include/uapi/drm/dpu_drm.h
delete mode 100644 include/uapi/drm/msm_drm_pp.h
diff --git a/include/uapi/drm/dpu_drm.h b/include/uapi/drm/dpu_drm.h
deleted file mode 100644
index 93af1fb..0000000
--- a/include/uapi/drm/dpu_drm.h
+++ /dev/null
@@ -1,220 +0,0 @@
-#ifndef _DPU_DRM_H_
-#define _DPU_DRM_H_
-
-#include "drm.h"
-
-/* Total number of supported color planes */
-#define DPU_MAX_PLANES 4
-
-/* Total number of parameterized detail enhancer mapping curves */
-#define DPU_MAX_DE_CURVES 3
-
- /* Y/RGB and UV filter configuration */
-#define FILTER_EDGE_DIRECTED_2D 0x0
-#define FILTER_CIRCULAR_2D 0x1
-#define FILTER_SEPARABLE_1D 0x2
-#define FILTER_BILINEAR 0x3
-
-/* Alpha filters */
-#define FILTER_ALPHA_DROP_REPEAT 0x0
-#define FILTER_ALPHA_BILINEAR 0x1
-#define FILTER_ALPHA_2D 0x3
-
-/* Blend filters */
-#define FILTER_BLEND_CIRCULAR_2D 0x0
-#define FILTER_BLEND_SEPARABLE_1D 0x1
-
-/* LUT configuration flags */
-#define SCALER_LUT_SWAP 0x1
-#define SCALER_LUT_DIR_WR 0x2
-#define SCALER_LUT_Y_CIR_WR 0x4
-#define SCALER_LUT_UV_CIR_WR 0x8
-#define SCALER_LUT_Y_SEP_WR 0x10
-#define SCALER_LUT_UV_SEP_WR 0x20
-
-/**
- * Blend operations for "blend_op" property
- *
- * @DPU_DRM_BLEND_OP_NOT_DEFINED: No blend operation defined for the layer.
- * @DPU_DRM_BLEND_OP_OPAQUE: Apply a constant blend operation. The layer
- * would appear opaque in case fg plane alpha
- * is 0xff.
- * @DPU_DRM_BLEND_OP_PREMULTIPLIED: Apply source over blend rule. Layer already
- * has alpha pre-multiplication done. If the fg
- * plane alpha is less than 0xff, apply
- * modulation as well. This operation is
- * intended on layers having alpha channel.
- * @DPU_DRM_BLEND_OP_COVERAGE: Apply source over blend rule. Layer is not
- * alpha pre-multiplied. Apply
- * pre-multiplication. If fg plane alpha is
- * less than 0xff, apply modulation as well.
- * @DPU_DRM_BLEND_OP_MAX: Used to track maximum blend operation
- * possible by mdp.
- */
-#define DPU_DRM_BLEND_OP_NOT_DEFINED 0
-#define DPU_DRM_BLEND_OP_OPAQUE 1
-#define DPU_DRM_BLEND_OP_PREMULTIPLIED 2
-#define DPU_DRM_BLEND_OP_COVERAGE 3
-#define DPU_DRM_BLEND_OP_MAX 4
-
-/**
- * Bit masks for "src_config" property
- * construct bitmask via (1UL << DPU_DRM_<flag>)
- */
-#define DPU_DRM_DEINTERLACE 0 /* Specifies interlaced input */
-
-/* DRM bitmasks are restricted to 0..63 */
-#define DPU_DRM_BITMASK_COUNT 64
-
-/* Number of dest scalers supported */
-#define DPU_MAX_DS_COUNT 2
-
-/*
- * Destination scaler flag config
- */
-#define DPU_DRM_DESTSCALER_ENABLE 0x1
-#define DPU_DRM_DESTSCALER_SCALE_UPDATE 0x2
-#define DPU_DRM_DESTSCALER_ENHANCER_UPDATE 0x4
-#define DPU_DRM_DESTSCALER_PU_ENABLE 0x8
-
-/**
- * struct dpu_drm_dest_scaler_cfg - destination scaler config structure
- * @flags: Flag to switch between mode for destination scaler
- * refer to destination scaler flag config
- * @index: Destination scaler selection index
- * @lm_width: Layer mixer width configuration
- * @lm_height: Layer mixer height configuration
- * @scaler_cfg: The scaling parameters for all the mode except disable
- * Userspace pointer to struct dpu_drm_scaler_v2
- */
-struct dpu_drm_dest_scaler_cfg {
- uint32_t flags;
- uint32_t index;
- uint32_t lm_width;
- uint32_t lm_height;
- uint64_t scaler_cfg;
-};
-
-/**
- * struct dpu_drm_dest_scaler_data - destination scaler data struct
- * @num_dest_scaler: Number of dest scalers to be configured
- * @ds_cfg: Destination scaler block configuration
- */
-struct dpu_drm_dest_scaler_data {
- uint32_t num_dest_scaler;
- struct dpu_drm_dest_scaler_cfg ds_cfg[DPU_MAX_DS_COUNT];
-};
-
-/*
- * Define constants for struct dpu_drm_csc
- */
-#define DPU_CSC_MATRIX_COEFF_SIZE 9
-#define DPU_CSC_CLAMP_SIZE 6
-#define DPU_CSC_BIAS_SIZE 3
-
-/**
- * struct dpu_drm_csc_v1 - version 1 of struct dpu_drm_csc
- * @ctm_coeff: Matrix coefficients, in S31.32 format
- * @pre_bias: Pre-bias array values
- * @post_bias: Post-bias array values
- * @pre_clamp: Pre-clamp array values
- * @post_clamp: Post-clamp array values
- */
-struct dpu_drm_csc_v1 {
- int64_t ctm_coeff[DPU_CSC_MATRIX_COEFF_SIZE];
- uint32_t pre_bias[DPU_CSC_BIAS_SIZE];
- uint32_t post_bias[DPU_CSC_BIAS_SIZE];
- uint32_t pre_clamp[DPU_CSC_CLAMP_SIZE];
- uint32_t post_clamp[DPU_CSC_CLAMP_SIZE];
-};
-
-/**
- * struct dpu_drm_color - struct to store the color and alpha values
- * @color_0: Color 0 value
- * @color_1: Color 1 value
- * @color_2: Color 2 value
- * @color_3: Color 3 value
- */
-struct dpu_drm_color {
- uint32_t color_0;
- uint32_t color_1;
- uint32_t color_2;
- uint32_t color_3;
-};
-
-/* Total number of supported dim layers */
-#define DPU_MAX_DIM_LAYERS 7
-
-/* DPU_DRM_DIM_LAYER_CONFIG_FLAG - flags for Dim Layer */
-/* Color fill inside of the rect, including border */
-#define DPU_DRM_DIM_LAYER_INCLUSIVE 0x1
-/* Color fill outside of the rect, excluding border */
-#define DPU_DRM_DIM_LAYER_EXCLUSIVE 0x2
-
-/**
- * struct dpu_drm_dim_layer - dim layer cfg struct
- * @flags: Refer DPU_DRM_DIM_LAYER_CONFIG_FLAG for possible values
- * @stage: Blending stage of the dim layer
- * @color_fill: Color fill for dim layer
- * @rect: Dim layer coordinates
- */
-struct dpu_drm_dim_layer_cfg {
- uint32_t flags;
- uint32_t stage;
- struct dpu_drm_color color_fill;
- struct drm_clip_rect rect;
-};
-
-/**
- * struct dpu_drm_dim_layer_v1 - version 1 of dim layer struct
- * @num_layers: Numer of Dim Layers
- * @layer: Dim layer user cfgs ptr for the num_layers
- */
-struct dpu_drm_dim_layer_v1 {
- uint32_t num_layers;
- struct dpu_drm_dim_layer_cfg layer_cfg[DPU_MAX_DIM_LAYERS];
-};
-
-/* Writeback Config version definition */
-#define DPU_DRM_WB_CFG 0x1
-
-/* DPU_DRM_WB_CONFIG_FLAGS - Writeback configuration flags */
-#define DPU_DRM_WB_CFG_FLAGS_CONNECTED (1<<0)
-
-/**
- * struct dpu_drm_wb_cfg - Writeback configuration structure
- * @flags: see DRM_MSM_WB_CONFIG_FLAGS
- * @connector_id: writeback connector identifier
- * @count_modes: Count of modes in modes_ptr
- * @modes: Pointer to struct drm_mode_modeinfo
- */
-struct dpu_drm_wb_cfg {
- uint32_t flags;
- uint32_t connector_id;
- uint32_t count_modes;
- uint64_t modes;
-};
-
-#define DPU_MAX_ROI_V1 4
-
-/**
- * struct dpu_drm_roi_v1 - list of regions of interest for a drm object
- * @num_rects: number of valid rectangles in the roi array
- * @roi: list of roi rectangles
- */
-struct dpu_drm_roi_v1 {
- uint32_t num_rects;
- struct drm_clip_rect roi[DPU_MAX_ROI_V1];
-};
-
-/**
- * Define extended power modes supported by the DPU connectors.
- */
-#define DPU_MODE_DPMS_ON 0
-#define DPU_MODE_DPMS_LP1 1
-#define DPU_MODE_DPMS_LP2 2
-#define DPU_MODE_DPMS_STANDBY 3
-#define DPU_MODE_DPMS_SUSPEND 4
-#define DPU_MODE_DPMS_OFF 5
-
-#endif /* _DPU_DRM_H_ */
diff --git a/include/uapi/drm/msm_drm_pp.h b/include/uapi/drm/msm_drm_pp.h
deleted file mode 100644
index a3b5794..0000000
--- a/include/uapi/drm/msm_drm_pp.h
+++ /dev/null
@@ -1,345 +0,0 @@
-#ifndef _MSM_DRM_PP_H_
-#define _MSM_DRM_PP_H_
-
-#include <linux/types.h>
-/**
- * struct drm_msm_pcc_coeff - PCC coefficient structure for each color
- * component.
- * @c: constant coefficient.
- * @r: red coefficient.
- * @g: green coefficient.
- * @b: blue coefficient.
- * @rg: red green coefficient.
- * @gb: green blue coefficient.
- * @rb: red blue coefficient.
- * @rgb: red blue green coefficient.
- */
-
-struct drm_msm_pcc_coeff {
- __u32 c;
- __u32 r;
- __u32 g;
- __u32 b;
- __u32 rg;
- __u32 gb;
- __u32 rb;
- __u32 rgb;
-};
-
-/**
- * struct drm_msm_pcc - pcc feature structure
- * @flags: for customizing operations
- * @r: red coefficients.
- * @g: green coefficients.
- * @b: blue coefficients.
- * @r_rr: second order coefficients
- * @r_gg: second order coefficients
- * @r_bb: second order coefficients
- * @g_rr: second order coefficients
- * @g_gg: second order coefficients
- * @g_bb: second order coefficients
- * @b_rr: second order coefficients
- * @b_gg: second order coefficients
- * @b_bb: second order coefficients
- */
-#define DRM_MSM_PCC3
-struct drm_msm_pcc {
- __u64 flags;
- struct drm_msm_pcc_coeff r;
- struct drm_msm_pcc_coeff g;
- struct drm_msm_pcc_coeff b;
- __u32 r_rr;
- __u32 r_gg;
- __u32 r_bb;
- __u32 g_rr;
- __u32 g_gg;
- __u32 g_bb;
- __u32 b_rr;
- __u32 b_gg;
- __u32 b_bb;
-};
-
-/* struct drm_msm_pa_vlut - picture adjustment vLUT structure
- * flags: for customizing vlut operation
- * val: vLUT values
- */
-#define PA_VLUT_SIZE 256
-struct drm_msm_pa_vlut {
- __u64 flags;
- __u32 val[PA_VLUT_SIZE];
-};
-
-/* struct drm_msm_memcol - Memory color feature structure.
- * Skin, sky, foliage features are supported.
- * @prot_flags: Bit mask for enabling protection feature.
- * @color_adjust_p0: Adjustment curve.
- * @color_adjust_p1: Adjustment curve.
- * @color_adjust_p2: Adjustment curve.
- * @blend_gain: Blend gain weightage from othe PA features.
- * @sat_hold: Saturation hold value.
- * @val_hold: Value hold info.
- * @hue_region: Hue qualifier.
- * @sat_region: Saturation qualifier.
- * @val_region: Value qualifier.
- */
-#define DRM_MSM_MEMCOL
-struct drm_msm_memcol {
- __u64 prot_flags;
- __u32 color_adjust_p0;
- __u32 color_adjust_p1;
- __u32 color_adjust_p2;
- __u32 blend_gain;
- __u32 sat_hold;
- __u32 val_hold;
- __u32 hue_region;
- __u32 sat_region;
- __u32 val_region;
-};
-
-#define GAMUT_3D_MODE_17 1
-#define GAMUT_3D_MODE_5 2
-#define GAMUT_3D_MODE_13 3
-
-#define GAMUT_3D_MODE17_TBL_SZ 1229
-#define GAMUT_3D_MODE5_TBL_SZ 32
-#define GAMUT_3D_MODE13_TBL_SZ 550
-#define GAMUT_3D_SCALE_OFF_SZ 16
-#define GAMUT_3D_SCALEB_OFF_SZ 12
-#define GAMUT_3D_TBL_NUM 4
-#define GAMUT_3D_SCALE_OFF_TBL_NUM 3
-#define GAMUT_3D_MAP_EN (1 << 0)
-
-/**
- * struct drm_msm_3d_col - 3d gamut color component structure
- * @c0: Holds c0 value
- * @c2_c1: Holds c2/c1 values
- */
-struct drm_msm_3d_col {
- __u32 c2_c1;
- __u32 c0;
-};
-/**
- * struct drm_msm_3d_gamut - 3d gamut feature structure
- * @flags: flags for the feature values are:
- * 0 - no map
- * GAMUT_3D_MAP_EN - enable map
- * @mode: lut mode can take following values:
- * - GAMUT_3D_MODE_17
- * - GAMUT_3D_MODE_5
- * - GAMUT_3D_MODE_13
- * @scale_off: Scale offset table
- * @col: Color component tables
- */
-struct drm_msm_3d_gamut {
- __u64 flags;
- __u32 mode;
- __u32 scale_off[GAMUT_3D_SCALE_OFF_TBL_NUM][GAMUT_3D_SCALE_OFF_SZ];
- struct drm_msm_3d_col col[GAMUT_3D_TBL_NUM][GAMUT_3D_MODE17_TBL_SZ];
-};
-
-#define PGC_TBL_LEN 512
-#define PGC_8B_ROUND (1 << 0)
-/**
- * struct drm_msm_pgc_lut - pgc lut feature structure
- * @flags: flags for the featue values can be:
- * - PGC_8B_ROUND
- * @c0: color0 component lut
- * @c1: color1 component lut
- * @c2: color2 component lut
- */
-struct drm_msm_pgc_lut {
- __u64 flags;
- __u32 c0[PGC_TBL_LEN];
- __u32 c1[PGC_TBL_LEN];
- __u32 c2[PGC_TBL_LEN];
-};
-
-#define IGC_TBL_LEN 256
-#define IGC_DITHER_ENABLE (1 << 0)
-/**
- * struct drm_msm_igc_lut - igc lut feature structure
- * @flags: flags for the feature customization, values can be:
- * - IGC_DITHER_ENABLE: Enable dither functionality
- * @c0: color0 component lut
- * @c1: color1 component lut
- * @c2: color2 component lut
- * @strength: dither strength, considered valid when IGC_DITHER_ENABLE
- * is set in flags. Strength value based on source bit width.
- */
-struct drm_msm_igc_lut {
- __u64 flags;
- __u32 c0[IGC_TBL_LEN];
- __u32 c1[IGC_TBL_LEN];
- __u32 c2[IGC_TBL_LEN];
- __u32 strength;
-};
-
-#define AD4_LUT_GRP0_SIZE 33
-#define AD4_LUT_GRP1_SIZE 32
-/*
- * struct drm_msm_ad4_init - ad4 init structure set by user-space client.
- * Init param values can change based on tuning
- * hence it is passed by user-space clients.
- */
-struct drm_msm_ad4_init {
- __u32 init_param_001[AD4_LUT_GRP0_SIZE];
- __u32 init_param_002[AD4_LUT_GRP0_SIZE];
- __u32 init_param_003[AD4_LUT_GRP0_SIZE];
- __u32 init_param_004[AD4_LUT_GRP0_SIZE];
- __u32 init_param_005[AD4_LUT_GRP1_SIZE];
- __u32 init_param_006[AD4_LUT_GRP1_SIZE];
- __u32 init_param_007[AD4_LUT_GRP0_SIZE];
- __u32 init_param_008[AD4_LUT_GRP0_SIZE];
- __u32 init_param_009;
- __u32 init_param_010;
- __u32 init_param_011;
- __u32 init_param_012;
- __u32 init_param_013;
- __u32 init_param_014;
- __u32 init_param_015;
- __u32 init_param_016;
- __u32 init_param_017;
- __u32 init_param_018;
- __u32 init_param_019;
- __u32 init_param_020;
- __u32 init_param_021;
- __u32 init_param_022;
- __u32 init_param_023;
- __u32 init_param_024;
- __u32 init_param_025;
- __u32 init_param_026;
- __u32 init_param_027;
- __u32 init_param_028;
- __u32 init_param_029;
- __u32 init_param_030;
- __u32 init_param_031;
- __u32 init_param_032;
- __u32 init_param_033;
- __u32 init_param_034;
- __u32 init_param_035;
- __u32 init_param_036;
- __u32 init_param_037;
- __u32 init_param_038;
- __u32 init_param_039;
- __u32 init_param_040;
- __u32 init_param_041;
- __u32 init_param_042;
- __u32 init_param_043;
- __u32 init_param_044;
- __u32 init_param_045;
- __u32 init_param_046;
- __u32 init_param_047;
- __u32 init_param_048;
- __u32 init_param_049;
- __u32 init_param_050;
- __u32 init_param_051;
- __u32 init_param_052;
- __u32 init_param_053;
- __u32 init_param_054;
- __u32 init_param_055;
- __u32 init_param_056;
- __u32 init_param_057;
- __u32 init_param_058;
- __u32 init_param_059;
- __u32 init_param_060;
- __u32 init_param_061;
- __u32 init_param_062;
- __u32 init_param_063;
- __u32 init_param_064;
- __u32 init_param_065;
- __u32 init_param_066;
- __u32 init_param_067;
- __u32 init_param_068;
- __u32 init_param_069;
- __u32 init_param_070;
- __u32 init_param_071;
- __u32 init_param_072;
- __u32 init_param_073;
- __u32 init_param_074;
- __u32 init_param_075;
-};
-
-/*
- * struct drm_msm_ad4_cfg - ad4 config structure set by user-space client.
- * Config param values can vary based on tuning,
- * hence it is passed by user-space clients.
- */
-struct drm_msm_ad4_cfg {
- __u32 cfg_param_001;
- __u32 cfg_param_002;
- __u32 cfg_param_003;
- __u32 cfg_param_004;
- __u32 cfg_param_005;
- __u32 cfg_param_006;
- __u32 cfg_param_007;
- __u32 cfg_param_008;
- __u32 cfg_param_009;
- __u32 cfg_param_010;
- __u32 cfg_param_011;
- __u32 cfg_param_012;
- __u32 cfg_param_013;
- __u32 cfg_param_014;
- __u32 cfg_param_015;
- __u32 cfg_param_016;
- __u32 cfg_param_017;
- __u32 cfg_param_018;
- __u32 cfg_param_019;
- __u32 cfg_param_020;
- __u32 cfg_param_021;
- __u32 cfg_param_022;
- __u32 cfg_param_023;
- __u32 cfg_param_024;
- __u32 cfg_param_025;
- __u32 cfg_param_026;
- __u32 cfg_param_027;
- __u32 cfg_param_028;
- __u32 cfg_param_029;
- __u32 cfg_param_030;
- __u32 cfg_param_031;
- __u32 cfg_param_032;
- __u32 cfg_param_033;
- __u32 cfg_param_034;
- __u32 cfg_param_035;
- __u32 cfg_param_036;
- __u32 cfg_param_037;
- __u32 cfg_param_038;
- __u32 cfg_param_039;
- __u32 cfg_param_040;
- __u32 cfg_param_041;
- __u32 cfg_param_042;
- __u32 cfg_param_043;
- __u32 cfg_param_044;
- __u32 cfg_param_045;
- __u32 cfg_param_046;
- __u32 cfg_param_047;
- __u32 cfg_param_048;
- __u32 cfg_param_049;
- __u32 cfg_param_050;
- __u32 cfg_param_051;
- __u32 cfg_param_052;
- __u32 cfg_param_053;
-};
-
-#define DITHER_MATRIX_SZ 16
-
-/**
- * struct drm_msm_dither - dither feature structure
- * @flags: for customizing operations
- * @temporal_en: temperal dither enable
- * @c0_bitdepth: c0 component bit depth
- * @c1_bitdepth: c1 component bit depth
- * @c2_bitdepth: c2 component bit depth
- * @c3_bitdepth: c2 component bit depth
- * @matrix: dither strength matrix
- */
-struct drm_msm_dither {
- __u64 flags;
- __u32 temporal_en;
- __u32 c0_bitdepth;
- __u32 c1_bitdepth;
- __u32 c2_bitdepth;
- __u32 c3_bitdepth;
- __u32 matrix[DITHER_MATRIX_SZ];
-};
-
-#endif /* _MSM_DRM_PP_H_ */
--
The Qualcomm Innovation Center, Inc. is a member of the Code Aurora Forum,
a Linux Foundation Collaborative Project
_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel
^ permalink raw reply related [flat|nested] 18+ messages in thread
* Re: [DPU PATCH 4/7] drm/msm/dpu: switch to drm zpos property
[not found] ` <1527103862-13934-5-git-send-email-jsanka-sgV2jX0FEOL9JmXXK+q4OQ@public.gmane.org>
@ 2018-05-23 21:21 ` Jordan Crouse
[not found] ` <20180523212115.GB16550-9PYrDHPZ2Orvke4nUoYGnHL1okKdlPRT@public.gmane.org>
2018-06-04 20:03 ` Sean Paul
1 sibling, 1 reply; 18+ messages in thread
From: Jordan Crouse @ 2018-05-23 21:21 UTC (permalink / raw)
To: Jeykumar Sankaran
Cc: linux-arm-msm-u79uwXL29TY76Z2rM5mHXA,
dri-devel-PD4FTy7X32lNgt0PjOBp9y5qC8QIuHrW,
robdclark-Re5JQEeQqe8AvxtiuMwx3w,
seanpaul-F7+t8E8rja9g9hUCZPvPmw,
hoegsberg-hpIqsD4AKlfQT0dZR+AlfA,
freedreno-PD4FTy7X32lNgt0PjOBp9y5qC8QIuHrW
On Wed, May 23, 2018 at 12:30:59PM -0700, Jeykumar Sankaran wrote:
> Replace custom plane zpos property with drm core zpos
> property. CRTC relies on the normalized zpos values
> to configure blend stages of each plane.
>
> Signed-off-by: Jeykumar Sankaran <jsanka@codeaurora.org>
> ---
> drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c | 36 +------------------------------
> drivers/gpu/drm/msm/disp/dpu1/dpu_plane.c | 18 +++++++++++++---
> 2 files changed, 16 insertions(+), 38 deletions(-)
>
> diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c b/drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c
> index d439a9e..a0b702f 100644
> --- a/drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c
> +++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c
> @@ -2631,24 +2631,6 @@ struct plane_state {
> u32 pipe_id;
> };
>
> -static int pstate_cmp(const void *a, const void *b)
> -{
> - struct plane_state *pa = (struct plane_state *)a;
> - struct plane_state *pb = (struct plane_state *)b;
> - int rc = 0;
> - int pa_zpos, pb_zpos;
> -
> - pa_zpos = dpu_plane_get_property(pa->dpu_pstate, PLANE_PROP_ZPOS);
> - pb_zpos = dpu_plane_get_property(pb->dpu_pstate, PLANE_PROP_ZPOS);
> -
> - if (pa_zpos != pb_zpos)
> - rc = pa_zpos - pb_zpos;
> - else
> - rc = pa->drm_pstate->crtc_x - pb->drm_pstate->crtc_x;
> -
> - return rc;
> -}
> -
> static int dpu_crtc_atomic_check(struct drm_crtc *crtc,
> struct drm_crtc_state *state)
> {
> @@ -2714,8 +2696,7 @@ static int dpu_crtc_atomic_check(struct drm_crtc *crtc,
>
> pstates[cnt].dpu_pstate = to_dpu_plane_state(pstate);
> pstates[cnt].drm_pstate = pstate;
> - pstates[cnt].stage = dpu_plane_get_property(
> - pstates[cnt].dpu_pstate, PLANE_PROP_ZPOS);
> + pstates[cnt].stage = pstate->normalized_zpos;
> pstates[cnt].pipe_id = dpu_plane_pipe(plane);
>
> /* check dim layer stage with every plane */
> @@ -2771,21 +2752,6 @@ static int dpu_crtc_atomic_check(struct drm_crtc *crtc,
> }
> }
>
> - /* assign mixer stages based on sorted zpos property */
> - sort(pstates, cnt, sizeof(pstates[0]), pstate_cmp, NULL);
> -
> - if (!dpu_is_custom_client()) {
> - int stage_old = pstates[0].stage;
> -
> - z_pos = 0;
> - for (i = 0; i < cnt; i++) {
> - if (stage_old != pstates[i].stage)
> - ++z_pos;
> - stage_old = pstates[i].stage;
> - pstates[i].stage = z_pos;
> - }
> - }
> -
> z_pos = -1;
> for (i = 0; i < cnt; i++) {
> /* reset counts at every new blend stage */
> diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_plane.c b/drivers/gpu/drm/msm/disp/dpu1/dpu_plane.c
> index b033653..28735c8 100644
> --- a/drivers/gpu/drm/msm/disp/dpu1/dpu_plane.c
> +++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_plane.c
> @@ -59,6 +59,7 @@
> #define DPU_NAME_SIZE 12
>
> #define DPU_PLANE_COLOR_FILL_FLAG BIT(31)
> +#define DPU_ZPOS_MAX 255
>
> /* multirect rect index */
> enum {
> @@ -1518,9 +1519,6 @@ static void _dpu_plane_install_properties(struct drm_plane *plane,
> /* reserve zpos == 0 for primary planes */
> zpos_def = drm_plane_index(plane) + 1;
> }
> -
> - msm_property_install_range(&pdpu->property_info, "zpos",
> - 0x0, 0, zpos_max, zpos_def, PLANE_PROP_ZPOS);
> }
>
> static int dpu_plane_atomic_set_property(struct drm_plane *plane,
> @@ -1958,6 +1956,7 @@ struct drm_plane *dpu_plane_init(struct drm_device *dev,
> struct msm_drm_private *priv;
> struct dpu_kms *kms;
> enum drm_plane_type type;
> + int zpos_max = DPU_ZPOS_MAX;
> int ret = -EINVAL;
>
> if (!dev) {
> @@ -2049,6 +2048,19 @@ struct drm_plane *dpu_plane_init(struct drm_device *dev,
> if (ret)
> goto clean_sspp;
>
> + pdpu->catalog = kms->catalog;
> +
> + if (kms->catalog->mixer_count &&
> + kms->catalog->mixer[0].sblk->maxblendstages) {
> + zpos_max = kms->catalog->mixer[0].sblk->maxblendstages - 1;
> + if (zpos_max > DPU_STAGE_MAX - DPU_STAGE_0 - 1)
> + zpos_max = DPU_STAGE_MAX - DPU_STAGE_0 - 1;
> + }
> +
> + ret = drm_plane_create_zpos_property(plane, 0, 0, zpos_max);
> + if (ret)
> + DPU_ERROR("failed to install zpos property, rc = %d\n", ret);
> +
drm_plane_create_zpos_property() can either return 0 or -ENOMEM so
printing the return value isn't interesting.
> /* success! finalize initialization */
> drm_plane_helper_add(plane, &dpu_plane_helper_funcs);
>
> --
> The Qualcomm Innovation Center, Inc. is a member of the Code Aurora Forum,
> a Linux Foundation Collaborative Project
>
> _______________________________________________
> Freedreno mailing list
> Freedreno@lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/freedreno
--
The Qualcomm Innovation Center, Inc. is a member of Code Aurora Forum,
a Linux Foundation Collaborative Project
_______________________________________________
Freedreno mailing list
Freedreno@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/freedreno
^ permalink raw reply [flat|nested] 18+ messages in thread
* Re: [DPU PATCH 2/7] drm/msm/dpu: clean up dpu plane custom properties
[not found] ` <1527103862-13934-3-git-send-email-jsanka-sgV2jX0FEOL9JmXXK+q4OQ@public.gmane.org>
@ 2018-06-04 19:53 ` Sean Paul
2018-06-05 19:32 ` Jeykumar Sankaran
0 siblings, 1 reply; 18+ messages in thread
From: Sean Paul @ 2018-06-04 19:53 UTC (permalink / raw)
To: Jeykumar Sankaran
Cc: linux-arm-msm-u79uwXL29TY76Z2rM5mHXA,
dri-devel-PD4FTy7X32lNgt0PjOBp9y5qC8QIuHrW,
robdclark-Re5JQEeQqe8AvxtiuMwx3w,
seanpaul-F7+t8E8rja9g9hUCZPvPmw,
hoegsberg-hpIqsD4AKlfQT0dZR+AlfA,
freedreno-PD4FTy7X32lNgt0PjOBp9y5qC8QIuHrW
On Wed, May 23, 2018 at 12:30:57PM -0700, Jeykumar Sankaran wrote:
> This change removes all the dpu plane custom properties
> and its handlers.
>
> Signed-off-by: Jeykumar Sankaran <jsanka@codeaurora.org>
> ---
> Makefile | 2 +-
> drivers/gpu/drm/msm/Makefile | 8 -
> drivers/gpu/drm/msm/disp/dpu1/dpu_ad4.h | 99 --
> .../gpu/drm/msm/disp/dpu1/dpu_color_processing.c | 1521 --------------------
> .../gpu/drm/msm/disp/dpu1/dpu_color_processing.h | 120 --
> drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c | 148 +-
> drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.h | 3 +-
> drivers/gpu/drm/msm/disp/dpu1/dpu_encoder.c | 2 -
> .../gpu/drm/msm/disp/dpu1/dpu_encoder_phys_wb.c | 1 -
> drivers/gpu/drm/msm/disp/dpu1/dpu_hw_ad4.c | 1443 -------------------
> drivers/gpu/drm/msm/disp/dpu1/dpu_hw_catalog.c | 72 +-
> drivers/gpu/drm/msm/disp/dpu1/dpu_hw_catalog.h | 89 --
> .../msm/disp/dpu1/dpu_hw_color_proc_common_v4.h | 69 -
> .../gpu/drm/msm/disp/dpu1/dpu_hw_color_proc_v4.c | 242 ----
> .../gpu/drm/msm/disp/dpu1/dpu_hw_color_proc_v4.h | 40 -
> .../drm/msm/disp/dpu1/dpu_hw_color_processing.h | 20 -
> .../msm/disp/dpu1/dpu_hw_color_processing_v1_7.c | 565 --------
> .../msm/disp/dpu1/dpu_hw_color_processing_v1_7.h | 92 --
> drivers/gpu/drm/msm/disp/dpu1/dpu_hw_ctl.c | 44 -
> drivers/gpu/drm/msm/disp/dpu1/dpu_hw_ctl.h | 15 -
> drivers/gpu/drm/msm/disp/dpu1/dpu_hw_dspp.c | 209 ---
> drivers/gpu/drm/msm/disp/dpu1/dpu_hw_dspp.h | 220 ---
> drivers/gpu/drm/msm/disp/dpu1/dpu_hw_lm.c | 1 +
> drivers/gpu/drm/msm/disp/dpu1/dpu_hw_mdss.h | 44 +-
> drivers/gpu/drm/msm/disp/dpu1/dpu_hw_pingpong.c | 68 -
> drivers/gpu/drm/msm/disp/dpu1/dpu_hw_pingpong.h | 6 -
> drivers/gpu/drm/msm/disp/dpu1/dpu_hw_reg_dma_v1.c | 757 ----------
> drivers/gpu/drm/msm/disp/dpu1/dpu_hw_reg_dma_v1.h | 27 -
> .../msm/disp/dpu1/dpu_hw_reg_dma_v1_color_proc.c | 943 ------------
> .../msm/disp/dpu1/dpu_hw_reg_dma_v1_color_proc.h | 75 -
> drivers/gpu/drm/msm/disp/dpu1/dpu_hw_sspp.c | 219 ---
> drivers/gpu/drm/msm/disp/dpu1/dpu_hw_sspp.h | 73 -
> drivers/gpu/drm/msm/disp/dpu1/dpu_hw_util.c | 1 -
> drivers/gpu/drm/msm/disp/dpu1/dpu_hw_util.h | 156 ++
> drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c | 3 -
> drivers/gpu/drm/msm/disp/dpu1/dpu_plane.c | 1267 +---------------
> drivers/gpu/drm/msm/disp/dpu1/dpu_plane.h | 31 -
> drivers/gpu/drm/msm/disp/dpu1/dpu_reg_dma.c | 139 --
> drivers/gpu/drm/msm/disp/dpu1/dpu_reg_dma.h | 310 ----
> drivers/gpu/drm/msm/disp/dpu1/dpu_rm.c | 102 +-
> drivers/gpu/drm/msm/disp/dpu1/dpu_rm.h | 2 -
> drivers/gpu/drm/msm/disp/dpu1/dpu_wb.c | 2 -
> drivers/gpu/drm/msm/msm_drv.h | 28 -
> include/uapi/drm/dpu_drm.h | 187 ---
> include/uapi/drm/msm_drm.h | 1 -
> 45 files changed, 277 insertions(+), 9189 deletions(-)
Doing all of this at once is really hard to review. I would have preferred to
review each feature removal in a separate patch. However, since this is just
going to be squashed into the DPU megapatch anyways, I guess it's fine.
I only paid close attention to the additions, there are some unrelated
whitespace changes, but also meh on account of the squash (and non seem
objectionable).
> delete mode 100644 drivers/gpu/drm/msm/disp/dpu1/dpu_ad4.h
> delete mode 100644 drivers/gpu/drm/msm/disp/dpu1/dpu_color_processing.c
> delete mode 100644 drivers/gpu/drm/msm/disp/dpu1/dpu_color_processing.h
> delete mode 100644 drivers/gpu/drm/msm/disp/dpu1/dpu_hw_ad4.c
> delete mode 100644 drivers/gpu/drm/msm/disp/dpu1/dpu_hw_color_proc_common_v4.h
> delete mode 100644 drivers/gpu/drm/msm/disp/dpu1/dpu_hw_color_proc_v4.c
> delete mode 100644 drivers/gpu/drm/msm/disp/dpu1/dpu_hw_color_proc_v4.h
> delete mode 100644 drivers/gpu/drm/msm/disp/dpu1/dpu_hw_color_processing.h
> delete mode 100644 drivers/gpu/drm/msm/disp/dpu1/dpu_hw_color_processing_v1_7.c
> delete mode 100644 drivers/gpu/drm/msm/disp/dpu1/dpu_hw_color_processing_v1_7.h
> delete mode 100644 drivers/gpu/drm/msm/disp/dpu1/dpu_hw_dspp.c
> delete mode 100644 drivers/gpu/drm/msm/disp/dpu1/dpu_hw_dspp.h
> delete mode 100644 drivers/gpu/drm/msm/disp/dpu1/dpu_hw_reg_dma_v1.c
> delete mode 100644 drivers/gpu/drm/msm/disp/dpu1/dpu_hw_reg_dma_v1.h
> delete mode 100644 drivers/gpu/drm/msm/disp/dpu1/dpu_hw_reg_dma_v1_color_proc.c
> delete mode 100644 drivers/gpu/drm/msm/disp/dpu1/dpu_hw_reg_dma_v1_color_proc.h
> delete mode 100644 drivers/gpu/drm/msm/disp/dpu1/dpu_reg_dma.c
> delete mode 100644 drivers/gpu/drm/msm/disp/dpu1/dpu_reg_dma.h
>
> diff --git a/Makefile b/Makefile
> index 3c00040..1f23c66 100644
> --- a/Makefile
> +++ b/Makefile
> @@ -364,7 +364,7 @@ HOST_LFS_LIBS := $(shell getconf LFS_LIBS)
> HOSTCC = gcc
> HOSTCXX = g++
> HOSTCFLAGS := -Wall -Wmissing-prototypes -Wstrict-prototypes -O2 \
> - -fomit-frame-pointer -std=gnu89 $(HOST_LFS_CFLAGS)
> + -fomit-frame-pointer -std=gnu89 -Wmaybe-uninitialized $(HOST_LFS_CFLAGS)
What's up with the compiler flag warnings? Seems unrelated (and we should
probably remove all of them in a separate patch anyways).
> HOSTCXXFLAGS := -O2 $(HOST_LFS_CFLAGS)
> HOSTLDFLAGS := $(HOST_LFS_LDFLAGS)
> HOST_LOADLIBES := $(HOST_LFS_LIBS)
/snip
> index 48920b05..d439a9e 100644
> --- a/drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c
> +++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c
> @@ -20,7 +20,6 @@
> #include <linux/sort.h>
> #include <linux/debugfs.h>
> #include <linux/ktime.h>
> -#include <uapi/drm/dpu_drm.h>
> #include <drm/drm_mode.h>
> #include <drm/drm_crtc.h>
> #include <drm/drm_crtc_helper.h>
> @@ -31,13 +30,18 @@
> #include "dpu_hw_ctl.h"
> #include "dpu_crtc.h"
> #include "dpu_plane.h"
> -#include "dpu_color_processing.h"
> #include "dpu_encoder.h"
> #include "dpu_vbif.h"
> #include "dpu_power_handle.h"
> #include "dpu_core_perf.h"
> #include "dpu_trace.h"
>
> +#define DPU_DRM_BLEND_OP_NOT_DEFINED 0
> +#define DPU_DRM_BLEND_OP_OPAQUE 1
> +#define DPU_DRM_BLEND_OP_PREMULTIPLIED 2
> +#define DPU_DRM_BLEND_OP_COVERAGE 3
> +#define DPU_DRM_BLEND_OP_MAX 4
> +
> /* layer mixer index on dpu_crtc */
> #define LEFT_MIXER 0
> #define RIGHT_MIXER 1
> @@ -590,7 +594,6 @@ static void dpu_crtc_destroy(struct drm_crtc *crtc)
> if (dpu_crtc->blob_info)
> drm_property_blob_put(dpu_crtc->blob_info);
> msm_property_destroy(&dpu_crtc->property_info);
> - dpu_cp_crtc_destroy_properties(crtc);
> _dpu_crtc_destroy_dest_scaler(dpu_crtc);
>
> _dpu_crtc_deinit_events(dpu_crtc);
> @@ -624,15 +627,11 @@ static void _dpu_crtc_setup_blend_cfg(struct dpu_crtc_mixer *mixer,
> struct dpu_hw_mixer *lm = mixer->hw_lm;
>
> /* default to opaque blending */
> - fg_alpha = dpu_plane_get_property(pstate, PLANE_PROP_ALPHA);
> + fg_alpha = 0XFF;
> bg_alpha = 0xFF - fg_alpha;
This goes to 0 and the fg_alpha != 0xff checks are always false. So let's clean
the rest of the function to remove the dead code and variables.
> - blend_op = DPU_BLEND_FG_ALPHA_FG_CONST | DPU_BLEND_BG_ALPHA_BG_CONST;
> - blend_type = dpu_plane_get_property(pstate, PLANE_PROP_BLEND_OP);
> -
> - DPU_DEBUG("blend type:0x%x blend alpha:0x%x\n", blend_type, fg_alpha);
> + blend_type = DPU_DRM_BLEND_OP_OPAQUE;
>
> switch (blend_type) {
> -
> case DPU_DRM_BLEND_OP_OPAQUE:
> blend_op = DPU_BLEND_FG_ALPHA_FG_CONST |
> DPU_BLEND_BG_ALPHA_BG_CONST;
>
/snip
--
Sean Paul, Software Engineer, Google / Chromium OS
_______________________________________________
Freedreno mailing list
Freedreno@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/freedreno
^ permalink raw reply [flat|nested] 18+ messages in thread
* Re: [DPU PATCH 1/7] drm/msm: remove connector custom properties
2018-05-23 19:30 ` [DPU PATCH 1/7] drm/msm: remove connector " Jeykumar Sankaran
@ 2018-06-04 19:53 ` Sean Paul
0 siblings, 0 replies; 18+ messages in thread
From: Sean Paul @ 2018-06-04 19:53 UTC (permalink / raw)
To: Jeykumar Sankaran; +Cc: linux-arm-msm, dri-devel, hoegsberg, freedreno
On Wed, May 23, 2018 at 12:30:56PM -0700, Jeykumar Sankaran wrote:
> Cleanup residual connector property enumerations.
>
> Signed-off-by: Jeykumar Sankaran <jsanka@codeaurora.org>
Reviewed-by: Sean Paul <seanpaul@chromium.org>
> ---
> drivers/gpu/drm/msm/msm_drv.h | 27 ---------------------------
> 1 file changed, 27 deletions(-)
>
> diff --git a/drivers/gpu/drm/msm/msm_drv.h b/drivers/gpu/drm/msm/msm_drv.h
> index 90a2521..954ac12 100644
> --- a/drivers/gpu/drm/msm/msm_drv.h
> +++ b/drivers/gpu/drm/msm/msm_drv.h
> @@ -140,32 +140,6 @@ enum msm_mdp_crtc_property {
> CRTC_PROP_COUNT
> };
>
> -enum msm_mdp_conn_property {
> - /* blob properties, always put these first */
> - CONNECTOR_PROP_DPU_INFO,
> - CONNECTOR_PROP_HDR_INFO,
> - CONNECTOR_PROP_PP_DITHER,
> -
> - /* # of blob properties */
> - CONNECTOR_PROP_BLOBCOUNT,
> -
> - /* range properties */
> - CONNECTOR_PROP_OUT_FB = CONNECTOR_PROP_BLOBCOUNT,
> - CONNECTOR_PROP_DST_X,
> - CONNECTOR_PROP_DST_Y,
> - CONNECTOR_PROP_DST_W,
> - CONNECTOR_PROP_DST_H,
> - CONNECTOR_PROP_BL_SCALE,
> - CONNECTOR_PROP_AD_BL_SCALE,
> -
> - /* enum/bitmask properties */
> - CONNECTOR_PROP_AUTOREFRESH,
> - CONNECTOR_PROP_LP,
> -
> - /* total # of properties */
> - CONNECTOR_PROP_COUNT
> -};
> -
> struct msm_vblank_ctrl {
> struct kthread_work work;
> struct list_head event_list;
> @@ -434,7 +408,6 @@ struct msm_drm_private {
> /* Properties */
> struct drm_property *plane_property[PLANE_PROP_COUNT];
> struct drm_property *crtc_property[CRTC_PROP_COUNT];
> - struct drm_property *conn_property[CONNECTOR_PROP_COUNT];
>
> /* Color processing properties for the crtc */
> struct drm_property **cp_property;
> --
> The Qualcomm Innovation Center, Inc. is a member of the Code Aurora Forum,
> a Linux Foundation Collaborative Project
>
--
Sean Paul, Software Engineer, Google / Chromium OS
_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel
^ permalink raw reply [flat|nested] 18+ messages in thread
* Re: [DPU PATCH 3/7] drm/msm: enable zpos normalization
[not found] ` <1527103862-13934-4-git-send-email-jsanka-sgV2jX0FEOL9JmXXK+q4OQ@public.gmane.org>
@ 2018-06-04 19:57 ` Sean Paul
0 siblings, 0 replies; 18+ messages in thread
From: Sean Paul @ 2018-06-04 19:57 UTC (permalink / raw)
To: Jeykumar Sankaran
Cc: linux-arm-msm-u79uwXL29TY76Z2rM5mHXA,
dri-devel-PD4FTy7X32lNgt0PjOBp9y5qC8QIuHrW,
robdclark-Re5JQEeQqe8AvxtiuMwx3w,
seanpaul-F7+t8E8rja9g9hUCZPvPmw,
hoegsberg-hpIqsD4AKlfQT0dZR+AlfA,
freedreno-PD4FTy7X32lNgt0PjOBp9y5qC8QIuHrW
On Wed, May 23, 2018 at 12:30:58PM -0700, Jeykumar Sankaran wrote:
> Enable drm core zpos normalization for planes.
>
> Signed-off-by: Jeykumar Sankaran <jsanka@codeaurora.org>
Reviewed-by: Sean Paul <seanpaul@chromium.org>
> ---
> drivers/gpu/drm/msm/msm_drv.c | 3 +++
> 1 file changed, 3 insertions(+)
>
> diff --git a/drivers/gpu/drm/msm/msm_drv.c b/drivers/gpu/drm/msm/msm_drv.c
> index ebc40a9..549359e 100644
> --- a/drivers/gpu/drm/msm/msm_drv.c
> +++ b/drivers/gpu/drm/msm/msm_drv.c
> @@ -592,6 +592,9 @@ static int msm_drm_init(struct device *dev, struct drm_driver *drv)
> ddev->mode_config.funcs = &mode_config_funcs;
> ddev->mode_config.helper_private = &mode_config_helper_funcs;
>
> + /* Enable normalization of plane zpos */
> + ddev->mode_config.normalize_zpos = true;
> +
> if (kms) {
> ret = kms->funcs->hw_init(kms);
> if (ret) {
> --
> The Qualcomm Innovation Center, Inc. is a member of the Code Aurora Forum,
> a Linux Foundation Collaborative Project
>
--
Sean Paul, Software Engineer, Google / Chromium OS
_______________________________________________
Freedreno mailing list
Freedreno@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/freedreno
^ permalink raw reply [flat|nested] 18+ messages in thread
* Re: [DPU PATCH 5/7] drm/msm/dpu: clean up dpu crtc custom properties
[not found] ` <1527103862-13934-6-git-send-email-jsanka-sgV2jX0FEOL9JmXXK+q4OQ@public.gmane.org>
@ 2018-06-04 19:58 ` Sean Paul
0 siblings, 0 replies; 18+ messages in thread
From: Sean Paul @ 2018-06-04 19:58 UTC (permalink / raw)
To: Jeykumar Sankaran
Cc: linux-arm-msm-u79uwXL29TY76Z2rM5mHXA,
dri-devel-PD4FTy7X32lNgt0PjOBp9y5qC8QIuHrW,
robdclark-Re5JQEeQqe8AvxtiuMwx3w,
seanpaul-F7+t8E8rja9g9hUCZPvPmw,
hoegsberg-hpIqsD4AKlfQT0dZR+AlfA,
freedreno-PD4FTy7X32lNgt0PjOBp9y5qC8QIuHrW
On Wed, May 23, 2018 at 12:31:00PM -0700, Jeykumar Sankaran wrote:
> Remove dpu crtc custom properties and its handlers.
>
> Signed-off-by: Jeykumar Sankaran <jsanka@codeaurora.org>
Reviewed-by: Sean Paul <seanpaul@chromium.org>
> ---
> drivers/gpu/drm/msm/Makefile | 1 -
> drivers/gpu/drm/msm/disp/dpu1/dpu_core_perf.c | 28 -
> drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c | 856 +-------------------------
> drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.h | 27 +-
> drivers/gpu/drm/msm/disp/dpu1/dpu_encoder.c | 12 -
> drivers/gpu/drm/msm/disp/dpu1/dpu_hw_ds.c | 149 -----
> drivers/gpu/drm/msm/disp/dpu1/dpu_hw_ds.h | 111 ----
> drivers/gpu/drm/msm/disp/dpu1/dpu_hw_lm.c | 67 --
> drivers/gpu/drm/msm/disp/dpu1/dpu_hw_lm.h | 14 -
> drivers/gpu/drm/msm/disp/dpu1/dpu_hw_mdss.h | 16 -
> drivers/gpu/drm/msm/disp/dpu1/dpu_rm.c | 71 +--
> drivers/gpu/drm/msm/msm_drv.h | 15 -
> 12 files changed, 11 insertions(+), 1356 deletions(-)
> delete mode 100644 drivers/gpu/drm/msm/disp/dpu1/dpu_hw_ds.c
> delete mode 100644 drivers/gpu/drm/msm/disp/dpu1/dpu_hw_ds.h
>
> diff --git a/drivers/gpu/drm/msm/Makefile b/drivers/gpu/drm/msm/Makefile
> index 7bc3921..d289503 100644
> --- a/drivers/gpu/drm/msm/Makefile
> +++ b/drivers/gpu/drm/msm/Makefile
> @@ -57,7 +57,6 @@ msm-y := \
> disp/dpu1/dpu_hw_catalog.o \
> disp/dpu1/dpu_hw_cdm.o \
> disp/dpu1/dpu_hw_ctl.o \
> - disp/dpu1/dpu_hw_ds.o \
> disp/dpu1/dpu_hw_interrupts.o \
> disp/dpu1/dpu_hw_intf.o \
> disp/dpu1/dpu_hw_lm.o \
> diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_core_perf.c b/drivers/gpu/drm/msm/disp/dpu1/dpu_core_perf.c
> index 981f77f..c4820de 100644
> --- a/drivers/gpu/drm/msm/disp/dpu1/dpu_core_perf.c
> +++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_core_perf.c
> @@ -102,34 +102,6 @@ static void _dpu_core_perf_calc_crtc(struct dpu_kms *kms,
> dpu_cstate = to_dpu_crtc_state(state);
> memset(perf, 0, sizeof(struct dpu_core_perf_params));
>
> - perf->bw_ctl[DPU_POWER_HANDLE_DBUS_ID_MNOC] =
> - dpu_crtc_get_property(dpu_cstate, CRTC_PROP_CORE_AB);
> - perf->max_per_pipe_ib[DPU_POWER_HANDLE_DBUS_ID_MNOC] =
> - dpu_crtc_get_property(dpu_cstate, CRTC_PROP_CORE_IB);
> -
> - if (dpu_cstate->bw_split_vote) {
> - perf->bw_ctl[DPU_POWER_HANDLE_DBUS_ID_LLCC] =
> - dpu_crtc_get_property(dpu_cstate, CRTC_PROP_LLCC_AB);
> - perf->max_per_pipe_ib[DPU_POWER_HANDLE_DBUS_ID_LLCC] =
> - dpu_crtc_get_property(dpu_cstate, CRTC_PROP_LLCC_IB);
> - perf->bw_ctl[DPU_POWER_HANDLE_DBUS_ID_EBI] =
> - dpu_crtc_get_property(dpu_cstate, CRTC_PROP_DRAM_AB);
> - perf->max_per_pipe_ib[DPU_POWER_HANDLE_DBUS_ID_EBI] =
> - dpu_crtc_get_property(dpu_cstate, CRTC_PROP_DRAM_IB);
> - } else {
> - perf->bw_ctl[DPU_POWER_HANDLE_DBUS_ID_LLCC] =
> - dpu_crtc_get_property(dpu_cstate, CRTC_PROP_CORE_AB);
> - perf->max_per_pipe_ib[DPU_POWER_HANDLE_DBUS_ID_LLCC] =
> - dpu_crtc_get_property(dpu_cstate, CRTC_PROP_CORE_IB);
> - perf->bw_ctl[DPU_POWER_HANDLE_DBUS_ID_EBI] =
> - dpu_crtc_get_property(dpu_cstate, CRTC_PROP_CORE_AB);
> - perf->max_per_pipe_ib[DPU_POWER_HANDLE_DBUS_ID_EBI] =
> - dpu_crtc_get_property(dpu_cstate, CRTC_PROP_CORE_IB);
> - }
> -
> - perf->core_clk_rate =
> - dpu_crtc_get_property(dpu_cstate, CRTC_PROP_CORE_CLK);
> -
> if (!dpu_cstate->bw_control) {
> for (i = 0; i < DPU_POWER_HANDLE_DBUS_ID_MAX; i++) {
> perf->bw_ctl[i] = kms->catalog->perf.max_bw_high *
> diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c b/drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c
> index a0b702f..b0a3a30 100644
> --- a/drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c
> +++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c
> @@ -570,18 +570,6 @@ static void _dpu_crtc_deinit_events(struct dpu_crtc *dpu_crtc)
> return;
> }
>
> -/**
> - * dpu_crtc_destroy_dest_scaler - free memory allocated for scaler lut
> - * @dpu_crtc: Pointer to dpu crtc
> - */
> -static void _dpu_crtc_destroy_dest_scaler(struct dpu_crtc *dpu_crtc)
> -{
> - if (!dpu_crtc)
> - return;
> -
> - kfree(dpu_crtc->scl3_lut_cfg);
> -}
> -
> static void dpu_crtc_destroy(struct drm_crtc *crtc)
> {
> struct dpu_crtc *dpu_crtc = to_dpu_crtc(crtc);
> @@ -594,7 +582,6 @@ static void dpu_crtc_destroy(struct drm_crtc *crtc)
> if (dpu_crtc->blob_info)
> drm_property_blob_put(dpu_crtc->blob_info);
> msm_property_destroy(&dpu_crtc->property_info);
> - _dpu_crtc_destroy_dest_scaler(dpu_crtc);
>
> _dpu_crtc_deinit_events(dpu_crtc);
>
> @@ -679,71 +666,6 @@ static void _dpu_crtc_setup_blend_cfg(struct dpu_crtc_mixer *mixer,
> format->alpha_enable, fg_alpha, bg_alpha, blend_op);
> }
>
> -static void _dpu_crtc_setup_dim_layer_cfg(struct drm_crtc *crtc,
> - struct dpu_crtc *dpu_crtc, struct dpu_crtc_mixer *mixer,
> - struct dpu_hw_dim_layer *dim_layer)
> -{
> - struct dpu_crtc_state *cstate;
> - struct dpu_hw_mixer *lm;
> - struct dpu_hw_dim_layer split_dim_layer;
> - int i;
> -
> - if (!dim_layer->rect.w || !dim_layer->rect.h) {
> - DPU_DEBUG("empty dim_layer\n");
> - return;
> - }
> -
> - cstate = to_dpu_crtc_state(crtc->state);
> -
> - DPU_DEBUG("dim_layer - flags:%d, stage:%d\n",
> - dim_layer->flags, dim_layer->stage);
> -
> - split_dim_layer.stage = dim_layer->stage;
> - split_dim_layer.color_fill = dim_layer->color_fill;
> -
> - /*
> - * traverse through the layer mixers attached to crtc and find the
> - * intersecting dim layer rect in each LM and program accordingly.
> - */
> - for (i = 0; i < dpu_crtc->num_mixers; i++) {
> - split_dim_layer.flags = dim_layer->flags;
> -
> - dpu_kms_rect_intersect(&cstate->lm_bounds[i], &dim_layer->rect,
> - &split_dim_layer.rect);
> - if (dpu_kms_rect_is_null(&split_dim_layer.rect)) {
> - /*
> - * no extra programming required for non-intersecting
> - * layer mixers with INCLUSIVE dim layer
> - */
> - if (split_dim_layer.flags & DPU_DRM_DIM_LAYER_INCLUSIVE)
> - continue;
> -
> - /*
> - * program the other non-intersecting layer mixers with
> - * INCLUSIVE dim layer of full size for uniformity
> - * with EXCLUSIVE dim layer config.
> - */
> - split_dim_layer.flags &= ~DPU_DRM_DIM_LAYER_EXCLUSIVE;
> - split_dim_layer.flags |= DPU_DRM_DIM_LAYER_INCLUSIVE;
> - memcpy(&split_dim_layer.rect, &cstate->lm_bounds[i],
> - sizeof(split_dim_layer.rect));
> -
> - } else {
> - split_dim_layer.rect.x =
> - split_dim_layer.rect.x -
> - cstate->lm_bounds[i].x;
> - }
> -
> - DPU_DEBUG("split_dim_layer - LM:%d, rect:{%d,%d,%d,%d}}\n",
> - i, split_dim_layer.rect.x, split_dim_layer.rect.y,
> - split_dim_layer.rect.w, split_dim_layer.rect.h);
> -
> - lm = mixer[i].hw_lm;
> - mixer[i].mixer_op_mode |= 1 << split_dim_layer.stage;
> - lm->ops.setup_dim_layer(lm, &split_dim_layer);
> - }
> -}
> -
> static void _dpu_crtc_program_lm_output_roi(struct drm_crtc *crtc)
> {
> struct dpu_crtc *dpu_crtc;
> @@ -787,7 +709,6 @@ static void _dpu_crtc_blend_setup_mixer(struct drm_crtc *crtc,
> u32 flush_mask;
> uint32_t stage_idx, lm_idx;
> int zpos_cnt[DPU_STAGE_MAX + 1] = { 0 };
> - int i;
> bool bg_alpha_enable = false;
>
> if (!dpu_crtc || !mixer) {
> @@ -863,13 +784,6 @@ static void _dpu_crtc_blend_setup_mixer(struct drm_crtc *crtc,
> }
> }
>
> - if (lm && lm->ops.setup_dim_layer) {
> - cstate = to_dpu_crtc_state(crtc->state);
> - for (i = 0; i < cstate->num_dim_layers; i++)
> - _dpu_crtc_setup_dim_layer_cfg(crtc, dpu_crtc,
> - mixer, &cstate->dim_layer[i]);
> - }
> -
> _dpu_crtc_program_lm_output_roi(crtc);
> }
>
> @@ -911,11 +825,6 @@ static void _dpu_crtc_blend_setup(struct drm_crtc *crtc)
> if (mixer[i].hw_ctl->ops.clear_all_blendstages)
> mixer[i].hw_ctl->ops.clear_all_blendstages(
> mixer[i].hw_ctl);
> -
> - /* clear dim_layer settings */
> - lm = mixer[i].hw_lm;
> - if (lm->ops.clear_dim_layer)
> - lm->ops.clear_dim_layer(lm);
> }
>
> /* initialize stage cfg */
> @@ -947,163 +856,6 @@ static void _dpu_crtc_blend_setup(struct drm_crtc *crtc)
> }
>
> /**
> - * _dpu_crtc_setup_scaler3_lut - Set up scaler lut
> - * LUTs are configured only once during boot
> - * @dpu_crtc: Pointer to dpu crtc
> - * @cstate: Pointer to dpu crtc state
> - */
> -static int _dpu_crtc_set_dest_scaler_lut(struct dpu_crtc *dpu_crtc,
> - struct dpu_crtc_state *cstate, uint32_t lut_idx)
> -{
> - struct dpu_hw_scaler3_lut_cfg *cfg;
> - u32 *lut_data = NULL;
> - size_t len = 0;
> - int ret = 0;
> -
> - if (!dpu_crtc || !cstate || !dpu_crtc->scl3_lut_cfg) {
> - DPU_ERROR("invalid args\n");
> - return -EINVAL;
> - }
> -
> - if (dpu_crtc->scl3_lut_cfg->is_configured) {
> - DPU_DEBUG("lut already configured\n");
> - return 0;
> - }
> -
> - lut_data = msm_property_get_blob(&dpu_crtc->property_info,
> - &cstate->property_state, &len, lut_idx);
> - if (!lut_data || !len) {
> - DPU_ERROR("lut(%d): no data, len(%zu)\n", lut_idx, len);
> - return -ENODATA;
> - }
> -
> - cfg = dpu_crtc->scl3_lut_cfg;
> -
> - switch (lut_idx) {
> - case CRTC_PROP_DEST_SCALER_LUT_ED:
> - cfg->dir_lut = lut_data;
> - cfg->dir_len = len;
> - break;
> - case CRTC_PROP_DEST_SCALER_LUT_CIR:
> - cfg->cir_lut = lut_data;
> - cfg->cir_len = len;
> - break;
> - case CRTC_PROP_DEST_SCALER_LUT_SEP:
> - cfg->sep_lut = lut_data;
> - cfg->sep_len = len;
> - break;
> - default:
> - ret = -EINVAL;
> - DPU_ERROR("invalid LUT index = %d", lut_idx);
> - break;
> - }
> -
> - if (cfg->dir_lut && cfg->cir_lut && cfg->sep_lut)
> - cfg->is_configured = true;
> -
> - return ret;
> -}
> -
> -/**
> - * _dpu_crtc_dest_scaler_setup - Set up dest scaler block
> - * @crtc: Pointer to drm crtc
> - */
> -static void _dpu_crtc_dest_scaler_setup(struct drm_crtc *crtc)
> -{
> - struct dpu_crtc *dpu_crtc;
> - struct dpu_crtc_state *cstate;
> - struct dpu_hw_mixer *hw_lm;
> - struct dpu_hw_ctl *hw_ctl;
> - struct dpu_hw_ds *hw_ds;
> - struct dpu_hw_ds_cfg *cfg;
> - struct dpu_kms *kms;
> - u32 flush_mask = 0, op_mode = 0;
> - u32 lm_idx = 0, num_mixers = 0;
> - int i, count = 0;
> -
> - if (!crtc)
> - return;
> -
> - dpu_crtc = to_dpu_crtc(crtc);
> - cstate = to_dpu_crtc_state(crtc->state);
> - kms = _dpu_crtc_get_kms(crtc);
> - num_mixers = dpu_crtc->num_mixers;
> -
> - DPU_DEBUG("crtc%d\n", crtc->base.id);
> -
> - if (!cstate->ds_dirty) {
> - DPU_DEBUG("no change in settings, skip commit\n");
> - } else if (!kms || !kms->catalog) {
> - DPU_ERROR("invalid parameters\n");
> - } else if (!kms->catalog->mdp[0].has_dest_scaler) {
> - DPU_DEBUG("dest scaler feature not supported\n");
> - } else if (num_mixers > CRTC_DUAL_MIXERS) {
> - DPU_ERROR("invalid number mixers: %d\n", num_mixers);
> - } else if (!dpu_crtc->scl3_lut_cfg->is_configured) {
> - DPU_DEBUG("no LUT data available\n");
> - } else {
> - count = cstate->num_ds_enabled ? cstate->num_ds : num_mixers;
> -
> - for (i = 0; i < count; i++) {
> - cfg = &cstate->ds_cfg[i];
> -
> - if (!cfg->flags)
> - continue;
> -
> - lm_idx = cfg->ndx;
> - hw_lm = dpu_crtc->mixers[lm_idx].hw_lm;
> - hw_ctl = dpu_crtc->mixers[lm_idx].hw_ctl;
> - hw_ds = dpu_crtc->mixers[lm_idx].hw_ds;
> -
> - /* Setup op mode - Dual/single */
> - if (cfg->flags & DPU_DRM_DESTSCALER_ENABLE)
> - op_mode |= BIT(hw_ds->idx - DS_0);
> -
> - if ((i == count-1) && hw_ds->ops.setup_opmode) {
> - op_mode |= (cstate->num_ds_enabled ==
> - CRTC_DUAL_MIXERS) ?
> - DPU_DS_OP_MODE_DUAL : 0;
> - hw_ds->ops.setup_opmode(hw_ds, op_mode);
> - DPU_EVT32(DRMID(crtc), op_mode);
> - }
> -
> - /* Setup scaler */
> - if ((cfg->flags & DPU_DRM_DESTSCALER_SCALE_UPDATE) ||
> - (cfg->flags &
> - DPU_DRM_DESTSCALER_ENHANCER_UPDATE)) {
> - if (hw_ds->ops.setup_scaler)
> - hw_ds->ops.setup_scaler(hw_ds,
> - cfg->scl3_cfg,
> - dpu_crtc->scl3_lut_cfg);
> -
> - /**
> - * Clear the flags as the block doesn't have to
> - * be programmed in each commit if no updates
> - */
> - cfg->flags &= ~DPU_DRM_DESTSCALER_SCALE_UPDATE;
> - cfg->flags &=
> - ~DPU_DRM_DESTSCALER_ENHANCER_UPDATE;
> - }
> -
> - /*
> - * Dest scaler shares the flush bit of the LM in control
> - */
> - if (cfg->set_lm_flush && hw_lm && hw_ctl &&
> - hw_ctl->ops.get_bitmask_mixer) {
> - flush_mask = hw_ctl->ops.get_bitmask_mixer(
> - hw_ctl, hw_lm->idx);
> - DPU_DEBUG("Set lm[%d] flush = %d",
> - hw_lm->idx, flush_mask);
> - hw_ctl->ops.update_pending_flush(hw_ctl,
> - flush_mask);
> - }
> - cfg->set_lm_flush = false;
> - }
> - cstate->ds_dirty = false;
> - }
> -}
> -
> -/**
> * _dpu_crtc_complete_flip - signal pending page_flip events
> * Any pending vblank events are added to the vblank_event_list
> * so that the next vblank interrupt shall signal them.
> @@ -1361,448 +1113,6 @@ void dpu_crtc_complete_commit(struct drm_crtc *crtc,
> DPU_EVT32_VERBOSE(DRMID(crtc));
> }
>
> -/* _dpu_crtc_set_idle_timeout - update idle timeout wait duration */
> -static void _dpu_crtc_set_idle_timeout(struct drm_crtc *crtc, u64 val)
> -{
> - struct drm_encoder *encoder;
> -
> - if (!crtc) {
> - DPU_ERROR("invalid crtc\n");
> - return;
> - }
> -
> - drm_for_each_encoder(encoder, crtc->dev) {
> - if (encoder->crtc != crtc)
> - continue;
> -
> - dpu_encoder_set_idle_timeout(encoder, (u32) val);
> - }
> -}
> -
> -/**
> - * _dpu_crtc_set_dim_layer_v1 - copy dim layer settings from userspace
> - * @cstate: Pointer to dpu crtc state
> - * @user_ptr: User ptr for dpu_drm_dim_layer_v1 struct
> - */
> -static void _dpu_crtc_set_dim_layer_v1(struct dpu_crtc_state *cstate,
> - void __user *usr_ptr)
> -{
> - struct dpu_drm_dim_layer_v1 dim_layer_v1;
> - struct dpu_drm_dim_layer_cfg *user_cfg;
> - struct dpu_hw_dim_layer *dim_layer;
> - u32 count, i;
> -
> - if (!cstate) {
> - DPU_ERROR("invalid cstate\n");
> - return;
> - }
> - dim_layer = cstate->dim_layer;
> -
> - if (!usr_ptr) {
> - DPU_DEBUG("dim_layer data removed\n");
> - return;
> - }
> -
> - if (copy_from_user(&dim_layer_v1, usr_ptr, sizeof(dim_layer_v1))) {
> - DPU_ERROR("failed to copy dim_layer data\n");
> - return;
> - }
> -
> - count = dim_layer_v1.num_layers;
> - if (count > DPU_MAX_DIM_LAYERS) {
> - DPU_ERROR("invalid number of dim_layers:%d", count);
> - return;
> - }
> -
> - /* populate from user space */
> - cstate->num_dim_layers = count;
> - for (i = 0; i < count; i++) {
> - user_cfg = &dim_layer_v1.layer_cfg[i];
> -
> - dim_layer[i].flags = user_cfg->flags;
> - dim_layer[i].stage = user_cfg->stage + DPU_STAGE_0;
> -
> - dim_layer[i].rect.x = user_cfg->rect.x1;
> - dim_layer[i].rect.y = user_cfg->rect.y1;
> - dim_layer[i].rect.w = user_cfg->rect.x2 - user_cfg->rect.x1;
> - dim_layer[i].rect.h = user_cfg->rect.y2 - user_cfg->rect.y1;
> -
> - dim_layer[i].color_fill = (struct dpu_mdss_color) {
> - user_cfg->color_fill.color_0,
> - user_cfg->color_fill.color_1,
> - user_cfg->color_fill.color_2,
> - user_cfg->color_fill.color_3,
> - };
> -
> - DPU_DEBUG("dim_layer[%d] - flags:%d, stage:%d\n",
> - i, dim_layer[i].flags, dim_layer[i].stage);
> - DPU_DEBUG(" rect:{%d,%d,%d,%d}, color:{%d,%d,%d,%d}\n",
> - dim_layer[i].rect.x, dim_layer[i].rect.y,
> - dim_layer[i].rect.w, dim_layer[i].rect.h,
> - dim_layer[i].color_fill.color_0,
> - dim_layer[i].color_fill.color_1,
> - dim_layer[i].color_fill.color_2,
> - dim_layer[i].color_fill.color_3);
> - }
> -}
> -
> -/**
> - * _dpu_crtc_dest_scaler_init - allocate memory for scaler lut
> - * @dpu_crtc : Pointer to dpu crtc
> - * @catalog : Pointer to mdss catalog info
> - */
> -static void _dpu_crtc_dest_scaler_init(struct dpu_crtc *dpu_crtc,
> - struct dpu_mdss_cfg *catalog)
> -{
> - if (!dpu_crtc || !catalog)
> - return;
> -
> - if (!catalog->mdp[0].has_dest_scaler) {
> - DPU_DEBUG("dest scaler feature not supported\n");
> - return;
> - }
> -
> - dpu_crtc->scl3_lut_cfg = kzalloc(sizeof(struct dpu_hw_scaler3_lut_cfg),
> - GFP_KERNEL);
> - if (!dpu_crtc->scl3_lut_cfg)
> - DPU_ERROR("failed to create scale LUT for dest scaler");
> -}
> -
> -/**
> - * _dpu_crtc_set_dest_scaler - copy dest scaler settings from userspace
> - * @dpu_crtc : Pointer to dpu crtc
> - * @cstate : Pointer to dpu crtc state
> - * @usr_ptr: User ptr for dpu_drm_dest_scaler_data struct
> - */
> -static int _dpu_crtc_set_dest_scaler(struct dpu_crtc *dpu_crtc,
> - struct dpu_crtc_state *cstate,
> - void __user *usr_ptr)
> -{
> - struct dpu_drm_dest_scaler_data ds_data;
> - struct dpu_drm_dest_scaler_cfg *ds_cfg_usr;
> - struct dpu_drm_scaler_v2 scaler_v2;
> - void __user *scaler_v2_usr;
> - int i, count, ret = 0;
> -
> - if (!dpu_crtc || !cstate) {
> - DPU_ERROR("invalid dpu_crtc/state\n");
> - return -EINVAL;
> - }
> -
> - DPU_DEBUG("crtc %s\n", dpu_crtc->name);
> -
> - cstate->num_ds = 0;
> - cstate->ds_dirty = false;
> - if (!usr_ptr) {
> - DPU_DEBUG("ds data removed\n");
> - return 0;
> - }
> -
> - if (copy_from_user(&ds_data, usr_ptr, sizeof(ds_data))) {
> - DPU_ERROR("failed to copy dest scaler data from user\n");
> - return -EINVAL;
> - }
> -
> - count = ds_data.num_dest_scaler;
> - if (!dpu_crtc->num_mixers || count > dpu_crtc->num_mixers ||
> - (count && (count != dpu_crtc->num_mixers) &&
> - !(ds_data.ds_cfg[0].flags & DPU_DRM_DESTSCALER_PU_ENABLE))) {
> - DPU_ERROR("invalid config:num ds(%d), mixers(%d),flags(%d)\n",
> - count, dpu_crtc->num_mixers, ds_data.ds_cfg[0].flags);
> - return -EINVAL;
> - }
> -
> - /* Populate from user space */
> - for (i = 0; i < count; i++) {
> - ds_cfg_usr = &ds_data.ds_cfg[i];
> -
> - cstate->ds_cfg[i].ndx = ds_cfg_usr->index;
> - cstate->ds_cfg[i].flags = ds_cfg_usr->flags;
> - cstate->ds_cfg[i].lm_width = ds_cfg_usr->lm_width;
> - cstate->ds_cfg[i].lm_height = ds_cfg_usr->lm_height;
> - cstate->ds_cfg[i].scl3_cfg = NULL;
> -
> - if (ds_cfg_usr->scaler_cfg) {
> - scaler_v2_usr =
> - (void __user *)((uintptr_t)ds_cfg_usr->scaler_cfg);
> -
> - memset(&scaler_v2, 0, sizeof(scaler_v2));
> -
> - cstate->ds_cfg[i].scl3_cfg =
> - kzalloc(sizeof(struct dpu_hw_scaler3_cfg),
> - GFP_KERNEL);
> -
> - if (!cstate->ds_cfg[i].scl3_cfg) {
> - ret = -ENOMEM;
> - goto err;
> - }
> -
> - if (copy_from_user(&scaler_v2, scaler_v2_usr,
> - sizeof(scaler_v2))) {
> - DPU_ERROR("scale data:copy from user failed\n");
> - ret = -EINVAL;
> - goto err;
> - }
> -
> - dpu_set_scaler_v2(cstate->ds_cfg[i].scl3_cfg,
> - &scaler_v2);
> -
> - DPU_DEBUG("en(%d)dir(%d)de(%d) src(%dx%d) dst(%dx%d)\n",
> - scaler_v2.enable, scaler_v2.dir_en,
> - scaler_v2.de.enable, scaler_v2.src_width[0],
> - scaler_v2.src_height[0], scaler_v2.dst_width,
> - scaler_v2.dst_height);
> - DPU_EVT32_VERBOSE(DRMID(&dpu_crtc->base),
> - scaler_v2.enable, scaler_v2.dir_en,
> - scaler_v2.de.enable, scaler_v2.src_width[0],
> - scaler_v2.src_height[0], scaler_v2.dst_width,
> - scaler_v2.dst_height);
> - }
> -
> - DPU_DEBUG("ds cfg[%d]-ndx(%d) flags(%d) lm(%dx%d)\n",
> - i, ds_cfg_usr->index, ds_cfg_usr->flags,
> - ds_cfg_usr->lm_width, ds_cfg_usr->lm_height);
> - DPU_EVT32_VERBOSE(DRMID(&dpu_crtc->base), i, ds_cfg_usr->index,
> - ds_cfg_usr->flags, ds_cfg_usr->lm_width,
> - ds_cfg_usr->lm_height);
> - }
> -
> - cstate->num_ds = count;
> - cstate->ds_dirty = true;
> - return 0;
> -
> -err:
> - for (; i >= 0; i--)
> - kfree(cstate->ds_cfg[i].scl3_cfg);
> -
> - return ret;
> -}
> -
> -/**
> - * _dpu_crtc_check_dest_scaler_data - validate the dest scaler data
> - * @crtc : Pointer to drm crtc
> - * @state : Pointer to drm crtc state
> - */
> -static int _dpu_crtc_check_dest_scaler_data(struct drm_crtc *crtc,
> - struct drm_crtc_state *state)
> -{
> - struct dpu_crtc *dpu_crtc;
> - struct dpu_crtc_state *cstate;
> - struct drm_display_mode *mode;
> - struct dpu_kms *kms;
> - struct dpu_hw_ds *hw_ds;
> - struct dpu_hw_ds_cfg *cfg;
> - u32 i, ret = 0, lm_idx;
> - u32 num_ds_enable = 0;
> - u32 max_in_width = 0, max_out_width = 0;
> - u32 prev_lm_width = 0, prev_lm_height = 0;
> -
> - if (!crtc || !state)
> - return -EINVAL;
> -
> - dpu_crtc = to_dpu_crtc(crtc);
> - cstate = to_dpu_crtc_state(state);
> - kms = _dpu_crtc_get_kms(crtc);
> - mode = &state->adjusted_mode;
> -
> - DPU_DEBUG("crtc%d\n", crtc->base.id);
> -
> - if (!cstate->ds_dirty && !cstate->num_ds_enabled) {
> - DPU_DEBUG("dest scaler property not set, skip validation\n");
> - return 0;
> - }
> -
> - if (!kms || !kms->catalog) {
> - DPU_ERROR("invalid parameters\n");
> - return -EINVAL;
> - }
> -
> - if (!kms->catalog->mdp[0].has_dest_scaler) {
> - DPU_DEBUG("dest scaler feature not supported\n");
> - return 0;
> - }
> -
> - if (!dpu_crtc->num_mixers) {
> - DPU_ERROR("mixers not allocated\n");
> - return -EINVAL;
> - }
> -
> - /**
> - * Check if sufficient hw resources are
> - * available as per target caps & topology
> - */
> - if (dpu_crtc->num_mixers > CRTC_DUAL_MIXERS) {
> - DPU_ERROR("invalid config: mixers(%d) max(%d)\n",
> - dpu_crtc->num_mixers, CRTC_DUAL_MIXERS);
> - ret = -EINVAL;
> - goto err;
> - }
> -
> - for (i = 0; i < dpu_crtc->num_mixers; i++) {
> - if (!dpu_crtc->mixers[i].hw_lm || !dpu_crtc->mixers[i].hw_ds) {
> - DPU_ERROR("insufficient HW resources allocated\n");
> - ret = -EINVAL;
> - goto err;
> - }
> - }
> -
> - /**
> - * Check if DS needs to be enabled or disabled
> - * In case of enable, validate the data
> - */
> - if (!cstate->ds_dirty || !cstate->num_ds ||
> - !(cstate->ds_cfg[0].flags & DPU_DRM_DESTSCALER_ENABLE)) {
> - DPU_DEBUG("disable dest scaler,dirty(%d)num(%d)flags(%d)\n",
> - cstate->ds_dirty, cstate->num_ds,
> - cstate->ds_cfg[0].flags);
> - goto disable;
> - }
> -
> - /**
> - * No of dest scalers shouldn't exceed hw ds block count and
> - * also, match the num of mixers unless it is partial update
> - * left only/right only use case - currently PU + DS is not supported
> - */
> - if (cstate->num_ds > kms->catalog->ds_count ||
> - ((cstate->num_ds != dpu_crtc->num_mixers) &&
> - !(cstate->ds_cfg[0].flags & DPU_DRM_DESTSCALER_PU_ENABLE))) {
> - DPU_ERROR("invalid cfg: num_ds(%d), hw_ds_cnt(%d) flags(%d)\n",
> - cstate->num_ds, kms->catalog->ds_count,
> - cstate->ds_cfg[0].flags);
> - ret = -EINVAL;
> - goto err;
> - }
> -
> - /* Validate the DS data */
> - for (i = 0; i < cstate->num_ds; i++) {
> - cfg = &cstate->ds_cfg[i];
> - lm_idx = cfg->ndx;
> -
> - /**
> - * Validate against topology
> - * No of dest scalers should match the num of mixers
> - * unless it is partial update left only/right only use case
> - */
> - if (lm_idx >= dpu_crtc->num_mixers || (i != lm_idx &&
> - !(cfg->flags & DPU_DRM_DESTSCALER_PU_ENABLE))) {
> - DPU_ERROR("invalid user data(%d):idx(%d), flags(%d)\n",
> - i, lm_idx, cfg->flags);
> - ret = -EINVAL;
> - goto err;
> - }
> -
> - hw_ds = dpu_crtc->mixers[lm_idx].hw_ds;
> -
> - if (!max_in_width && !max_out_width) {
> - max_in_width = hw_ds->scl->top->maxinputwidth;
> - max_out_width = hw_ds->scl->top->maxoutputwidth;
> -
> - if (cstate->num_ds == CRTC_DUAL_MIXERS)
> - max_in_width -= DPU_DS_OVERFETCH_SIZE;
> -
> - DPU_DEBUG("max DS width [%d,%d] for num_ds = %d\n",
> - max_in_width, max_out_width, cstate->num_ds);
> - }
> -
> - /* Check LM width and height */
> - if (cfg->lm_width > (mode->hdisplay/dpu_crtc->num_mixers) ||
> - cfg->lm_height > mode->vdisplay ||
> - !cfg->lm_width || !cfg->lm_height) {
> - DPU_ERROR("invalid lm size[%d,%d] display [%d,%d]\n",
> - cfg->lm_width,
> - cfg->lm_height,
> - mode->hdisplay/dpu_crtc->num_mixers,
> - mode->vdisplay);
> - ret = -E2BIG;
> - goto err;
> - }
> -
> - if (!prev_lm_width && !prev_lm_height) {
> - prev_lm_width = cfg->lm_width;
> - prev_lm_height = cfg->lm_height;
> - } else {
> - if (cfg->lm_width != prev_lm_width ||
> - cfg->lm_height != prev_lm_height) {
> - DPU_ERROR("lm size:left[%d,%d], right[%d %d]\n",
> - cfg->lm_width, cfg->lm_height,
> - prev_lm_width, prev_lm_height);
> - ret = -EINVAL;
> - goto err;
> - }
> - }
> -
> - /* Check scaler data */
> - if (cfg->flags & DPU_DRM_DESTSCALER_SCALE_UPDATE ||
> - cfg->flags & DPU_DRM_DESTSCALER_ENHANCER_UPDATE) {
> - if (!cfg->scl3_cfg) {
> - ret = -EINVAL;
> - DPU_ERROR("null scale data\n");
> - goto err;
> - }
> - if (cfg->scl3_cfg->src_width[0] > max_in_width ||
> - cfg->scl3_cfg->dst_width > max_out_width ||
> - !cfg->scl3_cfg->src_width[0] ||
> - !cfg->scl3_cfg->dst_width) {
> - DPU_ERROR("scale width(%d %d) for ds-%d:\n",
> - cfg->scl3_cfg->src_width[0],
> - cfg->scl3_cfg->dst_width,
> - hw_ds->idx - DS_0);
> - DPU_ERROR("scale_en = %d, DE_en =%d\n",
> - cfg->scl3_cfg->enable,
> - cfg->scl3_cfg->de.enable);
> -
> - cfg->flags &=
> - ~DPU_DRM_DESTSCALER_SCALE_UPDATE;
> - cfg->flags &=
> - ~DPU_DRM_DESTSCALER_ENHANCER_UPDATE;
> -
> - ret = -EINVAL;
> - goto err;
> - }
> - }
> -
> - if (cfg->flags & DPU_DRM_DESTSCALER_ENABLE)
> - num_ds_enable++;
> -
> - /**
> - * Validation successful, indicator for flush to be issued
> - */
> - cfg->set_lm_flush = true;
> -
> - DPU_DEBUG("ds[%d]: flags = 0x%X\n",
> - hw_ds->idx - DS_0, cfg->flags);
> - }
> -
> -disable:
> - DPU_DEBUG("dest scaler enable status, old = %d, new = %d",
> - cstate->num_ds_enabled, num_ds_enable);
> - DPU_EVT32(DRMID(crtc), cstate->num_ds_enabled, num_ds_enable,
> - cstate->ds_dirty);
> -
> - if (cstate->num_ds_enabled != num_ds_enable) {
> - /* Disabling destination scaler */
> - if (!num_ds_enable) {
> - for (i = 0; i < dpu_crtc->num_mixers; i++) {
> - cfg = &cstate->ds_cfg[i];
> - cfg->ndx = i;
> - /* Update scaler settings in disable case */
> - cfg->flags = DPU_DRM_DESTSCALER_SCALE_UPDATE;
> - cfg->scl3_cfg->enable = 0;
> - cfg->scl3_cfg->de.enable = 0;
> - cfg->set_lm_flush = true;
> - }
> - }
> - cstate->num_ds_enabled = num_ds_enable;
> - cstate->ds_dirty = true;
> - }
> -
> - return 0;
> -
> -err:
> - cstate->ds_dirty = false;
> - return ret;
> -}
> -
> static void _dpu_crtc_setup_mixer_for_encoder(
> struct drm_crtc *crtc,
> struct drm_encoder *enc)
> @@ -1813,11 +1123,10 @@ static void _dpu_crtc_setup_mixer_for_encoder(
> struct dpu_crtc_mixer *mixer;
> struct dpu_hw_ctl *last_valid_ctl = NULL;
> int i;
> - struct dpu_rm_hw_iter lm_iter, ctl_iter, ds_iter;
> + struct dpu_rm_hw_iter lm_iter, ctl_iter;
>
> dpu_rm_init_hw_iter(&lm_iter, enc->base.id, DPU_HW_BLK_LM);
> dpu_rm_init_hw_iter(&ctl_iter, enc->base.id, DPU_HW_BLK_CTL);
> - dpu_rm_init_hw_iter(&ds_iter, enc->base.id, DPU_HW_BLK_DS);
>
> /* Set up all the mixers and ctls reserved by this encoder */
> for (i = dpu_crtc->num_mixers; i < ARRAY_SIZE(dpu_crtc->mixers); i++) {
> @@ -1844,10 +1153,6 @@ static void _dpu_crtc_setup_mixer_for_encoder(
> return;
> }
>
> - /* DS may be null */
> - (void) dpu_rm_get_hw(rm, &ds_iter);
> - mixer->hw_ds = (struct dpu_hw_ds *)ds_iter.hw;
> -
> mixer->encoder = enc;
>
> dpu_crtc->num_mixers++;
> @@ -1855,9 +1160,6 @@ static void _dpu_crtc_setup_mixer_for_encoder(
> i, mixer->hw_lm->idx - LM_0);
> DPU_DEBUG("setup mixer %d: ctl %d\n",
> i, mixer->hw_ctl->idx - CTL_0);
> - if (mixer->hw_ds)
> - DPU_DEBUG("setup mixer %d: ds %d\n",
> - i, mixer->hw_ds->idx - DS_0);
> }
> }
>
> @@ -1973,7 +1275,6 @@ static void dpu_crtc_atomic_begin(struct drm_crtc *crtc,
> return;
>
> _dpu_crtc_blend_setup(crtc);
> - _dpu_crtc_dest_scaler_setup(crtc);
>
> /*
> * PP_DONE irq is only used by command mode for now.
> @@ -2672,13 +1973,6 @@ static int dpu_crtc_atomic_check(struct drm_crtc *crtc,
>
> memset(pipe_staged, 0, sizeof(pipe_staged));
>
> - rc = _dpu_crtc_check_dest_scaler_data(crtc, state);
> - if (rc) {
> - DPU_ERROR("crtc%d failed dest scaler check %d\n",
> - crtc->base.id, rc);
> - goto end;
> - }
> -
> mixer_width = dpu_crtc_get_mixer_width(dpu_crtc, cstate, mode);
>
> _dpu_crtc_setup_lm_bounds(crtc, state);
> @@ -2699,19 +1993,6 @@ static int dpu_crtc_atomic_check(struct drm_crtc *crtc,
> pstates[cnt].stage = pstate->normalized_zpos;
> pstates[cnt].pipe_id = dpu_plane_pipe(plane);
>
> - /* check dim layer stage with every plane */
> - for (i = 0; i < cstate->num_dim_layers; i++) {
> - if (cstate->dim_layer[i].stage
> - == (pstates[cnt].stage + DPU_STAGE_0)) {
> - DPU_ERROR(
> - "plane:%d/dim_layer:%i-same stage:%d\n",
> - plane->base.id, i,
> - cstate->dim_layer[i].stage);
> - rc = -EINVAL;
> - goto end;
> - }
> - }
> -
> if (pipe_staged[pstates[cnt].pipe_id]) {
> multirect_plane[multirect_count].r0 =
> pipe_staged[pstates[cnt].pipe_id];
> @@ -2947,52 +2228,11 @@ static void dpu_crtc_install_properties(struct drm_crtc *crtc,
> return;
> }
>
> - /* range properties */
> - msm_property_install_range(&dpu_crtc->property_info,
> - "core_clk", 0x0, 0, U64_MAX,
> - dpu_kms->perf.max_core_clk_rate,
> - CRTC_PROP_CORE_CLK);
> - msm_property_install_range(&dpu_crtc->property_info,
> - "core_ab", 0x0, 0, U64_MAX,
> - catalog->perf.max_bw_high * 1000ULL,
> - CRTC_PROP_CORE_AB);
> - msm_property_install_range(&dpu_crtc->property_info,
> - "core_ib", 0x0, 0, U64_MAX,
> - catalog->perf.max_bw_high * 1000ULL,
> - CRTC_PROP_CORE_IB);
> - msm_property_install_range(&dpu_crtc->property_info,
> - "llcc_ab", 0x0, 0, U64_MAX,
> - catalog->perf.max_bw_high * 1000ULL,
> - CRTC_PROP_LLCC_AB);
> - msm_property_install_range(&dpu_crtc->property_info,
> - "llcc_ib", 0x0, 0, U64_MAX,
> - catalog->perf.max_bw_high * 1000ULL,
> - CRTC_PROP_LLCC_IB);
> - msm_property_install_range(&dpu_crtc->property_info,
> - "dram_ab", 0x0, 0, U64_MAX,
> - catalog->perf.max_bw_high * 1000ULL,
> - CRTC_PROP_DRAM_AB);
> - msm_property_install_range(&dpu_crtc->property_info,
> - "dram_ib", 0x0, 0, U64_MAX,
> - catalog->perf.max_bw_high * 1000ULL,
> - CRTC_PROP_DRAM_IB);
> -
> - msm_property_install_range(&dpu_crtc->property_info,
> - "idle_timeout", IDLE_TIMEOUT, 0, U64_MAX, 0,
> - CRTC_PROP_IDLE_TIMEOUT);
> -
> msm_property_install_blob(&dpu_crtc->property_info, "capabilities",
> DRM_MODE_PROP_IMMUTABLE, CRTC_PROP_INFO);
>
> dpu_kms_info_reset(info);
>
> - if (catalog->caps->has_dim_layer) {
> - msm_property_install_volatile_range(&dpu_crtc->property_info,
> - "dim_layer_v1", 0x0, 0, ~0, 0, CRTC_PROP_DIM_LAYER_V1);
> - dpu_kms_info_add_keyint(info, "dim_layer_v1_max_layers",
> - DPU_MAX_DIM_LAYERS);
> - }
> -
> dpu_kms_info_add_keyint(info, "hw_version", catalog->hwversion);
> dpu_kms_info_add_keyint(info, "max_linewidth",
> catalog->caps->max_mixer_width);
> @@ -3012,39 +2252,6 @@ static void dpu_crtc_install_properties(struct drm_crtc *crtc,
> "smart_dma_rev", "smart_dma_v2");
> }
>
> - if (catalog->mdp[0].has_dest_scaler) {
> - dpu_kms_info_add_keyint(info, "has_dest_scaler",
> - catalog->mdp[0].has_dest_scaler);
> - dpu_kms_info_add_keyint(info, "dest_scaler_count",
> - catalog->ds_count);
> -
> - if (catalog->ds[0].top) {
> - dpu_kms_info_add_keyint(info,
> - "max_dest_scaler_input_width",
> - catalog->ds[0].top->maxinputwidth);
> - dpu_kms_info_add_keyint(info,
> - "max_dest_scaler_output_width",
> - catalog->ds[0].top->maxinputwidth);
> - dpu_kms_info_add_keyint(info, "max_dest_scale_up",
> - catalog->ds[0].top->maxupscale);
> - }
> -
> - if (catalog->ds[0].features & BIT(DPU_SSPP_SCALER_QSEED3)) {
> - msm_property_install_volatile_range(
> - &dpu_crtc->property_info, "dest_scaler",
> - 0x0, 0, ~0, 0, CRTC_PROP_DEST_SCALER);
> - msm_property_install_blob(&dpu_crtc->property_info,
> - "ds_lut_ed", 0,
> - CRTC_PROP_DEST_SCALER_LUT_ED);
> - msm_property_install_blob(&dpu_crtc->property_info,
> - "ds_lut_cir", 0,
> - CRTC_PROP_DEST_SCALER_LUT_CIR);
> - msm_property_install_blob(&dpu_crtc->property_info,
> - "ds_lut_sep", 0,
> - CRTC_PROP_DEST_SCALER_LUT_SEP);
> - }
> - }
> -
> dpu_kms_info_add_keyint(info, "has_src_split",
> catalog->caps->has_src_split);
> if (catalog->perf.max_bw_low)
> @@ -3113,7 +2320,7 @@ static int dpu_crtc_atomic_set_property(struct drm_crtc *crtc,
> {
> struct dpu_crtc *dpu_crtc;
> struct dpu_crtc_state *cstate;
> - int idx, ret = -EINVAL;
> + int ret = -EINVAL;
>
> if (!crtc || !state || !property) {
> DPU_ERROR("invalid argument(s)\n");
> @@ -3122,45 +2329,8 @@ static int dpu_crtc_atomic_set_property(struct drm_crtc *crtc,
> cstate = to_dpu_crtc_state(state);
> ret = msm_property_atomic_set(&dpu_crtc->property_info,
> &cstate->property_state, property, val);
> - if (!ret) {
> - idx = msm_property_index(&dpu_crtc->property_info,
> - property);
> - switch (idx) {
> - case CRTC_PROP_DIM_LAYER_V1:
> - _dpu_crtc_set_dim_layer_v1(cstate,
> - u64_to_user_ptr(val));
> - break;
> - case CRTC_PROP_DEST_SCALER:
> - ret = _dpu_crtc_set_dest_scaler(dpu_crtc,
> - cstate, u64_to_user_ptr(val));
> - break;
> - case CRTC_PROP_DEST_SCALER_LUT_ED:
> - case CRTC_PROP_DEST_SCALER_LUT_CIR:
> - case CRTC_PROP_DEST_SCALER_LUT_SEP:
> - ret = _dpu_crtc_set_dest_scaler_lut(dpu_crtc,
> - cstate, idx);
> - break;
> - case CRTC_PROP_CORE_CLK:
> - case CRTC_PROP_CORE_AB:
> - case CRTC_PROP_CORE_IB:
> - cstate->bw_control = true;
> - break;
> - case CRTC_PROP_LLCC_AB:
> - case CRTC_PROP_LLCC_IB:
> - case CRTC_PROP_DRAM_AB:
> - case CRTC_PROP_DRAM_IB:
> - cstate->bw_control = true;
> - cstate->bw_split_vote = true;
> - break;
> - case CRTC_PROP_IDLE_TIMEOUT:
> - _dpu_crtc_set_idle_timeout(crtc, val);
> - default:
> - /* nothing to do */
> - break;
> - }
> - } else {
> + if (ret)
> DRM_ERROR("failed to set the property\n");
> - }
>
> DPU_DEBUG("crtc%d %s[%d] <= 0x%llx ret=%d\n", crtc->base.id,
> property->name, property->base.id, val, ret);
> @@ -3276,23 +2446,6 @@ static int _dpu_debugfs_status_show(struct seq_file *s, void *data)
>
> seq_puts(s, "\n");
>
> - for (i = 0; i < cstate->num_dim_layers; i++) {
> - struct dpu_hw_dim_layer *dim_layer = &cstate->dim_layer[i];
> -
> - seq_printf(s, "\tdim_layer:%d] stage:%d flags:%d\n",
> - i, dim_layer->stage, dim_layer->flags);
> - seq_printf(s, "\tdst_x:%d dst_y:%d dst_w:%d dst_h:%d\n",
> - dim_layer->rect.x, dim_layer->rect.y,
> - dim_layer->rect.w, dim_layer->rect.h);
> - seq_printf(s,
> - "\tcolor_0:%d color_1:%d color_2:%d color_3:%d\n",
> - dim_layer->color_fill.color_0,
> - dim_layer->color_fill.color_1,
> - dim_layer->color_fill.color_2,
> - dim_layer->color_fill.color_3);
> - seq_puts(s, "\n");
> - }
> -
> drm_atomic_crtc_for_each_plane(plane, crtc) {
> pstate = to_dpu_plane_state(plane->state);
> state = plane->state;
> @@ -3779,9 +2932,6 @@ struct drm_crtc *dpu_crtc_init(struct drm_device *dev, struct drm_plane *plane)
>
> dpu_crtc_install_properties(crtc, kms->catalog);
>
> - /* Init dest scaler */
> - _dpu_crtc_dest_scaler_init(dpu_crtc, kms->catalog);
> -
> DPU_DEBUG("%s: successfully initialized crtc\n", dpu_crtc->name);
> return crtc;
> }
> diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.h b/drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.h
> index 5f380b8..6628eb3 100644
> --- a/drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.h
> +++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.h
> @@ -26,7 +26,6 @@
> #include "dpu_kms.h"
> #include "dpu_core_perf.h"
> #include "dpu_hw_blk.h"
> -#include "dpu_hw_ds.h"
>
> #define DPU_CRTC_NAME_SIZE 12
>
> @@ -87,7 +86,6 @@ struct dpu_crtc_smmu_state_data {
> * struct dpu_crtc_mixer: stores the map for each virtual pipeline in the CRTC
> * @hw_lm: LM HW Driver context
> * @hw_ctl: CTL Path HW driver context
> - * @hw_ds: DS HW driver context
> * @encoder: Encoder attached to this lm & ctl
> * @mixer_op_mode: mixer blending operation mode
> * @flush_mask: mixer flush mask for ctl, mixer and pipe
> @@ -95,7 +93,6 @@ struct dpu_crtc_smmu_state_data {
> struct dpu_crtc_mixer {
> struct dpu_hw_mixer *hw_lm;
> struct dpu_hw_ctl *hw_ctl;
> - struct dpu_hw_ds *hw_ds;
> struct drm_encoder *encoder;
> u32 mixer_op_mode;
> u32 flush_mask;
> @@ -314,12 +311,6 @@ struct dpu_crtc_respool {
> * @property_state: Local storage for msm_prop properties
> * @property_values: Current crtc property values
> * @input_fence_timeout_ns : Cached input fence timeout, in ns
> - * @num_dim_layers: Number of dim layers
> - * @dim_layer: Dim layer configs
> - * @num_ds: Number of destination scalers to be configured
> - * @num_ds_enabled: Number of destination scalers enabled
> - * @ds_dirty: Boolean to indicate if dirty or not
> - * @ds_cfg: Destination scaler config
> * @new_perf: new performance state being requested
> */
> struct dpu_crtc_state {
> @@ -336,12 +327,6 @@ struct dpu_crtc_state {
> struct msm_property_state property_state;
> struct msm_property_value property_values[CRTC_PROP_COUNT];
> uint64_t input_fence_timeout_ns;
> - uint32_t num_dim_layers;
> - struct dpu_hw_dim_layer dim_layer[DPU_MAX_DIM_LAYERS];
> - uint32_t num_ds;
> - uint32_t num_ds_enabled;
> - bool ds_dirty;
> - struct dpu_hw_ds_cfg ds_cfg[DPU_MAX_DS_COUNT];
>
> struct dpu_core_perf_params new_perf;
> struct dpu_crtc_respool rp;
> @@ -362,7 +347,6 @@ struct dpu_crtc_state {
> /**
> * dpu_crtc_get_mixer_width - get the mixer width
> * Mixer width will be same as panel width(/2 for split)
> - * unless destination scaler feature is enabled
> */
> static inline int dpu_crtc_get_mixer_width(struct dpu_crtc *dpu_crtc,
> struct dpu_crtc_state *cstate, struct drm_display_mode *mode)
> @@ -372,10 +356,7 @@ static inline int dpu_crtc_get_mixer_width(struct dpu_crtc *dpu_crtc,
> if (!dpu_crtc || !cstate || !mode)
> return 0;
>
> - if (cstate->num_ds_enabled)
> - mixer_width = cstate->ds_cfg[0].lm_width;
> - else
> - mixer_width = (dpu_crtc->num_mixers == CRTC_DUAL_MIXERS ?
> + mixer_width = (dpu_crtc->num_mixers == CRTC_DUAL_MIXERS ?
> mode->hdisplay / CRTC_DUAL_MIXERS : mode->hdisplay);
>
> return mixer_width;
> @@ -383,8 +364,7 @@ static inline int dpu_crtc_get_mixer_width(struct dpu_crtc *dpu_crtc,
>
> /**
> * dpu_crtc_get_mixer_height - get the mixer height
> - * Mixer height will be same as panel height unless
> - * destination scaler feature is enabled
> + * Mixer height will be same as panel height
> */
> static inline int dpu_crtc_get_mixer_height(struct dpu_crtc *dpu_crtc,
> struct dpu_crtc_state *cstate, struct drm_display_mode *mode)
> @@ -392,8 +372,7 @@ static inline int dpu_crtc_get_mixer_height(struct dpu_crtc *dpu_crtc,
> if (!dpu_crtc || !cstate || !mode)
> return 0;
>
> - return (cstate->num_ds_enabled ?
> - cstate->ds_cfg[0].lm_height : mode->vdisplay);
> + return mode->vdisplay;
> }
>
> /**
> diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_encoder.c b/drivers/gpu/drm/msm/disp/dpu1/dpu_encoder.c
> index 77d3571..62660e0 100644
> --- a/drivers/gpu/drm/msm/disp/dpu1/dpu_encoder.c
> +++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_encoder.c
> @@ -230,18 +230,6 @@ struct dpu_encoder_virt {
> };
>
> #define to_dpu_encoder_virt(x) container_of(x, struct dpu_encoder_virt, base)
> -
> -void dpu_encoder_set_idle_timeout(struct drm_encoder *drm_enc, u32 idle_timeout)
> -{
> - struct dpu_encoder_virt *dpu_enc;
> -
> - if (!drm_enc)
> - return;
> -
> - dpu_enc = to_dpu_encoder_virt(drm_enc);
> - dpu_enc->idle_timeout = idle_timeout;
> -}
> -
> static inline int _dpu_encoder_power_enable(struct dpu_encoder_virt *dpu_enc,
> bool enable)
> {
> diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_ds.c b/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_ds.c
> deleted file mode 100644
> index fad19fb..0000000
> --- a/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_ds.c
> +++ /dev/null
> @@ -1,149 +0,0 @@
> -/* Copyright (c) 2017-2018, The Linux Foundation. All rights reserved.
> - *
> - * This program is free software; you can redistribute it and/or modify
> - * it under the terms of the GNU General Public License version 2 and
> - * only version 2 as published by the Free Software Foundation.
> - *
> - * This program is distributed in the hope that it will be useful,
> - * but WITHOUT ANY WARRANTY; without even the implied warranty of
> - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
> - * GNU General Public License for more details.
> - */
> -
> -#include "dpu_hw_ds.h"
> -#include "dpu_formats.h"
> -#include "dpu_dbg.h"
> -#include "dpu_kms.h"
> -
> -/* Destination scaler TOP registers */
> -#define DEST_SCALER_OP_MODE 0x00
> -#define DEST_SCALER_HW_VERSION 0x10
> -
> -static void dpu_hw_ds_setup_opmode(struct dpu_hw_ds *hw_ds,
> - u32 op_mode)
> -{
> - struct dpu_hw_blk_reg_map *hw = &hw_ds->hw;
> -
> - DPU_REG_WRITE(hw, DEST_SCALER_OP_MODE, op_mode);
> -}
> -
> -static void dpu_hw_ds_setup_scaler3(struct dpu_hw_ds *hw_ds,
> - void *scaler_cfg, void *scaler_lut_cfg)
> -{
> - struct dpu_hw_scaler3_cfg *scl3_cfg = scaler_cfg;
> - struct dpu_hw_scaler3_lut_cfg *scl3_lut_cfg = scaler_lut_cfg;
> -
> - if (!hw_ds || !hw_ds->scl || !scl3_cfg || !scl3_lut_cfg)
> - return;
> -
> - /*
> - * copy LUT values to scaler structure
> - */
> - if (scl3_lut_cfg->is_configured) {
> - scl3_cfg->dir_lut = scl3_lut_cfg->dir_lut;
> - scl3_cfg->dir_len = scl3_lut_cfg->dir_len;
> - scl3_cfg->cir_lut = scl3_lut_cfg->cir_lut;
> - scl3_cfg->cir_len = scl3_lut_cfg->cir_len;
> - scl3_cfg->sep_lut = scl3_lut_cfg->sep_lut;
> - scl3_cfg->sep_len = scl3_lut_cfg->sep_len;
> - }
> -
> - dpu_hw_setup_scaler3(&hw_ds->hw, scl3_cfg,
> - hw_ds->scl->base,
> - hw_ds->scl->version,
> - dpu_get_dpu_format(DRM_FORMAT_XBGR2101010));
> -}
> -
> -static void _setup_ds_ops(struct dpu_hw_ds_ops *ops, unsigned long features)
> -{
> - ops->setup_opmode = dpu_hw_ds_setup_opmode;
> -
> - if (test_bit(DPU_SSPP_SCALER_QSEED3, &features))
> - ops->setup_scaler = dpu_hw_ds_setup_scaler3;
> -}
> -
> -static struct dpu_ds_cfg *_ds_offset(enum dpu_ds ds,
> - struct dpu_mdss_cfg *m,
> - void __iomem *addr,
> - struct dpu_hw_blk_reg_map *b)
> -{
> - int i;
> -
> - if (!m || !addr || !b)
> - return ERR_PTR(-EINVAL);
> -
> - for (i = 0; i < m->ds_count; i++) {
> - if ((ds == m->ds[i].id) &&
> - (m->ds[i].top)) {
> - b->base_off = addr;
> - b->blk_off = m->ds[i].top->base;
> - b->length = m->ds[i].top->len;
> - b->hwversion = m->hwversion;
> - b->log_mask = DPU_DBG_MASK_DS;
> - return &m->ds[i];
> - }
> - }
> -
> - return ERR_PTR(-EINVAL);
> -}
> -
> -static struct dpu_hw_blk_ops dpu_hw_ops = {
> - .start = NULL,
> - .stop = NULL,
> -};
> -
> -struct dpu_hw_ds *dpu_hw_ds_init(enum dpu_ds idx,
> - void __iomem *addr,
> - struct dpu_mdss_cfg *m)
> -{
> - struct dpu_hw_ds *hw_ds;
> - struct dpu_ds_cfg *cfg;
> - int rc;
> -
> - if (!addr || !m)
> - return ERR_PTR(-EINVAL);
> -
> - hw_ds = kzalloc(sizeof(*hw_ds), GFP_KERNEL);
> - if (!hw_ds)
> - return ERR_PTR(-ENOMEM);
> -
> - cfg = _ds_offset(idx, m, addr, &hw_ds->hw);
> - if (IS_ERR_OR_NULL(cfg)) {
> - DPU_ERROR("failed to get ds cfg\n");
> - kfree(hw_ds);
> - return ERR_PTR(-EINVAL);
> - }
> -
> - /* Assign ops */
> - hw_ds->idx = idx;
> - hw_ds->scl = cfg;
> - _setup_ds_ops(&hw_ds->ops, hw_ds->scl->features);
> -
> - rc = dpu_hw_blk_init(&hw_ds->base, DPU_HW_BLK_DS, idx, &dpu_hw_ops);
> - if (rc) {
> - DPU_ERROR("failed to init hw blk %d\n", rc);
> - goto blk_init_error;
> - }
> -
> - if (cfg->len) {
> - dpu_dbg_reg_register_dump_range(DPU_DBG_NAME, cfg->name,
> - hw_ds->hw.blk_off + cfg->base,
> - hw_ds->hw.blk_off + cfg->base + cfg->len,
> - hw_ds->hw.xin_id);
> - }
> -
> - return hw_ds;
> -
> -blk_init_error:
> - kzfree(hw_ds);
> -
> - return ERR_PTR(rc);
> -
> -}
> -
> -void dpu_hw_ds_destroy(struct dpu_hw_ds *hw_ds)
> -{
> - if (hw_ds)
> - dpu_hw_blk_destroy(&hw_ds->base);
> - kfree(hw_ds);
> -}
> diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_ds.h b/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_ds.h
> deleted file mode 100644
> index 2455920..0000000
> --- a/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_ds.h
> +++ /dev/null
> @@ -1,111 +0,0 @@
> -/* Copyright (c) 2017-2018, The Linux Foundation. All rights reserved.
> - *
> - * This program is free software; you can redistribute it and/or modify
> - * it under the terms of the GNU General Public License version 2 and
> - * only version 2 as published by the Free Software Foundation.
> - *
> - * This program is distributed in the hope that it will be useful,
> - * but WITHOUT ANY WARRANTY; without even the implied warranty of
> - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
> - * GNU General Public License for more details.
> - */
> -
> -#ifndef _DPU_HW_DS_H
> -#define _DPU_HW_DS_H
> -
> -#include "dpu_hw_mdss.h"
> -#include "dpu_hw_util.h"
> -#include "dpu_hw_catalog.h"
> -#include "dpu_hw_blk.h"
> -
> -struct dpu_hw_ds;
> -
> -/* Destination Scaler DUAL mode overfetch pixel count */
> -#define DPU_DS_OVERFETCH_SIZE 5
> -
> -/* Destination scaler DUAL mode operation bit */
> -#define DPU_DS_OP_MODE_DUAL BIT(16)
> -
> -/* struct dpu_hw_ds_cfg - destination scaler config
> - * @ndx : DS selection index
> - * @flags : Flag to switch between mode for DS
> - * @lm_width : Layer mixer width configuration
> - * @lm_heigh : Layer mixer height configuration
> - * @set_lm_flush : LM flush bit
> - * @scl3_cfg : Pointer to dpu_hw_scaler3_cfg.
> - */
> -struct dpu_hw_ds_cfg {
> - u32 ndx;
> - int flags;
> - u32 lm_width;
> - u32 lm_height;
> - bool set_lm_flush;
> - struct dpu_hw_scaler3_cfg *scl3_cfg;
> -};
> -
> -/**
> - * struct dpu_hw_ds_ops - interface to the destination scaler
> - * hardware driver functions
> - * Caller must call the init function to get the ds context for each ds
> - * Assumption is these functions will be called after clocks are enabled
> - */
> -struct dpu_hw_ds_ops {
> - /**
> - * setup_opmode - destination scaler op mode setup
> - * @hw_ds : Pointer to ds context
> - * @op_mode : Op mode configuration
> - */
> - void (*setup_opmode)(struct dpu_hw_ds *hw_ds,
> - u32 op_mode);
> -
> - /**
> - * setup_scaler - destination scaler block setup
> - * @hw_ds : Pointer to ds context
> - * @scaler_cfg : Pointer to scaler data
> - * @scaler_lut_cfg : Pointer to scaler lut
> - */
> - void (*setup_scaler)(struct dpu_hw_ds *hw_ds,
> - void *scaler_cfg,
> - void *scaler_lut_cfg);
> -
> -};
> -
> -/**
> - * struct dpu_hw_ds - destination scaler description
> - * @base : Hardware block base structure
> - * @hw : Block hardware details
> - * @idx : Destination scaler index
> - * @scl : Pointer to
> - * - scaler offset relative to top offset
> - * - capabilities
> - * @ops : Pointer to operations for this DS
> - */
> -struct dpu_hw_ds {
> - struct dpu_hw_blk base;
> - struct dpu_hw_blk_reg_map hw;
> - enum dpu_ds idx;
> - const struct dpu_ds_cfg *scl;
> - struct dpu_hw_ds_ops ops;
> -};
> -
> -/**
> - * dpu_hw_ds_init - initializes the destination scaler
> - * hw driver object and should be called once before
> - * accessing every destination scaler
> - * @idx : DS index for which driver object is required
> - * @addr: Mapped register io address of MDP
> - * @m : MDSS catalog information
> - * @Return: pointer to structure or ERR_PTR
> - */
> -struct dpu_hw_ds *dpu_hw_ds_init(enum dpu_ds idx,
> - void __iomem *addr,
> - struct dpu_mdss_cfg *m);
> -
> -/**
> - * dpu_hw_ds_destroy - destroys destination scaler
> - * driver context
> - * @hw_ds: Pointer to DS context
> - */
> -void dpu_hw_ds_destroy(struct dpu_hw_ds *hw_ds);
> -
> -#endif /*_DPU_HW_DS_H */
> diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_lm.c b/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_lm.c
> index 75a30db..830b69e 100644
> --- a/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_lm.c
> +++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_lm.c
> @@ -172,68 +172,6 @@ static void dpu_hw_lm_gc(struct dpu_hw_mixer *mixer,
> {
> }
>
> -static void dpu_hw_lm_clear_dim_layer(struct dpu_hw_mixer *ctx)
> -{
> - struct dpu_hw_blk_reg_map *c = &ctx->hw;
> - const struct dpu_lm_sub_blks *sblk = ctx->cap->sblk;
> - int stage_off, i;
> - u32 reset = BIT(16), val;
> -
> - reset = ~reset;
> - for (i = DPU_STAGE_0; i < sblk->maxblendstages; i++) {
> - stage_off = _stage_offset(ctx, i);
> - if (WARN_ON(stage_off < 0))
> - return;
> -
> - /*
> - * read the existing blendn_op register and clear only DIM layer
> - * bit (color_fill bit)
> - */
> - val = DPU_REG_READ(c, LM_BLEND0_OP + stage_off);
> - val &= reset;
> - DPU_REG_WRITE(c, LM_BLEND0_OP + stage_off, val);
> - }
> -}
> -
> -static void dpu_hw_lm_setup_dim_layer(struct dpu_hw_mixer *ctx,
> - struct dpu_hw_dim_layer *dim_layer)
> -{
> - struct dpu_hw_blk_reg_map *c = &ctx->hw;
> - int stage_off;
> - u32 val = 0, alpha = 0;
> -
> - stage_off = _stage_offset(ctx, dim_layer->stage);
> - if (stage_off < 0) {
> - DPU_ERROR("invalid stage_off:%d for dim layer\n", stage_off);
> - return;
> - }
> -
> - alpha = dim_layer->color_fill.color_3 & 0xFF;
> - val = ((dim_layer->color_fill.color_1 << 2) & 0xFFF) << 16 |
> - ((dim_layer->color_fill.color_0 << 2) & 0xFFF);
> - DPU_REG_WRITE(c, LM_FG_COLOR_FILL_COLOR_0 + stage_off, val);
> -
> - val = (alpha << 4) << 16 |
> - ((dim_layer->color_fill.color_2 << 2) & 0xFFF);
> - DPU_REG_WRITE(c, LM_FG_COLOR_FILL_COLOR_1 + stage_off, val);
> -
> - val = dim_layer->rect.h << 16 | dim_layer->rect.w;
> - DPU_REG_WRITE(c, LM_FG_COLOR_FILL_SIZE + stage_off, val);
> -
> - val = dim_layer->rect.y << 16 | dim_layer->rect.x;
> - DPU_REG_WRITE(c, LM_FG_COLOR_FILL_XY + stage_off, val);
> -
> - val = BIT(16); /* enable dim layer */
> - val |= DPU_BLEND_FG_ALPHA_FG_CONST | DPU_BLEND_BG_ALPHA_BG_CONST;
> - if (dim_layer->flags & DPU_DRM_DIM_LAYER_EXCLUSIVE)
> - val |= BIT(17);
> - else
> - val &= ~BIT(17);
> - DPU_REG_WRITE(c, LM_BLEND0_OP + stage_off, val);
> - val = (alpha << 16) | (0xff - alpha);
> - DPU_REG_WRITE(c, LM_BLEND0_CONST_ALPHA + stage_off, val);
> -}
> -
> static void dpu_hw_lm_setup_misr(struct dpu_hw_mixer *ctx,
> bool enable, u32 frame_count)
> {
> @@ -272,11 +210,6 @@ static void _setup_mixer_ops(struct dpu_mdss_cfg *m,
> ops->setup_gc = dpu_hw_lm_gc;
> ops->setup_misr = dpu_hw_lm_setup_misr;
> ops->collect_misr = dpu_hw_lm_collect_misr;
> -
> - if (test_bit(DPU_DIM_LAYER, &features)) {
> - ops->setup_dim_layer = dpu_hw_lm_setup_dim_layer;
> - ops->clear_dim_layer = dpu_hw_lm_clear_dim_layer;
> - }
> };
>
> static struct dpu_hw_blk_ops dpu_hw_ops = {
> diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_lm.h b/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_lm.h
> index ef22c86..e29e5da 100644
> --- a/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_lm.h
> +++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_lm.h
> @@ -67,20 +67,6 @@ struct dpu_hw_lm_ops {
> void (*setup_gc)(struct dpu_hw_mixer *mixer,
> void *cfg);
>
> - /**
> - * setup_dim_layer: configure dim layer settings
> - * @ctx: Pointer to layer mixer context
> - * @dim_layer: dim layer configs
> - */
> - void (*setup_dim_layer)(struct dpu_hw_mixer *ctx,
> - struct dpu_hw_dim_layer *dim_layer);
> -
> - /**
> - * clear_dim_layer: clear dim layer settings
> - * @ctx: Pointer to layer mixer context
> - */
> - void (*clear_dim_layer)(struct dpu_hw_mixer *ctx);
> -
> /* setup_misr: enables/disables MISR in HW register */
> void (*setup_misr)(struct dpu_hw_mixer *ctx,
> bool enable, u32 frame_count);
> diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_mdss.h b/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_mdss.h
> index fcd164f..836ff9e 100644
> --- a/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_mdss.h
> +++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_mdss.h
> @@ -99,7 +99,6 @@ enum dpu_hw_blk_type {
> DPU_HW_BLK_TOP = 0,
> DPU_HW_BLK_SSPP,
> DPU_HW_BLK_LM,
> - DPU_HW_BLK_DS,
> DPU_HW_BLK_CTL,
> DPU_HW_BLK_CDM,
> DPU_HW_BLK_PINGPONG,
> @@ -469,20 +468,5 @@ struct dpu_mdss_color {
> #define DPU_DBG_MASK_TOP (1 << 8)
> #define DPU_DBG_MASK_VBIF (1 << 9)
> #define DPU_DBG_MASK_ROT (1 << 10)
> -#define DPU_DBG_MASK_DS (1 << 11)
> -
> -/**
> - * struct dpu_hw_dim_layer: dim layer configs
> - * @flags: Flag to represent INCLUSIVE/EXCLUSIVE
> - * @stage: Blending stage of dim layer
> - * @color_fill: Color fill to be used for the layer
> - * @rect: Dim layer coordinates
> - */
> -struct dpu_hw_dim_layer {
> - uint32_t flags;
> - uint32_t stage;
> - struct dpu_mdss_color color_fill;
> - struct dpu_rect rect;
> -};
>
> #endif /* _DPU_HW_MDSS_H */
> diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_rm.c b/drivers/gpu/drm/msm/disp/dpu1/dpu_rm.c
> index f467bf1..0af2996 100644
> --- a/drivers/gpu/drm/msm/disp/dpu1/dpu_rm.c
> +++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_rm.c
> @@ -17,7 +17,6 @@
> #include "dpu_hw_lm.h"
> #include "dpu_hw_ctl.h"
> #include "dpu_hw_cdm.h"
> -#include "dpu_hw_ds.h"
> #include "dpu_hw_pingpong.h"
> #include "dpu_hw_intf.h"
> #include "dpu_hw_wb.h"
> @@ -235,9 +234,6 @@ static void _dpu_rm_hw_destroy(enum dpu_hw_blk_type type, void *hw)
> case DPU_HW_BLK_LM:
> dpu_hw_lm_destroy(hw);
> break;
> - case DPU_HW_BLK_DS:
> - dpu_hw_ds_destroy(hw);
> - break;
> case DPU_HW_BLK_CTL:
> dpu_hw_ctl_destroy(hw);
> break;
> @@ -317,9 +313,6 @@ static int _dpu_rm_hw_blk_create(
> case DPU_HW_BLK_LM:
> hw = dpu_hw_lm_init(id, mmio, cat);
> break;
> - case DPU_HW_BLK_DS:
> - hw = dpu_hw_ds_init(id, mmio, cat);
> - break;
> case DPU_HW_BLK_CTL:
> hw = dpu_hw_ctl_init(id, mmio, cat);
> break;
> @@ -427,17 +420,6 @@ int dpu_rm_init(struct dpu_rm *rm,
> }
> }
>
> - if (cat->mdp[0].has_dest_scaler) {
> - for (i = 0; i < cat->ds_count; i++) {
> - rc = _dpu_rm_hw_blk_create(rm, cat, mmio, DPU_HW_BLK_DS,
> - cat->ds[i].id, &cat->ds[i]);
> - if (rc) {
> - DPU_ERROR("failed: ds hw not available\n");
> - goto fail;
> - }
> - }
> - }
> -
> for (i = 0; i < cat->pingpong_count; i++) {
> rc = _dpu_rm_hw_blk_create(rm, cat, mmio, DPU_HW_BLK_PINGPONG,
> cat->pingpong[i].id, &cat->pingpong[i]);
> @@ -516,20 +498,16 @@ static bool _dpu_rm_check_lm_and_get_connected_blks(
> struct dpu_rm_rsvp *rsvp,
> struct dpu_rm_requirements *reqs,
> struct dpu_rm_hw_blk *lm,
> - struct dpu_rm_hw_blk **ds,
> struct dpu_rm_hw_blk **pp,
> struct dpu_rm_hw_blk *primary_lm)
> {
> const struct dpu_lm_cfg *lm_cfg = to_dpu_hw_mixer(lm->hw)->cap;
> struct dpu_rm_hw_iter iter;
> - bool is_valid_ds;
>
> - *ds = NULL;
> *pp = NULL;
>
> - DPU_DEBUG("check lm %d ds %d pp %d\n",
> - lm_cfg->id,
> - lm_cfg->ds, lm_cfg->pingpong);
> + DPU_DEBUG("check lm %d pp %d\n",
> + lm_cfg->id, lm_cfg->pingpong);
>
> /* Check if this layer mixer is a peer of the proposed primary LM */
> if (primary_lm) {
> @@ -543,43 +521,12 @@ static bool _dpu_rm_check_lm_and_get_connected_blks(
> }
> }
>
> - is_valid_ds = (lm_cfg->ds != DS_MAX) ? true : false;
> -
> - if (RM_RQ_DS(reqs) && !is_valid_ds) {
> - DPU_DEBUG("fail:lm(%d)req_ds(%d)ds(%d)\n",
> - lm_cfg->id, (bool)(RM_RQ_DS(reqs)), lm_cfg->ds);
> -
> - return false;
> - }
> -
> /* Already reserved? */
> if (RESERVED_BY_OTHER(lm, rsvp)) {
> DPU_DEBUG("lm %d already reserved\n", lm_cfg->id);
> return false;
> }
>
> - if (lm_cfg->ds != DS_MAX) {
> - dpu_rm_init_hw_iter(&iter, 0, DPU_HW_BLK_DS);
> - while (_dpu_rm_get_hw_locked(rm, &iter)) {
> - if (iter.blk->id == lm_cfg->ds) {
> - *ds = iter.blk;
> - break;
> - }
> - }
> -
> - if (!*ds) {
> - DPU_DEBUG("lm %d failed to retrieve ds %d\n", lm->id,
> - lm_cfg->ds);
> - return false;
> - }
> -
> - if (RESERVED_BY_OTHER(*ds, rsvp)) {
> - DPU_DEBUG("lm %d ds %d already reserved\n",
> - lm->id, (*ds)->id);
> - return false;
> - }
> - }
> -
> dpu_rm_init_hw_iter(&iter, 0, DPU_HW_BLK_PINGPONG);
> while (_dpu_rm_get_hw_locked(rm, &iter)) {
> if (iter.blk->id == lm_cfg->pingpong) {
> @@ -596,7 +543,6 @@ static bool _dpu_rm_check_lm_and_get_connected_blks(
> if (RESERVED_BY_OTHER(*pp, rsvp)) {
> DPU_DEBUG("lm %d pp %d already reserved\n", lm->id,
> (*pp)->id);
> - *ds = NULL;
> return false;
> }
>
> @@ -610,7 +556,6 @@ static int _dpu_rm_reserve_lms(
>
> {
> struct dpu_rm_hw_blk *lm[MAX_BLOCKS];
> - struct dpu_rm_hw_blk *ds[MAX_BLOCKS];
> struct dpu_rm_hw_blk *pp[MAX_BLOCKS];
> struct dpu_rm_hw_iter iter_i, iter_j;
> int lm_count = 0;
> @@ -626,14 +571,13 @@ static int _dpu_rm_reserve_lms(
> while (lm_count != reqs->topology->num_lm &&
> _dpu_rm_get_hw_locked(rm, &iter_i)) {
> memset(&lm, 0, sizeof(lm));
> - memset(&ds, 0, sizeof(ds));
> memset(&pp, 0, sizeof(pp));
>
> lm_count = 0;
> lm[lm_count] = iter_i.blk;
>
> if (!_dpu_rm_check_lm_and_get_connected_blks(
> - rm, rsvp, reqs, lm[lm_count], &ds[lm_count],
> + rm, rsvp, reqs, lm[lm_count],
> &pp[lm_count], NULL))
> continue;
>
> @@ -649,8 +593,7 @@ static int _dpu_rm_reserve_lms(
>
> if (!_dpu_rm_check_lm_and_get_connected_blks(
> rm, rsvp, reqs, iter_j.blk,
> - &ds[lm_count], &pp[lm_count],
> - iter_i.blk))
> + &pp[lm_count], iter_i.blk))
> continue;
>
> lm[lm_count] = iter_j.blk;
> @@ -670,11 +613,7 @@ static int _dpu_rm_reserve_lms(
> lm[i]->rsvp_nxt = rsvp;
> pp[i]->rsvp_nxt = rsvp;
>
> - if (ds[i])
> - ds[i]->rsvp_nxt = rsvp;
> -
> - DPU_EVT32(lm[i]->type, rsvp->enc_id, lm[i]->id, pp[i]->id,
> - ds[i] ? ds[i]->id : 0);
> + DPU_EVT32(lm[i]->type, rsvp->enc_id, lm[i]->id, pp[i]->id);
> }
>
> return rc;
> diff --git a/drivers/gpu/drm/msm/msm_drv.h b/drivers/gpu/drm/msm/msm_drv.h
> index 5baff27..8e80b4b 100644
> --- a/drivers/gpu/drm/msm/msm_drv.h
> +++ b/drivers/gpu/drm/msm/msm_drv.h
> @@ -89,25 +89,10 @@ enum msm_mdp_plane_property {
>
> enum msm_mdp_crtc_property {
> CRTC_PROP_INFO,
> - CRTC_PROP_DEST_SCALER_LUT_ED,
> - CRTC_PROP_DEST_SCALER_LUT_CIR,
> - CRTC_PROP_DEST_SCALER_LUT_SEP,
>
> /* # of blob properties */
> CRTC_PROP_BLOBCOUNT,
>
> - /* range properties */
> - CRTC_PROP_DIM_LAYER_V1 = CRTC_PROP_BLOBCOUNT,
> - CRTC_PROP_CORE_CLK,
> - CRTC_PROP_CORE_AB,
> - CRTC_PROP_CORE_IB,
> - CRTC_PROP_LLCC_AB,
> - CRTC_PROP_LLCC_IB,
> - CRTC_PROP_DRAM_AB,
> - CRTC_PROP_DRAM_IB,
> - CRTC_PROP_IDLE_TIMEOUT,
> - CRTC_PROP_DEST_SCALER,
> -
> /* total # of properties */
> CRTC_PROP_COUNT
> };
> --
> The Qualcomm Innovation Center, Inc. is a member of the Code Aurora Forum,
> a Linux Foundation Collaborative Project
>
--
Sean Paul, Software Engineer, Google / Chromium OS
_______________________________________________
Freedreno mailing list
Freedreno@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/freedreno
^ permalink raw reply [flat|nested] 18+ messages in thread
* Re: [DPU PATCH 6/7] drm/msm: remove msm_prop files
2018-05-23 19:31 ` [DPU PATCH 6/7] drm/msm: remove msm_prop files Jeykumar Sankaran
@ 2018-06-04 19:59 ` Sean Paul
0 siblings, 0 replies; 18+ messages in thread
From: Sean Paul @ 2018-06-04 19:59 UTC (permalink / raw)
To: Jeykumar Sankaran; +Cc: linux-arm-msm, dri-devel, hoegsberg, freedreno
On Wed, May 23, 2018 at 12:31:01PM -0700, Jeykumar Sankaran wrote:
> Remove hand rolled msm property caching to handle DPU
> custom properties. This change also cleans up all its
> dependencies to cache and restore respective drm
> states.
>
> Signed-off-by: Jeykumar Sankaran <jsanka@codeaurora.org>
Reviewed-by: Sean Paul <seanpaul@chromium.org>
> ---
> drivers/gpu/drm/msm/Makefile | 1 -
> drivers/gpu/drm/msm/disp/dpu1/dpu_core_perf.c | 2 -
> drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c | 239 +--------
> drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.h | 16 -
> drivers/gpu/drm/msm/disp/dpu1/dpu_encoder.h | 2 -
> drivers/gpu/drm/msm/disp/dpu1/dpu_plane.c | 123 +----
> drivers/gpu/drm/msm/disp/dpu1/dpu_plane.h | 12 -
> drivers/gpu/drm/msm/msm_drv.h | 16 +-
> drivers/gpu/drm/msm/msm_prop.c | 688 --------------------------
> drivers/gpu/drm/msm/msm_prop.h | 438 ----------------
> 10 files changed, 8 insertions(+), 1529 deletions(-)
> delete mode 100644 drivers/gpu/drm/msm/msm_prop.c
> delete mode 100644 drivers/gpu/drm/msm/msm_prop.h
>
> diff --git a/drivers/gpu/drm/msm/Makefile b/drivers/gpu/drm/msm/Makefile
> index d289503..5331188 100644
> --- a/drivers/gpu/drm/msm/Makefile
> +++ b/drivers/gpu/drm/msm/Makefile
> @@ -76,7 +76,6 @@ msm-y := \
> dpu_io_util.o \
> dpu_dbg_evtlog.o \
> dpu_power_handle.o \
> - msm_prop.o \
> msm_atomic.o \
> msm_debugfs.o \
> msm_drv.o \
> diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_core_perf.c b/drivers/gpu/drm/msm/disp/dpu1/dpu_core_perf.c
> index c4820de..e4b82d5 100644
> --- a/drivers/gpu/drm/msm/disp/dpu1/dpu_core_perf.c
> +++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_core_perf.c
> @@ -19,8 +19,6 @@
> #include <linux/clk.h>
> #include <linux/bitmap.h>
>
> -#include "msm_prop.h"
> -
> #include "dpu_kms.h"
> #include "dpu_trace.h"
> #include "dpu_crtc.h"
> diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c b/drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c
> index b0a3a30..43d9985 100644
> --- a/drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c
> +++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c
> @@ -579,10 +579,6 @@ static void dpu_crtc_destroy(struct drm_crtc *crtc)
> if (!crtc)
> return;
>
> - if (dpu_crtc->blob_info)
> - drm_property_blob_put(dpu_crtc->blob_info);
> - msm_property_destroy(&dpu_crtc->property_info);
> -
> _dpu_crtc_deinit_events(dpu_crtc);
>
> drm_crtc_cleanup(crtc);
> @@ -1390,9 +1386,7 @@ static void dpu_crtc_destroy_state(struct drm_crtc *crtc,
>
> __drm_atomic_helper_crtc_destroy_state(state);
>
> - /* destroy value helper */
> - msm_property_destroy_state(&dpu_crtc->property_info, cstate,
> - &cstate->property_state);
> + kfree(cstate);
> }
>
> static int _dpu_crtc_wait_for_frame_done(struct drm_crtc *crtc)
> @@ -1641,17 +1635,12 @@ static struct drm_crtc_state *dpu_crtc_duplicate_state(struct drm_crtc *crtc)
>
> dpu_crtc = to_dpu_crtc(crtc);
> old_cstate = to_dpu_crtc_state(crtc->state);
> - cstate = msm_property_alloc_state(&dpu_crtc->property_info);
> + cstate = kmemdup(old_cstate, sizeof(*old_cstate), GFP_KERNEL);
> if (!cstate) {
> DPU_ERROR("failed to allocate state\n");
> return NULL;
> }
>
> - /* duplicate value helper */
> - msm_property_duplicate_state(&dpu_crtc->property_info,
> - old_cstate, cstate,
> - &cstate->property_state, cstate->property_values);
> -
> /* duplicate base helper */
> __drm_atomic_helper_crtc_duplicate_state(crtc, &cstate->base);
>
> @@ -1687,17 +1676,12 @@ static void dpu_crtc_reset(struct drm_crtc *crtc)
> }
>
> dpu_crtc = to_dpu_crtc(crtc);
> - cstate = msm_property_alloc_state(&dpu_crtc->property_info);
> + cstate = kzalloc(sizeof(*cstate), GFP_KERNEL);
> if (!cstate) {
> DPU_ERROR("failed to allocate state\n");
> return;
> }
>
> - /* reset value helper */
> - msm_property_reset_state(&dpu_crtc->property_info, cstate,
> - &cstate->property_state,
> - cstate->property_values);
> -
> _dpu_crtc_rp_reset(&cstate->rp, &dpu_crtc->rp_lock,
> &dpu_crtc->rp_head);
>
> @@ -2194,212 +2178,6 @@ void dpu_crtc_cancel_pending_flip(struct drm_crtc *crtc, struct drm_file *file)
> _dpu_crtc_complete_flip(crtc, file);
> }
>
> -/**
> - * dpu_crtc_install_properties - install all drm properties for crtc
> - * @crtc: Pointer to drm crtc structure
> - */
> -static void dpu_crtc_install_properties(struct drm_crtc *crtc,
> - struct dpu_mdss_cfg *catalog)
> -{
> - struct dpu_crtc *dpu_crtc;
> - struct drm_device *dev;
> - struct dpu_kms_info *info;
> - struct dpu_kms *dpu_kms;
> -
> - DPU_DEBUG("\n");
> -
> - if (!crtc || !catalog) {
> - DPU_ERROR("invalid crtc or catalog\n");
> - return;
> - }
> -
> - dpu_crtc = to_dpu_crtc(crtc);
> - dev = crtc->dev;
> - dpu_kms = _dpu_crtc_get_kms(crtc);
> -
> - if (!dpu_kms) {
> - DPU_ERROR("invalid argument\n");
> - return;
> - }
> -
> - info = kzalloc(sizeof(struct dpu_kms_info), GFP_KERNEL);
> - if (!info) {
> - DPU_ERROR("failed to allocate info memory\n");
> - return;
> - }
> -
> - msm_property_install_blob(&dpu_crtc->property_info, "capabilities",
> - DRM_MODE_PROP_IMMUTABLE, CRTC_PROP_INFO);
> -
> - dpu_kms_info_reset(info);
> -
> - dpu_kms_info_add_keyint(info, "hw_version", catalog->hwversion);
> - dpu_kms_info_add_keyint(info, "max_linewidth",
> - catalog->caps->max_mixer_width);
> - dpu_kms_info_add_keyint(info, "max_blendstages",
> - catalog->caps->max_mixer_blendstages);
> - if (catalog->caps->qseed_type == DPU_SSPP_SCALER_QSEED2)
> - dpu_kms_info_add_keystr(info, "qseed_type", "qseed2");
> - if (catalog->caps->qseed_type == DPU_SSPP_SCALER_QSEED3)
> - dpu_kms_info_add_keystr(info, "qseed_type", "qseed3");
> -
> - if (dpu_is_custom_client()) {
> - if (catalog->caps->smart_dma_rev == DPU_SSPP_SMART_DMA_V1)
> - dpu_kms_info_add_keystr(info,
> - "smart_dma_rev", "smart_dma_v1");
> - if (catalog->caps->smart_dma_rev == DPU_SSPP_SMART_DMA_V2)
> - dpu_kms_info_add_keystr(info,
> - "smart_dma_rev", "smart_dma_v2");
> - }
> -
> - dpu_kms_info_add_keyint(info, "has_src_split",
> - catalog->caps->has_src_split);
> - if (catalog->perf.max_bw_low)
> - dpu_kms_info_add_keyint(info, "max_bandwidth_low",
> - catalog->perf.max_bw_low * 1000LL);
> - if (catalog->perf.max_bw_high)
> - dpu_kms_info_add_keyint(info, "max_bandwidth_high",
> - catalog->perf.max_bw_high * 1000LL);
> - if (catalog->perf.min_core_ib)
> - dpu_kms_info_add_keyint(info, "min_core_ib",
> - catalog->perf.min_core_ib * 1000LL);
> - if (catalog->perf.min_llcc_ib)
> - dpu_kms_info_add_keyint(info, "min_llcc_ib",
> - catalog->perf.min_llcc_ib * 1000LL);
> - if (catalog->perf.min_dram_ib)
> - dpu_kms_info_add_keyint(info, "min_dram_ib",
> - catalog->perf.min_dram_ib * 1000LL);
> - if (dpu_kms->perf.max_core_clk_rate)
> - dpu_kms_info_add_keyint(info, "max_mdp_clk",
> - dpu_kms->perf.max_core_clk_rate);
> - dpu_kms_info_add_keystr(info, "core_ib_ff",
> - catalog->perf.core_ib_ff);
> - dpu_kms_info_add_keystr(info, "core_clk_ff",
> - catalog->perf.core_clk_ff);
> - dpu_kms_info_add_keystr(info, "comp_ratio_rt",
> - catalog->perf.comp_ratio_rt);
> - dpu_kms_info_add_keystr(info, "comp_ratio_nrt",
> - catalog->perf.comp_ratio_nrt);
> - dpu_kms_info_add_keyint(info, "dest_scale_prefill_lines",
> - catalog->perf.dest_scale_prefill_lines);
> - dpu_kms_info_add_keyint(info, "undersized_prefill_lines",
> - catalog->perf.undersized_prefill_lines);
> - dpu_kms_info_add_keyint(info, "macrotile_prefill_lines",
> - catalog->perf.macrotile_prefill_lines);
> - dpu_kms_info_add_keyint(info, "yuv_nv12_prefill_lines",
> - catalog->perf.yuv_nv12_prefill_lines);
> - dpu_kms_info_add_keyint(info, "linear_prefill_lines",
> - catalog->perf.linear_prefill_lines);
> - dpu_kms_info_add_keyint(info, "downscaling_prefill_lines",
> - catalog->perf.downscaling_prefill_lines);
> - dpu_kms_info_add_keyint(info, "xtra_prefill_lines",
> - catalog->perf.xtra_prefill_lines);
> - dpu_kms_info_add_keyint(info, "amortizable_threshold",
> - catalog->perf.amortizable_threshold);
> - dpu_kms_info_add_keyint(info, "min_prefill_lines",
> - catalog->perf.min_prefill_lines);
> -
> - msm_property_set_blob(&dpu_crtc->property_info, &dpu_crtc->blob_info,
> - info->data, DPU_KMS_INFO_DATALEN(info), CRTC_PROP_INFO);
> -
> - kfree(info);
> -}
> -
> -/**
> - * dpu_crtc_atomic_set_property - atomically set a crtc drm property
> - * @crtc: Pointer to drm crtc structure
> - * @state: Pointer to drm crtc state structure
> - * @property: Pointer to targeted drm property
> - * @val: Updated property value
> - * @Returns: Zero on success
> - */
> -static int dpu_crtc_atomic_set_property(struct drm_crtc *crtc,
> - struct drm_crtc_state *state,
> - struct drm_property *property,
> - uint64_t val)
> -{
> - struct dpu_crtc *dpu_crtc;
> - struct dpu_crtc_state *cstate;
> - int ret = -EINVAL;
> -
> - if (!crtc || !state || !property) {
> - DPU_ERROR("invalid argument(s)\n");
> - } else {
> - dpu_crtc = to_dpu_crtc(crtc);
> - cstate = to_dpu_crtc_state(state);
> - ret = msm_property_atomic_set(&dpu_crtc->property_info,
> - &cstate->property_state, property, val);
> - if (ret)
> - DRM_ERROR("failed to set the property\n");
> -
> - DPU_DEBUG("crtc%d %s[%d] <= 0x%llx ret=%d\n", crtc->base.id,
> - property->name, property->base.id, val, ret);
> - }
> -
> - return ret;
> -}
> -
> -/**
> - * dpu_crtc_set_property - set a crtc drm property
> - * @crtc: Pointer to drm crtc structure
> - * @property: Pointer to targeted drm property
> - * @val: Updated property value
> - * @Returns: Zero on success
> - */
> -static int dpu_crtc_set_property(struct drm_crtc *crtc,
> - struct drm_property *property, uint64_t val)
> -{
> - DPU_DEBUG("\n");
> -
> - return dpu_crtc_atomic_set_property(crtc, crtc->state, property, val);
> -}
> -
> -/**
> - * dpu_crtc_atomic_get_property - retrieve a crtc drm property
> - * @crtc: Pointer to drm crtc structure
> - * @state: Pointer to drm crtc state structure
> - * @property: Pointer to targeted drm property
> - * @val: Pointer to variable for receiving property value
> - * @Returns: Zero on success
> - */
> -static int dpu_crtc_atomic_get_property(struct drm_crtc *crtc,
> - const struct drm_crtc_state *state,
> - struct drm_property *property,
> - uint64_t *val)
> -{
> - struct dpu_crtc *dpu_crtc;
> - struct dpu_crtc_state *cstate;
> - struct drm_encoder *encoder;
> - int i, ret = -EINVAL;
> - bool is_cmd = true;
> -
> - if (!crtc || !state) {
> - DPU_ERROR("invalid argument(s)\n");
> - } else {
> - dpu_crtc = to_dpu_crtc(crtc);
> - cstate = to_dpu_crtc_state(state);
> -
> - /**
> - * set the cmd flag only when all the encoders attached
> - * to the crtc are in cmd mode. Consider all other cases
> - * as video mode.
> - */
> - drm_for_each_encoder(encoder, crtc->dev) {
> - if (encoder->crtc == crtc)
> - is_cmd = dpu_encoder_check_mode(encoder,
> - MSM_DISPLAY_CAP_CMD_MODE);
> - }
> -
> - i = msm_property_index(&dpu_crtc->property_info, property);
> - ret = msm_property_atomic_get(&dpu_crtc->property_info,
> - &cstate->property_state,
> - property, val);
> - if (ret)
> - DRM_ERROR("get property failed\n");
> - }
> - return ret;
> -}
> -
> #ifdef CONFIG_DEBUG_FS
> static int _dpu_debugfs_status_show(struct seq_file *s, void *data)
> {
> @@ -2759,9 +2537,6 @@ static void dpu_crtc_early_unregister(struct drm_crtc *crtc)
> .set_config = drm_atomic_helper_set_config,
> .destroy = dpu_crtc_destroy,
> .page_flip = drm_atomic_helper_page_flip,
> - .set_property = dpu_crtc_set_property,
> - .atomic_set_property = dpu_crtc_atomic_set_property,
> - .atomic_get_property = dpu_crtc_atomic_get_property,
> .reset = dpu_crtc_reset,
> .atomic_duplicate_state = dpu_crtc_duplicate_state,
> .atomic_destroy_state = dpu_crtc_destroy_state,
> @@ -2924,14 +2699,6 @@ struct drm_crtc *dpu_crtc_init(struct drm_device *dev, struct drm_plane *plane)
> return ERR_PTR(rc);
> }
>
> - /* create CRTC properties */
> - msm_property_init(&dpu_crtc->property_info, &crtc->base, dev,
> - priv->crtc_property, dpu_crtc->property_data,
> - CRTC_PROP_COUNT, CRTC_PROP_BLOBCOUNT,
> - sizeof(struct dpu_crtc_state));
> -
> - dpu_crtc_install_properties(crtc, kms->catalog);
> -
> DPU_DEBUG("%s: successfully initialized crtc\n", dpu_crtc->name);
> return crtc;
> }
> diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.h b/drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.h
> index 6628eb3..f752101 100644
> --- a/drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.h
> +++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.h
> @@ -22,7 +22,6 @@
> #include <linux/kthread.h>
> #include <uapi/drm/dpu_drm.h>
> #include <drm/drm_crtc.h>
> -#include "msm_prop.h"
> #include "dpu_kms.h"
> #include "dpu_core_perf.h"
> #include "dpu_hw_blk.h"
> @@ -200,10 +199,6 @@ struct dpu_crtc {
> struct drm_pending_vblank_event *event;
> u32 vsync_count;
>
> - struct msm_property_info property_info;
> - struct msm_property_data property_data[CRTC_PROP_COUNT];
> - struct drm_property_blob *blob_info;
> -
> struct dpu_hw_stage_cfg stage_cfg;
> struct dentry *debugfs_root;
>
> @@ -324,8 +319,6 @@ struct dpu_crtc_state {
> bool is_ppsplit;
> struct dpu_rect lm_bounds[CRTC_DUAL_MIXERS];
>
> - struct msm_property_state property_state;
> - struct msm_property_value property_values[CRTC_PROP_COUNT];
> uint64_t input_fence_timeout_ns;
>
> struct dpu_core_perf_params new_perf;
> @@ -336,15 +329,6 @@ struct dpu_crtc_state {
> container_of(x, struct dpu_crtc_state, base)
>
> /**
> - * dpu_crtc_get_property - query integer value of crtc property
> - * @S: Pointer to crtc state
> - * @X: Property index, from enum msm_mdp_crtc_property
> - * Returns: Integer value of requested property
> - */
> -#define dpu_crtc_get_property(S, X) \
> - ((S) && ((X) < CRTC_PROP_COUNT) ? ((S)->property_values[(X)].value) : 0)
> -
> -/**
> * dpu_crtc_get_mixer_width - get the mixer width
> * Mixer width will be same as panel width(/2 for split)
> */
> diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_encoder.h b/drivers/gpu/drm/msm/disp/dpu1/dpu_encoder.h
> index d853ad9..0339dfd 100644
> --- a/drivers/gpu/drm/msm/disp/dpu1/dpu_encoder.h
> +++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_encoder.h
> @@ -20,8 +20,6 @@
> #define __DPU_ENCODER_H__
>
> #include <drm/drm_crtc.h>
> -
> -#include "msm_prop.h"
> #include "dpu_hw_mdss.h"
>
> #define DPU_ENCODER_FRAME_EVENT_DONE BIT(0)
> diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_plane.c b/drivers/gpu/drm/msm/disp/dpu1/dpu_plane.c
> index 28735c8..faf5903 100644
> --- a/drivers/gpu/drm/msm/disp/dpu1/dpu_plane.c
> +++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_plane.c
> @@ -20,9 +20,8 @@
>
> #include <linux/debugfs.h>
> #include <linux/dma-buf.h>
> -#include "msm_prop.h"
> -#include "msm_drv.h"
>
> +#include "msm_drv.h"
> #include "dpu_kms.h"
> #include "dpu_formats.h"
> #include "dpu_hw_sspp.h"
> @@ -119,9 +118,6 @@ struct dpu_plane {
>
> const struct dpu_sspp_sub_blks *pipe_sblk;
> char pipe_name[DPU_NAME_SIZE];
> - struct msm_property_info property_info;
> - struct msm_property_data property_data[PLANE_PROP_COUNT];
> - struct drm_property_blob *blob_info;
>
> /* debugfs related stuff */
> struct dentry *debugfs_root;
> @@ -1401,7 +1397,6 @@ static int dpu_plane_sspp_atomic_update(struct drm_plane *plane,
> }
>
> _dpu_plane_set_qos_remap(plane);
> -
> return 0;
> }
>
> @@ -1486,89 +1481,6 @@ void dpu_plane_restore(struct drm_plane *plane)
> dpu_plane_atomic_update(plane, plane->state);
> }
>
> -/* helper to install properties which are common to planes and crtcs */
> -static void _dpu_plane_install_properties(struct drm_plane *plane,
> - struct dpu_mdss_cfg *catalog, u32 master_plane_id)
> -{
> - struct dpu_plane *pdpu = to_dpu_plane(plane);
> - int zpos_max = 255;
> - int zpos_def = 0;
> -
> - if (!plane || !pdpu) {
> - DPU_ERROR("invalid plane\n");
> - return;
> - } else if (!pdpu->pipe_hw || !pdpu->pipe_sblk) {
> - DPU_ERROR("invalid plane, pipe_hw %d pipe_sblk %d\n",
> - pdpu->pipe_hw != 0, pdpu->pipe_sblk != 0);
> - return;
> - } else if (!catalog) {
> - DPU_ERROR("invalid catalog\n");
> - return;
> - }
> -
> - pdpu->catalog = catalog;
> -
> - if (dpu_is_custom_client()) {
> - if (catalog->mixer_count &&
> - catalog->mixer[0].sblk->maxblendstages) {
> - zpos_max = catalog->mixer[0].sblk->maxblendstages - 1;
> - if (zpos_max > DPU_STAGE_MAX - DPU_STAGE_0 - 1)
> - zpos_max = DPU_STAGE_MAX - DPU_STAGE_0 - 1;
> - }
> - } else if (plane->type != DRM_PLANE_TYPE_PRIMARY) {
> - /* reserve zpos == 0 for primary planes */
> - zpos_def = drm_plane_index(plane) + 1;
> - }
> -}
> -
> -static int dpu_plane_atomic_set_property(struct drm_plane *plane,
> - struct drm_plane_state *state, struct drm_property *property,
> - uint64_t val)
> -{
> - struct dpu_plane *pdpu = plane ? to_dpu_plane(plane) : NULL;
> - struct dpu_plane_state *pstate;
> - int ret = -EINVAL;
> -
> - DPU_DEBUG_PLANE(pdpu, "\n");
> -
> - if (!plane) {
> - DPU_ERROR("invalid plane\n");
> - } else if (!state) {
> - DPU_ERROR_PLANE(pdpu, "invalid state\n");
> - } else {
> - pstate = to_dpu_plane_state(state);
> - ret = msm_property_atomic_set(&pdpu->property_info,
> - &pstate->property_state, property, val);
> - }
> -
> - DPU_DEBUG_PLANE(pdpu, "%s[%d] <= 0x%llx ret=%d\n",
> - property->name, property->base.id, val, ret);
> -
> - return ret;
> -}
> -
> -static int dpu_plane_atomic_get_property(struct drm_plane *plane,
> - const struct drm_plane_state *state,
> - struct drm_property *property, uint64_t *val)
> -{
> - struct dpu_plane *pdpu = plane ? to_dpu_plane(plane) : NULL;
> - struct dpu_plane_state *pstate;
> - int ret = -EINVAL;
> -
> - if (!plane) {
> - DPU_ERROR("invalid plane\n");
> - } else if (!state) {
> - DPU_ERROR("invalid state\n");
> - } else {
> - DPU_DEBUG_PLANE(pdpu, "\n");
> - pstate = to_dpu_plane_state(state);
> - ret = msm_property_atomic_get(&pdpu->property_info,
> - &pstate->property_state, property, val);
> - }
> -
> - return ret;
> -}
> -
> static void dpu_plane_destroy(struct drm_plane *plane)
> {
> struct dpu_plane *pdpu = plane ? to_dpu_plane(plane) : NULL;
> @@ -1578,9 +1490,6 @@ static void dpu_plane_destroy(struct drm_plane *plane)
> if (pdpu) {
> _dpu_plane_set_qos_ctrl(plane, false, DPU_PLANE_QOS_PANIC_CTRL);
>
> - if (pdpu->blob_info)
> - drm_property_blob_put(pdpu->blob_info);
> - msm_property_destroy(&pdpu->property_info);
> mutex_destroy(&pdpu->lock);
>
> drm_plane_helper_disable(plane);
> @@ -1598,7 +1507,6 @@ static void dpu_plane_destroy(struct drm_plane *plane)
> static void dpu_plane_destroy_state(struct drm_plane *plane,
> struct drm_plane_state *state)
> {
> - struct dpu_plane *pdpu;
> struct dpu_plane_state *pstate;
>
> if (!plane || !state) {
> @@ -1607,18 +1515,13 @@ static void dpu_plane_destroy_state(struct drm_plane *plane,
> return;
> }
>
> - pdpu = to_dpu_plane(plane);
> pstate = to_dpu_plane_state(state);
>
> - DPU_DEBUG_PLANE(pdpu, "\n");
> -
> /* remove ref count for frame buffers */
> if (state->fb)
> drm_framebuffer_put(state->fb);
>
> - /* destroy value helper */
> - msm_property_destroy_state(&pdpu->property_info, pstate,
> - &pstate->property_state);
> + kfree(pstate);
> }
>
> static struct drm_plane_state *
> @@ -1638,7 +1541,7 @@ static void dpu_plane_destroy_state(struct drm_plane *plane,
>
> old_state = to_dpu_plane_state(plane->state);
> pdpu = to_dpu_plane(plane);
> - pstate = msm_property_alloc_state(&pdpu->property_info);
> + pstate = kmemdup(old_state, sizeof(*old_state), GFP_KERNEL);
> if (!pstate) {
> DPU_ERROR_PLANE(pdpu, "failed to allocate state\n");
> return NULL;
> @@ -1646,10 +1549,6 @@ static void dpu_plane_destroy_state(struct drm_plane *plane,
>
> DPU_DEBUG_PLANE(pdpu, "\n");
>
> - /* duplicate value helper */
> - msm_property_duplicate_state(&pdpu->property_info, old_state, pstate,
> - &pstate->property_state, pstate->property_values);
> -
> pstate->pending = false;
>
> __drm_atomic_helper_plane_duplicate_state(plane, &pstate->base);
> @@ -1676,17 +1575,12 @@ static void dpu_plane_reset(struct drm_plane *plane)
> plane->state = 0;
> }
>
> - pstate = msm_property_alloc_state(&pdpu->property_info);
> + pstate = kzalloc(sizeof(*pstate), GFP_KERNEL);
> if (!pstate) {
> DPU_ERROR_PLANE(pdpu, "failed to allocate state\n");
> return;
> }
>
> - /* reset value helper */
> - msm_property_reset_state(&pdpu->property_info, pstate,
> - &pstate->property_state,
> - pstate->property_values);
> -
> pstate->base.plane = plane;
>
> plane->state = &pstate->base;
> @@ -1919,8 +1813,6 @@ static void dpu_plane_early_unregister(struct drm_plane *plane)
> .update_plane = drm_atomic_helper_update_plane,
> .disable_plane = drm_atomic_helper_disable_plane,
> .destroy = dpu_plane_destroy,
> - .atomic_set_property = dpu_plane_atomic_set_property,
> - .atomic_get_property = dpu_plane_atomic_get_property,
> .reset = dpu_plane_reset,
> .atomic_duplicate_state = dpu_plane_duplicate_state,
> .atomic_destroy_state = dpu_plane_destroy_state,
> @@ -2064,13 +1956,6 @@ struct drm_plane *dpu_plane_init(struct drm_device *dev,
> /* success! finalize initialization */
> drm_plane_helper_add(plane, &dpu_plane_helper_funcs);
>
> - msm_property_init(&pdpu->property_info, &plane->base, dev,
> - priv->plane_property, pdpu->property_data,
> - PLANE_PROP_COUNT, PLANE_PROP_BLOBCOUNT,
> - sizeof(struct dpu_plane_state));
> -
> - _dpu_plane_install_properties(plane, kms->catalog, master_plane_id);
> -
> /* save user friendly pipe name for later */
> snprintf(pdpu->pipe_name, DPU_NAME_SIZE, "plane%u", plane->base.id);
>
> diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_plane.h b/drivers/gpu/drm/msm/disp/dpu1/dpu_plane.h
> index a06c8b4..f6fe6dd 100644
> --- a/drivers/gpu/drm/msm/disp/dpu1/dpu_plane.h
> +++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_plane.h
> @@ -21,7 +21,6 @@
>
> #include <drm/drm_crtc.h>
>
> -#include "msm_prop.h"
> #include "dpu_kms.h"
> #include "dpu_hw_mdss.h"
> #include "dpu_hw_sspp.h"
> @@ -44,8 +43,6 @@
> */
> struct dpu_plane_state {
> struct drm_plane_state base;
> - struct msm_property_state property_state;
> - struct msm_property_value property_values[PLANE_PROP_COUNT];
> struct msm_gem_address_space *aspace;
> void *input_fence;
> enum dpu_stage stage;
> @@ -74,15 +71,6 @@ struct dpu_multirect_plane_states {
> container_of(x, struct dpu_plane_state, base)
>
> /**
> - * dpu_plane_get_property - Query integer value of plane property
> - * @S: Pointer to plane state
> - * @X: Property index, from enum msm_mdp_plane_property
> - * Returns: Integer value of requested property
> - */
> -#define dpu_plane_get_property(S, X) ((S) && ((X) < PLANE_PROP_COUNT) ? \
> - ((S)->property_values[(X)].value) : 0)
> -
> -/**
> * dpu_plane_pipe - return sspp identifier for the given plane
> * @plane: Pointer to DRM plane object
> * Returns: sspp identifier of the given plane
> diff --git a/drivers/gpu/drm/msm/msm_drv.h b/drivers/gpu/drm/msm/msm_drv.h
> index 8e80b4b..edb395d 100644
> --- a/drivers/gpu/drm/msm/msm_drv.h
> +++ b/drivers/gpu/drm/msm/msm_drv.h
> @@ -77,26 +77,13 @@ struct msm_file_private {
> };
>
> enum msm_mdp_plane_property {
> - /* # of blob properties */
> - PLANE_PROP_BLOBCOUNT,
> -
> /* range properties */
> - PLANE_PROP_ZPOS = PLANE_PROP_BLOBCOUNT,
> + PLANE_PROP_ZPOS,
>
> /* total # of properties */
> PLANE_PROP_COUNT
> };
>
> -enum msm_mdp_crtc_property {
> - CRTC_PROP_INFO,
> -
> - /* # of blob properties */
> - CRTC_PROP_BLOBCOUNT,
> -
> - /* total # of properties */
> - CRTC_PROP_COUNT
> -};
> -
> struct msm_vblank_ctrl {
> struct kthread_work work;
> struct list_head event_list;
> @@ -364,7 +351,6 @@ struct msm_drm_private {
>
> /* Properties */
> struct drm_property *plane_property[PLANE_PROP_COUNT];
> - struct drm_property *crtc_property[CRTC_PROP_COUNT];
>
> /* Color processing properties for the crtc */
> struct drm_property **cp_property;
> diff --git a/drivers/gpu/drm/msm/msm_prop.c b/drivers/gpu/drm/msm/msm_prop.c
> deleted file mode 100644
> index 8f27cde..0000000
> --- a/drivers/gpu/drm/msm/msm_prop.c
> +++ /dev/null
> @@ -1,688 +0,0 @@
> -/* Copyright (c) 2016-2018, The Linux Foundation. All rights reserved.
> - *
> - * This program is free software; you can redistribute it and/or modify
> - * it under the terms of the GNU General Public License version 2 and
> - * only version 2 as published by the Free Software Foundation.
> - *
> - * This program is distributed in the hope that it will be useful,
> - * but WITHOUT ANY WARRANTY; without even the implied warranty of
> - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
> - * GNU General Public License for more details.
> - */
> -
> -#include "msm_prop.h"
> -
> -void msm_property_init(struct msm_property_info *info,
> - struct drm_mode_object *base,
> - struct drm_device *dev,
> - struct drm_property **property_array,
> - struct msm_property_data *property_data,
> - uint32_t property_count,
> - uint32_t blob_count,
> - uint32_t state_size)
> -{
> - /* prevent access if any of these are NULL */
> - if (!base || !dev || !property_array || !property_data) {
> - property_count = 0;
> - blob_count = 0;
> -
> - DRM_ERROR("invalid arguments, forcing zero properties\n");
> - return;
> - }
> -
> - /* can't have more blob properties than total properties */
> - if (blob_count > property_count) {
> - blob_count = property_count;
> -
> - DBG("Capping number of blob properties to %d", blob_count);
> - }
> -
> - if (!info) {
> - DRM_ERROR("info pointer is NULL\n");
> - } else {
> - info->base = base;
> - info->dev = dev;
> - info->property_array = property_array;
> - info->property_data = property_data;
> - info->property_count = property_count;
> - info->blob_count = blob_count;
> - info->install_request = 0;
> - info->install_count = 0;
> - info->recent_idx = 0;
> - info->is_active = false;
> - info->state_size = state_size;
> - info->state_cache_size = 0;
> - mutex_init(&info->property_lock);
> -
> - memset(property_data,
> - 0,
> - sizeof(struct msm_property_data) *
> - property_count);
> - }
> -}
> -
> -void msm_property_destroy(struct msm_property_info *info)
> -{
> - if (!info)
> - return;
> -
> - /* free state cache */
> - while (info->state_cache_size > 0)
> - kfree(info->state_cache[--(info->state_cache_size)]);
> -
> - mutex_destroy(&info->property_lock);
> -}
> -
> -int msm_property_pop_dirty(struct msm_property_info *info,
> - struct msm_property_state *property_state)
> -{
> - struct list_head *item;
> - int rc = 0;
> -
> - if (!info || !property_state || !property_state->values) {
> - DRM_ERROR("invalid argument(s)\n");
> - return -EINVAL;
> - }
> -
> - mutex_lock(&info->property_lock);
> - if (list_empty(&property_state->dirty_list)) {
> - rc = -EAGAIN;
> - } else {
> - item = property_state->dirty_list.next;
> - list_del_init(item);
> - rc = container_of(item, struct msm_property_value, dirty_node)
> - - property_state->values;
> - DRM_DEBUG_KMS("property %d dirty\n", rc);
> - }
> - mutex_unlock(&info->property_lock);
> -
> - return rc;
> -}
> -
> -/**
> - * _msm_property_set_dirty_no_lock - flag given property as being dirty
> - * This function doesn't mutex protect the
> - * dirty linked list.
> - * @info: Pointer to property info container struct
> - * @property_state: Pointer to property state container struct
> - * @property_idx: Property index
> - */
> -static void _msm_property_set_dirty_no_lock(
> - struct msm_property_info *info,
> - struct msm_property_state *property_state,
> - uint32_t property_idx)
> -{
> - if (!info || !property_state || !property_state->values ||
> - property_idx >= info->property_count) {
> - DRM_ERROR("invalid argument(s), idx %u\n", property_idx);
> - return;
> - }
> -
> - /* avoid re-inserting if already dirty */
> - if (!list_empty(&property_state->values[property_idx].dirty_node)) {
> - DRM_DEBUG_KMS("property %u already dirty\n", property_idx);
> - return;
> - }
> -
> - list_add_tail(&property_state->values[property_idx].dirty_node,
> - &property_state->dirty_list);
> -}
> -
> -/**
> - * _msm_property_install_integer - install standard drm range property
> - * @info: Pointer to property info container struct
> - * @name: Property name
> - * @flags: Other property type flags, e.g. DRM_MODE_PROP_IMMUTABLE
> - * @min: Min property value
> - * @max: Max property value
> - * @init: Default Property value
> - * @property_idx: Property index
> - * @force_dirty: Whether or not to filter 'dirty' status on unchanged values
> - */
> -static void _msm_property_install_integer(struct msm_property_info *info,
> - const char *name, int flags, uint64_t min, uint64_t max,
> - uint64_t init, uint32_t property_idx, bool force_dirty)
> -{
> - struct drm_property **prop;
> -
> - if (!info)
> - return;
> -
> - ++info->install_request;
> -
> - if (!name || (property_idx >= info->property_count)) {
> - DRM_ERROR("invalid argument(s), %s\n", name ? name : "null");
> - } else {
> - prop = &info->property_array[property_idx];
> - /*
> - * Properties need to be attached to each drm object that
> - * uses them, but only need to be created once
> - */
> - if (*prop == 0) {
> - *prop = drm_property_create_range(info->dev,
> - flags, name, min, max);
> - if (*prop == 0)
> - DRM_ERROR("create %s property failed\n", name);
> - }
> -
> - /* save init value for later */
> - info->property_data[property_idx].default_value = init;
> - info->property_data[property_idx].force_dirty = force_dirty;
> -
> - /* always attach property, if created */
> - if (*prop) {
> - drm_object_attach_property(info->base, *prop, init);
> - ++info->install_count;
> - }
> - }
> -}
> -
> -void msm_property_install_range(struct msm_property_info *info,
> - const char *name, int flags, uint64_t min, uint64_t max,
> - uint64_t init, uint32_t property_idx)
> -{
> - _msm_property_install_integer(info, name, flags,
> - min, max, init, property_idx, false);
> -}
> -
> -void msm_property_install_volatile_range(struct msm_property_info *info,
> - const char *name, int flags, uint64_t min, uint64_t max,
> - uint64_t init, uint32_t property_idx)
> -{
> - _msm_property_install_integer(info, name, flags,
> - min, max, init, property_idx, true);
> -}
> -
> -void msm_property_install_rotation(struct msm_property_info *info,
> - struct drm_plane *plane, unsigned int rotation,
> - unsigned int supported_rotations, uint32_t property_idx)
> -{
> - if (!info || !plane)
> - return;
> -
> - ++info->install_request;
> -
> - if (property_idx >= info->property_count) {
> - DRM_ERROR("invalid property index %d\n", property_idx);
> - return;
> - }
> -
> - if (drm_plane_create_rotation_property(plane,
> - rotation, supported_rotations)) {
> - DRM_ERROR("create rotation property failed\n");
> - return;
> - }
> -
> - if (plane->rotation_property) {
> - info->property_array[property_idx] = plane->rotation_property;
> -
> - /* save init value for later */
> - info->property_data[property_idx].default_value = rotation;
> - info->property_data[property_idx].force_dirty = false;
> -
> - ++info->install_count;
> - }
> -}
> -
> -void msm_property_install_enum(struct msm_property_info *info,
> - const char *name, int flags, int is_bitmask,
> - const struct drm_prop_enum_list *values, int num_values,
> - uint32_t property_idx)
> -{
> - struct drm_property **prop;
> -
> - if (!info)
> - return;
> -
> - ++info->install_request;
> -
> - if (!name || !values || !num_values ||
> - (property_idx >= info->property_count)) {
> - DRM_ERROR("invalid argument(s), %s\n", name ? name : "null");
> - } else {
> - prop = &info->property_array[property_idx];
> - /*
> - * Properties need to be attached to each drm object that
> - * uses them, but only need to be created once
> - */
> - if (*prop == 0) {
> - /* 'bitmask' is a special type of 'enum' */
> - if (is_bitmask)
> - *prop = drm_property_create_bitmask(info->dev,
> - DRM_MODE_PROP_BITMASK | flags,
> - name, values, num_values, -1);
> - else
> - *prop = drm_property_create_enum(info->dev,
> - DRM_MODE_PROP_ENUM | flags,
> - name, values, num_values);
> - if (*prop == 0)
> - DRM_ERROR("create %s property failed\n", name);
> - }
> -
> - /* save init value for later */
> - info->property_data[property_idx].default_value = 0;
> - info->property_data[property_idx].force_dirty = false;
> -
> - /* select first defined value for enums */
> - if (!is_bitmask)
> - info->property_data[property_idx].default_value =
> - values->type;
> -
> - /* always attach property, if created */
> - if (*prop) {
> - drm_object_attach_property(info->base, *prop,
> - info->property_data
> - [property_idx].default_value);
> - ++info->install_count;
> - }
> - }
> -}
> -
> -void msm_property_install_blob(struct msm_property_info *info,
> - const char *name, int flags, uint32_t property_idx)
> -{
> - struct drm_property **prop;
> -
> - if (!info)
> - return;
> -
> - ++info->install_request;
> -
> - if (!name || (property_idx >= info->blob_count)) {
> - DRM_ERROR("invalid argument(s), %s\n", name ? name : "null");
> - } else {
> - prop = &info->property_array[property_idx];
> - /*
> - * Properties need to be attached to each drm object that
> - * uses them, but only need to be created once
> - */
> - if (*prop == 0) {
> - /* use 'create' for blob property place holder */
> - *prop = drm_property_create(info->dev,
> - DRM_MODE_PROP_BLOB | flags, name, 0);
> - if (*prop == 0)
> - DRM_ERROR("create %s property failed\n", name);
> - }
> -
> - /* save init value for later */
> - info->property_data[property_idx].default_value = 0;
> - info->property_data[property_idx].force_dirty = true;
> -
> - /* always attach property, if created */
> - if (*prop) {
> - drm_object_attach_property(info->base, *prop, -1);
> - ++info->install_count;
> - }
> - }
> -}
> -
> -int msm_property_install_get_status(struct msm_property_info *info)
> -{
> - int rc = -ENOMEM;
> -
> - if (info && (info->install_request == info->install_count))
> - rc = 0;
> -
> - return rc;
> -}
> -
> -int msm_property_index(struct msm_property_info *info,
> - struct drm_property *property)
> -{
> - uint32_t count;
> - int32_t idx;
> - int rc = -EINVAL;
> -
> - if (!info || !property) {
> - DRM_ERROR("invalid argument(s)\n");
> - } else {
> - /*
> - * Linear search, but start from last found index. This will
> - * help if any single property is accessed multiple times in a
> - * row. Ideally, we could keep a list of properties sorted in
> - * the order of most recent access, but that may be overkill
> - * for now.
> - */
> - mutex_lock(&info->property_lock);
> - idx = info->recent_idx;
> - count = info->property_count;
> - while (count) {
> - --count;
> -
> - /* stop searching on match */
> - if (info->property_array[idx] == property) {
> - info->recent_idx = idx;
> - rc = idx;
> - break;
> - }
> -
> - /* move to next valid index */
> - if (--idx < 0)
> - idx = info->property_count - 1;
> - }
> - mutex_unlock(&info->property_lock);
> - }
> -
> - return rc;
> -}
> -
> -int msm_property_set_dirty(struct msm_property_info *info,
> - struct msm_property_state *property_state,
> - int property_idx)
> -{
> - if (!info || !property_state || !property_state->values) {
> - DRM_ERROR("invalid argument(s)\n");
> - return -EINVAL;
> - }
> - mutex_lock(&info->property_lock);
> - _msm_property_set_dirty_no_lock(info, property_state, property_idx);
> - mutex_unlock(&info->property_lock);
> - return 0;
> -}
> -
> -int msm_property_atomic_set(struct msm_property_info *info,
> - struct msm_property_state *property_state,
> - struct drm_property *property, uint64_t val)
> -{
> - struct drm_property_blob *blob;
> - int property_idx, rc = -EINVAL;
> -
> - property_idx = msm_property_index(info, property);
> - if (!info || !property_state ||
> - (property_idx == -EINVAL) || !property_state->values) {
> - DRM_DEBUG("invalid argument(s)\n");
> - } else {
> - /* extra handling for incoming properties */
> - mutex_lock(&info->property_lock);
> - if ((property->flags & DRM_MODE_PROP_BLOB) &&
> - (property_idx < info->blob_count)) {
> - /* DRM lookup also takes a reference */
> - blob = drm_property_lookup_blob(info->dev,
> - (uint32_t)val);
> - if (!blob) {
> - DRM_ERROR("blob not found\n");
> - val = 0;
> - } else {
> - DBG("Blob %u saved", blob->base.id);
> - val = blob->base.id;
> -
> - /* save blob - need to clear previous ref */
> - if (property_state->values[property_idx].blob)
> - drm_property_blob_put(
> - property_state->values[
> - property_idx].blob);
> - property_state->values[property_idx].blob =
> - blob;
> - }
> - }
> -
> - /* update value and flag as dirty */
> - if (property_state->values[property_idx].value != val ||
> - info->property_data[property_idx].force_dirty) {
> - property_state->values[property_idx].value = val;
> - _msm_property_set_dirty_no_lock(info, property_state,
> - property_idx);
> -
> - DBG("%s - %lld", property->name, val);
> - }
> - mutex_unlock(&info->property_lock);
> - rc = 0;
> - }
> -
> - return rc;
> -}
> -
> -int msm_property_atomic_get(struct msm_property_info *info,
> - struct msm_property_state *property_state,
> - struct drm_property *property, uint64_t *val)
> -{
> - int property_idx, rc = -EINVAL;
> -
> - property_idx = msm_property_index(info, property);
> - if (!info || (property_idx == -EINVAL) ||
> - !property_state->values || !val) {
> - DRM_DEBUG("Invalid argument(s)\n");
> - } else {
> - mutex_lock(&info->property_lock);
> - *val = property_state->values[property_idx].value;
> - mutex_unlock(&info->property_lock);
> - rc = 0;
> - }
> -
> - return rc;
> -}
> -
> -void *msm_property_alloc_state(struct msm_property_info *info)
> -{
> - void *state = NULL;
> -
> - if (!info) {
> - DRM_ERROR("invalid property info\n");
> - return NULL;
> - }
> -
> - mutex_lock(&info->property_lock);
> - if (info->state_cache_size)
> - state = info->state_cache[--(info->state_cache_size)];
> - mutex_unlock(&info->property_lock);
> -
> - if (!state && info->state_size)
> - state = kmalloc(info->state_size, GFP_KERNEL);
> -
> - if (!state)
> - DRM_ERROR("failed to allocate state\n");
> -
> - return state;
> -}
> -
> -/**
> - * _msm_property_free_state - helper function for freeing local state objects
> - * @info: Pointer to property info container struct
> - * @st: Pointer to state object
> - */
> -static void _msm_property_free_state(struct msm_property_info *info, void *st)
> -{
> - if (!info || !st)
> - return;
> -
> - mutex_lock(&info->property_lock);
> - if (info->state_cache_size < MSM_PROP_STATE_CACHE_SIZE)
> - info->state_cache[(info->state_cache_size)++] = st;
> - else
> - kfree(st);
> - mutex_unlock(&info->property_lock);
> -}
> -
> -void msm_property_reset_state(struct msm_property_info *info, void *state,
> - struct msm_property_state *property_state,
> - struct msm_property_value *property_values)
> -{
> - uint32_t i;
> -
> - if (!info) {
> - DRM_ERROR("invalid property info\n");
> - return;
> - }
> -
> - if (state)
> - memset(state, 0, info->state_size);
> -
> - if (property_state) {
> - property_state->property_count = info->property_count;
> - property_state->values = property_values;
> - INIT_LIST_HEAD(&property_state->dirty_list);
> - }
> -
> - /*
> - * Assign default property values. This helper is mostly used
> - * to initialize newly created state objects.
> - */
> - if (property_values)
> - for (i = 0; i < info->property_count; ++i) {
> - property_values[i].value =
> - info->property_data[i].default_value;
> - property_values[i].blob = NULL;
> - INIT_LIST_HEAD(&property_values[i].dirty_node);
> - }
> -}
> -
> -void msm_property_duplicate_state(struct msm_property_info *info,
> - void *old_state, void *state,
> - struct msm_property_state *property_state,
> - struct msm_property_value *property_values)
> -{
> - uint32_t i;
> -
> - if (!info || !old_state || !state) {
> - DRM_ERROR("invalid argument(s)\n");
> - return;
> - }
> -
> - memcpy(state, old_state, info->state_size);
> -
> - if (!property_state)
> - return;
> -
> - INIT_LIST_HEAD(&property_state->dirty_list);
> - property_state->values = property_values;
> -
> - if (property_state->values)
> - /* add ref count for blobs and initialize dirty nodes */
> - for (i = 0; i < info->property_count; ++i) {
> - if (property_state->values[i].blob)
> - drm_property_blob_get(
> - property_state->values[i].blob);
> - INIT_LIST_HEAD(&property_state->values[i].dirty_node);
> - }
> -}
> -
> -void msm_property_destroy_state(struct msm_property_info *info, void *state,
> - struct msm_property_state *property_state)
> -{
> - uint32_t i;
> -
> - if (!info || !state) {
> - DRM_ERROR("invalid argument(s)\n");
> - return;
> - }
> - if (property_state && property_state->values) {
> - /* remove ref count for blobs */
> - for (i = 0; i < info->property_count; ++i)
> - if (property_state->values[i].blob) {
> - drm_property_blob_put(
> - property_state->values[i].blob);
> - property_state->values[i].blob = NULL;
> - }
> - }
> -
> - _msm_property_free_state(info, state);
> -}
> -
> -void *msm_property_get_blob(struct msm_property_info *info,
> - struct msm_property_state *property_state,
> - size_t *byte_len,
> - uint32_t property_idx)
> -{
> - struct drm_property_blob *blob;
> - size_t len = 0;
> - void *rc = 0;
> -
> - if (!info || !property_state || !property_state->values ||
> - (property_idx >= info->blob_count)) {
> - DRM_ERROR("invalid argument(s)\n");
> - } else {
> - blob = property_state->values[property_idx].blob;
> - if (blob) {
> - len = blob->length;
> - rc = &blob->data;
> - }
> - }
> -
> - if (byte_len)
> - *byte_len = len;
> -
> - return rc;
> -}
> -
> -int msm_property_set_blob(struct msm_property_info *info,
> - struct drm_property_blob **blob_reference,
> - void *blob_data,
> - size_t byte_len,
> - uint32_t property_idx)
> -{
> - struct drm_property_blob *blob = NULL;
> - int rc = -EINVAL;
> -
> - if (!info || !blob_reference || (property_idx >= info->blob_count)) {
> - DRM_ERROR("invalid argument(s)\n");
> - } else {
> - /* create blob */
> - if (blob_data && byte_len) {
> - blob = drm_property_create_blob(info->dev,
> - byte_len,
> - blob_data);
> - if (IS_ERR_OR_NULL(blob)) {
> - rc = PTR_ERR(blob);
> - DRM_ERROR("failed to create blob, %d\n", rc);
> - goto exit;
> - }
> - }
> -
> - /* update drm object */
> - rc = drm_object_property_set_value(info->base,
> - info->property_array[property_idx],
> - blob ? blob->base.id : 0);
> - if (rc) {
> - DRM_ERROR("failed to set blob to property\n");
> - if (blob)
> - drm_property_blob_put(blob);
> - goto exit;
> - }
> -
> - /* update local reference */
> - if (*blob_reference)
> - drm_property_blob_put(*blob_reference);
> - *blob_reference = blob;
> - }
> -
> -exit:
> - return rc;
> -}
> -
> -int msm_property_set_property(struct msm_property_info *info,
> - struct msm_property_state *property_state,
> - uint32_t property_idx,
> - uint64_t val)
> -{
> - int rc = -EINVAL;
> -
> - if (!info || (property_idx >= info->property_count) ||
> - property_idx < info->blob_count ||
> - !property_state || !property_state->values) {
> - DRM_ERROR("invalid argument(s)\n");
> - } else {
> - struct drm_property *drm_prop;
> -
> - mutex_lock(&info->property_lock);
> -
> - /* update cached value */
> - property_state->values[property_idx].value = val;
> -
> - /* update the new default value for immutables */
> - drm_prop = info->property_array[property_idx];
> - if (drm_prop->flags & DRM_MODE_PROP_IMMUTABLE)
> - info->property_data[property_idx].default_value = val;
> -
> - mutex_unlock(&info->property_lock);
> -
> - /* update drm object */
> - rc = drm_object_property_set_value(info->base, drm_prop, val);
> - if (rc)
> - DRM_ERROR("failed set property value, idx %d rc %d\n",
> - property_idx, rc);
> -
> - }
> -
> - return rc;
> -}
> -
> diff --git a/drivers/gpu/drm/msm/msm_prop.h b/drivers/gpu/drm/msm/msm_prop.h
> deleted file mode 100644
> index 6785955..0000000
> --- a/drivers/gpu/drm/msm/msm_prop.h
> +++ /dev/null
> @@ -1,438 +0,0 @@
> -/* Copyright (c) 2016-2018, The Linux Foundation. All rights reserved.
> - *
> - * This program is free software; you can redistribute it and/or modify
> - * it under the terms of the GNU General Public License version 2 and
> - * only version 2 as published by the Free Software Foundation.
> - *
> - * This program is distributed in the hope that it will be useful,
> - * but WITHOUT ANY WARRANTY; without even the implied warranty of
> - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
> - * GNU General Public License for more details.
> - */
> -
> -#ifndef _MSM_PROP_H_
> -#define _MSM_PROP_H_
> -
> -#include <linux/list.h>
> -#include "msm_drv.h"
> -
> -#define MSM_PROP_STATE_CACHE_SIZE 2
> -
> -/**
> - * struct msm_property_data - opaque structure for tracking per
> - * drm-object per property stuff
> - * @default_value: Default property value for this drm object
> - * @force_dirty: Always dirty property on incoming sets, rather than checking
> - * for modified values
> - */
> -struct msm_property_data {
> - uint64_t default_value;
> - bool force_dirty;
> -};
> -
> -/**
> - * struct msm_property_value - opaque structure for tracking per
> - * drm-object per property stuff
> - * @value: Current property value for this drm object
> - * @blob: Pointer to associated blob data, if available
> - * @dirty_node: Linked list node to track if property is dirty or not
> - */
> -struct msm_property_value {
> - uint64_t value;
> - struct drm_property_blob *blob;
> - struct list_head dirty_node;
> -};
> -
> -/**
> - * struct msm_property_info: Structure for property/state helper functions
> - * @base: Pointer to base drm object (plane/crtc/etc.)
> - * @dev: Pointer to drm device object
> - * @property_array: Pointer to array for storing created property objects
> - * @property_data: Pointer to array for storing private property data
> - * @property_count: Total number of properties
> - * @blob_count: Total number of blob properties, should be <= count
> - * @install_request: Total number of property 'install' requests
> - * @install_count: Total number of successful 'install' requests
> - * @recent_idx: Index of property most recently accessed by set/get
> - * @is_active: Whether or not drm component properties are 'active'
> - * @state_cache: Cache of local states, to prevent alloc/free thrashing
> - * @state_size: Size of local state structures
> - * @state_cache_size: Number of state structures currently stored in state_cache
> - * @property_lock: Mutex to protect local variables
> - */
> -struct msm_property_info {
> - struct drm_mode_object *base;
> - struct drm_device *dev;
> -
> - struct drm_property **property_array;
> - struct msm_property_data *property_data;
> - uint32_t property_count;
> - uint32_t blob_count;
> - uint32_t install_request;
> - uint32_t install_count;
> -
> - int32_t recent_idx;
> -
> - bool is_active;
> -
> - void *state_cache[MSM_PROP_STATE_CACHE_SIZE];
> - uint32_t state_size;
> - int32_t state_cache_size;
> - struct mutex property_lock;
> -};
> -
> -/**
> - * struct msm_property_state - Structure for local property state information
> - * @property_count: Total number of properties
> - * @values: Pointer to array of msm_property_value objects
> - * @dirty_list: List of all properties that have been 'atomic_set' but not
> - * yet cleared with 'msm_property_pop_dirty'
> - */
> -struct msm_property_state {
> - uint32_t property_count;
> - struct msm_property_value *values;
> - struct list_head dirty_list;
> -};
> -
> -/**
> - * msm_property_index_to_drm_property - get drm property struct from prop index
> - * @info: Pointer to property info container struct
> - * @property_idx: Property index
> - * Returns: drm_property pointer associated with property index
> - */
> -static inline
> -struct drm_property *msm_property_index_to_drm_property(
> - struct msm_property_info *info, uint32_t property_idx)
> -{
> - if (!info || property_idx >= info->property_count)
> - return NULL;
> -
> - return info->property_array[property_idx];
> -}
> -
> -/**
> - * msm_property_get_default - query default value of a property
> - * @info: Pointer to property info container struct
> - * @property_idx: Property index
> - * Returns: Default value for specified property
> - */
> -static inline
> -uint64_t msm_property_get_default(struct msm_property_info *info,
> - uint32_t property_idx)
> -{
> - uint64_t rc = 0;
> -
> - if (!info)
> - return 0;
> -
> - mutex_lock(&info->property_lock);
> - if (property_idx < info->property_count)
> - rc = info->property_data[property_idx].default_value;
> - mutex_unlock(&info->property_lock);
> -
> - return rc;
> -}
> -
> -/**
> - * msm_property_set_is_active - set overall 'active' status for all properties
> - * @info: Pointer to property info container struct
> - * @is_active: New 'is active' status
> - */
> -static inline
> -void msm_property_set_is_active(struct msm_property_info *info, bool is_active)
> -{
> - if (info) {
> - mutex_lock(&info->property_lock);
> - info->is_active = is_active;
> - mutex_unlock(&info->property_lock);
> - }
> -}
> -
> -/**
> - * msm_property_get_is_active - query property 'is active' status
> - * @info: Pointer to property info container struct
> - * Returns: Current 'is active's status
> - */
> -static inline
> -bool msm_property_get_is_active(struct msm_property_info *info)
> -{
> - bool rc = false;
> -
> - if (info) {
> - mutex_lock(&info->property_lock);
> - rc = info->is_active;
> - mutex_unlock(&info->property_lock);
> - }
> -
> - return rc;
> -}
> -
> -/**
> - * msm_property_pop_dirty - determine next dirty property and clear
> - * its dirty flag
> - * @info: Pointer to property info container struct
> - * @property_state: Pointer to property state container struct
> - * Returns: Valid msm property index on success,
> - * -EAGAIN if no dirty properties are available
> - * Property indicies returned from this function are similar
> - * to those returned by the msm_property_index function.
> - */
> -int msm_property_pop_dirty(struct msm_property_info *info,
> - struct msm_property_state *property_state);
> -
> -/**
> - * msm_property_init - initialize property info structure
> - * @info: Pointer to property info container struct
> - * @base: Pointer to base drm object (plane/crtc/etc.)
> - * @dev: Pointer to drm device object
> - * @property_array: Pointer to array for storing created property objects
> - * @property_data: Pointer to array for storing private property data
> - * @property_count: Total number of properties
> - * @blob_count: Total number of blob properties, should be <= count
> - * @state_size: Size of local state object
> - */
> -void msm_property_init(struct msm_property_info *info,
> - struct drm_mode_object *base,
> - struct drm_device *dev,
> - struct drm_property **property_array,
> - struct msm_property_data *property_data,
> - uint32_t property_count,
> - uint32_t blob_count,
> - uint32_t state_size);
> -
> -/**
> - * msm_property_destroy - destroy helper info structure
> - *
> - * @info: Pointer to property info container struct
> - */
> -void msm_property_destroy(struct msm_property_info *info);
> -
> -/**
> - * msm_property_install_range - install standard drm range property
> - * @info: Pointer to property info container struct
> - * @name: Property name
> - * @flags: Other property type flags, e.g. DRM_MODE_PROP_IMMUTABLE
> - * @min: Min property value
> - * @max: Max property value
> - * @init: Default Property value
> - * @property_idx: Property index
> - */
> -void msm_property_install_range(struct msm_property_info *info,
> - const char *name,
> - int flags,
> - uint64_t min,
> - uint64_t max,
> - uint64_t init,
> - uint32_t property_idx);
> -
> -/**
> - * msm_property_install_volatile_range - install drm range property
> - * This function is similar to msm_property_install_range, but assumes
> - * that the property is meant for holding user pointers or descriptors
> - * that may reference volatile data without having an updated value.
> - * @info: Pointer to property info container struct
> - * @name: Property name
> - * @flags: Other property type flags, e.g. DRM_MODE_PROP_IMMUTABLE
> - * @min: Min property value
> - * @max: Max property value
> - * @init: Default Property value
> - * @property_idx: Property index
> - */
> -void msm_property_install_volatile_range(struct msm_property_info *info,
> - const char *name,
> - int flags,
> - uint64_t min,
> - uint64_t max,
> - uint64_t init,
> - uint32_t property_idx);
> -
> -/**
> - * msm_property_install_rotation - install standard drm rotation property
> - * @info: Pointer to property info container struct
> - * @plane: Pointer to drm_plane which this property is installed on
> - * @rotation: The default value for this new property
> - * @supported_rotations: Bitmask of supported rotation values (see
> - * drm_plane_create_rotation_property for more details)
> - * @property_idx: Property index
> - */
> -void msm_property_install_rotation(struct msm_property_info *info,
> - struct drm_plane *plane,
> - unsigned int rotation,
> - unsigned int supported_rotations,
> - uint32_t property_idx);
> -
> -/**
> - * msm_property_install_enum - install standard drm enum/bitmask property
> - * @info: Pointer to property info container struct
> - * @name: Property name
> - * @flags: Other property type flags, e.g. DRM_MODE_PROP_IMMUTABLE
> - * @is_bitmask: Set to non-zero to create a bitmask property, rather than an
> - * enumeration one
> - * @values: Array of allowable enumeration/bitmask values
> - * @num_values: Size of values array
> - * @property_idx: Property index
> - */
> -void msm_property_install_enum(struct msm_property_info *info,
> - const char *name,
> - int flags,
> - int is_bitmask,
> - const struct drm_prop_enum_list *values,
> - int num_values,
> - uint32_t property_idx);
> -
> -/**
> - * msm_property_install_blob - install standard drm blob property
> - * @info: Pointer to property info container struct
> - * @name: Property name
> - * @flags: Extra flags for property creation
> - * @property_idx: Property index
> - */
> -void msm_property_install_blob(struct msm_property_info *info,
> - const char *name,
> - int flags,
> - uint32_t property_idx);
> -
> -/**
> - * msm_property_install_get_status - query overal status of property additions
> - * @info: Pointer to property info container struct
> - * Returns: Zero if previous property install calls were all successful
> - */
> -int msm_property_install_get_status(struct msm_property_info *info);
> -
> -/**
> - * msm_property_index - determine property index from drm_property ptr
> - * @info: Pointer to property info container struct
> - * @property: Incoming property pointer
> - * Returns: Valid property index, or -EINVAL on error
> - */
> -int msm_property_index(struct msm_property_info *info,
> - struct drm_property *property);
> -
> -/**
> - * msm_property_set_dirty - forcibly flag a property as dirty
> - * @info: Pointer to property info container struct
> - * @property_state: Pointer to property state container struct
> - * @property_idx: Property index
> - * Returns: Zero on success
> - */
> -int msm_property_set_dirty(struct msm_property_info *info,
> - struct msm_property_state *property_state,
> - int property_idx);
> -
> -/**
> - * msm_property_atomic_set - helper function for atomic property set callback
> - * @info: Pointer to property info container struct
> - * @property_state: Pointer to local state structure
> - * @property: Incoming property pointer
> - * @val: Incoming property value
> - * Returns: Zero on success
> - */
> -int msm_property_atomic_set(struct msm_property_info *info,
> - struct msm_property_state *property_state,
> - struct drm_property *property,
> - uint64_t val);
> -
> -/**
> - * msm_property_atomic_get - helper function for atomic property get callback
> - * @info: Pointer to property info container struct
> - * @property_state: Pointer to local state structure
> - * @property: Incoming property pointer
> - * @val: Pointer to variable for receiving property value
> - * Returns: Zero on success
> - */
> -int msm_property_atomic_get(struct msm_property_info *info,
> - struct msm_property_state *property_state,
> - struct drm_property *property,
> - uint64_t *val);
> -
> -/**
> - * msm_property_alloc_state - helper function for allocating local state objects
> - * @info: Pointer to property info container struct
> - */
> -void *msm_property_alloc_state(struct msm_property_info *info);
> -
> -/**
> - * msm_property_reset_state - helper function for state reset callback
> - * @info: Pointer to property info container struct
> - * @state: Pointer to local state structure
> - * @property_state: Pointer to property state container struct
> - * @property_values: Pointer to property values cache array
> - */
> -void msm_property_reset_state(struct msm_property_info *info, void *state,
> - struct msm_property_state *property_state,
> - struct msm_property_value *property_values);
> -
> -/**
> - * msm_property_duplicate_state - helper function for duplicate state cb
> - * @info: Pointer to property info container struct
> - * @old_state: Pointer to original state structure
> - * @state: Pointer to newly created state structure
> - * @property_state: Pointer to destination property state container struct
> - * @property_values: Pointer to property values cache array
> - */
> -void msm_property_duplicate_state(struct msm_property_info *info,
> - void *old_state,
> - void *state,
> - struct msm_property_state *property_state,
> - struct msm_property_value *property_values);
> -
> -/**
> - * msm_property_destroy_state - helper function for destroy state cb
> - * @info: Pointer to property info container struct
> - * @state: Pointer to local state structure
> - * @property_state: Pointer to property state container struct
> - */
> -void msm_property_destroy_state(struct msm_property_info *info,
> - void *state,
> - struct msm_property_state *property_state);
> -
> -/**
> - * msm_property_get_blob - obtain cached data pointer for drm blob property
> - * @info: Pointer to property info container struct
> - * @property_state: Pointer to property state container struct
> - * @byte_len: Optional pointer to variable for accepting blob size
> - * @property_idx: Property index
> - * Returns: Pointer to blob data
> - */
> -void *msm_property_get_blob(struct msm_property_info *info,
> - struct msm_property_state *property_state,
> - size_t *byte_len,
> - uint32_t property_idx);
> -
> -/**
> - * msm_property_set_blob - update blob property on a drm object
> - * This function updates the blob property value of the given drm object. Its
> - * intended use is to update blob properties that have been created with the
> - * DRM_MODE_PROP_IMMUTABLE flag set.
> - * @info: Pointer to property info container struct
> - * @blob_reference: Reference to a pointer that holds the created data blob
> - * @blob_data: Pointer to blob data
> - * @byte_len: Length of blob data, in bytes
> - * @property_idx: Property index
> - * Returns: Zero on success
> - */
> -int msm_property_set_blob(struct msm_property_info *info,
> - struct drm_property_blob **blob_reference,
> - void *blob_data,
> - size_t byte_len,
> - uint32_t property_idx);
> -
> -/**
> - * msm_property_set_property - update property on a drm object
> - * This function updates the property value of the given drm object. Its
> - * intended use is to update properties that have been created with the
> - * DRM_MODE_PROP_IMMUTABLE flag set.
> - * Note: This function cannot be called on a blob.
> - * @info: Pointer to property info container struct
> - * @property_state: Pointer to property state container struct
> - * @property_idx: Property index
> - * @val: value of the property to set
> - * Returns: Zero on success
> - */
> -int msm_property_set_property(struct msm_property_info *info,
> - struct msm_property_state *property_state,
> - uint32_t property_idx,
> - uint64_t val);
> -
> -#endif /* _MSM_PROP_H_ */
> -
> --
> The Qualcomm Innovation Center, Inc. is a member of the Code Aurora Forum,
> a Linux Foundation Collaborative Project
>
--
Sean Paul, Software Engineer, Google / Chromium OS
_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel
^ permalink raw reply [flat|nested] 18+ messages in thread
* Re: [Freedreno] [DPU PATCH 7/7] drm/msm: remove dpu specific uapi header
2018-05-23 19:31 ` [DPU PATCH 7/7] drm/msm: remove dpu specific uapi header Jeykumar Sankaran
@ 2018-06-04 19:59 ` Sean Paul
0 siblings, 0 replies; 18+ messages in thread
From: Sean Paul @ 2018-06-04 19:59 UTC (permalink / raw)
To: Jeykumar Sankaran; +Cc: linux-arm-msm, dri-devel, hoegsberg, freedreno
On Wed, May 23, 2018 at 12:31:02PM -0700, Jeykumar Sankaran wrote:
> remove unwanted dpu uapi headers exposing custom
> payload layouts for custom properties
>
> Signed-off-by: Jeykumar Sankaran <jsanka@codeaurora.org>
Reviewed-by: Sean Paul <seanpaul@chromium.org>
> ---
> include/uapi/drm/dpu_drm.h | 220 ---------------------------
> include/uapi/drm/msm_drm_pp.h | 345 ------------------------------------------
> 2 files changed, 565 deletions(-)
> delete mode 100644 include/uapi/drm/dpu_drm.h
> delete mode 100644 include/uapi/drm/msm_drm_pp.h
>
> diff --git a/include/uapi/drm/dpu_drm.h b/include/uapi/drm/dpu_drm.h
> deleted file mode 100644
> index 93af1fb..0000000
> --- a/include/uapi/drm/dpu_drm.h
> +++ /dev/null
> @@ -1,220 +0,0 @@
> -#ifndef _DPU_DRM_H_
> -#define _DPU_DRM_H_
> -
> -#include "drm.h"
> -
> -/* Total number of supported color planes */
> -#define DPU_MAX_PLANES 4
> -
> -/* Total number of parameterized detail enhancer mapping curves */
> -#define DPU_MAX_DE_CURVES 3
> -
> - /* Y/RGB and UV filter configuration */
> -#define FILTER_EDGE_DIRECTED_2D 0x0
> -#define FILTER_CIRCULAR_2D 0x1
> -#define FILTER_SEPARABLE_1D 0x2
> -#define FILTER_BILINEAR 0x3
> -
> -/* Alpha filters */
> -#define FILTER_ALPHA_DROP_REPEAT 0x0
> -#define FILTER_ALPHA_BILINEAR 0x1
> -#define FILTER_ALPHA_2D 0x3
> -
> -/* Blend filters */
> -#define FILTER_BLEND_CIRCULAR_2D 0x0
> -#define FILTER_BLEND_SEPARABLE_1D 0x1
> -
> -/* LUT configuration flags */
> -#define SCALER_LUT_SWAP 0x1
> -#define SCALER_LUT_DIR_WR 0x2
> -#define SCALER_LUT_Y_CIR_WR 0x4
> -#define SCALER_LUT_UV_CIR_WR 0x8
> -#define SCALER_LUT_Y_SEP_WR 0x10
> -#define SCALER_LUT_UV_SEP_WR 0x20
> -
> -/**
> - * Blend operations for "blend_op" property
> - *
> - * @DPU_DRM_BLEND_OP_NOT_DEFINED: No blend operation defined for the layer.
> - * @DPU_DRM_BLEND_OP_OPAQUE: Apply a constant blend operation. The layer
> - * would appear opaque in case fg plane alpha
> - * is 0xff.
> - * @DPU_DRM_BLEND_OP_PREMULTIPLIED: Apply source over blend rule. Layer already
> - * has alpha pre-multiplication done. If the fg
> - * plane alpha is less than 0xff, apply
> - * modulation as well. This operation is
> - * intended on layers having alpha channel.
> - * @DPU_DRM_BLEND_OP_COVERAGE: Apply source over blend rule. Layer is not
> - * alpha pre-multiplied. Apply
> - * pre-multiplication. If fg plane alpha is
> - * less than 0xff, apply modulation as well.
> - * @DPU_DRM_BLEND_OP_MAX: Used to track maximum blend operation
> - * possible by mdp.
> - */
> -#define DPU_DRM_BLEND_OP_NOT_DEFINED 0
> -#define DPU_DRM_BLEND_OP_OPAQUE 1
> -#define DPU_DRM_BLEND_OP_PREMULTIPLIED 2
> -#define DPU_DRM_BLEND_OP_COVERAGE 3
> -#define DPU_DRM_BLEND_OP_MAX 4
> -
> -/**
> - * Bit masks for "src_config" property
> - * construct bitmask via (1UL << DPU_DRM_<flag>)
> - */
> -#define DPU_DRM_DEINTERLACE 0 /* Specifies interlaced input */
> -
> -/* DRM bitmasks are restricted to 0..63 */
> -#define DPU_DRM_BITMASK_COUNT 64
> -
> -/* Number of dest scalers supported */
> -#define DPU_MAX_DS_COUNT 2
> -
> -/*
> - * Destination scaler flag config
> - */
> -#define DPU_DRM_DESTSCALER_ENABLE 0x1
> -#define DPU_DRM_DESTSCALER_SCALE_UPDATE 0x2
> -#define DPU_DRM_DESTSCALER_ENHANCER_UPDATE 0x4
> -#define DPU_DRM_DESTSCALER_PU_ENABLE 0x8
> -
> -/**
> - * struct dpu_drm_dest_scaler_cfg - destination scaler config structure
> - * @flags: Flag to switch between mode for destination scaler
> - * refer to destination scaler flag config
> - * @index: Destination scaler selection index
> - * @lm_width: Layer mixer width configuration
> - * @lm_height: Layer mixer height configuration
> - * @scaler_cfg: The scaling parameters for all the mode except disable
> - * Userspace pointer to struct dpu_drm_scaler_v2
> - */
> -struct dpu_drm_dest_scaler_cfg {
> - uint32_t flags;
> - uint32_t index;
> - uint32_t lm_width;
> - uint32_t lm_height;
> - uint64_t scaler_cfg;
> -};
> -
> -/**
> - * struct dpu_drm_dest_scaler_data - destination scaler data struct
> - * @num_dest_scaler: Number of dest scalers to be configured
> - * @ds_cfg: Destination scaler block configuration
> - */
> -struct dpu_drm_dest_scaler_data {
> - uint32_t num_dest_scaler;
> - struct dpu_drm_dest_scaler_cfg ds_cfg[DPU_MAX_DS_COUNT];
> -};
> -
> -/*
> - * Define constants for struct dpu_drm_csc
> - */
> -#define DPU_CSC_MATRIX_COEFF_SIZE 9
> -#define DPU_CSC_CLAMP_SIZE 6
> -#define DPU_CSC_BIAS_SIZE 3
> -
> -/**
> - * struct dpu_drm_csc_v1 - version 1 of struct dpu_drm_csc
> - * @ctm_coeff: Matrix coefficients, in S31.32 format
> - * @pre_bias: Pre-bias array values
> - * @post_bias: Post-bias array values
> - * @pre_clamp: Pre-clamp array values
> - * @post_clamp: Post-clamp array values
> - */
> -struct dpu_drm_csc_v1 {
> - int64_t ctm_coeff[DPU_CSC_MATRIX_COEFF_SIZE];
> - uint32_t pre_bias[DPU_CSC_BIAS_SIZE];
> - uint32_t post_bias[DPU_CSC_BIAS_SIZE];
> - uint32_t pre_clamp[DPU_CSC_CLAMP_SIZE];
> - uint32_t post_clamp[DPU_CSC_CLAMP_SIZE];
> -};
> -
> -/**
> - * struct dpu_drm_color - struct to store the color and alpha values
> - * @color_0: Color 0 value
> - * @color_1: Color 1 value
> - * @color_2: Color 2 value
> - * @color_3: Color 3 value
> - */
> -struct dpu_drm_color {
> - uint32_t color_0;
> - uint32_t color_1;
> - uint32_t color_2;
> - uint32_t color_3;
> -};
> -
> -/* Total number of supported dim layers */
> -#define DPU_MAX_DIM_LAYERS 7
> -
> -/* DPU_DRM_DIM_LAYER_CONFIG_FLAG - flags for Dim Layer */
> -/* Color fill inside of the rect, including border */
> -#define DPU_DRM_DIM_LAYER_INCLUSIVE 0x1
> -/* Color fill outside of the rect, excluding border */
> -#define DPU_DRM_DIM_LAYER_EXCLUSIVE 0x2
> -
> -/**
> - * struct dpu_drm_dim_layer - dim layer cfg struct
> - * @flags: Refer DPU_DRM_DIM_LAYER_CONFIG_FLAG for possible values
> - * @stage: Blending stage of the dim layer
> - * @color_fill: Color fill for dim layer
> - * @rect: Dim layer coordinates
> - */
> -struct dpu_drm_dim_layer_cfg {
> - uint32_t flags;
> - uint32_t stage;
> - struct dpu_drm_color color_fill;
> - struct drm_clip_rect rect;
> -};
> -
> -/**
> - * struct dpu_drm_dim_layer_v1 - version 1 of dim layer struct
> - * @num_layers: Numer of Dim Layers
> - * @layer: Dim layer user cfgs ptr for the num_layers
> - */
> -struct dpu_drm_dim_layer_v1 {
> - uint32_t num_layers;
> - struct dpu_drm_dim_layer_cfg layer_cfg[DPU_MAX_DIM_LAYERS];
> -};
> -
> -/* Writeback Config version definition */
> -#define DPU_DRM_WB_CFG 0x1
> -
> -/* DPU_DRM_WB_CONFIG_FLAGS - Writeback configuration flags */
> -#define DPU_DRM_WB_CFG_FLAGS_CONNECTED (1<<0)
> -
> -/**
> - * struct dpu_drm_wb_cfg - Writeback configuration structure
> - * @flags: see DRM_MSM_WB_CONFIG_FLAGS
> - * @connector_id: writeback connector identifier
> - * @count_modes: Count of modes in modes_ptr
> - * @modes: Pointer to struct drm_mode_modeinfo
> - */
> -struct dpu_drm_wb_cfg {
> - uint32_t flags;
> - uint32_t connector_id;
> - uint32_t count_modes;
> - uint64_t modes;
> -};
> -
> -#define DPU_MAX_ROI_V1 4
> -
> -/**
> - * struct dpu_drm_roi_v1 - list of regions of interest for a drm object
> - * @num_rects: number of valid rectangles in the roi array
> - * @roi: list of roi rectangles
> - */
> -struct dpu_drm_roi_v1 {
> - uint32_t num_rects;
> - struct drm_clip_rect roi[DPU_MAX_ROI_V1];
> -};
> -
> -/**
> - * Define extended power modes supported by the DPU connectors.
> - */
> -#define DPU_MODE_DPMS_ON 0
> -#define DPU_MODE_DPMS_LP1 1
> -#define DPU_MODE_DPMS_LP2 2
> -#define DPU_MODE_DPMS_STANDBY 3
> -#define DPU_MODE_DPMS_SUSPEND 4
> -#define DPU_MODE_DPMS_OFF 5
> -
> -#endif /* _DPU_DRM_H_ */
> diff --git a/include/uapi/drm/msm_drm_pp.h b/include/uapi/drm/msm_drm_pp.h
> deleted file mode 100644
> index a3b5794..0000000
> --- a/include/uapi/drm/msm_drm_pp.h
> +++ /dev/null
> @@ -1,345 +0,0 @@
> -#ifndef _MSM_DRM_PP_H_
> -#define _MSM_DRM_PP_H_
> -
> -#include <linux/types.h>
> -/**
> - * struct drm_msm_pcc_coeff - PCC coefficient structure for each color
> - * component.
> - * @c: constant coefficient.
> - * @r: red coefficient.
> - * @g: green coefficient.
> - * @b: blue coefficient.
> - * @rg: red green coefficient.
> - * @gb: green blue coefficient.
> - * @rb: red blue coefficient.
> - * @rgb: red blue green coefficient.
> - */
> -
> -struct drm_msm_pcc_coeff {
> - __u32 c;
> - __u32 r;
> - __u32 g;
> - __u32 b;
> - __u32 rg;
> - __u32 gb;
> - __u32 rb;
> - __u32 rgb;
> -};
> -
> -/**
> - * struct drm_msm_pcc - pcc feature structure
> - * @flags: for customizing operations
> - * @r: red coefficients.
> - * @g: green coefficients.
> - * @b: blue coefficients.
> - * @r_rr: second order coefficients
> - * @r_gg: second order coefficients
> - * @r_bb: second order coefficients
> - * @g_rr: second order coefficients
> - * @g_gg: second order coefficients
> - * @g_bb: second order coefficients
> - * @b_rr: second order coefficients
> - * @b_gg: second order coefficients
> - * @b_bb: second order coefficients
> - */
> -#define DRM_MSM_PCC3
> -struct drm_msm_pcc {
> - __u64 flags;
> - struct drm_msm_pcc_coeff r;
> - struct drm_msm_pcc_coeff g;
> - struct drm_msm_pcc_coeff b;
> - __u32 r_rr;
> - __u32 r_gg;
> - __u32 r_bb;
> - __u32 g_rr;
> - __u32 g_gg;
> - __u32 g_bb;
> - __u32 b_rr;
> - __u32 b_gg;
> - __u32 b_bb;
> -};
> -
> -/* struct drm_msm_pa_vlut - picture adjustment vLUT structure
> - * flags: for customizing vlut operation
> - * val: vLUT values
> - */
> -#define PA_VLUT_SIZE 256
> -struct drm_msm_pa_vlut {
> - __u64 flags;
> - __u32 val[PA_VLUT_SIZE];
> -};
> -
> -/* struct drm_msm_memcol - Memory color feature structure.
> - * Skin, sky, foliage features are supported.
> - * @prot_flags: Bit mask for enabling protection feature.
> - * @color_adjust_p0: Adjustment curve.
> - * @color_adjust_p1: Adjustment curve.
> - * @color_adjust_p2: Adjustment curve.
> - * @blend_gain: Blend gain weightage from othe PA features.
> - * @sat_hold: Saturation hold value.
> - * @val_hold: Value hold info.
> - * @hue_region: Hue qualifier.
> - * @sat_region: Saturation qualifier.
> - * @val_region: Value qualifier.
> - */
> -#define DRM_MSM_MEMCOL
> -struct drm_msm_memcol {
> - __u64 prot_flags;
> - __u32 color_adjust_p0;
> - __u32 color_adjust_p1;
> - __u32 color_adjust_p2;
> - __u32 blend_gain;
> - __u32 sat_hold;
> - __u32 val_hold;
> - __u32 hue_region;
> - __u32 sat_region;
> - __u32 val_region;
> -};
> -
> -#define GAMUT_3D_MODE_17 1
> -#define GAMUT_3D_MODE_5 2
> -#define GAMUT_3D_MODE_13 3
> -
> -#define GAMUT_3D_MODE17_TBL_SZ 1229
> -#define GAMUT_3D_MODE5_TBL_SZ 32
> -#define GAMUT_3D_MODE13_TBL_SZ 550
> -#define GAMUT_3D_SCALE_OFF_SZ 16
> -#define GAMUT_3D_SCALEB_OFF_SZ 12
> -#define GAMUT_3D_TBL_NUM 4
> -#define GAMUT_3D_SCALE_OFF_TBL_NUM 3
> -#define GAMUT_3D_MAP_EN (1 << 0)
> -
> -/**
> - * struct drm_msm_3d_col - 3d gamut color component structure
> - * @c0: Holds c0 value
> - * @c2_c1: Holds c2/c1 values
> - */
> -struct drm_msm_3d_col {
> - __u32 c2_c1;
> - __u32 c0;
> -};
> -/**
> - * struct drm_msm_3d_gamut - 3d gamut feature structure
> - * @flags: flags for the feature values are:
> - * 0 - no map
> - * GAMUT_3D_MAP_EN - enable map
> - * @mode: lut mode can take following values:
> - * - GAMUT_3D_MODE_17
> - * - GAMUT_3D_MODE_5
> - * - GAMUT_3D_MODE_13
> - * @scale_off: Scale offset table
> - * @col: Color component tables
> - */
> -struct drm_msm_3d_gamut {
> - __u64 flags;
> - __u32 mode;
> - __u32 scale_off[GAMUT_3D_SCALE_OFF_TBL_NUM][GAMUT_3D_SCALE_OFF_SZ];
> - struct drm_msm_3d_col col[GAMUT_3D_TBL_NUM][GAMUT_3D_MODE17_TBL_SZ];
> -};
> -
> -#define PGC_TBL_LEN 512
> -#define PGC_8B_ROUND (1 << 0)
> -/**
> - * struct drm_msm_pgc_lut - pgc lut feature structure
> - * @flags: flags for the featue values can be:
> - * - PGC_8B_ROUND
> - * @c0: color0 component lut
> - * @c1: color1 component lut
> - * @c2: color2 component lut
> - */
> -struct drm_msm_pgc_lut {
> - __u64 flags;
> - __u32 c0[PGC_TBL_LEN];
> - __u32 c1[PGC_TBL_LEN];
> - __u32 c2[PGC_TBL_LEN];
> -};
> -
> -#define IGC_TBL_LEN 256
> -#define IGC_DITHER_ENABLE (1 << 0)
> -/**
> - * struct drm_msm_igc_lut - igc lut feature structure
> - * @flags: flags for the feature customization, values can be:
> - * - IGC_DITHER_ENABLE: Enable dither functionality
> - * @c0: color0 component lut
> - * @c1: color1 component lut
> - * @c2: color2 component lut
> - * @strength: dither strength, considered valid when IGC_DITHER_ENABLE
> - * is set in flags. Strength value based on source bit width.
> - */
> -struct drm_msm_igc_lut {
> - __u64 flags;
> - __u32 c0[IGC_TBL_LEN];
> - __u32 c1[IGC_TBL_LEN];
> - __u32 c2[IGC_TBL_LEN];
> - __u32 strength;
> -};
> -
> -#define AD4_LUT_GRP0_SIZE 33
> -#define AD4_LUT_GRP1_SIZE 32
> -/*
> - * struct drm_msm_ad4_init - ad4 init structure set by user-space client.
> - * Init param values can change based on tuning
> - * hence it is passed by user-space clients.
> - */
> -struct drm_msm_ad4_init {
> - __u32 init_param_001[AD4_LUT_GRP0_SIZE];
> - __u32 init_param_002[AD4_LUT_GRP0_SIZE];
> - __u32 init_param_003[AD4_LUT_GRP0_SIZE];
> - __u32 init_param_004[AD4_LUT_GRP0_SIZE];
> - __u32 init_param_005[AD4_LUT_GRP1_SIZE];
> - __u32 init_param_006[AD4_LUT_GRP1_SIZE];
> - __u32 init_param_007[AD4_LUT_GRP0_SIZE];
> - __u32 init_param_008[AD4_LUT_GRP0_SIZE];
> - __u32 init_param_009;
> - __u32 init_param_010;
> - __u32 init_param_011;
> - __u32 init_param_012;
> - __u32 init_param_013;
> - __u32 init_param_014;
> - __u32 init_param_015;
> - __u32 init_param_016;
> - __u32 init_param_017;
> - __u32 init_param_018;
> - __u32 init_param_019;
> - __u32 init_param_020;
> - __u32 init_param_021;
> - __u32 init_param_022;
> - __u32 init_param_023;
> - __u32 init_param_024;
> - __u32 init_param_025;
> - __u32 init_param_026;
> - __u32 init_param_027;
> - __u32 init_param_028;
> - __u32 init_param_029;
> - __u32 init_param_030;
> - __u32 init_param_031;
> - __u32 init_param_032;
> - __u32 init_param_033;
> - __u32 init_param_034;
> - __u32 init_param_035;
> - __u32 init_param_036;
> - __u32 init_param_037;
> - __u32 init_param_038;
> - __u32 init_param_039;
> - __u32 init_param_040;
> - __u32 init_param_041;
> - __u32 init_param_042;
> - __u32 init_param_043;
> - __u32 init_param_044;
> - __u32 init_param_045;
> - __u32 init_param_046;
> - __u32 init_param_047;
> - __u32 init_param_048;
> - __u32 init_param_049;
> - __u32 init_param_050;
> - __u32 init_param_051;
> - __u32 init_param_052;
> - __u32 init_param_053;
> - __u32 init_param_054;
> - __u32 init_param_055;
> - __u32 init_param_056;
> - __u32 init_param_057;
> - __u32 init_param_058;
> - __u32 init_param_059;
> - __u32 init_param_060;
> - __u32 init_param_061;
> - __u32 init_param_062;
> - __u32 init_param_063;
> - __u32 init_param_064;
> - __u32 init_param_065;
> - __u32 init_param_066;
> - __u32 init_param_067;
> - __u32 init_param_068;
> - __u32 init_param_069;
> - __u32 init_param_070;
> - __u32 init_param_071;
> - __u32 init_param_072;
> - __u32 init_param_073;
> - __u32 init_param_074;
> - __u32 init_param_075;
> -};
> -
> -/*
> - * struct drm_msm_ad4_cfg - ad4 config structure set by user-space client.
> - * Config param values can vary based on tuning,
> - * hence it is passed by user-space clients.
> - */
> -struct drm_msm_ad4_cfg {
> - __u32 cfg_param_001;
> - __u32 cfg_param_002;
> - __u32 cfg_param_003;
> - __u32 cfg_param_004;
> - __u32 cfg_param_005;
> - __u32 cfg_param_006;
> - __u32 cfg_param_007;
> - __u32 cfg_param_008;
> - __u32 cfg_param_009;
> - __u32 cfg_param_010;
> - __u32 cfg_param_011;
> - __u32 cfg_param_012;
> - __u32 cfg_param_013;
> - __u32 cfg_param_014;
> - __u32 cfg_param_015;
> - __u32 cfg_param_016;
> - __u32 cfg_param_017;
> - __u32 cfg_param_018;
> - __u32 cfg_param_019;
> - __u32 cfg_param_020;
> - __u32 cfg_param_021;
> - __u32 cfg_param_022;
> - __u32 cfg_param_023;
> - __u32 cfg_param_024;
> - __u32 cfg_param_025;
> - __u32 cfg_param_026;
> - __u32 cfg_param_027;
> - __u32 cfg_param_028;
> - __u32 cfg_param_029;
> - __u32 cfg_param_030;
> - __u32 cfg_param_031;
> - __u32 cfg_param_032;
> - __u32 cfg_param_033;
> - __u32 cfg_param_034;
> - __u32 cfg_param_035;
> - __u32 cfg_param_036;
> - __u32 cfg_param_037;
> - __u32 cfg_param_038;
> - __u32 cfg_param_039;
> - __u32 cfg_param_040;
> - __u32 cfg_param_041;
> - __u32 cfg_param_042;
> - __u32 cfg_param_043;
> - __u32 cfg_param_044;
> - __u32 cfg_param_045;
> - __u32 cfg_param_046;
> - __u32 cfg_param_047;
> - __u32 cfg_param_048;
> - __u32 cfg_param_049;
> - __u32 cfg_param_050;
> - __u32 cfg_param_051;
> - __u32 cfg_param_052;
> - __u32 cfg_param_053;
> -};
> -
> -#define DITHER_MATRIX_SZ 16
> -
> -/**
> - * struct drm_msm_dither - dither feature structure
> - * @flags: for customizing operations
> - * @temporal_en: temperal dither enable
> - * @c0_bitdepth: c0 component bit depth
> - * @c1_bitdepth: c1 component bit depth
> - * @c2_bitdepth: c2 component bit depth
> - * @c3_bitdepth: c2 component bit depth
> - * @matrix: dither strength matrix
> - */
> -struct drm_msm_dither {
> - __u64 flags;
> - __u32 temporal_en;
> - __u32 c0_bitdepth;
> - __u32 c1_bitdepth;
> - __u32 c2_bitdepth;
> - __u32 c3_bitdepth;
> - __u32 matrix[DITHER_MATRIX_SZ];
> -};
> -
> -#endif /* _MSM_DRM_PP_H_ */
> --
> The Qualcomm Innovation Center, Inc. is a member of the Code Aurora Forum,
> a Linux Foundation Collaborative Project
>
> _______________________________________________
> Freedreno mailing list
> Freedreno@lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/freedreno
--
Sean Paul, Software Engineer, Google / Chromium OS
_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel
^ permalink raw reply [flat|nested] 18+ messages in thread
* Re: [DPU PATCH 4/7] drm/msm/dpu: switch to drm zpos property
[not found] ` <1527103862-13934-5-git-send-email-jsanka-sgV2jX0FEOL9JmXXK+q4OQ@public.gmane.org>
2018-05-23 21:21 ` Jordan Crouse
@ 2018-06-04 20:03 ` Sean Paul
1 sibling, 0 replies; 18+ messages in thread
From: Sean Paul @ 2018-06-04 20:03 UTC (permalink / raw)
To: Jeykumar Sankaran
Cc: linux-arm-msm-u79uwXL29TY76Z2rM5mHXA,
dri-devel-PD4FTy7X32lNgt0PjOBp9y5qC8QIuHrW,
robdclark-Re5JQEeQqe8AvxtiuMwx3w,
seanpaul-F7+t8E8rja9g9hUCZPvPmw,
hoegsberg-hpIqsD4AKlfQT0dZR+AlfA,
freedreno-PD4FTy7X32lNgt0PjOBp9y5qC8QIuHrW
On Wed, May 23, 2018 at 12:30:59PM -0700, Jeykumar Sankaran wrote:
> Replace custom plane zpos property with drm core zpos
> property. CRTC relies on the normalized zpos values
> to configure blend stages of each plane.
>
> Signed-off-by: Jeykumar Sankaran <jsanka@codeaurora.org>
> ---
> drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c | 36 +------------------------------
> drivers/gpu/drm/msm/disp/dpu1/dpu_plane.c | 18 +++++++++++++---
> 2 files changed, 16 insertions(+), 38 deletions(-)
>
> diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c b/drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c
> index d439a9e..a0b702f 100644
> --- a/drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c
> +++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c
> @@ -2631,24 +2631,6 @@ struct plane_state {
> u32 pipe_id;
> };
>
> -static int pstate_cmp(const void *a, const void *b)
> -{
> - struct plane_state *pa = (struct plane_state *)a;
> - struct plane_state *pb = (struct plane_state *)b;
> - int rc = 0;
> - int pa_zpos, pb_zpos;
> -
> - pa_zpos = dpu_plane_get_property(pa->dpu_pstate, PLANE_PROP_ZPOS);
> - pb_zpos = dpu_plane_get_property(pb->dpu_pstate, PLANE_PROP_ZPOS);
> -
> - if (pa_zpos != pb_zpos)
> - rc = pa_zpos - pb_zpos;
> - else
> - rc = pa->drm_pstate->crtc_x - pb->drm_pstate->crtc_x;
> -
> - return rc;
> -}
> -
> static int dpu_crtc_atomic_check(struct drm_crtc *crtc,
> struct drm_crtc_state *state)
> {
> @@ -2714,8 +2696,7 @@ static int dpu_crtc_atomic_check(struct drm_crtc *crtc,
>
> pstates[cnt].dpu_pstate = to_dpu_plane_state(pstate);
> pstates[cnt].drm_pstate = pstate;
> - pstates[cnt].stage = dpu_plane_get_property(
> - pstates[cnt].dpu_pstate, PLANE_PROP_ZPOS);
> + pstates[cnt].stage = pstate->normalized_zpos;
> pstates[cnt].pipe_id = dpu_plane_pipe(plane);
>
> /* check dim layer stage with every plane */
> @@ -2771,21 +2752,6 @@ static int dpu_crtc_atomic_check(struct drm_crtc *crtc,
> }
> }
>
> - /* assign mixer stages based on sorted zpos property */
> - sort(pstates, cnt, sizeof(pstates[0]), pstate_cmp, NULL);
> -
> - if (!dpu_is_custom_client()) {
> - int stage_old = pstates[0].stage;
> -
> - z_pos = 0;
> - for (i = 0; i < cnt; i++) {
> - if (stage_old != pstates[i].stage)
> - ++z_pos;
> - stage_old = pstates[i].stage;
> - pstates[i].stage = z_pos;
> - }
> - }
> -
> z_pos = -1;
> for (i = 0; i < cnt; i++) {
> /* reset counts at every new blend stage */
> diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_plane.c b/drivers/gpu/drm/msm/disp/dpu1/dpu_plane.c
> index b033653..28735c8 100644
> --- a/drivers/gpu/drm/msm/disp/dpu1/dpu_plane.c
> +++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_plane.c
> @@ -59,6 +59,7 @@
> #define DPU_NAME_SIZE 12
>
> #define DPU_PLANE_COLOR_FILL_FLAG BIT(31)
> +#define DPU_ZPOS_MAX 255
>
> /* multirect rect index */
> enum {
> @@ -1518,9 +1519,6 @@ static void _dpu_plane_install_properties(struct drm_plane *plane,
> /* reserve zpos == 0 for primary planes */
> zpos_def = drm_plane_index(plane) + 1;
> }
> -
> - msm_property_install_range(&pdpu->property_info, "zpos",
> - 0x0, 0, zpos_max, zpos_def, PLANE_PROP_ZPOS);
> }
>
> static int dpu_plane_atomic_set_property(struct drm_plane *plane,
> @@ -1958,6 +1956,7 @@ struct drm_plane *dpu_plane_init(struct drm_device *dev,
> struct msm_drm_private *priv;
> struct dpu_kms *kms;
> enum drm_plane_type type;
> + int zpos_max = DPU_ZPOS_MAX;
> int ret = -EINVAL;
>
> if (!dev) {
> @@ -2049,6 +2048,19 @@ struct drm_plane *dpu_plane_init(struct drm_device *dev,
> if (ret)
> goto clean_sspp;
>
> + pdpu->catalog = kms->catalog;
> +
Why is this here? It seems unrelated to the patch.
> + if (kms->catalog->mixer_count &&
> + kms->catalog->mixer[0].sblk->maxblendstages) {
> + zpos_max = kms->catalog->mixer[0].sblk->maxblendstages - 1;
> + if (zpos_max > DPU_STAGE_MAX - DPU_STAGE_0 - 1)
> + zpos_max = DPU_STAGE_MAX - DPU_STAGE_0 - 1;
> + }
> +
> + ret = drm_plane_create_zpos_property(plane, 0, 0, zpos_max);
> + if (ret)
> + DPU_ERROR("failed to install zpos property, rc = %d\n", ret);
> +
> /* success! finalize initialization */
> drm_plane_helper_add(plane, &dpu_plane_helper_funcs);
>
> --
> The Qualcomm Innovation Center, Inc. is a member of the Code Aurora Forum,
> a Linux Foundation Collaborative Project
>
--
Sean Paul, Software Engineer, Google / Chromium OS
_______________________________________________
Freedreno mailing list
Freedreno@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/freedreno
^ permalink raw reply [flat|nested] 18+ messages in thread
* Re: [DPU PATCH 4/7] drm/msm/dpu: switch to drm zpos property
[not found] ` <20180523212115.GB16550-9PYrDHPZ2Orvke4nUoYGnHL1okKdlPRT@public.gmane.org>
@ 2018-06-04 20:07 ` Sean Paul
0 siblings, 0 replies; 18+ messages in thread
From: Sean Paul @ 2018-06-04 20:07 UTC (permalink / raw)
To: Jeykumar Sankaran, dri-devel-PD4FTy7X32lNgt0PjOBp9y5qC8QIuHrW,
freedreno-PD4FTy7X32lNgt0PjOBp9y5qC8QIuHrW,
linux-arm-msm-u79uwXL29TY76Z2rM5mHXA,
hoegsberg-hpIqsD4AKlfQT0dZR+AlfA,
seanpaul-F7+t8E8rja9g9hUCZPvPmw,
robdclark-Re5JQEeQqe8AvxtiuMwx3w
On Wed, May 23, 2018 at 03:21:15PM -0600, Jordan Crouse wrote:
> On Wed, May 23, 2018 at 12:30:59PM -0700, Jeykumar Sankaran wrote:
> > Replace custom plane zpos property with drm core zpos
> > property. CRTC relies on the normalized zpos values
> > to configure blend stages of each plane.
> >
> > Signed-off-by: Jeykumar Sankaran <jsanka@codeaurora.org>
> > ---
> > drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c | 36 +------------------------------
> > drivers/gpu/drm/msm/disp/dpu1/dpu_plane.c | 18 +++++++++++++---
> > 2 files changed, 16 insertions(+), 38 deletions(-)
> >
> > diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c b/drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c
> > index d439a9e..a0b702f 100644
> > --- a/drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c
> > +++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c
> > @@ -2631,24 +2631,6 @@ struct plane_state {
> > u32 pipe_id;
> > };
> >
> > -static int pstate_cmp(const void *a, const void *b)
> > -{
> > - struct plane_state *pa = (struct plane_state *)a;
> > - struct plane_state *pb = (struct plane_state *)b;
> > - int rc = 0;
> > - int pa_zpos, pb_zpos;
> > -
> > - pa_zpos = dpu_plane_get_property(pa->dpu_pstate, PLANE_PROP_ZPOS);
> > - pb_zpos = dpu_plane_get_property(pb->dpu_pstate, PLANE_PROP_ZPOS);
> > -
> > - if (pa_zpos != pb_zpos)
> > - rc = pa_zpos - pb_zpos;
> > - else
> > - rc = pa->drm_pstate->crtc_x - pb->drm_pstate->crtc_x;
> > -
> > - return rc;
> > -}
> > -
> > static int dpu_crtc_atomic_check(struct drm_crtc *crtc,
> > struct drm_crtc_state *state)
> > {
> > @@ -2714,8 +2696,7 @@ static int dpu_crtc_atomic_check(struct drm_crtc *crtc,
> >
> > pstates[cnt].dpu_pstate = to_dpu_plane_state(pstate);
> > pstates[cnt].drm_pstate = pstate;
> > - pstates[cnt].stage = dpu_plane_get_property(
> > - pstates[cnt].dpu_pstate, PLANE_PROP_ZPOS);
> > + pstates[cnt].stage = pstate->normalized_zpos;
> > pstates[cnt].pipe_id = dpu_plane_pipe(plane);
> >
> > /* check dim layer stage with every plane */
> > @@ -2771,21 +2752,6 @@ static int dpu_crtc_atomic_check(struct drm_crtc *crtc,
> > }
> > }
> >
> > - /* assign mixer stages based on sorted zpos property */
> > - sort(pstates, cnt, sizeof(pstates[0]), pstate_cmp, NULL);
> > -
> > - if (!dpu_is_custom_client()) {
> > - int stage_old = pstates[0].stage;
> > -
> > - z_pos = 0;
> > - for (i = 0; i < cnt; i++) {
> > - if (stage_old != pstates[i].stage)
> > - ++z_pos;
> > - stage_old = pstates[i].stage;
> > - pstates[i].stage = z_pos;
> > - }
> > - }
> > -
> > z_pos = -1;
> > for (i = 0; i < cnt; i++) {
> > /* reset counts at every new blend stage */
> > diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_plane.c b/drivers/gpu/drm/msm/disp/dpu1/dpu_plane.c
> > index b033653..28735c8 100644
> > --- a/drivers/gpu/drm/msm/disp/dpu1/dpu_plane.c
> > +++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_plane.c
> > @@ -59,6 +59,7 @@
> > #define DPU_NAME_SIZE 12
> >
> > #define DPU_PLANE_COLOR_FILL_FLAG BIT(31)
> > +#define DPU_ZPOS_MAX 255
> >
> > /* multirect rect index */
> > enum {
> > @@ -1518,9 +1519,6 @@ static void _dpu_plane_install_properties(struct drm_plane *plane,
> > /* reserve zpos == 0 for primary planes */
> > zpos_def = drm_plane_index(plane) + 1;
> > }
> > -
> > - msm_property_install_range(&pdpu->property_info, "zpos",
> > - 0x0, 0, zpos_max, zpos_def, PLANE_PROP_ZPOS);
> > }
> >
> > static int dpu_plane_atomic_set_property(struct drm_plane *plane,
> > @@ -1958,6 +1956,7 @@ struct drm_plane *dpu_plane_init(struct drm_device *dev,
> > struct msm_drm_private *priv;
> > struct dpu_kms *kms;
> > enum drm_plane_type type;
> > + int zpos_max = DPU_ZPOS_MAX;
> > int ret = -EINVAL;
> >
> > if (!dev) {
> > @@ -2049,6 +2048,19 @@ struct drm_plane *dpu_plane_init(struct drm_device *dev,
> > if (ret)
> > goto clean_sspp;
> >
> > + pdpu->catalog = kms->catalog;
> > +
> > + if (kms->catalog->mixer_count &&
> > + kms->catalog->mixer[0].sblk->maxblendstages) {
> > + zpos_max = kms->catalog->mixer[0].sblk->maxblendstages - 1;
> > + if (zpos_max > DPU_STAGE_MAX - DPU_STAGE_0 - 1)
> > + zpos_max = DPU_STAGE_MAX - DPU_STAGE_0 - 1;
> > + }
> > +
> > + ret = drm_plane_create_zpos_property(plane, 0, 0, zpos_max);
> > + if (ret)
> > + DPU_ERROR("failed to install zpos property, rc = %d\n", ret);
> > +
>
> drm_plane_create_zpos_property() can either return 0 or -ENOMEM
This may not always be true.
> so
> printing the return value isn't interesting.
Also if I was reviewing or casual reading this without the ret print, I would
probably leave a comment such as "print the return value" since I don't
generally keep track of all possible return values.
So printing the return value seems reasonable to me.
Sean
>
> > /* success! finalize initialization */
> > drm_plane_helper_add(plane, &dpu_plane_helper_funcs);
> >
> > --
> > The Qualcomm Innovation Center, Inc. is a member of the Code Aurora Forum,
> > a Linux Foundation Collaborative Project
> >
> > _______________________________________________
> > Freedreno mailing list
> > Freedreno@lists.freedesktop.org
> > https://lists.freedesktop.org/mailman/listinfo/freedreno
>
> --
> The Qualcomm Innovation Center, Inc. is a member of Code Aurora Forum,
> a Linux Foundation Collaborative Project
--
Sean Paul, Software Engineer, Google / Chromium OS
_______________________________________________
Freedreno mailing list
Freedreno@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/freedreno
^ permalink raw reply [flat|nested] 18+ messages in thread
* Re: [DPU PATCH 2/7] drm/msm/dpu: clean up dpu plane custom properties
2018-06-04 19:53 ` Sean Paul
@ 2018-06-05 19:32 ` Jeykumar Sankaran
0 siblings, 0 replies; 18+ messages in thread
From: Jeykumar Sankaran @ 2018-06-05 19:32 UTC (permalink / raw)
To: Sean Paul
Cc: linux-arm-msm-u79uwXL29TY76Z2rM5mHXA,
robdclark-Re5JQEeQqe8AvxtiuMwx3w,
freedreno-PD4FTy7X32lNgt0PjOBp9y5qC8QIuHrW,
dri-devel-PD4FTy7X32lNgt0PjOBp9y5qC8QIuHrW,
hoegsberg-hpIqsD4AKlfQT0dZR+AlfA
On 2018-06-04 12:53, Sean Paul wrote:
> On Wed, May 23, 2018 at 12:30:57PM -0700, Jeykumar Sankaran wrote:
>> This change removes all the dpu plane custom properties
>> and its handlers.
>>
>> Signed-off-by: Jeykumar Sankaran <jsanka@codeaurora.org>
>> ---
>> Makefile | 2 +-
>> drivers/gpu/drm/msm/Makefile | 8 -
>> drivers/gpu/drm/msm/disp/dpu1/dpu_ad4.h | 99 --
>> .../gpu/drm/msm/disp/dpu1/dpu_color_processing.c | 1521
> --------------------
>> .../gpu/drm/msm/disp/dpu1/dpu_color_processing.h | 120 --
>> drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c | 148 +-
>> drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.h | 3 +-
>> drivers/gpu/drm/msm/disp/dpu1/dpu_encoder.c | 2 -
>> .../gpu/drm/msm/disp/dpu1/dpu_encoder_phys_wb.c | 1 -
>> drivers/gpu/drm/msm/disp/dpu1/dpu_hw_ad4.c | 1443
> -------------------
>> drivers/gpu/drm/msm/disp/dpu1/dpu_hw_catalog.c | 72 +-
>> drivers/gpu/drm/msm/disp/dpu1/dpu_hw_catalog.h | 89 --
>> .../msm/disp/dpu1/dpu_hw_color_proc_common_v4.h | 69 -
>> .../gpu/drm/msm/disp/dpu1/dpu_hw_color_proc_v4.c | 242 ----
>> .../gpu/drm/msm/disp/dpu1/dpu_hw_color_proc_v4.h | 40 -
>> .../drm/msm/disp/dpu1/dpu_hw_color_processing.h | 20 -
>> .../msm/disp/dpu1/dpu_hw_color_processing_v1_7.c | 565 --------
>> .../msm/disp/dpu1/dpu_hw_color_processing_v1_7.h | 92 --
>> drivers/gpu/drm/msm/disp/dpu1/dpu_hw_ctl.c | 44 -
>> drivers/gpu/drm/msm/disp/dpu1/dpu_hw_ctl.h | 15 -
>> drivers/gpu/drm/msm/disp/dpu1/dpu_hw_dspp.c | 209 ---
>> drivers/gpu/drm/msm/disp/dpu1/dpu_hw_dspp.h | 220 ---
>> drivers/gpu/drm/msm/disp/dpu1/dpu_hw_lm.c | 1 +
>> drivers/gpu/drm/msm/disp/dpu1/dpu_hw_mdss.h | 44 +-
>> drivers/gpu/drm/msm/disp/dpu1/dpu_hw_pingpong.c | 68 -
>> drivers/gpu/drm/msm/disp/dpu1/dpu_hw_pingpong.h | 6 -
>> drivers/gpu/drm/msm/disp/dpu1/dpu_hw_reg_dma_v1.c | 757 ----------
>> drivers/gpu/drm/msm/disp/dpu1/dpu_hw_reg_dma_v1.h | 27 -
>> .../msm/disp/dpu1/dpu_hw_reg_dma_v1_color_proc.c | 943
>> ------------
>> .../msm/disp/dpu1/dpu_hw_reg_dma_v1_color_proc.h | 75 -
>> drivers/gpu/drm/msm/disp/dpu1/dpu_hw_sspp.c | 219 ---
>> drivers/gpu/drm/msm/disp/dpu1/dpu_hw_sspp.h | 73 -
>> drivers/gpu/drm/msm/disp/dpu1/dpu_hw_util.c | 1 -
>> drivers/gpu/drm/msm/disp/dpu1/dpu_hw_util.h | 156 ++
>> drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c | 3 -
>> drivers/gpu/drm/msm/disp/dpu1/dpu_plane.c | 1267
> +---------------
>> drivers/gpu/drm/msm/disp/dpu1/dpu_plane.h | 31 -
>> drivers/gpu/drm/msm/disp/dpu1/dpu_reg_dma.c | 139 --
>> drivers/gpu/drm/msm/disp/dpu1/dpu_reg_dma.h | 310 ----
>> drivers/gpu/drm/msm/disp/dpu1/dpu_rm.c | 102 +-
>> drivers/gpu/drm/msm/disp/dpu1/dpu_rm.h | 2 -
>> drivers/gpu/drm/msm/disp/dpu1/dpu_wb.c | 2 -
>> drivers/gpu/drm/msm/msm_drv.h | 28 -
>> include/uapi/drm/dpu_drm.h | 187 ---
>> include/uapi/drm/msm_drm.h | 1 -
>> 45 files changed, 277 insertions(+), 9189 deletions(-)
>
> Doing all of this at once is really hard to review. I would have
> preferred
> to
> review each feature removal in a separate patch. However, since this is
> just
> going to be squashed into the DPU megapatch anyways, I guess it's fine.
>
Sure. I thought I was helping by squashing them beforehand.
Will take care by spliting them for review on future patches.
> I only paid close attention to the additions, there are some unrelated
> whitespace changes, but also meh on account of the squash (and non seem
> objectionable).
>
>> delete mode 100644 drivers/gpu/drm/msm/disp/dpu1/dpu_ad4.h
>> delete mode 100644
>> drivers/gpu/drm/msm/disp/dpu1/dpu_color_processing.c
>> delete mode 100644
>> drivers/gpu/drm/msm/disp/dpu1/dpu_color_processing.h
>> delete mode 100644 drivers/gpu/drm/msm/disp/dpu1/dpu_hw_ad4.c
>> delete mode 100644
> drivers/gpu/drm/msm/disp/dpu1/dpu_hw_color_proc_common_v4.h
>> delete mode 100644
>> drivers/gpu/drm/msm/disp/dpu1/dpu_hw_color_proc_v4.c
>> delete mode 100644
>> drivers/gpu/drm/msm/disp/dpu1/dpu_hw_color_proc_v4.h
>> delete mode 100644
> drivers/gpu/drm/msm/disp/dpu1/dpu_hw_color_processing.h
>> delete mode 100644
> drivers/gpu/drm/msm/disp/dpu1/dpu_hw_color_processing_v1_7.c
>> delete mode 100644
> drivers/gpu/drm/msm/disp/dpu1/dpu_hw_color_processing_v1_7.h
>> delete mode 100644 drivers/gpu/drm/msm/disp/dpu1/dpu_hw_dspp.c
>> delete mode 100644 drivers/gpu/drm/msm/disp/dpu1/dpu_hw_dspp.h
>> delete mode 100644 drivers/gpu/drm/msm/disp/dpu1/dpu_hw_reg_dma_v1.c
>> delete mode 100644 drivers/gpu/drm/msm/disp/dpu1/dpu_hw_reg_dma_v1.h
>> delete mode 100644
> drivers/gpu/drm/msm/disp/dpu1/dpu_hw_reg_dma_v1_color_proc.c
>> delete mode 100644
> drivers/gpu/drm/msm/disp/dpu1/dpu_hw_reg_dma_v1_color_proc.h
>> delete mode 100644 drivers/gpu/drm/msm/disp/dpu1/dpu_reg_dma.c
>> delete mode 100644 drivers/gpu/drm/msm/disp/dpu1/dpu_reg_dma.h
>>
>> diff --git a/Makefile b/Makefile
>> index 3c00040..1f23c66 100644
>> --- a/Makefile
>> +++ b/Makefile
>> @@ -364,7 +364,7 @@ HOST_LFS_LIBS := $(shell getconf LFS_LIBS)
>> HOSTCC = gcc
>> HOSTCXX = g++
>> HOSTCFLAGS := -Wall -Wmissing-prototypes -Wstrict-prototypes -O2 \
>> - -fomit-frame-pointer -std=gnu89 $(HOST_LFS_CFLAGS)
>> + -fomit-frame-pointer -std=gnu89 -Wmaybe-uninitialized
> $(HOST_LFS_CFLAGS)
>
> What's up with the compiler flag warnings? Seems unrelated (and we
> should
> probably remove all of them in a separate patch anyways).
>
Unintentional. Will clean up in V2.
>> HOSTCXXFLAGS := -O2 $(HOST_LFS_CFLAGS)
>> HOSTLDFLAGS := $(HOST_LFS_LDFLAGS)
>> HOST_LOADLIBES := $(HOST_LFS_LIBS)
>
> /snip
>
>> index 48920b05..d439a9e 100644
>> --- a/drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c
>> +++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c
>> @@ -20,7 +20,6 @@
>> #include <linux/sort.h>
>> #include <linux/debugfs.h>
>> #include <linux/ktime.h>
>> -#include <uapi/drm/dpu_drm.h>
>> #include <drm/drm_mode.h>
>> #include <drm/drm_crtc.h>
>> #include <drm/drm_crtc_helper.h>
>> @@ -31,13 +30,18 @@
>> #include "dpu_hw_ctl.h"
>> #include "dpu_crtc.h"
>> #include "dpu_plane.h"
>> -#include "dpu_color_processing.h"
>> #include "dpu_encoder.h"
>> #include "dpu_vbif.h"
>> #include "dpu_power_handle.h"
>> #include "dpu_core_perf.h"
>> #include "dpu_trace.h"
>>
>> +#define DPU_DRM_BLEND_OP_NOT_DEFINED 0
>> +#define DPU_DRM_BLEND_OP_OPAQUE 1
>> +#define DPU_DRM_BLEND_OP_PREMULTIPLIED 2
>> +#define DPU_DRM_BLEND_OP_COVERAGE 3
>> +#define DPU_DRM_BLEND_OP_MAX 4
>> +
>> /* layer mixer index on dpu_crtc */
>> #define LEFT_MIXER 0
>> #define RIGHT_MIXER 1
>> @@ -590,7 +594,6 @@ static void dpu_crtc_destroy(struct drm_crtc
>> *crtc)
>> if (dpu_crtc->blob_info)
>> drm_property_blob_put(dpu_crtc->blob_info);
>> msm_property_destroy(&dpu_crtc->property_info);
>> - dpu_cp_crtc_destroy_properties(crtc);
>> _dpu_crtc_destroy_dest_scaler(dpu_crtc);
>>
>> _dpu_crtc_deinit_events(dpu_crtc);
>> @@ -624,15 +627,11 @@ static void _dpu_crtc_setup_blend_cfg(struct
> dpu_crtc_mixer *mixer,
>> struct dpu_hw_mixer *lm = mixer->hw_lm;
>>
>> /* default to opaque blending */
>> - fg_alpha = dpu_plane_get_property(pstate, PLANE_PROP_ALPHA);
>> + fg_alpha = 0XFF;
>> bg_alpha = 0xFF - fg_alpha;
>
> This goes to 0 and the fg_alpha != 0xff checks are always false. So
> let's
> clean
> the rest of the function to remove the dead code and variables.
>
>> - blend_op = DPU_BLEND_FG_ALPHA_FG_CONST |
> DPU_BLEND_BG_ALPHA_BG_CONST;
>> - blend_type = dpu_plane_get_property(pstate, PLANE_PROP_BLEND_OP);
>> -
>> - DPU_DEBUG("blend type:0x%x blend alpha:0x%x\n", blend_type,
> fg_alpha);
>> + blend_type = DPU_DRM_BLEND_OP_OPAQUE;
>>
>> switch (blend_type) {
>> -
>> case DPU_DRM_BLEND_OP_OPAQUE:
>> blend_op = DPU_BLEND_FG_ALPHA_FG_CONST |
>> DPU_BLEND_BG_ALPHA_BG_CONST;
>>
>
>
> /snip
--
Jeykumar S
_______________________________________________
Freedreno mailing list
Freedreno@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/freedreno
^ permalink raw reply [flat|nested] 18+ messages in thread
end of thread, other threads:[~2018-06-05 19:32 UTC | newest]
Thread overview: 18+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2018-05-23 19:30 [DPU PATCH 0/7] clean up DPU custom properties Jeykumar Sankaran
[not found] ` <1527103862-13934-1-git-send-email-jsanka-sgV2jX0FEOL9JmXXK+q4OQ@public.gmane.org>
2018-05-23 19:30 ` [DPU PATCH 1/7] drm/msm: remove connector " Jeykumar Sankaran
2018-06-04 19:53 ` Sean Paul
2018-05-23 19:30 ` [DPU PATCH 2/7] drm/msm/dpu: clean up dpu plane " Jeykumar Sankaran
[not found] ` <1527103862-13934-3-git-send-email-jsanka-sgV2jX0FEOL9JmXXK+q4OQ@public.gmane.org>
2018-06-04 19:53 ` Sean Paul
2018-06-05 19:32 ` Jeykumar Sankaran
2018-05-23 19:30 ` [DPU PATCH 3/7] drm/msm: enable zpos normalization Jeykumar Sankaran
[not found] ` <1527103862-13934-4-git-send-email-jsanka-sgV2jX0FEOL9JmXXK+q4OQ@public.gmane.org>
2018-06-04 19:57 ` Sean Paul
2018-05-23 19:30 ` [DPU PATCH 4/7] drm/msm/dpu: switch to drm zpos property Jeykumar Sankaran
[not found] ` <1527103862-13934-5-git-send-email-jsanka-sgV2jX0FEOL9JmXXK+q4OQ@public.gmane.org>
2018-05-23 21:21 ` Jordan Crouse
[not found] ` <20180523212115.GB16550-9PYrDHPZ2Orvke4nUoYGnHL1okKdlPRT@public.gmane.org>
2018-06-04 20:07 ` Sean Paul
2018-06-04 20:03 ` Sean Paul
2018-05-23 19:31 ` [DPU PATCH 5/7] drm/msm/dpu: clean up dpu crtc custom properties Jeykumar Sankaran
[not found] ` <1527103862-13934-6-git-send-email-jsanka-sgV2jX0FEOL9JmXXK+q4OQ@public.gmane.org>
2018-06-04 19:58 ` Sean Paul
2018-05-23 19:31 ` [DPU PATCH 6/7] drm/msm: remove msm_prop files Jeykumar Sankaran
2018-06-04 19:59 ` Sean Paul
2018-05-23 19:31 ` [DPU PATCH 7/7] drm/msm: remove dpu specific uapi header Jeykumar Sankaran
2018-06-04 19:59 ` [Freedreno] " Sean Paul
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).