aboutsummaryrefslogtreecommitdiffstats
path: root/common/recipes-kernel/linux/files/0538-drm-amd-dal-Add-PPLib-interfaces-to-get-Static-Clock.patch
blob: af73cfdc6b44c6f380b0bf02057b9c151165079e (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
From d94eb061338a573c1303a95fcc51d45162f20c90 Mon Sep 17 00:00:00 2001
From: David Rokhvarg <David.Rokhvarg@amd.com>
Date: Mon, 30 Nov 2015 14:42:51 -0500
Subject: [PATCH 0538/1110] drm/amd/dal: Add PPLib interfaces to get Static
 Clocks and Clocks-by-level.

Signed-off-by: David Rokhvarg <David.Rokhvarg@amd.com>
Signed-off-by: Harry Wentland <harry.wentland@amd.com>
Acked-by: Harry Wentland <harry.wentland@amd.com>
---
 .../drm/amd/dal/amdgpu_dm/amdgpu_dal_services.c    | 54 ++++++++++++++-----
 drivers/gpu/drm/amd/dal/dc/dc_services.h           | 60 ++++++++++++++++++++--
 2 files changed, 98 insertions(+), 16 deletions(-)

diff --git a/drivers/gpu/drm/amd/dal/amdgpu_dm/amdgpu_dal_services.c b/drivers/gpu/drm/amd/dal/amdgpu_dm/amdgpu_dal_services.c
index a497093..ba54282 100644
--- a/drivers/gpu/drm/amd/dal/amdgpu_dm/amdgpu_dal_services.c
+++ b/drivers/gpu/drm/amd/dal/amdgpu_dm/amdgpu_dal_services.c
@@ -147,17 +147,20 @@ bool dal_get_platform_info(struct dc_context *ctx,
 	return false;
 }
 
-/* Next calls are to power component */
-bool dc_service_pp_pre_dce_clock_change(struct dc_context *ctx,
-				struct dal_to_power_info *input,
-				struct power_to_dal_info *output)
+/**** power component interfaces ****/
+
+bool dc_service_pp_pre_dce_clock_change(
+		struct dc_context *ctx,
+		struct dal_to_power_info *input,
+		struct power_to_dal_info *output)
 {
 	/*TODO*/
 	return false;
 }
 
-bool dc_service_pp_post_dce_clock_change(struct dc_context *ctx,
-	const struct dc_pp_display_configuration *pp_display_cfg)
+bool dc_service_pp_post_dce_clock_change(
+		struct dc_context *ctx,
+		const struct dc_pp_display_configuration *pp_display_cfg)
 {
 #ifdef CONFIG_DRM_AMD_POWERPLAY
 	struct amdgpu_device *adev = ctx->driver_context;
@@ -179,6 +182,11 @@ bool dc_service_pp_post_dce_clock_change(struct dc_context *ctx,
 		adev->pm.pm_display_cfg.nb_pstate_switch_disable =
 			pp_display_cfg->nb_pstate_switch_disable;
 
+		/* TODO: complete implementation of
+		 * amd_powerplay_display_configuration_change().
+		 * Follow example of:
+		 * PHM_StoreDALConfigurationData - powerplay\hwmgr\hardwaremanager.c
+		 * PP_IRI_DisplayConfigurationChange - powerplay\eventmgr\iri.c */
 		amd_powerplay_display_configuration_change(
 				adev->powerplay.pp_handle,
 				&adev->pm.pm_display_cfg);
@@ -192,8 +200,9 @@ bool dc_service_pp_post_dce_clock_change(struct dc_context *ctx,
 #endif
 }
 
-bool dc_service_get_system_clocks_range(struct dc_context *ctx,
-				struct dal_system_clock_range *sys_clks)
+bool dc_service_get_system_clocks_range(
+		struct dc_context *ctx,
+		struct dal_system_clock_range *sys_clks)
 {
 	struct amdgpu_device *adev = ctx->driver_context;
 
@@ -218,14 +227,35 @@ bool dc_service_get_system_clocks_range(struct dc_context *ctx,
 }
 
 
-bool dc_service_pp_set_display_clock(struct dc_context *ctx,
-			     struct dal_to_power_dclk *dclk)
+bool dc_service_get_clock_levels_by_type(
+		struct dc_context *ctx,
+		enum dc_pp_clock_type clk_type,
+		struct dc_pp_clock_levels *clk_level_info)
 {
-	/* TODO: need power component to provide appropriate interface */
+	/* TODO: follow implementation of:
+	 * PhwCz_GetClocksByType - powerplay\hwmgr\cz_hwmgr.c
+	 * PHM_GetClockByType - powerplay\hwmgr\hardwaremanager.c
+	 * PP_IRI_GetClockByType - powerplay\eventmgr\iri.c */
+
+	DRM_INFO("%s - not implemented\n", __func__);
 	return false;
 }
 
-/* end of calls to power component */
+bool dc_service_get_static_clocks(
+	struct dc_context *ctx,
+	struct dc_pp_static_clock_info *static_clk_info)
+{
+	/* TODO: follow implementation of:
+	 * PhwCz_GetDALPowerLevel - powerplay\hwmgr\cz_hwmgr.c
+	 * PHM_GetDALPowerLevel - powerplay\hwmgr\hardwaremanager.c
+	 * PP_IRI_GetStaticClocksInfo - powerplay\eventmgr\iri.c */
+
+	DRM_INFO("%s - not implemented\n", __func__);
+	return false;
+}
+
+/**** end of power component interfaces ****/
+
 
 /* Calls to notification */
 
diff --git a/drivers/gpu/drm/amd/dal/dc/dc_services.h b/drivers/gpu/drm/amd/dal/dc/dc_services.h
index f430864..6290885 100644
--- a/drivers/gpu/drm/amd/dal/dc/dc_services.h
+++ b/drivers/gpu/drm/amd/dal/dc/dc_services.h
@@ -64,7 +64,7 @@ void dc_service_unregister_interrupt(
 	irq_handler_idx handler_idx);
 
 /**************************************
- * Calls to Power Play (PP) component
+ * Power Play (PP) interfaces
  **************************************/
 
 /* DAL calls this function to notify PP about clocks it needs for the Mode Set.
@@ -95,6 +95,47 @@ struct dc_pp_display_configuration {
 	uint32_t cpu_pstate_separation_time;
 };
 
+enum dc_pp_clock_type {
+	DC_PP_CLOCK_TYPE_DISPLAY_CLK = 1,
+	DC_PP_CLOCK_TYPE_ENGINE_CLK,
+	DC_PP_CLOCK_TYPE_MEMORY_CLK
+};
+
+#define DC_PP_MAX_CLOCK_LEVELS 8
+
+struct dc_pp_clock_levels {
+	enum dc_pp_clock_type clock_type;
+	uint32_t num_levels;
+	uint32_t clocks_in_hz[DC_PP_MAX_CLOCK_LEVELS];
+};
+
+enum dc_pp_clocks_state {
+	DC_PP_CLOCKS_STATE_INVALID = 0,
+	DC_PP_CLOCKS_STATE_ULTRA_LOW,
+	DC_PP_CLOCKS_STATE_LOW,
+	DC_PP_CLOCKS_STATE_NOMINAL,
+	DC_PP_CLOCKS_STATE_PERFORMANCE,
+
+	/* Starting from DCE11, Max 8 levels of DPM state supported. */
+	DC_PP_CLOCKS_DPM_STATE_LEVEL_INVALID = DC_PP_CLOCKS_STATE_INVALID,
+	DC_PP_CLOCKS_DPM_STATE_LEVEL_0 = DC_PP_CLOCKS_STATE_ULTRA_LOW,
+	DC_PP_CLOCKS_DPM_STATE_LEVEL_1 = DC_PP_CLOCKS_STATE_LOW,
+	DC_PP_CLOCKS_DPM_STATE_LEVEL_2 = DC_PP_CLOCKS_STATE_NOMINAL,
+	/* to be backward compatible */
+	DC_PP_CLOCKS_DPM_STATE_LEVEL_3 = DC_PP_CLOCKS_STATE_PERFORMANCE,
+	DC_PP_CLOCKS_DPM_STATE_LEVEL_4 = DC_PP_CLOCKS_DPM_STATE_LEVEL_3 + 1,
+	DC_PP_CLOCKS_DPM_STATE_LEVEL_5 = DC_PP_CLOCKS_DPM_STATE_LEVEL_4 + 1,
+	DC_PP_CLOCKS_DPM_STATE_LEVEL_6 = DC_PP_CLOCKS_DPM_STATE_LEVEL_5 + 1,
+	DC_PP_CLOCKS_DPM_STATE_LEVEL_7 = DC_PP_CLOCKS_DPM_STATE_LEVEL_6 + 1,
+};
+
+struct dc_pp_static_clock_info {
+	uint32_t max_engine_clock_hz;
+	uint32_t max_memory_clock_hz;
+	 /* max possible display block clocks state */
+	enum dc_pp_clocks_state max_clocks_state;
+};
+
 /* DAL calls this function to notify PP about completion of Mode Set.
  * For PP it means that current DCE clocks are those which were returned
  * by dc_service_pp_pre_dce_clock_change(), in the 'output' parameter.
@@ -120,10 +161,21 @@ bool dc_service_get_system_clocks_range(
 	struct dc_context *ctx,
 	struct dal_system_clock_range *sys_clks);
 
-/* for future use */
-bool dc_service_pp_set_display_clock(
+
+bool dc_service_get_clock_levels_by_type(
 	struct dc_context *ctx,
-	struct dal_to_power_dclk *dclk);
+	enum dc_pp_clock_type clk_type,
+	struct dc_pp_clock_levels *clk_level_info);
+
+/* Use this for mode validation.
+ * TODO: when this interface is implemented on Linux, should we remove
+ * dc_service_get_system_clocks_range() ?? */
+bool dc_service_get_static_clocks(
+	struct dc_context *ctx,
+	struct dc_pp_static_clock_info *static_clk_info);
+
+
+/****** end of PP interfaces ******/
 
 void dc_service_sleep_in_milliseconds(struct dc_context *ctx, uint32_t milliseconds);
 
-- 
2.7.4