Received: by 2002:a05:6358:4e97:b0:b3:742d:4702 with SMTP id ce23csp2061748rwb; Sun, 14 Aug 2022 20:21:16 -0700 (PDT) X-Google-Smtp-Source: AA6agR40/AUZ6lRSia2SHt/HBdh5LMqjuTzegB1DAlt/63auv/V8Q4wEEkXiIsHyB+Bvh5+6GPI7 X-Received: by 2002:a63:8248:0:b0:425:e1bb:1197 with SMTP id w69-20020a638248000000b00425e1bb1197mr7082993pgd.474.1660533676310; Sun, 14 Aug 2022 20:21:16 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1660533676; cv=none; d=google.com; s=arc-20160816; b=Naa5v86Clj+X8wF5AXi8gf2BGwUY/tP4HmCqo/XRcvazOT+y+leqHCCig+hyKdcj9y ZCAhvmj5CJqB5X9VZjv7VkdjFyNgZqMg+D279snIk5eO2wbVu2AcMuiyJshrxSEm38Kv EasdRuB2HhreIn8rmU7L2YNQekBOzFMzn+vYu0kii62oAQ/MaUPnupsmstAznhMp7GDX 7KLG8u7vuv/FJHLJ1d77EEG2h1aOvvxWWv5bd+UpN0MdKH9/yaoXmxeru1E6aIAYjoaL nE8mpeCqr6YoY6HjnYWWQ+6XpDC7S2mPovRIsIHIdr3DVTdUsejT9PAntVMNIbnVTfXn qDog== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:mime-version :references:in-reply-to:message-id:date:subject:cc:to:from :dkim-signature; bh=b3BKeHNHkOmEyqFXi/2yjYXaBJc1kL89uDBD+OeJTSI=; b=rPonmE9nvCIhuMMxCQTpfdYRoGDBe4tkMRAZtm7Z3uSGiuuO2pQSKT8TMicqcGgbXX t0aWuc8qfs4stqZ9l+zl2oegg4ONRR2s9lqbylCy1wJm6XF+4FUgkVcSB3BDTsoepCZ4 uOWkjOvIvPTMUoRca7WwdXwwHutG/ky3BUegBB8MyrVdg84Wdx/84lYsbjBZbASbjfpL E9QbMzp0IjUEsz9ncSs1irKTEj2QxZnsAUcOZMElzywYdSvL+iYTxOT539NE3E0EOxb3 4oq2dAUAyChrYOcW7vrncybGXTKnjxMLIDdmfiauRg+LCebr+8iLB7e+UT2JsdJYSleP SbHA== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@mediatek.com header.s=dk header.b=FEkmgW+T; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=QUARANTINE sp=QUARANTINE dis=NONE) header.from=mediatek.com Return-Path: Received: from out1.vger.email (out1.vger.email. [2620:137:e000::1:20]) by mx.google.com with ESMTP id q184-20020a632ac1000000b0041b64ff7fd9si9991113pgq.517.2022.08.14.20.20.58; Sun, 14 Aug 2022 20:21:16 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) client-ip=2620:137:e000::1:20; Authentication-Results: mx.google.com; dkim=pass header.i=@mediatek.com header.s=dk header.b=FEkmgW+T; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=QUARANTINE sp=QUARANTINE dis=NONE) header.from=mediatek.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S229476AbiHODIA (ORCPT + 99 others); Sun, 14 Aug 2022 23:08:00 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:52410 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S229929AbiHODH4 (ORCPT ); Sun, 14 Aug 2022 23:07:56 -0400 Received: from mailgw01.mediatek.com (unknown [60.244.123.138]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 0695E11A26 for ; Sun, 14 Aug 2022 20:07:53 -0700 (PDT) X-UUID: ef832e57d9ba46239fadc31fa103fe3d-20220815 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=mediatek.com; s=dk; h=Content-Type:Content-Transfer-Encoding:MIME-Version:References:In-Reply-To:Message-ID:Date:Subject:CC:To:From; bh=b3BKeHNHkOmEyqFXi/2yjYXaBJc1kL89uDBD+OeJTSI=; b=FEkmgW+Tm+Z5rpzFAj5lHynf30gk1rKZY88eZGbiRemveQio9l99OrgUS0/lOH4vVZiFpNVuJ8tHO5/3o1z/QHPQD+2VzS1i8UWvJOrQNc+m/MI06z2I3DUo/Xoupjfb2vDcmB0cenrzhEsAaLXA24MqVRcfVQoxt47J20CRy6E=; X-CID-P-RULE: Release_Ham X-CID-O-INFO: VERSION:1.1.9,REQID:1c166f31-b1ea-4f1f-84ec-1c9b81216976,OB:0,LO B:0,IP:0,URL:5,TC:0,Content:0,EDM:0,RT:0,SF:0,FILE:0,BULK:0,RULE:Release_H am,ACTION:release,TS:5 X-CID-META: VersionHash:3d8acc9,CLOUDID:139dccae-9535-44a6-aa9b-7f62b79b6ff6,C OID:IGNORED,Recheck:0,SF:nil,TC:nil,Content:0,EDM:-3,IP:nil,URL:11|1,File: nil,Bulk:nil,QS:nil,BEC:nil,COL:0 X-UUID: ef832e57d9ba46239fadc31fa103fe3d-20220815 Received: from mtkmbs10n2.mediatek.inc [(172.21.101.183)] by mailgw01.mediatek.com (envelope-from ) (Generic MTA with TLSv1.2 ECDHE-RSA-AES256-GCM-SHA384 256/256) with ESMTP id 1121502638; Mon, 15 Aug 2022 11:07:47 +0800 Received: from mtkcas11.mediatek.inc (172.21.101.40) by mtkmbs10n1.mediatek.inc (172.21.101.34) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384) id 15.2.792.15; Mon, 15 Aug 2022 11:07:47 +0800 Received: from localhost.localdomain (10.17.3.154) by mtkcas11.mediatek.inc (172.21.101.73) with Microsoft SMTP Server id 15.0.1497.2 via Frontend Transport; Mon, 15 Aug 2022 11:07:46 +0800 From: Yongqiang Niu To: Chun-Kuang Hu CC: Jassi Brar , Matthias Brugger , , , , , Hsin-Yi Wang , Yongqiang Niu , Allen-kh Cheng Subject: [PATCH v1, 1/1] mailbox: mtk-cmdq: fix gce timeout issue Date: Mon, 15 Aug 2022 11:07:40 +0800 Message-ID: <20220815030740.28899-2-yongqiang.niu@mediatek.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20220815030740.28899-1-yongqiang.niu@mediatek.com> References: <20220815030740.28899-1-yongqiang.niu@mediatek.com> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Content-Type: text/plain X-MTK: N X-Spam-Status: No, score=-2.1 required=5.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,RCVD_IN_MSPIKE_H2,SPF_HELO_PASS, SPF_PASS,T_SCC_BODY_TEXT_LINE,UNPARSEABLE_RELAY autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on lindbergh.monkeyblade.net Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: Yongqiang Niu 1. enable gce ddr enable(gce reigster offset 0x48, bit 16 to 18) when gce work, and disable gce ddr enable when gce work job done 2. split cmdq clk enable/disable api, and control gce ddr enable/disable in clk enable/disable function to make sure it could protect when cmdq is multiple used by display and mdp Signed-off-by: Yongqiang Niu Signed-off-by: Allen-kh Cheng --- drivers/mailbox/mtk-cmdq-mailbox.c | 57 ++++++++++++++++++++++++++---- 1 file changed, 51 insertions(+), 6 deletions(-) diff --git a/drivers/mailbox/mtk-cmdq-mailbox.c b/drivers/mailbox/mtk-cmdq-mailbox.c index 2578e5aaa935..64a47470f062 100644 --- a/drivers/mailbox/mtk-cmdq-mailbox.c +++ b/drivers/mailbox/mtk-cmdq-mailbox.c @@ -81,6 +81,8 @@ struct cmdq { u8 shift_pa; bool control_by_sw; u32 gce_num; + atomic_t usage; + spinlock_t lock; }; struct gce_plat { @@ -90,6 +92,46 @@ struct gce_plat { u32 gce_num; }; +static s32 cmdq_clk_enable(struct cmdq *cmdq) +{ + s32 usage, ret; + unsigned long flags; + + spin_lock_irqsave(&cmdq->lock, flags); + + usage = atomic_inc_return(&cmdq->usage); + + ret = clk_bulk_enable(cmdq->gce_num, cmdq->clocks); + if (usage <=0 || ret < 0) { + dev_err(cmdq->mbox.dev, "ref count %d ret %d suspend %d\n", + usage, ret, cmdq->suspended); + } else if (usage == 1) { + if (cmdq->control_by_sw) + writel((0x7 << 16) + 0x7, cmdq->base + GCE_GCTL_VALUE); + } + + spin_unlock_irqrestore(&cmdq->lock, flags); + + return ret; +} + +static void cmdq_clk_disable(struct cmdq *cmdq) +{ + s32 usage; + + usage = atomic_dec_return(&cmdq->usage); + + if (usage < 0) { + dev_err(cmdq->mbox.dev, "ref count %d suspend %d\n", + usage, cmdq->suspended); + } else if (usage == 0) { + if (cmdq->control_by_sw) + writel(0x7, cmdq->base + GCE_GCTL_VALUE); + } + + clk_bulk_disable(cmdq->gce_num, cmdq->clocks); +} + u8 cmdq_get_shift_pa(struct mbox_chan *chan) { struct cmdq *cmdq = container_of(chan->mbox, struct cmdq, mbox); @@ -271,7 +313,8 @@ static void cmdq_thread_irq_handler(struct cmdq *cmdq, if (list_empty(&thread->task_busy_list)) { cmdq_thread_disable(cmdq, thread); - clk_bulk_disable(cmdq->gce_num, cmdq->clocks); + + cmdq_clk_disable(cmdq); } } @@ -360,8 +403,7 @@ static int cmdq_mbox_send_data(struct mbox_chan *chan, void *data) task->pkt = pkt; if (list_empty(&thread->task_busy_list)) { - WARN_ON(clk_bulk_enable(cmdq->gce_num, cmdq->clocks)); - + WARN_ON(cmdq_clk_enable(cmdq) < 0); /* * The thread reset will clear thread related register to 0, * including pc, end, priority, irq, suspend and enable. Thus @@ -433,7 +475,7 @@ static void cmdq_mbox_shutdown(struct mbox_chan *chan) } cmdq_thread_disable(cmdq, thread); - clk_bulk_disable(cmdq->gce_num, cmdq->clocks); + cmdq_clk_disable(cmdq); done: /* @@ -479,7 +521,8 @@ static int cmdq_mbox_flush(struct mbox_chan *chan, unsigned long timeout) cmdq_thread_resume(thread); cmdq_thread_disable(cmdq, thread); - clk_bulk_disable(cmdq->gce_num, cmdq->clocks); + + cmdq_clk_disable(cmdq); out: spin_unlock_irqrestore(&thread->chan->lock, flags); @@ -490,7 +533,8 @@ static int cmdq_mbox_flush(struct mbox_chan *chan, unsigned long timeout) spin_unlock_irqrestore(&thread->chan->lock, flags); if (readl_poll_timeout_atomic(thread->base + CMDQ_THR_ENABLE_TASK, enable, enable == 0, 1, timeout)) { - dev_err(cmdq->mbox.dev, "Fail to wait GCE thread 0x%x done\n", + dev_err(cmdq->mbox.dev, + "Fail to wait GCE thread 0x%x done\n", (u32)(thread->base - cmdq->base)); return -EFAULT; @@ -626,6 +670,7 @@ static int cmdq_probe(struct platform_device *pdev) WARN_ON(clk_bulk_prepare(cmdq->gce_num, cmdq->clocks)); + spin_lock_init(&cmdq->lock); cmdq_init(cmdq); return 0; -- 2.25.1