diff options
Diffstat (limited to 'include')
38 files changed, 606 insertions, 73 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/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/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..45b5cbdd85a 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 \ 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/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/dbsc5.h b/include/dbsc5.h index cec937d89e7..b9b8703141a 100644 --- a/include/dbsc5.h +++ b/include/dbsc5.h @@ -50,7 +50,7 @@ struct renesas_dbsc5_board_config { u8 bdcfg_dm_swap[SLICE_CNT]; /* SoC ckeX([1][0]) -> MEM csY */ u8 bdcfg_cs_swap; - } ch[4]; + } ch[DRAM_CH_CNT]; }; #endif /* __INCLUDE_DBSC5_H__ */ diff --git a/include/dm/device.h b/include/dm/device.h index 678cd83c271..7bcf6df2892 100644 --- a/include/dm/device.h +++ b/include/dm/device.h @@ -166,8 +166,9 @@ enum { * When CONFIG_DEVRES is enabled, devm_kmalloc() and friends will * add to this list. Memory so-allocated will be freed * automatically when the device is removed / unbound - * @dma_offset: Offset between the physical address space (CPU's) and the - * device's bus address space + * @dma_cpu: DMA physical address space (CPU's) + * @dma_bus: DMA device's bus address space + * @dma_size: DMA window size * @iommu: IOMMU device associated with this device */ struct udevice { @@ -196,7 +197,9 @@ struct udevice { struct list_head devres_head; #endif #if CONFIG_IS_ENABLED(DM_DMA) - ulong dma_offset; + phys_addr_t dma_cpu; + dma_addr_t dma_bus; + u64 dma_size; #endif #if CONFIG_IS_ENABLED(IOMMU) struct udevice *iommu; @@ -272,14 +275,6 @@ static inline __attribute_const__ ofnode dev_ofnode(const struct udevice *dev) /* Returns non-zero if the device is active (probed and not removed) */ #define device_active(dev) (dev_get_flags(dev) & DM_FLAG_ACTIVATED) -#if CONFIG_IS_ENABLED(DM_DMA) -#define dev_set_dma_offset(_dev, _offset) _dev->dma_offset = _offset -#define dev_get_dma_offset(_dev) _dev->dma_offset -#else -#define dev_set_dma_offset(_dev, _offset) -#define dev_get_dma_offset(_dev) 0 -#endif - static inline __attribute_const__ int dev_of_offset(const struct udevice *dev) { #if CONFIG_IS_ENABLED(OF_REAL) 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/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/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/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/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 0f4a2d686e2..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; \ @@ -288,56 +307,6 @@ #define ll_entry_ref(_type, _name, _list) \ ((_type *)&_u_boot_list_2_##_list##_2_##_name) -/** - * ll_start() - Point to first entry of first linker-generated array - * @_type: Data type of the entry - * - * This function returns ``(_type *)`` pointer to the very first entry of - * the very first linker-generated array. - * - * Since this macro defines the start of the linker-generated arrays, - * its leftmost index must be 1. - * - * Example: - * - * :: - * - * struct my_sub_cmd *msc = ll_start(struct my_sub_cmd); - */ -#define ll_start(_type) \ -({ \ - static char start[0] __aligned(4) __attribute__((unused)) \ - __section("__u_boot_list_1"); \ - _type * tmp = (_type *)&start; \ - asm("":"+r"(tmp)); \ - tmp; \ -}) - -/** - * ll_end() - Point after last entry of last linker-generated array - * @_type: Data type of the entry - * - * This function returns ``(_type *)`` pointer after the very last entry of - * the very last linker-generated array. - * - * Since this macro defines the end of the linker-generated arrays, - * its leftmost index must be 3. - * - * Example: - * - * :: - * - * struct my_sub_cmd *msc = ll_end(struct my_sub_cmd); - */ -#define ll_end(_type) \ -({ \ - static char end[0] __aligned(4) __attribute__((unused)) \ - __section("__u_boot_list_3"); \ - _type * tmp = (_type *)&end; \ - asm("":"+r"(tmp)); \ - tmp; \ -}) - #endif /* __ASSEMBLY__ */ #endif /* __LINKER_LISTS_H__ */ 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/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/phys2bus.h b/include/phys2bus.h index 866b8b51a8c..80fa88adae1 100644 --- a/include/phys2bus.h +++ b/include/phys2bus.h @@ -21,17 +21,23 @@ static inline unsigned long bus_to_phys(unsigned long bus) } #endif -#if CONFIG_IS_ENABLED(DM) +#if CONFIG_IS_ENABLED(DM_DMA) #include <dm/device.h> static inline dma_addr_t dev_phys_to_bus(struct udevice *dev, phys_addr_t phys) { - return phys - dev_get_dma_offset(dev); + /* If the PA is in the remap range, apply remap. */ + if (phys >= dev->dma_cpu && phys < dev->dma_cpu + dev->dma_size) + phys -= dev->dma_cpu - dev->dma_bus; + return phys; } static inline phys_addr_t dev_bus_to_phys(struct udevice *dev, dma_addr_t bus) { - return bus + dev_get_dma_offset(dev); + /* If the DA is in the remap range, apply remap. */ + if (bus >= dev->dma_bus && bus < dev->dma_bus + dev->dma_size) + bus += dev->dma_cpu - dev->dma_bus; + return bus; } #else #define dev_phys_to_bus(_, _addr) _addr 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/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); |
