Re: [RFC PATCH v2] irqchip/gic-v3: Add quirk for msm8996 secured registers

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 




On 4 September 2018 15:05:38 BST, Srinivas Kandagatla <srinivas.kandagatla@xxxxxxxxxx> wrote:
>Access to GICR_WAKER is restricted on msm8996 SoC in Hypervisor.
>Its been more than 2 years of wait for this to be fixed, which has
>no hopes to be fixed. This change was introduced for the "lead device"
>on msm8996 platform. It looks like all publicly available msm8996
>devices have this implementation.
>
>So add a quirk to not access this register on msm8996.
>
>With this quirk MSM8996 can at least boot out of mainline,
>which can help community to work with boards based on MSM8996.
>
>Without this patch Qualcomm DB820c board reboots when GICR_WAKER
>is accessed.
>
>Signed-off-by: Srinivas Kandagatla <srinivas.kandagatla@xxxxxxxxxx>
>---
>Hi Marc,
>
>There is no errata associated with this quirk, so I could not add
>any entries into Documentation/arm64/silicon-errata.txt Or add
>any number to the quirk description.
>
>Changes since v1:
>- renamed gic_v3 references to gic
>- added full mask for iidr register match
>
>thanks,
>srini
>
> drivers/irqchip/irq-gic-v3.c | 29 ++++++++++++++++++++++++++++-
> 1 file changed, 28 insertions(+), 1 deletion(-)
>
>diff --git a/drivers/irqchip/irq-gic-v3.c
>b/drivers/irqchip/irq-gic-v3.c
>index d5912f1ec884..406d4a44c887 100644
>--- a/drivers/irqchip/irq-gic-v3.c
>+++ b/drivers/irqchip/irq-gic-v3.c
>@@ -41,6 +41,8 @@
> 
> #include "irq-gic-common.h"
> 
>+#define FLAGS_WORKAROUND_GICR_WAKER_MSM8996	(1ULL << 0)
>+
> struct redist_region {
> 	void __iomem		*redist_base;
> 	phys_addr_t		phys_base;
>@@ -55,6 +57,7 @@ struct gic_chip_data {
> 	struct irq_domain	*domain;
> 	u64			redist_stride;
> 	u32			nr_redist_regions;
>+	u64			flags;
> 	bool			has_rss;
> 	unsigned int		irq_nr;
> 	struct partition_desc	*ppi_descs[16];
>@@ -139,6 +142,9 @@ static void gic_enable_redist(bool enable)
> 	u32 count = 1000000;	/* 1s! */
> 	u32 val;
> 
>+	if (gic_data.flags & FLAGS_WORKAROUND_GICR_WAKER_MSM8996)
>+		return;
>+
> 	rbase = gic_data_rdist_rd_base();
> 
> 	val = readl_relaxed(rbase + GICR_WAKER);
>@@ -1068,13 +1074,31 @@ static const struct irq_domain_ops
>partition_domain_ops = {
> 	.select = gic_irq_domain_select,
> };
> 
>+static bool __maybe_unused gic_enable_quirk_msm8996(void *data)
>+{
>+	struct gic_chip_data *d = data;
>+
>+	d->flags |= FLAGS_WORKAROUND_GICR_WAKER_MSM8996;
>+
>+	return true;
>+}
>+
>+static const struct gic_quirk gic_quirks[] = {
>+	{
>+		.desc	= "GICv3: Qualcomm MSM8996 skip GICR_WAKER Read/Write",
>+		.iidr	= 0x00001070,	/* MSM8996 */
>+		.mask	= 0xffffffff,
>+		.init	= gic_enable_quirk_msm8996,
>+	},
>+};
>+
> static int __init gic_init_bases(void __iomem *dist_base,
> 				 struct redist_region *rdist_regs,
> 				 u32 nr_redist_regions,
> 				 u64 redist_stride,
> 				 struct fwnode_handle *handle)
> {
>-	u32 typer;
>+	u32 typer, iidr;
> 	int gic_irqs;
> 	int err;
> 
>@@ -1130,6 +1154,9 @@ static int __init gic_init_bases(void __iomem
>*dist_base,
> 	if (IS_ENABLED(CONFIG_ARM_GIC_V3_ITS) && gic_dist_supports_lpis())
> 		its_init(handle, &gic_data.rdists, gic_data.domain);
> 
>+	iidr = readl_relaxed(dist_base + GICD_IIDR);
>+	gic_enable_quirks(iidr, gic_quirks, &gic_data);
>+
> 	gic_smp_init();
> 	gic_dist_init();
> 	gic_cpu_init();

This bug also affects sdm660/630 and probably 8998 but I cant verify so it would probably make sense to loosen up the naming for the quirk.
-- 




[Index of Archives]     [Linux ARM Kernel]     [Linux ARM]     [Linux Omap]     [Fedora ARM]     [Linux for Sparc]     [IETF Annouce]     [Security]     [Bugtraq]     [Linux MIPS]     [ECOS]     [Asterisk Internet PBX]     [Linux API]

  Powered by Linux