From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S932269AbbI2CPt (ORCPT ); Mon, 28 Sep 2015 22:15:49 -0400 Received: from mail-bn1bbn0109.outbound.protection.outlook.com ([157.56.111.109]:57632 "EHLO na01-bn1-obe.outbound.protection.outlook.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S932172AbbI2CPq (ORCPT ); Mon, 28 Sep 2015 22:15:46 -0400 Authentication-Results: spf=fail (sender IP is 192.88.168.50) 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 v11 3/6] CPM/QE: use genalloc to manage CPM/QE muram Date: Tue, 29 Sep 2015 10:09:18 +0800 Message-ID: <1443492561-11538-3-git-send-email-qiang.zhao@freescale.com> X-Mailer: git-send-email 2.1.0.27.g96db324 In-Reply-To: <1443492561-11538-1-git-send-email-qiang.zhao@freescale.com> References: <1443492561-11538-1-git-send-email-qiang.zhao@freescale.com> X-EOPAttributedMessage: 0 X-Microsoft-Exchange-Diagnostics: 1;BY2FFO11FD042;1:+7iRzDzLDfCm9Yo7bQXcqgi40tNiCp8eJ53qwXllO8h/k6Sz0ldD83zpKxTKLHMjjnYRe3RqXLe/V68NY0tKz0OinX2xZk4V8c04W1K9NftSSX9B8rDIsYURLhhHp65aRvKlLldogkdtwv7a2/VkPZvV0yxl6Ws9Z0+rV4jG56q4kyH2Y/nQLQPTEKkKYD+YjHPCRAuNam6NvEzc426aw+0LEOTlcciEMqIicjDtNaFV5pA6mj6jdHBAr2DMDDXgqE8HSYrtLPmtyXpQPRcoPSUsddetZMTUtXYLKArbsZ+TDoXv8jrTXI2OCxvCIn0HmYaGlW0FBdAZu0NwfovgQO1OUdx2LbjE9gDSO6u7T+q8SeZJ8j7/D0Inpgmsbn+FIhv+STS8wCO+0JND5rlupA== X-Forefront-Antispam-Report: CIP:192.88.168.50;CTRY:US;IPV:NLI;EFV:NLI;SFV:NSPM;SFS:(10019020)(6009001)(2980300002)(1110001)(1109001)(339900001)(189002)(199003)(2950100001)(104016004)(6806005)(2371004)(5890100001)(77096005)(68736005)(77156002)(50986999)(87936001)(64706001)(33646002)(85426001)(62966003)(76176999)(48376002)(86362001)(47776003)(50466002)(92566002)(4001450100002)(97736004)(46102003)(19580405001)(19580395003)(106466001)(36756003)(5001830100001)(50226001)(5003940100001)(189998001)(5001860100001)(81156007)(5001960100002)(107886002)(4001540100001)(229853001)(11100500001)(2351001)(5007970100001)(5001920100001)(110136002)(105606002)(2004002)(4001430100001);DIR:OUT;SFP:1102;SCL:1;SRVR:BN3PR03MB1479;H:tx30smr01.am.freescale.net;FPR:;SPF:Fail;PTR:InfoDomainNonexistent;MX:1;A:1;LANG:en; MIME-Version: 1.0 Content-Type: text/plain X-Microsoft-Exchange-Diagnostics: 1;BN3PR03MB1479;2:Cuhlyyy90/LBdV2KMMtjUkowDelOtMF+EUvFaFBs3qT9qRCDyoSXcrnOzW0Db5sbiJwLA8BdvVSD6eTt0BmpOsEnoc19XFUrFSvYyj8sOLlioND068ahoORL1rqJT4A4TAPS1VBWkNOdqVtphe/EFByyIfJebyk6sFCp8zht9Sk=;3:HAJwek5OduAIUJ4rBI8fXk6CTQLvGtc7Lrevd2Pm4OBKz5fMju60OeYVbtx0SPwPQa9WRANElk0kgDiYJR2KfkZjh8Lvcm1JKheeHEthPB+70S1NXmhOXcmwxFe5ytHPANgdrXK4fdgk7t/SyHOyzpQdVcpEWX0qJNHqTfAPWtkasLuGz+s0hL9qNJU3KfExPO600BK6+BOUg1ngLhPOh2oeQLhB9vkpcBqpbf8ZWWQ=;25:7fovZiU14BthO5X5OcoAkm11hY0XnprG7hQ0WO3joFPsV5UdZVVLxmn2HCxt/0wYvggpo7CqfaRteY4D4RdelhSZ0wRZVMmhdphjDXOQ1o3dhWsBYJel0EZHMwovBGxqWAU0G9rqkxR4dqstzgeUIn3devVwMhUuOIqZBaShoq02GHVN+qoHiAHdrml9G915PaX0Tu1h4rjU4oUEmQrN/6+cvP6Rn2ArFTb8ZBH+lhR5IKWYJiYJO+/TMujDHkXgkqmejyBYQBJJEDCtFin5Vw== X-Microsoft-Antispam: UriScan:;BCL:0;PCL:0;RULEID:;SRVR:BN3PR03MB1479; X-Microsoft-Exchange-Diagnostics: 1;BN3PR03MB1479;20:5tccIu6LYuM/em+Oq/hUoiDNOxQgAUBXGut+puxfBpAcxmjq/mwDyQumlSx3sBtZ7RRIS3AexAwp6heThdCut86emL7ZhS8JhzGo7aR5r1ICzOrpX+DG39dKBfBS4BObWNoj7zLcjm5rv5Ttm3TK9mj9mhE520HF1nWlHygnvwLRcKUTWDN6Hu3Nl2Wkes6E+iQA/3c6M0o+SUh3NpUlWxIqXuVtQYy2DliJGlIUzYtfXBMARV8YOPrXbrt2a2nBOzJu1baN99YinZrdOBlt8LJdNYP2q86AtJ4sCS1Lhf/WBmLV7WttFSgvOPAxfg31Zpt2yQ1kXMQzK6f+J6eyxOnLqE6pQv0vkoXCl7im/j4=;4:BSNBu+FAp+xDPHKQ0qo4Q770NAbaJzLYf7q6JJPBm1ADusQAwYOSu1wjZOUv5MJzptm7hILxb3u9p57vPWaU+hvJSmpQUIygHGg2+50f6IklsDzgoOvwBuOXwaK3eyE4YAeWEjtxzHZcldrbA82Kf1nzwEGB0nFhmRIX9IC2vC/lVE3ERZVH9Qn9WnzCawqInjrhsh/jNnCCrYsCmreV1HzCptv7aNrpo8KV9PaTRMrA32TCL3dKOkQ1vdH8qEI05Q9bNBzlw16SruZHEPsoUcf/D2KAyJ5ejJalBQtnKAydNUTW97FnIBMtH+ITad1uYEMn9kvEYUut6nbP2QDZgs3fXyHjqk7dNAcmQ/GKKSI= X-Microsoft-Antispam-PRVS: X-Exchange-Antispam-Report-Test: UriScan:; X-Exchange-Antispam-Report-CFA-Test: BCL:0;PCL:0;RULEID:(601004)(2401047)(5005006)(520078)(8121501046)(3002001);SRVR:BN3PR03MB1479;BCL:0;PCL:0;RULEID:;SRVR:BN3PR03MB1479; X-Forefront-PRVS: 0714841678 X-Microsoft-Exchange-Diagnostics: =?us-ascii?Q?1;BN3PR03MB1479;23:9sOuUnrahD5I9n+T3YT0T7p+2pmsrtYhAFbNHAVP/?= =?us-ascii?Q?7kv5uULvLJBCEfkKVPf2zeaFr1lEyeSsDxtRSSOg3EZyC4CP/lTlIGWSLnjP?= =?us-ascii?Q?QZIUXxrdML1kHmsCJbpNEN2HKB5ico9f0/3i0+EdambiBPgcVMch0bVrmOVn?= =?us-ascii?Q?CGeNxNbc8+S9FR9j0aVuYA7NvfYKmMnOMLPAdCdGAk4cLIS2zKAZOAjdtcWI?= =?us-ascii?Q?dIhagqu+IkTWAESDd+MfKBBqm2ne5+5rTgr9ByndBFlh8e9gLJumc114Zl1G?= =?us-ascii?Q?oHf8mMjLI2C1QxUrBLLlnowpQswqsQO7P54X0SgrAuGA85Cwn6oOHf4faK4X?= =?us-ascii?Q?k2vL0FVp+IyOL1NQo1UtZ1ju1Vva7cyhAjf9cKf0F20vIMil2qeJDEs4ckx+?= =?us-ascii?Q?PQfPjRYN+aCefSVPfFCwd0mXdHVusqCWC/aHt69XnJ1PY+J14ureQv7E9OD+?= =?us-ascii?Q?JbCtoJQ/Zu7fir8g3V3P7+RbNWv8UMKrPx4BDM132l48cQMQQ/XvS0zW9nAi?= =?us-ascii?Q?AsAdnYuJEHR+eJY9+yy3h9Uam3s1sO/xhcXYUXF9+/c/8i+zo6iwPAlq/D+H?= =?us-ascii?Q?jnncruv9CX7fFrw07MhaN/PzuMIk8LpL5PS8M5/Ju8w+PU/dgyNHsBslqdP7?= =?us-ascii?Q?/JbmAyBq3YjPC5vUYxRp8j75YgBJweC7qY9ZQDRKYtxSfs75Y+IQt2C/AqH3?= =?us-ascii?Q?iL6a5bvxO7m8PgFOzaawCrjjqzNjxptv7+w1QKb7xWcbg5a1uYwVpRvUYxVg?= =?us-ascii?Q?y4NaYkmxDo6ZTom+VaVDtW2iCFG4iTHHJRWPKTenXn7C4BPL3DkExY3kIvZk?= =?us-ascii?Q?BGVASRlsdsV85+yTa6rToCINWXOgCO6ajbyfazcwvlIclpPesxNTtPqxzuu/?= =?us-ascii?Q?cSTw1EH6a9GW06McRTazTC1qeggj2mMLKgJexkwtV1VHsOVqHDCgGyeuVZCD?= =?us-ascii?Q?OIZNk7/q6USLRYk/oA3SIvq8uHWob5nmGkEyPqVkegNUZBiGnTS7WlkrUnna?= =?us-ascii?Q?TqHBz9wphAeAKMHqRXk6mHuIEonVoxRhCfpzUPE6loC2WFWRM0+uniRrNjWo?= =?us-ascii?Q?Htc5kqpGULspROwfAn6a6KhgCkkf/XytYt5IDVcATCADu+DaavcolopGmYEg?= =?us-ascii?Q?CTcFF7xyIoi3yqpasHWAFtgnXk7xaiEaPpDYZb1FkK75G0lqUmTXx1164y/O?= =?us-ascii?Q?4wQ9UzkAZT6rcZtwcVqo4emfBSRXAlfXxYxMUpZmueJJ4ZDFg5KrljyzedZI?= =?us-ascii?Q?DIIOmM43iMo1zERX0HNTvdRNuD+WE86dKq8ECWywhu4ZTCG0fCR05SyndLs6?= =?us-ascii?Q?NQvNrFWGEXjhzbc4xl0Oy7zNN91qL/zhaI44LfMJvppVH/yQ29GzgoTao2rU?= =?us-ascii?Q?tC+EV8K1QxKC7TqU48tdG8brpYQIGeqMnPhLqmt7VNFuPf/?= X-Microsoft-Exchange-Diagnostics: 1;BN3PR03MB1479;5:BrCyNoJTC1hWs9j5MIT/78ESWAENekNUw1LLvOgpxmPq1oxrzjWhLl1OscXgUGMm7sobc8w1bAliG5wAMFTlorNqb8WTNAJFtm6uJEmsQff4ZdMwFHSCRNvd/bht14d9w3KcS3I0izVy1jMtiqor6Q==;24:9v87dgQOf8EfFPq8Btv1mDQZOUWeDRqHy80VcFZlKejIzT20rSa7HdkmN9VS6L4vu475sliT0zIsjHwjXY6b4K/BJ8lTp2HojNprJ0S3qWg=;20:F0wTVpCVBrgiRIXkUOOyyiWwyoJ3pbwqY32OUN5QpMNYKsSCSGKFEdZ6Lj5EYnCPRznE8Yxu4kcyjj5ykjAQ7Q== X-OriginatorOrg: freescale.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 29 Sep 2015 02:15:42.9871 (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.168.50];Helo=[tx30smr01.am.freescale.net] X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: BN3PR03MB1479 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. arch/powerpc/include/asm/cpm.h | 1 + arch/powerpc/platforms/Kconfig | 1 + arch/powerpc/sysdev/cpm_common.c | 129 +++++++++++++++++++++++++++------------ 3 files changed, 93 insertions(+), 38 deletions(-) diff --git a/arch/powerpc/include/asm/cpm.h b/arch/powerpc/include/asm/cpm.h index 4398a6c..0e1ac3f 100644 --- a/arch/powerpc/include/asm/cpm.h +++ b/arch/powerpc/include/asm/cpm.h @@ -161,6 +161,7 @@ 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, 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..01f98a2 100644 --- a/arch/powerpc/platforms/Kconfig +++ b/arch/powerpc/platforms/Kconfig @@ -276,6 +276,7 @@ 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 diff --git a/arch/powerpc/sysdev/cpm_common.c b/arch/powerpc/sysdev/cpm_common.c index 4f78695..ff47072 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,52 @@ 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; + 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; + } - rh_attach_region(&cpm_muram_info, r.start - muram_pbase, - resource_size(&r)); } 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 @@ -141,59 +151,102 @@ out: */ unsigned long cpm_muram_alloc(unsigned long size, unsigned long align) { - unsigned long start; unsigned long flags; - + unsigned long start; + static 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"); - memset(cpm_muram_addr(start), 0, size); + muram_pool_data.align = align; + gen_pool_set_algo(muram_pool, gen_pool_first_fit_align, + &muram_pool_data); + start = cpm_muram_alloc_common(size, &muram_pool_data); spin_unlock_irqrestore(&cpm_muram_lock, flags); - return start; } EXPORT_SYMBOL(cpm_muram_alloc); + /** * cpm_muram_free - free a chunk of multi-user ram * @offset: The beginning of the chunk as returned by 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 + * @size: number of bytes to allocate + * @offset: offset of allocation start address * - * This function returns "start" on success, -ENOMEM on failure. - * Use cpm_dpram_addr() to get the virtual address of the area. - * Use cpm_muram_free() to free the allocation. + * This function returns an offset into the muram area. */ unsigned long cpm_muram_alloc_fixed(unsigned long offset, unsigned long size) { + unsigned long start; unsigned long flags; + static 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; + gen_pool_set_algo(muram_pool, gen_pool_fixed_alloc, + &muram_pool_data_fixed); + start = cpm_muram_alloc_common(size, &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 + * @data: data for genalloc's algorithm. + * + * This function returns an offset into the muram area. + */ +unsigned long cpm_muram_alloc_common(unsigned long size, void *data) +{ + struct muram_block *entry; + unsigned long start; + + start = gen_pool_alloc_data(muram_pool, size, data); + if (!start) + goto out2; + start = start - GENPOOL_OFFSET; + memset(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 -- 2.1.0.27.g96db324