diff mbox series

[v3,17/36] mach-snapdragon: generalise board support

Message ID 20240130-b4-qcom-common-target-v3-17-e523cbf9e556@linaro.org
State Superseded
Headers show
Series Qualcomm generic board support | expand

Commit Message

Caleb Connolly Jan. 30, 2024, 2:05 p.m. UTC
Historically, Qualcomm boards have relied on heavy hardcoding in U-Boot,
in many cases to the specific SoC but also to the board itself (e.g.
memory map). This has been largely resolved by modernising the Qualcomm
drivers in U-Boot, however the board code still largely follows this
model.

This patch removes the board specific memory maps and duplicated board
init code, replacing it with generic init code.

The memory map is now built at runtime based on data read from DT, this
allows for the memory map to be provided without having to recompile
U-Boot. Support is also added for booting with appended DTBs, so that
the first-stage bootloader can populate the memory map for us.

The sdm845 specific init code is dropped entirely, it set an environment
variable depending on if a button was pressed, but this variable wasn't
used in U-Boot, and could be written to use the button command instead.

The KASLR detection is also dropped as with appended dtb, the kaslr seed
can be read directly from the DTB passed to U-Boot.

A new qcom_defconfig is added, with the aim of providing a generic
U-Boot configuration that will work on as many Qualcomm boards as
possible. It replaces the defconfig files for the Dragonboard 845c,
Galaxy S9, and QCS404 EVB. For now the db410c and 820c are excluded as
they still have some board code left.

Similarly, the config headers for db845c, starqltechn, and qcs404-evb
are replaced by a single qcom header.

The previously db410c-specific board_usb_init() function is made to be
generic and is added to mach-snapdragon. While we lack proper modelling
for USB configuration, using a well-known named pinctrl state is a
reasonably generic middleground, and works using upstream DT. This
function will do nothing unless the USB node has a pinctrl state named
"device", in which case it will be set when entering USB peripheral
mode.

Reviewed-by: Neil Armstrong <neil.armstrong@linaro.org>
Signed-off-by: Caleb Connolly <caleb.connolly@linaro.org>
---
 arch/arm/Kconfig                                 |   3 +
 arch/arm/dts/Makefile                            |   9 +-
 arch/arm/mach-snapdragon/Kconfig                 |  96 ++--------
 arch/arm/mach-snapdragon/Makefile                |   6 +-
 arch/arm/mach-snapdragon/board.c                 | 216 +++++++++++++++++++++++
 arch/arm/mach-snapdragon/init_sdm845.c           |  73 --------
 arch/arm/mach-snapdragon/sysmap-apq8016.c        |  31 ----
 arch/arm/mach-snapdragon/sysmap-apq8096.c        |  31 ----
 arch/arm/mach-snapdragon/sysmap-qcs404.c         |  43 -----
 arch/arm/mach-snapdragon/sysmap-sdm845.c         |  31 ----
 board/qualcomm/dragonboard410c/Kconfig           |  15 --
 board/qualcomm/dragonboard410c/dragonboard410c.c |  41 -----
 board/qualcomm/dragonboard820c/Kconfig           |  15 --
 board/qualcomm/dragonboard820c/dragonboard820c.c |  39 +---
 board/qualcomm/dragonboard845c/Kconfig           |  12 --
 board/qualcomm/qcs404-evb/Kconfig                |  15 --
 board/qualcomm/qcs404-evb/qcs404-evb.c           |  21 +--
 configs/dragonboard410c_defconfig                |   6 +-
 configs/dragonboard820c_defconfig                |   6 +-
 configs/dragonboard845c_defconfig                |  29 ---
 configs/qcom_defconfig                           |  73 ++++++++
 configs/qcs404evb_defconfig                      |   5 +-
 configs/starqltechn_defconfig                    |  41 -----
 include/configs/dragonboard845c.h                |  20 ---
 include/configs/qcom.h                           |  21 +++
 include/configs/qcs404-evb.h                     |  20 ---
 include/configs/sdm845.h                         |  26 ---
 27 files changed, 352 insertions(+), 592 deletions(-)

Comments

