RE: [PATCH 09/16] drm/amd/display: fbc state could not reach while enable fbc

2018-11-29 Thread Li, Roman
Unfortunately, not. I sent this patch to the reporter to try and it  didn't 
work.

- Roman

From: amd-gfx  On Behalf Of Deucher, 
Alexander
Sent: Thursday, November 29, 2018 11:27 AM
To: Li, Sun peng (Leo) ; amd-gfx@lists.freedesktop.org
Cc: Wu, Hersen 
Subject: Re: [PATCH 09/16] drm/amd/display: fbc state could not reach while 
enable fbc


Do you think this will fix this bug?

https://bugs.freedesktop.org/show_bug.cgi?id=108577

If so, we can re-enable fbc.



Alex


From: amd-gfx 
mailto:amd-gfx-boun...@lists.freedesktop.org>>
 on behalf of sunpeng...@amd.com<mailto:sunpeng...@amd.com> 
mailto:sunpeng...@amd.com>>
Sent: Thursday, November 29, 2018 10:52:16 AM
To: amd-gfx@lists.freedesktop.org<mailto:amd-gfx@lists.freedesktop.org>
Cc: Wu, Hersen
Subject: [PATCH 09/16] drm/amd/display: fbc state could not reach while enable 
fbc

From: hersen wu mailto:hersenxs...@amd.com>>

   [WHY] fbc is within the data path from memory to dce. while
   re-configure mc dmif, fbc should be enabled. otherwise, fbc
   may not be enabled properly.

   [HOW] before re-configure mc dmif, disable fbc, only after
   dmif re-configuration fully done, enable fbc again.

Signed-off-by: hersen wu mailto:hersenxs...@amd.com>>
Reviewed-by: Roman Li mailto:roman...@amd.com>>
Acked-by: Leo Li mailto:sunpeng...@amd.com>>
---
 .../drm/amd/display/dc/dce110/dce110_compressor.c  | 91 --
 .../amd/display/dc/dce110/dce110_hw_sequencer.c| 57 --
 drivers/gpu/drm/amd/display/dc/inc/compressor.h|  1 +
 3 files changed, 66 insertions(+), 83 deletions(-)

