[PATCH 4/8] drm/amd/display: Remove VSC infoframe dep on DMCU

2020-07-03 Thread Rodrigo Siqueira
From: Roman Li 

[Why]
VSC infoframe is needed for PSR. Previously only DMCU controller
supported PSR. Now DMUB also implements PSR.

[How]
Remove VSC infoframe dependency on DMCU.

Signed-off-by: Roman Li 
Reviewed-by: Rodrigo Siqueira 
Acked-by: Eryk Brol 
---
 .../gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c | 30 ---
 1 file changed, 13 insertions(+), 17 deletions(-)

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 132a2bde6a14..b4e120e95438 100644
--- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
+++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
@@ -4629,24 +4629,20 @@ create_stream_for_sink(struct amdgpu_dm_connector 
*aconnector,
 
if (stream->signal == SIGNAL_TYPE_HDMI_TYPE_A)
mod_build_hf_vsif_infopacket(stream, &stream->vsp_infopacket, 
false, false);
-   if (stream->link->psr_settings.psr_feature_enabled) {
-   struct dc  *core_dc = stream->link->ctx->dc;
-
-   if (dc_is_dmcu_initialized(core_dc)) {
-   //
-   // should decide stream support vsc sdp colorimetry 
capability
-   // before building vsc info packet
-   //
-   stream->use_vsc_sdp_for_colorimetry = false;
-   if (aconnector->dc_sink->sink_signal == 
SIGNAL_TYPE_DISPLAY_PORT_MST) {
-   stream->use_vsc_sdp_for_colorimetry =
-   
aconnector->dc_sink->is_vsc_sdp_colorimetry_supported;
-   } else {
-   if 
(stream->link->dpcd_caps.dprx_feature.bits.VSC_SDP_COLORIMETRY_SUPPORTED)
-   stream->use_vsc_sdp_for_colorimetry = 
true;
-   }
-   mod_build_vsc_infopacket(stream, 
&stream->vsc_infopacket);
+   if (stream->link->psr_settings.psr_feature_enabled) {
+   //
+   // should decide stream support vsc sdp colorimetry capability
+   // before building vsc info packet
+   //
+   stream->use_vsc_sdp_for_colorimetry = false;
+   if (aconnector->dc_sink->sink_signal == 
SIGNAL_TYPE_DISPLAY_PORT_MST) {
+   stream->use_vsc_sdp_for_colorimetry =
+   
aconnector->dc_sink->is_vsc_sdp_colorimetry_supported;
+   } else {
+   if 
(stream->link->dpcd_caps.dprx_feature.bits.VSC_SDP_COLORIMETRY_SUPPORTED)
+   stream->use_vsc_sdp_for_colorimetry = true;
}
+   mod_build_vsc_infopacket(stream, &stream->vsc_infopacket);
}
 finish:
dc_sink_release(sink);
-- 
2.27.0

___
amd-gfx mailing list
amd-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/amd-gfx


[PATCH 3/8] drm/amd/display: Send VSIF on unsupported modes on DAL

2020-07-03 Thread Rodrigo Siqueira
From: Jaehyun Chung 

[Why]
Current DAL behaviour is to not send VSIF if mode does not support VRR
(ie. FS range is < 10Hz). However, we should still set FS Native Color
Active bit in some unsupported mode cases.

[How]
Remove check for if VRR is supported before building infopacket.

Signed-off-by: Jaehyun Chung 
Reviewed-by: Anthony Koo 
Acked-by: Eryk Brol 
Acked-by: Rodrigo Siqueira 
---
 drivers/gpu/drm/amd/display/modules/freesync/freesync.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/drivers/gpu/drm/amd/display/modules/freesync/freesync.c 
b/drivers/gpu/drm/amd/display/modules/freesync/freesync.c
index 5ddfd6476ff9..d3a5ba9ee782 100644
--- a/drivers/gpu/drm/amd/display/modules/freesync/freesync.c
+++ b/drivers/gpu/drm/amd/display/modules/freesync/freesync.c
@@ -790,7 +790,7 @@ void mod_freesync_build_vrr_infopacket(struct mod_freesync 
*mod_freesync,
 * Check if Freesync is supported. Return if false. If true,
 * set the corresponding bit in the info packet
 */
-   if (!vrr->supported || (!vrr->send_info_frame))
+   if (!vrr->send_info_frame)
return;
 
switch (packet_type) {
-- 
2.27.0

___
amd-gfx mailing list
amd-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/amd-gfx


[PATCH 6/8] drm/amd/display: 3.2.93

2020-07-03 Thread Rodrigo Siqueira
From: Anthony Koo 

Signed-off-by: Anthony Koo 
Reviewed-by: Anthony Koo 
Acked-by: Eryk Brol 
Acked-by: Rodrigo Siqueira 
---
 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 90cc3abe26f2..389edcf3f6ce 100644
--- a/drivers/gpu/drm/amd/display/dc/dc.h
+++ b/drivers/gpu/drm/amd/display/dc/dc.h
@@ -42,7 +42,7 @@
 #include "inc/hw/dmcu.h"
 #include "dml/display_mode_lib.h"
 
-#define DC_VER "3.2.92"
+#define DC_VER "3.2.93"
 
 #define MAX_SURFACES 3
 #define MAX_PLANES 6
-- 
2.27.0

___
amd-gfx mailing list
amd-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/amd-gfx


[PATCH 5/8] drm/amd/display: [FW Promotion] Release 0.0.23

2020-07-03 Thread Rodrigo Siqueira
From: Anthony Koo 

[Header Changes]
- Drop unused firmware SCRATCH bits from interface

Signed-off-by: Anthony Koo 
Reviewed-by: Anthony Koo 
Acked-by: Eryk Brol 
Acked-by: Rodrigo Siqueira 
---
 .../gpu/drm/amd/display/dmub/inc/dmub_cmd.h| 18 ++
 1 file changed, 6 insertions(+), 12 deletions(-)

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 d6c7a20c23b2..ce96143c402a 100644
--- a/drivers/gpu/drm/amd/display/dmub/inc/dmub_cmd.h
+++ b/drivers/gpu/drm/amd/display/dmub/inc/dmub_cmd.h
@@ -36,10 +36,10 @@
 
 /* Firmware versioning. */
 #ifdef DMUB_EXPOSE_VERSION
-#define DMUB_FW_VERSION_GIT_HASH 0x5b1691c92
-#define DMUB_FW_VERSION_MAJOR 1
+#define DMUB_FW_VERSION_GIT_HASH 0x5ad38d883
+#define DMUB_FW_VERSION_MAJOR 0
 #define DMUB_FW_VERSION_MINOR 0
-#define DMUB_FW_VERSION_REVISION 22
+#define DMUB_FW_VERSION_REVISION 23
 #define DMUB_FW_VERSION_UCODE ((DMUB_FW_VERSION_MAJOR << 24) | 
(DMUB_FW_VERSION_MINOR << 16) | DMUB_FW_VERSION_REVISION)
 #endif
 
@@ -123,12 +123,15 @@ union dmub_psr_debug_flags {
  * @fw_region_size: size of the firmware state region
  * @trace_buffer_size: size of the tracebuffer region
  * @fw_version: the firmware version information
+ * @dal_fw: 1 if the firmware is DAL
  */
 struct dmub_fw_meta_info {
uint32_t magic_value;
uint32_t fw_region_size;
uint32_t trace_buffer_size;
uint32_t fw_version;
+   uint8_t dal_fw;
+   uint8_t reserved[3];
 };
 
 /* Ensure that the structure remains 64 bytes. */
@@ -151,15 +154,6 @@ union dmub_fw_meta {
  * SCRATCH15: FW Boot Options register
  */
 
-/**
- * DMCUB firmware status bits for SCRATCH2.
- */
-enum dmub_fw_status_bit {
-   DMUB_FW_STATUS_BIT_DAL_FIRMWARE = (1 << 0),
-   DMUB_FW_STATUS_BIT_COMMAND_TABLE_READY = (1 << 1),
-};
-
-
 /* Register bit definition for SCRATCH0 */
 union dmub_fw_boot_status {
struct {
-- 
2.27.0

___
amd-gfx mailing list
amd-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/amd-gfx


[PATCH 0/8] DC Patches July 03, 2020

2020-07-03 Thread Rodrigo Siqueira
This DC patchset brings improvements in multiple areas. In summary, we
have:
* SMU logger messages
* DMCU improvements
* Bug fixes

Anthony Koo (2):
  drm/amd/display: [FW Promotion] Release 0.0.23
  drm/amd/display: 3.2.93

Dmytro Laktyushkin (1):
  drm/amd/display: Add diags scaling log by default

Igor Kravchenko (1):
  drm/amd/display: Register init

Jaehyun Chung (1):
  drm/amd/display: Send VSIF on unsupported modes on DAL

Joshua Aberback (1):
  drm/amd/display: Request PHYCLK adjustment on PHY enable/disable

Roman Li (1):
  drm/amd/display: Remove VSC infoframe dep on DMCU

Wesley Chalmers (1):
  drm/amd/display: Add logger for SMU msg

 .../gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c | 30 -
 .../display/dc/clk_mgr/dcn20/dcn20_clk_mgr.c  | 35 +++---
 .../amd/display/dc/clk_mgr/dcn21/rn_clk_mgr.c | 27 ++--
 .../display/dc/clk_mgr/dcn30/dcn30_clk_mgr.c  | 32 ++---
 .../dc/clk_mgr/dcn30/dcn30_clk_mgr_smu_msg.c  | 65 ++-
 .../drm/amd/display/dc/core/dc_link_hwss.c| 11 +++-
 .../gpu/drm/amd/display/dc/core/dc_resource.c | 39 +++
 drivers/gpu/drm/amd/display/dc/dc.h   |  2 +-
 .../amd/display/dc/dcn10/dcn10_hw_sequencer.c | 58 ++---
 .../gpu/drm/amd/display/dc/inc/hw/clk_mgr.h   |  3 +
 .../amd/display/dc/inc/hw/clk_mgr_internal.h  |  2 +
 .../gpu/drm/amd/display/dmub/inc/dmub_cmd.h   | 18 ++---
 .../drm/amd/display/include/logger_types.h|  4 +-
 .../amd/display/modules/freesync/freesync.c   |  2 +-
 14 files changed, 232 insertions(+), 96 deletions(-)

-- 
2.27.0

___
amd-gfx mailing list
amd-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/amd-gfx


[PATCH 2/8] drm/amd/display: Register init

2020-07-03 Thread Rodrigo Siqueira
From: Igor Kravchenko 

[Why]
Driver re-initialize registers already set in FW

[How]
Transfer init to FW

Signed-off-by: Igor Kravchenko 
Reviewed-by: Tony Cheng 
Acked-by: Eryk Brol 
Acked-by: Rodrigo Siqueira 
---
 .../amd/display/dc/dcn10/dcn10_hw_sequencer.c | 58 +++
 1 file changed, 35 insertions(+), 23 deletions(-)

diff --git a/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_hw_sequencer.c 
b/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_hw_sequencer.c
index cb45f05a0319..6711ff908bcf 100644
--- a/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_hw_sequencer.c
+++ b/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_hw_sequencer.c
@@ -1255,6 +1255,7 @@ void dcn10_init_hw(struct dc *dc)
struct dc_bios *dcb = dc->ctx->dc_bios;
struct resource_pool *res_pool = dc->res_pool;
uint32_t backlight = MAX_BACKLIGHT_LEVEL;
+   bool   is_optimized_init_done = false;
 
if (dc->clk_mgr && dc->clk_mgr->funcs->init_clocks)
dc->clk_mgr->funcs->init_clocks(dc->clk_mgr);
@@ -1288,7 +1289,9 @@ void dcn10_init_hw(struct dc *dc)
if (!dcb->funcs->is_accelerated_mode(dcb))
hws->funcs.disable_vga(dc->hwseq);
 
-   if (!dc_dmub_srv_optimized_init_done(dc->ctx->dmub_srv))
+   is_optimized_init_done = 
dc_dmub_srv_optimized_init_done(dc->ctx->dmub_srv);
+
+   if (!is_optimized_init_done)
hws->funcs.bios_golden_init(dc);
 
if (dc->ctx->dc_bios->fw_info_valid) {
@@ -1323,7 +1326,8 @@ void dcn10_init_hw(struct dc *dc)
 */
struct dc_link *link = dc->links[i];
 
-   link->link_enc->funcs->hw_init(link->link_enc);
+   if (!is_optimized_init_done)
+   link->link_enc->funcs->hw_init(link->link_enc);
 
/* Check for enabled DIG to identify enabled display */
if (link->link_enc->funcs->is_dig_enabled &&
@@ -1332,9 +1336,11 @@ void dcn10_init_hw(struct dc *dc)
}
 
/* Power gate DSCs */
-   for (i = 0; i < res_pool->res_cap->num_dsc; i++)
-   if (hws->funcs.dsc_pg_control != NULL)
-   hws->funcs.dsc_pg_control(hws, res_pool->dscs[i]->inst, 
false);
+   if (!is_optimized_init_done) {
+   for (i = 0; i < res_pool->res_cap->num_dsc; i++)
+   if (hws->funcs.dsc_pg_control != NULL)
+   hws->funcs.dsc_pg_control(hws, 
res_pool->dscs[i]->inst, false);
+   }
 
/* we want to turn off all dp displays before doing detection */
if (dc->config.power_down_display_on_boot) {
@@ -1379,10 +1385,12 @@ void dcn10_init_hw(struct dc *dc)
 * everything down.
 */
if (dcb->funcs->is_accelerated_mode(dcb) || 
dc->config.power_down_display_on_boot) {
-   hws->funcs.init_pipes(dc, dc->current_state);
-   if (dc->res_pool->hubbub->funcs->allow_self_refresh_control)
-   
dc->res_pool->hubbub->funcs->allow_self_refresh_control(dc->res_pool->hubbub,
-   
!dc->res_pool->hubbub->ctx->dc->debug.disable_stutter);
+   if (!is_optimized_init_done) {
+   hws->funcs.init_pipes(dc, dc->current_state);
+   if 
(dc->res_pool->hubbub->funcs->allow_self_refresh_control)
+   
dc->res_pool->hubbub->funcs->allow_self_refresh_control(dc->res_pool->hubbub,
+   
!dc->res_pool->hubbub->ctx->dc->debug.disable_stutter);
+   }
}
 
/* In headless boot cases, DIG may be turned
@@ -1417,30 +1425,34 @@ void dcn10_init_hw(struct dc *dc)
}
}
 
-   for (i = 0; i < res_pool->audio_count; i++) {
-   struct audio *audio = res_pool->audios[i];
+   if (!is_optimized_init_done) {
 
-   audio->funcs->hw_init(audio);
-   }
+   for (i = 0; i < res_pool->audio_count; i++) {
+   struct audio *audio = res_pool->audios[i];
 
-   for (i = 0; i < dc->link_count; i++) {
-   struct dc_link *link = dc->links[i];
+   audio->funcs->hw_init(audio);
+   }
 
-   if (link->panel_cntl)
-   backlight = 
link->panel_cntl->funcs->hw_init(link->panel_cntl);
-   }
+   for (i = 0; i < dc->link_count; i++) {
+   struct dc_link *link = dc->links[i];
 
-   if (abm != NULL)
-   abm->funcs->abm_init(abm, backlight);
+   if (link->panel_cntl)
+   backlight = 
link->panel_cntl->funcs->hw_init(link->panel_cntl);
+   }
 
-   if (dmcu != NULL && !dmcu->auto_load_dmcu)
-   dmcu->funcs->dmcu_init(dmcu);
+   if (abm != NULL)
+   abm->funcs->abm_init(abm, backlight);
+
+   if (dmcu != NULL && !dmcu->auto_load_d

[PATCH 1/8] drm/amd/display: Add diags scaling log by default

2020-07-03 Thread Rodrigo Siqueira
From: Dmytro Laktyushkin 

Print scaling parameters as they are calculated in diags.

Signed-off-by: Dmytro Laktyushkin 
Reviewed-by: Eric Bernstein 
Acked-by: Eryk Brol 
Acked-by: Rodrigo Siqueira 
---
 .../gpu/drm/amd/display/dc/core/dc_resource.c | 39 ---
 .../drm/amd/display/include/logger_types.h|  2 +-
 2 files changed, 27 insertions(+), 14 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 1000dc6daf72..7b5f90ebb133 100644
--- a/drivers/gpu/drm/amd/display/dc/core/dc_resource.c
+++ b/drivers/gpu/drm/amd/display/dc/core/dc_resource.c
@@ -1162,19 +1162,32 @@ bool resource_build_scaling_params(struct pipe_ctx 
*pipe_ctx)
/* May need to re-check lb size after this in some obscure 
scenario */
calculate_inits_and_adj_vp(pipe_ctx);
 
-   DC_LOG_SCALER(
-   "%s: Viewport:\nheight:%d width:%d x:%d "
-   "y:%d\n dst_rect:\nheight:%d width:%d x:%d "
-   "y:%d\n",
-   __func__,
-   pipe_ctx->plane_res.scl_data.viewport.height,
-   pipe_ctx->plane_res.scl_data.viewport.width,
-   pipe_ctx->plane_res.scl_data.viewport.x,
-   pipe_ctx->plane_res.scl_data.viewport.y,
-   plane_state->dst_rect.height,
-   plane_state->dst_rect.width,
-   plane_state->dst_rect.x,
-   plane_state->dst_rect.y);
+   DC_LOG_SCALER("%s pipe %d:\nViewport: height:%d width:%d x:%d y:%d  
Recout: height:%d width:%d x:%d y:%d  HACTIVE:%d VACTIVE:%d\n"
+   "src_rect: height:%d width:%d x:%d y:%d  dst_rect: 
height:%d width:%d x:%d y:%d  clip_rect: height:%d width:%d x:%d y:%d\n",
+   __func__,
+   pipe_ctx->pipe_idx,
+   pipe_ctx->plane_res.scl_data.viewport.height,
+   pipe_ctx->plane_res.scl_data.viewport.width,
+   pipe_ctx->plane_res.scl_data.viewport.x,
+   pipe_ctx->plane_res.scl_data.viewport.y,
+   pipe_ctx->plane_res.scl_data.recout.height,
+   pipe_ctx->plane_res.scl_data.recout.width,
+   pipe_ctx->plane_res.scl_data.recout.x,
+   pipe_ctx->plane_res.scl_data.recout.y,
+   pipe_ctx->plane_res.scl_data.h_active,
+   pipe_ctx->plane_res.scl_data.v_active,
+   plane_state->src_rect.height,
+   plane_state->src_rect.width,
+   plane_state->src_rect.x,
+   plane_state->src_rect.y,
+   plane_state->dst_rect.height,
+   plane_state->dst_rect.width,
+   plane_state->dst_rect.x,
+   plane_state->dst_rect.y,
+   plane_state->clip_rect.height,
+   plane_state->clip_rect.width,
+   plane_state->clip_rect.x,
+   plane_state->clip_rect.y);
 
if (store_h_border_left)
restore_border_left_from_dst(pipe_ctx, store_h_border_left);
diff --git a/drivers/gpu/drm/amd/display/include/logger_types.h 
b/drivers/gpu/drm/amd/display/include/logger_types.h
index d66f9d8eefb4..5dea27fc5198 100644
--- a/drivers/gpu/drm/amd/display/include/logger_types.h
+++ b/drivers/gpu/drm/amd/display/include/logger_types.h
@@ -147,11 +147,11 @@ enum dc_log_type {
(1ULL << LOG_I2C_AUX) | \
(1ULL << LOG_IF_TRACE) | \
(1ULL << LOG_HDMI_FRL) | \
+   (1ULL << LOG_SCALER) | \
(1ULL << LOG_DTN) /* | \
(1ULL << LOG_DEBUG) | \
(1ULL << LOG_BIOS) | \
(1ULL << LOG_SURFACE) | \
-   (1ULL << LOG_SCALER) | \
(1ULL << LOG_DML) | \
(1ULL << LOG_HW_LINK_TRAINING) | \
(1ULL << LOG_HW_AUDIO)| \
-- 
2.27.0

___
amd-gfx mailing list
amd-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/amd-gfx


[PATCH 8/8] drm/amd/display: Add logger for SMU msg

2020-07-03 Thread Rodrigo Siqueira
From: Wesley Chalmers 

[WHY]
We want to be able to see SMU messages sent and their responses

Signed-off-by: Wesley Chalmers 
Reviewed-by: Joshua Aberback 
Acked-by: Eryk Brol 
Acked-by: Rodrigo Siqueira 
---
 .../dc/clk_mgr/dcn30/dcn30_clk_mgr_smu_msg.c  | 65 ++-
 .../drm/amd/display/include/logger_types.h|  2 +
 2 files changed, 64 insertions(+), 3 deletions(-)

diff --git 
a/drivers/gpu/drm/amd/display/dc/clk_mgr/dcn30/dcn30_clk_mgr_smu_msg.c 
b/drivers/gpu/drm/amd/display/dc/clk_mgr/dcn30/dcn30_clk_mgr_smu_msg.c
index 986c53a3b6a8..7ee3ec5a8af8 100644
--- a/drivers/gpu/drm/amd/display/dc/clk_mgr/dcn30/dcn30_clk_mgr_smu_msg.c
+++ b/drivers/gpu/drm/amd/display/dc/clk_mgr/dcn30/dcn30_clk_mgr_smu_msg.c
@@ -37,6 +37,13 @@
 #define REG(reg_name) \
mm ## reg_name
 
+#include "logger_types.h"
+#undef DC_LOGGER
+#define DC_LOGGER \
+   CTX->logger
+#define smu_print(str, ...) {DC_LOG_SMU(str, ##__VA_ARGS__); }
+
+
 /*
  * Function to be used instead of REG_WAIT macro because the wait ends when
  * the register is NOT EQUAL to zero, and because the translation in msg_if.h
@@ -94,6 +101,8 @@ bool dcn30_smu_test_message(struct clk_mgr_internal 
*clk_mgr, uint32_t input)
 {
uint32_t response = 0;
 
+   smu_print("SMU Test message: %d\n", input);
+
if (dcn30_smu_send_msg_with_param(clk_mgr,
DALSMC_MSG_TestMessage, input, &response))
if (response == input + 1)
@@ -104,9 +113,15 @@ bool dcn30_smu_test_message(struct clk_mgr_internal 
*clk_mgr, uint32_t input)
 
 bool dcn30_smu_get_smu_version(struct clk_mgr_internal *clk_mgr, unsigned int 
*version)
 {
+   smu_print("SMU Get SMU version\n");
+
if (dcn30_smu_send_msg_with_param(clk_mgr,
-   DALSMC_MSG_GetSmuVersion, 0, version))
+   DALSMC_MSG_GetSmuVersion, 0, version)) {
+
+   smu_print("SMU version: %d\n", *version);
+
return true;
+   }
 
return false;
 }
@@ -116,10 +131,16 @@ bool dcn30_smu_check_driver_if_version(struct 
clk_mgr_internal *clk_mgr)
 {
uint32_t response = 0;
 
+   smu_print("SMU Check driver if version\n");
+
if (dcn30_smu_send_msg_with_param(clk_mgr,
-   DALSMC_MSG_GetDriverIfVersion, 0, &response))
+   DALSMC_MSG_GetDriverIfVersion, 0, &response)) {
+
+   smu_print("SMU driver if version: %d\n", response);
+
if (response == SMU11_DRIVER_IF_VERSION)
return true;
+   }
 
return false;
 }
@@ -129,34 +150,48 @@ bool dcn30_smu_check_msg_header_version(struct 
clk_mgr_internal *clk_mgr)
 {
uint32_t response = 0;
 
+   smu_print("SMU Check msg header version\n");
+
if (dcn30_smu_send_msg_with_param(clk_mgr,
-   DALSMC_MSG_GetMsgHeaderVersion, 0, &response))
+   DALSMC_MSG_GetMsgHeaderVersion, 0, &response)) {
+
+   smu_print("SMU msg header version: %d\n", response);
+
if (response == DALSMC_VERSION)
return true;
+   }
 
return false;
 }
 
 void dcn30_smu_set_dram_addr_high(struct clk_mgr_internal *clk_mgr, uint32_t 
addr_high)
 {
+   smu_print("SMU Set DRAM addr high: %d\n", addr_high);
+
dcn30_smu_send_msg_with_param(clk_mgr,
DALSMC_MSG_SetDalDramAddrHigh, addr_high, NULL);
 }
 
 void dcn30_smu_set_dram_addr_low(struct clk_mgr_internal *clk_mgr, uint32_t 
addr_low)
 {
+   smu_print("SMU Set DRAM addr low: %d\n", addr_low);
+
dcn30_smu_send_msg_with_param(clk_mgr,
DALSMC_MSG_SetDalDramAddrLow, addr_low, NULL);
 }
 
 void dcn30_smu_transfer_wm_table_smu_2_dram(struct clk_mgr_internal *clk_mgr)
 {
+   smu_print("SMU Transfer WM table SMU 2 DRAM\n");
+
dcn30_smu_send_msg_with_param(clk_mgr,
DALSMC_MSG_TransferTableSmu2Dram, TABLE_WATERMARKS, 
NULL);
 }
 
 void dcn30_smu_transfer_wm_table_dram_2_smu(struct clk_mgr_internal *clk_mgr)
 {
+   smu_print("SMU Transfer WM table DRAM 2 SMU\n");
+
dcn30_smu_send_msg_with_param(clk_mgr,
DALSMC_MSG_TransferTableDram2Smu, TABLE_WATERMARKS, 
NULL);
 }
@@ -169,9 +204,13 @@ unsigned int dcn30_smu_set_hard_min_by_freq(struct 
clk_mgr_internal *clk_mgr, PP
/* bits 23:16 for clock type, lower 16 bits for frequency in MHz */
uint32_t param = (clk << 16) | freq_mhz;
 
+   smu_print("SMU Set hard min by freq: clk = %d, freq_mhz = %d MHz\n", 
clk, freq_mhz);
+
dcn30_smu_send_msg_with_param(clk_mgr,
DALSMC_MSG_SetHardMinByFreq, param, &response);
 
+   smu_print("SMU Frequency set = %d MHz\n", response);
+
return response;
 }
 
@@ -183,9 +222,13 @@ unsigned int dcn30_smu_set_hard_max_by_freq(struct 
clk_mgr_internal *clk_mgr, PP
/* bits 23:16 for clock type, lower 16 bits for frequency in MH

[PATCH 7/8] drm/amd/display: Request PHYCLK adjustment on PHY enable/disable

2020-07-03 Thread Rodrigo Siqueira
From: Joshua Aberback 

[Why]
Currently we don't explicitly send a request for a minimum PHYCLK, and
we hope that the dependencies other clocks have will raise PHYCLK when
needed.

[How]
- new clk_mgr function to keep track of PHYCLK requirements
- request maximum requirement across all links
- remove PHYCLK from clock state comparator, as it doesn't come from DML

Signed-off-by: Joshua Aberback 
Reviewed-by: Jun Lei 
Acked-by: Eryk Brol 
Acked-by: Rodrigo Siqueira 
---
 .../display/dc/clk_mgr/dcn20/dcn20_clk_mgr.c  | 35 ++-
 .../amd/display/dc/clk_mgr/dcn21/rn_clk_mgr.c | 27 ++
 .../display/dc/clk_mgr/dcn30/dcn30_clk_mgr.c  | 32 -
 .../drm/amd/display/dc/core/dc_link_hwss.c| 11 --
 .../gpu/drm/amd/display/dc/inc/hw/clk_mgr.h   |  3 ++
 .../amd/display/dc/inc/hw/clk_mgr_internal.h  |  2 ++
 6 files changed, 85 insertions(+), 25 deletions(-)

diff --git a/drivers/gpu/drm/amd/display/dc/clk_mgr/dcn20/dcn20_clk_mgr.c 
b/drivers/gpu/drm/amd/display/dc/clk_mgr/dcn20/dcn20_clk_mgr.c
index c63ec960e116..f2114bc910bf 100644
--- a/drivers/gpu/drm/amd/display/dc/clk_mgr/dcn20/dcn20_clk_mgr.c
+++ b/drivers/gpu/drm/amd/display/dc/clk_mgr/dcn20/dcn20_clk_mgr.c
@@ -184,13 +184,6 @@ void dcn2_update_clocks(struct clk_mgr *clk_mgr_base,
pp_smu->set_display_count(&pp_smu->pp_smu, 
display_count);
}
 
-   if (should_set_clock(safe_to_lower, new_clocks->phyclk_khz, 
clk_mgr_base->clks.phyclk_khz)) {
-   clk_mgr_base->clks.phyclk_khz = new_clocks->phyclk_khz;
-   if (pp_smu && pp_smu->set_voltage_by_freq)
-   pp_smu->set_voltage_by_freq(&pp_smu->pp_smu, 
PP_SMU_NV_PHYCLK, clk_mgr_base->clks.phyclk_khz / 1000);
-   }
-
-
if (dc->debug.force_min_dcfclk_mhz > 0)
new_clocks->dcfclk_khz = (new_clocks->dcfclk_khz > 
(dc->debug.force_min_dcfclk_mhz * 1000)) ?
new_clocks->dcfclk_khz : 
(dc->debug.force_min_dcfclk_mhz * 1000);
@@ -417,8 +410,6 @@ static bool dcn2_are_clock_states_equal(struct dc_clocks *a,
return false;
else if (a->dcfclk_deep_sleep_khz != b->dcfclk_deep_sleep_khz)
return false;
-   else if (a->phyclk_khz != b->phyclk_khz)
-   return false;
else if (a->dramclk_khz != b->dramclk_khz)
return false;
else if (a->p_state_change_support != b->p_state_change_support)
@@ -427,6 +418,31 @@ static bool dcn2_are_clock_states_equal(struct dc_clocks 
*a,
return true;
 }
 
+/* Notify clk_mgr of a change in link rate, update phyclk frequency if 
necessary */
+static void dcn2_notify_link_rate_change(struct clk_mgr *clk_mgr_base, struct 
dc_link *link)
+{
+   struct clk_mgr_internal *clk_mgr = TO_CLK_MGR_INTERNAL(clk_mgr_base);
+   unsigned int i, max_phyclk_req = 0;
+   struct pp_smu_funcs_nv *pp_smu = NULL;
+
+   if (!clk_mgr->pp_smu || !clk_mgr->pp_smu->nv_funcs.set_voltage_by_freq)
+   return;
+
+   pp_smu = &clk_mgr->pp_smu->nv_funcs;
+
+   clk_mgr->cur_phyclk_req_table[link->link_index] = 
link->cur_link_settings.link_rate * LINK_RATE_REF_FREQ_IN_KHZ;
+
+   for (i = 0; i < MAX_PIPES * 2; i++) {
+   if (clk_mgr->cur_phyclk_req_table[i] > max_phyclk_req)
+   max_phyclk_req = clk_mgr->cur_phyclk_req_table[i];
+   }
+
+   if (max_phyclk_req != clk_mgr_base->clks.phyclk_khz) {
+   clk_mgr_base->clks.phyclk_khz = max_phyclk_req;
+   pp_smu->set_voltage_by_freq(&pp_smu->pp_smu, PP_SMU_NV_PHYCLK, 
clk_mgr_base->clks.phyclk_khz / 1000);
+   }
+}
+
 static struct clk_mgr_funcs dcn2_funcs = {
.get_dp_ref_clk_frequency = dce12_get_dp_ref_freq_khz,
.update_clocks = dcn2_update_clocks,
@@ -434,6 +450,7 @@ static struct clk_mgr_funcs dcn2_funcs = {
.enable_pme_wa = dcn2_enable_pme_wa,
.get_clock = dcn2_get_clock,
.are_clock_states_equal = dcn2_are_clock_states_equal,
+   .notify_link_rate_change = dcn2_notify_link_rate_change,
 };
 
 
diff --git a/drivers/gpu/drm/amd/display/dc/clk_mgr/dcn21/rn_clk_mgr.c 
b/drivers/gpu/drm/amd/display/dc/clk_mgr/dcn21/rn_clk_mgr.c
index 39788a7bd003..9b4807f52381 100644
--- a/drivers/gpu/drm/amd/display/dc/clk_mgr/dcn21/rn_clk_mgr.c
+++ b/drivers/gpu/drm/amd/display/dc/clk_mgr/dcn21/rn_clk_mgr.c
@@ -136,11 +136,6 @@ void rn_update_clocks(struct clk_mgr *clk_mgr_base,
}
}
 
-   if (should_set_clock(safe_to_lower, new_clocks->phyclk_khz, 
clk_mgr_base->clks.phyclk_khz)) {
-   clk_mgr_base->clks.phyclk_khz = new_clocks->phyclk_khz;
-   rn_vbios_smu_set_phyclk(clk_mgr, clk_mgr_base->clks.phyclk_khz);
-   }
-
if (should_set_clock(safe_to_lower, new_clocks->dcfclk_khz, 
clk_mgr_base->clks.dcfclk_khz)) {
clk_mgr_base->clks.dcfclk_khz = new_clocks->dcfclk_khz;
rn_vbios_smu_set_hard_min_dcfcl

Re: [PATCH v3 3/3] drm/amdgpu: Change type of module param `ppfeaturemask` to hexint

2020-07-03 Thread Christian König

Am 03.07.20 um 16:29 schrieb Paul Menzel:

The newly added hexint helper is more convenient for bitmasks.

Before:

 $ more /sys/module/amdgpu/parameters/ppfeaturemask
 4294950911

After:

 $ more /sys/module/amdgpu/parameters/ppfeaturemask
 0xbfff

Cc: amd-gfx@lists.freedesktop.org
Cc: linux-ker...@vger.kernel.org
Signed-off-by: Paul Menzel 


Reviewed-by: Christian König  for this one.

Feel free to add my Acked-by to the other two, but I'm not familiar 
enough with the code to review those.


Regards,
Christian.


---
  drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c | 4 ++--
  1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c 
b/drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c
index 126e74758a34..5c4263335cba 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c
@@ -391,12 +391,12 @@ MODULE_PARM_DESC(sched_hw_submission, "the max number of 
HW submissions (default
  module_param_named(sched_hw_submission, amdgpu_sched_hw_submission, int, 
0444);
  
  /**

- * DOC: ppfeaturemask (uint)
+ * DOC: ppfeaturemask (hexint)
   * Override power features enabled. See enum PP_FEATURE_MASK in 
drivers/gpu/drm/amd/include/amd_shared.h.
   * The default is the current set of stable power features.
   */
  MODULE_PARM_DESC(ppfeaturemask, "all power features enabled (default))");
-module_param_named(ppfeaturemask, amdgpu_pp_feature_mask, uint, 0444);
+module_param_named(ppfeaturemask, amdgpu_pp_feature_mask, hexint, 0444);
  
  /**

   * DOC: forcelongtraining (uint)


___
amd-gfx mailing list
amd-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/amd-gfx


Re: [PATCH v2 1/2] moduleparams: Add hexint type parameter

2020-07-03 Thread Christian König

Am 03.07.20 um 15:49 schrieb Paul Menzel:

For bitmasks printing values in hex is more convenient.

Prefix with `0x` to make it clear, that it’s a hex value, and pad it
out.

Using the helper for `amdgpu.ppfeaturemask`, it will look like below.

Before:

 $ more /sys/module/amdgpu/parameters/ppfeaturemask
 4294950911

After:

 $ more /sys/module/amdgpu/parameters/ppfeaturemask
 0xbfff

Cc: linux-ker...@vger.kernel.org
Cc: amd-gfx@lists.freedesktop.org
Signed-off-by: Paul Menzel 
---
v2: Address review comments: Rename hex to hexint, and pad sizes

  include/linux/moduleparam.h |  7 ++-
  kernel/params.c | 17 +
  2 files changed, 15 insertions(+), 9 deletions(-)

diff --git a/include/linux/moduleparam.h b/include/linux/moduleparam.h
index 3ef917ff0964..cff7261e98bb 100644
--- a/include/linux/moduleparam.h
+++ b/include/linux/moduleparam.h
@@ -118,7 +118,7 @@ struct kparam_array
   * you can create your own by defining those variables.
   *
   * Standard types are:
- * byte, short, ushort, int, uint, long, ulong
+ * byte, hexint, short, ushort, int, uint, long, ulong
   *charp: a character pointer
   *bool: a bool, values 0/1, y/n, Y/N.
   *invbool: the above, only sense-reversed (N = true).
@@ -448,6 +448,11 @@ extern int param_set_ullong(const char *val, const struct 
kernel_param *kp);
  extern int param_get_ullong(char *buffer, const struct kernel_param *kp);
  #define param_check_ullong(name, p) __param_check(name, p, unsigned long long)
  
+extern const struct kernel_param_ops param_ops_hexint;

+extern int param_set_hexint(const char *val, const struct kernel_param *kp);
+extern int param_get_hexint(char *buffer, const struct kernel_param *kp);
+#define param_check_hexint(name, p) param_check_uint(name, p)
+
  extern const struct kernel_param_ops param_ops_charp;
  extern int param_set_charp(const char *val, const struct kernel_param *kp);
  extern int param_get_charp(char *buffer, const struct kernel_param *kp);
diff --git a/kernel/params.c b/kernel/params.c
index 8e56f8b12d8f..487261eb836f 100644
--- a/kernel/params.c
+++ b/kernel/params.c
@@ -233,14 +233,15 @@ char *parse_args(const char *doing,
EXPORT_SYMBOL(param_ops_##name)
  
  
-STANDARD_PARAM_DEF(byte,	unsigned char,		"%hhu", kstrtou8);

-STANDARD_PARAM_DEF(short,  short,  "%hi",  kstrtos16);
-STANDARD_PARAM_DEF(ushort, unsigned short, "%hu",  kstrtou16);
-STANDARD_PARAM_DEF(int,int,"%i",   
kstrtoint);
-STANDARD_PARAM_DEF(uint,   unsigned int,   "%u",   kstrtouint);
-STANDARD_PARAM_DEF(long,   long,   "%li",  kstrtol);
-STANDARD_PARAM_DEF(ulong,  unsigned long,  "%lu",  kstrtoul);
-STANDARD_PARAM_DEF(ullong, unsigned long long, "%llu", kstrtoull);
+STANDARD_PARAM_DEF(byte,   unsigned char,  "%hhu",  kstrtou8);
+STANDARD_PARAM_DEF(short,  short,  "%hi",   kstrtos16);
+STANDARD_PARAM_DEF(ushort, unsigned short, "%hu",   kstrtou16);
+STANDARD_PARAM_DEF(int,int,"%i",
kstrtoint);
+STANDARD_PARAM_DEF(uint,   unsigned int,   "%u",kstrtouint);
+STANDARD_PARAM_DEF(long,   long,   "%li",   kstrtol);
+STANDARD_PARAM_DEF(ulong,  unsigned long,  "%lu",   kstrtoul);
+STANDARD_PARAM_DEF(ullong, unsigned long long, "%llu",  kstrtoull);
+STANDARD_PARAM_DEF(hexint, unsigned int,   "%#08x", kstrtouint);


All other indentations uses tabs, only the last one seems to use a 
space. If you touch this, then maybe make it consistent as well.


Apart from that looks good to me,
Christian.

  
  int param_set_charp(const char *val, const struct kernel_param *kp)

  {


___
amd-gfx mailing list
amd-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/amd-gfx


[PATCH 6/6] drm/amd/powerplay: drop unused code around thermal range setting

2020-07-03 Thread Evan Quan
Leftover of previous cleanups.

Change-Id: I36a018349647125513e47edda66db2005bd8b0c5
Signed-off-by: Evan Quan 
---
 drivers/gpu/drm/amd/powerplay/arcturus_ppt.c  | 32 ---
 .../gpu/drm/amd/powerplay/inc/amdgpu_smu.h|  2 --
 drivers/gpu/drm/amd/powerplay/navi10_ppt.c| 32 ---
 .../drm/amd/powerplay/sienna_cichlid_ppt.c| 32 ---
 drivers/gpu/drm/amd/powerplay/smu_internal.h  |  2 --
 drivers/gpu/drm/amd/powerplay/smu_v11_0.c | 16 ++
 6 files changed, 3 insertions(+), 113 deletions(-)

diff --git a/drivers/gpu/drm/amd/powerplay/arcturus_ppt.c 
b/drivers/gpu/drm/amd/powerplay/arcturus_ppt.c
index 209ccf38c020..56dc20a617fd 100644
--- a/drivers/gpu/drm/amd/powerplay/arcturus_ppt.c
+++ b/drivers/gpu/drm/amd/powerplay/arcturus_ppt.c
@@ -2314,37 +2314,6 @@ static void arcturus_log_thermal_throttling_event(struct 
smu_context *smu)
log_buf);
 }
 
-static int arcturus_set_thermal_range(struct smu_context *smu,
-  struct smu_temperature_range range)
-{
-   struct amdgpu_device *adev = smu->adev;
-   int low = SMU_THERMAL_MINIMUM_ALERT_TEMP;
-   int high = SMU_THERMAL_MAXIMUM_ALERT_TEMP;
-   uint32_t val;
-   struct smu_table_context *table_context = &smu->smu_table;
-   struct smu_11_0_powerplay_table *powerplay_table = 
table_context->power_play_table;
-
-   low = max(SMU_THERMAL_MINIMUM_ALERT_TEMP,
-   range.min / SMU_TEMPERATURE_UNITS_PER_CENTIGRADES);
-   high = min((uint16_t)SMU_THERMAL_MAXIMUM_ALERT_TEMP, 
powerplay_table->software_shutdown_temp);
-
-   if (low > high)
-   return -EINVAL;
-
-   val = RREG32_SOC15(THM, 0, mmTHM_THERMAL_INT_CTRL);
-   val = REG_SET_FIELD(val, THM_THERMAL_INT_CTRL, MAX_IH_CREDIT, 5);
-   val = REG_SET_FIELD(val, THM_THERMAL_INT_CTRL, THERM_IH_HW_ENA, 1);
-   val = REG_SET_FIELD(val, THM_THERMAL_INT_CTRL, THERM_INTH_MASK, 0);
-   val = REG_SET_FIELD(val, THM_THERMAL_INT_CTRL, THERM_INTL_MASK, 0);
-   val = REG_SET_FIELD(val, THM_THERMAL_INT_CTRL, DIG_THERM_INTH, (high & 
0xff));
-   val = REG_SET_FIELD(val, THM_THERMAL_INT_CTRL, DIG_THERM_INTL, (low & 
0xff));
-   val = val & (~THM_THERMAL_INT_CTRL__THERM_TRIGGER_MASK_MASK);
-
-   WREG32_SOC15(THM, 0, mmTHM_THERMAL_INT_CTRL, val);
-
-   return 0;
-}
-
 static const struct pptable_funcs arcturus_ppt_funcs = {
/* translate smu index into arcturus specific index */
.get_smu_msg_index = arcturus_get_smu_msg_index,
@@ -2427,7 +2396,6 @@ static const struct pptable_funcs arcturus_ppt_funcs = {
.set_df_cstate = arcturus_set_df_cstate,
.allow_xgmi_power_down = arcturus_allow_xgmi_power_down,
.log_thermal_throttling_event = arcturus_log_thermal_throttling_event,
-   .set_thermal_range = arcturus_set_thermal_range,
 };
 
 void arcturus_set_ppt_funcs(struct smu_context *smu)
diff --git a/drivers/gpu/drm/amd/powerplay/inc/amdgpu_smu.h 
b/drivers/gpu/drm/amd/powerplay/inc/amdgpu_smu.h
index dede24959652..52e5603dcc97 100644
--- a/drivers/gpu/drm/amd/powerplay/inc/amdgpu_smu.h
+++ b/drivers/gpu/drm/amd/powerplay/inc/amdgpu_smu.h
@@ -480,7 +480,6 @@ struct pptable_funcs {
int (*set_cpu_power_state)(struct smu_context *smu);
bool (*is_dpm_running)(struct smu_context *smu);
int (*tables_init)(struct smu_context *smu, struct smu_table *tables);
-   int (*set_thermal_fan_table)(struct smu_context *smu);
int (*get_fan_speed_percent)(struct smu_context *smu, uint32_t *speed);
int (*get_fan_speed_rpm)(struct smu_context *smu, uint32_t *speed);
int (*set_watermarks_table)(struct smu_context *smu, void *watermarks,
@@ -570,7 +569,6 @@ struct pptable_funcs {
int (*disable_umc_cdr_12gbps_workaround)(struct smu_context *smu);
int (*set_power_source)(struct smu_context *smu, enum 
smu_power_src_type power_src);
void (*log_thermal_throttling_event)(struct smu_context *smu);
-   int (*set_thermal_range)(struct smu_context *smu, struct 
smu_temperature_range range);
 };
 
 typedef enum {
diff --git a/drivers/gpu/drm/amd/powerplay/navi10_ppt.c 
b/drivers/gpu/drm/amd/powerplay/navi10_ppt.c
index a04a0ba632a9..41bd6d157271 100644
--- a/drivers/gpu/drm/amd/powerplay/navi10_ppt.c
+++ b/drivers/gpu/drm/amd/powerplay/navi10_ppt.c
@@ -2340,37 +2340,6 @@ static int 
navi10_disable_umc_cdr_12gbps_workaround(struct smu_context *smu)
return navi10_dummy_pstate_control(smu, true);
 }
 
-static int navi10_set_thermal_range(struct smu_context *smu,
-  struct smu_temperature_range range)
-{
-   struct amdgpu_device *adev = smu->adev;
-   int low = SMU_THERMAL_MINIMUM_ALERT_TEMP;
-   int high = SMU_THERMAL_MAXIMUM_ALERT_TEMP;
-   uint32_t val;
-   struct smu_table_context *table_context = &smu->smu_table;
-   struct smu_11_0_powerplay_table *powerplay_table 

[PATCH 5/6] drm/amd/powerplay: maximum the code sharing on thermal irq setting

2020-07-03 Thread Evan Quan
Put the common code in smu_v11_0.c instead of having one copy each.

Change-Id: I6d0c27c5810ebc3273ef8b4fae07ac6dbed2715c
Signed-off-by: Evan Quan 
---
 drivers/gpu/drm/amd/powerplay/smu_v11_0.c | 16 
 1 file changed, 12 insertions(+), 4 deletions(-)

diff --git a/drivers/gpu/drm/amd/powerplay/smu_v11_0.c 
b/drivers/gpu/drm/amd/powerplay/smu_v11_0.c
index 3404db490eb3..86a118a3a80c 100644
--- a/drivers/gpu/drm/amd/powerplay/smu_v11_0.c
+++ b/drivers/gpu/drm/amd/powerplay/smu_v11_0.c
@@ -1089,10 +1089,6 @@ int smu_v11_0_enable_thermal_alert(struct smu_context 
*smu)
struct amdgpu_device *adev = smu->adev;
 
if (smu->smu_table.thermal_controller_type) {
-   ret = smu_set_thermal_range(smu, smu->thermal_range);
-   if (ret)
-   return ret;
-
ret = amdgpu_irq_get(adev, &smu->irq_source, 0);
if (ret)
return ret;
@@ -1347,6 +1343,8 @@ static int smu_v11_0_set_irq_state(struct amdgpu_device 
*adev,
   unsigned tyep,
   enum amdgpu_interrupt_state state)
 {
+   struct smu_context *smu = &adev->smu;
+   uint32_t low, high;
uint32_t val = 0;
 
switch (state) {
@@ -1367,9 +1365,19 @@ static int smu_v11_0_set_irq_state(struct amdgpu_device 
*adev,
break;
case AMDGPU_IRQ_STATE_ENABLE:
/* For THM irqs */
+   low = max(SMU_THERMAL_MINIMUM_ALERT_TEMP,
+   smu->thermal_range.min / 
SMU_TEMPERATURE_UNITS_PER_CENTIGRADES);
+   high = min(SMU_THERMAL_MAXIMUM_ALERT_TEMP,
+   smu->thermal_range.software_shutdown_temp);
+
val = RREG32_SOC15(THM, 0, mmTHM_THERMAL_INT_CTRL);
+   val = REG_SET_FIELD(val, THM_THERMAL_INT_CTRL, MAX_IH_CREDIT, 
5);
+   val = REG_SET_FIELD(val, THM_THERMAL_INT_CTRL, THERM_IH_HW_ENA, 
1);
val = REG_SET_FIELD(val, THM_THERMAL_INT_CTRL, THERM_INTH_MASK, 
0);
val = REG_SET_FIELD(val, THM_THERMAL_INT_CTRL, THERM_INTL_MASK, 
0);
+   val = REG_SET_FIELD(val, THM_THERMAL_INT_CTRL, DIG_THERM_INTH, 
(high & 0xff));
+   val = REG_SET_FIELD(val, THM_THERMAL_INT_CTRL, DIG_THERM_INTL, 
(low & 0xff));
+   val = val & (~THM_THERMAL_INT_CTRL__THERM_TRIGGER_MASK_MASK);
WREG32_SOC15(THM, 0, mmTHM_THERMAL_INT_CTRL, val);
 
val = (1 << THM_THERMAL_INT_ENA__THERM_INTH_CLR__SHIFT);
-- 
2.27.0

___
amd-gfx mailing list
amd-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/amd-gfx


[PATCH 3/6] drm/amd/powerplay: cache the software_shutdown_temp

2020-07-03 Thread Evan Quan
As it's needed in the succeeding thermal irq setting.

Change-Id: Iee34fb6515a88a684c7f1214e40edb7e65245f8d
Signed-off-by: Evan Quan 
---
 drivers/gpu/drm/amd/powerplay/arcturus_ppt.c   | 4 
 drivers/gpu/drm/amd/powerplay/inc/amdgpu_smu.h | 1 +
 drivers/gpu/drm/amd/powerplay/navi10_ppt.c | 4 
 drivers/gpu/drm/amd/powerplay/sienna_cichlid_ppt.c | 4 
 4 files changed, 13 insertions(+)

diff --git a/drivers/gpu/drm/amd/powerplay/arcturus_ppt.c 
b/drivers/gpu/drm/amd/powerplay/arcturus_ppt.c
index 0b33cde05133..6518acf4df0a 100644
--- a/drivers/gpu/drm/amd/powerplay/arcturus_ppt.c
+++ b/drivers/gpu/drm/amd/powerplay/arcturus_ppt.c
@@ -1029,6 +1029,9 @@ static int arcturus_force_clk_levels(struct smu_context 
*smu,
 static int arcturus_get_thermal_temperature_range(struct smu_context *smu,
struct smu_temperature_range 
*range)
 {
+   struct smu_table_context *table_context = &smu->smu_table;
+   struct smu_11_0_powerplay_table *powerplay_table =
+   table_context->power_play_table;
PPTable_t *pptable = smu->smu_table.driver_pptable;
 
if (!range)
@@ -1046,6 +1049,7 @@ static int arcturus_get_thermal_temperature_range(struct 
smu_context *smu,
SMU_TEMPERATURE_UNITS_PER_CENTIGRADES;
range->mem_emergency_max = (pptable->TmemLimit + CTF_OFFSET_MEM)*
SMU_TEMPERATURE_UNITS_PER_CENTIGRADES;
+   range->software_shutdown_temp = powerplay_table->software_shutdown_temp;
 
return 0;
 }
diff --git a/drivers/gpu/drm/amd/powerplay/inc/amdgpu_smu.h 
b/drivers/gpu/drm/amd/powerplay/inc/amdgpu_smu.h
index ba8e162f44ab..4251f7dc3d68 100644
--- a/drivers/gpu/drm/amd/powerplay/inc/amdgpu_smu.h
+++ b/drivers/gpu/drm/amd/powerplay/inc/amdgpu_smu.h
@@ -119,6 +119,7 @@ struct smu_temperature_range {
int mem_min;
int mem_crit_max;
int mem_emergency_max;
+   int software_shutdown_temp;
 };
 
 struct smu_state_validation_block {
diff --git a/drivers/gpu/drm/amd/powerplay/navi10_ppt.c 
b/drivers/gpu/drm/amd/powerplay/navi10_ppt.c
index 350b469646bd..0a1e1835f455 100644
--- a/drivers/gpu/drm/amd/powerplay/navi10_ppt.c
+++ b/drivers/gpu/drm/amd/powerplay/navi10_ppt.c
@@ -1856,6 +1856,9 @@ static int navi10_get_uclk_dpm_states(struct smu_context 
*smu, uint32_t *clocks_
 static int navi10_get_thermal_temperature_range(struct smu_context *smu,
struct smu_temperature_range 
*range)
 {
+   struct smu_table_context *table_context = &smu->smu_table;
+   struct smu_11_0_powerplay_table *powerplay_table =
+   table_context->power_play_table;
PPTable_t *pptable = smu->smu_table.driver_pptable;
 
if (!range)
@@ -1873,6 +1876,7 @@ static int navi10_get_thermal_temperature_range(struct 
smu_context *smu,
SMU_TEMPERATURE_UNITS_PER_CENTIGRADES;
range->mem_emergency_max = (pptable->TmemLimit + CTF_OFFSET_MEM)*
SMU_TEMPERATURE_UNITS_PER_CENTIGRADES;
+   range->software_shutdown_temp = powerplay_table->software_shutdown_temp;
 
return 0;
 }
diff --git a/drivers/gpu/drm/amd/powerplay/sienna_cichlid_ppt.c 
b/drivers/gpu/drm/amd/powerplay/sienna_cichlid_ppt.c
index afa8e46cd2ab..18a7b695b128 100644
--- a/drivers/gpu/drm/amd/powerplay/sienna_cichlid_ppt.c
+++ b/drivers/gpu/drm/amd/powerplay/sienna_cichlid_ppt.c
@@ -1644,6 +1644,9 @@ static int sienna_cichlid_get_uclk_dpm_states(struct 
smu_context *smu, uint32_t
 static int sienna_cichlid_get_thermal_temperature_range(struct smu_context 
*smu,
struct smu_temperature_range 
*range)
 {
+   struct smu_table_context *table_context = &smu->smu_table;
+   struct smu_11_0_7_powerplay_table *powerplay_table =
+   table_context->power_play_table;
PPTable_t *pptable = smu->smu_table.driver_pptable;
 
if (!range)
@@ -1661,6 +1664,7 @@ static int 
sienna_cichlid_get_thermal_temperature_range(struct smu_context *smu,
SMU_TEMPERATURE_UNITS_PER_CENTIGRADES;
range->mem_emergency_max = (pptable->TemperatureLimit[TEMP_MEM] + 
CTF_OFFSET_MEM)*
SMU_TEMPERATURE_UNITS_PER_CENTIGRADES;
+   range->software_shutdown_temp = powerplay_table->software_shutdown_temp;
 
return 0;
 }
-- 
2.27.0

___
amd-gfx mailing list
amd-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/amd-gfx


[PATCH 4/6] drm/amd/powerplay: sort the call flow on temperature ranges retrieving

2020-07-03 Thread Evan Quan
This can help to maintain clear code layer.

Change-Id: I9c95dd70273ab56c1ddb40592574ed283a34737f
Signed-off-by: Evan Quan 
---
 drivers/gpu/drm/amd/powerplay/amdgpu_smu.c| 33 +++
 drivers/gpu/drm/amd/powerplay/arcturus_ppt.c  |  2 ++
 .../gpu/drm/amd/powerplay/inc/amdgpu_smu.h|  2 +-
 drivers/gpu/drm/amd/powerplay/navi10_ppt.c|  2 ++
 .../drm/amd/powerplay/sienna_cichlid_ppt.c|  2 ++
 drivers/gpu/drm/amd/powerplay/smu_internal.h  |  1 -
 drivers/gpu/drm/amd/powerplay/smu_v11_0.c | 19 +--
 7 files changed, 41 insertions(+), 20 deletions(-)

diff --git a/drivers/gpu/drm/amd/powerplay/amdgpu_smu.c 
b/drivers/gpu/drm/amd/powerplay/amdgpu_smu.c
index 3d62a99bad84..16ff64644e2e 100644
--- a/drivers/gpu/drm/amd/powerplay/amdgpu_smu.c
+++ b/drivers/gpu/drm/amd/powerplay/amdgpu_smu.c
@@ -991,6 +991,33 @@ static int smu_sw_fini(void *handle)
return 0;
 }
 
+static int smu_get_thermal_temperature_range(struct smu_context *smu)
+{
+   struct amdgpu_device *adev = smu->adev;
+   struct smu_temperature_range *range =
+   &smu->thermal_range;
+   int ret = 0;
+
+   if (!smu->ppt_funcs->get_thermal_temperature_range)
+   return 0;
+
+   ret = smu->ppt_funcs->get_thermal_temperature_range(smu, range);
+   if (ret)
+   return ret;
+
+   adev->pm.dpm.thermal.min_temp = range->min;
+   adev->pm.dpm.thermal.max_temp = range->max;
+   adev->pm.dpm.thermal.max_edge_emergency_temp = 
range->edge_emergency_max;
+   adev->pm.dpm.thermal.min_hotspot_temp = range->hotspot_min;
+   adev->pm.dpm.thermal.max_hotspot_crit_temp = range->hotspot_crit_max;
+   adev->pm.dpm.thermal.max_hotspot_emergency_temp = 
range->hotspot_emergency_max;
+   adev->pm.dpm.thermal.min_mem_temp = range->mem_min;
+   adev->pm.dpm.thermal.max_mem_crit_temp = range->mem_crit_max;
+   adev->pm.dpm.thermal.max_mem_emergency_temp = range->mem_emergency_max;
+
+   return ret;
+}
+
 static int smu_smc_hw_setup(struct smu_context *smu)
 {
struct amdgpu_device *adev = smu->adev;
@@ -1095,6 +1122,12 @@ static int smu_smc_hw_setup(struct smu_context *smu)
return ret;
}
 
+   ret = smu_get_thermal_temperature_range(smu);
+   if (ret) {
+   dev_err(adev->dev, "Failed to get thermal temperature 
ranges!\n");
+   return ret;
+   }
+
ret = smu_enable_thermal_alert(smu);
if (ret) {
dev_err(adev->dev, "Failed to enable thermal alert!\n");
diff --git a/drivers/gpu/drm/amd/powerplay/arcturus_ppt.c 
b/drivers/gpu/drm/amd/powerplay/arcturus_ppt.c
index 6518acf4df0a..209ccf38c020 100644
--- a/drivers/gpu/drm/amd/powerplay/arcturus_ppt.c
+++ b/drivers/gpu/drm/amd/powerplay/arcturus_ppt.c
@@ -1037,6 +1037,8 @@ static int arcturus_get_thermal_temperature_range(struct 
smu_context *smu,
if (!range)
return -EINVAL;
 
+   memcpy(range, &smu11_thermal_policy[0], sizeof(struct 
smu_temperature_range));
+
range->max = pptable->TedgeLimit *
SMU_TEMPERATURE_UNITS_PER_CENTIGRADES;
range->edge_emergency_max = (pptable->TedgeLimit + CTF_OFFSET_EDGE) *
diff --git a/drivers/gpu/drm/amd/powerplay/inc/amdgpu_smu.h 
b/drivers/gpu/drm/amd/powerplay/inc/amdgpu_smu.h
index 4251f7dc3d68..dede24959652 100644
--- a/drivers/gpu/drm/amd/powerplay/inc/amdgpu_smu.h
+++ b/drivers/gpu/drm/amd/powerplay/inc/amdgpu_smu.h
@@ -146,7 +146,6 @@ struct smu_power_state {
struct smu_state_pcie_block   pcie;
struct smu_state_display_blockdisplay;
struct smu_state_memroy_block memory;
-   struct smu_temperature_range  temperatures;
struct smu_state_software_algorithm_block software;
struct smu_uvd_clocks uvd_clocks;
struct smu_hw_power_state hardware;
@@ -386,6 +385,7 @@ struct smu_context
struct smu_feature  smu_feature;
struct amd_pp_display_configuration  *display_config;
struct smu_baco_context smu_baco;
+   struct smu_temperature_rangethermal_range;
void *od_settings;
 #if defined(CONFIG_DEBUG_FS)
struct dentry   *debugfs_sclk;
diff --git a/drivers/gpu/drm/amd/powerplay/navi10_ppt.c 
b/drivers/gpu/drm/amd/powerplay/navi10_ppt.c
index 0a1e1835f455..a04a0ba632a9 100644
--- a/drivers/gpu/drm/amd/powerplay/navi10_ppt.c
+++ b/drivers/gpu/drm/amd/powerplay/navi10_ppt.c
@@ -1864,6 +1864,8 @@ static int navi10_get_thermal_temperature_range(struct 
smu_context *smu,
if (!range)
return -EINVAL;
 
+   memcpy(range, &smu11_thermal_policy[0], sizeof(struct 
smu_temperature_range));
+
range->max = pptable->TedgeLimit *
SMU_TEMPERATURE_UNITS_PER_CENTIGRADES;
range->edge_emergency_max = (pptable->TedgeLimit +

[PATCH 1/6] drm/amd/powerplay: correct Navi1X temperature limit settings

2020-07-03 Thread Evan Quan
These are needed for temp1/2/3 related hwmon interfaces.

Change-Id: I4fe04dc65ba2153bbb9c507769a9d8ddeac66094
Signed-off-by: Evan Quan 
---
 drivers/gpu/drm/amd/powerplay/arcturus_ppt.c  |  6 +-
 drivers/gpu/drm/amd/powerplay/inc/smu_v11_0.h |  4 
 drivers/gpu/drm/amd/powerplay/navi10_ppt.c| 17 +
 3 files changed, 18 insertions(+), 9 deletions(-)

diff --git a/drivers/gpu/drm/amd/powerplay/arcturus_ppt.c 
b/drivers/gpu/drm/amd/powerplay/arcturus_ppt.c
index 3687e7620eb8..0b33cde05133 100644
--- a/drivers/gpu/drm/amd/powerplay/arcturus_ppt.c
+++ b/drivers/gpu/drm/amd/powerplay/arcturus_ppt.c
@@ -56,10 +56,6 @@
 
 #define to_amdgpu_device(x) (container_of(x, struct amdgpu_device, pm.smu_i2c))
 
-#define CTF_OFFSET_EDGE5
-#define CTF_OFFSET_HOTSPOT 5
-#define CTF_OFFSET_HBM 5
-
 #define MSG_MAP(msg, index, valid_in_vf) \
[SMU_MSG_##msg] = {1, (index), (valid_in_vf)}
 #define ARCTURUS_FEA_MAP(smu_feature, arcturus_feature) \
@@ -1048,7 +1044,7 @@ static int arcturus_get_thermal_temperature_range(struct 
smu_context *smu,
SMU_TEMPERATURE_UNITS_PER_CENTIGRADES;
range->mem_crit_max = pptable->TmemLimit *
SMU_TEMPERATURE_UNITS_PER_CENTIGRADES;
-   range->mem_emergency_max = (pptable->TmemLimit + CTF_OFFSET_HBM)*
+   range->mem_emergency_max = (pptable->TmemLimit + CTF_OFFSET_MEM)*
SMU_TEMPERATURE_UNITS_PER_CENTIGRADES;
 
return 0;
diff --git a/drivers/gpu/drm/amd/powerplay/inc/smu_v11_0.h 
b/drivers/gpu/drm/amd/powerplay/inc/smu_v11_0.h
index 311166f1975c..4de3cdcae437 100644
--- a/drivers/gpu/drm/amd/powerplay/inc/smu_v11_0.h
+++ b/drivers/gpu/drm/amd/powerplay/inc/smu_v11_0.h
@@ -66,6 +66,10 @@
 #define WORKLOAD_MAP(profile, workload) \
[profile] = {1, (workload)}
 
+#define CTF_OFFSET_EDGE5
+#define CTF_OFFSET_HOTSPOT 5
+#define CTF_OFFSET_MEM 5
+
 static const struct smu_temperature_range smu11_thermal_policy[] =
 {
{-273150,  99000, 99000, -273150, 99000, 99000, -273150, 99000, 99000},
diff --git a/drivers/gpu/drm/amd/powerplay/navi10_ppt.c 
b/drivers/gpu/drm/amd/powerplay/navi10_ppt.c
index 97d14539c95e..350b469646bd 100644
--- a/drivers/gpu/drm/amd/powerplay/navi10_ppt.c
+++ b/drivers/gpu/drm/amd/powerplay/navi10_ppt.c
@@ -1856,13 +1856,22 @@ static int navi10_get_uclk_dpm_states(struct 
smu_context *smu, uint32_t *clocks_
 static int navi10_get_thermal_temperature_range(struct smu_context *smu,
struct smu_temperature_range 
*range)
 {
-   struct smu_table_context *table_context = &smu->smu_table;
-   struct smu_11_0_powerplay_table *powerplay_table = 
table_context->power_play_table;
+   PPTable_t *pptable = smu->smu_table.driver_pptable;
 
-   if (!range || !powerplay_table)
+   if (!range)
return -EINVAL;
 
-   range->max = powerplay_table->software_shutdown_temp *
+   range->max = pptable->TedgeLimit *
+   SMU_TEMPERATURE_UNITS_PER_CENTIGRADES;
+   range->edge_emergency_max = (pptable->TedgeLimit + CTF_OFFSET_EDGE) *
+   SMU_TEMPERATURE_UNITS_PER_CENTIGRADES;
+   range->hotspot_crit_max = pptable->ThotspotLimit *
+   SMU_TEMPERATURE_UNITS_PER_CENTIGRADES;
+   range->hotspot_emergency_max = (pptable->ThotspotLimit + 
CTF_OFFSET_HOTSPOT) *
+   SMU_TEMPERATURE_UNITS_PER_CENTIGRADES;
+   range->mem_crit_max = pptable->TmemLimit *
+   SMU_TEMPERATURE_UNITS_PER_CENTIGRADES;
+   range->mem_emergency_max = (pptable->TmemLimit + CTF_OFFSET_MEM)*
SMU_TEMPERATURE_UNITS_PER_CENTIGRADES;
 
return 0;
-- 
2.27.0

___
amd-gfx mailing list
amd-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/amd-gfx


[PATCH 2/6] drm/amd/powerplay: correct Sienna Cichlid temperature limit settings

2020-07-03 Thread Evan Quan
These are needed for temp1/2/3 related hwmon interfaces.

Change-Id: I76ec427aaae67a0dd257e2b1d7908990eb79a5b2
Signed-off-by: Evan Quan 
---
 .../gpu/drm/amd/powerplay/sienna_cichlid_ppt.c  | 17 +
 1 file changed, 13 insertions(+), 4 deletions(-)

diff --git a/drivers/gpu/drm/amd/powerplay/sienna_cichlid_ppt.c 
b/drivers/gpu/drm/amd/powerplay/sienna_cichlid_ppt.c
index 46be02e4b93c..afa8e46cd2ab 100644
--- a/drivers/gpu/drm/amd/powerplay/sienna_cichlid_ppt.c
+++ b/drivers/gpu/drm/amd/powerplay/sienna_cichlid_ppt.c
@@ -1644,13 +1644,22 @@ static int sienna_cichlid_get_uclk_dpm_states(struct 
smu_context *smu, uint32_t
 static int sienna_cichlid_get_thermal_temperature_range(struct smu_context 
*smu,
struct smu_temperature_range 
*range)
 {
-   struct smu_table_context *table_context = &smu->smu_table;
-   struct smu_11_0_7_powerplay_table *powerplay_table = 
table_context->power_play_table;
+   PPTable_t *pptable = smu->smu_table.driver_pptable;
 
-   if (!range || !powerplay_table)
+   if (!range)
return -EINVAL;
 
-   range->max = powerplay_table->software_shutdown_temp *
+   range->max = pptable->TemperatureLimit[TEMP_EDGE] *
+   SMU_TEMPERATURE_UNITS_PER_CENTIGRADES;
+   range->edge_emergency_max = (pptable->TemperatureLimit[TEMP_EDGE] + 
CTF_OFFSET_EDGE) *
+   SMU_TEMPERATURE_UNITS_PER_CENTIGRADES;
+   range->hotspot_crit_max = pptable->TemperatureLimit[TEMP_HOTSPOT] *
+   SMU_TEMPERATURE_UNITS_PER_CENTIGRADES;
+   range->hotspot_emergency_max = (pptable->TemperatureLimit[TEMP_HOTSPOT] 
+ CTF_OFFSET_HOTSPOT) *
+   SMU_TEMPERATURE_UNITS_PER_CENTIGRADES;
+   range->mem_crit_max = pptable->TemperatureLimit[TEMP_MEM] *
+   SMU_TEMPERATURE_UNITS_PER_CENTIGRADES;
+   range->mem_emergency_max = (pptable->TemperatureLimit[TEMP_MEM] + 
CTF_OFFSET_MEM)*
SMU_TEMPERATURE_UNITS_PER_CENTIGRADES;
 
return 0;
-- 
2.27.0

___
amd-gfx mailing list
amd-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/amd-gfx


[PATCH 2/2] drm/amd/powerplay: correct the supported pcie GenSpeed and LaneCount

2020-07-03 Thread Evan Quan
The LCLK dpm table setup should be performed in .update_pcie_parameters().
Otherwise, the updated GenSpeed and LaneCount information will be lost.

Change-Id: I028c26ca0e54098cb93d9e9266719f1762ba2d7e
Signed-off-by: Evan Quan 
---
 drivers/gpu/drm/amd/powerplay/navi10_ppt.c  | 17 +++--
 .../gpu/drm/amd/powerplay/sienna_cichlid_ppt.c  | 17 +++--
 2 files changed, 14 insertions(+), 20 deletions(-)

diff --git a/drivers/gpu/drm/amd/powerplay/navi10_ppt.c 
b/drivers/gpu/drm/amd/powerplay/navi10_ppt.c
index 3db5e663aa6f..97d14539c95e 100644
--- a/drivers/gpu/drm/amd/powerplay/navi10_ppt.c
+++ b/drivers/gpu/drm/amd/powerplay/navi10_ppt.c
@@ -693,7 +693,6 @@ static int navi10_set_default_dpm_table(struct smu_context 
*smu)
PPTable_t *driver_ppt = smu->smu_table.driver_pptable;
struct smu_11_0_dpm_table *dpm_table;
int ret = 0;
-   int i;
 
/* socclk dpm table setup */
dpm_table = &dpm_context->dpm_tables.soc_table;
@@ -857,12 +856,6 @@ static int navi10_set_default_dpm_table(struct smu_context 
*smu)
dpm_table->max = dpm_table->dpm_levels[0].value;
}
 
-   /* lclk dpm table setup */
-   for (i = 0; i < MAX_PCIE_CONF; i++) {
-   dpm_context->dpm_tables.pcie_table.pcie_gen[i] = 
driver_ppt->PcieGenSpeed[i];
-   dpm_context->dpm_tables.pcie_table.pcie_lane[i] = 
driver_ppt->PcieLaneCount[i];
-   }
-
return 0;
 }
 
@@ -1936,12 +1929,16 @@ static int navi10_update_pcie_parameters(struct 
smu_context *smu,
 uint32_t pcie_gen_cap,
 uint32_t pcie_width_cap)
 {
+   struct smu_11_0_dpm_context *dpm_context = smu->smu_dpm.dpm_context;
PPTable_t *pptable = smu->smu_table.driver_pptable;
-   int ret, i;
uint32_t smu_pcie_arg;
+   int ret, i;
 
-   struct smu_dpm_context *smu_dpm = &smu->smu_dpm;
-   struct smu_11_0_dpm_context *dpm_context = smu_dpm->dpm_context;
+   /* lclk dpm table setup */
+   for (i = 0; i < MAX_PCIE_CONF; i++) {
+   dpm_context->dpm_tables.pcie_table.pcie_gen[i] = 
pptable->PcieGenSpeed[i];
+   dpm_context->dpm_tables.pcie_table.pcie_lane[i] = 
pptable->PcieLaneCount[i];
+   }
 
for (i = 0; i < NUM_LINK_LEVELS; i++) {
smu_pcie_arg = (i << 16) |
diff --git a/drivers/gpu/drm/amd/powerplay/sienna_cichlid_ppt.c 
b/drivers/gpu/drm/amd/powerplay/sienna_cichlid_ppt.c
index 7a108676f90a..46be02e4b93c 100644
--- a/drivers/gpu/drm/amd/powerplay/sienna_cichlid_ppt.c
+++ b/drivers/gpu/drm/amd/powerplay/sienna_cichlid_ppt.c
@@ -601,7 +601,6 @@ static int sienna_cichlid_set_default_dpm_table(struct 
smu_context *smu)
PPTable_t *driver_ppt = smu->smu_table.driver_pptable;
struct smu_11_0_dpm_table *dpm_table;
int ret = 0;
-   int i;
 
/* socclk dpm table setup */
dpm_table = &dpm_context->dpm_tables.soc_table;
@@ -819,12 +818,6 @@ static int sienna_cichlid_set_default_dpm_table(struct 
smu_context *smu)
dpm_table->max = dpm_table->dpm_levels[0].value;
}
 
-   /* lclk dpm table setup */
-   for (i = 0; i < MAX_PCIE_CONF; i++) {
-   dpm_context->dpm_tables.pcie_table.pcie_gen[i] = 
driver_ppt->PcieGenSpeed[i];
-   dpm_context->dpm_tables.pcie_table.pcie_lane[i] = 
driver_ppt->PcieLaneCount[i];
-   }
-
return 0;
 }
 
@@ -1722,12 +1715,16 @@ static int sienna_cichlid_update_pcie_parameters(struct 
smu_context *smu,
 uint32_t pcie_gen_cap,
 uint32_t pcie_width_cap)
 {
+   struct smu_11_0_dpm_context *dpm_context = smu->smu_dpm.dpm_context;
PPTable_t *pptable = smu->smu_table.driver_pptable;
-   int ret, i;
uint32_t smu_pcie_arg;
+   int ret, i;
 
-   struct smu_dpm_context *smu_dpm = &smu->smu_dpm;
-   struct smu_11_0_dpm_context *dpm_context = smu_dpm->dpm_context;
+   /* lclk dpm table setup */
+   for (i = 0; i < MAX_PCIE_CONF; i++) {
+   dpm_context->dpm_tables.pcie_table.pcie_gen[i] = 
pptable->PcieGenSpeed[i];
+   dpm_context->dpm_tables.pcie_table.pcie_lane[i] = 
pptable->PcieLaneCount[i];
+   }
 
for (i = 0; i < NUM_LINK_LEVELS; i++) {
smu_pcie_arg = (i << 16) |
-- 
2.27.0

___
amd-gfx mailing list
amd-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/amd-gfx


[PATCH 1/2] drm/amd/powerplay: drop unnecessary wrapper around pcie parameters setting

2020-07-03 Thread Evan Quan
This can also help to maintain clear code layer.

Change-Id: I9bf6a7bb93112ae40bd549ee4d7afb42a968aacf
Signed-off-by: Evan Quan 
---
 drivers/gpu/drm/amd/powerplay/amdgpu_smu.c| 33 ++-
 drivers/gpu/drm/amd/powerplay/arcturus_ppt.c  |  1 -
 .../gpu/drm/amd/powerplay/inc/amdgpu_smu.h|  1 -
 drivers/gpu/drm/amd/powerplay/inc/smu_v11_0.h |  2 -
 drivers/gpu/drm/amd/powerplay/navi10_ppt.c|  1 -
 .../drm/amd/powerplay/sienna_cichlid_ppt.c|  1 -
 drivers/gpu/drm/amd/powerplay/smu_internal.h  |  1 -
 drivers/gpu/drm/amd/powerplay/smu_v11_0.c | 42 ---
 8 files changed, 31 insertions(+), 51 deletions(-)

diff --git a/drivers/gpu/drm/amd/powerplay/amdgpu_smu.c 
b/drivers/gpu/drm/amd/powerplay/amdgpu_smu.c
index 38b3b47d12b7..3d62a99bad84 100644
--- a/drivers/gpu/drm/amd/powerplay/amdgpu_smu.c
+++ b/drivers/gpu/drm/amd/powerplay/amdgpu_smu.c
@@ -33,6 +33,7 @@
 #include "navi10_ppt.h"
 #include "sienna_cichlid_ppt.h"
 #include "renoir_ppt.h"
+#include "amd_pcie.h"
 
 /*
  * DO NOT use these for err/warn/info/debug messages.
@@ -993,6 +994,7 @@ static int smu_sw_fini(void *handle)
 static int smu_smc_hw_setup(struct smu_context *smu)
 {
struct amdgpu_device *adev = smu->adev;
+   uint32_t pcie_gen = 0, pcie_width = 0;
int ret;
 
if (smu_is_dpm_running(smu) && adev->in_suspend) {
@@ -1062,9 +1064,36 @@ static int smu_smc_hw_setup(struct smu_context *smu)
if (!smu_is_dpm_running(smu))
dev_info(adev->dev, "dpm has been disabled\n");
 
-   ret = smu_override_pcie_parameters(smu);
-   if (ret)
+   if (adev->pm.pcie_gen_mask & CAIL_PCIE_LINK_SPEED_SUPPORT_GEN4)
+   pcie_gen = 3;
+   else if (adev->pm.pcie_gen_mask & CAIL_PCIE_LINK_SPEED_SUPPORT_GEN3)
+   pcie_gen = 2;
+   else if (adev->pm.pcie_gen_mask & CAIL_PCIE_LINK_SPEED_SUPPORT_GEN2)
+   pcie_gen = 1;
+   else if (adev->pm.pcie_gen_mask & CAIL_PCIE_LINK_SPEED_SUPPORT_GEN1)
+   pcie_gen = 0;
+
+   /* Bit 31:16: LCLK DPM level. 0 is DPM0, and 1 is DPM1
+* Bit 15:8:  PCIE GEN, 0 to 3 corresponds to GEN1 to GEN4
+* Bit 7:0:   PCIE lane width, 1 to 7 corresponds is x1 to x32
+*/
+   if (adev->pm.pcie_mlw_mask & CAIL_PCIE_LINK_WIDTH_SUPPORT_X16)
+   pcie_width = 6;
+   else if (adev->pm.pcie_mlw_mask & CAIL_PCIE_LINK_WIDTH_SUPPORT_X12)
+   pcie_width = 5;
+   else if (adev->pm.pcie_mlw_mask & CAIL_PCIE_LINK_WIDTH_SUPPORT_X8)
+   pcie_width = 4;
+   else if (adev->pm.pcie_mlw_mask & CAIL_PCIE_LINK_WIDTH_SUPPORT_X4)
+   pcie_width = 3;
+   else if (adev->pm.pcie_mlw_mask & CAIL_PCIE_LINK_WIDTH_SUPPORT_X2)
+   pcie_width = 2;
+   else if (adev->pm.pcie_mlw_mask & CAIL_PCIE_LINK_WIDTH_SUPPORT_X1)
+   pcie_width = 1;
+   ret = smu_update_pcie_parameters(smu, pcie_gen, pcie_width);
+   if (ret) {
+   dev_err(adev->dev, "Attempt to override pcie params failed!\n");
return ret;
+   }
 
ret = smu_enable_thermal_alert(smu);
if (ret) {
diff --git a/drivers/gpu/drm/amd/powerplay/arcturus_ppt.c 
b/drivers/gpu/drm/amd/powerplay/arcturus_ppt.c
index afd07c497205..3687e7620eb8 100644
--- a/drivers/gpu/drm/amd/powerplay/arcturus_ppt.c
+++ b/drivers/gpu/drm/amd/powerplay/arcturus_ppt.c
@@ -2422,7 +2422,6 @@ static const struct pptable_funcs arcturus_ppt_funcs = {
.baco_exit = smu_v11_0_baco_exit,
.get_dpm_ultimate_freq = smu_v11_0_get_dpm_ultimate_freq,
.set_soft_freq_limited_range = smu_v11_0_set_soft_freq_limited_range,
-   .override_pcie_parameters = NULL,
.set_df_cstate = arcturus_set_df_cstate,
.allow_xgmi_power_down = arcturus_allow_xgmi_power_down,
.log_thermal_throttling_event = arcturus_log_thermal_throttling_event,
diff --git a/drivers/gpu/drm/amd/powerplay/inc/amdgpu_smu.h 
b/drivers/gpu/drm/amd/powerplay/inc/amdgpu_smu.h
index 470b0377a860..ba8e162f44ab 100644
--- a/drivers/gpu/drm/amd/powerplay/inc/amdgpu_smu.h
+++ b/drivers/gpu/drm/amd/powerplay/inc/amdgpu_smu.h
@@ -566,7 +566,6 @@ struct pptable_funcs {
int (*mode2_reset)(struct smu_context *smu);
int (*get_dpm_ultimate_freq)(struct smu_context *smu, enum smu_clk_type 
clk_type, uint32_t *min, uint32_t *max);
int (*set_soft_freq_limited_range)(struct smu_context *smu, enum 
smu_clk_type clk_type, uint32_t min, uint32_t max);
-   int (*override_pcie_parameters)(struct smu_context *smu);
int (*disable_umc_cdr_12gbps_workaround)(struct smu_context *smu);
int (*set_power_source)(struct smu_context *smu, enum 
smu_power_src_type power_src);
void (*log_thermal_throttling_event)(struct smu_context *smu);
diff --git a/drivers/gpu/drm/amd/powerplay/inc/smu_v11_0.h 
b/drivers/gpu/drm/amd/powerplay/inc/smu_v11_0.h
index 14d6eef8cf17..311166f1975c 100644
--- a/drivers/gpu/drm/amd/powerplay/inc

[PATCH] drm/amd/powerplay: correct the .get_workload_type() pointer

2020-07-03 Thread Evan Quan
This seemed a typo.

Change-Id: I1e4da590829395617e90d0d43562f934a1ae0234
Signed-off-by: Evan Quan 
---
 drivers/gpu/drm/amd/powerplay/smu_internal.h | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/drivers/gpu/drm/amd/powerplay/smu_internal.h 
b/drivers/gpu/drm/amd/powerplay/smu_internal.h
index 8c5cf3860e38..afb3ef874fc5 100644
--- a/drivers/gpu/drm/amd/powerplay/smu_internal.h
+++ b/drivers/gpu/drm/amd/powerplay/smu_internal.h
@@ -73,7 +73,7 @@
 #define smu_feature_get_index(smu, fea)
smu_ppt_funcs(get_smu_feature_index, -EINVAL, smu, fea)
 #define smu_table_get_index(smu, tab)  
smu_ppt_funcs(get_smu_table_index, -EINVAL, smu, tab)
 #define smu_power_get_index(smu, src)  
smu_ppt_funcs(get_smu_power_index, -EINVAL, smu, src)
-#define smu_workload_get_type(smu, type)   
smu_ppt_funcs(get_smu_power_index, -EINVAL, smu, type)
+#define smu_workload_get_type(smu, type)   
smu_ppt_funcs(get_workload_type, -EINVAL, smu, type)
 #define smu_run_btc(smu)   
smu_ppt_funcs(run_btc, 0, smu)
 #define smu_get_allowed_feature_mask(smu, feature_mask, num)   
smu_ppt_funcs(get_allowed_feature_mask, 0, smu, feature_mask, num)
 #define smu_store_cc6_data(smu, st, cc6_dis, pst_dis, pst_sw_dis)  
smu_ppt_funcs(store_cc6_data, 0, smu, st, cc6_dis, pst_dis, pst_sw_dis)
-- 
2.27.0

___
amd-gfx mailing list
amd-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/amd-gfx


[PATCH 14/14] drm/amd/powerplay: drop unused APIs and parameters

2020-07-03 Thread Evan Quan
Leftover of previous performance level setting cleanups.

Change-Id: Idddc4adce365b34eacbc13f75cc0629859c6d412
Signed-off-by: Evan Quan 
---
 drivers/gpu/drm/amd/amdgpu/amdgpu_pm.c | 12 ++--
 drivers/gpu/drm/amd/powerplay/amdgpu_smu.c |  9 +++--
 drivers/gpu/drm/amd/powerplay/inc/amdgpu_smu.h | 12 +---
 drivers/gpu/drm/amd/powerplay/renoir_ppt.c |  2 --
 drivers/gpu/drm/amd/powerplay/smu_internal.h   |  5 -
 5 files changed, 10 insertions(+), 30 deletions(-)

diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_pm.c 
b/drivers/gpu/drm/amd/amdgpu/amdgpu_pm.c
index 26c8e39a78bd..c418613699ed 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_pm.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_pm.c
@@ -1105,7 +1105,7 @@ static ssize_t amdgpu_set_pp_dpm_sclk(struct device *dev,
}
 
if (is_support_sw_smu(adev))
-   ret = smu_force_clk_levels(&adev->smu, SMU_SCLK, mask, true);
+   ret = smu_force_clk_levels(&adev->smu, SMU_SCLK, mask);
else if (adev->powerplay.pp_funcs->force_clock_level)
ret = amdgpu_dpm_force_clock_level(adev, PP_SCLK, mask);
 
@@ -1173,7 +1173,7 @@ static ssize_t amdgpu_set_pp_dpm_mclk(struct device *dev,
}
 
if (is_support_sw_smu(adev))
-   ret = smu_force_clk_levels(&adev->smu, SMU_MCLK, mask, true);
+   ret = smu_force_clk_levels(&adev->smu, SMU_MCLK, mask);
else if (adev->powerplay.pp_funcs->force_clock_level)
ret = amdgpu_dpm_force_clock_level(adev, PP_MCLK, mask);
 
@@ -1241,7 +1241,7 @@ static ssize_t amdgpu_set_pp_dpm_socclk(struct device 
*dev,
}
 
if (is_support_sw_smu(adev))
-   ret = smu_force_clk_levels(&adev->smu, SMU_SOCCLK, mask, true);
+   ret = smu_force_clk_levels(&adev->smu, SMU_SOCCLK, mask);
else if (adev->powerplay.pp_funcs->force_clock_level)
ret = amdgpu_dpm_force_clock_level(adev, PP_SOCCLK, mask);
else
@@ -1311,7 +1311,7 @@ static ssize_t amdgpu_set_pp_dpm_fclk(struct device *dev,
}
 
if (is_support_sw_smu(adev))
-   ret = smu_force_clk_levels(&adev->smu, SMU_FCLK, mask, true);
+   ret = smu_force_clk_levels(&adev->smu, SMU_FCLK, mask);
else if (adev->powerplay.pp_funcs->force_clock_level)
ret = amdgpu_dpm_force_clock_level(adev, PP_FCLK, mask);
else
@@ -1381,7 +1381,7 @@ static ssize_t amdgpu_set_pp_dpm_dcefclk(struct device 
*dev,
}
 
if (is_support_sw_smu(adev))
-   ret = smu_force_clk_levels(&adev->smu, SMU_DCEFCLK, mask, true);
+   ret = smu_force_clk_levels(&adev->smu, SMU_DCEFCLK, mask);
else if (adev->powerplay.pp_funcs->force_clock_level)
ret = amdgpu_dpm_force_clock_level(adev, PP_DCEFCLK, mask);
else
@@ -1451,7 +1451,7 @@ static ssize_t amdgpu_set_pp_dpm_pcie(struct device *dev,
}
 
if (is_support_sw_smu(adev))
-   ret = smu_force_clk_levels(&adev->smu, SMU_PCIE, mask, true);
+   ret = smu_force_clk_levels(&adev->smu, SMU_PCIE, mask);
else if (adev->powerplay.pp_funcs->force_clock_level)
ret = amdgpu_dpm_force_clock_level(adev, PP_PCIE, mask);
else
diff --git a/drivers/gpu/drm/amd/powerplay/amdgpu_smu.c 
b/drivers/gpu/drm/amd/powerplay/amdgpu_smu.c
index 4080b3c792ac..38b3b47d12b7 100644
--- a/drivers/gpu/drm/amd/powerplay/amdgpu_smu.c
+++ b/drivers/gpu/drm/amd/powerplay/amdgpu_smu.c
@@ -1764,8 +1764,7 @@ int smu_set_display_count(struct smu_context *smu, 
uint32_t count)
 
 int smu_force_clk_levels(struct smu_context *smu,
 enum smu_clk_type clk_type,
-uint32_t mask,
-bool lock_needed)
+uint32_t mask)
 {
struct smu_dpm_context *smu_dpm_ctx = &(smu->smu_dpm);
int ret = 0;
@@ -1778,14 +1777,12 @@ int smu_force_clk_levels(struct smu_context *smu,
return -EINVAL;
}
 
-   if (lock_needed)
-   mutex_lock(&smu->mutex);
+   mutex_lock(&smu->mutex);
 
if (smu->ppt_funcs && smu->ppt_funcs->force_clk_levels)
ret = smu->ppt_funcs->force_clk_levels(smu, clk_type, mask);
 
-   if (lock_needed)
-   mutex_unlock(&smu->mutex);
+   mutex_unlock(&smu->mutex);
 
return ret;
 }
diff --git a/drivers/gpu/drm/amd/powerplay/inc/amdgpu_smu.h 
b/drivers/gpu/drm/amd/powerplay/inc/amdgpu_smu.h
index 91c8b69da026..470b0377a860 100644
--- a/drivers/gpu/drm/amd/powerplay/inc/amdgpu_smu.h
+++ b/drivers/gpu/drm/amd/powerplay/inc/amdgpu_smu.h
@@ -476,13 +476,6 @@ struct pptable_funcs {
int (*display_config_changed)(struct smu_context *smu);
int (*apply_clocks_adjust_rules)(struct smu_context *smu);
int (*notify_smc_display_config)(struct smu_context *smu);
-   int (*force_dpm_limit_value)(struct smu_context *smu, bool highest)

[PATCH 13/14] drm/amd/powerplay: drop smu_v12_0.c unnecessary wrapper

2020-07-03 Thread Evan Quan
By moving the implemention to renoir_ppt.c considering
it's really ASIC specific.

Change-Id: I6f7a594235dffdf75b56d1de5b9dc6d49833d7e8
Signed-off-by: Evan Quan 
---
 drivers/gpu/drm/amd/powerplay/inc/smu_v12_0.h |   3 -
 drivers/gpu/drm/amd/powerplay/renoir_ppt.c| 172 ++
 drivers/gpu/drm/amd/powerplay/smu_v12_0.c | 100 --
 3 files changed, 138 insertions(+), 137 deletions(-)

diff --git a/drivers/gpu/drm/amd/powerplay/inc/smu_v12_0.h 
b/drivers/gpu/drm/amd/powerplay/inc/smu_v12_0.h
index 0c1e1455c68f..fd83a723f32c 100644
--- a/drivers/gpu/drm/amd/powerplay/inc/smu_v12_0.h
+++ b/drivers/gpu/drm/amd/powerplay/inc/smu_v12_0.h
@@ -73,9 +73,6 @@ int smu_v12_0_set_default_dpm_tables(struct smu_context *smu);
 int smu_v12_0_get_enabled_mask(struct smu_context *smu,
  uint32_t *feature_mask, uint32_t num);
 
-int smu_v12_0_get_dpm_ultimate_freq(struct smu_context *smu, enum smu_clk_type 
clk_type,
-uint32_t *min, uint32_t *max);
-
 int smu_v12_0_mode2_reset(struct smu_context *smu);
 
 int smu_v12_0_set_soft_freq_limited_range(struct smu_context *smu, enum 
smu_clk_type clk_type,
diff --git a/drivers/gpu/drm/amd/powerplay/renoir_ppt.c 
b/drivers/gpu/drm/amd/powerplay/renoir_ppt.c
index 49a8d636ef4d..5b76d67d03d7 100644
--- a/drivers/gpu/drm/amd/powerplay/renoir_ppt.c
+++ b/drivers/gpu/drm/amd/powerplay/renoir_ppt.c
@@ -241,6 +241,137 @@ static int renoir_get_dpm_clk_limited(struct smu_context 
*smu, enum smu_clk_type
return 0;
 }
 
+static int renoir_get_profiling_clk_mask(struct smu_context *smu,
+enum amd_dpm_forced_level level,
+uint32_t *sclk_mask,
+uint32_t *mclk_mask,
+uint32_t *soc_mask)
+{
+
+   if (level == AMD_DPM_FORCED_LEVEL_PROFILE_MIN_SCLK) {
+   if (sclk_mask)
+   *sclk_mask = 0;
+   } else if (level == AMD_DPM_FORCED_LEVEL_PROFILE_MIN_MCLK) {
+   if (mclk_mask)
+   *mclk_mask = 0;
+   } else if (level == AMD_DPM_FORCED_LEVEL_PROFILE_PEAK) {
+   if(sclk_mask)
+   /* The sclk as gfxclk and has three level about 
max/min/current */
+   *sclk_mask = 3 - 1;
+
+   if(mclk_mask)
+   *mclk_mask = NUM_MEMCLK_DPM_LEVELS - 1;
+
+   if(soc_mask)
+   *soc_mask = NUM_SOCCLK_DPM_LEVELS - 1;
+   }
+
+   return 0;
+}
+
+static int renoir_get_dpm_ultimate_freq(struct smu_context *smu,
+   enum smu_clk_type clk_type,
+   uint32_t *min,
+   uint32_t *max)
+{
+   int ret = 0;
+   uint32_t mclk_mask, soc_mask;
+   uint32_t clock_limit;
+
+   if (!smu_clk_dpm_is_enabled(smu, clk_type)) {
+   switch (clk_type) {
+   case SMU_MCLK:
+   case SMU_UCLK:
+   clock_limit = smu->smu_table.boot_values.uclk;
+   break;
+   case SMU_GFXCLK:
+   case SMU_SCLK:
+   clock_limit = smu->smu_table.boot_values.gfxclk;
+   break;
+   case SMU_SOCCLK:
+   clock_limit = smu->smu_table.boot_values.socclk;
+   break;
+   default:
+   clock_limit = 0;
+   break;
+   }
+
+   /* clock in Mhz unit */
+   if (min)
+   *min = clock_limit / 100;
+   if (max)
+   *max = clock_limit / 100;
+
+   return 0;
+   }
+
+   if (max) {
+   ret = renoir_get_profiling_clk_mask(smu,
+   
AMD_DPM_FORCED_LEVEL_PROFILE_PEAK,
+   NULL,
+   &mclk_mask,
+   &soc_mask);
+   if (ret)
+   goto failed;
+
+   switch (clk_type) {
+   case SMU_GFXCLK:
+   case SMU_SCLK:
+   ret = smu_send_smc_msg(smu, 
SMU_MSG_GetMaxGfxclkFrequency, max);
+   if (ret) {
+   dev_err(smu->adev->dev, "Attempt to get max GX 
frequency from SMC Failed !\n");
+   goto failed;
+   }
+   break;
+   case SMU_UCLK:
+   case SMU_FCLK:
+   case SMU_MCLK:
+   ret = renoir_get_dpm_clk_limited(smu, clk_type, 
mclk_mask, max);
+   if (ret)
+   goto failed;
+  

[PATCH 11/14] drm/amd/powerplay: drop Sienna Cichlid specific set_soft_freq_limited_range

2020-07-03 Thread Evan Quan
Use the common smu_v11_0_set_soft_freq_limited_range.

Change-Id: I9f8772880b324ce9e741291751bb1b8ff4c36ea3
Signed-off-by: Evan Quan 
---
 .../drm/amd/powerplay/sienna_cichlid_ppt.c| 20 ++-
 drivers/gpu/drm/amd/powerplay/smu_internal.h  |  1 -
 drivers/gpu/drm/amd/powerplay/smu_v11_0.c | 20 +++
 3 files changed, 18 insertions(+), 23 deletions(-)

diff --git a/drivers/gpu/drm/amd/powerplay/sienna_cichlid_ppt.c 
b/drivers/gpu/drm/amd/powerplay/sienna_cichlid_ppt.c
index 27f77bde184f..141944df97b0 100644
--- a/drivers/gpu/drm/amd/powerplay/sienna_cichlid_ppt.c
+++ b/drivers/gpu/drm/amd/powerplay/sienna_cichlid_ppt.c
@@ -1046,22 +1046,6 @@ static int sienna_cichlid_print_clk_levels(struct 
smu_context *smu,
return size;
 }
 
-int sienna_cichlid_set_soft_freq_limited_range(struct smu_context *smu,
- enum smu_clk_type clk_type,
- uint32_t min, uint32_t max)
-{
-   struct amdgpu_device *adev = smu->adev;
-   int ret;
-
-   if (clk_type == SMU_GFXCLK)
-   amdgpu_gfx_off_ctrl(adev, false);
-   ret = smu_v11_0_set_soft_freq_limited_range(smu, clk_type, min, max);
-   if (clk_type == SMU_GFXCLK)
-   amdgpu_gfx_off_ctrl(adev, true);
-
-   return ret;
-}
-
 static int sienna_cichlid_force_clk_levels(struct smu_context *smu,
   enum smu_clk_type clk_type, uint32_t mask)
 {
@@ -1097,7 +1081,7 @@ static int sienna_cichlid_force_clk_levels(struct 
smu_context *smu,
if (ret)
goto forec_level_out;
 
-   ret = sienna_cichlid_set_soft_freq_limited_range(smu, clk_type, 
min_freq, max_freq);
+   ret = smu_v11_0_set_soft_freq_limited_range(smu, clk_type, 
min_freq, max_freq);
if (ret)
goto forec_level_out;
break;
@@ -2566,7 +2550,7 @@ static const struct pptable_funcs 
sienna_cichlid_ppt_funcs = {
.baco_enter = smu_v11_0_baco_enter,
.baco_exit = smu_v11_0_baco_exit,
.get_dpm_ultimate_freq = sienna_cichlid_get_dpm_ultimate_freq,
-   .set_soft_freq_limited_range = 
sienna_cichlid_set_soft_freq_limited_range,
+   .set_soft_freq_limited_range = smu_v11_0_set_soft_freq_limited_range,
.override_pcie_parameters = smu_v11_0_override_pcie_parameters,
.set_thermal_range = sienna_cichlid_set_thermal_range,
 };
diff --git a/drivers/gpu/drm/amd/powerplay/smu_internal.h 
b/drivers/gpu/drm/amd/powerplay/smu_internal.h
index 8fbfa0562007..1b357e349d1e 100644
--- a/drivers/gpu/drm/amd/powerplay/smu_internal.h
+++ b/drivers/gpu/drm/amd/powerplay/smu_internal.h
@@ -93,7 +93,6 @@
 #define smu_asic_set_performance_level(smu, level) 
smu_ppt_funcs(set_performance_level, -EINVAL, smu, level)
 #define smu_dump_pptable(smu)  
smu_ppt_funcs(dump_pptable, 0, smu)
 #define smu_get_dpm_clk_limited(smu, clk_type, dpm_level, freq)
smu_ppt_funcs(get_dpm_clk_limited, -EINVAL, smu, clk_type, dpm_level, freq)
-#define smu_set_soft_freq_limited_range(smu, clk_type, min, max)   
smu_ppt_funcs(set_soft_freq_limited_range, -EINVAL, smu, clk_type, min, max)
 #define smu_override_pcie_parameters(smu)  
smu_ppt_funcs(override_pcie_parameters, 0, smu)
 #define smu_update_pcie_parameters(smu, pcie_gen_cap, pcie_width_cap)  
smu_ppt_funcs(update_pcie_parameters, 0, smu, pcie_gen_cap, pcie_width_cap)
 #define smu_set_thermal_range(smu, range)  
smu_ppt_funcs(set_thermal_range, 0, smu, range)
diff --git a/drivers/gpu/drm/amd/powerplay/smu_v11_0.c 
b/drivers/gpu/drm/amd/powerplay/smu_v11_0.c
index c2564df304f7..1ed5ac946c05 100644
--- a/drivers/gpu/drm/amd/powerplay/smu_v11_0.c
+++ b/drivers/gpu/drm/amd/powerplay/smu_v11_0.c
@@ -1745,9 +1745,12 @@ int smu_v11_0_get_dpm_ultimate_freq(struct smu_context 
*smu, enum smu_clk_type c
return ret;
 }
 
-int smu_v11_0_set_soft_freq_limited_range(struct smu_context *smu, enum 
smu_clk_type clk_type,
-   uint32_t min, uint32_t max)
+int smu_v11_0_set_soft_freq_limited_range(struct smu_context *smu,
+ enum smu_clk_type clk_type,
+ uint32_t min,
+ uint32_t max)
 {
+   struct amdgpu_device *adev = smu->adev;
int ret = 0, clk_id = 0;
uint32_t param;
 
@@ -1755,12 +1758,16 @@ int smu_v11_0_set_soft_freq_limited_range(struct 
smu_context *smu, enum smu_clk_
if (clk_id < 0)
return clk_id;
 
+   if (clk_type == SMU_GFXCLK &&
+   adev->asic_type == CHIP_SIENNA_CICHLID)
+   amdgpu_gfx_off_ctrl(adev, false);
+
if (max > 0) {
param = (uint32_t)((clk_id << 16) | (max & 0x));
ret = smu_send_smc_msg

[PATCH 10/14] drm/amd/powerplay: drop unnecessary Sienna Cichlid specific APIs

2020-07-03 Thread Evan Quan
As a common performance level setting API is used. Then these
ASIC specific APIs are not needed any more.

Change-Id: I04c810859794b07ce8905a8df797ed6b5ae116a8
Signed-off-by: Evan Quan 
---
 .../drm/amd/powerplay/sienna_cichlid_ppt.c| 178 +-
 1 file changed, 1 insertion(+), 177 deletions(-)

diff --git a/drivers/gpu/drm/amd/powerplay/sienna_cichlid_ppt.c 
b/drivers/gpu/drm/amd/powerplay/sienna_cichlid_ppt.c
index 8fae7dd982c7..27f77bde184f 100644
--- a/drivers/gpu/drm/amd/powerplay/sienna_cichlid_ppt.c
+++ b/drivers/gpu/drm/amd/powerplay/sienna_cichlid_ppt.c
@@ -1181,59 +1181,6 @@ static int sienna_cichlid_display_config_changed(struct 
smu_context *smu)
return ret;
 }
 
-static int sienna_cichlid_force_dpm_limit_value(struct smu_context *smu, bool 
highest)
-{
-   int ret = 0, i = 0;
-   uint32_t min_freq, max_freq, force_freq;
-   enum smu_clk_type clk_type;
-
-   enum smu_clk_type clks[] = {
-   SMU_GFXCLK,
-   SMU_MCLK,
-   SMU_SOCCLK,
-   };
-
-   for (i = 0; i < ARRAY_SIZE(clks); i++) {
-   clk_type = clks[i];
-   ret = smu_v11_0_get_dpm_ultimate_freq(smu, clk_type, &min_freq, 
&max_freq);
-   if (ret)
-   return ret;
-
-   force_freq = highest ? max_freq : min_freq;
-   ret = sienna_cichlid_set_soft_freq_limited_range(smu, clk_type, 
force_freq, force_freq);
-   if (ret)
-   return ret;
-   }
-
-   return ret;
-}
-
-static int sienna_cichlid_unforce_dpm_levels(struct smu_context *smu)
-{
-   int ret = 0, i = 0;
-   uint32_t min_freq, max_freq;
-   enum smu_clk_type clk_type;
-
-   enum smu_clk_type clks[] = {
-   SMU_GFXCLK,
-   SMU_MCLK,
-   SMU_SOCCLK,
-   };
-
-   for (i = 0; i < ARRAY_SIZE(clks); i++) {
-   clk_type = clks[i];
-   ret = smu_v11_0_get_dpm_ultimate_freq(smu, clk_type, &min_freq, 
&max_freq);
-   if (ret)
-   return ret;
-
-   ret = sienna_cichlid_set_soft_freq_limited_range(smu, clk_type, 
min_freq, max_freq);
-   if (ret)
-   return ret;
-   }
-
-   return ret;
-}
-
 static int sienna_cichlid_get_gpu_power(struct smu_context *smu, uint32_t 
*value)
 {
if (!value)
@@ -1486,50 +1433,6 @@ static int sienna_cichlid_set_power_profile_mode(struct 
smu_context *smu, long *
return ret;
 }
 
-static int sienna_cichlid_get_profiling_clk_mask(struct smu_context *smu,
-enum amd_dpm_forced_level level,
-uint32_t *sclk_mask,
-uint32_t *mclk_mask,
-uint32_t *soc_mask)
-{
-   struct amdgpu_device *adev = smu->adev;
-   int ret = 0;
-   uint32_t level_count = 0;
-
-   if (level == AMD_DPM_FORCED_LEVEL_PROFILE_MIN_SCLK) {
-   if (sclk_mask)
-   *sclk_mask = 0;
-   } else if (level == AMD_DPM_FORCED_LEVEL_PROFILE_MIN_MCLK) {
-   if (mclk_mask)
-   *mclk_mask = 0;
-   } else if (level == AMD_DPM_FORCED_LEVEL_PROFILE_PEAK) {
-   if(sclk_mask) {
-   amdgpu_gfx_off_ctrl(adev, false);
-   ret = smu_v11_0_get_dpm_level_count(smu, SMU_SCLK, 
&level_count);
-   amdgpu_gfx_off_ctrl(adev, true);
-   if (ret)
-   return ret;
-   *sclk_mask = level_count - 1;
-   }
-
-   if(mclk_mask) {
-   ret = smu_v11_0_get_dpm_level_count(smu, SMU_MCLK, 
&level_count);
-   if (ret)
-   return ret;
-   *mclk_mask = level_count - 1;
-   }
-
-   if(soc_mask) {
-   ret = smu_v11_0_get_dpm_level_count(smu, SMU_SOCCLK, 
&level_count);
-   if (ret)
-   return ret;
-   *soc_mask = level_count - 1;
-   }
-   }
-
-   return ret;
-}
-
 static int sienna_cichlid_notify_smc_display_config(struct smu_context *smu)
 {
struct smu_clocks min_clocks = {0};
@@ -1761,82 +1664,6 @@ static int sienna_cichlid_get_uclk_dpm_states(struct 
smu_context *smu, uint32_t
return 0;
 }
 
-static int sienna_cichlid_set_performance_level(struct smu_context *smu,
-   enum amd_dpm_forced_level level);
-
-static int sienna_cichlid_set_standard_performance_level(struct smu_context 
*smu)
-{
-   struct amdgpu_device *adev = smu->adev;
-   int ret = 0;
-   uint32_t sclk_freq = 0, uclk_freq = 0;
-
-   switch (adev->asic_type) {
-   /* TODO: need to set specify clk value by asic type, not s

[PATCH 09/14] drm/amd/powerplay: drop unnecessary Navi1x specific APIs

2020-07-03 Thread Evan Quan
As a common performance level setting API is used. Then these
ASIC specific APIs are not needed any more.

Change-Id: I2c8831b9d00618c6578ee42b34e26892c5dba515
Signed-off-by: Evan Quan 
---
 drivers/gpu/drm/amd/powerplay/navi10_ppt.c | 248 +
 1 file changed, 1 insertion(+), 247 deletions(-)

diff --git a/drivers/gpu/drm/amd/powerplay/navi10_ppt.c 
b/drivers/gpu/drm/amd/powerplay/navi10_ppt.c
index d3e11d81c0ad..6d638a67bc4d 100644
--- a/drivers/gpu/drm/amd/powerplay/navi10_ppt.c
+++ b/drivers/gpu/drm/amd/powerplay/navi10_ppt.c
@@ -1376,59 +1376,6 @@ static int navi10_display_config_changed(struct 
smu_context *smu)
return ret;
 }
 
-static int navi10_force_dpm_limit_value(struct smu_context *smu, bool highest)
-{
-   int ret = 0, i = 0;
-   uint32_t min_freq, max_freq, force_freq;
-   enum smu_clk_type clk_type;
-
-   enum smu_clk_type clks[] = {
-   SMU_GFXCLK,
-   SMU_MCLK,
-   SMU_SOCCLK,
-   };
-
-   for (i = 0; i < ARRAY_SIZE(clks); i++) {
-   clk_type = clks[i];
-   ret = smu_v11_0_get_dpm_ultimate_freq(smu, clk_type, &min_freq, 
&max_freq);
-   if (ret)
-   return ret;
-
-   force_freq = highest ? max_freq : min_freq;
-   ret = smu_v11_0_set_soft_freq_limited_range(smu, clk_type, 
force_freq, force_freq);
-   if (ret)
-   return ret;
-   }
-
-   return ret;
-}
-
-static int navi10_unforce_dpm_levels(struct smu_context *smu)
-{
-   int ret = 0, i = 0;
-   uint32_t min_freq, max_freq;
-   enum smu_clk_type clk_type;
-
-   enum smu_clk_type clks[] = {
-   SMU_GFXCLK,
-   SMU_MCLK,
-   SMU_SOCCLK,
-   };
-
-   for (i = 0; i < ARRAY_SIZE(clks); i++) {
-   clk_type = clks[i];
-   ret = smu_v11_0_get_dpm_ultimate_freq(smu, clk_type, &min_freq, 
&max_freq);
-   if (ret)
-   return ret;
-
-   ret = smu_v11_0_set_soft_freq_limited_range(smu, clk_type, 
min_freq, max_freq);
-   if (ret)
-   return ret;
-   }
-
-   return ret;
-}
-
 static int navi10_get_gpu_power(struct smu_context *smu, uint32_t *value)
 {
if (!value)
@@ -1681,47 +1628,6 @@ static int navi10_set_power_profile_mode(struct 
smu_context *smu, long *input, u
return ret;
 }
 
-static int navi10_get_profiling_clk_mask(struct smu_context *smu,
-enum amd_dpm_forced_level level,
-uint32_t *sclk_mask,
-uint32_t *mclk_mask,
-uint32_t *soc_mask)
-{
-   int ret = 0;
-   uint32_t level_count = 0;
-
-   if (level == AMD_DPM_FORCED_LEVEL_PROFILE_MIN_SCLK) {
-   if (sclk_mask)
-   *sclk_mask = 0;
-   } else if (level == AMD_DPM_FORCED_LEVEL_PROFILE_MIN_MCLK) {
-   if (mclk_mask)
-   *mclk_mask = 0;
-   } else if (level == AMD_DPM_FORCED_LEVEL_PROFILE_PEAK) {
-   if(sclk_mask) {
-   ret = smu_v11_0_get_dpm_level_count(smu, SMU_SCLK, 
&level_count);
-   if (ret)
-   return ret;
-   *sclk_mask = level_count - 1;
-   }
-
-   if(mclk_mask) {
-   ret = smu_v11_0_get_dpm_level_count(smu, SMU_MCLK, 
&level_count);
-   if (ret)
-   return ret;
-   *mclk_mask = level_count - 1;
-   }
-
-   if(soc_mask) {
-   ret = smu_v11_0_get_dpm_level_count(smu, SMU_SOCCLK, 
&level_count);
-   if (ret)
-   return ret;
-   *soc_mask = level_count - 1;
-   }
-   }
-
-   return ret;
-}
-
 static int navi10_notify_smc_display_config(struct smu_context *smu)
 {
struct smu_clocks min_clocks = {0};
@@ -1954,155 +1860,6 @@ static int navi10_get_uclk_dpm_states(struct 
smu_context *smu, uint32_t *clocks_
return 0;
 }
 
-static int navi10_set_performance_level(struct smu_context *smu,
-   enum amd_dpm_forced_level level);
-
-static int navi10_set_standard_performance_level(struct smu_context *smu)
-{
-   struct amdgpu_device *adev = smu->adev;
-   int ret = 0;
-   uint32_t sclk_freq = 0, uclk_freq = 0;
-
-   switch (adev->asic_type) {
-   case CHIP_NAVI10:
-   sclk_freq = NAVI10_UMD_PSTATE_PROFILING_GFXCLK;
-   uclk_freq = NAVI10_UMD_PSTATE_PROFILING_MEMCLK;
-   break;
-   case CHIP_NAVI14:
-   sclk_freq = NAVI14_UMD_PSTATE_PROFILING_GFXCLK;
-   uclk_freq = NAVI14_UMD_PSTATE_PROFILING_MEMCLK;
-

[PATCH 04/14] drm/amd/powerplay: update Sienna Cichlid default dpm table setup

2020-07-03 Thread Evan Quan
Cache all clocks levels for every dpm table. They are needed
by other APIs.

Change-Id: Idaa853356720e48ab3279f420ba1ae18bb7de4fd
Signed-off-by: Evan Quan 
---
 .../drm/amd/powerplay/sienna_cichlid_ppt.c| 234 --
 1 file changed, 211 insertions(+), 23 deletions(-)

diff --git a/drivers/gpu/drm/amd/powerplay/sienna_cichlid_ppt.c 
b/drivers/gpu/drm/amd/powerplay/sienna_cichlid_ppt.c
index f2bbe56798d7..d750d06378e9 100644
--- a/drivers/gpu/drm/amd/powerplay/sienna_cichlid_ppt.c
+++ b/drivers/gpu/drm/amd/powerplay/sienna_cichlid_ppt.c
@@ -597,41 +597,229 @@ static int sienna_cichlid_allocate_dpm_context(struct 
smu_context *smu)
 
 static int sienna_cichlid_set_default_dpm_table(struct smu_context *smu)
 {
-   struct smu_dpm_context *smu_dpm = &smu->smu_dpm;
-   struct smu_table_context *table_context = &smu->smu_table;
-   struct smu_11_0_dpm_context *dpm_context = smu_dpm->dpm_context;
-   PPTable_t *driver_ppt = NULL;
+   struct smu_11_0_dpm_context *dpm_context = smu->smu_dpm.dpm_context;
+   PPTable_t *driver_ppt = smu->smu_table.driver_pptable;
+   struct smu_11_0_dpm_table *dpm_table;
+   int ret = 0;
int i;
 
-driver_ppt = table_context->driver_pptable;
+   /* socclk dpm table setup */
+   dpm_table = &dpm_context->dpm_tables.soc_table;
+   if (smu_feature_is_enabled(smu, SMU_FEATURE_DPM_SOCCLK_BIT)) {
+   ret = smu_v11_0_set_single_dpm_table(smu,
+SMU_SOCCLK,
+dpm_table);
+   if (ret)
+   return ret;
+   dpm_table->is_fine_grained =
+   !driver_ppt->DpmDescriptor[PPCLK_SOCCLK].SnapToDiscrete;
+   } else {
+   dpm_table->count = 1;
+   dpm_table->dpm_levels[0].value = 
smu->smu_table.boot_values.socclk / 100;
+   dpm_table->dpm_levels[0].enabled = true;
+   dpm_table->min = dpm_table->dpm_levels[0].value;
+   dpm_table->max = dpm_table->dpm_levels[0].value;
+   }
+
+   /* gfxclk dpm table setup */
+   dpm_table = &dpm_context->dpm_tables.gfx_table;
+   if (smu_feature_is_enabled(smu, SMU_FEATURE_DPM_GFXCLK_BIT)) {
+   ret = smu_v11_0_set_single_dpm_table(smu,
+SMU_GFXCLK,
+dpm_table);
+   if (ret)
+   return ret;
+   dpm_table->is_fine_grained =
+   !driver_ppt->DpmDescriptor[PPCLK_GFXCLK].SnapToDiscrete;
+   } else {
+   dpm_table->count = 1;
+   dpm_table->dpm_levels[0].value = 
smu->smu_table.boot_values.gfxclk / 100;
+   dpm_table->dpm_levels[0].enabled = true;
+   dpm_table->min = dpm_table->dpm_levels[0].value;
+   dpm_table->max = dpm_table->dpm_levels[0].value;
+   }
+
+   /* uclk dpm table setup */
+   dpm_table = &dpm_context->dpm_tables.uclk_table;
+   if (smu_feature_is_enabled(smu, SMU_FEATURE_DPM_UCLK_BIT)) {
+   ret = smu_v11_0_set_single_dpm_table(smu,
+SMU_UCLK,
+dpm_table);
+   if (ret)
+   return ret;
+   dpm_table->is_fine_grained =
+   !driver_ppt->DpmDescriptor[PPCLK_UCLK].SnapToDiscrete;
+   } else {
+   dpm_table->count = 1;
+   dpm_table->dpm_levels[0].value = 
smu->smu_table.boot_values.uclk / 100;
+   dpm_table->dpm_levels[0].enabled = true;
+   dpm_table->min = dpm_table->dpm_levels[0].value;
+   dpm_table->max = dpm_table->dpm_levels[0].value;
+   }
 
-dpm_context->dpm_tables.soc_table.min = driver_ppt->FreqTableSocclk[0];
-dpm_context->dpm_tables.soc_table.max = 
driver_ppt->FreqTableSocclk[NUM_SOCCLK_DPM_LEVELS - 1];
+   /* fclk dpm table setup */
+   dpm_table = &dpm_context->dpm_tables.fclk_table;
+   if (smu_feature_is_enabled(smu, SMU_FEATURE_DPM_FCLK_BIT)) {
+   ret = smu_v11_0_set_single_dpm_table(smu,
+SMU_FCLK,
+dpm_table);
+   if (ret)
+   return ret;
+   dpm_table->is_fine_grained =
+   !driver_ppt->DpmDescriptor[PPCLK_FCLK].SnapToDiscrete;
+   } else {
+   dpm_table->count = 1;
+   dpm_table->dpm_levels[0].value = 
smu->smu_table.boot_values.fclk / 100;
+   dpm_table->dpm_levels[0].enabled = true;
+   dpm_table->min = dpm_table->dpm_levels[0].value;
+   dpm_table->max = dpm_table->dpm_levels[0].value;
+   }
 
-dpm_context->dpm_tables.gfx_table.min = d

[PATCH 08/14] drm/amd/powerplay: drop unnecessary Arcturus specific APIs

2020-07-03 Thread Evan Quan
As a common performance level setting API is used. Then these
ASIC specific APIs are not needed any more.

Change-Id: Icd96ce42218d78d670dd0c1f88663fd42108b311
Signed-off-by: Evan Quan 
---
 drivers/gpu/drm/amd/powerplay/arcturus_ppt.c | 170 ---
 1 file changed, 170 deletions(-)

diff --git a/drivers/gpu/drm/amd/powerplay/arcturus_ppt.c 
b/drivers/gpu/drm/amd/powerplay/arcturus_ppt.c
index 33d472ffb2be..afd07c497205 100644
--- a/drivers/gpu/drm/amd/powerplay/arcturus_ppt.c
+++ b/drivers/gpu/drm/amd/powerplay/arcturus_ppt.c
@@ -1218,173 +1218,6 @@ static int arcturus_get_fan_speed_percent(struct 
smu_context *smu,
return ret;
 }
 
-static uint32_t arcturus_find_lowest_dpm_level(struct smu_11_0_dpm_table 
*table)
-{
-   uint32_t i;
-
-   for (i = 0; i < table->count; i++) {
-   if (table->dpm_levels[i].enabled)
-   break;
-   }
-   if (i >= table->count) {
-   i = 0;
-   table->dpm_levels[i].enabled = true;
-   }
-
-   return i;
-}
-
-static uint32_t arcturus_find_highest_dpm_level(struct smu_context *smu,
-   struct smu_11_0_dpm_table 
*table)
-{
-   int i = 0;
-
-   if (table->count <= 0) {
-   dev_err(smu->adev->dev, "[%s] DPM Table has no entry!", 
__func__);
-   return 0;
-   }
-   if (table->count > MAX_DPM_NUMBER) {
-   dev_err(smu->adev->dev, "[%s] DPM Table has too many entries!", 
__func__);
-   return MAX_DPM_NUMBER - 1;
-   }
-
-   for (i = table->count - 1; i >= 0; i--) {
-   if (table->dpm_levels[i].enabled)
-   break;
-   }
-   if (i < 0) {
-   i = 0;
-   table->dpm_levels[i].enabled = true;
-   }
-
-   return i;
-}
-
-static int arcturus_force_dpm_limit_value(struct smu_context *smu, bool 
highest)
-{
-   struct smu_11_0_dpm_context *dpm_context = smu->smu_dpm.dpm_context;
-   struct amdgpu_hive_info *hive = amdgpu_get_xgmi_hive(smu->adev, 0);
-   uint32_t soft_level;
-   int ret = 0;
-
-   /* gfxclk */
-   if (highest)
-   soft_level = arcturus_find_highest_dpm_level(smu, 
&(dpm_context->dpm_tables.gfx_table));
-   else
-   soft_level = 
arcturus_find_lowest_dpm_level(&(dpm_context->dpm_tables.gfx_table));
-
-   ret = arcturus_upload_dpm_level(smu,
-   false,
-   FEATURE_DPM_GFXCLK_MASK,
-   soft_level);
-   if (ret) {
-   dev_err(smu->adev->dev, "Failed to upload boot level to %s!\n",
-   highest ? "highest" : "lowest");
-   return ret;
-   }
-
-   ret = arcturus_upload_dpm_level(smu,
-   true,
-   FEATURE_DPM_GFXCLK_MASK,
-   soft_level);
-   if (ret) {
-   dev_err(smu->adev->dev, "Failed to upload dpm max level to 
%s!\n!",
-   highest ? "highest" : "lowest");
-   return ret;
-   }
-
-   if (hive)
-   /*
-* Force XGMI Pstate to highest or lowest
-* TODO: revise this when xgmi dpm is functional
-*/
-   ret = smu_v11_0_set_xgmi_pstate(smu, highest ? 1 : 0);
-
-   return ret;
-}
-
-static int arcturus_unforce_dpm_levels(struct smu_context *smu)
-{
-   struct smu_11_0_dpm_context *dpm_context =
-   (struct smu_11_0_dpm_context *)smu->smu_dpm.dpm_context;
-   struct amdgpu_hive_info *hive = amdgpu_get_xgmi_hive(smu->adev, 0);
-   uint32_t soft_min_level, soft_max_level;
-   int ret = 0;
-
-   /* gfxclk */
-   soft_min_level = 
arcturus_find_lowest_dpm_level(&(dpm_context->dpm_tables.gfx_table));
-   soft_max_level = arcturus_find_highest_dpm_level(smu, 
&(dpm_context->dpm_tables.gfx_table));
-
-   ret = arcturus_upload_dpm_level(smu,
-   false,
-   FEATURE_DPM_GFXCLK_MASK,
-   soft_min_level);
-   if (ret) {
-   dev_err(smu->adev->dev, "Failed to upload DPM Bootup Levels!");
-   return ret;
-   }
-
-   ret = arcturus_upload_dpm_level(smu,
-   true,
-   FEATURE_DPM_GFXCLK_MASK,
-   soft_max_level);
-   if (ret) {
-   dev_err(smu->adev->dev, "Failed to upload DPM Max Levels!");
-   return ret;
-   }
-
-   if (hive)
-   /*
-* Reset XGMI Pstate back to default
-* TODO: revise this when xgmi dpm is functional
-*/
-   ret = smu_v11_0_set_xgmi_pstate(

[PATCH 07/14] drm/amd/powerplay: update the common API for performance level setting

2020-07-03 Thread Evan Quan
So that it can be more widely shared around SMU v11 ASICs.

Change-Id: Ie110edf2ec519699448d3ff3215188ba243d2415
Signed-off-by: Evan Quan 
---
 drivers/gpu/drm/amd/powerplay/smu_v11_0.c | 91 +++
 1 file changed, 77 insertions(+), 14 deletions(-)

diff --git a/drivers/gpu/drm/amd/powerplay/smu_v11_0.c 
b/drivers/gpu/drm/amd/powerplay/smu_v11_0.c
index 8f6e0291d560..c2564df304f7 100644
--- a/drivers/gpu/drm/amd/powerplay/smu_v11_0.c
+++ b/drivers/gpu/drm/amd/powerplay/smu_v11_0.c
@@ -1855,38 +1855,101 @@ int smu_v11_0_override_pcie_parameters(struct 
smu_context *smu)
 int smu_v11_0_set_performance_level(struct smu_context *smu,
enum amd_dpm_forced_level level)
 {
+   struct smu_11_0_dpm_context *dpm_context =
+   smu->smu_dpm.dpm_context;
+   struct smu_11_0_dpm_table *gfx_table =
+   &dpm_context->dpm_tables.gfx_table;
+   struct smu_11_0_dpm_table *mem_table =
+   &dpm_context->dpm_tables.uclk_table;
+   struct smu_11_0_dpm_table *soc_table =
+   &dpm_context->dpm_tables.soc_table;
+   struct smu_umd_pstate_table *pstate_table =
+   &smu->pstate_table;
+   struct amdgpu_device *adev = smu->adev;
+   uint32_t sclk_min = 0, sclk_max = 0;
+   uint32_t mclk_min = 0, mclk_max = 0;
+   uint32_t socclk_min = 0, socclk_max = 0;
int ret = 0;
-   uint32_t sclk_mask, mclk_mask, soc_mask;
 
switch (level) {
case AMD_DPM_FORCED_LEVEL_HIGH:
-   ret = smu_force_dpm_limit_value(smu, true);
+   sclk_min = sclk_max = gfx_table->max;
+   mclk_min = mclk_max = mem_table->max;
+   socclk_min = socclk_max = soc_table->max;
break;
case AMD_DPM_FORCED_LEVEL_LOW:
-   ret = smu_force_dpm_limit_value(smu, false);
+   sclk_min = sclk_max = gfx_table->min;
+   mclk_min = mclk_max = mem_table->min;
+   socclk_min = socclk_max = soc_table->min;
break;
case AMD_DPM_FORCED_LEVEL_AUTO:
+   sclk_min = gfx_table->min;
+   sclk_max = gfx_table->max;
+   mclk_min = mem_table->min;
+   mclk_max = mem_table->max;
+   socclk_min = soc_table->min;
+   socclk_max = soc_table->max;
+   break;
case AMD_DPM_FORCED_LEVEL_PROFILE_STANDARD:
-   ret = smu_unforce_dpm_levels(smu);
+   sclk_min = sclk_max = pstate_table->gfxclk_pstate.standard;
+   mclk_min = mclk_max = pstate_table->uclk_pstate.standard;
+   socclk_min = socclk_max = pstate_table->socclk_pstate.standard;
break;
case AMD_DPM_FORCED_LEVEL_PROFILE_MIN_SCLK:
+   sclk_min = sclk_max = pstate_table->gfxclk_pstate.min;
+   break;
case AMD_DPM_FORCED_LEVEL_PROFILE_MIN_MCLK:
+   mclk_min = mclk_max = pstate_table->uclk_pstate.min;
+   break;
case AMD_DPM_FORCED_LEVEL_PROFILE_PEAK:
-   ret = smu_get_profiling_clk_mask(smu, level,
-&sclk_mask,
-&mclk_mask,
-&soc_mask);
-   if (ret)
-   return ret;
-   smu_force_clk_levels(smu, SMU_SCLK, 1 << sclk_mask, false);
-   smu_force_clk_levels(smu, SMU_MCLK, 1 << mclk_mask, false);
-   smu_force_clk_levels(smu, SMU_SOCCLK, 1 << soc_mask, false);
+   sclk_min = sclk_max = pstate_table->gfxclk_pstate.peak;
+   mclk_min = mclk_max = pstate_table->uclk_pstate.peak;
+   socclk_min = socclk_max = pstate_table->socclk_pstate.peak;
break;
case AMD_DPM_FORCED_LEVEL_MANUAL:
case AMD_DPM_FORCED_LEVEL_PROFILE_EXIT:
+   return 0;
default:
-   break;
+   dev_err(adev->dev, "Invalid performance level %d\n", level);
+   return -EINVAL;
+   }
+
+   /*
+* Separate MCLK and SOCCLK soft min/max settings are not allowed
+* on Arcturus.
+*/
+   if (adev->asic_type == CHIP_ARCTURUS) {
+   mclk_min = mclk_max = 0;
+   socclk_min = socclk_max = 0;
}
+
+   if (sclk_min && sclk_max) {
+   ret = smu_v11_0_set_soft_freq_limited_range(smu,
+   SMU_GFXCLK,
+   sclk_min,
+   sclk_max);
+   if (ret)
+   return ret;
+   }
+
+   if (mclk_min && mclk_max) {
+   ret = smu_v11_0_set_soft_freq_limited_range(smu,
+

[PATCH 12/14] drm/amd/powerplay: drop unnecessary wrappers

2020-07-03 Thread Evan Quan
By calling the target APIs directly.

Change-Id: I0f24f603d2fcb94d2078a35c405a1406093ba5e3
Signed-off-by: Evan Quan 
---
 drivers/gpu/drm/amd/powerplay/renoir_ppt.c | 22 ++
 1 file changed, 10 insertions(+), 12 deletions(-)

diff --git a/drivers/gpu/drm/amd/powerplay/renoir_ppt.c 
b/drivers/gpu/drm/amd/powerplay/renoir_ppt.c
index d4aa01a05c54..49a8d636ef4d 100644
--- a/drivers/gpu/drm/amd/powerplay/renoir_ppt.c
+++ b/drivers/gpu/drm/amd/powerplay/renoir_ppt.c
@@ -743,26 +743,26 @@ static int renoir_set_performance_level(struct 
smu_context *smu,
 
switch (level) {
case AMD_DPM_FORCED_LEVEL_HIGH:
-   ret = smu_force_dpm_limit_value(smu, true);
+   ret = renoir_force_dpm_limit_value(smu, true);
break;
case AMD_DPM_FORCED_LEVEL_LOW:
-   ret = smu_force_dpm_limit_value(smu, false);
+   ret = renoir_force_dpm_limit_value(smu, false);
break;
case AMD_DPM_FORCED_LEVEL_AUTO:
case AMD_DPM_FORCED_LEVEL_PROFILE_STANDARD:
-   ret = smu_unforce_dpm_levels(smu);
+   ret = renoir_unforce_dpm_levels(smu);
break;
case AMD_DPM_FORCED_LEVEL_PROFILE_MIN_SCLK:
case AMD_DPM_FORCED_LEVEL_PROFILE_MIN_MCLK:
-   ret = smu_get_profiling_clk_mask(smu, level,
-&sclk_mask,
-&mclk_mask,
-&soc_mask);
+   ret = renoir_get_profiling_clk_mask(smu, level,
+   &sclk_mask,
+   &mclk_mask,
+   &soc_mask);
if (ret)
return ret;
-   smu_force_clk_levels(smu, SMU_SCLK, 1 << sclk_mask, false);
-   smu_force_clk_levels(smu, SMU_MCLK, 1 << mclk_mask, false);
-   smu_force_clk_levels(smu, SMU_SOCCLK, 1 << soc_mask, false);
+   renoir_force_clk_levels(smu, SMU_SCLK, 1 << sclk_mask);
+   renoir_force_clk_levels(smu, SMU_MCLK, 1 << mclk_mask);
+   renoir_force_clk_levels(smu, SMU_SOCCLK, 1 << soc_mask);
break;
case AMD_DPM_FORCED_LEVEL_PROFILE_PEAK:
ret = renoir_set_peak_clock_by_device(smu);
@@ -942,8 +942,6 @@ static const struct pptable_funcs renoir_ppt_funcs = {
.get_current_power_state = renoir_get_current_power_state,
.dpm_set_vcn_enable = renoir_dpm_set_vcn_enable,
.dpm_set_jpeg_enable = renoir_dpm_set_jpeg_enable,
-   .force_dpm_limit_value = renoir_force_dpm_limit_value,
-   .unforce_dpm_levels = renoir_unforce_dpm_levels,
.get_workload_type = renoir_get_workload_type,
.get_profiling_clk_mask = renoir_get_profiling_clk_mask,
.force_clk_levels = renoir_force_clk_levels,
-- 
2.27.0

___
amd-gfx mailing list
amd-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/amd-gfx


[PATCH 01/14] drm/amd/powerplay: add more members for dpm table

2020-07-03 Thread Evan Quan
These members can help to cache the clock frequencies for all
dpm levels. Then simplifying the code for dpm level switching
is possible.

Change-Id: Ic80359adb8c0e018f306782f24e3f8906436f5e2
Signed-off-by: Evan Quan 
---
 drivers/gpu/drm/amd/powerplay/inc/smu_v11_0.h | 15 +--
 1 file changed, 13 insertions(+), 2 deletions(-)

diff --git a/drivers/gpu/drm/amd/powerplay/inc/smu_v11_0.h 
b/drivers/gpu/drm/amd/powerplay/inc/smu_v11_0.h
index 3d746b75396e..289c571d6e4e 100644
--- a/drivers/gpu/drm/amd/powerplay/inc/smu_v11_0.h
+++ b/drivers/gpu/drm/amd/powerplay/inc/smu_v11_0.h
@@ -48,6 +48,7 @@
 
 #define SMU11_TOOL_SIZE0x19000
 
+#define MAX_DPM_LEVELS 16
 #define MAX_PCIE_CONF 2
 
 #define CLK_MAP(clk, index) \
@@ -91,9 +92,17 @@ struct smu_11_0_max_sustainable_clocks {
uint32_t soc_clock;
 };
 
+struct smu_11_0_dpm_clk_level {
+   boolenabled;
+   uint32_tvalue;
+};
+
 struct smu_11_0_dpm_table {
-   uint32_tmin;/* MHz */
-   uint32_tmax;/* MHz */
+   uint32_tmin;/* MHz */
+   uint32_tmax;/* MHz */
+   uint32_tcount;
+   boolis_fine_grained;
+   struct smu_11_0_dpm_clk_level   dpm_levels[MAX_DPM_LEVELS];
 };
 
 struct smu_11_0_pcie_table {
@@ -107,7 +116,9 @@ struct smu_11_0_dpm_tables {
struct smu_11_0_dpm_tableuclk_table;
struct smu_11_0_dpm_tableeclk_table;
struct smu_11_0_dpm_tablevclk_table;
+   struct smu_11_0_dpm_tablevclk1_table;
struct smu_11_0_dpm_tabledclk_table;
+   struct smu_11_0_dpm_tabledclk1_table;
struct smu_11_0_dpm_tabledcef_table;
struct smu_11_0_dpm_tablepixel_table;
struct smu_11_0_dpm_tabledisplay_table;
-- 
2.27.0

___
amd-gfx mailing list
amd-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/amd-gfx


[PATCH 03/14] drm/amd/powerplay: update Navi10 default dpm table setup

2020-07-03 Thread Evan Quan
Cache all clocks levels for every dpm table. They are needed
by other APIs.

Change-Id: I8114cf31e6ec8c9af4578d51749eb213befdcc71
Signed-off-by: Evan Quan 
---
 drivers/gpu/drm/amd/powerplay/navi10_ppt.c | 182 ++---
 1 file changed, 158 insertions(+), 24 deletions(-)

diff --git a/drivers/gpu/drm/amd/powerplay/navi10_ppt.c 
b/drivers/gpu/drm/amd/powerplay/navi10_ppt.c
index d96e8334b5e2..a022e93a487c 100644
--- a/drivers/gpu/drm/amd/powerplay/navi10_ppt.c
+++ b/drivers/gpu/drm/amd/powerplay/navi10_ppt.c
@@ -689,41 +689,175 @@ static int navi10_allocate_dpm_context(struct 
smu_context *smu)
 
 static int navi10_set_default_dpm_table(struct smu_context *smu)
 {
-   struct smu_dpm_context *smu_dpm = &smu->smu_dpm;
-   struct smu_table_context *table_context = &smu->smu_table;
-   struct smu_11_0_dpm_context *dpm_context = smu_dpm->dpm_context;
-   PPTable_t *driver_ppt = NULL;
+   struct smu_11_0_dpm_context *dpm_context = smu->smu_dpm.dpm_context;
+   PPTable_t *driver_ppt = smu->smu_table.driver_pptable;
+   struct smu_11_0_dpm_table *dpm_table;
+   int ret = 0;
int i;
 
-   driver_ppt = table_context->driver_pptable;
-
-   dpm_context->dpm_tables.soc_table.min = driver_ppt->FreqTableSocclk[0];
-   dpm_context->dpm_tables.soc_table.max = 
driver_ppt->FreqTableSocclk[NUM_SOCCLK_DPM_LEVELS - 1];
+   /* socclk dpm table setup */
+   dpm_table = &dpm_context->dpm_tables.soc_table;
+   if (smu_feature_is_enabled(smu, SMU_FEATURE_DPM_SOCCLK_BIT)) {
+   ret = smu_v11_0_set_single_dpm_table(smu,
+SMU_SOCCLK,
+dpm_table);
+   if (ret)
+   return ret;
+   dpm_table->is_fine_grained =
+   !driver_ppt->DpmDescriptor[PPCLK_SOCCLK].SnapToDiscrete;
+   } else {
+   dpm_table->count = 1;
+   dpm_table->dpm_levels[0].value = 
smu->smu_table.boot_values.socclk / 100;
+   dpm_table->dpm_levels[0].enabled = true;
+   dpm_table->min = dpm_table->dpm_levels[0].value;
+   dpm_table->max = dpm_table->dpm_levels[0].value;
+   }
 
-   dpm_context->dpm_tables.gfx_table.min = driver_ppt->FreqTableGfx[0];
-   dpm_context->dpm_tables.gfx_table.max = 
driver_ppt->FreqTableGfx[NUM_GFXCLK_DPM_LEVELS - 1];
+   /* gfxclk dpm table setup */
+   dpm_table = &dpm_context->dpm_tables.gfx_table;
+   if (smu_feature_is_enabled(smu, SMU_FEATURE_DPM_GFXCLK_BIT)) {
+   ret = smu_v11_0_set_single_dpm_table(smu,
+SMU_GFXCLK,
+dpm_table);
+   if (ret)
+   return ret;
+   dpm_table->is_fine_grained =
+   !driver_ppt->DpmDescriptor[PPCLK_GFXCLK].SnapToDiscrete;
+   } else {
+   dpm_table->count = 1;
+   dpm_table->dpm_levels[0].value = 
smu->smu_table.boot_values.gfxclk / 100;
+   dpm_table->dpm_levels[0].enabled = true;
+   dpm_table->min = dpm_table->dpm_levels[0].value;
+   dpm_table->max = dpm_table->dpm_levels[0].value;
+   }
 
-   dpm_context->dpm_tables.uclk_table.min = driver_ppt->FreqTableUclk[0];
-   dpm_context->dpm_tables.uclk_table.max = 
driver_ppt->FreqTableUclk[NUM_UCLK_DPM_LEVELS - 1];
+   /* uclk dpm table setup */
+   dpm_table = &dpm_context->dpm_tables.uclk_table;
+   if (smu_feature_is_enabled(smu, SMU_FEATURE_DPM_UCLK_BIT)) {
+   ret = smu_v11_0_set_single_dpm_table(smu,
+SMU_UCLK,
+dpm_table);
+   if (ret)
+   return ret;
+   dpm_table->is_fine_grained =
+   !driver_ppt->DpmDescriptor[PPCLK_UCLK].SnapToDiscrete;
+   } else {
+   dpm_table->count = 1;
+   dpm_table->dpm_levels[0].value = 
smu->smu_table.boot_values.uclk / 100;
+   dpm_table->dpm_levels[0].enabled = true;
+   dpm_table->min = dpm_table->dpm_levels[0].value;
+   dpm_table->max = dpm_table->dpm_levels[0].value;
+   }
 
-   dpm_context->dpm_tables.vclk_table.min = driver_ppt->FreqTableVclk[0];
-   dpm_context->dpm_tables.vclk_table.max = 
driver_ppt->FreqTableVclk[NUM_VCLK_DPM_LEVELS - 1];
+   /* vclk dpm table setup */
+   dpm_table = &dpm_context->dpm_tables.vclk_table;
+   if (smu_feature_is_enabled(smu, SMU_FEATURE_VCN_PG_BIT)) {
+   ret = smu_v11_0_set_single_dpm_table(smu,
+SMU_VCLK,
+dpm_table);
+   if (ret)
+   return ret;
+   dpm_table->

[PATCH 05/14] drm/amd/powerplay: add new UMD pstate data structure

2020-07-03 Thread Evan Quan
This is used to cache the clock frequencies for all UMD pstates.
So that we do not need to calculate from scratch on every UMD
pstate switch.

Change-Id: I3f2ef5ee2e6e433518f726988bbe5970848b99c8
Signed-off-by: Evan Quan 
---
 drivers/gpu/drm/amd/powerplay/inc/amdgpu_smu.h | 15 +++
 1 file changed, 15 insertions(+)

diff --git a/drivers/gpu/drm/amd/powerplay/inc/amdgpu_smu.h 
b/drivers/gpu/drm/amd/powerplay/inc/amdgpu_smu.h
index 66912884f093..91c8b69da026 100644
--- a/drivers/gpu/drm/amd/powerplay/inc/amdgpu_smu.h
+++ b/drivers/gpu/drm/amd/powerplay/inc/amdgpu_smu.h
@@ -352,6 +352,20 @@ struct smu_baco_context
bool platform_support;
 };
 
+struct pstates_clk_freq {
+   uint32_tmin;
+   uint32_tstandard;
+   uint32_tpeak;
+};
+
+struct smu_umd_pstate_table {
+   struct pstates_clk_freq gfxclk_pstate;
+   struct pstates_clk_freq socclk_pstate;
+   struct pstates_clk_freq uclk_pstate;
+   struct pstates_clk_freq vclk_pstate;
+   struct pstates_clk_freq dclk_pstate;
+};
+
 #define WORKLOAD_POLICY_MAX 7
 struct smu_context
 {
@@ -376,6 +390,7 @@ struct smu_context
struct dentry   *debugfs_sclk;
 #endif
 
+   struct smu_umd_pstate_table pstate_table;
uint32_t pstate_sclk;
uint32_t pstate_mclk;
 
-- 
2.27.0

___
amd-gfx mailing list
amd-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/amd-gfx


[PATCH 02/14] drm/amd/powerplay: update Arcturus default dpm table setting

2020-07-03 Thread Evan Quan
Preparing for coming code sharing around performance level
setting.

Change-Id: Ie32b6af39f22d05c08096959bab0e02e53856170
Signed-off-by: Evan Quan 
---
 drivers/gpu/drm/amd/powerplay/arcturus_ppt.c  | 297 +++---
 drivers/gpu/drm/amd/powerplay/inc/smu_v11_0.h |   4 +
 drivers/gpu/drm/amd/powerplay/smu_v11_0.c |  38 +++
 3 files changed, 161 insertions(+), 178 deletions(-)

diff --git a/drivers/gpu/drm/amd/powerplay/arcturus_ppt.c 
b/drivers/gpu/drm/amd/powerplay/arcturus_ppt.c
index 5b793e354704..a3747ab4af32 100644
--- a/drivers/gpu/drm/amd/powerplay/arcturus_ppt.c
+++ b/drivers/gpu/drm/amd/powerplay/arcturus_ppt.c
@@ -291,7 +291,6 @@ static int arcturus_get_pwr_src_index(struct smu_context 
*smc, uint32_t index)
return mapping.map_to;
 }
 
-
 static int arcturus_get_workload_type(struct smu_context *smu, enum 
PP_SMC_POWER_PROFILE profile)
 {
struct smu_11_0_cmn2aisc_mapping mapping;
@@ -338,23 +337,11 @@ static int arcturus_allocate_dpm_context(struct 
smu_context *smu)
 {
struct smu_dpm_context *smu_dpm = &smu->smu_dpm;
 
-   if (smu_dpm->dpm_context)
-   return -EINVAL;
-
-   smu_dpm->dpm_context = kzalloc(sizeof(struct arcturus_dpm_table),
+   smu_dpm->dpm_context = kzalloc(sizeof(struct smu_11_0_dpm_context),
   GFP_KERNEL);
if (!smu_dpm->dpm_context)
return -ENOMEM;
-
-   if (smu_dpm->golden_dpm_context)
-   return -EINVAL;
-
-   smu_dpm->golden_dpm_context = kzalloc(sizeof(struct arcturus_dpm_table),
- GFP_KERNEL);
-   if (!smu_dpm->golden_dpm_context)
-   return -ENOMEM;
-
-   smu_dpm->dpm_context_size = sizeof(struct arcturus_dpm_table);
+   smu_dpm->dpm_context_size = sizeof(struct smu_11_0_dpm_context);
 
smu_dpm->dpm_current_power_state = kzalloc(sizeof(struct 
smu_power_state),
   GFP_KERNEL);
@@ -382,119 +369,84 @@ arcturus_get_allowed_feature_mask(struct smu_context 
*smu,
return 0;
 }
 
-static int
-arcturus_set_single_dpm_table(struct smu_context *smu,
-   struct arcturus_single_dpm_table *single_dpm_table,
-   PPCLK_e clk_id)
-{
-   int ret = 0;
-   uint32_t i, num_of_levels = 0, clk;
-
-   ret = smu_send_smc_msg_with_param(smu,
-   SMU_MSG_GetDpmFreqByIndex,
-   (clk_id << 16 | 0xFF),
-   &num_of_levels);
-   if (ret) {
-   dev_err(smu->adev->dev, "[%s] failed to get dpm levels!\n", 
__func__);
-   return ret;
-   }
-
-   single_dpm_table->count = num_of_levels;
-   for (i = 0; i < num_of_levels; i++) {
-   ret = smu_send_smc_msg_with_param(smu,
-   SMU_MSG_GetDpmFreqByIndex,
-   (clk_id << 16 | i),
-   &clk);
-   if (ret) {
-   dev_err(smu->adev->dev, "[%s] failed to get dpm freq by 
index!\n", __func__);
-   return ret;
-   }
-   single_dpm_table->dpm_levels[i].value = clk;
-   single_dpm_table->dpm_levels[i].enabled = true;
-   }
-   return 0;
-}
-
-static void arcturus_init_single_dpm_state(struct arcturus_dpm_state 
*dpm_state)
-{
-   dpm_state->soft_min_level = 0x0;
-   dpm_state->soft_max_level = 0x;
-dpm_state->hard_min_level = 0x0;
-dpm_state->hard_max_level = 0x;
-}
-
 static int arcturus_set_default_dpm_table(struct smu_context *smu)
 {
-   int ret;
-
-   struct smu_dpm_context *smu_dpm = &smu->smu_dpm;
-   struct arcturus_dpm_table *dpm_table = NULL;
-   struct arcturus_single_dpm_table *single_dpm_table;
-
-   dpm_table = smu_dpm->dpm_context;
+   struct smu_11_0_dpm_context *dpm_context = smu->smu_dpm.dpm_context;
+   PPTable_t *driver_ppt = smu->smu_table.driver_pptable;
+   struct smu_11_0_dpm_table *dpm_table = NULL;
+   int ret = 0;
 
-   /* socclk */
-   single_dpm_table = &(dpm_table->soc_table);
+   /* socclk dpm table setup */
+   dpm_table = &dpm_context->dpm_tables.soc_table;
if (smu_feature_is_enabled(smu, SMU_FEATURE_DPM_SOCCLK_BIT)) {
-   ret = arcturus_set_single_dpm_table(smu, single_dpm_table,
- PPCLK_SOCCLK);
-   if (ret) {
-   dev_err(smu->adev->dev, "[%s] failed to get socclk dpm 
levels!\n", __func__);
+   ret = smu_v11_0_set_single_dpm_table(smu,
+SMU_SOCCLK,
+dpm_table);
+   if (ret)
return ret;
-   }
+   dpm_table->is_fine_grained =
+   !driver_ppt->DpmDescriptor[PPCLK_SOCC

[PATCH 06/14] drm/amd/powerplay: update UMD pstate clock settings

2020-07-03 Thread Evan Quan
Preparing for coming code sharing around performance level
setting.

Change-Id: I51b1536b62995f0fecd51b91f238793f57485aa9
Signed-off-by: Evan Quan 
---
 drivers/gpu/drm/amd/powerplay/amdgpu_smu.c|  6 +-
 drivers/gpu/drm/amd/powerplay/arcturus_ppt.c  | 47 ++---
 drivers/gpu/drm/amd/powerplay/navi10_ppt.c| 99 ---
 .../drm/amd/powerplay/sienna_cichlid_ppt.c| 35 ---
 4 files changed, 141 insertions(+), 46 deletions(-)

diff --git a/drivers/gpu/drm/amd/powerplay/amdgpu_smu.c 
b/drivers/gpu/drm/amd/powerplay/amdgpu_smu.c
index 6839faaab611..4080b3c792ac 100644
--- a/drivers/gpu/drm/amd/powerplay/amdgpu_smu.c
+++ b/drivers/gpu/drm/amd/powerplay/amdgpu_smu.c
@@ -2168,6 +2168,8 @@ int smu_read_sensor(struct smu_context *smu,
enum amd_pp_sensors sensor,
void *data, uint32_t *size)
 {
+   struct smu_umd_pstate_table *pstate_table =
+   &smu->pstate_table;
int ret = 0;
 
if (!smu->pm_enabled || !smu->adev->pm.dpm_enabled)
@@ -2180,11 +2182,11 @@ int smu_read_sensor(struct smu_context *smu,
 
switch (sensor) {
case AMDGPU_PP_SENSOR_STABLE_PSTATE_SCLK:
-   *((uint32_t *)data) = smu->pstate_sclk;
+   *((uint32_t *)data) = pstate_table->gfxclk_pstate.standard * 
100;
*size = 4;
break;
case AMDGPU_PP_SENSOR_STABLE_PSTATE_MCLK:
-   *((uint32_t *)data) = smu->pstate_mclk;
+   *((uint32_t *)data) = pstate_table->uclk_pstate.standard * 100;
*size = 4;
break;
case AMDGPU_PP_SENSOR_ENABLED_SMC_FEATURES_MASK:
diff --git a/drivers/gpu/drm/amd/powerplay/arcturus_ppt.c 
b/drivers/gpu/drm/amd/powerplay/arcturus_ppt.c
index a3747ab4af32..33d472ffb2be 100644
--- a/drivers/gpu/drm/amd/powerplay/arcturus_ppt.c
+++ b/drivers/gpu/drm/amd/powerplay/arcturus_ppt.c
@@ -548,27 +548,44 @@ static int arcturus_run_btc(struct smu_context *smu)
 
 static int arcturus_populate_umd_state_clk(struct smu_context *smu)
 {
-   struct smu_dpm_context *smu_dpm = &smu->smu_dpm;
-   struct arcturus_dpm_table *dpm_table = NULL;
-   struct arcturus_single_dpm_table *gfx_table = NULL;
-   struct arcturus_single_dpm_table *mem_table = NULL;
+   struct smu_11_0_dpm_context *dpm_context =
+   smu->smu_dpm.dpm_context;
+   struct smu_11_0_dpm_table *gfx_table =
+   &dpm_context->dpm_tables.gfx_table;
+   struct smu_11_0_dpm_table *mem_table =
+   &dpm_context->dpm_tables.uclk_table;
+   struct smu_11_0_dpm_table *soc_table =
+   &dpm_context->dpm_tables.soc_table;
+   struct smu_umd_pstate_table *pstate_table =
+   &smu->pstate_table;
+
+   pstate_table->gfxclk_pstate.min = gfx_table->min;
+   pstate_table->gfxclk_pstate.peak = gfx_table->max;
 
-   dpm_table = smu_dpm->dpm_context;
-   gfx_table = &(dpm_table->gfx_table);
-   mem_table = &(dpm_table->mem_table);
+   pstate_table->uclk_pstate.min = mem_table->min;
+   pstate_table->uclk_pstate.peak = mem_table->max;
 
-   smu->pstate_sclk = gfx_table->dpm_levels[0].value;
-   smu->pstate_mclk = mem_table->dpm_levels[0].value;
+   pstate_table->socclk_pstate.min = soc_table->min;
+   pstate_table->socclk_pstate.peak = soc_table->max;
 
if (gfx_table->count > ARCTURUS_UMD_PSTATE_GFXCLK_LEVEL &&
-   mem_table->count > ARCTURUS_UMD_PSTATE_MCLK_LEVEL) {
-   smu->pstate_sclk = 
gfx_table->dpm_levels[ARCTURUS_UMD_PSTATE_GFXCLK_LEVEL].value;
-   smu->pstate_mclk = 
mem_table->dpm_levels[ARCTURUS_UMD_PSTATE_MCLK_LEVEL].value;
+   mem_table->count > ARCTURUS_UMD_PSTATE_MCLK_LEVEL &&
+   soc_table->count > ARCTURUS_UMD_PSTATE_SOCCLK_LEVEL) {
+   pstate_table->gfxclk_pstate.standard =
+   
gfx_table->dpm_levels[ARCTURUS_UMD_PSTATE_GFXCLK_LEVEL].value;
+   pstate_table->uclk_pstate.standard =
+   
mem_table->dpm_levels[ARCTURUS_UMD_PSTATE_MCLK_LEVEL].value;
+   pstate_table->socclk_pstate.standard =
+   
soc_table->dpm_levels[ARCTURUS_UMD_PSTATE_SOCCLK_LEVEL].value;
+   } else {
+   pstate_table->gfxclk_pstate.standard =
+   pstate_table->gfxclk_pstate.min;
+   pstate_table->uclk_pstate.standard =
+   pstate_table->uclk_pstate.min;
+   pstate_table->socclk_pstate.standard =
+   pstate_table->socclk_pstate.min;
}
 
-   smu->pstate_sclk = smu->pstate_sclk * 100;
-   smu->pstate_mclk = smu->pstate_mclk * 100;
-
return 0;
 }
 
diff --git a/drivers/gpu/drm/amd/powerplay/navi10_ppt.c 
b/drivers/gpu/drm/amd/powerplay/navi10_ppt.c
index a022e93a487c..d3e11d81c0ad 100644
--- a/drivers/gp

Re: [PATCH v5 01/12] iommu: Change type of pasid to u32

2020-07-03 Thread Fenghua Yu
Hi, Felix, Thomas, Joerg and maintainers,

On Tue, Jun 30, 2020 at 10:12:38PM -0400, Felix Kuehling wrote:
> Am 2020-06-30 um 7:44 p.m. schrieb Fenghua Yu:
> You didn't change the return types of amdgpu_pasid_alloc and
> kfd_pasid_alloc. amdgpu_pasid_alloc returns int, because it can return
> negative error codes. But kfd_pasid_alloc could be updated, because it
> returns 0 for errors.

I fixed return type as "u32" for kfd_pasid_alloc().

The fix is minor and only limited in patch 1. So instead of sending the
whole series, I only send the updated patch 1 here. If you want me to
send the whole series with the fix, I can do that too.

Thanks.

-Fenghua

>From 4ff6c14bb0761dd97d803350d31f87edc4336345 Mon Sep 17 00:00:00 2001
From: Fenghua Yu 
Date: Mon, 4 May 2020 18:00:55 +
Subject: [PATCH v5.1 01/12] iommu: Change type of pasid to u32

PASID is defined as a few different types in iommu including "int",
"u32", and "unsigned int". To be consistent and to match with uapi
definitions, define PASID and its variations (e.g. max PASID) as "u32".
"u32" is also shorter and a little more explicit than "unsigned int".

No PASID type change in uapi although it defines PASID as __u64 in
some places.

Suggested-by: Thomas Gleixner 
Signed-off-by: Fenghua Yu 
Reviewed-by: Tony Luck 
Reviewed-by: Lu Baolu 
---
v5.1:
- Change return type to u32 for kfd_pasid_alloc() (Felix)

v5:
- Reviewed by Lu Baolu

v4:
- Change PASID type from "unsigned int" to "u32" (Christoph)

v2:
- Create this new patch to define PASID as "unsigned int" consistently in
  iommu (Thomas)

 drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.h|  4 +--
 .../drm/amd/amdgpu/amdgpu_amdkfd_gfx_v10.c|  2 +-
 .../gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v7.c |  2 +-
 .../gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v8.c |  2 +-
 .../gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v9.c |  2 +-
 .../gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v9.h |  2 +-
 .../gpu/drm/amd/amdgpu/amdgpu_amdkfd_gpuvm.c  |  4 +--
 drivers/gpu/drm/amd/amdgpu/amdgpu_ids.c   |  6 ++--
 drivers/gpu/drm/amd/amdgpu/amdgpu_ids.h   |  4 +--
 drivers/gpu/drm/amd/amdgpu/amdgpu_kms.c   |  2 +-
 drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c|  8 ++---
 drivers/gpu/drm/amd/amdgpu/amdgpu_vm.h|  8 ++---
 .../gpu/drm/amd/amdkfd/cik_event_interrupt.c  |  2 +-
 drivers/gpu/drm/amd/amdkfd/kfd_dbgdev.c   |  2 +-
 drivers/gpu/drm/amd/amdkfd/kfd_dbgmgr.h   |  2 +-
 .../drm/amd/amdkfd/kfd_device_queue_manager.c |  7 ++---
 drivers/gpu/drm/amd/amdkfd/kfd_events.c   |  8 ++---
 drivers/gpu/drm/amd/amdkfd/kfd_events.h   |  4 +--
 drivers/gpu/drm/amd/amdkfd/kfd_iommu.c|  6 ++--
 drivers/gpu/drm/amd/amdkfd/kfd_pasid.c|  4 +--
 drivers/gpu/drm/amd/amdkfd/kfd_priv.h | 20 ++--
 drivers/gpu/drm/amd/amdkfd/kfd_process.c  |  2 +-
 .../gpu/drm/amd/include/kgd_kfd_interface.h   |  2 +-
 drivers/iommu/amd/amd_iommu.h | 10 +++---
 drivers/iommu/amd/iommu.c | 31 ++-
 drivers/iommu/amd/iommu_v2.c  | 20 ++--
 drivers/iommu/intel/dmar.c|  7 +++--
 drivers/iommu/intel/intel-pasid.h | 24 +++---
 drivers/iommu/intel/iommu.c   |  4 +--
 drivers/iommu/intel/pasid.c   | 31 +--
 drivers/iommu/intel/svm.c | 12 +++
 drivers/iommu/iommu.c |  2 +-
 drivers/misc/uacce/uacce.c|  2 +-
 include/linux/amd-iommu.h |  8 ++---
 include/linux/intel-iommu.h   | 12 +++
 include/linux/intel-svm.h |  2 +-
 include/linux/iommu.h | 10 +++---
 include/linux/uacce.h |  2 +-
 38 files changed, 141 insertions(+), 141 deletions(-)

diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.h 
b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.h
index ffe149aafc39..dfef5a7e0f5a 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.h
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.h
@@ -207,11 +207,11 @@ uint8_t amdgpu_amdkfd_get_xgmi_hops_count(struct kgd_dev 
*dst, struct kgd_dev *s
})
 
 /* GPUVM API */
-int amdgpu_amdkfd_gpuvm_create_process_vm(struct kgd_dev *kgd, unsigned int 
pasid,
+int amdgpu_amdkfd_gpuvm_create_process_vm(struct kgd_dev *kgd, u32 pasid,
void **vm, void **process_info,
struct dma_fence **ef);
 int amdgpu_amdkfd_gpuvm_acquire_process_vm(struct kgd_dev *kgd,
-   struct file *filp, unsigned int pasid,
+   struct file *filp, u32 pasid,
void **vm, void **process_info,
struct dma_fence **ef);
 void amdgpu_amdkfd_gpuvm_destroy_cb(struct amdgpu_device *adev,
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v10.c 
b/drivers/gpu/drm

Re: [PATCH 1/2] moduleparams: Add hex type parameter

2020-07-03 Thread Linus Torvalds
On Thu, Jul 2, 2020 at 7:42 AM Christian König  wrote:
>
> I'm just not sure how well this is received upstream because it only
> covers u32
>
> On the other hand that is probably also the most used.

Not necessarily true. I'd argue that "unsigned long"  is equally
possible for some bit mask (or other hex-likely) type.

So don't call it just "hex". Call it "hexint" (the hex does imply
"unsigned", I feel - showing hex numbers with a sign sounds insane).

That way, if somebody ends up wanting it for unsigned long values,
we're not stuck.

Another option is to just say that hex values always have bit _sizes_.
So "hex32" and "hex64" would also make sense as names to me.

While at it, should the hex numbers always be padded out to the size?
The example Paul used doesn't have that issue (high bit being set).

Bbut often it may make sense to show a 32-bit hex number as "%#08x"
because it really makes things clearer when you're looking at high
bits, say.

It's really hard to tell the difference between "just bit 27 set" and
"just bit 31" set otherwise, and that's not all that uncommon when the
bitmasks are sparse.

 Linus
___
amd-gfx mailing list
amd-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/amd-gfx


Re: [PATCH] drm/amdgpu: return an error for hw access in INFO ioctl when in reset

2020-07-03 Thread Christian König

Am 03.07.20 um 08:05 schrieb Felix Kuehling:

Am 2020-07-01 um 10:34 a.m. schrieb Li, Dennis:

[AMD Official Use Only - Internal Distribution Only]

Hi, Christian and Alex
   Not only amdgpu ioctls, but amdkfd ioctls also have the same issue.

Most KFD ioctls don't access HW directly. The only place that interacts
with HW in KFD is the device queues manager (DQM) and beneath it the
packet manager. In DQM we already have protections to avoid HW access
while a reset is in progress.

For other HW access, KFD goes through helper functions in amdgpu.

Memory management ioctls indirectly access HW for page table updates.
However, that requires validating the page table BOs first. Are VRAM BOs
considered "valid" during a GPU reset? When using SDMA for page table
updates, the DRM GPU scheduler is also involved. Is that suspended
during a GPU reset?


That stuff should work concurrently. The scheduler is stopped during a 
reset, but we can still push new jobs to the queues.


Stuff like TLB flushes are also harmless since after a reset we can 
safely assume that the TLB is completely empty.



The only other KFD ioctl that looks like it might access HW during a GPU
reset is kfd_ioctl_get_clock_counters by calling
amdgpu_amdkfd_get_gpu_clock_counter.


Yeah, that is indeed a problem which needs handling.

Christian.



Regards,
   Felix




Best Regards
Dennis Li
-Original Message-
From: amd-gfx  On Behalf Of Christian 
König
Sent: Wednesday, July 1, 2020 4:20 PM
To: Alex Deucher ; amd-gfx list 

Cc: Deucher, Alexander 
Subject: Re: [PATCH] drm/amdgpu: return an error for hw access in INFO ioctl 
when in reset

I don't think this is a good idea, we should probably rather wait for the GPU 
reset to finish by taking the appropriate lock.

Christian.

Am 01.07.20 um 07:33 schrieb Alex Deucher:

ping?

On Fri, Jun 26, 2020 at 10:04 AM Alex Deucher  wrote:

When the GPU is in reset, accessing the hw is unreliable and could
interfere with the reset.  Return an error in those cases.

Signed-off-by: Alex Deucher 
---
   drivers/gpu/drm/amd/amdgpu/amdgpu_kms.c | 6 ++
   1 file changed, 6 insertions(+)

diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_kms.c
b/drivers/gpu/drm/amd/amdgpu/amdgpu_kms.c
index 341d072edd95..fd51d6554ee2 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_kms.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_kms.c
@@ -684,6 +684,9 @@ static int amdgpu_info_ioctl(struct drm_device *dev, void 
*data, struct drm_file
  if (info->read_mmr_reg.count > 128)
  return -EINVAL;

+   if (adev->in_gpu_reset)
+   return -EPERM;
+
  regs = kmalloc_array(info->read_mmr_reg.count, sizeof(*regs), 
GFP_KERNEL);
  if (!regs)
  return -ENOMEM; @@ -854,6 +857,9 @@ static
int amdgpu_info_ioctl(struct drm_device *dev, void *data, struct drm_file
  if (!adev->pm.dpm_enabled)
  return -ENOENT;

+   if (adev->in_gpu_reset)
+   return -EPERM;
+
  switch (info->sensor_info.type) {
  case AMDGPU_INFO_SENSOR_GFX_SCLK:
  /* get sclk in Mhz */
--
2.25.4


___
amd-gfx mailing list
amd-gfx@lists.freedesktop.org
https://list
s.freedesktop.org/mailman/listinfo/amd-gfx
nnis.Li%40amd.com%7Cefeeda4b6d194660fbc508d81d9791a3%7C3dd8961fe4884e6
08e11a82d994e183d%7C0%7C0%7C637291884123360340&sdata=GNPWQNndUJKx7
70fDTuRGBnJzfmRUQjD4B1HBie3xUQ%3D&reserved=0

___
amd-gfx mailing list
amd-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/amd-gfx
___
amd-gfx mailing list
amd-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/amd-gfx


___
amd-gfx mailing list
amd-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/amd-gfx