Certain devices can possess non-standard memory capacities, not constrained to multiples of 1GB. Provide a kernel parameter so that we can map the device memory completely on memory hotplug.
Restrict memory_block_size value to a power of 2 value similar to LMB size. The memory block size should also be more than the section size. Signed-off-by: Aneesh Kumar K.V <aneesh.ku...@linux.ibm.com> --- .../admin-guide/kernel-parameters.txt | 3 +++ arch/powerpc/kernel/setup_64.c | 27 +++++++++++++++++++ 2 files changed, 30 insertions(+) diff --git a/Documentation/admin-guide/kernel-parameters.txt b/Documentation/admin-guide/kernel-parameters.txt index 9e5bab29685f..833b8c5b4b4c 100644 --- a/Documentation/admin-guide/kernel-parameters.txt +++ b/Documentation/admin-guide/kernel-parameters.txt @@ -3190,6 +3190,9 @@ Note that even when enabled, there are a few cases where the feature is not effective. + memory_block_size=size [PPC] + Use this parameter to configure the memory block size value. + memtest= [KNL,X86,ARM,M68K,PPC,RISCV] Enable memtest Format: <integer> default : 0 <disable> diff --git a/arch/powerpc/kernel/setup_64.c b/arch/powerpc/kernel/setup_64.c index 246201d0d879..54ce748a340d 100644 --- a/arch/powerpc/kernel/setup_64.c +++ b/arch/powerpc/kernel/setup_64.c @@ -885,13 +885,40 @@ void __init setup_per_cpu_areas(void) #endif #ifdef CONFIG_MEMORY_HOTPLUG +static unsigned long set_mem_block_size; unsigned long memory_block_size_bytes(void) { + if (set_mem_block_size) + return set_mem_block_size; + if (ppc_md.memory_block_size) return ppc_md.memory_block_size(); return MIN_MEMORY_BLOCK_SIZE; } + +/* + * Restrict to a power of 2 value for memblock which is larger than + * section size + */ +static int __init parse_mem_block_size(char *ptr) +{ + unsigned int order; + unsigned long size = memparse(ptr, NULL); + + order = fls64(size); + if (!order) + return 0; + + order--; + if (order < SECTION_SIZE_BITS) + return 0; + + set_mem_block_size = 1UL << order; + + return 0; +} +early_param("memory_block_size", parse_mem_block_size); #endif #if defined(CONFIG_PPC_INDIRECT_PIO) || defined(CONFIG_PPC_INDIRECT_MMIO) -- 2.40.1