Commit 4726b7b5 authored by Kent Yoder's avatar Kent Yoder Committed by Benjamin Herrenschmidt

powerpc/pseries: Add pseries update notifier for OFDT prop changes

This adds an update notifier mechanism for changes to properties in the
device tree.  One use of this would be a device driver that needs to act
on changes to it's properties in the device tree after a live migration
or a dynamic activation that is triggered by updates to ofdt properties.
Signed-off-by: default avatarRobert Jennings <rcj@linux.vnet.ibm.com>
Signed-off-by: default avatarKent Yoder <key@linux.vnet.ibm.com>
Signed-off-by: default avatarBenjamin Herrenschmidt <benh@kernel.crashing.org>
parent 4d6e0fa1
...@@ -13,6 +13,18 @@ ...@@ -13,6 +13,18 @@
#define PSERIES_RECONFIG_REMOVE 0x0002 #define PSERIES_RECONFIG_REMOVE 0x0002
#define PSERIES_DRCONF_MEM_ADD 0x0003 #define PSERIES_DRCONF_MEM_ADD 0x0003
#define PSERIES_DRCONF_MEM_REMOVE 0x0004 #define PSERIES_DRCONF_MEM_REMOVE 0x0004
#define PSERIES_UPDATE_PROPERTY 0x0005
/**
* pSeries_reconfig_notify - Notifier value structure for OFDT property updates
*
* @node: Device tree node which owns the property being updated
* @property: Updated property
*/
struct pSeries_reconfig_prop_update {
struct device_node *node;
struct property *property;
};
#ifdef CONFIG_PPC_PSERIES #ifdef CONFIG_PPC_PSERIES
extern int pSeries_reconfig_notifier_register(struct notifier_block *); extern int pSeries_reconfig_notifier_register(struct notifier_block *);
......
...@@ -103,11 +103,13 @@ int pSeries_reconfig_notifier_register(struct notifier_block *nb) ...@@ -103,11 +103,13 @@ int pSeries_reconfig_notifier_register(struct notifier_block *nb)
{ {
return blocking_notifier_chain_register(&pSeries_reconfig_chain, nb); return blocking_notifier_chain_register(&pSeries_reconfig_chain, nb);
} }
EXPORT_SYMBOL_GPL(pSeries_reconfig_notifier_register);
void pSeries_reconfig_notifier_unregister(struct notifier_block *nb) void pSeries_reconfig_notifier_unregister(struct notifier_block *nb)
{ {
blocking_notifier_chain_unregister(&pSeries_reconfig_chain, nb); blocking_notifier_chain_unregister(&pSeries_reconfig_chain, nb);
} }
EXPORT_SYMBOL_GPL(pSeries_reconfig_notifier_unregister);
int pSeries_reconfig_notify(unsigned long action, void *p) int pSeries_reconfig_notify(unsigned long action, void *p)
{ {
...@@ -426,6 +428,7 @@ static int do_remove_property(char *buf, size_t bufsize) ...@@ -426,6 +428,7 @@ static int do_remove_property(char *buf, size_t bufsize)
static int do_update_property(char *buf, size_t bufsize) static int do_update_property(char *buf, size_t bufsize)
{ {
struct device_node *np; struct device_node *np;
struct pSeries_reconfig_prop_update upd_value;
unsigned char *value; unsigned char *value;
char *name, *end, *next_prop; char *name, *end, *next_prop;
int rc, length; int rc, length;
...@@ -454,6 +457,10 @@ static int do_update_property(char *buf, size_t bufsize) ...@@ -454,6 +457,10 @@ static int do_update_property(char *buf, size_t bufsize)
return -ENODEV; return -ENODEV;
} }
upd_value.node = np;
upd_value.property = newprop;
pSeries_reconfig_notify(PSERIES_UPDATE_PROPERTY, &upd_value);
rc = prom_update_property(np, newprop, oldprop); rc = prom_update_property(np, newprop, oldprop);
if (rc) if (rc)
return rc; return rc;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment