From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752742AbbJNHW4 (ORCPT ); Wed, 14 Oct 2015 03:22:56 -0400 Received: from mail-bl2on0148.outbound.protection.outlook.com ([65.55.169.148]:47686 "EHLO na01-bl2-obe.outbound.protection.outlook.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1752527AbbJNHWu (ORCPT ); Wed, 14 Oct 2015 03:22:50 -0400 Authentication-Results: spf=fail (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 v12 3/6] CPM/QE: use genalloc to manage CPM/QE muram Date: Wed, 14 Oct 2015 15:16:05 +0800 Message-ID: <1444806968-4627-3-git-send-email-qiang.zhao@freescale.com> X-Mailer: git-send-email 2.1.0.27.g96db324 In-Reply-To: <1444806968-4627-1-git-send-email-qiang.zhao@freescale.com> References: <1444806968-4627-1-git-send-email-qiang.zhao@freescale.com> X-EOPAttributedMessage: 0 X-Microsoft-Exchange-Diagnostics: 1;BY2FFO11FD050;1:TNhaW3Ye3WJx9TgFJHWxsTebsYfb9yYITRVQkTFCd4weoiw6xu+Hx74pws+gbS7aC5E/+C0Zx8kKdfAJsdZJUPUmIYjm7tGl5NXGgsqenQVU5uZBy6rniVls3ptU5FUaBuWtvJZL5oq4MliESMDJGiyJ70Vw6NaSXJWVw69bswe8S+PFh/kS9P6T45yC1wvsQ8R9qlLBwjkw6T+KvDbsXIAbtWxTDqPFig/TNYUAVfYLdMQ6skHLXNwnE4APPoHNDndwYNDe+fRwjak5NcWRqGMupd2w7NhTt7wmUgzUUnf25yUwaTHalUfzRW4a2QrO+afEMxC+7fgWjthNyXFDdYB9nCHqTH9ZBO0CJP8EswtV3lqzf/rERhsRqtxUZ/fek1cc2eBffQoDRimIHNx/iQ== X-Forefront-Antispam-Report: CIP:192.88.158.2;CTRY:US;IPV:NLI;EFV:NLI;SFV:NSPM;SFS:(10019020)(6009001)(2980300002)(1109001)(1110001)(339900001)(199003)(189002)(107886002)(87936001)(48376002)(5001960100002)(97736004)(106466001)(110136002)(105606002)(81156007)(50466002)(2371004)(69596002)(33646002)(4001450100002)(5003940100001)(19580395003)(189998001)(104016004)(6806005)(50226001)(11100500001)(36756003)(46102003)(77096005)(85426001)(19580405001)(5008740100001)(5890100001)(2351001)(76176999)(229853001)(86362001)(50986999)(2950100001)(47776003)(92566002)(5007970100001)(64706001)(2004002)(4001430100001);DIR:OUT;SFP:1102;SCL:1;SRVR:CY1PR0301MB1547;H:az84smr01.freescale.net;FPR:;SPF:Fail;PTR:InfoDomainNonexistent;A:1;MX:1;LANG:en; MIME-Version: 1.0 Content-Type: text/plain X-Microsoft-Exchange-Diagnostics: 1;CY1PR0301MB1547;2:/psLhBzx0/CiOzocqNtOtRE/3QgrdEM8z1TOnt0kWW4Z12OZ2zfRCH5Q9A5aIPFxxzbWSm0uS+JdNw+z33Y/NFVXEP/BQmdFusB7kmF/lKoC0nOwp7Y0tTBWriIUVTM+nw5WS8vPqmCroOSv1MZZsRUAU1cHPM1pX4hEEHLVCxE=;3:mzjXTz1n5Q+l3HgMtyBzSYSQvIbY9fc9ZfmIi0TStlcaTPpA5d5WWU8l9cgWs/vLXzoD32JbXxToornfQH+KysxQHbvlaqM75eMTpm3FqNjWolzaI1s4MyhGM7/SsRy7gkgszns/9XX0wpkm7LO6ukOvkUU6JmI0Sgw/guFKyi9gp7hEwnI5pYS6Sc+WNSGKuA1mM6Oa062cczg+hSMQq1rz3mgyhdIcph9xH1UUDcg=;25:ka40GGeTJZSoRHubgdlxeFNOjSNJ2Bwrt3Ztan3zw9qeWb8fTQq0KJT+WBqGAhApxPsLVkZ/acADnNq1hNkiXL3zY6nCxEeDfcMeH+wnTH/uxNSZPnZ/QT7SMFvFo7q4QUH17FA/CtsEqvtKV8/h0mOPbQMho0wfxQ/8CSxy4KgFlZNaLT2urwsOcmd8Gj0CcM5X8XsJSolsgTN/7BEgrHsfT+XQoND5KdSo1iaw17BdVSkBzGqZhaPSGwezgkjlTbYxrx77JU751oXSv+498A== X-Microsoft-Antispam: UriScan:;BCL:0;PCL:0;RULEID:;SRVR:CY1PR0301MB1547; X-Microsoft-Exchange-Diagnostics: 1;CY1PR0301MB1547;20:3SCq9byBM7ATfceixE+l65zgn9tFclqaysdst2+WPd1sqhbgcqF7EzuuvhPHCrmCsBOqccrPhW2uRl0MQ+LRvQEFHAr4aM8+hSCberrdZKZmT08EaOCTAXHhYP8ISi4++q+IPWbjiUTqG+CmMXjHIxsoN9XYmnaGcItJQozUSe7139Z6jr9o/XHRgg4QFPPuQN7j7Kkg9R+jUVxgIqB5EyM0kQcuu0ZXDCZ7SRrjXgt/7b4JfiYGzKRZwrYNUuzMh8OVWgSEj0GKcD5Smlx6WpLRIWp/VlLKX8ePAwjaAxf7YZVXTrUY0OoKFBnWfUXCEJRVLATBLTvuxoRDFeFwCclAXwqnSfhFqntdRjXOK1M=;4:URi1UCJp1ZvjLIaokrr9vHSJN2nwF5xepVFWZvDdvbOfbPExqrJ0h2p5QlxZ9fOjckwcVEBeU9yYA/RZqUd4bSFPWnCVgjcy2e+vmDZIAzE+31nsZ9zL+Z9+nVCnBORgK2AeQcwmusv0LJirMDKsTG/UO/eoHgTlPp3qLLJeFUbE5tqxS6R31a0ZEks6sMN64kX3nrzOACD0a/CRZZ+l16k9hMclIuxHYf3cZTezlE/KgyMscx40/s9PmyQumjJSWSI71JyDdV6bzFTPNVkP2kP+lOcje4V/kB0P2eZcCUQLTsCDVcnEzV14KKP+Cc1KjvBj5R/mDg6YJgk30f8CJojCHGIkJR+W6MdSY0FF68o= 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)(3002001);SRVR:CY1PR0301MB1547;BCL:0;PCL:0;RULEID:;SRVR:CY1PR0301MB1547; X-Forefront-PRVS: 0729050452 X-Microsoft-Exchange-Diagnostics: =?us-ascii?Q?1;CY1PR0301MB1547;23:0GzKJiJXE2/Q0uta9ZZtxvNWW9VOWdARH1084mj?= =?us-ascii?Q?lTtrQfFSn8Ch/WyBQq7Yi13PuMSi0/3ezzT46HvhQakiKHF9OuRYFBDad6Kz?= =?us-ascii?Q?5HSxDtZ+Y5iw6Xtt+72a6/3s1cM2etdths96EsX5HV7MUpvzugY7aw5U99kW?= =?us-ascii?Q?3CK1+Sz8pp+WjaMzva2ZX6tuuPdTPE9M4qJnTSr4mavXYrV2sXYPUUjDp8O6?= =?us-ascii?Q?LXIeCRrouDmZYNwEVld2UOknFyzER1Cc1REZf+U7WfGDau4dvxBD31InD/VW?= =?us-ascii?Q?kLIc7fkCr2B8cjPOmJmcgEzS+r6OSxGpMXQpB5x6ZCbpWWf2yCMljxAGICK0?= =?us-ascii?Q?rKEC9hNuLAtjJZBkWM2h/76ol9RcjcuRETlTqYHLz1exCEhnJ5STaux3nstw?= =?us-ascii?Q?cHOmo9gi8UNuMTCpRWuR3F4Fn/GpDTCPAwuc1Wt9Z7uct6PE4JD+zN52c+vw?= =?us-ascii?Q?Ex7672/UYt1ZNh3wnjJ+PtKff0qmHimtUNkz3OmN3xKt1nPR4bUXati3e56Z?= =?us-ascii?Q?6xpRQkfbQhYnhFr6zP8SzySGnC1o/bEsdj8bo3cVoSV5vsssd1WKwHi2DFwu?= =?us-ascii?Q?McLdqDBqSto0awMSIQ12jHs+L0hQL8I67VDR0aBGgYOcEF5IIhp+yRZOWi3u?= =?us-ascii?Q?5RZXFBv0aSsai+Z4ZGO9X2yqqu4F8jbU/LFdXfHyjfzsX113RTipcg0imkoz?= =?us-ascii?Q?+Q3E/H8nBj2yPGlAE7NG8ft2lGjD+RnH6OghuPEwLA6F0uJkwfMe30a6OjUk?= =?us-ascii?Q?v39W/gAsO6KO9QNq/bElWhW1ikPQOBMkpdzMM060mWjhRn+NjFjt5Fzqr8+w?= =?us-ascii?Q?Uz8GOmgZE1yODOcHnKkMuqYm7jlC/rYf72xxtza8uLWSPW3+oqfDQ09PymED?= =?us-ascii?Q?BaBEwMs+rQf/aMSLWSQ2RMNtbKEVf4Hw0HGEqX7o6F7Ok5dFWudec4wvZbuR?= =?us-ascii?Q?7WwBVLqcRPbFK+yOY8MQJoZw2g1etTFeqcGr0P/fvpn14CWZr7tC4R2XRuZz?= =?us-ascii?Q?HKUbmc2EJRjbkP09Lhnv25VL/OSJJPcEGstWC3l7NC+m+8XiWtYhK4ySeNDW?= =?us-ascii?Q?eXmrdTJwkhxsP6ku8fyyfGzDr3FaUb9Wy9tx8MJpBjcK1nAV6coNn73yI2uM?= =?us-ascii?Q?FvVvGGQuk+xBUCLMIafGrKJMWhoNQtvFtIIOTaUJTp/BRKxVDbiS8QG/ux8I?= =?us-ascii?Q?GqPerR5gToIPZ7VJD9UIYTPZtd+HkHXyBPU6xN5bBTekkv6Ia6jAJGQqRr85?= =?us-ascii?Q?GZN/SciU9I/yUPNKeTA8=3D?= X-Microsoft-Exchange-Diagnostics: 1;CY1PR0301MB1547;5:JGY/S3O5ofpqoLGRNZ9YfWDtEbbAY8jZY1i66qlL1++qSOYGDFzsmhgv06QRpmVJ7m17Dtaeto6TxXiEfWvlwjteXd3MDFfwbOmeMqv6Rbeo63r+vwnWMtqqRXWJ9qQtvNcdfp3FKa6DsU22FBmHxw==;24:kEtw8oWixPSY3RLhA7YQDgE5Ug/RPhxqKBAupDjrsbyp4Xn7jTEufaNoLkxwAXEE5SZ3SgfYl3ZTqdYlmWHTb27cX7DLHcg3+D5cHe/O+A8=;20:Yz1BgwVn71YGLotte8Dybr4nXfACLrMd3GIVEdLJHte0tXuvqmTbiLPI85fw+CF5PreyGLH/co0cVlvoRoJGug== X-OriginatorOrg: freescale.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 14 Oct 2015 07:22:47.3763 (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: CY1PR0301MB1547 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 arch/powerpc/include/asm/cpm.h | 1 + arch/powerpc/platforms/Kconfig | 2 +- arch/powerpc/sysdev/cpm_common.c | 129 +++++++++++++++++++++++++++------------ 3 files changed, 93 insertions(+), 39 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..01626be7 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 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