Received: by 2002:a25:1506:0:0:0:0:0 with SMTP id 6csp2035494ybv; Fri, 14 Feb 2020 10:12:37 -0800 (PST) X-Google-Smtp-Source: APXvYqwsPTESa1PNiyHHY1Vv+IsVM4hjfN4rTO3uD97zLdjbPo/tmfmgjF25m3MkXQASGa3pVuPk X-Received: by 2002:a54:4f16:: with SMTP id e22mr2820682oiy.170.1581703957736; Fri, 14 Feb 2020 10:12:37 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1581703957; cv=none; d=google.com; s=arc-20160816; b=YoqgkJrccnRUzt4X0ixNqA2VFZ7qHG3LRrXtKxVy0P3BiBl5HKscElKrM1bTlFV0Cg ZcYB/A4xVNCz6VO7ag+knHYat7dlqc4MNUaNuGiMSjUK5gBXWuVN6GQ3agHtREZIXyoe r0qvMQFEcGgXQPuXQSAY0XJm8y3k0M2zz092Q9yhpRYiZKkW31n+szjfPRffugA65fBZ OIb7JlfXTxgmlmOAc943nEK5PTJwDM2oiDFS5TqaNiVnkHHhQRJ9gTa0SEfG2tdWS7iR KAYu/TwS4v4fI/pFCMgm/2fNGP6x6mED1gw5y4dmv7r4I/6J5oHlqWvF0JvafC5Vw4/C VrVA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:content-transfer-encoding:mime-version :references:in-reply-to:message-id:date:subject:cc:to:from :dkim-signature; bh=kJ/70yEGP9jCSn/jtlxRL9J1PHEb9dR9nJku0m45Vuw=; b=kmYiYijo0mhZ7aJ0trU+r1cEZc1cdFOheuXxSjpzBjyCC7jA/K6eYdwABWTKtpH88/ VbDRp/bbZdF4UEfTaccIweJR3Rn3geolMjXv+p2ARHWZxPz5zQ+mY2J4NS9rDjltfeKm L0o2JGDtrKgsJrgPFBIQnAjQ0zrrB5wb71ZZ2RzSOpCV9dOGWRvoN2+nF9QdqXXe+KvR hfeJNd3w7Dg4fvF1dQ6NK0jYnlRdvY4U/3hq8rlQUERdJWf3WYEi7wiAeK4QThPxMY9W qH+hUlP/BICiNrFdk+O03Mn/y8WvM5YvQ3nebs03/f+VfJvriqhRlZYIZmMK8ipmpLGu +qlQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@kernel.org header.s=default header.b=Kthkcr7q; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id a28si3803792otd.257.2020.02.14.10.12.25; Fri, 14 Feb 2020 10:12:37 -0800 (PST) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; dkim=pass header.i=@kernel.org header.s=default header.b=Kthkcr7q; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S2403937AbgBNSKu (ORCPT + 99 others); Fri, 14 Feb 2020 13:10:50 -0500 Received: from mail.kernel.org ([198.145.29.99]:32936 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1730852AbgBNPxj (ORCPT ); Fri, 14 Feb 2020 10:53:39 -0500 Received: from sasha-vm.mshome.net (c-73-47-72-35.hsd1.nh.comcast.net [73.47.72.35]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPSA id A60A724676; Fri, 14 Feb 2020 15:53:37 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=default; t=1581695618; bh=gUEGfpV552sDu9X3kZ+5/zD3JhIkLGBT0fJ533BkoeE=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=Kthkcr7qlEBFntUjaLOLVX6TKiACvCTyMzWygK7z7OD4RVs8LaPsfru5ECYF7XJWK tRAsXPShHrCdUXbovT4kH+B4OeDmaJirrHpUEZ+4vxIkmLMQktId7ql06MwI3fxOZP JriROeaGnT5MX1XGELEJYx793/XsD7Ra2sETQ//s= From: Sasha Levin To: linux-kernel@vger.kernel.org, stable@vger.kernel.org Cc: Suman Anna , Tony Lindgren , Sasha Levin , linux-omap@vger.kernel.org, linux-arm-kernel@lists.infradead.org Subject: [PATCH AUTOSEL 5.5 218/542] ARM: OMAP2+: Add workaround for DRA7 DSP MStandby errata i879 Date: Fri, 14 Feb 2020 10:43:30 -0500 Message-Id: <20200214154854.6746-218-sashal@kernel.org> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20200214154854.6746-1-sashal@kernel.org> References: <20200214154854.6746-1-sashal@kernel.org> MIME-Version: 1.0 X-stable: review X-Patchwork-Hint: Ignore Content-Transfer-Encoding: 8bit Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: Suman Anna [ Upstream commit 2f14101a1d760db72393910d481fbf7768c44530 ] Errata Title: i879: DSP MStandby requires CD_EMU in SW_WKUP Description: The DSP requires the internal emulation clock to be actively toggling in order to successfully enter a low power mode via execution of the IDLE instruction and PRCM MStandby/Idle handshake. This assumes that other prerequisites and software sequence are followed. Workaround: The emulation clock to the DSP is free-running anytime CCS is connected via JTAG debugger to the DSP subsystem or when the CD_EMU clock domain is set in SW_WKUP mode. The CD_EMU domain can be set in SW_WKUP mode via the CM_EMU_CLKSTCTRL [1:0]CLKTRCTRL field. Implementation: This patch implements this workaround by denying the HW_AUTO mode for the EMU clockdomain during the power-up of any DSP processor and re-enabling the HW_AUTO mode during the shutdown of the last DSP processor (actually done during the enabling and disabling of the respective DSP MDMA MMUs). Reference counting has to be used to manage the independent sequencing between the multiple DSP processors. This switching is done at runtime rather than a static clockdomain flags value to meet the target power domain state for the EMU power domain during suspend. Note that the DSP MStandby behavior is not consistent across all boards prior to this fix. Please see commit 45f871eec6c0 ("ARM: OMAP2+: Extend DRA7 IPU1 MMU pdata quirks to DSP MDMA MMUs") for details. Signed-off-by: Suman Anna Signed-off-by: Tony Lindgren Signed-off-by: Sasha Levin --- arch/arm/mach-omap2/omap-iommu.c | 43 +++++++++++++++++++++++++++++--- 1 file changed, 40 insertions(+), 3 deletions(-) diff --git a/arch/arm/mach-omap2/omap-iommu.c b/arch/arm/mach-omap2/omap-iommu.c index f1a6ece8108e4..78247e6f4a720 100644 --- a/arch/arm/mach-omap2/omap-iommu.c +++ b/arch/arm/mach-omap2/omap-iommu.c @@ -11,14 +11,43 @@ #include "omap_hwmod.h" #include "omap_device.h" +#include "clockdomain.h" #include "powerdomain.h" +static void omap_iommu_dra7_emu_swsup_config(struct platform_device *pdev, + bool enable) +{ + static struct clockdomain *emu_clkdm; + static DEFINE_SPINLOCK(emu_lock); + static atomic_t count; + struct device_node *np = pdev->dev.of_node; + + if (!of_device_is_compatible(np, "ti,dra7-dsp-iommu")) + return; + + if (!emu_clkdm) { + emu_clkdm = clkdm_lookup("emu_clkdm"); + if (WARN_ON_ONCE(!emu_clkdm)) + return; + } + + spin_lock(&emu_lock); + + if (enable && (atomic_inc_return(&count) == 1)) + clkdm_deny_idle(emu_clkdm); + else if (!enable && (atomic_dec_return(&count) == 0)) + clkdm_allow_idle(emu_clkdm); + + spin_unlock(&emu_lock); +} + int omap_iommu_set_pwrdm_constraint(struct platform_device *pdev, bool request, u8 *pwrst) { struct powerdomain *pwrdm; struct omap_device *od; u8 next_pwrst; + int ret = 0; od = to_omap_device(pdev); if (!od) @@ -31,13 +60,21 @@ int omap_iommu_set_pwrdm_constraint(struct platform_device *pdev, bool request, if (!pwrdm) return -EINVAL; - if (request) + if (request) { *pwrst = pwrdm_read_next_pwrst(pwrdm); + omap_iommu_dra7_emu_swsup_config(pdev, true); + } if (*pwrst > PWRDM_POWER_RET) - return 0; + goto out; next_pwrst = request ? PWRDM_POWER_ON : *pwrst; - return pwrdm_set_next_pwrst(pwrdm, next_pwrst); + ret = pwrdm_set_next_pwrst(pwrdm, next_pwrst); + +out: + if (!request) + omap_iommu_dra7_emu_swsup_config(pdev, false); + + return ret; } -- 2.20.1