Received: by 2002:ad5:474a:0:0:0:0:0 with SMTP id i10csp2837330imu; Thu, 29 Nov 2018 11:01:36 -0800 (PST) X-Google-Smtp-Source: AFSGD/WaF1876spg5VbLZTQTiFqTd0DvU61bMqs0E4+kKX7MkTqTnEs5T3mJJcoz3nFtKiQ8u7Ku X-Received: by 2002:a63:9d05:: with SMTP id i5mr2064485pgd.98.1543518096383; Thu, 29 Nov 2018 11:01:36 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1543518096; cv=none; d=google.com; s=arc-20160816; b=zDfpGPK+p6ai+CXO99gzHU/p8kmgIWUGje00hsYi8L9oE0IUm6h63SBZ3tEdbkGeXs FzpbUSWF+93X80cDuNW9tlcz1yFu1tPkkpPEmzAyFVByY6RLgB3tk2NR91Q1OK1qwR2T huIqmqbc53/ncZA3cjFgSJsJ5LkL9KcdwsioDH3Bh5/ljRphuMld4IcPTa6CqwhpAUN8 vKMEmVDqumnqEqnvnNnfR4tQPZ/TQw5akOCGKWWbBAdTxQ3QIhzqZ2eCf2llfDeaB9VE KX5qKH39cQYlZCpJCD/WrvAhNMU0tdvUWmGrxMtUtDFQBM2LEVu5Ksw5tXeDsmM8fhOK 7W9Q== 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=zak3Yt9pxmTVrqgPS2kWLH22M+VpjU+oipJhYsv/a80=; b=bvYyG8+RcozR8DfVKvVzuLAge9kDfjcXWFF17Sux+1VALXuxSL+WOvPvJMbuUTRigE dHcxM21OyBUwMfQKmcrOvgLhf+V29JTVTVy0zae5aF+1V4TwDOC8lmqjfSbUIGs+FHlG hhCGpkCg2Ca2e+Mnvzt4WcQGSo4iwao3kcKUVr0sFWC5o1BuMxJMW2Pqqpbdr5AIZF87 4xC5YNkty09RbRs8PhLGRoLeF2AyPV9zJ6SI8uCjYj7FhtrR8ZHpctqXcLs5/sommxmJ pRmkhH2HV8cXG9H6My0lIDp0jru/Gr8XS22OTqqgnNrG7PM/Tuq35GUB45fr1M7uWi6D uBWA== 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 c10si2636956pll.271.2018.11.29.11.01.21; Thu, 29 Nov 2018 11:01:36 -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 S1726762AbeK3GGs (ORCPT + 99 others); Fri, 30 Nov 2018 01:06:48 -0500 Received: from pegase1.c-s.fr ([93.17.236.30]:21030 "EHLO pegase1.c-s.fr" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1725928AbeK3GGr (ORCPT ); Fri, 30 Nov 2018 01:06:47 -0500 Received: from localhost (mailhub1-int [192.168.12.234]) by localhost (Postfix) with ESMTP id 435Rfv0BhWz9vGFR; Thu, 29 Nov 2018 20:00:23 +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 FTMLKMyRwCp9; Thu, 29 Nov 2018 20:00:22 +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 435Rft6KQyz9vGDx; Thu, 29 Nov 2018 20:00:22 +0100 (CET) Received: from localhost (localhost [127.0.0.1]) by messagerie.si.c-s.fr (Postfix) with ESMTP id DD8398B8CD; Thu, 29 Nov 2018 20:00:21 +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 deLRbwMYqRBi; Thu, 29 Nov 2018 20:00:21 +0100 (CET) Received: from po14163vm.idsi0.si.c-s.fr (unknown [192.168.232.3]) by messagerie.si.c-s.fr (Postfix) with ESMTP id CE4A68B902; Thu, 29 Nov 2018 20:00:16 +0100 (CET) Received: by po14163vm.idsi0.si.c-s.fr (Postfix, from userid 0) id 5C46269B59; Thu, 29 Nov 2018 19:00:16 +0000 (UTC) Message-Id: <8835330baa77d88e0267b0b1215b78c991e6d17a.1543517818.git.christophe.leroy@c-s.fr> In-Reply-To: References: From: Christophe Leroy Subject: [PATCH v1 03/13] 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, 29 Nov 2018 19:00:16 +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 3a29e88308b0..61c10ee00ba2 100644 --- a/arch/powerpc/mm/ppc_mmu_32.c +++ b/arch/powerpc/mm/ppc_mmu_32.c @@ -72,39 +72,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_TEXT); + 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