From patchwork Mon Apr 17 19:07:03 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Michael Bringmann X-Patchwork-Id: 751464 Return-Path: X-Original-To: patchwork-incoming@ozlabs.org Delivered-To: patchwork-incoming@ozlabs.org Received: from lists.ozlabs.org (lists.ozlabs.org [IPv6:2401:3900:2:1::3]) (using TLSv1.2 with cipher ADH-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 3w6J7p3wlRz9s03 for ; Tue, 18 Apr 2017 05:23:02 +1000 (AEST) Received: from lists.ozlabs.org (lists.ozlabs.org [IPv6:2401:3900:2:1::3]) by lists.ozlabs.org (Postfix) with ESMTP id 3w6J7p375BzDq7Z for ; Tue, 18 Apr 2017 05:23:02 +1000 (AEST) X-Original-To: linuxppc-dev@lists.ozlabs.org Delivered-To: linuxppc-dev@lists.ozlabs.org Received: from mx0a-001b2d01.pphosted.com (mx0b-001b2d01.pphosted.com [148.163.158.5]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by lists.ozlabs.org (Postfix) with ESMTPS id 3w6Hnb72qrzDqC4 for ; Tue, 18 Apr 2017 05:07:15 +1000 (AEST) Received: from pps.filterd (m0098420.ppops.net [127.0.0.1]) by mx0b-001b2d01.pphosted.com (8.16.0.20/8.16.0.20) with SMTP id v3HJ3rfK125723 for ; Mon, 17 Apr 2017 15:07:07 -0400 Received: from e38.co.us.ibm.com (e38.co.us.ibm.com [32.97.110.159]) by mx0b-001b2d01.pphosted.com with ESMTP id 29w2db2up0-1 (version=TLSv1.2 cipher=AES256-SHA bits=256 verify=NOT) for ; Mon, 17 Apr 2017 15:07:07 -0400 Received: from localhost by e38.co.us.ibm.com with IBM ESMTP SMTP Gateway: Authorized Use Only! Violators will be prosecuted for from ; Mon, 17 Apr 2017 13:07:06 -0600 Received: from b03cxnp08027.gho.boulder.ibm.com (9.17.130.19) by e38.co.us.ibm.com (192.168.1.138) with IBM ESMTP SMTP Gateway: Authorized Use Only! Violators will be prosecuted; Mon, 17 Apr 2017 13:07:05 -0600 Received: from b03ledav004.gho.boulder.ibm.com (b03ledav004.gho.boulder.ibm.com [9.17.130.235]) by b03cxnp08027.gho.boulder.ibm.com (8.14.9/8.14.9/NCO v10.0) with ESMTP id v3HJ74dd7602592; Mon, 17 Apr 2017 12:07:04 -0700 Received: from b03ledav004.gho.boulder.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 0CDF07805F; Mon, 17 Apr 2017 13:07:04 -0600 (MDT) Received: from powerkvm6.aus.stglabs.ibm.com (unknown [9.40.192.78]) by b03ledav004.gho.boulder.ibm.com (Postfix) with ESMTP id EF2B278037; Mon, 17 Apr 2017 13:07:03 -0600 (MDT) Received: from powerkvm6.aus.stglabs.ibm.com (localhost [IPv6:::1]) by powerkvm6.aus.stglabs.ibm.com (Postfix) with ESMTP id AC367C2086AC; Mon, 17 Apr 2017 14:07:03 -0500 (CDT) Subject: [PATCH V3 4/5] pseries/hotplug init: Convert new DRC memory property for hotplug runtime From: Michael Bringmann To: ltc-virtual-io@lists.linux.ibm.com, linuxppc-dev@lists.ozlabs.org Date: Mon, 17 Apr 2017 14:07:03 -0500 In-Reply-To: <149245592182.50124.2405394198019242983.stgit@powerkvm6.aus.stglabs.ibm.com> References: <149245592182.50124.2405394198019242983.stgit@powerkvm6.aus.stglabs.ibm.com> User-Agent: StGit/0.17.1-19-gef93c MIME-Version: 1.0 X-TM-AS-GCONF: 00 x-cbid: 17041719-0028-0000-0000-0000076B6769 X-IBM-SpamModules-Scores: X-IBM-SpamModules-Versions: BY=3.00006935; HX=3.00000240; KW=3.00000007; PH=3.00000004; SC=3.00000208; SDB=6.00848777; UDB=6.00419044; IPR=6.00627417; BA=6.00005292; NDR=6.00000001; ZLA=6.00000005; ZF=6.00000009; ZB=6.00000000; ZP=6.00000000; ZH=6.00000000; ZU=6.00000002; MB=3.00015072; XFM=3.00000013; UTC=2017-04-17 19:07:06 X-IBM-AV-DETECTION: SAVI=unused REMOTE=unused XFE=unused x-cbparentid: 17041719-0029-0000-0000-0000352B71C9 Message-Id: <149245601182.50124.9345824645898201617.stgit@powerkvm6.aus.stglabs.ibm.com> X-Proofpoint-Virus-Version: vendor=fsecure engine=2.50.10432:, , definitions=2017-04-17_15:, , signatures=0 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 spamscore=0 suspectscore=2 malwarescore=0 phishscore=0 adultscore=0 bulkscore=0 classifier=spam adjust=0 reason=mlx scancount=1 engine=8.0.1-1702020001 definitions=main-1704170168 X-BeenThere: linuxppc-dev@lists.ozlabs.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: Linux on PowerPC Developers Mail List List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: nfont@linux.vnet.ibm.com Errors-To: linuxppc-dev-bounces+patchwork-incoming=ozlabs.org@lists.ozlabs.org Sender: "Linuxppc-dev" hotplug_init: Simplify the code needed for runtime memory hotplug and maintenance with a conversion routine that transforms the compressed property "ibm,dynamic-memory-v2" to the form of "ibm,dynamic-memory" within the "ibm,dynamic-reconfiguration-memory" node. Thus only a single set of routines should be required at runtime to parse, edit, and manipulate the memory representation in the device tree. Similarly, any userspace applications that need this information will only need to recognize the older format to be able to continue to operate. Signed-off-by: Michael Bringmann --- Changes in V3: -- Add missing of_node_put() calls. -- Correct description of change. --- arch/powerpc/platforms/pseries/Makefile | 4 - arch/powerpc/platforms/pseries/hotplug-memory.c | 104 +++++++++++++++++++++++ 2 files changed, 104 insertions(+), 4 deletions(-) diff --git a/arch/powerpc/platforms/pseries/Makefile b/arch/powerpc/platforms/pseries/Makefile index 8f4ba08..87eb665 100644 --- a/arch/powerpc/platforms/pseries/Makefile +++ b/arch/powerpc/platforms/pseries/Makefile @@ -5,14 +5,14 @@ obj-y := lpar.o hvCall.o nvram.o reconfig.o \ of_helpers.o \ setup.o iommu.o event_sources.o ras.o \ firmware.o power.o dlpar.o mobility.o rng.o \ - pci.o pci_dlpar.o eeh_pseries.o msi.o + pci.o pci_dlpar.o eeh_pseries.o msi.o \ + hotplug-memory.o obj-$(CONFIG_SMP) += smp.o obj-$(CONFIG_SCANLOG) += scanlog.o obj-$(CONFIG_KEXEC_CORE) += kexec.o obj-$(CONFIG_PSERIES_ENERGY) += pseries_energy.o obj-$(CONFIG_HOTPLUG_CPU) += hotplug-cpu.o -obj-$(CONFIG_MEMORY_HOTPLUG) += hotplug-memory.o obj-$(CONFIG_HVC_CONSOLE) += hvconsole.o obj-$(CONFIG_HVCS) += hvcserver.o diff --git a/arch/powerpc/platforms/pseries/hotplug-memory.c b/arch/powerpc/platforms/pseries/hotplug-memory.c index e104c71..b6732c6 100644 --- a/arch/powerpc/platforms/pseries/hotplug-memory.c +++ b/arch/powerpc/platforms/pseries/hotplug-memory.c @@ -24,8 +24,6 @@ #include #include "pseries.h" -static bool rtas_hp_event; - unsigned long pseries_memory_block_size(void) { struct device_node *np; @@ -69,6 +67,10 @@ unsigned long pseries_memory_block_size(void) return memblock_size; } +#ifdef CONFIG_MEMORY_HOTPLUG + +static bool rtas_hp_event; + static void dlpar_free_property(struct property *prop) { kfree(prop->name); @@ -1165,11 +1167,109 @@ static int pseries_memory_notifier(struct notifier_block *nb, static struct notifier_block pseries_mem_nb = { .notifier_call = pseries_memory_notifier, }; +#endif /* CONFIG_MEMORY_HOTPLUG */ + +static int pseries_rewrite_dynamic_memory_v2(void) +{ + unsigned long memblock_size; + struct device_node *dn; + struct property *prop, *prop_v2; + __be32 *p; + struct of_drconf_cell *lmbs; + u32 num_lmb_desc_sets, num_lmbs; + int i, j, k; + + dn = of_find_node_by_path("/ibm,dynamic-reconfiguration-memory"); + if (!dn) + return -EINVAL; + + prop_v2 = of_find_property(dn, "ibm,dynamic-memory-v2", NULL); + if (!prop_v2) { + of_node_put(dn); + return -EINVAL; + } + + memblock_size = pseries_memory_block_size(); + if (!memblock_size) { + of_node_put(dn); + return -EINVAL; + } + + /* The first int of the property is the number of lmb sets + * described by the property. + */ + p = (__be32 *)prop_v2->value; + num_lmb_desc_sets = be32_to_cpu(*p++); + + /* Count the number of LMBs for generating the alternate format + */ + for (i = 0, num_lmbs = 0; i < num_lmb_desc_sets; i++) { + struct of_drconf_cell_v2 drmem; + + read_drconf_cell_v2(&drmem, (const __be32 **)&p); + num_lmbs += drmem.num_seq_lmbs; + } + + /* Create an empty copy of the new 'ibm,dynamic-memory' property + */ + prop = kzalloc(sizeof(*prop), GFP_KERNEL); + if (!prop) { + of_node_put(dn); + return -ENOMEM; + } + prop->name = kstrdup("ibm,dynamic-memory", GFP_KERNEL); + prop->length = dyn_mem_v2_len(num_lmbs); + prop->value = kzalloc(prop->length, GFP_KERNEL); + + /* Copy/expand the ibm,dynamic-memory-v2 format to produce the + * ibm,dynamic-memory format. + */ + p = (__be32 *)prop->value; + *p = cpu_to_be32(num_lmbs); + p++; + lmbs = (struct of_drconf_cell *)p; + + p = (__be32 *)prop_v2->value; + p++; + + for (i = 0, k = 0; i < num_lmb_desc_sets; i++) { + struct of_drconf_cell_v2 drmem; + + read_drconf_cell_v2(&drmem, (const __be32 **)&p); + + for (j = 0; j < drmem.num_seq_lmbs; j++) { + lmbs[k+j].base_addr = be64_to_cpu(drmem.base_addr); + lmbs[k+j].drc_index = be32_to_cpu(drmem.drc_index); + lmbs[k+j].aa_index = be32_to_cpu(drmem.aa_index); + lmbs[k+i].flags = be32_to_cpu(drmem.flags); + + drmem.base_addr += memblock_size; + drmem.drc_index++; + } + + k += drmem.num_seq_lmbs; + } + + of_remove_property(dn, prop_v2); + + of_add_property(dn, prop); + + of_node_put(dn); + + /* And disable feature flag since the property has gone away */ + powerpc_firmware_features &= ~FW_FEATURE_DYN_MEM_V2; + + return 0; +} static int __init pseries_memory_hotplug_init(void) { + if (firmware_has_feature(FW_FEATURE_DYN_MEM_V2)) + pseries_rewrite_dynamic_memory_v2(); +#ifdef CONFIG_MEMORY_HOTPLUG if (firmware_has_feature(FW_FEATURE_LPAR)) of_reconfig_notifier_register(&pseries_mem_nb); +#endif /* CONFIG_MEMORY_HOTPLUG */ return 0; }