Received: by 2002:a25:8b91:0:0:0:0:0 with SMTP id j17csp813541ybl; Wed, 11 Dec 2019 07:55:19 -0800 (PST) X-Google-Smtp-Source: APXvYqxl+7J5+jChr4lRT4AlVeIYGnAZa4CqpeGEuLT/RAsehldb2KNGW/5J3aYJ8cvZljoyK209 X-Received: by 2002:aca:75d7:: with SMTP id q206mr3410997oic.9.1576079718842; Wed, 11 Dec 2019 07:55:18 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1576079718; cv=none; d=google.com; s=arc-20160816; b=L0gp8/Ak/mSqn9Dbnca1sDBFqAhMOQMorNOGF7ZsAzrz9bpIIMAOUOdEQITWHlMhVn NJG2WpqMs6t9wUaLbKx7sYJBkT3iBY3DW8HO2QJgHwUyXD57XVJ6ij8Ei15KTCASSrpY fH7rEYjqXtxU0vTR/JuG3ub+QloYA7yPvblJ4GiGRrw3s80YTyAXS3upHlItK6UgiGU9 75BhRa/mcYbl3HGC4zHyGIwC2upJmQ0tLLYO98/zVmdKULnoCnqW2FtuIhphU4j4pbCh JHVWr6NrpG/XNJt0zsN9TGT2OtDqqZN2rvulGxUWIVqLFOs/N3UuktiPMrkjOmGbJM8D Ga6Q== 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 :user-agent:references:in-reply-to:message-id:date:subject:cc:to :from:dkim-signature; bh=SoYEYKeyMySZALMcjwgX9vN6kTDrjSJelGA/8HIgidk=; b=oTS115QW1VoskoJjI3f9sIsFpjdtXjGQEqrVYP4YVUqGQv1scN6nGuxl4AeHJHFqOZ AlmFJWgVpHzbrUptAlhgmo1NONQk1HFjpdox8jk7GxjEL7I0WZYEuCippXUavDpF2NIG 5MdHfIfkT1idYVonl9UvuYQd5PMHx+xPYv5Y9yV5dZVOgMkXs9k/cYJPtpEuT/As4+9L 4vpD8GBr1ajL4gX9ERiR/tuMBx1jSEzu41HsYrHXbkc315+EtDkM/Y6lGSwejv6wa9xa 0aMdEDg5rOdanoJz1M3TOf54+CaqCBenCdwqW2LJnfzNUZTs+ARTDr4Rc7mJizsgj408 yu+Q== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@kernel.org header.s=default header.b=HLOrbVDA; 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 Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id s68si1402985oih.275.2019.12.11.07.55.06; Wed, 11 Dec 2019 07:55:18 -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=HLOrbVDA; 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 Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1732771AbfLKPyC (ORCPT + 99 others); Wed, 11 Dec 2019 10:54:02 -0500 Received: from mail.kernel.org ([198.145.29.99]:46412 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1730284AbfLKPS0 (ORCPT ); Wed, 11 Dec 2019 10:18:26 -0500 Received: from localhost (83-86-89-107.cable.dynamic.v4.ziggo.nl [83.86.89.107]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPSA id 134FE208C3; Wed, 11 Dec 2019 15:18:24 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=default; t=1576077505; bh=Gaw9+FhkITEH1xQoprcNUFZopSw4zsuzQkRpNB2caFQ=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=HLOrbVDAgW8j5V58o17nB6pb2WbN+bNjTZQPRWr78pvHZbf8EZhnLZz7FKwpiHHum rUXoal0tQtK0OFy2OYFNoC0BCI26N5gICxAw2G1XgekwhT3IQtTWutsA17KJHg97QB +w29OKbznsjwCDlPydhD5M2SxoU6z6D5fwEkW/0s= From: Greg Kroah-Hartman To: linux-kernel@vger.kernel.org Cc: Greg Kroah-Hartman , stable@vger.kernel.org, James Hughes , Eric Anholt , Stefan Wahren , Sasha Levin Subject: [PATCH 4.19 063/243] firmware: raspberrypi: Fix firmware calls with large buffers Date: Wed, 11 Dec 2019 16:03:45 +0100 Message-Id: <20191211150343.353095927@linuxfoundation.org> X-Mailer: git-send-email 2.24.1 In-Reply-To: <20191211150339.185439726@linuxfoundation.org> References: <20191211150339.185439726@linuxfoundation.org> User-Agent: quilt/0.66 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: James Hughes [ Upstream commit 91c6ada69f396e663acb2b713e8acb8a9463557d ] Commit a1547e0bca51 ("firmware: raspberrypi: Remove VLA usage") moved away from VLA's to a fixed maximum size for mailbox data. However, some mailbox calls use larger data buffers than the maximum allowed in that change. This fix therefor moves from using fixed buffers to kmalloc to ensure all sizes are catered for. There is some documentation, which is somewhat out of date, on the mailbox calls here : https://github.com/raspberrypi/firmware/wiki/Mailbox-property-interface Fixes: a1547e0bca51 ("firmware: raspberrypi: Remove VLA usage") Signed-off-by: James Hughes Reviewed-by: Eric Anholt Signed-off-by: Stefan Wahren Signed-off-by: Sasha Levin --- drivers/firmware/raspberrypi.c | 35 +++++++++++++++++----------------- 1 file changed, 18 insertions(+), 17 deletions(-) diff --git a/drivers/firmware/raspberrypi.c b/drivers/firmware/raspberrypi.c index a200a21746119..44eb99807e337 100644 --- a/drivers/firmware/raspberrypi.c +++ b/drivers/firmware/raspberrypi.c @@ -14,6 +14,7 @@ #include #include #include +#include #include #define MBOX_MSG(chan, data28) (((data28) & ~0xf) | ((chan) & 0xf)) @@ -21,8 +22,6 @@ #define MBOX_DATA28(msg) ((msg) & ~0xf) #define MBOX_CHAN_PROPERTY 8 -#define MAX_RPI_FW_PROP_BUF_SIZE 32 - static struct platform_device *rpi_hwmon; struct rpi_firmware { @@ -144,28 +143,30 @@ EXPORT_SYMBOL_GPL(rpi_firmware_property_list); int rpi_firmware_property(struct rpi_firmware *fw, u32 tag, void *tag_data, size_t buf_size) { - /* Single tags are very small (generally 8 bytes), so the - * stack should be safe. - */ - u8 data[sizeof(struct rpi_firmware_property_tag_header) + - MAX_RPI_FW_PROP_BUF_SIZE]; - struct rpi_firmware_property_tag_header *header = - (struct rpi_firmware_property_tag_header *)data; + struct rpi_firmware_property_tag_header *header; int ret; - if (WARN_ON(buf_size > sizeof(data) - sizeof(*header))) - return -EINVAL; + /* Some mailboxes can use over 1k bytes. Rather than checking + * size and using stack or kmalloc depending on requirements, + * just use kmalloc. Mailboxes don't get called enough to worry + * too much about the time taken in the allocation. + */ + void *data = kmalloc(sizeof(*header) + buf_size, GFP_KERNEL); + if (!data) + return -ENOMEM; + + header = data; header->tag = tag; header->buf_size = buf_size; header->req_resp_size = 0; - memcpy(data + sizeof(struct rpi_firmware_property_tag_header), - tag_data, buf_size); + memcpy(data + sizeof(*header), tag_data, buf_size); + + ret = rpi_firmware_property_list(fw, data, buf_size + sizeof(*header)); + + memcpy(tag_data, data + sizeof(*header), buf_size); - ret = rpi_firmware_property_list(fw, &data, buf_size + sizeof(*header)); - memcpy(tag_data, - data + sizeof(struct rpi_firmware_property_tag_header), - buf_size); + kfree(data); return ret; } -- 2.20.1