From patchwork Fri Jun 21 08:57:19 2013 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Philipp Zabel X-Patchwork-Id: 2761091 Return-Path: X-Original-To: patchwork-linux-arm@patchwork.kernel.org Delivered-To: patchwork-parsemail@patchwork2.web.kernel.org Received: from mail.kernel.org (mail.kernel.org [198.145.19.201]) by patchwork2.web.kernel.org (Postfix) with ESMTP id 80D06C0AB1 for ; Fri, 21 Jun 2013 08:58:51 +0000 (UTC) Received: from mail.kernel.org (localhost [127.0.0.1]) by mail.kernel.org (Postfix) with ESMTP id 8925A201A5 for ; Fri, 21 Jun 2013 08:58:50 +0000 (UTC) Received: from casper.infradead.org (casper.infradead.org [85.118.1.10]) (using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id A940120187 for ; Fri, 21 Jun 2013 08:58:45 +0000 (UTC) Received: from merlin.infradead.org ([2001:4978:20e::2]) by casper.infradead.org with esmtps (Exim 4.80.1 #2 (Red Hat Linux)) id 1UpxAW-0002BR-P6; Fri, 21 Jun 2013 08:58:09 +0000 Received: from localhost ([::1] helo=merlin.infradead.org) by merlin.infradead.org with esmtp (Exim 4.80.1 #2 (Red Hat Linux)) id 1UpxAO-0004cU-6y; Fri, 21 Jun 2013 08:58:00 +0000 Received: from metis.ext.pengutronix.de ([2001:6f8:1178:4:290:27ff:fe1d:cc33]) by merlin.infradead.org with esmtps (Exim 4.80.1 #2 (Red Hat Linux)) id 1UpxAC-0004aG-EP for linux-arm-kernel@lists.infradead.org; Fri, 21 Jun 2013 08:57:49 +0000 Received: from dude.hi.pengutronix.de ([10.1.0.7] helo=dude.pengutronix.de) by metis.ext.pengutronix.de with esmtp (Exim 4.72) (envelope-from ) id 1Upx9n-0001FL-NI; Fri, 21 Jun 2013 10:57:23 +0200 From: Philipp Zabel To: linux-arm-kernel@lists.infradead.org Subject: [PATCH 2/4] staging: drm/imx: ipu-dmfc: fix bandwidth allocation Date: Fri, 21 Jun 2013 10:57:19 +0200 Message-Id: <1371805041-9299-3-git-send-email-p.zabel@pengutronix.de> X-Mailer: git-send-email 1.8.3.1 In-Reply-To: <1371805041-9299-1-git-send-email-p.zabel@pengutronix.de> References: <1371805041-9299-1-git-send-email-p.zabel@pengutronix.de> X-SA-Exim-Connect-IP: 10.1.0.7 X-SA-Exim-Mail-From: p.zabel@pengutronix.de X-SA-Exim-Scanned: No (on metis.ext.pengutronix.de); SAEximRunCond expanded to false X-PTX-Original-Recipient: linux-arm-kernel@lists.infradead.org X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20130621_045748_775047_8A10CCD0 X-CRM114-Status: GOOD ( 15.42 ) X-Spam-Score: -3.4 (---) Cc: kernel@pengutronix.de, Greg Kroah-Hartman , dri-devel@lists.freedesktop.org, Philipp Zabel , Shawn Guo , Fabio Estevam X-BeenThere: linux-arm-kernel@lists.infradead.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , MIME-Version: 1.0 Sender: "linux-arm-kernel" Errors-To: linux-arm-kernel-bounces+patchwork-linux-arm=patchwork.kernel.org@lists.infradead.org X-Spam-Status: No, score=-5.7 required=5.0 tests=BAYES_00, RCVD_IN_DNSWL_MED, RP_MATCHES_RCVD, UNPARSEABLE_RELAY autolearn=unavailable version=3.3.1 X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on mail.kernel.org X-Virus-Scanned: ClamAV using ClamSMTP The IPU can request up to four pixels per access, which gives four times the bandwidth compared to what the driver currently assumes. After correcting this, we have to increase safety margins for bandwidth requirement calculations. Signed-off-by: Philipp Zabel --- drivers/staging/imx-drm/ipu-v3/ipu-dmfc.c | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/drivers/staging/imx-drm/ipu-v3/ipu-dmfc.c b/drivers/staging/imx-drm/ipu-v3/ipu-dmfc.c index 91821bc..1dc9817 100644 --- a/drivers/staging/imx-drm/ipu-v3/ipu-dmfc.c +++ b/drivers/staging/imx-drm/ipu-v3/ipu-dmfc.c @@ -292,7 +292,7 @@ int ipu_dmfc_alloc_bandwidth(struct dmfc_channel *dmfc, { struct ipu_dmfc_priv *priv = dmfc->priv; int slots = dmfc_bandwidth_to_slots(priv, bandwidth_pixel_per_second); - int segment = 0, ret = 0; + int segment = -1, ret = 0; dev_dbg(priv->dev, "dmfc: trying to allocate %ldMpixel/s for IPU channel %d\n", bandwidth_pixel_per_second / 1000000, @@ -307,7 +307,17 @@ int ipu_dmfc_alloc_bandwidth(struct dmfc_channel *dmfc, goto out; } - segment = dmfc_find_slots(priv, slots); + /* Always allocate at least 128*4 bytes (2 slots) */ + if (slots < 2) + slots = 2; + + /* For the MEM_BG channel, first try to allocate twice the slots */ + if (dmfc->data->ipu_channel == IPUV3_CHANNEL_MEM_BG_SYNC) + segment = dmfc_find_slots(priv, slots * 2); + if (segment >= 0) + slots *= 2; + else + segment = dmfc_find_slots(priv, slots); if (segment < 0) { ret = -EBUSY; goto out; @@ -391,7 +401,7 @@ int ipu_dmfc_init(struct ipu_soc *ipu, struct device *dev, unsigned long base, * We have a total bandwidth of clkrate * 4pixel divided * into 8 slots. */ - priv->bandwidth_per_slot = clk_get_rate(ipu_clk) / 8; + priv->bandwidth_per_slot = clk_get_rate(ipu_clk) * 4 / 8; dev_dbg(dev, "dmfc: 8 slots with %ldMpixel/s bandwidth each\n", priv->bandwidth_per_slot / 1000000);