a476461
From patchwork Fri Nov 16 14:39:07 2018
a476461
Content-Type: text/plain; charset="utf-8"
a476461
MIME-Version: 1.0
a476461
Content-Transfer-Encoding: 7bit
a476461
X-Patchwork-Submitter: James Hughes <james.hughes@raspberrypi.org>
a476461
X-Patchwork-Id: 10686407
a476461
Return-Path: 
a476461
 <linux-arm-kernel-bounces+patchwork-linux-arm=patchwork.kernel.org@lists.infradead.org>
a476461
Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org
a476461
 [172.30.200.125])
a476461
	by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id 9BA9C3CF1
a476461
	for <patchwork-linux-arm@patchwork.kernel.org>;
a476461
 Fri, 16 Nov 2018 14:40:20 +0000 (UTC)
a476461
Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1])
a476461
	by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 88C992D04D
a476461
	for <patchwork-linux-arm@patchwork.kernel.org>;
a476461
 Fri, 16 Nov 2018 14:40:20 +0000 (UTC)
a476461
Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486)
a476461
	id 7C6802D0B5; Fri, 16 Nov 2018 14:40:20 +0000 (UTC)
a476461
X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on
a476461
	pdx-wl-mail.web.codeaurora.org
a476461
X-Spam-Level: 
a476461
X-Spam-Status: No, score=-3.6 required=2.0 tests=BAYES_00,DKIM_SIGNED,
a476461
	DKIM_VALID,MAILING_LIST_MULTI,RCVD_IN_DNSWL_LOW autolearn=ham version=3.3.1
a476461
Received: from bombadil.infradead.org (bombadil.infradead.org
a476461
 [198.137.202.133])
a476461
	(using TLSv1.2 with cipher AES256-GCM-SHA384 (256/256 bits))
a476461
	(No client certificate requested)
a476461
	by mail.wl.linuxfoundation.org (Postfix) with ESMTPS id 02F272D0B9
a476461
	for <patchwork-linux-arm@patchwork.kernel.org>;
a476461
 Fri, 16 Nov 2018 14:40:19 +0000 (UTC)
a476461
DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed;
a476461
	d=lists.infradead.org; s=bombadil.20170209; h=Sender:
a476461
	Content-Transfer-Encoding:Content-Type:MIME-Version:Cc:List-Subscribe:
a476461
	List-Help:List-Post:List-Archive:List-Unsubscribe:List-Id:Message-Id:Date:
a476461
	Subject:To:From:Reply-To:Content-ID:Content-Description:Resent-Date:
a476461
	Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID:In-Reply-To:
a476461
	References:List-Owner; bh=q+rr6CTCNe7Aj9DWt6k8ZBDJfuNlw6LK4NEqho/OsL8=; b=slV
a476461
	BxeOcHW4UYDgm2VXfNMIZb+/8LPmzjGPpBpBe5IaMR/NthCsM9AL2A1aGdlPRKp8j/Oimcml9ytBG
a476461
	vy3/u46ZlKFd5bAYEl5veGalWXzUg1KN7UhADmXD9fmMOzkFD4fMChA8+g2qK83F6SfqDM0VS3i14
a476461
	/ubAQ9CUdaFi4Vr7F4EZtPdbPmSm76Rm9H8sWxWe6seIEmsL6VMpLVzRLAA0zvX5nslXgUPvDLEZj
a476461
	uk7BIzGfdWU1oB15xwTu8kyp24WrC2Xd/DNCrrIlvBJ6Vn4lvfdqwPT+Xg59IAaibUhoj/fq1HNet
a476461
	QenokEPTxg7SS3FsAKl96cR5mWeudtg==;
