44 */
55
66#include <drm/drm_file.h>
7+ #include <linux/pm_runtime.h>
78
89#include "ivpu_drv.h"
910#include "ivpu_gem.h"
@@ -44,6 +45,10 @@ int ivpu_ms_start_ioctl(struct drm_device *dev, void *data, struct drm_file *fil
4445 args -> sampling_period_ns < MS_MIN_SAMPLE_PERIOD_NS )
4546 return - EINVAL ;
4647
48+ ret = ivpu_rpm_get (vdev );
49+ if (ret < 0 )
50+ return ret ;
51+
4752 mutex_lock (& file_priv -> ms_lock );
4853
4954 if (get_instance_by_mask (file_priv , args -> metric_group_mask )) {
@@ -96,6 +101,8 @@ int ivpu_ms_start_ioctl(struct drm_device *dev, void *data, struct drm_file *fil
96101 kfree (ms );
97102unlock :
98103 mutex_unlock (& file_priv -> ms_lock );
104+
105+ ivpu_rpm_put (vdev );
99106 return ret ;
100107}
101108
@@ -160,6 +167,10 @@ int ivpu_ms_get_data_ioctl(struct drm_device *dev, void *data, struct drm_file *
160167 if (!args -> metric_group_mask )
161168 return - EINVAL ;
162169
170+ ret = ivpu_rpm_get (vdev );
171+ if (ret < 0 )
172+ return ret ;
173+
163174 mutex_lock (& file_priv -> ms_lock );
164175
165176 ms = get_instance_by_mask (file_priv , args -> metric_group_mask );
@@ -187,6 +198,7 @@ int ivpu_ms_get_data_ioctl(struct drm_device *dev, void *data, struct drm_file *
187198unlock :
188199 mutex_unlock (& file_priv -> ms_lock );
189200
201+ ivpu_rpm_put (vdev );
190202 return ret ;
191203}
192204
@@ -204,11 +216,17 @@ int ivpu_ms_stop_ioctl(struct drm_device *dev, void *data, struct drm_file *file
204216{
205217 struct ivpu_file_priv * file_priv = file -> driver_priv ;
206218 struct drm_ivpu_metric_streamer_stop * args = data ;
219+ struct ivpu_device * vdev = file_priv -> vdev ;
207220 struct ivpu_ms_instance * ms ;
221+ int ret ;
208222
209223 if (!args -> metric_group_mask )
210224 return - EINVAL ;
211225
226+ ret = ivpu_rpm_get (vdev );
227+ if (ret < 0 )
228+ return ret ;
229+
212230 mutex_lock (& file_priv -> ms_lock );
213231
214232 ms = get_instance_by_mask (file_priv , args -> metric_group_mask );
@@ -217,6 +235,7 @@ int ivpu_ms_stop_ioctl(struct drm_device *dev, void *data, struct drm_file *file
217235
218236 mutex_unlock (& file_priv -> ms_lock );
219237
238+ ivpu_rpm_put (vdev );
220239 return ms ? 0 : - EINVAL ;
221240}
222241
@@ -281,6 +300,9 @@ int ivpu_ms_get_info_ioctl(struct drm_device *dev, void *data, struct drm_file *
281300void ivpu_ms_cleanup (struct ivpu_file_priv * file_priv )
282301{
283302 struct ivpu_ms_instance * ms , * tmp ;
303+ struct ivpu_device * vdev = file_priv -> vdev ;
304+
305+ pm_runtime_get_sync (vdev -> drm .dev );
284306
285307 mutex_lock (& file_priv -> ms_lock );
286308
@@ -293,6 +315,8 @@ void ivpu_ms_cleanup(struct ivpu_file_priv *file_priv)
293315 free_instance (file_priv , ms );
294316
295317 mutex_unlock (& file_priv -> ms_lock );
318+
319+ pm_runtime_put_autosuspend (vdev -> drm .dev );
296320}
297321
298322void ivpu_ms_cleanup_all (struct ivpu_device * vdev )
0 commit comments