@@ -1454,6 +1454,9 @@ static unsigned long __init unflatten_dt_node(const void *fdt,
((char *)pp->value)[sz - 1] = 0;
dt_dprintk("fixed up name for %s -> %s\n", pathp,
(char *)pp->value);
+ /* Generic device initialization */
+ np->dev.type = DEV_DT;
+ np->dev.of_node = np;
}
}
if ( allnextpp )
@@ -2,8 +2,34 @@
#define __ASM_ARM_DEVICE_H
#include <xen/init.h>
+
+enum device_type
+{
+ DEV_DT,
+};
+
+struct dev_archdata {
+ void *iommu; /* IOMMU private data */
+};
+
+/* struct device - The basic device structure */
+struct device
+{
+ enum device_type type;
+#ifdef HAS_DEVICE_TREE
+ struct dt_device_node *of_node; /* Used by drivers imported from Linux */
+#endif
+ struct dev_archdata archdata;
+};
+
+typedef struct device device_t;
+
#include <xen/device_tree.h>
+/* TODO: Correctly implement dev_is_pci when PCI is supported on ARM */
+#define dev_is_pci(dev) ((void)(dev), 0)
+#define dev_is_dt(dev) ((dev->type == DEV_DT)
+
enum device_class
{
DEVICE_SERIAL,
new file mode 100644
@@ -0,0 +1,25 @@
+#ifndef __ASM_X86_DEVICE_H
+#define __ASM_X86_DEVICE_H
+
+#include <xen/pci.h>
+
+/*
+ * x86 only supports PCI. Therefore it's possible to directly use
+ * pci_dev to avoid adding new field.
+ */
+
+typedef struct pci_dev device_t;
+
+#define dev_is_pci(dev) ((void)(dev), 1)
+#define pci_to_dev(pci) (pci)
+
+#endif /* __ASM_X86_DEVICE_H */
+
+/*
+ * Local variables:
+ * mode: C
+ * c-file-style: "BSD"
+ * c-basic-offset: 4
+ * indent-tabs-mode: nil
+ * End:
+ */
@@ -11,7 +11,9 @@
#define __XEN_DEVICE_TREE_H__
#include <asm/byteorder.h>
+#include <asm/device.h>
#include <public/xen.h>
+#include <xen/kernel.h>
#include <xen/init.h>
#include <xen/string.h>
#include <xen/types.h>
@@ -80,8 +82,19 @@ struct dt_device_node {
/* IOMMU specific fields */
bool is_protected;
struct list_head domain_list;
+
+ struct device dev;
};
+#define dt_to_dev(dt_node) (&(dt_node)->dev)
+
+static inline struct dt_device_node *dev_to_dt(struct device *dev)
+{
+ ASSERT(dev->type == DEV_DT);
+
+ return container_of(dev, struct dt_device_node, dev);
+}
+
#define MAX_PHANDLE_ARGS 16
struct dt_phandle_args {
struct dt_device_node *np;
@@ -25,6 +25,7 @@
#include <xen/pci.h>
#include <public/hvm/ioreq.h>
#include <public/domctl.h>
+#include <asm/device.h>
#include <asm/iommu.h>
extern bool_t iommu_enable, iommu_enabled;
@@ -13,6 +13,7 @@
#include <xen/irq.h>
#include <xen/pci_regs.h>
#include <xen/pfn.h>
+#include <asm/device.h>
#include <asm/pci.h>
/*