+----------------+-----------------+-----------------+-----------------------------+
 | Hisilicon      | Hip0{6,7}       | #161010701      | N/A                         |
 +----------------+-----------------+-----------------+-----------------------------+
+| Hisilicon      | Hip0{6,7}       | #161010803      | N/A                         |
++----------------+-----------------+-----------------+-----------------------------+
 | Hisilicon      | Hip07           | #161600802      | HISILICON_ERRATUM_161600802 |
 +----------------+-----------------+-----------------+-----------------------------+
 | Hisilicon      | Hip08 SMMU PMCG | #162001800      | N/A                         |
 
        return true;
 }
 
+static bool gic_enable_quirk_hip06_07(void *data)
+{
+       struct gic_chip_data *d = data;
+
+       /*
+        * HIP06 GICD_IIDR clashes with GIC-600 product number (despite
+        * not being an actual ARM implementation). The saving grace is
+        * that GIC-600 doesn't have ESPI, so nothing to do in that case.
+        * HIP07 doesn't even have a proper IIDR, and still pretends to
+        * have ESPI. In both cases, put them right.
+        */
+       if (d->rdists.gicd_typer & GICD_TYPER_ESPI) {
+               /* Zero both ESPI and the RES0 field next to it... */
+               d->rdists.gicd_typer &= ~GENMASK(9, 8);
+               return true;
+       }
+
+       return false;
+}
+
+static const struct gic_quirk gic_quirks[] = {
+       {
+               .desc   = "GICv3: Qualcomm MSM8996 broken firmware",
+               .compatible = "qcom,msm8996-gic-v3",
+               .init   = gic_enable_quirk_msm8996,
+       },
+       {
+               .desc   = "GICv3: HIP06 erratum 161010803",
+               .iidr   = 0x0204043b,
+               .mask   = 0xffffffff,
+               .init   = gic_enable_quirk_hip06_07,
+       },
+       {
+               .desc   = "GICv3: HIP07 erratum 161010803",
+               .iidr   = 0x00000000,
+               .mask   = 0xffffffff,
+               .init   = gic_enable_quirk_hip06_07,
+       },
+       {
+       }
+};
+
 static void gic_enable_nmi_support(void)
 {
        int i;
         */
        typer = readl_relaxed(gic_data.dist_base + GICD_TYPER);
        gic_data.rdists.gicd_typer = typer;
+
+       gic_enable_quirks(readl_relaxed(gic_data.dist_base + GICD_IIDR),
+                         gic_quirks, &gic_data);
+
        pr_info("%d SPIs implemented\n", GIC_LINE_NR - 32);
        pr_info("%d Extended SPIs implemented\n", GIC_ESPI_NR);
        gic_data.domain = irq_domain_create_tree(handle, &gic_irq_domain_ops,
        gic_set_kvm_info(&gic_v3_kvm_info);
 }
 
-static const struct gic_quirk gic_quirks[] = {
-       {
-               .desc   = "GICv3: Qualcomm MSM8996 broken firmware",
-               .compatible = "qcom,msm8996-gic-v3",
-               .init   = gic_enable_quirk_msm8996,
-       },
-       {
-       }
-};
-
 static int __init gic_of_init(struct device_node *node, struct device_node *parent)
 {
        void __iomem *dist_base;