diff --git a/arch/powerpc/cpu/mpc85xx/cpu_init.c b/arch/powerpc/cpu/mpc85xx/cpu_init.c
index a7b805bc67..739d14f800 100644
--- a/arch/powerpc/cpu/mpc85xx/cpu_init.c
+++ b/arch/powerpc/cpu/mpc85xx/cpu_init.c
@@ -940,22 +940,6 @@ int cpu_init_r(void)
 	return 0;
 }
 
-#ifdef CONFIG_ARCH_MISC_INIT
-int arch_misc_init(void)
-{
-	if (IS_ENABLED(CONFIG_FSL_CAAM)) {
-		struct udevice *dev;
-		int ret;
-
-		ret = uclass_get_device_by_driver(UCLASS_MISC, DM_DRIVER_GET(caam_jr), &dev);
-		if (ret)
-			printf("Failed to initialize caam_jr: %d\n", ret);
-	}
-
-	return 0;
-}
-#endif
-
 void arch_preboot_os(void)
 {
 	u32 msr;
diff --git a/arch/powerpc/lib/Makefile b/arch/powerpc/lib/Makefile
index bb819dcbb6..ecc2aba8f3 100644
--- a/arch/powerpc/lib/Makefile
+++ b/arch/powerpc/lib/Makefile
@@ -39,6 +39,7 @@ obj-y	+= cache.o
 obj-y	+= extable.o
 obj-y	+= interrupts.o
 obj-$(CONFIG_CMD_KGDB) += kgdb.o
+obj-y	+= misc.o
 obj-y	+= stack.o
 obj-y	+= time.o
 obj-y	+= traps.o
diff --git a/arch/powerpc/lib/bootm.c b/arch/powerpc/lib/bootm.c
index 752f72f873..8f21cdb0a5 100644
--- a/arch/powerpc/lib/bootm.c
+++ b/arch/powerpc/lib/bootm.c
@@ -12,7 +12,6 @@
 #include <cpu_func.h>
 #include <env.h>
 #include <init.h>
-#include <lmb.h>
 #include <log.h>
 #include <watchdog.h>
 #include <command.h>
@@ -41,10 +40,6 @@ static ulong get_sp (void);
 extern void ft_fixup_num_cores(void *blob);
 static void set_clocks_in_mhz (struct bd_info *kbd);
 
-#ifndef CFG_SYS_LINUX_LOWMEM_MAX_SIZE
-#define CFG_SYS_LINUX_LOWMEM_MAX_SIZE	(768*1024*1024)
-#endif
-
 static void boot_jump_linux(struct bootm_headers *images)
 {
 	void	(*kernel)(struct bd_info *, ulong r4, ulong r5, ulong r6,
@@ -116,41 +111,6 @@ static void boot_jump_linux(struct bootm_headers *images)
 	return;
 }
 
-void arch_lmb_reserve(void)
-{
-	phys_size_t bootm_size;
-	ulong size, bootmap_base;
-
-	bootmap_base = env_get_bootm_low();
-	bootm_size = env_get_bootm_size();
-
-#ifdef DEBUG
-	if (((u64)bootmap_base + bootm_size) >
-	    (CFG_SYS_SDRAM_BASE + (u64)gd->ram_size))
-		puts("WARNING: bootm_low + bootm_size exceed total memory\n");
-	if ((bootmap_base + bootm_size) > get_effective_memsize())
-		puts("WARNING: bootm_low + bootm_size exceed eff. memory\n");
-#endif
-
-	size = min(bootm_size, get_effective_memsize());
-	size = min(size, (ulong)CFG_SYS_LINUX_LOWMEM_MAX_SIZE);
-
-	if (size < bootm_size) {
-		ulong base = bootmap_base + size;
-		printf("WARNING: adjusting available memory from 0x%lx to 0x%llx\n",
-		       size, (unsigned long long)bootm_size);
-		lmb_reserve(base, bootm_size - size);
-	}
-
-	arch_lmb_reserve_generic(get_sp(), gd->ram_top, 4096);
-
-#ifdef CONFIG_MP
-	cpu_mp_lmb_reserve();
-#endif
-
-	return;
-}
-
 static void boot_prep_linux(struct bootm_headers *images)
 {
 #ifdef CONFIG_MP
diff --git a/arch/powerpc/lib/misc.c b/arch/powerpc/lib/misc.c
new file mode 100644
index 0000000000..4cd23b3406
--- /dev/null
+++ b/arch/powerpc/lib/misc.c
@@ -0,0 +1,62 @@
+// SPDX-License-Identifier: GPL-2.0+
+/*
+ * (C) Copyright 2024 Linaro Ltd.
+ */
+
+#include <image.h>
+#include <init.h>
+#include <lmb.h>
+
+#include <asm/mp.h>
+#include <dm/device.h>
+#include <dm/uclass.h>
+
+#ifndef CFG_SYS_LINUX_LOWMEM_MAX_SIZE
+#define CFG_SYS_LINUX_LOWMEM_MAX_SIZE	(768 * 1024 * 1024)
+#endif
+
+int arch_misc_init(void)
+{
+	if (CONFIG_IS_ENABLED(CMD_BOOTM)) {
+		phys_size_t bootm_size;
+		ulong size, bootmap_base;
+
+		bootmap_base = env_get_bootm_low();
+		bootm_size = env_get_bootm_size();
+
+#ifdef DEBUG
+		if (((u64)bootmap_base + bootm_size) >
+		    (CFG_SYS_SDRAM_BASE + (u64)gd->ram_size))
+			puts("WARNING: bootm_low + bootm_size exceed total memory\n");
+		if ((bootmap_base + bootm_size) > get_effective_memsize())
+			puts("WARNING: bootm_low + bootm_size exceed eff. memory\n");
+#endif
+
+		size = min(bootm_size, get_effective_memsize());
+		size = min(size, (ulong)CFG_SYS_LINUX_LOWMEM_MAX_SIZE);
+
+		if (size < bootm_size) {
+			ulong base = bootmap_base + size;
+
+			printf("WARNING: adjusting available memory from 0x%lx to 0x%llx\n",
+			       size, (unsigned long long)bootm_size);
+			lmb_reserve(base, bootm_size - size);
+		}
+
+#ifdef CONFIG_MP
+		cpu_mp_lmb_reserve();
+#endif
+	}
+
+	if (IS_ENABLED(CONFIG_FSL_CAAM)) {
+		struct udevice *dev;
+		int ret;
+
+		ret = uclass_get_device_by_driver(UCLASS_MISC,
+						  DM_DRIVER_GET(caam_jr), &dev);
+		if (ret)
+			printf("Failed to initialize caam_jr: %d\n", ret);
+	}
+
+	return 0;
+}
diff --git a/lib/Kconfig b/lib/Kconfig
index 6a9338390a..e352b5550a 100644
--- a/lib/Kconfig
+++ b/lib/Kconfig
@@ -1102,6 +1102,7 @@ config LMB
 	bool "Enable the logical memory blocks library (lmb)"
 	default y if ARC || ARM || M68K || MICROBLAZE || MIPS || \
 		     NIOS2 || PPC || RISCV || SANDBOX || SH || X86 || XTENSA
+	select ARCH_MISC_INIT if PPC
 	help
 	  Support the library logical memory blocks. This will require
 	  a malloc() implementation for defining the data structures