Sumit Garg Feb. 1, 2024, 12:30 p.m. UTC | #1
On Tue, 30 Jan 2024 at 19:35, Caleb Connolly <caleb.connolly@linaro.org> wrote:
>
> Historically, Qualcomm boards have relied on heavy hardcoding in U-Boot,
> in many cases to the specific SoC but also to the board itself (e.g.
> memory map). This has been largely resolved by modernising the Qualcomm
> drivers in U-Boot, however the board code still largely follows this
> model.
>
> This patch removes the board specific memory maps and duplicated board
> init code, replacing it with generic init code.
>
> The memory map is now built at runtime based on data read from DT, this
> allows for the memory map to be provided without having to recompile
> U-Boot. Support is also added for booting with appended DTBs, so that
> the first-stage bootloader can populate the memory map for us.
>
> The sdm845 specific init code is dropped entirely, it set an environment
> variable depending on if a button was pressed, but this variable wasn't
> used in U-Boot, and could be written to use the button command instead.
>
> The KASLR detection is also dropped as with appended dtb, the kaslr seed
> can be read directly from the DTB passed to U-Boot.
>
> A new qcom_defconfig is added, with the aim of providing a generic
> U-Boot configuration that will work on as many Qualcomm boards as
> possible. It replaces the defconfig files for the Dragonboard 845c,
> Galaxy S9, and QCS404 EVB. For now the db410c and 820c are excluded as
> they still have some board code left.
>
> Similarly, the config headers for db845c, starqltechn, and qcs404-evb
> are replaced by a single qcom header.
>
> The previously db410c-specific board_usb_init() function is made to be
> generic and is added to mach-snapdragon. While we lack proper modelling
> for USB configuration, using a well-known named pinctrl state is a
> reasonably generic middleground, and works using upstream DT. This
> function will do nothing unless the USB node has a pinctrl state named
> "device", in which case it will be set when entering USB peripheral
> mode.
>
> Reviewed-by: Neil Armstrong <neil.armstrong@linaro.org>
> Signed-off-by: Caleb Connolly <caleb.connolly@linaro.org>
> ---
>  arch/arm/Kconfig                                 |   3 +
>  arch/arm/dts/Makefile                            |   9 +-
>  arch/arm/mach-snapdragon/Kconfig                 |  96 ++--------
>  arch/arm/mach-snapdragon/Makefile                |   6 +-
>  arch/arm/mach-snapdragon/board.c                 | 216 +++++++++++++++++++++++
>  arch/arm/mach-snapdragon/init_sdm845.c           |  73 --------
>  arch/arm/mach-snapdragon/sysmap-apq8016.c        |  31 ----
>  arch/arm/mach-snapdragon/sysmap-apq8096.c        |  31 ----
>  arch/arm/mach-snapdragon/sysmap-qcs404.c         |  43 -----
>  arch/arm/mach-snapdragon/sysmap-sdm845.c         |  31 ----
>  board/qualcomm/dragonboard410c/Kconfig           |  15 --
>  board/qualcomm/dragonboard410c/dragonboard410c.c |  41 -----
>  board/qualcomm/dragonboard820c/Kconfig           |  15 --
>  board/qualcomm/dragonboard820c/dragonboard820c.c |  39 +---
>  board/qualcomm/dragonboard845c/Kconfig           |  12 --
>  board/qualcomm/qcs404-evb/Kconfig                |  15 --
>  board/qualcomm/qcs404-evb/qcs404-evb.c           |  21 +--
>  configs/dragonboard410c_defconfig                |   6 +-
>  configs/dragonboard820c_defconfig                |   6 +-
>  configs/dragonboard845c_defconfig                |  29 ---
>  configs/qcom_defconfig                           |  73 ++++++++
>  configs/qcs404evb_defconfig                      |   5 +-
>  configs/starqltechn_defconfig                    |  41 -----
>  include/configs/dragonboard845c.h                |  20 ---
>  include/configs/qcom.h                           |  21 +++
>  include/configs/qcs404-evb.h                     |  20 ---
>  include/configs/sdm845.h                         |  26 ---
>  27 files changed, 352 insertions(+), 592 deletions(-)
>
> diff --git a/arch/arm/Kconfig b/arch/arm/Kconfig
> index 9e73b69f1e1f..03ea75cefc0d 100644
> --- a/arch/arm/Kconfig
> +++ b/arch/arm/Kconfig
> @@ -1085,6 +1085,9 @@ config ARCH_SNAPDRAGON
>         select OF_SEPARATE
>         select SMEM
>         select SPMI
> +       select OF_BOARD
> +       select SAVE_PREV_BL_FDT_ADDR
> +       select LINUX_KERNEL_IMAGE_HEADER
>         imply CMD_DM
>
>  config ARCH_SOCFPGA
> diff --git a/arch/arm/dts/Makefile b/arch/arm/dts/Makefile
> index 773c2546131c..b058def774d4 100644
> --- a/arch/arm/dts/Makefile
> +++ b/arch/arm/dts/Makefile
> @@ -628,10 +628,11 @@ dtb-$(CONFIG_TARGET_SL28) += fsl-ls1028a-kontron-sl28.dtb \
>
>  dtb-$(CONFIG_TARGET_TEN64) += fsl-ls1088a-ten64.dtb
>
> -dtb-$(CONFIG_TARGET_DRAGONBOARD410C) += dragonboard410c.dtb
> -dtb-$(CONFIG_TARGET_DRAGONBOARD820C) += dragonboard820c.dtb
> -dtb-$(CONFIG_TARGET_STARQLTECHN) += starqltechn.dtb
> -dtb-$(CONFIG_TARGET_QCS404EVB) += qcs404-evb.dtb
> +dtb-$(CONFIG_ARCH_SNAPDRAGON) += dragonboard410c.dtb \
> +       dragonboard820c.dtb \
> +       dragonboard845c.dtb \
> +       starqltechn.dtb \
> +       qcs404-evb.dtb
>
>  dtb-$(CONFIG_TARGET_STEMMY) += ste-ux500-samsung-stemmy.dtb
>
> diff --git a/arch/arm/mach-snapdragon/Kconfig b/arch/arm/mach-snapdragon/Kconfig
> index f897c393464f..96e44e2c5491 100644
> --- a/arch/arm/mach-snapdragon/Kconfig
> +++ b/arch/arm/mach-snapdragon/Kconfig
> @@ -3,6 +3,9 @@ if ARCH_SNAPDRAGON
>  config SYS_SOC
>         default "snapdragon"
>
> +config SYS_VENDOR
> +       default "qualcomm"
> +
>  config SYS_MALLOC_F_LEN
>         default 0x2000
>
> @@ -12,91 +15,24 @@ config SPL_SYS_MALLOC_F
>  config SPL_SYS_MALLOC_F_LEN
>         default 0x2000
>
> -config SDM845
> -       bool "Qualcomm Snapdragon 845 SoC"
> -       select LINUX_KERNEL_IMAGE_HEADER
> -       imply CLK_QCOM_SDM845
> -       imply PINCTRL_QCOM_SDM845
> -       imply BUTTON_QCOM_PMIC
> -
>  config LNX_KRNL_IMG_TEXT_OFFSET_BASE
>         default 0x80000000
>
> -choice
> -       prompt "Snapdragon board select"
> -
> -config TARGET_DRAGONBOARD410C
> -       bool "96Boards Dragonboard 410C"
> -       select BOARD_LATE_INIT
> -       select ENABLE_ARM_SOC_BOOT0_HOOK
> -       imply CLK_QCOM_APQ8016
> -       imply PINCTRL_QCOM_APQ8016
> -       imply BUTTON_QCOM_PMIC
> +config SYS_BOARD
> +       string "Qualcomm custom board"
>         help
> -         Support for 96Boards Dragonboard 410C. This board complies with
> -         96Board Open Platform Specifications. Features:
> -         - Qualcomm Snapdragon 410C SoC - APQ8016 (4xCortex A53, Adreno 306)
> -         - 1GiB RAM
> -         - 8GiB eMMC, uSD slot
> -         - WiFi, Bluetooth and GPS module
> -         - 2x Host, 1x Device USB port
> -         - HDMI
> -         - 20-pin low speed and 40-pin high speed expanders, 4 LED, 3 buttons
> +         The Dragonboard 410c and 820c have additional board init
> +         code that isn't shared with other Qualcomm boards.
> +         Based on this option board/qualcomm/<CONFIG_SYS_BOARD> will
> +         be used.
>
> -config TARGET_DRAGONBOARD820C
> -       bool "96Boards Dragonboard 820C"
> -       select LINUX_KERNEL_IMAGE_HEADER
> -       imply CLK_QCOM_APQ8096
> -       imply PINCTRL_QCOM_APQ8096
> -       imply BUTTON_QCOM_PMIC
> +config SYS_CONFIG_NAME
> +       string "Board configuration name"
> +       default SYS_BOARD if SYS_BOARD != ""
> +       default "qcom"
>         help
> -         Support for 96Boards Dragonboard 820C. This board complies with
> -         96Board Open Platform Specifications. Features:
> -         - Qualcomm Snapdragon 820C SoC - APQ8096 (4xKyro CPU)
> -         - 3GiB RAM
> -         - 32GiB UFS drive
> -
> -config TARGET_DRAGONBOARD845C
> -       bool "96Boards Dragonboard 845C"
> -       help
> -         Support for 96Boards Dragonboard 845C aka Robotics RB3 Development
> -         Platform. This board complies with 96Boards Open Platform
> -         Specifications. Features:
> -         - Qualcomm Snapdragon SDA845 SoC
> -         - 4GiB RAM
> -         - 64GiB UFS drive
> -       select MISC_INIT_R
> -       select SDM845
> -
> -config TARGET_STARQLTECHN
> -       bool "Samsung S9 SM-G9600(starqltechn)"
> -       help
> -         Support for Samsung S9 SM-G9600(starqltechn) board.
> -         Features:
> -         - Qualcomm Snapdragon SDM845 SoC
> -         - 4GiB RAM
> -         - 64GiB UFS drive
> -       select MISC_INIT_R
> -       select SDM845
> -
> -config TARGET_QCS404EVB
> -       bool "Qualcomm Technologies, Inc. QCS404 EVB"
> -       select LINUX_KERNEL_IMAGE_HEADER
> -       imply CLK_QCOM_QCS404
> -       imply PINCTRL_QCOM_QCS404
> -       help
> -         Support for Qualcomm Technologies, Inc. QCS404 evaluation board.
> -         Features:
> -         - Qualcomm Snapdragon QCS404 SoC
> -         - 1GiB RAM
> -         - 8GiB eMMC, uSD slot
> -
> -endchoice
> -
> -source "board/qualcomm/dragonboard410c/Kconfig"
> -source "board/qualcomm/dragonboard820c/Kconfig"
> -source "board/qualcomm/dragonboard845c/Kconfig"
> -source "board/samsung/starqltechn/Kconfig"
> -source "board/qualcomm/qcs404-evb/Kconfig"
> +         This option contains information about board configuration name.
> +         Based on this option include/configs/<CONFIG_SYS_CONFIG_NAME>.h header
> +         will be used for board configuration.
>
>  endif
> diff --git a/arch/arm/mach-snapdragon/Makefile b/arch/arm/mach-snapdragon/Makefile
> index d02432df8b04..857171e593da 100644
> --- a/arch/arm/mach-snapdragon/Makefile
> +++ b/arch/arm/mach-snapdragon/Makefile
> @@ -2,8 +2,4 @@
>  #
>  # (C) Copyright 2015 Mateusz Kulikowski <mateusz.kulikowski@gmail.com>
>
> -obj-$(CONFIG_SDM845) += sysmap-sdm845.o
> -obj-$(CONFIG_SDM845) += init_sdm845.o
> -obj-$(CONFIG_TARGET_DRAGONBOARD820C) += sysmap-apq8096.o
> -obj-$(CONFIG_TARGET_DRAGONBOARD410C) += sysmap-apq8016.o
> -obj-$(CONFIG_TARGET_QCS404EVB) += sysmap-qcs404.o
> +obj-y += board.o
> diff --git a/arch/arm/mach-snapdragon/board.c b/arch/arm/mach-snapdragon/board.c
> new file mode 100644
> index 000000000000..3018cc462b8f
> --- /dev/null
> +++ b/arch/arm/mach-snapdragon/board.c
> @@ -0,0 +1,216 @@
> +// SPDX-License-Identifier: GPL-2.0+
> +/*
> + * Common initialisation for Qualcomm Snapdragon boards.
> + *
> + * Copyright (c) 2023 Linaro Ltd.
> + * Author: Caleb Connolly <caleb.connolly@linaro.org>
> + */
> +
> +#define LOG_DEBUG
> +
> +#include <asm/armv8/mmu.h>
> +#include <asm/gpio.h>
> +#include <asm/io.h>
> +#include <asm/psci.h>
> +#include <asm/system.h>
> +#include <dm/device.h>
> +#include <dm/pinctrl.h>
> +#include <dm/uclass-internal.h>
> +#include <dm/read.h>
> +#include <env.h>
> +#include <init.h>
> +#include <linux/arm-smccc.h>
> +#include <linux/bug.h>
> +#include <linux/psci.h>
> +#include <linux/sizes.h>
> +#include <malloc.h>
> +#include <usb.h>
> +
> +DECLARE_GLOBAL_DATA_PTR;
> +
> +static struct mm_region rbx_mem_map[CONFIG_NR_DRAM_BANKS + 2] = { { 0 } };
> +
> +struct mm_region *mem_map = rbx_mem_map;
> +
> +int dram_init(void)
> +{
> +       return fdtdec_setup_mem_size_base();
> +}
> +
> +static int ddr_bank_cmp(const void *v1, const void *v2)
> +{
> +       const struct {
> +               phys_addr_t start;
> +               phys_size_t size;
> +       } *res1 = v1, *res2 = v2;
> +
> +       if (!res1->size)
> +               return 1;
> +       if (!res2->size)
> +               return -1;
> +
> +       return (res1->start >> 24) - (res2->start >> 24);
> +}
> +
> +int dram_init_banksize(void)
> +{
> +       int ret;
> +
> +       ret = fdtdec_setup_memory_banksize();
> +       if (ret < 0)
> +               return ret;
> +
> +       if (CONFIG_NR_DRAM_BANKS < 2)
> +               return 0;
> +
> +       /* Sort our RAM banks -_- */
> +       qsort(gd->bd->bi_dram, CONFIG_NR_DRAM_BANKS, sizeof(gd->bd->bi_dram[0]), ddr_bank_cmp);
> +
> +       return 0;
> +}
> +
> +static void show_psci_version(void)
> +{
> +       struct arm_smccc_res res;
> +
> +       arm_smccc_smc(ARM_PSCI_0_2_FN_PSCI_VERSION, 0, 0, 0, 0, 0, 0, 0, &res);
> +
> +       debug("PSCI:  v%ld.%ld\n",
> +             PSCI_VERSION_MAJOR(res.a0),
> +             PSCI_VERSION_MINOR(res.a0));
> +}
> +
> +void *board_fdt_blob_setup(int *err)
> +{
> +       phys_addr_t fdt;
> +       /* Return DTB pointer passed by ABL */
> +       *err = 0;
> +       fdt = get_prev_bl_fdt_addr();
> +
> +       /*
> +        * If we bail then the board will simply not boot, instead let's
> +        * try and use the FDT built into U-Boot if there is one...
> +        * This avoids having a hard dependency on the previous stage bootloader
> +        */
> +       if (IS_ENABLED(CONFIG_OF_SEPARATE) && (!fdt || fdt != ALIGN(fdt, SZ_4K))) {
> +               debug("%s: Using built in FDT, bootloader gave us %#llx\n", __func__, fdt);
> +               return (void *)gd->fdt_blob;
> +       }
> +
> +       return (void *)fdt;
> +}
> +
> +void reset_cpu(void)
> +{
> +       psci_system_reset();
> +}
> +
> +/*
> + * Some Qualcomm boards require GPIO configuration when switching USB modes.
> + * Support setting this configuration via pinctrl state.
> + */
> +int board_usb_init(int index, enum usb_init_type init)
> +{
> +       struct udevice *usb;
> +       int ret = 0;
> +
> +       /* USB device */
> +       ret = uclass_find_device_by_seq(UCLASS_USB, index, &usb);
> +       if (ret) {
> +               printf("Cannot find USB device\n");
> +               return ret;
> +       }
> +
> +       ret = dev_read_stringlist_search(usb, "pinctrl-names",
> +                                        "device");
> +       /* No "device" pinctrl state, so just bail */
> +       if (ret < 0)
> +               return 0;
> +
> +       /* Select "default" or "device" pinctrl */
> +       switch (init) {
> +       case USB_INIT_HOST:
> +               pinctrl_select_state(usb, "default");
> +               break;
> +       case USB_INIT_DEVICE:
> +               pinctrl_select_state(usb, "device");
> +               break;
> +       default:
> +               debug("Unknown usb_init_type %d\n", init);
> +               break;
> +       }
> +
> +       return 0;
> +}
> +
> +/*
> + * Some boards still need board specific init code, they can implement that by
> + * overriding this function.
> + *
> + * FIXME: get rid of board specific init code
> + */
> +void __weak qcom_board_init(void)
> +{
> +}
> +
> +int board_init(void)
> +{
> +       show_psci_version();
> +       qcom_board_init();
> +       return 0;
> +}
> +
> +static void build_mem_map(void)
> +{
> +       int i;
> +
> +       /*
> +        * Ensure the peripheral block is sized to correctly cover the address range
> +        * up to the first memory bank.
> +        * Don't map the first page to ensure that we actually trigger an abort on a
> +        * null pointer access rather than just hanging.
> +        * FIXME: we should probably split this into more precise regions
> +        */
> +       mem_map[0].phys = 0x1000;
> +       mem_map[0].virt = mem_map[0].phys;
> +       mem_map[0].size = gd->bd->bi_dram[0].start - mem_map[0].phys;
> +       mem_map[0].attrs = PTE_BLOCK_MEMTYPE(MT_DEVICE_NGNRNE) |
> +                        PTE_BLOCK_NON_SHARE |
> +                        PTE_BLOCK_PXN | PTE_BLOCK_UXN;
> +
> +       debug("Configured memory map:\n");
> +       debug("  0x%016llx - 0x%016llx: Peripheral block\n",
> +             mem_map[0].phys, mem_map[0].phys + mem_map[0].size);
> +
> +       /*
> +        * Now add memory map entries for each DRAM bank, ensuring we don't
> +        * overwrite the list terminator
> +        */
> +       for (i = 0; i < ARRAY_SIZE(rbx_mem_map) - 2 && gd->bd->bi_dram[i].size; i++) {
> +               if (i == ARRAY_SIZE(rbx_mem_map) - 1) {
> +                       log_warning("Too many DRAM banks!\n");
> +                       break;
> +               }
> +               mem_map[i + 1].phys = gd->bd->bi_dram[i].start;
> +               mem_map[i + 1].virt = mem_map[i + 1].phys;
> +               mem_map[i + 1].size = gd->bd->bi_dram[i].size;
> +               mem_map[i + 1].attrs = PTE_BLOCK_MEMTYPE(MT_NORMAL) |
> +                                    PTE_BLOCK_INNER_SHARE;
> +
> +               debug("  0x%016llx - 0x%016llx: DDR bank %d\n",
> +                     mem_map[i + 1].phys, mem_map[i + 1].phys + mem_map[i + 1].size, i);
> +       }
> +}
> +
> +u64 get_page_table_size(void)
> +{
> +       return SZ_64K;
> +}
> +
> +void enable_caches(void)
> +{
> +       build_mem_map();
> +
> +       icache_enable();
> +       dcache_enable();
> +}
> diff --git a/arch/arm/mach-snapdragon/init_sdm845.c b/arch/arm/mach-snapdragon/init_sdm845.c
> deleted file mode 100644
> index 067acc9a6f44..000000000000
> --- a/arch/arm/mach-snapdragon/init_sdm845.c
> +++ /dev/null
> @@ -1,73 +0,0 @@
> -// SPDX-License-Identifier: GPL-2.0+
> -/*
> - * Common init part for boards based on SDM845
> - *
> - * (C) Copyright 2021 Dzmitry Sankouski <dsankouski@gmail.com>
> - */
> -
> -#include <button.h>
> -#include <init.h>
> -#include <env.h>
> -#include <common.h>
> -#include <asm/system.h>
> -#include <asm/gpio.h>
> -#include <dm.h>
> -
> -DECLARE_GLOBAL_DATA_PTR;
> -
> -int dram_init(void)
> -{
> -       return fdtdec_setup_mem_size_base();
> -}
> -
> -void reset_cpu(void)
> -{
> -       psci_system_reset();
> -}
> -
> -__weak int board_init(void)
> -{
> -       return 0;
> -}
> -
> -/* Check for vol- and power buttons */
> -__weak int misc_init_r(void)
> -{
> -       struct udevice *btn;
> -       int ret;
> -       enum button_state_t state;
> -
> -       ret = button_get_by_label("pwrkey", &btn);
> -       if (ret < 0) {
> -               printf("Couldn't find power button!\n");
> -               return ret;
> -       }
> -
> -       state = button_get_state(btn);
> -       if (state == BUTTON_ON) {
> -               env_set("key_power", "1");
> -               printf("Power button pressed\n");
> -       } else {
> -               env_set("key_power", "0");
> -       }
> -
> -       /*
> -        * search for kaslr address, set by primary bootloader by searching first
> -        * 0x100 relocated bytes at u-boot's initial load address range
> -        */
> -       uintptr_t start = gd->ram_base;
> -       uintptr_t end = start + 0x800000;
> -       u8 *addr = (u8 *)start;
> -       phys_addr_t *relocaddr = (phys_addr_t *)gd->relocaddr;
> -       u32 block_size = 0x1000;
> -
> -       while (memcmp(addr, relocaddr, 0x100) && (uintptr_t)addr < end)
> -               addr += block_size;
> -
> -       if ((uintptr_t)addr >= end)
> -               printf("KASLR not found in range 0x%lx - 0x%lx", start, end);
> -       else
> -               env_set_addr("KASLR", addr);
> -
> -       return 0;
> -}
> diff --git a/arch/arm/mach-snapdragon/sysmap-apq8016.c b/arch/arm/mach-snapdragon/sysmap-apq8016.c
> deleted file mode 100644
> index ffa3f9aa3532..000000000000
> --- a/arch/arm/mach-snapdragon/sysmap-apq8016.c
> +++ /dev/null
> @@ -1,31 +0,0 @@
> -// SPDX-License-Identifier: GPL-2.0+
> -/*
> - * Qualcomm APQ8016 memory map
> - *
> - * (C) Copyright 2016 Mateusz Kulikowski <mateusz.kulikowski@gmail.com>
> - */
> -
> -#include <common.h>
> -#include <asm/armv8/mmu.h>
> -
> -static struct mm_region apq8016_mem_map[] = {
> -       {
> -               .virt = 0x0UL, /* Peripheral block */
> -               .phys = 0x0UL, /* Peripheral block */
> -               .size = 0x8000000UL,
> -               .attrs = PTE_BLOCK_MEMTYPE(MT_DEVICE_NGNRNE) |
> -                        PTE_BLOCK_NON_SHARE |
> -                        PTE_BLOCK_PXN | PTE_BLOCK_UXN
> -       }, {
> -               .virt = 0x80000000UL, /* DDR */
> -               .phys = 0x80000000UL, /* DDR */
> -               .size = 0x80000000UL,
> -               .attrs = PTE_BLOCK_MEMTYPE(MT_NORMAL) |
> -                        PTE_BLOCK_INNER_SHARE
> -       }, {
> -               /* List terminator */
> -               0,
> -       }
> -};
> -
> -struct mm_region *mem_map = apq8016_mem_map;
> diff --git a/arch/arm/mach-snapdragon/sysmap-apq8096.c b/arch/arm/mach-snapdragon/sysmap-apq8096.c
> deleted file mode 100644
> index 0614f8308d02..000000000000
> --- a/arch/arm/mach-snapdragon/sysmap-apq8096.c
> +++ /dev/null
> @@ -1,31 +0,0 @@
> -// SPDX-License-Identifier: GPL-2.0+
> -/*
> - * Qualcomm APQ8096 memory map
> - *
> - * (C) Copyright 2017 Jorge Ramirez Ortiz <jorge.ramirez-ortiz@linaro.org>
> - */
> -
> -#include <common.h>
> -#include <asm/armv8/mmu.h>
> -
> -static struct mm_region apq8096_mem_map[] = {
> -       {
> -               .virt = 0x0UL, /* Peripheral block */
> -               .phys = 0x0UL, /* Peripheral block */
> -               .size = 0x10000000UL,
> -               .attrs = PTE_BLOCK_MEMTYPE(MT_DEVICE_NGNRNE) |
> -                        PTE_BLOCK_NON_SHARE |
> -                        PTE_BLOCK_PXN | PTE_BLOCK_UXN
> -       }, {
> -               .virt = 0x80000000UL, /* DDR */
> -               .phys = 0x80000000UL, /* DDR */
> -               .size = 0xC0000000UL,
> -               .attrs = PTE_BLOCK_MEMTYPE(MT_NORMAL) |
> -                        PTE_BLOCK_INNER_SHARE
> -       }, {
> -               /* List terminator */
> -               0,
> -       }
> -};
> -
> -struct mm_region *mem_map = apq8096_mem_map;
> diff --git a/arch/arm/mach-snapdragon/sysmap-qcs404.c b/arch/arm/mach-snapdragon/sysmap-qcs404.c
> deleted file mode 100644
> index 64ca4adf1bd1..000000000000
> --- a/arch/arm/mach-snapdragon/sysmap-qcs404.c
> +++ /dev/null
> @@ -1,43 +0,0 @@
> -// SPDX-License-Identifier: GPL-2.0+
> -/*
> - * Qualcomm QCS404 memory map
> - *
> - * (C) Copyright 2022 Sumit Garg <sumit.garg@linaro.org>
> - */
> -
> -#include <common.h>
> -#include <asm/armv8/mmu.h>
> -
> -static struct mm_region qcs404_mem_map[] = {
> -       {
> -               .virt = 0x0UL, /* Peripheral block */
> -               .phys = 0x0UL, /* Peripheral block */
> -               .size = 0x8000000UL,
> -               .attrs = PTE_BLOCK_MEMTYPE(MT_DEVICE_NGNRNE) |
> -                        PTE_BLOCK_NON_SHARE |
> -                        PTE_BLOCK_PXN | PTE_BLOCK_UXN
> -       }, {
> -               .virt = 0x80000000UL, /* DDR */
> -               .phys = 0x80000000UL, /* DDR */
> -               .size = 0x05900000UL,
> -               .attrs = PTE_BLOCK_MEMTYPE(MT_NORMAL) |
> -                        PTE_BLOCK_INNER_SHARE
> -       }, {
> -               .virt = 0x89600000UL, /* DDR */
> -               .phys = 0x89600000UL, /* DDR */
> -               .size = 0x162000000UL,
> -               .attrs = PTE_BLOCK_MEMTYPE(MT_NORMAL) |
> -                        PTE_BLOCK_INNER_SHARE
> -       }, {
> -               .virt = 0xa0000000UL, /* DDR */
> -               .phys = 0xa0000000UL, /* DDR */
> -               .size = 0x20000000UL,
> -               .attrs = PTE_BLOCK_MEMTYPE(MT_NORMAL) |
> -                        PTE_BLOCK_INNER_SHARE
> -       }, {
> -               /* List terminator */
> -               0,
> -       }
> -};
> -
> -struct mm_region *mem_map = qcs404_mem_map;
> diff --git a/arch/arm/mach-snapdragon/sysmap-sdm845.c b/arch/arm/mach-snapdragon/sysmap-sdm845.c
> deleted file mode 100644
> index 721ac411665c..000000000000
> --- a/arch/arm/mach-snapdragon/sysmap-sdm845.c
> +++ /dev/null
> @@ -1,31 +0,0 @@
> -// SPDX-License-Identifier: GPL-2.0+
> -/*
> - * Qualcomm SDM845 memory map
> - *
> - * (C) Copyright 2021 Dzmitry Sankouski <dsankousk@gmail.com>
> - */
> -
> -#include <common.h>
> -#include <asm/armv8/mmu.h>
> -
> -static struct mm_region sdm845_mem_map[] = {
> -       {
> -               .virt = 0x0UL, /* Peripheral block */
> -               .phys = 0x0UL, /* Peripheral block */
> -               .size = 0x10000000UL,
> -               .attrs = PTE_BLOCK_MEMTYPE(MT_DEVICE_NGNRNE) |
> -                        PTE_BLOCK_NON_SHARE |
> -                        PTE_BLOCK_PXN | PTE_BLOCK_UXN
> -       }, {
> -               .virt = 0x80000000UL, /* DDR */
> -               .phys = 0x80000000UL, /* DDR */
> -               .size = 0x200000000UL, /* 8GiB - maximum allowed memory */
> -               .attrs = PTE_BLOCK_MEMTYPE(MT_NORMAL) |
> -                        PTE_BLOCK_INNER_SHARE
> -       }, {
> -               /* List terminator */
> -               0,
> -       }
> -};
> -
> -struct mm_region *mem_map = sdm845_mem_map;
> diff --git a/board/qualcomm/dragonboard410c/Kconfig b/board/qualcomm/dragonboard410c/Kconfig
> deleted file mode 100644
> index 03bd7ae309cd..000000000000
> --- a/board/qualcomm/dragonboard410c/Kconfig
> +++ /dev/null
> @@ -1,15 +0,0 @@
> -if TARGET_DRAGONBOARD410C
> -
> -config SYS_BOARD
> -       default "dragonboard410c"
> -
> -config SYS_VENDOR
> -       default "qualcomm"
> -
> -config SYS_SOC
> -       default "apq8016"
> -
> -config SYS_CONFIG_NAME
> -       default "dragonboard410c"
> -
> -endif
> diff --git a/board/qualcomm/dragonboard410c/dragonboard410c.c b/board/qualcomm/dragonboard410c/dragonboard410c.c
> index 40b5448c6ef1..0136cc2237de 100644
> --- a/board/qualcomm/dragonboard410c/dragonboard410c.c
> +++ b/board/qualcomm/dragonboard410c/dragonboard410c.c
> @@ -23,37 +23,6 @@
>
>  DECLARE_GLOBAL_DATA_PTR;
>
> -#define USB_HUB_RESET_GPIO 2
> -#define USB_SW_SELECT_GPIO 3
> -
> -int board_usb_init(int index, enum usb_init_type init)
> -{
> -       struct udevice *usb;
> -       int ret = 0;
> -
> -       /* USB device */
> -       ret = device_find_global_by_ofnode(ofnode_path("/soc/usb"), &usb);
> -       if (ret) {
> -               printf("Cannot find USB device\n");
> -               return ret;
> -       }
> -
> -       /* Select "default" or "device" pinctrl */
> -       switch (init) {
> -       case USB_INIT_HOST:
> -               pinctrl_select_state(usb, "default");
> -               break;
> -       case USB_INIT_DEVICE:
> -               pinctrl_select_state(usb, "device");
> -               break;
> -       default:
> -               debug("Unknown usb_init_type %d\n", init);
> -               break;
> -       }
> -
> -       return 0;
> -}
> -
>  /* UNSTUFF_BITS macro taken from Linux Kernel: drivers/mmc/core/sd.c */
>  #define UNSTUFF_BITS(resp, start, size) \
>         ({ \
> @@ -119,11 +88,6 @@ int misc_init_r(void)
>         return 0;
>  }
>
> -int board_init(void)
> -{
> -       return 0;
> -}
> -
>  int board_late_init(void)
>  {
>         char serial[16];
> @@ -166,8 +130,3 @@ int ft_board_setup(void *blob, struct bd_info *bd)
>                            "local-bd-address", mac, ARP_HLEN, 1);
>         return 0;
>  }
> -
> -void reset_cpu(void)
> -{
> -       psci_system_reset();
> -}
> diff --git a/board/qualcomm/dragonboard820c/Kconfig b/board/qualcomm/dragonboard820c/Kconfig
> deleted file mode 100644
> index aff9af527128..000000000000
> --- a/board/qualcomm/dragonboard820c/Kconfig
> +++ /dev/null
> @@ -1,15 +0,0 @@
> -if TARGET_DRAGONBOARD820C
> -
> -config SYS_BOARD
> -       default "dragonboard820c"
> -
> -config SYS_VENDOR
> -       default "qualcomm"
> -
> -config SYS_SOC
> -       default "apq8096"
> -
> -config SYS_CONFIG_NAME
> -       default "dragonboard820c"
> -
> -endif
> diff --git a/board/qualcomm/dragonboard820c/dragonboard820c.c b/board/qualcomm/dragonboard820c/dragonboard820c.c
> index 2f0db628368b..ac7de711c588 100644
> --- a/board/qualcomm/dragonboard820c/dragonboard820c.c
> +++ b/board/qualcomm/dragonboard820c/dragonboard820c.c
> @@ -27,24 +27,6 @@
>
>  DECLARE_GLOBAL_DATA_PTR;
>
> -int dram_init(void)
> -{
> -       gd->ram_size = PHYS_SDRAM_SIZE;
> -
> -       return 0;
> -}
> -
> -int dram_init_banksize(void)
> -{
> -       gd->bd->bi_dram[0].start = PHYS_SDRAM_1;
> -       gd->bd->bi_dram[0].size = PHYS_SDRAM_1_SIZE;
> -
> -       gd->bd->bi_dram[1].start = PHYS_SDRAM_2;
> -       gd->bd->bi_dram[1].size  = PHYS_SDRAM_2_SIZE;
> -
> -       return 0;
> -}
> -
>  static void sdhci_power_init(void)
>  {
>         const u32 TLMM_PULL_MASK = 0x3;
> @@ -113,28 +95,9 @@ static void sdhci_power_init(void)
>                         rclk[i].val  << rclk[i].bit);
>  }
>
> -static void show_psci_version(void)
> -{
> -       struct arm_smccc_res res;
> -
> -       arm_smccc_smc(ARM_PSCI_0_2_FN_PSCI_VERSION, 0, 0, 0, 0, 0, 0, 0, &res);
> -
> -       printf("PSCI:  v%ld.%ld\n",
> -              PSCI_VERSION_MAJOR(res.a0),
> -               PSCI_VERSION_MINOR(res.a0));
> -}
> -
> -int board_init(void)
> +void qcom_board_init(void)
>  {
>         sdhci_power_init();
> -       show_psci_version();
> -
> -       return 0;
> -}
> -
> -void reset_cpu(void)
> -{
> -       psci_system_reset();
>  }
>
>  /* Check for vol- button - if pressed - stop autoboot */
> diff --git a/board/qualcomm/dragonboard845c/Kconfig b/board/qualcomm/dragonboard845c/Kconfig
> deleted file mode 100644
> index 52fdff288d59..000000000000
> --- a/board/qualcomm/dragonboard845c/Kconfig
> +++ /dev/null
> @@ -1,12 +0,0 @@
> -if TARGET_DRAGONBOARD845C
> -
> -config SYS_BOARD
> -       default "dragonboard845c"
> -
> -config SYS_CONFIG_NAME
> -       default "dragonboard845c"
> -
> -config SYS_VENDOR
> -       default "qualcomm"
> -
> -endif
> diff --git a/board/qualcomm/qcs404-evb/Kconfig b/board/qualcomm/qcs404-evb/Kconfig
> deleted file mode 100644
> index 32657c7d5e31..000000000000
> --- a/board/qualcomm/qcs404-evb/Kconfig
> +++ /dev/null
> @@ -1,15 +0,0 @@
> -if TARGET_QCS404EVB
> -
> -config SYS_BOARD
> -       default "qcs404-evb"
> -
> -config SYS_VENDOR
> -       default "qualcomm"
> -
> -config SYS_SOC
> -       default "qcs404"
> -
> -config SYS_CONFIG_NAME
> -       default "qcs404-evb"
> -
> -endif
> diff --git a/board/qualcomm/qcs404-evb/qcs404-evb.c b/board/qualcomm/qcs404-evb/qcs404-evb.c
> index 249dca7e72f1..1a4b1f97a3ae 100644
> --- a/board/qualcomm/qcs404-evb/qcs404-evb.c
> +++ b/board/qualcomm/qcs404-evb/qcs404-evb.c
> @@ -14,16 +14,10 @@
>  #include <asm/gpio.h>
>  #include <asm/global_data.h>
>  #include <fdt_support.h>
> -#include <asm/arch/dram.h>
>
>  DECLARE_GLOBAL_DATA_PTR;
>
> -int dram_init(void)
> -{
> -       return fdtdec_setup_mem_size_base();
> -}
> -
> -int board_init(void)
> +void qcom_board_init(void)
>  {
>         struct udevice *pmic_gpio;
>         struct gpio_desc usb_vbus_boost_pin;
> @@ -34,29 +28,22 @@ int board_init(void)
>                                         &pmic_gpio);
>         if (ret < 0) {
>                 printf("Failed to find pms405_gpios@c000 node.\n");
> -               return ret;
> +               return;
>         }
>
>         node = fdt_subnode_offset(gd->fdt_blob, dev_of_offset(pmic_gpio),
>                                   "usb_vbus_boost_pin");
>         if (node < 0) {
>                 printf("Failed to find usb_hub_reset_pm dt node.\n");
> -               return node;
> +               return;
>         }
>         ret = gpio_request_by_name_nodev(offset_to_ofnode(node), "gpios", 0,
>                                          &usb_vbus_boost_pin, 0);
>         if (ret < 0) {
>                 printf("Failed to request usb_hub_reset_pm gpio.\n");
> -               return ret;
> +               return;
>         }
>
>         dm_gpio_set_dir_flags(&usb_vbus_boost_pin,
>                               GPIOD_IS_OUT | GPIOD_IS_OUT_ACTIVE);
> -
> -       return 0;
> -}
> -
> -void reset_cpu(void)
> -{
> -       psci_system_reset();
>  }
> diff --git a/configs/dragonboard410c_defconfig b/configs/dragonboard410c_defconfig
> index 56a73893d3df..efdee8a40fa3 100644
> --- a/configs/dragonboard410c_defconfig
> +++ b/configs/dragonboard410c_defconfig
> @@ -1,9 +1,10 @@
>  CONFIG_ARM=y
> +CONFIG_SYS_BOARD="dragonboard410c"
>  CONFIG_COUNTER_FREQUENCY=19000000
> +CONFIG_ENABLE_ARM_SOC_BOOT0_HOOK=y
>  CONFIG_ARCH_SNAPDRAGON=y
>  CONFIG_TEXT_BASE=0x8f600000
>  CONFIG_SYS_MALLOC_LEN=0x802000
> -CONFIG_NR_DRAM_BANKS=1
>  CONFIG_HAS_CUSTOM_SYS_INIT_SP_ADDR=y
>  CONFIG_CUSTOM_SYS_INIT_SP_ADDR=0x8007fff0
>  CONFIG_ENV_SIZE=0x2000
> @@ -38,7 +39,9 @@ CONFIG_CMD_TIMER=y
>  CONFIG_ENV_IS_IN_MMC=y
>  CONFIG_SYS_RELOC_GD_ENV_ADDR=y
>  CONFIG_SYS_MMC_ENV_PART=2
> +CONFIG_BUTTON_QCOM_PMIC=y
>  CONFIG_CLK=y
> +CONFIG_CLK_QCOM_APQ8016=y
>  CONFIG_USB_FUNCTION_FASTBOOT=y
>  CONFIG_FASTBOOT_BUF_ADDR=0x91000000
>  CONFIG_FASTBOOT_FLASH=y
> @@ -52,6 +55,7 @@ CONFIG_MMC_SDHCI_MSM=y
>  CONFIG_PHY=y
>  CONFIG_PINCTRL=y
>  CONFIG_PINCONF=y
> +CONFIG_PINCTRL_QCOM_APQ8016=y
>  CONFIG_DM_PMIC=y
>  CONFIG_PMIC_QCOM=y
>  CONFIG_MSM_SERIAL=y
> diff --git a/configs/dragonboard820c_defconfig b/configs/dragonboard820c_defconfig
> index 7304ff97dd8e..89847ce0b307 100644
> --- a/configs/dragonboard820c_defconfig
> +++ b/configs/dragonboard820c_defconfig
> @@ -1,14 +1,13 @@
>  CONFIG_ARM=y
> +CONFIG_SYS_BOARD="dragonboard820c"
>  CONFIG_COUNTER_FREQUENCY=19000000
>  CONFIG_ARCH_SNAPDRAGON=y
>  CONFIG_TEXT_BASE=0x80080000
>  CONFIG_SYS_MALLOC_LEN=0x804000
> -CONFIG_NR_DRAM_BANKS=2
>  CONFIG_HAS_CUSTOM_SYS_INIT_SP_ADDR=y
>  CONFIG_CUSTOM_SYS_INIT_SP_ADDR=0x8007fff0
>  CONFIG_ENV_SIZE=0x4000
>  CONFIG_DEFAULT_DEVICE_TREE="dragonboard820c"
> -CONFIG_TARGET_DRAGONBOARD820C=y
>  CONFIG_IDENT_STRING="\nQualcomm-DragonBoard 820C"
>  CONFIG_SYS_LOAD_ADDR=0x80080000
>  CONFIG_DISTRO_DEFAULTS=y
> @@ -35,12 +34,15 @@ CONFIG_ENV_IS_IN_EXT4=y
>  CONFIG_ENV_EXT4_INTERFACE="mmc"
>  CONFIG_ENV_EXT4_DEVICE_AND_PART="0:1"
>  CONFIG_SYS_RELOC_GD_ENV_ADDR=y
> +CONFIG_BUTTON_QCOM_PMIC=y
>  CONFIG_CLK=y
> +CONFIG_CLK_QCOM_APQ8096=y
>  CONFIG_QCOM_PMIC_GPIO=y
>  CONFIG_MMC_SDHCI=y
>  CONFIG_MMC_SDHCI_MSM=y
>  CONFIG_PINCTRL=y
>  CONFIG_PINCONF=y
> +CONFIG_PINCTRL_QCOM_APQ8096=y
>  CONFIG_DM_PMIC=y
>  CONFIG_PMIC_QCOM=y
>  CONFIG_MSM_SERIAL=y
> diff --git a/configs/dragonboard845c_defconfig b/configs/dragonboard845c_defconfig
> deleted file mode 100644
> index f29f11e342e7..000000000000
> --- a/configs/dragonboard845c_defconfig
> +++ /dev/null
> @@ -1,29 +0,0 @@
> -CONFIG_ARM=y
> -CONFIG_SKIP_LOWLEVEL_INIT=y
> -CONFIG_COUNTER_FREQUENCY=19000000
> -CONFIG_POSITION_INDEPENDENT=y
> -CONFIG_ARCH_SNAPDRAGON=y
> -CONFIG_DEFAULT_DEVICE_TREE="dragonboard845c"
> -CONFIG_TARGET_DRAGONBOARD845C=y
> -CONFIG_IDENT_STRING="\nQualcomm-DragonBoard 845C"
> -CONFIG_SYS_LOAD_ADDR=0x80000000
> -CONFIG_FIT=y
> -CONFIG_FIT_VERBOSE=y
> -CONFIG_BOOTDELAY=5
> -CONFIG_SAVE_PREV_BL_FDT_ADDR=y
> -CONFIG_SAVE_PREV_BL_INITRAMFS_START_ADDR=y

