| From 301d2ea6572386245c5d2d2dc85c3b5a737b85ac Mon Sep 17 00:00:00 2001 |
| From: "Aneesh Kumar K.V" <aneesh.kumar@linux.ibm.com> |
| Date: Wed, 7 Oct 2020 17:18:34 +0530 |
| Subject: powerpc/memhotplug: Make lmb size 64bit |
| |
| From: Aneesh Kumar K.V <aneesh.kumar@linux.ibm.com> |
| |
| commit 301d2ea6572386245c5d2d2dc85c3b5a737b85ac upstream. |
| |
| Similar to commit 89c140bbaeee ("pseries: Fix 64 bit logical memory block panic") |
| make sure different variables tracking lmb_size are updated to be 64 bit. |
| |
| This was found by code audit. |
| |
| Cc: stable@vger.kernel.org |
| Signed-off-by: Aneesh Kumar K.V <aneesh.kumar@linux.ibm.com> |
| Signed-off-by: Michael Ellerman <mpe@ellerman.id.au> |
| Link: https://lore.kernel.org/r/20201007114836.282468-3-aneesh.kumar@linux.ibm.com |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| |
| --- |
| arch/powerpc/platforms/pseries/hotplug-memory.c | 43 ++++++++++++++++-------- |
| 1 file changed, 29 insertions(+), 14 deletions(-) |
| |
| --- a/arch/powerpc/platforms/pseries/hotplug-memory.c |
| +++ b/arch/powerpc/platforms/pseries/hotplug-memory.c |
| @@ -277,7 +277,7 @@ static int dlpar_offline_lmb(struct drme |
| return dlpar_change_lmb_state(lmb, false); |
| } |
| |
| -static int pseries_remove_memblock(unsigned long base, unsigned int memblock_size) |
| +static int pseries_remove_memblock(unsigned long base, unsigned long memblock_size) |
| { |
| unsigned long block_sz, start_pfn; |
| int sections_per_block; |
| @@ -308,10 +308,11 @@ out: |
| |
| static int pseries_remove_mem_node(struct device_node *np) |
| { |
| - const __be32 *regs; |
| + const __be32 *prop; |
| unsigned long base; |
| - unsigned int lmb_size; |
| + unsigned long lmb_size; |
| int ret = -EINVAL; |
| + int addr_cells, size_cells; |
| |
| /* |
| * Check to see if we are actually removing memory |
| @@ -322,12 +323,19 @@ static int pseries_remove_mem_node(struc |
| /* |
| * Find the base address and size of the memblock |
| */ |
| - regs = of_get_property(np, "reg", NULL); |
| - if (!regs) |
| + prop = of_get_property(np, "reg", NULL); |
| + if (!prop) |
| return ret; |
| |
| - base = be64_to_cpu(*(unsigned long *)regs); |
| - lmb_size = be32_to_cpu(regs[3]); |
| + addr_cells = of_n_addr_cells(np); |
| + size_cells = of_n_size_cells(np); |
| + |
| + /* |
| + * "reg" property represents (addr,size) tuple. |
| + */ |
| + base = of_read_number(prop, addr_cells); |
| + prop += addr_cells; |
| + lmb_size = of_read_number(prop, size_cells); |
| |
| pseries_remove_memblock(base, lmb_size); |
| return 0; |
| @@ -564,7 +572,7 @@ static int dlpar_memory_remove_by_ic(u32 |
| |
| #else |
| static inline int pseries_remove_memblock(unsigned long base, |
| - unsigned int memblock_size) |
| + unsigned long memblock_size) |
| { |
| return -EOPNOTSUPP; |
| } |
| @@ -886,10 +894,11 @@ int dlpar_memory(struct pseries_hp_error |
| |
| static int pseries_add_mem_node(struct device_node *np) |
| { |
| - const __be32 *regs; |
| + const __be32 *prop; |
| unsigned long base; |
| - unsigned int lmb_size; |
| + unsigned long lmb_size; |
| int ret = -EINVAL; |
| + int addr_cells, size_cells; |
| |
| /* |
| * Check to see if we are actually adding memory |
| @@ -900,12 +909,18 @@ static int pseries_add_mem_node(struct d |
| /* |
| * Find the base and size of the memblock |
| */ |
| - regs = of_get_property(np, "reg", NULL); |
| - if (!regs) |
| + prop = of_get_property(np, "reg", NULL); |
| + if (!prop) |
| return ret; |
| |
| - base = be64_to_cpu(*(unsigned long *)regs); |
| - lmb_size = be32_to_cpu(regs[3]); |
| + addr_cells = of_n_addr_cells(np); |
| + size_cells = of_n_size_cells(np); |
| + /* |
| + * "reg" property represents (addr,size) tuple. |
| + */ |
| + base = of_read_number(prop, addr_cells); |
| + prop += addr_cells; |
| + lmb_size = of_read_number(prop, size_cells); |
| |
| /* |
| * Update memory region to represent the memory add |