#include <stdbool.h>
#include <libfdt.h>
#include <assert.h>
-
-/**
- * IRQ line type.
- * DT_IRQ_TYPE_NONE - default, unspecified type
- * DT_IRQ_TYPE_EDGE_RISING - rising edge triggered
- * DT_IRQ_TYPE_EDGE_FALLING - falling edge triggered
- * DT_IRQ_TYPE_EDGE_BOTH - rising and falling edge triggered
- * DT_IRQ_TYPE_LEVEL_HIGH - high level triggered
- * DT_IRQ_TYPE_LEVEL_LOW - low level triggered
- */
-#define DT_IRQ_TYPE_NONE 0x00000000
-#define DT_IRQ_TYPE_EDGE_RISING 0x00000001
-#define DT_IRQ_TYPE_EDGE_FALLING 0x00000002
-#define DT_IRQ_TYPE_EDGE_BOTH \
- (DT_IRQ_TYPE_EDGE_FALLING | DT_IRQ_TYPE_EDGE_RISING)
-#define DT_IRQ_TYPE_LEVEL_HIGH 0x00000004
-#define DT_IRQ_TYPE_LEVEL_LOW 0x00000008
+#include <xen/device_tree_defs.h>
static const char *gicv_to_string(libxl_gic_version gic_version)
{
{"xen-3.0-aarch64", "arm,armv8-timer", "arm,armv8" },
};
-/*
- * The device tree compiler (DTC) is allocating the phandle from 1 to
- * onwards. Reserve a high value for the GIC phandle.
- */
-#define PHANDLE_GIC (65000)
-
typedef uint32_t be32;
typedef be32 gic_interrupt[3];
-#define ROOT_ADDRESS_CELLS 2
-#define ROOT_SIZE_CELLS 2
-
#define PROP_INITRD_START "linux,initrd-start"
#define PROP_INITRD_END "linux,initrd-end"
res = fdt_property(fdt, "interrupts", intr, sizeof (intr[0]) * num_irq);
if (res) return res;
- res = fdt_property_cell(fdt, "interrupt-parent", PHANDLE_GIC);
+ res = fdt_property_cell(fdt, "interrupt-parent", GUEST_PHANDLE_GIC);
if (res) return res;
return 0;
"xen,xenvm");
if (res) return res;
- res = fdt_property_cell(fdt, "interrupt-parent", PHANDLE_GIC);
+ res = fdt_property_cell(fdt, "interrupt-parent", GUEST_PHANDLE_GIC);
if (res) return res;
- res = fdt_property_cell(fdt, "#address-cells", ROOT_ADDRESS_CELLS);
+ res = fdt_property_cell(fdt, "#address-cells", GUEST_ROOT_ADDRESS_CELLS);
if (res) return res;
- res = fdt_property_cell(fdt, "#size-cells", ROOT_SIZE_CELLS);
+ res = fdt_property_cell(fdt, "#size-cells", GUEST_ROOT_SIZE_CELLS);
if (res) return res;
return 0;
"multiboot,module");
if (res) return res;
- res = fdt_property_regs(gc, fdt, ROOT_ADDRESS_CELLS, ROOT_SIZE_CELLS,
+ res = fdt_property_regs(gc, fdt, GUEST_ROOT_ADDRESS_CELLS, GUEST_ROOT_SIZE_CELLS,
1, 0, 0);
if (res) return res;
res = fdt_property_string(fdt, "device_type", "memory");
if (res) return res;
- res = fdt_property_regs(gc, fdt, ROOT_ADDRESS_CELLS, ROOT_SIZE_CELLS,
+ res = fdt_property_regs(gc, fdt, GUEST_ROOT_ADDRESS_CELLS, GUEST_ROOT_SIZE_CELLS,
1, 0, 0);
if (res) return res;
res = fdt_property(fdt, "interrupt-controller", NULL, 0);
if (res) return res;
- res = fdt_property_regs(gc, fdt, ROOT_ADDRESS_CELLS, ROOT_SIZE_CELLS,
+ res = fdt_property_regs(gc, fdt, GUEST_ROOT_ADDRESS_CELLS, GUEST_ROOT_SIZE_CELLS,
2,
gicd_base, gicd_size,
gicc_base, gicc_size);
if (res) return res;
- res = fdt_property_cell(fdt, "linux,phandle", PHANDLE_GIC);
+ res = fdt_property_cell(fdt, "linux,phandle", GUEST_PHANDLE_GIC);
if (res) return res;
- res = fdt_property_cell(fdt, "phandle", PHANDLE_GIC);
+ res = fdt_property_cell(fdt, "phandle", GUEST_PHANDLE_GIC);
if (res) return res;
res = fdt_end_node(fdt);
res = fdt_property(fdt, "interrupt-controller", NULL, 0);
if (res) return res;
- res = fdt_property_regs(gc, fdt, ROOT_ADDRESS_CELLS, ROOT_SIZE_CELLS,
+ res = fdt_property_regs(gc, fdt, GUEST_ROOT_ADDRESS_CELLS, GUEST_ROOT_SIZE_CELLS,
2,
gicd_base, gicd_size,
gicr0_base, gicr0_size);
if (res) return res;
- res = fdt_property_cell(fdt, "linux,phandle", PHANDLE_GIC);
+ res = fdt_property_cell(fdt, "linux,phandle", GUEST_PHANDLE_GIC);
if (res) return res;
- res = fdt_property_cell(fdt, "phandle", PHANDLE_GIC);
+ res = fdt_property_cell(fdt, "phandle", GUEST_PHANDLE_GIC);
if (res) return res;
res = fdt_end_node(fdt);
if (res) return res;
/* reg 0 is grant table space */
- res = fdt_property_regs(gc, fdt, ROOT_ADDRESS_CELLS, ROOT_SIZE_CELLS,
+ res = fdt_property_regs(gc, fdt, GUEST_ROOT_ADDRESS_CELLS, GUEST_ROOT_SIZE_CELLS,
1,GUEST_GNTTAB_BASE, GUEST_GNTTAB_SIZE);
if (res) return res;
res = fdt_property_compat(gc, fdt, 1, "arm,sbsa-uart");
if (res) return res;
- res = fdt_property_regs(gc, fdt, ROOT_ADDRESS_CELLS, ROOT_SIZE_CELLS,
+ res = fdt_property_regs(gc, fdt, GUEST_ROOT_ADDRESS_CELLS, GUEST_ROOT_SIZE_CELLS,
1,
GUEST_PL011_BASE, GUEST_PL011_SIZE);
if (res) return res;
LOG(DEBUG, "Nopping out placeholder node %s", name);
fdt_nop_node(fdt, node);
} else {
- uint32_t regs[ROOT_ADDRESS_CELLS+ROOT_SIZE_CELLS];
+ uint32_t regs[GUEST_ROOT_ADDRESS_CELLS+GUEST_ROOT_SIZE_CELLS];
be32 *cells = ®s[0];
LOG(DEBUG, "Populating placeholder node %s", name);
- set_range(&cells, ROOT_ADDRESS_CELLS, ROOT_SIZE_CELLS, base, size);
+ set_range(&cells, GUEST_ROOT_ADDRESS_CELLS, GUEST_ROOT_SIZE_CELLS, base, size);
res = fdt_setprop_inplace(fdt, node, "reg", regs, sizeof(regs));
assert(!res);
* - All CPUs
* TODO: Handle properly the cpumask;
*/
- set_interrupt_ppi(intr, d->arch.evtchn_irq, 0xf, IRQ_TYPE_LEVEL_LOW);
+ set_interrupt_ppi(intr, d->arch.evtchn_irq, 0xf, DT_IRQ_TYPE_LEVEL_LOW);
res = fdt_property_interrupts(fdt, &intr, 1);
if ( res )
return res;
irq = timer_get_irq(TIMER_PHYS_SECURE_PPI);
dt_dprintk(" Secure interrupt %u\n", irq);
- set_interrupt_ppi(intrs[0], irq, 0xf, IRQ_TYPE_LEVEL_LOW);
+ set_interrupt_ppi(intrs[0], irq, 0xf, DT_IRQ_TYPE_LEVEL_LOW);
irq = timer_get_irq(TIMER_PHYS_NONSECURE_PPI);
dt_dprintk(" Non secure interrupt %u\n", irq);
- set_interrupt_ppi(intrs[1], irq, 0xf, IRQ_TYPE_LEVEL_LOW);
+ set_interrupt_ppi(intrs[1], irq, 0xf, DT_IRQ_TYPE_LEVEL_LOW);
irq = timer_get_irq(TIMER_VIRT_PPI);
dt_dprintk(" Virt interrupt %u\n", irq);
- set_interrupt_ppi(intrs[2], irq, 0xf, IRQ_TYPE_LEVEL_LOW);
+ set_interrupt_ppi(intrs[2], irq, 0xf, DT_IRQ_TYPE_LEVEL_LOW);
res = fdt_property_interrupts(fdt, intrs, 3);
if ( res )
--- /dev/null
+#ifndef __XEN_DEVICE_TREE_DEFS_H__
+#define __XEN_DEVICE_TREE_DEFS_H__
+
+#if defined(__XEN__) || defined(__XEN_TOOLS__)
+/*
+ * The device tree compiler (DTC) is allocating the phandle from 1 to
+ * onwards. Reserve a high value for the GIC phandle.
+ */
+#define GUEST_PHANDLE_GIC (65000)
+
+#define GUEST_ROOT_ADDRESS_CELLS 2
+#define GUEST_ROOT_SIZE_CELLS 2
+
+/**
+ * IRQ line type.
+ *
+ * DT_IRQ_TYPE_NONE - default, unspecified type
+ * DT_IRQ_TYPE_EDGE_RISING - rising edge triggered
+ * DT_IRQ_TYPE_EDGE_FALLING - falling edge triggered
+ * DT_IRQ_TYPE_EDGE_BOTH - rising and falling edge triggered
+ * DT_IRQ_TYPE_LEVEL_HIGH - high level triggered
+ * DT_IRQ_TYPE_LEVEL_LOW - low level triggered
+ * DT_IRQ_TYPE_LEVEL_MASK - Mask to filter out the level bits
+ * DT_IRQ_TYPE_SENSE_MASK - Mask for all the above bits
+ * DT_IRQ_TYPE_INVALID - Use to initialize the type
+ */
+#define DT_IRQ_TYPE_NONE 0x00000000
+#define DT_IRQ_TYPE_EDGE_RISING 0x00000001
+#define DT_IRQ_TYPE_EDGE_FALLING 0x00000002
+#define DT_IRQ_TYPE_EDGE_BOTH \
+ (DT_IRQ_TYPE_EDGE_FALLING | DT_IRQ_TYPE_EDGE_RISING)
+#define DT_IRQ_TYPE_LEVEL_HIGH 0x00000004
+#define DT_IRQ_TYPE_LEVEL_LOW 0x00000008
+#define DT_IRQ_TYPE_LEVEL_MASK \
+ (DT_IRQ_TYPE_LEVEL_LOW | DT_IRQ_TYPE_LEVEL_HIGH)
+#define DT_IRQ_TYPE_SENSE_MASK 0x0000000f
+
+#define DT_IRQ_TYPE_INVALID 0x00000010
+
+#endif
+
+#endif
#include <asm/byteorder.h>
#include <asm/device.h>
#include <public/xen.h>
+#include <public/device_tree_defs.h>
#include <xen/kernel.h>
#include <xen/init.h>
#include <xen/string.h>
uint32_t args[MAX_PHANDLE_ARGS];
};
-/**
- * IRQ line type.
- *
- * IRQ_TYPE_NONE - default, unspecified type
- * IRQ_TYPE_EDGE_RISING - rising edge triggered
- * IRQ_TYPE_EDGE_FALLING - falling edge triggered
- * IRQ_TYPE_EDGE_BOTH - rising and falling edge triggered
- * IRQ_TYPE_LEVEL_HIGH - high level triggered
- * IRQ_TYPE_LEVEL_LOW - low level triggered
- * IRQ_TYPE_LEVEL_MASK - Mask to filter out the level bits
- * IRQ_TYPE_SENSE_MASK - Mask for all the above bits
- * IRQ_TYPE_INVALID - Use to initialize the type
- */
-#define IRQ_TYPE_NONE 0x00000000
-#define IRQ_TYPE_EDGE_RISING 0x00000001
-#define IRQ_TYPE_EDGE_FALLING 0x00000002
-#define IRQ_TYPE_EDGE_BOTH \
- (IRQ_TYPE_EDGE_FALLING | IRQ_TYPE_EDGE_RISING)
-#define IRQ_TYPE_LEVEL_HIGH 0x00000004
-#define IRQ_TYPE_LEVEL_LOW 0x00000008
-#define IRQ_TYPE_LEVEL_MASK \
- (IRQ_TYPE_LEVEL_LOW | IRQ_TYPE_LEVEL_HIGH)
-#define IRQ_TYPE_SENSE_MASK 0x0000000f
-
-#define IRQ_TYPE_INVALID 0x00000010
-
/**
* dt_irq - describe an IRQ in the device tree
* @irq: IRQ number
- * @type: IRQ type (see IRQ_TYPE_*)
+ * @type: IRQ type (see DT_IRQ_TYPE_*)
*
* This structure is returned when an interrupt is mapped.
*/
unsigned int type;
};
-/* If type == IRQ_TYPE_NONE, assume we use level triggered */
+/* If type == DT_IRQ_TYPE_NONE, assume we use level triggered */
static inline bool_t dt_irq_is_level_triggered(const struct dt_irq *irq)
{
unsigned int type = irq->type;
- return (type & IRQ_TYPE_LEVEL_MASK) || (type == IRQ_TYPE_NONE);
+ return (type & DT_IRQ_TYPE_LEVEL_MASK) || (type == DT_IRQ_TYPE_NONE);
}
/**