|
@@ -23,6 +23,9 @@
|
|
|
#include <linux/cpuset.h>
|
|
|
#include <linux/node.h>
|
|
|
#include <linux/stop_machine.h>
|
|
|
+#include <linux/proc_fs.h>
|
|
|
+#include <linux/seq_file.h>
|
|
|
+#include <linux/uaccess.h>
|
|
|
#include <asm/sparsemem.h>
|
|
|
#include <asm/prom.h>
|
|
|
#include <asm/smp.h>
|
|
@@ -1585,7 +1588,6 @@ int start_topology_update(void)
|
|
|
|
|
|
return rc;
|
|
|
}
|
|
|
-__initcall(start_topology_update);
|
|
|
|
|
|
/*
|
|
|
* Disable polling for VPHN associativity changes.
|
|
@@ -1604,4 +1606,62 @@ int stop_topology_update(void)
|
|
|
|
|
|
return rc;
|
|
|
}
|
|
|
+
|
|
|
+int prrn_is_enabled(void)
|
|
|
+{
|
|
|
+ return prrn_enabled;
|
|
|
+}
|
|
|
+
|
|
|
+static int topology_read(struct seq_file *file, void *v)
|
|
|
+{
|
|
|
+ if (vphn_enabled || prrn_enabled)
|
|
|
+ seq_puts(file, "on\n");
|
|
|
+ else
|
|
|
+ seq_puts(file, "off\n");
|
|
|
+
|
|
|
+ return 0;
|
|
|
+}
|
|
|
+
|
|
|
+static int topology_open(struct inode *inode, struct file *file)
|
|
|
+{
|
|
|
+ return single_open(file, topology_read, NULL);
|
|
|
+}
|
|
|
+
|
|
|
+static ssize_t topology_write(struct file *file, const char __user *buf,
|
|
|
+ size_t count, loff_t *off)
|
|
|
+{
|
|
|
+ char kbuf[4]; /* "on" or "off" plus null. */
|
|
|
+ int read_len;
|
|
|
+
|
|
|
+ read_len = count < 3 ? count : 3;
|
|
|
+ if (copy_from_user(kbuf, buf, read_len))
|
|
|
+ return -EINVAL;
|
|
|
+
|
|
|
+ kbuf[read_len] = '\0';
|
|
|
+
|
|
|
+ if (!strncmp(kbuf, "on", 2))
|
|
|
+ start_topology_update();
|
|
|
+ else if (!strncmp(kbuf, "off", 3))
|
|
|
+ stop_topology_update();
|
|
|
+ else
|
|
|
+ return -EINVAL;
|
|
|
+
|
|
|
+ return count;
|
|
|
+}
|
|
|
+
|
|
|
+static const struct file_operations topology_ops = {
|
|
|
+ .read = seq_read,
|
|
|
+ .write = topology_write,
|
|
|
+ .open = topology_open,
|
|
|
+ .release = single_release
|
|
|
+};
|
|
|
+
|
|
|
+static int topology_update_init(void)
|
|
|
+{
|
|
|
+ start_topology_update();
|
|
|
+ proc_create("powerpc/topology_updates", 644, NULL, &topology_ops);
|
|
|
+
|
|
|
+ return 0;
|
|
|
+}
|
|
|
+device_initcall(topology_update_init);
|
|
|
#endif /* CONFIG_PPC_SPLPAR */
|