I would suggest keeping this config option in new qcom_defconfig since
it allows to package FIT image as intramfs within boot.img...

> -CONFIG_SYS_CBSIZE=512
> -# CONFIG_DISPLAY_CPUINFO is not set
> -CONFIG_HUSH_PARSER=y
> -CONFIG_SYS_MAXARGS=64
> -CONFIG_CMD_GPIO=y
> -# CONFIG_NET is not set
> -CONFIG_CLK=y
> -CONFIG_MSM_GPIO=y
> -CONFIG_QCOM_PMIC_GPIO=y
> -CONFIG_PINCTRL=y
> -CONFIG_DM_PMIC=y
> -CONFIG_PMIC_QCOM=y
> -CONFIG_MSM_GENI_SERIAL=y
> -CONFIG_SPMI_MSM=y
> -CONFIG_LMB_MAX_REGIONS=64
> diff --git a/configs/qcom_defconfig b/configs/qcom_defconfig
> new file mode 100644
> index 000000000000..8bd6313d50e4
> --- /dev/null
> +++ b/configs/qcom_defconfig
> @@ -0,0 +1,73 @@
> +CONFIG_ARM=y
> +CONFIG_SKIP_LOWLEVEL_INIT=y
> +CONFIG_POSITION_INDEPENDENT=y
> +CONFIG_ARCH_SNAPDRAGON=y
> +CONFIG_DEFAULT_DEVICE_TREE="dragonboard845c"
> +CONFIG_SYS_LOAD_ADDR=0x0
> +CONFIG_FIT=y
> +CONFIG_FIT_VERBOSE=y
> +CONFIG_BOOTSTD_FULL=y
> +# CONFIG_BOOTMETH_EXTLINUX is not set
> +# CONFIG_BOOTMETH_VBE is not set
> +# CONFIG_BOOTMETH_SCRIPT is not set
> +CONFIG_BOOTDELAY=1
> +CONFIG_USE_PREBOOT=y
> +CONFIG_LOG_MAX_LEVEL=9
> +CONFIG_LOG_DEFAULT_LEVEL=4
> +# CONFIG_DISPLAY_CPUINFO is not set
> +CONFIG_DISPLAY_BOARDINFO_LATE=y
> +CONFIG_HUSH_PARSER=y
> +CONFIG_SYS_MAXARGS=64
> +CONFIG_SYS_CBSIZE=512
> +CONFIG_CMD_BOOTMENU=y
> +CONFIG_CMD_CLK=y
> +CONFIG_CMD_GPIO=y
> +CONFIG_CMD_MMC=y
> +CONFIG_CMD_PART=y
> +CONFIG_CMD_UFS=y
> +CONFIG_CMD_USB=y
> +CONFIG_CMD_CAT=y
> +CONFIG_CMD_BMP=y
> +CONFIG_CMD_FAT=y
> +CONFIG_CMD_FS_GENERIC=y
> +CONFIG_CMD_LOG=y
> +CONFIG_EFI_PARTITION=y
> +# CONFIG_NET is not set
> +CONFIG_CLK=y
> +CONFIG_CLK_QCOM_QCS404=y
> +CONFIG_CLK_QCOM_SDM845=y
> +CONFIG_MSM_GPIO=y
> +CONFIG_QCOM_PMIC_GPIO=y
> +CONFIG_DM_KEYBOARD=y
> +CONFIG_BUTTON_KEYBOARD=y
> +CONFIG_BUTTON_QCOM_PMIC=y
> +CONFIG_MMC_SDHCI=y
> +CONFIG_MMC_SDHCI_MSM=y
> +CONFIG_PHY=y
> +CONFIG_PINCTRL=y
> +CONFIG_PINCTRL_QCOM_QCS404=y
> +CONFIG_PINCTRL_QCOM_SDM845=y
> +CONFIG_DM_PMIC=y
> +CONFIG_PMIC_QCOM=y
> +CONFIG_SCSI=y
> +CONFIG_DM_SCSI=y
> +CONFIG_MSM_SERIAL=y
> +CONFIG_MSM_GENI_SERIAL=y
> +CONFIG_SPMI_MSM=y
> +CONFIG_SYSINFO=y
> +CONFIG_SYSINFO_SMBIOS=y
> +CONFIG_USB=y
> +CONFIG_USB_XHCI_HCD=y
> +CONFIG_USB_XHCI_DWC3=y
> +CONFIG_USB_DWC3=y
> +CONFIG_USB_STORAGE=y
> +CONFIG_UFS=y
> +CONFIG_VIDEO=y
> +# CONFIG_VIDEO_FONT_8X16 is not set
> +CONFIG_VIDEO_FONT_16X32=y
> +CONFIG_SYS_WHITE_ON_BLACK=y
> +CONFIG_NO_FB_CLEAR=y
> +CONFIG_VIDEO_SIMPLE=y
> +CONFIG_HEXDUMP=y
> +# CONFIG_GENERATE_SMBIOS_TABLE is not set
> +CONFIG_LMB_MAX_REGIONS=64
> diff --git a/configs/qcs404evb_defconfig b/configs/qcs404evb_defconfig
> index 700c024e8b6a..d85d193895b0 100644
> --- a/configs/qcs404evb_defconfig
> +++ b/configs/qcs404evb_defconfig
> @@ -1,11 +1,10 @@
>  CONFIG_ARM=y
> +CONFIG_SYS_BOARD="qcs404-evb"
>  CONFIG_SKIP_LOWLEVEL_INIT=y
>  CONFIG_COUNTER_FREQUENCY=19000000
>  CONFIG_POSITION_INDEPENDENT=y
>  CONFIG_ARCH_SNAPDRAGON=y
>  CONFIG_DEFAULT_DEVICE_TREE="qcs404-evb"
> -CONFIG_DM_RESET=y
> -CONFIG_TARGET_QCS404EVB=y
>  CONFIG_IDENT_STRING="\nQualcomm QCS404-EVB"
>  CONFIG_SYS_LOAD_ADDR=0x80000000
>  CONFIG_FIT=y
> @@ -31,6 +30,7 @@ CONFIG_CMD_FAT=y
>  CONFIG_CMD_FS_GENERIC=y
>  # CONFIG_NET is not set
>  CONFIG_CLK=y
> +CONFIG_CLK_QCOM_QCS404=y
>  CONFIG_MSM_GPIO=y
>  CONFIG_QCOM_PMIC_GPIO=y
>  CONFIG_MISC=y
> @@ -42,6 +42,7 @@ CONFIG_PHY=y
>  CONFIG_PHY_QCOM_USB_HS_28NM=y
>  CONFIG_PHY_QCOM_USB_SS=y
>  CONFIG_PINCTRL=y
> +CONFIG_PINCTRL_QCOM_QCS404=y
>  CONFIG_DM_PMIC=y
>  CONFIG_PMIC_QCOM=y
>  CONFIG_MSM_SERIAL=y
> diff --git a/configs/starqltechn_defconfig b/configs/starqltechn_defconfig
> deleted file mode 100644
> index 6980a8232667..000000000000
> --- a/configs/starqltechn_defconfig
> +++ /dev/null
> @@ -1,41 +0,0 @@
> -CONFIG_ARM=y
> -CONFIG_SKIP_LOWLEVEL_INIT=y
> -CONFIG_COUNTER_FREQUENCY=19000000
> -CONFIG_POSITION_INDEPENDENT=y
> -CONFIG_ARCH_SNAPDRAGON=y
> -CONFIG_DEFAULT_DEVICE_TREE="starqltechn"
> -CONFIG_TARGET_STARQLTECHN=y
> -CONFIG_IDENT_STRING="\nSamsung S9 SM-G9600"
> -CONFIG_SYS_LOAD_ADDR=0x80000000
> -CONFIG_FIT=y
> -CONFIG_FIT_VERBOSE=y
> -CONFIG_BOOTDELAY=0
> -CONFIG_SAVE_PREV_BL_FDT_ADDR=y
> -CONFIG_SAVE_PREV_BL_INITRAMFS_START_ADDR=y
> -CONFIG_SYS_CBSIZE=512
> -CONFIG_SYS_PBSIZE=532
> -# CONFIG_DISPLAY_CPUINFO is not set
> -CONFIG_HUSH_PARSER=y
> -CONFIG_SYS_MAXARGS=64
> -CONFIG_CMD_BOOTMENU=y
> -CONFIG_CMD_GPIO=y
> -CONFIG_CMD_BMP=y
> -# CONFIG_NET is not set
> -CONFIG_BUTTON=y
> -CONFIG_CLK=y
> -CONFIG_MSM_GPIO=y
> -CONFIG_QCOM_PMIC_GPIO=y
> -CONFIG_DM_KEYBOARD=y
> -CONFIG_BUTTON_KEYBOARD=y
> -CONFIG_PINCTRL=y
> -CONFIG_DM_PMIC=y
> -CONFIG_PMIC_QCOM=y
> -CONFIG_MSM_GENI_SERIAL=y
> -CONFIG_SPMI_MSM=y
> -CONFIG_VIDEO=y
> -# CONFIG_VIDEO_FONT_8X16 is not set
> -CONFIG_VIDEO_FONT_16X32=y
> -CONFIG_SYS_WHITE_ON_BLACK=y
> -CONFIG_VIDEO_SIMPLE=y
> -CONFIG_VIDEO_DT_SIMPLEFB=y
> -CONFIG_LMB_MAX_REGIONS=64
> diff --git a/include/configs/dragonboard845c.h b/include/configs/dragonboard845c.h
> deleted file mode 100644
> index 14a8a2ca049e..000000000000
> --- a/include/configs/dragonboard845c.h
> +++ /dev/null
> @@ -1,20 +0,0 @@
> -/* SPDX-License-Identifier: GPL-2.0+ */
> -/*
> - * Configuration file for Dragonboard 845c, based on Qualcomm SDA845 chip
> - *
> - * (C) Copyright 2022 Sumit Garg <sumit.garg@linaro.org>
> - */
> -
> -#ifndef __CONFIGS_SDM845_H
> -#define __CONFIGS_SDM845_H
> -
> -#include <linux/sizes.h>
> -
> -#define CFG_SYS_BAUDRATE_TABLE { 115200, 230400, 460800, 921600 }
> -
> -#define CFG_EXTRA_ENV_SETTINGS \
> -       "bootm_size=0x5000000\0"        \
> -       "bootm_low=0x80000000\0"        \
> -       "bootcmd=bootm $prevbl_initrd_start_addr\0"
> -
> -#endif
> diff --git a/include/configs/qcom.h b/include/configs/qcom.h
> new file mode 100644
> index 000000000000..e50b3bce5cdd
> --- /dev/null
> +++ b/include/configs/qcom.h
> @@ -0,0 +1,21 @@
> +/* SPDX-License-Identifier: GPL-2.0+ */
> +/*
> + * Configuration file for Qualcomm Snapdragon boards
> + *
> + * (C) Copyright 2021 Dzmitry Sankouski <dsankouski@gmail.com>
> + * (C) Copyright 2023 Linaro Ltd.
> + */
> +
> +#ifndef __CONFIGS_SNAPDRAGON_H
> +#define __CONFIGS_SNAPDRAGON_H
> +
> +#define CFG_SYS_BAUDRATE_TABLE { 115200, 230400, 460800, 921600 }
> +
> +/* Load addressed are calculated during board_late_init(). See arm/mach-snapdragon/board.c */
> +#define CFG_EXTRA_ENV_SETTINGS \
> +       "stdin=serial,button-kbd\0"     \
> +       "stdout=serial,vidconsole\0"    \
> +       "stderr=serial,vidconsole\0" \
> +       "bootcmd=bootm $prevbl_initrd_start_addr\0"

