From patchwork Wed Apr 15 13:52:05 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Qiang Yu X-Patchwork-Id: 11491311 Return-Path: Received: from mail.kernel.org (pdx-korg-mail-1.web.codeaurora.org [172.30.200.123]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id 9A26B912 for ; Wed, 15 Apr 2020 13:53:43 +0000 (UTC) Received: from gabe.freedesktop.org (gabe.freedesktop.org [131.252.210.177]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id 786E22074F for ; Wed, 15 Apr 2020 13:53:43 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=fail reason="signature verification failed" (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="sExHSfIT" DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 786E22074F Authentication-Results: mail.kernel.org; dmarc=fail (p=none dis=none) header.from=gmail.com Authentication-Results: mail.kernel.org; spf=none smtp.mailfrom=dri-devel-bounces@lists.freedesktop.org Received: from gabe.freedesktop.org (localhost [127.0.0.1]) by gabe.freedesktop.org (Postfix) with ESMTP id 71EDA6E9E1; Wed, 15 Apr 2020 13:53:42 +0000 (UTC) X-Original-To: dri-devel@lists.freedesktop.org Delivered-To: dri-devel@lists.freedesktop.org Received: from mail-pl1-x642.google.com (mail-pl1-x642.google.com [IPv6:2607:f8b0:4864:20::642]) by gabe.freedesktop.org (Postfix) with ESMTPS id DE2506E9E0; Wed, 15 Apr 2020 13:53:40 +0000 (UTC) Received: by mail-pl1-x642.google.com with SMTP id w3so12407plz.5; Wed, 15 Apr 2020 06:53:40 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=XqufiimgzptGbIiLqGBwiwvU98F4xD+BMGDQo0FlqCg=; b=sExHSfITepxSiyS7EL2EA/czeOKQGUISshfJJYS01bh2Z87Hm0ZQ1LSvFeAQ04DwNq DoguEpRhyv1y+fWVIoLiPpnp+kq8s2S0V2TELPa/Iz1VS15nXYr+sHqsTquD8gbzHXUd kR5cI3JMJiUfq0Uc+QnJcvwK7ejkH8MvMksXMsukXI8KZ+1StkJZAE537+SObad/hOw2 84Fhs4PewMf6ve7vj6KMBZFPiyuYrO6hS5O3sWyokILLPiVME7h12/Es85DJlPaj5CVL QpnpvUcjsEFe4PG79R9+GCYjLnp/JDPPs9xty8/oQUqS8qMtiMq5TSOdJlIUFlfWyY1p G0Ng== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=XqufiimgzptGbIiLqGBwiwvU98F4xD+BMGDQo0FlqCg=; b=mcqElIrcPlE4LfbzFukEnxyHA+p8qtxrIwyu+4a8pSUOYWj0+sQOOjjSN31aSmex4S KKkWSa7b5ta36ijnnPPBSb/LV2kBEjommUCFBP5mVL2BEO5qLoz7eiyoOQXb+45STIIt Kzw60IjifEPVjjCvROUo7Bf1xXODPA59hiKVryzsAjdYtqo22mcFbu7R4uUI2wJ0mHC1 5lTKEpJ/5KxjxfW4kcZypZGqHLoX3zo00Dqj6yxts4rKx/LvVMq6E2fsIUbMjG665CrG 2C6NZdx9D75O6njdIKhrMBgS3rVDzzydDS2Iempq5rtpXr0zZTJ7fAyzFHaE55+wLEtH XPew== X-Gm-Message-State: AGi0Pubg/kZZqZLQ4UgTXkQDqUvZToL1cy6QE2CTriAa+DWx5jS4O8fq lM5Q2Hat9WPSVwl7IeIuazaXGJcx8IWBag== X-Google-Smtp-Source: APiQypLLmLqCjrX5Y1A2Pen7T2h6uL27H+7Brcp2S/1u7Ix+nfZErSj+0JVwb+HVgWvI8Kf4domJDw== X-Received: by 2002:a17:90a:c687:: with SMTP id n7mr6414386pjt.12.1586958820172; Wed, 15 Apr 2020 06:53:40 -0700 (PDT) Received: from yuq-Aspire-4738G.lan (li2017-195.members.linode.com. [172.105.124.195]) by smtp.gmail.com with ESMTPSA id z1sm3331069pjt.42.2020.04.15.06.53.35 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 15 Apr 2020 06:53:39 -0700 (PDT) From: Qiang Yu To: dri-devel@lists.freedesktop.org Subject: [PATCH 1/4] drm/lima: add lima_devfreq_resume/suspend Date: Wed, 15 Apr 2020 21:52:05 +0800 Message-Id: <20200415135208.8960-2-yuq825@gmail.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20200415135208.8960-1-yuq825@gmail.com> References: <20200415135208.8960-1-yuq825@gmail.com> X-BeenThere: dri-devel@lists.freedesktop.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Direct Rendering Infrastructure - Development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: lima@lists.freedesktop.org, David Airlie , Bhushan Shah , Vasily Khoruzhick , Andreas Baierl , Qiang Yu , Erico Nunes MIME-Version: 1.0 Errors-To: dri-devel-bounces@lists.freedesktop.org Sender: "dri-devel" Used for device resume/suspend in the following commits. Tested-by: Bhushan Shah Signed-off-by: Qiang Yu --- drivers/gpu/drm/lima/lima_devfreq.c | 24 ++++++++++++++++++++++++ drivers/gpu/drm/lima/lima_devfreq.h | 3 +++ 2 files changed, 27 insertions(+) diff --git a/drivers/gpu/drm/lima/lima_devfreq.c b/drivers/gpu/drm/lima/lima_devfreq.c index 8c4d21d07529..f5bf85bbbb67 100644 --- a/drivers/gpu/drm/lima/lima_devfreq.c +++ b/drivers/gpu/drm/lima/lima_devfreq.c @@ -232,3 +232,27 @@ void lima_devfreq_record_idle(struct lima_devfreq *devfreq) spin_unlock_irqrestore(&devfreq->lock, irqflags); } + +int lima_devfreq_resume(struct lima_devfreq *devfreq) +{ + unsigned long irqflags; + + if (!devfreq->devfreq) + return 0; + + spin_lock_irqsave(&devfreq->lock, irqflags); + + lima_devfreq_reset(devfreq); + + spin_unlock_irqrestore(&devfreq->lock, irqflags); + + return devfreq_resume_device(devfreq->devfreq); +} + +int lima_devfreq_suspend(struct lima_devfreq *devfreq) +{ + if (!devfreq->devfreq) + return 0; + + return devfreq_suspend_device(devfreq->devfreq); +} diff --git a/drivers/gpu/drm/lima/lima_devfreq.h b/drivers/gpu/drm/lima/lima_devfreq.h index 8d71ba9fb22a..5eed2975a375 100644 --- a/drivers/gpu/drm/lima/lima_devfreq.h +++ b/drivers/gpu/drm/lima/lima_devfreq.h @@ -38,4 +38,7 @@ void lima_devfreq_fini(struct lima_device *ldev); void lima_devfreq_record_busy(struct lima_devfreq *devfreq); void lima_devfreq_record_idle(struct lima_devfreq *devfreq); +int lima_devfreq_resume(struct lima_devfreq *devfreq); +int lima_devfreq_suspend(struct lima_devfreq *devfreq); + #endif From patchwork Wed Apr 15 13:52:06 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Qiang Yu X-Patchwork-Id: 11491313 Return-Path: Received: from mail.kernel.org (pdx-korg-mail-1.web.codeaurora.org [172.30.200.123]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id E6216912 for ; Wed, 15 Apr 2020 13:53:47 +0000 (UTC) Received: from gabe.freedesktop.org (gabe.freedesktop.org [131.252.210.177]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id C38E320775 for ; Wed, 15 Apr 2020 13:53:47 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=fail reason="signature verification failed" (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="Eyn9aRp1" DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org C38E320775 Authentication-Results: mail.kernel.org; dmarc=fail (p=none dis=none) header.from=gmail.com Authentication-Results: mail.kernel.org; spf=none smtp.mailfrom=dri-devel-bounces@lists.freedesktop.org Received: from gabe.freedesktop.org (localhost [127.0.0.1]) by gabe.freedesktop.org (Postfix) with ESMTP id C10296E9E0; Wed, 15 Apr 2020 13:53:46 +0000 (UTC) X-Original-To: dri-devel@lists.freedesktop.org Delivered-To: dri-devel@lists.freedesktop.org Received: from mail-pg1-x544.google.com (mail-pg1-x544.google.com [IPv6:2607:f8b0:4864:20::544]) by gabe.freedesktop.org (Postfix) with ESMTPS id 8E65A6E9E0; Wed, 15 Apr 2020 13:53:45 +0000 (UTC) Received: by mail-pg1-x544.google.com with SMTP id 2so1467721pgp.11; Wed, 15 Apr 2020 06:53:45 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=k2adAloEblHJhyp5jzo7dtGYvlSpgiWExtgTI5q+0+E=; b=Eyn9aRp1vrVi8Hf69/4pK/MRqQVQ46G7A7tpRqeMOceuF5BJpoPN0DLeguOORzyEX8 phgmoGBvvHNO9PE/3+CiYoWK/dxonl2wjzUPL35KMpoM+XwtHCvb2tZRh8mHdBxMSMrt HsYZ3xg0ESpmJxUGPFPEdK9yRX+hqH2gWms+oxo0j11WDeybU6Q+g1XdsNivcthg5yEZ 6EgEvsuJ/ZK7FC9G9s9psj5aBKCfBR4rJciZW7MK9AItdWPqbdBbCLPgEhLKadOshCXJ 0na9C4vJubWLuRk/XWrRD9pgwqNhpmNgS78IbwqfgBJ938aN6cqq2UACdVHQRNwX6oxx Rjtw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=k2adAloEblHJhyp5jzo7dtGYvlSpgiWExtgTI5q+0+E=; b=C03Wdkgfv5IaNuiKvdg7sJ6oqIZR5N1ZT6anAwK9FJFuZcB4Q/8vIPm0gJ/I4xPdJq nMEiVsdYgQ72Mn74O/7O1a2zF67ZDPc4LbbA9CgPvegxvtvDmxmVFBUXFy2RTznlyN2m Hy2RoPOyvWWhc+3wvhdf91HEYMXULr9ehNWIm4VdH6QgftYhxPLvLHx8yoLtbENtkUFr cTpLhHpmzUOaqOz8UM01YZcO48bL1FTnqLfuAVN+xHboFa2WKycon8J6SRrpfvQetJlK oFawLnbc7hktppcZqb+v3wuPwLlLeMnIyJMpCgBPmqJTelx8R2pvYrhj2x0dKQ0C6CoK MZHw== X-Gm-Message-State: AGi0PuYGdGATECOG3zfxv1Gfu6Jldy9aNq1QZK/YDoPT3bRYHAZ6/QEU ldQlFsZtmrK4L5+JBuhsXvtm5uJ8V7uLFQ== X-Google-Smtp-Source: APiQypI+XLHLaFtXq4UKHwh+i0nOfKKap6K9NIBA1tb/7QG/4WtzRzBZNNT8wGaPjyz2dwU4EIxHZA== X-Received: by 2002:a62:686:: with SMTP id 128mr26832999pfg.152.1586958824877; Wed, 15 Apr 2020 06:53:44 -0700 (PDT) Received: from yuq-Aspire-4738G.lan (li2017-195.members.linode.com. [172.105.124.195]) by smtp.gmail.com with ESMTPSA id z1sm3331069pjt.42.2020.04.15.06.53.40 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 15 Apr 2020 06:53:44 -0700 (PDT) From: Qiang Yu To: dri-devel@lists.freedesktop.org Subject: [PATCH 2/4] drm/lima: power down ip blocks when pmu exit Date: Wed, 15 Apr 2020 21:52:06 +0800 Message-Id: <20200415135208.8960-3-yuq825@gmail.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20200415135208.8960-1-yuq825@gmail.com> References: <20200415135208.8960-1-yuq825@gmail.com> X-BeenThere: dri-devel@lists.freedesktop.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Direct Rendering Infrastructure - Development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: lima@lists.freedesktop.org, David Airlie , Bhushan Shah , Vasily Khoruzhick , Andreas Baierl , Qiang Yu , Erico Nunes MIME-Version: 1.0 Errors-To: dri-devel-bounces@lists.freedesktop.org Sender: "dri-devel" Prepare resume/suspend PM. Tested-by: Bhushan Shah Signed-off-by: Qiang Yu --- drivers/gpu/drm/lima/lima_device.h | 2 ++ drivers/gpu/drm/lima/lima_pmu.c | 43 ++++++++++++++++++++++++++++++ 2 files changed, 45 insertions(+) diff --git a/drivers/gpu/drm/lima/lima_device.h b/drivers/gpu/drm/lima/lima_device.h index 06fd9636dd72..1a5032b08883 100644 --- a/drivers/gpu/drm/lima/lima_device.h +++ b/drivers/gpu/drm/lima/lima_device.h @@ -64,6 +64,8 @@ struct lima_ip { bool async_reset; /* l2 cache */ spinlock_t lock; + /* pmu */ + u32 mask; } data; }; diff --git a/drivers/gpu/drm/lima/lima_pmu.c b/drivers/gpu/drm/lima/lima_pmu.c index 571f6d661581..7f26bf384e15 100644 --- a/drivers/gpu/drm/lima/lima_pmu.c +++ b/drivers/gpu/drm/lima/lima_pmu.c @@ -29,6 +29,40 @@ static int lima_pmu_wait_cmd(struct lima_ip *ip) return 0; } +static u32 lima_pmu_get_ip_mask(struct lima_ip *ip) +{ + struct lima_device *dev = ip->dev; + u32 ret = 0; + int i; + + ret |= LIMA_PMU_POWER_GP0_MASK; + + if (dev->id == lima_gpu_mali400) { + ret |= LIMA_PMU_POWER_L2_MASK; + for (i = 0; i < 4; i++) { + if (dev->ip[lima_ip_pp0 + i].present) + ret |= LIMA_PMU_POWER_PP_MASK(i); + } + } else { + if (dev->ip[lima_ip_pp0].present) + ret |= LIMA450_PMU_POWER_PP0_MASK; + for (i = lima_ip_pp1; i <= lima_ip_pp3; i++) { + if (dev->ip[i].present) { + ret |= LIMA450_PMU_POWER_PP13_MASK; + break; + } + } + for (i = lima_ip_pp4; i <= lima_ip_pp7; i++) { + if (dev->ip[i].present) { + ret |= LIMA450_PMU_POWER_PP47_MASK; + break; + } + } + } + + return ret; +} + int lima_pmu_init(struct lima_ip *ip) { int err; @@ -56,5 +90,14 @@ int lima_pmu_init(struct lima_ip *ip) void lima_pmu_fini(struct lima_ip *ip) { + u32 stat; + if (!ip->data.mask) + ip->data.mask = lima_pmu_get_ip_mask(ip); + + stat = ~pmu_read(LIMA_PMU_STATUS) & ip->data.mask; + if (stat) { + pmu_write(LIMA_PMU_POWER_DOWN, stat); + lima_pmu_wait_cmd(ip); + } } From patchwork Wed Apr 15 13:52:07 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Qiang Yu X-Patchwork-Id: 11491315 Return-Path: Received: from mail.kernel.org (pdx-korg-mail-1.web.codeaurora.org [172.30.200.123]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id 78908112C for ; Wed, 15 Apr 2020 13:53:52 +0000 (UTC) Received: from gabe.freedesktop.org (gabe.freedesktop.org [131.252.210.177]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id 571442076D for ; Wed, 15 Apr 2020 13:53:52 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=fail reason="signature verification failed" (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="o+WjCXvh" DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 571442076D Authentication-Results: mail.kernel.org; dmarc=fail (p=none dis=none) header.from=gmail.com Authentication-Results: mail.kernel.org; spf=none smtp.mailfrom=dri-devel-bounces@lists.freedesktop.org Received: from gabe.freedesktop.org (localhost [127.0.0.1]) by gabe.freedesktop.org (Postfix) with ESMTP id 8CD9C6E9E3; Wed, 15 Apr 2020 13:53:51 +0000 (UTC) X-Original-To: dri-devel@lists.freedesktop.org Delivered-To: dri-devel@lists.freedesktop.org Received: from mail-pj1-x1033.google.com (mail-pj1-x1033.google.com [IPv6:2607:f8b0:4864:20::1033]) by gabe.freedesktop.org (Postfix) with ESMTPS id A1AEE6E9E3; Wed, 15 Apr 2020 13:53:50 +0000 (UTC) Received: by mail-pj1-x1033.google.com with SMTP id a32so6792818pje.5; Wed, 15 Apr 2020 06:53:50 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=1TYZv9JP92N2J8178uaV6manbwZcTV06YpVK5S4w03I=; b=o+WjCXvhOlwuC56C99X7KpmBzCTUYU9ur807NWiZZa44gzNiIGdyansYFg6dxP8dqs wSA9KAgsrMQhNpqwmqExvnsoXpPRJPieOSOjuu4Q28CQ+YxZ9xNk8M37x9VJmyaVsVNe YLAe6oiq/zOwZVmNFc7ebBEkoKDa7ZCWhKvv9RjQkxFZbsXtnD/FnjAFOZCmYhMAOuj8 KEhTH73c+vcqsZWx7tG+0Em3EOQ/ewztl1+d0l3b4vRIK+UIfpU2R+f5DyXlzKVsR9D/ g7+mxMRQA98t++IoRUBOAgJjWjewoXp1/39xCzfFDXKpLS4JLkxEuRbtAM8IjMAAjNw5 gVtw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=1TYZv9JP92N2J8178uaV6manbwZcTV06YpVK5S4w03I=; b=Ri6gE+kCgntOIUxIJ+6ZauJXSv6VclY/IZUuYSJBpdtaNr7Fe8Sx8SWMmPa6PkHEc6 vVIJzLqaocWzV8cQtsB6NfzsjwssIzjKrToJvrwZmvBJdiH5F0P9M3SLhwBv32xmnZbr LJqmXc5FsukctLWhzsrlKsaDqsYWgYYj1jw+P0iTme8TyXYLEgaN17XAOX4JBpdpqKkY V36YYI2xg4Z5ve8mOEtky5iJG8aMovmOjVt+aE6t3IGEXpVTzjBikZNH+e3a2OLMWHu7 6OJWwG5XuDyy1WbYyoarvtMPQR1fC/9msbCzPfXDRepftrOFcMstZ55S0doFT/2tWOXh oD4g== X-Gm-Message-State: AGi0PuYYsOnlEQMVaVCmicpyDdp6NPUKzDmLEjd15iMpNkbZS39XbLba 3bO9ADlQPN23MIWeatsSiLHNfFKHhCLukA== X-Google-Smtp-Source: APiQypJMmSaxC3gUHz4p/DqRXW6rpY2v8Ti/p/a8gG5UatE2K+H331ZCtW+Tmkz767QcqF+L2O0yPA== X-Received: by 2002:a17:902:a40f:: with SMTP id p15mr5241736plq.154.1586958829719; Wed, 15 Apr 2020 06:53:49 -0700 (PDT) Received: from yuq-Aspire-4738G.lan (li2017-195.members.linode.com. [172.105.124.195]) by smtp.gmail.com with ESMTPSA id z1sm3331069pjt.42.2020.04.15.06.53.45 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 15 Apr 2020 06:53:49 -0700 (PDT) From: Qiang Yu To: dri-devel@lists.freedesktop.org Subject: [PATCH 3/4] drm/lima: add resume/suspend callback for each ip Date: Wed, 15 Apr 2020 21:52:07 +0800 Message-Id: <20200415135208.8960-4-yuq825@gmail.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20200415135208.8960-1-yuq825@gmail.com> References: <20200415135208.8960-1-yuq825@gmail.com> X-BeenThere: dri-devel@lists.freedesktop.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Direct Rendering Infrastructure - Development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: lima@lists.freedesktop.org, David Airlie , Bhushan Shah , Vasily Khoruzhick , Andreas Baierl , Qiang Yu , Erico Nunes MIME-Version: 1.0 Errors-To: dri-devel-bounces@lists.freedesktop.org Sender: "dri-devel" For called when PM do resume/suspend. Tested-by: Bhushan Shah Signed-off-by: Qiang Yu --- drivers/gpu/drm/lima/lima_bcast.c | 25 ++++++++++++---- drivers/gpu/drm/lima/lima_bcast.h | 2 ++ drivers/gpu/drm/lima/lima_device.c | 4 +++ drivers/gpu/drm/lima/lima_device.h | 2 +- drivers/gpu/drm/lima/lima_dlbu.c | 17 ++++++++++- drivers/gpu/drm/lima/lima_dlbu.h | 2 ++ drivers/gpu/drm/lima/lima_gp.c | 21 +++++++++++-- drivers/gpu/drm/lima/lima_gp.h | 2 ++ drivers/gpu/drm/lima/lima_l2_cache.c | 37 ++++++++++++++++------- drivers/gpu/drm/lima/lima_l2_cache.h | 2 ++ drivers/gpu/drm/lima/lima_mmu.c | 45 ++++++++++++++++++++-------- drivers/gpu/drm/lima/lima_mmu.h | 2 ++ drivers/gpu/drm/lima/lima_pmu.c | 25 ++++++++++++++-- drivers/gpu/drm/lima/lima_pmu.h | 2 ++ drivers/gpu/drm/lima/lima_pp.c | 31 +++++++++++++++++-- drivers/gpu/drm/lima/lima_pp.h | 4 +++ 16 files changed, 186 insertions(+), 37 deletions(-) diff --git a/drivers/gpu/drm/lima/lima_bcast.c b/drivers/gpu/drm/lima/lima_bcast.c index 288398027bfa..fbc43f243c54 100644 --- a/drivers/gpu/drm/lima/lima_bcast.c +++ b/drivers/gpu/drm/lima/lima_bcast.c @@ -26,18 +26,33 @@ void lima_bcast_enable(struct lima_device *dev, int num_pp) bcast_write(LIMA_BCAST_BROADCAST_MASK, mask); } +static int lima_bcast_hw_init(struct lima_ip *ip) +{ + bcast_write(LIMA_BCAST_BROADCAST_MASK, ip->data.mask << 16); + bcast_write(LIMA_BCAST_INTERRUPT_MASK, ip->data.mask); + return 0; +} + +int lima_bcast_resume(struct lima_ip *ip) +{ + return lima_bcast_hw_init(ip); +} + +void lima_bcast_suspend(struct lima_ip *ip) +{ + +} + int lima_bcast_init(struct lima_ip *ip) { - int i, mask = 0; + int i; for (i = lima_ip_pp0; i <= lima_ip_pp7; i++) { if (ip->dev->ip[i].present) - mask |= 1 << (i - lima_ip_pp0); + ip->data.mask |= 1 << (i - lima_ip_pp0); } - bcast_write(LIMA_BCAST_BROADCAST_MASK, mask << 16); - bcast_write(LIMA_BCAST_INTERRUPT_MASK, mask); - return 0; + return lima_bcast_hw_init(ip); } void lima_bcast_fini(struct lima_ip *ip) diff --git a/drivers/gpu/drm/lima/lima_bcast.h b/drivers/gpu/drm/lima/lima_bcast.h index c47e58563d0a..465ee587bceb 100644 --- a/drivers/gpu/drm/lima/lima_bcast.h +++ b/drivers/gpu/drm/lima/lima_bcast.h @@ -6,6 +6,8 @@ struct lima_ip; +int lima_bcast_resume(struct lima_ip *ip); +void lima_bcast_suspend(struct lima_ip *ip); int lima_bcast_init(struct lima_ip *ip); void lima_bcast_fini(struct lima_ip *ip); diff --git a/drivers/gpu/drm/lima/lima_device.c b/drivers/gpu/drm/lima/lima_device.c index 247f51fd40a2..e5f1f84ba85a 100644 --- a/drivers/gpu/drm/lima/lima_device.c +++ b/drivers/gpu/drm/lima/lima_device.c @@ -25,6 +25,8 @@ struct lima_ip_desc { int (*init)(struct lima_ip *ip); void (*fini)(struct lima_ip *ip); + int (*resume)(struct lima_ip *ip); + void (*suspend)(struct lima_ip *ip); }; #define LIMA_IP_DESC(ipname, mst0, mst1, off0, off1, func, irq) \ @@ -41,6 +43,8 @@ struct lima_ip_desc { }, \ .init = lima_##func##_init, \ .fini = lima_##func##_fini, \ + .resume = lima_##func##_resume, \ + .suspend = lima_##func##_suspend, \ } static struct lima_ip_desc lima_ip_desc[lima_ip_num] = { diff --git a/drivers/gpu/drm/lima/lima_device.h b/drivers/gpu/drm/lima/lima_device.h index 1a5032b08883..095a0b5f1703 100644 --- a/drivers/gpu/drm/lima/lima_device.h +++ b/drivers/gpu/drm/lima/lima_device.h @@ -64,7 +64,7 @@ struct lima_ip { bool async_reset; /* l2 cache */ spinlock_t lock; - /* pmu */ + /* pmu/bcast */ u32 mask; } data; }; diff --git a/drivers/gpu/drm/lima/lima_dlbu.c b/drivers/gpu/drm/lima/lima_dlbu.c index 8399ceffb94b..c1d5ea35daa7 100644 --- a/drivers/gpu/drm/lima/lima_dlbu.c +++ b/drivers/gpu/drm/lima/lima_dlbu.c @@ -42,7 +42,7 @@ void lima_dlbu_set_reg(struct lima_ip *ip, u32 *reg) dlbu_write(LIMA_DLBU_START_TILE_POS, reg[3]); } -int lima_dlbu_init(struct lima_ip *ip) +static int lima_dlbu_hw_init(struct lima_ip *ip) { struct lima_device *dev = ip->dev; @@ -52,6 +52,21 @@ int lima_dlbu_init(struct lima_ip *ip) return 0; } +int lima_dlbu_resume(struct lima_ip *ip) +{ + return lima_dlbu_hw_init(ip); +} + +void lima_dlbu_suspend(struct lima_ip *ip) +{ + +} + +int lima_dlbu_init(struct lima_ip *ip) +{ + return lima_dlbu_hw_init(ip); +} + void lima_dlbu_fini(struct lima_ip *ip) { diff --git a/drivers/gpu/drm/lima/lima_dlbu.h b/drivers/gpu/drm/lima/lima_dlbu.h index 16f877984466..be71daaaee89 100644 --- a/drivers/gpu/drm/lima/lima_dlbu.h +++ b/drivers/gpu/drm/lima/lima_dlbu.h @@ -12,6 +12,8 @@ void lima_dlbu_disable(struct lima_device *dev); void lima_dlbu_set_reg(struct lima_ip *ip, u32 *reg); +int lima_dlbu_resume(struct lima_ip *ip); +void lima_dlbu_suspend(struct lima_ip *ip); int lima_dlbu_init(struct lima_ip *ip); void lima_dlbu_fini(struct lima_ip *ip); diff --git a/drivers/gpu/drm/lima/lima_gp.c b/drivers/gpu/drm/lima/lima_gp.c index d8841c870d90..8dd501b7a3d0 100644 --- a/drivers/gpu/drm/lima/lima_gp.c +++ b/drivers/gpu/drm/lima/lima_gp.c @@ -274,6 +274,23 @@ static void lima_gp_print_version(struct lima_ip *ip) static struct kmem_cache *lima_gp_task_slab; static int lima_gp_task_slab_refcnt; +static int lima_gp_hw_init(struct lima_ip *ip) +{ + ip->data.async_reset = false; + lima_gp_soft_reset_async(ip); + return lima_gp_soft_reset_async_wait(ip); +} + +int lima_gp_resume(struct lima_ip *ip) +{ + return lima_gp_hw_init(ip); +} + +void lima_gp_suspend(struct lima_ip *ip) +{ + +} + int lima_gp_init(struct lima_ip *ip) { struct lima_device *dev = ip->dev; @@ -281,9 +298,7 @@ int lima_gp_init(struct lima_ip *ip) lima_gp_print_version(ip); - ip->data.async_reset = false; - lima_gp_soft_reset_async(ip); - err = lima_gp_soft_reset_async_wait(ip); + err = lima_gp_hw_init(ip); if (err) return err; diff --git a/drivers/gpu/drm/lima/lima_gp.h b/drivers/gpu/drm/lima/lima_gp.h index 516e5c1babbb..02ec9af78a51 100644 --- a/drivers/gpu/drm/lima/lima_gp.h +++ b/drivers/gpu/drm/lima/lima_gp.h @@ -7,6 +7,8 @@ struct lima_ip; struct lima_device; +int lima_gp_resume(struct lima_ip *ip); +void lima_gp_suspend(struct lima_ip *ip); int lima_gp_init(struct lima_ip *ip); void lima_gp_fini(struct lima_ip *ip); diff --git a/drivers/gpu/drm/lima/lima_l2_cache.c b/drivers/gpu/drm/lima/lima_l2_cache.c index 6873a7af5a5c..c67fa34fba18 100644 --- a/drivers/gpu/drm/lima/lima_l2_cache.c +++ b/drivers/gpu/drm/lima/lima_l2_cache.c @@ -38,9 +38,34 @@ int lima_l2_cache_flush(struct lima_ip *ip) return ret; } +static int lima_l2_cache_hw_init(struct lima_ip *ip) +{ + int err; + + err = lima_l2_cache_flush(ip); + if (err) + return err; + + l2_cache_write(LIMA_L2_CACHE_ENABLE, + LIMA_L2_CACHE_ENABLE_ACCESS|LIMA_L2_CACHE_ENABLE_READ_ALLOCATE); + l2_cache_write(LIMA_L2_CACHE_MAX_READS, 0x1c); + + return 0; +} + +int lima_l2_cache_resume(struct lima_ip *ip) +{ + return lima_l2_cache_hw_init(ip); +} + +void lima_l2_cache_suspend(struct lima_ip *ip) +{ + +} + int lima_l2_cache_init(struct lima_ip *ip) { - int i, err; + int i; u32 size; struct lima_device *dev = ip->dev; @@ -63,15 +88,7 @@ int lima_l2_cache_init(struct lima_ip *ip) 1 << (size & 0xff), 1 << ((size >> 24) & 0xff)); - err = lima_l2_cache_flush(ip); - if (err) - return err; - - l2_cache_write(LIMA_L2_CACHE_ENABLE, - LIMA_L2_CACHE_ENABLE_ACCESS|LIMA_L2_CACHE_ENABLE_READ_ALLOCATE); - l2_cache_write(LIMA_L2_CACHE_MAX_READS, 0x1c); - - return 0; + return lima_l2_cache_hw_init(ip); } void lima_l2_cache_fini(struct lima_ip *ip) diff --git a/drivers/gpu/drm/lima/lima_l2_cache.h b/drivers/gpu/drm/lima/lima_l2_cache.h index c63fb676ff14..1aeeefd53fb9 100644 --- a/drivers/gpu/drm/lima/lima_l2_cache.h +++ b/drivers/gpu/drm/lima/lima_l2_cache.h @@ -6,6 +6,8 @@ struct lima_ip; +int lima_l2_cache_resume(struct lima_ip *ip); +void lima_l2_cache_suspend(struct lima_ip *ip); int lima_l2_cache_init(struct lima_ip *ip); void lima_l2_cache_fini(struct lima_ip *ip); diff --git a/drivers/gpu/drm/lima/lima_mmu.c b/drivers/gpu/drm/lima/lima_mmu.c index f79d2af427e7..c12521ee94ce 100644 --- a/drivers/gpu/drm/lima/lima_mmu.c +++ b/drivers/gpu/drm/lima/lima_mmu.c @@ -59,12 +59,43 @@ static irqreturn_t lima_mmu_irq_handler(int irq, void *data) return IRQ_HANDLED; } -int lima_mmu_init(struct lima_ip *ip) +static int lima_mmu_hw_init(struct lima_ip *ip) { struct lima_device *dev = ip->dev; int err; u32 v; + mmu_write(LIMA_MMU_COMMAND, LIMA_MMU_COMMAND_HARD_RESET); + err = lima_mmu_send_command(LIMA_MMU_COMMAND_HARD_RESET, + LIMA_MMU_DTE_ADDR, v, v == 0); + if (err) + return err; + + mmu_write(LIMA_MMU_INT_MASK, LIMA_MMU_INT_PAGE_FAULT | LIMA_MMU_INT_READ_BUS_ERROR); + mmu_write(LIMA_MMU_DTE_ADDR, dev->empty_vm->pd.dma); + return lima_mmu_send_command(LIMA_MMU_COMMAND_ENABLE_PAGING, + LIMA_MMU_STATUS, v, + v & LIMA_MMU_STATUS_PAGING_ENABLED); +} + +int lima_mmu_resume(struct lima_ip *ip) +{ + if (ip->id == lima_ip_ppmmu_bcast) + return 0; + + return lima_mmu_hw_init(ip); +} + +void lima_mmu_suspend(struct lima_ip *ip) +{ + +} + +int lima_mmu_init(struct lima_ip *ip) +{ + struct lima_device *dev = ip->dev; + int err; + if (ip->id == lima_ip_ppmmu_bcast) return 0; @@ -74,12 +105,6 @@ int lima_mmu_init(struct lima_ip *ip) return -EIO; } - mmu_write(LIMA_MMU_COMMAND, LIMA_MMU_COMMAND_HARD_RESET); - err = lima_mmu_send_command(LIMA_MMU_COMMAND_HARD_RESET, - LIMA_MMU_DTE_ADDR, v, v == 0); - if (err) - return err; - err = devm_request_irq(dev->dev, ip->irq, lima_mmu_irq_handler, IRQF_SHARED, lima_ip_name(ip), ip); if (err) { @@ -87,11 +112,7 @@ int lima_mmu_init(struct lima_ip *ip) return err; } - mmu_write(LIMA_MMU_INT_MASK, LIMA_MMU_INT_PAGE_FAULT | LIMA_MMU_INT_READ_BUS_ERROR); - mmu_write(LIMA_MMU_DTE_ADDR, dev->empty_vm->pd.dma); - return lima_mmu_send_command(LIMA_MMU_COMMAND_ENABLE_PAGING, - LIMA_MMU_STATUS, v, - v & LIMA_MMU_STATUS_PAGING_ENABLED); + return lima_mmu_hw_init(ip); } void lima_mmu_fini(struct lima_ip *ip) diff --git a/drivers/gpu/drm/lima/lima_mmu.h b/drivers/gpu/drm/lima/lima_mmu.h index 4f8ccbebcba1..f0c97ac75ea0 100644 --- a/drivers/gpu/drm/lima/lima_mmu.h +++ b/drivers/gpu/drm/lima/lima_mmu.h @@ -7,6 +7,8 @@ struct lima_ip; struct lima_vm; +int lima_mmu_resume(struct lima_ip *ip); +void lima_mmu_suspend(struct lima_ip *ip); int lima_mmu_init(struct lima_ip *ip); void lima_mmu_fini(struct lima_ip *ip); diff --git a/drivers/gpu/drm/lima/lima_pmu.c b/drivers/gpu/drm/lima/lima_pmu.c index 7f26bf384e15..014b07c55b46 100644 --- a/drivers/gpu/drm/lima/lima_pmu.c +++ b/drivers/gpu/drm/lima/lima_pmu.c @@ -63,7 +63,7 @@ static u32 lima_pmu_get_ip_mask(struct lima_ip *ip) return ret; } -int lima_pmu_init(struct lima_ip *ip) +static int lima_pmu_hw_init(struct lima_ip *ip) { int err; u32 stat; @@ -88,7 +88,7 @@ int lima_pmu_init(struct lima_ip *ip) return 0; } -void lima_pmu_fini(struct lima_ip *ip) +static void lima_pmu_hw_fini(struct lima_ip *ip) { u32 stat; @@ -101,3 +101,24 @@ void lima_pmu_fini(struct lima_ip *ip) lima_pmu_wait_cmd(ip); } } + +int lima_pmu_resume(struct lima_ip *ip) +{ + return lima_pmu_hw_init(ip); +} + +void lima_pmu_suspend(struct lima_ip *ip) +{ + lima_pmu_hw_fini(ip); +} + + +int lima_pmu_init(struct lima_ip *ip) +{ + return lima_pmu_hw_init(ip); +} + +void lima_pmu_fini(struct lima_ip *ip) +{ + lima_pmu_hw_fini(ip); +} diff --git a/drivers/gpu/drm/lima/lima_pmu.h b/drivers/gpu/drm/lima/lima_pmu.h index a2a18775eb07..652dc7af3047 100644 --- a/drivers/gpu/drm/lima/lima_pmu.h +++ b/drivers/gpu/drm/lima/lima_pmu.h @@ -6,6 +6,8 @@ struct lima_ip; +int lima_pmu_resume(struct lima_ip *ip); +void lima_pmu_suspend(struct lima_ip *ip); int lima_pmu_init(struct lima_ip *ip); void lima_pmu_fini(struct lima_ip *ip); diff --git a/drivers/gpu/drm/lima/lima_pp.c b/drivers/gpu/drm/lima/lima_pp.c index 8fef224b93c8..33f01383409c 100644 --- a/drivers/gpu/drm/lima/lima_pp.c +++ b/drivers/gpu/drm/lima/lima_pp.c @@ -223,6 +223,23 @@ static void lima_pp_print_version(struct lima_ip *ip) lima_ip_name(ip), name, major, minor); } +static int lima_pp_hw_init(struct lima_ip *ip) +{ + ip->data.async_reset = false; + lima_pp_soft_reset_async(ip); + return lima_pp_soft_reset_async_wait(ip); +} + +int lima_pp_resume(struct lima_ip *ip) +{ + return lima_pp_hw_init(ip); +} + +void lima_pp_suspend(struct lima_ip *ip) +{ + +} + int lima_pp_init(struct lima_ip *ip) { struct lima_device *dev = ip->dev; @@ -230,9 +247,7 @@ int lima_pp_init(struct lima_ip *ip) lima_pp_print_version(ip); - ip->data.async_reset = false; - lima_pp_soft_reset_async(ip); - err = lima_pp_soft_reset_async_wait(ip); + err = lima_pp_hw_init(ip); if (err) return err; @@ -254,6 +269,16 @@ void lima_pp_fini(struct lima_ip *ip) } +int lima_pp_bcast_resume(struct lima_ip *ip) +{ + return 0; +} + +void lima_pp_bcast_suspend(struct lima_ip *ip) +{ + +} + int lima_pp_bcast_init(struct lima_ip *ip) { struct lima_device *dev = ip->dev; diff --git a/drivers/gpu/drm/lima/lima_pp.h b/drivers/gpu/drm/lima/lima_pp.h index bf60c77b2633..16ec96de15a9 100644 --- a/drivers/gpu/drm/lima/lima_pp.h +++ b/drivers/gpu/drm/lima/lima_pp.h @@ -7,9 +7,13 @@ struct lima_ip; struct lima_device; +int lima_pp_resume(struct lima_ip *ip); +void lima_pp_suspend(struct lima_ip *ip); int lima_pp_init(struct lima_ip *ip); void lima_pp_fini(struct lima_ip *ip); +int lima_pp_bcast_resume(struct lima_ip *ip); +void lima_pp_bcast_suspend(struct lima_ip *ip); int lima_pp_bcast_init(struct lima_ip *ip); void lima_pp_bcast_fini(struct lima_ip *ip); From patchwork Wed Apr 15 13:52:08 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Qiang Yu X-Patchwork-Id: 11491317 Return-Path: Received: from mail.kernel.org (pdx-korg-mail-1.web.codeaurora.org [172.30.200.123]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id 56362112C for ; Wed, 15 Apr 2020 13:53:57 +0000 (UTC) Received: from gabe.freedesktop.org (gabe.freedesktop.org [131.252.210.177]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id 349832074F for ; Wed, 15 Apr 2020 13:53:57 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=fail reason="signature verification failed" (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="Rf8H7V6K" DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 349832074F Authentication-Results: mail.kernel.org; dmarc=fail (p=none dis=none) header.from=gmail.com Authentication-Results: mail.kernel.org; spf=none smtp.mailfrom=dri-devel-bounces@lists.freedesktop.org Received: from gabe.freedesktop.org (localhost [127.0.0.1]) by gabe.freedesktop.org (Postfix) with ESMTP id 0B2886E9E2; Wed, 15 Apr 2020 13:53:56 +0000 (UTC) X-Original-To: dri-devel@lists.freedesktop.org Delivered-To: dri-devel@lists.freedesktop.org Received: from mail-pf1-x442.google.com (mail-pf1-x442.google.com [IPv6:2607:f8b0:4864:20::442]) by gabe.freedesktop.org (Postfix) with ESMTPS id ED9E66E9E2; Wed, 15 Apr 2020 13:53:54 +0000 (UTC) Received: by mail-pf1-x442.google.com with SMTP id r20so1529482pfh.9; Wed, 15 Apr 2020 06:53:54 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=APD8naIxhIgzrQrp0S3J3+YjemTB4ReRwsyGwC+Q20E=; b=Rf8H7V6Ky/3QcXQkzOBLEIoKfF31DR/myN5wOLOoNe7AsinkMNIemTHpwPDHGkrN2m 3Lr0ZzL/y2ldNsxOpD5aQsK0ZAmdlS+eJkC11c+aTSW8DQXchJh1Mgo4GL2DMuARLg5h 4AzRBNKfM/HMbwAZzDSyndmz4OVDsSsxEt4HaYJ29nf3K76MqHo9DqE0U5vUU/ijZALf 9Zn8H0wrnUhJB3+QRTtXwkMsldHnlCnwtLBlGEm4QA9L5UNywkG9d1qvXFYD9dEYBkuk 44ukj4D4+UKaTokF6UnVazHAcka2Uk9xkThctNdpYKvL5VHUutfUhtI3c/oZLsgqjl8P hClA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=APD8naIxhIgzrQrp0S3J3+YjemTB4ReRwsyGwC+Q20E=; b=rhymY01TkaHQNqVLkNrEzYU1B8Kjf1kZzmabx02dJuRnDWbBcR3AmC8ZuSRCv3jisz SE/CA7T/TWViSwHnKoFfjkxaBSREN6eipW5uyN5qLRtBqlty2fBaShw4dI/eDYKEtmXd e26ptUuEUmp2W2x5o4UoiMKOKET61NaRX4qXMyZ+ikeYTfIykoDs0JrUeNweiuaQ4rjt oFHgmTrWq6zrq2z0D9pJeUCo6LL6sJ7SnGZLSx50fUm8GHzyWwZWF3j0oAMzLcsLJxCt 8Zzyta14Dm2JSwPTqSmkpZIPEuvt8APnjMU9edQm8yHubdrFmPP45Z55Z1Z1o+ZiOmvZ VF2w== X-Gm-Message-State: AGi0PuYIdcuMexW1Q8SssVrHWaQLCclXcONRnNDPGnHxVjwq+Y5/Eriq VBCq6TaFP42jXHm/00GmxGW7917mMijptw== X-Google-Smtp-Source: APiQypL8kq0dJNbt8OSn7TFiXbKTg+jj/ASY79ngDF1X/0/ru3Rmh5EUCx2/13rjAOrROdh0SFC6DQ== X-Received: by 2002:a63:d40a:: with SMTP id a10mr25888822pgh.53.1586958834274; Wed, 15 Apr 2020 06:53:54 -0700 (PDT) Received: from yuq-Aspire-4738G.lan (li2017-195.members.linode.com. [172.105.124.195]) by smtp.gmail.com with ESMTPSA id z1sm3331069pjt.42.2020.04.15.06.53.50 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 15 Apr 2020 06:53:53 -0700 (PDT) From: Qiang Yu To: dri-devel@lists.freedesktop.org Subject: [PATCH 4/4] drm/lima: add pm resume/suspend Date: Wed, 15 Apr 2020 21:52:08 +0800 Message-Id: <20200415135208.8960-5-yuq825@gmail.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20200415135208.8960-1-yuq825@gmail.com> References: <20200415135208.8960-1-yuq825@gmail.com> X-BeenThere: dri-devel@lists.freedesktop.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Direct Rendering Infrastructure - Development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: lima@lists.freedesktop.org, David Airlie , Bhushan Shah , Vasily Khoruzhick , Andreas Baierl , Qiang Yu , Erico Nunes MIME-Version: 1.0 Errors-To: dri-devel-bounces@lists.freedesktop.org Sender: "dri-devel" Do hardware resume/suspend. Tested-by: Bhushan Shah Signed-off-by: Qiang Yu --- drivers/gpu/drm/lima/lima_device.c | 65 ++++++++++++++++++++++++++++++ drivers/gpu/drm/lima/lima_device.h | 3 ++ drivers/gpu/drm/lima/lima_drv.c | 7 ++++ 3 files changed, 75 insertions(+) diff --git a/drivers/gpu/drm/lima/lima_device.c b/drivers/gpu/drm/lima/lima_device.c index e5f1f84ba85a..aca2cab9899b 100644 --- a/drivers/gpu/drm/lima/lima_device.c +++ b/drivers/gpu/drm/lima/lima_device.c @@ -213,6 +213,27 @@ static void lima_fini_ip(struct lima_device *ldev, int index) desc->fini(ip); } +static int lima_resume_ip(struct lima_device *ldev, int index) +{ + struct lima_ip_desc *desc = lima_ip_desc + index; + struct lima_ip *ip = ldev->ip + index; + int ret = 0; + + if (ip->present) + ret = desc->resume(ip); + + return ret; +} + +static void lima_suspend_ip(struct lima_device *ldev, int index) +{ + struct lima_ip_desc *desc = lima_ip_desc + index; + struct lima_ip *ip = ldev->ip + index; + + if (ip->present) + desc->suspend(ip); +} + static int lima_init_gp_pipe(struct lima_device *dev) { struct lima_sched_pipe *pipe = dev->pipe + lima_pipe_gp; @@ -408,3 +429,47 @@ void lima_device_fini(struct lima_device *ldev) lima_clk_fini(ldev); } + +int lima_device_resume(struct device *dev) +{ + struct lima_device *ldev = dev_get_drvdata(dev); + int i, err; + + for (i = 0; i < lima_ip_num; i++) { + err = lima_resume_ip(ldev, i); + if (err) + goto err_out; + } + + err = lima_devfreq_resume(&ldev->devfreq); + if (err) + goto err_out; + + return 0; + +err_out: + while (--i >= 0) + lima_suspend_ip(ldev, i); + return err; +} + +int lima_device_suspend(struct device *dev) +{ + struct lima_device *ldev = dev_get_drvdata(dev); + int i, err; + + /* check any task running */ + for (i = 0; i < lima_pipe_num; i++) { + if (atomic_read(&ldev->pipe[i].base.hw_rq_count)) + return -EBUSY; + } + + err = lima_devfreq_suspend(&ldev->devfreq); + if (err) + return err; + + for (i = lima_ip_num - 1; i >= 0; i--) + lima_suspend_ip(ldev, i); + + return 0; +} diff --git a/drivers/gpu/drm/lima/lima_device.h b/drivers/gpu/drm/lima/lima_device.h index 095a0b5f1703..e06d1955f4a3 100644 --- a/drivers/gpu/drm/lima/lima_device.h +++ b/drivers/gpu/drm/lima/lima_device.h @@ -141,4 +141,7 @@ static inline int lima_poll_timeout(struct lima_ip *ip, lima_poll_func_t func, return 0; } +int lima_device_suspend(struct device *dev); +int lima_device_resume(struct device *dev); + #endif diff --git a/drivers/gpu/drm/lima/lima_drv.c b/drivers/gpu/drm/lima/lima_drv.c index bbbdc8455e2f..be66b448d44e 100644 --- a/drivers/gpu/drm/lima/lima_drv.c +++ b/drivers/gpu/drm/lima/lima_drv.c @@ -5,6 +5,7 @@ #include #include #include +#include #include #include #include @@ -452,11 +453,17 @@ static const struct of_device_id dt_match[] = { }; MODULE_DEVICE_TABLE(of, dt_match); +static const struct dev_pm_ops lima_pm_ops = { + SET_SYSTEM_SLEEP_PM_OPS(pm_runtime_force_suspend, pm_runtime_force_resume) + SET_RUNTIME_PM_OPS(lima_device_suspend, lima_device_resume, NULL) +}; + static struct platform_driver lima_platform_driver = { .probe = lima_pdev_probe, .remove = lima_pdev_remove, .driver = { .name = "lima", + .pm = &lima_pm_ops, .of_match_table = dt_match, }, };