From patchwork Fri Dec 7 22:04:28 2012 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Thomas Petazzoni X-Patchwork-Id: 1858501 Return-Path: X-Original-To: patchwork-linux-arm@patchwork.kernel.org Delivered-To: patchwork-process-083081@patchwork2.kernel.org Received: from merlin.infradead.org (merlin.infradead.org [205.233.59.134]) by patchwork2.kernel.org (Postfix) with ESMTP id 8A77FDFB79 for ; Mon, 10 Dec 2012 14:24:28 +0000 (UTC) Received: from localhost ([::1] helo=merlin.infradead.org) by merlin.infradead.org with esmtp (Exim 4.76 #1 (Red Hat Linux)) id 1Ti4D9-0006G0-4x; Mon, 10 Dec 2012 14:20:00 +0000 Received: from smtp.enix.org ([193.19.211.146]) by merlin.infradead.org with esmtps (Exim 4.76 #1 (Red Hat Linux)) id 1Th6EJ-0000vb-MI for linux-arm-kernel@lists.infradead.org; Fri, 07 Dec 2012 22:17:12 +0000 Received: from [82.247.183.72] (helo=localhost) by smtp.enix.org with esmtpsa (TLS1.0:DHE_RSA_AES_128_CBC_SHA1:16) (Exim 4.72) (envelope-from ) id 1Th62u-00046L-M4; Fri, 07 Dec 2012 23:05:25 +0100 From: Thomas Petazzoni To: Jason Cooper , Andrew Lunn , Gregory Clement Subject: [RFC v1 05/16] arm: plat-orion: introduce orion_{alloc, free}_cpu_win() functions Date: Fri, 7 Dec 2012 23:04:28 +0100 Message-Id: <1354917879-32073-6-git-send-email-thomas.petazzoni@free-electrons.com> X-Mailer: git-send-email 1.7.9.5 In-Reply-To: <1354917879-32073-1-git-send-email-thomas.petazzoni@free-electrons.com> References: <1354917879-32073-1-git-send-email-thomas.petazzoni@free-electrons.com> X-Bad-Reply: References and In-Reply-To but no 'Re:' in Subject. X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20121207_171712_173056_BD929B41 X-CRM114-Status: GOOD ( 14.36 ) X-Spam-Score: 0.4 (/) X-Spam-Report: SpamAssassin version 3.3.2 on merlin.infradead.org summary: Content analysis details: (0.4 points) pts rule name description ---- ---------------------- -------------------------------------------------- 3.0 KHOP_BIG_TO_CC Sent to 10+ recipients instaed of Bcc or a list -0.7 RP_MATCHES_RCVD Envelope sender domain matches handover relay domain -1.9 BAYES_00 BODY: Bayes spam probability is 0 to 1% [score: 0.0000] X-Mailman-Approved-At: Mon, 10 Dec 2012 09:11:08 -0500 Cc: Lior Amsalem , Yehuda Yitschak , Tawfik Bayouk , Stephen Warren , Thierry Reding , Eran Ben-Avi , Nadav Haklai , Maen Suleiman , Shadi Ammouri , linux-arm-kernel@lists.infradead.org X-BeenThere: linux-arm-kernel@lists.infradead.org X-Mailman-Version: 2.1.14 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , MIME-Version: 1.0 Sender: linux-arm-kernel-bounces@lists.infradead.org Errors-To: linux-arm-kernel-bounces+patchwork-linux-arm=patchwork.kernel.org@lists.infradead.org In the address decoding code, we implement two new functions: orion_alloc_cpu_win() and orion_free_cpu_win(). The first function finds an unused address decoding window, and configures it according to the given arguments (in terms of base address, size, target, attributes). The second function frees an address decoding window, given a physical base address. Those two new functions will be used by the PCIe code, which needs to dynamically register address decoding windows depending on the PCIe devices that are detected. The orion_free_cpu_win() function is only here to handle error cases in the PCIe devices initialization, in the normal case, address decoding windows are never freed. Signed-off-by: Thomas Petazzoni --- arch/arm/plat-orion/addr-map.c | 50 +++++++++++++++++++++++++++ arch/arm/plat-orion/include/plat/addr-map.h | 7 ++++ 2 files changed, 57 insertions(+) diff --git a/arch/arm/plat-orion/addr-map.c b/arch/arm/plat-orion/addr-map.c index dd98638..8f4ef82 100644 --- a/arch/arm/plat-orion/addr-map.c +++ b/arch/arm/plat-orion/addr-map.c @@ -109,6 +109,56 @@ static void __init orion_disable_cpu_win(const struct orion_addr_map_cfg *cfg, } /* + * Find an unused address decoding window, and enable it according to + * the arguments passed (base, size, target, attributes, remap). + */ +int __init orion_alloc_cpu_win(const struct orion_addr_map_cfg *cfg, + const u32 base, const u32 size, + const u8 target, const u8 attr, const int remap) +{ + int win; + + for (win = 0; win < cfg->num_wins; win++) { + void __iomem *addr = cfg->win_cfg_base(cfg, win); + u32 ctrl = readl(addr + WIN_CTRL_OFF); + if (!(ctrl & WIN_CTRL_ENABLE)) + break; + } + + /* No more windows available */ + if (win == cfg->num_wins) + return -ENOMEM; + + orion_setup_cpu_win(cfg, win, base, size, target, attr, remap); + return 0; +} + +/* + * Free an address decoding window, given its base address. + */ +int __init orion_free_cpu_win(const struct orion_addr_map_cfg *cfg, + const u32 base) +{ + int win; + + for (win = 0; win < cfg->num_wins; win++) { + void __iomem *addr = cfg->win_cfg_base(cfg, win); + u32 winbase = readl(addr + WIN_BASE_OFF); + u32 ctrl = readl(addr + WIN_CTRL_OFF); + + if (!(ctrl & WIN_CTRL_ENABLE)) + continue; + + if (winbase == (base & 0xffff0000)) { + orion_disable_cpu_win(cfg, win); + return 0; + } + } + + return -EINVAL; +} + +/* * Configure a number of windows. */ static void __init orion_setup_cpu_wins(const struct orion_addr_map_cfg * cfg, diff --git a/arch/arm/plat-orion/include/plat/addr-map.h b/arch/arm/plat-orion/include/plat/addr-map.h index b76c065..f8bb539 100644 --- a/arch/arm/plat-orion/include/plat/addr-map.h +++ b/arch/arm/plat-orion/include/plat/addr-map.h @@ -49,6 +49,13 @@ void __init orion_setup_cpu_win(const struct orion_addr_map_cfg *cfg, const u32 size, const u8 target, const u8 attr, const int remap); +int __init orion_alloc_cpu_win(const struct orion_addr_map_cfg *cfg, + const u32 base, const u32 size, + const u8 target, const u8 attr, const int remap); + +int __init orion_free_cpu_win(const struct orion_addr_map_cfg *cfg, + const u32 base); + void __init orion_setup_cpu_mbus_target(const struct orion_addr_map_cfg *cfg, const void __iomem *ddr_window_cpu_base); #endif