...as otherwise this bootcmd won't work.

-Sumit

> +
> +#endif
> diff --git a/include/configs/qcs404-evb.h b/include/configs/qcs404-evb.h
> deleted file mode 100644
> index 9501d43665e9..000000000000
> --- a/include/configs/qcs404-evb.h
> +++ /dev/null
> @@ -1,20 +0,0 @@
> -/* SPDX-License-Identifier: GPL-2.0+ */
> -/*
> - * Configuration file for QCS404 evaluation board
> - *
> - * (C) Copyright 2022 Sumit Garg <sumit.garg@linaro.org>
> - */
> -
> -#ifndef __CONFIGS_QCS404EVB_H
> -#define __CONFIGS_QCS404EVB_H
> -
> -#include <linux/sizes.h>
> -
> -#define CFG_SYS_BAUDRATE_TABLE { 115200, 230400, 460800, 921600 }
> -
> -#define CFG_EXTRA_ENV_SETTINGS \
> -       "bootm_size=0x5000000\0"        \
> -       "bootm_low=0x80000000\0"        \
> -       "bootcmd=bootm $prevbl_initrd_start_addr\0"
> -
> -#endif
> diff --git a/include/configs/sdm845.h b/include/configs/sdm845.h
> deleted file mode 100644
> index 5ad8569b2152..000000000000
> --- a/include/configs/sdm845.h
> +++ /dev/null
> @@ -1,26 +0,0 @@
> -/* SPDX-License-Identifier: GPL-2.0+ */
> -/*
> - * Configuration file for boards, based on Qualcomm SDM845 chip
> - *
> - * (C) Copyright 2021 Dzmitry Sankouski <dsankouski@gmail.com>
> - */
> -
> -#ifndef __CONFIGS_SDM845_H
> -#define __CONFIGS_SDM845_H
> -
> -#include <linux/sizes.h>
> -
> -#define CFG_SYS_BAUDRATE_TABLE { 115200, 230400, 460800, 921600 }
> -
> -#define CFG_EXTRA_ENV_SETTINGS \
> -       "bootm_size=0x4000000\0"        \
> -       "bootm_low=0x80000000\0"        \
> -       "stdin=serial,button-kbd\0"     \
> -       "stdout=serial,vidconsole\0"    \
> -       "stderr=serial,vidconsole\0"    \
> -       "preboot=source $prevbl_initrd_start_addr:prebootscript\0" \
> -       "bootcmd=source $prevbl_initrd_start_addr:bootscript\0"
> -
> -/* Size of malloc() pool */
> -
> -#endif
>
> --
> 2.43.0
>
Caleb Connolly Feb. 1, 2024, 2:38 p.m. UTC | #2
[snip]

