[PATCH] drm/amdgpu: validate the parameters of amdgpu_vm_bo_clear_mappings

2024-04-10 Thread xinhui pan
Ensure there is no address overlapping.

Reported-by: Vlad Stolyarov 
Signed-off-by: xinhui pan 
---
 drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c | 6 ++
 1 file changed, 6 insertions(+)

diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c 
b/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c
index 8af3f0fd3073..f1315a854192 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c
@@ -1852,6 +1852,12 @@ int amdgpu_vm_bo_clear_mappings(struct amdgpu_device 
*adev,
LIST_HEAD(removed);
uint64_t eaddr;
 
+   /* validate the parameters */
+   if (saddr & ~PAGE_MASK || size & ~PAGE_MASK)
+   return -EINVAL;
+   if (saddr + size <= saddr)
+   return -EINVAL;
+
eaddr = saddr + size - 1;
saddr /= AMDGPU_GPU_PAGE_SIZE;
eaddr /= AMDGPU_GPU_PAGE_SIZE;
-- 
2.34.1



[PATCH] amd/kfd: cancle work iterms at ih_wq in kfd_interrupt_exit

2024-04-10 Thread Xiaogang . Chen
From: Xiaogang Chen 

When kfd/amdgpu driver is tearing down cannot handle callback from
ih_wq. If there is still work items left cancle them instead of flush
that would wait until they got served.

Signed-off-by: Xiaogang Chen
---
 drivers/gpu/drm/amd/amdkfd/kfd_interrupt.c | 7 ---
 1 file changed, 4 insertions(+), 3 deletions(-)

diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_interrupt.c 
b/drivers/gpu/drm/amd/amdkfd/kfd_interrupt.c
index 9b6b6e882593..1847b9290a84 100644
--- a/drivers/gpu/drm/amd/amdkfd/kfd_interrupt.c
+++ b/drivers/gpu/drm/amd/amdkfd/kfd_interrupt.c
@@ -98,11 +98,12 @@ void kfd_interrupt_exit(struct kfd_node *node)
spin_unlock_irqrestore(>interrupt_lock, flags);
 
/*
-* flush_work ensures that there are no outstanding
-* work-queue items that will access interrupt_ring. New work items
+* cancel work items still at ih_wq ensures that there are no 
outstanding
+* work-queue items that will access interrupt_ring. At this stage 
kfd/amd
+* driver is tearing down, cannot handle call back from wq. New work 
itemst
 * can't be created because we stopped interrupt handling above.
 */
-   flush_workqueue(node->ih_wq);
+   cancel_work(>interrupt_work);
 
destroy_workqueue(node->ih_wq);
 
-- 
2.25.1



[pull] amdgpu, amdkfd drm-fixes-6.9

2024-04-10 Thread Alex Deucher
Hi Dave, Sima,

Fixes for 6.9.  Two weeks worth.  There is a fairly big update for SMU 14.0.1,
but that is a new IP for 6.9 so it should be isolated to that.

The following changes since commit 718c4fb221dbeff9072810841b949413c5ffc345:

  nouveau: fix devinit paths to only handle display on GSP. (2024-04-09 
13:14:13 +1000)

are available in the Git repository at:

  https://gitlab.freedesktop.org/agd5f/linux.git 
tags/amd-drm-fixes-6.9-2024-04-10

for you to fetch changes up to 6dba20d23e85034901ccb765a7ca71199bcca4df:

  drm/amdgpu: differentiate external rev id for gfx 11.5.0 (2024-04-10 00:00:32 
-0400)


amd-drm-fixes-6.9-2024-04-10:

amdgpu:
- GPU reset fixes
- Fix some confusing logging
- UMSCH fix
- Aborted suspend fix
- DCN 3.5 fixes
- S4 fix
- MES logging fixes
- SMU 14 fixes
- SDMA 4.4.2 fix
- KASAN fix
- SMU 13.0.10 fix
- VCN partition fix
- GFX11 fixes
- DWB fixes
- Plane handling fix
- FAMS fix
- DCN 3.1.6 fix
- VSC SDP fixes
- OLED panel fix
- GFX 11.5 fix

amdkfd:
- GPU reset fixes


Alex Deucher (1):
  drm/amdgpu: always force full reset for SOC21

Alex Hung (2):
  drm/amd/display: Skip on writeback when it's not applicable
  drm/amd/display: Return max resolution supported by DWB

Dillon Varone (1):
  drm/amd/display: Do not recursively call manual trigger programming

Fudongwang (1):
  drm/amd/display: fix disable otg wa logic in DCN316

Harish Kasiviswanathan (1):
  drm/amdkfd: Reset GPU on queue preemption failure

Harry Wentland (2):
  drm/amd/display: Program VSC SDP colorimetry for all DP sinks >= 1.4
  drm/amd/display: Set VSC SDP Colorimetry same way for MST and SST

Kenneth Feng (1):
  drm/amd/pm: fix the high voltage issue after unload

Lang Yu (1):
  drm/amdgpu/umsch: reinitialize write pointer in hw init

Li Ma (1):
  drm/amd/display: add DCN 351 version for microcode load

Lijo Lazar (3):
  drm/amdgpu: Refine IB schedule error logging
  drm/amdgpu: Reset dGPU if suspend got aborted
  drm/amdgpu: Fix VCN allocation in CPX partition

Tao Zhou (1):
  drm/amdgpu: implement IRQ_STATE_ENABLE for SDMA v4.4.2

Tim Huang (2):
  drm/amd/pm: fixes a random hang in S4 for SMU v13.0.4/11
  drm/amdgpu: fix incorrect number of active RBs for gfx11

Wenjing Liu (1):
  drm/amd/display: always reset ODM mode in context when adding first plane

Yifan Zhang (2):
  drm/amdgpu: add smu 14.0.1 discovery support
  drm/amdgpu: differentiate external rev id for gfx 11.5.0

ZhenGuo Yin (1):
  drm/amdgpu: clear set_q_mode_offs when VM changed

Zhigang Luo (1):
  amd/amdkfd: sync all devices to wait all processes being evicted

Zhongwei (1):
  drm/amd/display: Adjust dprefclk by down spread percentage.

lima1002 (1):
  drm/amd/swsmu: Update smu v14.0.0 headers to be 14.0.1 compatible

shaoyunl (2):
  drm/amdgpu : Add mes_log_enable to control mes log feature
  drm/amdgpu : Increase the mes log buffer size as per new MES FW version

 drivers/gpu/drm/amd/amdgpu/amdgpu.h|   1 +
 drivers/gpu/drm/amd/amdgpu/amdgpu_device.c |  26 +-
 drivers/gpu/drm/amd/amdgpu/amdgpu_discovery.c  |   1 +
 drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c|  10 +
 drivers/gpu/drm/amd/amdgpu/amdgpu_job.c|   7 +-
 drivers/gpu/drm/amd/amdgpu/amdgpu_mes.c|  10 +-
 drivers/gpu/drm/amd/amdgpu/amdgpu_mes.h|   1 +
 drivers/gpu/drm/amd/amdgpu/aqua_vanjaram.c |  15 +-
 drivers/gpu/drm/amd/amdgpu/gfx_v11_0.c |   3 +-
 drivers/gpu/drm/amd/amdgpu/mes_v11_0.c |   7 +-
 drivers/gpu/drm/amd/amdgpu/sdma_v4_4_2.c   |  16 +-
 drivers/gpu/drm/amd/amdgpu/soc21.c |  32 +-
 drivers/gpu/drm/amd/amdgpu/umsch_mm_v4_0.c |   2 +
 drivers/gpu/drm/amd/amdkfd/kfd_device.c|  17 +-
 .../gpu/drm/amd/amdkfd/kfd_device_queue_manager.c  |   1 +
 drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c  |  31 +-
 .../gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_wb.c   |   6 +-
 .../amd/display/dc/clk_mgr/dcn316/dcn316_clk_mgr.c |  19 +-
 .../amd/display/dc/clk_mgr/dcn35/dcn35_clk_mgr.c   |  50 +++
 drivers/gpu/drm/amd/display/dc/core/dc_state.c |   9 +
 .../gpu/drm/amd/display/dc/dce/dce_clock_source.c  |   8 +-
 .../gpu/drm/amd/display/dc/optc/dcn32/dcn32_optc.c |   3 -
 drivers/gpu/drm/amd/pm/swsmu/amdgpu_smu.c  |  27 +-
 drivers/gpu/drm/amd/pm/swsmu/inc/amdgpu_smu.h  |   1 +
 .../pm/swsmu/inc/pmfw_if/smu14_driver_if_v14_0_0.h |  33 +-
 .../amd/pm/swsmu/inc/pmfw_if/smu_v14_0_0_pmfw.h|  55 +++-
 .../amd/pm/swsmu/inc/pmfw_if/smu_v14_0_0_ppsmc.h   |  18 +-
 drivers/gpu/drm/amd/pm/swsmu/inc/smu_v14_0.h   |   1 +
 .../gpu/drm/amd/pm/swsmu/smu13/smu_v13_0_0_ppt.c   |   8 +-
 .../gpu/drm/amd/pm/swsmu/smu13/smu_v13_0_4_ppt.c   |  12 +-
 drivers/gpu/drm/amd/pm/swsmu/smu14/smu_v14_0.c |   2 

[PATCH] drm/amd/display: Enable ogam_ram for dcn32+dcn35+dcn351

2024-04-10 Thread Joshua Ashton
The comment here states "no OGAM in DPP since DCN1", yet that is not
true.

Testing on an RX 7900XTX (dcn32), it actually does exist in hardware and
works fine.
My best guess is the comment is confused with OGAM ROM for DPP, rather
than OGAM RAM.

I did not test dcn35/351 as I do not have that hardware, but I assume
the same follows there given the seemingly erroneous comment.
Someone at AMD should check that before merging this commit.

Signed-off-by: Joshua Ashton 

Cc: Harry Wentland 
Cc: Xaver Hugl 
Cc: Melissa Wen 
Cc: Ethan Lee 
---
 drivers/gpu/drm/amd/display/dc/resource/dcn32/dcn32_resource.c  | 2 +-
 drivers/gpu/drm/amd/display/dc/resource/dcn35/dcn35_resource.c  | 2 +-
 .../gpu/drm/amd/display/dc/resource/dcn351/dcn351_resource.c| 2 +-
 3 files changed, 3 insertions(+), 3 deletions(-)

diff --git a/drivers/gpu/drm/amd/display/dc/resource/dcn32/dcn32_resource.c 
b/drivers/gpu/drm/amd/display/dc/resource/dcn32/dcn32_resource.c
index 9aa39bd25be9..94f5d2b5aadf 100644
--- a/drivers/gpu/drm/amd/display/dc/resource/dcn32/dcn32_resource.c
+++ b/drivers/gpu/drm/amd/display/dc/resource/dcn32/dcn32_resource.c
@@ -2182,7 +2182,7 @@ static bool dcn32_resource_construct(
dc->caps.color.dpp.dgam_rom_for_yuv = 0;
 
dc->caps.color.dpp.hw_3d_lut = 1;
-   dc->caps.color.dpp.ogam_ram = 0;  // no OGAM in DPP since DCN1
+   dc->caps.color.dpp.ogam_ram = 1;
// no OGAM ROM on DCN2 and later ASICs
dc->caps.color.dpp.ogam_rom_caps.srgb = 0;
dc->caps.color.dpp.ogam_rom_caps.bt2020 = 0;
diff --git a/drivers/gpu/drm/amd/display/dc/resource/dcn35/dcn35_resource.c 
b/drivers/gpu/drm/amd/display/dc/resource/dcn35/dcn35_resource.c
index 25ac450944e7..708d63cc3f7f 100644
--- a/drivers/gpu/drm/amd/display/dc/resource/dcn35/dcn35_resource.c
+++ b/drivers/gpu/drm/amd/display/dc/resource/dcn35/dcn35_resource.c
@@ -1861,7 +1861,7 @@ static bool dcn35_resource_construct(
dc->caps.color.dpp.dgam_rom_for_yuv = 0;
 
dc->caps.color.dpp.hw_3d_lut = 1;
-   dc->caps.color.dpp.ogam_ram = 0;  // no OGAM in DPP since DCN1
+   dc->caps.color.dpp.ogam_ram = 1;
// no OGAM ROM on DCN301
dc->caps.color.dpp.ogam_rom_caps.srgb = 0;
dc->caps.color.dpp.ogam_rom_caps.bt2020 = 0;
diff --git a/drivers/gpu/drm/amd/display/dc/resource/dcn351/dcn351_resource.c 
b/drivers/gpu/drm/amd/display/dc/resource/dcn351/dcn351_resource.c
index 8a57adb27264..053e8ec6d1ef 100644
--- a/drivers/gpu/drm/amd/display/dc/resource/dcn351/dcn351_resource.c
+++ b/drivers/gpu/drm/amd/display/dc/resource/dcn351/dcn351_resource.c
@@ -1841,7 +1841,7 @@ static bool dcn351_resource_construct(
dc->caps.color.dpp.dgam_rom_for_yuv = 0;
 
dc->caps.color.dpp.hw_3d_lut = 1;
-   dc->caps.color.dpp.ogam_ram = 0;  // no OGAM in DPP since DCN1
+   dc->caps.color.dpp.ogam_ram = 1;
// no OGAM ROM on DCN301
dc->caps.color.dpp.ogam_rom_caps.srgb = 0;
dc->caps.color.dpp.ogam_rom_caps.bt2020 = 0;
-- 
2.44.0



[PATCH 21/25] drm/amd/display: Move REG sequence from program ogam to idle before connect

2024-04-10 Thread Rodrigo Siqueira
Fill ring buffer before offload.

Signed-off-by: Rodrigo Siqueira 
---
 drivers/gpu/drm/amd/display/dc/dcn20/dcn20_mpc.c | 10 --
 1 file changed, 4 insertions(+), 6 deletions(-)

diff --git a/drivers/gpu/drm/amd/display/dc/dcn20/dcn20_mpc.c 
b/drivers/gpu/drm/amd/display/dc/dcn20/dcn20_mpc.c
index 16b5ff208d14..ea73473b970a 100644
--- a/drivers/gpu/drm/amd/display/dc/dcn20/dcn20_mpc.c
+++ b/drivers/gpu/drm/amd/display/dc/dcn20/dcn20_mpc.c
@@ -395,9 +395,12 @@ static void mpc20_program_ogam_pwl(
MPCC_OGAM_LUT_DATA, rgb[i].delta_green_reg);
REG_SET(MPCC_OGAM_LUT_DATA[mpcc_id], 0,
MPCC_OGAM_LUT_DATA, rgb[i].delta_blue_reg);
-
}
 
+   REG_SEQ_SUBMIT();
+   PERF_TRACE();
+   REG_SEQ_WAIT_DONE();
+   PERF_TRACE();
 }
 
 static void apply_DEDCN20_305_wa(struct mpc *mpc, int mpcc_id,
@@ -501,11 +504,6 @@ void mpc2_assert_mpcc_idle_before_connect(struct mpc *mpc, 
int mpcc_id)
ASSERT(!mpc_disabled);
ASSERT(!mpc_idle);
}
-
-   REG_SEQ_SUBMIT();
-   PERF_TRACE();
-   REG_SEQ_WAIT_DONE();
-   PERF_TRACE();
 }
 
 static void mpc2_init_mpcc(struct mpcc *mpcc, int mpcc_inst)
-- 
2.43.0



[PATCH 25/25] drm/amd/display: 3.2.281

2024-04-10 Thread Rodrigo Siqueira
From: Aric Cyr 

This version brings along following fixes:

* Expand dmub_cmd operations.
* Update DVI configuration.
* Modify power sequence.
* Enable Z10 flag for IPS.
* Multiple code cleanups.

Acked-by: Rodrigo Siqueira 
Signed-off-by: Aric Cyr 
---
 drivers/gpu/drm/amd/display/dc/dc.h | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/drivers/gpu/drm/amd/display/dc/dc.h 
b/drivers/gpu/drm/amd/display/dc/dc.h
index 6a88423b7188..3c33c3bcbe2c 100644
--- a/drivers/gpu/drm/amd/display/dc/dc.h
+++ b/drivers/gpu/drm/amd/display/dc/dc.h
@@ -53,7 +53,7 @@ struct aux_payload;
 struct set_config_cmd_payload;
 struct dmub_notification;
 
-#define DC_VER "3.2.279"
+#define DC_VER "3.2.281"
 
 #define MAX_SURFACES 3
 #define MAX_PLANES 6
-- 
2.43.0



[PATCH 22/25] drm/amd/display: Update DCN201 link encoder registers

2024-04-10 Thread Rodrigo Siqueira
Add some missing registers expansion in the dcn201_link_encoder file.

Signed-off-by: Rodrigo Siqueira 
---
 .../amd/display/dc/dcn201/dcn201_link_encoder.h| 14 +-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/drivers/gpu/drm/amd/display/dc/dcn201/dcn201_link_encoder.h 
b/drivers/gpu/drm/amd/display/dc/dcn201/dcn201_link_encoder.h
index 8b95ef251332..be25e8dc0636 100644
--- a/drivers/gpu/drm/amd/display/dc/dcn201/dcn201_link_encoder.h
+++ b/drivers/gpu/drm/amd/display/dc/dcn201/dcn201_link_encoder.h
@@ -30,6 +30,10 @@
 
 #define DPCS_DCN201_MASK_SH_LIST(mask_sh)\
DPCS_MASK_SH_LIST(mask_sh),\
+   LE_SF(DPCSSYS_CR0_RAWLANE0_DIG_PCS_XF_RX_OVRD_IN_2, VCO_LD_VAL_OVRD, 
mask_sh),\
+   LE_SF(DPCSSYS_CR0_RAWLANE0_DIG_PCS_XF_RX_OVRD_IN_2, VCO_LD_VAL_OVRD_EN, 
mask_sh),\
+   LE_SF(DPCSSYS_CR0_RAWLANE0_DIG_PCS_XF_RX_OVRD_IN_3, REF_LD_VAL_OVRD, 
mask_sh),\
+   LE_SF(DPCSSYS_CR0_RAWLANE0_DIG_PCS_XF_RX_OVRD_IN_3, REF_LD_VAL_OVRD_EN, 
mask_sh),\
LE_SF(RDPCSTX0_RDPCSTX_PHY_CNTL2, RDPCS_PHY_DPALT_DISABLE_ACK, 
mask_sh),\
LE_SF(RDPCSTX0_RDPCSTX_PHY_CNTL2, RDPCS_PHY_DPALT_DISABLE, mask_sh),\
LE_SF(RDPCSTX0_RDPCSTX_PHY_CNTL2, RDPCS_PHY_DPALT_DP4, mask_sh),\
@@ -44,7 +48,15 @@
LE_SF(RDPCSTX0_RDPCSTX_PHY_CNTL11, RDPCS_PHY_DP_REF_CLK_EN, mask_sh)
 
 #define DPCS_DCN201_REG_LIST(id) \
-   DPCS_DCN2_CMN_REG_LIST(id)
+   DPCS_DCN2_CMN_REG_LIST(id), \
+   SRI_IX(RAWLANE0_DIG_PCS_XF_RX_OVRD_IN_2, DPCSSYS_CR, id), \
+   SRI_IX(RAWLANE0_DIG_PCS_XF_RX_OVRD_IN_3, DPCSSYS_CR, id), \
+   SRI_IX(RAWLANE1_DIG_PCS_XF_RX_OVRD_IN_2, DPCSSYS_CR, id), \
+   SRI_IX(RAWLANE1_DIG_PCS_XF_RX_OVRD_IN_3, DPCSSYS_CR, id), \
+   SRI_IX(RAWLANE2_DIG_PCS_XF_RX_OVRD_IN_2, DPCSSYS_CR, id), \
+   SRI_IX(RAWLANE2_DIG_PCS_XF_RX_OVRD_IN_3, DPCSSYS_CR, id), \
+   SRI_IX(RAWLANE3_DIG_PCS_XF_RX_OVRD_IN_2, DPCSSYS_CR, id), \
+   SRI_IX(RAWLANE3_DIG_PCS_XF_RX_OVRD_IN_3, DPCSSYS_CR, id)
 
 void dcn201_link_encoder_construct(
struct dcn20_link_encoder *enc20,
-- 
2.43.0



[PATCH 09/25] drm/amd/display: Rework power sequence and resource allocation logic

2024-04-10 Thread Rodrigo Siqueira
From: Sung Joon Kim 

Rework part of the modifications made to the power sequence and resource
allocation logic.

Reviewed-by: Xi (Alex) Liu 
Acked-by: Rodrigo Siqueira 
Signed-off-by: Sung Joon Kim 
---
 .../amd/display/dc/hwss/dcn351/dcn351_init.c  |  8 ++---
 .../dc/resource/dcn351/dcn351_resource.c  | 36 +--
 .../dc/resource/dcn351/dcn351_resource.h  |  6 
 3 files changed, 5 insertions(+), 45 deletions(-)

diff --git a/drivers/gpu/drm/amd/display/dc/hwss/dcn351/dcn351_init.c 
b/drivers/gpu/drm/amd/display/dc/hwss/dcn351/dcn351_init.c
index c4944478ed91..a53092cd619b 100644
--- a/drivers/gpu/drm/amd/display/dc/hwss/dcn351/dcn351_init.c
+++ b/drivers/gpu/drm/amd/display/dc/hwss/dcn351/dcn351_init.c
@@ -116,10 +116,10 @@ static const struct hw_sequencer_funcs dcn351_funcs = {
.update_visual_confirm_color = dcn10_update_visual_confirm_color,
.apply_idle_power_optimizations = dcn35_apply_idle_power_optimizations,
.update_dsc_pg = dcn32_update_dsc_pg,
-   .calc_blocks_to_gate = dcn351_calc_blocks_to_gate,
-   .calc_blocks_to_ungate = dcn351_calc_blocks_to_ungate,
-   .hw_block_power_up = dcn351_hw_block_power_up,
-   .hw_block_power_down = dcn351_hw_block_power_down,
+   .calc_blocks_to_gate = dcn35_calc_blocks_to_gate,
+   .calc_blocks_to_ungate = dcn35_calc_blocks_to_ungate,
+   .hw_block_power_up = dcn35_hw_block_power_up,
+   .hw_block_power_down = dcn35_hw_block_power_down,
.root_clock_control = dcn35_root_clock_control,
 };
 
diff --git a/drivers/gpu/drm/amd/display/dc/resource/dcn351/dcn351_resource.c 
b/drivers/gpu/drm/amd/display/dc/resource/dcn351/dcn351_resource.c
index b29d7d47552b..3acfbbac8538 100644
--- a/drivers/gpu/drm/amd/display/dc/resource/dcn351/dcn351_resource.c
+++ b/drivers/gpu/drm/amd/display/dc/resource/dcn351/dcn351_resource.c
@@ -1728,38 +1728,6 @@ static bool dcn351_validate_bandwidth(struct dc *dc,
return out;
 }
 
-struct pipe_ctx *dcn351_acquire_free_pipe_as_secondary_dpp_pipe(
-   const struct dc_state *cur_ctx,
-   struct dc_state *new_ctx,
-   const struct resource_pool *pool,
-   const struct pipe_ctx *opp_head_pipe)
-{
-   int free_pipe_idx;
-   struct pipe_ctx *free_pipe;
-
-   free_pipe_idx = dcn32_find_optimal_free_pipe_as_secondary_dpp_pipe(
-   _ctx->res_ctx, _ctx->res_ctx,
-   pool, opp_head_pipe);
-   if (free_pipe_idx >= 0) {
-   free_pipe = _ctx->res_ctx.pipe_ctx[free_pipe_idx];
-   free_pipe->pipe_idx = free_pipe_idx;
-   free_pipe->stream = opp_head_pipe->stream;
-   free_pipe->stream_res.tg = opp_head_pipe->stream_res.tg;
-   free_pipe->stream_res.opp = opp_head_pipe->stream_res.opp;
-
-   free_pipe->plane_res.hubp = pool->hubps[free_pipe->pipe_idx];
-   free_pipe->plane_res.ipp = pool->ipps[free_pipe->pipe_idx];
-   free_pipe->plane_res.dpp = pool->dpps[free_pipe->pipe_idx];
-   free_pipe->plane_res.mpcc_inst =
-   pool->dpps[free_pipe->pipe_idx]->inst;
-   } else {
-   ASSERT(opp_head_pipe);
-   free_pipe = NULL;
-   }
-
-   return free_pipe;
-}
-
 static struct resource_funcs dcn351_res_pool_funcs = {
.destroy = dcn351_destroy_resource_pool,
.link_enc_create = dcn35_link_encoder_create,
@@ -1771,8 +1739,7 @@ static struct resource_funcs dcn351_res_pool_funcs = {
.calculate_wm_and_dlg = NULL,
.update_soc_for_wm_a = dcn31_update_soc_for_wm_a,
.populate_dml_pipes = dcn351_populate_dml_pipes_from_context_fpu,
-   .acquire_free_pipe_as_secondary_dpp_pipe = 
dcn351_acquire_free_pipe_as_secondary_dpp_pipe,
-   .acquire_free_pipe_as_secondary_opp_head = 
dcn32_acquire_free_pipe_as_secondary_opp_head,
+   .acquire_free_pipe_as_secondary_dpp_pipe = 
dcn20_acquire_free_pipe_for_layer,
.release_pipe = dcn20_release_pipe,
.add_stream_to_ctx = dcn30_add_stream_to_ctx,
.add_dsc_to_stream_resource = dcn20_add_dsc_to_stream_resource,
@@ -2162,7 +2129,6 @@ static bool dcn351_resource_construct(
 
dc->dml2_options.max_segments_per_hubp = 24;
dc->dml2_options.det_segment_size = DCN3_2_DET_SEG_SIZE;/*todo*/
-   dc->dml2_options.map_dc_pipes_with_callbacks = true;
 
if (dc->config.sdpif_request_limit_words_per_umc == 0)
dc->config.sdpif_request_limit_words_per_umc = 16;/*todo*/
diff --git a/drivers/gpu/drm/amd/display/dc/resource/dcn351/dcn351_resource.h 
b/drivers/gpu/drm/amd/display/dc/resource/dcn351/dcn351_resource.h
index e4553c5100f8..f3e045777a3d 100644
--- a/drivers/gpu/drm/amd/display/dc/resource/dcn351/dcn351_resource.h
+++ b/drivers/gpu/drm/amd/display/dc/resource/dcn351/dcn351_resource.h
@@ -20,10 +20,4 @@ struct resource_pool 

[PATCH 19/25] drm/amd/display: Update FMT settings for 4:2:0

2024-04-10 Thread Rodrigo Siqueira
From: Eric Bernstein 

[Why] Update FMT_CONTROL settings based on HW spec
[How] Update FMT settings for 4:2:0

Signed-off-by: Eric Bernstein 
Reviewed-by: Rodrigo Siqueira 
---
 drivers/gpu/drm/amd/display/dc/dcn10/dcn10_opp.c | 9 -
 drivers/gpu/drm/amd/display/dc/dcn10/dcn10_opp.h | 2 ++
 2 files changed, 10 insertions(+), 1 deletion(-)

diff --git a/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_opp.c 
b/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_opp.c
index 5838a11efd00..71e9288d60ed 100644
--- a/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_opp.c
+++ b/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_opp.c
@@ -168,6 +168,10 @@ static void opp1_set_pixel_encoding(
 
case PIXEL_ENCODING_RGB:
case PIXEL_ENCODING_YCBCR444:
+   REG_UPDATE_3(FMT_CONTROL,
+   FMT_PIXEL_ENCODING, 0,
+   FMT_SUBSAMPLING_MODE, 0,
+   FMT_CBCR_BIT_REDUCTION_BYPASS, 0);
REG_UPDATE(FMT_CONTROL, FMT_PIXEL_ENCODING, 0);
break;
case PIXEL_ENCODING_YCBCR422:
@@ -177,7 +181,10 @@ static void opp1_set_pixel_encoding(
FMT_CBCR_BIT_REDUCTION_BYPASS, 0);
break;
case PIXEL_ENCODING_YCBCR420:
-   REG_UPDATE(FMT_CONTROL, FMT_PIXEL_ENCODING, 2);
+   REG_UPDATE_3(FMT_CONTROL,
+   FMT_PIXEL_ENCODING, 2,
+   FMT_SUBSAMPLING_MODE, 2,
+   FMT_CBCR_BIT_REDUCTION_BYPASS, 1);
break;
default:
break;
diff --git a/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_opp.h 
b/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_opp.h
index 2c0ecfa5a643..c87de68a509e 100644
--- a/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_opp.h
+++ b/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_opp.h
@@ -79,6 +79,8 @@
OPP_SF(FMT0_FMT_CONTROL, FMT_SPATIAL_DITHER_FRAME_COUNTER_MAX, 
mask_sh), \
OPP_SF(FMT0_FMT_CONTROL, FMT_SPATIAL_DITHER_FRAME_COUNTER_BIT_SWAP, 
mask_sh), \
OPP_SF(FMT0_FMT_CONTROL, FMT_PIXEL_ENCODING, mask_sh), \
+   OPP_SF(FMT0_FMT_CONTROL, FMT_SUBSAMPLING_MODE, mask_sh), \
+   OPP_SF(FMT0_FMT_CONTROL, FMT_CBCR_BIT_REDUCTION_BYPASS, mask_sh), \
OPP_SF(FMT0_FMT_CONTROL, FMT_STEREOSYNC_OVERRIDE, mask_sh), \
OPP_SF(FMT0_FMT_DITHER_RAND_R_SEED, FMT_RAND_R_SEED, mask_sh), \
OPP_SF(FMT0_FMT_DITHER_RAND_G_SEED, FMT_RAND_G_SEED, mask_sh), \
-- 
2.43.0



[PATCH 20/25] drm/amd/display: Rework dcn10_stream_encoder header

2024-04-10 Thread Rodrigo Siqueira
This commit remove some unused code and also rename one of the define.

Signed-off-by: Rodrigo Siqueira 
---
 .../drm/amd/display/dc/dcn10/dcn10_stream_encoder.h| 10 +++---
 1 file changed, 3 insertions(+), 7 deletions(-)

diff --git a/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_stream_encoder.h 
b/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_stream_encoder.h
index c429590f1298..1b96972b9d0f 100644
--- a/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_stream_encoder.h
+++ b/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_stream_encoder.h
@@ -127,7 +127,6 @@ struct dcn10_stream_enc_registers {
uint32_t AFMT_60958_1;
uint32_t AFMT_60958_2;
uint32_t DIG_FE_CNTL;
-   uint32_t DIG_FE_CNTL2;
uint32_t DIG_FIFO_STATUS;
uint32_t DP_MSE_RATE_CNTL;
uint32_t DP_MSE_RATE_UPDATE;
@@ -570,7 +569,7 @@ struct dcn10_stream_enc_registers {
type DP_SEC_GSP11_ENABLE;\
type DP_SEC_GSP11_LINE_NUM
 
-#define SE_REG_FIELD_LIST_DCN3_2(type) \
+#define SE_REG_FIELD_LIST_DCN3_1_COMMON(type) \
type DIG_FIFO_OUTPUT_PIXEL_MODE;\
type DP_PIXEL_PER_CYCLE_PROCESSING_MODE;\
type DIG_SYMCLK_FE_ON;\
@@ -599,7 +598,7 @@ struct dcn10_stream_encoder_shift {
uint8_t HDMI_ACP_SEND;
SE_REG_FIELD_LIST_DCN2_0(uint8_t);
SE_REG_FIELD_LIST_DCN3_0(uint8_t);
-   SE_REG_FIELD_LIST_DCN3_2(uint8_t);
+   SE_REG_FIELD_LIST_DCN3_1_COMMON(uint8_t);
SE_REG_FIELD_LIST_DCN3_5_COMMON(uint8_t);
 };
 
@@ -608,7 +607,7 @@ struct dcn10_stream_encoder_mask {
uint32_t HDMI_ACP_SEND;
SE_REG_FIELD_LIST_DCN2_0(uint32_t);
SE_REG_FIELD_LIST_DCN3_0(uint32_t);
-   SE_REG_FIELD_LIST_DCN3_2(uint32_t);
+   SE_REG_FIELD_LIST_DCN3_1_COMMON(uint32_t);
SE_REG_FIELD_LIST_DCN3_5_COMMON(uint32_t);
 };
 
@@ -667,9 +666,6 @@ void enc1_stream_encoder_send_immediate_sdp_message(
 void enc1_stream_encoder_stop_dp_info_packets(
struct stream_encoder *enc);
 
-void enc1_stream_encoder_reset_fifo(
-   struct stream_encoder *enc);
-
 void enc1_stream_encoder_dp_blank(
struct dc_link *link,
struct stream_encoder *enc);
-- 
2.43.0



[PATCH 24/25] drm/amd/display: Add missing replay field

2024-04-10 Thread Rodrigo Siqueira
Signed-off-by: Rodrigo Siqueira 
---
 drivers/gpu/drm/amd/display/dc/dc_types.h | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/drivers/gpu/drm/amd/display/dc/dc_types.h 
b/drivers/gpu/drm/amd/display/dc/dc_types.h
index 614d7c27c759..0f66d00ef80f 100644
--- a/drivers/gpu/drm/amd/display/dc/dc_types.h
+++ b/drivers/gpu/drm/amd/display/dc/dc_types.h
@@ -1050,6 +1050,8 @@ union replay_error_status {
 struct replay_config {
/* Replay feature is supported */
bool replay_supported;
+   /* Replay caps support DPCD & EDID caps*/
+   bool replay_cap_support;
/* Power opt flags that are supported */
unsigned int replay_power_opt_supported;
/* SMU optimization is supported */
-- 
2.43.0



[PATCH 16/25] drm/amd/display: Replace int with unsigned int

2024-04-10 Thread Rodrigo Siqueira
Signed-off-by: Rodrigo Siqueira 
---
 drivers/gpu/drm/amd/display/dc/core/dc_stream.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/drivers/gpu/drm/amd/display/dc/core/dc_stream.c 
b/drivers/gpu/drm/amd/display/dc/core/dc_stream.c
index ee6493a9a79c..5c7e4884cac2 100644
--- a/drivers/gpu/drm/amd/display/dc/core/dc_stream.c
+++ b/drivers/gpu/drm/amd/display/dc/core/dc_stream.c
@@ -495,7 +495,7 @@ bool dc_stream_remove_writeback(struct dc *dc,
struct dc_stream_state *stream,
uint32_t dwb_pipe_inst)
 {
-   int i = 0, j = 0;
+   unsigned int i, j;
if (stream == NULL) {
dm_error("DC: dc_stream is NULL!\n");
return false;
-- 
2.43.0



[PATCH 23/25] drm/amd/display: Add missing callback for init_watermarks in DCN 301

2024-04-10 Thread Rodrigo Siqueira
Signed-off-by: Rodrigo Siqueira 
---
 drivers/gpu/drm/amd/display/dc/dcn301/dcn301_hubbub.c | 1 +
 1 file changed, 1 insertion(+)

diff --git a/drivers/gpu/drm/amd/display/dc/dcn301/dcn301_hubbub.c 
b/drivers/gpu/drm/amd/display/dc/dcn301/dcn301_hubbub.c
index a046664e2031..c1959672df50 100644
--- a/drivers/gpu/drm/amd/display/dc/dcn301/dcn301_hubbub.c
+++ b/drivers/gpu/drm/amd/display/dc/dcn301/dcn301_hubbub.c
@@ -63,6 +63,7 @@ static const struct hubbub_funcs hubbub301_funcs = {
.verify_allow_pstate_change_high = 
hubbub1_verify_allow_pstate_change_high,
.force_wm_propagate_to_pipes = hubbub3_force_wm_propagate_to_pipes,
.force_pstate_change_control = hubbub3_force_pstate_change_control,
+   .init_watermarks = hubbub3_init_watermarks,
.hubbub_read_state = hubbub2_read_state,
 };
 
-- 
2.43.0



[PATCH 18/25] drm/amd/display: Remove unnecessary code

2024-04-10 Thread Rodrigo Siqueira
This commit groups many parts of the code that are redundant or not used
and drops all of them.

Signed-off-by: Rodrigo Siqueira 
---
 drivers/gpu/drm/amd/display/dc/dc.h|  1 -
 .../gpu/drm/amd/display/dc/dce/dce_i2c_hw.c|  3 ---
 .../amd/display/dc/dcn10/dcn10_link_encoder.h  |  6 --
 .../gpu/drm/amd/display/dc/dcn30/dcn30_dccg.h  | 18 --
 .../gpu/drm/amd/display/dc/dcn30/dcn30_dwb.c   |  2 --
 5 files changed, 30 deletions(-)

diff --git a/drivers/gpu/drm/amd/display/dc/dc.h 
b/drivers/gpu/drm/amd/display/dc/dc.h
index 4e36a4f9a4a8..6a88423b7188 100644
--- a/drivers/gpu/drm/amd/display/dc/dc.h
+++ b/drivers/gpu/drm/amd/display/dc/dc.h
@@ -1006,7 +1006,6 @@ struct dc_debug_options {
unsigned int force_cositing;
 };
 
-struct gpu_info_soc_bounding_box_v1_0;
 
 /* Generic structure that can be used to query properties of DC. More fields
  * can be added as required.
diff --git a/drivers/gpu/drm/amd/display/dc/dce/dce_i2c_hw.c 
b/drivers/gpu/drm/amd/display/dc/dce/dce_i2c_hw.c
index 744c335718a7..ee601a6897a1 100644
--- a/drivers/gpu/drm/amd/display/dc/dce/dce_i2c_hw.c
+++ b/drivers/gpu/drm/amd/display/dc/dce/dce_i2c_hw.c
@@ -312,9 +312,6 @@ static bool setup_engine(
/* we have checked I2c not used by DMCU, set SW use I2C REQ to 1 to 
indicate SW using it*/
REG_UPDATE(DC_I2C_ARBITRATION, DC_I2C_SW_USE_I2C_REG_REQ, 1);
 
-   /* we have checked I2c not used by DMCU, set SW use I2C REQ to 1 to 
indicate SW using it*/
-   REG_UPDATE(DC_I2C_ARBITRATION, DC_I2C_SW_USE_I2C_REG_REQ, 1);
-
/*set SW requested I2c speed to default, if API calls in it will be 
override later*/
set_speed(dce_i2c_hw, dce_i2c_hw->ctx->dc->caps.i2c_speed_in_khz);
 
diff --git a/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_link_encoder.h 
b/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_link_encoder.h
index d980e6bd6c66..b7a89c39f445 100644
--- a/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_link_encoder.h
+++ b/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_link_encoder.h
@@ -167,7 +167,6 @@ struct dcn10_link_enc_registers {
uint32_t DIO_LINKD_CNTL;
uint32_t DIO_LINKE_CNTL;
uint32_t DIO_LINKF_CNTL;
-   uint32_t DIG_FIFO_CTRL0;
uint32_t DIO_CLK_CNTL;
uint32_t DIG_BE_CLK_CNTL;
 };
@@ -475,9 +474,6 @@ struct dcn10_link_enc_registers {
type HPO_DP_ENC_SEL;\
type HPO_HDMI_ENC_SEL
 
-#define DCN32_LINK_ENCODER_REG_FIELD_LIST(type) \
-   type DIG_FIFO_OUTPUT_PIXEL_MODE
-
 #define DCN35_LINK_ENCODER_REG_FIELD_LIST(type) \
type DIG_BE_ENABLE;\
type DIG_RB_SWITCH_EN;\
@@ -512,7 +508,6 @@ struct dcn10_link_enc_shift {
DCN20_LINK_ENCODER_REG_FIELD_LIST(uint8_t);
DCN30_LINK_ENCODER_REG_FIELD_LIST(uint8_t);
DCN31_LINK_ENCODER_REG_FIELD_LIST(uint8_t);
-   DCN32_LINK_ENCODER_REG_FIELD_LIST(uint8_t);
DCN35_LINK_ENCODER_REG_FIELD_LIST(uint8_t);
 };
 
@@ -521,7 +516,6 @@ struct dcn10_link_enc_mask {
DCN20_LINK_ENCODER_REG_FIELD_LIST(uint32_t);
DCN30_LINK_ENCODER_REG_FIELD_LIST(uint32_t);
DCN31_LINK_ENCODER_REG_FIELD_LIST(uint32_t);
-   DCN32_LINK_ENCODER_REG_FIELD_LIST(uint32_t);
DCN35_LINK_ENCODER_REG_FIELD_LIST(uint32_t);
 };
 
diff --git a/drivers/gpu/drm/amd/display/dc/dcn30/dcn30_dccg.h 
b/drivers/gpu/drm/amd/display/dc/dcn30/dcn30_dccg.h
index 35a613bb08bf..08a57ea4591c 100644
--- a/drivers/gpu/drm/amd/display/dc/dcn30/dcn30_dccg.h
+++ b/drivers/gpu/drm/amd/display/dc/dcn30/dcn30_dccg.h
@@ -29,13 +29,6 @@
 #include "dcn20/dcn20_dccg.h"
 
 
-#define DCCG_REG_LIST_DCN3AG() \
-   DCCG_COMMON_REG_LIST_DCN_BASE(),\
-   SR(PHYASYMCLK_CLOCK_CNTL),\
-   SR(PHYBSYMCLK_CLOCK_CNTL),\
-   SR(PHYCSYMCLK_CLOCK_CNTL)
-
-
 #define DCCG_REG_LIST_DCN30() \
DCCG_REG_LIST_DCN2(),\
DCCG_SRII(PIXEL_RATE_CNTL, OTG, 2),\
@@ -46,17 +39,6 @@
SR(PHYBSYMCLK_CLOCK_CNTL),\
SR(PHYCSYMCLK_CLOCK_CNTL)
 
-#define DCCG_MASK_SH_LIST_DCN3AG(mask_sh) \
-   DCCG_MASK_SH_LIST_DCN2_1(mask_sh),\
-   DCCG_SF(HDMICHARCLK0_CLOCK_CNTL, HDMICHARCLK0_EN, mask_sh),\
-   DCCG_SF(HDMICHARCLK0_CLOCK_CNTL, HDMICHARCLK0_SRC_SEL, mask_sh),\
-   DCCG_SF(PHYASYMCLK_CLOCK_CNTL, PHYASYMCLK_FORCE_EN, mask_sh),\
-   DCCG_SF(PHYASYMCLK_CLOCK_CNTL, PHYASYMCLK_FORCE_SRC_SEL, mask_sh),\
-   DCCG_SF(PHYBSYMCLK_CLOCK_CNTL, PHYBSYMCLK_FORCE_EN, mask_sh),\
-   DCCG_SF(PHYBSYMCLK_CLOCK_CNTL, PHYBSYMCLK_FORCE_SRC_SEL, mask_sh),\
-   DCCG_SF(PHYCSYMCLK_CLOCK_CNTL, PHYCSYMCLK_FORCE_EN, mask_sh),\
-   DCCG_SF(PHYCSYMCLK_CLOCK_CNTL, PHYCSYMCLK_FORCE_SRC_SEL, mask_sh)
-
 #define DCCG_MASK_SH_LIST_DCN3(mask_sh) \
DCCG_MASK_SH_LIST_DCN2(mask_sh),\
DCCG_SF(PHYASYMCLK_CLOCK_CNTL, PHYASYMCLK_FORCE_EN, mask_sh),\
diff --git a/drivers/gpu/drm/amd/display/dc/dcn30/dcn30_dwb.c 
b/drivers/gpu/drm/amd/display/dc/dcn30/dcn30_dwb.c
index 1b9d9495f76d..fae98cf52020 100644
--- 

[PATCH 10/25] drm/amd/display: Expand dmub_cmd operations

2024-04-10 Thread Rodrigo Siqueira
From: Anthony Koo 

Update dmub_cmd to manipulate SDP control in replay FSM, add command
for panel_cntl, expand link rate enum, and increase the reserve byte.

Acked-by: Rodrigo Siqueira 
Signed-off-by: Anthony Koo 
---
 .../gpu/drm/amd/display/dmub/inc/dmub_cmd.h   | 53 ++-
 1 file changed, 52 insertions(+), 1 deletion(-)

diff --git a/drivers/gpu/drm/amd/display/dmub/inc/dmub_cmd.h 
b/drivers/gpu/drm/amd/display/dmub/inc/dmub_cmd.h
index 944f14307517..e85fd3ac52c7 100644
--- a/drivers/gpu/drm/amd/display/dmub/inc/dmub_cmd.h
+++ b/drivers/gpu/drm/amd/display/dmub/inc/dmub_cmd.h
@@ -1614,7 +1614,7 @@ struct dmub_rb_cmd_idle_opt_dcn_restore {
  */
 struct dmub_dcn_notify_idle_cntl_data {
uint8_t driver_idle;
-   uint8_t pad[1];
+   uint8_t reserved[59];
 };
 
 /**
@@ -2335,6 +2335,11 @@ enum phy_link_rate {
 * UHBR10 - 20.0 Gbps/Lane
 */
PHY_RATE_2000 = 11,
+
+   PHY_RATE_675 = 12,
+   /**
+* Rate 12 - 6.75 Gbps/Lane
+*/
 };
 
 /**
@@ -3062,6 +3067,11 @@ enum dmub_cmd_replay_type {
 * Set pseudo vtotal
 */
DMUB_CMD__REPLAY_SET_PSEUDO_VTOTAL = 7,
+   /**
+* Set adaptive sync sdp enabled
+*/
+   DMUB_CMD__REPLAY_DISABLED_ADAPTIVE_SYNC_SDP = 8,
+
 };
 
 /**
@@ -3263,6 +3273,20 @@ struct dmub_cmd_replay_set_pseudo_vtotal {
 */
uint8_t pad;
 };
+struct dmub_cmd_replay_disabled_adaptive_sync_sdp_data {
+   /**
+* Panel Instance.
+* Panel isntance to identify which replay_state to use
+* Currently the support is only for 0 or 1
+*/
+   uint8_t panel_inst;
+   /**
+* enabled: set adaptive sync sdp enabled
+*/
+   uint8_t force_disabled;
+
+   uint8_t pad[2];
+};
 
 /**
  * Definition of a DMUB_CMD__SET_REPLAY_POWER_OPT command.
@@ -3366,6 +3390,20 @@ struct dmub_rb_cmd_replay_set_pseudo_vtotal {
struct dmub_cmd_replay_set_pseudo_vtotal data;
 };
 
+/**
+ * Definition of a DMUB_CMD__REPLAY_DISABLED_ADAPTIVE_SYNC_SDP command.
+ */
+struct dmub_rb_cmd_replay_disabled_adaptive_sync_sdp {
+   /**
+* Command header.
+*/
+   struct dmub_cmd_header header;
+   /**
+* Definition of DMUB_CMD__REPLAY_DISABLED_ADAPTIVE_SYNC_SDP command.
+*/
+   struct dmub_cmd_replay_disabled_adaptive_sync_sdp_data data;
+};
+
 /**
  * Data passed from driver to FW in  
DMUB_CMD__REPLAY_SET_RESIDENCY_FRAMEUPDATE_TIMER command.
  */
@@ -3421,6 +3459,11 @@ union dmub_replay_cmd_set {
 * Definition of DMUB_CMD__REPLAY_SET_PSEUDO_VTOTAL command data.
 */
struct dmub_cmd_replay_set_pseudo_vtotal pseudo_vtotal_data;
+   /**
+* Definition of DMUB_CMD__REPLAY_DISABLED_ADAPTIVE_SYNC_SDP command 
data.
+*/
+   struct dmub_cmd_replay_disabled_adaptive_sync_sdp_data 
disabled_adaptive_sync_sdp_data;
+
 };
 
 /**
@@ -4096,6 +4139,10 @@ enum dmub_cmd_panel_cntl_type {
 * Queries backlight info for the embedded panel.
 */
DMUB_CMD__PANEL_CNTL_QUERY_BACKLIGHT_INFO = 1,
+   /**
+* Sets the PWM Freq as per user's requirement.
+*/
+   DMUB_CMD__PANEL_DEBUG_PWM_FREQ = 2,
 };
 
 /**
@@ -4667,6 +4714,10 @@ union dmub_rb_cmd {
 * Definition of a DMUB_CMD__REPLAY_SET_PSEUDO_VTOTAL command.
 */
struct dmub_rb_cmd_replay_set_pseudo_vtotal replay_set_pseudo_vtotal;
+   /**
+* Definition of a DMUB_CMD__REPLAY_DISABLED_ADAPTIVE_SYNC_SDP command.
+*/
+   struct dmub_rb_cmd_replay_disabled_adaptive_sync_sdp 
replay_disabled_adaptive_sync_sdp;
/**
 * Definition of a DMUB_CMD__PSP_ASSR_ENABLE command.
 */
-- 
2.43.0



[PATCH 17/25] drm/amd/display: Update some comments to improve the code readability

2024-04-10 Thread Rodrigo Siqueira
This commit updates some comments to be more precise and adds another
small comment to some other parts to improve the code readability.

Signed-off-by: Rodrigo Siqueira 
---
 drivers/gpu/drm/amd/display/dc/dc.h | 10 +-
 drivers/gpu/drm/amd/display/dc/dcn20/dcn20_hubp.h   |  2 +-
 drivers/gpu/drm/amd/display/dc/dcn201/dcn201_hubp.c |  5 +
 3 files changed, 11 insertions(+), 6 deletions(-)

diff --git a/drivers/gpu/drm/amd/display/dc/dc.h 
b/drivers/gpu/drm/amd/display/dc/dc.h
index 188f2d401124..4e36a4f9a4a8 100644
--- a/drivers/gpu/drm/amd/display/dc/dc.h
+++ b/drivers/gpu/drm/amd/display/dc/dc.h
@@ -309,12 +309,12 @@ struct dc_dcc_setting {
unsigned int max_compressed_blk_size;
unsigned int max_uncompressed_blk_size;
bool independent_64b_blks;
-   //These bitfields to be used starting with DCN
+   //These bitfields to be used starting with DCN 3.0
struct {
-   uint32_t dcc_256_64_64 : 1;//available in ASICs before DCN (the 
worst compression case)
-   uint32_t dcc_128_128_uncontrained : 1;  //available in ASICs 
before DCN
-   uint32_t dcc_256_128_128 : 1;   //available starting 
with DCN
-   uint32_t dcc_256_256_unconstrained : 1;  //available in ASICs 
before DCN (the best compression case)
+   uint32_t dcc_256_64_64 : 1;//available in ASICs before DCN 3.0 
(the worst compression case)
+   uint32_t dcc_128_128_uncontrained : 1;  //available in ASICs 
before DCN 3.0
+   uint32_t dcc_256_128_128 : 1;   //available starting 
with DCN 3.0
+   uint32_t dcc_256_256_unconstrained : 1;  //available in ASICs 
before DCN 3.0 (the best compression case)
} dcc_controls;
 };
 
diff --git a/drivers/gpu/drm/amd/display/dc/dcn20/dcn20_hubp.h 
b/drivers/gpu/drm/amd/display/dc/dcn20/dcn20_hubp.h
index efa2adf4f83d..8da3084d933f 100644
--- a/drivers/gpu/drm/amd/display/dc/dcn20/dcn20_hubp.h
+++ b/drivers/gpu/drm/amd/display/dc/dcn20/dcn20_hubp.h
@@ -147,7 +147,7 @@
uint32_t DCN_CUR1_TTU_CNTL1;\
uint32_t VMID_SETTINGS_0
 
-
+/*shared with dcn3.x*/
 #define DCN21_HUBP_REG_COMMON_VARIABLE_LIST \
DCN2_HUBP_REG_COMMON_VARIABLE_LIST; \
uint32_t FLIP_PARAMETERS_3;\
diff --git a/drivers/gpu/drm/amd/display/dc/dcn201/dcn201_hubp.c 
b/drivers/gpu/drm/amd/display/dc/dcn201/dcn201_hubp.c
index 35dd4bac242a..cd2bfcc51276 100644
--- a/drivers/gpu/drm/amd/display/dc/dcn201/dcn201_hubp.c
+++ b/drivers/gpu/drm/amd/display/dc/dcn201/dcn201_hubp.c
@@ -77,6 +77,7 @@ static void hubp201_program_requestor(struct hubp *hubp,
MRQ_EXPANSION_MODE, rq_regs->mrq_expansion_mode,
CRQ_EXPANSION_MODE, rq_regs->crq_expansion_mode);
 
+   /* no need to program PTE */
REG_SET_5(DCHUBP_REQ_SIZE_CONFIG, 0,
CHUNK_SIZE, rq_regs->rq_regs_l.chunk_size,
MIN_CHUNK_SIZE, rq_regs->rq_regs_l.min_chunk_size,
@@ -99,6 +100,10 @@ static void hubp201_setup(
struct _vcs_dpi_display_rq_regs_st *rq_regs,
struct _vcs_dpi_display_pipe_dest_params_st *pipe_dest)
 {
+   /*
+* otg is locked when this func is called. Register are double buffered.
+* disable the requestors is not needed
+*/
hubp2_vready_at_or_After_vsync(hubp, pipe_dest);
hubp201_program_requestor(hubp, rq_regs);
hubp201_program_deadline(hubp, dlg_attr, ttu_attr);
-- 
2.43.0



[PATCH 14/25] drm/amd/display: Fix PSR command version passed

2024-04-10 Thread Rodrigo Siqueira
From: Mikita Lipski 

[why]
Driver was passing a wrong command version which to DMCUB which caused
the DMCUB to treat it as 0, so it wouldn't support dual eDP and would
override the panel index to 0 instead of choosing between 0/1.

[how]
Use DMUB_CMD_PSR_CONTROL_VERSION_1 instead of PSR_VERSION_1.

Signed-off-by: Mikita Lipski 
Reviewed-by: Rodrigo Siqueira 
---
 drivers/gpu/drm/amd/display/dc/core/dc.c | 1 +
 1 file changed, 1 insertion(+)

diff --git a/drivers/gpu/drm/amd/display/dc/core/dc.c 
b/drivers/gpu/drm/amd/display/dc/core/dc.c
index 01c75b66e8f1..8eefba757da4 100644
--- a/drivers/gpu/drm/amd/display/dc/core/dc.c
+++ b/drivers/gpu/drm/amd/display/dc/core/dc.c
@@ -3446,6 +3446,7 @@ void dc_dmub_update_dirty_rect(struct dc *dc,
if (srf_updates[i].surface->flip_immediate)
continue;
 
+   update_dirty_rect->cmd_version = DMUB_CMD_PSR_CONTROL_VERSION_1;
update_dirty_rect->dirty_rect_count = 
flip_addr->dirty_rect_count;
memcpy(update_dirty_rect->src_dirty_rects, 
flip_addr->dirty_rects,
sizeof(flip_addr->dirty_rects));
-- 
2.43.0



[PATCH 13/25] drm/amd/display: Improve the log precision

2024-04-10 Thread Rodrigo Siqueira
From: "Bitnun, Ethan" 

The previous assumption that there will be an optimize_bandwidth call
following every prepare_bandwidth call was incorrect and caused small
inaccuracies in logging, as some info was only updated in later prepare
calls.

Signed-off-by: Ethan Bitnun 
Reviewed-by: Rodrigo Siqueira 
---
 drivers/gpu/drm/amd/display/dc/clk_mgr/dcn32/dcn32_clk_mgr.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/drivers/gpu/drm/amd/display/dc/clk_mgr/dcn32/dcn32_clk_mgr.c 
b/drivers/gpu/drm/amd/display/dc/clk_mgr/dcn32/dcn32_clk_mgr.c
index 358a83b1114b..7eecb3403f74 100644
--- a/drivers/gpu/drm/amd/display/dc/clk_mgr/dcn32/dcn32_clk_mgr.c
+++ b/drivers/gpu/drm/amd/display/dc/clk_mgr/dcn32/dcn32_clk_mgr.c
@@ -830,7 +830,7 @@ static void dcn32_update_clocks(struct clk_mgr 
*clk_mgr_base,
dmcu->funcs->set_psr_wait_loop(dmcu,
clk_mgr_base->clks.dispclk_khz / 1000 / 7);
 
-   if (dc->config.enable_auto_dpm_test_logs && safe_to_lower) {
+   if (dc->config.enable_auto_dpm_test_logs) {
dcn32_auto_dpm_test_log(new_clocks, clk_mgr, context);
}
 }
-- 
2.43.0



[PATCH 11/25] drm/amd/display: Use dce_version instead of chip_id

2024-04-10 Thread Rodrigo Siqueira
The chip ID DEVICE_ID_NV_13FE is not meaningful and represents a legacy
way of dealing with chip ID. This commit uses dc_version instead of
chip_id and also DCN_VERSION_2_01 instead of DEVICE_ID_NV_13FE.

Signed-off-by: Rodrigo Siqueira 
---
 drivers/gpu/drm/amd/display/dc/clk_mgr/clk_mgr.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/drivers/gpu/drm/amd/display/dc/clk_mgr/clk_mgr.c 
b/drivers/gpu/drm/amd/display/dc/clk_mgr/clk_mgr.c
index c1a5908b97c8..a2b4ff2cff16 100644
--- a/drivers/gpu/drm/amd/display/dc/clk_mgr/clk_mgr.c
+++ b/drivers/gpu/drm/amd/display/dc/clk_mgr/clk_mgr.c
@@ -272,7 +272,7 @@ struct clk_mgr *dc_clk_mgr_create(struct dc_context *ctx, 
struct pp_smu_funcs *p
dcn3_clk_mgr_construct(ctx, clk_mgr, pp_smu, dccg);
return _mgr->base;
}
-   if (asic_id.chip_id == DEVICE_ID_NV_13FE) {
+   if (ctx->dce_version == DCN_VERSION_2_01) {
dcn201_clk_mgr_construct(ctx, clk_mgr, pp_smu, dccg);
return _mgr->base;
}
-- 
2.43.0



[PATCH 15/25] drm/amd/display: Group scl_data together in resource_build_scaling_params

2024-04-10 Thread Rodrigo Siqueira
Move the scl_data.format to be close to other similar parts.

Signed-off-by: Rodrigo Siqueira 
---
 drivers/gpu/drm/amd/display/dc/core/dc_resource.c | 5 ++---
 1 file changed, 2 insertions(+), 3 deletions(-)

diff --git a/drivers/gpu/drm/amd/display/dc/core/dc_resource.c 
b/drivers/gpu/drm/amd/display/dc/core/dc_resource.c
index 2633e481234f..876b0e5eda95 100644
--- a/drivers/gpu/drm/amd/display/dc/core/dc_resource.c
+++ b/drivers/gpu/drm/amd/display/dc/core/dc_resource.c
@@ -1500,9 +1500,6 @@ bool resource_build_scaling_params(struct pipe_ctx 
*pipe_ctx)
return false;
}
 
-   pipe_ctx->plane_res.scl_data.format = 
convert_pixel_format_to_dalsurface(
-   pipe_ctx->plane_state->format);
-
/* Timing borders are part of vactive that we are also supposed to skip 
in addition
 * to any stream dst offset. Since dm logic assumes dst is in 
addressable
 * space we need to add the left and top borders to dst offsets 
temporarily.
@@ -1514,6 +1511,8 @@ bool resource_build_scaling_params(struct pipe_ctx 
*pipe_ctx)
/* Calculate H and V active size */
pipe_ctx->plane_res.scl_data.h_active = odm_slice_rec.width;
pipe_ctx->plane_res.scl_data.v_active = odm_slice_rec.height;
+   pipe_ctx->plane_res.scl_data.format = 
convert_pixel_format_to_dalsurface(
+   pipe_ctx->plane_state->format);
 
/* depends on h_active */
calculate_recout(pipe_ctx);
-- 
2.43.0



[PATCH 08/25] drm/amd/display: Enable Z10 flag for IPS FSM

2024-04-10 Thread Rodrigo Siqueira
From: Sung Joon Kim 

[why]
IPS FSM requires Z10 flag to be enabled to do save and restore the
registers properly.

[how]
Enable Z10 and use the correct function to determine Z10 capability

Reviewed-by: Nicholas Kazlauskas 
Acked-by: Rodrigo Siqueira 
Signed-off-by: Sung Joon Kim 
---
 .../gpu/drm/amd/display/dc/resource/dcn351/dcn351_resource.c  | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/drivers/gpu/drm/amd/display/dc/resource/dcn351/dcn351_resource.c 
b/drivers/gpu/drm/amd/display/dc/resource/dcn351/dcn351_resource.c
index cc1a44a890b5..b29d7d47552b 100644
--- a/drivers/gpu/drm/amd/display/dc/resource/dcn351/dcn351_resource.c
+++ b/drivers/gpu/drm/amd/display/dc/resource/dcn351/dcn351_resource.c
@@ -758,7 +758,7 @@ static const struct dc_debug_options debug_defaults_drv = {
//must match enable_single_display_2to1_odm_policy to support dynamic 
ODM transitions
.enable_double_buffered_dsc_pg_support = true,
.enable_dp_dig_pixel_rate_div_policy = 1,
-   .disable_z10 = true,
+   .disable_z10 = false,
.ignore_pg = true,
.psp_disabled_wa = true,
.ips2_eval_delay_us = 2000,
@@ -1722,7 +1722,7 @@ static bool dcn351_validate_bandwidth(struct dc *dc,
return out;
 
DC_FP_START();
-   dcn351_decide_zstate_support(dc, context);
+   dcn35_decide_zstate_support(dc, context);
DC_FP_END();
 
return out;
-- 
2.43.0



[PATCH 12/25] drm/amd/display: Adjust headers

2024-04-10 Thread Rodrigo Siqueira
Update headers by removing two unecessary headers and include a new one.

Signed-off-by: Rodrigo Siqueira 
---
 drivers/gpu/drm/amd/display/dc/clk_mgr/dcn32/dcn32_clk_mgr.c   | 1 +
 drivers/gpu/drm/amd/display/dc/dce/dce_i2c_hw.c| 3 ---
 .../gpu/drm/amd/display/dc/dcn30/dcn30_dio_stream_encoder.c| 1 -
 3 files changed, 1 insertion(+), 4 deletions(-)

diff --git a/drivers/gpu/drm/amd/display/dc/clk_mgr/dcn32/dcn32_clk_mgr.c 
b/drivers/gpu/drm/amd/display/dc/clk_mgr/dcn32/dcn32_clk_mgr.c
index bec252e1dd27..358a83b1114b 100644
--- a/drivers/gpu/drm/amd/display/dc/clk_mgr/dcn32/dcn32_clk_mgr.c
+++ b/drivers/gpu/drm/amd/display/dc/clk_mgr/dcn32/dcn32_clk_mgr.c
@@ -29,6 +29,7 @@
 #include "dcn20/dcn20_clk_mgr.h"
 #include "dce100/dce_clk_mgr.h"
 #include "dcn31/dcn31_clk_mgr.h"
+#include "dcn32/dcn32_clk_mgr.h"
 #include "reg_helper.h"
 #include "core_types.h"
 #include "dm_helpers.h"
diff --git a/drivers/gpu/drm/amd/display/dc/dce/dce_i2c_hw.c 
b/drivers/gpu/drm/amd/display/dc/dce/dce_i2c_hw.c
index a2f48d46d199..744c335718a7 100644
--- a/drivers/gpu/drm/amd/display/dc/dce/dce_i2c_hw.c
+++ b/drivers/gpu/drm/amd/display/dc/dce/dce_i2c_hw.c
@@ -22,9 +22,6 @@
  * Authors: AMD
  *
  */
-
-#include 
-
 #include "resource.h"
 #include "dce_i2c.h"
 #include "dce_i2c_hw.h"
diff --git a/drivers/gpu/drm/amd/display/dc/dcn30/dcn30_dio_stream_encoder.c 
b/drivers/gpu/drm/amd/display/dc/dcn30/dcn30_dio_stream_encoder.c
index 8ed7125d230d..425b830b88d2 100644
--- a/drivers/gpu/drm/amd/display/dc/dcn30/dcn30_dio_stream_encoder.c
+++ b/drivers/gpu/drm/amd/display/dc/dcn30/dcn30_dio_stream_encoder.c
@@ -29,7 +29,6 @@
 #include "reg_helper.h"
 #include "hw_shared.h"
 #include "dc.h"
-#include "core_types.h"
 
 #define DC_LOGGER \
enc1->base.ctx->logger
-- 
2.43.0



[PATCH 07/25] drm/amd/display: Fix incorrect pointer assignment

2024-04-10 Thread Rodrigo Siqueira
From: Chaitanya Dhere 

[Why]
Pointer initialization and assignment for dml2_options is not done
correctly. While this works for some compilers, others give an error.

[How]
Modify dc_state_create code to correctly initialize the dml2_opt pointer
and pass it to dml2_create. Also update the code with correct derefrence
operations.

Reviewed-by: Aurabindo Pillai 
Acked-by: Rodrigo Siqueira 
Signed-off-by: Chaitanya Dhere 
---
 drivers/gpu/drm/amd/display/dc/core/dc_state.c | 10 +-
 1 file changed, 5 insertions(+), 5 deletions(-)

diff --git a/drivers/gpu/drm/amd/display/dc/core/dc_state.c 
b/drivers/gpu/drm/amd/display/dc/core/dc_state.c
index bf889bdd3925..76bb05f4d6bf 100644
--- a/drivers/gpu/drm/amd/display/dc/core/dc_state.c
+++ b/drivers/gpu/drm/amd/display/dc/core/dc_state.c
@@ -191,7 +191,7 @@ static void init_state(struct dc *dc, struct dc_state 
*state)
 struct dc_state *dc_state_create(struct dc *dc, struct dc_state_create_params 
*params)
 {
 #ifdef CONFIG_DRM_AMD_DC_FP
-   struct dml2_configuration_options dml2_opt = dc->dml2_options;
+   struct dml2_configuration_options *dml2_opt = >dml2_options;
 #endif
struct dc_state *state = kvzalloc(sizeof(struct dc_state),
GFP_KERNEL);
@@ -205,11 +205,11 @@ struct dc_state *dc_state_create(struct dc *dc, struct 
dc_state_create_params *p
 
 #ifdef CONFIG_DRM_AMD_DC_FP
if (dc->debug.using_dml2) {
-   dml2_opt.use_clock_dc_limits = false;
-   dml2_create(dc, _opt, >bw_ctx.dml2);
+   dml2_opt->use_clock_dc_limits = false;
+   dml2_create(dc, dml2_opt, >bw_ctx.dml2);
 
-   dml2_opt.use_clock_dc_limits = true;
-   dml2_create(dc, _opt, >bw_ctx.dml2_dc_power_source);
+   dml2_opt->use_clock_dc_limits = true;
+   dml2_create(dc, dml2_opt, >bw_ctx.dml2_dc_power_source);
}
 #endif
 
-- 
2.43.0



[PATCH 06/25] drm/amd/display: Pass sequential ONO bit to DMCUB boot options

2024-04-10 Thread Rodrigo Siqueira
From: Nicholas Kazlauskas 

[Why]
IPS ono sequence ordering differs based on the ASIC.

[How]
Detect the ASIC ID revision and set the boot option accordingly. Feed
it through the DCN35 DMUB functions.

Reviewed-by: Sung joon Kim 
Acked-by: Rodrigo Siqueira 
Signed-off-by: Nicholas Kazlauskas 
---
 drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c | 9 +
 drivers/gpu/drm/amd/display/dmub/dmub_srv.h   | 1 +
 drivers/gpu/drm/amd/display/dmub/src/dmub_dcn35.c | 1 +
 3 files changed, 11 insertions(+)

diff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c 
b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
index d52701f6d1d0..2c06f2bee4a5 100644
--- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
+++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
@@ -1230,6 +1230,15 @@ static int dm_dmub_hw_init(struct amdgpu_device *adev)
break;
}
 
+   switch (amdgpu_ip_version(adev, DCE_HWIP, 0)) {
+   case IP_VERSION(3, 5, 0):
+   case IP_VERSION(3, 5, 1):
+   hw_params.ips_sequential_ono = adev->external_rev_id > 0x10;
+   break;
+   default:
+   break;
+   }
+
status = dmub_srv_hw_init(dmub_srv, _params);
if (status != DMUB_STATUS_OK) {
DRM_ERROR("Error initializing DMUB HW: %d\n", status);
diff --git a/drivers/gpu/drm/amd/display/dmub/dmub_srv.h 
b/drivers/gpu/drm/amd/display/dmub/dmub_srv.h
index 662bdb0e5d3d..2fde1f043d50 100644
--- a/drivers/gpu/drm/amd/display/dmub/dmub_srv.h
+++ b/drivers/gpu/drm/amd/display/dmub/dmub_srv.h
@@ -297,6 +297,7 @@ struct dmub_srv_hw_params {
bool dpia_hpd_int_enable_supported;
bool disable_clock_gate;
bool disallow_dispclk_dppclk_ds;
+   bool ips_sequential_ono;
enum dmub_memory_access_type mem_access_type;
enum dmub_ips_disable_type disable_ips;
 };
diff --git a/drivers/gpu/drm/amd/display/dmub/src/dmub_dcn35.c 
b/drivers/gpu/drm/amd/display/dmub/src/dmub_dcn35.c
index 98afaecd3984..70e63aeb8f89 100644
--- a/drivers/gpu/drm/amd/display/dmub/src/dmub_dcn35.c
+++ b/drivers/gpu/drm/amd/display/dmub/src/dmub_dcn35.c
@@ -420,6 +420,7 @@ void dmub_dcn35_enable_dmub_boot_options(struct dmub_srv 
*dmub, const struct dmu
boot_options.bits.disable_clk_ds = params->disallow_dispclk_dppclk_ds;
boot_options.bits.disable_clk_gate = params->disable_clock_gate;
boot_options.bits.ips_disable = params->disable_ips;
+   boot_options.bits.ips_sequential_ono = params->ips_sequential_ono;
 
REG_WRITE(DMCUB_SCRATCH14, boot_options.all);
 }
-- 
2.43.0



[PATCH 04/25] drm/amd/display: limit the code change to ips enabled asic

2024-04-10 Thread Rodrigo Siqueira
From: Charlene Liu 

Limit the code change for ips enable to reduce the impact for now. Also
exit_ips first before dc_power_down to avoid 0x9f.

Reviewed-by: Chris Park 
Acked-by: Rodrigo Siqueira 
Signed-off-by: Charlene Liu 
---
 drivers/gpu/drm/amd/display/dc/core/dc.c | 7 ++-
 1 file changed, 6 insertions(+), 1 deletion(-)

diff --git a/drivers/gpu/drm/amd/display/dc/core/dc.c 
b/drivers/gpu/drm/amd/display/dc/core/dc.c
index 145cdab92ca0..01c75b66e8f1 100644
--- a/drivers/gpu/drm/amd/display/dc/core/dc.c
+++ b/drivers/gpu/drm/amd/display/dc/core/dc.c
@@ -5042,8 +5042,13 @@ void dc_interrupt_ack(struct dc *dc, enum dc_irq_source 
src)
 void dc_power_down_on_boot(struct dc *dc)
 {
if (dc->ctx->dce_environment != DCE_ENV_VIRTUAL_HW &&
-   dc->hwss.power_down_on_boot)
+   dc->hwss.power_down_on_boot) {
+
+   if (dc->caps.ips_support)
+   dc_exit_ips_for_hw_access(dc);
+
dc->hwss.power_down_on_boot(dc);
+   }
 }
 
 void dc_set_power_state(
-- 
2.43.0



[PATCH 05/25] drm/amd/display: add support for chroma offset

2024-04-10 Thread Rodrigo Siqueira
From: Samson Tam 

[Why]
Adding support for chroma subsampling offset (cositing) in scaler
calculations to adjust reference point where we determine post-scaling
chroma value in YUV420 surfaces.

[How]
Add support for cositing options: NONE, LEFT and TOPLEFT Add debug
option force_cositing and set default to TOPLEFT to maintain same
behaviour as without offset support.

Reviewed-by: Jun Lei 
Acked-by: Rodrigo Siqueira 
Signed-off-by: Samson Tam 
---
 drivers/gpu/drm/amd/display/dc/dc.h  | 3 +++
 drivers/gpu/drm/amd/display/dc/dc_hw_types.h | 7 +++
 2 files changed, 10 insertions(+)

diff --git a/drivers/gpu/drm/amd/display/dc/dc.h 
b/drivers/gpu/drm/amd/display/dc/dc.h
index 54534df73e83..188f2d401124 100644
--- a/drivers/gpu/drm/amd/display/dc/dc.h
+++ b/drivers/gpu/drm/amd/display/dc/dc.h
@@ -1003,6 +1003,7 @@ struct dc_debug_options {
unsigned int static_screen_wait_frames;
bool force_chroma_subsampling_1tap;
bool disable_422_left_edge_pixel;
+   unsigned int force_cositing;
 };
 
 struct gpu_info_soc_bounding_box_v1_0;
@@ -1285,6 +1286,7 @@ struct dc_plane_state {
struct tg_color visual_confirm_color;
 
bool is_statically_allocated;
+   enum chroma_cositing cositing;
 };
 
 struct dc_plane_info {
@@ -1303,6 +1305,7 @@ struct dc_plane_info {
int  global_alpha_value;
bool input_csc_enabled;
int layer_index;
+   enum chroma_cositing cositing;
 };
 
 #include "dc_stream.h"
diff --git a/drivers/gpu/drm/amd/display/dc/dc_hw_types.h 
b/drivers/gpu/drm/amd/display/dc/dc_hw_types.h
index 465e15f57f93..2ad7f60805f5 100644
--- a/drivers/gpu/drm/amd/display/dc/dc_hw_types.h
+++ b/drivers/gpu/drm/amd/display/dc/dc_hw_types.h
@@ -738,6 +738,13 @@ enum scanning_type {
SCANNING_TYPE_UNDEFINED
 };
 
+enum chroma_cositing {
+   CHROMA_COSITING_NONE,
+   CHROMA_COSITING_LEFT,
+   CHROMA_COSITING_TOPLEFT,
+   CHROMA_COSITING_COUNT
+};
+
 struct dc_crtc_timing_flags {
uint32_t INTERLACE :1;
uint32_t HSYNC_POSITIVE_POLARITY :1; /* when set to 1,
-- 
2.43.0



[PATCH 02/25] drm/amd/display: Add a function for checking tmds mode

2024-04-10 Thread Rodrigo Siqueira
From: Chris Park 

[Why]
DVI is TMDS signal like HDMI but without audio.  Current signal check
does not correctly reflect DVI clock programming.

[How]
Define a new signal check for TMDS that includes DVI to HDMI TMDS
programming.

Reviewed-by: Dillon Varone 
Acked-by: Rodrigo Siqueira 
Signed-off-by: Chris Park 
---
 drivers/gpu/drm/amd/display/include/signal_types.h | 13 +
 1 file changed, 13 insertions(+)

diff --git a/drivers/gpu/drm/amd/display/include/signal_types.h 
b/drivers/gpu/drm/amd/display/include/signal_types.h
index 1b14b17a79c7..a10d6b988aab 100644
--- a/drivers/gpu/drm/amd/display/include/signal_types.h
+++ b/drivers/gpu/drm/amd/display/include/signal_types.h
@@ -118,6 +118,19 @@ static inline bool dc_is_dvi_signal(enum signal_type 
signal)
}
 }
 
+static inline bool dc_is_tmds_signal(enum signal_type signal)
+{
+   switch (signal) {
+   case SIGNAL_TYPE_DVI_SINGLE_LINK:
+   case SIGNAL_TYPE_DVI_DUAL_LINK:
+   case SIGNAL_TYPE_HDMI_TYPE_A:
+   return true;
+   break;
+   default:
+   return false;
+   }
+}
+
 static inline bool dc_is_dvi_single_link_signal(enum signal_type signal)
 {
return (signal == SIGNAL_TYPE_DVI_SINGLE_LINK);
-- 
2.43.0



[PATCH 03/25] drm/amd/display: Modify resource allocation logic

2024-04-10 Thread Rodrigo Siqueira
From: Sung Joon Kim 

To reduce the complexity of pipe resource allocation for different
use-cases, now we search for any free pipe sequentially rather than from
bottom up.

Reviewed-by: Wenjing Liu 
Acked-by: Rodrigo Siqueira 
Signed-off-by: Sung Joon Kim 
---
 .../dc/resource/dcn32/dcn32_resource.c|  4 +--
 .../dc/resource/dcn32/dcn32_resource.h|  6 
 .../dc/resource/dcn351/dcn351_resource.c  | 35 ++-
 .../dc/resource/dcn351/dcn351_resource.h  |  6 
 4 files changed, 48 insertions(+), 3 deletions(-)

diff --git a/drivers/gpu/drm/amd/display/dc/resource/dcn32/dcn32_resource.c 
b/drivers/gpu/drm/amd/display/dc/resource/dcn32/dcn32_resource.c
index 9aa39bd25be9..c16e915686fc 100644
--- a/drivers/gpu/drm/amd/display/dc/resource/dcn32/dcn32_resource.c
+++ b/drivers/gpu/drm/amd/display/dc/resource/dcn32/dcn32_resource.c
@@ -2547,7 +2547,7 @@ struct resource_pool *dcn32_create_resource_pool(
  * full update which delays the flip for 1 frame. If we use the original pipe
  * we don't have to toggle its power. So we can flip faster.
  */
-static int find_optimal_free_pipe_as_secondary_dpp_pipe(
+int dcn32_find_optimal_free_pipe_as_secondary_dpp_pipe(
const struct resource_context *cur_res_ctx,
struct resource_context *new_res_ctx,
const struct resource_pool *pool,
@@ -2730,7 +2730,7 @@ struct pipe_ctx 
*dcn32_acquire_free_pipe_as_secondary_dpp_pipe(
return dcn32_acquire_idle_pipe_for_head_pipe_in_layer(
new_ctx, pool, opp_head_pipe->stream, 
opp_head_pipe);
 
-   free_pipe_idx = find_optimal_free_pipe_as_secondary_dpp_pipe(
+   free_pipe_idx = dcn32_find_optimal_free_pipe_as_secondary_dpp_pipe(
_ctx->res_ctx, _ctx->res_ctx,
pool, opp_head_pipe);
if (free_pipe_idx >= 0) {
diff --git a/drivers/gpu/drm/amd/display/dc/resource/dcn32/dcn32_resource.h 
b/drivers/gpu/drm/amd/display/dc/resource/dcn32/dcn32_resource.h
index 286e20ad46ed..fee67fbab8e2 100644
--- a/drivers/gpu/drm/amd/display/dc/resource/dcn32/dcn32_resource.h
+++ b/drivers/gpu/drm/amd/display/dc/resource/dcn32/dcn32_resource.h
@@ -137,6 +137,12 @@ bool dcn32_any_surfaces_rotated(struct dc *dc, struct 
dc_state *context);
 bool dcn32_is_center_timing(struct pipe_ctx *pipe);
 bool dcn32_is_psr_capable(struct pipe_ctx *pipe);
 
+int dcn32_find_optimal_free_pipe_as_secondary_dpp_pipe(
+   const struct resource_context *cur_res_ctx,
+   struct resource_context *new_res_ctx,
+   const struct resource_pool *pool,
+   const struct pipe_ctx *new_opp_head);
+
 struct pipe_ctx *dcn32_acquire_free_pipe_as_secondary_dpp_pipe(
const struct dc_state *cur_ctx,
struct dc_state *new_ctx,
diff --git a/drivers/gpu/drm/amd/display/dc/resource/dcn351/dcn351_resource.c 
b/drivers/gpu/drm/amd/display/dc/resource/dcn351/dcn351_resource.c
index 8a57adb27264..cc1a44a890b5 100644
--- a/drivers/gpu/drm/amd/display/dc/resource/dcn351/dcn351_resource.c
+++ b/drivers/gpu/drm/amd/display/dc/resource/dcn351/dcn351_resource.c
@@ -1728,6 +1728,37 @@ static bool dcn351_validate_bandwidth(struct dc *dc,
return out;
 }
 
+struct pipe_ctx *dcn351_acquire_free_pipe_as_secondary_dpp_pipe(
+   const struct dc_state *cur_ctx,
+   struct dc_state *new_ctx,
+   const struct resource_pool *pool,
+   const struct pipe_ctx *opp_head_pipe)
+{
+   int free_pipe_idx;
+   struct pipe_ctx *free_pipe;
+
+   free_pipe_idx = dcn32_find_optimal_free_pipe_as_secondary_dpp_pipe(
+   _ctx->res_ctx, _ctx->res_ctx,
+   pool, opp_head_pipe);
+   if (free_pipe_idx >= 0) {
+   free_pipe = _ctx->res_ctx.pipe_ctx[free_pipe_idx];
+   free_pipe->pipe_idx = free_pipe_idx;
+   free_pipe->stream = opp_head_pipe->stream;
+   free_pipe->stream_res.tg = opp_head_pipe->stream_res.tg;
+   free_pipe->stream_res.opp = opp_head_pipe->stream_res.opp;
+
+   free_pipe->plane_res.hubp = pool->hubps[free_pipe->pipe_idx];
+   free_pipe->plane_res.ipp = pool->ipps[free_pipe->pipe_idx];
+   free_pipe->plane_res.dpp = pool->dpps[free_pipe->pipe_idx];
+   free_pipe->plane_res.mpcc_inst =
+   pool->dpps[free_pipe->pipe_idx]->inst;
+   } else {
+   ASSERT(opp_head_pipe);
+   free_pipe = NULL;
+   }
+
+   return free_pipe;
+}
 
 static struct resource_funcs dcn351_res_pool_funcs = {
.destroy = dcn351_destroy_resource_pool,
@@ -1740,7 +1771,8 @@ static struct resource_funcs dcn351_res_pool_funcs = {
.calculate_wm_and_dlg = NULL,
.update_soc_for_wm_a = dcn31_update_soc_for_wm_a,

[PATCH 01/25] drm/amd/display: Modify power sequence

2024-04-10 Thread Rodrigo Siqueira
From: Sung Joon Kim 

Need to update the power sequence to help prevent potential issues like
multi-display or multi-plane.

Reviewed-by: Duncan Ma 
Acked-by: Rodrigo Siqueira 
Signed-off-by: Sung Joon Kim 
---
 drivers/gpu/drm/amd/display/dc/hwss/Makefile  |   2 +-
 .../drm/amd/display/dc/hwss/dcn351/Makefile   |  25 ++-
 .../amd/display/dc/hwss/dcn351/dcn351_hwseq.c | 182 ++
 .../amd/display/dc/hwss/dcn351/dcn351_hwseq.h |  41 
 .../amd/display/dc/hwss/dcn351/dcn351_init.c  |   9 +-
 5 files changed, 247 insertions(+), 12 deletions(-)
 create mode 100644 drivers/gpu/drm/amd/display/dc/hwss/dcn351/dcn351_hwseq.c
 create mode 100644 drivers/gpu/drm/amd/display/dc/hwss/dcn351/dcn351_hwseq.h

diff --git a/drivers/gpu/drm/amd/display/dc/hwss/Makefile 
b/drivers/gpu/drm/amd/display/dc/hwss/Makefile
index 9e8e9de51a92..cf8aa23b4415 100644
--- a/drivers/gpu/drm/amd/display/dc/hwss/Makefile
+++ b/drivers/gpu/drm/amd/display/dc/hwss/Makefile
@@ -180,7 +180,7 @@ AMD_DISPLAY_FILES += $(AMD_DAL_HWSS_DCN35)
 
 ###
 
-HWSS_DCN351 = dcn351_init.o
+HWSS_DCN351 = dcn351_hwseq.o dcn351_init.o
 
 AMD_DAL_HWSS_DCN351 = $(addprefix $(AMDDALPATH)/dc/hwss/dcn351/,$(HWSS_DCN351))
 
diff --git a/drivers/gpu/drm/amd/display/dc/hwss/dcn351/Makefile 
b/drivers/gpu/drm/amd/display/dc/hwss/dcn351/Makefile
index b24ad27fe6ef..a4b3c1e99ec6 100644
--- a/drivers/gpu/drm/amd/display/dc/hwss/dcn351/Makefile
+++ b/drivers/gpu/drm/amd/display/dc/hwss/dcn351/Makefile
@@ -1,16 +1,27 @@
 #
-# (c) Copyright 2022 Advanced Micro Devices, Inc. All the rights reserved
+# Copyright (c) 2022-2024 Advanced Micro Devices, Inc.
 #
-#  All rights reserved.  This notice is intended as a precaution against
-#  inadvertent publication and does not imply publication or any waiver
-#  of confidentiality.  The year included in the foregoing notice is the
-#  year of creation of the work.
+# Permission is hereby granted, free of charge, to any person obtaining a
+# copy of this software and associated documentation files (the "Software"),
+# to deal in the Software without restriction, including without limitation
+# the rights to use, copy, modify, merge, publish, distribute, sublicense,
+# and/or sell copies of the Software, and to permit persons to whom the
+# Software is furnished to do so, subject to the following conditions:
 #
-#  Authors: AMD
+# The above copyright notice and this permission notice shall be included in
+# all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
+# THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
+# OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+# ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+# OTHER DEALINGS IN THE SOFTWARE.
 #
 # Makefile for DCN351.
 
-DCN351 = dcn351_init.o
+DCN351 = dcn351_hwseq.o dcn351_init.o
 
 AMD_DAL_DCN351 = $(addprefix $(AMDDALPATH)/dc/dcn351/,$(DCN351))
 
diff --git a/drivers/gpu/drm/amd/display/dc/hwss/dcn351/dcn351_hwseq.c 
b/drivers/gpu/drm/amd/display/dc/hwss/dcn351/dcn351_hwseq.c
new file mode 100644
index ..93fe5b262a3d
--- /dev/null
+++ b/drivers/gpu/drm/amd/display/dc/hwss/dcn351/dcn351_hwseq.c
@@ -0,0 +1,182 @@
+/* SPDX-License-Identifier: MIT */
+/*
+ * Copyright 2024 Advanced Micro Devices, Inc.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
+ * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
+ * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+ * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+ * OTHER DEALINGS IN THE SOFTWARE.
+ *
+ * Authors: AMD
+ *
+ */
+
+#include "core_types.h"
+#include "resource.h"
+#include "dcn351_hwseq.h"
+#include "dcn35/dcn35_hwseq.h"
+
+#define DC_LOGGER_INIT(logger) \
+   struct dal_logger *dc_logger = logger
+
+#define DC_LOGGER \
+   dc_logger
+
+void dcn351_calc_blocks_to_gate(struct dc *dc, 

[PATCH 00/25] DC Patches April 10, 2024

2024-04-10 Thread Rodrigo Siqueira
This DC patchset brings improvements in multiple areas. In summary, we
have:
 
* Expand dmub_cmd operations.
* Update DVI configuration.
* Modify power sequence.
* Enable Z10 flag for IPS.
* Multiple code cleanups.

Cc: Daniel Wheeler 

Thanks
Siqueira

Anthony Koo (1):
  drm/amd/display: Expand dmub_cmd operations

Aric Cyr (1):
  drm/amd/display: 3.2.281

Bitnun, Ethan (1):
  drm/amd/display: Improve the log precision

Chaitanya Dhere (1):
  drm/amd/display: Fix incorrect pointer assignment

Charlene Liu (1):
  drm/amd/display: limit the code change to ips enabled asic

Chris Park (1):
  drm/amd/display: Add a function for checking tmds mode

Eric Bernstein (1):
  drm/amd/display: Update FMT settings for 4:2:0

Mikita Lipski (1):
  drm/amd/display: Fix PSR command version passed

Nicholas Kazlauskas (1):
  drm/amd/display: Pass sequential ONO bit to DMCUB boot options

Rodrigo Siqueira (11):
  drm/amd/display: Use dce_version instead of chip_id
  drm/amd/display: Adjust headers
  drm/amd/display: Group scl_data together in
resource_build_scaling_params
  drm/amd/display: Replace int with unsigned int
  drm/amd/display: Update some comments to improve the code readability
  drm/amd/display: Remove unnecessary code
  drm/amd/display: Rework dcn10_stream_encoder header
  drm/amd/display: Move REG sequence from program ogam to idle before
connect
  drm/amd/display: Update DCN201 link encoder registers
  drm/amd/display: Add missing callback for init_watermarks in DCN 301
  drm/amd/display: Add missing replay field

Samson Tam (1):
  drm/amd/display: add support for chroma offset

Sung Joon Kim (4):
  drm/amd/display: Modify power sequence
  drm/amd/display: Modify resource allocation logic
  drm/amd/display: Enable Z10 flag for IPS FSM
  drm/amd/display: Rework power sequence and resource allocation logic

 .../gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c |   9 +
 .../gpu/drm/amd/display/dc/clk_mgr/clk_mgr.c  |   2 +-
 .../display/dc/clk_mgr/dcn32/dcn32_clk_mgr.c  |   3 +-
 drivers/gpu/drm/amd/display/dc/core/dc.c  |   8 +-
 .../gpu/drm/amd/display/dc/core/dc_resource.c |   5 +-
 .../gpu/drm/amd/display/dc/core/dc_state.c|  10 +-
 .../gpu/drm/amd/display/dc/core/dc_stream.c   |   2 +-
 drivers/gpu/drm/amd/display/dc/dc.h   |  16 +-
 drivers/gpu/drm/amd/display/dc/dc_hw_types.h  |   7 +
 drivers/gpu/drm/amd/display/dc/dc_types.h |   2 +
 .../gpu/drm/amd/display/dc/dce/dce_i2c_hw.c   |   6 -
 .../amd/display/dc/dcn10/dcn10_link_encoder.h |   6 -
 .../gpu/drm/amd/display/dc/dcn10/dcn10_opp.c  |   9 +-
 .../gpu/drm/amd/display/dc/dcn10/dcn10_opp.h  |   2 +
 .../display/dc/dcn10/dcn10_stream_encoder.h   |  10 +-
 .../gpu/drm/amd/display/dc/dcn20/dcn20_hubp.h |   2 +-
 .../gpu/drm/amd/display/dc/dcn20/dcn20_mpc.c  |  10 +-
 .../drm/amd/display/dc/dcn201/dcn201_hubp.c   |   5 +
 .../display/dc/dcn201/dcn201_link_encoder.h   |  14 +-
 .../gpu/drm/amd/display/dc/dcn30/dcn30_dccg.h |  18 --
 .../dc/dcn30/dcn30_dio_stream_encoder.c   |   1 -
 .../gpu/drm/amd/display/dc/dcn30/dcn30_dwb.c  |   2 -
 .../drm/amd/display/dc/dcn301/dcn301_hubbub.c |   1 +
 drivers/gpu/drm/amd/display/dc/hwss/Makefile  |   2 +-
 .../drm/amd/display/dc/hwss/dcn351/Makefile   |  25 ++-
 .../amd/display/dc/hwss/dcn351/dcn351_hwseq.c | 182 ++
 .../amd/display/dc/hwss/dcn351/dcn351_hwseq.h |  41 
 .../amd/display/dc/hwss/dcn351/dcn351_init.c  |   1 +
 .../dc/resource/dcn32/dcn32_resource.c|   4 +-
 .../dc/resource/dcn32/dcn32_resource.h|   6 +
 .../dc/resource/dcn351/dcn351_resource.c  |   5 +-
 drivers/gpu/drm/amd/display/dmub/dmub_srv.h   |   1 +
 .../gpu/drm/amd/display/dmub/inc/dmub_cmd.h   |  53 -
 .../gpu/drm/amd/display/dmub/src/dmub_dcn35.c |   1 +
 .../drm/amd/display/include/signal_types.h|  13 ++
 35 files changed, 402 insertions(+), 82 deletions(-)
 create mode 100644 drivers/gpu/drm/amd/display/dc/hwss/dcn351/dcn351_hwseq.c
 create mode 100644 drivers/gpu/drm/amd/display/dc/hwss/dcn351/dcn351_hwseq.h

-- 
2.43.0



RE: [PATCH] drm/amdkfd: Fix memory leak in create_process failure

2024-04-10 Thread Joshi, Mukul
[AMD Official Use Only - General]

> -Original Message-
> From: amd-gfx  On Behalf Of Felix
> Kuehling
> Sent: Wednesday, April 10, 2024 4:05 PM
> To: amd-gfx@lists.freedesktop.org
> Cc: Chen, Xiaogang 
> Subject: [PATCH] drm/amdkfd: Fix memory leak in create_process failure
>
> Caution: This message originated from an External Source. Use proper caution
> when opening attachments, clicking links, or responding.
>
>
> Fix memory leak due to a leaked mmget reference on an error handling code
> path that is triggered when attempting to create KFD processes while a GPU
> reset is in progress.
>
> Fixes: 0ab2d7532b05 ("drm/amdkfd: prepare per-process debug enable and
> disable")
> CC: Xiaogang Chen 
> Signed-off-by: Felix Kuehling 


Reviewed-by: Mukul Joshi 

> ---
>  drivers/gpu/drm/amd/amdkfd/kfd_process.c | 4 ++--
>  1 file changed, 2 insertions(+), 2 deletions(-)
>
> diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_process.c
> b/drivers/gpu/drm/amd/amdkfd/kfd_process.c
> index 717a60d7a4ea..b79986412cd8 100644
> --- a/drivers/gpu/drm/amd/amdkfd/kfd_process.c
> +++ b/drivers/gpu/drm/amd/amdkfd/kfd_process.c
> @@ -819,9 +819,9 @@ struct kfd_process *kfd_create_process(struct
> task_struct *thread)
> mutex_lock(_processes_mutex);
>
> if (kfd_is_locked()) {
> -   mutex_unlock(_processes_mutex);
> pr_debug("KFD is locked! Cannot create process");
> -   return ERR_PTR(-EINVAL);
> +   process = ERR_PTR(-EINVAL);
> +   goto out;
> }
>
> /* A prior open of /dev/kfd could have already created the process. */
> --
> 2.34.1



RE: [PATCH] drm/amdkfd: Fix memory leak in create_process failure

2024-04-10 Thread Kasiviswanathan, Harish
[AMD Official Use Only - General]

Tested-by: Harish Kasiviswanthan 

-Original Message-
From: amd-gfx  On Behalf Of Felix 
Kuehling
Sent: Wednesday, April 10, 2024 4:05 PM
To: amd-gfx@lists.freedesktop.org
Cc: Chen, Xiaogang 
Subject: [PATCH] drm/amdkfd: Fix memory leak in create_process failure

Fix memory leak due to a leaked mmget reference on an error handling
code path that is triggered when attempting to create KFD processes
while a GPU reset is in progress.

Fixes: 0ab2d7532b05 ("drm/amdkfd: prepare per-process debug enable and disable")
CC: Xiaogang Chen 
Signed-off-by: Felix Kuehling 
---
 drivers/gpu/drm/amd/amdkfd/kfd_process.c | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_process.c 
b/drivers/gpu/drm/amd/amdkfd/kfd_process.c
index 717a60d7a4ea..b79986412cd8 100644
--- a/drivers/gpu/drm/amd/amdkfd/kfd_process.c
+++ b/drivers/gpu/drm/amd/amdkfd/kfd_process.c
@@ -819,9 +819,9 @@ struct kfd_process *kfd_create_process(struct task_struct 
*thread)
mutex_lock(_processes_mutex);

if (kfd_is_locked()) {
-   mutex_unlock(_processes_mutex);
pr_debug("KFD is locked! Cannot create process");
-   return ERR_PTR(-EINVAL);
+   process = ERR_PTR(-EINVAL);
+   goto out;
}

/* A prior open of /dev/kfd could have already created the process. */
--
2.34.1



[PATCH] drm/amdkfd: Fix memory leak in create_process failure

2024-04-10 Thread Felix Kuehling
Fix memory leak due to a leaked mmget reference on an error handling
code path that is triggered when attempting to create KFD processes
while a GPU reset is in progress.

Fixes: 0ab2d7532b05 ("drm/amdkfd: prepare per-process debug enable and disable")
CC: Xiaogang Chen 
Signed-off-by: Felix Kuehling 
---
 drivers/gpu/drm/amd/amdkfd/kfd_process.c | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_process.c 
b/drivers/gpu/drm/amd/amdkfd/kfd_process.c
index 717a60d7a4ea..b79986412cd8 100644
--- a/drivers/gpu/drm/amd/amdkfd/kfd_process.c
+++ b/drivers/gpu/drm/amd/amdkfd/kfd_process.c
@@ -819,9 +819,9 @@ struct kfd_process *kfd_create_process(struct task_struct 
*thread)
mutex_lock(_processes_mutex);
 
if (kfd_is_locked()) {
-   mutex_unlock(_processes_mutex);
pr_debug("KFD is locked! Cannot create process");
-   return ERR_PTR(-EINVAL);
+   process = ERR_PTR(-EINVAL);
+   goto out;
}
 
/* A prior open of /dev/kfd could have already created the process. */
-- 
2.34.1



[linux-next:master] BUILD REGRESSION 6ebf211bb11dfc004a2ff73a9de5386fa309c430

2024-04-10 Thread kernel test robot
tree/branch: 
https://git.kernel.org/pub/scm/linux/kernel/git/next/linux-next.git master
branch HEAD: 6ebf211bb11dfc004a2ff73a9de5386fa309c430  Add linux-next specific 
files for 20240410

Error/Warning reports:

https://lore.kernel.org/oe-kbuild-all/202404102353.cv1gujk3-...@intel.com

Error/Warning: (recently discovered and may have been fixed)

WARNING: modpost: vmlinux: section mismatch in reference: bitmap_read+0x128 
(section: .text.unlikely) -> __setup_str_initcall_blacklist (section: 
.init.rodata)
drivers/gpu/drm/drm_mm.c:614:20: error: function 'drm_mm_node_scanned_block' is 
not needed and will not be emitted [-Werror,-Wunneeded-internal-declaration]

Unverified Error/Warning (likely false positive, please contact us if 
interested):

fs/exfat/file.c:554 exfat_extend_valid_size() error: uninitialized symbol 'err'.

Error/Warning ids grouped by kconfigs:

gcc_recent_errors
|-- alpha-allyesconfig
|   |-- 
drivers-gpu-drm-imx-ipuv3-imx-ldb.c:error:_sel-directive-output-may-be-truncated-writing-bytes-into-a-region-of-size-between-and
|   `-- 
drivers-gpu-drm-nouveau-nouveau_backlight.c:error:d-directive-output-may-be-truncated-writing-between-and-bytes-into-a-region-of-size
|-- arm-allmodconfig
|   |-- 
drivers-gpu-drm-imx-ipuv3-imx-ldb.c:error:_sel-directive-output-may-be-truncated-writing-bytes-into-a-region-of-size-between-and
|   `-- 
drivers-gpu-drm-nouveau-nouveau_backlight.c:error:d-directive-output-may-be-truncated-writing-between-and-bytes-into-a-region-of-size
|-- arm-allyesconfig
|   |-- 
drivers-gpu-drm-imx-ipuv3-imx-ldb.c:error:_sel-directive-output-may-be-truncated-writing-bytes-into-a-region-of-size-between-and
|   `-- 
drivers-gpu-drm-nouveau-nouveau_backlight.c:error:d-directive-output-may-be-truncated-writing-between-and-bytes-into-a-region-of-size
|-- csky-alldefconfig
|   |-- lib-..-mm-internal.h:warning:suggest-parentheses-around-in-operand-of
|   `-- mm-internal.h:warning:suggest-parentheses-around-in-operand-of
|-- csky-allmodconfig
|   |-- 
drivers-gpu-drm-imx-ipuv3-imx-ldb.c:error:_sel-directive-output-may-be-truncated-writing-bytes-into-a-region-of-size-between-and
|   |-- 
drivers-gpu-drm-nouveau-nouveau_backlight.c:error:d-directive-output-may-be-truncated-writing-between-and-bytes-into-a-region-of-size
|   |-- lib-..-mm-internal.h:warning:suggest-parentheses-around-in-operand-of
|   |-- mm-damon-..-internal.h:warning:suggest-parentheses-around-in-operand-of
|   `-- mm-internal.h:warning:suggest-parentheses-around-in-operand-of
|-- csky-allnoconfig
|   |-- lib-..-mm-internal.h:warning:suggest-parentheses-around-in-operand-of
|   `-- mm-internal.h:warning:suggest-parentheses-around-in-operand-of
|-- csky-allyesconfig
|   |-- 
drivers-gpu-drm-imx-ipuv3-imx-ldb.c:error:_sel-directive-output-may-be-truncated-writing-bytes-into-a-region-of-size-between-and
|   |-- 
drivers-gpu-drm-nouveau-nouveau_backlight.c:error:d-directive-output-may-be-truncated-writing-between-and-bytes-into-a-region-of-size
|   |-- lib-..-mm-internal.h:warning:suggest-parentheses-around-in-operand-of
|   |-- mm-damon-..-internal.h:warning:suggest-parentheses-around-in-operand-of
|   `-- mm-internal.h:warning:suggest-parentheses-around-in-operand-of
|-- csky-defconfig
|   |-- lib-..-mm-internal.h:warning:suggest-parentheses-around-in-operand-of
|   `-- mm-internal.h:warning:suggest-parentheses-around-in-operand-of
|-- csky-randconfig-001-20240410
|   |-- lib-..-mm-internal.h:warning:suggest-parentheses-around-in-operand-of
|   `-- mm-internal.h:warning:suggest-parentheses-around-in-operand-of
|-- csky-randconfig-002-20240410
|   |-- lib-..-mm-internal.h:warning:suggest-parentheses-around-in-operand-of
|   `-- mm-internal.h:warning:suggest-parentheses-around-in-operand-of
|-- csky-randconfig-r054-20240410
|   |-- lib-..-mm-internal.h:warning:suggest-parentheses-around-in-operand-of
|   `-- mm-internal.h:warning:suggest-parentheses-around-in-operand-of
|-- i386-randconfig-141-20240410
|   `-- 
fs-exfat-file.c-exfat_extend_valid_size()-error:uninitialized-symbol-err-.
|-- loongarch-allmodconfig
|   |-- 
drivers-gpu-drm-imx-ipuv3-imx-ldb.c:error:_sel-directive-output-may-be-truncated-writing-bytes-into-a-region-of-size-between-and
|   `-- 
drivers-gpu-drm-nouveau-nouveau_backlight.c:error:d-directive-output-may-be-truncated-writing-between-and-bytes-into-a-region-of-size
|-- loongarch-allyesconfig
|   |-- 
drivers-gpu-drm-imx-ipuv3-imx-ldb.c:error:_sel-directive-output-may-be-truncated-writing-bytes-into-a-region-of-size-between-and
|   `-- 
drivers-gpu-drm-nouveau-nouveau_backlight.c:error:d-directive-output-may-be-truncated-writing-between-and-bytes-into-a-region-of-size
|-- microblaze-allmodconfig
|   |-- 
drivers-gpu-drm-imx-ipuv3-imx-ldb.c:error:_sel-directive-output-may-be-truncated-writing-bytes-into-a-region-of-size-between-and
|   `-- 
drivers-gpu-drm-nouveau-nouveau_backlight.c:error:d-directive-output-may-be-truncated-writing-between-and-bytes-into-a-region-of-size
|-- microblaze-allyescon

[PATCH 2/2] drm/amdgpu: Add support of gfx10 register dump

2024-04-10 Thread Sunil Khatri
Adding initial set of registers for ipdump during
devcoredump starting with gfx10 gc registers.

ip dump is triggered when gpu reset happens via
devcoredump and the memory is allocated by each
ip and is freed once the dump is complete by
devcoredump.

Signed-off-by: Sunil Khatri 
---
 drivers/gpu/drm/amd/amdgpu/amdgpu.h   |  16 ++
 .../gpu/drm/amd/amdgpu/amdgpu_dev_coredump.c  |  22 +++
 drivers/gpu/drm/amd/amdgpu/gfx_v10_0.c| 143 +-
 3 files changed, 180 insertions(+), 1 deletion(-)

diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu.h 
b/drivers/gpu/drm/amd/amdgpu/amdgpu.h
index 65c17c59c152..e173ad86a241 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu.h
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu.h
@@ -139,6 +139,18 @@ enum amdgpu_ss {
AMDGPU_SS_DRV_UNLOAD
 };
 
+struct hwip_reg_entry {
+   u32 hwip;
+   u32 inst;
+   u32 seg;
+   u32 reg_offset;
+};
+
+struct reg_pair {
+   u32 offset;
+   u32 value;
+};
+
 struct amdgpu_watchdog_timer {
bool timeout_fatal_disable;
uint32_t period; /* maxCycles = (1 << period), the number of cycles 
before a timeout */
@@ -1152,6 +1164,10 @@ struct amdgpu_device {
booldebug_largebar;
booldebug_disable_soft_recovery;
booldebug_use_vram_fw_buf;
+
+   /* IP register dump */
+   struct reg_pair *ip_dump;
+   uint32_tnum_regs;
 };
 
 static inline uint32_t amdgpu_ip_version(const struct amdgpu_device *adev,
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_dev_coredump.c 
b/drivers/gpu/drm/amd/amdgpu/amdgpu_dev_coredump.c
index 1129e5e5fb42..2079f67c9fac 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_dev_coredump.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_dev_coredump.c
@@ -261,6 +261,18 @@ amdgpu_devcoredump_read(char *buffer, loff_t offset, 
size_t count,
drm_printf(, "Faulty page starting at address: 0x%016llx\n", 
fault_info->addr);
drm_printf(, "Protection fault status register: 0x%x\n\n", 
fault_info->status);
 
+   /* Add IP dump for each ip */
+   if (coredump->adev->ip_dump != NULL) {
+   struct reg_pair *pair;
+
+   pair = (struct reg_pair *)coredump->adev->ip_dump;
+   drm_printf(, "IP register dump\n");
+   drm_printf(, "Offset \t Value\n");
+   for (int i = 0; i < coredump->adev->num_regs; i++)
+   drm_printf(, "0x%04x \t 0x%08x\n", pair[i].offset, 
pair[i].value);
+   drm_printf(, "\n");
+   }
+
/* Add ring buffer information */
drm_printf(, "Ring buffer information\n");
for (int i = 0; i < coredump->adev->num_rings; i++) {
@@ -299,6 +311,11 @@ amdgpu_devcoredump_read(char *buffer, loff_t offset, 
size_t count,
 
 static void amdgpu_devcoredump_free(void *data)
 {
+   struct amdgpu_coredump_info *temp = data;
+
+   kfree(temp->adev->ip_dump);
+   temp->adev->ip_dump = NULL;
+   temp->adev->num_regs = 0;
kfree(data);
 }
 
@@ -337,6 +354,11 @@ void amdgpu_coredump(struct amdgpu_device *adev, bool 
vram_lost,
 
coredump->adev = adev;
 
+   /* Trigger ip dump here to capture the value of registers */
+   for (int i = 0; i < adev->num_ip_blocks; i++)
+   if (adev->ip_blocks[i].version->funcs->dump_ip_state)
+   adev->ip_blocks[i].version->funcs->dump_ip_state((void 
*)adev);
+
ktime_get_ts64(>reset_time);
 
dev_coredumpm(dev->dev, THIS_MODULE, coredump, 0, GFP_NOWAIT,
diff --git a/drivers/gpu/drm/amd/amdgpu/gfx_v10_0.c 
b/drivers/gpu/drm/amd/amdgpu/gfx_v10_0.c
index a0bc4196ff8b..05c4b1d62132 100644
--- a/drivers/gpu/drm/amd/amdgpu/gfx_v10_0.c
+++ b/drivers/gpu/drm/amd/amdgpu/gfx_v10_0.c
@@ -47,6 +47,22 @@
 #include "gfx_v10_0.h"
 #include "nbio_v2_3.h"
 
+/*
+ * Manually adding some of the missing gfx10 registers from spec
+ */
+#define mmCP_DEBUG_BASE_IDX0
+#define mmCP_DEBUG 0x1e1f
+#define mmCP_MES_DEBUG_INTERRUPT_INSTR_PNTR_BASE_IDX   1
+#define mmCP_MES_DEBUG_INTERRUPT_INSTR_PNTR0x2840
+#define mmRLC_GPM_DEBUG_INST_A_BASE_IDX1
+#define mmRLC_GPM_DEBUG_INST_A 0x4c22
+#define mmRLC_GPM_DEBUG_INST_B_BASE_IDX1
+#define mmRLC_GPM_DEBUG_INST_B 0x4c23
+#define mmRLC_GPM_DEBUG_INST_ADDR_BASE_IDX 1
+#define mmRLC_GPM_DEBUG_INST_ADDR  0x4c1d
+#define mmRLC_LX6_CORE_PDEBUG_INST_BASE_IDX1
+#define mmRLC_LX6_CORE_PDEBUG_INST 0x4deb
+
 /*
  * Navi10 has two graphic rings to share each graphic pipe.
  * 1. Primary ring
@@ -276,6 +292,99 @@ MODULE_FIRMWARE("amdgpu/gc_10_3_7_mec.bin");
 MODULE_FIRMWARE("amdgpu/gc_10_3_7_mec2.bin");
 

[PATCH 1/2] drm/amdgpu: add prototype to dump ip state

2024-04-10 Thread Sunil Khatri
Add the prototype for all the ips of different
asics and set them to NULL for now and based on
the need will keep adding the function for each
ip eventually.

Signed-off-by: Sunil Khatri 
---
 drivers/gpu/drm/amd/amdgpu/amdgpu_acp.c   | 1 +
 drivers/gpu/drm/amd/amdgpu/amdgpu_umsch_mm.c  | 1 +
 drivers/gpu/drm/amd/amdgpu/amdgpu_vkms.c  | 1 +
 drivers/gpu/drm/amd/amdgpu/cik.c  | 1 +
 drivers/gpu/drm/amd/amdgpu/cik_ih.c   | 1 +
 drivers/gpu/drm/amd/amdgpu/cik_sdma.c | 1 +
 drivers/gpu/drm/amd/amdgpu/cz_ih.c| 1 +
 drivers/gpu/drm/amd/amdgpu/dce_v10_0.c| 1 +
 drivers/gpu/drm/amd/amdgpu/dce_v11_0.c| 1 +
 drivers/gpu/drm/amd/amdgpu/dce_v6_0.c | 1 +
 drivers/gpu/drm/amd/amdgpu/dce_v8_0.c | 1 +
 drivers/gpu/drm/amd/amdgpu/gfx_v10_0.c| 1 +
 drivers/gpu/drm/amd/amdgpu/gfx_v11_0.c| 1 +
 drivers/gpu/drm/amd/amdgpu/gfx_v6_0.c | 1 +
 drivers/gpu/drm/amd/amdgpu/gfx_v7_0.c | 1 +
 drivers/gpu/drm/amd/amdgpu/gfx_v8_0.c | 1 +
 drivers/gpu/drm/amd/amdgpu/gfx_v9_0.c | 1 +
 drivers/gpu/drm/amd/amdgpu/gfx_v9_4_3.c   | 1 +
 drivers/gpu/drm/amd/amdgpu/gmc_v6_0.c | 1 +
 drivers/gpu/drm/amd/amdgpu/gmc_v7_0.c | 1 +
 drivers/gpu/drm/amd/amdgpu/gmc_v8_0.c | 1 +
 drivers/gpu/drm/amd/amdgpu/iceland_ih.c   | 1 +
 drivers/gpu/drm/amd/amdgpu/ih_v6_0.c  | 1 +
 drivers/gpu/drm/amd/amdgpu/ih_v6_1.c  | 1 +
 drivers/gpu/drm/amd/amdgpu/ih_v7_0.c  | 1 +
 drivers/gpu/drm/amd/amdgpu/jpeg_v2_0.c| 1 +
 drivers/gpu/drm/amd/amdgpu/jpeg_v2_5.c| 2 ++
 drivers/gpu/drm/amd/amdgpu/jpeg_v3_0.c| 1 +
 drivers/gpu/drm/amd/amdgpu/jpeg_v4_0.c| 1 +
 drivers/gpu/drm/amd/amdgpu/jpeg_v4_0_3.c  | 1 +
 drivers/gpu/drm/amd/amdgpu/jpeg_v4_0_5.c  | 1 +
 drivers/gpu/drm/amd/amdgpu/jpeg_v5_0_0.c  | 1 +
 drivers/gpu/drm/amd/amdgpu/mes_v10_1.c| 1 +
 drivers/gpu/drm/amd/amdgpu/mes_v11_0.c| 1 +
 drivers/gpu/drm/amd/amdgpu/navi10_ih.c| 1 +
 drivers/gpu/drm/amd/amdgpu/nv.c   | 1 +
 drivers/gpu/drm/amd/amdgpu/sdma_v2_4.c| 1 +
 drivers/gpu/drm/amd/amdgpu/sdma_v3_0.c| 1 +
 drivers/gpu/drm/amd/amdgpu/si.c   | 1 +
 drivers/gpu/drm/amd/amdgpu/si_dma.c   | 1 +
 drivers/gpu/drm/amd/amdgpu/si_ih.c| 1 +
 drivers/gpu/drm/amd/amdgpu/soc15.c| 1 +
 drivers/gpu/drm/amd/amdgpu/soc21.c| 1 +
 drivers/gpu/drm/amd/amdgpu/tonga_ih.c | 1 +
 drivers/gpu/drm/amd/amdgpu/uvd_v3_1.c | 1 +
 drivers/gpu/drm/amd/amdgpu/uvd_v4_2.c | 1 +
 drivers/gpu/drm/amd/amdgpu/uvd_v5_0.c | 1 +
 drivers/gpu/drm/amd/amdgpu/uvd_v6_0.c | 1 +
 drivers/gpu/drm/amd/amdgpu/vce_v2_0.c | 1 +
 drivers/gpu/drm/amd/amdgpu/vce_v3_0.c | 1 +
 drivers/gpu/drm/amd/amdgpu/vcn_v1_0.c | 1 +
 drivers/gpu/drm/amd/amdgpu/vcn_v2_0.c | 1 +
 drivers/gpu/drm/amd/amdgpu/vcn_v2_5.c | 2 ++
 drivers/gpu/drm/amd/amdgpu/vcn_v3_0.c | 1 +
 drivers/gpu/drm/amd/amdgpu/vcn_v4_0.c | 1 +
 drivers/gpu/drm/amd/amdgpu/vcn_v4_0_3.c   | 1 +
 drivers/gpu/drm/amd/amdgpu/vcn_v4_0_5.c   | 1 +
 drivers/gpu/drm/amd/amdgpu/vcn_v5_0_0.c   | 1 +
 drivers/gpu/drm/amd/amdgpu/vi.c   | 1 +
 drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c | 1 +
 drivers/gpu/drm/amd/include/amd_shared.h  | 1 +
 drivers/gpu/drm/amd/pm/legacy-dpm/kv_dpm.c| 1 +
 drivers/gpu/drm/amd/pm/legacy-dpm/si_dpm.c| 1 +
 drivers/gpu/drm/amd/pm/powerplay/amd_powerplay.c  | 1 +
 64 files changed, 66 insertions(+)

diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_acp.c 
b/drivers/gpu/drm/amd/amdgpu/amdgpu_acp.c
index 6d72355ac492..34a62033a388 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_acp.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_acp.c
@@ -637,6 +637,7 @@ static const struct amd_ip_funcs acp_ip_funcs = {
.soft_reset = acp_soft_reset,
.set_clockgating_state = acp_set_clockgating_state,
.set_powergating_state = acp_set_powergating_state,
+   .dump_ip_state = NULL,
 };
 
 const struct amdgpu_ip_block_version acp_ip_block = {
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_umsch_mm.c 
b/drivers/gpu/drm/amd/amdgpu/amdgpu_umsch_mm.c
index 95f80b9131a8..5bb9e0dacbf3 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_umsch_mm.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_umsch_mm.c
@@ -875,6 +875,7 @@ static const struct amd_ip_funcs umsch_mm_v4_0_ip_funcs = {
.hw_fini = umsch_mm_hw_fini,
.suspend = umsch_mm_suspend,
.resume = umsch_mm_resume,
+   .dump_ip_state = NULL,
 };
 
 const struct amdgpu_ip_block_version umsch_mm_v4_0_ip_block = {
diff --git 

[PATCH 0/2] First set in IP dump patches

2024-04-10 Thread Sunil Khatri
Adding infrastructure needed for ipdump along
with dumping gfx10 registers.

Sunil Khatri (2):
  drm/amdgpu: add prototype to dump ip state
  drm/amdgpu: Add support of gfx10 register dump

 drivers/gpu/drm/amd/amdgpu/amdgpu.h   |  16 ++
 drivers/gpu/drm/amd/amdgpu/amdgpu_acp.c   |   1 +
 .../gpu/drm/amd/amdgpu/amdgpu_dev_coredump.c  |  22 +++
 drivers/gpu/drm/amd/amdgpu/amdgpu_umsch_mm.c  |   1 +
 drivers/gpu/drm/amd/amdgpu/amdgpu_vkms.c  |   1 +
 drivers/gpu/drm/amd/amdgpu/cik.c  |   1 +
 drivers/gpu/drm/amd/amdgpu/cik_ih.c   |   1 +
 drivers/gpu/drm/amd/amdgpu/cik_sdma.c |   1 +
 drivers/gpu/drm/amd/amdgpu/cz_ih.c|   1 +
 drivers/gpu/drm/amd/amdgpu/dce_v10_0.c|   1 +
 drivers/gpu/drm/amd/amdgpu/dce_v11_0.c|   1 +
 drivers/gpu/drm/amd/amdgpu/dce_v6_0.c |   1 +
 drivers/gpu/drm/amd/amdgpu/dce_v8_0.c |   1 +
 drivers/gpu/drm/amd/amdgpu/gfx_v10_0.c| 142 ++
 drivers/gpu/drm/amd/amdgpu/gfx_v11_0.c|   1 +
 drivers/gpu/drm/amd/amdgpu/gfx_v6_0.c |   1 +
 drivers/gpu/drm/amd/amdgpu/gfx_v7_0.c |   1 +
 drivers/gpu/drm/amd/amdgpu/gfx_v8_0.c |   1 +
 drivers/gpu/drm/amd/amdgpu/gfx_v9_0.c |   1 +
 drivers/gpu/drm/amd/amdgpu/gfx_v9_4_3.c   |   1 +
 drivers/gpu/drm/amd/amdgpu/gmc_v6_0.c |   1 +
 drivers/gpu/drm/amd/amdgpu/gmc_v7_0.c |   1 +
 drivers/gpu/drm/amd/amdgpu/gmc_v8_0.c |   1 +
 drivers/gpu/drm/amd/amdgpu/iceland_ih.c   |   1 +
 drivers/gpu/drm/amd/amdgpu/ih_v6_0.c  |   1 +
 drivers/gpu/drm/amd/amdgpu/ih_v6_1.c  |   1 +
 drivers/gpu/drm/amd/amdgpu/ih_v7_0.c  |   1 +
 drivers/gpu/drm/amd/amdgpu/jpeg_v2_0.c|   1 +
 drivers/gpu/drm/amd/amdgpu/jpeg_v2_5.c|   2 +
 drivers/gpu/drm/amd/amdgpu/jpeg_v3_0.c|   1 +
 drivers/gpu/drm/amd/amdgpu/jpeg_v4_0.c|   1 +
 drivers/gpu/drm/amd/amdgpu/jpeg_v4_0_3.c  |   1 +
 drivers/gpu/drm/amd/amdgpu/jpeg_v4_0_5.c  |   1 +
 drivers/gpu/drm/amd/amdgpu/jpeg_v5_0_0.c  |   1 +
 drivers/gpu/drm/amd/amdgpu/mes_v10_1.c|   1 +
 drivers/gpu/drm/amd/amdgpu/mes_v11_0.c|   1 +
 drivers/gpu/drm/amd/amdgpu/navi10_ih.c|   1 +
 drivers/gpu/drm/amd/amdgpu/nv.c   |   1 +
 drivers/gpu/drm/amd/amdgpu/sdma_v2_4.c|   1 +
 drivers/gpu/drm/amd/amdgpu/sdma_v3_0.c|   1 +
 drivers/gpu/drm/amd/amdgpu/si.c   |   1 +
 drivers/gpu/drm/amd/amdgpu/si_dma.c   |   1 +
 drivers/gpu/drm/amd/amdgpu/si_ih.c|   1 +
 drivers/gpu/drm/amd/amdgpu/soc15.c|   1 +
 drivers/gpu/drm/amd/amdgpu/soc21.c|   1 +
 drivers/gpu/drm/amd/amdgpu/tonga_ih.c |   1 +
 drivers/gpu/drm/amd/amdgpu/uvd_v3_1.c |   1 +
 drivers/gpu/drm/amd/amdgpu/uvd_v4_2.c |   1 +
 drivers/gpu/drm/amd/amdgpu/uvd_v5_0.c |   1 +
 drivers/gpu/drm/amd/amdgpu/uvd_v6_0.c |   1 +
 drivers/gpu/drm/amd/amdgpu/vce_v2_0.c |   1 +
 drivers/gpu/drm/amd/amdgpu/vce_v3_0.c |   1 +
 drivers/gpu/drm/amd/amdgpu/vcn_v1_0.c |   1 +
 drivers/gpu/drm/amd/amdgpu/vcn_v2_0.c |   1 +
 drivers/gpu/drm/amd/amdgpu/vcn_v2_5.c |   2 +
 drivers/gpu/drm/amd/amdgpu/vcn_v3_0.c |   1 +
 drivers/gpu/drm/amd/amdgpu/vcn_v4_0.c |   1 +
 drivers/gpu/drm/amd/amdgpu/vcn_v4_0_3.c   |   1 +
 drivers/gpu/drm/amd/amdgpu/vcn_v4_0_5.c   |   1 +
 drivers/gpu/drm/amd/amdgpu/vcn_v5_0_0.c   |   1 +
 drivers/gpu/drm/amd/amdgpu/vi.c   |   1 +
 .../gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c |   1 +
 drivers/gpu/drm/amd/include/amd_shared.h  |   1 +
 drivers/gpu/drm/amd/pm/legacy-dpm/kv_dpm.c|   1 +
 drivers/gpu/drm/amd/pm/legacy-dpm/si_dpm.c|   1 +
 .../gpu/drm/amd/pm/powerplay/amd_powerplay.c  |   1 +
 66 files changed, 245 insertions(+)

-- 
2.34.1



Re: [PATCH v10 1/3] drm/buddy: Implement tracking clear page feature

2024-04-10 Thread Matthew Auld

On 08/04/2024 16:16, Arunpravin Paneer Selvam wrote:

- Add tracking clear page feature.

- Driver should enable the DRM_BUDDY_CLEARED flag if it
   successfully clears the blocks in the free path. On the otherhand,
   DRM buddy marks each block as cleared.

- Track the available cleared pages size

- If driver requests cleared memory we prefer cleared memory
   but fallback to uncleared if we can't find the cleared blocks.
   when driver requests uncleared memory we try to use uncleared but
   fallback to cleared memory if necessary.

- When a block gets freed we clear it and mark the freed block as cleared,
   when there are buddies which are cleared as well we can merge them.
   Otherwise, we prefer to keep the blocks as separated.

- Add a function to support defragmentation.

v1:
   - Depends on the flag check DRM_BUDDY_CLEARED, enable the block as
 cleared. Else, reset the clear flag for each block in the list(Christian)
   - For merging the 2 cleared blocks compare as below,
 drm_buddy_is_clear(block) != drm_buddy_is_clear(buddy)(Christian)
   - Defragment the memory beginning from min_order
 till the required memory space is available.

v2: (Matthew)
   - Add a wrapper drm_buddy_free_list_internal for the freeing of blocks
 operation within drm buddy.
   - Write a macro block_incompatible() to allocate the required blocks.
   - Update the xe driver for the drm_buddy_free_list change in arguments.
   - add a warning if the two blocks are incompatible on
 defragmentation
   - call full defragmentation in the fini() function
   - place a condition to test if min_order is equal to 0
   - replace the list with safe_reverse() variant as we might
 remove the block from the list.

v3:
   - fix Gitlab user reported lockup issue.
   - Keep DRM_BUDDY_HEADER_CLEAR define sorted(Matthew)
   - modify to pass the root order instead max_order in fini()
 function(Matthew)
   - change bool 1 to true(Matthew)
   - add check if min_block_size is power of 2(Matthew)
   - modify the min_block_size datatype to u64(Matthew)

v4:
   - rename the function drm_buddy_defrag with __force_merge.
   - Include __force_merge directly in drm buddy file and remove
 the defrag use in amdgpu driver.
   - Remove list_empty() check(Matthew)
   - Remove unnecessary space, headers and placement of new variables(Matthew)
   - Add a unit test case(Matthew)

v5:
   - remove force merge support to actual range allocation and not to bail
 out when contains && split(Matthew)
   - add range support to force merge function.

Signed-off-by: Arunpravin Paneer Selvam 
Signed-off-by: Matthew Auld 
Suggested-by: Christian König 
Suggested-by: Matthew Auld 
---
  drivers/gpu/drm/amd/amdgpu/amdgpu_vram_mgr.c  |   6 +-
  drivers/gpu/drm/drm_buddy.c   | 430 ++
  drivers/gpu/drm/i915/i915_ttm_buddy_manager.c |   6 +-
  drivers/gpu/drm/tests/drm_buddy_test.c|  28 +-
  drivers/gpu/drm/xe/xe_ttm_vram_mgr.c  |   4 +-
  include/drm/drm_buddy.h   |  16 +-
  6 files changed, 368 insertions(+), 122 deletions(-)

diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_vram_mgr.c 
b/drivers/gpu/drm/amd/amdgpu/amdgpu_vram_mgr.c
index 8db880244324..c0c851409241 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_vram_mgr.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_vram_mgr.c
@@ -571,7 +571,7 @@ static int amdgpu_vram_mgr_new(struct ttm_resource_manager 
*man,
return 0;
  
  error_free_blocks:

-   drm_buddy_free_list(mm, >blocks);
+   drm_buddy_free_list(mm, >blocks, 0);
mutex_unlock(>lock);
  error_fini:
ttm_resource_fini(man, >base);
@@ -604,7 +604,7 @@ static void amdgpu_vram_mgr_del(struct ttm_resource_manager 
*man,
  
  	amdgpu_vram_mgr_do_reserve(man);
  
-	drm_buddy_free_list(mm, >blocks);

+   drm_buddy_free_list(mm, >blocks, 0);
mutex_unlock(>lock);
  
  	atomic64_sub(vis_usage, >vis_usage);

@@ -912,7 +912,7 @@ void amdgpu_vram_mgr_fini(struct amdgpu_device *adev)
kfree(rsv);
  
  	list_for_each_entry_safe(rsv, temp, >reserved_pages, blocks) {

-   drm_buddy_free_list(>mm, >allocated);
+   drm_buddy_free_list(>mm, >allocated, 0);
kfree(rsv);
}
if (!adev->gmc.is_app_apu)
diff --git a/drivers/gpu/drm/drm_buddy.c b/drivers/gpu/drm/drm_buddy.c
index 5ebdd6f8f36e..83dbe252f727 100644
--- a/drivers/gpu/drm/drm_buddy.c
+++ b/drivers/gpu/drm/drm_buddy.c
@@ -38,8 +38,8 @@ static void drm_block_free(struct drm_buddy *mm,
kmem_cache_free(slab_blocks, block);
  }
  
-static void list_insert_sorted(struct drm_buddy *mm,

-  struct drm_buddy_block *block)
+static void list_insert(struct drm_buddy *mm,
+   struct drm_buddy_block *block)


Why the change here?


  {
struct drm_buddy_block *node;
struct list_head *head;
@@ -57,6 +57,16 @@ static void list_insert_sorted(struct drm_buddy *mm,

[PATCH] drm/amd/display: Fix division by zero in setup_dsc_config

2024-04-10 Thread Jose Fernandez
When slice_height is 0, the division by slice_height in the calculation
of the number of slices will cause a division by zero driver crash. This
leaves the kernel in a state that requires a reboot. This patch adds a
check to avoid the division by zero.

The stack trace below is for the 6.8.4 Kernel. I reproduced the issue on
a Z16 Gen 2 Lenovo Thinkpad with a Apple Studio Display monitor
connected via Thunderbolt. The amdgpu driver crashed with this exception
when I rebooted the system with the monitor connected.

kernel: ? die (arch/x86/kernel/dumpstack.c:421 arch/x86/kernel/dumpstack.c:434 
arch/x86/kernel/dumpstack.c:447)
kernel: ? do_trap (arch/x86/kernel/traps.c:113 arch/x86/kernel/traps.c:154)
kernel: ? setup_dsc_config 
(drivers/gpu/drm/amd/amdgpu/../display/dc/dsc/dc_dsc.c:1053) amdgpu
kernel: ? do_error_trap (./arch/x86/include/asm/traps.h:58 
arch/x86/kernel/traps.c:175)
kernel: ? setup_dsc_config 
(drivers/gpu/drm/amd/amdgpu/../display/dc/dsc/dc_dsc.c:1053) amdgpu
kernel: ? exc_divide_error (arch/x86/kernel/traps.c:194 (discriminator 2))
kernel: ? setup_dsc_config 
(drivers/gpu/drm/amd/amdgpu/../display/dc/dsc/dc_dsc.c:1053) amdgpu
kernel: ? asm_exc_divide_error (./arch/x86/include/asm/idtentry.h:548)
kernel: ? setup_dsc_config 
(drivers/gpu/drm/amd/amdgpu/../display/dc/dsc/dc_dsc.c:1053) amdgpu
kernel: dc_dsc_compute_config 
(drivers/gpu/drm/amd/amdgpu/../display/dc/dsc/dc_dsc.c:1109) amdgpu

After applying this patch, the driver no longer crashes when the monitor
is connected and the system is rebooted. I believe this is the same
issue reported for 3113.

Signed-off-by: Jose Fernandez 
Closes: https://gitlab.freedesktop.org/drm/amd/-/issues/3113
---
 drivers/gpu/drm/amd/display/dc/dsc/dc_dsc.c | 7 ++-
 1 file changed, 6 insertions(+), 1 deletion(-)

diff --git a/drivers/gpu/drm/amd/display/dc/dsc/dc_dsc.c 
b/drivers/gpu/drm/amd/display/dc/dsc/dc_dsc.c
index ac41f9c0a283..597d5425d6cb 100644
--- a/drivers/gpu/drm/amd/display/dc/dsc/dc_dsc.c
+++ b/drivers/gpu/drm/amd/display/dc/dsc/dc_dsc.c
@@ -1055,7 +1055,12 @@ static bool setup_dsc_config(
if (!is_dsc_possible)
goto done;
 
-   dsc_cfg->num_slices_v = pic_height/slice_height;
+   if (slice_height > 0)
+   dsc_cfg->num_slices_v = pic_height/slice_height;
+   else {
+   is_dsc_possible = false;
+   goto done;
+   }
 
if (target_bandwidth_kbps > 0) {
is_dsc_possible = decide_dsc_target_bpp_x16(
-- 
2.44.0



Re: 6.5.5: UBSAN: radeon_atombios.c: index 1 is out of range for type 'UCHAR [1]'

2024-04-10 Thread Jeff Johnson
On 4/8/2024 9:23 PM, Alex Deucher wrote:
> On Mon, Apr 8, 2024 at 9:45 PM Kees Cook  wrote:
>>
>>
>>
>> On April 8, 2024 5:45:29 PM PDT, Jeff Johnson  
>> wrote:
>>> On 10/1/23 17:12, Justin Piszcz wrote:
>> 
>> [Sun Oct  1 15:59:04 2023] UBSAN: array-index-out-of-bounds in
>> drivers/gpu/drm/radeon/radeon_atombios.c:2620:43
>> [Sun Oct  1 15:59:04 2023] index 1 is out of range for type 'UCHAR [1]'
>> [Sun Oct  1 15:59:04 2023] CPU: 5 PID: 1 Comm: swapper/0 Tainted: G
>>  T  6.5.5 #13 55df8de52754ef95effc50a55e9206abdea304ac
>> [Sun Oct  1 15:59:04 2023] Hardware name: Supermicro X9SRL-F/X9SRL-F,
>> BIOS 3.3 11/13/2018
>> [Sun Oct  1 15:59:04 2023] Call Trace:
>> [Sun Oct  1 15:59:04 2023]  
>> [Sun Oct  1 15:59:04 2023]  dump_stack_lvl+0x36/0x50
>> [Sun Oct  1 15:59:04 2023]  __ubsan_handle_out_of_bounds+0xc7/0x110
>> [Sun Oct  1 15:59:04 2023]  radeon_atombios_get_power_modes+0x87a/0x8f0
>> [Sun Oct  1 15:59:04 2023]  radeon_pm_init+0x13a/0x7e0
>> [Sun Oct  1 15:59:04 2023]  evergreen_init+0x13d/0x3d0
>> [Sun Oct  1 15:59:04 2023]  radeon_device_init+0x60a/0xbf0
>> [Sun Oct  1 15:59:04 2023]  radeon_driver_load_kms+0xb1/0x250
>> [Sun Oct  1 15:59:04 2023]  drm_dev_register+0xfc/0x250
>> [Sun Oct  1 15:59:04 2023]  radeon_pci_probe+0xd0/0x150
>> [Sun Oct  1 15:59:04 2023]  pci_device_probe+0x97/0x130
>> [Sun Oct  1 15:59:04 2023]  really_probe+0xbe/0x2f0
>> [Sun Oct  1 15:59:04 2023]  ? __pfx___driver_attach+0x10/0x10
>> [Sun Oct  1 15:59:04 2023]  __driver_probe_device+0x6e/0x120
>> [Sun Oct  1 15:59:04 2023]  driver_probe_device+0x1a/0x90
>> [Sun Oct  1 15:59:04 2023]  __driver_attach+0xd4/0x170
>> [Sun Oct  1 15:59:04 2023]  bus_for_each_dev+0x87/0xe0
>> [Sun Oct  1 15:59:04 2023]  bus_add_driver+0xf3/0x1f0
>> [Sun Oct  1 15:59:04 2023]  driver_register+0x58/0x120
>> [Sun Oct  1 15:59:04 2023]  ? __pfx_radeon_module_init+0x10/0x10
>> [Sun Oct  1 15:59:04 2023]  do_one_initcall+0x93/0x4a0
>> [Sun Oct  1 15:59:04 2023]  kernel_init_freeable+0x301/0x580
>> [Sun Oct  1 15:59:04 2023]  ? __pfx_kernel_init+0x10/0x10
>> [Sun Oct  1 15:59:04 2023]  kernel_init+0x15/0x1b0
>> [Sun Oct  1 15:59:04 2023]  ret_from_fork+0x2f/0x50
>> [Sun Oct  1 15:59:04 2023]  ? __pfx_kernel_init+0x10/0x10
>> [Sun Oct  1 15:59:04 2023]  ret_from_fork_asm+0x1b/0x30
>> [Sun Oct  1 15:59:04 2023]  
>> [Sun Oct  1 15:59:04 2023]
>> 
>> [Sun Oct  1 15:59:04 2023] [drm] radeon: dpm initialized
>> [Sun Oct  1 15:59:04 2023] [drm] GART: num cpu pages 262144, num gpu
>> pages 262144
>> [Sun Oct  1 15:59:04 2023] [drm] enabling PCIE gen 2 link speeds,
>> disable with radeon.pcie_gen2=0
>> [Sun Oct  1 15:59:04 2023] [drm] PCIE GART of 1024M enabled (table at
>> 0x0014C000).
>> [Sun Oct  1 15:59:04 2023] radeon :03:00.0: WB enabled
>> [Sun Oct  1 15:59:04 2023] radeon :03:00.0: fence driver on ring 0
>> use gpu addr 0x4c00
>> [Sun Oct  1 15:59:04 2023] radeon :03:00.0: fence driver on ring 3
>> use gpu addr 0x4c0c
>> [Sun Oct  1 15:59:04 2023] radeon :03:00.0: fence driver on ring 5
>> use gpu addr 0x0005c418
>> [Sun Oct  1 15:59:04 2023] radeon :03:00.0: radeon: MSI limited to 
>> 32-bit
>> [Sun Oct  1 15:59:04 2023] radeon :03:00.0: radeon: using MSI.
>> [Sun Oct  1 15:59:04 2023] [drm] radeon: irq initialized.
>>
>
> Please also open an issue on freedesktop tracker [1].
>
> Thanks.
>
> [1]: https://gitlab.freedesktop.org/drm/amd/-/issues

 Issue opened: https://gitlab.freedesktop.org/drm/amd/-/issues/2894

 Regards,
 Justin
>>>
>>> +Kees since I've worked with him on several of these flexible array issues.
>>>
>>> I just happened to look at kernel logs today for my ath1*k driver 
>>> maintenance and see the subject issue is present on my device, running 
>>> 6.9.0-rc1. The freedesktop issue tracker says the issue is closed, but any 
>>> fix has not landed in the upstream kernel. Is there a -next patch somewhere?
>>>
>>> [   12.105270] UBSAN: array-index-out-of-bounds in 
>>> drivers/gpu/drm/radeon/radeon_atombios.c:2718:34
>>> [   12.105272] index 48 is out of range for type 'UCHAR [1]'
>>> [
>>>
>>> If there isn't really an upstream fix, I can probably supply one.
>>
>> I would expect this to have fixed it:
>> https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/drivers/gpu/drm/radeon/pptable.h?id=c63079c61177ba1b17fa05c6875699a36924fe39
>>
>> If not, there must be something else happening?
> 
> This patch should silence it I think:
> https://patchwork.freedesktop.org/patch/588305/

I can confirm that my issues are 

Re: [PATCH] drm/radeon: silence UBSAN warning (v2)

2024-04-10 Thread Kees Cook
On Mon, Apr 08, 2024 at 01:37:48PM -0400, Alex Deucher wrote:
> Convert a variable sized array from [1] to [].
> 
> v2: fix up a few more.
> 
> Acked-by: Christian König  (v1)
> Signed-off-by: Alex Deucher 
> ---
>  drivers/gpu/drm/radeon/pptable.h | 6 +++---
>  1 file changed, 3 insertions(+), 3 deletions(-)
> 
> diff --git a/drivers/gpu/drm/radeon/pptable.h 
> b/drivers/gpu/drm/radeon/pptable.h
> index 94947229888ba..3493b1f979fed 100644
> --- a/drivers/gpu/drm/radeon/pptable.h
> +++ b/drivers/gpu/drm/radeon/pptable.h
> @@ -432,7 +432,7 @@ typedef struct _ATOM_PPLIB_STATE_V2
>/**
>* Driver will read the first ucNumDPMLevels in this array
>*/
> -  UCHAR clockInfoIndex[1];
> +  UCHAR clockInfoIndex[];
>  } ATOM_PPLIB_STATE_V2;

The comment slightly above this hunk says:

  //number of valid dpm levels in this state; Driver uses it to calculate 
the whole 
  //size of the state: sizeof(ATOM_PPLIB_STATE_V2) + (ucNumDPMLevels - 1) * 
sizeof(UCHAR)

This is wrong now, as ATOM_PPLIB_STATE_V2 isn't over-sized now. It
should be:

  //size of the state: sizeof(ATOM_PPLIB_STATE_V2) + (ucNumDPMLevels) * 
sizeof(UCHAR)

or better yet, struct_size(ATOM_PPLIB_STATE_V2, clockInfoIndex, ucNumDPMLevels)

I couldn't easily find any "sizeof" uses against these structs, but are
you sure there aren't size changes associated with this adjustment?

Also, if the comment is accurate, then clockInfoIndex can also gain a
__counted_by annotation:

UCHAR clockInfoIndex[] __counted_by(ucNumDPMLevels);

The use of __counted_by() seems like it could apply to the other changes
as well?

>  
>  typedef struct _StateArray{

This has a fake flex-array as well, but it's a flex array of flex
arrays. :(

typedef struct _StateArray{
//how many states we have 
UCHAR ucNumEntries;

ATOM_PPLIB_STATE_V2 states[1];
}StateArray;

I suspect get_state_entry_v2() may trip the runtime checking too, though
it's using a bunch of casted pointer math instead of direct array
accesses, so maybe it's avoid the instrumentation for now?

> @@ -450,7 +450,7 @@ typedef struct _ClockInfoArray{
>  //sizeof(ATOM_PPLIB_CLOCK_INFO)
>  UCHAR ucEntrySize;
>  
> -UCHAR clockInfo[1];
> +UCHAR clockInfo[];
>  }ClockInfoArray;
>  
>  typedef struct _NonClockInfoArray{
> @@ -460,7 +460,7 @@ typedef struct _NonClockInfoArray{
>  //sizeof(ATOM_PPLIB_NONCLOCK_INFO)
>  UCHAR ucEntrySize;
>  
> -ATOM_PPLIB_NONCLOCK_INFO nonClockInfo[1];
> +ATOM_PPLIB_NONCLOCK_INFO nonClockInfo[];
>  }NonClockInfoArray;
>  
>  typedef struct _ATOM_PPLIB_Clock_Voltage_Dependency_Record

-Kees

-- 
Kees Cook