diff --git a/drivers/gpu/drm/amd/display/dc/dce110/dce110_compressor.c 
b/drivers/gpu/drm/amd/display/dc/dce110/dce110_compressor.c
index 1f7f250..52d50e2 100644
--- a/drivers/gpu/drm/amd/display/dc/dce110/dce110_compressor.c
+++ b/drivers/gpu/drm/amd/display/dc/dce110/dce110_compressor.c
@@ -64,65 +64,37 @@ static const struct dce110_compressor_reg_offsets 
reg_offsets[] = {

 static const uint32_t dce11_one_lpt_channel_max_resolution = 2560 * 1600;

-enum fbc_idle_force {
-   /* Bit 0 - Display registers updated */
-   FBC_IDLE_FORCE_DISPLAY_REGISTER_UPDATE = 0x0001,
-
-   /* Bit 2 - FBC_GRPH_COMP_EN register updated */
-   FBC_IDLE_FORCE_GRPH_COMP_EN = 0x0002,
-   /* Bit 3 - FBC_SRC_SEL register updated */
-   FBC_IDLE_FORCE_SRC_SEL_CHANGE = 0x0004,
-   /* Bit 4 - FBC_MIN_COMPRESSION register updated */
-   FBC_IDLE_FORCE_MIN_COMPRESSION_CHANGE = 0x0008,
-   /* Bit 5 - FBC_ALPHA_COMP_EN register updated */
-   FBC_IDLE_FORCE_ALPHA_COMP_EN = 0x0010,
-   /* Bit 6 - FBC_ZERO_ALPHA_CHUNK_SKIP_EN register updated */
-   FBC_IDLE_FORCE_ZERO_ALPHA_CHUNK_SKIP_EN = 0x0020,
-   /* Bit 7 - FBC_FORCE_COPY_TO_COMP_BUF register updated */
-   FBC_IDLE_FORCE_FORCE_COPY_TO_COMP_BUF = 0x0040,
-
-   /* Bit 24 - Memory write to region 0 defined by MC registers. */
-   FBC_IDLE_FORCE_MEMORY_WRITE_TO_REGION0 = 0x0100,
-   /* Bit 25 - Memory write to region 1 defined by MC registers */
-   FBC_IDLE_FORCE_MEMORY_WRITE_TO_REGION1 = 0x0200,
-   /* Bit 26 - Memory write to region 2 defined by MC registers */
-   FBC_IDLE_FORCE_MEMORY_WRITE_TO_REGION2 = 0x0400,
-   /* Bit 27 - Memory write to region 3 defined by MC registers. */
-   FBC_IDLE_FORCE_MEMORY_WRITE_TO_REGION3 = 0x0800,
-
-   /* Bit 28 - Memory write from any client other than MCIF */
-   FBC_IDLE_FORCE_MEMORY_WRITE_OTHER_THAN_MCIF = 0x1000,
-   /* Bit 29 - CG statics screen signal is inactive */
-   FBC_IDLE_FORCE_CG_STATIC_SCREEN_IS_INACTIVE = 0x2000,
-};
-
-
 static uint32_t align_to_chunks_number_per_line(uint32_t pixels)
 {
 return 256 * ((pixels + 255) / 256);
 }

-static void reset_lb_on_vblank(struct dc_context *ctx)
+static void reset_lb_on_vblank(struct compressor *compressor, uint32_t 
crtc_inst)
 {
-   uint32_t value, frame_count;
+   uint32_t value;
+   uint32_t frame_count;
+   uint32_t status_pos;
 uint32_t retry = 0;
-   uint32_t status_pos =
-   dm_read_reg(ctx, mmCRTC_STATUS_POSITION);
+   struct dce110_compressor *cp110 = TO_DCE110_COMPRESSOR(compressor);
+
+   cp110->offsets = reg_offsets[crtc_inst];
+
+   status_pos = dm_read_reg(compressor->ctx, 
DCP_REG(mmCRTC_STATUS_POSITION));


 /* Only if CRTC is enabled and counter is moving we wait for one 
frame. */
-   if (status_pos != dm_read_reg(ctx, mmCRTC_STATUS_POSITION)) {
+   if (status_pos != dm_read_reg(compressor->ctx, 
DCP_REG(mmCRTC_STATUS_POSITION))) {
 /* Resetting LB on VBlank */
-   value = dm_read_reg(ctx, mmLB_SYNC_RESET_SEL);
+   value = dm_read_reg(compressor->ctx, 
DCP_REG(mmLB_SYNC_RESET_SEL));
 set_reg_field_value(value, 3, LB_SYNC_RESET_SEL, 
LB_SY

Re: [PATCH 09/16] drm/amd/display: fbc state could not reach while enable fbc

2018-11-29 Thread Deucher, Alexander
Do you think this will fix this bug?

https://bugs.freedesktop.org/show_bug.cgi?id=108577

If so, we can re-enable fbc.


Alex


From: amd-gfx  on behalf of 
sunpeng...@amd.com 
Sent: Thursday, November 29, 2018 10:52:16 AM
To: amd-gfx@lists.freedesktop.org
Cc: Wu, Hersen
Subject: [PATCH 09/16] drm/amd/display: fbc state could not reach while enable 
fbc

From: hersen wu 

   [WHY] fbc is within the data path from memory to dce. while
   re-configure mc dmif, fbc should be enabled. otherwise, fbc
   may not be enabled properly.

   [HOW] before re-configure mc dmif, disable fbc, only after
   dmif re-configuration fully done, enable fbc again.

Signed-off-by: hersen wu 
Reviewed-by: Roman Li 
Acked-by: Leo Li 
---
 .../drm/amd/display/dc/dce110/dce110_compressor.c  | 91 --
 .../amd/display/dc/dce110/dce110_hw_sequencer.c| 57 --
 drivers/gpu/drm/amd/display/dc/inc/compressor.h|  1 +
 3 files changed, 66 insertions(+), 83 deletions(-)

diff --git a/drivers/gpu/drm/amd/display/dc/dce110/dce110_compressor.c 
b/drivers/gpu/drm/amd/display/dc/dce110/dce110_compressor.c
index 1f7f250..52d50e2 100644
--- a/drivers/gpu/drm/amd/display/dc/dce110/dce110_compressor.c
+++ b/drivers/gpu/drm/amd/display/dc/dce110/dce110_compressor.c
@@ -64,65 +64,37 @@ static const struct dce110_compressor_reg_offsets 
reg_offsets[] = {

 static const uint32_t dce11_one_lpt_channel_max_resolution = 2560 * 1600;

-enum fbc_idle_force {
-   /* Bit 0 - Display registers updated */
-   FBC_IDLE_FORCE_DISPLAY_REGISTER_UPDATE = 0x0001,
-
-   /* Bit 2 - FBC_GRPH_COMP_EN register updated */
-   FBC_IDLE_FORCE_GRPH_COMP_EN = 0x0002,
-   /* Bit 3 - FBC_SRC_SEL register updated */
-   FBC_IDLE_FORCE_SRC_SEL_CHANGE = 0x0004,
-   /* Bit 4 - FBC_MIN_COMPRESSION register updated */
-   FBC_IDLE_FORCE_MIN_COMPRESSION_CHANGE = 0x0008,
-   /* Bit 5 - FBC_ALPHA_COMP_EN register updated */
-   FBC_IDLE_FORCE_ALPHA_COMP_EN = 0x0010,
-   /* Bit 6 - FBC_ZERO_ALPHA_CHUNK_SKIP_EN register updated */
-   FBC_IDLE_FORCE_ZERO_ALPHA_CHUNK_SKIP_EN = 0x0020,
-   /* Bit 7 - FBC_FORCE_COPY_TO_COMP_BUF register updated */
-   FBC_IDLE_FORCE_FORCE_COPY_TO_COMP_BUF = 0x0040,
-
-   /* Bit 24 - Memory write to region 0 defined by MC registers. */
-   FBC_IDLE_FORCE_MEMORY_WRITE_TO_REGION0 = 0x0100,
-   /* Bit 25 - Memory write to region 1 defined by MC registers */
-   FBC_IDLE_FORCE_MEMORY_WRITE_TO_REGION1 = 0x0200,
-   /* Bit 26 - Memory write to region 2 defined by MC registers */
-   FBC_IDLE_FORCE_MEMORY_WRITE_TO_REGION2 = 0x0400,
-   /* Bit 27 - Memory write to region 3 defined by MC registers. */
-   FBC_IDLE_FORCE_MEMORY_WRITE_TO_REGION3 = 0x0800,
-
-   /* Bit 28 - Memory write from any client other than MCIF */
-   FBC_IDLE_FORCE_MEMORY_WRITE_OTHER_THAN_MCIF = 0x1000,
-   /* Bit 29 - CG statics screen signal is inactive */
-   FBC_IDLE_FORCE_CG_STATIC_SCREEN_IS_INACTIVE = 0x2000,
-};
-
-
 static uint32_t align_to_chunks_number_per_line(uint32_t pixels)
 {
 return 256 * ((pixels + 255) / 256);
 }

-static void reset_lb_on_vblank(struct dc_context *ctx)
+static void reset_lb_on_vblank(struct compressor *compressor, uint32_t 
crtc_inst)
 {
-   uint32_t value, frame_count;
+   uint32_t value;
+   uint32_t frame_count;
+   uint32_t status_pos;
 uint32_t retry = 0;
-   uint32_t status_pos =
-   dm_read_reg(ctx, mmCRTC_STATUS_POSITION);
+   struct dce110_compressor *cp110 = TO_DCE110_COMPRESSOR(compressor);
+
+   cp110->offsets = reg_offsets[crtc_inst];
+
+   status_pos = dm_read_reg(compressor->ctx, 
DCP_REG(mmCRTC_STATUS_POSITION));


 /* Only if CRTC is enabled and counter is moving we wait for one 
frame. */
-   if (status_pos != dm_read_reg(ctx, mmCRTC_STATUS_POSITION)) {
+   if (status_pos != dm_read_reg(compressor->ctx, 
DCP_REG(mmCRTC_STATUS_POSITION))) {
 /* Resetting LB on VBlank */
-   value = dm_read_reg(ctx, mmLB_SYNC_RESET_SEL);
+   value = dm_read_reg(compressor->ctx, 
DCP_REG(mmLB_SYNC_RESET_SEL));
 set_reg_field_value(value, 3, LB_SYNC_RESET_SEL, 
LB_SYNC_RESET_SEL);
 set_reg_field_value(value, 1, LB_SYNC_RESET_SEL, 
LB_SYNC_RESET_SEL2);
-   dm_write_reg(ctx, mmLB_SYNC_RESET_SEL, value);
+   dm_write_reg(compressor->ctx, DCP_REG(mmLB_SYNC_RESET_SEL), 
value);

-   frame_count = dm_read_reg(ctx, mmCRTC_STATUS_FRAME_COUNT);
+   frame_count = dm_read_reg(compressor->ctx, 
DCP_REG(mmCRTC_STATUS_FRAME_COUNT));


 for (retry = 1; retry > 0; retry--) {
-   if (frame_count != dm_read_reg(ctx, 
mmCRTC_STATUS_FRAME_COUNT))
+   if (frame_count != dm_read_reg(comp

[PATCH 09/16] drm/amd/display: fbc state could not reach while enable fbc

2018-11-29 Thread sunpeng.li
From: hersen wu 

   [WHY] fbc is within the data path from memory to dce. while
   re-configure mc dmif, fbc should be enabled. otherwise, fbc
   may not be enabled properly.

   [HOW] before re-configure mc dmif, disable fbc, only after
   dmif re-configuration fully done, enable fbc again.

Signed-off-by: hersen wu 
Reviewed-by: Roman Li 
Acked-by: Leo Li 
---
 .../drm/amd/display/dc/dce110/dce110_compressor.c  | 91 --
 .../amd/display/dc/dce110/dce110_hw_sequencer.c| 57 --
 drivers/gpu/drm/amd/display/dc/inc/compressor.h|  1 +
 3 files changed, 66 insertions(+), 83 deletions(-)

diff --git a/drivers/gpu/drm/amd/display/dc/dce110/dce110_compressor.c 
b/drivers/gpu/drm/amd/display/dc/dce110/dce110_compressor.c
index 1f7f250..52d50e2 100644
--- a/drivers/gpu/drm/amd/display/dc/dce110/dce110_compressor.c
+++ b/drivers/gpu/drm/amd/display/dc/dce110/dce110_compressor.c
@@ -64,65 +64,37 @@ static const struct dce110_compressor_reg_offsets 
reg_offsets[] = {
 
 static const uint32_t dce11_one_lpt_channel_max_resolution = 2560 * 1600;
 
-enum fbc_idle_force {
-   /* Bit 0 - Display registers updated */
-   FBC_IDLE_FORCE_DISPLAY_REGISTER_UPDATE = 0x0001,
-
-   /* Bit 2 - FBC_GRPH_COMP_EN register updated */
-   FBC_IDLE_FORCE_GRPH_COMP_EN = 0x0002,
-   /* Bit 3 - FBC_SRC_SEL register updated */
-   FBC_IDLE_FORCE_SRC_SEL_CHANGE = 0x0004,
-   /* Bit 4 - FBC_MIN_COMPRESSION register updated */
-   FBC_IDLE_FORCE_MIN_COMPRESSION_CHANGE = 0x0008,
-   /* Bit 5 - FBC_ALPHA_COMP_EN register updated */
-   FBC_IDLE_FORCE_ALPHA_COMP_EN = 0x0010,
-   /* Bit 6 - FBC_ZERO_ALPHA_CHUNK_SKIP_EN register updated */
-   FBC_IDLE_FORCE_ZERO_ALPHA_CHUNK_SKIP_EN = 0x0020,
-   /* Bit 7 - FBC_FORCE_COPY_TO_COMP_BUF register updated */
-   FBC_IDLE_FORCE_FORCE_COPY_TO_COMP_BUF = 0x0040,
-
-   /* Bit 24 - Memory write to region 0 defined by MC registers. */
-   FBC_IDLE_FORCE_MEMORY_WRITE_TO_REGION0 = 0x0100,
-   /* Bit 25 - Memory write to region 1 defined by MC registers */
-   FBC_IDLE_FORCE_MEMORY_WRITE_TO_REGION1 = 0x0200,
-   /* Bit 26 - Memory write to region 2 defined by MC registers */
-   FBC_IDLE_FORCE_MEMORY_WRITE_TO_REGION2 = 0x0400,
-   /* Bit 27 - Memory write to region 3 defined by MC registers. */
-   FBC_IDLE_FORCE_MEMORY_WRITE_TO_REGION3 = 0x0800,
-
-   /* Bit 28 - Memory write from any client other than MCIF */
-   FBC_IDLE_FORCE_MEMORY_WRITE_OTHER_THAN_MCIF = 0x1000,
-   /* Bit 29 - CG statics screen signal is inactive */
-   FBC_IDLE_FORCE_CG_STATIC_SCREEN_IS_INACTIVE = 0x2000,
-};
-
-
 static uint32_t align_to_chunks_number_per_line(uint32_t pixels)
 {
return 256 * ((pixels + 255) / 256);
 }
 
-static void reset_lb_on_vblank(struct dc_context *ctx)
+static void reset_lb_on_vblank(struct compressor *compressor, uint32_t 
crtc_inst)
 {
-   uint32_t value, frame_count;
+   uint32_t value;
+   uint32_t frame_count;
+   uint32_t status_pos;
uint32_t retry = 0;
-   uint32_t status_pos =
-   dm_read_reg(ctx, mmCRTC_STATUS_POSITION);
+   struct dce110_compressor *cp110 = TO_DCE110_COMPRESSOR(compressor);
+
+   cp110->offsets = reg_offsets[crtc_inst];
+
+   status_pos = dm_read_reg(compressor->ctx, 
DCP_REG(mmCRTC_STATUS_POSITION));
 
 
/* Only if CRTC is enabled and counter is moving we wait for one frame. 
*/
-   if (status_pos != dm_read_reg(ctx, mmCRTC_STATUS_POSITION)) {
+   if (status_pos != dm_read_reg(compressor->ctx, 
DCP_REG(mmCRTC_STATUS_POSITION))) {
/* Resetting LB on VBlank */
-   value = dm_read_reg(ctx, mmLB_SYNC_RESET_SEL);
+   value = dm_read_reg(compressor->ctx, 
DCP_REG(mmLB_SYNC_RESET_SEL));
set_reg_field_value(value, 3, LB_SYNC_RESET_SEL, 
LB_SYNC_RESET_SEL);
set_reg_field_value(value, 1, LB_SYNC_RESET_SEL, 
LB_SYNC_RESET_SEL2);
-   dm_write_reg(ctx, mmLB_SYNC_RESET_SEL, value);
+   dm_write_reg(compressor->ctx, DCP_REG(mmLB_SYNC_RESET_SEL), 
value);
 
-   frame_count = dm_read_reg(ctx, mmCRTC_STATUS_FRAME_COUNT);
+   frame_count = dm_read_reg(compressor->ctx, 
DCP_REG(mmCRTC_STATUS_FRAME_COUNT));
 
 
for (retry = 1; retry > 0; retry--) {
-   if (frame_count != dm_read_reg(ctx, 
mmCRTC_STATUS_FRAME_COUNT))
+   if (frame_count != dm_read_reg(compressor->ctx, 
DCP_REG(mmCRTC_STATUS_FRAME_COUNT)))
break;
udelay(10);
}
@@ -130,13 +102,11 @@ static void reset_lb_on_vblank(struct dc_context *ctx)
dm_error("Frame count did not increase for 100ms.\n");
 
/* Resetting LB on VBlank */
-   value = dm_read_reg(ctx, mmLB_SYNC_RESET_SEL);