>> diff --git a/configs/dragonboard845c_defconfig b/configs/dragonboard845c_defconfig
>> deleted file mode 100644
>> index f29f11e342e7..000000000000
>> --- a/configs/dragonboard845c_defconfig
>> +++ /dev/null
>> @@ -1,29 +0,0 @@
>> -CONFIG_ARM=y
>> -CONFIG_SKIP_LOWLEVEL_INIT=y
>> -CONFIG_COUNTER_FREQUENCY=19000000
>> -CONFIG_POSITION_INDEPENDENT=y
>> -CONFIG_ARCH_SNAPDRAGON=y
>> -CONFIG_DEFAULT_DEVICE_TREE="dragonboard845c"
>> -CONFIG_TARGET_DRAGONBOARD845C=y
>> -CONFIG_IDENT_STRING="\nQualcomm-DragonBoard 845C"
>> -CONFIG_SYS_LOAD_ADDR=0x80000000
>> -CONFIG_FIT=y
>> -CONFIG_FIT_VERBOSE=y
>> -CONFIG_BOOTDELAY=5
>> -CONFIG_SAVE_PREV_BL_FDT_ADDR=y
>> -CONFIG_SAVE_PREV_BL_INITRAMFS_START_ADDR=y
> 
> I would suggest keeping this config option in new qcom_defconfig since
> it allows to package FIT image as intramfs within boot.img...

Ah for sure, nice catch.

I know this is a pretty huge patch, but for future reference please
could you trim down irrelevant stuff when replying? Otherwise it's easy
to miss your comments...

[snip]

>> diff --git a/include/configs/qcom.h b/include/configs/qcom.h
>> new file mode 100644
>> index 000000000000..e50b3bce5cdd
>> --- /dev/null
>> +++ b/include/configs/qcom.h
>> @@ -0,0 +1,21 @@
>> +/* SPDX-License-Identifier: GPL-2.0+ */
>> +/*
>> + * Configuration file for Qualcomm Snapdragon boards
>> + *
>> + * (C) Copyright 2021 Dzmitry Sankouski <dsankouski@gmail.com>
>> + * (C) Copyright 2023 Linaro Ltd.
>> + */
>> +
>> +#ifndef __CONFIGS_SNAPDRAGON_H
>> +#define __CONFIGS_SNAPDRAGON_H
>> +
>> +#define CFG_SYS_BAUDRATE_TABLE { 115200, 230400, 460800, 921600 }
>> +
>> +/* Load addressed are calculated during board_late_init(). See arm/mach-snapdragon/board.c */
>> +#define CFG_EXTRA_ENV_SETTINGS \
>> +       "stdin=serial,button-kbd\0"     \
>> +       "stdout=serial,vidconsole\0"    \
>> +       "stderr=serial,vidconsole\0" \
>> +       "bootcmd=bootm $prevbl_initrd_start_addr\0"
> 
> ...as otherwise this bootcmd won't work.
> 
> -Sumit
> 
>> +
diff mbox series

Patch

diff --git a/arch/arm/Kconfig b/arch/arm/Kconfig
index 9e73b69f1e1f..03ea75cefc0d 100644
--- a/arch/arm/Kconfig
+++ b/arch/arm/Kconfig
@@ -1085,6 +1085,9 @@  config ARCH_SNAPDRAGON
 	select OF_SEPARATE
 	select SMEM
 	select SPMI
+	select OF_BOARD
+	select SAVE_PREV_BL_FDT_ADDR
+	select LINUX_KERNEL_IMAGE_HEADER
 	imply CMD_DM
 
 config ARCH_SOCFPGA
diff --git a/arch/arm/dts/Makefile b/arch/arm/dts/Makefile
index 773c2546131c..b058def774d4 100644
--- a/arch/arm/dts/Makefile
+++ b/arch/arm/dts/Makefile
@@ -628,10 +628,11 @@  dtb-$(CONFIG_TARGET_SL28) += fsl-ls1028a-kontron-sl28.dtb \
 
 dtb-$(CONFIG_TARGET_TEN64) += fsl-ls1088a-ten64.dtb
 
-dtb-$(CONFIG_TARGET_DRAGONBOARD410C) += dragonboard410c.dtb
-dtb-$(CONFIG_TARGET_DRAGONBOARD820C) += dragonboard820c.dtb
-dtb-$(CONFIG_TARGET_STARQLTECHN) += starqltechn.dtb
-dtb-$(CONFIG_TARGET_QCS404EVB) += qcs404-evb.dtb
+dtb-$(CONFIG_ARCH_SNAPDRAGON) += dragonboard410c.dtb \
+	dragonboard820c.dtb \
+	dragonboard845c.dtb \
+	starqltechn.dtb \
+	qcs404-evb.dtb
 
 dtb-$(CONFIG_TARGET_STEMMY) += ste-ux500-samsung-stemmy.dtb
 
diff --git a/arch/arm/mach-snapdragon/Kconfig b/arch/arm/mach-snapdragon/Kconfig
index f897c393464f..96e44e2c5491 100644
--- a/arch/arm/mach-snapdragon/Kconfig
+++ b/arch/arm/mach-snapdragon/Kconfig
@@ -3,6 +3,9 @@  if ARCH_SNAPDRAGON
 config SYS_SOC
 	default "snapdragon"
 
+config SYS_VENDOR
+	default "qualcomm"
+
 config SYS_MALLOC_F_LEN
 	default 0x2000
 
@@ -12,91 +15,24 @@  config SPL_SYS_MALLOC_F
 config SPL_SYS_MALLOC_F_LEN
 	default 0x2000
 
-config SDM845
-	bool "Qualcomm Snapdragon 845 SoC"
-	select LINUX_KERNEL_IMAGE_HEADER
-	imply CLK_QCOM_SDM845
-	imply PINCTRL_QCOM_SDM845
-	imply BUTTON_QCOM_PMIC
-
 config LNX_KRNL_IMG_TEXT_OFFSET_BASE
 	default 0x80000000
 
-choice
-	prompt "Snapdragon board select"
-
-config TARGET_DRAGONBOARD410C
-	bool "96Boards Dragonboard 410C"
-	select BOARD_LATE_INIT
-	select ENABLE_ARM_SOC_BOOT0_HOOK
-	imply CLK_QCOM_APQ8016
-	imply PINCTRL_QCOM_APQ8016
-	imply BUTTON_QCOM_PMIC
+config SYS_BOARD
+	string "Qualcomm custom board"
 	help
-	  Support for 96Boards Dragonboard 410C. This board complies with
-	  96Board Open Platform Specifications. Features:
-	  - Qualcomm Snapdragon 410C SoC - APQ8016 (4xCortex A53, Adreno 306)
-	  - 1GiB RAM
-	  - 8GiB eMMC, uSD slot
-	  - WiFi, Bluetooth and GPS module
-	  - 2x Host, 1x Device USB port
-	  - HDMI
-	  - 20-pin low speed and 40-pin high speed expanders, 4 LED, 3 buttons
+	  The Dragonboard 410c and 820c have additional board init
+	  code that isn't shared with other Qualcomm boards.
+	  Based on this option board/qualcomm/<CONFIG_SYS_BOARD> will
+	  be used.
 
-config TARGET_DRAGONBOARD820C
-	bool "96Boards Dragonboard 820C"
-	select LINUX_KERNEL_IMAGE_HEADER
-	imply CLK_QCOM_APQ8096
-	imply PINCTRL_QCOM_APQ8096
-	imply BUTTON_QCOM_PMIC
+config SYS_CONFIG_NAME
+	string "Board configuration name"
+	default SYS_BOARD if SYS_BOARD != ""
+	default "qcom"
 	help
-	  Support for 96Boards Dragonboard 820C. This board complies with
-	  96Board Open Platform Specifications. Features:
-	  - Qualcomm Snapdragon 820C SoC - APQ8096 (4xKyro CPU)
-	  - 3GiB RAM
-	  - 32GiB UFS drive
-
-config TARGET_DRAGONBOARD845C
-	bool "96Boards Dragonboard 845C"
-	help
-	  Support for 96Boards Dragonboard 845C aka Robotics RB3 Development
-	  Platform. This board complies with 96Boards Open Platform
-	  Specifications. Features:
-	  - Qualcomm Snapdragon SDA845 SoC
-	  - 4GiB RAM
-	  - 64GiB UFS drive
-	select MISC_INIT_R
-	select SDM845
-
-config TARGET_STARQLTECHN
-	bool "Samsung S9 SM-G9600(starqltechn)"
-	help
-	  Support for Samsung S9 SM-G9600(starqltechn) board.
-	  Features:
-	  - Qualcomm Snapdragon SDM845 SoC
-	  - 4GiB RAM
-	  - 64GiB UFS drive
-	select MISC_INIT_R
-	select SDM845
-
-config TARGET_QCS404EVB
-	bool "Qualcomm Technologies, Inc. QCS404 EVB"
-	select LINUX_KERNEL_IMAGE_HEADER
-	imply CLK_QCOM_QCS404
-	imply PINCTRL_QCOM_QCS404
-	help
-	  Support for Qualcomm Technologies, Inc. QCS404 evaluation board.
-	  Features:
-	  - Qualcomm Snapdragon QCS404 SoC
-	  - 1GiB RAM
-	  - 8GiB eMMC, uSD slot
-
-endchoice
-
-source "board/qualcomm/dragonboard410c/Kconfig"
-source "board/qualcomm/dragonboard820c/Kconfig"
-source "board/qualcomm/dragonboard845c/Kconfig"
-source "board/samsung/starqltechn/Kconfig"
-source "board/qualcomm/qcs404-evb/Kconfig"
+	  This option contains information about board configuration name.
+	  Based on this option include/configs/<CONFIG_SYS_CONFIG_NAME>.h header
+	  will be used for board configuration.
 
 endif
diff --git a/arch/arm/mach-snapdragon/Makefile b/arch/arm/mach-snapdragon/Makefile
index d02432df8b04..857171e593da 100644
--- a/arch/arm/mach-snapdragon/Makefile
+++ b/arch/arm/mach-snapdragon/Makefile
@@ -2,8 +2,4 @@ 
 #
 # (C) Copyright 2015 Mateusz Kulikowski <mateusz.kulikowski@gmail.com>
 
