]> pilppa.org Git - linux-2.6-omap-h63xx.git/blobdiff - arch/powerpc/kernel/prom.c
powerpc/pseries: Verify CMO memory entitlement updates with virtual I/O
[linux-2.6-omap-h63xx.git] / arch / powerpc / kernel / prom.c
index 8a9359ae471853688e509d42bd2999b78d1a87ca..87d83c56b31ec1671007195ce092523535108bb9 100644 (file)
@@ -53,6 +53,7 @@
 #include <asm/pci-bridge.h>
 #include <asm/phyp_dump.h>
 #include <asm/kexec.h>
+#include <mm/mmu_decl.h>
 
 #ifdef DEBUG
 #define DBG(fmt...) printk(KERN_ERR fmt)
@@ -608,6 +609,10 @@ static struct feature_property {
        {"altivec", 0, CPU_FTR_ALTIVEC, PPC_FEATURE_HAS_ALTIVEC},
        {"ibm,vmx", 1, CPU_FTR_ALTIVEC, PPC_FEATURE_HAS_ALTIVEC},
 #endif /* CONFIG_ALTIVEC */
+#ifdef CONFIG_VSX
+       /* Yes, this _really_ is ibm,vmx == 2 to enable VSX */
+       {"ibm,vmx", 2, CPU_FTR_VSX, PPC_FEATURE_HAS_VSX},
+#endif /* CONFIG_VSX */
 #ifdef CONFIG_PPC64
        {"ibm,dfp", 1, 0, PPC_FEATURE_HAS_DFP},
        {"ibm,purr", 1, CPU_FTR_PURR, 0},
@@ -978,7 +983,10 @@ static int __init early_init_dt_scan_memory(unsigned long node,
                }
 #endif
                lmb_add(base, size);
+
+               memstart_addr = min((u64)memstart_addr, base);
        }
+
        return 0;
 }
 
@@ -1332,12 +1340,14 @@ EXPORT_SYMBOL(of_node_put);
  */
 void of_attach_node(struct device_node *np)
 {
-       write_lock(&devtree_lock);
+       unsigned long flags;
+
+       write_lock_irqsave(&devtree_lock, flags);
        np->sibling = np->parent->child;
        np->allnext = allnodes;
        np->parent->child = np;
        allnodes = np;
-       write_unlock(&devtree_lock);
+       write_unlock_irqrestore(&devtree_lock, flags);
 }
 
 /*
@@ -1348,8 +1358,9 @@ void of_attach_node(struct device_node *np)
 void of_detach_node(struct device_node *np)
 {
        struct device_node *parent;
+       unsigned long flags;
 
-       write_lock(&devtree_lock);
+       write_lock_irqsave(&devtree_lock, flags);
 
        parent = np->parent;
        if (!parent)
@@ -1380,7 +1391,7 @@ void of_detach_node(struct device_node *np)
        of_node_set_flag(np, OF_DETACHED);
 
 out_unlock:
-       write_unlock(&devtree_lock);
+       write_unlock_irqrestore(&devtree_lock, flags);
 }
 
 #ifdef CONFIG_PPC_PSERIES
@@ -1461,20 +1472,21 @@ __initcall(prom_reconfig_setup);
 int prom_add_property(struct device_node* np, struct property* prop)
 {
        struct property **next;
+       unsigned long flags;
 
        prop->next = NULL;      
-       write_lock(&devtree_lock);
+       write_lock_irqsave(&devtree_lock, flags);
        next = &np->properties;
        while (*next) {
                if (strcmp(prop->name, (*next)->name) == 0) {
                        /* duplicate ! don't insert it */
-                       write_unlock(&devtree_lock);
+                       write_unlock_irqrestore(&devtree_lock, flags);
                        return -1;
                }
                next = &(*next)->next;
        }
        *next = prop;
-       write_unlock(&devtree_lock);
+       write_unlock_irqrestore(&devtree_lock, flags);
 
 #ifdef CONFIG_PROC_DEVICETREE
        /* try to add to proc as well if it was initialized */
@@ -1494,9 +1506,10 @@ int prom_add_property(struct device_node* np, struct property* prop)
 int prom_remove_property(struct device_node *np, struct property *prop)
 {
        struct property **next;
+       unsigned long flags;
        int found = 0;
 
-       write_lock(&devtree_lock);
+       write_lock_irqsave(&devtree_lock, flags);
        next = &np->properties;
        while (*next) {
                if (*next == prop) {
@@ -1509,7 +1522,7 @@ int prom_remove_property(struct device_node *np, struct property *prop)
                }
                next = &(*next)->next;
        }
-       write_unlock(&devtree_lock);
+       write_unlock_irqrestore(&devtree_lock, flags);
 
        if (!found)
                return -ENODEV;
@@ -1535,9 +1548,10 @@ int prom_update_property(struct device_node *np,
                         struct property *oldprop)
 {
        struct property **next;
+       unsigned long flags;
        int found = 0;
 
-       write_lock(&devtree_lock);
+       write_lock_irqsave(&devtree_lock, flags);
        next = &np->properties;
        while (*next) {
                if (*next == oldprop) {
@@ -1551,7 +1565,7 @@ int prom_update_property(struct device_node *np,
                }
                next = &(*next)->next;
        }
-       write_unlock(&devtree_lock);
+       write_unlock_irqrestore(&devtree_lock, flags);
 
        if (!found)
                return -ENODEV;