@@ -671,8 +671,19 @@ static int gicv2_make_dt_node(const struct domain *d,
return -FDT_ERR_XEN(ENOMEM);
tmp = new_cells;
- dt_set_range(&tmp, node, d->arch.vgic.dbase, PAGE_SIZE);
- dt_set_range(&tmp, node, d->arch.vgic.cbase, PAGE_SIZE * 2);
+
+ if (platform_has_quirk(PLATFORM_QUIRK_GICV2_16_CPU))
+ {
+ dt_set_range(&tmp, node, d->arch.vgic.dbase - HIP04_VGIC_REG_OFFSET,
+ PAGE_SIZE);
+ dt_set_range(&tmp, node, d->arch.vgic.cbase - HIP04_VGIC_REG_OFFSET,
+ PAGE_SIZE * 2);
+ }
+ else
+ {
+ dt_set_range(&tmp, node, d->arch.vgic.dbase, PAGE_SIZE);
+ dt_set_range(&tmp, node, d->arch.vgic.cbase, PAGE_SIZE * 2);
+ }
res = fdt_property(fdt, "reg", new_cells, len);
xfree(new_cells);
@@ -149,6 +149,8 @@
#define GICH_LR_PENDING 1
#define GICH_LR_ACTIVE 2
+#define HIP04_VGIC_REG_OFFSET 0xe0000000
+
#ifndef __ASSEMBLY__
#include <xen/device_tree.h>
#include <xen/irq.h>