From patchwork Mon Aug 24 09:31:43 2015 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Zhao Qiang X-Patchwork-Id: 509967 X-Patchwork-Delegate: scottwood@freescale.com Return-Path: X-Original-To: patchwork-incoming@ozlabs.org Delivered-To: patchwork-incoming@ozlabs.org Received: from lists.ozlabs.org (lists.ozlabs.org [103.22.144.68]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id E630A1402A0 for ; Mon, 24 Aug 2015 19:45:27 +1000 (AEST) Received: from lists.ozlabs.org (lists.ozlabs.org [IPv6:2401:3900:2:1::3]) by lists.ozlabs.org (Postfix) with ESMTP id CA8B81A25EC for ; Mon, 24 Aug 2015 19:45:27 +1000 (AEST) X-Original-To: linuxppc-dev@lists.ozlabs.org Delivered-To: linuxppc-dev@lists.ozlabs.org Received: from na01-bl2-obe.outbound.protection.outlook.com (mail-bl2on0110.outbound.protection.outlook.com [65.55.169.110]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-SHA384 (256/256 bits)) (No client certificate requested) by lists.ozlabs.org (Postfix) with ESMTPS id 20C7B1A1D6D for ; Mon, 24 Aug 2015 19:42:39 +1000 (AEST) Received: from BLUPR0301CA0032.namprd03.prod.outlook.com (10.162.113.170) by SN1PR0301MB1552.namprd03.prod.outlook.com (10.162.129.158) with Microsoft SMTP Server (TLS) id 15.1.231.21; Mon, 24 Aug 2015 09:42:33 +0000 Received: from BL2FFO11FD029.protection.gbl (2a01:111:f400:7c09::157) by BLUPR0301CA0032.outlook.office365.com (2a01:111:e400:5259::42) with Microsoft SMTP Server (TLS) id 15.1.243.23 via Frontend Transport; Mon, 24 Aug 2015 09:42:33 +0000 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; Received-SPF: Fail (protection.outlook.com: domain of freescale.com does not designate 192.88.158.2 as permitted sender) receiver=protection.outlook.com; client-ip=192.88.158.2; helo=az84smr01.freescale.net; Received: from az84smr01.freescale.net (192.88.158.2) by BL2FFO11FD029.mail.protection.outlook.com (10.173.160.69) with Microsoft SMTP Server (TLS) id 15.1.249.14 via Frontend Transport; Mon, 24 Aug 2015 09:42:32 +0000 Received: from titan.ap.freescale.net ([10.192.208.233]) by az84smr01.freescale.net (8.14.3/8.14.0) with ESMTP id t7O9bBFW018580; Mon, 24 Aug 2015 02:42:29 -0700 From: Zhao Qiang To: Subject: [PATCH v6 3/3] qe_common: add qe_muram_ functions to manage muram Date: Mon, 24 Aug 2015 17:31:43 +0800 Message-ID: <1440408703-6113-3-git-send-email-qiang.zhao@freescale.com> X-Mailer: git-send-email 2.1.0.27.g96db324 In-Reply-To: <1440408703-6113-1-git-send-email-qiang.zhao@freescale.com> References: <1440408703-6113-1-git-send-email-qiang.zhao@freescale.com> X-EOPAttributedMessage: 0 X-Microsoft-Exchange-Diagnostics: 1; BL2FFO11FD029; 1:gfaXioOa1ydQH0aF+BFFGbOrRKWQs2UqYYxQ/eF5o0nlsLxs7ubR/Y+05QXnqAcZ7MqUWR9eTTroU4wsSa+HrvxxeONDCfK9eRdVm0/feaeE7+rFKq4L5605O3e8qK+ygu8zqeIbnJHcoMctBNXeNvrJZUZe4/OlCW02XIPJPbx/FzIsjSAOOeeJVuTXjZHIHQtEUe7DiXdE2pI4HVZGs0ZM+C31uLuM/8R2/ySKUgBSbT8c+riEHW2jlSO5AWQsTCDXctnAniOo0HQUN5TxGhq9Zmg4Glexos1q0AgtW/eHxqHWPT/yEAG3jNKE0gL3/xmtjJyB4bVNb0hXz71bGguaYS6AcJPczPzsumXIfRo9dNipdKkdLBgSUnCdfocWCmVL3vhSqlu967/C2KAqvg== X-Forefront-Antispam-Report: CIP:192.88.158.2; CTRY:US; IPV:NLI; EFV:NLI; SFV:NSPM; SFS:(10019020)(6009001)(2980300002)(339900001)(3050300001)(199003)(40224003)(189002)(189998001)(105606002)(5007970100001)(107886002)(4001450100002)(33646002)(104016003)(50986999)(110136002)(77156002)(62966003)(76176999)(5001860100001)(5001960100002)(50226001)(87936001)(50466002)(36756003)(5003940100001)(106466001)(69596002)(64706001)(2950100001)(92566002)(85426001)(47776003)(68736005)(86362001)(77096005)(575784001)(48376002)(81156007)(6806004)(4001540100001)(97736004)(19580405001)(19580395003)(5001830100001)(2351001)(2371004)(46102003)(229853001)(2004002)(4001430100001); DIR:OUT; SFP:1102; SCL:1; SRVR:SN1PR0301MB1552; H:az84smr01.freescale.net; FPR:; SPF:Fail; PTR:InfoDomainNonexistent; A:1; MX:1; LANG:en; MIME-Version: 1.0 X-Microsoft-Exchange-Diagnostics: 1; SN1PR0301MB1552; 2:B6BvC8d+4OLull0vXefP7UJtziGcZg4RP9XitYrReDAShfHIz0qeUZjnXTe8yfyZNNiFG5L39z8DjL/jsZvQaTkCVtjneMBwlq2/KI6E3QxabTywgXP9vsHbum8oVoFTnXXMEnRsAP55O2lC1MgxifR7J3oQU1Lv3u2nh9LX0Po=; 3:sajdv7F1CTfxt7sHuhKAr+OR04/5E7uW+r0Ce8ZNe5uCnusINkQNkmhDosLEwfSdxExgE3Xt9ba6g/hrb3Q5L2fbgSZ/wyVsrgr9r10fkl6JgXu0d7ZEsQ9vgfFdRjifY9adjAGZ6iWFclkMCN+JUvf4mFVLk5cbs03ucI+6q4M3m89sQm/pOCfl3SWj6wxPli4PTnYRWoaIP5OF61zTtbUUjPeliETREp/XrL5vnWw=; 25:xxTFalrPKg1E6DkSyZU47y1fc+Rm5bVA6HfgGjcAheelAsaTI6IpXDFb6uX9/WQnSdft0/J63eWBzkY7ROFZ9wp5OEp1J75wTLMf5O2qvf/nNyMPm46qg6YTyt0g3fDfRKkumNgdYve1xTYrTQk9R2BF46Zkw9AazwITTx1FRRQavgo5gJDgaW43I5dUza4FPKDdtMIYSUx7YO3nr62wp0P0bPCYH+dTSiho2uqo9eYnGlwmI2byL09TzQYTg88Rr+5FfMCq+epvi6mRiEj/QA== X-Microsoft-Antispam: UriScan:;BCL:0;PCL:0;RULEID:;SRVR:SN1PR0301MB1552; X-Microsoft-Exchange-Diagnostics: 1; SN1PR0301MB1552; 20:IISh5R8HNvigxSmS2WzGgQarjdp2R3EAu6Rt3RFEx5wpCDntIWSX6HZwSugLWxRxHzRP8IfztSpBrX0rsSUPEzJX2CP1/BoyJv3BytKtmjPG9po8rlQfNqciMTcV8rb93uTo4Lk6463+t/SCRrfA6P+yrKEzjRMyWYgsrA+6odp9O/YRPbHoBR3W2PGYklzzqrWSRgj9pPhcaRgc8nqqesEhU3lc0bUxONVQ9l3NyXeyta41qHffDURx/Xy3x6mYdADsaSTnA4EC6PZQNzEh6HRoHp+I5PEDktGvAMeMUcu2ILxqSX5mEZIV592LDjEjOKKPT7euuBQkQI442BeWuwX4rzvm8n68h7ewfPMjmEQ=; 4:Ms2Eia62kx4tr35FOKn3KX1Se5hoPUm7ZOPK040T1czdoE8dKIt9ukXYWfYslmzdoFvPByW39PTmXXqV0XANiD8vTe0+/2DNOnjrT2fhOvzAx8P4YPDBxYqRLrf5HlpO0JeJ2Z5vZbISv8U294R/PQlEadRz/fY44OWcyoyIxnGx/RWAC2MTKZrKgFl5X+PAYPWXGR0CYLT8zJP9TgcPGa7RlcAqGwyZSNmEtef1K8WAifxQh8xX6diRge79r3riyM/Wydr/3+yMh3NqrV+Pe+Dm1xsZdCdGCMYKZ9h1LFaTaZ2v0C3PCWt2IcFziXeL X-Microsoft-Antispam-PRVS: X-Exchange-Antispam-Report-Test: UriScan:; X-Exchange-Antispam-Report-CFA-Test: BCL:0; PCL:0; RULEID:(601004)(5005006)(8121501046)(3002001); SRVR:SN1PR0301MB1552; BCL:0; PCL:0; RULEID:; SRVR:SN1PR0301MB1552; X-Forefront-PRVS: 06780E24F8 X-Microsoft-Exchange-Diagnostics: =?us-ascii?Q?1; SN1PR0301MB1552; 23:Iuy810x/9dqiFsndEk+ui2BhgulnmzAC+93lqBe?= =?us-ascii?Q?5hCadxP109BDJOziIFLvjlsdDZvipjGfY5de6mnoE0WAsJo9JDoKRUojwKNN?= =?us-ascii?Q?9DNkOIBPZbqqnmI2BhUXzsKjw3nSAebSdfulLd8xZ6cTa8X6yiRSEkvyS0iP?= =?us-ascii?Q?aLqy8YWfrtfUYLVFjz/8jtdVEskyhYOEK96fqwShJOsBOdCnYvQWsUvO4oYU?= =?us-ascii?Q?sqkvs1wSjmLSSIZ4gygxGbJlfPKznDIUmPPFN7JfagriH6Moerz3HcHgoZRt?= =?us-ascii?Q?Npd+b4ifvjmTn++ky1YwYGpckoCrbRb8vdL2mEInjpvJ1Y5W5Kimvz9GuNr5?= =?us-ascii?Q?2OCBi+ocdtwshx8iJpwx1V4y5xNvAoKiqsraOXlqi+w2n47lF6NRL8CChSZ+?= =?us-ascii?Q?JB7aL+Gg5Zjb9J7jyVuMUFpkV9Td18yLb0M3K86Ld9GFyc47KajHa53+O9JJ?= =?us-ascii?Q?tPSt6j2QwsG7qMT+5wovk+ZeVj3Y7yBpICl2neP+WORDf3Jz+CnKjN6kGXrD?= =?us-ascii?Q?CSbPn0sKJSKAW4uoxsAYNeAoheyvihbw9BwXtR5FSB90+V4EtyCCf74Mxq3d?= =?us-ascii?Q?tPuPbPB6V8UOavMyvsfDKQ50Mq/9RIpMPcqCVb6xsi4srp0zjbyb2Og7zi+l?= =?us-ascii?Q?cv43wKXqUZCBksFCVIy+I2Epv84RnrDMLclf7zXLqJm7cQycrg679PAUQsS1?= =?us-ascii?Q?G+STlILJZc+LyD84ptTcLkBEznnaLzbXTwwx6sV/O36ArRcRJIV8ByEQJ9mF?= =?us-ascii?Q?5RhtYmX27qGHeV/7gP/Sctq782UEpAp9xlRQTk7EOj35kSysNIsceYTDSd2g?= =?us-ascii?Q?LWknP9ImpnvSojIw801LLdKMinI23vkvVeYX83LYX/GImY0joyu7o76cshXu?= =?us-ascii?Q?hFi7jp5uRlshwksfkjf1tcKgXpGk6MuAj0QTIF1Npl8wCB6Dk/nW1skoeYwF?= =?us-ascii?Q?DeKmXQPwY7k1hjwGKP1ciIb+AgLk0s66ZHsPpyHOYuMcFlLXmPb4vQlINXNK?= =?us-ascii?Q?8PZkz3Lf2bGJ4T/mOCvcM5iAVn4k+iZ+7jsxdF6hvS1Q1OXRpMVTZ3a+OozZ?= =?us-ascii?Q?gEJZA7n9+mfrdu50rBdhT7WQTGyilm8XigoTT5FnpkueHka7jHPGsK6jTPax?= =?us-ascii?Q?iHTKoKgoWbqpI9UlSo+SiVC2DjMv3/at2dO5auuoyk+2pwaqkV1FDUSeI+fQ?= =?us-ascii?Q?wlT9PFWnx2g+XH0pdtU1DDjRTJK0mzrSK1NOh/QzJlRLRYT1pVtZ47uj5gUF?= =?us-ascii?Q?ryzxq/vtm9Qzmoi2S8rrEl4DHLT3fjYrVCG/rnXLrUi9IlPIjP398icfL8Ex?= =?us-ascii?Q?rB7ZQKdiKU5lWKhLwMkRdO9fT/FYu9FqqnBskyC+WSyrT387NURjdW7A/wg2?= =?us-ascii?Q?HbBe/Sw=3D=3D?= X-Microsoft-Exchange-Diagnostics: 1; SN1PR0301MB1552; 5:9mRRgw2G2cCEOpvMrq+8JBlfJKBF5kcjDaLAktJzzogQ+94qqbS6QnAoSu2QF0eMy60/ij8z+Wqq59TiUqHWonZmZg0CWifkLFuVLGSBraR8yCc1s8Seb+hQY4LUkhOv6nEvVXY0p+Sz4L+DRnQS3g==; 24:T/hOehx6X9Z/+viXzPAIRLL/WaaRYqsSBYJgVDCzlZ4mp3jGft9LsGNqQZp/p99SQYL6TR1pw0ODT9wewFPlo1QRMfD/DcewfkTtfCdKlCE=; 20:Fgx4xuocIghGPOiHWqthla2lduE1KHCyDCSx/iUpvE3fqc32V8RbfnvRHuko/jml34ASz3SieG7CJRPI39nHHg== X-OriginatorOrg: freescale.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 24 Aug 2015 09:42:32.9429 (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: SN1PR0301MB1552 X-BeenThere: linuxppc-dev@lists.ozlabs.org X-Mailman-Version: 2.1.20 Precedence: list List-Id: Linux on PowerPC Developers Mail List List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Zhao Qiang , lauraa@codeaurora.org, linux-kernel@vger.kernel.org, paulus@samba.org, linuxppc-dev@lists.ozlabs.org, X.xie@freescale.com Errors-To: linuxppc-dev-bounces+patchwork-incoming=ozlabs.org@lists.ozlabs.org Sender: "Linuxppc-dev" muram is used for qe, add qe_muram_ functions to manage muram. Signed-off-by: Zhao Qiang --- Changes for v2: - no changes Changes for v3: - no changes Changes for v4: - no changes Changes for v5: - no changes Changes for v5: - using genalloc instead rheap to manage QE MURAM - remove qe_reset from platform file, using - subsys_initcall to call qe_init function. arch/powerpc/platforms/83xx/km83xx.c | 2 - arch/powerpc/platforms/83xx/mpc832x_mds.c | 2 - arch/powerpc/platforms/83xx/mpc832x_rdb.c | 2 - arch/powerpc/platforms/83xx/mpc836x_mds.c | 2 - arch/powerpc/platforms/83xx/mpc836x_rdk.c | 3 - arch/powerpc/platforms/85xx/common.c | 1 - drivers/soc/fsl/qe/Kconfig | 1 + drivers/soc/fsl/qe/Makefile | 3 +- drivers/soc/fsl/qe/qe.c | 15 +++ drivers/soc/fsl/qe/qe_common.c | 193 ++++++++++++++++++++++++++++++ include/linux/genalloc.h | 1 + include/soc/fsl/qe/qe.h | 67 +++++++++-- 12 files changed, 271 insertions(+), 21 deletions(-) create mode 100644 drivers/soc/fsl/qe/qe_common.c diff --git a/arch/powerpc/platforms/83xx/km83xx.c b/arch/powerpc/platforms/83xx/km83xx.c index 996a109..7ecd758 100644 --- a/arch/powerpc/platforms/83xx/km83xx.c +++ b/arch/powerpc/platforms/83xx/km83xx.c @@ -136,8 +136,6 @@ static void __init mpc83xx_km_setup_arch(void) mpc83xx_setup_pci(); #ifdef CONFIG_QUICC_ENGINE - qe_reset(); - np = of_find_node_by_name(NULL, "par_io"); if (np != NULL) { par_io_init(np); diff --git a/arch/powerpc/platforms/83xx/mpc832x_mds.c b/arch/powerpc/platforms/83xx/mpc832x_mds.c index 1efb6b4..20dce79 100644 --- a/arch/powerpc/platforms/83xx/mpc832x_mds.c +++ b/arch/powerpc/platforms/83xx/mpc832x_mds.c @@ -74,8 +74,6 @@ static void __init mpc832x_sys_setup_arch(void) mpc83xx_setup_pci(); #ifdef CONFIG_QUICC_ENGINE - qe_reset(); - if ((np = of_find_node_by_name(NULL, "par_io")) != NULL) { par_io_init(np); of_node_put(np); diff --git a/arch/powerpc/platforms/83xx/mpc832x_rdb.c b/arch/powerpc/platforms/83xx/mpc832x_rdb.c index 67b27b4..2e6a6a4 100644 --- a/arch/powerpc/platforms/83xx/mpc832x_rdb.c +++ b/arch/powerpc/platforms/83xx/mpc832x_rdb.c @@ -203,8 +203,6 @@ static void __init mpc832x_rdb_setup_arch(void) mpc83xx_setup_pci(); #ifdef CONFIG_QUICC_ENGINE - qe_reset(); - if ((np = of_find_node_by_name(NULL, "par_io")) != NULL) { par_io_init(np); of_node_put(np); diff --git a/arch/powerpc/platforms/83xx/mpc836x_mds.c b/arch/powerpc/platforms/83xx/mpc836x_mds.c index a01d363..b1b8ab8 100644 --- a/arch/powerpc/platforms/83xx/mpc836x_mds.c +++ b/arch/powerpc/platforms/83xx/mpc836x_mds.c @@ -82,8 +82,6 @@ static void __init mpc836x_mds_setup_arch(void) mpc83xx_setup_pci(); #ifdef CONFIG_QUICC_ENGINE - qe_reset(); - if ((np = of_find_node_by_name(NULL, "par_io")) != NULL) { par_io_init(np); of_node_put(np); diff --git a/arch/powerpc/platforms/83xx/mpc836x_rdk.c b/arch/powerpc/platforms/83xx/mpc836x_rdk.c index 64c5d17..9a5a00d 100644 --- a/arch/powerpc/platforms/83xx/mpc836x_rdk.c +++ b/arch/powerpc/platforms/83xx/mpc836x_rdk.c @@ -35,9 +35,6 @@ static void __init mpc836x_rdk_setup_arch(void) ppc_md.progress("mpc836x_rdk_setup_arch()", 0); mpc83xx_setup_pci(); -#ifdef CONFIG_QUICC_ENGINE - qe_reset(); -#endif } /* diff --git a/arch/powerpc/platforms/85xx/common.c b/arch/powerpc/platforms/85xx/common.c index a79d34e..d81ea0c 100644 --- a/arch/powerpc/platforms/85xx/common.c +++ b/arch/powerpc/platforms/85xx/common.c @@ -105,7 +105,6 @@ void __init mpc85xx_qe_init(void) return; } - qe_reset(); of_node_put(np); } diff --git a/drivers/soc/fsl/qe/Kconfig b/drivers/soc/fsl/qe/Kconfig index ee692b0..6e82c89 100644 --- a/drivers/soc/fsl/qe/Kconfig +++ b/drivers/soc/fsl/qe/Kconfig @@ -5,6 +5,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/drivers/soc/fsl/qe/Makefile b/drivers/soc/fsl/qe/Makefile index 703793f..49acb89 100644 --- a/drivers/soc/fsl/qe/Makefile +++ b/drivers/soc/fsl/qe/Makefile @@ -1,8 +1,7 @@ # # Makefile for the linux ppc-specific parts of QE # -obj-$(CONFIG_QUICC_ENGINE) += qe.o - +obj-$(CONFIG_QUICC_ENGINE) += qe.o qe_common.o obj-$(CONFIG_UCC) += ucc.o obj-$(CONFIG_UCC_SLOW) += ucc_slow.o obj-$(CONFIG_UCC_FAST) += ucc_fast.o diff --git a/drivers/soc/fsl/qe/qe.c b/drivers/soc/fsl/qe/qe.c index 4d17b2d..d8fd4cd 100644 --- a/drivers/soc/fsl/qe/qe.c +++ b/drivers/soc/fsl/qe/qe.c @@ -671,6 +671,21 @@ unsigned int qe_get_num_of_snums(void) } EXPORT_SYMBOL(qe_get_num_of_snums); +static int __init qe_init(void) +{ + struct device_node *np; + + np = of_find_compatible_node(NULL, NULL, "fsl,qe"); + if (!np) { + pr_err("%s: Could not find Quicc Engine node\n", __func__); + return -ENODEV; + } + qe_reset(); + of_node_put(np); + return 0; +} +subsys_initcall(qe_init); + #if defined(CONFIG_SUSPEND) && defined(CONFIG_PPC_85xx) static int qe_resume(struct platform_device *ofdev) { diff --git a/drivers/soc/fsl/qe/qe_common.c b/drivers/soc/fsl/qe/qe_common.c new file mode 100644 index 0000000..7f1762c --- /dev/null +++ b/drivers/soc/fsl/qe/qe_common.c @@ -0,0 +1,193 @@ +/* + * common qe code + * + * author: scott wood + * + * copyright 2007-2008,2010 freescale Semiconductor, Inc. + * + * some parts derived from commproc.c/qe2_common.c, which is: + * copyright (c) 1997 dan error_act (dmalek@jlc.net) + * copyright (c) 1999-2001 dan Malek + * copyright (c) 2000 montavista Software, Inc (source@mvista.com) + * 2006 (c) montavista software, Inc. + * vitaly bordug + * + * this program is free software; you can redistribute it and/or modify + * it under the terms of version 2 of the GNU General Public License as + * published by the free software Foundation. + */ + +#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 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 + +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; + + muram_pool = gen_pool_create(1, -1); + gen_pool_set_algo(muram_pool, gen_pool_first_fit_align, + &muram_pool_data); + + 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_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 out; + } + + 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, + resource_size(&r), -1); + if (ret) { + pr_err("QE MURAM: could not add muram "); + pr_err("remainder to pool!\n"); + return ret; + } + + } + + muram_vbase = ioremap(muram_pbase, max - muram_pbase + 1); + if (!muram_vbase) { + pr_err("Cannot map CPM muram"); + ret = -ENOMEM; + } + +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. + * Use qe_dpram_addr() to get the virtual address of the area. + * Use qe_muram_free() to free the allocation. + */ +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; + start = gen_pool_alloc(muram_pool, size); + memset(qe_muram_addr(start), 0, size); + entry = kmalloc(sizeof(*entry), GFP_KERNEL); + if (!entry) + goto out; + entry->start = start; + entry->size = size; + list_add(&entry->head, &muram_block_list); + spin_unlock_irqrestore(&qe_muram_lock, flags); + + return start; +out: + gen_pool_free(muram_pool, start, size); + return (unsigned long) -ENOMEM; +} +EXPORT_SYMBOL(qe_muram_alloc); + +/** + * 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, 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); diff --git a/include/linux/genalloc.h b/include/linux/genalloc.h index 55da07e..aaf3dc2 100644 --- a/include/linux/genalloc.h +++ b/include/linux/genalloc.h @@ -30,6 +30,7 @@ #ifndef __GENALLOC_H__ #define __GENALLOC_H__ +#include #include struct device; diff --git a/include/soc/fsl/qe/qe.h b/include/soc/fsl/qe/qe.h index 8bdd3fe..f8c02dd 100644 --- a/include/soc/fsl/qe/qe.h +++ b/include/soc/fsl/qe/qe.h @@ -16,10 +16,13 @@ #define _ASM_POWERPC_QE_H #ifdef __KERNEL__ +#include #include #include #include -#include +#include +#include +#include #include #define QE_NUM_OF_SNUM 256 /* There are 256 serial number in QE */ @@ -187,12 +190,41 @@ static inline int qe_alive_during_sleep(void) } /* we actually use cpm_muram implementation, define this for convenience */ -#define qe_muram_init cpm_muram_init -#define qe_muram_alloc cpm_muram_alloc -#define qe_muram_alloc_fixed cpm_muram_alloc_fixed -#define qe_muram_free cpm_muram_free -#define qe_muram_addr cpm_muram_addr -#define qe_muram_offset cpm_muram_offset +int qe_muram_init(void); + +#if defined(CONFIG_QUICC_ENGINE) +unsigned long qe_muram_alloc(unsigned long size, unsigned long align); +int qe_muram_free(unsigned long offset); +void __iomem *qe_muram_addr(unsigned long offset); +unsigned long qe_muram_offset(void __iomem *addr); +dma_addr_t qe_muram_dma(void __iomem *addr); +#else +static inline unsigned long qe_muram_alloc(unsigned long size, + unsigned long align) +{ + return -ENOSYS; +} + +static inline int qe_muram_free(unsigned long offset) +{ + return -ENOSYS; +} + +static inline void __iomem *qe_muram_addr(unsigned long offset) +{ + return NULL; +} + +static inline unsigned long qe_muram_offset(void __iomem *addr) +{ + return -ENOSYS; +} + +static inline dma_addr_t qe_muram_dma(void __iomem *addr) +{ + return 0; +} +#endif /* defined(CONFIG_QUICC_ENGINE) */ /* Structure that defines QE firmware binary files. * @@ -266,6 +298,27 @@ struct qe_bd { #define BD_STATUS_MASK 0xffff0000 #define BD_LENGTH_MASK 0x0000ffff +/* Buffer descriptor control/status used by serial + */ + +#define BD_SC_EMPTY (0x8000) /* Receive is empty */ +#define BD_SC_READY (0x8000) /* Transmit is ready */ +#define BD_SC_WRAP (0x2000) /* Last buffer descriptor */ +#define BD_SC_INTRPT (0x1000) /* Interrupt on change */ +#define BD_SC_LAST (0x0800) /* Last buffer in frame */ +#define BD_SC_TC (0x0400) /* Transmit CRC */ +#define BD_SC_CM (0x0200) /* Continuous mode */ +#define BD_SC_ID (0x0100) /* Rec'd too many idles */ +#define BD_SC_P (0x0100) /* xmt preamble */ +#define BD_SC_BR (0x0020) /* Break received */ +#define BD_SC_FR (0x0010) /* Framing error */ +#define BD_SC_PR (0x0008) /* Parity error */ +#define BD_SC_NAK (0x0004) /* NAK - did not respond */ +#define BD_SC_OV (0x0002) /* Overrun */ +#define BD_SC_UN (0x0002) /* Underrun */ +#define BD_SC_CD (0x0001) /* */ +#define BD_SC_CL (0x0001) /* Collision */ + /* Alignment */ #define QE_INTR_TABLE_ALIGN 16 /* ??? */ #define QE_ALIGNMENT_OF_BD 8