Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]


Groups > linux.kernel > #1692356 > unrolled thread

[PATCH v5 0/7] drm/rockchip: add all full framework vop support

Started byMark Yao <mark.yao@rock-chips.com>
First post2017-07-20 04:50 +0200
Last post2017-07-26 03:00 +0200
Articles 11 — 4 participants

Back to article view | Back to linux.kernel


Contents

  [PATCH v5 0/7] drm/rockchip: add all full framework vop support Mark Yao <mark.yao@rock-chips.com> - 2017-07-20 04:50 +0200
    [PATCH v5 7/7] drm/rockchip: vop: rk3328: fix overlay abnormal Mark Yao <mark.yao@rock-chips.com> - 2017-07-20 04:50 +0200
    [PATCH v5 3/7] drm/rockchip: vop: move line_flag_num to interrupt registers Mark Yao <mark.yao@rock-chips.com> - 2017-07-20 04:50 +0200
      Re: [PATCH v5 3/7] drm/rockchip: vop: move line_flag_num to interrupt registers Heiko Stuebner <heiko@sntech.de> - 2017-07-26 00:00 +0200
        Re: [PATCH v5 3/7] drm/rockchip: vop: move line_flag_num to interrupt  registers Mark yao <mark.yao@rock-chips.com> - 2017-07-26 08:20 +0200
    [PATCH v5 6/7] dt-bindings: display: rockchip: fill Documents for vop series Mark Yao <mark.yao@rock-chips.com> - 2017-07-20 04:50 +0200
      Re: [PATCH v5 6/7] dt-bindings: display: rockchip: fill Documents  for vop series Rob Herring <robh@kernel.org> - 2017-07-24 22:00 +0200
        Re: [PATCH v5 6/7] dt-bindings: display: rockchip: fill Documents for  vop series Mark yao <mark.yao@rock-chips.com> - 2017-07-25 02:40 +0200
    [PATCH v5 1/7] drm/rockchip: vop: initialize registers directly Mark Yao <mark.yao@rock-chips.com> - 2017-07-20 04:50 +0200
      Re: [PATCH v5 1/7] drm/rockchip: vop: initialize registers directly Heiko Stuebner <heiko@sntech.de> - 2017-07-26 00:40 +0200
        Re: [PATCH v5 1/7] drm/rockchip: vop: initialize registers directly Mark yao <mark.yao@rock-chips.com> - 2017-07-26 03:00 +0200

#1692356 — [PATCH v5 0/7] drm/rockchip: add all full framework vop support

FromMark Yao <mark.yao@rock-chips.com>
Date2017-07-20 04:50 +0200
Subject[PATCH v5 0/7] drm/rockchip: add all full framework vop support
Message-ID<u59Hj-Sh-3@gated-at.bofh.it>
These patches try to make all current rockchip full framework vop works
on drm, fill missing vop on full framework.
Vop Full framework now has following vops:
IP version    chipname
      3.1           rk3288
      3.2           rk3368
      3.4           rk3366
      3.5           rk3399 big
      3.6           rk3399 lit
      3.7           rk3228
      3.8           rk3328

Group the vop register, it would make register  definition clearer and
more easily to reuse same group register define for difference vops.

Tested on rk3399 excavator board with kernel 4.13-rc1.

And other chips tested on rockchip kernel 4.4:
   https://github.com/rockchip-linux/kernel/tree/release-4.4/drivers/gpu/drm/rockchip

Changes in v5:
- clean document commit title
- move changes description out of docummit commit msg

Changes in v4:
- rebase to newest torvalds kernel, fix merge conflict 

Changes in v3:
- group vop register instead using VOP_REG_VER mechanism
- Explain more on patch commit message
- move write_relaxed flags to vop registers
- fix rk3328 overlay abnormal

Changes in v2:
- rename rk322x to rk3228
- correct some vop registers define

Mark Yao (7):
  drm/rockchip: vop: initialize registers directly
  drm/rockchip: vop: move write_relaxed flags to vop register
  drm/rockchip: vop: move line_flag_num to interrupt registers
  drm/rockchip: vop: group vop registers
  drm/rockchip: vop: add a series of vop support
  dt-bindings: display: rockchip: fill Documents for vop series
  drm/rockchip: vop: rk3328: fix overlay abnormal

 .../bindings/display/rockchip/rockchip-vop.txt     |   4 +
 drivers/gpu/drm/rockchip/rockchip_drm_vop.c        | 109 ++-
 drivers/gpu/drm/rockchip/rockchip_drm_vop.h        |  81 +-
 drivers/gpu/drm/rockchip/rockchip_vop_reg.c        | 374 ++++++---
 drivers/gpu/drm/rockchip/rockchip_vop_reg.h        | 905 ++++++++++++++++-----
 5 files changed, 1074 insertions(+), 399 deletions(-)

-- 
1.9.1

[toc] | [next] | [standalone]


#1692357 — [PATCH v5 7/7] drm/rockchip: vop: rk3328: fix overlay abnormal

FromMark Yao <mark.yao@rock-chips.com>
Date2017-07-20 04:50 +0200
Subject[PATCH v5 7/7] drm/rockchip: vop: rk3328: fix overlay abnormal
Message-ID<u59Hk-Sh-7@gated-at.bofh.it>
In reply to#1692356
It's a hardware bug, all window's overlay channel reset
value is same, hardware overlay would be die.

so we must initial difference id for each overlay channel.

