* [RFC PATCH] powerpc: Remove CONFIG_HIGHMEM
@ 2025-09-10 13:47 Christophe Leroy
2025-09-10 20:13 ` Arnd Bergmann
0 siblings, 1 reply; 2+ messages in thread
From: Christophe Leroy @ 2025-09-10 13:47 UTC (permalink / raw)
To: Arnd Bergmann, Michael Ellerman, Nicholas Piggin, Madhavan Srinivasan
Cc: Christophe Leroy, linux-kernel, linuxppc-dev
There are some discussion around to opportunity to get rid of
CONFIG_HIGHMEM, see [1]. This RFC is a tentative to remove it
from powerpc so that people can experiment what it would
look like and what would be the outcomes.
CONFIG_HIGHMEM is being depracated, remove it.
To accomodate boards with up to 1Gbytes RAM, PAGE_OFFSET and
TASK_SIZE is adjusted to 0xb0000000 (a0000000 on book3s/32 with modules).
If you have more than 1Gbytes of RAM you can adjust CONFIG_LOWMEM_SIZE.
[1] https://lore.kernel.org/all/4ff89b72-03ff-4447-9d21-dd6a5fe1550f@app.fastmail.com/
Signed-off-by: Christophe Leroy <christophe.leroy@csgroup.eu>
---
arch/powerpc/Kconfig | 17 ++---
arch/powerpc/configs/44x/akebono_defconfig | 1 -
arch/powerpc/configs/44x/currituck_defconfig | 1 -
arch/powerpc/configs/44x/icon_defconfig | 1 -
arch/powerpc/configs/85xx-32bit.config | 1 -
arch/powerpc/configs/85xx/ge_imp3a_defconfig | 1 -
arch/powerpc/configs/85xx/ksi8560_defconfig | 1 -
arch/powerpc/configs/85xx/ppa8548_defconfig | 7 --
arch/powerpc/configs/85xx/stx_gp3_defconfig | 1 -
arch/powerpc/configs/85xx/tqm8548_defconfig | 1 -
.../configs/85xx/xes_mpc85xx_defconfig | 1 -
arch/powerpc/configs/amigaone_defconfig | 1 -
arch/powerpc/configs/chrp32_defconfig | 1 -
arch/powerpc/configs/mpc86xx_base.config | 1 -
arch/powerpc/configs/pmac32_defconfig | 1 -
arch/powerpc/configs/ppc6xx_defconfig | 2 -
arch/powerpc/crypto/aes-gcm-p10-glue.c | 2 +-
arch/powerpc/include/asm/book3s/32/pgtable.h | 10 ---
arch/powerpc/include/asm/fixmap.h | 8 ---
arch/powerpc/include/asm/highmem.h | 70 -------------------
arch/powerpc/include/asm/kexec.h | 1 -
arch/powerpc/include/asm/kvm_ppc.h | 1 -
arch/powerpc/include/asm/nohash/32/pgtable.h | 10 ---
arch/powerpc/kvm/book3s.c | 1 -
arch/powerpc/kvm/book3s_32_mmu.c | 1 -
arch/powerpc/kvm/book3s_64_mmu.c | 1 -
arch/powerpc/kvm/book3s_64_mmu_hv.c | 1 -
arch/powerpc/kvm/book3s_64_vio.c | 1 -
arch/powerpc/kvm/book3s_hv.c | 1 -
arch/powerpc/kvm/book3s_hv_uvmem.c | 2 +-
arch/powerpc/kvm/book3s_pr.c | 1 -
arch/powerpc/kvm/e500_mmu.c | 1 -
arch/powerpc/kvm/e500_mmu_host.c | 16 ++++-
arch/powerpc/mm/book3s32/mmu.c | 1 -
arch/powerpc/mm/book3s32/tlb.c | 1 -
arch/powerpc/mm/cacheflush.c | 69 ++----------------
arch/powerpc/mm/dma-noncoherent.c | 48 +------------
arch/powerpc/mm/fault.c | 1 -
arch/powerpc/mm/init_32.c | 3 -
arch/powerpc/mm/init_64.c | 1 -
arch/powerpc/mm/mem.c | 18 -----
arch/powerpc/mm/nohash/e500.c | 1 -
arch/powerpc/mm/nohash/tlb.c | 1 -
arch/powerpc/mm/nohash/tlb_64e.c | 7 +-
arch/powerpc/mm/pageattr.c | 3 -
arch/powerpc/mm/pgtable_32.c | 1 -
arch/powerpc/mm/ptdump/ptdump.c | 9 ---
arch/powerpc/platforms/44x/pci.c | 3 +-
arch/powerpc/platforms/85xx/smp.c | 5 +-
arch/powerpc/platforms/ps3/system-bus.c | 2 +-
arch/powerpc/xmon/xmon.c | 1 -
51 files changed, 34 insertions(+), 308 deletions(-)
delete mode 100644 arch/powerpc/include/asm/highmem.h
diff --git a/arch/powerpc/Kconfig b/arch/powerpc/Kconfig
index 93402a1d9c9f..fec1db5fcb97 100644
--- a/arch/powerpc/Kconfig
+++ b/arch/powerpc/Kconfig
@@ -482,11 +482,6 @@ source "arch/powerpc/platforms/Kconfig"
menu "Kernel options"
-config HIGHMEM
- bool "High memory support"
- depends on PPC32
- select KMAP_LOCAL
-
source "kernel/Kconfig.hz"
config MATH_EMULATION
@@ -1193,7 +1188,7 @@ config LOWMEM_SIZE_BOOL
config LOWMEM_SIZE
hex "Maximum low memory size (in bytes)" if LOWMEM_SIZE_BOOL
- default "0x30000000"
+ default "0x40000000"
config LOWMEM_CAM_NUM_BOOL
bool "Set number of CAMs to use to map low memory"
@@ -1245,7 +1240,7 @@ config PAGE_OFFSET_BOOL
config PAGE_OFFSET
hex "Virtual address of memory base" if PAGE_OFFSET_BOOL
- default "0xc0000000"
+ default "0xb0000000"
config KERNEL_START_BOOL
bool "Set custom kernel base address"
@@ -1261,8 +1256,8 @@ config KERNEL_START_BOOL
config KERNEL_START
hex "Virtual address of kernel base" if KERNEL_START_BOOL
default PAGE_OFFSET if PAGE_OFFSET_BOOL
- default "0xc2000000" if CRASH_DUMP && !NONSTATIC_KERNEL
- default "0xc0000000"
+ default "0xb2000000" if CRASH_DUMP && !NONSTATIC_KERNEL
+ default "0xb0000000"
config PHYSICAL_START_BOOL
bool "Set physical address where the kernel is loaded"
@@ -1298,8 +1293,8 @@ config TASK_SIZE_BOOL
config TASK_SIZE
hex "Size of user task space" if TASK_SIZE_BOOL
default "0x80000000" if PPC_8xx
- default "0xb0000000" if PPC_BOOK3S_32 && EXECMEM
- default "0xc0000000"
+ default "0xa0000000" if PPC_BOOK3S_32 && EXECMEM
+ default "0xb0000000"
config MODULES_SIZE_BOOL
bool "Set custom size for modules/execmem area"
diff --git a/arch/powerpc/configs/44x/akebono_defconfig b/arch/powerpc/configs/44x/akebono_defconfig
index 1882eb2da354..816e7bdfffe7 100644
--- a/arch/powerpc/configs/44x/akebono_defconfig
+++ b/arch/powerpc/configs/44x/akebono_defconfig
@@ -14,7 +14,6 @@ CONFIG_MODULE_UNLOAD=y
CONFIG_PPC_47x=y
# CONFIG_EBONY is not set
CONFIG_AKEBONO=y
-CONFIG_HIGHMEM=y
CONFIG_HZ_100=y
CONFIG_IRQ_ALL_CPUS=y
# CONFIG_COMPACTION is not set
diff --git a/arch/powerpc/configs/44x/currituck_defconfig b/arch/powerpc/configs/44x/currituck_defconfig
index 7283b7d4a1a5..a20ee612e1ef 100644
--- a/arch/powerpc/configs/44x/currituck_defconfig
+++ b/arch/powerpc/configs/44x/currituck_defconfig
@@ -12,7 +12,6 @@ CONFIG_MODULE_UNLOAD=y
CONFIG_PPC_47x=y
# CONFIG_EBONY is not set
CONFIG_CURRITUCK=y
-CONFIG_HIGHMEM=y
CONFIG_HZ_100=y
CONFIG_MATH_EMULATION=y
CONFIG_IRQ_ALL_CPUS=y
diff --git a/arch/powerpc/configs/44x/icon_defconfig b/arch/powerpc/configs/44x/icon_defconfig
index fb9a15573546..42d27bc70ab7 100644
--- a/arch/powerpc/configs/44x/icon_defconfig
+++ b/arch/powerpc/configs/44x/icon_defconfig
@@ -8,7 +8,6 @@ CONFIG_MODULES=y
CONFIG_MODULE_UNLOAD=y
# CONFIG_EBONY is not set
CONFIG_ICON=y
-CONFIG_HIGHMEM=y
CONFIG_PCIEPORTBUS=y
# CONFIG_PCIEASPM is not set
CONFIG_NET=y
diff --git a/arch/powerpc/configs/85xx-32bit.config b/arch/powerpc/configs/85xx-32bit.config
index a85310bcb1fd..f96db0bc888f 100644
--- a/arch/powerpc/configs/85xx-32bit.config
+++ b/arch/powerpc/configs/85xx-32bit.config
@@ -1,5 +1,4 @@
CONFIG_PPC64=n
-CONFIG_HIGHMEM=y
CONFIG_KEXEC=y
CONFIG_PPC_85xx=y
CONFIG_PROC_KCORE=y
diff --git a/arch/powerpc/configs/85xx/ge_imp3a_defconfig b/arch/powerpc/configs/85xx/ge_imp3a_defconfig
index 7beb36a41d45..da9f649107dc 100644
--- a/arch/powerpc/configs/85xx/ge_imp3a_defconfig
+++ b/arch/powerpc/configs/85xx/ge_imp3a_defconfig
@@ -23,7 +23,6 @@ CONFIG_MODULE_UNLOAD=y
CONFIG_GE_IMP3A=y
CONFIG_QE_GPIO=y
CONFIG_CPM2=y
-CONFIG_HIGHMEM=y
CONFIG_HZ_1000=y
CONFIG_PREEMPT=y
# CONFIG_CORE_DUMP_DEFAULT_ELF_HEADERS is not set
diff --git a/arch/powerpc/configs/85xx/ksi8560_defconfig b/arch/powerpc/configs/85xx/ksi8560_defconfig
index 9cb211fb6d1e..f2ac1fc41303 100644
--- a/arch/powerpc/configs/85xx/ksi8560_defconfig
+++ b/arch/powerpc/configs/85xx/ksi8560_defconfig
@@ -9,7 +9,6 @@ CONFIG_PARTITION_ADVANCED=y
CONFIG_KSI8560=y
CONFIG_CPM2=y
CONFIG_GEN_RTC=y
-CONFIG_HIGHMEM=y
CONFIG_BINFMT_MISC=y
CONFIG_MATH_EMULATION=y
# CONFIG_SECCOMP is not set
diff --git a/arch/powerpc/configs/85xx/ppa8548_defconfig b/arch/powerpc/configs/85xx/ppa8548_defconfig
index 4bd5f993d26a..2aab8602d71e 100644
--- a/arch/powerpc/configs/85xx/ppa8548_defconfig
+++ b/arch/powerpc/configs/85xx/ppa8548_defconfig
@@ -10,15 +10,8 @@ CONFIG_RAPIDIO_ENUM_BASIC=y
CONFIG_RAPIDIO_CPS_XX=y
CONFIG_RAPIDIO_CPS_GEN2=y
CONFIG_ADVANCED_OPTIONS=y
-CONFIG_LOWMEM_SIZE_BOOL=y
-CONFIG_LOWMEM_SIZE=0x40000000
CONFIG_LOWMEM_CAM_NUM_BOOL=y
CONFIG_LOWMEM_CAM_NUM=4
-CONFIG_PAGE_OFFSET_BOOL=y
-CONFIG_PAGE_OFFSET=0xb0000000
-CONFIG_KERNEL_START_BOOL=y
-CONFIG_TASK_SIZE_BOOL=y
-CONFIG_TASK_SIZE=0xb0000000
CONFIG_NET=y
CONFIG_INET=y
CONFIG_IP_PNP=y
diff --git a/arch/powerpc/configs/85xx/stx_gp3_defconfig b/arch/powerpc/configs/85xx/stx_gp3_defconfig
index 0a42072fa23c..1033977711d6 100644
--- a/arch/powerpc/configs/85xx/stx_gp3_defconfig
+++ b/arch/powerpc/configs/85xx/stx_gp3_defconfig
@@ -7,7 +7,6 @@ CONFIG_MODULES=y
CONFIG_MODVERSIONS=y
# CONFIG_BLK_DEV_BSG is not set
CONFIG_STX_GP3=y
-CONFIG_HIGHMEM=y
CONFIG_BINFMT_MISC=m
CONFIG_MATH_EMULATION=y
CONFIG_PCI=y
diff --git a/arch/powerpc/configs/85xx/tqm8548_defconfig b/arch/powerpc/configs/85xx/tqm8548_defconfig
index afa1b9b633f8..06928dd9bd88 100644
--- a/arch/powerpc/configs/85xx/tqm8548_defconfig
+++ b/arch/powerpc/configs/85xx/tqm8548_defconfig
@@ -11,7 +11,6 @@ CONFIG_MODULE_UNLOAD=y
CONFIG_PARTITION_ADVANCED=y
# CONFIG_MSDOS_PARTITION is not set
CONFIG_TQM8548=y
-CONFIG_HIGHMEM=y
CONFIG_BINFMT_MISC=y
CONFIG_MATH_EMULATION=y
# CONFIG_SECCOMP is not set
diff --git a/arch/powerpc/configs/85xx/xes_mpc85xx_defconfig b/arch/powerpc/configs/85xx/xes_mpc85xx_defconfig
index 488d03ae6d6c..10764fad2eb9 100644
--- a/arch/powerpc/configs/85xx/xes_mpc85xx_defconfig
+++ b/arch/powerpc/configs/85xx/xes_mpc85xx_defconfig
@@ -18,7 +18,6 @@ CONFIG_MODVERSIONS=y
# CONFIG_BLK_DEV_BSG is not set
CONFIG_PARTITION_ADVANCED=y
CONFIG_XES_MPC85xx=y
-CONFIG_HIGHMEM=y
CONFIG_MATH_EMULATION=y
CONFIG_PCI=y
CONFIG_PCIEPORTBUS=y
diff --git a/arch/powerpc/configs/amigaone_defconfig b/arch/powerpc/configs/amigaone_defconfig
index 69ef3dc31c4b..f9e02bd217d6 100644
--- a/arch/powerpc/configs/amigaone_defconfig
+++ b/arch/powerpc/configs/amigaone_defconfig
@@ -18,7 +18,6 @@ CONFIG_AMIGA_PARTITION=y
# CONFIG_PPC_CHRP is not set
# CONFIG_PPC_PMAC is not set
CONFIG_AMIGAONE=y
-CONFIG_HIGHMEM=y
CONFIG_BINFMT_MISC=y
CONFIG_NET=y
CONFIG_PACKET=y
diff --git a/arch/powerpc/configs/chrp32_defconfig b/arch/powerpc/configs/chrp32_defconfig
index b799c95480ae..304de18b51f8 100644
--- a/arch/powerpc/configs/chrp32_defconfig
+++ b/arch/powerpc/configs/chrp32_defconfig
@@ -17,7 +17,6 @@ CONFIG_PARTITION_ADVANCED=y
CONFIG_MAC_PARTITION=y
# CONFIG_PPC_PMAC is not set
CONFIG_GEN_RTC=y
-CONFIG_HIGHMEM=y
CONFIG_BINFMT_MISC=y
CONFIG_IRQ_ALL_CPUS=y
CONFIG_ISA=y
diff --git a/arch/powerpc/configs/mpc86xx_base.config b/arch/powerpc/configs/mpc86xx_base.config
index 632c014b122d..a1ca1f7da240 100644
--- a/arch/powerpc/configs/mpc86xx_base.config
+++ b/arch/powerpc/configs/mpc86xx_base.config
@@ -3,6 +3,5 @@ CONFIG_GEF_PPC9A=y
CONFIG_GEF_SBC310=y
CONFIG_GEF_SBC610=y
CONFIG_MVME7100=y
-CONFIG_HIGHMEM=y
CONFIG_KEXEC=y
CONFIG_PROC_KCORE=y
diff --git a/arch/powerpc/configs/pmac32_defconfig b/arch/powerpc/configs/pmac32_defconfig
index ae45f70b29f0..24e73489947a 100644
--- a/arch/powerpc/configs/pmac32_defconfig
+++ b/arch/powerpc/configs/pmac32_defconfig
@@ -20,7 +20,6 @@ CONFIG_CPU_FREQ_GOV_POWERSAVE=y
CONFIG_CPU_FREQ_GOV_USERSPACE=y
CONFIG_CPU_FREQ_PMAC=y
CONFIG_GEN_RTC=y
-CONFIG_HIGHMEM=y
CONFIG_BINFMT_MISC=m
CONFIG_HIBERNATION=y
CONFIG_PM_DEBUG=y
diff --git a/arch/powerpc/configs/ppc6xx_defconfig b/arch/powerpc/configs/ppc6xx_defconfig
index bb359643ddc1..75b44ce12332 100644
--- a/arch/powerpc/configs/ppc6xx_defconfig
+++ b/arch/powerpc/configs/ppc6xx_defconfig
@@ -60,7 +60,6 @@ CONFIG_TAU=y
CONFIG_TAU_AVERAGE=y
CONFIG_QE_GPIO=y
CONFIG_MCU_MPC8349EMITX=y
-CONFIG_HIGHMEM=y
CONFIG_HZ_1000=y
CONFIG_PREEMPT_VOLUNTARY=y
CONFIG_BINFMT_MISC=y
@@ -1045,7 +1044,6 @@ CONFIG_DEBUG_OBJECTS_TIMERS=y
CONFIG_SLUB_DEBUG_ON=y
CONFIG_DEBUG_STACK_USAGE=y
CONFIG_DEBUG_VM=y
-CONFIG_DEBUG_HIGHMEM=y
CONFIG_DEBUG_STACKOVERFLOW=y
CONFIG_DEBUG_SHIRQ=y
CONFIG_DEBUG_RT_MUTEXES=y
diff --git a/arch/powerpc/crypto/aes-gcm-p10-glue.c b/arch/powerpc/crypto/aes-gcm-p10-glue.c
index 85f4fd4b1bdc..cba2a42be9cd 100644
--- a/arch/powerpc/crypto/aes-gcm-p10-glue.c
+++ b/arch/powerpc/crypto/aes-gcm-p10-glue.c
@@ -233,7 +233,7 @@ static int p10_aes_gcm_crypt(struct aead_request *req, u8 *riv,
/* Linearize assoc, if not already linear */
if (req->src->length >= assoclen && req->src->length) {
- assoc = sg_virt(req->src); /* ppc64 is !HIGHMEM */
+ assoc = sg_virt(req->src);
} else {
gfp_t flags = (req->base.flags & CRYPTO_TFM_REQ_MAY_SLEEP) ?
GFP_KERNEL : GFP_ATOMIC;
diff --git a/arch/powerpc/include/asm/book3s/32/pgtable.h b/arch/powerpc/include/asm/book3s/32/pgtable.h
index 87dcca962be7..64c106b72da3 100644
--- a/arch/powerpc/include/asm/book3s/32/pgtable.h
+++ b/arch/powerpc/include/asm/book3s/32/pgtable.h
@@ -139,12 +139,6 @@ void unmap_kernel_page(unsigned long va);
#endif /* !__ASSEMBLER__ */
-/*
- * This is the bottom of the PKMAP area with HIGHMEM or an arbitrary
- * value (for now) on others, from where we can start layout kernel
- * virtual space that goes below PKMAP and FIXMAP
- */
-
#define FIXADDR_SIZE 0
#ifdef CONFIG_KASAN
#include <asm/kasan.h>
@@ -158,11 +152,7 @@ void unmap_kernel_page(unsigned long va);
* until mem_init() at which point this becomes the top of the vmalloc
* and ioremap space
*/
-#ifdef CONFIG_HIGHMEM
-#define IOREMAP_TOP PKMAP_BASE
-#else
#define IOREMAP_TOP FIXADDR_START
-#endif
/* PPC32 shares vmalloc area with ioremap */
#define IOREMAP_START VMALLOC_START
diff --git a/arch/powerpc/include/asm/fixmap.h b/arch/powerpc/include/asm/fixmap.h
index bc5109eab5b7..6d46fc296909 100644
--- a/arch/powerpc/include/asm/fixmap.h
+++ b/arch/powerpc/include/asm/fixmap.h
@@ -18,10 +18,6 @@
#include <linux/sizes.h>
#include <linux/pgtable.h>
#include <asm/page.h>
-#ifdef CONFIG_HIGHMEM
-#include <linux/threads.h>
-#include <asm/kmap_size.h>
-#endif
/*
* Here we define all the compile-time 'special' virtual
@@ -47,10 +43,6 @@ enum fixed_addresses {
/* reserve the top 128K for early debugging purposes */
FIX_EARLY_DEBUG_TOP = FIX_HOLE,
FIX_EARLY_DEBUG_BASE = FIX_EARLY_DEBUG_TOP+(ALIGN(SZ_128K, PAGE_SIZE)/PAGE_SIZE)-1,
-#ifdef CONFIG_HIGHMEM
- FIX_KMAP_BEGIN, /* reserved pte's for temporary kernel mappings */
- FIX_KMAP_END = FIX_KMAP_BEGIN + (KM_MAX_IDX * NR_CPUS) - 1,
-#endif
#ifdef CONFIG_PPC_8xx
/* For IMMR we need an aligned 512K area */
#define FIX_IMMR_SIZE (512 * 1024 / PAGE_SIZE)
diff --git a/arch/powerpc/include/asm/highmem.h b/arch/powerpc/include/asm/highmem.h
deleted file mode 100644
index c0fcd1bbdba9..000000000000
--- a/arch/powerpc/include/asm/highmem.h
+++ /dev/null
@@ -1,70 +0,0 @@
-/* SPDX-License-Identifier: GPL-2.0 */
-/*
- * highmem.h: virtual kernel memory mappings for high memory
- *
- * PowerPC version, stolen from the i386 version.
- *
- * Used in CONFIG_HIGHMEM systems for memory pages which
- * are not addressable by direct kernel virtual addresses.
- *
- * Copyright (C) 1999 Gerhard Wichert, Siemens AG
- * Gerhard.Wichert@pdb.siemens.de
- *
- *
- * Redesigned the x86 32-bit VM architecture to deal with
- * up to 16 Terrabyte physical memory. With current x86 CPUs
- * we now support up to 64 Gigabytes physical RAM.
- *
- * Copyright (C) 1999 Ingo Molnar <mingo@redhat.com>
- */
-
-#ifndef _ASM_HIGHMEM_H
-#define _ASM_HIGHMEM_H
-
-#ifdef __KERNEL__
-
-#include <linux/interrupt.h>
-#include <asm/cacheflush.h>
-#include <asm/page.h>
-#include <asm/fixmap.h>
-
-extern pte_t *pkmap_page_table;
-
-/*
- * Right now we initialize only a single pte table. It can be extended
- * easily, subsequent pte tables have to be allocated in one physical
- * chunk of RAM.
- */
-/*
- * We use one full pte table with 4K pages. And with 16K/64K/256K pages pte
- * table covers enough memory (32MB/512MB/2GB resp.), so that both FIXMAP
- * and PKMAP can be placed in a single pte table. We use 512 pages for PKMAP
- * in case of 16K/64K/256K page sizes.
- */
-#ifdef CONFIG_PPC_4K_PAGES
-#define PKMAP_ORDER PTE_SHIFT
-#else
-#define PKMAP_ORDER 9
-#endif
-#define LAST_PKMAP (1 << PKMAP_ORDER)
-#ifndef CONFIG_PPC_4K_PAGES
-#define PKMAP_BASE (FIXADDR_START - PAGE_SIZE*(LAST_PKMAP + 1))
-#else
-#define PKMAP_BASE ((FIXADDR_START - PAGE_SIZE*(LAST_PKMAP + 1)) & PMD_MASK)
-#endif
-#define LAST_PKMAP_MASK (LAST_PKMAP-1)
-#define PKMAP_NR(virt) ((virt-PKMAP_BASE) >> PAGE_SHIFT)
-#define PKMAP_ADDR(nr) (PKMAP_BASE + ((nr) << PAGE_SHIFT))
-
-#define flush_cache_kmaps() flush_cache_all()
-
-#define arch_kmap_local_set_pte(mm, vaddr, ptep, ptev) \
- __set_pte_at(mm, vaddr, ptep, ptev, 1)
-#define arch_kmap_local_post_map(vaddr, pteval) \
- local_flush_tlb_page(NULL, vaddr)
-#define arch_kmap_local_post_unmap(vaddr) \
- local_flush_tlb_page(NULL, vaddr)
-
-#endif /* __KERNEL__ */
-
-#endif /* _ASM_HIGHMEM_H */
diff --git a/arch/powerpc/include/asm/kexec.h b/arch/powerpc/include/asm/kexec.h
index 4bbf9f699aaa..397bca781111 100644
--- a/arch/powerpc/include/asm/kexec.h
+++ b/arch/powerpc/include/asm/kexec.h
@@ -23,7 +23,6 @@
/*
* Maximum address we can reach in physical address mode.
- * XXX: I want to allow initrd in highmem. Otherwise set to rmo on LPAR.
*/
#define KEXEC_DESTINATION_MEMORY_LIMIT (-1UL)
diff --git a/arch/powerpc/include/asm/kvm_ppc.h b/arch/powerpc/include/asm/kvm_ppc.h
index ca3829d47ab7..a52abc65f2b0 100644
--- a/arch/powerpc/include/asm/kvm_ppc.h
+++ b/arch/powerpc/include/asm/kvm_ppc.h
@@ -61,7 +61,6 @@ enum xlate_readwrite {
extern int kvmppc_vcpu_run(struct kvm_vcpu *vcpu);
extern int __kvmppc_vcpu_run(struct kvm_vcpu *vcpu);
-extern void kvmppc_handler_highmem(void);
extern void kvmppc_dump_vcpu(struct kvm_vcpu *vcpu);
extern int kvmppc_handle_load(struct kvm_vcpu *vcpu,
diff --git a/arch/powerpc/include/asm/nohash/32/pgtable.h b/arch/powerpc/include/asm/nohash/32/pgtable.h
index 2d71e4b7cd09..f11c898a32a2 100644
--- a/arch/powerpc/include/asm/nohash/32/pgtable.h
+++ b/arch/powerpc/include/asm/nohash/32/pgtable.h
@@ -54,12 +54,6 @@
#define pgd_ERROR(e) \
pr_err("%s:%d: bad pgd %08llx.\n", __FILE__, __LINE__, (unsigned long long)pgd_val(e))
-/*
- * This is the bottom of the PKMAP area with HIGHMEM or an arbitrary
- * value (for now) on others, from where we can start layout kernel
- * virtual space that goes below PKMAP and FIXMAP
- */
-
#define FIXADDR_SIZE 0
#ifdef CONFIG_KASAN
#include <asm/kasan.h>
@@ -73,11 +67,7 @@
* until mem_init() at which point this becomes the top of the vmalloc
* and ioremap space
*/
-#ifdef CONFIG_HIGHMEM
-#define IOREMAP_TOP PKMAP_BASE
-#else
#define IOREMAP_TOP FIXADDR_START
-#endif
/* PPC32 shares vmalloc area with ioremap */
#define IOREMAP_START VMALLOC_START
diff --git a/arch/powerpc/kvm/book3s.c b/arch/powerpc/kvm/book3s.c
index d79c5d1098c0..7489557f582a 100644
--- a/arch/powerpc/kvm/book3s.c
+++ b/arch/powerpc/kvm/book3s.c
@@ -20,7 +20,6 @@
#include <linux/gfp.h>
#include <linux/sched.h>
#include <linux/vmalloc.h>
-#include <linux/highmem.h>
#include <asm/reg.h>
#include <asm/cputable.h>
diff --git a/arch/powerpc/kvm/book3s_32_mmu.c b/arch/powerpc/kvm/book3s_32_mmu.c
index 0215f32932a9..efc2135658dc 100644
--- a/arch/powerpc/kvm/book3s_32_mmu.c
+++ b/arch/powerpc/kvm/book3s_32_mmu.c
@@ -10,7 +10,6 @@
#include <linux/string.h>
#include <linux/kvm.h>
#include <linux/kvm_host.h>
-#include <linux/highmem.h>
#include <asm/kvm_ppc.h>
#include <asm/kvm_book3s.h>
diff --git a/arch/powerpc/kvm/book3s_64_mmu.c b/arch/powerpc/kvm/book3s_64_mmu.c
index 61290282fd9e..92945a74cb24 100644
--- a/arch/powerpc/kvm/book3s_64_mmu.c
+++ b/arch/powerpc/kvm/book3s_64_mmu.c
@@ -10,7 +10,6 @@
#include <linux/string.h>
#include <linux/kvm.h>
#include <linux/kvm_host.h>
-#include <linux/highmem.h>
#include <asm/kvm_ppc.h>
#include <asm/kvm_book3s.h>
diff --git a/arch/powerpc/kvm/book3s_64_mmu_hv.c b/arch/powerpc/kvm/book3s_64_mmu_hv.c
index f305395cf26e..394f0417189b 100644
--- a/arch/powerpc/kvm/book3s_64_mmu_hv.c
+++ b/arch/powerpc/kvm/book3s_64_mmu_hv.c
@@ -8,7 +8,6 @@
#include <linux/string.h>
#include <linux/kvm.h>
#include <linux/kvm_host.h>
-#include <linux/highmem.h>
#include <linux/gfp.h>
#include <linux/slab.h>
#include <linux/hugetlb.h>
diff --git a/arch/powerpc/kvm/book3s_64_vio.c b/arch/powerpc/kvm/book3s_64_vio.c
index 742aa58a7c7e..9842657aa52a 100644
--- a/arch/powerpc/kvm/book3s_64_vio.c
+++ b/arch/powerpc/kvm/book3s_64_vio.c
@@ -10,7 +10,6 @@
#include <linux/string.h>
#include <linux/kvm.h>
#include <linux/kvm_host.h>
-#include <linux/highmem.h>
#include <linux/gfp.h>
#include <linux/slab.h>
#include <linux/sched/signal.h>
diff --git a/arch/powerpc/kvm/book3s_hv.c b/arch/powerpc/kvm/book3s_hv.c
index 7667563fb9ff..b98e14c69e20 100644
--- a/arch/powerpc/kvm/book3s_hv.c
+++ b/arch/powerpc/kvm/book3s_hv.c
@@ -35,7 +35,6 @@
#include <linux/debugfs.h>
#include <linux/gfp.h>
#include <linux/vmalloc.h>
-#include <linux/highmem.h>
#include <linux/hugetlb.h>
#include <linux/kvm_irqfd.h>
#include <linux/irqbypass.h>
diff --git a/arch/powerpc/kvm/book3s_hv_uvmem.c b/arch/powerpc/kvm/book3s_hv_uvmem.c
index 03f8c34fa0a2..8aa0680addf8 100644
--- a/arch/powerpc/kvm/book3s_hv_uvmem.c
+++ b/arch/powerpc/kvm/book3s_hv_uvmem.c
@@ -547,7 +547,7 @@ static int __kvmppc_svm_page_out(struct vm_area_struct *vma,
if (!is_zone_device_page(spage))
goto out_finalize;
- dpage = alloc_page_vma(GFP_HIGHUSER, vma, start);
+ dpage = alloc_page_vma(GFP_USER, vma, start);
if (!dpage) {
ret = -1;
goto out_finalize;
diff --git a/arch/powerpc/kvm/book3s_pr.c b/arch/powerpc/kvm/book3s_pr.c
index 83bcdc80ce51..2ae100709336 100644
--- a/arch/powerpc/kvm/book3s_pr.c
+++ b/arch/powerpc/kvm/book3s_pr.c
@@ -36,7 +36,6 @@
#include <linux/gfp.h>
#include <linux/sched.h>
#include <linux/vmalloc.h>
-#include <linux/highmem.h>
#include <linux/module.h>
#include <linux/miscdevice.h>
#include <asm/asm-prototypes.h>
diff --git a/arch/powerpc/kvm/e500_mmu.c b/arch/powerpc/kvm/e500_mmu.c
index e131fbecdcc4..e9e94e053e7b 100644
--- a/arch/powerpc/kvm/e500_mmu.c
+++ b/arch/powerpc/kvm/e500_mmu.c
@@ -19,7 +19,6 @@
#include <linux/string.h>
#include <linux/kvm.h>
#include <linux/kvm_host.h>
-#include <linux/highmem.h>
#include <linux/log2.h>
#include <linux/uaccess.h>
#include <linux/sched.h>
diff --git a/arch/powerpc/kvm/e500_mmu_host.c b/arch/powerpc/kvm/e500_mmu_host.c
index 06caf8bbbe2b..6f986b4e3c62 100644
--- a/arch/powerpc/kvm/e500_mmu_host.c
+++ b/arch/powerpc/kvm/e500_mmu_host.c
@@ -19,7 +19,6 @@
#include <linux/string.h>
#include <linux/kvm.h>
#include <linux/kvm_host.h>
-#include <linux/highmem.h>
#include <linux/log2.h>
#include <linux/uaccess.h>
#include <linux/sched/mm.h>
@@ -667,9 +666,20 @@ int kvmppc_load_last_inst(struct kvm_vcpu *vcpu,
/* Map a page and get guest's instruction */
page = pfn_to_page(pfn);
- eaddr = (unsigned long)kmap_atomic(page);
+ if (IS_ENABLED(CONFIG_PREEMPT_RT))
+ migrate_disable();
+ else
+ preempt_disable();
+ pagefault_disable();
+ eaddr = (unsigned long)page_address(page);
+
*instr = *(u32 *)(eaddr | (unsigned long)(addr & ~PAGE_MASK));
- kunmap_atomic((u32 *)eaddr);
+
+ pagefault_enable();
+ if (IS_ENABLED(CONFIG_PREEMPT_RT))
+ migrate_enable();
+ else
+ preempt_enable();
return EMULATE_DONE;
}
diff --git a/arch/powerpc/mm/book3s32/mmu.c b/arch/powerpc/mm/book3s32/mmu.c
index be9c4106e22f..b26ce728cdb0 100644
--- a/arch/powerpc/mm/book3s32/mmu.c
+++ b/arch/powerpc/mm/book3s32/mmu.c
@@ -20,7 +20,6 @@
#include <linux/kernel.h>
#include <linux/mm.h>
#include <linux/init.h>
-#include <linux/highmem.h>
#include <linux/memblock.h>
#include <asm/mmu.h>
diff --git a/arch/powerpc/mm/book3s32/tlb.c b/arch/powerpc/mm/book3s32/tlb.c
index 9ad6b56bfec9..dfd136358644 100644
--- a/arch/powerpc/mm/book3s32/tlb.c
+++ b/arch/powerpc/mm/book3s32/tlb.c
@@ -20,7 +20,6 @@
#include <linux/kernel.h>
#include <linux/mm.h>
#include <linux/init.h>
-#include <linux/highmem.h>
#include <linux/pagemap.h>
#include <linux/export.h>
diff --git a/arch/powerpc/mm/cacheflush.c b/arch/powerpc/mm/cacheflush.c
index 7186516eca52..052c030a577f 100644
--- a/arch/powerpc/mm/cacheflush.c
+++ b/arch/powerpc/mm/cacheflush.c
@@ -1,6 +1,6 @@
// SPDX-License-Identifier: GPL-2.0-or-later
-#include <linux/highmem.h>
+#include <linux/cacheflush.h>
#include <linux/kprobes.h>
/**
@@ -76,51 +76,6 @@ void flush_icache_range(unsigned long start, unsigned long stop)
}
EXPORT_SYMBOL(flush_icache_range);
-#ifdef CONFIG_HIGHMEM
-/**
- * flush_dcache_icache_phys() - Flush a page by its physical address
- * @physaddr: the physical address of the page
- */
-static void flush_dcache_icache_phys(unsigned long physaddr)
-{
- unsigned long bytes = l1_dcache_bytes();
- unsigned long nb = PAGE_SIZE / bytes;
- unsigned long addr = physaddr & PAGE_MASK;
- unsigned long msr, msr0;
- unsigned long loop1 = addr, loop2 = addr;
-
- msr0 = mfmsr();
- msr = msr0 & ~MSR_DR;
- /*
- * This must remain as ASM to prevent potential memory accesses
- * while the data MMU is disabled
- */
- asm volatile(
- " mtctr %2;\n"
- " mtmsr %3;\n"
- " isync;\n"
- "0: dcbst 0, %0;\n"
- " addi %0, %0, %4;\n"
- " bdnz 0b;\n"
- " sync;\n"
- " mtctr %2;\n"
- "1: icbi 0, %1;\n"
- " addi %1, %1, %4;\n"
- " bdnz 1b;\n"
- " sync;\n"
- " mtmsr %5;\n"
- " isync;\n"
- : "+&r" (loop1), "+&r" (loop2)
- : "r" (nb), "r" (msr), "i" (bytes), "r" (msr0)
- : "ctr", "memory");
-}
-NOKPROBE_SYMBOL(flush_dcache_icache_phys)
-#else
-static void flush_dcache_icache_phys(unsigned long physaddr)
-{
-}
-#endif
-
/**
* __flush_dcache_icache(): Flush a particular page from the data cache to RAM.
* Note: this is necessary because the instruction cache does *not*
@@ -151,26 +106,13 @@ static void __flush_dcache_icache(void *p)
void flush_dcache_icache_folio(struct folio *folio)
{
unsigned int i, nr = folio_nr_pages(folio);
+ void *addr = folio_address(folio);
if (flush_coherent_icache())
return;
- if (!folio_test_highmem(folio)) {
- void *addr = folio_address(folio);
- for (i = 0; i < nr; i++)
- __flush_dcache_icache(addr + i * PAGE_SIZE);
- } else if (IS_ENABLED(CONFIG_BOOKE) || sizeof(phys_addr_t) > sizeof(void *)) {
- for (i = 0; i < nr; i++) {
- void *start = kmap_local_folio(folio, i * PAGE_SIZE);
-
- __flush_dcache_icache(start);
- kunmap_local(start);
- }
- } else {
- unsigned long pfn = folio_pfn(folio);
- for (i = 0; i < nr; i++)
- flush_dcache_icache_phys((pfn + i) * PAGE_SIZE);
- }
+ for (i = 0; i < nr; i++)
+ __flush_dcache_icache(addr + i * PAGE_SIZE);
}
EXPORT_SYMBOL(flush_dcache_icache_folio);
@@ -215,7 +157,6 @@ void flush_icache_user_page(struct vm_area_struct *vma, struct page *page,
{
void *maddr;
- maddr = kmap_local_page(page) + (addr & ~PAGE_MASK);
+ maddr = page_address(page) + (addr & ~PAGE_MASK);
flush_icache_range((unsigned long)maddr, (unsigned long)maddr + len);
- kunmap_local(maddr);
}
diff --git a/arch/powerpc/mm/dma-noncoherent.c b/arch/powerpc/mm/dma-noncoherent.c
index 30260b5d146d..0ca7e06c8eb3 100644
--- a/arch/powerpc/mm/dma-noncoherent.c
+++ b/arch/powerpc/mm/dma-noncoherent.c
@@ -9,7 +9,7 @@
#include <linux/kernel.h>
#include <linux/errno.h>
#include <linux/types.h>
-#include <linux/highmem.h>
+#include <linux/cacheflush.h>
#include <linux/dma-direct.h>
#include <linux/dma-map-ops.h>
@@ -46,47 +46,6 @@ static void __dma_sync(void *vaddr, size_t size, int direction)
}
}
-#ifdef CONFIG_HIGHMEM
-/*
- * __dma_sync_page() implementation for systems using highmem.
- * In this case, each page of a buffer must be kmapped/kunmapped
- * in order to have a virtual address for __dma_sync(). This must
- * not sleep so kmap_atomic()/kunmap_atomic() are used.
- *
- * Note: yes, it is possible and correct to have a buffer extend
- * beyond the first page.
- */
-static inline void __dma_sync_page_highmem(struct page *page,
- unsigned long offset, size_t size, int direction)
-{
- size_t seg_size = min((size_t)(PAGE_SIZE - offset), size);
- size_t cur_size = seg_size;
- unsigned long flags, start, seg_offset = offset;
- int nr_segs = 1 + ((size - seg_size) + PAGE_SIZE - 1)/PAGE_SIZE;
- int seg_nr = 0;
-
- local_irq_save(flags);
-
- do {
- start = (unsigned long)kmap_atomic(page + seg_nr) + seg_offset;
-
- /* Sync this buffer segment */
- __dma_sync((void *)start, seg_size, direction);
- kunmap_atomic((void *)start);
- seg_nr++;
-
- /* Calculate next buffer segment size */
- seg_size = min((size_t)PAGE_SIZE, size - cur_size);
-
- /* Add the segment size to our running total */
- cur_size += seg_size;
- seg_offset = 0;
- } while (seg_nr < nr_segs);
-
- local_irq_restore(flags);
-}
-#endif /* CONFIG_HIGHMEM */
-
/*
* __dma_sync_page makes memory consistent. identical to __dma_sync, but
* takes a struct page instead of a virtual address
@@ -95,13 +54,8 @@ static void __dma_sync_page(phys_addr_t paddr, size_t size, int dir)
{
struct page *page = pfn_to_page(paddr >> PAGE_SHIFT);
unsigned offset = paddr & ~PAGE_MASK;
-
-#ifdef CONFIG_HIGHMEM
- __dma_sync_page_highmem(page, offset, size, dir);
-#else
unsigned long start = (unsigned long)page_address(page) + offset;
__dma_sync((void *)start, size, dir);
-#endif
}
void arch_sync_dma_for_device(phys_addr_t paddr, size_t size,
diff --git a/arch/powerpc/mm/fault.c b/arch/powerpc/mm/fault.c
index 806c74e0d5ab..cec4e163f8ac 100644
--- a/arch/powerpc/mm/fault.c
+++ b/arch/powerpc/mm/fault.c
@@ -24,7 +24,6 @@
#include <linux/mman.h>
#include <linux/mm.h>
#include <linux/interrupt.h>
-#include <linux/highmem.h>
#include <linux/extable.h>
#include <linux/kprobes.h>
#include <linux/kdebug.h>
diff --git a/arch/powerpc/mm/init_32.c b/arch/powerpc/mm/init_32.c
index 4e71dfe7d026..a5e7cafb50ab 100644
--- a/arch/powerpc/mm/init_32.c
+++ b/arch/powerpc/mm/init_32.c
@@ -21,7 +21,6 @@
#include <linux/mm.h>
#include <linux/stddef.h>
#include <linux/init.h>
-#include <linux/highmem.h>
#include <linux/initrd.h>
#include <linux/pagemap.h>
#include <linux/memblock.h>
@@ -96,10 +95,8 @@ void __init MMU_init(void)
if (total_lowmem > __max_low_memory) {
total_lowmem = __max_low_memory;
lowmem_end_addr = memstart_addr + total_lowmem;
-#ifndef CONFIG_HIGHMEM
total_memory = total_lowmem;
memblock_enforce_memory_limit(total_lowmem);
-#endif /* CONFIG_HIGHMEM */
}
/* Initialize the MMU hardware */
diff --git a/arch/powerpc/mm/init_64.c b/arch/powerpc/mm/init_64.c
index b6f3ae03ca9e..547745ea99e1 100644
--- a/arch/powerpc/mm/init_64.c
+++ b/arch/powerpc/mm/init_64.c
@@ -29,7 +29,6 @@
#include <linux/vmalloc.h>
#include <linux/init.h>
#include <linux/delay.h>
-#include <linux/highmem.h>
#include <linux/idr.h>
#include <linux/nodemask.h>
#include <linux/module.h>
diff --git a/arch/powerpc/mm/mem.c b/arch/powerpc/mm/mem.c
index 3ddbfdbfa941..edd6c4964718 100644
--- a/arch/powerpc/mm/mem.c
+++ b/arch/powerpc/mm/mem.c
@@ -13,7 +13,6 @@
*/
#include <linux/memblock.h>
-#include <linux/highmem.h>
#include <linux/suspend.h>
#include <linux/dma-direct.h>
#include <linux/execmem.h>
@@ -172,9 +171,6 @@ void __init mem_topology_setup(void)
{
max_low_pfn = max_pfn = memblock_end_of_DRAM() >> PAGE_SHIFT;
min_low_pfn = MEMORY_START >> PAGE_SHIFT;
-#ifdef CONFIG_HIGHMEM
- max_low_pfn = lowmem_end_addr >> PAGE_SHIFT;
-#endif
/* Place all memblock_regions in the same node and merge contiguous
* memblock_regions
@@ -232,17 +228,6 @@ void __init paging_init(void)
phys_addr_t top_of_ram = memblock_end_of_DRAM();
int zone_dma_bits;
-#ifdef CONFIG_HIGHMEM
- unsigned long v = __fix_to_virt(FIX_KMAP_END);
- unsigned long end = __fix_to_virt(FIX_KMAP_BEGIN);
-
- for (; v < end; v += PAGE_SIZE)
- map_kernel_page(v, 0, __pgprot(0)); /* XXX gross */
-
- map_kernel_page(PKMAP_BASE, 0, __pgprot(0)); /* XXX gross */
- pkmap_page_table = virt_to_kpte(PKMAP_BASE);
-#endif /* CONFIG_HIGHMEM */
-
printk(KERN_DEBUG "Top of RAM: 0x%llx, Total RAM: 0x%llx\n",
(unsigned long long)top_of_ram, total_ram);
printk(KERN_DEBUG "Memory hole size: %ldMB\n",
@@ -264,9 +249,6 @@ void __init paging_init(void)
1UL << (zone_dma_bits - PAGE_SHIFT));
#endif
max_zone_pfns[ZONE_NORMAL] = max_low_pfn;
-#ifdef CONFIG_HIGHMEM
- max_zone_pfns[ZONE_HIGHMEM] = max_pfn;
-#endif
free_area_init(max_zone_pfns);
diff --git a/arch/powerpc/mm/nohash/e500.c b/arch/powerpc/mm/nohash/e500.c
index 266fb22131fc..23b111afbdfd 100644
--- a/arch/powerpc/mm/nohash/e500.c
+++ b/arch/powerpc/mm/nohash/e500.c
@@ -34,7 +34,6 @@
#include <linux/vmalloc.h>
#include <linux/init.h>
#include <linux/delay.h>
-#include <linux/highmem.h>
#include <linux/memblock.h>
#include <linux/of_fdt.h>
diff --git a/arch/powerpc/mm/nohash/tlb.c b/arch/powerpc/mm/nohash/tlb.c
index 0a650742f3a0..ec1f58b23865 100644
--- a/arch/powerpc/mm/nohash/tlb.c
+++ b/arch/powerpc/mm/nohash/tlb.c
@@ -26,7 +26,6 @@
#include <linux/export.h>
#include <linux/mm.h>
#include <linux/init.h>
-#include <linux/highmem.h>
#include <linux/pagemap.h>
#include <linux/preempt.h>
#include <linux/spinlock.h>
diff --git a/arch/powerpc/mm/nohash/tlb_64e.c b/arch/powerpc/mm/nohash/tlb_64e.c
index 4f925adf2695..9e2f94ffc90f 100644
--- a/arch/powerpc/mm/nohash/tlb_64e.c
+++ b/arch/powerpc/mm/nohash/tlb_64e.c
@@ -263,8 +263,7 @@ static void __init early_mmu_set_memory_limit(void)
* Limit memory so we dont have linear faults.
* Unlike memblock_set_current_limit, which limits
* memory available during early boot, this permanently
- * reduces the memory available to Linux. We need to
- * do this because highmem is not supported on 64-bit.
+ * reduces the memory available to Linux.
*/
memblock_enforce_memory_limit(linear_map_top);
@@ -290,8 +289,8 @@ void setup_initial_memory_limit(phys_addr_t first_memblock_base,
/*
* On FSL Embedded 64-bit, usually all RAM is bolted, but with
* unusual memory sizes it's possible for some RAM to not be mapped
- * (such RAM is not used at all by Linux, since we don't support
- * highmem on 64-bit). We limit ppc64_rma_size to what would be
+ * (such RAM is not used at all by Linux.
+ * We limit ppc64_rma_size to what would be
* mappable if this memblock is the only one. Additional memblocks
* can only increase, not decrease, the amount that ends up getting
* mapped. We still limit max to 1G even if we'll eventually map
diff --git a/arch/powerpc/mm/pageattr.c b/arch/powerpc/mm/pageattr.c
index ac22bf28086f..2643f50ede1c 100644
--- a/arch/powerpc/mm/pageattr.c
+++ b/arch/powerpc/mm/pageattr.c
@@ -110,9 +110,6 @@ void __kernel_map_pages(struct page *page, int numpages, int enable)
int err;
unsigned long addr = (unsigned long)page_address(page);
- if (PageHighMem(page))
- return;
-
if (IS_ENABLED(CONFIG_PPC_BOOK3S_64) && !radix_enabled())
err = hash__kernel_map_pages(page, numpages, enable);
else if (enable)
diff --git a/arch/powerpc/mm/pgtable_32.c b/arch/powerpc/mm/pgtable_32.c
index 15276068f657..cf24685df64a 100644
--- a/arch/powerpc/mm/pgtable_32.c
+++ b/arch/powerpc/mm/pgtable_32.c
@@ -20,7 +20,6 @@
#include <linux/mm.h>
#include <linux/vmalloc.h>
#include <linux/init.h>
-#include <linux/highmem.h>
#include <linux/memblock.h>
#include <linux/slab.h>
#include <linux/set_memory.h>
diff --git a/arch/powerpc/mm/ptdump/ptdump.c b/arch/powerpc/mm/ptdump/ptdump.c
index b2358d794855..708fdafeb2a3 100644
--- a/arch/powerpc/mm/ptdump/ptdump.c
+++ b/arch/powerpc/mm/ptdump/ptdump.c
@@ -15,7 +15,6 @@
#include <linux/hugetlb.h>
#include <linux/io.h>
#include <linux/mm.h>
-#include <linux/highmem.h>
#include <linux/ptdump.h>
#include <linux/sched.h>
#include <linux/seq_file.h>
@@ -91,10 +90,6 @@ static struct addr_marker address_markers[] = {
#else
{ 0, "Early I/O remap start" },
{ 0, "Early I/O remap end" },
-#ifdef CONFIG_HIGHMEM
- { 0, "Highmem PTEs start" },
- { 0, "Highmem PTEs end" },
-#endif
{ 0, "Fixmap start" },
{ 0, "Fixmap end" },
#endif
@@ -285,10 +280,6 @@ static void populate_markers(void)
#else /* !CONFIG_PPC64 */
address_markers[i++].start_address = ioremap_bot;
address_markers[i++].start_address = IOREMAP_TOP;
-#ifdef CONFIG_HIGHMEM
- address_markers[i++].start_address = PKMAP_BASE;
- address_markers[i++].start_address = PKMAP_ADDR(LAST_PKMAP);
-#endif
address_markers[i++].start_address = FIXADDR_START;
address_markers[i++].start_address = FIXADDR_TOP;
#endif /* CONFIG_PPC64 */
diff --git a/arch/powerpc/platforms/44x/pci.c b/arch/powerpc/platforms/44x/pci.c
index 364aeb86ab64..993ff920caa3 100644
--- a/arch/powerpc/platforms/44x/pci.c
+++ b/arch/powerpc/platforms/44x/pci.c
@@ -1833,8 +1833,7 @@ static void __init ppc4xx_pciex_port_setup_hose(struct ppc4xx_pciex_port *port)
hose->last_busno = bus_range ? bus_range[1] : 0xff;
/* Because of how big mapping the config space is (1M per bus), we
- * limit how many busses we support. In the long run, we could replace
- * that with something akin to kmap_atomic instead. We set aside 1 bus
+ * limit how many busses we support. We set aside 1 bus
* for the host itself too.
*/
busses = hose->last_busno - hose->first_busno; /* This is off by 1 */
diff --git a/arch/powerpc/platforms/85xx/smp.c b/arch/powerpc/platforms/85xx/smp.c
index 32fa5fb557c0..f0dad94008b9 100644
--- a/arch/powerpc/platforms/85xx/smp.c
+++ b/arch/powerpc/platforms/85xx/smp.c
@@ -13,7 +13,6 @@
#include <linux/delay.h>
#include <linux/of.h>
#include <linux/kexec.h>
-#include <linux/highmem.h>
#include <linux/cpu.h>
#include <linux/fsl/guts.h>
#include <linux/pgtable.h>
@@ -204,8 +203,8 @@ static int smp_85xx_start_cpu(int cpu)
/*
* A secondary core could be in a spinloop in the bootpage
- * (0xfffff000), somewhere in highmem, or somewhere in lowmem.
- * The bootpage and highmem can be accessed via ioremap(), but
+ * (0xfffff000), somewhere in lowmem.
+ * The bootpage can be accessed via ioremap(), but
* we need to directly access the spinloop if its in lowmem.
*/
ioremappable = *cpu_rel_addr > virt_to_phys(high_memory - 1);
diff --git a/arch/powerpc/platforms/ps3/system-bus.c b/arch/powerpc/platforms/ps3/system-bus.c
index afbaabf182d0..1f20311ed0c9 100644
--- a/arch/powerpc/platforms/ps3/system-bus.c
+++ b/arch/powerpc/platforms/ps3/system-bus.c
@@ -510,7 +510,7 @@ static void * ps3_alloc_coherent(struct device *_dev, size_t size,
struct ps3_system_bus_device *dev = ps3_dev_to_system_bus_dev(_dev);
unsigned long virt_addr;
- flag &= ~(__GFP_DMA | __GFP_HIGHMEM);
+ flag &= ~__GFP_DMA;
flag |= __GFP_ZERO;
virt_addr = __get_free_pages(flag, get_order(size));
diff --git a/arch/powerpc/xmon/xmon.c b/arch/powerpc/xmon/xmon.c
index cb3a3244ae6f..6be4b0ea9a82 100644
--- a/arch/powerpc/xmon/xmon.c
+++ b/arch/powerpc/xmon/xmon.c
@@ -24,7 +24,6 @@
#include <linux/bug.h>
#include <linux/nmi.h>
#include <linux/ctype.h>
-#include <linux/highmem.h>
#include <linux/security.h>
#include <linux/debugfs.h>
--
2.49.0
^ permalink raw reply [flat|nested] 2+ messages in thread* Re: [RFC PATCH] powerpc: Remove CONFIG_HIGHMEM
2025-09-10 13:47 [RFC PATCH] powerpc: Remove CONFIG_HIGHMEM Christophe Leroy
@ 2025-09-10 20:13 ` Arnd Bergmann
0 siblings, 0 replies; 2+ messages in thread
From: Arnd Bergmann @ 2025-09-10 20:13 UTC (permalink / raw)
To: Christophe Leroy, Michael Ellerman, Nicholas Piggin, Madhavan Srinivasan
Cc: linux-kernel, linuxppc-dev
On Wed, Sep 10, 2025, at 15:47, Christophe Leroy wrote:
> There are some discussion around to opportunity to get rid of
> CONFIG_HIGHMEM, see [1]. This RFC is a tentative to remove it
> from powerpc so that people can experiment what it would
> look like and what would be the outcomes.
>
> CONFIG_HIGHMEM is being depracated, remove it.
>
> To accomodate boards with up to 1Gbytes RAM, PAGE_OFFSET and
> TASK_SIZE is adjusted to 0xb0000000 (a0000000 on book3s/32 with modules).
>
> If you have more than 1Gbytes of RAM you can adjust CONFIG_LOWMEM_SIZE.
>
> [1]
> https://lore.kernel.org/all/4ff89b72-03ff-4447-9d21-dd6a5fe1550f@app.fastmail.com/
>
> Signed-off-by: Christophe Leroy <christophe.leroy@csgroup.eu>
Thanks for going through this, even if we keep partial highmem
support alive a little longer, it's good to know what the pieces
are that would go away. I think the majority of these already
removes stuff that no longer has any function, but there are
obviously a couple of machines that use highmem today, even
after changing the LOWMEM_SIZE setting.
I took a closer look at the ones that had CONFIG_HIGHMEM set
in the defconfig (I tried to look earlier for powerpc boards
but didn't have the idea to check the config) and found a
handful of machines that were able to use 2GB on MPC8572E,
MPC8640D or QorIQ P20xx, as well as two that have 4GB.
As with the Arm boards, the 2GB configurations may work
by further changing the LOWMEM_SIZE etc, but this has
a higher risk of breaking either drivers or applications.
The 4GB configs are obviously more problematic, no LOWMEM_SIZE
setting can give back the memory lost from disabling highmem.
Two options we are discussing for those are either leaving
highmem only as zram backing store long-term, or leaving it
for page cache only.
There is also a related setting:
config PHYS_64BIT
bool 'Large physical address support' if PPC_E500 || PPC_86xx
depends on (44x || PPC_E500 || PPC_86xx) && !PPC_83xx && !PPC_82xx
select PHYS_ADDR_T_64BIT
This is currently enabled in 85xx-32bit.config, and probably
required specifically for the boards that have 4GB of RAM,
as the PCI MMIO space starts at physical address 0x80000000 (2GB)
on the qoriq and mpc8641 boards.
The PHYS_64BIT option itself should probably use
'depends on HIGHMEM'.
> diff --git a/arch/powerpc/Kconfig b/arch/powerpc/Kconfig
> index 93402a1d9c9f..fec1db5fcb97 100644
> --- a/arch/powerpc/Kconfig
> +++ b/arch/powerpc/Kconfig
> @@ -482,11 +482,6 @@ source "arch/powerpc/platforms/Kconfig"
>
> menu "Kernel options"
>
> -config HIGHMEM
> - bool "High memory support"
> - depends on PPC32
> - select KMAP_LOCAL
> -
This could stay guarded by 'depends on EXPERT' in that case.
> @@ -1193,7 +1188,7 @@ config LOWMEM_SIZE_BOOL
>
> config LOWMEM_SIZE
> hex "Maximum low memory size (in bytes)" if LOWMEM_SIZE_BOOL
> - default "0x30000000"
> + default "0x40000000"
>
> config LOWMEM_CAM_NUM_BOOL
> bool "Set number of CAMs to use to map low memory"
> @@ -1245,7 +1240,7 @@ config PAGE_OFFSET_BOOL
>
> config PAGE_OFFSET
> hex "Virtual address of memory base" if PAGE_OFFSET_BOOL
> - default "0xc0000000"
> + default "0xb0000000"
>
> config KERNEL_START_BOOL
> bool "Set custom kernel base address"
>
> @@ -1298,8 +1293,8 @@ config TASK_SIZE_BOOL
> config TASK_SIZE
> hex "Size of user task space" if TASK_SIZE_BOOL
> default "0x80000000" if PPC_8xx
> - default "0xb0000000" if PPC_BOOK3S_32 && EXECMEM
> - default "0xc0000000"
> + default "0xa0000000" if PPC_BOOK3S_32 && EXECMEM
> + default "0xb0000000"
>
> config MODULES_SIZE_BOOL
> bool "Set custom size for modules/execmem area"
These all look good to me, as I suggested we should do the
same thing on arm and x86 using CONFIG_VMSPLIT_3G_OPT
as the default.
> diff --git a/arch/powerpc/configs/85xx-32bit.config
> b/arch/powerpc/configs/85xx-32bit.config
> index a85310bcb1fd..f96db0bc888f 100644
> --- a/arch/powerpc/configs/85xx-32bit.config
> +++ b/arch/powerpc/configs/85xx-32bit.config
> @@ -1,5 +1,4 @@
> CONFIG_PPC64=n
> -CONFIG_HIGHMEM=y
> CONFIG_KEXEC=y
> CONFIG_PPC_85xx=y
> CONFIG_PROC_KCORE=y
I know the nic.cz Turris has a P2020 CPU and 2GB.
> diff --git a/arch/powerpc/configs/85xx/ge_imp3a_defconfig
> b/arch/powerpc/configs/85xx/ge_imp3a_defconfig
> index 7beb36a41d45..da9f649107dc 100644
> --- a/arch/powerpc/configs/85xx/ge_imp3a_defconfig
> +++ b/arch/powerpc/configs/85xx/ge_imp3a_defconfig
> @@ -23,7 +23,6 @@ CONFIG_MODULE_UNLOAD=y
> CONFIG_GE_IMP3A=y
> CONFIG_QE_GPIO=y
> CONFIG_CPM2=y
> -CONFIG_HIGHMEM=y
> CONFIG_HZ_1000=y
> CONFIG_PREEMPT=y
> # CONFIG_CORE_DUMP_DEFAULT_ELF_HEADERS is not set
I see that IMP3A has 4GB of DDR3 memory, so this one
clearly depends on HIGHMEM for actual users if any remain.
https://abaco.com/products/powerpact3-imp3a/p3516 shows
it has "entered a Restricted Production Phase (RPP) on August
28, 2020", which was roughly when NXP discontinued the
QORIQ P2 CPU, and 10 years after it was first introduced.
This was targeted at the military and aerospace markets,
so there is a good chance that some are still in use, but
I have no idea whether any of the users are planning to
update the kernels.
> diff --git a/arch/powerpc/configs/85xx/xes_mpc85xx_defconfig
> b/arch/powerpc/configs/85xx/xes_mpc85xx_defconfig
> index 488d03ae6d6c..10764fad2eb9 100644
> --- a/arch/powerpc/configs/85xx/xes_mpc85xx_defconfig
> +++ b/arch/powerpc/configs/85xx/xes_mpc85xx_defconfig
> @@ -18,7 +18,6 @@ CONFIG_MODVERSIONS=y
> # CONFIG_BLK_DEV_BSG is not set
> CONFIG_PARTITION_ADVANCED=y
> CONFIG_XES_MPC85xx=y
> -CONFIG_HIGHMEM=y
> CONFIG_MATH_EMULATION=y
> CONFIG_PCI=y
> CONFIG_PCIEPORTBUS=y
Same here: 2-4GB DDR3, sold 2009-2018
https://www.xes-inc.com/products/end-of-life-sbcs/xcalibur1501/
> diff --git a/arch/powerpc/configs/chrp32_defconfig
> b/arch/powerpc/configs/chrp32_defconfig
> index b799c95480ae..304de18b51f8 100644
> --- a/arch/powerpc/configs/chrp32_defconfig
> +++ b/arch/powerpc/configs/chrp32_defconfig
> @@ -17,7 +17,6 @@ CONFIG_PARTITION_ADVANCED=y
> CONFIG_MAC_PARTITION=y
> # CONFIG_PPC_PMAC is not set
> CONFIG_GEN_RTC=y
> -CONFIG_HIGHMEM=y
> CONFIG_BINFMT_MISC=y
> CONFIG_IRQ_ALL_CPUS=y
> CONFIG_ISA=y
Apparently the Pegasos-II could support 2GB if you had the right
board revision and memory.
> diff --git a/arch/powerpc/configs/mpc86xx_base.config
> b/arch/powerpc/configs/mpc86xx_base.config
> index 632c014b122d..a1ca1f7da240 100644
> --- a/arch/powerpc/configs/mpc86xx_base.config
> +++ b/arch/powerpc/configs/mpc86xx_base.config
> @@ -3,6 +3,5 @@ CONFIG_GEF_PPC9A=y
> CONFIG_GEF_SBC310=y
> CONFIG_GEF_SBC610=y
> CONFIG_MVME7100=y
> -CONFIG_HIGHMEM=y
> CONFIG_KEXEC=y
> CONFIG_PROC_KCORE=y
There are four 8640 based boards enabled here, three of them
support 2GB RAM. Apparently the MVME7100 still has "limited
availablilty, the others were discontinued in 2018 or before.
> diff --git a/arch/powerpc/configs/pmac32_defconfig
> b/arch/powerpc/configs/pmac32_defconfig
> index ae45f70b29f0..24e73489947a 100644
> --- a/arch/powerpc/configs/pmac32_defconfig
> +++ b/arch/powerpc/configs/pmac32_defconfig
> @@ -20,7 +20,6 @@ CONFIG_CPU_FREQ_GOV_POWERSAVE=y
> CONFIG_CPU_FREQ_GOV_USERSPACE=y
> CONFIG_CPU_FREQ_PMAC=y
> CONFIG_GEN_RTC=y
> -CONFIG_HIGHMEM=y
> CONFIG_BINFMT_MISC=m
> CONFIG_HIBERNATION=y
> CONFIG_PM_DEBUG=y
A couple of G4 Macs could be upgraded to 2GB.
> diff --git a/arch/powerpc/configs/ppc6xx_defconfig
> b/arch/powerpc/configs/ppc6xx_defconfig
> index bb359643ddc1..75b44ce12332 100644
> --- a/arch/powerpc/configs/ppc6xx_defconfig
> +++ b/arch/powerpc/configs/ppc6xx_defconfig
> @@ -60,7 +60,6 @@ CONFIG_TAU=y
> CONFIG_TAU_AVERAGE=y
> CONFIG_QE_GPIO=y
> CONFIG_MCU_MPC8349EMITX=y
> -CONFIG_HIGHMEM=y
> CONFIG_HZ_1000=y
> CONFIG_PREEMPT_VOLUNTARY=y
> CONFIG_BINFMT_MISC=y
This includes the mpc86xx boards from mpc86xx_base config.
> diff --git a/arch/powerpc/kvm/book3s.c b/arch/powerpc/kvm/book3s.c
> index d79c5d1098c0..7489557f582a 100644
> --- a/arch/powerpc/kvm/book3s.c
> +++ b/arch/powerpc/kvm/book3s.c
> @@ -20,7 +20,6 @@
> #include <linux/gfp.h>
> #include <linux/sched.h>
> #include <linux/vmalloc.h>
> -#include <linux/highmem.h>
>
> #include <asm/reg.h>
> #include <asm/cputable.h>
Right, all the linux/highmem.h inclusions are probably unnecessary
regardless.
> diff --git a/arch/powerpc/platforms/ps3/system-bus.c
> b/arch/powerpc/platforms/ps3/system-bus.c
> index afbaabf182d0..1f20311ed0c9 100644
> --- a/arch/powerpc/platforms/ps3/system-bus.c
> +++ b/arch/powerpc/platforms/ps3/system-bus.c
> @@ -510,7 +510,7 @@ static void * ps3_alloc_coherent(struct device
> *_dev, size_t size,
> struct ps3_system_bus_device *dev = ps3_dev_to_system_bus_dev(_dev);
> unsigned long virt_addr;
>
> - flag &= ~(__GFP_DMA | __GFP_HIGHMEM);
> + flag &= ~__GFP_DMA;
> flag |= __GFP_ZERO;
>
> virt_addr = __get_free_pages(flag, get_order(size));
This should never have used __GFP_HIGHMEM since it does not support
32-bit kernels.
Arnd
^ permalink raw reply [flat|nested] 2+ messages in thread
end of thread, other threads:[~2025-09-10 20:14 UTC | newest]
Thread overview: 2+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2025-09-10 13:47 [RFC PATCH] powerpc: Remove CONFIG_HIGHMEM Christophe Leroy
2025-09-10 20:13 ` Arnd Bergmann
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox
all inboxes | Powered by JetHome®