@@ -103,17 +103,45 @@ bool a6xx_gmu_gx_is_on(struct a6xx_gmu *gmu)
103
103
A6XX_GMU_SPTPRAC_PWR_CLK_STATUS_GX_HM_CLK_OFF ));
104
104
}
105
105
106
- static void __a6xx_gmu_set_freq (struct a6xx_gmu * gmu , int index )
106
+ void a6xx_gmu_set_freq (struct msm_gpu * gpu , struct dev_pm_opp * opp )
107
107
{
108
- struct a6xx_gpu * a6xx_gpu = container_of (gmu , struct a6xx_gpu , gmu );
109
- struct adreno_gpu * adreno_gpu = & a6xx_gpu -> base ;
110
- struct msm_gpu * gpu = & adreno_gpu -> base ;
111
- int ret ;
108
+ struct adreno_gpu * adreno_gpu = to_adreno_gpu (gpu );
109
+ struct a6xx_gpu * a6xx_gpu = to_a6xx_gpu (adreno_gpu );
110
+ struct a6xx_gmu * gmu = & a6xx_gpu -> gmu ;
111
+ u32 perf_index ;
112
+ unsigned long gpu_freq ;
113
+ int ret = 0 ;
114
+
115
+ gpu_freq = dev_pm_opp_get_freq (opp );
116
+
117
+ if (gpu_freq == gmu -> freq )
118
+ return ;
119
+
120
+ for (perf_index = 0 ; perf_index < gmu -> nr_gpu_freqs - 1 ; perf_index ++ )
121
+ if (gpu_freq == gmu -> gpu_freqs [perf_index ])
122
+ break ;
123
+
124
+ gmu -> current_perf_index = perf_index ;
125
+ gmu -> freq = gmu -> gpu_freqs [perf_index ];
126
+
127
+ /*
128
+ * This can get called from devfreq while the hardware is idle. Don't
129
+ * bring up the power if it isn't already active
130
+ */
131
+ if (pm_runtime_get_if_in_use (gmu -> dev ) == 0 )
132
+ return ;
133
+
134
+ if (!gmu -> legacy ) {
135
+ a6xx_hfi_set_freq (gmu , perf_index );
136
+ icc_set_bw (gpu -> icc_path , 0 , MBps_to_icc (7216 ));
137
+ pm_runtime_put (gmu -> dev );
138
+ return ;
139
+ }
112
140
113
141
gmu_write (gmu , REG_A6XX_GMU_DCVS_ACK_OPTION , 0 );
114
142
115
143
gmu_write (gmu , REG_A6XX_GMU_DCVS_PERF_SETTING ,
116
- ((3 & 0xf ) << 28 ) | index );
144
+ ((3 & 0xf ) << 28 ) | perf_index );
117
145
118
146
/*
119
147
* Send an invalid index as a vote for the bus bandwidth and let the
@@ -134,37 +162,6 @@ static void __a6xx_gmu_set_freq(struct a6xx_gmu *gmu, int index)
134
162
* for now leave it at max so that the performance is nominal.
135
163
*/
136
164
icc_set_bw (gpu -> icc_path , 0 , MBps_to_icc (7216 ));
137
- }
138
-
139
- void a6xx_gmu_set_freq (struct msm_gpu * gpu , unsigned long freq )
140
- {
141
- struct adreno_gpu * adreno_gpu = to_adreno_gpu (gpu );
142
- struct a6xx_gpu * a6xx_gpu = to_a6xx_gpu (adreno_gpu );
143
- struct a6xx_gmu * gmu = & a6xx_gpu -> gmu ;
144
- u32 perf_index = 0 ;
145
-
146
- if (freq == gmu -> freq )
147
- return ;
148
-
149
- for (perf_index = 0 ; perf_index < gmu -> nr_gpu_freqs - 1 ; perf_index ++ )
150
- if (freq == gmu -> gpu_freqs [perf_index ])
151
- break ;
152
-
153
- gmu -> current_perf_index = perf_index ;
154
- gmu -> freq = gmu -> gpu_freqs [perf_index ];
155
-
156
- /*
157
- * This can get called from devfreq while the hardware is idle. Don't
158
- * bring up the power if it isn't already active
159
- */
160
- if (pm_runtime_get_if_in_use (gmu -> dev ) == 0 )
161
- return ;
162
-
163
- if (gmu -> legacy )
164
- __a6xx_gmu_set_freq (gmu , perf_index );
165
- else
166
- a6xx_hfi_set_freq (gmu , perf_index );
167
-
168
165
pm_runtime_put (gmu -> dev );
169
166
}
170
167
@@ -839,6 +836,19 @@ static void a6xx_gmu_force_off(struct a6xx_gmu *gmu)
839
836
a6xx_gmu_rpmh_off (gmu );
840
837
}
841
838
839
+ static void a6xx_gmu_set_initial_freq (struct msm_gpu * gpu , struct a6xx_gmu * gmu )
840
+ {
841
+ struct dev_pm_opp * gpu_opp ;
842
+ unsigned long gpu_freq = gmu -> gpu_freqs [gmu -> current_perf_index ];
843
+
844
+ gpu_opp = dev_pm_opp_find_freq_exact (& gpu -> pdev -> dev , gpu_freq , true);
845
+ if (IS_ERR_OR_NULL (gpu_opp ))
846
+ return ;
847
+
848
+ a6xx_gmu_set_freq (gpu , gpu_opp );
849
+ dev_pm_opp_put (gpu_opp );
850
+ }
851
+
842
852
int a6xx_gmu_resume (struct a6xx_gpu * a6xx_gpu )
843
853
{
844
854
struct adreno_gpu * adreno_gpu = & a6xx_gpu -> base ;
@@ -898,10 +908,7 @@ int a6xx_gmu_resume(struct a6xx_gpu *a6xx_gpu)
898
908
enable_irq (gmu -> hfi_irq );
899
909
900
910
/* Set the GPU to the current freq */
901
- if (gmu -> legacy )
902
- __a6xx_gmu_set_freq (gmu , gmu -> current_perf_index );
903
- else
904
- a6xx_hfi_set_freq (gmu , gmu -> current_perf_index );
911
+ a6xx_gmu_set_initial_freq (gpu , gmu );
905
912
906
913
/*
907
914
* "enable" the GX power domain which won't actually do anything but it
0 commit comments