[PATCH2/11] Add PRRN Event Handler
From: Nathan Fontenot <hidden>
Date: 2013-03-09 04:00:19
From: Jesse Larrew <redacted> A PRRN event is signaled via the RTAS event-scan mechanism, which returns a Hot Plug Event message "fixed part" indicating "Platform Resource Reassignment". In response to the Hot Plug Event message, we must call ibm,update-nodes to determine which resources were reassigned and then ibm,update-properties to obtain the new affinity information about those resources. The PRRN event-scan RTAS message contains only the "fixed part" with the "Type" field set to the value 160 and no Extended Event Log. The four-byte Extended Event Log Length field is repurposed (since no Extended Event Log message is included) to pass the "scope" parameter that causes the ibm,update-nodes to return the nodes affected by the specific resource reassignment. This patch adds a handler in rtasd for PRRN RTAS events. The function pseries_devicetree_update() (from mobility.c) is used to make the ibm,update-nodes/ibm,update-properties RTAS calls. Updating the NUMA maps (handled by a subsequent patch) will require significant processing, so pseries_devicetree_update() is called from an asynchronous workqueue to allow rtasd to continue processing events. Signed-off-by: Nathan Fontenot <redacted> --- arch/powerpc/include/asm/rtas.h | 2 ++ arch/powerpc/kernel/rtasd.c | 35 ++++++++++++++++++++++++++++++++++- 2 files changed, 36 insertions(+), 1 deletion(-) Index: powerpc/arch/powerpc/include/asm/rtas.h ===================================================================
--- powerpc.orig/arch/powerpc/include/asm/rtas.h 2013-03-08 19:56:13.000000000 -0600
+++ powerpc/arch/powerpc/include/asm/rtas.h 2013-03-08 19:56:48.000000000 -0600@@ -143,6 +143,8 @@ #define RTAS_TYPE_PMGM_TIME_ALARM 0x6f #define RTAS_TYPE_PMGM_CONFIG_CHANGE 0x70 #define RTAS_TYPE_PMGM_SERVICE_PROC 0x71 +/* Platform Resource Reassignment Notification */ +#define RTAS_TYPE_PRRN 0xA0 /* RTAS check-exception vector offset */ #define RTAS_VECTOR_EXTERNAL_INTERRUPT 0x500
Index: powerpc/arch/powerpc/kernel/rtasd.c ===================================================================
--- powerpc.orig/arch/powerpc/kernel/rtasd.c 2013-03-08 19:23:06.000000000 -0600
+++ powerpc/arch/powerpc/kernel/rtasd.c 2013-03-08 19:56:48.000000000 -0600@@ -87,6 +87,8 @@ return "Resource Deallocation Event"; case RTAS_TYPE_DUMP: return "Dump Notification Event"; + case RTAS_TYPE_PRRN: + return "Platform Resource Reassignment Event"; } return rtas_type[0];
@@ -265,7 +267,38 @@ spin_unlock_irqrestore(&rtasd_log_lock, s); return; } +} + +static s32 update_scope; + +static void prrn_work_fn(struct work_struct *work) +{ + /* + * For PRRN, we must pass the negative of the scope value in + * the RTAS event. + */ + pseries_devicetree_update(-update_scope); +} +static DECLARE_WORK(prrn_work, prrn_work_fn); + +void prrn_schedule_update(u32 scope) +{ + flush_work(&prrn_work); + update_scope = scope; + schedule_work(&prrn_work); +} + +static void pseries_handle_event(const struct rtas_error_log *log) +{ + pSeries_log_error((char *)log, ERR_TYPE_RTAS_LOG, 0); + + if (log->type == RTAS_TYPE_PRRN) + /* For PRRN Events the extended log length is used to denote + * the scope for calling rtas update-nodes. + */ + prrn_schedule_update(log->extended_log_length); + return; } static int rtas_log_open(struct inode * inode, struct file * file)
@@ -389,7 +422,7 @@ } if (error == 0) - pSeries_log_error(logdata, ERR_TYPE_RTAS_LOG, 0); + pseries_handle_event((struct rtas_error_log *)logdata); } while(error == 0); }