From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752709AbbK3C45 (ORCPT ); Sun, 29 Nov 2015 21:56:57 -0500 Received: from mail-bn1bn0103.outbound.protection.outlook.com ([157.56.110.103]:14848 "EHLO na01-bn1-obe.outbound.protection.outlook.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1751675AbbK3C4t (ORCPT ); Sun, 29 Nov 2015 21:56:49 -0500 Authentication-Results: spf=permerror (sender IP is 192.88.158.2) smtp.mailfrom=freescale.com; freescale.mail.onmicrosoft.com; dkim=none (message not signed) header.d=none;freescale.mail.onmicrosoft.com; dmarc=none action=none header.from=freescale.com; From: Zhao Qiang To: CC: , , , , , , , Zhao Qiang Subject: [PATCH v13 3/6] CPM/QE: use genalloc to manage CPM/QE muram Date: Mon, 30 Nov 2015 10:48:54 +0800 Message-ID: <1448851737-33125-3-git-send-email-qiang.zhao@freescale.com> X-Mailer: git-send-email 2.1.0.27.g96db324 In-Reply-To: <1448851737-33125-1-git-send-email-qiang.zhao@freescale.com> References: <1448851737-33125-1-git-send-email-qiang.zhao@freescale.com> X-EOPAttributedMessage: 0 X-Microsoft-Exchange-Diagnostics: 1;BN1BFFO11FD037;1:F9268J4kGkUWesv02aab0FFtPwPF1gic3U2grtMT/1AIqQV96ptbwZ4Vaz2ZYtjwLz/xtuvYMZIWHpmAxwLOJpsuEEx9suCjQwq4SfgtSe50DxcUzPWEfqkqk39bAMJaHK0XpBxAG5Tw3nMXfCggYqAhfGM/CPcRzs3Ji+fZpjCGKfUuijGE0EnbXKbwKSTEfF1siSioM9VfpY2+qrMAPL8Hu3iyanUOGvLPw+xcQAIkext9t2KIVS5zw+dYImG1F5m3CNJ1kXFbCXK3R61yIKrsaxr+/wJgfK6H69xrZhA85QM48VSUMe9/9tAORMp90FqR0zpccaTrxy5pn7g5V5YRbWCmPbR6y361HCW/H1GBG31+2a2zJdEScqSlPeaIcBoWxqy/wwUouNjbsLwbU+yOBhZIeiI/zeQlE/Law396n1fOe+3YN8hKTRjVneHh X-Forefront-Antispam-Report: CIP:192.88.158.2;CTRY:US;IPV:NLI;EFV:NLI;SFV:NSPM;SFS:(10019020)(6009001)(2980300002)(448002)(189002)(199003)(586003)(85326001)(5890100001)(97736004)(229853001)(48376002)(77096005)(50226001)(2351001)(11100500001)(76176999)(5003940100001)(106466001)(87936001)(92566002)(50986999)(81156007)(47776003)(1096002)(50466002)(189998001)(19580395003)(6806005)(33646002)(5008740100001)(36756003)(86362001)(19580405001)(107886002)(69596002)(110136002)(5001960100002)(4001430100002)(2950100001)(1220700001)(104016004)(2004002);DIR:OUT;SFP:1102;SCL:1;SRVR:CY1PR0301MB1548;H:az84smr01.freescale.net;FPR:;SPF:PermError;PTR:InfoDomainNonexistent;MX:1;A:1;LANG:en; MIME-Version: 1.0 Content-Type: text/plain X-Microsoft-Exchange-Diagnostics: 1;CY1PR0301MB1548;2:hhhl5DKRydR/U0so9jvFehFDT6xeBXZdGwnMQnFsoy6nmHgCac1Z48caNDU98ziAZlvV8HIdmChqke89KwHLruBT7UXeZVrjSvJOtOHezswYn6KDgvr3HP7+EZesbYVuUrbFjfFQdeYpjH9p1prxkQ==;3:yLuN4e6RkKwHf/Yi+o33erZchsQ0a8oYbxpRQt0ocmC9l+lINz91cUZ2WDXFzP8gmv5XCJNb532T4Qh1UkawekOqGjwpriYb2l/+LgniwRg/gUrNj8JuUEfUdonQ398m0Ya89ZZwVsGFtvcYyK+FDwJHDudtA2eQbDL3yIWl3DxSOIW1t884C//sdpPxSb6zym+vYAgdmzTTL3xdW84GYjqZJVgUF9rRNtDVdbRxdnk=;25:iHyv+09ajNSg9i4IjykM5QTGytuxpqrmiyCl3Onk515q8Vq4+DALb2LIYZeWfQ0UI4+01MnRd3rVnPE4XHVCvWGB+tKV4QYGio6xjBXqPHpxAAVddI/wqA04AwvLcdgEZh5wGNFEOWAVaAKezrR8X2zGsPyO2GmYmcRC2Qx9SftwybYqov2cQWS6Ayc1PlvXGwNegsx+eO2dZ5LShDcTakYZMZbjrycMiI3+50sI81Dgoox5+PpSYxtaFtg+JBPjFkW8T5jQL1V/+lV3Xt6Dow== X-Microsoft-Antispam: UriScan:;BCL:0;PCL:0;RULEID:;SRVR:CY1PR0301MB1548; X-Microsoft-Exchange-Diagnostics: 1;CY1PR0301MB1548;20:YW1iZRQiUtLonNbY9TgFCjBMlQDi0CDQT0WwcqeFZ/RAFcX2MMWb5APQfIVyxDkbRJRgKbFLqGfWnJycTRukVhlrBlhtfK8Hi6T7VZdE0D3m9djhdDVIgkRhQO71zECOzz+/gNCVe/oi2bZjvDsEG4j+7yO+/VOyVyqEAHs+wAmUzjH4U4vFYf/+bUeZMNju1TmE8iO+yiTGe54t7vKtqrnIOhkA6BjLRtOzmYXzO30v/Es8jz73DI4rB2gzDXkvub83AQOGotJ9rM4ft+NHkNKWTBDRBjmdKMEeSdLYL3Y6JHo/ZUAbd6DzbsCuxIYWOeqBGDCxNd0M/FQSjAQbGyBhuSCNss8+lHG3dKJsl+Q=;4:XNeguPp6XX6dD87eQxUO+jYASLHiyc4DdBruAjSBAkwU3T/teoau3UvLzwOMsAFyDunXh6tfMkeuF9jgAlR7Oig+F/tLFZmnPNaQlUthba8dmd4dWTs6hvYeQFDer2epeZjttZ2N7Rm/75cl4Yn9uXOsK2ab0QkEgzHjf+zJZ5K1dyQUDSq6JB/H3FGKQU2h5lSUv5cuDAVhQO1JhXKtt0JAuch6fqEEiZJh4yBYi48Bk2u+I+hdX2HkR4StgnH2TabcznC9/5jc+LvYwvkPF9DSnmFSHkr/ZkeK+/JVBttmtYVCX2ZGjLnQ4WLpo/yV4DecWdRFHrYkFNpAlfS3EUvBEfrxW5AnGrncHyzBjT8M2z8L5/E+cK2b2sWaZejQlyqHgIhBLFW9HM8aqscAxLtQMEpuLVbvXDhCopJT+RmYYsLONdN0wmBiBkRISAxo X-Microsoft-Antispam-PRVS: X-Exchange-Antispam-Report-Test: UriScan:(101931422205132); X-Exchange-Antispam-Report-CFA-Test: BCL:0;PCL:0;RULEID:(601004)(2401047)(8121501046)(5005006)(520078)(10201501046)(3002001);SRVR:CY1PR0301MB1548;BCL:0;PCL:0;RULEID:;SRVR:CY1PR0301MB1548; X-Forefront-PRVS: 0776C39A48 X-Microsoft-Exchange-Diagnostics: =?us-ascii?Q?1;CY1PR0301MB1548;23:Tu0SH2BLjjW3QLRz8/DF0Mu7YBS9MYXeL3Qpuxb?= =?us-ascii?Q?JKP4dLE38+7Yw6mZFs7wW+dibq7H11M+FkVYhp49e6j5lM7Ay2XGVTSSPHcK?= =?us-ascii?Q?aEweLLRZRGTckUETB/vUfMSXoXDTtCZj/aBG9o5ug+CvCVn+GWg4nrzHvS7F?= =?us-ascii?Q?VuB0ZXnDELmKcDKWN4YCZbA00atEk8sSr9VN3fIUULnBsBHYqXIzuoXrgLNu?= =?us-ascii?Q?IiCzowFXkJC8Ein4J16iOJ3PgUldIUZ/MoKzcYOFojHQ6s+JBseo+MfbWq7h?= =?us-ascii?Q?DvhmHdpQFsNn+j1m7ySRh4FOi2uwAGun0MglR3tqcrIuMsSUlyDr9fKUPVz7?= =?us-ascii?Q?36pYG0GewMMXuXWwc5NraOfqvWwsWQh894mgT9Mb1JzXf4JgsHxeo85f70Z9?= =?us-ascii?Q?7C7vUpD+M3IndmqLLwYoCvk9jsC4XOGTwZ+9aYL7+dAaXq/n4PzOyQCWyCwj?= =?us-ascii?Q?ruz+2urQNXdMecJKgVoZ+jAlvUehElLlovGmC2bWK3K+K3SP7/wMm1jvNl1c?= =?us-ascii?Q?yQE208oSurHBSZMAWz2yqwP0VPkMHuixdQzhp6l9/ZOachBnib5YZkhUc34u?= =?us-ascii?Q?3KzAPxRKEVO0rSEtmDjQCVxEDCfUEbATk2IKzqf4BU3WerI+n3FRLIkfd8qh?= =?us-ascii?Q?bszCz5IRa03aC3Le0zXC1Orv/BSfmXefOufLwvIKQ4sYeCSQcB9kCVBWVB6Z?= =?us-ascii?Q?38X7Z+gCC2TBAfVjFAFJSV4Rum6o7JMfs8wQkee7gvlRIlb1pDTU6wYG7FBJ?= =?us-ascii?Q?xBZK3zNH7oVMufyeAMN2NwPKEnej3DvhY8LNFwX03sTeLq3iunqVWKbwt97c?= =?us-ascii?Q?t9t0Mtawz5giGkUpykyaKHMEyFeCKpXD4w6sK9dVfIHiBQ8xjmue00tf1s1X?= =?us-ascii?Q?X3XfcEGn7YMkIvXTMwJqo0Pmkjot4mDMRxo9+Z0vZ4ye/f8xKuK9+5XFO9Nt?= =?us-ascii?Q?j+WPEvXihN0+C1q61+lcnql0QnpNXiI5ZhUi2Y8NHEnrHhMgFiEGlhGUg3kj?= =?us-ascii?Q?bjYFhVkht2cpeIDU75W18lfGckh3CuLzH9671+MABYzR+lQ4hYmaXLJH9v77?= =?us-ascii?Q?4aAhiCiq7dy/kr/XjrJ2KDKEt0grU7+VL9nAg6VBwICY5vo9T9Dy2rXD2G5T?= =?us-ascii?Q?w4v74LTHLo20=3D?= X-Microsoft-Exchange-Diagnostics: 1;CY1PR0301MB1548;5:8I9QJreQm4RRnEDoAv1cO/SK/qFkK/UY2zwvC5yeAC+9wrP3w0rO9PgrltQ/UOjmXYRwmacA/M7fD91f5rYVH0aQwadsxygs8CgZPQbErYzaZo2N9dgayUoFZqh/hafa/rKP49LFBIZVQzvzIGcYwQ==;24:g7omskc8Vi3deBQI8xYyZSUsj4YcVeOjkKFwknnDme7r0Q/3U45EPkZ22y/7IBucvo9faKROhsa/VpjNKwjvmq+rPHi7HUYiNIrIltyImPc= X-OriginatorOrg: freescale.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 30 Nov 2015 02:56:45.7210 (UTC) X-MS-Exchange-CrossTenant-Id: 710a03f5-10f6-4d38-9ff4-a80b81da590d X-MS-Exchange-CrossTenant-OriginalAttributedTenantConnectingIp: TenantId=710a03f5-10f6-4d38-9ff4-a80b81da590d;Ip=[192.88.158.2];Helo=[az84smr01.freescale.net] X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: CY1PR0301MB1548 Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Use genalloc to manage CPM/QE muram instead of rheap. Signed-off-by: Zhao Qiang --- Changes for v9: - splitted from patch 3/5, modify cpm muram management functions. Changes for v10: - modify cpm muram first, then move to qe_common - modify commit. Changes for v11: - factor out the common alloc code - modify min_alloc_order to zero for cpm_muram_alloc_fixed. Changes for v12: - Nil Changes for v13: - rebase arch/powerpc/include/asm/cpm.h | 3 + arch/powerpc/platforms/Kconfig | 4 +- arch/powerpc/sysdev/cpm_common.c | 126 +++++++++++++++++++++++++++------------ lib/genalloc.c | 2 +- 4 files changed, 94 insertions(+), 41 deletions(-) diff --git a/arch/powerpc/include/asm/cpm.h b/arch/powerpc/include/asm/cpm.h index 4398a6c..46e86b5 100644 --- a/arch/powerpc/include/asm/cpm.h +++ b/arch/powerpc/include/asm/cpm.h @@ -2,6 +2,7 @@ #define __CPM_H #include +#include #include #include #include @@ -161,6 +162,8 @@ int cpm_muram_init(void); unsigned long cpm_muram_alloc(unsigned long size, unsigned long align); int cpm_muram_free(unsigned long offset); unsigned long cpm_muram_alloc_fixed(unsigned long offset, unsigned long size); +unsigned long cpm_muram_alloc_common(unsigned long size, genpool_algo_t algo, + void *data); void __iomem *cpm_muram_addr(unsigned long offset); unsigned long cpm_muram_offset(void __iomem *addr); dma_addr_t cpm_muram_dma(void __iomem *addr); diff --git a/arch/powerpc/platforms/Kconfig b/arch/powerpc/platforms/Kconfig index b7f9c40..57069eb 100644 --- a/arch/powerpc/platforms/Kconfig +++ b/arch/powerpc/platforms/Kconfig @@ -275,7 +275,7 @@ config TAU_AVERAGE config QUICC_ENGINE bool "Freescale QUICC Engine (QE) Support" depends on FSL_SOC && PPC32 - select PPC_LIB_RHEAP + select GENERIC_ALLOCATOR select CRC32 help The QUICC Engine (QE) is a new generation of communications @@ -295,7 +295,6 @@ config CPM2 bool "Enable support for the CPM2 (Communications Processor Module)" depends on (FSL_SOC_BOOKE && PPC32) || 8260 select CPM - select PPC_LIB_RHEAP select PPC_PCI_CHOICE select ARCH_REQUIRE_GPIOLIB help @@ -325,6 +324,7 @@ config FSL_ULI1575 config CPM bool + select GENERIC_ALLOCATOR config OF_RTC bool diff --git a/arch/powerpc/sysdev/cpm_common.c b/arch/powerpc/sysdev/cpm_common.c index e00a5ee..fcc83cd 100644 --- a/arch/powerpc/sysdev/cpm_common.c +++ b/arch/powerpc/sysdev/cpm_common.c @@ -17,6 +17,7 @@ * published by the Free Software Foundation. */ +#include #include #include #include @@ -27,7 +28,6 @@ #include #include -#include #include #include @@ -65,14 +65,22 @@ void __init udbg_init_cpm(void) } #endif +static struct gen_pool *muram_pool; static spinlock_t cpm_muram_lock; -static rh_block_t cpm_boot_muram_rh_block[16]; -static rh_info_t cpm_muram_info; static u8 __iomem *muram_vbase; static phys_addr_t muram_pbase; -/* Max address size we deal with */ +struct muram_block { + struct list_head head; + unsigned long start; + int size; +}; + +static LIST_HEAD(muram_block_list); + +/* max address size we deal with */ #define OF_MAX_ADDR_CELLS 4 +#define GENPOOL_OFFSET (4096 * 8) int cpm_muram_init(void) { @@ -87,50 +95,51 @@ int cpm_muram_init(void) return 0; spin_lock_init(&cpm_muram_lock); - /* initialize the info header */ - rh_init(&cpm_muram_info, 1, - sizeof(cpm_boot_muram_rh_block) / - sizeof(cpm_boot_muram_rh_block[0]), - cpm_boot_muram_rh_block); - np = of_find_compatible_node(NULL, NULL, "fsl,cpm-muram-data"); if (!np) { /* try legacy bindings */ np = of_find_node_by_name(NULL, "data-only"); if (!np) { - printk(KERN_ERR "Cannot find CPM muram data node"); + pr_err("Cannot find CPM muram data node"); ret = -ENODEV; - goto out; + goto out_muram; } } + muram_pool = gen_pool_create(0, -1); muram_pbase = of_translate_address(np, zero); if (muram_pbase == (phys_addr_t)OF_BAD_ADDR) { - printk(KERN_ERR "Cannot translate zero through CPM muram node"); + pr_err("Cannot translate zero through CPM muram node"); ret = -ENODEV; - goto out; + goto out_pool; } while (of_address_to_resource(np, i++, &r) == 0) { if (r.end > max) max = r.end; - - rh_attach_region(&cpm_muram_info, r.start - muram_pbase, - resource_size(&r)); + ret = gen_pool_add(muram_pool, r.start - muram_pbase + + GENPOOL_OFFSET, resource_size(&r), -1); + if (ret) { + pr_err("QE: couldn't add muram to pool!\n"); + goto out_pool; + } } muram_vbase = ioremap(muram_pbase, max - muram_pbase + 1); if (!muram_vbase) { - printk(KERN_ERR "Cannot map CPM muram"); + pr_err("Cannot map QE muram"); ret = -ENOMEM; + goto out_pool; } - -out: + goto out_muram; +out_pool: + gen_pool_destroy(muram_pool); +out_muram: of_node_put(np); return ret; } -/** +/* * cpm_muram_alloc - allocate the requested size worth of multi-user ram * @size: number of bytes to allocate * @align: requested alignment, in bytes @@ -143,14 +152,13 @@ unsigned long cpm_muram_alloc(unsigned long size, unsigned long align) { unsigned long start; unsigned long flags; + struct genpool_data_align muram_pool_data; spin_lock_irqsave(&cpm_muram_lock, flags); - cpm_muram_info.alignment = align; - start = rh_alloc(&cpm_muram_info, size, "commproc"); - if (!IS_ERR_VALUE(start)) - memset_io(cpm_muram_addr(start), 0, size); + muram_pool_data.align = align; + start = cpm_muram_alloc_common(size, gen_pool_first_fit_align, + &muram_pool_data); spin_unlock_irqrestore(&cpm_muram_lock, flags); - return start; } EXPORT_SYMBOL(cpm_muram_alloc); @@ -161,23 +169,31 @@ EXPORT_SYMBOL(cpm_muram_alloc); */ int cpm_muram_free(unsigned long offset) { - int ret; unsigned long flags; + int size; + struct muram_block *tmp; + size = 0; spin_lock_irqsave(&cpm_muram_lock, flags); - ret = rh_free(&cpm_muram_info, offset); + list_for_each_entry(tmp, &muram_block_list, head) { + if (tmp->start == offset) { + size = tmp->size; + list_del(&tmp->head); + kfree(tmp); + break; + } + } + gen_pool_free(muram_pool, offset + GENPOOL_OFFSET, size); spin_unlock_irqrestore(&cpm_muram_lock, flags); - - return ret; + return size; } EXPORT_SYMBOL(cpm_muram_free); -/** +/* * cpm_muram_alloc_fixed - reserve a specific region of multi-user ram - * @offset: the offset into the muram area to reserve - * @size: the number of bytes to reserve - * - * This function returns "start" on success, -ENOMEM on failure. + * @offset: offset of allocation start address + * @size: number of bytes to allocate + * This function returns an offset into the muram area * Use cpm_dpram_addr() to get the virtual address of the area. * Use cpm_muram_free() to free the allocation. */ @@ -185,16 +201,50 @@ unsigned long cpm_muram_alloc_fixed(unsigned long offset, unsigned long size) { unsigned long start; unsigned long flags; + struct genpool_data_fixed muram_pool_data_fixed; spin_lock_irqsave(&cpm_muram_lock, flags); - cpm_muram_info.alignment = 1; - start = rh_alloc_fixed(&cpm_muram_info, offset, size, "commproc"); + muram_pool_data_fixed.offset = offset + GENPOOL_OFFSET; + start = cpm_muram_alloc_common(size, gen_pool_fixed_alloc, + &muram_pool_data_fixed); spin_unlock_irqrestore(&cpm_muram_lock, flags); - return start; } EXPORT_SYMBOL(cpm_muram_alloc_fixed); +/* + * cpm_muram_alloc_common - cpm_muram_alloc common code + * @size: number of bytes to allocate + * @algo: algorithm for alloc. + * @data: data for genalloc's algorithm. + * + * This function returns an offset into the muram area. + */ +unsigned long cpm_muram_alloc_common(unsigned long size, genpool_algo_t algo, + void *data) +{ + struct muram_block *entry; + unsigned long start; + + start = gen_pool_alloc_algo(muram_pool, size, algo, data); + if (!start) + goto out2; + start = start - GENPOOL_OFFSET; + memset_io(cpm_muram_addr(start), 0, size); + entry = kmalloc(sizeof(*entry), GFP_KERNEL); + if (!entry) + goto out1; + entry->start = start; + entry->size = size; + list_add(&entry->head, &muram_block_list); + + return start; +out1: + gen_pool_free(muram_pool, start, size); +out2: + return (unsigned long)-ENOMEM; +} + /** * cpm_muram_addr - turn a muram offset into a virtual address * @offset: muram offset to convert diff --git a/lib/genalloc.c b/lib/genalloc.c index 5ec83cd..0a11396 100644 --- a/lib/genalloc.c +++ b/lib/genalloc.c @@ -576,7 +576,7 @@ unsigned long gen_pool_fixed_alloc(unsigned long *map, unsigned long size, fixed_data = data; order = pool->min_alloc_order; offset_bit = fixed_data->offset >> order; - if (WARN_ON(fixed_data->offset & (1UL << order - 1))) + if (WARN_ON(fixed_data->offset & ((1UL << order) - 1))) return size; start_bit = bitmap_find_next_zero_area(map, size, -- 2.1.0.27.g96db324