-obj-$(CONFIG_SDM845) += sysmap-sdm845.o
-obj-$(CONFIG_SDM845) += init_sdm845.o
-obj-$(CONFIG_TARGET_DRAGONBOARD820C) += sysmap-apq8096.o
-obj-$(CONFIG_TARGET_DRAGONBOARD410C) += sysmap-apq8016.o
-obj-$(CONFIG_TARGET_QCS404EVB) += sysmap-qcs404.o
+obj-y += board.o
diff --git a/arch/arm/mach-snapdragon/board.c b/arch/arm/mach-snapdragon/board.c
new file mode 100644
index 000000000000..3018cc462b8f
--- /dev/null
+++ b/arch/arm/mach-snapdragon/board.c
@@ -0,0 +1,216 @@ 
+// SPDX-License-Identifier: GPL-2.0+
+/*
+ * Common initialisation for Qualcomm Snapdragon boards.
+ *
+ * Copyright (c) 2023 Linaro Ltd.
+ * Author: Caleb Connolly <caleb.connolly@linaro.org>
+ */
+
+#define LOG_DEBUG
+
+#include <asm/armv8/mmu.h>
+#include <asm/gpio.h>
+#include <asm/io.h>
+#include <asm/psci.h>
+#include <asm/system.h>
+#include <dm/device.h>
+#include <dm/pinctrl.h>
+#include <dm/uclass-internal.h>
+#include <dm/read.h>
+#include <env.h>
+#include <init.h>
+#include <linux/arm-smccc.h>
+#include <linux/bug.h>
+#include <linux/psci.h>
+#include <linux/sizes.h>
+#include <malloc.h>
+#include <usb.h>
+
+DECLARE_GLOBAL_DATA_PTR;
+
+static struct mm_region rbx_mem_map[CONFIG_NR_DRAM_BANKS + 2] = { { 0 } };
+
+struct mm_region *mem_map = rbx_mem_map;
+
+int dram_init(void)
+{
+	return fdtdec_setup_mem_size_base();
+}
+
+static int ddr_bank_cmp(const void *v1, const void *v2)
+{
+	const struct {
+		phys_addr_t start;
+		phys_size_t size;
+	} *res1 = v1, *res2 = v2;
+
+	if (!res1->size)
+		return 1;
+	if (!res2->size)
+		return -1;
+
+	return (res1->start >> 24) - (res2->start >> 24);
+}
+
+int dram_init_banksize(void)
+{
+	int ret;
+
+	ret = fdtdec_setup_memory_banksize();
+	if (ret < 0)
+		return ret;
+
+	if (CONFIG_NR_DRAM_BANKS < 2)
+		return 0;
+
+	/* Sort our RAM banks -_- */
+	qsort(gd->bd->bi_dram, CONFIG_NR_DRAM_BANKS, sizeof(gd->bd->bi_dram[0]), ddr_bank_cmp);
+
+	return 0;
+}
+
+static void show_psci_version(void)
+{
+	struct arm_smccc_res res;
+
+	arm_smccc_smc(ARM_PSCI_0_2_FN_PSCI_VERSION, 0, 0, 0, 0, 0, 0, 0, &res);
+
+	debug("PSCI:  v%ld.%ld\n",
+	      PSCI_VERSION_MAJOR(res.a0),
+	      PSCI_VERSION_MINOR(res.a0));
+}
+
+void *board_fdt_blob_setup(int *err)
+{
+	phys_addr_t fdt;
+	/* Return DTB pointer passed by ABL */
+	*err = 0;
+	fdt = get_prev_bl_fdt_addr();
+
+	/*
+	 * If we bail then the board will simply not boot, instead let's
+	 * try and use the FDT built into U-Boot if there is one...
+	 * This avoids having a hard dependency on the previous stage bootloader
+	 */
+	if (IS_ENABLED(CONFIG_OF_SEPARATE) && (!fdt || fdt != ALIGN(fdt, SZ_4K))) {
+		debug("%s: Using built in FDT, bootloader gave us %#llx\n", __func__, fdt);
+		return (void *)gd->fdt_blob;
+	}
+
+	return (void *)fdt;
+}
+
+void reset_cpu(void)
+{
+	psci_system_reset();
+}
+
+/*
+ * Some Qualcomm boards require GPIO configuration when switching USB modes.
+ * Support setting this configuration via pinctrl state.
+ */
+int board_usb_init(int index, enum usb_init_type init)
+{
+	struct udevice *usb;
+	int ret = 0;
+
+	/* USB device */
+	ret = uclass_find_device_by_seq(UCLASS_USB, index, &usb);
+	if (ret) {
+		printf("Cannot find USB device\n");
+		return ret;
+	}
+
+	ret = dev_read_stringlist_search(usb, "pinctrl-names",
+					 "device");
+	/* No "device" pinctrl state, so just bail */
+	if (ret < 0)
+		return 0;
+
+	/* Select "default" or "device" pinctrl */
+	switch (init) {
+	case USB_INIT_HOST:
+		pinctrl_select_state(usb, "default");
+		break;
+	case USB_INIT_DEVICE:
+		pinctrl_select_state(usb, "device");
+		break;
+	default:
+		debug("Unknown usb_init_type %d\n", init);
+		break;
+	}
+
+	return 0;
+}
+
+/*
+ * Some boards still need board specific init code, they can implement that by
+ * overriding this function.
+ *
+ * FIXME: get rid of board specific init code
+ */
+void __weak qcom_board_init(void)
+{
+}
+
+int board_init(void)
+{
+	show_psci_version();
+	qcom_board_init();
+	return 0;
+}
+
+static void build_mem_map(void)
+{
+	int i;
+
+	/*
+	 * Ensure the peripheral block is sized to correctly cover the address range
+	 * up to the first memory bank.
+	 * Don't map the first page to ensure that we actually trigger an abort on a
+	 * null pointer access rather than just hanging.
+	 * FIXME: we should probably split this into more precise regions
+	 */
+	mem_map[0].phys = 0x1000;
+	mem_map[0].virt = mem_map[0].phys;
+	mem_map[0].size = gd->bd->bi_dram[0].start - mem_map[0].phys;
+	mem_map[0].attrs = PTE_BLOCK_MEMTYPE(MT_DEVICE_NGNRNE) |
+			 PTE_BLOCK_NON_SHARE |
+			 PTE_BLOCK_PXN | PTE_BLOCK_UXN;
+
+	debug("Configured memory map:\n");
+	debug("  0x%016llx - 0x%016llx: Peripheral block\n",
+	      mem_map[0].phys, mem_map[0].phys + mem_map[0].size);
+
+	/*
+	 * Now add memory map entries for each DRAM bank, ensuring we don't
+	 * overwrite the list terminator
+	 */
+	for (i = 0; i < ARRAY_SIZE(rbx_mem_map) - 2 && gd->bd->bi_dram[i].size; i++) {
+		if (i == ARRAY_SIZE(rbx_mem_map) - 1) {
+			log_warning("Too many DRAM banks!\n");
+			break;
+		}
+		mem_map[i + 1].phys = gd->bd->bi_dram[i].start;
+		mem_map[i + 1].virt = mem_map[i + 1].phys;
+		mem_map[i + 1].size = gd->bd->bi_dram[i].size;
+		mem_map[i + 1].attrs = PTE_BLOCK_MEMTYPE(MT_NORMAL) |
+				     PTE_BLOCK_INNER_SHARE;
+
+		debug("  0x%016llx - 0x%016llx: DDR bank %d\n",
+		      mem_map[i + 1].phys, mem_map[i + 1].phys + mem_map[i + 1].size, i);
+	}
+}
+
+u64 get_page_table_size(void)
+{
+	return SZ_64K;
+}
+
+void enable_caches(void)
+{
+	build_mem_map();
+
+	icache_enable();
+	dcache_enable();
+}
diff --git a/arch/arm/mach-snapdragon/init_sdm845.c b/arch/arm/mach-snapdragon/init_sdm845.c
deleted file mode 100644
index 067acc9a6f44..000000000000
--- a/arch/arm/mach-snapdragon/init_sdm845.c
+++ /dev/null
@@ -1,73 +0,0 @@ 
-// SPDX-License-Identifier: GPL-2.0+
-/*
- * Common init part for boards based on SDM845
- *
- * (C) Copyright 2021 Dzmitry Sankouski <dsankouski@gmail.com>
- */
-
-#include <button.h>
-#include <init.h>
-#include <env.h>
-#include <common.h>
-#include <asm/system.h>
-#include <asm/gpio.h>
-#include <dm.h>
-
-DECLARE_GLOBAL_DATA_PTR;
-
-int dram_init(void)
-{
-	return fdtdec_setup_mem_size_base();
-}
-
-void reset_cpu(void)
-{
-	psci_system_reset();
-}
-
-__weak int board_init(void)
-{
-	return 0;
-}
-
-/* Check for vol- and power buttons */
-__weak int misc_init_r(void)
-{
-	struct udevice *btn;
-	int ret;
-	enum button_state_t state;
-
-	ret = button_get_by_label("pwrkey", &btn);
-	if (ret < 0) {
-		printf("Couldn't find power button!\n");
-		return ret;
-	}
-
-	state = button_get_state(btn);
-	if (state == BUTTON_ON) {
-		env_set("key_power", "1");
-		printf("Power button pressed\n");
-	} else {
-		env_set("key_power", "0");
-	}
-
-	/*
-	 * search for kaslr address, set by primary bootloader by searching first
-	 * 0x100 relocated bytes at u-boot's initial load address range
-	 */
-	uintptr_t start = gd->ram_base;
-	uintptr_t end = start + 0x800000;
-	u8 *addr = (u8 *)start;
-	phys_addr_t *relocaddr = (phys_addr_t *)gd->relocaddr;
-	u32 block_size = 0x1000;
-
-	while (memcmp(addr, relocaddr, 0x100) && (uintptr_t)addr < end)
-		addr += block_size;
-
-	if ((uintptr_t)addr >= end)
-		printf("KASLR not found in range 0x%lx - 0x%lx", start, end);
-	else
-		env_set_addr("KASLR", addr);
-
-	return 0;
-}
diff --git a/arch/arm/mach-snapdragon/sysmap-apq8016.c b/arch/arm/mach-snapdragon/sysmap-apq8016.c
deleted file mode 100644
index ffa3f9aa3532..000000000000
--- a/arch/arm/mach-snapdragon/sysmap-apq8016.c
+++ /dev/null
@@ -1,31 +0,0 @@ 
-// SPDX-License-Identifier: GPL-2.0+
-/*
- * Qualcomm APQ8016 memory map
- *
- * (C) Copyright 2016 Mateusz Kulikowski <mateusz.kulikowski@gmail.com>
- */
-
-#include <common.h>
-#include <asm/armv8/mmu.h>
-
-static struct mm_region apq8016_mem_map[] = {
-	{
-		.virt = 0x0UL, /* Peripheral block */
-		.phys = 0x0UL, /* Peripheral block */
-		.size = 0x8000000UL,
-		.attrs = PTE_BLOCK_MEMTYPE(MT_DEVICE_NGNRNE) |
-			 PTE_BLOCK_NON_SHARE |
-			 PTE_BLOCK_PXN | PTE_BLOCK_UXN
-	}, {
-		.virt = 0x80000000UL, /* DDR */
-		.phys = 0x80000000UL, /* DDR */
-		.size = 0x80000000UL,
-		.attrs = PTE_BLOCK_MEMTYPE(MT_NORMAL) |
-			 PTE_BLOCK_INNER_SHARE
-	}, {
-		/* List terminator */
-		0,
-	}
-};
-
-struct mm_region *mem_map = apq8016_mem_map;
diff --git a/arch/arm/mach-snapdragon/sysmap-apq8096.c b/arch/arm/mach-snapdragon/sysmap-apq8096.c
deleted file mode 100644
index 0614f8308d02..000000000000
--- a/arch/arm/mach-snapdragon/sysmap-apq8096.c
+++ /dev/null
@@ -1,31 +0,0 @@ 
-// SPDX-License-Identifier: GPL-2.0+
-/*
- * Qualcomm APQ8096 memory map
- *
- * (C) Copyright 2017 Jorge Ramirez Ortiz <jorge.ramirez-ortiz@linaro.org>
- */
-
-#include <common.h>
-#include <asm/armv8/mmu.h>
-
-static struct mm_region apq8096_mem_map[] = {
-	{
-		.virt = 0x0UL, /* Peripheral block */
-		.phys = 0x0UL, /* Peripheral block */
-		.size = 0x10000000UL,
-		.attrs = PTE_BLOCK_MEMTYPE(MT_DEVICE_NGNRNE) |
-			 PTE_BLOCK_NON_SHARE |
-			 PTE_BLOCK_PXN | PTE_BLOCK_UXN
-	}, {
-		.virt = 0x80000000UL, /* DDR */
-		.phys = 0x80000000UL, /* DDR */
-		.size = 0xC0000000UL,
-		.attrs = PTE_BLOCK_MEMTYPE(MT_NORMAL) |
-			 PTE_BLOCK_INNER_SHARE
-	}, {
-		/* List terminator */
-		0,
-	}
-};
-
-struct mm_region *mem_map = apq8096_mem_map;
diff --git a/arch/arm/mach-snapdragon/sysmap-qcs404.c b/arch/arm/mach-snapdragon/sysmap-qcs404.c
deleted file mode 100644
index 64ca4adf1bd1..000000000000
--- a/arch/arm/mach-snapdragon/sysmap-qcs404.c
+++ /dev/null
@@ -1,43 +0,0 @@ 
-// SPDX-License-Identifier: GPL-2.0+
-/*
- * Qualcomm QCS404 memory map
- *
- * (C) Copyright 2022 Sumit Garg <sumit.garg@linaro.org>
- */
-
-#include <common.h>
-#include <asm/armv8/mmu.h>
-
-static struct mm_region qcs404_mem_map[] = {
-	{
-		.virt = 0x0UL, /* Peripheral block */
-		.phys = 0x0UL, /* Peripheral block */
-		.size = 0x8000000UL,
-		.attrs = PTE_BLOCK_MEMTYPE(MT_DEVICE_NGNRNE) |
-			 PTE_BLOCK_NON_SHARE |
-			 PTE_BLOCK_PXN | PTE_BLOCK_UXN
-	}, {
-		.virt = 0x80000000UL, /* DDR */
-		.phys = 0x80000000UL, /* DDR */
-		.size = 0x05900000UL,
-		.attrs = PTE_BLOCK_MEMTYPE(MT_NORMAL) |
-			 PTE_BLOCK_INNER_SHARE
-	}, {
-		.virt = 0x89600000UL, /* DDR */
-		.phys = 0x89600000UL, /* DDR */
-		.size = 0x162000000UL,
-		.attrs = PTE_BLOCK_MEMTYPE(MT_NORMAL) |
-			 PTE_BLOCK_INNER_SHARE
-	}, {
-		.virt = 0xa0000000UL, /* DDR */
-		.phys = 0xa0000000UL, /* DDR */
-		.size = 0x20000000UL,
-		.attrs = PTE_BLOCK_MEMTYPE(MT_NORMAL) |
-			 PTE_BLOCK_INNER_SHARE
-	}, {
-		/* List terminator */
-		0,
-	}
-};
-
-struct mm_region *mem_map = qcs404_mem_map;
diff --git a/arch/arm/mach-snapdragon/sysmap-sdm845.c b/arch/arm/mach-snapdragon/sysmap-sdm845.c
deleted file mode 100644
index 721ac411665c..000000000000
--- a/arch/arm/mach-snapdragon/sysmap-sdm845.c
+++ /dev/null
@@ -1,31 +0,0 @@ 
-// SPDX-License-Identifier: GPL-2.0+
-/*
- * Qualcomm SDM845 memory map
- *
- * (C) Copyright 2021 Dzmitry Sankouski <dsankousk@gmail.com>
- */
-
-#include <common.h>
-#include <asm/armv8/mmu.h>
-
-static struct mm_region sdm845_mem_map[] = {
-	{
-		.virt = 0x0UL, /* Peripheral block */
-		.phys = 0x0UL, /* Peripheral block */
-		.size = 0x10000000UL,
-		.attrs = PTE_BLOCK_MEMTYPE(MT_DEVICE_NGNRNE) |
-			 PTE_BLOCK_NON_SHARE |
-			 PTE_BLOCK_PXN | PTE_BLOCK_UXN
-	}, {
-		.virt = 0x80000000UL, /* DDR */
-		.phys = 0x80000000UL, /* DDR */
-		.size = 0x200000000UL, /* 8GiB - maximum allowed memory */
-		.attrs = PTE_BLOCK_MEMTYPE(MT_NORMAL) |
-			 PTE_BLOCK_INNER_SHARE
-	}, {
-		/* List terminator */
-		0,
-	}
-};
-
-struct mm_region *mem_map = sdm845_mem_map;
diff --git a/board/qualcomm/dragonboard410c/Kconfig b/board/qualcomm/dragonboard410c/Kconfig
deleted file mode 100644
index 03bd7ae309cd..000000000000
--- a/board/qualcomm/dragonboard410c/Kconfig
+++ /dev/null
@@ -1,15 +0,0 @@ 
-if TARGET_DRAGONBOARD410C
-
-config SYS_BOARD
-	default "dragonboard410c"
-
-config SYS_VENDOR
-	default "qualcomm"
-
-config SYS_SOC
-	default "apq8016"
-
-config SYS_CONFIG_NAME
-	default "dragonboard410c"
-
-endif
diff --git a/board/qualcomm/dragonboard410c/dragonboard410c.c b/board/qualcomm/dragonboard410c/dragonboard410c.c
index 40b5448c6ef1..0136cc2237de 100644
--- a/board/qualcomm/dragonboard410c/dragonboard410c.c
+++ b/board/qualcomm/dragonboard410c/dragonboard410c.c
@@ -23,37 +23,6 @@ 
 
 DECLARE_GLOBAL_DATA_PTR;
 
