Michal Suchanek ac7cae
From e978a3ccaa714b5ff125857d2cbecbb6fdf6c094 Mon Sep 17 00:00:00 2001
Michal Suchanek ac7cae
From: Nathan Lynch <nathanl@linux.ibm.com>
Michal Suchanek ac7cae
Date: Fri, 12 Jun 2020 00:12:38 -0500
Michal Suchanek ac7cae
Subject: [PATCH] powerpc/pseries: remove obsolete memory hotplug DT notifier
Michal Suchanek ac7cae
 code
Michal Suchanek ac7cae
Michal Suchanek ac7cae
References: bsc#1181674 ltc#189159
Michal Suchanek ac7cae
Patch-mainline: v5.9-rc1
Michal Suchanek ac7cae
Git-commit: e978a3ccaa714b5ff125857d2cbecbb6fdf6c094
Michal Suchanek ac7cae
Michal Suchanek ac7cae
pseries_update_drconf_memory() runs from a DT notifier in response to
Michal Suchanek ac7cae
an update to the ibm,dynamic-memory property of the
Michal Suchanek ac7cae
/ibm,dynamic-reconfiguration-memory node. This property is an older
Michal Suchanek ac7cae
less compact format than the ibm,dynamic-memory-v2 property used in
Michal Suchanek ac7cae
most currently supported firmwares. There has never been an equivalent
Michal Suchanek ac7cae
function for the v2 property.
Michal Suchanek ac7cae
Michal Suchanek ac7cae
pseries_update_drconf_memory() compares the 'assigned' flag for each
Michal Suchanek ac7cae
LMB in the old vs new properties and adds or removes the block
Michal Suchanek ac7cae
accordingly. However it appears to be of no actual utility:
Michal Suchanek ac7cae
Michal Suchanek ac7cae
* Partition suspension and PRRNs are specified only to change LMBs'
Michal Suchanek ac7cae
  NUMA affinity information. This notifier should be a no-op for those
Michal Suchanek ac7cae
  scenarios since the assigned flags should not change.
Michal Suchanek ac7cae
Michal Suchanek ac7cae
* The memory hotplug/DLPAR path has a hack which short-circuits
Michal Suchanek ac7cae
  execution of the notifier:
Michal Suchanek ac7cae
     dlpar_memory()
Michal Suchanek ac7cae
        ...
Michal Suchanek ac7cae
        rtas_hp_event = true;
Michal Suchanek ac7cae
        drmem_update_dt()
Michal Suchanek ac7cae
           of_update_property()
Michal Suchanek ac7cae
              pseries_memory_notifier()
Michal Suchanek ac7cae
                 pseries_update_drconf_memory()
Michal Suchanek ac7cae
                    if (rtas_hp_event) return;
Michal Suchanek ac7cae
Michal Suchanek ac7cae
So this code only makes sense as a relic of the time when more of the
Michal Suchanek ac7cae
DLPAR workflow took place in user space. I don't see a purpose for it
Michal Suchanek ac7cae
now.
Michal Suchanek ac7cae
Michal Suchanek ac7cae
Signed-off-by: Nathan Lynch <nathanl@linux.ibm.com>
Michal Suchanek ac7cae
Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>
Michal Suchanek ac7cae
Link: https://lore.kernel.org/r/20200612051238.1007764-19-nathanl@linux.ibm.com
Michal Suchanek ac7cae
Acked-by: Michal Suchanek <msuchanek@suse.de>
Michal Suchanek ac7cae
---
Michal Suchanek ac7cae
 .../platforms/pseries/hotplug-memory.c        | 65 +------------------
Michal Suchanek ac7cae
 1 file changed, 1 insertion(+), 64 deletions(-)
Michal Suchanek ac7cae
Michal Suchanek ac7cae
diff --git a/arch/powerpc/platforms/pseries/hotplug-memory.c b/arch/powerpc/platforms/pseries/hotplug-memory.c
Michal Suchanek ac7cae
index 67ece3ac9ac2..73a5dcd977e1 100644
Michal Suchanek ac7cae
--- a/arch/powerpc/platforms/pseries/hotplug-memory.c
Michal Suchanek ac7cae
+++ b/arch/powerpc/platforms/pseries/hotplug-memory.c
Michal Suchanek ac7cae
@@ -22,8 +22,6 @@
Michal Suchanek ac7cae
 #include <asm/drmem.h>
Michal Suchanek ac7cae
 #include "pseries.h"
Michal Suchanek ac7cae
 
Michal Suchanek ac7cae
-static bool rtas_hp_event;
Michal Suchanek ac7cae
-
Michal Suchanek ac7cae
 unsigned long pseries_memory_block_size(void)
Michal Suchanek ac7cae
 {
Michal Suchanek ac7cae
 	struct device_node *np;
Michal Suchanek ac7cae
@@ -871,11 +869,8 @@ int dlpar_memory(struct pseries_hp_errorlog *hp_elog)
Michal Suchanek ac7cae
 		break;
Michal Suchanek ac7cae
 	}
Michal Suchanek ac7cae
 
Michal Suchanek ac7cae
-	if (!rc) {
Michal Suchanek ac7cae
-		rtas_hp_event = true;
Michal Suchanek ac7cae
+	if (!rc)
Michal Suchanek ac7cae
 		rc = drmem_update_dt();
Michal Suchanek ac7cae
-		rtas_hp_event = false;
Michal Suchanek ac7cae
-	}
Michal Suchanek ac7cae
 
Michal Suchanek ac7cae
 	unlock_device_hotplug();
