[PATCH] drm/amdgpu: remove pasid_src field from IV entry

2023-04-27 Thread Xiaomeng Hou
PASID_SRC is not actually present in the Interrupt Packet, the field is
taken as reserved bits now. So remove it from IV entry to avoid misuse.

Signed-off-by: Xiaomeng Hou 
---
 drivers/gpu/drm/amd/amdgpu/amdgpu_ih.c  | 1 -
 drivers/gpu/drm/amd/amdgpu/amdgpu_irq.h | 1 -
 2 files changed, 2 deletions(-)

diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_ih.c 
b/drivers/gpu/drm/amd/amdgpu/amdgpu_ih.c
index d58353c89e59..fceb3b384955 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_ih.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_ih.c
@@ -271,7 +271,6 @@ void amdgpu_ih_decode_iv_helper(struct amdgpu_device *adev,
entry->timestamp_src = dw[2] >> 31;
entry->pasid = dw[3] & 0x;
entry->node_id = (dw[3] >> 16) & 0xff;
-   entry->pasid_src = dw[3] >> 31;
entry->src_data[0] = dw[4];
entry->src_data[1] = dw[5];
entry->src_data[2] = dw[6];
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_irq.h 
b/drivers/gpu/drm/amd/amdgpu/amdgpu_irq.h
index 7a8e686bdd41..1c747ac4129a 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_irq.h
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_irq.h
@@ -54,7 +54,6 @@ struct amdgpu_iv_entry {
unsigned timestamp_src;
unsigned pasid;
unsigned node_id;
-   unsigned pasid_src;
unsigned src_data[AMDGPU_IRQ_SRC_DATA_MAX_SIZE_DW];
const uint32_t *iv_entry;
 };
-- 
2.25.1



[PATCH] drm/amd/pm: update smu v13.0.1 firmware header

2021-08-02 Thread Xiaomeng Hou
Update smu v13.0.1 firmware header for yellow carp.

Signed-off-by: Xiaomeng Hou 
---
 drivers/gpu/drm/amd/pm/inc/smu_v13_0_1_pmfw.h | 4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)