-#define USB_HUB_RESET_GPIO 2
-#define USB_SW_SELECT_GPIO 3
-
-int board_usb_init(int index, enum usb_init_type init)
-{
-	struct udevice *usb;
-	int ret = 0;
-
-	/* USB device */
-	ret = device_find_global_by_ofnode(ofnode_path("/soc/usb"), &usb);
-	if (ret) {
-		printf("Cannot find USB device\n");
-		return ret;
-	}
-
-	/* Select "default" or "device" pinctrl */
-	switch (init) {
-	case USB_INIT_HOST:
-		pinctrl_select_state(usb, "default");
-		break;
-	case USB_INIT_DEVICE:
-		pinctrl_select_state(usb, "device");
-		break;
-	default:
-		debug("Unknown usb_init_type %d\n", init);
-		break;
-	}
-
-	return 0;
-}
-
 /* UNSTUFF_BITS macro taken from Linux Kernel: drivers/mmc/core/sd.c */
 #define UNSTUFF_BITS(resp, start, size) \
 	({ \
@@ -119,11 +88,6 @@  int misc_init_r(void)
 	return 0;
 }
 
-int board_init(void)
-{
-	return 0;
-}
-
 int board_late_init(void)
 {
 	char serial[16];
@@ -166,8 +130,3 @@  int ft_board_setup(void *blob, struct bd_info *bd)
 			   "local-bd-address", mac, ARP_HLEN, 1);
 	return 0;
 }
-
-void reset_cpu(void)
-{
-	psci_system_reset();
-}
diff --git a/board/qualcomm/dragonboard820c/Kconfig b/board/qualcomm/dragonboard820c/Kconfig
deleted file mode 100644
index aff9af527128..000000000000
--- a/board/qualcomm/dragonboard820c/Kconfig
+++ /dev/null
@@ -1,15 +0,0 @@ 
-if TARGET_DRAGONBOARD820C
-
-config SYS_BOARD
-	default "dragonboard820c"
-
-config SYS_VENDOR
-	default "qualcomm"
-
-config SYS_SOC
-	default "apq8096"
-
-config SYS_CONFIG_NAME
-	default "dragonboard820c"
-
-endif
diff --git a/board/qualcomm/dragonboard820c/dragonboard820c.c b/board/qualcomm/dragonboard820c/dragonboard820c.c
index 2f0db628368b..ac7de711c588 100644
--- a/board/qualcomm/dragonboard820c/dragonboard820c.c
+++ b/board/qualcomm/dragonboard820c/dragonboard820c.c
@@ -27,24 +27,6 @@ 
 
 DECLARE_GLOBAL_DATA_PTR;
 
-int dram_init(void)
-{
-	gd->ram_size = PHYS_SDRAM_SIZE;
-
-	return 0;
-}
-
-int dram_init_banksize(void)
-{
-	gd->bd->bi_dram[0].start = PHYS_SDRAM_1;
-	gd->bd->bi_dram[0].size = PHYS_SDRAM_1_SIZE;
-
-	gd->bd->bi_dram[1].start = PHYS_SDRAM_2;
-	gd->bd->bi_dram[1].size  = PHYS_SDRAM_2_SIZE;
-
-	return 0;
-}
-
 static void sdhci_power_init(void)
 {
 	const u32 TLMM_PULL_MASK = 0x3;
@@ -113,28 +95,9 @@  static void sdhci_power_init(void)
 			rclk[i].val  << rclk[i].bit);
 }
 
-static void show_psci_version(void)
-{
-	struct arm_smccc_res res;
-
-	arm_smccc_smc(ARM_PSCI_0_2_FN_PSCI_VERSION, 0, 0, 0, 0, 0, 0, 0, &res);
-
-	printf("PSCI:  v%ld.%ld\n",
-	       PSCI_VERSION_MAJOR(res.a0),
-		PSCI_VERSION_MINOR(res.a0));
-}
-
-int board_init(void)
+void qcom_board_init(void)
 {
 	sdhci_power_init();
-	show_psci_version();
-
-	return 0;
-}
-
-void reset_cpu(void)
-{
-	psci_system_reset();
 }
 
 /* Check for vol- button - if pressed - stop autoboot */
diff --git a/board/qualcomm/dragonboard845c/Kconfig b/board/qualcomm/dragonboard845c/Kconfig
deleted file mode 100644
index 52fdff288d59..000000000000
--- a/board/qualcomm/dragonboard845c/Kconfig
+++ /dev/null
@@ -1,12 +0,0 @@ 
-if TARGET_DRAGONBOARD845C
-
-config SYS_BOARD
-	default "dragonboard845c"
-
-config SYS_CONFIG_NAME
-	default "dragonboard845c"
-
-config SYS_VENDOR
-	default "qualcomm"
-
-endif
diff --git a/board/qualcomm/qcs404-evb/Kconfig b/board/qualcomm/qcs404-evb/Kconfig
deleted file mode 100644
index 32657c7d5e31..000000000000
--- a/board/qualcomm/qcs404-evb/Kconfig
+++ /dev/null
@@ -1,15 +0,0 @@ 
-if TARGET_QCS404EVB
-
-config SYS_BOARD
-	default "qcs404-evb"
-
-config SYS_VENDOR
-	default "qualcomm"
-
-config SYS_SOC
-	default "qcs404"
-
-config SYS_CONFIG_NAME
-	default "qcs404-evb"
-
-endif
diff --git a/board/qualcomm/qcs404-evb/qcs404-evb.c b/board/qualcomm/qcs404-evb/qcs404-evb.c
index 249dca7e72f1..1a4b1f97a3ae 100644
--- a/board/qualcomm/qcs404-evb/qcs404-evb.c
+++ b/board/qualcomm/qcs404-evb/qcs404-evb.c
@@ -14,16 +14,10 @@ 
 #include <asm/gpio.h>
 #include <asm/global_data.h>
 #include <fdt_support.h>
-#include <asm/arch/dram.h>
 
 DECLARE_GLOBAL_DATA_PTR;
 
-int dram_init(void)
-{
-	return fdtdec_setup_mem_size_base();
-}
-
-int board_init(void)
+void qcom_board_init(void)
 {
 	struct udevice *pmic_gpio;
 	struct gpio_desc usb_vbus_boost_pin;
@@ -34,29 +28,22 @@  int board_init(void)
 					&pmic_gpio);
 	if (ret < 0) {
 		printf("Failed to find pms405_gpios@c000 node.\n");
-		return ret;
+		return;
 	}
 
 	node = fdt_subnode_offset(gd->fdt_blob, dev_of_offset(pmic_gpio),
 				  "usb_vbus_boost_pin");
 	if (node < 0) {
 		printf("Failed to find usb_hub_reset_pm dt node.\n");
-		return node;
+		return;
 	}
 	ret = gpio_request_by_name_nodev(offset_to_ofnode(node), "gpios", 0,
 					 &usb_vbus_boost_pin, 0);
 	if (ret < 0) {
 		printf("Failed to request usb_hub_reset_pm gpio.\n");
-		return ret;
+		return;
 	}
 
 	dm_gpio_set_dir_flags(&usb_vbus_boost_pin,
 			      GPIOD_IS_OUT | GPIOD_IS_OUT_ACTIVE);
-
-	return 0;
-}
-
-void reset_cpu(void)
-{
-	psci_system_reset();
 }
diff --git a/configs/dragonboard410c_defconfig b/configs/dragonboard410c_defconfig
index 56a73893d3df..efdee8a40fa3 100644
--- a/configs/dragonboard410c_defconfig
+++ b/configs/dragonboard410c_defconfig
@@ -1,9 +1,10 @@ 
 CONFIG_ARM=y
+CONFIG_SYS_BOARD="dragonboard410c"
 CONFIG_COUNTER_FREQUENCY=19000000
+CONFIG_ENABLE_ARM_SOC_BOOT0_HOOK=y
 CONFIG_ARCH_SNAPDRAGON=y
 CONFIG_TEXT_BASE=0x8f600000
 CONFIG_SYS_MALLOC_LEN=0x802000
-CONFIG_NR_DRAM_BANKS=1
 CONFIG_HAS_CUSTOM_SYS_INIT_SP_ADDR=y
 CONFIG_CUSTOM_SYS_INIT_SP_ADDR=0x8007fff0
 CONFIG_ENV_SIZE=0x2000
@@ -38,7 +39,9 @@  CONFIG_CMD_TIMER=y
 CONFIG_ENV_IS_IN_MMC=y
 CONFIG_SYS_RELOC_GD_ENV_ADDR=y
 CONFIG_SYS_MMC_ENV_PART=2
+CONFIG_BUTTON_QCOM_PMIC=y
 CONFIG_CLK=y
+CONFIG_CLK_QCOM_APQ8016=y
 CONFIG_USB_FUNCTION_FASTBOOT=y
 CONFIG_FASTBOOT_BUF_ADDR=0x91000000
 CONFIG_FASTBOOT_FLASH=y
@@ -52,6 +55,7 @@  CONFIG_MMC_SDHCI_MSM=y
 CONFIG_PHY=y
 CONFIG_PINCTRL=y
 CONFIG_PINCONF=y
+CONFIG_PINCTRL_QCOM_APQ8016=y
 CONFIG_DM_PMIC=y
 CONFIG_PMIC_QCOM=y
 CONFIG_MSM_SERIAL=y
diff --git a/configs/dragonboard820c_defconfig b/configs/dragonboard820c_defconfig
index 7304ff97dd8e..89847ce0b307 100644
--- a/configs/dragonboard820c_defconfig
+++ b/configs/dragonboard820c_defconfig
@@ -1,14 +1,13 @@ 
 CONFIG_ARM=y
+CONFIG_SYS_BOARD="dragonboard820c"
 CONFIG_COUNTER_FREQUENCY=19000000
 CONFIG_ARCH_SNAPDRAGON=y
 CONFIG_TEXT_BASE=0x80080000
 CONFIG_SYS_MALLOC_LEN=0x804000
-CONFIG_NR_DRAM_BANKS=2
 CONFIG_HAS_CUSTOM_SYS_INIT_SP_ADDR=y
 CONFIG_CUSTOM_SYS_INIT_SP_ADDR=0x8007fff0
 CONFIG_ENV_SIZE=0x4000
 CONFIG_DEFAULT_DEVICE_TREE="dragonboard820c"
-CONFIG_TARGET_DRAGONBOARD820C=y
 CONFIG_IDENT_STRING="\nQualcomm-DragonBoard 820C"
 CONFIG_SYS_LOAD_ADDR=0x80080000
 CONFIG_DISTRO_DEFAULTS=y
@@ -35,12 +34,15 @@  CONFIG_ENV_IS_IN_EXT4=y
 CONFIG_ENV_EXT4_INTERFACE="mmc"
 CONFIG_ENV_EXT4_DEVICE_AND_PART="0:1"
 CONFIG_SYS_RELOC_GD_ENV_ADDR=y
+CONFIG_BUTTON_QCOM_PMIC=y
 CONFIG_CLK=y
+CONFIG_CLK_QCOM_APQ8096=y
 CONFIG_QCOM_PMIC_GPIO=y
 CONFIG_MMC_SDHCI=y
 CONFIG_MMC_SDHCI_MSM=y
 CONFIG_PINCTRL=y
 CONFIG_PINCONF=y
+CONFIG_PINCTRL_QCOM_APQ8096=y
 CONFIG_DM_PMIC=y
 CONFIG_PMIC_QCOM=y
 CONFIG_MSM_SERIAL=y
