Received: by 10.223.176.46 with SMTP id f43csp364239wra; Thu, 25 Jan 2018 23:40:56 -0800 (PST) X-Google-Smtp-Source: AH8x227KoJSN0gmS8usjOQtfmEbXMmvvsGpMj3vV3xhEEEsqymgamhYHZb5hhJhKvpz2AiNEuJqU X-Received: by 2002:a17:902:20e3:: with SMTP id v32-v6mr14066165plg.405.1516952456536; Thu, 25 Jan 2018 23:40:56 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1516952456; cv=none; d=google.com; s=arc-20160816; b=ne6umWiWvEePqBKHMV1IJxfs5SnWGHR71UwwEaEUJjQb1Is3UlJKeYi4bidOKqnoSK /c5v5vVi9B0c1ZfG2o6NGCGbZBYexF11Nhy+iCRmjEbaUpXaocWNDHItBpGyUTKVResn RFb29hn+uUs3m6LcHet2DLsqMCbFdZ25yRtV73quR0CGzeRjKwShRboWttzOrYdy3Il6 BXVMBR5Xcmnf1t7UwlcOszCiYgdcoSDxvonoRBm3itT84wf70PRTGmqcRmnfNUciRxoc zxmsEsD23aob5bOeD2bZ9/50Xt7/7OWul2csSMtVrMOfyw7NXW64k6x5bZ6whLvl033i xQ+Q== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:references:in-reply-to:message-id:date :subject:cc:to:from:dkim-signature:arc-authentication-results; bh=LLBuMj+wklI2sbD51hsNj04UbF4/f/S6Dm/3+jVzOUI=; b=gBs6FXGSXGpskRU3erv4BvoIYf0dsGI2VCnu8FShygQr0+Zzy4YNWj/Fl/gWIrxNqx 1rZtnkfYJAkjT4glSscwzEiLsXf3XGmZGiC/Q7TQhAhKSfczHSW1jTdrfX/SDlI1Tnvh 34z9WPIHwBPVQO+Q3osvMHq4OwPXiqGJw92fAR6LTGbIR1K1lF7es7t5qQdxO1se1zxa bzsCrCDvAzl4vT4gvTtodgMLUgVuaqEK5d0UAuRAenYiOj5zMQt4SM76MuqhV3uJaFms /XqX6T2Hxn+jgy0vS1d/qmZ0TulAuG1I75P+P3n08nRgZgngyTPtWGCTc2PIDb2FMRrn SZNA== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@chromium.org header.s=google header.b=LK6kLuRx; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=chromium.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id q1-v6si2765588plb.680.2018.01.25.23.40.41; Thu, 25 Jan 2018 23:40:56 -0800 (PST) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; dkim=pass header.i=@chromium.org header.s=google header.b=LK6kLuRx; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=chromium.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752144AbeAZHjt (ORCPT + 99 others); Fri, 26 Jan 2018 02:39:49 -0500 Received: from mail-pg0-f68.google.com ([74.125.83.68]:38146 "EHLO mail-pg0-f68.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751960AbeAZHin (ORCPT ); Fri, 26 Jan 2018 02:38:43 -0500 Received: by mail-pg0-f68.google.com with SMTP id y27so6756596pgc.5 for ; Thu, 25 Jan 2018 23:38:43 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=chromium.org; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=LLBuMj+wklI2sbD51hsNj04UbF4/f/S6Dm/3+jVzOUI=; b=LK6kLuRxLhrdsUuXUMch4LzqMaxJI3TeLxa7WzvgbWetKIkvkjtaPrTfWLxKOllZ9N CW5ZU4h5NE1hMP35wIOnfqfSYuXF9cwS7WUSqdUrU5pZOBgjczDCPqAdpIfOffXon6V8 V83U4BAXr6Wp3CYcc7hw4UEmAqCh998NnjO1E= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=LLBuMj+wklI2sbD51hsNj04UbF4/f/S6Dm/3+jVzOUI=; b=WSyKRF/FIldc20lUZ24GUIpVcnM1gF8OZQOs9zOcbFh5EpNKbaZVbbGftzH6CEaEAL eAWeOu7vujgYScKHEvc+donN0XsA2N95FBQ9/VF/fkrWgC4l2y+bHOvOeV/0HHQ9sFLw RkPsPD5Si8FhV/IcF0FAOOV4+4/MRTqHopSZlqVu3eX+qDnetwmetZckGOK1M8g2jYOp PmIoYp9Nw+Zs2GLkFp4yuHdn6qXUEZIuXkQ70tbkGxoMMLHa1XSwPkaTYuJ5uF/tebkv XzmJaKTUZcLTSl8fk2h2peW4W/hs1X0xR661AFB7Lv1eWSyMmt6W89pZIFdlCfa0npt9 jDkw== X-Gm-Message-State: AKwxytcIzUXjA3ThHYHLtDa08TuDchbPb+12yROOrfakv9gggGLo/Oec +QyDSXYBuBxDdA2vFdCOvXJ0FW4TpQk= X-Received: by 10.98.33.198 with SMTP id o67mr18689395pfj.0.1516952322704; Thu, 25 Jan 2018 23:38:42 -0800 (PST) Received: from exogeni.mtv.corp.google.com ([2620:0:1000:1600:211e:5908:95bc:4888]) by smtp.gmail.com with ESMTPSA id t22sm17856168pfi.118.2018.01.25.23.38.41 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Thu, 25 Jan 2018 23:38:41 -0800 (PST) From: Derek Basehore To: linux-kernel@vger.kernel.org Cc: Soby.Mathew@arm.com, sudeep.holla@arm.com, devicetree@vger.kernel.org, robh+dt@kernel.org, mark.rutland@arm.com, linux-pm@vger.kernel.org, rafael.j.wysocki@intel.com, tglx@linutronix.de, briannorris@chromium.org, marc.zyngier@arm.com, Derek Basehore Subject: [PATCH v2 2/5] irqchip/gic-v3-its: add ability to save/restore ITS state Date: Thu, 25 Jan 2018 23:38:32 -0800 Message-Id: <20180126073835.16575-3-dbasehore@chromium.org> X-Mailer: git-send-email 2.16.0.rc1.238.g530d649a79-goog In-Reply-To: <20180126073835.16575-1-dbasehore@chromium.org> References: <20180126073835.16575-1-dbasehore@chromium.org> Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Some platforms power off GIC logic in suspend, so we need to save/restore state. The distributor and redistributor registers need to be handled in platform code due to access permissions on those registers, but the ITS registers can be restored in the kernel. Signed-off-by: Derek Basehore --- drivers/irqchip/irq-gic-v3-its.c | 86 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 86 insertions(+) diff --git a/drivers/irqchip/irq-gic-v3-its.c b/drivers/irqchip/irq-gic-v3-its.c index 06f025fd5726..4727b447610f 100644 --- a/drivers/irqchip/irq-gic-v3-its.c +++ b/drivers/irqchip/irq-gic-v3-its.c @@ -33,6 +33,7 @@ #include #include #include +#include #include #include @@ -46,6 +47,7 @@ #define ITS_FLAGS_CMDQ_NEEDS_FLUSHING (1ULL << 0) #define ITS_FLAGS_WORKAROUND_CAVIUM_22375 (1ULL << 1) #define ITS_FLAGS_WORKAROUND_CAVIUM_23144 (1ULL << 2) +#define ITS_FLAGS_SAVE_SUSPEND_STATE (1ULL << 3) #define RDIST_FLAGS_PROPBASE_NEEDS_FLUSHING (1 << 0) @@ -83,6 +85,15 @@ struct its_baser { u32 psz; }; +/* + * Saved ITS state - this is where saved state for the ITS is stored + * when it's disabled during system suspend. + */ +struct its_ctx { + u64 cbaser; + u32 ctlr; +}; + struct its_device; /* @@ -101,6 +112,7 @@ struct its_node { struct its_collection *collections; struct fwnode_handle *fwnode_handle; u64 (*get_msi_base)(struct its_device *its_dev); + struct its_ctx its_ctx; struct list_head its_device_list; u64 flags; unsigned long list_nr; @@ -3042,6 +3054,75 @@ static void its_enable_quirks(struct its_node *its) gic_enable_quirks(iidr, its_quirks, its); } +int its_save_disable(void) +{ + struct its_node *its; + int err = 0; + + spin_lock(&its_lock); + list_for_each_entry(its, &its_nodes, entry) { + if (its->flags & ITS_FLAGS_SAVE_SUSPEND_STATE) { + struct its_ctx *ctx = &its->its_ctx; + void __iomem *base = its->base; + + ctx->ctlr = readl_relaxed(base + GITS_CTLR); + err = its_force_quiescent(base); + if (err) { + writel_relaxed(ctx->ctlr, base + GITS_CTLR); + goto err; + } + + ctx->cbaser = gits_read_cbaser(base + GITS_CBASER); + } + } + +err: + if (err) { + list_for_each_entry_continue_reverse(its, &its_nodes, entry) { + if (its->flags & ITS_FLAGS_SAVE_SUSPEND_STATE) { + struct its_ctx *ctx = &its->its_ctx; + void __iomem *base = its->base; + + writel_relaxed(ctx->ctlr, base + GITS_CTLR); + } + } + } + + spin_unlock(&its_lock); + + return err; +} + +void its_restore_enable(void) +{ + struct its_node *its; + + spin_lock(&its_lock); + list_for_each_entry(its, &its_nodes, entry) { + struct its_ctx *ctx = &its->its_ctx; + struct its_baser *baser; + void __iomem *base; + int i; + + if (its->flags & ITS_FLAGS_SAVE_SUSPEND_STATE) { + base = its->base; + gits_write_cbaser(ctx->cbaser, base + GITS_CBASER); + /* Restore GITS_BASER from the value cache. */ + for (i = 0; i < GITS_BASER_NR_REGS; i++) { + baser = &its->tables[i]; + its_write_baser(its, baser, baser->val); + } + writel_relaxed(ctx->ctlr, base + GITS_CTLR); + } + } + spin_unlock(&its_lock); +} + +static struct syscore_ops its_syscore_ops = { + .suspend = its_save_disable, + .resume = its_restore_enable, +}; + static int its_init_domain(struct fwnode_handle *handle, struct its_node *its) { struct irq_domain *inner_domain; @@ -3261,6 +3342,9 @@ static int __init its_probe_one(struct resource *res, ctlr |= GITS_CTLR_ImDe; writel_relaxed(ctlr, its->base + GITS_CTLR); + if (fwnode_property_present(handle, "reset-on-suspend")) + its->flags |= ITS_FLAGS_SAVE_SUSPEND_STATE; + err = its_init_domain(handle, its); if (err) goto out_free_tables; @@ -3515,5 +3599,7 @@ int __init its_init(struct fwnode_handle *handle, struct rdists *rdists, } } + register_syscore_ops(&its_syscore_ops); + return 0; } -- 2.16.0.rc1.238.g530d649a79-goog