The Channel register is supported on all vop will full design.
Following is the details for this register
VOP_WIN0_CTRL2
  bit[7:4] win_rid_win0_cbr
       axi read id of win0 cbr channel
  bit[3:0] win_rid_win0_yrgb
       axi read id of win0 yrgb channel

Signed-off-by: Mark Yao <mark.yao@rock-chips.com>
---
 drivers/gpu/drm/rockchip/rockchip_drm_vop.c | 2 ++
 drivers/gpu/drm/rockchip/rockchip_drm_vop.h | 1 +
 drivers/gpu/drm/rockchip/rockchip_vop_reg.c | 1 +
 3 files changed, 4 insertions(+)

diff --git a/drivers/gpu/drm/rockchip/rockchip_drm_vop.c b/drivers/gpu/drm/rockchip/rockchip_drm_vop.c
index 92d098b..e4b3388 100644
--- a/drivers/gpu/drm/rockchip/rockchip_drm_vop.c
+++ b/drivers/gpu/drm/rockchip/rockchip_drm_vop.c
@@ -1452,7 +1452,9 @@ static int vop_initial(struct vop *vop)
 
 	for (i = 0; i < vop_data->win_size; i++) {
 		const struct vop_win_data *win = &vop_data->win[i];
+		int channel = i * 2 + 1;
 
+		VOP_WIN_SET(vop, win, channel, (channel + 1) << 4 | channel);
 		VOP_WIN_SET(vop, win, enable, 0);
 		VOP_WIN_SET(vop, win, gate, 1);
 	}
diff --git a/drivers/gpu/drm/rockchip/rockchip_drm_vop.h b/drivers/gpu/drm/rockchip/rockchip_drm_vop.h
index 43d08c8..af1091f 100644
--- a/drivers/gpu/drm/rockchip/rockchip_drm_vop.h
+++ b/drivers/gpu/drm/rockchip/rockchip_drm_vop.h
@@ -141,6 +141,7 @@ struct vop_win_phy {
 
 	struct vop_reg dst_alpha_ctl;
 	struct vop_reg src_alpha_ctl;
+	struct vop_reg channel;
 };
 
 struct vop_win_data {
diff --git a/drivers/gpu/drm/rockchip/rockchip_vop_reg.c b/drivers/gpu/drm/rockchip/rockchip_vop_reg.c
index 99f8ba4..cc8d408 100644
--- a/drivers/gpu/drm/rockchip/rockchip_vop_reg.c
+++ b/drivers/gpu/drm/rockchip/rockchip_vop_reg.c
@@ -196,6 +196,7 @@
 	.uv_vir = VOP_REG(RK3288_WIN0_VIR, 0x3fff, 16),
 	.src_alpha_ctl = VOP_REG(RK3288_WIN0_SRC_ALPHA_CTRL, 0xff, 0),
 	.dst_alpha_ctl = VOP_REG(RK3288_WIN0_DST_ALPHA_CTRL, 0xff, 0),
+	.channel = VOP_REG(RK3288_WIN0_CTRL2, 0xff, 0),
 };
 
 static const struct vop_win_phy rk3288_win23_data = {
-- 
1.9.1

[toc] | [prev] | [next] | [standalone]


#1692359 — [PATCH v5 3/7] drm/rockchip: vop: move line_flag_num to interrupt registers

FromMark Yao <mark.yao@rock-chips.com>
Date2017-07-20 04:50 +0200
Subject[PATCH v5 3/7] drm/rockchip: vop: move line_flag_num to interrupt registers
Message-ID<u59Hk-Sh-11@gated-at.bofh.it>
In reply to#1692356
In the hardware design process, the design of line flags
register is associated with the interrupt register,
placing the line flags in the interrupt definition is
more reasonable, and it would make multi-vop define easilier.

Changes in v3:
- Explain more in details, introduce why we need this patch

Signed-off-by: Mark Yao <mark.yao@rock-chips.com>
Reviewed-by: Sean Paul <seanpaul@chromium.org>
---
 drivers/gpu/drm/rockchip/rockchip_drm_vop.c | 2 +-
 drivers/gpu/drm/rockchip/rockchip_drm_vop.h | 4 ++--
 drivers/gpu/drm/rockchip/rockchip_vop_reg.c | 8 ++++----
 3 files changed, 7 insertions(+), 7 deletions(-)

diff --git a/drivers/gpu/drm/rockchip/rockchip_drm_vop.c b/drivers/gpu/drm/rockchip/rockchip_drm_vop.c
index 784a2b7..4f6c7bc 100644
--- a/drivers/gpu/drm/rockchip/rockchip_drm_vop.c
+++ b/drivers/gpu/drm/rockchip/rockchip_drm_vop.c
@@ -982,7 +982,7 @@ static void vop_crtc_enable(struct drm_crtc *crtc)
 	VOP_CTRL_SET(vop, vact_st_end, val);
 	VOP_CTRL_SET(vop, vpost_st_end, val);
 
-	VOP_CTRL_SET(vop, line_flag_num[0], vact_end);
+	VOP_INTR_SET(vop, line_flag_num[0], vact_end);
 
 	clk_set_rate(vop->dclk, adjusted_mode->clock * 1000);
 
diff --git a/drivers/gpu/drm/rockchip/rockchip_drm_vop.h b/drivers/gpu/drm/rockchip/rockchip_drm_vop.h
index 084d3b2..9c5da32 100644
--- a/drivers/gpu/drm/rockchip/rockchip_drm_vop.h
+++ b/drivers/gpu/drm/rockchip/rockchip_drm_vop.h
@@ -59,8 +59,6 @@ struct vop_ctrl {
 	struct vop_reg hpost_st_end;
 	struct vop_reg vpost_st_end;
 
-	struct vop_reg line_flag_num[2];
-
 	struct vop_reg global_regdone_en;
 	struct vop_reg cfg_done;
 };
@@ -68,6 +66,8 @@ struct vop_ctrl {
 struct vop_intr {
 	const int *intrs;
 	uint32_t nintrs;
+
+	struct vop_reg line_flag_num[2];
 	struct vop_reg enable;
 	struct vop_reg clear;
 	struct vop_reg status;
diff --git a/drivers/gpu/drm/rockchip/rockchip_vop_reg.c b/drivers/gpu/drm/rockchip/rockchip_vop_reg.c
index 691dd42..064a46d 100644
--- a/drivers/gpu/drm/rockchip/rockchip_vop_reg.c
+++ b/drivers/gpu/drm/rockchip/rockchip_vop_reg.c
@@ -116,6 +116,7 @@
 static const struct vop_intr rk3036_intr = {
 	.intrs = rk3036_vop_intrs,
 	.nintrs = ARRAY_SIZE(rk3036_vop_intrs),
+	.line_flag_num[0] = VOP_REG(RK3036_INT_STATUS, 0xfff, 12),
 	.status = VOP_REG(RK3036_INT_STATUS, 0xf, 0),
 	.enable = VOP_REG(RK3036_INT_STATUS, 0xf, 4),
 	.clear = VOP_REG(RK3036_INT_STATUS, 0xf, 8),
@@ -129,7 +130,6 @@
 	.hact_st_end = VOP_REG(RK3036_DSP_HACT_ST_END, 0x1fff1fff, 0),
 	.vtotal_pw = VOP_REG(RK3036_DSP_VTOTAL_VS_END, 0x1fff1fff, 0),
 	.vact_st_end = VOP_REG(RK3036_DSP_VACT_ST_END, 0x1fff1fff, 0),
-	.line_flag_num[0] = VOP_REG(RK3036_INT_STATUS, 0xfff, 12),
 	.cfg_done = VOP_REG_SYNC(RK3036_REG_CFG_DONE, 0x1, 0),
 };
 
@@ -225,7 +225,6 @@
 	.vact_st_end = VOP_REG(RK3288_DSP_VACT_ST_END, 0x1fff1fff, 0),
 	.hpost_st_end = VOP_REG(RK3288_POST_DSP_HACT_INFO, 0x1fff1fff, 0),
 	.vpost_st_end = VOP_REG(RK3288_POST_DSP_VACT_INFO, 0x1fff1fff, 0),
-	.line_flag_num[0] = VOP_REG(RK3288_INTR_CTRL0, 0x1fff, 12),
 	.global_regdone_en = VOP_REG(RK3288_SYS_CTRL, 0x1, 11),
 	.cfg_done = VOP_REG_SYNC(RK3288_REG_CFG_DONE, 0x1, 0),
 };
@@ -257,6 +256,7 @@
 static const struct vop_intr rk3288_vop_intr = {
 	.intrs = rk3288_vop_intrs,
 	.nintrs = ARRAY_SIZE(rk3288_vop_intrs),
+	.line_flag_num[0] = VOP_REG(RK3288_INTR_CTRL0, 0x1fff, 12),
 	.status = VOP_REG(RK3288_INTR_CTRL0, 0xf, 0),
 	.enable = VOP_REG(RK3288_INTR_CTRL0, 0xf, 4),
 	.clear = VOP_REG(RK3288_INTR_CTRL0, 0xf, 8),
@@ -293,8 +293,6 @@
 	.vact_st_end = VOP_REG(RK3399_DSP_VACT_ST_END, 0x1fff1fff, 0),
 	.hpost_st_end = VOP_REG(RK3399_POST_DSP_HACT_INFO, 0x1fff1fff, 0),
 	.vpost_st_end = VOP_REG(RK3399_POST_DSP_VACT_INFO, 0x1fff1fff, 0),
-	.line_flag_num[0] = VOP_REG(RK3399_LINE_FLAG, 0xffff, 0),
-	.line_flag_num[1] = VOP_REG(RK3399_LINE_FLAG, 0xffff, 16),
 	.cfg_done = VOP_REG_MASK_SYNC(RK3399_REG_CFG_DONE, 0x1, 0),
 };
 
@@ -311,6 +309,8 @@
 static const struct vop_intr rk3399_vop_intr = {
 	.intrs = rk3399_vop_intrs,
 	.nintrs = ARRAY_SIZE(rk3399_vop_intrs),
+	.line_flag_num[0] = VOP_REG(RK3399_LINE_FLAG, 0xffff, 0),
+	.line_flag_num[1] = VOP_REG(RK3399_LINE_FLAG, 0xffff, 16),
 	.status = VOP_REG_MASK_SYNC(RK3399_INTR_STATUS0, 0xffff, 0),
 	.enable = VOP_REG_MASK_SYNC(RK3399_INTR_EN0, 0xffff, 0),
 	.clear = VOP_REG_MASK_SYNC(RK3399_INTR_CLEAR0, 0xffff, 0),
-- 
1.9.1

[toc] | [prev] | [next] | [standalone]


#1696623 — Re: [PATCH v5 3/7] drm/rockchip: vop: move line_flag_num to interrupt registers

FromHeiko Stuebner <heiko@sntech.de>
Date2017-07-26 00:00 +0200
SubjectRe: [PATCH v5 3/7] drm/rockchip: vop: move line_flag_num to interrupt registers
Message-ID<u7g1Z-8nQ-39@gated-at.bofh.it>
In reply to#1692359
Hi Mark,

Am Donnerstag, 20. Juli 2017, 10:43:32 CEST schrieb Mark Yao:
> In the hardware design process, the design of line flags
> register is associated with the interrupt register,
> placing the line flags in the interrupt definition is
> more reasonable, and it would make multi-vop define easilier.
> 
> Changes in v3:
> - Explain more in details, introduce why we need this patch
> 
> Signed-off-by: Mark Yao <mark.yao@rock-chips.com>
> Reviewed-by: Sean Paul <seanpaul@chromium.org>
> ---
>  drivers/gpu/drm/rockchip/rockchip_drm_vop.c | 2 +-
>  drivers/gpu/drm/rockchip/rockchip_drm_vop.h | 4 ++--
>  drivers/gpu/drm/rockchip/rockchip_vop_reg.c | 8 ++++----
>  3 files changed, 7 insertions(+), 7 deletions(-)
> 
> diff --git a/drivers/gpu/drm/rockchip/rockchip_drm_vop.c b/drivers/gpu/drm/rockchip/rockchip_drm_vop.c
> index 784a2b7..4f6c7bc 100644
> --- a/drivers/gpu/drm/rockchip/rockchip_drm_vop.c
> +++ b/drivers/gpu/drm/rockchip/rockchip_drm_vop.c
> @@ -982,7 +982,7 @@ static void vop_crtc_enable(struct drm_crtc *crtc)
>  	VOP_CTRL_SET(vop, vact_st_end, val);
>  	VOP_CTRL_SET(vop, vpost_st_end, val);
>  
> -	VOP_CTRL_SET(vop, line_flag_num[0], vact_end);
> +	VOP_INTR_SET(vop, line_flag_num[0], vact_end);

With patches applied up to this one I end up with

  CC [M]  drivers/gpu/drm/rockchip/rockchip_drm_vop.o
../drivers/gpu/drm/rockchip/rockchip_drm_vop.c: In function ‘vop_crtc_enable’:
../drivers/gpu/drm/rockchip/rockchip_drm_vop.c:985:46: error: macro "VOP_INTR_SET" requires 4 arguments, but only 3 given
  VOP_INTR_SET(vop, line_flag_num[0], vact_end);
                                              ^
../drivers/gpu/drm/rockchip/rockchip_drm_vop.c:985:2: error: ‘VOP_INTR_SET’ undeclared (first use in this function)
  VOP_INTR_SET(vop, line_flag_num[0], vact_end);
  ^~~~~~~~~~~~
../drivers/gpu/drm/rockchip/rockchip_drm_vop.c:985:2: note: each undeclared identifier is reported only once for each function it appears in

In patch4 you replace this again, with 
-	VOP_INTR_SET(vop, line_flag_num[0], vact_end);
+	VOP_REG_SET(vop, intr, line_flag_num[0], vact_end);

but this intermediate breakage should not happen, to keep bisectability.


Heiko

[toc] | [prev] | [next] | [standalone]


#1696803 — Re: [PATCH v5 3/7] drm/rockchip: vop: move line_flag_num to interrupt registers

FromMark yao <mark.yao@rock-chips.com>
Date2017-07-26 08:20 +0200
SubjectRe: [PATCH v5 3/7] drm/rockchip: vop: move line_flag_num to interrupt registers
Message-ID<u7nPP-56r-1@gated-at.bofh.it>
In reply to#1696623
On 2017年07月26日 05:54, Heiko Stuebner wrote:
> Hi Mark,
>
> Am Donnerstag, 20. Juli 2017, 10:43:32 CEST schrieb Mark Yao:
>> In the hardware design process, the design of line flags
>> register is associated with the interrupt register,
>> placing the line flags in the interrupt definition is
>> more reasonable, and it would make multi-vop define easilier.
>>
>> Changes in v3:
>> - Explain more in details, introduce why we need this patch
>>
>> Signed-off-by: Mark Yao <mark.yao@rock-chips.com>
>> Reviewed-by: Sean Paul <seanpaul@chromium.org>
>> ---
>>   drivers/gpu/drm/rockchip/rockchip_drm_vop.c | 2 +-
>>   drivers/gpu/drm/rockchip/rockchip_drm_vop.h | 4 ++--
>>   drivers/gpu/drm/rockchip/rockchip_vop_reg.c | 8 ++++----
>>   3 files changed, 7 insertions(+), 7 deletions(-)
>>
>> diff --git a/drivers/gpu/drm/rockchip/rockchip_drm_vop.c b/drivers/gpu/drm/rockchip/rockchip_drm_vop.c
>> index 784a2b7..4f6c7bc 100644
>> --- a/drivers/gpu/drm/rockchip/rockchip_drm_vop.c
>> +++ b/drivers/gpu/drm/rockchip/rockchip_drm_vop.c
>> @@ -982,7 +982,7 @@ static void vop_crtc_enable(struct drm_crtc *crtc)
>>   	VOP_CTRL_SET(vop, vact_st_end, val);
>>   	VOP_CTRL_SET(vop, vpost_st_end, val);
>>   
>> -	VOP_CTRL_SET(vop, line_flag_num[0], vact_end);
>> +	VOP_INTR_SET(vop, line_flag_num[0], vact_end);
> With patches applied up to this one I end up with
>
>    CC [M]  drivers/gpu/drm/rockchip/rockchip_drm_vop.o
> ../drivers/gpu/drm/rockchip/rockchip_drm_vop.c: In function ‘vop_crtc_enable’:
> ../drivers/gpu/drm/rockchip/rockchip_drm_vop.c:985:46: error: macro "VOP_INTR_SET" requires 4 arguments, but only 3 given
>    VOP_INTR_SET(vop, line_flag_num[0], vact_end);
>                                                ^
> ../drivers/gpu/drm/rockchip/rockchip_drm_vop.c:985:2: error: ‘VOP_INTR_SET’ undeclared (first use in this function)
>    VOP_INTR_SET(vop, line_flag_num[0], vact_end);
>    ^~~~~~~~~~~~
> ../drivers/gpu/drm/rockchip/rockchip_drm_vop.c:985:2: note: each undeclared identifier is reported only once for each function it appears in
>
> In patch4 you replace this again, with
> -	VOP_INTR_SET(vop, line_flag_num[0], vact_end);
> +	VOP_REG_SET(vop, intr, line_flag_num[0], vact_end);
>
> but this intermediate breakage should not happen, to keep bisectability.
>
>
> Heiko
>
>
>
Hi Heiko

Thanks for the test, will fix it at next version.

-- 
Mark Yao

[toc] | [prev] | [next] | [standalone]


#1692361 — [PATCH v5 6/7] dt-bindings: display: rockchip: fill Documents for vop series

FromMark Yao <mark.yao@rock-chips.com>
Date2017-07-20 04:50 +0200
Subject[PATCH v5 6/7] dt-bindings: display: rockchip: fill Documents for vop series
Message-ID<u59Hk-Sh-17@gated-at.bofh.it>
In reply to#1692356
Signed-off-by: Mark Yao <mark.yao@rock-chips.com>
---
Changes in v5:
- clean document commit title
- move changes description out of docummit commit msg

Changes in v2:
- rename rk322x to rk3228
- correct some vop registers define

 Documentation/devicetree/bindings/display/rockchip/rockchip-vop.txt | 4 ++++
 1 file changed, 4 insertions(+)

diff --git a/Documentation/devicetree/bindings/display/rockchip/rockchip-vop.txt b/Documentation/devicetree/bindings/display/rockchip/rockchip-vop.txt
index 9eb3f0a..5d835d9 100644
--- a/Documentation/devicetree/bindings/display/rockchip/rockchip-vop.txt
+++ b/Documentation/devicetree/bindings/display/rockchip/rockchip-vop.txt
@@ -8,8 +8,12 @@ Required properties:
 - compatible: value should be one of the following
 		"rockchip,rk3036-vop";
 		"rockchip,rk3288-vop";
+		"rockchip,rk3368-vop";
+		"rockchip,rk3366-vop";
 		"rockchip,rk3399-vop-big";
 		"rockchip,rk3399-vop-lit";
+		"rockchip,rk3228-vop";
+		"rockchip,rk3328-vop";
 
 - interrupts: should contain a list of all VOP IP block interrupts in the
 		 order: VSYNC, LCD_SYSTEM. The interrupt specifier
-- 
1.9.1

[toc] | [prev] | [next] | [standalone]


#1695059 — Re: [PATCH v5 6/7] dt-bindings: display: rockchip: fill Documents for vop series

FromRob Herring <robh@kernel.org>
Date2017-07-24 22:00 +0200
SubjectRe: [PATCH v5 6/7] dt-bindings: display: rockchip: fill Documents for vop series
Message-ID<u6RGi-12s-29@gated-at.bofh.it>
In reply to#1692361
On Thu, Jul 20, 2017 at 10:43:53AM +0800, Mark Yao wrote:
> Signed-off-by: Mark Yao <mark.yao@rock-chips.com>
> ---
> Changes in v5:
> - clean document commit title
> - move changes description out of docummit commit msg
> 
> Changes in v2:
> - rename rk322x to rk3228
> - correct some vop registers define
> 
>  Documentation/devicetree/bindings/display/rockchip/rockchip-vop.txt | 4 ++++
>  1 file changed, 4 insertions(+)

Acked-by: Rob Herring <robh@kernel.org>

[toc] | [prev] | [next] | [standalone]


#1695300 — Re: [PATCH v5 6/7] dt-bindings: display: rockchip: fill Documents for vop series

FromMark yao <mark.yao@rock-chips.com>
Date2017-07-25 02:40 +0200
SubjectRe: [PATCH v5 6/7] dt-bindings: display: rockchip: fill Documents for vop series
Message-ID<u6W3g-495-13@gated-at.bofh.it>
In reply to#1695059
On 2017年07月25日 03:53, Rob Herring wrote:
> On Thu, Jul 20, 2017 at 10:43:53AM +0800, Mark Yao wrote:
>> Signed-off-by: Mark Yao <mark.yao@rock-chips.com>
>> ---
>> Changes in v5:
>> - clean document commit title
>> - move changes description out of docummit commit msg
>>
>> Changes in v2:
>> - rename rk322x to rk3228
>> - correct some vop registers define
>>
>>   Documentation/devicetree/bindings/display/rockchip/rockchip-vop.txt | 4 ++++
>>   1 file changed, 4 insertions(+)
> Acked-by: Rob Herring <robh@kernel.org>
>
>
>
Thanks for the Ack. :-)

-- 
Mark Yao

[toc] | [prev] | [next] | [standalone]


#1692362 — [PATCH v5 1/7] drm/rockchip: vop: initialize registers directly

FromMark Yao <mark.yao@rock-chips.com>
Date2017-07-20 04:50 +0200
Subject[PATCH v5 1/7] drm/rockchip: vop: initialize registers directly
Message-ID<u59Hk-Sh-23@gated-at.bofh.it>
In reply to#1692356
At present we are using init_table to initialize some
registers, but the Register init table use un-document define,
it is unreadable, and sometimes we only want to update tiny
bits, init table method is not friendly, it's diffcult to
reuse for difference chips.

To make it clean, initialize registers directly, and drops
init_table mechanism out.

Changes in v3:
- Explain more in details

Signed-off-by: Mark Yao <mark.yao@rock-chips.com>
---
 drivers/gpu/drm/rockchip/rockchip_drm_vop.c |  6 ++--
 drivers/gpu/drm/rockchip/rockchip_drm_vop.h | 10 ++-----
 drivers/gpu/drm/rockchip/rockchip_vop_reg.c | 43 +++--------------------------
 3 files changed, 10 insertions(+), 49 deletions(-)

diff --git a/drivers/gpu/drm/rockchip/rockchip_drm_vop.c b/drivers/gpu/drm/rockchip/rockchip_drm_vop.c
index 5d45033..81164d6 100644
--- a/drivers/gpu/drm/rockchip/rockchip_drm_vop.c
+++ b/drivers/gpu/drm/rockchip/rockchip_drm_vop.c
@@ -1395,7 +1395,6 @@ static void vop_destroy_crtc(struct vop *vop)
 static int vop_initial(struct vop *vop)
 {
 	const struct vop_data *vop_data = vop->data;
-	const struct vop_reg_data *init_table = vop_data->init_table;
 	struct reset_control *ahb_rst;
 	int i, ret;
 
@@ -1455,13 +1454,14 @@ static int vop_initial(struct vop *vop)
 
 	memcpy(vop->regsbak, vop->regs, vop->len);
 
-	for (i = 0; i < vop_data->table_size; i++)
-		vop_writel(vop, init_table[i].offset, init_table[i].value);
+	VOP_CTRL_SET(vop, global_regdone_en, 1);
+	VOP_CTRL_SET(vop, dsp_blank, 0);
 
 	for (i = 0; i < vop_data->win_size; i++) {
 		const struct vop_win_data *win = &vop_data->win[i];
 
 		VOP_WIN_SET(vop, win, enable, 0);
+		VOP_WIN_SET(vop, win, gate, 1);
 	}
 
 	vop_cfg_done(vop);
diff --git a/drivers/gpu/drm/rockchip/rockchip_drm_vop.h b/drivers/gpu/drm/rockchip/rockchip_drm_vop.h
index 9979fd0..084d3b2 100644
--- a/drivers/gpu/drm/rockchip/rockchip_drm_vop.h
+++ b/drivers/gpu/drm/rockchip/rockchip_drm_vop.h
@@ -24,11 +24,6 @@ enum vop_data_format {
 	VOP_FMT_YUV444SP,
 };
 
-struct vop_reg_data {
-	uint32_t offset;
-	uint32_t value;
-};
-
 struct vop_reg {
 	uint32_t offset;
 	uint32_t shift;
@@ -46,6 +41,7 @@ struct vop_ctrl {
 	struct vop_reg hdmi_en;
 	struct vop_reg mipi_en;
 	struct vop_reg dp_en;
+	struct vop_reg dsp_blank;
 	struct vop_reg out_mode;
 	struct vop_reg dither_down;
 	struct vop_reg dither_up;
@@ -65,6 +61,7 @@ struct vop_ctrl {
 
 	struct vop_reg line_flag_num[2];
 
+	struct vop_reg global_regdone_en;
 	struct vop_reg cfg_done;
 };
 
@@ -115,6 +112,7 @@ struct vop_win_phy {
 	uint32_t nformats;
 
 	struct vop_reg enable;
+	struct vop_reg gate;
 	struct vop_reg format;
 	struct vop_reg rb_swap;
 	struct vop_reg act_info;
@@ -136,8 +134,6 @@ struct vop_win_data {
 };
 
 struct vop_data {
-	const struct vop_reg_data *init_table;
-	unsigned int table_size;
 	const struct vop_ctrl *ctrl;
 	const struct vop_intr *intr;
 	const struct vop_win_data *win;
diff --git a/drivers/gpu/drm/rockchip/rockchip_vop_reg.c b/drivers/gpu/drm/rockchip/rockchip_vop_reg.c
index bafd698..00e9d79 100644
--- a/drivers/gpu/drm/rockchip/rockchip_vop_reg.c
+++ b/drivers/gpu/drm/rockchip/rockchip_vop_reg.c
@@ -127,13 +127,7 @@
 	.cfg_done = VOP_REG(RK3036_REG_CFG_DONE, 0x1, 0),
 };
 
-static const struct vop_reg_data rk3036_vop_init_reg_table[] = {
-	{RK3036_DSP_CTRL1, 0x00000000},
-};
-
 static const struct vop_data rk3036_vop = {
-	.init_table = rk3036_vop_init_reg_table,
-	.table_size = ARRAY_SIZE(rk3036_vop_init_reg_table),
 	.ctrl = &rk3036_ctrl_data,
 	.intr = &rk3036_intr,
 	.win = rk3036_vop_win_data,
@@ -193,7 +187,8 @@
 static const struct vop_win_phy rk3288_win23_data = {
 	.data_formats = formats_win_lite,
 	.nformats = ARRAY_SIZE(formats_win_lite),
-	.enable = VOP_REG(RK3288_WIN2_CTRL0, 0x1, 0),
+	.enable = VOP_REG(RK3288_WIN2_CTRL0, 0x1, 4),
+	.gate = VOP_REG(RK3288_WIN2_CTRL0, 0x1, 0),
 	.format = VOP_REG(RK3288_WIN2_CTRL0, 0x7, 1),
 	.rb_swap = VOP_REG(RK3288_WIN2_CTRL0, 0x1, 12),
 	.dsp_info = VOP_REG(RK3288_WIN2_DSP_INFO0, 0x0fff0fff, 0),
@@ -215,6 +210,7 @@
 	.dither_down = VOP_REG(RK3288_DSP_CTRL1, 0xf, 1),
 	.dither_up = VOP_REG(RK3288_DSP_CTRL1, 0x1, 6),
 	.data_blank = VOP_REG(RK3288_DSP_CTRL0, 0x1, 19),
+	.dsp_blank = VOP_REG(RK3288_DSP_CTRL0, 0x3, 18),
 	.out_mode = VOP_REG(RK3288_DSP_CTRL0, 0xf, 0),
 	.pin_pol = VOP_REG(RK3288_DSP_CTRL0, 0xf, 4),
 	.htotal_pw = VOP_REG(RK3288_DSP_HTOTAL_HS_END, 0x1fff1fff, 0),
@@ -224,22 +220,10 @@
 	.hpost_st_end = VOP_REG(RK3288_POST_DSP_HACT_INFO, 0x1fff1fff, 0),
 	.vpost_st_end = VOP_REG(RK3288_POST_DSP_VACT_INFO, 0x1fff1fff, 0),
 	.line_flag_num[0] = VOP_REG(RK3288_INTR_CTRL0, 0x1fff, 12),
+	.global_regdone_en = VOP_REG(RK3288_SYS_CTRL, 0x1, 11),
 	.cfg_done = VOP_REG(RK3288_REG_CFG_DONE, 0x1, 0),
 };
 
-static const struct vop_reg_data rk3288_init_reg_table[] = {
-	{RK3288_SYS_CTRL, 0x00c00000},
-	{RK3288_DSP_CTRL0, 0x00000000},
-	{RK3288_WIN0_CTRL0, 0x00000080},
-	{RK3288_WIN1_CTRL0, 0x00000080},
-	/* TODO: Win2/3 support multiple area function, but we haven't found
-	 * a suitable way to use it yet, so let's just use them as other windows
-	 * with only area 0 enabled.
-	 */
-	{RK3288_WIN2_CTRL0, 0x00000010},
-	{RK3288_WIN3_CTRL0, 0x00000010},
-};
-
 /*
  * Note: rk3288 has a dedicated 'cursor' window, however, that window requires
  * special support to get alpha blending working.  For now, just use overlay
@@ -273,8 +257,6 @@
 };
 
 static const struct vop_data rk3288_vop = {
-	.init_table = rk3288_init_reg_table,
-	.table_size = ARRAY_SIZE(rk3288_init_reg_table),
 	.feature = VOP_FEATURE_OUTPUT_RGB10,
 	.intr = &rk3288_vop_intr,
 	.ctrl = &rk3288_ctrl_data,
@@ -328,22 +310,7 @@
 	.clear = VOP_REG_MASK(RK3399_INTR_CLEAR0, 0xffff, 0),
 };
 
-static const struct vop_reg_data rk3399_init_reg_table[] = {
-	{RK3399_SYS_CTRL, 0x2000f800},
-	{RK3399_DSP_CTRL0, 0x00000000},
-	{RK3399_WIN0_CTRL0, 0x00000080},
-	{RK3399_WIN1_CTRL0, 0x00000080},
-	/* TODO: Win2/3 support multiple area function, but we haven't found
-	 * a suitable way to use it yet, so let's just use them as other windows
-	 * with only area 0 enabled.
-	 */
-	{RK3399_WIN2_CTRL0, 0x00000010},
-	{RK3399_WIN3_CTRL0, 0x00000010},
-};
-
 static const struct vop_data rk3399_vop_big = {
-	.init_table = rk3399_init_reg_table,
-	.table_size = ARRAY_SIZE(rk3399_init_reg_table),
 	.feature = VOP_FEATURE_OUTPUT_RGB10,
 	.intr = &rk3399_vop_intr,
 	.ctrl = &rk3399_ctrl_data,
@@ -362,8 +329,6 @@
 };
 
 static const struct vop_data rk3399_vop_lit = {
-	.init_table = rk3399_init_reg_table,
-	.table_size = ARRAY_SIZE(rk3399_init_reg_table),
 	.intr = &rk3399_vop_intr,
 	.ctrl = &rk3399_ctrl_data,
 	/*
-- 
1.9.1

[toc] | [prev] | [next] | [standalone]


#1696639 — Re: [PATCH v5 1/7] drm/rockchip: vop: initialize registers directly

FromHeiko Stuebner <heiko@sntech.de>
Date2017-07-26 00:40 +0200
SubjectRe: [PATCH v5 1/7] drm/rockchip: vop: initialize registers directly
Message-ID<u7gEF-op-17@gated-at.bofh.it>
In reply to#1692362
Hi Mark,

Am Donnerstag, 20. Juli 2017, 10:43:22 CEST schrieb Mark Yao:
> At present we are using init_table to initialize some
> registers, but the Register init table use un-document define,
> it is unreadable, and sometimes we only want to update tiny
> bits, init table method is not friendly, it's diffcult to
> reuse for difference chips.
> 
> To make it clean, initialize registers directly, and drops
> init_table mechanism out.
> 
> Changes in v3:
> - Explain more in details
> 
> Signed-off-by: Mark Yao <mark.yao@rock-chips.com>

[...]

> diff --git a/drivers/gpu/drm/rockchip/rockchip_vop_reg.c b/drivers/gpu/drm/rockchip/rockchip_vop_reg.c
> index bafd698..00e9d79 100644
> --- a/drivers/gpu/drm/rockchip/rockchip_vop_reg.c
> +++ b/drivers/gpu/drm/rockchip/rockchip_vop_reg.c
> @@ -127,13 +127,7 @@
>  	.cfg_done = VOP_REG(RK3036_REG_CFG_DONE, 0x1, 0),
>  };
>  
> -static const struct vop_reg_data rk3036_vop_init_reg_table[] = {
> -	{RK3036_DSP_CTRL1, 0x00000000},
> -};
> -
>  static const struct vop_data rk3036_vop = {
> -	.init_table = rk3036_vop_init_reg_table,
> -	.table_size = ARRAY_SIZE(rk3036_vop_init_reg_table),
>  	.ctrl = &rk3036_ctrl_data,
>  	.intr = &rk3036_intr,
>  	.win = rk3036_vop_win_data,

This seems to break vop initialization on my rk3036 kylin board.

Before, kylin was able to bring output to the hdmi but with this
patch applied this stops working. As the init-value is to zero it seems
there is still something turned on, that should be turned off instead.

rk3288 seems to stay in working condition though.


Heiko

[toc] | [prev] | [next] | [standalone]


#1696704 — Re: [PATCH v5 1/7] drm/rockchip: vop: initialize registers directly

FromMark yao <mark.yao@rock-chips.com>
Date2017-07-26 03:00 +0200
SubjectRe: [PATCH v5 1/7] drm/rockchip: vop: initialize registers directly
Message-ID<u7iQa-1Gq-9@gated-at.bofh.it>
In reply to#1696639
On 2017年07月26日 06:36, Heiko Stuebner wrote:
> Hi Mark,
>
> Am Donnerstag, 20. Juli 2017, 10:43:22 CEST schrieb Mark Yao:
>> At present we are using init_table to initialize some
>> registers, but the Register init table use un-document define,
>> it is unreadable, and sometimes we only want to update tiny
>> bits, init table method is not friendly, it's diffcult to
>> reuse for difference chips.
>>
>> To make it clean, initialize registers directly, and drops
>> init_table mechanism out.
>>
>> Changes in v3:
>> - Explain more in details
>>
>> Signed-off-by: Mark Yao <mark.yao@rock-chips.com>
> [...]
>
>> diff --git a/drivers/gpu/drm/rockchip/rockchip_vop_reg.c b/drivers/gpu/drm/rockchip/rockchip_vop_reg.c
>> index bafd698..00e9d79 100644
>> --- a/drivers/gpu/drm/rockchip/rockchip_vop_reg.c
>> +++ b/drivers/gpu/drm/rockchip/rockchip_vop_reg.c
>> @@ -127,13 +127,7 @@
>>   	.cfg_done = VOP_REG(RK3036_REG_CFG_DONE, 0x1, 0),
>>   };
>>   
>> -static const struct vop_reg_data rk3036_vop_init_reg_table[] = {
>> -	{RK3036_DSP_CTRL1, 0x00000000},
>> -};
>> -
>>   static const struct vop_data rk3036_vop = {
>> -	.init_table = rk3036_vop_init_reg_table,
>> -	.table_size = ARRAY_SIZE(rk3036_vop_init_reg_table),
>>   	.ctrl = &rk3036_ctrl_data,
>>   	.intr = &rk3036_intr,
>>   	.win = rk3036_vop_win_data,
> This seems to break vop initialization on my rk3036 kylin board.
>
> Before, kylin was able to bring output to the hdmi but with this
> patch applied this stops working. As the init-value is to zero it seems
> there is still something turned on, that should be turned off instead.
>
> rk3288 seems to stay in working condition though.
>
>
> Heiko
>
> _______________________________________________
> Linux-rockchip mailing list
> Linux-rockchip@lists.infradead.org
> http://lists.infradead.org/mailman/listinfo/linux-rockchip
>
>
>
Hi Heiko

Thanks for your testing on rk3036 board.

I research the init table on rk3036, the dsp_blank reset value is 1, we need set the register to zero.

So I think not working problem can be fixed by following change:

     drivers/gpu/drm/rockchip/rockchip_vop_reg.c:
     static const struct vop_ctrl rk3036_ctrl_data = {
             .standby = VOP_REG(RK3036_SYS_CTRL, 0x1, 30),
     +       .dsp_blank = VOP_REG(RK3036_DSP_CTRL1, 0x1, 24),
             .out_mode = VOP_REG(RK3036_DSP_CTRL0, 0xf, 0),
             .pin_pol = VOP_REG(RK3036_DSP_CTRL0, 0xf, 4),
             .htotal_pw = VOP_REG(RK3036_DSP_HTOTAL_HS_END, 0x1fff1fff, 0),

-- 
Mark Yao

[toc] | [prev] | [standalone]


Back to top | Article view | linux.kernel


csiph-web