Received: by 2002:a25:1985:0:0:0:0:0 with SMTP id 127csp948075ybz; Fri, 1 May 2020 11:27:33 -0700 (PDT) X-Google-Smtp-Source: APiQypKMe1pDITq4i3GKeiuNC6i/zbFwGzF4BKTBg5MGR8tf7aHk9xbBQwLflucm+59/9cXIMJON X-Received: by 2002:a05:6402:1fc:: with SMTP id i28mr4616114edy.18.1588357653399; Fri, 01 May 2020 11:27:33 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1588357653; cv=none; d=google.com; s=arc-20160816; b=kJEuqS27rMwtzW6w6R20dM/KwabTgcXaiRMlmN2xTm38107SVsIfUtEp9x90Z/H0R5 dbGQAJEdPmEjbm/1abWCombmzc0U6NBH34lm88wDviUjJ8Wy+n4dHnCrgg/qFZBqfCuY SwNO14o12OW9Bod0R5h3ewd6AktdbrrdDZX4SjaCtEWmL803eNBTLzkCbNvzlbtiJ053 elQrYFSig0bHCJy8LP+yE0aacjMAO651bpR4+VsZlHbjj5hd054T6bGj9CQUXe0bhugS 0qSbY/1Go0rDE+RVJsL1mplsGU5qd6eJpg96561BuuG9n4kmeUheH7M/m8S0NR4E6mpc lamg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:message-id:date:subject:cc:to:from :dmarc-filter:dkim-signature; bh=oAbv7Whc5wnDq0DJoREo5UCU2XgDlITRPhApd/IgUDo=; b=v5vDqiP3ARq/+XRptJnU3+VUJQ+KgFtquzkUvGSoVZalZdLorrYCvQVyKjyrKEUw3o 781girZSUN86J6YZBvyoeV4ot7su24edoEexfGzKPVAr6Ehkei8AKnyRHqJ2H+ebAfAR zkvs/ZU9Ee2UhgObFzLEmTROiTzaTby9eka4G33pMkHdvPHvbFZYDINSGHMmGPHG7qC5 ckTPhhZxSrivrqjZxT6wUnYF/KlKEd3WwTjJcRWc5VA9GiBIVQrbUGJs7KZFhaONuWlB Qd5HCC+j5/Q4gXEyBf3GikML8koNMEmTr/mMsixiUySk1yBDhao9PS+VsI28tgE1h5Ag o1Zw== ARC-Authentication-Results: i=1; mx.google.com; dkim=fail header.i=@mg.codeaurora.org header.s=smtp header.b=TEGmZ5cS; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id aq11si2031081ejc.307.2020.05.01.11.27.10; Fri, 01 May 2020 11:27:33 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) client-ip=23.128.96.18; Authentication-Results: mx.google.com; dkim=fail header.i=@mg.codeaurora.org header.s=smtp header.b=TEGmZ5cS; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1730122AbgEASZz (ORCPT + 99 others); Fri, 1 May 2020 14:25:55 -0400 Received: from mail27.static.mailgun.info ([104.130.122.27]:41276 "EHLO mail27.static.mailgun.info" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1729671AbgEASZy (ORCPT ); Fri, 1 May 2020 14:25:54 -0400 DKIM-Signature: a=rsa-sha256; v=1; c=relaxed/relaxed; d=mg.codeaurora.org; q=dns/txt; s=smtp; t=1588357554; h=Message-Id: Date: Subject: Cc: To: From: Sender; bh=oAbv7Whc5wnDq0DJoREo5UCU2XgDlITRPhApd/IgUDo=; b=TEGmZ5cSsL7JEr+dgSOIHKumtNOb2z+m5CQ31Lx3gekVCr/CVAMo8ymLf4eXIZYEukns4kvJ pJr0HHUt0zXY+CH6BbczyxczIK26J0FULMDj23Nv4I8we6G2lN2KWmKbMRnGGQrcAy3Kt0El +aNbVziSbvPW09Hj97e/19bSzuc= X-Mailgun-Sending-Ip: 104.130.122.27 X-Mailgun-Sid: WyI0MWYwYSIsICJsaW51eC1rZXJuZWxAdmdlci5rZXJuZWwub3JnIiwgImJlOWU0YSJd Received: from smtp.codeaurora.org (ec2-35-166-182-171.us-west-2.compute.amazonaws.com [35.166.182.171]) by mxa.mailgun.org with ESMTP id 5eac69b1.7f2769a90688-smtp-out-n04; Fri, 01 May 2020 18:25:53 -0000 (UTC) Received: by smtp.codeaurora.org (Postfix, from userid 1001) id D488FC44791; Fri, 1 May 2020 18:25:51 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-caf-mail-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-1.0 required=2.0 tests=ALL_TRUSTED,SPF_NONE autolearn=unavailable autolearn_force=no version=3.4.0 Received: from jordan-laptop.qualcomm.com (Global_NAT1.qualcomm.com [129.46.96.20]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) (Authenticated sender: jcrouse) by smtp.codeaurora.org (Postfix) with ESMTPSA id 28E29C433D2; Fri, 1 May 2020 18:25:48 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 smtp.codeaurora.org 28E29C433D2 Authentication-Results: aws-us-west-2-caf-mail-1.web.codeaurora.org; dmarc=none (p=none dis=none) header.from=codeaurora.org Authentication-Results: aws-us-west-2-caf-mail-1.web.codeaurora.org; spf=none smtp.mailfrom=jcrouse@codeaurora.org From: Jordan Crouse To: linux-arm-msm@vger.kernel.org Cc: Eric Anholt , stable@vger.kernel.org, Akhil P Oommen , AngeloGioacchino Del Regno , Ben Dooks , Daniel Vetter , David Airlie , Jeffrey Hugo , Rob Clark , Sean Paul , Sharat Masetty , Stephen Boyd , Thomas Gleixner , dri-devel@lists.freedesktop.org, freedreno@lists.freedesktop.org, linux-kernel@vger.kernel.org Subject: [PATCH] drm/msm: Check for powered down HW in the devfreq callbacks Date: Fri, 1 May 2020 12:25:33 -0600 Message-Id: <20200501182533.19753-1-jcrouse@codeaurora.org> X-Mailer: git-send-email 2.17.1 Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Writing to the devfreq sysfs nodes while the GPU is powered down can result in a system crash (on a5xx) or a nasty GMU error (on a6xx): $ /sys/class/devfreq/5000000.gpu# echo 500000000 > min_freq [ 104.841625] platform 506a000.gmu: [drm:a6xx_gmu_set_oob] *ERROR* Timeout waiting for GMU OOB set GPU_DCVS: 0x0 Despite the fact that we carefully try to suspend the devfreq device when the hardware is powered down there are lots of holes in the governors that don't check for the suspend state and blindly call into the devfreq callbacks that end up triggering hardware reads in the GPU driver. Check the power state in the gpu_busy() and gpu_set_freq() callbacks for a5xx and a6xx to make sure that the hardware is active before trying to access it. Cc: stable@vger.kernel.org Signed-off-by: Jordan Crouse --- drivers/gpu/drm/msm/adreno/a5xx_gpu.c | 4 ++++ drivers/gpu/drm/msm/adreno/a6xx_gmu.c | 4 ++++ drivers/gpu/drm/msm/adreno/a6xx_gpu.c | 4 ++++ 3 files changed, 12 insertions(+) diff --git a/drivers/gpu/drm/msm/adreno/a5xx_gpu.c b/drivers/gpu/drm/msm/adreno/a5xx_gpu.c index 724024a2243a..9d8c7fe6377e 100644 --- a/drivers/gpu/drm/msm/adreno/a5xx_gpu.c +++ b/drivers/gpu/drm/msm/adreno/a5xx_gpu.c @@ -1404,6 +1404,10 @@ static unsigned long a5xx_gpu_busy(struct msm_gpu *gpu) { u64 busy_cycles, busy_time; + /* devfreq can get here while we are idle so do a quick check first */ + if (!pm_runtime_active(&gpu->pdev->dev)) + return ~0LU; + busy_cycles = gpu_read64(gpu, REG_A5XX_RBBM_PERFCTR_RBBM_0_LO, REG_A5XX_RBBM_PERFCTR_RBBM_0_HI); diff --git a/drivers/gpu/drm/msm/adreno/a6xx_gmu.c b/drivers/gpu/drm/msm/adreno/a6xx_gmu.c index c4e71abbdd53..84618f2ff073 100644 --- a/drivers/gpu/drm/msm/adreno/a6xx_gmu.c +++ b/drivers/gpu/drm/msm/adreno/a6xx_gmu.c @@ -108,6 +108,10 @@ static void __a6xx_gmu_set_freq(struct a6xx_gmu *gmu, int index) struct msm_gpu *gpu = &adreno_gpu->base; int ret; + /* This can be called via devfreq even when the power is off */ + if (!pm_runtime_active(gmu->dev)) + return; + gmu_write(gmu, REG_A6XX_GMU_DCVS_ACK_OPTION, 0); gmu_write(gmu, REG_A6XX_GMU_DCVS_PERF_SETTING, diff --git a/drivers/gpu/drm/msm/adreno/a6xx_gpu.c b/drivers/gpu/drm/msm/adreno/a6xx_gpu.c index 68af24150de5..443efc952f13 100644 --- a/drivers/gpu/drm/msm/adreno/a6xx_gpu.c +++ b/drivers/gpu/drm/msm/adreno/a6xx_gpu.c @@ -810,6 +810,10 @@ static unsigned long a6xx_gpu_busy(struct msm_gpu *gpu) struct a6xx_gpu *a6xx_gpu = to_a6xx_gpu(adreno_gpu); u64 busy_cycles, busy_time; + /* devfreq can get here while we are idle so do a quick check first */ + if (!pm_runtime_active(a6xx_gpu->gmu.dev)) + return ~0LU; + busy_cycles = gmu_read64(&a6xx_gpu->gmu, REG_A6XX_GMU_CX_GMU_POWER_COUNTER_XOCLK_0_L, REG_A6XX_GMU_CX_GMU_POWER_COUNTER_XOCLK_0_H); -- 2.17.1