summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLinux Build Service Account <lnxbuild@localhost>2019-01-25 12:34:48 -0800
committerGerrit - the friendly Code Review server <code-review@localhost>2019-01-25 12:34:48 -0800
commit4163adf2c3cd15d25bd49a238d28bc237815b22a (patch)
treeda5f5fb9db92aea022f8ea37518f8f316450a1e6
parentee0238800a526797285b66599afac3f2da4b3e41 (diff)
parent90201f7427f5cd6e09f6e21ab0a41e781dab2dc3 (diff)
Merge "ARM: dts: msm: DRM: Change eDRM display pipe"
-rw-r--r--arch/arm/boot/dts/qcom/msm8996-agave-adp.dtsi22
-rw-r--r--arch/arm/boot/dts/qcom/msm8996-auto-cdp.dtsi21
-rw-r--r--arch/arm/boot/dts/qcom/msm8996-sde-display.dtsi6
-rw-r--r--arch/arm/boot/dts/qcom/msm8996-sde.dtsi11
-rw-r--r--drivers/gpu/drm/msm/ekms/edrm_kms.c4
-rw-r--r--drivers/gpu/drm/msm/ekms/edrm_plane.c768
-rw-r--r--drivers/gpu/drm/msm/ekms/edrm_plane.h3
7 files changed, 756 insertions, 79 deletions
diff --git a/arch/arm/boot/dts/qcom/msm8996-agave-adp.dtsi b/arch/arm/boot/dts/qcom/msm8996-agave-adp.dtsi
index 62c72942eb46..68846efc4e48 100644
--- a/arch/arm/boot/dts/qcom/msm8996-agave-adp.dtsi
+++ b/arch/arm/boot/dts/qcom/msm8996-agave-adp.dtsi
@@ -1,4 +1,4 @@
-/* Copyright (c) 2015-2018, The Linux Foundation. All rights reserved.
+/* Copyright (c) 2015-2019, 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
@@ -1643,11 +1643,27 @@
};
};
-/ {
+&sde_kms {
qcom,sde-reserved-plane {
- qcom,sde-plane-id@0 {
+ reserved_plane0: qcom,sde-reserved-plane@0 {
reg = <0x0>;
qcom,plane-name = "vig0";
+ lm-stage = <4>;
+ };
+ reserved_plane1: qcom,sde-reserved-plane@1 {
+ reg = <0x1>;
+ qcom,plane-name = "vig3";
+ lm-stage = <5>;
+ };
+ };
+};
+
+&msm_kms_edrm {
+ qcom,edrm-assigned-display {
+ qcom,edrm-display-id@0 {
+ qcom,label = "dsi_adv_7533_1";
+ qcom,intf-type = "dsi";
+ qcom,assigned_plane = <&reserved_plane1>;
};
};
};
diff --git a/arch/arm/boot/dts/qcom/msm8996-auto-cdp.dtsi b/arch/arm/boot/dts/qcom/msm8996-auto-cdp.dtsi
index 5384db451dab..793d91ee8da9 100644
--- a/arch/arm/boot/dts/qcom/msm8996-auto-cdp.dtsi
+++ b/arch/arm/boot/dts/qcom/msm8996-auto-cdp.dtsi
@@ -1468,11 +1468,28 @@
};
};
-/ {
+&sde_kms {
qcom,sde-reserved-plane {
- qcom,sde-plane-id@0 {
+ reserved_plane0: qcom,sde-reserved-plane@0 {
reg = <0x0>;
qcom,plane-name = "vig0";
+ lm-stage = <4>;
+ };
+ reserved_plane1: qcom,sde-reserved-plane@1 {
+ reg = <0x1>;
+ qcom,plane-name = "rgb3";
+ lm-stage = <5>;
+ };
+ };
+};
+
+&msm_kms_edrm {
+ qcom,edrm-assigned-display {
+ qcom,edrm-display-id@0 {
+ qcom,label = "dsi_adv_7533_1";
+ qcom,intf-type = "dsi";
+ qcom,ctl-id = <1>;
+ qcom,assigned_plane = <&reserved_plane1>;
};
};
};
diff --git a/arch/arm/boot/dts/qcom/msm8996-sde-display.dtsi b/arch/arm/boot/dts/qcom/msm8996-sde-display.dtsi
index 1c81bc433374..9d1655982cce 100644
--- a/arch/arm/boot/dts/qcom/msm8996-sde-display.dtsi
+++ b/arch/arm/boot/dts/qcom/msm8996-sde-display.dtsi
@@ -1,4 +1,4 @@
-/* Copyright (c) 2016-2017, The Linux Foundation. All rights reserved.
+/* Copyright (c) 2016-2019, 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
@@ -259,7 +259,7 @@
<&clock_mmss clk_ext_pclk0_clk_src>;
clock-names = "src_byte_clk", "src_pixel_clk";
- qcom,dsi-panel = <&dsi_adv7533_720p>;
+ qcom,dsi-panel = <&dsi_adv7533_1080p>;
vddio-supply = <&pm8994_l14>;
qcom,bridge-index = <0>;
};
@@ -275,7 +275,7 @@
<&clock_mmss clk_ext_pclk1_clk_src>;
clock-names = "src_byte_clk", "src_pixel_clk";
- qcom,dsi-panel = <&dsi_adv7533_720p>;
+ qcom,dsi-panel = <&dsi_adv7533_1080p>;
vddio-supply = <&pm8994_l14>;
qcom,bridge-index = <1>;
};
diff --git a/arch/arm/boot/dts/qcom/msm8996-sde.dtsi b/arch/arm/boot/dts/qcom/msm8996-sde.dtsi
index cab07d995b79..f5502702981c 100644
--- a/arch/arm/boot/dts/qcom/msm8996-sde.dtsi
+++ b/arch/arm/boot/dts/qcom/msm8996-sde.dtsi
@@ -1,4 +1,4 @@
-/* Copyright (c) 2016-2018, The Linux Foundation. All rights reserved.
+/* Copyright (c) 2016-2019, 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
@@ -537,3 +537,12 @@
};
};
};
+
+&soc {
+ msm_kms_edrm: qcom,msm_kms_edrm@900000 {
+
+ compatible = "qcom,msm-kms-edrm";
+ contiguous-region = <&cont_splash_mem &cont_splash_mem_hdmi>;
+
+ };
+};
diff --git a/drivers/gpu/drm/msm/ekms/edrm_kms.c b/drivers/gpu/drm/msm/ekms/edrm_kms.c
index 3aa45776a914..4749b6a8d776 100644
--- a/drivers/gpu/drm/msm/ekms/edrm_kms.c
+++ b/drivers/gpu/drm/msm/ekms/edrm_kms.c
@@ -418,7 +418,8 @@ static int _edrm_kms_parse_dt(struct msm_edrm_kms *edrm_kms)
}
plane = edrm_plane_init(edrm_kms->dev,
- edrm_kms->plane_id[disp_cnt]);
+ edrm_kms->plane_id[disp_cnt],
+ sspp_type);
if (IS_ERR(plane)) {
pr_err("edrm_plane_init failed\n");
ret = PTR_ERR(plane);
@@ -431,6 +432,7 @@ static int _edrm_kms_parse_dt(struct msm_edrm_kms *edrm_kms)
edrm_plane->lm_stage = lm_stage;
edrm_plane->sspp_offset = sspp_offset;
edrm_plane->sspp_cfg_id = sspp_cfg_id;
+ edrm_plane->sspp_type = sspp_type;
plane->possible_crtcs = (1 << disp_cnt);
priv->num_planes++;
plane_cnt++;
diff --git a/drivers/gpu/drm/msm/ekms/edrm_plane.c b/drivers/gpu/drm/msm/ekms/edrm_plane.c
index 367a0925104d..efe43543dc18 100644
--- a/drivers/gpu/drm/msm/ekms/edrm_plane.c
+++ b/drivers/gpu/drm/msm/ekms/edrm_plane.c
@@ -30,13 +30,672 @@
#define SSPP_SRC_UNPACK_PATTERN 0x34
#define SSPP_SRC_OP_MODE 0x38
#define SSPP_CONSTANT_COLOR 0x3c
+#define PIPE_SW_PIX_EXT_C0_LR 0x100
+#define PIPE_SW_PIX_EXT_C0_TB 0x104
#define PIPE_SW_PIXEL_EXT_C0_REQ 0x108
+#define PIPE_SW_PIX_EXT_C1C2_LR 0x110
+#define PIPE_SW_PIX_EXT_C1C2_TB 0x114
#define PIPE_SW_PIXEL_EXT_C1C2_REQ 0x118
+#define PIPE_SW_PIX_EXT_C3_LR 0x120
+#define PIPE_SW_PIX_EXT_C3_TB 0x124
#define PIPE_SW_PIXEL_EXT_C3_REQ 0x128
+#define SSPP_CDP_CNTL 0x134
#define FLUSH_OFFSET 0x18
+#define PIPE_OP_MODE 0x200
+#define PIPE_CSC_1_MATRIX_COEFF_0 0x320
+#define PIPE_CSC_1_MATRIX_COEFF_1 0x324
+#define PIPE_CSC_1_MATRIX_COEFF_2 0x328
+#define PIPE_CSC_1_MATRIX_COEFF_3 0x32C
+#define PIPE_CSC_1_MATRIX_COEFF_4 0x330
+#define PIPE_CSC_1_COMP_0_PRE_CLAMP 0x334
+#define PIPE_CSC_1_COMP_1_PRE_CLAMP 0x338
+#define PIPE_CSC_1_COMP_2_PRE_CLAMP 0x33C
+#define PIPE_CSC_1_COMP_0_POST_CAMP 0x340
+#define PIPE_CSC_1_COMP_1_POST_CLAMP 0x344
+#define PIPE_CSC_1_COMP_2_POST_CLAMP 0x348
+#define PIPE_CSC_1_COMP_0_PRE_BIAS 0x34C
+#define PIPE_CSC_1_COMP_1_PRE_BIAS 0x350
+#define PIPE_CSC_1_COMP_2_PRE_BIAS 0x354
+#define PIPE_CSC_1_COMP_0_POST_BIAS 0x358
+#define PIPE_CSC_1_COMP_1_POST_BIAS 0x35C
+#define PIPE_CSC_1_COMP_2_POST_BIAS 0x360
+#define PIPE_VP_0_QSEED2_CONFIG 0x204
+#define PIPE_COMP0_3_PHASE_STEP_X 0x210
+#define PIPE_COMP0_3_PHASE_STEP_Y 0x214
+#define PIPE_COMP1_2_PHASE_STEP_X 0x218
+#define PIPE_COMP1_2_PHASE_STEP_Y 0x21C
+#define PIPE_VP_0_QSEED2_SHARP_SMOOTH_STRENGTH 0x230
+#define PIPE_VP_0_QSEED2_SHARP_THRESHOLD_EDGE 0x234
+#define PIPE_VP_0_QSEED2_SHARP_THRESHOLD_SMOOTH 0x238
+#define PIPE_VP_0_QSEED2_SHARP_THRESHOLD_NOISE 0x23C
+
#define SSPP_SOLID_FILL_FORMAT 0x004237FF
-#define SSPP_RGB888_FORMAT 0x000237FF
-#define SSPP_RGB_PATTERN 0x03020001
+#define SSPP_ARGB8888_FORMAT 0x000237FF
+#define SSPP_XRGB8888_FORMAT 0x000236FF
+#define SSPP_ARGB1555_FORMAT 0x00023315
+#define SSPP_XRGB1555_FORMAT 0x00023215
+#define SSPP_ARGB4444_FORMAT 0x00023340
+#define SSPP_XRGB4444_FORMAT 0x00023240
+#define SSPP_NV12_FORMAT 0x0192923F
+#define SSPP_NV16_FORMAT 0x0092923F
+#define SSPP_YUYV_FORMAT 0x0082B23F
+#define SSPP_YUV420_FORMAT 0x018A803F
+#define SSPP_RGB888_FORMAT 0x0002243F
+#define SSPP_RGB565_FORMAT 0x00022216
+#define SSPP_ARGB_PATTERN 0x03020001
+#define SSPP_ABGR_PATTERN 0x03010002
+#define SSPP_RGBA_PATTERN 0x02000103
+#define SSPP_BGRA_PATTERN 0x01000203
+
+#define LAYER_BLEND5_OP 0x260
+#define LAYER_OP_ENABLE_ALPHA_BLEND 0x600
+#define LAYER_OP_DISABLE_ALPHA_BLEND 0x200
+
+static u32 edrm_plane_formats_RGB[] = {
+ DRM_FORMAT_ARGB8888,
+ DRM_FORMAT_ABGR8888,
+ DRM_FORMAT_RGBA8888,
+ DRM_FORMAT_BGRA8888,
+ DRM_FORMAT_XRGB8888,
+ DRM_FORMAT_RGBX8888,
+ DRM_FORMAT_BGRX8888,
+ DRM_FORMAT_XBGR8888,
+ DRM_FORMAT_XBGR8888,
+ DRM_FORMAT_RGB888,
+ DRM_FORMAT_BGR888,
+ DRM_FORMAT_RGB565,
+ DRM_FORMAT_BGR565,
+ DRM_FORMAT_BGR565,
+ DRM_FORMAT_ARGB1555,
+ DRM_FORMAT_ABGR1555,
+ DRM_FORMAT_RGBA5551,
+ DRM_FORMAT_BGRA5551,
+ DRM_FORMAT_XRGB1555,
+ DRM_FORMAT_XBGR1555,
+ DRM_FORMAT_RGBX5551,
+ DRM_FORMAT_BGRX5551,
+ DRM_FORMAT_ARGB4444,
+ DRM_FORMAT_ABGR4444,
+ DRM_FORMAT_RGBA4444,
+ DRM_FORMAT_BGRA4444,
+ DRM_FORMAT_XRGB4444,
+ DRM_FORMAT_XBGR4444,
+ DRM_FORMAT_RGBX4444,
+ DRM_FORMAT_BGRX4444
+};
+
+static u32 edrm_plane_formats_YUV[] = {
+ DRM_FORMAT_ARGB8888,
+ DRM_FORMAT_ABGR8888,
+ DRM_FORMAT_RGBA8888,
+ DRM_FORMAT_BGRX8888,
+ DRM_FORMAT_BGRA8888,
+ DRM_FORMAT_XRGB8888,
+ DRM_FORMAT_XBGR8888,
+ DRM_FORMAT_RGBX8888,
+ DRM_FORMAT_RGB888,
+ DRM_FORMAT_BGR888,
+ DRM_FORMAT_RGB565,
+ DRM_FORMAT_BGR565,
+ DRM_FORMAT_ARGB1555,
+ DRM_FORMAT_ABGR1555,
+ DRM_FORMAT_RGBA5551,
+ DRM_FORMAT_BGRA5551,
+ DRM_FORMAT_XRGB1555,
+ DRM_FORMAT_XBGR1555,
+ DRM_FORMAT_RGBX5551,
+ DRM_FORMAT_BGRX5551,
+ DRM_FORMAT_ARGB4444,
+ DRM_FORMAT_ABGR4444,
+ DRM_FORMAT_RGBA4444,
+ DRM_FORMAT_BGRA4444,
+ DRM_FORMAT_XRGB4444,
+ DRM_FORMAT_XBGR4444,
+ DRM_FORMAT_RGBX4444,
+ DRM_FORMAT_BGRX4444,
+ DRM_FORMAT_NV12,
+ DRM_FORMAT_NV21,
+ DRM_FORMAT_NV16,
+ DRM_FORMAT_NV61,
+ DRM_FORMAT_VYUY,
+ DRM_FORMAT_UYVY,
+ DRM_FORMAT_YUYV,
+ DRM_FORMAT_YVYU,
+ DRM_FORMAT_YUV420,
+ DRM_FORMAT_YVU420
+};
+
+static void edrm_plane_enable_csc(struct sde_kms *master_kms,
+ u32 plane_offset)
+{
+ writel_relaxed(0x00060000, master_kms->mmio + plane_offset +
+ PIPE_OP_MODE);
+
+ writel_relaxed(0x9, master_kms->mmio + plane_offset + SSPP_CDP_CNTL);
+ writel_relaxed(0x00000254, master_kms->mmio + plane_offset +
+ PIPE_CSC_1_MATRIX_COEFF_0);
+ writel_relaxed(0x02540396, master_kms->mmio + plane_offset +
+ PIPE_CSC_1_MATRIX_COEFF_1);
+ writel_relaxed(0x1eef1f93, master_kms->mmio + plane_offset +
+ PIPE_CSC_1_MATRIX_COEFF_2);
+ writel_relaxed(0x043e0254, master_kms->mmio + plane_offset +
+ PIPE_CSC_1_MATRIX_COEFF_3);
+ writel_relaxed(0x00000000, master_kms->mmio + plane_offset +
+ PIPE_CSC_1_MATRIX_COEFF_4);
+
+ writel_relaxed(0x000010eb, master_kms->mmio + plane_offset +
+ PIPE_CSC_1_COMP_0_PRE_CLAMP);
+ writel_relaxed(0x000010f0, master_kms->mmio + plane_offset +
+ PIPE_CSC_1_COMP_1_PRE_CLAMP);
+ writel_relaxed(0x000010f0, master_kms->mmio + plane_offset +
+ PIPE_CSC_1_COMP_2_PRE_CLAMP);
+ writel_relaxed(0x000000ff, master_kms->mmio + plane_offset +
+ PIPE_CSC_1_COMP_0_POST_CAMP);
+ writel_relaxed(0x000000ff, master_kms->mmio + plane_offset +
+ PIPE_CSC_1_COMP_1_POST_CLAMP);
+ writel_relaxed(0x000000ff, master_kms->mmio + plane_offset +
+ PIPE_CSC_1_COMP_2_POST_CLAMP);
+ writel_relaxed(0x0000fff0, master_kms->mmio + plane_offset +
+ PIPE_CSC_1_COMP_0_PRE_BIAS);
+ writel_relaxed(0x0000ff80, master_kms->mmio + plane_offset +
+ PIPE_CSC_1_COMP_1_PRE_BIAS);
+ writel_relaxed(0x0000ff80, master_kms->mmio + plane_offset +
+ PIPE_CSC_1_COMP_2_PRE_BIAS);
+ writel_relaxed(0x00000000, master_kms->mmio + plane_offset +
+ PIPE_CSC_1_COMP_0_POST_BIAS);
+ writel_relaxed(0x00000000, master_kms->mmio + plane_offset +
+ PIPE_CSC_1_COMP_1_POST_BIAS);
+ writel_relaxed(0x00000000, master_kms->mmio + plane_offset +
+ PIPE_CSC_1_COMP_2_POST_BIAS);
+
+ writel_relaxed(0x200000, master_kms->mmio + plane_offset +
+ PIPE_COMP0_3_PHASE_STEP_X);
+ writel_relaxed(0x200000, master_kms->mmio + plane_offset +
+ PIPE_COMP0_3_PHASE_STEP_Y);
+ writel_relaxed(0x100000, master_kms->mmio + plane_offset +
+ PIPE_COMP1_2_PHASE_STEP_X);
+ writel_relaxed(0x100000, master_kms->mmio + plane_offset +
+ PIPE_COMP1_2_PHASE_STEP_Y);
+}
+
+static void edrm_plane_set_yuv_plane(struct drm_plane *plane,
+ struct sde_kms *master_kms, u32 lm_off)
+{
+ u32 img_size, ystride0, ystride1;
+ u32 plane0_addr, plane1_addr, plane2_addr, plane3_addr;
+ struct edrm_plane *edrm_plane;
+
+ edrm_plane = to_edrm_plane(plane);
+ edrm_plane_enable_csc(master_kms, edrm_plane->sspp_offset);
+ if ((plane->state->fb->pixel_format == DRM_FORMAT_NV12) ||
+ (plane->state->fb->pixel_format == DRM_FORMAT_NV21) ||
+ (plane->state->fb->pixel_format == DRM_FORMAT_NV16) ||
+ (plane->state->fb->pixel_format == DRM_FORMAT_NV61)) {
+ ystride0 = (plane->state->fb->width << 16) |
+ plane->state->fb->width;
+ ystride1 = 0;
+ plane0_addr = msm_framebuffer_iova(plane->state->fb,
+ edrm_plane->aspace, 0);
+ plane1_addr = msm_framebuffer_iova(plane->state->fb,
+ edrm_plane->aspace, 1);
+ plane2_addr = 0;
+ plane3_addr = 0;
+ } else if ((plane->state->fb->pixel_format == DRM_FORMAT_YUYV) ||
+ (plane->state->fb->pixel_format == DRM_FORMAT_YVYU) ||
+ (plane->state->fb->pixel_format == DRM_FORMAT_VYUY) ||
+ (plane->state->fb->pixel_format == DRM_FORMAT_UYVY)) {
+ /* YUYV formats are single plane */
+ ystride0 = plane->state->fb->width * 2;
+ ystride1 = 0;
+ plane0_addr = msm_framebuffer_iova(plane->state->fb,
+ edrm_plane->aspace, 0);
+ plane1_addr = 0;
+ plane2_addr = 0;
+ plane3_addr = 0;
+ } else if ((plane->state->fb->pixel_format == DRM_FORMAT_YUV420) ||
+ (plane->state->fb->pixel_format == DRM_FORMAT_YVU420)) {
+ ystride0 = ((plane->state->fb->width/2) << 16) |
+ plane->state->fb->width;
+ ystride1 = plane->state->fb->width/2;
+ plane0_addr = msm_framebuffer_iova(plane->state->fb,
+ edrm_plane->aspace, 0);
+ plane1_addr = msm_framebuffer_iova(plane->state->fb,
+ edrm_plane->aspace, 1);
+ plane2_addr = msm_framebuffer_iova(plane->state->fb,
+ edrm_plane->aspace, 2);
+ plane3_addr = 0;
+ } else {
+ pr_err("Format %x not supported in eDRM\n",
+ plane->state->fb->pixel_format);
+ return;
+ }
+
+ writel_relaxed(ystride0, master_kms->mmio +
+ edrm_plane->sspp_offset + SSPP_SRC_YSTRIDE0);
+ writel_relaxed(ystride1, master_kms->mmio +
+ edrm_plane->sspp_offset + SSPP_SRC_YSTRIDE1);
+ writel_relaxed(plane0_addr, master_kms->mmio +
+ edrm_plane->sspp_offset + SSPP_SRC0_ADDR);
+ writel_relaxed(plane1_addr, master_kms->mmio +
+ edrm_plane->sspp_offset + SSPP_SRC1_ADDR);
+ writel_relaxed(plane2_addr, master_kms->mmio +
+ edrm_plane->sspp_offset + SSPP_SRC2_ADDR);
+ writel_relaxed(plane3_addr, master_kms->mmio +
+ edrm_plane->sspp_offset + SSPP_SRC3_ADDR);
+ writel_relaxed(0x00055f03, master_kms->mmio + edrm_plane->sspp_offset
+ + PIPE_VP_0_QSEED2_CONFIG);
+ writel_relaxed(0x00000020, master_kms->mmio + edrm_plane->sspp_offset
+ + PIPE_VP_0_QSEED2_SHARP_SMOOTH_STRENGTH);
+ writel_relaxed(0x00000070, master_kms->mmio + edrm_plane->sspp_offset
+ + PIPE_VP_0_QSEED2_SHARP_THRESHOLD_EDGE);
+ writel_relaxed(0x00000008, master_kms->mmio + edrm_plane->sspp_offset
+ + PIPE_VP_0_QSEED2_SHARP_THRESHOLD_SMOOTH);
+ writel_relaxed(0x00000002, master_kms->mmio + edrm_plane->sspp_offset
+ + PIPE_VP_0_QSEED2_SHARP_THRESHOLD_NOISE);
+
+ writel_relaxed(0x00020001, master_kms->mmio +
+ edrm_plane->sspp_offset + PIPE_SW_PIX_EXT_C0_LR);
+ writel_relaxed(0x00020001, master_kms->mmio +
+ edrm_plane->sspp_offset + PIPE_SW_PIX_EXT_C0_TB);
+ img_size = ((plane->state->fb->height + 3) << 16) |
+ (plane->state->fb->width + 3);
+ writel_relaxed(img_size, master_kms->mmio +
+ edrm_plane->sspp_offset + PIPE_SW_PIXEL_EXT_C0_REQ);
+
+ writel_relaxed(0x00010000, master_kms->mmio +
+ edrm_plane->sspp_offset + PIPE_SW_PIX_EXT_C1C2_LR);
+ writel_relaxed(0x00010000, master_kms->mmio +
+ edrm_plane->sspp_offset + PIPE_SW_PIX_EXT_C1C2_TB);
+ img_size = ((plane->state->fb->height/2 + 1) << 16) |
+ (plane->state->fb->width/2 + 1);
+ writel_relaxed(img_size, master_kms->mmio +
+ edrm_plane->sspp_offset + PIPE_SW_PIXEL_EXT_C1C2_REQ);
+
+ writel_relaxed(0x00010000, master_kms->mmio +
+ edrm_plane->sspp_offset + PIPE_SW_PIX_EXT_C3_LR);
+ writel_relaxed(0x00010000, master_kms->mmio +
+ edrm_plane->sspp_offset + PIPE_SW_PIX_EXT_C3_TB);
+ img_size = ((plane->state->fb->height + 1) << 16) |
+ (plane->state->fb->width + 1);
+ writel_relaxed(img_size, master_kms->mmio +
+ edrm_plane->sspp_offset + PIPE_SW_PIXEL_EXT_C3_REQ);
+
+
+ /* do a solid fill of transparent color */
+ writel_relaxed(0xFF000000, master_kms->mmio +
+ edrm_plane->sspp_offset + SSPP_CONSTANT_COLOR);
+
+ /* setup blending for mixer stage 5 */
+ writel_relaxed(LAYER_OP_DISABLE_ALPHA_BLEND, master_kms->mmio + lm_off
+ + LAYER_BLEND5_OP);
+}
+
+static void edrm_plane_set_rgb_plane(struct drm_plane *plane,
+ struct sde_kms *master_kms, u32 lm_off)
+{
+ u32 img_size, ystride0, ystride1, plane_addr;
+ struct edrm_plane *edrm_plane;
+
+ edrm_plane = to_edrm_plane(plane);
+
+ ystride0 = (plane->state->fb->width *
+ plane->state->fb->bits_per_pixel/8);
+ ystride1 = 0;
+ plane_addr = msm_framebuffer_iova(plane->state->fb,
+ edrm_plane->aspace, 0);
+ img_size = (plane->state->fb->height << 16) | plane->state->fb->width;
+ writel_relaxed(plane_addr, master_kms->mmio +
+ edrm_plane->sspp_offset + SSPP_SRC0_ADDR);
+ writel_relaxed(ystride0, master_kms->mmio +
+ edrm_plane->sspp_offset + SSPP_SRC_YSTRIDE0);
+ writel_relaxed(ystride1, master_kms->mmio +
+ edrm_plane->sspp_offset + SSPP_SRC_YSTRIDE1);
+ writel_relaxed(0x0, master_kms->mmio +
+ edrm_plane->sspp_offset + PIPE_SW_PIX_EXT_C0_LR);
+ writel_relaxed(0x0, master_kms->mmio +
+ edrm_plane->sspp_offset + PIPE_SW_PIX_EXT_C0_TB);
+ writel_relaxed(img_size, master_kms->mmio +
+ edrm_plane->sspp_offset + PIPE_SW_PIXEL_EXT_C0_REQ);
+ writel_relaxed(0x0, master_kms->mmio +
+ edrm_plane->sspp_offset + PIPE_SW_PIX_EXT_C1C2_LR);
+ writel_relaxed(0x0, master_kms->mmio +
+ edrm_plane->sspp_offset + PIPE_SW_PIX_EXT_C1C2_TB);
+ writel_relaxed(img_size, master_kms->mmio +
+ edrm_plane->sspp_offset + PIPE_SW_PIXEL_EXT_C1C2_REQ);
+ writel_relaxed(0x0, master_kms->mmio + edrm_plane->sspp_offset +
+ PIPE_SW_PIX_EXT_C3_LR);
+ writel_relaxed(0x0, master_kms->mmio + edrm_plane->sspp_offset +
+ PIPE_SW_PIX_EXT_C3_TB);
+ writel_relaxed(img_size, master_kms->mmio +
+ edrm_plane->sspp_offset + PIPE_SW_PIXEL_EXT_C3_REQ);
+ /* do a solid fill of transparent color */
+ writel_relaxed(0x0, master_kms->mmio + edrm_plane->sspp_offset +
+ SSPP_CONSTANT_COLOR);
+
+ /* setup blending for mixer stage 5 */
+ writel_relaxed(LAYER_OP_ENABLE_ALPHA_BLEND, master_kms->mmio + lm_off
+ + LAYER_BLEND5_OP);
+
+ /* disable CSC */
+ writel_relaxed(0x0, master_kms->mmio + edrm_plane->sspp_offset +
+ PIPE_OP_MODE);
+ writel_relaxed(0x0, master_kms->mmio + edrm_plane->sspp_offset
+ + PIPE_VP_0_QSEED2_CONFIG);
+}
+
+static int edrm_plane_modeset(struct drm_plane *plane)
+{
+ struct drm_device *dev = plane->dev;
+ struct msm_drm_private *priv = dev->dev_private;
+ struct msm_kms *kms = priv->kms;
+ struct msm_edrm_kms *edrm_kms;
+ struct msm_drm_private *master_priv;
+ struct sde_kms *master_kms;
+ struct edrm_plane *edrm_plane;
+ bool yuv_format;
+ u32 img_size, src_xy, dst_xy, lm_off;
+ struct msm_edrm_display *display;
+
+ edrm_kms = to_edrm_kms(kms);
+ master_priv = edrm_kms->master_dev->dev_private;
+ master_kms = to_sde_kms(master_priv->kms);
+ edrm_plane = to_edrm_plane(plane);
+ display = &edrm_kms->display[edrm_plane->display_id];
+ lm_off = display->lm_off;
+
+ switch (plane->state->fb->pixel_format) {
+ case DRM_FORMAT_ARGB8888:
+ writel_relaxed(SSPP_ARGB8888_FORMAT, master_kms->mmio +
+ edrm_plane->sspp_offset + SSPP_SRC_FORMAT);
+ writel_relaxed(SSPP_ARGB_PATTERN, master_kms->mmio +
+ edrm_plane->sspp_offset + SSPP_SRC_UNPACK_PATTERN);
+ yuv_format = false;
+ break;
+ case DRM_FORMAT_ABGR8888:
+ writel_relaxed(SSPP_ARGB8888_FORMAT, master_kms->mmio +
+ edrm_plane->sspp_offset + SSPP_SRC_FORMAT);
+ writel_relaxed(SSPP_ABGR_PATTERN, master_kms->mmio +
+ edrm_plane->sspp_offset + SSPP_SRC_UNPACK_PATTERN);
+ yuv_format = false;
+ break;
+ case DRM_FORMAT_RGBA8888:
+ writel_relaxed(SSPP_ARGB8888_FORMAT, master_kms->mmio +
+ edrm_plane->sspp_offset + SSPP_SRC_FORMAT);
+ writel_relaxed(SSPP_RGBA_PATTERN, master_kms->mmio +
+ edrm_plane->sspp_offset + SSPP_SRC_UNPACK_PATTERN);
+ yuv_format = false;
+ break;
+ case DRM_FORMAT_BGRX8888:
+ writel_relaxed(SSPP_XRGB8888_FORMAT, master_kms->mmio +
+ edrm_plane->sspp_offset + SSPP_SRC_FORMAT);
+ writel_relaxed(SSPP_BGRA_PATTERN, master_kms->mmio +
+ edrm_plane->sspp_offset + SSPP_SRC_UNPACK_PATTERN);
+ yuv_format = false;
+ break;
+ case DRM_FORMAT_BGRA8888:
+ writel_relaxed(SSPP_ARGB8888_FORMAT, master_kms->mmio +
+ edrm_plane->sspp_offset + SSPP_SRC_FORMAT);
+ writel_relaxed(SSPP_BGRA_PATTERN, master_kms->mmio +
+ edrm_plane->sspp_offset + SSPP_SRC_UNPACK_PATTERN);
+ yuv_format = false;
+ break;
+ case DRM_FORMAT_XRGB8888:
+ writel_relaxed(SSPP_XRGB8888_FORMAT, master_kms->mmio +
+ edrm_plane->sspp_offset + SSPP_SRC_FORMAT);
+ writel_relaxed(SSPP_ARGB_PATTERN, master_kms->mmio +
+ edrm_plane->sspp_offset + SSPP_SRC_UNPACK_PATTERN);
+ yuv_format = false;
+ break;
+ case DRM_FORMAT_XBGR8888:
+ writel_relaxed(SSPP_XRGB8888_FORMAT, master_kms->mmio +
+ edrm_plane->sspp_offset + SSPP_SRC_FORMAT);
+ writel_relaxed(SSPP_ABGR_PATTERN, master_kms->mmio +
+ edrm_plane->sspp_offset + SSPP_SRC_UNPACK_PATTERN);
+ yuv_format = false;
+ break;
+ case DRM_FORMAT_RGBX8888:
+ writel_relaxed(SSPP_XRGB8888_FORMAT, master_kms->mmio +
+ edrm_plane->sspp_offset + SSPP_SRC_FORMAT);
+ writel_relaxed(SSPP_RGBA_PATTERN, master_kms->mmio +
+ edrm_plane->sspp_offset + SSPP_SRC_UNPACK_PATTERN);
+ yuv_format = false;
+ break;
+ case DRM_FORMAT_RGB888:
+ writel_relaxed(SSPP_RGB888_FORMAT, master_kms->mmio +
+ edrm_plane->sspp_offset + SSPP_SRC_FORMAT);
+ writel_relaxed(0x00020001, master_kms->mmio +
+ edrm_plane->sspp_offset + SSPP_SRC_UNPACK_PATTERN);
+ yuv_format = false;
+ break;
+ case DRM_FORMAT_BGR888:
+ writel_relaxed(SSPP_RGB888_FORMAT, master_kms->mmio +
+ edrm_plane->sspp_offset + SSPP_SRC_FORMAT);
+ writel_relaxed(0x00010002, master_kms->mmio +
+ edrm_plane->sspp_offset + SSPP_SRC_UNPACK_PATTERN);
+ yuv_format = false;
+ break;
+ case DRM_FORMAT_RGB565:
+ writel_relaxed(SSPP_RGB565_FORMAT, master_kms->mmio +
+ edrm_plane->sspp_offset + SSPP_SRC_FORMAT);
+ writel_relaxed(0x00020001, master_kms->mmio +
+ edrm_plane->sspp_offset + SSPP_SRC_UNPACK_PATTERN);
+ yuv_format = false;
+ break;
+ case DRM_FORMAT_BGR565:
+ writel_relaxed(SSPP_RGB565_FORMAT, master_kms->mmio +
+ edrm_plane->sspp_offset + SSPP_SRC_FORMAT);
+ writel_relaxed(0x00010002, master_kms->mmio +
+ edrm_plane->sspp_offset + SSPP_SRC_UNPACK_PATTERN);
+ yuv_format = false;
+ break;
+ case DRM_FORMAT_ARGB1555:
+ writel_relaxed(SSPP_ARGB1555_FORMAT, master_kms->mmio +
+ edrm_plane->sspp_offset + SSPP_SRC_FORMAT);
+ writel_relaxed(SSPP_ARGB_PATTERN, master_kms->mmio +
+ edrm_plane->sspp_offset + SSPP_SRC_UNPACK_PATTERN);
+ yuv_format = false;
+ break;
+ case DRM_FORMAT_ABGR1555:
+ writel_relaxed(SSPP_ARGB1555_FORMAT, master_kms->mmio +
+ edrm_plane->sspp_offset + SSPP_SRC_FORMAT);
+ writel_relaxed(SSPP_ABGR_PATTERN, master_kms->mmio +
+ edrm_plane->sspp_offset + SSPP_SRC_UNPACK_PATTERN);
+ yuv_format = false;
+ break;
+ case DRM_FORMAT_RGBA5551:
+ writel_relaxed(SSPP_ARGB1555_FORMAT, master_kms->mmio +
+ edrm_plane->sspp_offset + SSPP_SRC_FORMAT);
+ writel_relaxed(SSPP_RGBA_PATTERN, master_kms->mmio +
+ edrm_plane->sspp_offset + SSPP_SRC_UNPACK_PATTERN);
+ yuv_format = false;
+ break;
+ case DRM_FORMAT_BGRA5551:
+ writel_relaxed(SSPP_ARGB1555_FORMAT, master_kms->mmio +
+ edrm_plane->sspp_offset + SSPP_SRC_FORMAT);
+ writel_relaxed(SSPP_BGRA_PATTERN, master_kms->mmio +
+ edrm_plane->sspp_offset + SSPP_SRC_UNPACK_PATTERN);
+ yuv_format = false;
+ break;
+ case DRM_FORMAT_XRGB1555:
+ writel_relaxed(SSPP_XRGB1555_FORMAT, master_kms->mmio +
+ edrm_plane->sspp_offset + SSPP_SRC_FORMAT);
+ writel_relaxed(SSPP_ARGB_PATTERN, master_kms->mmio +
+ edrm_plane->sspp_offset + SSPP_SRC_UNPACK_PATTERN);
+ yuv_format = false;
+ break;
+ case DRM_FORMAT_XBGR1555:
+ writel_relaxed(SSPP_XRGB1555_FORMAT, master_kms->mmio +
+ edrm_plane->sspp_offset + SSPP_SRC_FORMAT);
+ writel_relaxed(SSPP_ABGR_PATTERN, master_kms->mmio +
+ edrm_plane->sspp_offset + SSPP_SRC_UNPACK_PATTERN);
+ yuv_format = false;
+ break;
+ case DRM_FORMAT_RGBX5551:
+ writel_relaxed(SSPP_XRGB1555_FORMAT, master_kms->mmio +
+ edrm_plane->sspp_offset + SSPP_SRC_FORMAT);
+ writel_relaxed(SSPP_RGBA_PATTERN, master_kms->mmio +
+ edrm_plane->sspp_offset + SSPP_SRC_UNPACK_PATTERN);
+ yuv_format = false;
+ break;
+ case DRM_FORMAT_BGRX5551:
+ writel_relaxed(SSPP_XRGB1555_FORMAT, master_kms->mmio +
+ edrm_plane->sspp_offset + SSPP_SRC_FORMAT);
+ writel_relaxed(SSPP_BGRA_PATTERN, master_kms->mmio +
+ edrm_plane->sspp_offset + SSPP_SRC_UNPACK_PATTERN);
+ yuv_format = false;
+ break;
+ case DRM_FORMAT_ARGB4444:
+ writel_relaxed(SSPP_ARGB4444_FORMAT, master_kms->mmio +
+ edrm_plane->sspp_offset + SSPP_SRC_FORMAT);
+ writel_relaxed(SSPP_ARGB_PATTERN, master_kms->mmio +
+ edrm_plane->sspp_offset + SSPP_SRC_UNPACK_PATTERN);
+ yuv_format = false;
+ break;
+ case DRM_FORMAT_ABGR4444:
+ writel_relaxed(SSPP_ARGB4444_FORMAT, master_kms->mmio +
+ edrm_plane->sspp_offset + SSPP_SRC_FORMAT);
+ writel_relaxed(SSPP_ARGB_PATTERN, master_kms->mmio +
+ edrm_plane->sspp_offset + SSPP_SRC_UNPACK_PATTERN);
+ yuv_format = false;
+ break;
+ case DRM_FORMAT_RGBA4444:
+ writel_relaxed(SSPP_ARGB4444_FORMAT, master_kms->mmio +
+ edrm_plane->sspp_offset + SSPP_SRC_FORMAT);
+ writel_relaxed(SSPP_RGBA_PATTERN, master_kms->mmio +
+ edrm_plane->sspp_offset + SSPP_SRC_UNPACK_PATTERN);
+ yuv_format = false;
+ break;
+ case DRM_FORMAT_BGRA4444:
+ writel_relaxed(SSPP_ARGB4444_FORMAT, master_kms->mmio +
+ edrm_plane->sspp_offset + SSPP_SRC_FORMAT);
+ writel_relaxed(SSPP_BGRA_PATTERN, master_kms->mmio +
+ edrm_plane->sspp_offset + SSPP_SRC_UNPACK_PATTERN);
+ yuv_format = false;
+ break;
+ case DRM_FORMAT_XRGB4444:
+ writel_relaxed(SSPP_ARGB4444_FORMAT, master_kms->mmio +
+ edrm_plane->sspp_offset + SSPP_SRC_FORMAT);
+ writel_relaxed(SSPP_ARGB_PATTERN, master_kms->mmio +
+ edrm_plane->sspp_offset + SSPP_SRC_UNPACK_PATTERN);
+ yuv_format = false;
+ break;
+ case DRM_FORMAT_XBGR4444:
+ writel_relaxed(SSPP_XRGB4444_FORMAT, master_kms->mmio +
+ edrm_plane->sspp_offset + SSPP_SRC_FORMAT);
+ writel_relaxed(SSPP_ABGR_PATTERN, master_kms->mmio +
+ edrm_plane->sspp_offset + SSPP_SRC_UNPACK_PATTERN);
+ yuv_format = false;
+ break;
+ case DRM_FORMAT_RGBX4444:
+ writel_relaxed(SSPP_XRGB4444_FORMAT, master_kms->mmio +
+ edrm_plane->sspp_offset + SSPP_SRC_FORMAT);
+ writel_relaxed(SSPP_RGBA_PATTERN, master_kms->mmio +
+ edrm_plane->sspp_offset + SSPP_SRC_UNPACK_PATTERN);
+ yuv_format = false;
+ break;
+ case DRM_FORMAT_BGRX4444:
+ writel_relaxed(SSPP_XRGB4444_FORMAT, master_kms->mmio +
+ edrm_plane->sspp_offset + SSPP_SRC_FORMAT);
+ writel_relaxed(SSPP_BGRA_PATTERN, master_kms->mmio +
+ edrm_plane->sspp_offset + SSPP_SRC_UNPACK_PATTERN);
+ yuv_format = false;
+ break;
+ case DRM_FORMAT_NV12:
+ writel_relaxed(SSPP_NV12_FORMAT, master_kms->mmio +
+ edrm_plane->sspp_offset + SSPP_SRC_FORMAT);
+ writel_relaxed(0x00000201, master_kms->mmio +
+ edrm_plane->sspp_offset + SSPP_SRC_UNPACK_PATTERN);
+ yuv_format = true;
+ break;
+ case DRM_FORMAT_NV21:
+ writel_relaxed(SSPP_NV12_FORMAT, master_kms->mmio +
+ edrm_plane->sspp_offset + SSPP_SRC_FORMAT);
+ writel_relaxed(0x00000102, master_kms->mmio +
+ edrm_plane->sspp_offset + SSPP_SRC_UNPACK_PATTERN);
+ yuv_format = true;
+ break;
+ case DRM_FORMAT_NV16:
+ writel_relaxed(SSPP_NV16_FORMAT, master_kms->mmio +
+ edrm_plane->sspp_offset + SSPP_SRC_FORMAT);
+ writel_relaxed(0x00000201, master_kms->mmio +
+ edrm_plane->sspp_offset + SSPP_SRC_UNPACK_PATTERN);
+ yuv_format = true;
+ break;
+ case DRM_FORMAT_NV61:
+ writel_relaxed(SSPP_NV16_FORMAT, master_kms->mmio +
+ edrm_plane->sspp_offset + SSPP_SRC_FORMAT);
+ writel_relaxed(0x00000102, master_kms->mmio +
+ edrm_plane->sspp_offset + SSPP_SRC_UNPACK_PATTERN);
+ yuv_format = true;
+ break;
+ case DRM_FORMAT_VYUY:
+ writel_relaxed(SSPP_YUYV_FORMAT, master_kms->mmio +
+ edrm_plane->sspp_offset + SSPP_SRC_FORMAT);
+ writel_relaxed(0x00010002, master_kms->mmio +
+ edrm_plane->sspp_offset + SSPP_SRC_UNPACK_PATTERN);
+ yuv_format = true;
+ break;
+ case DRM_FORMAT_UYVY:
+ writel_relaxed(SSPP_YUYV_FORMAT, master_kms->mmio +
+ edrm_plane->sspp_offset + SSPP_SRC_FORMAT);
+ writel_relaxed(0x00020001, master_kms->mmio +
+ edrm_plane->sspp_offset + SSPP_SRC_UNPACK_PATTERN);
+ yuv_format = true;
+ break;
+ case DRM_FORMAT_YUYV:
+ writel_relaxed(SSPP_YUYV_FORMAT, master_kms->mmio +
+ edrm_plane->sspp_offset + SSPP_SRC_FORMAT);
+ writel_relaxed(0x02000100, master_kms->mmio +
+ edrm_plane->sspp_offset + SSPP_SRC_UNPACK_PATTERN);
+ yuv_format = true;
+ break;
+ case DRM_FORMAT_YVYU:
+ writel_relaxed(SSPP_YUYV_FORMAT, master_kms->mmio +
+ edrm_plane->sspp_offset + SSPP_SRC_FORMAT);
+ writel_relaxed(0x01000200, master_kms->mmio +
+ edrm_plane->sspp_offset + SSPP_SRC_UNPACK_PATTERN);
+ yuv_format = true;
+ break;
+ case DRM_FORMAT_YUV420:
+ writel_relaxed(SSPP_YUV420_FORMAT, master_kms->mmio +
+ edrm_plane->sspp_offset + SSPP_SRC_FORMAT);
+ writel_relaxed(0x00000102, master_kms->mmio +
+ edrm_plane->sspp_offset + SSPP_SRC_UNPACK_PATTERN);
+ yuv_format = true;
+ break;
+ case DRM_FORMAT_YVU420:
+ writel_relaxed(SSPP_YUV420_FORMAT, master_kms->mmio +
+ edrm_plane->sspp_offset + SSPP_SRC_FORMAT);
+ writel_relaxed(0x00000201, master_kms->mmio +
+ edrm_plane->sspp_offset + SSPP_SRC_UNPACK_PATTERN);
+ yuv_format = true;
+ break;
+ default:
+ pr_err("Format %x not supported in eDRM\n",
+ plane->state->fb->pixel_format);
+ return -EINVAL;
+ }
+
+ if (yuv_format)
+ edrm_plane_set_yuv_plane(plane, master_kms, lm_off);
+ else
+ edrm_plane_set_rgb_plane(plane, master_kms, lm_off);
+
+ img_size = (plane->state->fb->height << 16) | plane->state->fb->width;
+ src_xy = (plane->state->src_x << 16) | plane->state->src_y;
+ dst_xy = (plane->state->crtc_x << 16) | plane->state->crtc_y;
+
+ writel_relaxed(img_size, master_kms->mmio + edrm_plane->sspp_offset +
+ SSPP_SRC_SIZE);
+ writel_relaxed(src_xy, master_kms->mmio + edrm_plane->sspp_offset +
+ SSPP_SRC_XY);
+ writel_relaxed(img_size, master_kms->mmio + edrm_plane->sspp_offset +
+ SSPP_OUT_SIZE);
+ writel_relaxed(dst_xy, master_kms->mmio + edrm_plane->sspp_offset +
+ SSPP_OUT_XY);
+
+ return 0;
+}
void edrm_plane_destroy(struct drm_plane *plane)
{
@@ -69,20 +728,6 @@ static int edrm_plane_atomic_check(struct drm_plane *plane,
static void edrm_plane_atomic_update(struct drm_plane *plane,
struct drm_plane_state *state)
{
- struct drm_device *dev = plane->dev;
- struct msm_drm_private *priv = dev->dev_private;
- struct msm_kms *kms = priv->kms;
- struct msm_edrm_kms *edrm_kms;
- struct msm_drm_private *master_priv;
- struct sde_kms *master_kms;
- struct edrm_plane *edrm_plane;
- u32 img_size, src_xy, dst_xy;
- u32 ystride0, plane_addr;
-
- edrm_kms = to_edrm_kms(kms);
- master_priv = edrm_kms->master_dev->dev_private;
- master_kms = to_sde_kms(master_priv->kms);
-
if (!plane->state->crtc) {
pr_err("state crtc is null, skip pipe programming\n");
return;
@@ -91,45 +736,9 @@ static void edrm_plane_atomic_update(struct drm_plane *plane,
pr_err("state fb is null, skip pipe programming\n");
return;
}
- /* Support RGB format only */
- edrm_plane = to_edrm_plane(plane);
- img_size = (plane->state->fb->height << 16) | plane->state->fb->width;
- src_xy = (plane->state->src_x << 16) | plane->state->src_y;
- dst_xy = (plane->state->crtc_x << 16) | plane->state->crtc_y;
- ystride0 = (plane->state->fb->width *
- plane->state->fb->bits_per_pixel/8);
- plane_addr = msm_framebuffer_iova(plane->state->fb,
- edrm_plane->aspace, 0);
- if (!plane_addr) {
- pr_err("plane update failed to retrieve base addr\n");
- return;
- }
-
- /* rectangle register programming */
- writel_relaxed(plane_addr, master_kms->mmio + edrm_plane->sspp_offset +
- SSPP_SRC0_ADDR);
- writel_relaxed(img_size, master_kms->mmio + edrm_plane->sspp_offset +
- SSPP_SRC_SIZE);
- writel_relaxed(src_xy, master_kms->mmio + edrm_plane->sspp_offset +
- SSPP_SRC_XY);
- writel_relaxed(img_size, master_kms->mmio + edrm_plane->sspp_offset +
- SSPP_OUT_SIZE);
- writel_relaxed(dst_xy, master_kms->mmio + edrm_plane->sspp_offset +
- SSPP_OUT_XY);
- writel_relaxed(ystride0, master_kms->mmio + edrm_plane->sspp_offset +
- SSPP_SRC_YSTRIDE0);
- writel_relaxed(img_size, master_kms->mmio + edrm_plane->sspp_offset +
- PIPE_SW_PIXEL_EXT_C0_REQ);
- writel_relaxed(img_size, master_kms->mmio + edrm_plane->sspp_offset +
- PIPE_SW_PIXEL_EXT_C1C2_REQ);
- writel_relaxed(img_size, master_kms->mmio + edrm_plane->sspp_offset +
- PIPE_SW_PIXEL_EXT_C3_REQ);
- /* RGB888 format */
- writel_relaxed(SSPP_RGB888_FORMAT, master_kms->mmio +
- edrm_plane->sspp_offset + SSPP_SRC_FORMAT);
- writel_relaxed(SSPP_RGB_PATTERN, master_kms->mmio +
- edrm_plane->sspp_offset + SSPP_SRC_UNPACK_PATTERN);
+ if (edrm_plane_modeset(plane))
+ pr_err("Plane modeset failed\n");
}
/* Plane disable should setup the sspp to show a transparent frame
@@ -151,7 +760,7 @@ static void edrm_plane_atomic_disable(struct drm_plane *plane,
struct sde_kms *master_kms;
struct msm_edrm_display *display;
struct edrm_plane *edrm_plane;
- u32 lm_off, img_size, stride;
+ u32 img_size, stride, lm_off;
edrm_kms = to_edrm_kms(kms);
master_priv = edrm_kms->master_dev->dev_private;
@@ -176,21 +785,41 @@ static void edrm_plane_atomic_disable(struct drm_plane *plane,
SSPP_OUT_XY);
writel_relaxed(stride, master_kms->mmio + edrm_plane->sspp_offset +
SSPP_SRC_YSTRIDE0);
+ writel_relaxed(0x0, master_kms->mmio + edrm_plane->sspp_offset +
+ PIPE_SW_PIX_EXT_C0_LR);
+ writel_relaxed(0x0, master_kms->mmio + edrm_plane->sspp_offset +
+ PIPE_SW_PIX_EXT_C0_TB);
writel_relaxed(img_size, master_kms->mmio + edrm_plane->sspp_offset +
PIPE_SW_PIXEL_EXT_C0_REQ);
+ writel_relaxed(0x0, master_kms->mmio + edrm_plane->sspp_offset +
+ PIPE_SW_PIX_EXT_C1C2_LR);
+ writel_relaxed(0x0, master_kms->mmio + edrm_plane->sspp_offset +
+ PIPE_SW_PIX_EXT_C1C2_TB);
writel_relaxed(img_size, master_kms->mmio + edrm_plane->sspp_offset +
PIPE_SW_PIXEL_EXT_C1C2_REQ);
+ writel_relaxed(0x0, master_kms->mmio + edrm_plane->sspp_offset +
+ PIPE_SW_PIX_EXT_C3_LR);
+ writel_relaxed(0x0, master_kms->mmio + edrm_plane->sspp_offset +
+ PIPE_SW_PIX_EXT_C3_TB);
writel_relaxed(img_size, master_kms->mmio + edrm_plane->sspp_offset +
- PIPE_SW_PIXEL_EXT_C3_REQ);
+ PIPE_SW_PIXEL_EXT_C3_REQ);
/* RGB format */
writel_relaxed(SSPP_SOLID_FILL_FORMAT, master_kms->mmio +
edrm_plane->sspp_offset + SSPP_SRC_FORMAT);
- writel_relaxed(SSPP_RGB888_FORMAT, master_kms->mmio +
+ writel_relaxed(SSPP_ARGB_PATTERN, master_kms->mmio +
edrm_plane->sspp_offset + SSPP_SRC_UNPACK_PATTERN);
/* do a solid fill of transparent color */
writel_relaxed(0x0, master_kms->mmio + edrm_plane->sspp_offset +
SSPP_CONSTANT_COLOR);
+ writel_relaxed(LAYER_OP_ENABLE_ALPHA_BLEND, master_kms->mmio + lm_off
+ + LAYER_BLEND5_OP);
+
+ /* disable CSC */
+ writel_relaxed(0x0, master_kms->mmio + edrm_plane->sspp_offset +
+ PIPE_OP_MODE);
+ writel_relaxed(0x0, master_kms->mmio + edrm_plane->sspp_offset
+ + PIPE_VP_0_QSEED2_CONFIG);
}
static int edrm_plane_prepare_fb(struct drm_plane *plane,
@@ -238,11 +867,8 @@ static const struct drm_plane_helper_funcs edrm_plane_helper_funcs = {
.atomic_disable = edrm_plane_atomic_disable,
};
-static uint32_t edrm_plane_formats[] = {
- DRM_FORMAT_ARGB8888,
-};
-
-struct drm_plane *edrm_plane_init(struct drm_device *dev, int pipe)
+struct drm_plane *edrm_plane_init(struct drm_device *dev, int pipe,
+ u32 pipe_type)
{
struct msm_drm_private *priv;
struct msm_edrm_kms *edrm_kms;
@@ -257,12 +883,18 @@ struct drm_plane *edrm_plane_init(struct drm_device *dev, int pipe)
}
plane = &edrm_plane->base;
-
- ret = drm_universal_plane_init(dev, plane, 0,
- &edrm_plane_funcs,
- edrm_plane_formats,
- ARRAY_SIZE(edrm_plane_formats),
- DRM_PLANE_TYPE_PRIMARY);
+ if (pipe_type == SSPP_TYPE_VIG)
+ ret = drm_universal_plane_init(dev, plane, 0,
+ &edrm_plane_funcs,
+ edrm_plane_formats_YUV,
+ ARRAY_SIZE(edrm_plane_formats_YUV),
+ DRM_PLANE_TYPE_PRIMARY);
+ else
+ ret = drm_universal_plane_init(dev, plane, 0,
+ &edrm_plane_funcs,
+ edrm_plane_formats_RGB,
+ ARRAY_SIZE(edrm_plane_formats_RGB),
+ DRM_PLANE_TYPE_PRIMARY);
if (ret)
goto fail;
diff --git a/drivers/gpu/drm/msm/ekms/edrm_plane.h b/drivers/gpu/drm/msm/ekms/edrm_plane.h
index 1fa70ed65424..3136bb86d124 100644
--- a/drivers/gpu/drm/msm/ekms/edrm_plane.h
+++ b/drivers/gpu/drm/msm/ekms/edrm_plane.h
@@ -27,11 +27,12 @@ struct edrm_plane {
u32 sspp_offset;
u32 sspp_cfg_id;
u32 lm_stage;
+ u32 sspp_type;
};
int edrm_plane_flush(struct drm_plane *plane);
-struct drm_plane *edrm_plane_init(struct drm_device *dev, int id);
+struct drm_plane *edrm_plane_init(struct drm_device *dev, int id, u32 type);
void edrm_plane_destroy(struct drm_plane *plane);