Merge to Fedora kernel-2.6.18-1.2224_FC5 patched with stable patch-2.6.18.1-vs2.0...
[linux-2.6.git] / include / asm-ppc64 / prom.h
index c39e115..04b1a84 100644 (file)
 #define PTRUNRELOC(x)   ((typeof(x))((unsigned long)(x) + offset))
 #define RELOC(x)        (*PTRRELOC(&(x)))
 
-#define LONG_LSW(X) (((unsigned long)X) & 0xffffffff)
-#define LONG_MSW(X) (((unsigned long)X) >> 32)
+/* Definitions used by the flattened device tree */
+#define OF_DT_HEADER           0xd00dfeed      /* 4: version, 4: total size */
+#define OF_DT_BEGIN_NODE       0x1             /* Start node: full name */
+#define OF_DT_END_NODE         0x2             /* End node */
+#define OF_DT_PROP             0x3             /* Property: name off, size, content */
+#define OF_DT_END              0x9
+
+#define OF_DT_VERSION          1
+
+/*
+ * This is what gets passed to the kernel by prom_init or kexec
+ *
+ * The dt struct contains the device tree structure, full pathes and
+ * property contents. The dt strings contain a separate block with just
+ * the strings for the property names, and is fully page aligned and
+ * self contained in a page, so that it can be kept around by the kernel,
+ * each property name appears only once in this page (cheap compression)
+ *
+ * the mem_rsvmap contains a map of reserved ranges of physical memory,
+ * passing it here instead of in the device-tree itself greatly simplifies
+ * the job of everybody. It's just a list of u64 pairs (base/size) that
+ * ends when size is 0
+ */
+struct boot_param_header
+{
+       u32     magic;                  /* magic word OF_DT_HEADER */
+       u32     totalsize;              /* total size of DT block */
+       u32     off_dt_struct;          /* offset to structure */
+       u32     off_dt_strings;         /* offset to strings */
+       u32     off_mem_rsvmap;         /* offset to memory reserve map */
+       u32     version;                /* format version */
+       u32     last_comp_version;      /* last compatible version */
+       /* version 2 fields below */
+       u32     boot_cpuid_phys;        /* Which physical CPU id we're booting on */
+};
+
 
-typedef u32 phandle;
-typedef void *ihandle;
-typedef u32 phandle32;
-typedef u32 ihandle32;
 
