mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-12-04 01:24:12 +08:00
accel/ivpu: Read clock rate only if device is up
Do not unnecessarily wake up device to read clock rate. Return 0 as clk_rate if device is suspended. Signed-off-by: Karol Wachowski <karol.wachowski@linux.intel.com> Reviewed-by: Stanislaw Gruszka <stanislaw.gruszka@linux.intel.com> Reviewed-by: Jeffrey Hugo <quic_jhugo@quicinc.com> Signed-off-by: Stanislaw Gruszka <stanislaw.gruszka@linux.intel.com> Link: https://patchwork.freedesktop.org/patch/msgid/20231020104501.697763-4-stanislaw.gruszka@linux.intel.com
This commit is contained in:
parent
74ce0f3873
commit
c39dc15191
@ -131,6 +131,22 @@ static int ivpu_get_capabilities(struct ivpu_device *vdev, struct drm_ivpu_param
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int ivpu_get_core_clock_rate(struct ivpu_device *vdev, u64 *clk_rate)
|
||||||
|
{
|
||||||
|
int ret;
|
||||||
|
|
||||||
|
ret = ivpu_rpm_get_if_active(vdev);
|
||||||
|
if (ret < 0)
|
||||||
|
return ret;
|
||||||
|
|
||||||
|
*clk_rate = ret ? ivpu_hw_reg_pll_freq_get(vdev) : 0;
|
||||||
|
|
||||||
|
if (ret)
|
||||||
|
ivpu_rpm_put(vdev);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
static int ivpu_get_param_ioctl(struct drm_device *dev, void *data, struct drm_file *file)
|
static int ivpu_get_param_ioctl(struct drm_device *dev, void *data, struct drm_file *file)
|
||||||
{
|
{
|
||||||
struct ivpu_file_priv *file_priv = file->driver_priv;
|
struct ivpu_file_priv *file_priv = file->driver_priv;
|
||||||
@ -154,7 +170,7 @@ static int ivpu_get_param_ioctl(struct drm_device *dev, void *data, struct drm_f
|
|||||||
args->value = vdev->platform;
|
args->value = vdev->platform;
|
||||||
break;
|
break;
|
||||||
case DRM_IVPU_PARAM_CORE_CLOCK_RATE:
|
case DRM_IVPU_PARAM_CORE_CLOCK_RATE:
|
||||||
args->value = ivpu_hw_reg_pll_freq_get(vdev);
|
ret = ivpu_get_core_clock_rate(vdev, &args->value);
|
||||||
break;
|
break;
|
||||||
case DRM_IVPU_PARAM_NUM_CONTEXTS:
|
case DRM_IVPU_PARAM_NUM_CONTEXTS:
|
||||||
args->value = ivpu_get_context_count(vdev);
|
args->value = ivpu_get_context_count(vdev);
|
||||||
|
@ -246,6 +246,19 @@ int ivpu_rpm_get(struct ivpu_device *vdev)
|
|||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int ivpu_rpm_get_if_active(struct ivpu_device *vdev)
|
||||||
|
{
|
||||||
|
int ret;
|
||||||
|
|
||||||
|
ivpu_dbg(vdev, RPM, "rpm_get_if_active count %d\n",
|
||||||
|
atomic_read(&vdev->drm.dev->power.usage_count));
|
||||||
|
|
||||||
|
ret = pm_runtime_get_if_active(vdev->drm.dev, false);
|
||||||
|
drm_WARN_ON(&vdev->drm, ret < 0);
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
void ivpu_rpm_put(struct ivpu_device *vdev)
|
void ivpu_rpm_put(struct ivpu_device *vdev)
|
||||||
{
|
{
|
||||||
pm_runtime_mark_last_busy(vdev->drm.dev);
|
pm_runtime_mark_last_busy(vdev->drm.dev);
|
||||||
|
@ -33,6 +33,7 @@ void ivpu_pm_reset_prepare_cb(struct pci_dev *pdev);
|
|||||||
void ivpu_pm_reset_done_cb(struct pci_dev *pdev);
|
void ivpu_pm_reset_done_cb(struct pci_dev *pdev);
|
||||||
|
|
||||||
int __must_check ivpu_rpm_get(struct ivpu_device *vdev);
|
int __must_check ivpu_rpm_get(struct ivpu_device *vdev);
|
||||||
|
int __must_check ivpu_rpm_get_if_active(struct ivpu_device *vdev);
|
||||||
void ivpu_rpm_put(struct ivpu_device *vdev);
|
void ivpu_rpm_put(struct ivpu_device *vdev);
|
||||||
|
|
||||||
void ivpu_pm_schedule_recovery(struct ivpu_device *vdev);
|
void ivpu_pm_schedule_recovery(struct ivpu_device *vdev);
|
||||||
|
Loading…
Reference in New Issue
Block a user