int res;
int addrcells = dt_n_addr_cells(parent);
int sizecells = dt_n_size_cells(parent);
+ paddr_t gnttab_start, gnttab_size;
DPRINT("Create hypervisor node\n");
if ( res )
return res;
- DPRINT(" Grant table range: 0xb0000000-0x20000\n");
+ platform_dom0_gnttab(&gnttab_start, &gnttab_size);
+ DPRINT(" Grant table range: %#"PRIpaddr"-%#"PRIpaddr"\n",
+ gnttab_start, gnttab_start + gnttab_size);
/* reg 0 is grant table space */
cells = ®[0];
- dt_set_range(&cells, parent, 0xb0000000, 0x20000);
+ dt_set_range(&cells, parent, gnttab_start, gnttab_size);
res = fdt_property(fdt, "reg", reg,
dt_cells_to_size(addrcells + sizecells));
if ( res )
return GUEST_EVTCHN_PPI;
}
+void platform_dom0_gnttab(paddr_t *start, paddr_t *size)
+{
+ if ( platform && platform->dom0_gnttab_size )
+ {
+ *start = platform->dom0_gnttab_start;
+ *size = platform->dom0_gnttab_size;
+ }
+ else
+ {
+ *start = 0xb0000000;
+ *size = 0x20000;
+ }
+}
+
/*
* Local variables:
* mode: C
PLATFORM_START(midway, "CALXEDA MIDWAY")
.compatible = midway_dt_compat,
.reset = midway_reset,
+
+ .dom0_gnttab_start = 0xff800000,
+ .dom0_gnttab_size = 0x20000,
PLATFORM_END
/*
.specific_mapping = omap5_specific_mapping,
.smp_init = omap5_smp_init,
.cpu_up = cpu_up_send_sgi,
+
+ .dom0_gnttab_start = 0x4b000000,
+ .dom0_gnttab_size = 0x20000,
PLATFORM_END
/*
PLATFORM_START(sunxi, "Allwinner A20")
.compatible = sunxi_dt_compat,
.blacklist_dev = sunxi_blacklist_dev,
+
+ .dom0_gnttab_start = 0x01d00000,
+ .dom0_gnttab_size = 0x20000,
PLATFORM_END
/*
.compatible = xgene_storm_dt_compat,
.quirks = xgene_storm_quirks,
.specific_mapping = xgene_storm_specific_mapping,
+
.dom0_evtchn_ppi = 24,
+ .dom0_gnttab_start = 0x1f800000,
+ .dom0_gnttab_size = 0x20000,
PLATFORM_END
/*
* The IRQ (PPI) to use to inject event channels to dom0.
*/
unsigned int dom0_evtchn_ppi;
+ /*
+ * The location of a region of physical address space which dom0
+ * can use for grant table mappings. If size is zero defaults to
+ * 0xb0000000-0xb0020000.
+ */
+ paddr_t dom0_gnttab_start, dom0_gnttab_size;
};
/*
bool_t platform_has_quirk(uint32_t quirk);
bool_t platform_device_is_blacklisted(const struct dt_device_node *node);
unsigned int platform_dom0_evtchn_ppi(void);
+void platform_dom0_gnttab(paddr_t *start, paddr_t *size);
#define PLATFORM_START(_name, _namestr) \
static const struct platform_desc __plat_desc_##_name __used \