From patchwork Sat Nov 20 20:01:01 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Rob Clark X-Patchwork-Id: 12630575 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id B3D89C433F5 for ; Sat, 20 Nov 2021 19:55:58 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S229671AbhKTT7B (ORCPT ); Sat, 20 Nov 2021 14:59:01 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:53792 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S229488AbhKTT7B (ORCPT ); Sat, 20 Nov 2021 14:59:01 -0500 Received: from mail-pg1-x52e.google.com (mail-pg1-x52e.google.com [IPv6:2607:f8b0:4864:20::52e]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 97F12C061574; Sat, 20 Nov 2021 11:55:57 -0800 (PST) Received: by mail-pg1-x52e.google.com with SMTP id l190so1037525pge.7; Sat, 20 Nov 2021 11:55:57 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; h=from:to:cc:subject:date:message-id:mime-version :content-transfer-encoding; bh=3B9R8wmPt5FiY3+8DpmPyX4kLYpyKeoK4xVcuXGAELc=; b=nD/OFAmEjlXdlhnR0EIWcKCOjCOpynXRiCQ3L5b/NryZEFW7aGN27xk4nHOKfeuhse mZk0p5lIsEsob6VGHCAJPr/eoALBiLSDq62hlJNNKrCR2r9DpFVI1lIyMV9cLbXbV/CJ bHvSMVxvejnHY8y0jHPVRD1oZ1D9xSZ9GAP48Qwlp5Gpx2J33IrOqBl+5T/PYD2q7pAV Actp2SiKFF0pcq0+0JBkiGaV7FpnCxZP2GEsh2g0T5tfZGDwYYzB57jwDbQg2EX4rsR3 Gaegv6w8zrw6oW7sQ81izSqO6kJRrldI4NjDCBOw3wDSYFMqMlVJZuY/+saKP7YRllL0 x1VQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:cc:subject:date:message-id:mime-version :content-transfer-encoding; bh=3B9R8wmPt5FiY3+8DpmPyX4kLYpyKeoK4xVcuXGAELc=; b=WpB2QlmWxSw3/oIgHy+GQh+RUQQgL+00cVXZ1aGOGTuKyDxo9jMruS5AGBnUh7dIyY Nc8k9SToSSmIsD4CzKdtATJGUhysXy8GKmR6JU2G6KHlzUWM26Xi4YUAyvatZiGUveTR a6W9OZ6YpqcHkmvsVuAHGigm/mW7HAz0iLL/V8Bt+vFNrqSSfJWlzT0aB/k85s0yPWw5 JEf2fnIsJ079a8BlJyoOSG69Y7q+qyKMQKtXlh6bfK1ROG7eDoFSh5CH1nCMIZOJyZdl P7gffqDr2a6578HT/GKcrQ7OetLzITicN+ZWXIGJpH+o6/cpc6jMpEO56tzXhNAcDpvR WUlg== X-Gm-Message-State: AOAM531EpJm9bLr2X7b8m7dmFZdvcyitG8762FMQK/GsFmuKD+5dLFXd j2Bhbpc1h3TFnLcv6x4m/6c= X-Google-Smtp-Source: ABdhPJxrc0BlTm1p/mAREngPYj1AozJJkBDsUTlgiy4iQ8gEIX+Ko3GmA3AOSxR7OjuFJGd4WFiAVg== X-Received: by 2002:a63:85c6:: with SMTP id u189mr23809628pgd.344.1637438157101; Sat, 20 Nov 2021 11:55:57 -0800 (PST) Received: from localhost (c-73-25-156-94.hsd1.or.comcast.net. [73.25.156.94]) by smtp.gmail.com with ESMTPSA id y130sm3397659pfg.202.2021.11.20.11.55.56 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 20 Nov 2021 11:55:56 -0800 (PST) From: Rob Clark To: dri-devel@lists.freedesktop.org Cc: freedreno@lists.freedesktop.org, linux-arm-msm@vger.kernel.org, Doug Anderson , Rob Clark , Rob Clark , Sean Paul , David Airlie , Daniel Vetter , linux-kernel@vger.kernel.org (open list) Subject: [PATCH v2 1/3] drm/msm/gpu: Fix idle_work time Date: Sat, 20 Nov 2021 12:01:01 -0800 Message-Id: <20211120200103.1051459-1-robdclark@gmail.com> X-Mailer: git-send-email 2.33.1 MIME-Version: 1.0 Precedence: bulk List-ID: X-Mailing-List: linux-arm-msm@vger.kernel.org From: Rob Clark This was supposed to be a relative timer, not absolute. Fixes: 658f4c829688 ("drm/msm/devfreq: Add 1ms delay before clamping freq") Signed-off-by: Rob Clark Reviewed-by: Douglas Anderson --- drivers/gpu/drm/msm/msm_gpu_devfreq.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drivers/gpu/drm/msm/msm_gpu_devfreq.c b/drivers/gpu/drm/msm/msm_gpu_devfreq.c index 43468919df61..7285041c737e 100644 --- a/drivers/gpu/drm/msm/msm_gpu_devfreq.c +++ b/drivers/gpu/drm/msm/msm_gpu_devfreq.c @@ -228,5 +228,5 @@ void msm_devfreq_idle(struct msm_gpu *gpu) struct msm_gpu_devfreq *df = &gpu->devfreq; msm_hrtimer_queue_work(&df->idle_work, ms_to_ktime(1), - HRTIMER_MODE_ABS); + HRTIMER_MODE_REL); } From patchwork Sat Nov 20 20:01:02 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Rob Clark X-Patchwork-Id: 12630577 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id B563BC433F5 for ; Sat, 20 Nov 2021 19:56:03 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S229488AbhKTT7E (ORCPT ); Sat, 20 Nov 2021 14:59:04 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:53802 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S230337AbhKTT7D (ORCPT ); Sat, 20 Nov 2021 14:59:03 -0500 Received: from mail-pj1-x102a.google.com (mail-pj1-x102a.google.com [IPv6:2607:f8b0:4864:20::102a]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id ED803C061574; Sat, 20 Nov 2021 11:55:59 -0800 (PST) Received: by mail-pj1-x102a.google.com with SMTP id gx15-20020a17090b124f00b001a695f3734aso11740460pjb.0; Sat, 20 Nov 2021 11:55:59 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=f6ln+3/9DBZRpR4O41lZm+OOJ4C7JaNKQynsg2JOb2g=; b=gK2AwHPNaUv5ITw79ZSC/UGT2HaxPBYEe7FXzSAQjtMcHhvfQm5Lg1iP2YyQHsLps+ v47k/HkmgUiMWTDM0TwH9U1iKF2oQ7Q4NqKorGdI+eTBeba77N7B4SHVDS6eIYBKSXiq k+cYygXjWCiN7I2Dx9fL7LbLo3Tn78jAnX78yfDXdF0ewSPopNOoUpZKP9JJlvIuiapf 9rHTCMG+ZdZ7jlxbzqV9l6upSGZiWleLPLykeixUqKnqS0hz8yGRDDGdMed8SEKwGFxO 2P2azmIM8co9mqSCyHgB9O7EiLF/RR3XxaS/UFozFhQFUQzHOc9tKUcBft/SF7JiuH6E IpMA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=f6ln+3/9DBZRpR4O41lZm+OOJ4C7JaNKQynsg2JOb2g=; b=nE46D53NEeatbdz62cGQkll4aQx9ybHyr8bhqluMmAZkJXF6DdkqmEErPh11v5v1E3 j/YIkyOMdBCdg4Uuto4EV50MJaRueEOixsjv2SjdHsTDWvB9cPMJKOjBwiH8wl4XhL6R xTvS/BesKa2917hqcG57aw825lgKU/7M/3iZRtBenySQTsKH8K5E6iSgFZT4ivRDARvJ cDqmnlTlGGGqAhWVjHyAxz+He17dhAcYGfWOw6aKBXCrLFLesF50D2QFNwNYfE8h7F+R yQNQGZrUv5h2SrOQ8ZRtDJr/gHUV3cy62B29PPahFgK/nxpE/Ri+gPz2CnHN5CfyZj1P gZYQ== X-Gm-Message-State: AOAM530IoHO107ZORelyLgOd7VYH/7/O1ZIYaWEUEE+/cMJR//Db27Zt +urG6pzHnHNe/w6DYnWV9N4= X-Google-Smtp-Source: ABdhPJxkEV85PiqNOKmTRTBg/0gPmEVCe1tk2ZykCrFUfRWSsdVqyGSrh78AML/O54+H63tIu5x4bw== X-Received: by 2002:a17:90a:db02:: with SMTP id g2mr13579182pjv.76.1637438159436; Sat, 20 Nov 2021 11:55:59 -0800 (PST) Received: from localhost (c-73-25-156-94.hsd1.or.comcast.net. [73.25.156.94]) by smtp.gmail.com with ESMTPSA id kx3sm3020916pjb.5.2021.11.20.11.55.58 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 20 Nov 2021 11:55:58 -0800 (PST) From: Rob Clark To: dri-devel@lists.freedesktop.org Cc: freedreno@lists.freedesktop.org, linux-arm-msm@vger.kernel.org, Doug Anderson , Rob Clark , Rob Clark , Sean Paul , David Airlie , Daniel Vetter , linux-kernel@vger.kernel.org (open list) Subject: [PATCH v2 2/3] drm/msm/gpu: Fix check for devices without devfreq Date: Sat, 20 Nov 2021 12:01:02 -0800 Message-Id: <20211120200103.1051459-2-robdclark@gmail.com> X-Mailer: git-send-email 2.33.1 In-Reply-To: <20211120200103.1051459-1-robdclark@gmail.com> References: <20211120200103.1051459-1-robdclark@gmail.com> MIME-Version: 1.0 Precedence: bulk List-ID: X-Mailing-List: linux-arm-msm@vger.kernel.org From: Rob Clark Looks like 658f4c829688 ("drm/msm/devfreq: Add 1ms delay before clamping freq") was badly rebased on top of efb8a170a367 ("drm/msm: Fix devfreq NULL pointer dereference on a3xx") and ended up with the NULL check in the wrong place. Fixes: 658f4c829688 ("drm/msm/devfreq: Add 1ms delay before clamping freq") Signed-off-by: Rob Clark --- drivers/gpu/drm/msm/msm_gpu_devfreq.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/drivers/gpu/drm/msm/msm_gpu_devfreq.c b/drivers/gpu/drm/msm/msm_gpu_devfreq.c index 7285041c737e..1f55242bb6a1 100644 --- a/drivers/gpu/drm/msm/msm_gpu_devfreq.c +++ b/drivers/gpu/drm/msm/msm_gpu_devfreq.c @@ -203,9 +203,6 @@ static void msm_devfreq_idle_work(struct kthread_work *work) struct msm_gpu *gpu = container_of(df, struct msm_gpu, devfreq); unsigned long idle_freq, target_freq = 0; - if (!df->devfreq) - return; - /* * Hold devfreq lock to synchronize with get_dev_status()/ * target() callbacks @@ -227,6 +224,9 @@ void msm_devfreq_idle(struct msm_gpu *gpu) { struct msm_gpu_devfreq *df = &gpu->devfreq; + if (!df->devfreq) + return; + msm_hrtimer_queue_work(&df->idle_work, ms_to_ktime(1), HRTIMER_MODE_REL); } From patchwork Sat Nov 20 20:01:03 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Rob Clark X-Patchwork-Id: 12630579 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 9FE71C433F5 for ; Sat, 20 Nov 2021 19:56:06 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S231325AbhKTT7H (ORCPT ); Sat, 20 Nov 2021 14:59:07 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:53812 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S231298AbhKTT7F (ORCPT ); Sat, 20 Nov 2021 14:59:05 -0500 Received: from mail-pl1-x632.google.com (mail-pl1-x632.google.com [IPv6:2607:f8b0:4864:20::632]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 3D6B8C061574; Sat, 20 Nov 2021 11:56:02 -0800 (PST) Received: by mail-pl1-x632.google.com with SMTP id y7so10798696plp.0; Sat, 20 Nov 2021 11:56:02 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=Y1dwVFSwPh1gZK9xVb840bb6p/IVMM8HN6jf7GNmsv8=; b=aiz3Znse4ZuHoB8Y27cqZz6Dc+xrqdlz4rmdfAbjMmrXoWPVZnTDa9qNsxcd0/UnFJ UDMLan7xSkiZGhoIeb8FZyj1WwsWulofWPesRO+Ms3+aCTBDPl+NMBa3MZ1wa+rc0Kg9 kLj8GCLX5nDmgDGiEIygdMOX8ITS1p8iY0jpKlesTZAa24p0I8bE1PgCz1LfRYJuuxeI l8TJiHZnEIfa2uNiisjj4BaP6Dr1C84TzuIMCDitgnVzvr11jZ440mkUtg1rpQK5e/NY JgPf7QYygxILTrxRT6u4ljWgfFnlc6k6NflcpxT9SQUihvs60PqXXjrAMAuExKaS7Tyx 0Mng== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=Y1dwVFSwPh1gZK9xVb840bb6p/IVMM8HN6jf7GNmsv8=; b=ax9mTZLttxp87jDc3OaLK/vkLoZWLGX7wVoaN9rXGzxa4hren2iVVk3I5k6oNNmUjH 7cWwhK+EGma9RpQ48hcgo9/CqHSrOc+xF+Y6r19kVRGrQRnTIaii9iclsN83rHyfTAMi Dg3e7gaAOxAqVcQnoG52e0bbgN3ztsnHe/wEJNZ+aw4Qr3Wp1oQY0adxcVqA8zrcRw9I ABL8LIWiE1azpkoJa+VyLW/dLgwYam5vEe8vWlRtb3/4RDVP6i7tkTAwoynN1EK6GEPI 4Kr7fMuDbrTkW7K+9e557BoxTbqT9fVr94SSOhYpu8kaIoqf800GVxtUlVbwG6WqQWWI Cqyw== X-Gm-Message-State: AOAM5303UZjjyvz9PmfdU6TRLfvej6+Z7cMtf2T42/Rytt2YbffDgGCD zq29YSbim2+D2svbtMpKVAKh3n4eX58= X-Google-Smtp-Source: ABdhPJyTUn25c2nvqG0xCnmcIBGI0u36ick202i9Hr17UaG9DR8rfq+1/Br42AhNlOriqwC9pmB9mA== X-Received: by 2002:a17:902:c204:b0:142:2441:aa26 with SMTP id 4-20020a170902c20400b001422441aa26mr89673182pll.84.1637438161752; Sat, 20 Nov 2021 11:56:01 -0800 (PST) Received: from localhost (c-73-25-156-94.hsd1.or.comcast.net. [73.25.156.94]) by smtp.gmail.com with ESMTPSA id b19sm3960013pfv.63.2021.11.20.11.56.00 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 20 Nov 2021 11:56:00 -0800 (PST) From: Rob Clark To: dri-devel@lists.freedesktop.org Cc: freedreno@lists.freedesktop.org, linux-arm-msm@vger.kernel.org, Doug Anderson , Rob Clark , Rob Clark , Sean Paul , David Airlie , Daniel Vetter , linux-kernel@vger.kernel.org (open list) Subject: [PATCH v2 3/3] drm/msm/gpu: Respect PM QoS constraints Date: Sat, 20 Nov 2021 12:01:03 -0800 Message-Id: <20211120200103.1051459-3-robdclark@gmail.com> X-Mailer: git-send-email 2.33.1 In-Reply-To: <20211120200103.1051459-1-robdclark@gmail.com> References: <20211120200103.1051459-1-robdclark@gmail.com> MIME-Version: 1.0 Precedence: bulk List-ID: X-Mailing-List: linux-arm-msm@vger.kernel.org From: Rob Clark Re-work the boost and idle clamping to use PM QoS requests instead, so they get aggreggated with other requests (such as cooling device). This does have the minor side-effect that devfreq sysfs min_freq/ max_freq files now reflect the boost and idle clamping, as they show (despite what they are documented to show) the aggregated min/max freq. Fixing that in devfreq does not look straightforward after considering that OPPs can be dynamically added/removed. However writes to the sysfs files still behave as expected. v2: Use 64b math to avoid potential 32b overflow Signed-off-by: Rob Clark --- drivers/gpu/drm/msm/msm_gpu.h | 33 +++++++--- drivers/gpu/drm/msm/msm_gpu_devfreq.c | 87 +++++++++++++++------------ 2 files changed, 71 insertions(+), 49 deletions(-) diff --git a/drivers/gpu/drm/msm/msm_gpu.h b/drivers/gpu/drm/msm/msm_gpu.h index 59cdd00b69d0..96d8d37dd5b7 100644 --- a/drivers/gpu/drm/msm/msm_gpu.h +++ b/drivers/gpu/drm/msm/msm_gpu.h @@ -87,6 +87,21 @@ struct msm_gpu_devfreq { /** devfreq: devfreq instance */ struct devfreq *devfreq; + /** + * idle_constraint: + * + * A PM QoS constraint to limit max freq while the GPU is idle. + */ + struct dev_pm_qos_request idle_freq; + + /** + * boost_constraint: + * + * A PM QoS constraint to boost min freq for a period of time + * until the boost expires. + */ + struct dev_pm_qos_request boost_freq; + /** * busy_cycles: * @@ -103,22 +118,19 @@ struct msm_gpu_devfreq { ktime_t idle_time; /** - * idle_freq: + * idle_work: * - * Shadow frequency used while the GPU is idle. From the PoV of - * the devfreq governor, we are continuing to sample busyness and - * adjust frequency while the GPU is idle, but we use this shadow - * value as the GPU is actually clamped to minimum frequency while - * it is inactive. + * Used to delay clamping to idle freq on active->idle transition. */ - unsigned long idle_freq; + struct msm_hrtimer_work idle_work; /** - * idle_work: + * boost_work: * - * Used to delay clamping to idle freq on active->idle transition. + * Used to reset the boost_constraint after the boost period has + * elapsed */ - struct msm_hrtimer_work idle_work; + struct msm_hrtimer_work boost_work; }; struct msm_gpu { @@ -498,6 +510,7 @@ void msm_devfreq_init(struct msm_gpu *gpu); void msm_devfreq_cleanup(struct msm_gpu *gpu); void msm_devfreq_resume(struct msm_gpu *gpu); void msm_devfreq_suspend(struct msm_gpu *gpu); +void msm_devfreq_boost(struct msm_gpu *gpu, unsigned factor); void msm_devfreq_active(struct msm_gpu *gpu); void msm_devfreq_idle(struct msm_gpu *gpu); diff --git a/drivers/gpu/drm/msm/msm_gpu_devfreq.c b/drivers/gpu/drm/msm/msm_gpu_devfreq.c index 1f55242bb6a1..11be623de2ab 100644 --- a/drivers/gpu/drm/msm/msm_gpu_devfreq.c +++ b/drivers/gpu/drm/msm/msm_gpu_devfreq.c @@ -9,6 +9,7 @@ #include #include +#include /* * Power Management: @@ -22,15 +23,6 @@ static int msm_devfreq_target(struct device *dev, unsigned long *freq, opp = devfreq_recommended_opp(dev, freq, flags); - /* - * If the GPU is idle, devfreq is not aware, so just ignore - * it's requests - */ - if (gpu->devfreq.idle_freq) { - gpu->devfreq.idle_freq = *freq; - return 0; - } - if (IS_ERR(opp)) return PTR_ERR(opp); @@ -48,9 +40,6 @@ static int msm_devfreq_target(struct device *dev, unsigned long *freq, static unsigned long get_freq(struct msm_gpu *gpu) { - if (gpu->devfreq.idle_freq) - return gpu->devfreq.idle_freq; - if (gpu->funcs->gpu_get_freq) return gpu->funcs->gpu_get_freq(gpu); @@ -88,6 +77,7 @@ static struct devfreq_dev_profile msm_devfreq_profile = { .get_cur_freq = msm_devfreq_get_cur_freq, }; +static void msm_devfreq_boost_work(struct kthread_work *work); static void msm_devfreq_idle_work(struct kthread_work *work); void msm_devfreq_init(struct msm_gpu *gpu) @@ -98,6 +88,12 @@ void msm_devfreq_init(struct msm_gpu *gpu) if (!gpu->funcs->gpu_busy) return; + dev_pm_qos_add_request(&gpu->pdev->dev, &df->idle_freq, + DEV_PM_QOS_MAX_FREQUENCY, + PM_QOS_MAX_FREQUENCY_DEFAULT_VALUE); + dev_pm_qos_add_request(&gpu->pdev->dev, &df->boost_freq, + DEV_PM_QOS_MIN_FREQUENCY, 0); + msm_devfreq_profile.initial_freq = gpu->fast_rate; /* @@ -128,13 +124,19 @@ void msm_devfreq_init(struct msm_gpu *gpu) gpu->cooling = NULL; } + msm_hrtimer_work_init(&df->boost_work, gpu->worker, msm_devfreq_boost_work, + CLOCK_MONOTONIC, HRTIMER_MODE_REL); msm_hrtimer_work_init(&df->idle_work, gpu->worker, msm_devfreq_idle_work, CLOCK_MONOTONIC, HRTIMER_MODE_REL); } void msm_devfreq_cleanup(struct msm_gpu *gpu) { + struct msm_gpu_devfreq *df = &gpu->devfreq; + devfreq_cooling_unregister(gpu->cooling); + dev_pm_qos_remove_request(&df->boost_freq); + dev_pm_qos_remove_request(&df->idle_freq); } void msm_devfreq_resume(struct msm_gpu *gpu) @@ -150,12 +152,40 @@ void msm_devfreq_suspend(struct msm_gpu *gpu) devfreq_suspend_device(gpu->devfreq.devfreq); } +static void msm_devfreq_boost_work(struct kthread_work *work) +{ + struct msm_gpu_devfreq *df = container_of(work, + struct msm_gpu_devfreq, boost_work.work); + + dev_pm_qos_update_request(&df->boost_freq, 0); +} + +void msm_devfreq_boost(struct msm_gpu *gpu, unsigned factor) +{ + struct msm_gpu_devfreq *df = &gpu->devfreq; + uint64_t freq; + + freq = get_freq(gpu); + freq *= factor; + + /* + * A nice little trap is that PM QoS operates in terms of KHz, + * while devfreq operates in terms of Hz: + */ + do_div(freq, HZ_PER_KHZ); + + dev_pm_qos_update_request(&df->boost_freq, freq); + + msm_hrtimer_queue_work(&df->boost_work, + ms_to_ktime(msm_devfreq_profile.polling_ms), + HRTIMER_MODE_REL); +} + void msm_devfreq_active(struct msm_gpu *gpu) { struct msm_gpu_devfreq *df = &gpu->devfreq; struct devfreq_dev_status status; unsigned int idle_time; - unsigned long target_freq = df->idle_freq; if (!df->devfreq) return; @@ -165,12 +195,6 @@ void msm_devfreq_active(struct msm_gpu *gpu) */ hrtimer_cancel(&df->idle_work.timer); - /* - * Hold devfreq lock to synchronize with get_dev_status()/ - * target() callbacks - */ - mutex_lock(&df->devfreq->lock); - idle_time = ktime_to_ms(ktime_sub(ktime_get(), df->idle_time)); /* @@ -179,20 +203,17 @@ void msm_devfreq_active(struct msm_gpu *gpu) * the governor to ramp up the freq.. so give some boost */ if (idle_time > msm_devfreq_profile.polling_ms) { - target_freq *= 2; + msm_devfreq_boost(gpu, 2); } - df->idle_freq = 0; - - msm_devfreq_target(&gpu->pdev->dev, &target_freq, 0); + dev_pm_qos_update_request(&df->idle_freq, + PM_QOS_MAX_FREQUENCY_DEFAULT_VALUE); /* * Reset the polling interval so we aren't inconsistent * about freq vs busy/total cycles */ msm_devfreq_get_dev_status(&gpu->pdev->dev, &status); - - mutex_unlock(&df->devfreq->lock); } @@ -201,23 +222,11 @@ static void msm_devfreq_idle_work(struct kthread_work *work) struct msm_gpu_devfreq *df = container_of(work, struct msm_gpu_devfreq, idle_work.work); struct msm_gpu *gpu = container_of(df, struct msm_gpu, devfreq); - unsigned long idle_freq, target_freq = 0; - - /* - * Hold devfreq lock to synchronize with get_dev_status()/ - * target() callbacks - */ - mutex_lock(&df->devfreq->lock); - - idle_freq = get_freq(gpu); - - if (gpu->clamp_to_idle) - msm_devfreq_target(&gpu->pdev->dev, &target_freq, 0); df->idle_time = ktime_get(); - df->idle_freq = idle_freq; - mutex_unlock(&df->devfreq->lock); + if (gpu->clamp_to_idle) + dev_pm_qos_update_request(&df->idle_freq, 0); } void msm_devfreq_idle(struct msm_gpu *gpu)