APM X-Gene GICv2m implementation has an erratum where the
MSI data needs to be the offset from the spi_start in order to
trigger the correct MSI interrupt. This is different from the
standard GICv2m implementation where the MSI data is the absolute
value within the range from spi_start to (spi_start + num_spis)
of each v2m frame.
This patch reads MSI_IIDR register (present in all GICv2m
implementations) to identify X-Gene GICv2m implementation and
apply workaround to change the data portion of MSI vector.
Signed-off-by: Duc Dang <redacted>
---
drivers/irqchip/irq-gic-v2m.c | 14 ++++++++++++++
1 file changed, 14 insertions(+)
From: Marc Zyngier <hidden> Date: 2015-10-03 13:27:06
On Fri, 2 Oct 2015 15:16:49 -0700
Duc Dang [off-list ref] wrote:
Hi Duc,
quoted hunk
APM X-Gene GICv2m implementation has an erratum where the
MSI data needs to be the offset from the spi_start in order to
trigger the correct MSI interrupt. This is different from the
standard GICv2m implementation where the MSI data is the absolute
value within the range from spi_start to (spi_start + num_spis)
of each v2m frame.
This patch reads MSI_IIDR register (present in all GICv2m
implementations) to identify X-Gene GICv2m implementation and
apply workaround to change the data portion of MSI vector.
Signed-off-by: Duc Dang <redacted>
---
drivers/irqchip/irq-gic-v2m.c | 14 ++++++++++++++
1 file changed, 14 insertions(+)
+/* APM X-Gene with GICv2m MSI_IIDR register value */
+#define XGENE_GICV2M_MSI_IIDR 0x06000170
+
Is this value guaranteed to only identify the affected implementation?
Do we have strong guarantees that a fixed implementation will not have
this value?
If not, I'd strongly suggest using a different method (compatible
string).
@@ -98,6 +102,16 @@ static void gicv2m_compose_msi_msg(struct irq_data *data, struct msi_msg *msg) msg->address_hi = (u32) (addr >> 32); msg->address_lo = (u32) (addr); msg->data = data->hwirq;+ /*+ * APM X-Gene GICv2m implementation has an erratum where+ * the MSI data needs to be the offset from the spi_start+ * in order to trigger the correct MSI interrupt. This is+ * different from the standard GICv2m implementation where+ * the MSI data is the absolute value within the range from+ * spi_start to (spi_start + num_spis).+ */+ if (readl_relaxed(v2m->base + V2M_MSI_IIDR) == XGENE_GICV2M_MSI_IIDR)+ msg->data = data->hwirq - v2m->spi_start; } static struct irq_chip gicv2m_irq_chip = {
Please add a set of flags to struct v2m_data as well as a flag
(GICV2M_NEEDS_SPI_OFFSET?) that can be checked in the compose method
(we don't needs to read the IIDR register each time we program an MSI):
if (v2m->flags & GICV2M_NEEDS_SPI_OFFSET)
msg->data -= v2m->spi_start;
You can set that flag from the probe function.
Thanks,
M.
--
Jazz is not dead. It just smells funny.
On Sat, Oct 3, 2015 at 6:26 AM, Marc Zyngier [off-list ref] wrote:
On Fri, 2 Oct 2015 15:16:49 -0700
Duc Dang [off-list ref] wrote:
Hi Duc,
quoted
APM X-Gene GICv2m implementation has an erratum where the
MSI data needs to be the offset from the spi_start in order to
trigger the correct MSI interrupt. This is different from the
standard GICv2m implementation where the MSI data is the absolute
value within the range from spi_start to (spi_start + num_spis)
of each v2m frame.
This patch reads MSI_IIDR register (present in all GICv2m
implementations) to identify X-Gene GICv2m implementation and
apply workaround to change the data portion of MSI vector.
Signed-off-by: Duc Dang <redacted>
---
drivers/irqchip/irq-gic-v2m.c | 14 ++++++++++++++
1 file changed, 14 insertions(+)
+/* APM X-Gene with GICv2m MSI_IIDR register value */
+#define XGENE_GICV2M_MSI_IIDR 0x06000170
+
Is this value guaranteed to only identify the affected implementation?
Do we have strong guarantees that a fixed implementation will not have
this value?
If not, I'd strongly suggest using a different method (compatible
string).
I got confirmation from my designer. This value (0x06000170) is unique
for affected implementation. The fixed implementation will not have
this value for MSI_IIDR register.
@@ -98,6 +102,16 @@ static void gicv2m_compose_msi_msg(struct irq_data *data, struct msi_msg *msg) msg->address_hi = (u32) (addr >> 32); msg->address_lo = (u32) (addr); msg->data = data->hwirq;+ /*+ * APM X-Gene GICv2m implementation has an erratum where+ * the MSI data needs to be the offset from the spi_start+ * in order to trigger the correct MSI interrupt. This is+ * different from the standard GICv2m implementation where+ * the MSI data is the absolute value within the range from+ * spi_start to (spi_start + num_spis).+ */+ if (readl_relaxed(v2m->base + V2M_MSI_IIDR) == XGENE_GICV2M_MSI_IIDR)+ msg->data = data->hwirq - v2m->spi_start; } static struct irq_chip gicv2m_irq_chip = {
Please add a set of flags to struct v2m_data as well as a flag
(GICV2M_NEEDS_SPI_OFFSET?) that can be checked in the compose method
(we don't needs to read the IIDR register each time we program an MSI):
if (v2m->flags & GICV2M_NEEDS_SPI_OFFSET)
msg->data -= v2m->spi_start;
You can set that flag from the probe function.
Yes, I will update the patch with your suggestion shortly.
Thanks,
M.
--
Jazz is not dead. It just smells funny.
APM X-Gene GICv2m implementation has an erratum where the
MSI data needs to be the offset from the spi_start in order to
trigger the correct MSI interrupt. This is different from the
standard GICv2m implementation where the MSI data is the absolute
value within the range from spi_start to (spi_start + num_spis)
of each v2m frame.
This patch reads MSI_IIDR register (present in all GICv2m
implementations) to identify X-Gene GICv2m implementation and
apply workaround to change the data portion of MSI vector.
Signed-off-by: Duc Dang <redacted>
---
Changes since v1:
+ Group V2M_MSI_IIDR definition to V2M register group
+ Set v2m flag during init to indicate the erratum and
use that flag to manipulate the MSI data when composing MSI msg.
drivers/irqchip/irq-gic-v2m.c | 22 ++++++++++++++++++++++
1 file changed, 22 insertions(+)
@@ -37,12 +37,19 @@#define V2M_MSI_SETSPI_NS 0x040#define V2M_MIN_SPI 32#define V2M_MAX_SPI 1019+#define V2M_MSI_IIDR 0xFCC#define V2M_MSI_TYPER_BASE_SPI(x) \(((x)>>V2M_MSI_TYPER_BASE_SHIFT)&V2M_MSI_TYPER_BASE_MASK)#define V2M_MSI_TYPER_NUM_SPI(x) ((x) & V2M_MSI_TYPER_NUM_MASK)+/* APM X-Gene with GICv2m MSI_IIDR register value */+#define XGENE_GICV2M_MSI_IIDR 0x06000170++/* List of flags for specific v2m implementation */+#define GICV2M_NEEDS_SPI_OFFSET 0x00000001+structv2m_data{spinlock_tmsi_cnt_lock;structresourceres;/* GICv2m resource */
@@ -50,6 +57,7 @@ struct v2m_data {u32spi_start;/* The SPI number that MSIs start */u32nr_spis;/* The number of SPIs for MSIs */unsignedlong*bm;/* MSI vector bitmap */+u32flags;/* v2m flags for specific implementation */};staticvoidgicv2m_mask_msi_irq(structirq_data*d)
From: Marc Zyngier <hidden> Date: 2015-10-07 07:12:12
On 06/10/15 23:32, Duc Dang wrote:
APM X-Gene GICv2m implementation has an erratum where the
MSI data needs to be the offset from the spi_start in order to
trigger the correct MSI interrupt. This is different from the
standard GICv2m implementation where the MSI data is the absolute
value within the range from spi_start to (spi_start + num_spis)
of each v2m frame.
This patch reads MSI_IIDR register (present in all GICv2m
implementations) to identify X-Gene GICv2m implementation and
apply workaround to change the data portion of MSI vector.
Signed-off-by: Duc Dang <redacted>
Reviewed-by: Marc Zyngier <redacted>
M.
--
Jazz is not dead. It just smells funny...
On Wed, Oct 7, 2015 at 12:12 AM, Marc Zyngier [off-list ref] wrote:
On 06/10/15 23:32, Duc Dang wrote:
quoted
APM X-Gene GICv2m implementation has an erratum where the
MSI data needs to be the offset from the spi_start in order to
trigger the correct MSI interrupt. This is different from the
standard GICv2m implementation where the MSI data is the absolute
value within the range from spi_start to (spi_start + num_spis)
of each v2m frame.
This patch reads MSI_IIDR register (present in all GICv2m
implementations) to identify X-Gene GICv2m implementation and
apply workaround to change the data portion of MSI vector.
Signed-off-by: Duc Dang <redacted>