diff --git a/drivers/gpu/drm/amd/pm/inc/smu_v13_0_1_pmfw.h 
b/drivers/gpu/drm/amd/pm/inc/smu_v13_0_1_pmfw.h
index 5627de734246..c5e26d619bf0 100644
--- a/drivers/gpu/drm/amd/pm/inc/smu_v13_0_1_pmfw.h
+++ b/drivers/gpu/drm/amd/pm/inc/smu_v13_0_1_pmfw.h
@@ -111,7 +111,9 @@ typedef struct {
   uint32_t InWhisperMode: 1;
   uint32_t spare0   : 1;
   uint32_t ZstateStatus : 4;
-  uint32_t spare1   :12;
+  uint32_t spare1   : 4;
+  uint32_t DstateFun: 4;
+  uint32_t DstateDev: 4;
   // MP1_EXT_SCRATCH2
   uint32_t P2JobHandler :24;
   uint32_t RsmuPmiP2FinishedCnt : 8;
-- 
2.17.1



[PATCH] drm/amd/pm: update yellow carp pmfw interface version

2021-07-30 Thread Xiaomeng Hou
Correct yellow carp driver-PMFW interface version to v4.

Signed-off-by: Xiaomeng Hou 
---
 drivers/gpu/drm/amd/pm/inc/smu_v13_0.h | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/drivers/gpu/drm/amd/pm/inc/smu_v13_0.h 
b/drivers/gpu/drm/amd/pm/inc/smu_v13_0.h
index 3fea2430dec0..dc91eb608791 100644
--- a/drivers/gpu/drm/amd/pm/inc/smu_v13_0.h
+++ b/drivers/gpu/drm/amd/pm/inc/smu_v13_0.h
@@ -26,7 +26,7 @@
 #include "amdgpu_smu.h"
 
 #define SMU13_DRIVER_IF_VERSION_INV 0x
-#define SMU13_DRIVER_IF_VERSION_YELLOW_CARP 0x03
+#define SMU13_DRIVER_IF_VERSION_YELLOW_CARP 0x04
 #define SMU13_DRIVER_IF_VERSION_ALDE 0x07
 
 /* MP Apertures */
-- 
2.17.1

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


[PATCH] drm/amd/display: update header file name

2021-07-07 Thread Xiaomeng Hou
Update the register header file name.

Signed-off-by: Xiaomeng Hou 
---
 drivers/gpu/drm/amd/display/dc/clk_mgr/dcn31/dcn31_smu.c | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/drivers/gpu/drm/amd/display/dc/clk_mgr/dcn31/dcn31_smu.c 
b/drivers/gpu/drm/amd/display/dc/clk_mgr/dcn31/dcn31_smu.c
index beea961749e1..8c2b77eb9459 100644
--- a/drivers/gpu/drm/amd/display/dc/clk_mgr/dcn31/dcn31_smu.c
+++ b/drivers/gpu/drm/amd/display/dc/clk_mgr/dcn31/dcn31_smu.c
@@ -31,8 +31,8 @@
 #include "dcn31_smu.h"
 
 #include "yellow_carp_offset.h"
-#include "mp/mp_13_0_1_offset.h"
-#include "mp/mp_13_0_1_sh_mask.h"
+#include "mp/mp_13_0_2_offset.h"
+#include "mp/mp_13_0_2_sh_mask.h"
 
 #define REG(reg_name) \
(MP0_BASE.instance[0].segment[reg ## reg_name ## _BASE_IDX] + reg ## 
reg_name)
-- 
2.17.1

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


[PATCH v2] drm/amd/pm: drop smu_v13_0_1.c|h files for yellow carp

2021-07-06 Thread Xiaomeng Hou
Since there's nothing special in smu implementation for yellow carp,
it's better to reuse the common smu_v13_0 interfaces and drop the
specific smu_v13_0_1.c|h files.

v2: remove the duplicate register offset and shift mask header files as
well.

Signed-off-by: Xiaomeng Hou 
---
 .../include/asic_reg/mp/mp_13_0_1_offset.h| 355 
 .../include/asic_reg/mp/mp_13_0_1_sh_mask.h   | 531 --
 drivers/gpu/drm/amd/pm/inc/smu_v13_0.h|   1 +
 drivers/gpu/drm/amd/pm/inc/smu_v13_0_1.h  |  57 --
 drivers/gpu/drm/amd/pm/swsmu/smu13/Makefile   |   2 +-
 .../gpu/drm/amd/pm/swsmu/smu13/smu_v13_0.c|  24 +
 .../gpu/drm/amd/pm/swsmu/smu13/smu_v13_0_1.c  | 311 --
 .../drm/amd/pm/swsmu/smu13/yellow_carp_ppt.c  |  39 +-
 8 files changed, 57 insertions(+), 1263 deletions(-)
 delete mode 100644 drivers/gpu/drm/amd/include/asic_reg/mp/mp_13_0_1_offset.h
 delete mode 100644 drivers/gpu/drm/amd/include/asic_reg/mp/mp_13_0_1_sh_mask.h
 delete mode 100644 drivers/gpu/drm/amd/pm/inc/smu_v13_0_1.h
 delete mode 100644 drivers/gpu/drm/amd/pm/swsmu/smu13/smu_v13_0_1.c

diff --git a/drivers/gpu/drm/amd/include/asic_reg/mp/mp_13_0_1_offset.h 
b/drivers/gpu/drm/amd/include/asic_reg/mp/mp_13_0_1_offset.h
deleted file mode 100644
index dfacc6b5d89d..
--- a/drivers/gpu/drm/amd/include/asic_reg/mp/mp_13_0_1_offset.h
+++ /dev/null
@@ -1,355 +0,0 @@
-/*
- * Copyright 2020 Advanced Micro Devices, Inc.
- *
- * Permission is hereby granted, free of charge, to any person obtaining a
- * copy of this software and associated documentation files (the "Software"),
- * to deal in the Software without restriction, including without limitation
- * the rights to use, copy, modify, merge, publish, distribute, sublicense,
- * and/or sell copies of the Software, and to permit persons to whom the
- * Software is furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
- * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
- * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
- * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
- * OTHER DEALINGS IN THE SOFTWARE.
- *
- *
- */
-#ifndef _mp_13_0_1_OFFSET_HEADER
-#define _mp_13_0_1_OFFSET_HEADER
-
-
-
-// addressBlock: mp_SmuMp0_SmnDec
-// base address: 0x0
-#define regMP0_SMN_C2PMSG_32   
 0x0060
-#define regMP0_SMN_C2PMSG_32_BASE_IDX  
 0
-#define regMP0_SMN_C2PMSG_33   
 0x0061
-#define regMP0_SMN_C2PMSG_33_BASE_IDX  
 0
-#define regMP0_SMN_C2PMSG_34   
 0x0062
-#define regMP0_SMN_C2PMSG_34_BASE_IDX  
 0
-#define regMP0_SMN_C2PMSG_35   
 0x0063
-#define regMP0_SMN_C2PMSG_35_BASE_IDX  
 0
-#define regMP0_SMN_C2PMSG_36   
 0x0064
-#define regMP0_SMN_C2PMSG_36_BASE_IDX  
 0
-#define regMP0_SMN_C2PMSG_37   
 0x0065
-#define regMP0_SMN_C2PMSG_37_BASE_IDX  
 0
-#define regMP0_SMN_C2PMSG_38   
 0x0066
-#define regMP0_SMN_C2PMSG_38_BASE_IDX  
 0
-#define regMP0_SMN_C2PMSG_39   
 0x0067
-#define regMP0_SMN_C2PMSG_39_BASE_IDX  
 0
-#define regMP0_SMN_C2PMSG_40   
 0x0068
-#define regMP0_SMN_C2PMSG_40_BASE_IDX  
 0
-#define regMP0_SMN_C2PMSG_41   
 0x0069
-#define regMP0_SMN_C2PMSG_41_BASE_IDX  
 0
-#define 

[PATCH] drm/amd/pm: drop smu_v13_0_1.c|h files for yellow carp

2021-07-01 Thread Xiaomeng Hou
Since there's nothing special in smu implementation for yellow carp,
it's better to reuse the common smu_v13_0 interfaces and drop the
specific smu_v13_0_1.c|h files.

Signed-off-by: Xiaomeng Hou 
---
 drivers/gpu/drm/amd/pm/inc/smu_v13_0.h|   1 +
 drivers/gpu/drm/amd/pm/inc/smu_v13_0_1.h  |  57 
 drivers/gpu/drm/amd/pm/swsmu/smu13/Makefile   |   2 +-
 .../gpu/drm/amd/pm/swsmu/smu13/smu_v13_0.c|  26 ++
 .../gpu/drm/amd/pm/swsmu/smu13/smu_v13_0_1.c  | 311 --
 .../drm/amd/pm/swsmu/smu13/yellow_carp_ppt.c  |  39 ++-
 6 files changed, 59 insertions(+), 377 deletions(-)
 delete mode 100644 drivers/gpu/drm/amd/pm/inc/smu_v13_0_1.h
 delete mode 100644 drivers/gpu/drm/amd/pm/swsmu/smu13/smu_v13_0_1.c

diff --git a/drivers/gpu/drm/amd/pm/inc/smu_v13_0.h 
b/drivers/gpu/drm/amd/pm/inc/smu_v13_0.h
index 6119a36b2cba..3fea2430dec0 100644
--- a/drivers/gpu/drm/amd/pm/inc/smu_v13_0.h
+++ b/drivers/gpu/drm/amd/pm/inc/smu_v13_0.h
@@ -26,6 +26,7 @@
 #include "amdgpu_smu.h"
 
 #define SMU13_DRIVER_IF_VERSION_INV 0x
+#define SMU13_DRIVER_IF_VERSION_YELLOW_CARP 0x03
 #define SMU13_DRIVER_IF_VERSION_ALDE 0x07
 
 /* MP Apertures */
diff --git a/drivers/gpu/drm/amd/pm/inc/smu_v13_0_1.h 
b/drivers/gpu/drm/amd/pm/inc/smu_v13_0_1.h
deleted file mode 100644
index b6c976a4d578..
--- a/drivers/gpu/drm/amd/pm/inc/smu_v13_0_1.h
+++ /dev/null
@@ -1,57 +0,0 @@
-/*
- * Copyright 2020 Advanced Micro Devices, Inc.
- *
- * Permission is hereby granted, free of charge, to any person obtaining a
- * copy of this software and associated documentation files (the "Software"),
- * to deal in the Software without restriction, including without limitation
- * the rights to use, copy, modify, merge, publish, distribute, sublicense,
- * and/or sell copies of the Software, and to permit persons to whom the
- * Software is furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
- * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
- * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
- * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
- * OTHER DEALINGS IN THE SOFTWARE.
- *
- */
-#ifndef __SMU_V13_0_1_H__
-#define __SMU_V13_0_1_H__
-
-#include "amdgpu_smu.h"
-
-#define SMU13_0_1_DRIVER_IF_VERSION_INV 0x
-#define SMU13_0_1_DRIVER_IF_VERSION_YELLOW_CARP 0x3
-
-/* MP Apertures */
-#define MP0_Public 0x0380
-#define MP0_SRAM   0x0390
-#define MP1_Public 0x03b0
-#define MP1_SRAM   0x03c4
-
-/* address block */
-#define smnMP1_FIRMWARE_FLAGS  0x3010024
-
-
-#if defined(SWSMU_CODE_LAYER_L2) || defined(SWSMU_CODE_LAYER_L3)
-
-int smu_v13_0_1_check_fw_status(struct smu_context *smu);
-
-int smu_v13_0_1_check_fw_version(struct smu_context *smu);
-
-int smu_v13_0_1_fini_smc_tables(struct smu_context *smu);
-
-int smu_v13_0_1_get_vbios_bootup_values(struct smu_context *smu);
-
-int smu_v13_0_1_set_default_dpm_tables(struct smu_context *smu);
-
-int smu_v13_0_1_set_driver_table_location(struct smu_context *smu);
-
-int smu_v13_0_1_gfx_off_control(struct smu_context *smu, bool enable);
-#endif
-#endif
diff --git a/drivers/gpu/drm/amd/pm/swsmu/smu13/Makefile 
b/drivers/gpu/drm/amd/pm/swsmu/smu13/Makefile
index 9b3a8503f5cd..d4c4c495762c 100644
--- a/drivers/gpu/drm/amd/pm/swsmu/smu13/Makefile
+++ b/drivers/gpu/drm/amd/pm/swsmu/smu13/Makefile
@@ -23,7 +23,7 @@
 # Makefile for the 'smu manager' sub-component of powerplay.
 # It provides the smu management services for the driver.
 
-SMU13_MGR = smu_v13_0.o aldebaran_ppt.o smu_v13_0_1.o yellow_carp_ppt.o
+SMU13_MGR = smu_v13_0.o aldebaran_ppt.o yellow_carp_ppt.o
 
 AMD_SWSMU_SMU13MGR = $(addprefix $(AMD_SWSMU_PATH)/smu13/,$(SMU13_MGR))
 
diff --git a/drivers/gpu/drm/amd/pm/swsmu/smu13/smu_v13_0.c 
b/drivers/gpu/drm/amd/pm/swsmu/smu13/smu_v13_0.c
index a3dc7194aaf8..cbce982f2717 100644
--- a/drivers/gpu/drm/amd/pm/swsmu/smu13/smu_v13_0.c
+++ b/drivers/gpu/drm/amd/pm/swsmu/smu13/smu_v13_0.c
@@ -41,6 +41,8 @@
 
 #include "asic_reg/thm/thm_13_0_2_offset.h"
 #include "asic_reg/thm/thm_13_0_2_sh_mask.h"
+#include "asic_reg/mp/mp_13_0_1_offset.h"
+#include "asic_reg/mp/mp_13_0_1_sh_mask.h"
 #include "asic_reg/mp/mp_13_0_2_offset.h"
 #include "asic_reg/mp/mp_13_0_2_sh_mask.h"
 #include "asic_reg/smuio/smuio_13_0_2_offset.h"
@@ -210,6 +212,9 @@ int smu_v13_0_check_fw_version(struct smu_context *smu)
case CH

[PATCH] drm/amd/pm: fix warning reported by kernel test robot

2021-06-07 Thread Xiaomeng Hou
Kernel test robot throws warning ->

>> drivers/gpu/drm/amd/amdgpu/../pm/swsmu/smu13/yellow_carp_ppt.c:483:2:
   warning: variable 'member_type' is used uninitialized whenever switch
   default is taken [-Wsometimes-uninitialized]
   default:
   ^~~
   drivers/gpu/drm/amd/amdgpu/../pm/swsmu/smu13/yellow_carp_ppt.c:487:47:
   note: uninitialized use occurs here
   return yellow_carp_get_smu_metrics_data(smu, member_type, value);
   ^~~
   drivers/gpu/drm/amd/amdgpu/../pm/swsmu/smu13/yellow_carp_ppt.c:465:2:
   note: variable 'member_type' is declared here
   MetricsMember_t member_type;
   ^
   1 warning generated.

Fix this warning by return errno when the clk type is unsupported.

Signed-off-by: Xiaomeng Hou 
Reported-by: kernel test robot 
---
 drivers/gpu/drm/amd/pm/swsmu/smu13/yellow_carp_ppt.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/drivers/gpu/drm/amd/pm/swsmu/smu13/yellow_carp_ppt.c 
b/drivers/gpu/drm/amd/pm/swsmu/smu13/yellow_carp_ppt.c
index 031c49fb4582..0cd7902d5172 100644
--- a/drivers/gpu/drm/amd/pm/swsmu/smu13/yellow_carp_ppt.c
+++ b/drivers/gpu/drm/amd/pm/swsmu/smu13/yellow_carp_ppt.c
@@ -728,7 +728,7 @@ static int yellow_carp_get_current_clk_freq(struct 
smu_context *smu,
return smu_cmn_send_smc_msg_with_param(smu,
SMU_MSG_GetFclkFrequency, 0, value);
default:
-   break;
+   return -EINVAL;
}
 
return yellow_carp_get_smu_metrics_data(smu, member_type, value);
-- 
2.17.1

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


[PATCH 1/2] drm/amd/pm: modify the power limit level parameter from bool to enum type

2021-02-05 Thread Xiaomeng Hou
The original smu_get_power_limit callback accepts the power limit level
parameter as bool which limits to max and current. For possible needs to
retrieve other level like min, extend the parameter type using enum.

Signed-off-by: Xiaomeng Hou 
---
 drivers/gpu/drm/amd/pm/amdgpu_pm.c|  4 ++--
 drivers/gpu/drm/amd/pm/inc/amdgpu_smu.h   |  9 -
 drivers/gpu/drm/amd/pm/swsmu/amdgpu_smu.c | 13 +++--
 3 files changed, 21 insertions(+), 5 deletions(-)

diff --git a/drivers/gpu/drm/amd/pm/amdgpu_pm.c 
b/drivers/gpu/drm/amd/pm/amdgpu_pm.c
index cf475ac01b27..39899e7989a2 100644
--- a/drivers/gpu/drm/amd/pm/amdgpu_pm.c
+++ b/drivers/gpu/drm/amd/pm/amdgpu_pm.c
@@ -3073,7 +3073,7 @@ static ssize_t amdgpu_hwmon_show_power_cap_max(struct 
device *dev,
}
 
if (is_support_sw_smu(adev)) {
-   smu_get_power_limit(>smu, , true);
+   smu_get_power_limit(>smu, , SMU_PPT_LIMIT_MAX);
size = snprintf(buf, PAGE_SIZE, "%u\n", limit * 100);
} else if (adev->powerplay.pp_funcs && 
adev->powerplay.pp_funcs->get_power_limit) {

adev->powerplay.pp_funcs->get_power_limit(adev->powerplay.pp_handle, , 
true);
@@ -3107,7 +3107,7 @@ static ssize_t amdgpu_hwmon_show_power_cap(struct device 
*dev,
}
 
if (is_support_sw_smu(adev)) {
-   smu_get_power_limit(>smu, , false);
+   smu_get_power_limit(>smu, , SMU_PPT_LIMIT_CURRENT);
size = snprintf(buf, PAGE_SIZE, "%u\n", limit * 100);
} else if (adev->powerplay.pp_funcs && 
adev->powerplay.pp_funcs->get_power_limit) {

adev->powerplay.pp_funcs->get_power_limit(adev->powerplay.pp_handle, , 
false);
diff --git a/drivers/gpu/drm/amd/pm/inc/amdgpu_smu.h 
b/drivers/gpu/drm/amd/pm/inc/amdgpu_smu.h
index 44279c2afccb..82a5f4a4faf5 100644
--- a/drivers/gpu/drm/amd/pm/inc/amdgpu_smu.h
+++ b/drivers/gpu/drm/amd/pm/inc/amdgpu_smu.h
@@ -161,6 +161,13 @@ enum smu_power_src_type
SMU_POWER_SOURCE_COUNT,
 };
 
+enum smu_ppt_limit_level
+{
+   SMU_PPT_LIMIT_MIN = -1,
+   SMU_PPT_LIMIT_CURRENT,
+   SMU_PPT_LIMIT_MAX,
+};
+
 enum smu_memory_pool_size
 {
 SMU_MEMORY_POOL_SIZE_ZERO   = 0,
@@ -1218,7 +1225,7 @@ int smu_set_fan_speed_rpm(struct smu_context *smu, 
uint32_t speed);
 
 int smu_get_power_limit(struct smu_context *smu,
uint32_t *limit,
-   bool max_setting);
+   enum smu_ppt_limit_level limit_level);
 
 int smu_set_power_limit(struct smu_context *smu, uint32_t limit);
 int smu_print_clk_levels(struct smu_context *smu, enum smu_clk_type clk_type, 
char *buf);
diff --git a/drivers/gpu/drm/amd/pm/swsmu/amdgpu_smu.c 
b/drivers/gpu/drm/amd/pm/swsmu/amdgpu_smu.c
index c00f3f531965..9017024642bb 100644
--- a/drivers/gpu/drm/amd/pm/swsmu/amdgpu_smu.c
+++ b/drivers/gpu/drm/amd/pm/swsmu/amdgpu_smu.c
@@ -2044,14 +2044,23 @@ int smu_set_fan_speed_rpm(struct smu_context *smu, 
uint32_t speed)
 
 int smu_get_power_limit(struct smu_context *smu,
uint32_t *limit,
-   bool max_setting)
+   enum smu_ppt_limit_level limit_level)
 {
if (!smu->pm_enabled || !smu->adev->pm.dpm_enabled)
return -EOPNOTSUPP;
 
mutex_lock(>mutex);
 
-   *limit = (max_setting ? smu->max_power_limit : 
smu->current_power_limit);
+   switch (limit_level) {
+   case SMU_PPT_LIMIT_CURRENT:
+   *limit = smu->current_power_limit;
+   break;
+   case SMU_PPT_LIMIT_MAX:
+   *limit = smu->max_power_limit;
+   break;
+   default:
+   break;
+   }
 
mutex_unlock(>mutex);
 
-- 
2.17.1

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


[PATCH 2/2] drm/amd/pm: add support for hwmon control of slow and fast PPT limit on vangogh

2021-02-05 Thread Xiaomeng Hou
Implement hwmon API for reading/setting slow and fast PPT limit.

APU power is managed to system-level requirements through the PPT
(package power tracking) feature. PPT is intended to limit power to the
requirements of the power source and could be dynamically updated to
maximize APU performance within the system power budget.

Here FAST_PPT_LIMIT manages the ~10 ms moving average of APU power,
while SLOW_PPT_LIMIT manages the configurable, thermally significant
moving average of APU power (default ~5000 ms).

User could read slow/fast ppt limit using command "cat power*_cap" or
"sensors" in the hwmon device directory. User could adjust values of
slow/fast ppt limit as needed depending on workloads through command
"echo ## > power*_cap".

Example:
$ echo 1500 > power1_cap
$ echo 1800 > power2_cap
$ sensors
amdgpu-pci-0300
Adapter: PCI adapter
slowPPT: 9.04W (cap = 15.00 W)
fastPPT: 9.04W (cap = 18.00 W)

v2: align with existing interfaces for the getting/setting of PPT
limits. Encode the upper 8 bits of limit value to distinguish
slow and fast power limit type.

Signed-off-by: Xiaomeng Hou 
---
 drivers/gpu/drm/amd/pm/amdgpu_pm.c|  45 ++-
 drivers/gpu/drm/amd/pm/inc/amdgpu_smu.h   |  12 ++
 drivers/gpu/drm/amd/pm/inc/smu_v11_0.h|   9 ++
 drivers/gpu/drm/amd/pm/swsmu/amdgpu_smu.c |  35 --
 .../gpu/drm/amd/pm/swsmu/smu11/smu_v11_0.c|   8 +-
 .../gpu/drm/amd/pm/swsmu/smu11/vangogh_ppt.c  | 113 ++
 6 files changed, 204 insertions(+), 18 deletions(-)

diff --git a/drivers/gpu/drm/amd/pm/amdgpu_pm.c 
b/drivers/gpu/drm/amd/pm/amdgpu_pm.c
index 39899e7989a2..5fa65f191a37 100644
--- a/drivers/gpu/drm/amd/pm/amdgpu_pm.c
+++ b/drivers/gpu/drm/amd/pm/amdgpu_pm.c
@@ -3059,7 +3059,8 @@ static ssize_t amdgpu_hwmon_show_power_cap_max(struct 
device *dev,
 char *buf)
 {
struct amdgpu_device *adev = dev_get_drvdata(dev);
-   uint32_t limit = 0;
+   int limit_type = to_sensor_dev_attr(attr)->index;
+   uint32_t limit = limit_type << 24;
ssize_t size;
int r;
 
@@ -3093,7 +3094,8 @@ static ssize_t amdgpu_hwmon_show_power_cap(struct device 
*dev,
 char *buf)
 {
struct amdgpu_device *adev = dev_get_drvdata(dev);
-   uint32_t limit = 0;
+   int limit_type = to_sensor_dev_attr(attr)->index;
+   uint32_t limit = limit_type << 24;
ssize_t size;
int r;
 
@@ -3122,6 +3124,15 @@ static ssize_t amdgpu_hwmon_show_power_cap(struct device 
*dev,
return size;
 }
 
+static ssize_t amdgpu_hwmon_show_power_label(struct device *dev,
+struct device_attribute *attr,
+char *buf)
+{
+   int limit_type = to_sensor_dev_attr(attr)->index;
+
+   return snprintf(buf, PAGE_SIZE, "%s\n",
+   limit_type == SMU_FAST_PPT_LIMIT ? "fastPPT" : "slowPPT");
+}
 
 static ssize_t amdgpu_hwmon_set_power_cap(struct device *dev,
struct device_attribute *attr,
@@ -3129,6 +3140,7 @@ static ssize_t amdgpu_hwmon_set_power_cap(struct device 
*dev,
size_t count)
 {
struct amdgpu_device *adev = dev_get_drvdata(dev);
+   int limit_type = to_sensor_dev_attr(attr)->index;
int err;
u32 value;
 
@@ -3143,7 +3155,7 @@ static ssize_t amdgpu_hwmon_set_power_cap(struct device 
*dev,
return err;
 
value = value / 100; /* convert to Watt */
-
+   value |= limit_type << 24;
 
err = pm_runtime_get_sync(adev_to_drm(adev)->dev);
if (err < 0) {
@@ -3355,6 +3367,12 @@ static SENSOR_DEVICE_ATTR(power1_average, S_IRUGO, 
amdgpu_hwmon_show_power_avg,
 static SENSOR_DEVICE_ATTR(power1_cap_max, S_IRUGO, 
amdgpu_hwmon_show_power_cap_max, NULL, 0);
 static SENSOR_DEVICE_ATTR(power1_cap_min, S_IRUGO, 
amdgpu_hwmon_show_power_cap_min, NULL, 0);
 static SENSOR_DEVICE_ATTR(power1_cap, S_IRUGO | S_IWUSR, 
amdgpu_hwmon_show_power_cap, amdgpu_hwmon_set_power_cap, 0);
+static SENSOR_DEVICE_ATTR(power1_label, S_IRUGO, 
amdgpu_hwmon_show_power_label, NULL, 0);
+static SENSOR_DEVICE_ATTR(power2_average, S_IRUGO, 
amdgpu_hwmon_show_power_avg, NULL, 1);
+static SENSOR_DEVICE_ATTR(power2_cap_max, S_IRUGO, 
amdgpu_hwmon_show_power_cap_max, NULL, 1);
+static SENSOR_DEVICE_ATTR(power2_cap_min, S_IRUGO, 
amdgpu_hwmon_show_power_cap_min, NULL, 1);
+static SENSOR_DEVICE_ATTR(power2_cap, S_IRUGO | S_IWUSR, 
amdgpu_hwmon_show_power_cap, amdgpu_hwmon_set_power_cap, 1);
+static SENSOR_DEVICE_ATTR(power2_label, S_IRUGO, 
amdgpu_hwmon_show_power_label, NULL, 1);
 static SENSOR_DEVICE_ATTR(freq1_input, S_IRUGO, amdgpu_hwmon_show_sclk, NULL, 
0);
 static SENSOR_DEVICE_ATTR(freq1_label, S_IRUGO, amdgpu_hwmon_show_sclk_label, 
NULL, 0);
 static SENSOR_DEVICE_ATTR(freq2_input, S_I

[PATCH 2/2] drm/amd/pm: add support for hwmon control of slow and fast PPT limit on vangogh

2021-02-03 Thread Xiaomeng Hou
Implement hwmon API for reading/setting slow and fast PPT limit.

APU power is managed to system-level requirements through the PPT
(package power tracking) feature. PPT is intended to limit power to the
requirements of the power source and could be dynamically updated to
maximize APU performance within the system power budget.

Here FAST_PPT_LIMIT manages the ~10 ms moving average of APU power,
while SLOW_PPT_LIMIT manages the configurable, thermally significant
moving average of APU power (default ~5000 ms).

User could read slow/fast ppt limit using command "cat power*_cap" or
"sensors" in the hwmon device directory. User could adjust values of
slow/fast ppt limit as needed depending on workloads through command
"echo ## > power*_cap".

Example:
$ echo 1500 > power1_cap
$ echo 1800 > power2_cap
$ sensors
amdgpu-pci-0300
Adapter: PCI adapter
slowPPT: 9.04W (cap = 15.00 W)
fastPPT: 9.04W (cap = 18.00 W)

v2: align with existing interfaces for the getting/setting of PPT
limits. Encode the upper 8 bits of limit value to distinguish
slow and fast power limit type.

Signed-off-by: Xiaomeng Hou 
---
 drivers/gpu/drm/amd/pm/amdgpu_pm.c|  45 +++-
 drivers/gpu/drm/amd/pm/inc/amdgpu_smu.h   |  13 +++
 drivers/gpu/drm/amd/pm/inc/smu_v11_0.h|   9 ++
 drivers/gpu/drm/amd/pm/swsmu/amdgpu_smu.c |  13 ++-
 .../gpu/drm/amd/pm/swsmu/smu11/smu_v11_0.c|   8 +-
 .../gpu/drm/amd/pm/swsmu/smu11/vangogh_ppt.c  | 103 ++
 6 files changed, 182 insertions(+), 9 deletions(-)

diff --git a/drivers/gpu/drm/amd/pm/amdgpu_pm.c 
b/drivers/gpu/drm/amd/pm/amdgpu_pm.c
index cf475ac01b27..d49f36b01e97 100644
--- a/drivers/gpu/drm/amd/pm/amdgpu_pm.c
+++ b/drivers/gpu/drm/amd/pm/amdgpu_pm.c
@@ -3059,7 +3059,8 @@ static ssize_t amdgpu_hwmon_show_power_cap_max(struct 
device *dev,
 char *buf)
 {
struct amdgpu_device *adev = dev_get_drvdata(dev);
-   uint32_t limit = 0;
+   int limit_type = to_sensor_dev_attr(attr)->index;
+   uint32_t limit = limit_type << 24;
ssize_t size;
int r;
 
@@ -3093,7 +3094,8 @@ static ssize_t amdgpu_hwmon_show_power_cap(struct device 
*dev,
 char *buf)
 {
struct amdgpu_device *adev = dev_get_drvdata(dev);
-   uint32_t limit = 0;
+   int limit_type = to_sensor_dev_attr(attr)->index;
+   uint32_t limit = limit_type << 24;
ssize_t size;
int r;
 
@@ -3122,6 +3124,15 @@ static ssize_t amdgpu_hwmon_show_power_cap(struct device 
*dev,
return size;
 }
 
+static ssize_t amdgpu_hwmon_show_power_label(struct device *dev,
+struct device_attribute *attr,
+char *buf)
+{
+   int limit_type = to_sensor_dev_attr(attr)->index;
+
+   return snprintf(buf, PAGE_SIZE, "%s\n",
+   limit_type == SMU_POWER_LIMIT_FAST_PPT ? "fastPPT" : "slowPPT");
+}
 
 static ssize_t amdgpu_hwmon_set_power_cap(struct device *dev,
struct device_attribute *attr,
@@ -3129,6 +3140,7 @@ static ssize_t amdgpu_hwmon_set_power_cap(struct device 
*dev,
size_t count)
 {
struct amdgpu_device *adev = dev_get_drvdata(dev);
+   int limit_type = to_sensor_dev_attr(attr)->index;
int err;
u32 value;
 
@@ -3143,7 +3155,7 @@ static ssize_t amdgpu_hwmon_set_power_cap(struct device 
*dev,
return err;
 
value = value / 100; /* convert to Watt */
-
+   value |= limit_type << 24;
 
err = pm_runtime_get_sync(adev_to_drm(adev)->dev);
if (err < 0) {
@@ -3355,6 +3367,12 @@ static SENSOR_DEVICE_ATTR(power1_average, S_IRUGO, 
amdgpu_hwmon_show_power_avg,
 static SENSOR_DEVICE_ATTR(power1_cap_max, S_IRUGO, 
amdgpu_hwmon_show_power_cap_max, NULL, 0);
 static SENSOR_DEVICE_ATTR(power1_cap_min, S_IRUGO, 
amdgpu_hwmon_show_power_cap_min, NULL, 0);
 static SENSOR_DEVICE_ATTR(power1_cap, S_IRUGO | S_IWUSR, 
amdgpu_hwmon_show_power_cap, amdgpu_hwmon_set_power_cap, 0);
+static SENSOR_DEVICE_ATTR(power1_label, S_IRUGO, 
amdgpu_hwmon_show_power_label, NULL, 0);
+static SENSOR_DEVICE_ATTR(power2_average, S_IRUGO, 
amdgpu_hwmon_show_power_avg, NULL, 1);
+static SENSOR_DEVICE_ATTR(power2_cap_max, S_IRUGO, 
amdgpu_hwmon_show_power_cap_max, NULL, 1);
+static SENSOR_DEVICE_ATTR(power2_cap_min, S_IRUGO, 
amdgpu_hwmon_show_power_cap_min, NULL, 1);
+static SENSOR_DEVICE_ATTR(power2_cap, S_IRUGO | S_IWUSR, 
amdgpu_hwmon_show_power_cap, amdgpu_hwmon_set_power_cap, 1);
+static SENSOR_DEVICE_ATTR(power2_label, S_IRUGO, 
amdgpu_hwmon_show_power_label, NULL, 1);
 static SENSOR_DEVICE_ATTR(freq1_input, S_IRUGO, amdgpu_hwmon_show_sclk, NULL, 
0);
 static SENSOR_DEVICE_ATTR(freq1_label, S_IRUGO, amdgpu_hwmon_show_sclk_label, 
NULL, 0);
 static SENSOR_DEVICE_ATTR(freq2_input, S_I

[PATCH 1/2] drm/amd/pm: update the smu v11.5 smc header for vangogh

2021-02-03 Thread Xiaomeng Hou
Add PP messages for reading/setting Fast PPT and Slow PPT limit.

Signed-off-by: Xiaomeng Hou 
---
 drivers/gpu/drm/amd/pm/inc/smu_types.h   | 4 
 drivers/gpu/drm/amd/pm/inc/smu_v11_5_ppsmc.h | 6 +-
 2 files changed, 9 insertions(+), 1 deletion(-)

diff --git a/drivers/gpu/drm/amd/pm/inc/smu_types.h 
b/drivers/gpu/drm/amd/pm/inc/smu_types.h
index 68c87d4b1ce3..aa4822202587 100644
--- a/drivers/gpu/drm/amd/pm/inc/smu_types.h
+++ b/drivers/gpu/drm/amd/pm/inc/smu_types.h
@@ -210,6 +210,10 @@
__SMU_DUMMY_MAP(DisallowGpo),\
__SMU_DUMMY_MAP(Enable2ndUSB20Port), \
__SMU_DUMMY_MAP(RequestActiveWgp),   \
+   __SMU_DUMMY_MAP(SetFastPPTLimit),\
+   __SMU_DUMMY_MAP(SetSlowPPTLimit),\
+   __SMU_DUMMY_MAP(GetFastPPTLimit),\
+   __SMU_DUMMY_MAP(GetSlowPPTLimit),\
 
 #undef __SMU_DUMMY_MAP
 #define __SMU_DUMMY_MAP(type)  SMU_MSG_##type
diff --git a/drivers/gpu/drm/amd/pm/inc/smu_v11_5_ppsmc.h 
b/drivers/gpu/drm/amd/pm/inc/smu_v11_5_ppsmc.h
index 55d7892e4e0e..fe130a497d6c 100644
--- a/drivers/gpu/drm/amd/pm/inc/smu_v11_5_ppsmc.h
+++ b/drivers/gpu/drm/amd/pm/inc/smu_v11_5_ppsmc.h
@@ -104,7 +104,11 @@
 #define PPSMC_MSG_DramLogSetDramBufferSize 0x46
 #define PPSMC_MSG_RequestActiveWgp 0x47
 #define PPSMC_MSG_QueryActiveWgp   0x48
-#define PPSMC_Message_Count0x49
+#define PPSMC_MSG_SetFastPPTLimit  0x49
+#define PPSMC_MSG_SetSlowPPTLimit  0x4A
+#define PPSMC_MSG_GetFastPPTLimit  0x4B
+#define PPSMC_MSG_GetSlowPPTLimit  0x4C
+#define PPSMC_Message_Count0x4D
 
 //Argument for PPSMC_MSG_GfxDeviceDriverReset
 enum {
-- 
2.17.1

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


[PATCH] drm/amd/pm: add pmfw version check before issuing RlcPowerNotify message

2020-12-16 Thread Xiaomeng Hou
Only pmfw version behind v4.63.23.00 could support this message.

Signed-off-by: Xiaomeng Hou 
---
 drivers/gpu/drm/amd/pm/swsmu/smu11/vangogh_ppt.c | 9 +++--
 1 file changed, 7 insertions(+), 2 deletions(-)

diff --git a/drivers/gpu/drm/amd/pm/swsmu/smu11/vangogh_ppt.c 
b/drivers/gpu/drm/amd/pm/swsmu/smu11/vangogh_ppt.c
index 9bccf2ad038c..8cb4fcee9a2c 100644
--- a/drivers/gpu/drm/amd/pm/swsmu/smu11/vangogh_ppt.c
+++ b/drivers/gpu/drm/amd/pm/swsmu/smu11/vangogh_ppt.c
@@ -724,8 +724,13 @@ static int 
vangogh_set_fine_grain_gfx_freq_parameters(struct smu_context *smu)
 
 static int vangogh_system_features_control(struct smu_context *smu, bool en)
 {
-   return smu_cmn_send_smc_msg_with_param(smu, SMU_MSG_RlcPowerNotify,
-   en ? RLC_STATUS_NORMAL : 
RLC_STATUS_OFF, NULL);
+   struct amdgpu_device *adev = smu->adev;
+
+   if (adev->pm.fw_version >= 0x43f1700)
+   return smu_cmn_send_smc_msg_with_param(smu, 
SMU_MSG_RlcPowerNotify,
+   en ? RLC_STATUS_NORMAL : 
RLC_STATUS_OFF, NULL);
+   else
+   return 0;
 }
 
 static const struct pptable_funcs vangogh_ppt_funcs = {
-- 
2.17.1

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


[PATCH] drm/amdgpu/sdma5.2: soft reset sdma blocks before setup and start sdma

2020-12-10 Thread Xiaomeng Hou
Without doing the soft reset, register mmSDMA0_GFX_RB_WPTR's value could not be
reset to 0 when sdma block resumes. That would cause the ring buffer's read and
write pointers not equal and ring test fail. So add the soft reset step.

Signed-off-by: Xiaomeng Hou 
---
 drivers/gpu/drm/amd/amdgpu/sdma_v5_2.c | 39 +-
 1 file changed, 32 insertions(+), 7 deletions(-)

diff --git a/drivers/gpu/drm/amd/amdgpu/sdma_v5_2.c 
b/drivers/gpu/drm/amd/amdgpu/sdma_v5_2.c
index 39e17aae655f..5acc1e589672 100644
--- a/drivers/gpu/drm/amd/amdgpu/sdma_v5_2.c
+++ b/drivers/gpu/drm/amd/amdgpu/sdma_v5_2.c
@@ -807,6 +807,37 @@ static int sdma_v5_2_load_microcode(struct amdgpu_device 
*adev)
return 0;
 }
 
+static int sdma_v5_2_soft_reset(void *handle)
+{
+   struct amdgpu_device *adev = (struct amdgpu_device *)handle;
+   u32 grbm_soft_reset = 0;
+   u32 tmp;
+   int i;
+
+   for (i = 0; i < adev->sdma.num_instances; i++) {
+   grbm_soft_reset = REG_SET_FIELD(grbm_soft_reset,
+   GRBM_SOFT_RESET, 
SOFT_RESET_SDMA0,
+   1);
+   grbm_soft_reset <<= i;
+
+   tmp = RREG32_SOC15(GC, 0, mmGRBM_SOFT_RESET);
+   tmp |= grbm_soft_reset;
+   DRM_DEBUG("GRBM_SOFT_RESET=0x%08X\n", tmp);
+   WREG32_SOC15(GC, 0, mmGRBM_SOFT_RESET, tmp);
+   tmp = RREG32_SOC15(GC, 0, mmGRBM_SOFT_RESET);
+
+   udelay(50);
+
+   tmp &= ~grbm_soft_reset;
+   WREG32_SOC15(GC, 0, mmGRBM_SOFT_RESET, tmp);
+   tmp = RREG32_SOC15(GC, 0, mmGRBM_SOFT_RESET);
+
+   udelay(50);
+   }
+
+   return 0;
+}
+
 /**
  * sdma_v5_2_start - setup and start the async dma engines
  *
@@ -838,6 +869,7 @@ static int sdma_v5_2_start(struct amdgpu_device *adev)
msleep(1000);
}
 
+   sdma_v5_2_soft_reset(adev);
/* unhalt the MEs */
sdma_v5_2_enable(adev, true);
/* enable sdma ring preemption */
@@ -1366,13 +1398,6 @@ static int sdma_v5_2_wait_for_idle(void *handle)
return -ETIMEDOUT;
 }
 
-static int sdma_v5_2_soft_reset(void *handle)
-{
-   /* todo */
-
-   return 0;
-}
-
 static int sdma_v5_2_ring_preempt_ib(struct amdgpu_ring *ring)
 {
int i, r = 0;
-- 
2.17.1

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


[PATCH v2 2/2] drm/amd/pm: inform SMU RLC status thus enable/disable DPM feature for vangogh

2020-12-09 Thread Xiaomeng Hou
RLC is halted when system suspend/shutdown. However, due to DPM enabled, PMFW is
unaware of RLC being halted and will continue sending messages, which would
eventually cause an ACPI hang. Use the system_feature_control interface to
notify SMU the status of RLC thus enable/disable DPM feature.

Signed-off-by: Xiaomeng Hou 
Change-Id: I2f1a7de23df7315a7b220ba6d0a4bcaa75c93fea
---
 .../gpu/drm/amd/pm/swsmu/smu11/vangogh_ppt.c| 17 -
 .../gpu/drm/amd/pm/swsmu/smu11/vangogh_ppt.h|  4 
 2 files changed, 20 insertions(+), 1 deletion(-)

diff --git a/drivers/gpu/drm/amd/pm/swsmu/smu11/vangogh_ppt.c 
b/drivers/gpu/drm/amd/pm/swsmu/smu11/vangogh_ppt.c
index ddaa6a705fa6..fb16d94b4031 100644
--- a/drivers/gpu/drm/amd/pm/swsmu/smu11/vangogh_ppt.c
+++ b/drivers/gpu/drm/amd/pm/swsmu/smu11/vangogh_ppt.c
@@ -64,7 +64,7 @@ static struct cmn2asic_msg_mapping 
vangogh_message_map[SMU_MSG_MAX_COUNT] = {
MSG_MAP(PowerUpIspByTile,   PPSMC_MSG_PowerUpIspByTile, 
0),
MSG_MAP(PowerDownVcn,   PPSMC_MSG_PowerDownVcn, 
0),
MSG_MAP(PowerUpVcn, PPSMC_MSG_PowerUpVcn,   
0),
-   MSG_MAP(Spare,  PPSMC_MSG_spare,
0),
+   MSG_MAP(RlcPowerNotify, PPSMC_MSG_RlcPowerNotify,   
0),
MSG_MAP(SetHardMinVcn,  PPSMC_MSG_SetHardMinVcn,
0),
MSG_MAP(SetSoftMinGfxclk,   PPSMC_MSG_SetSoftMinGfxclk, 
0),
MSG_MAP(ActiveProcessNotify,PPSMC_MSG_ActiveProcessNotify,  
0),
@@ -722,6 +722,20 @@ static int 
vangogh_set_fine_grain_gfx_freq_parameters(struct smu_context *smu)
return 0;
 }
 
+static int vangogh_system_features_control(struct smu_context *smu, bool en)
+{
+   int ret = 0;
+
+   if (en)
+   ret = smu_cmn_send_smc_msg_with_param(smu, 
SMU_MSG_RlcPowerNotify,
+   
RLC_STATUS_NORMAL, NULL);
+   else
+   ret = smu_cmn_send_smc_msg_with_param(smu, 
SMU_MSG_RlcPowerNotify,
+   RLC_STATUS_OFF, 
NULL);
+
+   return ret;
+}
+
 static const struct pptable_funcs vangogh_ppt_funcs = {
 
.check_fw_status = smu_v11_0_check_fw_status,
@@ -750,6 +764,7 @@ static const struct pptable_funcs vangogh_ppt_funcs = {
.print_clk_levels = vangogh_print_fine_grain_clk,
.set_default_dpm_table = vangogh_set_default_dpm_tables,
.set_fine_grain_gfx_freq_parameters = 
vangogh_set_fine_grain_gfx_freq_parameters,
+   .system_features_control = vangogh_system_features_control,
 };
 
 void vangogh_set_ppt_funcs(struct smu_context *smu)
diff --git a/drivers/gpu/drm/amd/pm/swsmu/smu11/vangogh_ppt.h 
b/drivers/gpu/drm/amd/pm/swsmu/smu11/vangogh_ppt.h
index 8756766296cd..eab455493076 100644
--- a/drivers/gpu/drm/amd/pm/swsmu/smu11/vangogh_ppt.h
+++ b/drivers/gpu/drm/amd/pm/swsmu/smu11/vangogh_ppt.h
@@ -32,4 +32,8 @@ extern void vangogh_set_ppt_funcs(struct smu_context *smu);
 #define VANGOGH_UMD_PSTATE_SOCCLK   678
 #define VANGOGH_UMD_PSTATE_FCLK 800
 
+/* RLC Power Status */
+#define RLC_STATUS_OFF  0
+#define RLC_STATUS_NORMAL   1
+
 #endif
-- 
2.17.1

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


[PATCH v2 1/2] drm/amd/pm: update the smu v11.5 smc header for vangogh

2020-12-09 Thread Xiaomeng Hou
Add new PMFW message to notify RLC engine status.

Signed-off-by: Xiaomeng Hou 
Change-Id: I7d714f8f245835cacb25e7cc4b248ddf183aebc1
---
 drivers/gpu/drm/amd/pm/inc/smu_types.h   | 2 +-
 drivers/gpu/drm/amd/pm/inc/smu_v11_5_ppsmc.h | 2 +-
 2 files changed, 2 insertions(+), 2 deletions(-)

diff --git a/drivers/gpu/drm/amd/pm/inc/smu_types.h 
b/drivers/gpu/drm/amd/pm/inc/smu_types.h
index 4a6d1381df16..41a49c1c0302 100644
--- a/drivers/gpu/drm/amd/pm/inc/smu_types.h
+++ b/drivers/gpu/drm/amd/pm/inc/smu_types.h
@@ -178,7 +178,7 @@
__SMU_DUMMY_MAP(SET_DRIVER_DUMMY_TABLE_DRAM_ADDR_LOW), \
__SMU_DUMMY_MAP(GET_UMC_FW_WA), \
__SMU_DUMMY_MAP(Mode1Reset), \
-   __SMU_DUMMY_MAP(Spare),  \
+   __SMU_DUMMY_MAP(RlcPowerNotify), \
__SMU_DUMMY_MAP(SetHardMinIspiclkByFreq),\
__SMU_DUMMY_MAP(SetHardMinIspxclkByFreq),\
__SMU_DUMMY_MAP(SetSoftMinSocclkByFreq), \
diff --git a/drivers/gpu/drm/amd/pm/inc/smu_v11_5_ppsmc.h 
b/drivers/gpu/drm/amd/pm/inc/smu_v11_5_ppsmc.h
index 7e69b3bd311b..55d7892e4e0e 100644
--- a/drivers/gpu/drm/amd/pm/inc/smu_v11_5_ppsmc.h
+++ b/drivers/gpu/drm/amd/pm/inc/smu_v11_5_ppsmc.h
@@ -41,7 +41,7 @@
 #define PPSMC_MSG_PowerUpIspByTile 0x7
 #define PPSMC_MSG_PowerDownVcn 0x8 // VCN is power 
gated by default
 #define PPSMC_MSG_PowerUpVcn   0x9
-#define PPSMC_MSG_spare0xA
+#define PPSMC_MSG_RlcPowerNotify   0xA
 #define PPSMC_MSG_SetHardMinVcn0xB // For wireless 
display
 #define PPSMC_MSG_SetSoftMinGfxclk 0xC //Sets SoftMin for 
GFXCLK. Arg is in MHz
 #define PPSMC_MSG_ActiveProcessNotify  0xD
-- 
2.17.1

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


[PATCH 3/3] drm/amdgpu/pm: inform PMFW rlc status before start/stop rlc for vangogh

2020-12-08 Thread Xiaomeng Hou
RLC is halted when system suspend/shutdown. However, due to DPM enabled, PMFM is
unaware of RLC being halted and will continue sending messages, which would
eventually caused ACPI related hang. So send message to inform PMFM the rlc
status before start/stop rlc.

Signed-off-by: Xiaomeng Hou 
Change-Id: I7b1a04f6e249ac6753109079ecb3019c99161d9f
---
 drivers/gpu/drm/amd/pm/swsmu/amdgpu_smu.c | 16 
 1 file changed, 16 insertions(+)

diff --git a/drivers/gpu/drm/amd/pm/swsmu/amdgpu_smu.c 
b/drivers/gpu/drm/amd/pm/swsmu/amdgpu_smu.c
index cf999b7a2164..42a32c0e5bab 100644
--- a/drivers/gpu/drm/amd/pm/swsmu/amdgpu_smu.c
+++ b/drivers/gpu/drm/amd/pm/swsmu/amdgpu_smu.c
@@ -920,6 +920,14 @@ static int smu_smc_hw_setup(struct smu_context *smu)
uint32_t pcie_gen = 0, pcie_width = 0;
int ret = 0;
 
+   if (adev->in_suspend && smu->is_apu) {
+   ret = smu_notify_rlc_status(smu, 1);
+   if (ret) {
+   dev_info(adev->dev, "Failed to notify rlc status!\n");
+   return ret;
+   }
+   }
+
if (adev->in_suspend && smu_is_dpm_running(smu)) {
dev_info(adev->dev, "dpm has been enabled\n");
/* this is needed specifically */
@@ -1213,6 +1221,14 @@ static int smu_disable_dpms(struct smu_context *smu)
dev_err(adev->dev, "Failed to disable smu features.\n");
}
 
+   if (smu->is_apu) {
+   ret = smu_notify_rlc_status(smu, 0);
+   if (ret) {
+   dev_info(adev->dev, "Failed to notify rlc status!\n");
+   return ret;
+   }
+   }
+
if (adev->asic_type >= CHIP_NAVI10 &&
adev->gfx.rlc.funcs->stop)
adev->gfx.rlc.funcs->stop(adev);
-- 
2.17.1

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


[PATCH 2/3] drm/amd/pm: add interface to notify RLC status for vangogh

2020-12-08 Thread Xiaomeng Hou
Add this interface to notify PMFW the status (Normal/Off) of RLC engine.

Before notify RLC status normal, need check its current status first. Send the
message only when current status is still off.

Signed-off-by: Xiaomeng Hou 
Change-Id: I2f1a7de23df7315a7b220ba6d0a4bcaa75c93fea
---
 drivers/gpu/drm/amd/pm/inc/amdgpu_smu.h   |  1 +
 .../gpu/drm/amd/pm/swsmu/smu11/vangogh_ppt.c  | 24 ++-
 .../gpu/drm/amd/pm/swsmu/smu11/vangogh_ppt.h  |  4 
 drivers/gpu/drm/amd/pm/swsmu/smu_cmn.c| 13 ++
 drivers/gpu/drm/amd/pm/swsmu/smu_cmn.h|  2 ++
 drivers/gpu/drm/amd/pm/swsmu/smu_internal.h   |  1 +
 6 files changed, 44 insertions(+), 1 deletion(-)

diff --git a/drivers/gpu/drm/amd/pm/inc/amdgpu_smu.h 
b/drivers/gpu/drm/amd/pm/inc/amdgpu_smu.h
index 89be49a43500..0da00a92b478 100644
--- a/drivers/gpu/drm/amd/pm/inc/amdgpu_smu.h
+++ b/drivers/gpu/drm/amd/pm/inc/amdgpu_smu.h
@@ -583,6 +583,7 @@ struct pptable_funcs {
int (*gpo_control)(struct smu_context *smu, bool enablement);
int (*gfx_state_change_set)(struct smu_context *smu, uint32_t state);
int (*set_fine_grain_gfx_freq_parameters)(struct smu_context *smu);
+   int (*notify_rlc_status)(struct smu_context *smu, uint32_t status);
 };
 
 typedef enum {
diff --git a/drivers/gpu/drm/amd/pm/swsmu/smu11/vangogh_ppt.c 
b/drivers/gpu/drm/amd/pm/swsmu/smu11/vangogh_ppt.c
index ddaa6a705fa6..03c2cd7a52a9 100644
--- a/drivers/gpu/drm/amd/pm/swsmu/smu11/vangogh_ppt.c
+++ b/drivers/gpu/drm/amd/pm/swsmu/smu11/vangogh_ppt.c
@@ -64,7 +64,7 @@ static struct cmn2asic_msg_mapping 
vangogh_message_map[SMU_MSG_MAX_COUNT] = {
MSG_MAP(PowerUpIspByTile,   PPSMC_MSG_PowerUpIspByTile, 
0),
MSG_MAP(PowerDownVcn,   PPSMC_MSG_PowerDownVcn, 
0),
MSG_MAP(PowerUpVcn, PPSMC_MSG_PowerUpVcn,   
0),
-   MSG_MAP(Spare,  PPSMC_MSG_spare,
0),
+   MSG_MAP(RlcPowerNotify, PPSMC_MSG_RlcPowerNotify,   
0),
MSG_MAP(SetHardMinVcn,  PPSMC_MSG_SetHardMinVcn,
0),
MSG_MAP(SetSoftMinGfxclk,   PPSMC_MSG_SetSoftMinGfxclk, 
0),
MSG_MAP(ActiveProcessNotify,PPSMC_MSG_ActiveProcessNotify,  
0),
@@ -722,6 +722,27 @@ static int 
vangogh_set_fine_grain_gfx_freq_parameters(struct smu_context *smu)
return 0;
 }
 
+static int vangogh_notify_rlc_status(struct smu_context *smu, uint32_t status)
+{
+   int ret = 0;
+
+   switch (status)
+   {
+   case RLC_STATUS_OFF:
+   ret = smu_cmn_send_smc_msg_with_param(smu, 
SMU_MSG_RlcPowerNotify, status, NULL);
+   break;
+   case RLC_STATUS_NORMAL:
+   if (smu_cmn_get_rlc_status(smu) == 0)
+   ret = smu_cmn_send_smc_msg_with_param(smu, 
SMU_MSG_RlcPowerNotify, status, NULL);
+   break;
+   default:
+   dev_err(smu->adev->dev, "Unknown rlc status\n");
+   return -EINVAL;
+   }
+
+   return ret;
+}
+
 static const struct pptable_funcs vangogh_ppt_funcs = {
 
.check_fw_status = smu_v11_0_check_fw_status,
@@ -750,6 +771,7 @@ static const struct pptable_funcs vangogh_ppt_funcs = {
.print_clk_levels = vangogh_print_fine_grain_clk,
.set_default_dpm_table = vangogh_set_default_dpm_tables,
.set_fine_grain_gfx_freq_parameters = 
vangogh_set_fine_grain_gfx_freq_parameters,
+   .notify_rlc_status = vangogh_notify_rlc_status,
 };
 
 void vangogh_set_ppt_funcs(struct smu_context *smu)
diff --git a/drivers/gpu/drm/amd/pm/swsmu/smu11/vangogh_ppt.h 
b/drivers/gpu/drm/amd/pm/swsmu/smu11/vangogh_ppt.h
index 8756766296cd..eab455493076 100644
--- a/drivers/gpu/drm/amd/pm/swsmu/smu11/vangogh_ppt.h
+++ b/drivers/gpu/drm/amd/pm/swsmu/smu11/vangogh_ppt.h
@@ -32,4 +32,8 @@ extern void vangogh_set_ppt_funcs(struct smu_context *smu);
 #define VANGOGH_UMD_PSTATE_SOCCLK   678
 #define VANGOGH_UMD_PSTATE_FCLK 800
 
+/* RLC Power Status */
+#define RLC_STATUS_OFF  0
+#define RLC_STATUS_NORMAL   1
+
 #endif
diff --git a/drivers/gpu/drm/amd/pm/swsmu/smu_cmn.c 
b/drivers/gpu/drm/amd/pm/swsmu/smu_cmn.c
index f8260769061c..2f3e66b03dd2 100644
--- a/drivers/gpu/drm/amd/pm/swsmu/smu_cmn.c
+++ b/drivers/gpu/drm/amd/pm/swsmu/smu_cmn.c
@@ -42,6 +42,9 @@
  * They share the same definitions and values. That makes common
  * APIs for SMC messages issuing for all ASICs possible.
  */
+#define mmMP1_SMN_C2PMSG_63
0x027f
+#define mmMP1_SMN_C2PMSG_63_BASE_IDX   
0
+
 #define mmMP1_SMN_C2PMSG_66
0x0282
 #define mmMP1_SMN_C2

[PATCH 1/3] drm/amd/pm: update the smu v11.5 smc header for vangogh

2020-12-08 Thread Xiaomeng Hou
Add new PMFW message to notify RLC engine status.

Signed-off-by: Xiaomeng Hou 
Change-Id: I7d714f8f245835cacb25e7cc4b248ddf183aebc1
---
 drivers/gpu/drm/amd/pm/inc/smu_types.h   | 2 +-
 drivers/gpu/drm/amd/pm/inc/smu_v11_5_ppsmc.h | 2 +-
 2 files changed, 2 insertions(+), 2 deletions(-)

diff --git a/drivers/gpu/drm/amd/pm/inc/smu_types.h 
b/drivers/gpu/drm/amd/pm/inc/smu_types.h
index 4a6d1381df16..41a49c1c0302 100644
--- a/drivers/gpu/drm/amd/pm/inc/smu_types.h
+++ b/drivers/gpu/drm/amd/pm/inc/smu_types.h
@@ -178,7 +178,7 @@
__SMU_DUMMY_MAP(SET_DRIVER_DUMMY_TABLE_DRAM_ADDR_LOW), \
__SMU_DUMMY_MAP(GET_UMC_FW_WA), \
__SMU_DUMMY_MAP(Mode1Reset), \
-   __SMU_DUMMY_MAP(Spare),  \
+   __SMU_DUMMY_MAP(RlcPowerNotify), \
__SMU_DUMMY_MAP(SetHardMinIspiclkByFreq),\
__SMU_DUMMY_MAP(SetHardMinIspxclkByFreq),\
__SMU_DUMMY_MAP(SetSoftMinSocclkByFreq), \
diff --git a/drivers/gpu/drm/amd/pm/inc/smu_v11_5_ppsmc.h 
b/drivers/gpu/drm/amd/pm/inc/smu_v11_5_ppsmc.h
index 7e69b3bd311b..55d7892e4e0e 100644
--- a/drivers/gpu/drm/amd/pm/inc/smu_v11_5_ppsmc.h
+++ b/drivers/gpu/drm/amd/pm/inc/smu_v11_5_ppsmc.h
@@ -41,7 +41,7 @@
 #define PPSMC_MSG_PowerUpIspByTile 0x7
 #define PPSMC_MSG_PowerDownVcn 0x8 // VCN is power 
gated by default
 #define PPSMC_MSG_PowerUpVcn   0x9
-#define PPSMC_MSG_spare0xA
+#define PPSMC_MSG_RlcPowerNotify   0xA
 #define PPSMC_MSG_SetHardMinVcn0xB // For wireless 
display
 #define PPSMC_MSG_SetSoftMinGfxclk 0xC //Sets SoftMin for 
GFXCLK. Arg is in MHz
 #define PPSMC_MSG_ActiveProcessNotify  0xD
-- 
2.17.1

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


[PATCH] Revert "drm/amdgpu: IP discovery table is not ready yet for VG"

2020-10-23 Thread Xiaomeng Hou
This reverts commit ba502322c9f216552485cea967aeb8adbaf03a02.

IP discovery table has been verified on vangogh.

Signed-off-by: Xiaomeng Hou 
---
 drivers/gpu/drm/amd/amdgpu/nv.c | 4 
 1 file changed, 4 deletions(-)

diff --git a/drivers/gpu/drm/amd/amdgpu/nv.c b/drivers/gpu/drm/amd/amdgpu/nv.c
index 72435e0eb8b9..30ec826c8760 100644
--- a/drivers/gpu/drm/amd/amdgpu/nv.c
+++ b/drivers/gpu/drm/amd/amdgpu/nv.c
@@ -449,10 +449,6 @@ static int nv_reg_base_init(struct amdgpu_device *adev)
 {
int r;
 
-   /* IP discovery table is not available yet */
-   if (adev->asic_type == CHIP_VANGOGH)
-   goto legacy_init;
-
if (amdgpu_discovery) {
r = amdgpu_discovery_reg_base_init(adev);
if (r) {
-- 
2.17.1

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


[PATCH 4/4] drm/amd/powerplay: correct the value retrieved through GPU_LOAD sensor interface

2019-12-05 Thread Xiaomeng Hou
the unit of variable AverageGfxActivity defined in smu12 metrics
struct is centi, so the retrieved value should be divided by 100 before
return.

Change-Id: Ia7873597977cb5479b015d632ab24a7aa20a1cfb
Signed-off-by: Xiaomeng Hou 
---
 drivers/gpu/drm/amd/powerplay/renoir_ppt.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/drivers/gpu/drm/amd/powerplay/renoir_ppt.c 
b/drivers/gpu/drm/amd/powerplay/renoir_ppt.c
index 1e6b79cff23c..8fe8fefcbbbf 100644
--- a/drivers/gpu/drm/amd/powerplay/renoir_ppt.c
+++ b/drivers/gpu/drm/amd/powerplay/renoir_ppt.c
@@ -509,7 +509,7 @@ static int renoir_get_current_activity_percent(struct 
smu_context *smu,
 
switch (sensor) {
case AMDGPU_PP_SENSOR_GPU_LOAD:
-   *value = metrics.AverageGfxActivity;
+   *value = metrics.AverageGfxActivity / 100;
break;
default:
pr_err("Invalid sensor for retrieving clock activity\n");
-- 
2.24.0

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

[PATCH 3/4] drm/amd/powerplay: implement the get_enabled_mask callback for smu12

2019-12-05 Thread Xiaomeng Hou
implement sensor interface of feature mask for debugfs.

Change-Id: Ia085aab4c82b978e1e8c8ddc3ca6278b9dec8005
Signed-off-by: Xiaomeng Hou 
---
 drivers/gpu/drm/amd/powerplay/inc/smu_v12_0.h |  3 ++
 drivers/gpu/drm/amd/powerplay/renoir_ppt.c|  1 +
 drivers/gpu/drm/amd/powerplay/smu_v12_0.c | 29 +++
 3 files changed, 33 insertions(+)

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 8b4069c8e668..1e58eefea77b 100644
--- a/drivers/gpu/drm/amd/powerplay/inc/smu_v12_0.h
+++ b/drivers/gpu/drm/amd/powerplay/inc/smu_v12_0.h
@@ -76,6 +76,9 @@ int smu_v12_0_fini_smc_tables(struct smu_context *smu);
 
 int smu_v12_0_populate_smc_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_current_clk_freq(struct smu_context *smu,
  enum smu_clk_type clk_id,
  uint32_t *value);
diff --git a/drivers/gpu/drm/amd/powerplay/renoir_ppt.c 
b/drivers/gpu/drm/amd/powerplay/renoir_ppt.c
index 1c26d7798146..1e6b79cff23c 100644
--- a/drivers/gpu/drm/amd/powerplay/renoir_ppt.c
+++ b/drivers/gpu/drm/amd/powerplay/renoir_ppt.c
@@ -899,6 +899,7 @@ static const struct pptable_funcs renoir_ppt_funcs = {
.init_smc_tables = smu_v12_0_init_smc_tables,
.fini_smc_tables = smu_v12_0_fini_smc_tables,
.populate_smc_tables = smu_v12_0_populate_smc_tables,
+   .get_enabled_mask = smu_v12_0_get_enabled_mask,
.get_current_clk_freq = smu_v12_0_get_current_clk_freq,
.get_dpm_ultimate_freq = smu_v12_0_get_dpm_ultimate_freq,
.mode2_reset = smu_v12_0_mode2_reset,
diff --git a/drivers/gpu/drm/amd/powerplay/smu_v12_0.c 
b/drivers/gpu/drm/amd/powerplay/smu_v12_0.c
index 9022e60ac9dc..f6993c470fd2 100644
--- a/drivers/gpu/drm/amd/powerplay/smu_v12_0.c
+++ b/drivers/gpu/drm/amd/powerplay/smu_v12_0.c
@@ -354,6 +354,35 @@ int smu_v12_0_populate_smc_tables(struct smu_context *smu)
return smu_update_table(smu, SMU_TABLE_DPMCLOCKS, 0, 
smu_table->clocks_table, false);
 }
 
+int smu_v12_0_get_enabled_mask(struct smu_context *smu,
+ uint32_t *feature_mask, uint32_t num)
+{
+   uint32_t feature_mask_high = 0, feature_mask_low = 0;
+   int ret = 0;
+
+   if (!feature_mask || num < 2)
+   return -EINVAL;
+
+   ret = smu_send_smc_msg(smu, SMU_MSG_GetEnabledSmuFeaturesHigh);
+   if (ret)
+   return ret;
+   ret = smu_read_smc_arg(smu, _mask_high);
+   if (ret)
+   return ret;
+
+   ret = smu_send_smc_msg(smu, SMU_MSG_GetEnabledSmuFeaturesLow);
+   if (ret)
+   return ret;
+   ret = smu_read_smc_arg(smu, _mask_low);
+   if (ret)
+   return ret;
+
+   feature_mask[0] = feature_mask_low;
+   feature_mask[1] = feature_mask_high;
+
+   return ret;
+}
+
 int smu_v12_0_get_current_clk_freq(struct smu_context *smu,
  enum smu_clk_type clk_id,
  uint32_t *value)
-- 
2.24.0

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

[PATCH 2/4] drm/amd/powerplay: implement interface to retrieve clock freq for renoir

2019-12-05 Thread Xiaomeng Hou
implement smu12 get_clk_freq interface to get clock frequency like
MCLK/SCLK.

Change-Id: I2481d649811c15cd2d8e2741242b2928a32413fc
Signed-off-by: Xiaomeng Hou 
---
 drivers/gpu/drm/amd/powerplay/inc/smu_v12_0.h |  4 ++
 drivers/gpu/drm/amd/powerplay/renoir_ppt.c| 49 +++
 drivers/gpu/drm/amd/powerplay/smu_v12_0.c | 20 
 3 files changed, 73 insertions(+)

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 44c65dd8850d..8b4069c8e668 100644
--- a/drivers/gpu/drm/amd/powerplay/inc/smu_v12_0.h
+++ b/drivers/gpu/drm/amd/powerplay/inc/smu_v12_0.h
@@ -76,6 +76,10 @@ int smu_v12_0_fini_smc_tables(struct smu_context *smu);
 
 int smu_v12_0_populate_smc_tables(struct smu_context *smu);
 
+int smu_v12_0_get_current_clk_freq(struct smu_context *smu,
+ enum smu_clk_type clk_id,
+ uint32_t *value);
+
 int smu_v12_0_get_dpm_ultimate_freq(struct smu_context *smu, enum smu_clk_type 
clk_type,
 uint32_t *min, uint32_t *max);
 
diff --git a/drivers/gpu/drm/amd/powerplay/renoir_ppt.c 
b/drivers/gpu/drm/amd/powerplay/renoir_ppt.c
index 3f6f0ebf1fbe..1c26d7798146 100644
--- a/drivers/gpu/drm/amd/powerplay/renoir_ppt.c
+++ b/drivers/gpu/drm/amd/powerplay/renoir_ppt.c
@@ -31,6 +31,9 @@
 #include "renoir_ppt.h"
 
 
+#define CLK_MAP(clk, index) \
+   [SMU_##clk] = {1, (index)}
+
 #define MSG_MAP(msg, index) \
[SMU_MSG_##msg] = {1, (index)}
 
@@ -104,6 +107,14 @@ static struct smu_12_0_cmn2aisc_mapping 
renoir_message_map[SMU_MSG_MAX_COUNT] =
MSG_MAP(SetHardMinFclkByFreq,   PPSMC_MSG_SetHardMinFclkByFreq),
 };
 
+static struct smu_12_0_cmn2aisc_mapping renoir_clk_map[SMU_CLK_COUNT] = {
+   CLK_MAP(GFXCLK, CLOCK_GFXCLK),
+   CLK_MAP(SCLK,   CLOCK_GFXCLK),
+   CLK_MAP(SOCCLK, CLOCK_SOCCLK),
+   CLK_MAP(UCLK, CLOCK_UMCCLK),
+   CLK_MAP(MCLK, CLOCK_UMCCLK),
+};
+
 static struct smu_12_0_cmn2aisc_mapping renoir_table_map[SMU_TABLE_COUNT] = {
TAB_MAP_VALID(WATERMARKS),
TAB_MAP_INVALID(CUSTOM_DPM),
@@ -125,6 +136,21 @@ static int renoir_get_smu_msg_index(struct smu_context 
*smc, uint32_t index)
return mapping.map_to;
 }
 
+static int renoir_get_smu_clk_index(struct smu_context *smc, uint32_t index)
+{
+   struct smu_12_0_cmn2aisc_mapping mapping;
+
+   if (index >= SMU_CLK_COUNT)
+   return -EINVAL;
+
+   mapping = renoir_clk_map[index];
+   if (!(mapping.valid_mapping)) {
+   return -EINVAL;
+   }
+
+   return mapping.map_to;
+}
+
 static int renoir_get_smu_table_index(struct smu_context *smc, uint32_t index)
 {
struct smu_12_0_cmn2aisc_mapping mapping;
@@ -352,6 +378,26 @@ static int renoir_dpm_set_jpeg_enable(struct smu_context 
*smu, bool enable)
return ret;
 }
 
+static int renoir_get_current_clk_freq_by_table(struct smu_context *smu,
+  enum smu_clk_type clk_type,
+  uint32_t *value)
+{
+   int ret = 0, clk_id = 0;
+   SmuMetrics_t metrics;
+
+   ret = renoir_get_metrics_table(smu, );
+   if (ret)
+   return ret;
+
+   clk_id = smu_clk_get_index(smu, clk_type);
+   if (clk_id < 0)
+   return clk_id;
+
+   *value = metrics.ClockFrequency[clk_id];
+
+   return ret;
+}
+
 static int renoir_force_dpm_limit_value(struct smu_context *smu, bool highest)
 {
int ret = 0, i = 0;
@@ -819,6 +865,7 @@ static int renoir_read_sensor(struct smu_context *smu,
 
 static const struct pptable_funcs renoir_ppt_funcs = {
.get_smu_msg_index = renoir_get_smu_msg_index,
+   .get_smu_clk_index = renoir_get_smu_clk_index,
.get_smu_table_index = renoir_get_smu_table_index,
.tables_init = renoir_tables_init,
.set_power_state = NULL,
@@ -827,6 +874,7 @@ static const struct pptable_funcs renoir_ppt_funcs = {
.get_current_power_state = renoir_get_current_power_state,
.dpm_set_uvd_enable = renoir_dpm_set_uvd_enable,
.dpm_set_jpeg_enable = renoir_dpm_set_jpeg_enable,
+   .get_current_clk_freq_by_table = renoir_get_current_clk_freq_by_table,
.force_dpm_limit_value = renoir_force_dpm_limit_value,
.unforce_dpm_levels = renoir_unforce_dpm_levels,
.get_workload_type = renoir_get_workload_type,
@@ -851,6 +899,7 @@ static const struct pptable_funcs renoir_ppt_funcs = {
.init_smc_tables = smu_v12_0_init_smc_tables,
.fini_smc_tables = smu_v12_0_fini_smc_tables,
.populate_smc_tables = smu_v12_0_populate_smc_tables,
+   .get_current_clk_freq = smu_v12_0_get_current_clk_freq,
.get_dpm_ultimate_freq = smu_v12_0_get_dpm_ultimate_freq,
.mode2_reset = smu_v12_0_mode2_reset,
.set_soft_freq_limited_range = smu_v12_0_set_soft_freq_limited_r

[PATCH 1/4] drm/amd/powerplay: implement interface to retrieve gpu temperature for renoir

2019-12-05 Thread Xiaomeng Hou
add sensor interface of get gpu temperature for debugfs.

Change-Id: I2499b6652fad6d5d776b6ed4cd5157636583ed39
Signed-off-by: Xiaomeng Hou 
---
 drivers/gpu/drm/amd/powerplay/renoir_ppt.c | 22 ++
 1 file changed, 22 insertions(+)

diff --git a/drivers/gpu/drm/amd/powerplay/renoir_ppt.c 
b/drivers/gpu/drm/amd/powerplay/renoir_ppt.c
index 3788047bd704..3f6f0ebf1fbe 100644
--- a/drivers/gpu/drm/amd/powerplay/renoir_ppt.c
+++ b/drivers/gpu/drm/amd/powerplay/renoir_ppt.c
@@ -429,6 +429,24 @@ static int renoir_get_gpu_power(struct smu_context *smu, 
uint32_t *value)
return 0;
 }
 
+static int renoir_get_gpu_temperature(struct smu_context *smu, uint32_t *value)
+{
+   int ret = 0;
+   SmuMetrics_t metrics;
+
+   if (!value)
+   return -EINVAL;
+
+   ret = renoir_get_metrics_table(smu, );
+   if (ret)
+   return ret;
+
+   *value = (metrics.GfxTemperature / 100) *
+   SMU_TEMPERATURE_UNITS_PER_CENTIGRADES;
+
+   return 0;
+}
+
 static int renoir_get_current_activity_percent(struct smu_context *smu,
   enum amd_pp_sensors sensor,
   uint32_t *value)
@@ -787,6 +805,10 @@ static int renoir_read_sensor(struct smu_context *smu,
ret = renoir_get_gpu_power(smu, (uint32_t *)data);
*size = 4;
break;
+   case AMDGPU_PP_SENSOR_GPU_TEMP:
+   ret = renoir_get_gpu_temperature(smu, (uint32_t *)data);
+   *size = 4;
+   break;
default:
ret = smu_v12_0_read_sensor(smu, sensor, data, size);
}
-- 
2.24.0

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