Received: by 2002:ad5:474a:0:0:0:0:0 with SMTP id i10csp2036916imu; Thu, 10 Jan 2019 07:16:25 -0800 (PST) X-Google-Smtp-Source: ALg8bN6THkyDLFKoZsLTBaqetqFQFcuOPpquWDSKBI7YYHaW//aoCUNQLPbdfbO+gSPpEPncS3CY X-Received: by 2002:a63:e84c:: with SMTP id a12mr7480415pgk.241.1547133385719; Thu, 10 Jan 2019 07:16:25 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1547133385; cv=none; d=google.com; s=arc-20160816; b=kDkwdCJDjMy7cO6z5457wcToBp3xKqfaSWXE5xP9xta6O/wMaMgK00caHf9VsiXbQW BY+KHxWQwILkkKDkANvsx9Wjrxt1OHaJxO21eRlbfIbPL06NdpIH48XtIwnH8eaHEmIQ oBO9tKNJoJ3ti8V1+X/0emxZY7FoUDw/HvSOQA3h8On03s9VoI8JM1NAjanXDeniQ+g5 MIl1UFyxq07MeSuKpLl+EZE5fXid1hz6foiFrwi04QIAfYleRelNCxjt4B8o5vSMLAQX XjN1DwlC2xqlsJAn09LiRo18OAkNjqECnElFOuE8SP4AVzCOyUd42GmjlVUfEySiGqm3 QCLQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:date:cc:to:subject:from:references :in-reply-to:message-id; bh=5KVfNc4sHiJ9u66qUe4SmIZpfSWkDk2nUJ0D/IOw1Ps=; b=NRULjGLWtpXuWbnH+Fyk9a3/ElE1CRErsgEhzB9VkIxwH0P66i5y7AyBONgitincYD VLZcO197GO5Ff9YhhZd6WtHcTFQuGT/4FFp5eGv7sgwc5N6Htvf6FWHRAFFOqnTfn1A7 x+YkzXT1Oxue5FPrXrtl9jbMwVL59ouBUd7x24I2Y0p5JrcYNtYUXRZ0/weKhPOTq1hp 6wh870wv1AFF/CynR5VJZtQdLRL11YqTc/Oin78Q0r7DKXulAFSR1ijmwbvyhiNSqP3N +9XuBMwRozLrFr6JIouYrckniJdwptvD4jlZnGOhgZvTgyQZpdpwRUnXQXPeJqLvDWoU BNgQ== ARC-Authentication-Results: i=1; mx.google.com; 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 3si305106plo.102.2019.01.10.07.16.10; Thu, 10 Jan 2019 07:16:25 -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; 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 S1729798AbfAJPNC (ORCPT + 99 others); Thu, 10 Jan 2019 10:13:02 -0500 Received: from pegase1.c-s.fr ([93.17.236.30]:40327 "EHLO pegase1.c-s.fr" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1729555AbfAJPLp (ORCPT ); Thu, 10 Jan 2019 10:11:45 -0500 Received: from localhost (mailhub1-int [192.168.12.234]) by localhost (Postfix) with ESMTP id 43b8bd5mvmz9v115; Thu, 10 Jan 2019 16:11:41 +0100 (CET) X-Virus-Scanned: Debian amavisd-new at c-s.fr Received: from pegase1.c-s.fr ([192.168.12.234]) by localhost (pegase1.c-s.fr [192.168.12.234]) (amavisd-new, port 10024) with ESMTP id 1UJEwtcL4gGg; Thu, 10 Jan 2019 16:11:41 +0100 (CET) Received: from messagerie.si.c-s.fr (messagerie.si.c-s.fr [192.168.25.192]) by pegase1.c-s.fr (Postfix) with ESMTP id 43b8bd54jrz9v113; Thu, 10 Jan 2019 16:11:41 +0100 (CET) Received: from localhost (localhost [127.0.0.1]) by messagerie.si.c-s.fr (Postfix) with ESMTP id 3249F8B89F; Thu, 10 Jan 2019 16:11:43 +0100 (CET) X-Virus-Scanned: amavisd-new at c-s.fr Received: from messagerie.si.c-s.fr ([127.0.0.1]) by localhost (messagerie.si.c-s.fr [127.0.0.1]) (amavisd-new, port 10023) with ESMTP id HNLwrVavCuLu; Thu, 10 Jan 2019 16:11:43 +0100 (CET) Received: from po16846vm.idsi0.si.c-s.fr (unknown [192.168.4.90]) by messagerie.si.c-s.fr (Postfix) with ESMTP id 00C338B898; Thu, 10 Jan 2019 16:11:42 +0100 (CET) Received: by po16846vm.idsi0.si.c-s.fr (Postfix, from userid 0) id CFCC06BF21; Thu, 10 Jan 2019 15:11:42 +0000 (UTC) Message-Id: <01e24dde7671275d9191cbe7f431a961b6dc95f5.1547132681.git.christophe.leroy@c-s.fr> In-Reply-To: References: From: Christophe Leroy Subject: [PATCH v2 02/15] powerpc/mm/32s: rework mmu_mapin_ram() To: Benjamin Herrenschmidt , Paul Mackerras , Michael Ellerman , j.neuschaefer@gmx.net Cc: linux-kernel@vger.kernel.org, linuxppc-dev@lists.ozlabs.org Date: Thu, 10 Jan 2019 15:11:42 +0000 (UTC) Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org This patch reworks mmu_mapin_ram() to be more generic and map as much blocks as possible. It now supports blocks not starting at address 0. It scans DBATs array to find free ones instead of forcing the use of BAT2 and BAT3. Signed-off-by: Christophe Leroy --- arch/powerpc/mm/ppc_mmu_32.c | 61 +++++++++++++++++++++++++++++--------------- 1 file changed, 40 insertions(+), 21 deletions(-) diff --git a/arch/powerpc/mm/ppc_mmu_32.c b/arch/powerpc/mm/ppc_mmu_32.c index b260ced065b4..b8a8d55f51a6 100644 --- a/arch/powerpc/mm/ppc_mmu_32.c +++ b/arch/powerpc/mm/ppc_mmu_32.c @@ -73,39 +73,58 @@ unsigned long p_block_mapped(phys_addr_t pa) return 0; } +static int find_free_bat(void) +{ + int b; + + if (cpu_has_feature(CPU_FTR_601)) { + for (b = 0; b < 4; b++) { + struct ppc_bat *bat = BATS[b]; + + if (!(bat[0].batl & 0x40)) + return b; + } + } else { + int n = mmu_has_feature(MMU_FTR_USE_HIGH_BATS) ? 8 : 4; + + for (b = 0; b < n; b++) { + struct ppc_bat *bat = BATS[b]; + + if (!(bat[1].batu & 3)) + return b; + } + } + return -1; +} + +static unsigned int block_size(unsigned long base, unsigned long top) +{ + unsigned int max_size = (cpu_has_feature(CPU_FTR_601) ? 8 : 256) << 20; + unsigned int base_shift = (fls(base) - 1) & 31; + unsigned int block_shift = (fls(top - base) - 1) & 31; + + return min3(max_size, 1U << base_shift, 1U << block_shift); +} + unsigned long __init mmu_mapin_ram(unsigned long base, unsigned long top) { - unsigned long tot, bl, done; - unsigned long max_size = (256<<20); + int idx; if (__map_without_bats) { printk(KERN_DEBUG "RAM mapped without BATs\n"); return 0; } - /* Set up BAT2 and if necessary BAT3 to cover RAM. */ + while ((idx = find_free_bat()) != -1 && base != top) { + unsigned int size = block_size(base, top); - /* Make sure we don't map a block larger than the - smallest alignment of the physical address. */ - tot = top; - for (bl = 128<<10; bl < max_size; bl <<= 1) { - if (bl * 2 > tot) + if (size < 128 << 10) break; + setbat(idx, PAGE_OFFSET + base, base, size, PAGE_KERNEL_X); + base += size; } - setbat(2, PAGE_OFFSET, 0, bl, PAGE_KERNEL_X); - done = (unsigned long)bat_addrs[2].limit - PAGE_OFFSET + 1; - if ((done < tot) && !bat_addrs[3].limit) { - /* use BAT3 to cover a bit more */ - tot -= done; - for (bl = 128<<10; bl < max_size; bl <<= 1) - if (bl * 2 > tot) - break; - setbat(3, PAGE_OFFSET+done, done, bl, PAGE_KERNEL_X); - done = (unsigned long)bat_addrs[3].limit - PAGE_OFFSET + 1; - } - - return done; + return base; } /* -- 2.13.3