diff options
Diffstat (limited to 'include')
65 files changed, 877 insertions, 87 deletions
diff --git a/include/asm-generic/sections.h b/include/asm-generic/sections.h index d59787948fd..48bd4fa8604 100644 --- a/include/asm-generic/sections.h +++ b/include/asm-generic/sections.h @@ -9,6 +9,7 @@ #define _ASM_GENERIC_SECTIONS_H_ #include <linux/types.h> +#include <stdbool.h> /* References to section boundaries */ @@ -62,6 +63,24 @@ static inline int arch_is_kernel_data(unsigned long addr) } #endif +/** + * is_kernel_rodata - checks if the pointer address is located in the + * .rodata section + * + * @addr: address to check + * + * Returns: true if the address is located in .rodata, false otherwise. + */ +static inline bool is_kernel_rodata(unsigned long addr) +{ +#ifdef CONFIG_ARM64 + return addr >= (unsigned long)__start_rodata && + addr < (unsigned long)__end_rodata; +#else + return false; +#endif +} + /* U-Boot-specific things begin here */ /* Start of U-Boot text region */ diff --git a/include/bloblist.h b/include/bloblist.h index f32faf78560..e67b2a76358 100644 --- a/include/bloblist.h +++ b/include/bloblist.h @@ -73,6 +73,7 @@ #define __BLOBLIST_H #include <mapmem.h> +#include <linux/errno.h> enum { BLOBLIST_VERSION = 1, @@ -110,7 +111,8 @@ enum bloblist_tag_t { BLOBLISTT_ACPI_TABLES = 4, BLOBLISTT_TPM_EVLOG = 5, BLOBLISTT_TPM_CRB_BASE = 6, - BLOBLISTT_ACPI_PP = 7, + BLOBLISTT_FDT_OVERLAY = 7, + BLOBLISTT_ACPI_PP = 8, /* Standard area to allocate blobs used across firmware components */ BLOBLISTT_AREA_FIRMWARE = 0x10, @@ -231,6 +233,16 @@ enum { BLOBLIST_REC_HDR_SIZE = sizeof(struct bloblist_rec), }; +/* + * struct dto_blob_hdr - Blob inline header for BLOBLISTT_FDT_OVERLAY + * + * @subtype: IMP-DEF per the agreement between the DT overlay producer and + * consumer. Default value is 0. + */ +struct dto_blob_hdr { + u64 subtype; +}; + /** * bloblist_check_magic() - return a bloblist if the magic matches * @@ -268,6 +280,26 @@ static inline void *bloblist_get_blob(uint tag, int *sizep) } #endif +#if CONFIG_IS_ENABLED(BLOBLIST) +/** + * bloblist_apply_blobs() - Apply the data of blobs by tag + * + * Scan the bloblist, find the blobs with the matching tag and apply the data + * of blobs + * + * @tag: Tag to search for (enum bloblist_tag_t) + * @func: Function to apply the data of blobs + * Return: 0 if OK, otherwise error. + */ +int bloblist_apply_blobs(uint tag, int (*func)(void **data, int size)); +#else +static inline int bloblist_apply_blobs(uint tag, + int (*func)(void **data, int size)) +{ + return -EPERM; +} +#endif + /** * bloblist_find() - Find a blob * diff --git a/include/config_distro_bootcmd.h b/include/config_distro_bootcmd.h index 7b6ac6eed9d..8d6f80a0ce5 100644 --- a/include/config_distro_bootcmd.h +++ b/include/config_distro_bootcmd.h @@ -543,8 +543,12 @@ "\0" \ \ "scan_dev_for_boot_part=" \ - SCAN_DEV_FOR_BOOT_PARTS \ - "env exists devplist || setenv devplist 1; " \ + "if env exists distro_bootpart; then " \ + "setenv devplist ${distro_bootpart}; " \ + "else " \ + SCAN_DEV_FOR_BOOT_PARTS \ + "env exists devplist || setenv devplist 1; " \ + "fi; " \ "for distro_bootpart in ${devplist}; do " \ "if fstype ${devtype} " \ "${devnum}:${distro_bootpart} " \ diff --git a/include/configs/P2041RDB.h b/include/configs/P2041RDB.h index f88fb9cdb9a..3525e29acc4 100644 --- a/include/configs/P2041RDB.h +++ b/include/configs/P2041RDB.h @@ -149,6 +149,8 @@ * shorted - index 1 */ +#define CFG_SYS_NS16550_CLK (get_bus_freq(0) / 2) + #define CFG_SYS_BAUDRATE_TABLE \ {300, 600, 1200, 2400, 4800, 9600, 19200, 38400, 57600, 115200} diff --git a/include/configs/amd_versal2.h b/include/configs/amd_versal2.h index 38d0bfc315b..fccc786219f 100644 --- a/include/configs/amd_versal2.h +++ b/include/configs/amd_versal2.h @@ -2,7 +2,7 @@ /* * Configuration for AMD Versal Gen 2 * Copyright (C) 2016 - 2022, Xilinx, Inc. - * Copyright (C) 2022 - 2024, Advanced Micro Devices, Inc. + * Copyright (C) 2022 - 2026, Advanced Micro Devices, Inc. * * Michal Simek <[email protected]> * @@ -132,11 +132,18 @@ #define BOOT_TARGET_DEVICES_USB(func) #endif +#if defined(CONFIG_NVME) +# define BOOT_TARGET_DEVICES_NVME(func) func(NVME, nvme, 0) +#else +# define BOOT_TARGET_DEVICES_NVME(func) +#endif + #define BOOT_TARGET_DEVICES(func) \ BOOT_TARGET_DEVICES_JTAG(func) \ BOOT_TARGET_DEVICES_MMC(func) \ BOOT_TARGET_DEVICES_UFS(func) \ BOOT_TARGET_DEVICES_XSPI(func) \ + BOOT_TARGET_DEVICES_NVME(func) \ BOOT_TARGET_DEVICES_DFU_USB(func) \ BOOT_TARGET_DEVICES_USB(func) \ BOOT_TARGET_DEVICES_PXE(func) \ diff --git a/include/configs/apple.h b/include/configs/apple.h deleted file mode 100644 index 1e08b114480..00000000000 --- a/include/configs/apple.h +++ /dev/null @@ -1,18 +0,0 @@ -#ifndef __CONFIG_H -#define __CONFIG_H - -#include <linux/sizes.h> - -/* Environment */ -#define ENV_DEVICE_SETTINGS \ - "stdin=serial,usbkbd,spikbd\0" \ - "stdout=vidconsole,serial\0" \ - "stderr=vidconsole,serial\0" - -#define BOOT_TARGETS "nvme usb" - -#define CFG_EXTRA_ENV_SETTINGS \ - ENV_DEVICE_SETTINGS \ - "boot_targets=" BOOT_TARGETS "\0" - -#endif diff --git a/include/configs/ls1028ardb.h b/include/configs/ls1028ardb.h index 9c869ee6840..613abc50567 100644 --- a/include/configs/ls1028ardb.h +++ b/include/configs/ls1028ardb.h @@ -54,6 +54,9 @@ "board=ls1028ardb\0" \ "hwconfig=fsl_ddr:bank_intlv=auto\0" \ "fdtfile=fsl-ls1028a-rdb.dtb\0" \ + "image=Image\0" \ + "extra_bootargs=iommu.passthrough=1 arm-smmu.disable_bypass=0\0" \ + "othbootargs=video=1920x1080-32@60 cma=640M\0" \ "ramdisk_addr=0x800000\0" \ "ramdisk_size=0x2000000\0" \ "bootm_size=0x10000000\0" \ @@ -76,6 +79,7 @@ "kernelhdr_addr_sd=0x3000\0" \ "kernelhdr_size_sd=0x20\0" \ "console=ttyS0,115200\0" \ + "console_dbg=earlycon=uart8250,mmio,0x21c0500\0" \ BOOTENV \ "boot_scripts=ls1028ardb_boot.scr\0" \ "boot_script_hdr=hdr_ls1028ardb_bs.out\0" \ diff --git a/include/configs/ls1043a_common.h b/include/configs/ls1043a_common.h index 4c695388d2f..24a717706af 100644 --- a/include/configs/ls1043a_common.h +++ b/include/configs/ls1043a_common.h @@ -88,7 +88,7 @@ #include <config_distro_bootcmd.h> /* Initial environment variables */ -#define CFG_EXTRA_ENV_SETTINGS \ +#define EXTRA_ENV_SETTINGS \ "hwconfig=fsl_ddr:bank_intlv=auto\0" \ "initrd_high=0xffffffffffffffff\0" \ "kernel_addr=0x61000000\0" \ diff --git a/include/configs/ls1043aqds.h b/include/configs/ls1043aqds.h index 7ccbb20bf2e..c06e986e93f 100644 --- a/include/configs/ls1043aqds.h +++ b/include/configs/ls1043aqds.h @@ -295,6 +295,11 @@ /* * Environment */ +#ifndef SPL_NO_MISC +/* Initial environment variables */ +#define CFG_EXTRA_ENV_SETTINGS \ + EXTRA_ENV_SETTINGS +#endif #include <asm/fsl_secure_boot.h> diff --git a/include/configs/ls1043ardb.h b/include/configs/ls1043ardb.h index ef8fdc1912b..90caf8a1371 100644 --- a/include/configs/ls1043ardb.h +++ b/include/configs/ls1043ardb.h @@ -201,4 +201,14 @@ #include <asm/fsl_secure_boot.h> +#ifndef SPL_NO_MISC +/* Initial environment variables */ +#define CFG_EXTRA_ENV_SETTINGS \ + EXTRA_ENV_SETTINGS \ + "board=ls1043ardb\0" \ + "fdtfile=fsl-ls1043a-rdb-sdk.dtb\0" \ + "image=Image\0" \ + "console_dbg=earlycon=uart8250,mmio,0x21c0500\0" +#endif + #endif /* __LS1043ARDB_H__ */ diff --git a/include/configs/ls1046a_common.h b/include/configs/ls1046a_common.h index 53ef5975a28..89f96bb3e74 100644 --- a/include/configs/ls1046a_common.h +++ b/include/configs/ls1046a_common.h @@ -83,7 +83,7 @@ #endif #ifndef SPL_NO_MISC /* Initial environment variables */ -#define CFG_EXTRA_ENV_SETTINGS \ +#define EXTRA_ENV_SETTINGS \ "hwconfig=fsl_ddr:bank_intlv=auto\0" \ "ramdisk_addr=0x800000\0" \ "ramdisk_size=0x2000000\0" \ diff --git a/include/configs/ls1046afrwy.h b/include/configs/ls1046afrwy.h index 21804fc6654..07846c3bd25 100644 --- a/include/configs/ls1046afrwy.h +++ b/include/configs/ls1046afrwy.h @@ -70,6 +70,12 @@ /* * Environment */ +#ifndef SPL_NO_MISC +/* Initial environment variables */ +#define CFG_EXTRA_ENV_SETTINGS \ + EXTRA_ENV_SETTINGS +#endif + #define CFG_SYS_FSL_QSPI_BASE 0x40000000 #undef BOOT_TARGET_DEVICES diff --git a/include/configs/ls1046aqds.h b/include/configs/ls1046aqds.h index 4b4bd7cbe48..001118b8504 100644 --- a/include/configs/ls1046aqds.h +++ b/include/configs/ls1046aqds.h @@ -312,6 +312,11 @@ /* * Environment */ +#ifndef SPL_NO_MISC +/* Initial environment variables */ +#define CFG_EXTRA_ENV_SETTINGS \ + EXTRA_ENV_SETTINGS +#endif #ifdef CONFIG_TFABOOT #define IFC_NAND_BOOTCOMMAND "run distro_bootcmd; run nand_bootcmd; " \ diff --git a/include/configs/ls1046ardb.h b/include/configs/ls1046ardb.h index 0e42a51fc59..a032e52c519 100644 --- a/include/configs/ls1046ardb.h +++ b/include/configs/ls1046ardb.h @@ -131,4 +131,14 @@ #include <asm/fsl_secure_boot.h> +#ifndef SPL_NO_MISC +/* Initial environment variables */ +#define CFG_EXTRA_ENV_SETTINGS \ + EXTRA_ENV_SETTINGS \ + "board=ls1046ardb\0" \ + "fdtfile=fsl-ls1046a-rdb-sdk.dtb\0" \ + "image=Image\0" \ + "console_dbg=earlycon=uart8250,mmio,0x21c0500\0" +#endif + #endif /* __LS1046ARDB_H__ */ diff --git a/include/configs/lx2160a_common.h b/include/configs/lx2160a_common.h index 4c1b4bf2b2c..dc0d24dca0a 100644 --- a/include/configs/lx2160a_common.h +++ b/include/configs/lx2160a_common.h @@ -137,7 +137,7 @@ "kernelhdr_addr_sd=0x3000\0" \ "kernel_size_sd=0x14000\0" \ "kernelhdr_size_sd=0x20\0" \ - "console=ttyAMA0,38400n8\0" \ + "console=ttyAMA0,115200\0" \ BOOTENV \ "mcmemsize=0x70000000\0" \ XSPI_MC_INIT_CMD \ @@ -197,10 +197,10 @@ #define BOOT_TARGET_DEVICES_USB(func) #endif -#ifdef CONFIG_MMC +#ifdef CONFIG_CMD_MMC #define BOOT_TARGET_DEVICES_MMC(func, instance) func(MMC, mmc, instance) #else -#define BOOT_TARGET_DEVICES_MMC(func) +#define BOOT_TARGET_DEVICES_MMC(func, instance) #endif #ifdef CONFIG_SCSI diff --git a/include/configs/lx2160ardb.h b/include/configs/lx2160ardb.h index e700a7b1135..725220c5747 100644 --- a/include/configs/lx2160ardb.h +++ b/include/configs/lx2160ardb.h @@ -21,6 +21,11 @@ /* Initial environment variables */ #define CFG_EXTRA_ENV_SETTINGS \ + "board=lx2160ardb\0" \ + "fdtfile=fsl-lx2160a-rdb.dtb\0" \ + "image=Image\0" \ + "extra_bootargs=pci=pcie_bus_perf\0" \ + "console_dbg=earlycon=pl011,mmio32,0x21c0000\0" \ EXTRA_ENV_SETTINGS \ "boot_scripts=lx2160ardb_boot.scr\0" \ "boot_script_hdr=hdr_lx2160ardb_bs.out\0" \ diff --git a/include/configs/mt7622.h b/include/configs/mt7622.h deleted file mode 100644 index 4a056954bf8..00000000000 --- a/include/configs/mt7622.h +++ /dev/null @@ -1,12 +0,0 @@ -/* SPDX-License-Identifier: GPL-2.0 */ -/* - * Configuration for MediaTek MT7629 SoC - * - * Copyright (C) 2019 MediaTek Inc. - * Author: Sam Shih <[email protected]> - */ - -#ifndef __MT7622_H -#define __MT7622_H - -#endif diff --git a/include/configs/rcar-gen5-common.h b/include/configs/rcar-gen5-common.h index dc28d07c7f9..5ff2a76fc05 100644 --- a/include/configs/rcar-gen5-common.h +++ b/include/configs/rcar-gen5-common.h @@ -10,13 +10,24 @@ /* Console */ #define CFG_SYS_BAUDRATE_TABLE { 38400, 115200, 921600, 1843200, 3250000 } +#define CFG_HSCIF /* Memory */ -#define DRAM_RSV_SIZE 0x08000000 +#define DRAM_RSV_SIZE 0x20600000 +#ifdef CONFIG_RCAR_64_RSIP +#define CFG_SYS_SDRAM_BASE 0xb8400000 +#else #define CFG_SYS_SDRAM_BASE (0x40000000 + DRAM_RSV_SIZE) +#endif #define CFG_SYS_SDRAM_SIZE (0x80000000u - DRAM_RSV_SIZE) #define CFG_MAX_MEM_MAPPED (0x80000000u - DRAM_RSV_SIZE) +/* Timer */ +#if defined(CONFIG_RCAR_64_RSIP) +#define CFG_SYS_TIMER_COUNTER (TMU_BASE + 0xc) /* TCNT0 */ +#define CFG_SYS_TIMER_RATE (133333333 / 4) +#endif + /* Environment setting */ #define CFG_EXTRA_ENV_SETTINGS \ "bootm_size=0x10000000\0" diff --git a/include/configs/stm32mp13_common.h b/include/configs/stm32mp13_common.h index 3e3f49abae0..e707b146f90 100644 --- a/include/configs/stm32mp13_common.h +++ b/include/configs/stm32mp13_common.h @@ -33,6 +33,12 @@ #define BOOT_TARGET_MMC1(func) #endif +#ifdef CONFIG_CMD_UBIFS +#define BOOT_TARGET_UBIFS(func) func(UBIFS, ubifs, 0, UBI, boot) +#else +#define BOOT_TARGET_UBIFS(func) +#endif + #ifdef CONFIG_CMD_USB #define BOOT_TARGET_USB(func) func(USB, usb, 0) #else @@ -41,12 +47,14 @@ #define BOOT_TARGET_DEVICES(func) \ BOOT_TARGET_MMC1(func) \ + BOOT_TARGET_UBIFS(func) \ BOOT_TARGET_MMC0(func) \ BOOT_TARGET_USB(func) /* * default bootcmd for stm32mp13: * for serial/usb: execute the stm32prog command + * for nand or spi-nand boot, distro boot with ubifs on UBI partition * for mmc boot (eMMC, SD card), distro boot on the same mmc device */ #define STM32MP_BOOTCMD "bootcmd_stm32mp=" \ @@ -56,7 +64,10 @@ "else " \ "run env_check;" \ "if test ${boot_device} = mmc;" \ - "then env set boot_targets \"mmc${boot_instance}\"; fi;" \ + "then env set boot_targets \"mmc${boot_instance}\"; fi; " \ + "if test ${boot_device} = nand ||" \ + " test ${boot_device} = spi-nand ;" \ + "then env set boot_targets ubifs0; fi;" \ "run distro_bootcmd;" \ "fi;\0" diff --git a/include/configs/stm32mp15_common.h b/include/configs/stm32mp15_common.h index 9cac31bcf47..9a87b479176 100644 --- a/include/configs/stm32mp15_common.h +++ b/include/configs/stm32mp15_common.h @@ -41,7 +41,7 @@ #define BOOT_TARGET_MMC2(func) #endif -#ifdef CONFIG_NET +#ifdef CONFIG_NET_LEGACY #define BOOT_TARGET_PXE(func) func(PXE, pxe, na) #else #define BOOT_TARGET_PXE(func) diff --git a/include/configs/stm32mp15_st_common.h b/include/configs/stm32mp15_st_common.h index 60838cb0e3f..7727e583fc7 100644 --- a/include/configs/stm32mp15_st_common.h +++ b/include/configs/stm32mp15_st_common.h @@ -8,7 +8,22 @@ #ifndef __CONFIG_STM32MP15_ST_COMMON_H__ #define __CONFIG_STM32MP15_ST_COMMON_H__ +#ifdef CONFIG_FWU_MULTI_BANK_UPDATE +#define SCAN_DEV_FOR_BOOT_PARTS \ + "setenv devplist; " \ + "env exists boot_partuuid && " \ + "part number ${devtype} ${devnum} ${boot_partuuid} devplist; " \ + "env exists devplist || " \ + "part list ${devtype} ${devnum} -bootable devplist; " + +#define ST_STM32MP15_FWU_ENV \ + "altbootcmd=${bootcmd}\0" +#else +#define ST_STM32MP15_FWU_ENV +#endif + #define STM32MP_BOARD_EXTRA_ENV \ + ST_STM32MP15_FWU_ENV \ "usb_pgood_delay=2000\0" \ "console=ttySTM0\0" \ "splashimage=" __stringify(CONFIG_SYS_LOAD_ADDR) "\0" \ diff --git a/include/configs/stm32mp23_common.h b/include/configs/stm32mp23_common.h index 7285886b822..392d779ec16 100644 --- a/include/configs/stm32mp23_common.h +++ b/include/configs/stm32mp23_common.h @@ -29,7 +29,7 @@ #ifdef CONFIG_DISTRO_DEFAULTS /*****************************************************************************/ -#ifdef CONFIG_NET +#ifdef CONFIG_NET_LEGACY #define BOOT_TARGET_PXE(func) func(PXE, pxe, na) #else #define BOOT_TARGET_PXE(func) diff --git a/include/configs/stm32mp25_common.h b/include/configs/stm32mp25_common.h index b42316fd8ac..a334b47b555 100644 --- a/include/configs/stm32mp25_common.h +++ b/include/configs/stm32mp25_common.h @@ -25,7 +25,7 @@ #ifdef CONFIG_DISTRO_DEFAULTS /*****************************************************************************/ -#ifdef CONFIG_NET +#ifdef CONFIG_NET_LEGACY #define BOOT_TARGET_PXE(func) func(PXE, pxe, na) #else #define BOOT_TARGET_PXE(func) diff --git a/include/configs/stm32mp25_st_common.h b/include/configs/stm32mp25_st_common.h index cb679eb1be2..0b0267ae99b 100644 --- a/include/configs/stm32mp25_st_common.h +++ b/include/configs/stm32mp25_st_common.h @@ -8,7 +8,22 @@ #ifndef __CONFIG_STM32MP25_ST_COMMON_H__ #define __CONFIG_STM32MP25_ST_COMMON_H__ +#ifdef CONFIG_FWU_MULTI_BANK_UPDATE +#define SCAN_DEV_FOR_BOOT_PARTS \ + "setenv devplist; " \ + "env exists boot_partuuid && " \ + "part number ${devtype} ${devnum} ${boot_partuuid} devplist; " \ + "env exists devplist || " \ + "part list ${devtype} ${devnum} -bootable devplist; " + +#define ST_STM32MP25_FWU_ENV \ + "altbootcmd=${bootcmd}\0" +#else +#define ST_STM32MP25_FWU_ENV +#endif + #define STM32MP_BOARD_EXTRA_ENV \ + ST_STM32MP25_FWU_ENV \ "usb_pgood_delay=2000\0" \ "console=ttySTM0\0" diff --git a/include/configs/stmark2.h b/include/configs/stmark2.h index c8a39e191a2..c1096398359 100644 --- a/include/configs/stmark2.h +++ b/include/configs/stmark2.h @@ -14,9 +14,11 @@ board/sysam/stmark2/sbf_dram_init.o (.text*) #define CFG_EXTRA_ENV_SETTINGS \ + "boot_sd=load mmc 0:1 ${loadaddr} uImage; " \ + "load mmc 0:1 ${loadaddr_ramfs} uRamfs\0" \ "kern_size=0x700000\0" \ - "loadaddr=0x40001000\0" \ - "-(rootfs)\0" \ + "loadaddr=0x42000000\0" \ + "loadaddr_ramfs=0x43000000\0" \ "update_uboot=loady ${loadaddr}; " \ "sf probe 0:1 50000000; " \ "sf erase 0 0x80000; " \ diff --git a/include/configs/sunxi-common.h b/include/configs/sunxi-common.h index b29a25d5617..49d5617f028 100644 --- a/include/configs/sunxi-common.h +++ b/include/configs/sunxi-common.h @@ -280,7 +280,7 @@ CONSOLE_STDIN_SETTINGS \ CONSOLE_STDOUT_SETTINGS -#ifdef CONFIG_ARM64 +#if defined(CONFIG_ARM64) || defined(CONFIG_RISCV) #define FDTFILE "allwinner/" CONFIG_DEFAULT_DEVICE_TREE ".dtb" #else #define FDTFILE CONFIG_DEFAULT_DEVICE_TREE ".dtb" diff --git a/include/configs/tqma7.h b/include/configs/tqma7.h new file mode 100644 index 00000000000..6b77139f09d --- /dev/null +++ b/include/configs/tqma7.h @@ -0,0 +1,71 @@ +/* SPDX-License-Identifier: GPL-2.0-or-later */ +/* + * Copyright (C) 2016 Freescale Semiconductor, Inc. + * + * Copyright (c) 2016-2026 TQ-Systems GmbH <[email protected]>, + * D-82229 Seefeld, Germany. + * Author: Markus Niebel, Steffen Doster + * + * Configuration settings for the TQ-Systems TQMa7x SOM + */ + +#ifndef __TQMA7_CONFIG_H +#define __TQMA7_CONFIG_H + +#include "mx7_common.h" +#include <linux/build_bug.h> + +/* MMC Configs */ +#define CFG_SYS_FSL_ESDHC_ADDR 0 + +/* + * 128 MiB offset as recommended in Linux' `Documentation/arch/arm/booting.rst` + * TQMA7_FDT_ADDRESS = MMDC0_ARB_BASE_ADDR + 0x8000000 + */ +#define TQMA7_FDT_ADDRESS 0x88000000 +/* FDT_OVERLAY_ADDR = (TQMA7_FDT_ADDRESS + SZ_256K) */ +#define FDT_OVERLAY_ADDR 0x88040000 +/* + * DTB is loaded at 128 MiB, so use just 16 MiB more + * TQMA7_INITRD_ADDRESS = (TQMA7_FDT_ADDRESS + SZ_16M) + */ +#define TQMA7_INITRD_ADDRESS 0x89000000 + +#ifndef __ASSEMBLY__ + +static_assert(TQMA7_FDT_ADDRESS == (MMDC0_ARB_BASE_ADDR + 0x8000000)); +static_assert(FDT_OVERLAY_ADDR == (TQMA7_FDT_ADDRESS + SZ_256K)); +static_assert(TQMA7_INITRD_ADDRESS == (TQMA7_FDT_ADDRESS + SZ_16M)); + +#endif + +#define TQMA7_UBOOT_OFFSET SZ_1K +#define TQMA7_MMC_UBOOT_SECTOR_START 0x2 +#define TQMA7_MMC_UBOOT_SECTOR_COUNT 0x7fe +#define TQMA7_SPI_FLASH_SECTOR_SIZE SZ_64K +#define TQMA7_SPI_UBOOT_START 0x1000 +#define TQMA7_SPI_UBOOT_SIZE 0xf0000 + +/* Physical Memory Map */ +#define PHYS_SDRAM MMDC0_ARB_BASE_ADDR + +#define CFG_SYS_SDRAM_BASE PHYS_SDRAM +#define CFG_SYS_INIT_RAM_ADDR IRAM_BASE_ADDR +#define CFG_SYS_INIT_RAM_SIZE IRAM_SIZE + +/* u-boot.img base address for SPI-NOR boot */ +#define CFG_SYS_UBOOT_BASE (QSPI0_ARB_BASE_ADDR + TQMA7_UBOOT_OFFSET + CONFIG_SPL_PAD_TO) + +/* + * All the defines above are for the TQMa7x SoM + * + * Now include the baseboard specific configuration + */ + +#if IS_ENABLED(CONFIG_MBA7) +#include "tqma7_mba7.h" +#else +#error "No baseboard for the TQMa7x SOM defined!" +#endif + +#endif /* __TQMA7_CONFIG_H */ diff --git a/include/configs/tqma7_mba7.h b/include/configs/tqma7_mba7.h new file mode 100644 index 00000000000..8b6ac6d4fc0 --- /dev/null +++ b/include/configs/tqma7_mba7.h @@ -0,0 +1,16 @@ +/* SPDX-License-Identifier: GPL-2.0-or-later */ +/* + * Copyright (c) 2016-2026 TQ-Systems GmbH <[email protected]>, + * D-82229 Seefeld, Germany. + * Author: Markus Niebel, Steffen Doster + * + * Configuration settings for the TQ-Systems MBa7x carrier board for + * TQMa7x module. + */ + +#ifndef __CONFIG_TQMA7_MBA7_H +#define __CONFIG_TQMA7_MBA7_H + +#define CFG_MXC_UART_BASE UART6_IPS_BASE_ADDR + +#endif /* __CONFIG_TQMA7_MBA7_H */ diff --git a/include/configs/verdin-imx95.h b/include/configs/verdin-imx95.h new file mode 100644 index 00000000000..30eb2e01460 --- /dev/null +++ b/include/configs/verdin-imx95.h @@ -0,0 +1,27 @@ +/* SPDX-License-Identifier: GPL-2.0-or-later */ +/* Copyright (c) Toradex */ + +#ifndef __VERDIN_IMX95_H +#define __VERDIN_IMX95_H + +#include <linux/sizes.h> +#include <asm/arch/imx-regs.h> + +/* For 32GB modules: 2GB from 0x80000000..0xffffffff, 30GB above. + * Actual size is determined at runtime. + */ +#define SZ_30G _AC(0x780000000, ULL) + +/* The first 256MB of SDRAM is reserved for firmware (Cortex M7) */ +#define PHYS_SDRAM_FW_RSVD SZ_256M +#define CFG_SYS_INIT_RAM_ADDR PHYS_SDRAM +#define CFG_SYS_INIT_RAM_SIZE SZ_2M + +#define CFG_SYS_SDRAM_BASE PHYS_SDRAM +#define PHYS_SDRAM (0x80000000 + PHYS_SDRAM_FW_RSVD) +#define PHYS_SDRAM_SIZE (SZ_2G - PHYS_SDRAM_FW_RSVD) +#define PHYS_SDRAM_2_SIZE SZ_30G + +#define WDOG_BASE_ADDR WDG3_BASE_ADDR + +#endif diff --git a/include/console.h b/include/console.h index 8d0d7bb8a4c..01a04f28f31 100644 --- a/include/console.h +++ b/include/console.h @@ -202,6 +202,11 @@ int console_clear(void); */ int console_remove_by_name(const char *name); +/** + * console_flush_stdin() - drops all pending characters from stdin + */ +void console_flush_stdin(void); + /* * CONSOLE multiplexing. */ diff --git a/include/dm/of_access.h b/include/dm/of_access.h index 44143a5a391..fe0de73d7e2 100644 --- a/include/dm/of_access.h +++ b/include/dm/of_access.h @@ -386,6 +386,23 @@ int of_read_u32_array(const struct device_node *np, const char *propname, u32 *out_values, size_t sz); /** + * of_read_u64_array() - Find and read an array of 64 bit integers + * + * Search for a property in a device node and read 64-bit value(s) from + * it. + * + * @np: device node from which the property value is to be read. + * @propname: name of the property to be searched. + * @out_values: pointer to return value, modified only if return value is 0. + * @sz: number of array elements to read + * Return: + * 0 on success, -EINVAL if the property does not exist, or -EOVERFLOW if + * longer than sz. + */ +int of_read_u64_array(const struct device_node *np, const char *propname, + u64 *out_values, size_t sz); + +/** * of_property_match_string() - Find string in a list and return index * * This function searches a string list property and returns the index @@ -616,6 +633,9 @@ int of_count_phandle_with_args(const struct device_node *np, const char *list_name, const char *cells_name, int cells_count); +int of_property_count_elems_of_size(const struct device_node *np, + const char *propname, int elem_size); + /** * of_alias_scan() - Scan all properties of the 'aliases' node * diff --git a/include/dm/ofnode.h b/include/dm/ofnode.h index 120393426db..c905e86b283 100644 --- a/include/dm/ofnode.h +++ b/include/dm/ofnode.h @@ -375,6 +375,13 @@ static inline oftree oftree_from_np(struct device_node *root) return tree; } +/* Dummy put for Linux compat */ +static inline void ofnode_put(ofnode node) +{ + if (ofnode_is_np(node)) + of_node_put(node.np); +} + /** * oftree_dispose() - Dispose of an oftree * @@ -589,6 +596,25 @@ int ofnode_read_u32_array(ofnode node, const char *propname, u32 *out_values, size_t sz); /** + * ofnode_read_u64_array() - Find and read an array of 64 bit integers + * + * @node: valid node reference to read property from + * @propname: name of the property to read + * @out_values: pointer to return value, modified only if return value is 0 + * @sz: number of array elements to read + * Return: 0 on success, -EINVAL if the property does not exist, + * -ENODATA if property does not have a value, and -EOVERFLOW if the + * property data isn't large enough + * + * Search for a property in a device node and read 64-bit value(s) from + * it. + * + * The out_values is modified only if a valid u64 value can be decoded. + */ +int ofnode_read_u64_array(ofnode node, const char *propname, + u64 *out_values, size_t sz); + +/** * ofnode_read_bool() - read a boolean value from a property * * @node: valid node reference to read property from @@ -652,6 +678,30 @@ static inline ofnode ofnode_next_subnode(ofnode node) fdt_next_subnode(gd->fdt_blob, ofnode_to_offset(node))); } #else + +/** + * ofnode_count_elems_of_size() - count the number of elements of size @elem_size + * in the property @propname. + * + * @node: ofnode to check + * @propname: the name of the property to count + * @elem_size: the size of each element + * + * Returns: the number of elements or -EINVAL if the property size is not a + * multiple of elem_size. + */ +int ofnode_count_elems_of_size(ofnode node, const char *propname, int elem_size); + +static inline int ofnode_count_u32_elems(ofnode node, const char *propname) +{ + return ofnode_count_elems_of_size(node, propname, 4); +} + +static inline int ofnode_count_u64_elems(ofnode node, const char *propname) +{ + return ofnode_count_elems_of_size(node, propname, 8); +} + /** * ofnode_is_enabled() - Checks whether a node is enabled. * This looks for a 'status' property. If this exists, then returns true if diff --git a/include/dt-bindings/clock/r8a78000-clock-scmi.h b/include/dt-bindings/clock/r8a78000-clock-scmi.h index 455402ee8cc..663effddeb4 100644 --- a/include/dt-bindings/clock/r8a78000-clock-scmi.h +++ b/include/dt-bindings/clock/r8a78000-clock-scmi.h @@ -43,4 +43,6 @@ #define SCP_CLOCK_ID_MDLC_MPPHY31 347 #define SCP_CLOCK_ID_MDLC_MPPHY02 348 +#define SCP_CLOCK_ID_CLK_S0D6_PERE_MAIN 1691 + #endif /* __DT_BINDINGS_R8A78000_SCMI_CLOCK_H__ */ diff --git a/include/dt-bindings/reset/bcm6318-reset.h b/include/dt-bindings/reset/bcm6318-reset.h new file mode 100644 index 00000000000..f882662505e --- /dev/null +++ b/include/dt-bindings/reset/bcm6318-reset.h @@ -0,0 +1,20 @@ +/* SPDX-License-Identifier: GPL-2.0+ */ + +#ifndef __DT_BINDINGS_RESET_BCM6318_H +#define __DT_BINDINGS_RESET_BCM6318_H + +#define BCM6318_RST_SPI 0 +#define BCM6318_RST_EPHY 1 +#define BCM6318_RST_SAR 2 +#define BCM6318_RST_ENETSW 3 +#define BCM6318_RST_USBD 4 +#define BCM6318_RST_USBH 5 +#define BCM6318_RST_PCIE_CORE 6 +#define BCM6318_RST_PCIE 7 +#define BCM6318_RST_PCIE_EXT 8 +#define BCM6318_RST_PCIE_HARD 9 +#define BCM6318_RST_ADSL 10 +#define BCM6318_RST_PHYMIPS 11 +#define BCM6318_RST_HOSTMIPS 12 + +#endif /* __DT_BINDINGS_RESET_BCM6318_H */ diff --git a/include/dt-bindings/reset/r8a78000-reset-scmi.h b/include/dt-bindings/reset/r8a78000-reset-scmi.h index e0d10caa589..3d84bfb073a 100644 --- a/include/dt-bindings/reset/r8a78000-reset-scmi.h +++ b/include/dt-bindings/reset/r8a78000-reset-scmi.h @@ -1,33 +1,27 @@ /* SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause) */ /* - * Copyright (C) 2025 Renesas Electronics Corp. - * - * IDs match SCP 4.27 + * Copyright (C) 2025-2026 Renesas Electronics Corp. */ #ifndef __DT_BINDINGS_R8A78000_SCMI_RESET_H__ #define __DT_BINDINGS_R8A78000_SCMI_RESET_H__ -/* - * These definition indices match the Reset ID defined by SCP FW 4.27. - */ - -#define SCP_RESET_DOMAIN_ID_UFS0 202 -#define SCP_RESET_DOMAIN_ID_UFS1 203 +#define SCP_RESET_DOMAIN_ID_UFS0 0x60 +#define SCP_RESET_DOMAIN_ID_UFS1 0x61 -#define SCP_RESET_DOMAIN_ID_XPCS0 316 -#define SCP_RESET_DOMAIN_ID_XPCS1 317 -#define SCP_RESET_DOMAIN_ID_XPCS2 318 -#define SCP_RESET_DOMAIN_ID_XPCS3 319 -#define SCP_RESET_DOMAIN_ID_XPCS4 320 -#define SCP_RESET_DOMAIN_ID_XPCS5 321 -#define SCP_RESET_DOMAIN_ID_XPCS6 322 -#define SCP_RESET_DOMAIN_ID_XPCS7 323 +#define SCP_RESET_DOMAIN_ID_XPCS0 0x30 +#define SCP_RESET_DOMAIN_ID_XPCS1 0x31 +#define SCP_RESET_DOMAIN_ID_XPCS2 0x32 +#define SCP_RESET_DOMAIN_ID_XPCS3 0x33 +#define SCP_RESET_DOMAIN_ID_XPCS4 0x34 +#define SCP_RESET_DOMAIN_ID_XPCS5 0x35 +#define SCP_RESET_DOMAIN_ID_XPCS6 0x36 +#define SCP_RESET_DOMAIN_ID_XPCS7 0x37 -#define SCP_RESET_DOMAIN_ID_MPPHY01 344 -#define SCP_RESET_DOMAIN_ID_MPPHY11 345 -#define SCP_RESET_DOMAIN_ID_MPPHY21 346 -#define SCP_RESET_DOMAIN_ID_MPPHY31 347 -#define SCP_RESET_DOMAIN_ID_MPPHY02 348 +#define SCP_RESET_DOMAIN_ID_MPPHY01 0x64 +#define SCP_RESET_DOMAIN_ID_MPPHY11 0x65 +#define SCP_RESET_DOMAIN_ID_MPPHY21 0x66 +#define SCP_RESET_DOMAIN_ID_MPPHY31 0x67 +#define SCP_RESET_DOMAIN_ID_MPPHY02 0x68 #endif /* __DT_BINDINGS_R8A78000_SCMI_RESET_H__ */ diff --git a/include/efi_config.h b/include/efi_config.h index 23211e799fc..bff77a5f961 100644 --- a/include/efi_config.h +++ b/include/efi_config.h @@ -24,7 +24,7 @@ typedef efi_status_t (*eficonfig_entry_func)(void *data); * * @num: menu entry index * @title: title of entry - * @key: unique key + * @key: unique key, takes a number up to EFICONFIG_ENTRY_NUM_MAX - 1 * @efi_menu: pointer to the menu structure * @func: callback function to be called when this entry is selected * @data: data to be passed to the callback function, caller must free() this pointer @@ -33,7 +33,7 @@ typedef efi_status_t (*eficonfig_entry_func)(void *data); struct eficonfig_entry { u32 num; char *title; - char key[3]; + char key[11]; struct efimenu *efi_menu; eficonfig_entry_func func; void *data; diff --git a/include/env.h b/include/env.h index 01c3eeae7e2..9b872fb26eb 100644 --- a/include/env.h +++ b/include/env.h @@ -9,6 +9,7 @@ #ifndef __ENV_H #define __ENV_H +#include <config.h> #include <compiler.h> #include <stdbool.h> #include <linux/types.h> @@ -161,6 +162,25 @@ bool env_get_autostart(void); int env_set(const char *varname, const char *value); /** + * env_set_runtime() - set an environment variable if + * CONFIG_ENV_VARS_UBOOT_RUNTIME_CONFIG is set. + * + * This is equivalent to env_set(), but does nothing if + * CONFIG_ENV_VARS_UBOOT_RUNTIME_CONFIG is unset. + * + * @varname: Variable to adjust + * @value: Value to set for the variable, or NULL or "" to delete the variable + * @return 0 if OK or !CONFIG_ENV_VARS_UBOOT_RUNTIME_CONFIG, 1 on error + */ +static inline int env_set_runtime(const char *varname, const char *value) +{ + if (IS_ENABLED(CONFIG_ENV_VARS_UBOOT_RUNTIME_CONFIG)) + return env_set(varname, value); + + return 0; +} + +/** * env_get_ulong() - Return an environment variable as an integer value * * Most U-Boot environment variables store hex values. For those which store diff --git a/include/env/tq/spi.env b/include/env/tq/spi.env index 47dcfea7d3f..242aa4da784 100644 --- a/include/env/tq/spi.env +++ b/include/env/tq/spi.env @@ -20,4 +20,8 @@ update_uboot_spi= fi; fi; +#ifdef CONFIG_CMD_QSPIHDR +write_uboot_spi=qspihdr init ${loadaddr} ${filesize} safe; +#else write_uboot_spi=sf update "${loadaddr}" "${uboot_spi_start}" "${filesize}" +#endif diff --git a/include/env_callback.h b/include/env_callback.h index 918ccb3b14f..1181ab4a157 100644 --- a/include/env_callback.h +++ b/include/env_callback.h @@ -32,7 +32,7 @@ #define DNS_CALLBACK #endif -#if CONFIG_IS_ENABLED(NET) || CONFIG_IS_ENABLED(NET_LWIP) +#if CONFIG_IS_ENABLED(NET) #define NET_CALLBACKS \ "bootfile:bootfile," \ "ipaddr:ipaddr," \ diff --git a/include/env_flags.h b/include/env_flags.h index 0c48874690f..123fdbcb0ba 100644 --- a/include/env_flags.h +++ b/include/env_flags.h @@ -14,7 +14,7 @@ enum env_flags_vartype { env_flags_vartype_decimal, env_flags_vartype_hex, env_flags_vartype_bool, -#if CONFIG_IS_ENABLED(NET) || CONFIG_IS_ENABLED(NET_LWIP) +#if CONFIG_IS_ENABLED(NET) env_flags_vartype_ipaddr, env_flags_vartype_macaddr, #endif @@ -41,7 +41,7 @@ enum env_flags_varaccess { #define CFG_ENV_FLAGS_LIST_STATIC "" #endif -#if CONFIG_IS_ENABLED(NET) || CONFIG_IS_ENABLED(NET_LWIP) +#if CONFIG_IS_ENABLED(NET) #ifdef CONFIG_REGEX #define ETHADDR_WILDCARD "\\d*" #else @@ -123,7 +123,7 @@ enum env_flags_varaccess env_flags_parse_varaccess(const char *flags); */ enum env_flags_varaccess env_flags_parse_varaccess_from_binflags(int binflags); -#if CONFIG_IS_ENABLED(NET) || CONFIG_IS_ENABLED(NET_LWIP) +#if CONFIG_IS_ENABLED(NET) /* * Check if a string has the format of an Ethernet MAC address */ diff --git a/include/event.h b/include/event.h index 1d267f1d105..3ce5f992b04 100644 --- a/include/event.h +++ b/include/event.h @@ -154,6 +154,15 @@ enum event_t { EVT_MAIN_LOOP, /** + * @EVT_POST_PREBOOT: + * This event is triggered in main_loop() after the preboot command + * has run, so that devices initialised by preboot (e.g. USB, UFS) + * are available to event handlers. Its parameter is NULL. + * A non-zero return value causes the boot to fail. + */ + EVT_POST_PREBOOT, + + /** * @EVT_OF_LIVE_BUILT: * This event is triggered immediately after the live device tree has been * built. This allows for machine specific fixups to be done to the live tree diff --git a/include/fdtdec.h b/include/fdtdec.h index 4e09f9d718c..46eaa0da63c 100644 --- a/include/fdtdec.h +++ b/include/fdtdec.h @@ -725,6 +725,22 @@ int fdtdec_get_int_array(const void *blob, int node, const char *prop_name, u32 *array, int count); /** + * Look up a property in a node and return its contents in a u64 + * array of given length. The property must have at least enough data for + * the array (8*count bytes). It may have more, but this will be ignored. + * + * @param blob FDT blob + * @param node node to examine + * @param prop_name name of property to find + * @param array array to fill with data + * @param count number of array elements + * Return: 0 if ok, or -FDT_ERR_NOTFOUND if the property is not found, + * or -FDT_ERR_BADLAYOUT if not enough data + */ +int fdtdec_get_long_array(const void *blob, int node, const char *prop_name, + u64 *array, int count); + +/** * Look up a property in a node and return its contents in an integer * array of given length. The property must exist but may have less data that * expected (4*count bytes). It may have more, but this will be ignored. diff --git a/include/fwu.h b/include/fwu.h index 9cee8fb085c..68a51fb4296 100644 --- a/include/fwu.h +++ b/include/fwu.h @@ -397,6 +397,17 @@ void fwu_populate_mdata_image_info(struct fwu_data *data); int fwu_get_mdata_size(uint32_t *mdata_size); /** + * fwu_mdata_get_image_guid() - Get image GUID for a type and bank + * @image_guid: Pointer to be filled with the found image GUID + * @image_type_guid: Pointer to the image type GUID to search for + * @bank_index: Index of the bank + * + * Return: 0 if OK, -ve on error + */ +int fwu_mdata_get_image_guid(efi_guid_t *image_guid, + const efi_guid_t *image_type_guid, u32 bank_index); + +/** * fwu_state_machine_updates() - Update FWU state of the platform * @state: FWU bank state * @update_index: Bank number to which images have been updated diff --git a/include/init.h b/include/init.h index 1e375da4893..c31ebd83b85 100644 --- a/include/init.h +++ b/include/init.h @@ -14,6 +14,12 @@ #include <linux/types.h> +struct ram_alias_check { + void *probe_addr; + void *alias_addr; + long size; +}; + /* * In case of the EFI app the UEFI firmware provides the low-level * initialisation. @@ -88,6 +94,7 @@ int dram_init(void); int dram_init_banksize(void); long get_ram_size(long *base, long size); +long probe_ram_size_by_alias(const struct ram_alias_check *checks); phys_size_t get_effective_memsize(void); int testdram(void); diff --git a/include/linker_lists.h b/include/linker_lists.h index 78ba937c8c3..4425fcb6785 100644 --- a/include/linker_lists.h +++ b/include/linker_lists.h @@ -145,6 +145,20 @@ * Since this macro defines an array end symbol, its leftmost index * must be 2 and its rightmost index must be 3. * + * The end symbol uses __aligned(1) to ensure it is placed immediately after + * the last entry without any padding. This is critical for ll_entry_count() + * to work correctly. + * + * If the end marker had a higher alignment (e.g., 4 or 32 bytes), the linker + * might insert padding between the last entry and the end marker to satisfy + * alignment requirements of the following section. This would cause pointer + * subtraction (end - start) to produce incorrect results because the compiler + * optimizes pointer division using magic-number multiplication, which only + * works correctly when the byte span is an exact multiple of the struct size. + * + * With __aligned(1), the end marker is placed at exactly (start + n * sizeof) + * where n is the number of entries, ensuring correct pointer arithmetic. + * * Example: * * :: @@ -153,7 +167,7 @@ */ #define ll_entry_end(_type, _list) \ ({ \ - static char end[0] __aligned(4) __attribute__((unused)) \ + static char end[0] __aligned(1) __attribute__((unused)) \ __section("__u_boot_list_2_"#_list"_3"); \ _type * tmp = (_type *)&end; \ asm("":"+r"(tmp)); \ @@ -239,8 +253,12 @@ static _type _sym[0] __aligned(CONFIG_LINKER_LIST_ALIGN) \ __maybe_unused __section("__u_boot_list_2_" #_list "_1") +/* + * ll_end_decl uses __aligned(1) to avoid padding before the end marker. + * See the comment for ll_entry_end() for a full explanation. + */ #define ll_end_decl(_sym, _type, _list) \ - static _type _sym[0] __aligned(CONFIG_LINKER_LIST_ALIGN) \ + static _type _sym[0] __aligned(1) \ __maybe_unused __section("__u_boot_list_2_" #_list "_3") /** @@ -266,7 +284,8 @@ */ #define ll_entry_get(_type, _name, _list) \ ({ \ - extern _type _u_boot_list_2_##_list##_2_##_name; \ + extern _type _u_boot_list_2_##_list##_2_##_name \ + __aligned(4); \ _type *_ll_result = \ &_u_boot_list_2_##_list##_2_##_name; \ _ll_result; \ diff --git a/include/linux/compat.h b/include/linux/compat.h index 62381451617..d4ba4d0088a 100644 --- a/include/linux/compat.h +++ b/include/linux/compat.h @@ -67,6 +67,19 @@ static inline void vfree(const void *addr) free((void *)addr); } +/** + * kstrdup_const - conditionally duplicate an existing const string + * @s: the string to duplicate + * @gfp: the GFP mask used in the kmalloc() call when allocating memory + * + * Note: Strings allocated by kstrdup_const should be freed by kfree_const and + * must not be passed to krealloc(). + * + * Return: source string if it is in .rodata section otherwise + * fallback to kstrdup. + */ +#define kstrdup_const(s, gfp) strdup_const(s) + struct kmem_cache { int sz; }; struct kmem_cache *get_mem(int element_sz); diff --git a/include/linux/device.h b/include/linux/device.h new file mode 100644 index 00000000000..e76635cfde9 --- /dev/null +++ b/include/linux/device.h @@ -0,0 +1,29 @@ +// SPDX-License-Identifier: GPL-2.0 +/* + * device.h - generic, centralized driver model + * + * U-Boot: compat header derived from Linux + * + * Copyright (c) 2001-2003 Patrick Mochel <[email protected]> + * Copyright (c) 2004-2009 Greg Kroah-Hartman <[email protected]> + * Copyright (c) 2008-2009 Novell Inc. + * + * See Documentation/driver-api/driver-model/ for more information. + */ + +#ifndef _DEVICE_H_ +#define _DEVICE_H_ + +#include <dm/device.h> + +/** + * dev_name - Return a device's name. + * @dev: Device with name to get. + * Return: The kobject name of the device, or its initial name if unavailable. + */ +static inline const char *dev_name(const struct udevice *dev) +{ + return dev->name; +} + +#endif /* _DEVICE_H_ */ diff --git a/include/linux/err.h b/include/linux/err.h index 7a0b212c813..2463c4611b2 100644 --- a/include/linux/err.h +++ b/include/linux/err.h @@ -53,6 +53,31 @@ static inline void * __must_check ERR_CAST(__force const void *ptr) return (void *) ptr; } +/** + * PTR_ERR_OR_ZERO - Extract the error code from a pointer if it has one. + * @ptr: A potential error pointer. + * + * Convenience function that can be used inside a function that returns + * an error code to propagate errors received as error pointers. + * For example, ``return PTR_ERR_OR_ZERO(ptr);`` replaces: + * + * .. code-block:: c + * + * if (IS_ERR(ptr)) + * return PTR_ERR(ptr); + * else + * return 0; + * + * Return: The error code within @ptr if it is an error pointer; 0 otherwise. + */ +static inline int __must_check PTR_ERR_OR_ZERO(__force const void *ptr) +{ + if (IS_ERR(ptr)) + return PTR_ERR(ptr); + else + return 0; +} + #endif #endif /* _LINUX_ERR_H */ diff --git a/include/linux/kref.h b/include/linux/kref.h new file mode 100644 index 00000000000..30927047d54 --- /dev/null +++ b/include/linux/kref.h @@ -0,0 +1,124 @@ +/* SPDX-License-Identifier: GPL-2.0-only */ +/* + * kref.h - library routines for handling generic reference counted objects + * + * Copyright (C) 2004 Greg Kroah-Hartman <[email protected]> + * Copyright (C) 2004 IBM Corp. + * + * based on kobject.h which was: + * Copyright (C) 2002-2003 Patrick Mochel <[email protected]> + * Copyright (C) 2002-2003 Open Source Development Labs + */ + +#ifndef _KREF_H_ +#define _KREF_H_ + +#include <linux/compat.h> + +struct kref { + long refcount; +}; + +#define KREF_INIT(n) { .refcount = REFCOUNT_INIT(n), } + +/** + * kref_init - initialize object. + * @kref: object in question. + */ +static inline void kref_init(struct kref *kref) +{ + kref->refcount = 1; +} + +static inline unsigned int kref_read(const struct kref *kref) +{ + return kref->refcount; +} + +/** + * kref_get - increment refcount for object. + * @kref: object. + */ +static inline void kref_get(struct kref *kref) +{ + kref->refcount++; +} + +/** + * kref_put - Decrement refcount for object + * @kref: Object + * @release: Pointer to the function that will clean up the object when the + * last reference to the object is released. + * + * Decrement the refcount, and if 0, call @release. The caller may not + * pass NULL or kfree() as the release function. + * + * Return: 1 if this call removed the object, otherwise return 0. Beware, + * if this function returns 0, another caller may have removed the object + * by the time this function returns. The return value is only certain + * if you want to see if the object is definitely released. + */ +static inline int kref_put(struct kref *kref, void (*release)(struct kref *kref)) +{ + if (--kref->refcount == 0) { + release(kref); + return 1; + } + return 0; +} + +/** + * kref_put_mutex - Decrement refcount for object + * @kref: Object + * @release: Pointer to the function that will clean up the object when the + * last reference to the object is released. + * @mutex: Mutex which protects the release function. + * + * This variant of kref_lock() calls the @release function with the @mutex + * held. The @release function will release the mutex. + */ +static inline int kref_put_mutex(struct kref *kref, + void (*release)(struct kref *kref), + struct mutex *mutex) +{ + return kref_put(kref, release); +} + +/** + * kref_put_lock - Decrement refcount for object + * @kref: Object + * @release: Pointer to the function that will clean up the object when the + * last reference to the object is released. + * @lock: Spinlock which protects the release function. + * + * This variant of kref_lock() calls the @release function with the @lock + * held. The @release function will release the lock. + */ +static inline int kref_put_lock(struct kref *kref, + void (*release)(struct kref *kref), + spinlock_t *lock) +{ + return kref_put(kref, release); +} + +/** + * kref_get_unless_zero - Increment refcount for object unless it is zero. + * @kref: object. + * + * This function is intended to simplify locking around refcounting for + * objects that can be looked up from a lookup structure, and which are + * removed from that lookup structure in the object destructor. + * Operations on such objects require at least a read lock around + * lookup + kref_get, and a write lock around kref_put + remove from lookup + * structure. Furthermore, RCU implementations become extremely tricky. + * With a lookup followed by a kref_get_unless_zero *with return value check* + * locking in the kref_put path can be deferred to the actual removal from + * the lookup structure and RCU lookups become trivial. + * + * Return: non-zero if the increment succeeded. Otherwise return 0. + */ +static inline int kref_get_unless_zero(struct kref *kref) +{ + return kref->refcount ? kref->refcount++ : 0; +} +#endif /* _KREF_H_ */ diff --git a/include/linux/math64.h b/include/linux/math64.h index eaa9fd5b968..70a7ee3ff1d 100644 --- a/include/linux/math64.h +++ b/include/linux/math64.h @@ -257,4 +257,23 @@ static inline u64 mul_u64_u32_div(u64 a, u32 mul, u32 divisor) } #endif /* mul_u64_u32_div */ +/** + * abs_diff - return absolute value of the difference between the arguments + * @a: the first argument + * @b: the second argument + * + * @a and @b have to be of the same type. With this restriction we compare + * signed to signed and unsigned to unsigned. The result is the subtraction + * the smaller of the two from the bigger, hence result is always a positive + * value. + * + * Return: an absolute value of the difference between the @a and @b. + */ +#define abs_diff(a, b) ({ \ + typeof(a) __a = (a); \ + typeof(b) __b = (b); \ + (void)(&__a == &__b); \ + __a > __b ? (__a - __b) : (__b - __a); \ +}) + #endif /* _LINUX_MATH64_H */ diff --git a/include/linux/phy/phy-common-props.h b/include/linux/phy/phy-common-props.h new file mode 100644 index 00000000000..9158851f2e1 --- /dev/null +++ b/include/linux/phy/phy-common-props.h @@ -0,0 +1,69 @@ +/* SPDX-License-Identifier: GPL-2.0-or-later */ +/* + * phy-common-props.h -- Common properties for generic PHYs + * + * Copyright 2025-2026 NXP + */ + +#ifndef __PHY_COMMON_PROPS_H +#define __PHY_COMMON_PROPS_H + +#include <dt-bindings/phy/phy.h> +#include <dm/ofnode.h> + +/** + * phy_get_rx_polarity - Get RX polarity for PHY differential lane + * @node: Pointer to the PHY's device tree node. + * @mode_name: The name of the PHY mode to look up. + * @supported: Bit mask of PHY_POL_NORMAL, PHY_POL_INVERT and PHY_POL_AUTO + * @default_val: Default polarity value if property is missing + * @val: Pointer to returned polarity. + * + * Return: zero on success, negative error on failure. + */ +int phy_get_rx_polarity(ofnode node, const char *mode_name, + unsigned int supported, unsigned int default_val, + unsigned int *val); + +/** + * phy_get_tx_polarity - Get TX polarity for PHY differential lane + * @node: Pointer to the PHY's device tree node. + * @mode_name: The name of the PHY mode to look up. + * @supported: Bit mask of PHY_POL_NORMAL, PHY_POL_INVERT and PHY_POL_AUTO + * @default_val: Default polarity value if property is missing + * @val: Pointer to returned polarity. + * + * Return: zero on success, negative error on failure. + */ +int phy_get_tx_polarity(ofnode node, const char *mode_name, + unsigned int supported, unsigned int default_val, + unsigned int *val); + +/** + * phy_get_manual_rx_polarity - Get manual RX polarity for PHY differential lane + * @node: Pointer to the PHY's device tree node. + * @mode_name: The name of the PHY mode to look up. + * @val: Pointer to returned polarity. + * + * Helper for PHYs which do not support protocols with automatic RX polarity + * detection and correction. + * + * Return: zero on success, negative error on failure. + */ +int phy_get_manual_rx_polarity(ofnode node, const char *mode_name, + unsigned int *val); + +/** + * phy_get_manual_tx_polarity - Get manual TX polarity for PHY differential lane + * @node: Pointer to the PHY's device tree node. + * @mode_name: The name of the PHY mode to look up. + * @val: Pointer to returned polarity. + * + * Helper for PHYs without any custom default value for the TX polarity. + * + * Return: zero on success, negative error on failure. + */ +int phy_get_manual_tx_polarity(ofnode node, const char *mode_name, + unsigned int *val); + +#endif /* __PHY_COMMON_PROPS_H */ diff --git a/include/linux/regmap.h b/include/linux/regmap.h new file mode 120000 index 00000000000..8a3780b5ceb --- /dev/null +++ b/include/linux/regmap.h @@ -0,0 +1 @@ +../regmap.h
\ No newline at end of file diff --git a/include/linux/string.h b/include/linux/string.h index d943fcce690..a8a6cf4af50 100644 --- a/include/linux/string.h +++ b/include/linux/string.h @@ -104,6 +104,8 @@ size_t strcspn(const char *s, const char *reject); #ifndef __HAVE_ARCH_STRDUP extern char * strdup(const char *); extern char * strndup(const char *, size_t); +extern const char *strdup_const(const char *s); +extern void kfree_const(const void *x); #endif #ifndef __HAVE_ARCH_STRSWAB extern char * strswab(const char *); diff --git a/include/lmb.h b/include/lmb.h index 5d5f037ccb9..ed472e9ef2e 100644 --- a/include/lmb.h +++ b/include/lmb.h @@ -19,16 +19,36 @@ #define LMB_ALIST_INITIAL_SIZE 4 /** - * DOC: Memory region attribute flags. + * define LMB_NONE - no special request * - * %LMB_NONE: No special request - * %LMB_NOMAP: Don't add to MMU configuration - * %LMB_NOOVERWRITE: The memory region cannot be overwritten/re-reserved - * %LMB_NONOTIFY: Do not notify other modules of changes to this memory region + * LMB Memory region attribute flag to indicate that there are no special + * requests for this region. Normally used as a placeholder value. */ #define LMB_NONE 0 + +/** + * define LMB_NOMAP - do not add to MMU configuration + * + * LMB Memory region attribute flag to indicate that the region will not be + * mapped by LMB. Normally used for reserved regions. + */ #define LMB_NOMAP BIT(1) + +/** + * define LMB_NOOVERWRITE - do not overwrite/re-reserve + * + * LMB Memory region attribute flag to indicate that the region will not be + * overwritten or re-reserved. Normally used for reserved regions. + */ #define LMB_NOOVERWRITE BIT(2) + +/** + * define LMB_NONOTIFY - do not notify other modules of changes + * + * LMB Memory region attribute flag to indicate that the region will not notify + * downstream allocators (currently just the EFI allocator) of changes to this + * region through lmb_map_update_notify(). + */ #define LMB_NONOTIFY BIT(3) /** diff --git a/include/net-common.h b/include/net-common.h index f293b21bc0b..69b6316c1ec 100644 --- a/include/net-common.h +++ b/include/net-common.h @@ -235,7 +235,7 @@ int eth_rx(void); /* Check for received packets */ */ void reset_phy(void); -#if CONFIG_IS_ENABLED(NET) || CONFIG_IS_ENABLED(NET_LWIP) +#if CONFIG_IS_ENABLED(NET) /** * eth_set_enable_bootdevs() - Enable or disable binding of Ethernet bootdevs * @@ -485,7 +485,7 @@ int net_init(void); /* Called when a network operation fails to know if it should be re-tried */ int net_start_again(void); -/* NET compatibility */ +/* NET_LEGACY compatibility */ enum proto_t; int net_loop(enum proto_t protocol); diff --git a/include/net-legacy.h b/include/net-legacy.h index d489c2480cd..d3b122c9062 100644 --- a/include/net-legacy.h +++ b/include/net-legacy.h @@ -281,7 +281,7 @@ extern struct in_addr net_dns_server2; #endif extern char net_nis_domain[32]; /* Our IS domain */ extern char net_hostname[32]; /* Our hostname */ -#ifdef CONFIG_NET +#ifdef CONFIG_NET_LEGACY extern char net_root_path[CONFIG_BOOTP_MAX_ROOT_PATH_LEN]; /* Our root path */ #endif /** END OF BOOTP EXTENTIONS **/ diff --git a/include/part_efi.h b/include/part_efi.h index 2cea5088046..5713b3018f4 100644 --- a/include/part_efi.h +++ b/include/part_efi.h @@ -60,6 +60,9 @@ #define PARTITION_U_BOOT_ENVIRONMENT \ EFI_GUID( 0x3de21764, 0x95bd, 0x54bd, \ 0xa5, 0xc3, 0x4a, 0xbe, 0x78, 0x6f, 0x38, 0xa8) +#define PARTITION_XBOOTLDR \ + EFI_GUID( 0xbc13c2ff, 0x59e6, 0x4262, \ + 0xa3, 0x52, 0xb2, 0x75, 0xfd, 0x6f, 0x71, 0x72) /* Special ChromiumOS things */ #define PARTITION_CROS_KERNEL \ diff --git a/include/power/regulator.h b/include/power/regulator.h index 8a914dfc74f..4011fb1d254 100644 --- a/include/power/regulator.h +++ b/include/power/regulator.h @@ -359,6 +359,9 @@ int regulator_get_enable(struct udevice *dev); */ int regulator_set_enable(struct udevice *dev, bool enable); +#define regulator_enable(dev) regulator_set_enable(dev, true) +#define regulator_disable(dev) regulator_set_enable(dev, false) + /** * regulator_set_enable_if_allowed: set regulator enable state if allowed by * regulator diff --git a/include/power/tps65941.h b/include/power/tps65941.h index a026ec56958..78e48a15972 100644 --- a/include/power/tps65941.h +++ b/include/power/tps65941.h @@ -19,7 +19,9 @@ #define TPS65941_BUCK_VOLT_MASK 0xFF #define TPS65941_BUCK_VOLT_MAX_HEX 0xFF #define TPS65941_BUCK_VOLT_MAX 3340000 -#define TPS65941_BUCK_MODE_MASK 0x1 +#define TPS65941_BUCK_MODE_MASK 0x1 +#define TPS65941_BUCK_FPWM_MASK 0x2 +#define TPS65941_BUCK_FPWM_MP_MASK 0x4 #define TPS65941_LDO_VOLT_MASK 0x7E #define TPS65941_LDO_VOLT_MAX_HEX 0x3A diff --git a/include/regmap.h b/include/regmap.h index 8c6f7c1c9b1..eeae843bfb7 100644 --- a/include/regmap.h +++ b/include/regmap.h @@ -389,6 +389,15 @@ static inline int regmap_clear_bits(struct regmap *map, uint offset, uint bits) return regmap_update_bits(map, offset, bits, 0); } +static inline int regmap_assign_bits(struct regmap *map, unsigned int reg, + unsigned int bits, bool value) +{ + if (value) + return regmap_set_bits(map, reg, bits); + else + return regmap_clear_bits(map, reg, bits); +} + /** * regmap_init_mem() - Set up a new register map that uses memory access * diff --git a/include/scsi.h b/include/scsi.h index 8d6c5116419..2520a8b8fe6 100644 --- a/include/scsi.h +++ b/include/scsi.h @@ -340,6 +340,7 @@ int scsi_bus_reset(struct udevice *dev); * scsi_scan() - Scan all SCSI controllers for available devices * * @vebose: true to show information about each device found + * Return: 0 if OK, -ve on error */ int scsi_scan(bool verbose); @@ -348,15 +349,19 @@ int scsi_scan(bool verbose); * * @dev: SCSI bus * @verbose: true to show information about each device found + * Return: 0 if OK, -ve on error */ int scsi_scan_dev(struct udevice *dev, bool verbose); /** * scsi_get_blk_by_uuid() - Provides SCSI partition information. * + * scsi_scan() must have been called before calling this function. + * * @uuid: UUID of the partition for fetching its info * @blk_desc_ptr: Provides the blk descriptor * @part_info_ptr: Provides partition info + * Return: 0 if OK, -ve on error */ int scsi_get_blk_by_uuid(const char *uuid, struct blk_desc **blk_desc_ptr, struct disk_partition *part_info_ptr); diff --git a/include/spi.h b/include/spi.h index 95e7d5b1556..7eaf0aa69b8 100644 --- a/include/spi.h +++ b/include/spi.h @@ -77,11 +77,13 @@ struct dm_spi_bus { * @cs: Chip select number (0..n-1) * @max_hz: Maximum bus speed that this slave can tolerate * @mode: SPI mode to use for this device (see SPI mode flags) + * @wordlen: Word length in bits to use for this device */ struct dm_spi_slave_plat { unsigned int cs[SPI_CS_CNT_MAX]; uint max_hz; uint mode; + unsigned int wordlen; }; /** @@ -719,6 +721,18 @@ int dm_spi_claim_bus(struct udevice *dev); void dm_spi_release_bus(struct udevice *dev); /** + * Set the word length for SPI transactions + * + * Set the word length (number of bits per word) for SPI transactions. + * + * @slave: The SPI slave + * @wordlen: The number of bits in a word + * + * Returns: 0 on success, -1 on failure. + */ +int dm_spi_set_wordlen(struct udevice *dev, unsigned int wordlen); + +/** * SPI transfer * * This writes "bitlen" bits out the SPI MOSI port and simultaneously clocks diff --git a/include/sysreset.h b/include/sysreset.h index ff20abdeed3..d1cc9ebc542 100644 --- a/include/sysreset.h +++ b/include/sysreset.h @@ -43,6 +43,24 @@ struct sysreset_ops { * (in which case this method will not actually return) */ int (*request)(struct udevice *dev, enum sysreset_t type); + + /** + * @request_arg: Reset handler implementations that might need to process + * arguments given to the 'reset' command. + * + * Note that this function may return before the reset takes effect. + * + * @dev: Device to be used for system reset + * @argc: No. of items in @argv + * @argv: Arguments given to 'reset' command + * Return: + * -EINPROGRESS if the reset has started and will complete soon + * -EPROTONOSUPPORT if not supported by this device + * 0 if the reset has already happened + * (in which case this method will not actually return) + */ + int (*request_arg)(struct udevice *dev, int argc, char * const argv[]); + /** * @get_status: get printable reset status information * diff --git a/include/tee/optee.h b/include/tee/optee.h index 77729450bb6..d1194493780 100644 --- a/include/tee/optee.h +++ b/include/tee/optee.h @@ -65,4 +65,13 @@ static inline int optee_copy_fdt_nodes(void *new_blob) } #endif +#if defined(CONFIG_OPTEE) +bool is_optee_smc_api(void); +#else +static inline bool is_optee_smc_api(void) +{ + return false; +} +#endif + #endif /* _OPTEE_H */ diff --git a/include/usb_mass_storage.h b/include/usb_mass_storage.h index 6d83d93cad7..9be704ea8b7 100644 --- a/include/usb_mass_storage.h +++ b/include/usb_mass_storage.h @@ -22,6 +22,7 @@ struct ums { unsigned int num_sectors; const char *name; struct blk_desc block_dev; + int hwpart; }; int fsg_init(struct ums *ums_devs, int count, struct udevice *udc); |