diff --git a/configs/dragonboard845c_defconfig b/configs/dragonboard845c_defconfig
deleted file mode 100644
index f29f11e342e7..000000000000
--- a/configs/dragonboard845c_defconfig
+++ /dev/null
@@ -1,29 +0,0 @@ 
-CONFIG_ARM=y
-CONFIG_SKIP_LOWLEVEL_INIT=y
-CONFIG_COUNTER_FREQUENCY=19000000
-CONFIG_POSITION_INDEPENDENT=y
-CONFIG_ARCH_SNAPDRAGON=y
-CONFIG_DEFAULT_DEVICE_TREE="dragonboard845c"
-CONFIG_TARGET_DRAGONBOARD845C=y
-CONFIG_IDENT_STRING="\nQualcomm-DragonBoard 845C"
-CONFIG_SYS_LOAD_ADDR=0x80000000
-CONFIG_FIT=y
-CONFIG_FIT_VERBOSE=y
-CONFIG_BOOTDELAY=5
-CONFIG_SAVE_PREV_BL_FDT_ADDR=y
-CONFIG_SAVE_PREV_BL_INITRAMFS_START_ADDR=y
-CONFIG_SYS_CBSIZE=512
-# CONFIG_DISPLAY_CPUINFO is not set
-CONFIG_HUSH_PARSER=y
-CONFIG_SYS_MAXARGS=64
-CONFIG_CMD_GPIO=y
-# CONFIG_NET is not set
-CONFIG_CLK=y
-CONFIG_MSM_GPIO=y
-CONFIG_QCOM_PMIC_GPIO=y
-CONFIG_PINCTRL=y
-CONFIG_DM_PMIC=y
-CONFIG_PMIC_QCOM=y
-CONFIG_MSM_GENI_SERIAL=y
-CONFIG_SPMI_MSM=y
-CONFIG_LMB_MAX_REGIONS=64
diff --git a/configs/qcom_defconfig b/configs/qcom_defconfig
new file mode 100644
index 000000000000..8bd6313d50e4
--- /dev/null
+++ b/configs/qcom_defconfig
@@ -0,0 +1,73 @@ 
+CONFIG_ARM=y
+CONFIG_SKIP_LOWLEVEL_INIT=y
+CONFIG_POSITION_INDEPENDENT=y
+CONFIG_ARCH_SNAPDRAGON=y
+CONFIG_DEFAULT_DEVICE_TREE="dragonboard845c"
+CONFIG_SYS_LOAD_ADDR=0x0
+CONFIG_FIT=y
+CONFIG_FIT_VERBOSE=y
+CONFIG_BOOTSTD_FULL=y
+# CONFIG_BOOTMETH_EXTLINUX is not set
+# CONFIG_BOOTMETH_VBE is not set
+# CONFIG_BOOTMETH_SCRIPT is not set
+CONFIG_BOOTDELAY=1
+CONFIG_USE_PREBOOT=y
+CONFIG_LOG_MAX_LEVEL=9
+CONFIG_LOG_DEFAULT_LEVEL=4
+# CONFIG_DISPLAY_CPUINFO is not set
+CONFIG_DISPLAY_BOARDINFO_LATE=y
+CONFIG_HUSH_PARSER=y
+CONFIG_SYS_MAXARGS=64
+CONFIG_SYS_CBSIZE=512
+CONFIG_CMD_BOOTMENU=y
+CONFIG_CMD_CLK=y
+CONFIG_CMD_GPIO=y
+CONFIG_CMD_MMC=y
+CONFIG_CMD_PART=y
+CONFIG_CMD_UFS=y
+CONFIG_CMD_USB=y
+CONFIG_CMD_CAT=y
+CONFIG_CMD_BMP=y
+CONFIG_CMD_FAT=y
+CONFIG_CMD_FS_GENERIC=y
+CONFIG_CMD_LOG=y
+CONFIG_EFI_PARTITION=y
+# CONFIG_NET is not set
+CONFIG_CLK=y
+CONFIG_CLK_QCOM_QCS404=y
+CONFIG_CLK_QCOM_SDM845=y
+CONFIG_MSM_GPIO=y
+CONFIG_QCOM_PMIC_GPIO=y
+CONFIG_DM_KEYBOARD=y
+CONFIG_BUTTON_KEYBOARD=y
+CONFIG_BUTTON_QCOM_PMIC=y
+CONFIG_MMC_SDHCI=y
+CONFIG_MMC_SDHCI_MSM=y
+CONFIG_PHY=y
+CONFIG_PINCTRL=y
+CONFIG_PINCTRL_QCOM_QCS404=y
+CONFIG_PINCTRL_QCOM_SDM845=y
+CONFIG_DM_PMIC=y
+CONFIG_PMIC_QCOM=y
+CONFIG_SCSI=y
+CONFIG_DM_SCSI=y
+CONFIG_MSM_SERIAL=y
+CONFIG_MSM_GENI_SERIAL=y
+CONFIG_SPMI_MSM=y
+CONFIG_SYSINFO=y
+CONFIG_SYSINFO_SMBIOS=y
+CONFIG_USB=y
+CONFIG_USB_XHCI_HCD=y
+CONFIG_USB_XHCI_DWC3=y
+CONFIG_USB_DWC3=y
+CONFIG_USB_STORAGE=y
+CONFIG_UFS=y
+CONFIG_VIDEO=y
+# CONFIG_VIDEO_FONT_8X16 is not set
+CONFIG_VIDEO_FONT_16X32=y
+CONFIG_SYS_WHITE_ON_BLACK=y
+CONFIG_NO_FB_CLEAR=y
+CONFIG_VIDEO_SIMPLE=y
+CONFIG_HEXDUMP=y
+# CONFIG_GENERATE_SMBIOS_TABLE is not set
+CONFIG_LMB_MAX_REGIONS=64
diff --git a/configs/qcs404evb_defconfig b/configs/qcs404evb_defconfig
index 700c024e8b6a..d85d193895b0 100644
--- a/configs/qcs404evb_defconfig
+++ b/configs/qcs404evb_defconfig
@@ -1,11 +1,10 @@ 
 CONFIG_ARM=y
+CONFIG_SYS_BOARD="qcs404-evb"
 CONFIG_SKIP_LOWLEVEL_INIT=y
 CONFIG_COUNTER_FREQUENCY=19000000
 CONFIG_POSITION_INDEPENDENT=y
 CONFIG_ARCH_SNAPDRAGON=y
 CONFIG_DEFAULT_DEVICE_TREE="qcs404-evb"
-CONFIG_DM_RESET=y
-CONFIG_TARGET_QCS404EVB=y
 CONFIG_IDENT_STRING="\nQualcomm QCS404-EVB"
 CONFIG_SYS_LOAD_ADDR=0x80000000
 CONFIG_FIT=y
@@ -31,6 +30,7 @@  CONFIG_CMD_FAT=y
 CONFIG_CMD_FS_GENERIC=y
 # CONFIG_NET is not set
 CONFIG_CLK=y
+CONFIG_CLK_QCOM_QCS404=y
 CONFIG_MSM_GPIO=y
 CONFIG_QCOM_PMIC_GPIO=y
 CONFIG_MISC=y
@@ -42,6 +42,7 @@  CONFIG_PHY=y
 CONFIG_PHY_QCOM_USB_HS_28NM=y
 CONFIG_PHY_QCOM_USB_SS=y
 CONFIG_PINCTRL=y
+CONFIG_PINCTRL_QCOM_QCS404=y
 CONFIG_DM_PMIC=y
 CONFIG_PMIC_QCOM=y
 CONFIG_MSM_SERIAL=y
diff --git a/configs/starqltechn_defconfig b/configs/starqltechn_defconfig
deleted file mode 100644
index 6980a8232667..000000000000
--- a/configs/starqltechn_defconfig
+++ /dev/null
@@ -1,41 +0,0 @@ 
-CONFIG_ARM=y
-CONFIG_SKIP_LOWLEVEL_INIT=y
-CONFIG_COUNTER_FREQUENCY=19000000
-CONFIG_POSITION_INDEPENDENT=y
-CONFIG_ARCH_SNAPDRAGON=y
-CONFIG_DEFAULT_DEVICE_TREE="starqltechn"
-CONFIG_TARGET_STARQLTECHN=y
-CONFIG_IDENT_STRING="\nSamsung S9 SM-G9600"
-CONFIG_SYS_LOAD_ADDR=0x80000000
-CONFIG_FIT=y
-CONFIG_FIT_VERBOSE=y
-CONFIG_BOOTDELAY=0
-CONFIG_SAVE_PREV_BL_FDT_ADDR=y
-CONFIG_SAVE_PREV_BL_INITRAMFS_START_ADDR=y
-CONFIG_SYS_CBSIZE=512
-CONFIG_SYS_PBSIZE=532
-# CONFIG_DISPLAY_CPUINFO is not set
-CONFIG_HUSH_PARSER=y
-CONFIG_SYS_MAXARGS=64
-CONFIG_CMD_BOOTMENU=y
-CONFIG_CMD_GPIO=y
-CONFIG_CMD_BMP=y
-# CONFIG_NET is not set
-CONFIG_BUTTON=y
-CONFIG_CLK=y
-CONFIG_MSM_GPIO=y
-CONFIG_QCOM_PMIC_GPIO=y
-CONFIG_DM_KEYBOARD=y
-CONFIG_BUTTON_KEYBOARD=y
-CONFIG_PINCTRL=y
-CONFIG_DM_PMIC=y
-CONFIG_PMIC_QCOM=y
-CONFIG_MSM_GENI_SERIAL=y
-CONFIG_SPMI_MSM=y
-CONFIG_VIDEO=y
-# CONFIG_VIDEO_FONT_8X16 is not set
-CONFIG_VIDEO_FONT_16X32=y
-CONFIG_SYS_WHITE_ON_BLACK=y
-CONFIG_VIDEO_SIMPLE=y
-CONFIG_VIDEO_DT_SIMPLEFB=y
-CONFIG_LMB_MAX_REGIONS=64
diff --git a/include/configs/dragonboard845c.h b/include/configs/dragonboard845c.h
deleted file mode 100644
index 14a8a2ca049e..000000000000
--- a/include/configs/dragonboard845c.h
+++ /dev/null
@@ -1,20 +0,0 @@ 
-/* SPDX-License-Identifier: GPL-2.0+ */
-/*
- * Configuration file for Dragonboard 845c, based on Qualcomm SDA845 chip
- *
- * (C) Copyright 2022 Sumit Garg <sumit.garg@linaro.org>
- */
-
-#ifndef __CONFIGS_SDM845_H
-#define __CONFIGS_SDM845_H
-
-#include <linux/sizes.h>
-
-#define CFG_SYS_BAUDRATE_TABLE	{ 115200, 230400, 460800, 921600 }
-
-#define CFG_EXTRA_ENV_SETTINGS \
-	"bootm_size=0x5000000\0"	\
-	"bootm_low=0x80000000\0"	\
-	"bootcmd=bootm $prevbl_initrd_start_addr\0"
-
-#endif
diff --git a/include/configs/qcom.h b/include/configs/qcom.h
new file mode 100644
index 000000000000..e50b3bce5cdd
--- /dev/null
+++ b/include/configs/qcom.h
@@ -0,0 +1,21 @@ 
+/* SPDX-License-Identifier: GPL-2.0+ */
+/*
+ * Configuration file for Qualcomm Snapdragon boards
+ *
+ * (C) Copyright 2021 Dzmitry Sankouski <dsankouski@gmail.com>
+ * (C) Copyright 2023 Linaro Ltd.
+ */
+
+#ifndef __CONFIGS_SNAPDRAGON_H
+#define __CONFIGS_SNAPDRAGON_H
+
+#define CFG_SYS_BAUDRATE_TABLE	{ 115200, 230400, 460800, 921600 }
+
+/* Load addressed are calculated during board_late_init(). See arm/mach-snapdragon/board.c */
+#define CFG_EXTRA_ENV_SETTINGS \
+	"stdin=serial,button-kbd\0"	\
+	"stdout=serial,vidconsole\0"	\
+	"stderr=serial,vidconsole\0" \
+	"bootcmd=bootm $prevbl_initrd_start_addr\0"
+
+#endif
diff --git a/include/configs/qcs404-evb.h b/include/configs/qcs404-evb.h
deleted file mode 100644
index 9501d43665e9..000000000000
--- a/include/configs/qcs404-evb.h
+++ /dev/null
@@ -1,20 +0,0 @@ 
-/* SPDX-License-Identifier: GPL-2.0+ */
-/*
- * Configuration file for QCS404 evaluation board
- *
- * (C) Copyright 2022 Sumit Garg <sumit.garg@linaro.org>
- */
-
-#ifndef __CONFIGS_QCS404EVB_H
-#define __CONFIGS_QCS404EVB_H
-
-#include <linux/sizes.h>
-
-#define CFG_SYS_BAUDRATE_TABLE	{ 115200, 230400, 460800, 921600 }
-
-#define CFG_EXTRA_ENV_SETTINGS \
-	"bootm_size=0x5000000\0"	\
-	"bootm_low=0x80000000\0"	\
-	"bootcmd=bootm $prevbl_initrd_start_addr\0"
-
-#endif
diff --git a/include/configs/sdm845.h b/include/configs/sdm845.h
deleted file mode 100644
index 5ad8569b2152..000000000000
--- a/include/configs/sdm845.h
+++ /dev/null
@@ -1,26 +0,0 @@ 
-/* SPDX-License-Identifier: GPL-2.0+ */
-/*
- * Configuration file for boards, based on Qualcomm SDM845 chip
- *
- * (C) Copyright 2021 Dzmitry Sankouski <dsankouski@gmail.com>
- */
-
-#ifndef __CONFIGS_SDM845_H
-#define __CONFIGS_SDM845_H
-
-#include <linux/sizes.h>
-
-#define CFG_SYS_BAUDRATE_TABLE	{ 115200, 230400, 460800, 921600 }
-
-#define CFG_EXTRA_ENV_SETTINGS \
-	"bootm_size=0x4000000\0"	\
-	"bootm_low=0x80000000\0"	\
-	"stdin=serial,button-kbd\0"	\
-	"stdout=serial,vidconsole\0"	\
-	"stderr=serial,vidconsole\0"	\
-	"preboot=source $prevbl_initrd_start_addr:prebootscript\0" \
-	"bootcmd=source $prevbl_initrd_start_addr:bootscript\0"
-
-/* Size of malloc() pool */
-
-#endif