-extern char *prom_display_paths[];
-extern unsigned int prom_num_displays;
+typedef u32 phandle;
+typedef u32 ihandle;
 
 struct address_range {
        unsigned long space;
@@ -60,40 +90,6 @@ struct isa_range {
        unsigned int size;
 };
 
-struct pci_range32 {
-       struct pci_address child_addr;
-       unsigned int  parent_addr;
-       unsigned long size; 
-};
-
-struct pci_range64 {
-       struct pci_address child_addr;
-       unsigned long parent_addr;
-        unsigned long size; 
-};
-
-union pci_range {
-       struct {
-               struct pci_address addr;
-               u32 phys;
-               u32 size_hi;
-       } pci32;
-       struct {
-               struct pci_address addr;
-               u32 phys_hi;
-               u32 phys_lo;
-               u32 size_hi;
-               u32 size_lo;
-       } pci64;
-};
-
-struct of_tce_table {
-       phandle node;
-       unsigned long base;
-       unsigned long size;
-};
-extern struct of_tce_table of_tce_table[];
-
 struct reg_property {
        unsigned long address;
        unsigned long size;
@@ -109,19 +105,6 @@ struct reg_property64 {
        unsigned long size;
 };
 
-struct reg_property_pmac {
-       unsigned int address_hi;
-       unsigned int address_lo;
-       unsigned int size;
-};
-
-struct translation_property {
-       unsigned long virt;
-       unsigned long size;
-       unsigned long phys;
-       unsigned int flags;
-};
-
 struct property {
        char    *name;
        int     length;
@@ -136,6 +119,7 @@ struct property {
  */
 struct pci_controller;
 struct iommu_table;
+
 struct device_node {
        char    *name;
        char    *type;
@@ -151,10 +135,9 @@ struct device_node {
        int     busno;                  /* for pci devices */
        int     bussubno;               /* for pci devices */
        int     devfn;                  /* for pci devices */
-#define DN_STATUS_BIST_FAILED (1<<0)
-       int     status;                 /* Current device status (non-zero is bad) */
        int     eeh_mode;               /* See eeh.h for possible EEH_MODEs */
        int     eeh_config_addr;
+       int     pci_ext_config_space;   /* for pci devices */
        struct  pci_controller *phb;    /* for pci devices */
        struct  iommu_table *iommu_table;       /* for phb's or bridges */
 
@@ -164,19 +147,16 @@ struct device_node {
        struct  device_node *sibling;
        struct  device_node *next;      /* next device of same type */
        struct  device_node *allnext;   /* next in list of all nodes */
-       struct  proc_dir_entry *pde;       /* this node's proc directory */
-       struct  proc_dir_entry *name_link; /* name symlink */
-       struct  proc_dir_entry *addr_link; /* addr symlink */
-       atomic_t _users;                 /* reference count */
+       struct  proc_dir_entry *pde;    /* this node's proc directory */
+       struct  kref kref;
        unsigned long _flags;
 };
 
+extern struct device_node *of_chosen;
+
 /* flag descriptions */
-#define OF_STALE   0 /* node is slated for deletion */
 #define OF_DYNAMIC 1 /* node and properties were allocated via kmalloc */
 
-#define OF_IS_STALE(x) test_bit(OF_STALE, &x->_flags)
-#define OF_MARK_STALE(x) set_bit(OF_STALE, &x->_flags)
 #define OF_IS_DYNAMIC(x) test_bit(OF_DYNAMIC, &x->_flags)
 #define OF_MARK_DYNAMIC(x) set_bit(OF_DYNAMIC, &x->_flags)
 
@@ -192,43 +172,6 @@ static inline void set_node_proc_entry(struct device_node *dn, struct proc_dir_e
        dn->pde = de;
 }
 
-static void inline set_node_name_link(struct device_node *dn, struct proc_dir_entry *de)
-{
-       dn->name_link = de;
-}
-
-static void inline set_node_addr_link(struct device_node *dn, struct proc_dir_entry *de)
-{
-       dn->addr_link = de;
-}
-
-typedef u32 prom_arg_t;
-
-struct prom_args {
-        u32 service;
-        u32 nargs;
-        u32 nret;
-        prom_arg_t args[10];
-        prom_arg_t *rets;     /* Pointer to return values in args[16]. */
-};
-
-struct prom_t {
-       unsigned long entry;
-       ihandle root;
-       ihandle chosen;
-       int cpu;
-       ihandle stdout;
-       ihandle disp_node;
-       struct prom_args args;
-       unsigned long version;
-       unsigned long encode_phys_size;
-       struct bi_record *bi_recs;
-};
-
-extern struct prom_t prom;
-extern char *of_stdout_device;
-
-extern int boot_cpuid;
 
 /* OBSOLETE: Old stlye node lookup */
 extern struct device_node *find_devices(const char *name);
@@ -246,6 +189,7 @@ extern struct device_node *of_find_node_by_type(struct device_node *from,
 extern struct device_node *of_find_compatible_node(struct device_node *from,
        const char *type, const char *compat);
 extern struct device_node *of_find_node_by_path(const char *path);
+extern struct device_node *of_find_node_by_phandle(phandle handle);
 extern struct device_node *of_find_all_nodes(struct device_node *prev);
 extern struct device_node *of_get_parent(const struct device_node *node);
 extern struct device_node *of_get_next_child(const struct device_node *node,
@@ -254,13 +198,12 @@ extern struct device_node *of_node_get(struct device_node *node);
 extern void of_node_put(struct device_node *node);
 
 /* For updating the device tree at runtime */
-extern int of_add_node(const char *path, struct property *proplist);
-extern int of_remove_node(struct device_node *np);
+extern void of_attach_node(struct device_node *);
+extern void of_detach_node(const struct device_node *);
 
 /* Other Prototypes */
 extern unsigned long prom_init(unsigned long, unsigned long, unsigned long,
        unsigned long, unsigned long);
-extern void relocate_nodes(void);
 extern void finish_device_tree(void);
 extern int device_is_compatible(struct device_node *device, const char *);
 extern int machine_is_compatible(const char *compat);
@@ -269,6 +212,7 @@ extern unsigned char *get_property(struct device_node *node, const char *name,
 extern void print_properties(struct device_node *node);
 extern int prom_n_addr_cells(struct device_node* np);
 extern int prom_n_size_cells(struct device_node* np);
+extern int prom_n_intr_cells(struct device_node* np);
 extern void prom_get_irq_senses(unsigned char *senses, int off, int max);
 extern void prom_add_property(struct device_node* np, struct property* prop);