From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751782AbbIQU2h (ORCPT ); Thu, 17 Sep 2015 16:28:37 -0400 Received: from mail-bn1on0148.outbound.protection.outlook.com ([157.56.110.148]:38304 "EHLO na01-bn1-obe.outbound.protection.outlook.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1750974AbbIQU2f (ORCPT ); Thu, 17 Sep 2015 16:28:35 -0400 Authentication-Results: spf=none (sender IP is ) smtp.mailfrom=scottwood@freescale.com; Message-ID: <1442521702.19102.75.camel@freescale.com> Subject: Re: [PATCH v9 3/5] qe_common: add qe_muram_ functions to manage muram From: Scott Wood To: Zhao Qiang CC: , , , , , , Date: Thu, 17 Sep 2015 15:28:22 -0500 In-Reply-To: <1442194700-6194-3-git-send-email-qiang.zhao@freescale.com> References: <1442194700-6194-1-git-send-email-qiang.zhao@freescale.com> <1442194700-6194-3-git-send-email-qiang.zhao@freescale.com> Content-Type: text/plain; charset="UTF-8" X-Mailer: Evolution 3.16.0-fta1 MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Originating-IP: [2601:448:8100:f9f:485b:31af:11cc:cd8b] X-ClientProxiedBy: BLUPR14CA0059.namprd14.prod.outlook.com (25.163.209.155) To BY1PR03MB1482.namprd03.prod.outlook.com (25.162.210.140) X-Microsoft-Exchange-Diagnostics: 1;BY1PR03MB1482;2:fzHaBI2vGvyrgTRXM8v6J6RDhvuuqMfIomRQkaC4WqOKeOz7Z0mhOLR6E1IhvJt5sPnNgb+3HYI0L2S4knFtLn4xrKj7u6doaXMu3e6QxSk0CYxHv6YLyTCjbFwZN2FOrhXu482X0aDMdB4OoGCSBKPX/5NY/MlYuEf1e3bhJnE=;3:WeHwx89UULB1MPVoG5AGV/3kyzyuvinuPUTxfo1QMSd9q+OuIP4JEtHcRdBaw2LZu5O5VPWqM/AiFFZJ+lVe0yyRaN/gcBM+lc02iom+8TsNQSnYDMAhh0ihxnI9pJG2ekPa6+bCNa1hk7ZeYbEfHQ==;25:xQG96tRXp/JFbJi+NB/z3sOoUvprxAicaWMsyszSpbywAHt+I1O2tk5vQlnEaPISkAsdAsVd4ixoeaBXVpYe7UOLwVw+ticuqwLajrUP2e3NsLyT2i38Y1qU1gPOsa2fFtL5nqN4j2C40fJQyQqGT7GV6b/LTO9I+zboahBKDFTLmbKgmRIZhLNcBeKdD7ZsY4P+I2FXiydRh7NTFVVB3BPypFmfwKThmBPi1tG1XXfGQ210kUik6rXRBPd4GcfeTMXVpEv6QagVwMya4k/PJw== X-Microsoft-Antispam: UriScan:;BCL:0;PCL:0;RULEID:;SRVR:BY1PR03MB1482; X-Microsoft-Exchange-Diagnostics: 1;BY1PR03MB1482;20:cjxuRyhs+gz794iJx+ZP0+ZMjSyrl8hcVCLMCFROAhStZsHBW1QEk1ye69y9MIpXZdXiJaESV4s3OVp/+oMsio/YaeW/7rEU9FZhW/5ysiVSsWW99UzYRkZuipuZPeuP3vLfZD1VxhJQfsoN83oepResNGk+tf2Rbay2yrmXHLerTn7V3aoJ1YIig2uYN1tKDwey50IXjGJvL47yEpa9YBLkEisQW9oL2ZhT5ud2iVFZeX/8VZGh8XMtMO7cyIG/PW0IoBs2/qeZNjPIs0tqTj3uvXxB/EIxamCc9//3q/IFpJYrgG1+Qy9XbgWTbVI7TSe5rEzP8/4oByb8LSufdSud+n0vOPhf3eBNtVcodd6QMyDP/HyHVQugYj8Cm8SRq3BSEJrsox7V+42IZaFjidIhO6yjBGgWJkScvhqJZoqJ3Cizn3u+uWnXFIR+J9/LtcuckXTzKY30pGJaAvujLdkO9jz1x3MigXamz0a3FDtP3bmjhB9XeBd4ApSQkG6o;4:po93OTJlUs/3Ly8HoqkNsjMWPWKtOW9ayXYrr2Jlgu89KiGYoV/tUPi8Ipk7BFN5CnFfSzz1/E0YlVWJEMdzHE06Yr7L4nDyjfUyHCc4PMLZeX6W7RODb5TfUDCRyHLtE2lIhcAE0naUqHxxB6dD92Q08bK9Av6nhrbekiMDbtEv1w+2PwSjJ7ug+HtHMtyPZc1czxcaAmnZiqoGit0RLPF2iHx8+Wpw50g94sGwQqjPrqfX3em9koBZOxNyJ4M/e/CPKUqMOTGWy/5Z+fZcfh/84s8phxXD69jISsKFFPQbTdEyo963y89Xa74PZh6wU7EJnPvxxV/hDIdYGAt4XJNmTqNfY3s7DeWVMrwEY6o= X-Microsoft-Antispam-PRVS: X-Exchange-Antispam-Report-Test: UriScan:; X-Exchange-Antispam-Report-CFA-Test: BCL:0;PCL:0;RULEID:(601004)(5005006)(8121501046)(520078)(520075)(3002001);SRVR:BY1PR03MB1482;BCL:0;PCL:0;RULEID:;SRVR:BY1PR03MB1482; X-Forefront-PRVS: 07025866F6 X-Forefront-Antispam-Report: SFV:NSPM;SFS:(10019020)(6009001)(199003)(24454002)(189002)(377424004)(77096005)(97736004)(50986999)(2950100001)(5820100001)(40100003)(23676002)(103116003)(47776003)(50226001)(77156002)(86362001)(50466002)(4001450100002)(5001860100001)(62966003)(33646002)(106356001)(5001960100002)(110136002)(189998001)(42186005)(19580405001)(92566002)(87976001)(19580395003)(105586002)(122386002)(76176999)(68736005)(101416001)(5001830100001)(64706001)(5007970100001)(46102003)(5004730100002)(36756003)(4001540100001)(81156007)(99106002)(2004002)(3826002)(5001840100002);DIR:OUT;SFP:1102;SCL:1;SRVR:BY1PR03MB1482;H:[IPv6:2601:448:8100:f9f:485b:31af:11cc:cd8b];FPR:;SPF:None;PTR:InfoNoRecords;A:1;MX:1;LANG:en; X-Microsoft-Exchange-Diagnostics: =?utf-8?B?MTtCWTFQUjAzTUIxNDgyOzIzOjdFRE9FK1R0TXliY0QyaXhab0VrelZWQTlS?= =?utf-8?B?eml2c2pUbVVJaXlQcUk0T3B5dWIwREpRdHE4NlBONXdOZUpqcjJhdzVuN2ps?= =?utf-8?B?eWlYWHl4cDduOWlGbFRjMmZYRTdhd0NDYUUxQXd5VGVxOEVONWpnb1EwYjZl?= =?utf-8?B?SGFKQjZyWlBrcVgvUzdPNWxkUFUwUUNydm9HMEhhZnQ1cW1KcWtxcGNFaGRt?= =?utf-8?B?dHZETU9lRnV1Tko2VUtjZFZNNVVET2w0TVZ4MEJ3Q29YdmN1QUxWaXBRdEFY?= =?utf-8?B?M0Y2ZDRpdzVGczdTL0JJclRxb3BaNW9OOWJuSDQwUW83QTNveUhYV3djM0Rl?= =?utf-8?B?OCtWYUxzNVRqR1RkYStFTWNBN2MwQVZab2R0OElpR05STzBPVXIwa2dENU9J?= =?utf-8?B?NkI4d3VtWG1ndkZiciszR21TMmxwYlo4bWhLV0QrOHhHSFNRS2dHQURNOTRZ?= =?utf-8?B?MmY5bW8vZ3RHazRlOW1qOEk0VXhGbGpjWGpYTmZVSVc0V2I5bUJQVGhlUG9B?= =?utf-8?B?UW1GczlLTm4rOXBmSjl4WHdZQlhZQ0dqdTJwa1RXU3hXWTB6dGo2MFNPWkl0?= =?utf-8?B?WkdYOGhvNldzRzM4c0wyMGt3cjFOcXpDL2ZNMFIwUUoxbXQzMExKOGhheTQy?= =?utf-8?B?WWRSckZxV0NReUpVVEJNZ0Jtc2xBeGRReEM3MEx6bFRmNHhnL2hYZGdFR0JE?= =?utf-8?B?V2VyYnQ0YW5GL0JNTzZRNXBLNUdYd21MdEJ2KzNhbkdiZ09YZ0YvM0J1Ymp3?= =?utf-8?B?ajNkVmcrd04xU3NRcXVuWlpwbWJuMGYwS25UbWsxNzZTYmV0cTFyZ1ZGM1hZ?= =?utf-8?B?SkgwRXpGbENBa2FwNXFORjllT2JTWVJrRHBhTVpJMUtWeUV0YU9UOEJOaUFU?= =?utf-8?B?alh6TXVia3MwMEZzM2ppOGt3YzR1RDVQcW44Szd4NzR1YTh1eVV4UzZxK3Qr?= =?utf-8?B?QnJkckEwTk8wTFB4dEY2a1hERTJIM1dXbjlKOVJpeEpaNTRBa0hkODJ6WE04?= =?utf-8?B?cFdGcmdFQkNZU1hLOUhocXB3SllLcWR0YnJxdEMrN285Tm1aaU90ejJlY1Zn?= =?utf-8?B?WEhrc1RJZlFiSXBVT3lqN0Q4M2ZOSGMwTEl0YWwzalY1UEJOcTdjZW1LUWVk?= =?utf-8?B?MUZQcG0yK0MzUEgxN2JvYllCbktaaGZ5WU5VOVVReWZGamltYlZwNkIwWTNq?= =?utf-8?B?Wk4xdHJabWNTakVFV3pTbm5yakgySHJHUDVoclU2d25IL0xCaUdUcmZaeUxv?= =?utf-8?B?b1J2SXliRGhIdzJ3b3RVSk5tOXBFNzhXcmVNL1BrQmY0M0NuZERGRkI1VmMx?= =?utf-8?B?NXBKNUR5SlRJeTdYak1BRm16b1o3ODlaQXVZNUZhMXhraVBSVjlrZUF5Vjdi?= =?utf-8?B?TkJSbHh5SVlRcHpnaVVWYXhSY2RPK2VhR0poVmtYa3l0WXR5RDFZdzFoWEFy?= =?utf-8?B?ZTA1LzRJeTBVc2dmQ3g4Y3QwSU85NlVpRUJEM2lWM0V6eGlmb0pxK3JnbE11?= =?utf-8?B?MXNIYmxLL2tQSU9VMUVTcWx4aVIyRisxM3kvcFkzWFdWNldjZGhRdG9FMEps?= =?utf-8?B?WlluZi8zOVlCd3pJelVsVFZvRnhzTER1MzVKZFhlM2NtYWVrU3dLTVRuUUdX?= =?utf-8?B?KzI4aUVwNjJ5YzVBUnlRUEdyUm1zQ2RBNDNMdTI3UGJ5Vk9oWG01d2pTVkNT?= =?utf-8?B?djVSMGtic2h6M1lhMnNQazNNWlZWVTVKb0M4M1FsN1ZpNUtmL3RiQ1J5Y283?= =?utf-8?B?MFB4a01iYTNTMFZHd2xmUT09?= X-Microsoft-Exchange-Diagnostics: 1;BY1PR03MB1482;5:+6doRMSDpIesuql08/P9ZeayWQnNwyz5WcnGQMSsL/82azGfp/pnatTGk82Ow1Le9a24wN/ECRwGFdZEBB7fVX8umTjsPV9qr3cxFjC93qEe+Jl4YOWikzntFhjFm4lRCq28NSyrXc47vBdWGUEYCA==;24:2pEMSf635P+CLAenM9QkSeoCX75LHlt7Em2j1eQzz5wd9bW2dbNi09w6pbbmVpVQmxLiFMcbcIqm4eV7DeHg5ncfsNoqA5MeaLQPW7YVy7s=;20:oZJcmCU6xQ+mzv1ISpcXXnx+9UKBOWqOFByygpDpXrJ/cehdtyfZu2E0gKnDZyjVt8umBp2ug8Bjrcu32fuN8g== X-OriginatorOrg: freescale.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 17 Sep 2015 20:28:30.3049 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-Transport-CrossTenantHeadersStamped: BY1PR03MB1482 Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On Mon, 2015-09-14 at 09:38 +0800, Zhao Qiang wrote: > diff --git a/arch/powerpc/sysdev/qe_lib/qe_common.c > b/arch/powerpc/sysdev/qe_lib/qe_common.c > new file mode 100644 > index 0000000..1213458 > --- /dev/null > +++ b/arch/powerpc/sysdev/qe_lib/qe_common.c > @@ -0,0 +1,242 @@ > +/* > + * Freescale QE common code > + * > + * Author: Zhao Qiang > + * > + * Copyright 2015 Freescale Semiconductor, Inc. > + * > + * This program is free software; you can redistribute it and/or modify > + * it under the terms of the GNU General Public License as published by > + * the Free Software Foundation; either version 2 of the License, or > + * (at your option) any later version. > + */ > + > +#include > +#include > +#include > +#include > +#include > +#include > +#include > +#include > +#include > + > +#include > +#include > + > +static struct gen_pool *muram_pool; > +static struct genpool_data_align muram_pool_data; > +static struct genpool_data_fixed muram_pool_data_fixed; > +static spinlock_t qe_muram_lock; > +static u8 __iomem *muram_vbase; > +static phys_addr_t muram_pbase; > + > +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 > + > +int qe_muram_init(void) > +{ > + struct device_node *np; > + struct resource r; > + u32 zero[OF_MAX_ADDR_CELLS] = {}; > + resource_size_t max = 0; > + int i = 0; > + int ret = 0; > + > + if (muram_pbase) > + return 0; > + > + np = of_find_compatible_node(NULL, NULL, "fsl,qe-muram-data"); > + if (!np) { > + /* try legacy bindings */ > + np = of_find_node_by_name(NULL, "data-only"); > + if (!np) { > + pr_err("Cannot find CPM muram data node"); > + ret = -ENODEV; > + goto out; > + } > + } > + > + muram_pool = gen_pool_create(1, -1); > + muram_pbase = of_translate_address(np, zero); > + if (muram_pbase == (phys_addr_t)OF_BAD_ADDR) { > + pr_err("Cannot translate zero through CPM muram node"); > + ret = -ENODEV; > + goto err; > + } > + > + 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 err; > + } > + > + } > + > + muram_vbase = ioremap(muram_pbase, max - muram_pbase + 1); > + if (!muram_vbase) { > + pr_err("Cannot map QE muram"); > + ret = -ENOMEM; > + goto err; > + } > + goto out; > +err: > + gen_pool_destroy(muram_pool); > +out: > + of_node_put(np); > + return ret; > +} > + > +/* > + * qe_muram_alloc - allocate the requested size worth of multi-user ram > + * @size: number of bytes to allocate > + * @align: requested alignment, in bytes > + * > + * This function returns an offset into the muram area. > + */ > +unsigned long qe_muram_alloc(unsigned long size, unsigned long align) > +{ > + unsigned long start; > + unsigned long flags; > + struct muram_block *entry; > + > + spin_lock_irqsave(&qe_muram_lock, flags); > + muram_pool_data.align = align; > + gen_pool_set_algo(muram_pool, gen_pool_first_fit_align, > + &muram_pool_data); > + start = gen_pool_alloc(muram_pool, size); > + if (!start) > + goto out2; > + start = start - GENPOOL_OFFSET; > + memset(qe_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); > + spin_unlock_irqrestore(&qe_muram_lock, flags); > + > + return start; > +out1: > + gen_pool_free(muram_pool, start, size); > +out2: > + spin_unlock_irqrestore(&qe_muram_lock, flags); > + return (unsigned long) -ENOMEM; > +} > +EXPORT_SYMBOL(qe_muram_alloc); > + > +/* > + * qe_muram_alloc_fixed - reserve a specific region of multi-user ram > + * @size: number of bytes to allocate > + * @offset: offset of allocation start address > + * > + * This function returns an offset into the muram area. > + */ > +unsigned long qe_muram_alloc_fixed(unsigned long offset, unsigned long > size) > +{ > + > + unsigned long start; > + unsigned long flags; > + unsigned long size_alloc = size; > + struct muram_block *entry; > + int end_bit; > + int order = muram_pool -> min_alloc_order; > + > + spin_lock_irqsave(&qe_muram_lock, flags); > + end_bit = (offset >> order) + ((size + (1UL << order) - 1) >> order); > + if ((offset + size) > (end_bit << order)) > + size_alloc = size + (1UL << order); > + > + muram_pool_data_fixed.offset = offset + GENPOOL_OFFSET; > + gen_pool_set_algo(muram_pool, gen_pool_fixed_fit, > + &muram_pool_data_fixed); > + start = gen_pool_alloc(muram_pool, size_alloc); > + if (!start) > + goto out2; > + start = start - GENPOOL_OFFSET; > + memset(qe_muram_addr(start), 0, size_alloc); > + entry = kmalloc(sizeof(*entry), GFP_KERNEL); > + if (!entry) > + goto out1; > + entry->start = start; > + entry->size = size_alloc; > + list_add(&entry->head, &muram_block_list); > + spin_unlock_irqrestore(&qe_muram_lock, flags); > + > + return start; > +out1: > + gen_pool_free(muram_pool, start, size_alloc); > +out2: > + spin_unlock_irqrestore(&qe_muram_lock, flags); > + return (unsigned long) -ENOMEM; > + > + > +} > +EXPORT_SYMBOL(qe_muram_alloc_fixed); > + > +/** > + * qe_muram_free - free a chunk of multi-user ram > + * @offset: The beginning of the chunk as returned by qe_muram_alloc(). > + */ > +int qe_muram_free(unsigned long offset) > +{ > + unsigned long flags; > + int size; > + struct muram_block *tmp; > + > + size = 0; > + spin_lock_irqsave(&qe_muram_lock, flags); > + 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(&qe_muram_lock, flags); > + > + return size; > +} > +EXPORT_SYMBOL(qe_muram_free); > + > +/** > + * qe_muram_addr - turn a muram offset into a virtual address > + * @offset: muram offset to convert > + */ > +void __iomem *qe_muram_addr(unsigned long offset) > +{ > + return muram_vbase + offset; > +} > +EXPORT_SYMBOL(qe_muram_addr); > + > +unsigned long qe_muram_offset(void __iomem *addr) > +{ > + return addr - (void __iomem *)muram_vbase; > +} > +EXPORT_SYMBOL(qe_muram_offset); > + > +/** > + * qe_muram_dma - turn a muram virtual address into a DMA address > + * @offset: virtual address from qe_muram_addr() to convert > + */ > +dma_addr_t qe_muram_dma(void __iomem *addr) > +{ > + return muram_pbase + ((u8 __iomem *)addr - muram_vbase); > +} > +EXPORT_SYMBOL(qe_muram_dma); Why are you adding new functions rather than replacing the implementation of the old ones? Again, I don't want to see a big addition in one place and a big deletion elsewhere. I want to see the actual code changes as a diff. Any moving around of code must be a separate patch from making changes to it that are significant enough that git format-patch doesn't detect it as a move. -Scott