Michal Suchanek ac7cae
 	return rc;
Michal Suchanek ac7cae
@@ -911,60 +906,6 @@ static int pseries_add_mem_node(struct device_node *np)
Michal Suchanek ac7cae
 	return (ret < 0) ? -EINVAL : 0;
Michal Suchanek ac7cae
 }
Michal Suchanek ac7cae
 
Michal Suchanek ac7cae
-static int pseries_update_drconf_memory(struct of_reconfig_data *pr)
Michal Suchanek ac7cae
-{
Michal Suchanek ac7cae
-	struct of_drconf_cell_v1 *new_drmem, *old_drmem;
Michal Suchanek ac7cae
-	unsigned long memblock_size;
Michal Suchanek ac7cae
-	u32 entries;
Michal Suchanek ac7cae
-	__be32 *p;
Michal Suchanek ac7cae
-	int i, rc = -EINVAL;
Michal Suchanek ac7cae
-
Michal Suchanek ac7cae
-	if (rtas_hp_event)
Michal Suchanek ac7cae
-		return 0;
Michal Suchanek ac7cae
-
Michal Suchanek ac7cae
-	memblock_size = pseries_memory_block_size();
Michal Suchanek ac7cae
-	if (!memblock_size)
Michal Suchanek ac7cae
-		return -EINVAL;
Michal Suchanek ac7cae
-
Michal Suchanek ac7cae
-	if (!pr->old_prop)
Michal Suchanek ac7cae
-		return 0;
Michal Suchanek ac7cae
-
Michal Suchanek ac7cae
-	p = (__be32 *) pr->old_prop->value;
Michal Suchanek ac7cae
-	if (!p)
Michal Suchanek ac7cae
-		return -EINVAL;
Michal Suchanek ac7cae
-
Michal Suchanek ac7cae
-	/* The first int of the property is the number of lmb's described
Michal Suchanek ac7cae
-	 * by the property. This is followed by an array of of_drconf_cell
Michal Suchanek ac7cae
-	 * entries. Get the number of entries and skip to the array of
Michal Suchanek ac7cae
-	 * of_drconf_cell's.
Michal Suchanek ac7cae
-	 */
Michal Suchanek ac7cae
-	entries = be32_to_cpu(*p++);
Michal Suchanek ac7cae
-	old_drmem = (struct of_drconf_cell_v1 *)p;
Michal Suchanek ac7cae
-
Michal Suchanek ac7cae
-	p = (__be32 *)pr->prop->value;
Michal Suchanek ac7cae
-	p++;
Michal Suchanek ac7cae
-	new_drmem = (struct of_drconf_cell_v1 *)p;
Michal Suchanek ac7cae
-
Michal Suchanek ac7cae
-	for (i = 0; i < entries; i++) {
Michal Suchanek ac7cae
-		if ((be32_to_cpu(old_drmem[i].flags) & DRCONF_MEM_ASSIGNED) &&
Michal Suchanek ac7cae
-		    (!(be32_to_cpu(new_drmem[i].flags) & DRCONF_MEM_ASSIGNED))) {
Michal Suchanek ac7cae
-			rc = pseries_remove_memblock(
Michal Suchanek ac7cae
-				be64_to_cpu(old_drmem[i].base_addr),
Michal Suchanek ac7cae
-						     memblock_size);
Michal Suchanek ac7cae
-			break;
Michal Suchanek ac7cae
-		} else if ((!(be32_to_cpu(old_drmem[i].flags) &
Michal Suchanek ac7cae
-			    DRCONF_MEM_ASSIGNED)) &&
Michal Suchanek ac7cae
-			    (be32_to_cpu(new_drmem[i].flags) &
Michal Suchanek ac7cae
-			    DRCONF_MEM_ASSIGNED)) {
Michal Suchanek ac7cae
-			rc = memblock_add(be64_to_cpu(old_drmem[i].base_addr),
Michal Suchanek ac7cae
-					  memblock_size);
Michal Suchanek ac7cae
-			rc = (rc < 0) ? -EINVAL : 0;
Michal Suchanek ac7cae
-			break;
Michal Suchanek ac7cae
-		}
Michal Suchanek ac7cae
-	}
Michal Suchanek ac7cae
-	return rc;
Michal Suchanek ac7cae
-}
Michal Suchanek ac7cae
-
Michal Suchanek ac7cae
 static int pseries_memory_notifier(struct notifier_block *nb,
Michal Suchanek ac7cae
 				   unsigned long action, void *data)
Michal Suchanek ac7cae
 {
Michal Suchanek ac7cae
@@ -978,10 +919,6 @@ static int pseries_memory_notifier(struct notifier_block *nb,
Michal Suchanek ac7cae
 	case OF_RECONFIG_DETACH_NODE:
Michal Suchanek ac7cae
 		err = pseries_remove_mem_node(rd->dn);
Michal Suchanek ac7cae
 		break;
Michal Suchanek ac7cae
-	case OF_RECONFIG_UPDATE_PROPERTY:
Michal Suchanek ac7cae
-		if (!strcmp(rd->prop->name, "ibm,dynamic-memory"))
Michal Suchanek ac7cae
-			err = pseries_update_drconf_memory(rd);
Michal Suchanek ac7cae
-		break;
Michal Suchanek ac7cae
 	}
Michal Suchanek ac7cae
 	return notifier_from_errno(err);
Michal Suchanek ac7cae
 }
Michal Suchanek ac7cae
-- 
Michal Suchanek ac7cae
2.26.2
Michal Suchanek ac7cae