Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1753823AbeAODOi (ORCPT + 1 other); Sun, 14 Jan 2018 22:14:38 -0500 Received: from mout.gmx.net ([212.227.15.18]:54097 "EHLO mout.gmx.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1753586AbeAODOc (ORCPT ); Sun, 14 Jan 2018 22:14:32 -0500 From: =?UTF-8?q?Jonathan=20Neusch=C3=A4fer?= To: linux-kernel@vger.kernel.org Cc: linuxppc-dev@lists.ozlabs.org, linux-gpio@vger.kernel.org, devicetree@vger.kernel.org, =?UTF-8?q?Jonathan=20Neusch=C3=A4fer?= , Brijesh Singh , Tom Lendacky , Thomas Gleixner , Borislav Petkov , Kees Cook Subject: [PATCH 1/6] resource: Extend the PPC32 reserved memory hack Date: Mon, 15 Jan 2018 04:13:56 +0100 Message-Id: <20180115031401.19577-2-j.neuschaefer@gmx.net> X-Mailer: git-send-email 2.15.1 In-Reply-To: <20180115031401.19577-1-j.neuschaefer@gmx.net> References: <20180115031401.19577-1-j.neuschaefer@gmx.net> MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-Provags-ID: V03:K0:ewp/ZmAIvF7BeAdWKX2XLRN7/DJ8fWbWAj55QyTBnL8IKQpgtXP jIbH37BAi+mA4HSAbrdk+KNfQGQyogylrhoEQWgaEDa3fpbW89zzD8GezTBoQh1Yfz05+sF Pdytm9MrU/q9haWLsCRa9m0N/Sx4+H11M0ze2lA8V4zCeLPl4B+QW70QvpmA7cJa9yGodhv 7DVNHqHB5jyuENXlA2OGQ== X-UI-Out-Filterresults: notjunk:1;V01:K0:+JSW5nRpzc8=:T9i6LMGx8yz4iFL9w8qzb4 hgFCEa3RkxVzsXfccK1xUi/9qz75+QFECKOzin1uJJvFATYl+z9oGnTMiHqNmqQv9lr26/sNu wviKpJ+t8EXsxyc4uXQVVfj0O07jjnXUlxefgztFT9BrB9QPUBQ7MIqyxNUL2ikpHO9v9KVYR KccfD05+WLHTV0Ta/ZC/+ybc3Cf28PhOaCXcEJUaDQhvRWXXfaj6ci/NFrl2AutX+JI59/bpI Lxa1He1pM0k/Rnes+WfLTg++GbdFswuZNF63Mg7A7pa7iXfRb12F/c34KGLxhaMoUsF2/uKHT swjKxWYaO89DwoZZ1ZAWYsHNkh3XSPVQpNj5rhNaZp/UVIKc9o3mmrG3cJde3AM2cduzwaeTy JHm+c4F2sqRUSlMGbb0rkE2fBc+9A+gMlosI/LcfcHlIE03IHaxz0WK3lKulRKBwzEkTx4FL1 94Np42KrVSV3L+04zjlTzIZaVfpvALhcVjzZK0t9ou0ANFSM2pnnbT66QbSOHtDylcDd5AAOy 3mAa2MjsDlTkjAql2Z5sdk0XrrDw1VZ4blDtmM/EggpqDE2hMbDh8jiIlNN8USUMxLadT69kS niy48f1TWKgUajNEWdVLDg1XkuIJTABZ4yPaIAZaNn7hlxeRhR94Vf7Z93HPPpng8YOvbbgS7 TwYzOChN/dY0wDW7iZvgDQHiEK6U0bLz4pqDyMFCFfha8lTgIi1nSfdxdsxWEvxX+i0zsnfwb rsR7w/xl/B+uuP6n3LE1AGJhGu57MojH+HOfBs0Tf3GOsfw5Qj/ZJfjXqy03u3UdVWNPVzj3h ouw8UZ7yxe4rHVGV5Cwq6tFLzCox5ailA9Se5IVOOnD2e7KD4A= Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Return-Path: On the Nintendo Wii, there are two ranges of physical memory, and MMIO in between, but Linux on ppc32 doesn't support discontiguous memory. Therefore a hack was introduced in commit c5df7f775148 ("powerpc: allow ioremap within reserved memory regions") and commit de32400dd26e ("wii: use both mem1 and mem2 as ram"): - Treat the area from the start of the first memory area (MEM1) to the end of the second (MEM2) as one big memory area, but mark the part that doesn't belong to MEM1 or MEM2 as reserved. - Only on the Wii, allow ioremap to be used on reserved memory. This hack, however, doesn't account for the "resource"-based API in kernel/resource.c, because __request_region performs its own checks. Extend the hack to kernel/resource.c, to allow more drivers to allocate their MMIO regions on the Wii. Signed-off-by: Jonathan Neuschäfer --- kernel/resource.c | 21 ++++++++++++++++++++- 1 file changed, 20 insertions(+), 1 deletion(-) diff --git a/kernel/resource.c b/kernel/resource.c index 54ba6de3757c..bb3d329329da 100644 --- a/kernel/resource.c +++ b/kernel/resource.c @@ -1134,6 +1134,24 @@ resource_size_t resource_alignment(struct resource *res) static DECLARE_WAIT_QUEUE_HEAD(muxed_resource_wait); +/* + * On some ppc32 platforms (Nintendo Wii), reserved memory is used to work + * around the fact that Linux doesn't support discontiguous memory (all memory + * is treated as one large area with holes punched in it), and reserved memory + * is allowed to be allocated. + */ +#ifdef CONFIG_PPC32 +static bool conflict_ignored(struct resource *conflict) +{ + extern int __allow_ioremap_reserved; + + return __allow_ioremap_reserved && + (conflict->flags & IORESOURCE_SYSRAM); +} +#else +static bool conflict_ignored(struct resource *conflict) { return false; } +#endif + /** * __request_region - create a new busy resource region * @parent: parent resource descriptor @@ -1166,8 +1184,9 @@ struct resource * __request_region(struct resource *parent, res->desc = parent->desc; conflict = __request_resource(parent, res); - if (!conflict) + if (!conflict || conflict_ignored(conflict)) break; + if (conflict != parent) { if (!(conflict->flags & IORESOURCE_BUSY)) { parent = conflict; -- 2.15.1