Loading msm/sde/sde_kms.c +67 −2 Original line number Diff line number Diff line /* * Copyright (c) 2014-2019, The Linux Foundation. All rights reserved. * Copyright (c) 2014-2020, The Linux Foundation. All rights reserved. * Copyright (C) 2013 Red Hat * Author: Rob Clark <robdclark@gmail.com> * Loading Loading @@ -87,6 +87,8 @@ static const char * const iommu_ports[] = { #define SDE_KMS_MODESET_LOCK_TIMEOUT_US 500 #define SDE_KMS_MODESET_LOCK_MAX_TRIALS 20 #define SDE_KMS_PM_QOS_CPU_DMA_LATENCY 300 /** * sdecustom - enable certain driver customizations for sde clients * Enabling this modifies the standard DRM behavior slightly and assumes Loading Loading @@ -3132,6 +3134,59 @@ static void _sde_kms_set_lutdma_vbif_remap(struct sde_kms *sde_kms) sde_vbif_set_qos_remap(sde_kms, &qos_params); } static void sde_kms_update_pm_qos_irq_request(struct sde_kms *sde_kms) { struct pm_qos_request *req; req = &sde_kms->pm_qos_irq_req; req->type = PM_QOS_REQ_AFFINE_CORES; req->cpus_affine = sde_kms->irq_cpu_mask; if (pm_qos_request_active(req)) pm_qos_update_request(req, SDE_KMS_PM_QOS_CPU_DMA_LATENCY); else if (!cpumask_empty(&req->cpus_affine)) { /** If request is not active yet and mask is not empty * then it needs to be added initially */ pm_qos_add_request(req, PM_QOS_CPU_DMA_LATENCY, SDE_KMS_PM_QOS_CPU_DMA_LATENCY); } } static void sde_kms_set_default_pm_qos_irq_request(struct sde_kms *sde_kms) { if (pm_qos_request_active(&sde_kms->pm_qos_irq_req)) pm_qos_update_request(&sde_kms->pm_qos_irq_req, PM_QOS_DEFAULT_VALUE); } static void sde_kms_irq_affinity_notify( struct irq_affinity_notify *affinity_notify, const cpumask_t *mask) { struct msm_drm_private *priv; struct sde_kms *sde_kms = container_of(affinity_notify, struct sde_kms, affinity_notify); if (!sde_kms || !sde_kms->dev || !sde_kms->dev->dev_private) return; priv = sde_kms->dev->dev_private; mutex_lock(&priv->phandle.phandle_lock); // save irq cpu mask sde_kms->irq_cpu_mask = *mask; // request vote with updated irq cpu mask if (sde_kms->irq_enabled) sde_kms_update_pm_qos_irq_request(sde_kms); mutex_unlock(&priv->phandle.phandle_lock); } static void sde_kms_irq_affinity_release(struct kref *ref) {} static void sde_kms_handle_power_event(u32 event_type, void *usr) { struct sde_kms *sde_kms = usr; Loading @@ -3150,7 +3205,9 @@ static void sde_kms_handle_power_event(u32 event_type, void *usr) sde_kms_init_shared_hw(sde_kms); _sde_kms_set_lutdma_vbif_remap(sde_kms); sde_kms->first_kickoff = true; sde_kms_update_pm_qos_irq_request(sde_kms); } else if (event_type == SDE_POWER_EVENT_PRE_DISABLE) { sde_kms_set_default_pm_qos_irq_request(sde_kms); sde_irq_update(msm_kms, false); sde_kms->first_kickoff = false; } Loading Loading @@ -3585,7 +3642,7 @@ static int sde_kms_hw_init(struct msm_kms *kms) struct drm_device *dev; struct msm_drm_private *priv; struct platform_device *platformdev; int i, rc = -EINVAL; int i, irq_num, rc = -EINVAL; if (!kms) { SDE_ERROR("invalid kms\n"); Loading Loading @@ -3657,6 +3714,14 @@ static int sde_kms_hw_init(struct msm_kms *kms) pm_runtime_put_sync(sde_kms->dev->dev); } sde_kms->affinity_notify.notify = sde_kms_irq_affinity_notify; sde_kms->affinity_notify.release = sde_kms_irq_affinity_release; irq_num = platform_get_irq(to_platform_device(sde_kms->dev->dev), 0); SDE_DEBUG("Registering for notification of irq_num: %d\n", irq_num); irq_set_affinity_notifier(irq_num, &sde_kms->affinity_notify); return 0; hw_init_err: Loading msm/sde/sde_kms.h +5 −1 Original line number Diff line number Diff line /* * Copyright (c) 2015-2019, The Linux Foundation. All rights reserved. * Copyright (c) 2015-2020, The Linux Foundation. All rights reserved. * Copyright (C) 2013 Red Hat * Author: Rob Clark <robdclark@gmail.com> * Loading Loading @@ -292,6 +292,10 @@ struct sde_kms { bool first_kickoff; bool qdss_enabled; cpumask_t irq_cpu_mask; struct pm_qos_request pm_qos_irq_req; struct irq_affinity_notify affinity_notify; }; struct vsync_info { Loading Loading
msm/sde/sde_kms.c +67 −2 Original line number Diff line number Diff line /* * Copyright (c) 2014-2019, The Linux Foundation. All rights reserved. * Copyright (c) 2014-2020, The Linux Foundation. All rights reserved. * Copyright (C) 2013 Red Hat * Author: Rob Clark <robdclark@gmail.com> * Loading Loading @@ -87,6 +87,8 @@ static const char * const iommu_ports[] = { #define SDE_KMS_MODESET_LOCK_TIMEOUT_US 500 #define SDE_KMS_MODESET_LOCK_MAX_TRIALS 20 #define SDE_KMS_PM_QOS_CPU_DMA_LATENCY 300 /** * sdecustom - enable certain driver customizations for sde clients * Enabling this modifies the standard DRM behavior slightly and assumes Loading Loading @@ -3132,6 +3134,59 @@ static void _sde_kms_set_lutdma_vbif_remap(struct sde_kms *sde_kms) sde_vbif_set_qos_remap(sde_kms, &qos_params); } static void sde_kms_update_pm_qos_irq_request(struct sde_kms *sde_kms) { struct pm_qos_request *req; req = &sde_kms->pm_qos_irq_req; req->type = PM_QOS_REQ_AFFINE_CORES; req->cpus_affine = sde_kms->irq_cpu_mask; if (pm_qos_request_active(req)) pm_qos_update_request(req, SDE_KMS_PM_QOS_CPU_DMA_LATENCY); else if (!cpumask_empty(&req->cpus_affine)) { /** If request is not active yet and mask is not empty * then it needs to be added initially */ pm_qos_add_request(req, PM_QOS_CPU_DMA_LATENCY, SDE_KMS_PM_QOS_CPU_DMA_LATENCY); } } static void sde_kms_set_default_pm_qos_irq_request(struct sde_kms *sde_kms) { if (pm_qos_request_active(&sde_kms->pm_qos_irq_req)) pm_qos_update_request(&sde_kms->pm_qos_irq_req, PM_QOS_DEFAULT_VALUE); } static void sde_kms_irq_affinity_notify( struct irq_affinity_notify *affinity_notify, const cpumask_t *mask) { struct msm_drm_private *priv; struct sde_kms *sde_kms = container_of(affinity_notify, struct sde_kms, affinity_notify); if (!sde_kms || !sde_kms->dev || !sde_kms->dev->dev_private) return; priv = sde_kms->dev->dev_private; mutex_lock(&priv->phandle.phandle_lock); // save irq cpu mask sde_kms->irq_cpu_mask = *mask; // request vote with updated irq cpu mask if (sde_kms->irq_enabled) sde_kms_update_pm_qos_irq_request(sde_kms); mutex_unlock(&priv->phandle.phandle_lock); } static void sde_kms_irq_affinity_release(struct kref *ref) {} static void sde_kms_handle_power_event(u32 event_type, void *usr) { struct sde_kms *sde_kms = usr; Loading @@ -3150,7 +3205,9 @@ static void sde_kms_handle_power_event(u32 event_type, void *usr) sde_kms_init_shared_hw(sde_kms); _sde_kms_set_lutdma_vbif_remap(sde_kms); sde_kms->first_kickoff = true; sde_kms_update_pm_qos_irq_request(sde_kms); } else if (event_type == SDE_POWER_EVENT_PRE_DISABLE) { sde_kms_set_default_pm_qos_irq_request(sde_kms); sde_irq_update(msm_kms, false); sde_kms->first_kickoff = false; } Loading Loading @@ -3585,7 +3642,7 @@ static int sde_kms_hw_init(struct msm_kms *kms) struct drm_device *dev; struct msm_drm_private *priv; struct platform_device *platformdev; int i, rc = -EINVAL; int i, irq_num, rc = -EINVAL; if (!kms) { SDE_ERROR("invalid kms\n"); Loading Loading @@ -3657,6 +3714,14 @@ static int sde_kms_hw_init(struct msm_kms *kms) pm_runtime_put_sync(sde_kms->dev->dev); } sde_kms->affinity_notify.notify = sde_kms_irq_affinity_notify; sde_kms->affinity_notify.release = sde_kms_irq_affinity_release; irq_num = platform_get_irq(to_platform_device(sde_kms->dev->dev), 0); SDE_DEBUG("Registering for notification of irq_num: %d\n", irq_num); irq_set_affinity_notifier(irq_num, &sde_kms->affinity_notify); return 0; hw_init_err: Loading
msm/sde/sde_kms.h +5 −1 Original line number Diff line number Diff line /* * Copyright (c) 2015-2019, The Linux Foundation. All rights reserved. * Copyright (c) 2015-2020, The Linux Foundation. All rights reserved. * Copyright (C) 2013 Red Hat * Author: Rob Clark <robdclark@gmail.com> * Loading Loading @@ -292,6 +292,10 @@ struct sde_kms { bool first_kickoff; bool qdss_enabled; cpumask_t irq_cpu_mask; struct pm_qos_request pm_qos_irq_req; struct irq_affinity_notify affinity_notify; }; struct vsync_info { Loading