From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1756886AbcHBPON (ORCPT ); Tue, 2 Aug 2016 11:14:13 -0400 Received: from mail-by2nam03on0046.outbound.protection.outlook.com ([104.47.42.46]:12928 "EHLO NAM03-BY2-obe.outbound.protection.outlook.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S965071AbcHBMew (ORCPT ); Tue, 2 Aug 2016 08:34:52 -0400 Authentication-Results: spf=fail (sender IP is 192.88.158.2) smtp.mailfrom=nxp.com; nxp.com; dkim=none (message not signed) header.d=none;nxp.com; dmarc=fail action=none header.from=nxp.com;nxp.com; dkim=none (message not signed) header.d=none; From: Chenhui Zhao To: , , CC: , , Chenhui Zhao , Tang Yuantian Subject: [PATCH v3 5/5] powerpc/pm: save and restore registers during deep sleep Date: Tue, 2 Aug 2016 19:59:32 +0800 Message-ID: <1470139172-12699-6-git-send-email-chenhui.zhao@nxp.com> X-Mailer: git-send-email 1.9.1 In-Reply-To: <1470139172-12699-1-git-send-email-chenhui.zhao@nxp.com> References: <1470139172-12699-1-git-send-email-chenhui.zhao@nxp.com> X-EOPAttributedMessage: 0 X-Matching-Connectors: 131146128181326347;(91ab9b29-cfa4-454e-5278-08d120cd25b8);() X-Forefront-Antispam-Report: CIP:192.88.158.2;IPV:NLI;CTRY:US;EFV:NLI;SFV:NSPM;SFS:(10009020)(6009001)(7916002)(2980300002)(1110001)(1109001)(339900001)(199003)(189002)(81156014)(229853001)(2950100001)(81166006)(4326007)(92566002)(106466001)(47776003)(77096005)(33646002)(85426001)(5003940100001)(356003)(76176999)(50986999)(8936002)(36756003)(50226002)(104016004)(69596002)(2906002)(19580395003)(7846002)(68736007)(189998001)(8676002)(19580405001)(5001770100001)(48376002)(87936001)(97736004)(2201001)(586003)(86362001)(575784001)(50466002)(105606002)(8666005)(49486002)(305945005)(7059030)(2101003);DIR:OUT;SFP:1101;SCL:1;SRVR:BLUPR0301MB2052;H:az84smr01.freescale.net;FPR:;SPF:Fail;PTR:InfoDomainNonexistent;A:1;MX:1;LANG:en; X-Microsoft-Exchange-Diagnostics: 1;BL2FFO11FD012;1:fFzGeguYi07r78IP31Cp5/9P/tZTRQKnozKprjLr1oUhj+ZDgW2RWieRicFj3KQrHvOH1RmcTLCuvAtEBIvjixa/U7J0aANByQ+joL+IK0yq3m5a/ZNLcnH4mRnzWXhEk/hHpYoN1ADSBw/mpFCbxDhtEV0rdTyD2AREsByh3X5iBoOYjP/6DicbKVW9R8Toavew5UTLD9kzx7xf+vPx0OgGM3XZWva3UV76H7WFzS6IS4h6Y/4mD27WXQkVhF1eJ4/qTn9kmpmbWcIgj/1exrHTWgYFPfSDV2WKS3j6QrdsxFHOPJvZGJJm4C4cyZ2I+ZrUSPqgr0uxmNjoA00RkryPp1/+2zlhTh+xKJEgUWq02HXSUZFlLVyZzRPl6/lRJziqwDO7SsvXSPZ6N0wQJ2gmGxw02AyzOWfiEBijwbdXG+VSBUGVnxSKexG6rBMZkgOhoQ5B21YBPQmW4/SDxVA2wD4UZMKScPhi0ztDkAZC/YGvSLd1PoL9AWApsJ2Wda6qqv9zG7q0EAxx0/q2GsCDI4+C83FrNW2DlRAg2AVyuUmd1nefLoUcaDQRfX9vxOrHKlLgq0L3aAClsPSxuIqx6+taH536wY/0e1TJEBGZ6OFzNW41yw4ntUUmWNMptUDy//E9FfaTabaW3ij/3oiC4m/eTLxlm+HyQvg8Jm0+gs01UiyiYDGmGGZfEtcpvhX5VZoi5eNmdixK4rL4PwMVLcY5L0gCUKzBJAyvBV0= MIME-Version: 1.0 Content-Type: text/plain X-MS-Office365-Filtering-Correlation-Id: b11e4475-9c63-414d-720b-08d3bacc9261 X-Microsoft-Exchange-Diagnostics: 1;BLUPR0301MB2052;2:ei3cHaMt6Ue094zWQ0C0UzkZtFu43kvFeJBZa8DMNYymk61vtxpK0UiGMTuINKDHxYBSPCi60VeX1xe75XOqlo/7hZPzdGS06kJY1l6YpQodkb6/AvEKwrMhBj4DsxNipx8jJoNr924/sYUY28aG/5kNjxeZBhOizmDU75tjgRTbUPhSzBEKq6gn+Bj8nONG;3:u2QHeAnL2Ta1ZhMT9iHFI2JDf8UTVrYThsR/pRWtqeVJvsIJMhvQjx56X8ajBzHY1/lNwRuavW2+2RtoxJnQqLlzTC4VIL124f/AhDcs4lqXXdpmMMWttj1A2T7YAf58f4XZnmRtkbFl5OP8IxTW2MQH65nxYvv72LUGj/zwKAG1e39AymSEKzto1zcAusiojRAedrew159hnWGIAaFu7xTTV+s9K6yGILqTk3FLJoI=;25:NPiqq1PIx2HhX27rU0sm8wT6wgdZKU6EKyb1+ezaraHkjpPcHXGTJJJXeLgkPX2swh/fEFw4Nm+cDibC+OqO7RPU3ecFOn2VXt/KpSoio4X7ZseQN1tianrg5yIS6+jDBA57Sbh61+NawBJ/nsp7i1fes8hXt2q8PU4RKLv4cVuWCJcPYa1Q/Mbg4W1j/IbZVxqYRu/tyrhk6qMh5jMhOIZYiMs3RUsVfLKAQ2GZ8yYF3RBl3L39G3DbOvn7BQu9yyBjd02XnIFt67FUIzuio1BqkmuQoWQJjeLpD3YAe4EIDjcFSZSUtXbhhPopKNRU7RXwvLFuUlUQnWZduoCeSWBR4VakNGplYr9RjiV4RqMOw+RiX4seX4Txvv6tj4EKQosW+IWLV2m+Dn4GUa6PVecCzYhjKHK+coZ/J6CpIIc= X-Microsoft-Antispam: UriScan:;BCL:0;PCL:0;RULEID:;SRVR:BLUPR0301MB2052; X-Microsoft-Exchange-Diagnostics: 1;BLUPR0301MB2052;31:FJ2mNBnNNzS4zbWXzo/0455VBWTWLPNZUOE2Fa6adbbXnpYh1h3yiTyZITMm00BsD332XU09vo4CHROWNML1Ce5pA8/lPKfptsk5JzKWeexCquPt8BkLFKId7PzlQUAwBzaRk3K1En7fDen7e5yT9Cwg+F8KjrSJC8e1Ocm7287jC6i7HEeTnBcSYaJseve4LBD0fcy4eOiPRPlazn5L9RtAzlXzVoUfaqgle+zZdcQ=;4:tXmQ6lqYKG5UEUd/rJETD4p5FBAnTB2u9NWRUA8/KFk4qbm1Kxl9Qk3y1bUpy46bnV7J/7G2P3mNvULRL8upYkkAbVf4758aPZzKuph5sC9u40MDW6HpYdTkJSjRU7igmi61z56PBGcsqydsOAirIw/YxF3Da1JDBmCzbZ9Qr1zyxgBm27kq0F0n7dfh9gvYCAIYdYWt6rw6XpsOLCIm65PlSyfjKfPim1Ig5f/tv+MNF75RXMhR16kz9isbRk5DGrcZ1Tni9Cfnq6bh92TQnuAB/0Jw2ztfEUBPlgCVk20FqivKHcwJ7PhQdjDguF2uGMwDDxx/HnpPAqyKx3c6da9ynSaQhKIyqB7lsMymHdgl+8FjarPnEi3lbiAAJ6fifTQtcntmQEUR9tg3mSm8aqg9Vci4G8mtx4JBrUSmgHHXKGuDtVtRkcx0YkOJAzfdypVirdUjFZIbi8IXqBVEvOL6A/1FBiFIxtzcu4+zDsflxhFaaYMf4vTf9mM48IhqF7pSGZmENfgK+t5hqf3WHw== X-Microsoft-Antispam-PRVS: X-Exchange-Antispam-Report-Test: UriScan:(185117386973197); X-Exchange-Antispam-Report-CFA-Test: BCL:0;PCL:0;RULEID:(601004)(2401047)(8121501046)(5005006)(13017025)(13023025)(13018025)(13015025)(13024025)(3002001)(10201501046)(6055026);SRVR:BLUPR0301MB2052;BCL:0;PCL:0;RULEID:(400006);SRVR:BLUPR0301MB2052; X-Forefront-PRVS: 0022134A87 X-Microsoft-Exchange-Diagnostics: =?us-ascii?Q?1;BLUPR0301MB2052;23:tGFNgjx6XQTvCdwO7svaj4xcDop0dsifDIh6aLU?= =?us-ascii?Q?+ieg/Yf27nBpb2wX5hGdfNu/WAnrqWyRS7WS9zp8ayCR55aIM/yqVdmfNeOh?= =?us-ascii?Q?SO5NdAwtnjXNGKoD/oljfCZXUJTSRT0Jr0KxoyU6epdv0RAS6uXui72vbSfF?= =?us-ascii?Q?fl5jXlPe7VM4KqBr9NL0dWCHay7BkbQVAv5U1Nvy6h4aRQo3XO5h6h54dIrC?= =?us-ascii?Q?XXgJ/zIK6xGdAyrVQELDt+rbUn4G59gsXfUVAK7spm/mZHXAA9ubRblmgmRt?= =?us-ascii?Q?RH55vfdhGjTyD+i0fVWNTMQ/d9M/1c0jukwjhrksPEEgWlfvXKvqQ3dGgme1?= =?us-ascii?Q?ifcFnBieyREt+4iyBvC8Cl0Q+n7WP5eGJywWhLDqlAkvxlwfEpj8mXdSWHzx?= =?us-ascii?Q?eVxnyFyVCxuooOmAbXnHktbuL+sneItF602ApgHvlJzds7q84F3xZbciVbus?= =?us-ascii?Q?GTM1Hgf4OTCQ+PPNgcCkoXrONAG40dSZLEEgkq260lPGBGMW2u5fr6zDKC85?= =?us-ascii?Q?hwit8Z2UETaEG6rrRETtByPhS0ga+bKBGbI/QF6xjMO1DP0SiXDY7bRlt978?= =?us-ascii?Q?gmoiig0SsYSRYM1NP1XhwgguxgNZnZ1vt1xh1LbrcIIjug6kw8SnTP3cPuGE?= =?us-ascii?Q?sNx3bLpLHOQPSqMTOuWZII5sePcSJJAtbo/NGOjPjKVg8nShvBEtHVUM9iem?= =?us-ascii?Q?rYT4kQNYCtzhmceHU15+y6R+xhH4pz8huFaSmDvOh7Q7Jn2bqpFrTrYLnLaQ?= =?us-ascii?Q?wWcVQ7C5H/9cSXcysjORh5NiEM6ZthgEJ33r68AOSY553kFF3TpRyWedHcGe?= =?us-ascii?Q?vNRKjnWF9/NHvm/If1l1DszbWiISakzwO3MZRThpT6SN1dtJYwL6ywwB+L6A?= =?us-ascii?Q?ZhdiwmONqtHbkagQtaxvxKh3p8wO9ZgCXiwhxL5B+2xxyhyNpX1xtYf02jzh?= =?us-ascii?Q?cICPfwIkJM5GpGqzeIlpIeFg+ghPKVm8R4jgX1cc+jvuyN0xjvy5pzINbEYU?= =?us-ascii?Q?SKnQc84jXdP0K+KsHJKTF9A2vJt9m4B+40VLPfv4U6HZdaqD5sc9CRc6zPEX?= =?us-ascii?Q?cL+o6cNe4N++O5JXzLMW/jqYb5D7e7nzFNazyl7aTdv83TMGTVLPU4C1kjWi?= =?us-ascii?Q?bOgEVSJXnwalJRBhpQsXnmnXkYIZC2tUXjz6YiFgE3DdTWFibiqfQF5tOJww?= =?us-ascii?Q?5UUwtUxRamFZTM1buFlThuGFR8fyv4Hdq8usF?= X-Microsoft-Exchange-Diagnostics: 1;BLUPR0301MB2052;6:/PHAzo27r7Ngwzlo5+XwnoPJDXGsZnt3ka34A6rvjjMhLsuuCn49QCTm392WweZSvri+9+1EE6Pejl4H6YE4RRtS5ZMV/djZRcTqXwgoAiUfTVunqGixknDehwji67vUf+f/nAtKlj6quhSCnAc0tNNGgYYFTE13+5Jfy1CwEaOEBWVdvsvp6h3qWMfy4vDkRirNItuCpQ4El+1WttoXdcUvbV75UVasdJ7Fxpicb79m6NtY1Vsgo9sPNT9iBJeeqpDN7ElAsvhm3iYyBGPp04TYzOBhMvj8GxBIpkprs1M=;5:0SUfK4jY3BPCcN2pfw0FGaOzhJ3BWwPAjquYs42od8RGkn2aMw4pytIkn6/V/6Jm5qLMLL2xgp/hNh+0LIwGLWqlMq+X716ta0sEDX3cnkV5wWeex8Od8eMvGzN/ciUdfhs1GPNFVAIek7SyMwwTnz/qqTo6XaBec9gX3qnuMnI=;24:fqMVv+5roy2lhGz3PXONwOJ6zxFruHXkKc/fwjGIUh9xKtq2KjHWJaKS+LuQLl+PHXVusgHd1m6QWNDdzyeNOwnoOZD86/bJ1ERB9VNVv+I=;7:HGguTGQ8tEj8fo5ceYKoKktmVW00r1OdWot4FXFqzVIJCvEoriiMxruYjj3Kn+6ef8wCw9ZBOftJWcovCRAEC5JNyhDFGvuKSSWKRoUDDIL3agBfZa4N2VsCbt0xOtslfjreybOpAMMqwvtaFcTyKcbY7Yh0q0eSHn2inLn9lYTrxNHeAjD+ozgFiDajoGM1bQjvjWIVaN+TkNWo1A/YFd5o4EGouXZTDHXi/0xY5hMhYQ3ovdCas0OMHAYo+/n/ SpamDiagnosticOutput: 1:99 SpamDiagnosticMetadata: NSPM X-MS-Exchange-CrossTenant-OriginalArrivalTime: 02 Aug 2016 12:00:15.4026 (UTC) X-MS-Exchange-CrossTenant-Id: 5afe0b00-7697-4969-b663-5eab37d5f47e X-MS-Exchange-CrossTenant-OriginalAttributedTenantConnectingIp: TenantId=5afe0b00-7697-4969-b663-5eab37d5f47e;Ip=[192.88.158.2];Helo=[az84smr01.freescale.net] X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: BLUPR0301MB2052 Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Some CCSR registers will lost during deep sleep. Therefore, should save them before entering deep sleep, and restore them when resuming from deep sleep. Signed-off-by: Tang Yuantian Signed-off-by: Chenhui Zhao --- arch/powerpc/include/asm/fsl_pm.h | 2 + arch/powerpc/platforms/85xx/deepsleep.c | 108 +++++++++++++++++++++++++++++++- 2 files changed, 109 insertions(+), 1 deletion(-) diff --git a/arch/powerpc/include/asm/fsl_pm.h b/arch/powerpc/include/asm/fsl_pm.h index 48c2631..95601fb 100644 --- a/arch/powerpc/include/asm/fsl_pm.h +++ b/arch/powerpc/include/asm/fsl_pm.h @@ -61,7 +61,9 @@ extern void fsl_dp_enter_low(void *priv); extern void fsl_booke_deep_sleep_resume(void); struct fsl_iomap { + void *ccsr_lcc_base; void *ccsr_scfg_base; + void *ccsr_dcfg_base; void *ccsr_rcpm_base; void *ccsr_ddr_base; void *ccsr_gpio1_base; diff --git a/arch/powerpc/platforms/85xx/deepsleep.c b/arch/powerpc/platforms/85xx/deepsleep.c index 9521d99..71987fd 100644 --- a/arch/powerpc/platforms/85xx/deepsleep.c +++ b/arch/powerpc/platforms/85xx/deepsleep.c @@ -23,6 +23,8 @@ #include "sleep_fsm.h" +#define CCSR_LAW_OFFSET 0xC00 + #define CPC_CPCHDBCR0 0x0f00 #define CPC_CPCHDBCR0_SPEC_DIS 0x08000000 @@ -41,6 +43,17 @@ #define QORIQ_CPLD_MISCCSR 0x17 #define QORIQ_CPLD_MISCCSR_SLEEPEN 0x40 +#define CCSR_LCC_BSTRH 0x20 +#define CCSR_LCC_BSTRL 0x24 +#define CCSR_LCC_BSTAR 0x28 + +#define CCSR_DCFG_BRR 0xE4 + +#define CCSR_RCPM_PCTBENR 0x1A0 + +/* the target id for the memory complex 1 (MC1) */ +#define MC1_TRGT_ID 0x10 + /* 128 bytes buffer for restoring data broke by DDR training initialization */ #define DDR_BUF_SIZE 128 static u8 ddr_buff[DDR_BUF_SIZE] __aligned(64); @@ -50,6 +63,23 @@ static void fsl_dp_iounmap(void); static struct fsl_iomap fsl_dp_priv; +struct fsl_ccsr_law { + u32 lawbarh; /* LAWn base address high */ + u32 lawbarl; /* LAWn base address low */ + u32 lawar; /* LAWn attributes */ + u32 reserved; +}; + +static struct fsl_regs_buffer { + u32 bstrh; + u32 bstrl; + u32 bstar; + u32 brr; + u32 pctbenr; + u32 law_count; + void *law_regs; +} fsl_dp_buffer; + static const struct of_device_id fsl_dp_cpld_ids[] __initconst = { { .compatible = "fsl,t1024-cpld", }, { .compatible = "fsl,t1040rdb-cpld", }, @@ -65,6 +95,60 @@ static const struct of_device_id fsl_dp_fpga_ids[] __initconst = { {} }; +static void fsl_regs_save(struct fsl_iomap *base, + struct fsl_regs_buffer *buffer) +{ + int i; + struct fsl_ccsr_law *src = base->ccsr_lcc_base + CCSR_LAW_OFFSET; + struct fsl_ccsr_law *dst = buffer->law_regs; + + buffer->bstrh = in_be32(base->ccsr_lcc_base + CCSR_LCC_BSTRH); + buffer->bstrl = in_be32(base->ccsr_lcc_base + CCSR_LCC_BSTRL); + buffer->bstar = in_be32(base->ccsr_lcc_base + CCSR_LCC_BSTAR); + buffer->brr = in_be32(base->ccsr_dcfg_base + CCSR_DCFG_BRR); + buffer->pctbenr = in_be32(base->ccsr_rcpm_base + CCSR_RCPM_PCTBENR); + + for (i = 0; i < buffer->law_count; i++) { + dst->lawbarh = in_be32(&src->lawbarh); + dst->lawbarl = in_be32(&src->lawbarl); + dst->lawar = in_be32(&src->lawar); + dst++; + src++; + } +} + +static void fsl_regs_restore(struct fsl_iomap *base, + struct fsl_regs_buffer *buffer) +{ + int i; + u32 attr; + struct fsl_ccsr_law *src = buffer->law_regs; + struct fsl_ccsr_law *dst = base->ccsr_lcc_base + CCSR_LAW_OFFSET; + + out_be32(base->ccsr_lcc_base + CCSR_LCC_BSTRH, buffer->bstrh); + out_be32(base->ccsr_lcc_base + CCSR_LCC_BSTRL, buffer->bstrl); + out_be32(base->ccsr_lcc_base + CCSR_LCC_BSTAR, buffer->bstar); + out_be32(base->ccsr_dcfg_base + CCSR_DCFG_BRR, buffer->brr); + out_be32(base->ccsr_rcpm_base + CCSR_RCPM_PCTBENR, buffer->pctbenr); + + for (i = 0; i < buffer->law_count; i++) { + /* + * If the LAW with the target id of MC1 has been set, + * skip. Because changing it here causes memory + * access error. + */ + attr = in_be32(&dst->lawar); + if (((attr >> 20) & 0xff) == MC1_TRGT_ID) + continue; + out_be32(&dst->lawar, 0); + out_be32(&dst->lawbarl, src->lawbarl); + out_be32(&dst->lawbarh, src->lawbarh); + out_be32(&dst->lawar, src->lawar); + src++; + dst++; + } +} + static void fsl_dp_set_resume_pointer(void) { u32 resume_addr; @@ -132,6 +216,8 @@ int fsl_enter_deepsleep(void) fsl_dp_set_resume_pointer(); + fsl_regs_save(&fsl_dp_priv, &fsl_dp_buffer); + /* enable Warm Device Reset request. */ setbits32(fsl_dp_priv.ccsr_scfg_base + CCSR_SCFG_DPSLPCR, CCSR_SCFG_DPSLPCR_WDRR_EN); @@ -152,6 +238,8 @@ int fsl_enter_deepsleep(void) fsl_dp_enter_low(&fsl_dp_priv); + fsl_regs_restore(&fsl_dp_priv, &fsl_dp_buffer); + /* disable Warm Device Reset request */ clrbits32(fsl_dp_priv.ccsr_scfg_base + CCSR_SCFG_DPSLPCR, CCSR_SCFG_DPSLPCR_WDRR_EN); @@ -212,6 +300,11 @@ static int __init fsl_dp_iomap(void) goto err; } + fsl_dp_priv.ccsr_dcfg_base = + fsl_of_iomap("fsl,qoriq-device-config-2.0"); + if (!fsl_dp_priv.ccsr_dcfg_base) + goto err; + fsl_dp_priv.ccsr_scfg_base = fsl_of_iomap("fsl,t1040-scfg"); if (!fsl_dp_priv.ccsr_scfg_base) { fsl_dp_priv.ccsr_scfg_base = fsl_of_iomap("fsl,t1023-scfg"); @@ -253,8 +346,21 @@ static int __init fsl_dp_iomap(void) if (!fsl_dp_priv.dcsr_rcpm_base) goto err; - return 0; + fsl_dp_priv.ccsr_lcc_base = fsl_of_iomap("fsl,corenet-law"); + if (!fsl_dp_priv.ccsr_lcc_base) + goto err; + + np = of_find_compatible_node(NULL, NULL, "fsl,corenet-law"); + if (of_property_read_u32(np, "fsl,num-laws", + &fsl_dp_buffer.law_count)) + goto err; + fsl_dp_buffer.law_regs = kcalloc(fsl_dp_buffer.law_count, + sizeof(struct fsl_ccsr_law), GFP_KERNEL); + if (!fsl_dp_buffer.law_regs) + goto err; + + return 0; err: fsl_dp_iounmap(); return -1; -- 1.9.1