From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752431AbbIRCja (ORCPT ); Thu, 17 Sep 2015 22:39:30 -0400 Received: from mail-bn1on0144.outbound.protection.outlook.com ([157.56.110.144]:15168 "EHLO na01-bn1-obe.outbound.protection.outlook.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1751246AbbIRCj3 (ORCPT ); Thu, 17 Sep 2015 22:39:29 -0400 Authentication-Results: spf=none (sender IP is ) smtp.mailfrom=scottwood@freescale.com; Message-ID: <1442543958.19102.91.camel@freescale.com> Subject: Re: [PATCH v9 3/5] qe_common: add qe_muram_ functions to manage muram From: Scott Wood To: Zhao Qiang-B45475 CC: "linux-kernel@vger.kernel.org" , "linuxppc-dev@lists.ozlabs.org" , "lauraa@codeaurora.org" , Xie Xiaobo-R63061 , "benh@kernel.crashing.org" , Li Yang-Leo-R58472 , "paulus@samba.org" Date: Thu, 17 Sep 2015 21:39:18 -0500 In-Reply-To: References: <1442194700-6194-1-git-send-email-qiang.zhao@freescale.com> <1442194700-6194-3-git-send-email-qiang.zhao@freescale.com> <1442521702.19102.75.camel@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:2d70:bd3f:bb1b:9b2b] X-ClientProxiedBy: CY1PR0801CA0024.namprd08.prod.outlook.com (25.163.136.162) To BY1PR03MB1482.namprd03.prod.outlook.com (25.162.210.140) X-Microsoft-Exchange-Diagnostics: 1;BY1PR03MB1482;2:p7YigMCA1Zr6DA/9PSaXvRfKeBqdKzXmgS4pwvuEGFXP0t+c8ld7odFk+epC9Klp2amMczwuTh9+Yxfria1YmLhlJ6h/Q+/wyHCdlqPRrMnueknI/cf2VM2IuvanM8UT627aH1hxU4tXikEIZUuz0AzlmHPfZqhdUWsuvTHxsCc=;3:mJqJANvI6XhhNRNd5GlWB+eKXHxx7BUs7gis7gtAqnHImPCbWDKSpPt35M5w/24JprJJSwm0S+YD0uQJ4BwqQpFCFZWV9Z5ACiFyRN4EfQOkCgaBmttf0ReQ7RX801XAuJi9eLY8vvXDRjRPtOP+sA==;25:WS6uXc4zTP7q5AZ4Hq/cTTT90HzXuGXkMvc4WB4DaK5SuetapSibbhiivnpKrHrD9VTvCDzssUHttAaiDXQmSj5Yl330/JrA/mipEOlgoosCBKyKaw884uyCA54/bWUtO+DnLyhefFC5+q4jjp9MlfKADz5d0pTepC+cCC2qqoaRVpqkWCadFA1TUZ/iUVuvlNC5rfC0hSn7CfDzxom7aS3Tl1LVsgcqQWMYD5iH8pFuSY+Kz0G+bs7K6qVvKgsLUzTlcEkCWf1pyCu2G7oZ8w== X-Microsoft-Antispam: UriScan:;BCL:0;PCL:0;RULEID:;SRVR:BY1PR03MB1482; X-Microsoft-Exchange-Diagnostics: 1;BY1PR03MB1482;20:0ayNHOmvzigquYQ3irjIV5wJxI+aZcqILf1C6ZqQCVxqwoJSeOwYqO86XXUoGeJJo7u9dis3K8TBazOc25oHSLm/xGHYVf6TJ5Eel+/NTIj0ifMZmmaAqLIU4p+gdrrbe6FCm2UUlFtQfo3rjl0IkJddxJzk14H9ExSuMuoEQkNARCW6/9Ptgihio3m2ckHprAevfLS4H+TH1uX+ThwUewG0UQzTMHOV4vix6xpR2adi0P3yeIjLu1G/DpIoWhXYNcq/2iX5noGWQcJhwwhzA7L0YG2aaBY82nYvvEAxd95wMUVx58LQRG7YBjGMUJysT+WNbbaTsCkgUWIuxEAzVOCSl5AIcMsAQIkUgt0DaZdbkKJtW1zHeA67JE6lEKgYiJG3VIrL3i3v/pHodXlrHoUyK5Z0189EfIl0V9l7C9O5lKBrqFlfPBJPyVoaXiiHUrE7Dcyh5SfnTXDTHN59nxKGZmLFMpyZjEda8PHZxYOEre+p7fzWE4fw/pHah1hs;4:PO7hYbHUtW6TkGi4lqCWSHyhy5aoxUEtUx9rcl+2nQFn/RpcRemDAw9Atzk3rX73XQ6lU1c2tDYpEKxRse+lnAXaFCLSo59Jq8MztWKBOFE2IFN0FfmmsU8IxANSiEXFwLCgaCjHV5TLn6tNGotErNkS4QNprQJuyRhHgu/LQnNym+1KnAHU/e/J10Ne76VhOlnm4CAmnTfNOhyduT3j6+JdWyFKzN9Dc9MA9GEdZZ+NYFyC/SirYnkKKsWlNiT7ErTvufq2HWNayrpm4Z0wu+W6yjNeAm2Gbb/oq10VAQx9C/UnBleKS2AKk8ffj+S3kqX/hUqMPe++Hwyd8u3ZKBWVKAf6Zg0PMl0SO0daC2E= 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: 0703B549E4 X-Forefront-Antispam-Report: SFV:NSPM;SFS:(10019020)(6009001)(377424004)(189002)(377454003)(199003)(24454002)(13464003)(101416001)(68736005)(122386002)(76176999)(105586002)(5001830100001)(93886004)(4001540100001)(81156007)(5004730100002)(36756003)(5007970100001)(46102003)(64706001)(50466002)(2950100001)(4001450100002)(5001860100001)(86362001)(97736004)(103116003)(77096005)(47776003)(5820100001)(23676002)(50226001)(40100003)(77156002)(50986999)(62966003)(110136002)(5001960100002)(189998001)(42186005)(92566002)(19580395003)(19580405001)(87976001)(33646002)(106356001)(99106002)(2004002)(3826002)(5001840100002);DIR:OUT;SFP:1102;SCL:1;SRVR:BY1PR03MB1482;H:[IPv6:2601:448:8100:f9f:2d70:bd3f:bb1b:9b2b];FPR:;SPF:None;PTR:InfoNoRecords;MX:1;A:1;LANG:en; X-Microsoft-Exchange-Diagnostics: =?utf-8?B?MTtCWTFQUjAzTUIxNDgyOzIzOkIzUVBKUzIwaXQ3WGVPRTB3UWg4emdPUHJL?= =?utf-8?B?MVZXd2U1SFA0MysxWmV2NTdSQTA2OE9LNjJELzBJdGtRcWtQYW0zZ3d0SXFp?= =?utf-8?B?UVk2bXpuMXFpUFJJWjUzbEJNNThodzJxTHFVbXBCYjVDWlA2d0NVUUNoVVdk?= =?utf-8?B?WHpDYmRNOUpra0lvMHF0dnNHOVJWTDNaV0xscFgvVWtNcHhuUDJiL2dYWDlQ?= =?utf-8?B?NWFQZTRTQytYUzhBeEN4ZE4yVnVxVWdXVithRGhObVZXWStyNlh2NlQ4RDZU?= =?utf-8?B?N3lPN3llaE5UOURQSWVDaHBlYWV2ZnZNZ2lKSU9KbUtIeTZ6M3JQRlpJZjhP?= =?utf-8?B?L1IrZFFXRFNGSUVYd3NYTEZjWEk3dXFOSzRmQVdHZ1RjbVJxa0FxdkJHdm0x?= =?utf-8?B?R3ZjS1J6ZmljWERoNEI0dlUxcXRYakJBVUVpL29UNlRPaEVRSlJjQkxVb3pI?= =?utf-8?B?aGhGZDFOQy9JcXJLNENjUjdVU2pBZkc4TjFpcHVLV0QvcFhmL3NmM09Dek1l?= =?utf-8?B?K2NPdEd5ZlZDemVwWjA4R1lORWdSTGlSMVppbGUwNmNEWHQ3UXdQSlhZV2lT?= =?utf-8?B?dWNJa0g5dGdrdEREdlZvanNIQnBOeUdqczR5c0hCeHlFUUNjaTZHRUp0VTFk?= =?utf-8?B?SWZPZmdLZXdkR0ZjemVOUi9LLy90eDljMDQ0VjhFSldKMVlSTWtOVUN4b0RZ?= =?utf-8?B?TzlFcjZ3c0V0cjFhUW5JOTdZVVhnZDcweTNLQ3ZORWNyVVpCUUlNdEk1VEpP?= =?utf-8?B?OGF4MGVPbVp2YmtWK0RtR2dmSS9CZUlmYlQ2UVZoVGoxK1ViRm5LdEtjbFNT?= =?utf-8?B?elBvSTRFMmw1T2ZJYTdVanlVZWRtR2ljemZmbERFS1BTRXJrUVRNaExJWkUv?= =?utf-8?B?TkF5cERVME9MOUllT1JRMXBCcXY0Vm9WQ0dqTzlMQ3FMR05NWEtGb2V0ZkJw?= =?utf-8?B?cEpvVUlYMkZqdmY0WU5Hcm9pRlFGOVhVTDJrWUxZN0lUNm10dmNCZXV1NjNI?= =?utf-8?B?akNsenJGMU5ObGJiYkhZQ1hOclNWNGthcmo0TWUwQ0E0Y1A3a2FJMCtmUTNs?= =?utf-8?B?NkNkZXNrdzFXdnZ4OVRGemJUUktEalhzVmpXWkNQL2NodjRkUm50eHFoejVR?= =?utf-8?B?cS8xcXo2TlVDUUZpN0RYbENMOUM1SDFVTkN4QTZiUTFIZER2cmt1dStSM3lP?= =?utf-8?B?SFQzcHdrQkxJRVRsdENwcHhVdGZpRVNPYXNIN1hZaFl2RlQ1QjU1dkZHdk11?= =?utf-8?B?VXlhaXJwd1pNekY5Y0ZyVjNmN1NHM3Jhb01ORnRMVkM4Y20rSFpLVWZQQmlo?= =?utf-8?B?VFl1SmtlY1lVdXcvN0VYWVJaMXNBNTVMeFdJckltOEE5c3F1aW1LS2pYRDJq?= =?utf-8?B?K3BlcGZRQUcyZHd4TmdyN1JPOGVGRzg3MDJiY1NHRnZSU1BUUzhUSnpoaEtN?= =?utf-8?B?ZHpHdmhUbHB1QkJ2MVd6NFpxQ2VvU2UydXQweXNFY01wSXU4dUdxRjRFc2ZO?= =?utf-8?B?b1VqdFpjeDZZZ1pia1ZTU3NjU29WOTVpMlVoRXRKUTBsQjZ6NG5PcE9KM2lZ?= =?utf-8?B?bWErZk4yRllDRTNnWEI1NE41d2ZJVzBBRmdaWUNhcll0WHU0SHR4bjdDSEdK?= =?utf-8?B?Vll4Q0Rqc05YaEQ0aXNKaitnQlphdFhEdFV3dHRmaW9YRzlKT3VxcU1NTlZV?= =?utf-8?B?YnJaeUdmVWtWbFArN1JGYUhqdUwwYTNlN1JUb1MyM2VwL0sxa1NmVFJLOTBq?= =?utf-8?B?NGJVZGkzMldEMENPTDVLanVia0tjdndKRTdWZ042eXlJZ3NDUitJeHRtNGpl?= =?utf-8?B?Vm5nczBocnlsZVhsbE5raUhpZkh3VHp3Y1I2VWRzZHdwa3c9PQ==?= X-Microsoft-Exchange-Diagnostics: 1;BY1PR03MB1482;5:PH6NVjwbt7v/IilfD709JkAqTvAmfh1xy/pQ/C2z435GfRk3T7SjLWD8PhA5xWZLkUQLfTjMKaUmTdp9ND+q6BlEnRbiom7YdbDRGJIOqUh6OKsO/scGx/DJZU9HC1xSv2G96ZD5u+gCXOGhGL4vAg==;24:orWXIjf2kYH7EcUWTbNgOPafXEPwXUifB296g8eAuowQi+a1MwdryOU94WDfi/cSXaP6+2qTXWlvsBzeKZb2OngxXgTyi0ICZDeZTMBA1uk=;20:6hwbZMM0zRwBjv3q1o5Jq2dZ4GFUfLoD5TkVhegHLSOzgyyqdQrNPd7ipRwq0eORWIfhQPAs1w4uNOFqwFE8EQ== X-OriginatorOrg: freescale.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 18 Sep 2015 02:39:25.7117 (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 Thu, 2015-09-17 at 21:35 -0500, Zhao Qiang-B45475 wrote: > On Mon, 2015-09-18 at 04:28 +0800, Wood Scott-B07421 wrote: > > -----Original Message----- > > From: Wood Scott-B07421 > > Sent: Friday, September 18, 2015 4:28 AM > > To: Zhao Qiang-B45475 > > Cc: linux-kernel@vger.kernel.org; linuxppc-dev@lists.ozlabs.org; > > lauraa@codeaurora.org; Xie Xiaobo-R63061; benh@kernel.crashing.org; Li > > Yang-Leo-R58472; paulus@samba.org > > Subject: Re: [PATCH v9 3/5] qe_common: add qe_muram_ functions to manage > > muram > > > > 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. > > Modify cpm_muram functions with genalloc first, Then move it to qe_muram > with > churn of cpm_muram_* and qe_mura_*? Or other method? All modifications first (both genalloc and, if you must, renaming), then move. Or move, then all modifications. I don't care which order, just don't make changes in the same patch as moving the code. -Scott