a476461
Received: from localhost ([127.0.0.1] helo=bombadil.infradead.org)
a476461
	by bombadil.infradead.org with esmtp (Exim 4.90_1 #2 (Red Hat Linux))
a476461
	id 1gNfI9-0007DF-JA; Fri, 16 Nov 2018 14:40:17 +0000
a476461
Received: from casper.infradead.org ([2001:8b0:10b:1236::1])
a476461
 by bombadil.infradead.org with esmtps (Exim 4.90_1 #2 (Red Hat Linux))
a476461
 id 1gNfI4-00075P-2l
a476461
 for linux-arm-kernel@bombadil.infradead.org; Fri, 16 Nov 2018 14:40:12 +0000
a476461
DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed;
a476461
 d=infradead.org; s=casper.20170209; h=Message-Id:Date:Subject:Cc:To:From:
a476461
 Sender:Reply-To:MIME-Version:Content-Type:Content-Transfer-Encoding:
a476461
 Content-ID:Content-Description:Resent-Date:Resent-From:Resent-Sender:
a476461
 Resent-To:Resent-Cc:Resent-Message-ID:In-Reply-To:References:List-Id:
a476461
 List-Help:List-Unsubscribe:List-Subscribe:List-Post:List-Owner:List-Archive;
a476461
 bh=0v+Gt0Sb75ntX3ncvTo0T5q/LQ9HrDko5y0UEkZ6WVk=; b=SCmdpUIYIRr3Gb8eXMDGHl/os
a476461
 AVmLBMIQEbA1mUB4WPQJlUjz7NKtNXgtLQxSY+yiwIb+LrripAgbQ6yK1Vkn+4bmhtSkb97glmraT
a476461
 bMOZKrRj/cPhxW5osOa0o2BJQRqWqignWxy8539dbxXbpAAKW+12jA+dOqrjOFUftFH7geD4Ttwis
a476461
 y/j75BOi7ObkcK1mBDyJDNuSEt2CZutCNZ+A7v7/zqkxnhS3hS7Y9hUD81+J+cIu5x103POH6i7FC
a476461
 7JazaqnBZYtl66kXXPOs62v3HA96/QLz7CxmdsnNQvw28MNKsxLw5TKnXJUDJmDCybQ5FL6k6Xomg
a476461
 T9PDZO9+g==;
a476461
Received: from mx08-00252a01.pphosted.com ([91.207.212.211])
a476461
 by casper.infradead.org with esmtps (Exim 4.90_1 #2 (Red Hat Linux))
a476461
 id 1gNfHz-0006AE-RY
a476461
 for linux-arm-kernel@lists.infradead.org; Fri, 16 Nov 2018 14:40:09 +0000
a476461
Received: from pps.filterd (m0102629.ppops.net [127.0.0.1])
a476461
 by mx08-00252a01.pphosted.com (8.16.0.27/8.16.0.27) with SMTP id
a476461
 wAGEcLBT000897
a476461
 for <linux-arm-kernel@lists.infradead.org>; Fri, 16 Nov 2018 14:39:55 GMT
a476461
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=raspberrypi.org;
a476461
 h=from : to : cc : subject : date : message-id; s=pp;
a476461
 bh=0v+Gt0Sb75ntX3ncvTo0T5q/LQ9HrDko5y0UEkZ6WVk=;
a476461
 b=ynWh6Gt8VRIRTTbVy4Q9U7IsJWRMWYUNzTD1MYt8M2mcj01ElaCuktcZdGoRxGBJXjLU
a476461
 CYJP75gWsuHHvbSWSSn2l+qpGuEHm+ddFXuMB4nxC5VmQokt/Z0KPScc4Na2IOOU1Ci/
a476461
 wUg2tPdhfupkGIPzTt32SXu3pQX4aAYqx0AEaeJ3ptU/223MOj2Z40HZui1SL0yHxdsT
a476461
 283+7DokK0bontWXs0j69cFVklLF+txi0untOXTxGuvtbzj0vu6uMErB9qhph6HVKlnH
a476461
 kwaoGLPYrc0JnmZt1Kx7nmAQ+xxE3RaNA7E/IisHqX9m5C57JAMtN6WdWUTaLjWeIs8n 2Q==
a476461
Received: from mail-wm1-f70.google.com (mail-wm1-f70.google.com
a476461
 [209.85.128.70])
a476461
 by mx08-00252a01.pphosted.com with ESMTP id 2nr7cnhbky-1
a476461
 (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=OK)
a476461
 for <linux-arm-kernel@lists.infradead.org>; Fri, 16 Nov 2018 14:39:55 +0000
a476461
Received: by mail-wm1-f70.google.com with SMTP id d26-v6so24770633wmb.4
a476461
 for <linux-arm-kernel@lists.infradead.org>;
a476461
 Fri, 16 Nov 2018 06:39:55 -0800 (PST)
a476461
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed;
a476461
 d=raspberrypi.org; s=google;
a476461
 h=from:to:cc:subject:date:message-id;
a476461
 bh=0v+Gt0Sb75ntX3ncvTo0T5q/LQ9HrDko5y0UEkZ6WVk=;
a476461
 b=TFhWj6OD0WYvVWhFc0RE+UyQKaAMuO0Da2ahzvPlkfTJj3d26Mf15Ai4ipbfJy4x9d
a476461
 RLlgEH8Vj457x2kK3QmlXDC5Cy+kzp6FiZi2aFSBinKjY06Dmt4LElzlaye8szk/IuJ/
a476461
 f6HdjG3Rmt6Ys/Kx8fct+p87NyvHNe/yfCGnUj5k1nz7+m2eApkvTkGxzYe5SXn5s1Jp
a476461
 nv/30o4+CcPFK3SqAWo+GkWgD/Uae+4gCP38KxLx6dsYxCS7/kqIF46ac9WmAx9k44Jz
a476461
 Wt18Pe1A7rIj38vRwLv2JuwUkZrOlAhav52EyDM/03QbgRKzEM9En5DYV2GFAqR1Xc3w
a476461
 qLzw==
a476461
X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed;
a476461
 d=1e100.net; s=20161025;
a476461
 h=x-gm-message-state:from:to:cc:subject:date:message-id;
a476461
 bh=0v+Gt0Sb75ntX3ncvTo0T5q/LQ9HrDko5y0UEkZ6WVk=;
a476461
 b=gFrGygir8lioHrOeF0abzZ3xbTuyQEnk7F/vaRJmx5SyMuxe5SQqcM/PozflvPaB4w
a476461
 wHeng0ewo0t6S/xfZo9EpTKB19L5L5XnrxLoseo+tagkZJkCH2Bcw7dsBzALR2upGwrT
a476461
 SfHywXMeCKH9fRAu3/Hj0W934lZDwMG3xqmWWebQ/wqDBE41Nk/dl9iHnGKp9QN61uee
a476461
 Qv0jpp3sglzprI5CIEQqkElIXAF/jjnPqbknf+5nUyH4xUoe+CzTaEldVeHFc4iTerOZ
a476461
 b48uPgriPJVTq7Gr7L8qWJ5yLZWqenG4sAIpLbanD8Mkw8ogaybVfIZyzrSKoTbtBiSa
a476461
 oOEg==
a476461
X-Gm-Message-State: AA+aEWaOCOYCkmegm7N2wWsL8XdrnmJenH+HXps2b21WEUnrWH3tCofP
a476461
 O07nsIq/s30FFJwtMB9dMCaWwCmc2iSWxn7hnqFhagZMyuYFYcJ1Zs5caqAV/LcSS/BBriTI4M7
a476461
 4RALk0oVU/TiJvemnTTRSwFul6+hCHLFRxRM=
a476461
X-Received: by 2002:a1c:1cc4:: with SMTP id
a476461
 c187-v6mr2937585wmc.75.1542379194749;
a476461
 Fri, 16 Nov 2018 06:39:54 -0800 (PST)
a476461
X-Google-Smtp-Source: 
a476461
 AFSGD/XjyVsHsmDi+oKxMsFZ/hLG36TQdg1uDC2wO1upiuvyI+72rZz3AeAffzu3LWvkW8xxAI1e0w==
a476461
X-Received: by 2002:a1c:1cc4:: with SMTP id
a476461
 c187-v6mr2937565wmc.75.1542379194454;
a476461
 Fri, 16 Nov 2018 06:39:54 -0800 (PST)
a476461
Received: from jamesh-VirtualBox.pitowers.org
a476461
 ([2a00:2381:fdf7:14:4419:8784:6076:3820])
a476461
 by smtp.gmail.com with ESMTPSA id a7sm26247594wrx.26.2018.11.16.06.39.53
a476461
 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128);
a476461
 Fri, 16 Nov 2018 06:39:53 -0800 (PST)
a476461
From: James Hughes <james.hughes@raspberrypi.org>
a476461
To: eric@anholt.net, stefan.wahren@i2se.com,
a476461
 linux-rpi-kernel@lists.infradead.org, linux-arm-kernel@lists.infradead.org
a476461
Subject: [PATCH v3] firmware: raspberrypi: Fix firmware calls with large
a476461
 buffers
a476461
Date: Fri, 16 Nov 2018 14:39:07 +0000
a476461
Message-Id: <20181116143907.6149-1-james.hughes@raspberrypi.org>
a476461
X-Mailer: git-send-email 2.17.1
a476461
X-Proofpoint-Virus-Version: vendor=fsecure engine=2.50.10434:, ,
a476461
 definitions=2018-11-16_09:, , signatures=0
a476461
X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 
a476461
X-CRM114-CacheID: sfid-20181116_144007_971248_9AC931E8 
a476461
X-CRM114-Status: GOOD (  21.12  )
a476461
X-BeenThere: linux-arm-kernel@lists.infradead.org
a476461
X-Mailman-Version: 2.1.21
a476461
Precedence: list
a476461
List-Id: <linux-arm-kernel.lists.infradead.org>
a476461
List-Unsubscribe: 
a476461
 <http://lists.infradead.org/mailman/options/linux-arm-kernel>,
a476461
 <mailto:linux-arm-kernel-request@lists.infradead.org?subject=unsubscribe>
a476461
List-Archive: <http://lists.infradead.org/pipermail/linux-arm-kernel/>
a476461
List-Post: <mailto:linux-arm-kernel@lists.infradead.org>
a476461
List-Help: <mailto:linux-arm-kernel-request@lists.infradead.org?subject=help>
a476461
List-Subscribe: 
a476461
 <http://lists.infradead.org/mailman/listinfo/linux-arm-kernel>,
a476461
 <mailto:linux-arm-kernel-request@lists.infradead.org?subject=subscribe>
a476461
Cc: James Hughes <james.hughes@raspberrypi.org>
a476461
MIME-Version: 1.0
a476461
Content-Type: text/plain; charset="us-ascii"
a476461
Sender: "linux-arm-kernel" <linux-arm-kernel-bounces@lists.infradead.org>
a476461
Errors-To: 
a476461
 linux-arm-kernel-bounces+patchwork-linux-arm=patchwork.kernel.org@lists.infradead.org
a476461
X-Virus-Scanned: ClamAV using ClamSMTP
a476461
a476461
Commit a1547e0bca51 ("firmware: raspberrypi: Remove VLA usage")
a476461
moved away from VLA's to a fixed maximum size for mailbox data.
a476461
However, some mailbox calls use larger data buffers
a476461
than the maximum allowed in that change. This fix therefor
a476461
moves from using fixed buffers to kmalloc to ensure all sizes
a476461
are catered for.
a476461
a476461
There is some documentation, which is somewhat out of date,
a476461
on the mailbox calls here :
a476461
https://github.com/raspberrypi/firmware/wiki/Mailbox-property-interface
a476461
a476461
Fixes: a1547e0bca51 ("firmware: raspberrypi: Remove VLA usage")
a476461
a476461
Signed-off-by: James Hughes <james.hughes@raspberrypi.org>
a476461
Reviewed-by: Eric Anholt <eric@anholt.net>
a476461
---
a476461
 drivers/firmware/raspberrypi.c | 35 +++++++++++++++++-----------------
a476461
 1 file changed, 18 insertions(+), 17 deletions(-)
a476461
a476461
v2: Changes to commit message and format only. No code change.
a476461
v3: Moved declaration of header back to original position
a476461
a476461
diff --git a/drivers/firmware/raspberrypi.c b/drivers/firmware/raspberrypi.c
a476461
index a200a2174611..44eb99807e33 100644
a476461
--- a/drivers/firmware/raspberrypi.c
a476461
+++ b/drivers/firmware/raspberrypi.c
a476461
@@ -14,6 +14,7 @@
a476461
 #include <linux/module.h>
a476461
 #include <linux/of_platform.h>
a476461
 #include <linux/platform_device.h>
a476461
+#include <linux/slab.h>
a476461
 #include <soc/bcm2835/raspberrypi-firmware.h>
a476461
 
a476461
 #define MBOX_MSG(chan, data28)		(((data28) & ~0xf) | ((chan) & 0xf))
a476461
@@ -21,8 +22,6 @@
a476461
 #define MBOX_DATA28(msg)		((msg) & ~0xf)
a476461
 #define MBOX_CHAN_PROPERTY		8
a476461
 
a476461
-#define MAX_RPI_FW_PROP_BUF_SIZE	32
a476461
-
a476461
 static struct platform_device *rpi_hwmon;
a476461
 
a476461
 struct rpi_firmware {
a476461
@@ -144,28 +143,30 @@ EXPORT_SYMBOL_GPL(rpi_firmware_property_list);
a476461
 int rpi_firmware_property(struct rpi_firmware *fw,
a476461
 			  u32 tag, void *tag_data, size_t buf_size)
a476461
 {
a476461
-	/* Single tags are very small (generally 8 bytes), so the
a476461
-	 * stack should be safe.
a476461
-	 */
a476461
-	u8 data[sizeof(struct rpi_firmware_property_tag_header) +
a476461
-		MAX_RPI_FW_PROP_BUF_SIZE];
a476461
-	struct rpi_firmware_property_tag_header *header =
a476461
-		(struct rpi_firmware_property_tag_header *)data;
a476461
+	struct rpi_firmware_property_tag_header *header;
a476461
 	int ret;
a476461
 
a476461
-	if (WARN_ON(buf_size > sizeof(data) - sizeof(*header)))
a476461
-		return -EINVAL;
a476461
+	/* Some mailboxes can use over 1k bytes. Rather than checking
a476461
+	 * size and using stack or kmalloc depending on requirements,
a476461
+	 * just use kmalloc. Mailboxes don't get called enough to worry
a476461
+	 * too much about the time taken in the allocation.
a476461
+	 */
a476461
+	void *data = kmalloc(sizeof(*header) + buf_size, GFP_KERNEL);
a476461
 
a476461
+	if (!data)
a476461
+		return -ENOMEM;
a476461
+
a476461
+	header = data;
a476461
 	header->tag = tag;
a476461
 	header->buf_size = buf_size;
a476461
 	header->req_resp_size = 0;
a476461
-	memcpy(data + sizeof(struct rpi_firmware_property_tag_header),
a476461
-	       tag_data, buf_size);
a476461
+	memcpy(data + sizeof(*header), tag_data, buf_size);
a476461
+
a476461
+	ret = rpi_firmware_property_list(fw, data, buf_size + sizeof(*header));
a476461
+
a476461
+	memcpy(tag_data, data + sizeof(*header), buf_size);
a476461
 
a476461
-	ret = rpi_firmware_property_list(fw, &data, buf_size + sizeof(*header));
a476461
-	memcpy(tag_data,
a476461
-	       data + sizeof(struct rpi_firmware_property_tag_header),
a476461
-	       buf_size);
a476461
+	kfree(data);
a476461
 
a476461
 	return ret;
a476461
 }