From patchwork Mon Mar 7 15:34:22 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Codrin Ciubotariu X-Patchwork-Id: 593183 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 [IPv6:2401:3900:2:1::3]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id C0112140273 for ; Tue, 8 Mar 2016 07:20:08 +1100 (AEDT) Received: from lists.ozlabs.org (lists.ozlabs.org [IPv6:2401:3900:2:1::3]) by lists.ozlabs.org (Postfix) with ESMTP id A517D1A0B86 for ; Tue, 8 Mar 2016 07:20:08 +1100 (AEDT) X-Original-To: linuxppc-dev@lists.ozlabs.org Delivered-To: linuxppc-dev@lists.ozlabs.org X-Greylist: delayed 872 seconds by postgrey-1.35 at bilbo; Tue, 08 Mar 2016 02:49:39 AEDT Received: from na01-bn1-obe.outbound.protection.outlook.com (mail-bn1bon0060.outbound.protection.outlook.com [157.56.111.60]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-SHA384 (256/256 bits)) (No client certificate requested) by lists.ozlabs.org (Postfix) with ESMTPS id 18CDF1A011D for ; Tue, 8 Mar 2016 02:49:38 +1100 (AEDT) Received: from BLUPR03CA012.namprd03.prod.outlook.com (10.255.124.29) by CY1PR03MB1504.namprd03.prod.outlook.com (10.163.17.22) with Microsoft SMTP Server (TLS) id 15.1.427.16; Mon, 7 Mar 2016 15:35:02 +0000 Received: from BL2FFO11FD037.protection.gbl (10.255.124.4) by BLUPR03CA012.outlook.office365.com (10.255.124.29) with Microsoft SMTP Server (TLS) id 15.1.415.20 via Frontend Transport; Mon, 7 Mar 2016 15:35:02 +0000 Authentication-Results: spf=fail (sender IP is 192.88.168.50) smtp.mailfrom=nxp.com; nxp.com; dkim=none (message not signed) header.d=none;nxp.com; dmarc=none action=none header.from=nxp.com; Received-SPF: Fail (protection.outlook.com: domain of nxp.com does not designate 192.88.168.50 as permitted sender) receiver=protection.outlook.com; client-ip=192.88.168.50; helo=tx30smr01.am.freescale.net; Received: from tx30smr01.am.freescale.net (192.88.168.50) by BL2FFO11FD037.mail.protection.outlook.com (10.173.161.133) with Microsoft SMTP Server (TLS) id 15.1.427.7 via Frontend Transport; Mon, 7 Mar 2016 15:35:01 +0000 Received: from fsr-fed2064-105.ea.freescale.net (fsr-fed2064-105.ea.freescale.net [10.171.73.23]) by tx30smr01.am.freescale.net (8.14.3/8.14.0) with ESMTP id u27FYaFU005914; Mon, 7 Mar 2016 08:35:00 -0700 From: Codrin Ciubotariu To: Subject: [PATCH 6/7] iommu/fsl: PAMU power management support Date: Mon, 7 Mar 2016 17:34:22 +0200 Message-ID: <1457364863-18004-7-git-send-email-codrin.ciubotariu@nxp.com> X-Mailer: git-send-email 1.9.3 In-Reply-To: <1457364863-18004-1-git-send-email-codrin.ciubotariu@nxp.com> References: <1457364863-18004-1-git-send-email-codrin.ciubotariu@nxp.com> X-EOPAttributedMessage: 0 X-Matching-Connectors: 131018385021651196; (91ab9b29-cfa4-454e-5278-08d120cd25b8); () X-Forefront-Antispam-Report: CIP:192.88.168.50; IPV:NLI; CTRY:US; EFV:NLI; SFV:NSPM; SFS:(10009020)(6009001)(2980300002)(1109001)(1110001)(339900001)(199003)(189002)(189998001)(81166005)(5003940100001)(110136002)(48376002)(229853001)(106466001)(33646002)(2351001)(105606002)(50226001)(47776003)(50466002)(586003)(50986999)(76176999)(36756003)(92566002)(1220700001)(1096002)(85426001)(87936001)(86362001)(19580395003)(19580405001)(2906002)(11100500001)(6806005)(77096005)(104016004)(5008740100001)(2950100001)(7059030); DIR:OUT; SFP:1101; SCL:1; SRVR:CY1PR03MB1504; H:tx30smr01.am.freescale.net; FPR:; SPF:Fail; MLV:sfv; A:1; MX:1; LANG:en; X-Microsoft-Exchange-Diagnostics: 1; BL2FFO11FD037; 1:8YO10+YLQ2xNivSalU5gzomMeV2m0nxdg607bv4q7gZEUyHDXCLbfW1GgHK5plId1tD+aK6pkipf0D0V860p45eJWMdyIa6tVng2auizdx4nHNAX0PwM/aCamS4tV+VQutkNBwbBdmApIz6MfGnP2aGr5QvH7vgJiYAtn8UkBHadyJNY7sNLUG4j85xFX3gyqYZFIwkRUWYM3dD4Z1+BYPDsZYRdswbjVxc2KsxnSoRWctqNO9BDPx1GMiTY45L+gigAviLTJgTTeO2m3+7qHjmZUjMD4lFZ8mUZloAVv7Kv28AKSKmHwuOsWmBpyiHF27Ywkl0GGhbTkDEDXVQKdz08roGR/TQX7ZR4behIuyOgdsCYJ5Xlzp4W5LvKU+egCfLpc8VpN4jO4pb/EahItz61zaGjmfKpGyDIFhWssd8kd5CoCCErr6xijhU6+Co4Wei93dyPYV1QyPX0l5J9LkMGD9u5F1mXQPGDz0Ce5fAU2UiA2uDPsyjM/yuq9wafpj3JMLm1tnAq57R3fjoh9AfkjW/KqeEEhcdg8b6cc+eSVPaL5+G4+s2Pdx2NbBSTVHgKgK4PWX2efDVu8d46BJQf47Tb0QQVFmXinOPdd1NlWZVaSw39sY+mU+X3bky0rdVSnLshIDmXCv88d/WoHQ== MIME-Version: 1.0 X-MS-Office365-Filtering-Correlation-Id: e0dd98cf-5cec-4752-679b-08d3469e0cb7 X-Microsoft-Exchange-Diagnostics: 1; CY1PR03MB1504; 2:SNNsk7lmfHImI3ovX+71o6/IZKKjNTwVjmRMHhojH62+2OYo4jsBAW9UKqbJKf94hLDpPOIcEte245yzC2+FUrUu6uxA5iSJ/rrjdsYig1CSQx3sQawM5bWhYTbOo7l4RaL3cZfoa2/s8oTocatfry/KFeqB/aVbqUvMfy9YP30Yy1ax3/SlrGkkSLayoHiD; 3:NMgOA65VrNVwRC5ZYBymUSPy5nws9lvqEsL0NKhxwvaZrJxtLB3bh7ImJTOAhWmJIxLM4ESeln6Mw9UmQZ1yACDycXfkejlYWw558U8skxsrWG9fjAAnEYuxUTQ52c3olXPPHpT8MLkyGfwkSDjfLUFFvIvpeHqwrRoxc2SYUQccjxim7obi3hML2PFtRlzctSebl0pHQvgUm9NtA5iQLAdoUlatAMcQs8qCz+rHDc0=; 25:EzvuUWckYnLcCFmhsoj+HYYU4Fb3Hx8tq3sAcQwGJYjjZ+kDe24T6V6Wj9hIiDz5IjEo+ltkKBuw+nxdfVyJTnOeUnDvTaBaM4gLiwJ0k4dcjp/qy0WYlBPqDWMPH7A8l1I8xoXjr6ysNosii4dQMChvaFumyacK0s5nhXO8RCbw/cdoBT31hIYvBAUYEi8s6i97QQrQjxnSlAU6J3WuvIewL7GtBLEobrQCk5ZvpWkrPU+Yp9oVA0IwpWTGhroHp8bCh+orsMeICX5e8JeTsSHWdeMh5VF0bsT9OY5TgY6EA9v5nT+R9VU3kQqXShBRvJBqnmjvQnjroXKtZJmVpQ== X-Microsoft-Antispam: UriScan:;BCL:0;PCL:0;RULEID:;SRVR:CY1PR03MB1504; X-Microsoft-Antispam-PRVS: X-Exchange-Antispam-Report-Test: UriScan:; X-Exchange-Antispam-Report-CFA-Test: BCL:0; PCL:0; RULEID:(601004)(2401047)(13018025)(13024025)(13015025)(13017025)(5005006)(13023025)(8121501046)(10201501046)(3002001); SRVR:CY1PR03MB1504; BCL:0; PCL:0; RULEID:(400006); SRVR:CY1PR03MB1504; X-Microsoft-Exchange-Diagnostics: 1; CY1PR03MB1504; 4:DB1iJn11A/AHqEqT6yDTYyuEGpdAiUxPToaJK5BmKt1W3VXPI2hr3kC92kbhaYwiVKKl6WAJnsooSF4gVw+peMHaKc8ijGcXJKjolvthbJHSa5ex/KssrzwXIeQ7R0aexOp9cguEI2xj8H2LQGmNkNOudxMPnwuPxNWigEQE/cGVuKMEBUlKUVV61RevLK9YIu3yYTEFku7y53ML7bH+mUAt9SzQoyNOrmNZOmoG+WQrq2C3FHOpQCMOeSrTaZN97gUSPcdVLZWVRlpAn2UGw+wCuuGV7b4V+4drn/DGt++9Scc0LyjXLdVwi1tdJBh9WWf+GFHebmKXKQop5WwEf7UbqG30HwJqeuaXCGlQnUu+oLjLj84u3Sy79jhM4IRSYcvyKpCH9LCIvGOfhDPulfJByNhKvrsgPBMQHXGl4Ol3dYKr8U1u87pt4E9Sb7WOf0UQ/6lxRhxh2gDyPvsRKg== X-Forefront-PRVS: 087474FBFA X-Microsoft-Exchange-Diagnostics: =?us-ascii?Q?1; CY1PR03MB1504; 23:AANcc7ZfyqeSW0W3NlcjqwJWx1YHdVrCz6RotjYpX?= =?us-ascii?Q?sLqbbtZQV+nJ55YHl/eq60QL6VGVgWzJlgXEzM15dHBrSgm6t/+PqCWQXz6D?= =?us-ascii?Q?WB/Lie5LZx2JP3FsmJk13uYK3dHt8O/Jq0MhmWuo+Aq1Y2Nnv2xogDM3dEyg?= =?us-ascii?Q?iPtP7hzR3CrCHhJow/cBFqTMOc1o1pbiuVCWayWT40a8xCxrqEaPPDQa/ZRk?= =?us-ascii?Q?/geEEV8hFsm1BksjcQXSLUnRpFC7gz2WZhG/oFg8gF//hsOe0UHzoGa/Llx7?= =?us-ascii?Q?qkFr6ipSaIyxll/83ODeXwu00SLSxyQU646IJuMh1LdLWfAdW1QgI46e+juW?= =?us-ascii?Q?h0PxZxn1QGJG1FOwlxU67XWaRsmhOlexsqrbWDrSZiWaz9lnai00sujePLqM?= =?us-ascii?Q?bMV3bWyz2BMFknM8p/bXB15hRK0pX84LppgkEqHM0N7yZjL+hbHueO549ycm?= =?us-ascii?Q?JwTsbikeM6EaWiO3m7WD5K0KIe1DYoWGhbT9bKXThKA+23pqqDYYxhSYuXsg?= =?us-ascii?Q?kp0gDDxH7ddIIjuk8POvlX9AEca/u4Nd8qHwOL77r9u4Hv/QIdGj3QIwzFZf?= =?us-ascii?Q?tj+XshIBER9TqRSlhe7CkUbyaQm5wD53Jh5OLOdNCQI8S2std7Pn6eYxq3KE?= =?us-ascii?Q?eO7qtwP2mq6SlhLtLARFuDWZ/D/fSVZTl1gWeBUzKFPzd5L0F6b3o//S+EHS?= =?us-ascii?Q?+w7/78JyRdM34aj57roLvD3aZ1VBrtTIOuyLgErM5C5A1Ywth3KIo+ytJG/2?= =?us-ascii?Q?vyD6J54VatdSTQYOiHTa+ICKsCeiBipd2YuuwWSHr9lIcct24H2Fi9o057oo?= =?us-ascii?Q?EUSbbhB3HpM+7FmRDxcThCw66xpykYEviVJ8SgN+ORSZ078sA0/9OcLcKkOX?= =?us-ascii?Q?doFSqKZnMr3hcyivRAHaD1qRc67ur5f1Q8UtHLo2e7jOcsr3034Zh0eUFfHM?= =?us-ascii?Q?G23ixNfHY0mV6ldt9k7M1+XLH5LOkYiSmmVleVHR6jcFzzj+j+E2w7PDl0XX?= =?us-ascii?Q?HUTpOIqQrKYrjxMkWhYfH+pwsR9sYYd8xCj48DXn0BsifpHdPmHxGKVADswV?= =?us-ascii?Q?ONmVXE=3D?= X-Microsoft-Exchange-Diagnostics: 1; CY1PR03MB1504; 5:LyR1YCdTvr5zwrqR4RcgD3oYDKPS/Mne4jGrSpghfHlo/s4oXBVO4o2l3MouEvV5Tgn6sGR/dp2mFZudD2wf/rl7KMV55RdFu+HzRJHEE6ui0XSTRPirM6pvZd3u7txYFA79Z3rtv0mYYAa1LBW7Bi1Y+V5vI92ly8pSdVZ2V2E=; 24:6PeQ/qBbAkKQ6v23JUxM8VM9GHSBU+9ORoR/pvg8O9EumDH+sLeClKJHvA6Z2FynDKxJmFGDCfZcbZVEUP9ejZ+CmNZRYUU+ULgvK1hkB5I= SpamDiagnosticOutput: 1:23 SpamDiagnosticMetadata: NSPM X-MS-Exchange-CrossTenant-OriginalArrivalTime: 07 Mar 2016 15:35:01.9779 (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.168.50]; Helo=[tx30smr01.am.freescale.net] X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: CY1PR03MB1504 X-Mailman-Approved-At: Tue, 08 Mar 2016 07:19:10 +1100 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: scottwood@freescale.com, Varun.Sethi@freescale.com, linuxppc-dev@lists.ozlabs.org, Codrin Ciubotariu Errors-To: linuxppc-dev-bounces+patchwork-incoming=ozlabs.org@lists.ozlabs.org Sender: "Linuxppc-dev" From: Varun Sethi PAMU driver suspend and resume support. Signed-off-by: Varun Sethi Signed-off-by: Codrin Ciubotariu --- drivers/iommu/fsl_pamu.c | 155 +++++++++++++++++++++++++++++++++++++---------- 1 file changed, 123 insertions(+), 32 deletions(-) diff --git a/drivers/iommu/fsl_pamu.c b/drivers/iommu/fsl_pamu.c index 181759e..290231a 100644 --- a/drivers/iommu/fsl_pamu.c +++ b/drivers/iommu/fsl_pamu.c @@ -23,6 +23,7 @@ #include #include #include +#include #include #include @@ -35,10 +36,13 @@ #define make64(high, low) (((u64)(high) << 32) | (low)) -struct pamu_isr_data { +struct pamu_info { void __iomem *pamu_reg_base; /* Base address of PAMU regs */ unsigned int count; /* The number of PAMUs */ -}; +} pamu_info_data; + +/* Pointer to the device configuration space */ +static struct ccsr_guts __iomem *guts_regs; static struct paace *ppaact; static struct paace *spaact; @@ -104,6 +108,36 @@ static struct paace *pamu_get_ppaace(int liodn) return &ppaact[liodn]; } +#ifdef CONFIG_SUSPEND +/** + * set_dcfg_liodn() - set the device LIODN in DCFG + * @np: device tree node pointer + * @liodn: liodn value to program + * + * Returns 0 upon success else error code < 0 returned + */ +static int set_dcfg_liodn(struct device_node *np, int liodn) +{ + const __be32 *prop; + u32 liodn_reg_offset; + int len; + void __iomem *dcfg_region = (void *)guts_regs; + + if (!dcfg_region) + return -ENODEV; + + prop = of_get_property(np, "fsl,liodn-reg", &len); + if (!prop || len != 8) + return -EINVAL; + + liodn_reg_offset = be32_to_cpup(&prop[1]); + + out_be32((u32 *)(dcfg_region + liodn_reg_offset), liodn); + + return 0; +} +#endif + /** * pamu_enable_liodn() - Set valid bit of PACCE * @liodn: liodn PAACT index for desired PAACE @@ -743,7 +777,7 @@ static void setup_omt(struct ome *omt) * Get the maximum number of PAACT table entries * and subwindows supported by PAMU */ -static void get_pamu_cap_values(unsigned long pamu_reg_base) +static void get_pamu_cap_values(void *pamu_reg_base) { u32 pc_val; @@ -753,10 +787,8 @@ static void get_pamu_cap_values(unsigned long pamu_reg_base) } /* Setup PAMU registers pointing to PAACT, SPAACT and OMT */ -static int setup_one_pamu(unsigned long pamu_reg_base, - unsigned long pamu_reg_size, - phys_addr_t ppaact_phys, phys_addr_t spaact_phys, - phys_addr_t omt_phys) +static int setup_one_pamu(void *pamu_reg_base, phys_addr_t ppaact_phys, + phys_addr_t spaact_phys, phys_addr_t omt_phys) { u32 *pc; struct pamu_mmap_regs *pamu_regs; @@ -846,7 +878,7 @@ static void setup_liodns(void) static irqreturn_t pamu_av_isr(int irq, void *arg) { - struct pamu_isr_data *data = arg; + struct pamu_info *data = arg; phys_addr_t phys; unsigned int i, j, ret; @@ -1098,11 +1130,9 @@ static int fsl_pamu_probe(struct platform_device *pdev) { struct device *dev = &pdev->dev; void __iomem *pamu_regs = NULL; - struct ccsr_guts __iomem *guts_regs = NULL; u32 pamubypenr, pamu_counter; + void __iomem *pamu_reg_base; unsigned long pamu_reg_off; - unsigned long pamu_reg_base; - struct pamu_isr_data *data = NULL; struct device_node *guts_node; u64 size; struct page *p; @@ -1129,22 +1159,17 @@ static int fsl_pamu_probe(struct platform_device *pdev) } of_get_address(dev->of_node, 0, &size, NULL); + pamu_info_data.pamu_reg_base = pamu_regs; + pamu_info_data.count = size / PAMU_OFFSET; + irq = irq_of_parse_and_map(dev->of_node, 0); if (irq == NO_IRQ) { dev_warn(dev, "no interrupts listed in PAMU node\n"); goto error; } - data = kzalloc(sizeof(*data), GFP_KERNEL); - if (!data) { - ret = -ENOMEM; - goto error; - } - data->pamu_reg_base = pamu_regs; - data->count = size / PAMU_OFFSET; - /* The ISR needs access to the regs, so we won't iounmap them */ - ret = request_irq(irq, pamu_av_isr, 0, "pamu", data); + ret = request_irq(irq, pamu_av_isr, 0, "pamu", &pamu_info_data); if (ret < 0) { dev_err(dev, "error %i installing ISR for irq %i\n", ret, irq); goto error; @@ -1167,7 +1192,7 @@ static int fsl_pamu_probe(struct platform_device *pdev) } /* read in the PAMU capability registers */ - get_pamu_cap_values((unsigned long)pamu_regs); + get_pamu_cap_values(pamu_regs); /* * To simplify the allocation of a coherency domain, we allocate the * PAACT and the OMT in the same memory buffer. Unfortunately, this @@ -1243,9 +1268,9 @@ static int fsl_pamu_probe(struct platform_device *pdev) for (pamu_reg_off = 0, pamu_counter = 0x80000000; pamu_reg_off < size; pamu_reg_off += PAMU_OFFSET, pamu_counter >>= 1) { - pamu_reg_base = (unsigned long)pamu_regs + pamu_reg_off; - setup_one_pamu(pamu_reg_base, pamu_reg_off, ppaact_phys, - spaact_phys, omt_phys); + pamu_reg_base = pamu_regs + pamu_reg_off; + setup_one_pamu(pamu_reg_base, ppaact_phys, spaact_phys, + omt_phys); /* Disable PAMU bypass for this PAMU */ pamubypenr &= ~pamu_counter; } @@ -1255,8 +1280,6 @@ static int fsl_pamu_probe(struct platform_device *pdev) /* Enable all relevant PAMU(s) */ out_be32(&guts_regs->pamubypenr, pamubypenr); - iounmap(guts_regs); - /* Enable DMA for the LIODNs in the device tree */ setup_liodns(); @@ -1268,12 +1291,7 @@ error_genpool: error: if (irq != NO_IRQ) - free_irq(irq, data); - - if (data) { - memset(data, 0, sizeof(struct pamu_isr_data)); - kfree(data); - } + free_irq(irq, &pamu_info_data); if (pamu_regs) iounmap(pamu_regs); @@ -1296,6 +1314,77 @@ static struct platform_driver fsl_of_pamu_driver = { .probe = fsl_pamu_probe, }; +#ifdef CONFIG_SUSPEND +static int iommu_suspend(void) +{ + int i; + + for (i = 0; i < pamu_info_data.count; i++) { + u32 val; + void __iomem *p; + + p = pamu_info_data.pamu_reg_base + i * PAMU_OFFSET; + val = in_be32((u32 *)(p + PAMU_PICS)); + /* Disable access violation interrupts */ + out_be32((u32 *)(p + PAMU_PICS), + val & ~PAMU_ACCESS_VIOLATION_ENABLE); + } + + return 0; +} + +static void restore_dcfg_liodns(void) +{ + struct device_node *node; + const __be32 *prop; + int ret, liodn; + + for_each_node_with_property(node, "fsl,liodn-reg") { + prop = of_get_property(node, "fsl,liodn", 0); + if (!prop) + continue; + liodn = be32_to_cpup(prop); + ret = set_dcfg_liodn(node, liodn); + if (ret) + pr_debug("LIODN restore failed for %s\n", + node->full_name); + } +} + +static void iommu_resume(void) +{ + int i; + u32 pamubypenr, pamu_counter; + + restore_dcfg_liodns(); + pamubypenr = in_be32(&guts_regs->pamubypenr); + for (i = 0, pamu_counter = 0x80000000; i < pamu_info_data.count; + i++, pamu_counter >>= 1) { + void __iomem *p; + + p = pamu_info_data.pamu_reg_base + i * PAMU_OFFSET; + setup_one_pamu(p, virt_to_phys(ppaact), virt_to_phys(spaact), + virt_to_phys(omt)); + pamubypenr &= ~pamu_counter; + } + /* Enable all PAMUs */ + out_be32(&guts_regs->pamubypenr, pamubypenr); +} + +static struct syscore_ops iommu_syscore_ops = { + .resume = iommu_resume, + .suspend = iommu_suspend, +}; + +static void __init init_iommu_pm_ops(void) +{ + register_syscore_ops(&iommu_syscore_ops); +} + +#else +static inline void init_iommu_pm_ops(void) {} +#endif /* CONFIG_SUSPEND */ + static __init int fsl_pamu_init(void) { struct platform_device *pdev = NULL; @@ -1353,6 +1442,8 @@ static __init int fsl_pamu_init(void) goto error_device_add; } + init_iommu_pm_ops(); + return 0; error_device_add: