Re: [PATCH v4 06/11] remoteproc: uclass: Add remoteproc resource handling helpers
Hi Simon, Thank you for your feedback. Since the patchset has already been applied, I will address your comments in follow-up patches. Kindly, Amjad On 27/01/2022 16:43, Simon Glass wrote: Hi Amjad, On Thu, 27 Jan 2022 at 05:17, Amjad Ouled-Ameur wrote: From: Keerthy Add remoteproc resource handling helpers. These functions are primarily to parse the resource table and to handle different types of resources. Carveout, devmem, trace & vring resources are handled. Signed-off-by: Keerthy [Amjad: fix redefinition of "struct resource_table" and compile warnings ] Signed-off-by: Amjad Ouled-Ameur --- (no changes since v2) Changes in v2: - Add useful checks and remove redundant code. drivers/remoteproc/rproc-uclass.c | 534 ++ include/remoteproc.h | 384 - 2 files changed, 917 insertions(+), 1 deletion(-) Sorry my comments are a bit late - I sent them on v3. Regards, Simon
Re: [PATCH v3 04/11] drivers: misc: Makefile: Enable fs_loader compilation at SPL Level
Hi Tom, On 26/01/2022 04:37, Tom Rini wrote: On Tue, Jan 18, 2022 at 11:12:42AM +0100, Amjad Ouled-Ameur wrote: From: Keerthy Enable fs_loader compilation at SPL Level. Signed-off-by: Keerthy [Amjad: fix compilation failures for J721e platform] Signed-off-by: Amjad Ouled-Ameur This causes j7200_evm_r5 and socfpga_arria10 to fail to build now. Fixed in V4, thank you !
[PATCH v4 11/11] dts: am57xx*: Add ipu early boot DT changes
From: Keerthy Add support for ipu early boot. Signed-off-by: Keerthy Signed-off-by: Amjad Ouled-Ameur --- (no changes since v1) MAINTAINERS | 1 + arch/arm/dts/am57xx-beagle-x15-revb1-u-boot.dtsi | 7 +++ arch/arm/dts/am57xx-beagle-x15-revc-u-boot.dtsi | 7 +++ arch/arm/dts/am57xx-beagle-x15-u-boot.dtsi | 7 +++ arch/arm/dts/am57xx-cl-som-am57x-u-boot.dtsi | 7 +++ arch/arm/dts/am57xx-sbc-am57x-u-boot.dtsi| 7 +++ 6 files changed, 36 insertions(+) create mode 100644 arch/arm/dts/am57xx-beagle-x15-revb1-u-boot.dtsi create mode 100644 arch/arm/dts/am57xx-beagle-x15-revc-u-boot.dtsi create mode 100644 arch/arm/dts/am57xx-beagle-x15-u-boot.dtsi create mode 100644 arch/arm/dts/am57xx-cl-som-am57x-u-boot.dtsi create mode 100644 arch/arm/dts/am57xx-sbc-am57x-u-boot.dtsi diff --git a/MAINTAINERS b/MAINTAINERS index 7adc28dbfd87..c73739a15a4b 100644 --- a/MAINTAINERS +++ b/MAINTAINERS @@ -514,6 +514,7 @@ ARM TI M: Tom Rini S: Maintained T: git https://source.denx.de/u-boot/custodians/u-boot-ti.git +F: arch/arm/dts/am57xx* F: arch/arm/dts/dra7* F: arch/arm/mach-davinci/ F: arch/arm/mach-k3/ diff --git a/arch/arm/dts/am57xx-beagle-x15-revb1-u-boot.dtsi b/arch/arm/dts/am57xx-beagle-x15-revb1-u-boot.dtsi new file mode 100644 index ..49b16215e528 --- /dev/null +++ b/arch/arm/dts/am57xx-beagle-x15-revb1-u-boot.dtsi @@ -0,0 +1,7 @@ +// SPDX-License-Identifier: GPL-2.0+ +/* + * Copyright (C) 2019 Texas Instruments Incorporated - http://www.ti.com/ + */ + +#include "omap5-u-boot.dtsi" +#include "dra7-ipu-common-early-boot.dtsi" diff --git a/arch/arm/dts/am57xx-beagle-x15-revc-u-boot.dtsi b/arch/arm/dts/am57xx-beagle-x15-revc-u-boot.dtsi new file mode 100644 index ..49b16215e528 --- /dev/null +++ b/arch/arm/dts/am57xx-beagle-x15-revc-u-boot.dtsi @@ -0,0 +1,7 @@ +// SPDX-License-Identifier: GPL-2.0+ +/* + * Copyright (C) 2019 Texas Instruments Incorporated - http://www.ti.com/ + */ + +#include "omap5-u-boot.dtsi" +#include "dra7-ipu-common-early-boot.dtsi" diff --git a/arch/arm/dts/am57xx-beagle-x15-u-boot.dtsi b/arch/arm/dts/am57xx-beagle-x15-u-boot.dtsi new file mode 100644 index ..49b16215e528 --- /dev/null +++ b/arch/arm/dts/am57xx-beagle-x15-u-boot.dtsi @@ -0,0 +1,7 @@ +// SPDX-License-Identifier: GPL-2.0+ +/* + * Copyright (C) 2019 Texas Instruments Incorporated - http://www.ti.com/ + */ + +#include "omap5-u-boot.dtsi" +#include "dra7-ipu-common-early-boot.dtsi" diff --git a/arch/arm/dts/am57xx-cl-som-am57x-u-boot.dtsi b/arch/arm/dts/am57xx-cl-som-am57x-u-boot.dtsi new file mode 100644 index ..49b16215e528 --- /dev/null +++ b/arch/arm/dts/am57xx-cl-som-am57x-u-boot.dtsi @@ -0,0 +1,7 @@ +// SPDX-License-Identifier: GPL-2.0+ +/* + * Copyright (C) 2019 Texas Instruments Incorporated - http://www.ti.com/ + */ + +#include "omap5-u-boot.dtsi" +#include "dra7-ipu-common-early-boot.dtsi" diff --git a/arch/arm/dts/am57xx-sbc-am57x-u-boot.dtsi b/arch/arm/dts/am57xx-sbc-am57x-u-boot.dtsi new file mode 100644 index ..49b16215e528 --- /dev/null +++ b/arch/arm/dts/am57xx-sbc-am57x-u-boot.dtsi @@ -0,0 +1,7 @@ +// SPDX-License-Identifier: GPL-2.0+ +/* + * Copyright (C) 2019 Texas Instruments Incorporated - http://www.ti.com/ + */ + +#include "omap5-u-boot.dtsi" +#include "dra7-ipu-common-early-boot.dtsi" -- 2.25.1
[PATCH v4 10/11] arm: dts: dra7*/am57xx-idk-evm-u-boot: Add ipu early boot DT changes
From: Keerthy Add support for ipu early boot. Signed-off-by: Keerthy Signed-off-by: Amjad Ouled-Ameur --- (no changes since v1) arch/arm/dts/am57xx-idk-common-u-boot.dtsi | 1 + arch/arm/dts/dra7-evm-u-boot.dtsi | 1 + arch/arm/dts/dra71-evm-u-boot.dtsi | 1 + arch/arm/dts/dra72-evm-revc-u-boot.dtsi| 1 + arch/arm/dts/dra76-evm-u-boot.dtsi | 1 + 5 files changed, 5 insertions(+) diff --git a/arch/arm/dts/am57xx-idk-common-u-boot.dtsi b/arch/arm/dts/am57xx-idk-common-u-boot.dtsi index b07aea0048d5..d0ce469f9189 100644 --- a/arch/arm/dts/am57xx-idk-common-u-boot.dtsi +++ b/arch/arm/dts/am57xx-idk-common-u-boot.dtsi @@ -3,6 +3,7 @@ * Copyright (C) 2019 Texas Instruments Incorporated - http://www.ti.com/ */ #include "omap5-u-boot.dtsi" +#include "dra7-ipu-common-early-boot.dtsi" / { xtal25mhz: xtal25mhz { diff --git a/arch/arm/dts/dra7-evm-u-boot.dtsi b/arch/arm/dts/dra7-evm-u-boot.dtsi index f06c701dbd1f..5622512b2401 100644 --- a/arch/arm/dts/dra7-evm-u-boot.dtsi +++ b/arch/arm/dts/dra7-evm-u-boot.dtsi @@ -4,6 +4,7 @@ */ #include "omap5-u-boot.dtsi" +#include "dra7-ipu-common-early-boot.dtsi" &pcf_gpio_21{ u-boot,i2c-offset-len = <0>; diff --git a/arch/arm/dts/dra71-evm-u-boot.dtsi b/arch/arm/dts/dra71-evm-u-boot.dtsi index b56d4fc9d896..40443da5c855 100644 --- a/arch/arm/dts/dra71-evm-u-boot.dtsi +++ b/arch/arm/dts/dra71-evm-u-boot.dtsi @@ -4,6 +4,7 @@ */ #include "omap5-u-boot.dtsi" +#include "dra7-ipu-common-early-boot.dtsi" &pcf_gpio_21{ u-boot,i2c-offset-len = <0>; diff --git a/arch/arm/dts/dra72-evm-revc-u-boot.dtsi b/arch/arm/dts/dra72-evm-revc-u-boot.dtsi index b56d4fc9d896..40443da5c855 100644 --- a/arch/arm/dts/dra72-evm-revc-u-boot.dtsi +++ b/arch/arm/dts/dra72-evm-revc-u-boot.dtsi @@ -4,6 +4,7 @@ */ #include "omap5-u-boot.dtsi" +#include "dra7-ipu-common-early-boot.dtsi" &pcf_gpio_21{ u-boot,i2c-offset-len = <0>; diff --git a/arch/arm/dts/dra76-evm-u-boot.dtsi b/arch/arm/dts/dra76-evm-u-boot.dtsi index a4dfbe7e601a..5fae6ba91936 100644 --- a/arch/arm/dts/dra76-evm-u-boot.dtsi +++ b/arch/arm/dts/dra76-evm-u-boot.dtsi @@ -4,6 +4,7 @@ */ #include "omap5-u-boot.dtsi" +#include "dra7-ipu-common-early-boot.dtsi" &cpsw_emac0 { phy-handle = <&dp83867_0>; -- 2.25.1
[PATCH v4 09/11] arm: dts: dra7: Add ipu and related nodes
From: Keerthy Add ipu and the associated nodes. Signed-off-by: Keerthy Signed-off-by: Amjad Ouled-Ameur --- (no changes since v1) arch/arm/dts/dra7.dtsi | 45 +- 1 file changed, 44 insertions(+), 1 deletion(-) diff --git a/arch/arm/dts/dra7.dtsi b/arch/arm/dts/dra7.dtsi index fd1aea0b1b16..e2e958b36626 100644 --- a/arch/arm/dts/dra7.dtsi +++ b/arch/arm/dts/dra7.dtsi @@ -41,6 +41,8 @@ d_can0 = &dcan1; d_can1 = &dcan2; spi0 = &qspi; + remoteproc0 = &ipu1; + remoteproc1 = &ipu2; }; timer { @@ -263,9 +265,12 @@ }; prm: prm@6000 { - compatible = "ti,dra7-prm"; + compatible = "ti,dra7-prm", "simple-bus"; reg = <0x6000 0x3000>; interrupts = ; + #address-cells = <1>; + #size-cells = <1>; + ranges = <0 0x6000 0x3000>; prm_clocks: clocks { #address-cells = <1>; @@ -274,6 +279,20 @@ prm_clockdomains: clockdomains { }; + + ipu1_rst: ipu1_rst@510 { + compatible = "ti,dra7-reset"; + reg = <0x510 0x8>; + ti,nresets = <3>; + #reset-cells = <1>; + }; + + ipu2_rst: ipu2_rst@910 { + compatible = "ti,dra7-reset"; + reg = <0x910 0x8>; + ti,nresets = <3>; + #reset-cells = <1>; + }; }; scm_wkup: scm_conf@c000 { @@ -2032,6 +2051,30 @@ clocks = <&l3_iclk_div>; clock-names = "fck"; }; + + ipu1: ipu@5882 { + compatible = "ti,dra7-ipu"; + reg = <0x5882 0x1>; + reg-names = "l2ram"; + ti,hwmods = "ipu1"; + resets = <&ipu1_rst 0>, <&ipu1_rst 1>, <&ipu1_rst 2>; + iommus = <&mmu_ipu1>; + ti,rproc-standby-info = <0x4a005520>; + timers = <&timer11>; + watchdog-timers = <&timer7>, <&timer8>; + }; + + ipu2: ipu@5502 { + compatible = "ti,dra7-ipu"; + reg = <0x5502 0x1>; + reg-names = "l2ram"; + ti,hwmods = "ipu2"; + resets = <&ipu2_rst 0>, <&ipu2_rst 1>, <&ipu2_rst 2>; + iommus = <&mmu_ipu2>; + ti,rproc-standby-info = <0x4a008920>; + timers = <&timer3>; + watchdog-timers = <&timer4>, <&timer9>; + }; }; thermal_zones: thermal-zones { -- 2.25.1
[PATCH v4 08/11] dts: dra7-ipu-common-early-boot.dtsi: Add all the ipu early boot related nodes
From: Keerthy Add all the ipu early boot related nodes Signed-off-by: Keerthy Signed-off-by: Amjad Ouled-Ameur --- (no changes since v1) MAINTAINERS | 1 + arch/arm/dts/dra7-ipu-common-early-boot.dtsi | 113 +++ 2 files changed, 114 insertions(+) create mode 100644 arch/arm/dts/dra7-ipu-common-early-boot.dtsi diff --git a/MAINTAINERS b/MAINTAINERS index 311397137b27..7adc28dbfd87 100644 --- a/MAINTAINERS +++ b/MAINTAINERS @@ -514,6 +514,7 @@ ARM TI M: Tom Rini S: Maintained T: git https://source.denx.de/u-boot/custodians/u-boot-ti.git +F: arch/arm/dts/dra7* F: arch/arm/mach-davinci/ F: arch/arm/mach-k3/ F: arch/arm/mach-keystone/ diff --git a/arch/arm/dts/dra7-ipu-common-early-boot.dtsi b/arch/arm/dts/dra7-ipu-common-early-boot.dtsi new file mode 100644 index ..ec6040ff93eb --- /dev/null +++ b/arch/arm/dts/dra7-ipu-common-early-boot.dtsi @@ -0,0 +1,113 @@ +// SPDX-License-Identifier: GPL-2.0+ +/* + * Copyright (C) 2019 Texas Instruments Incorporated - http://www.ti.com/ + */ + +/ { + chosen { + firmware-loader = &fs_loader0; + }; + + fs_loader0: fs_loader@0 { + u-boot,dm-pre-reloc; + compatible = "u-boot,fs-loader"; + phandlepart = <&mmc1 1>; + }; + + reserved-memory { + #address-cells = <2>; + #size-cells = <2>; + ranges; + u-boot,dm-spl; + + ipu2_memory_region: ipu2-memory@9580 { + compatible = "shared-dma-pool"; + reg = <0x0 0x9580 0x0 0x380>; + reusable; + status = "okay"; + u-boot,dm-spl; + }; + + ipu1_memory_region: ipu1-memory@9d00 { + compatible = "shared-dma-pool"; + reg = <0x0 0x9d00 0x0 0x200>; + reusable; + status = "okay"; + u-boot,dm-spl; + }; + + ipu1_pgtbl: ipu1-pgtbl@9570 { + reg = <0x0 0x9570 0x0 0x4>; + no-map; + u-boot,dm-spl; + }; + + ipu2_pgtbl: ipu2-pgtbl@9574 { + reg = <0x0 0x9574 0x0 0x4>; + no-map; + u-boot,dm-spl; + }; + }; +}; + +&timer3 { + u-boot,dm-spl; +}; + +&timer4 { + u-boot,dm-spl; +}; + +&timer7 { + u-boot,dm-spl; +}; + +&timer8 { + u-boot,dm-spl; +}; + +&timer9 { + u-boot,dm-spl; +}; + +&timer11 { + u-boot,dm-spl; +}; + +&mmu_ipu1 { + u-boot,dm-spl; +}; + +&mmu_ipu2 { + u-boot,dm-spl; +}; + +&ipu1 { + status = "okay"; + memory-region = <&ipu1_memory_region>; + pg-tbl = <&ipu1_pgtbl>; + u-boot,dm-spl; +}; + +&ipu2 { + status = "okay"; + memory-region = <&ipu2_memory_region>; + pg-tbl = <&ipu2_pgtbl>; + u-boot,dm-spl; +}; + +&l4_wkup { + u-boot,dm-spl; +}; + +&prm { + u-boot,dm-spl; +}; + +&ipu1_rst { + u-boot,dm-spl; +}; + +&ipu2_rst { + u-boot,dm-spl; +}; -- 2.25.1
[PATCH v4 06/11] remoteproc: uclass: Add remoteproc resource handling helpers
From: Keerthy Add remoteproc resource handling helpers. These functions are primarily to parse the resource table and to handle different types of resources. Carveout, devmem, trace & vring resources are handled. Signed-off-by: Keerthy [Amjad: fix redefinition of "struct resource_table" and compile warnings ] Signed-off-by: Amjad Ouled-Ameur --- (no changes since v2) Changes in v2: - Add useful checks and remove redundant code. drivers/remoteproc/rproc-uclass.c | 534 ++ include/remoteproc.h | 384 - 2 files changed, 917 insertions(+), 1 deletion(-) diff --git a/drivers/remoteproc/rproc-uclass.c b/drivers/remoteproc/rproc-uclass.c index 87e1ec7ad7f0..50bcc9030e98 100644 --- a/drivers/remoteproc/rproc-uclass.c +++ b/drivers/remoteproc/rproc-uclass.c @@ -8,15 +8,31 @@ #define pr_fmt(fmt) "%s: " fmt, __func__ #include +#include #include #include #include +#include #include #include #include #include #include #include +#include + +DECLARE_GLOBAL_DATA_PTR; + +struct resource_table { + u32 ver; + u32 num; + u32 reserved[2]; + u32 offset[0]; +} __packed; + +typedef int (*handle_resource_t) (struct udevice *, void *, int offset, int avail); + +static struct resource_table *rsc_table; /** * for_each_remoteproc_device() - iterate through the list of rproc devices @@ -196,6 +212,80 @@ static int rproc_post_probe(struct udevice *dev) return 0; } +/** + * rproc_add_res() - After parsing the resource table add the mappings + * @dev: device we finished probing + * @mapping: rproc_mem_entry for the resource + * + * Return: if the remote proc driver has a add_res routine, invokes it and + * hands over the return value. overall, 0 if all went well, else appropriate + * error value. + */ +static int rproc_add_res(struct udevice *dev, struct rproc_mem_entry *mapping) +{ + const struct dm_rproc_ops *ops = rproc_get_ops(dev); + + if (!ops->add_res) + return -ENOSYS; + + return ops->add_res(dev, mapping); +} + +/** + * rproc_alloc_mem() - After parsing the resource table allocat mem + * @dev: device we finished probing + * @len: rproc_mem_entry for the resource + * @align: alignment for the resource + * + * Return: if the remote proc driver has a add_res routine, invokes it and + * hands over the return value. overall, 0 if all went well, else appropriate + * error value. + */ +static void *rproc_alloc_mem(struct udevice *dev, unsigned long len, +unsigned long align) +{ + const struct dm_rproc_ops *ops; + + ops = rproc_get_ops(dev); + if (!ops) { + debug("%s driver has no ops?\n", dev->name); + return NULL; + } + + if (ops->alloc_mem) + return ops->alloc_mem(dev, len, align); + + return NULL; +} + +/** + * rproc_config_pagetable() - Configure page table for remote processor + * @dev: device we finished probing + * @virt: Virtual address of the resource + * @phys: Physical address the resource + * @len: length the resource + * + * Return: if the remote proc driver has a add_res routine, invokes it and + * hands over the return value. overall, 0 if all went well, else appropriate + * error value. + */ +static int rproc_config_pagetable(struct udevice *dev, unsigned int virt, + unsigned int phys, unsigned int len) +{ + const struct dm_rproc_ops *ops; + + ops = rproc_get_ops(dev); + if (!ops) { + debug("%s driver has no ops?\n", dev->name); + return -EINVAL; + } + + if (ops->config_pagetable) + return ops->config_pagetable(dev, virt, phys, len); + + return 0; +} + UCLASS_DRIVER(rproc) = { .id = UCLASS_REMOTEPROC, .name = "remoteproc", @@ -426,3 +516,447 @@ int rproc_is_running(int id) { return _rproc_ops_wrapper(id, RPROC_RUNNING); }; + + +static int handle_trace(struct udevice *dev, struct fw_rsc_trace *rsc, + int offset, int avail) +{ + if (sizeof(*rsc) > avail) { + debug("trace rsc is truncated\n"); + return -EINVAL; + } + + /* +* make sure reserved bytes are zeroes +*/ + if (rsc->reserved) { + debug("trace rsc has non zero reserved bytes\n"); + return -EINVAL; + } + + debug("trace rsc: da 0x%x, len 0x%x\n", rsc->da, rsc->len); + + return 0; +} + +static int handle_devmem(struct udevice *dev, struct fw_rsc_devmem *rsc, +int offset, int avail) +{ + struct rproc_mem_entry *mapping; + + if (sizeof(*rsc) > avail) { + debug("devmem rsc is truncated\n"); + return -EINVAL; + } +
[PATCH v4 07/11] remoteproc: ipu: Add driver to bring up ipu
From: Keerthy The driver enables IPU support. Basically enables the clocks, timers, watchdog timers and bare minimal MMU and supports loading the firmware from mmc. Signed-off-by: Keerthy [Amjad: fix compile warnings] Signed-off-by: Amjad Ouled-Ameur --- (no changes since v1) MAINTAINERS| 1 + drivers/remoteproc/Kconfig | 10 + drivers/remoteproc/Makefile| 1 + drivers/remoteproc/ipu_rproc.c | 759 + 4 files changed, 771 insertions(+) create mode 100644 drivers/remoteproc/ipu_rproc.c diff --git a/MAINTAINERS b/MAINTAINERS index bd9cc4107cbe..311397137b27 100644 --- a/MAINTAINERS +++ b/MAINTAINERS @@ -533,6 +533,7 @@ F: drivers/phy/omap-usb2-phy.c F: drivers/phy/phy-ti-am654.c F: drivers/phy/ti-pipe3-phy.c F: drivers/ram/k3* +F: drivers/remoteproc/ipu_rproc.c F: drivers/remoteproc/k3_system_controller.c F: drivers/remoteproc/pruc_rpoc.c F: drivers/remoteproc/ti* diff --git a/drivers/remoteproc/Kconfig b/drivers/remoteproc/Kconfig index 24e536463bbd..27e4a60ff5b1 100644 --- a/drivers/remoteproc/Kconfig +++ b/drivers/remoteproc/Kconfig @@ -92,4 +92,14 @@ config REMOTEPROC_TI_PRU help Say 'y' here to add support for TI' K3 remoteproc driver. +config REMOTEPROC_TI_IPU + bool "Support for TI's K3 based IPU remoteproc driver" + select REMOTEPROC + depends on DM + depends on SPL_DRIVERS_MISC + depends on SPL_FS_LOADER + depends on OF_CONTROL + help + Say 'y' here to add support for TI' K3 remoteproc driver. + endmenu diff --git a/drivers/remoteproc/Makefile b/drivers/remoteproc/Makefile index f0e83451d66f..fbe9c172bc04 100644 --- a/drivers/remoteproc/Makefile +++ b/drivers/remoteproc/Makefile @@ -15,3 +15,4 @@ obj-$(CONFIG_REMOTEPROC_TI_K3_DSP) += ti_k3_dsp_rproc.o obj-$(CONFIG_REMOTEPROC_TI_K3_R5F) += ti_k3_r5f_rproc.o obj-$(CONFIG_REMOTEPROC_TI_POWER) += ti_power_proc.o obj-$(CONFIG_REMOTEPROC_TI_PRU) += pru_rproc.o +obj-$(CONFIG_REMOTEPROC_TI_IPU) += ipu_rproc.o diff --git a/drivers/remoteproc/ipu_rproc.c b/drivers/remoteproc/ipu_rproc.c new file mode 100644 index ..b4a06bc955a9 --- /dev/null +++ b/drivers/remoteproc/ipu_rproc.c @@ -0,0 +1,759 @@ +// SPDX-License-Identifier: GPL-2.0 +/* + * IPU remoteproc driver for various SoCs + * + * Copyright (C) 2019 Texas Instruments Incorporated - http://www.ti.com/ + * Angela Stegmaier + * Venkateswara Rao Mandela + * Keerthy + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#define IPU1_LOAD_ADDR (0xa17ff000) +#define MAX_REMOTECORE_BIN_SIZE (8 * 0x10) + +enum ipu_num { + IPU1 = 0, + IPU2, + RPROC_END_ENUMS, +}; + +#define IPU2_LOAD_ADDR (IPU1_LOAD_ADDR + MAX_REMOTECORE_BIN_SIZE) + +#define PAGE_SHIFT 12 +#define PAGESIZE_1M 0x0 +#define PAGESIZE_64K 0x1 +#define PAGESIZE_4K 0x2 +#define PAGESIZE_16M 0x3 +#define LE 0 +#define BE 1 +#define ELEMSIZE_8 0x0 +#define ELEMSIZE_16 0x1 +#define ELEMSIZE_32 0x2 +#define MIXED_TLB0x0 +#define MIXED_CPU0x1 + +#define PGT_SMALLPAGE_SIZE 0x1000 +#define PGT_LARGEPAGE_SIZE 0x0001 +#define PGT_SECTION_SIZE 0x0010 +#define PGT_SUPERSECTION_SIZE0x0100 + +#define PGT_L1_DESC_PAGE 0x1 +#define PGT_L1_DESC_SECTION 0x2 +#define PGT_L1_DESC_SUPERSECTION 0x40002 + +#define PGT_L1_DESC_PAGE_MASK0xfC00 +#define PGT_L1_DESC_SECTION_MASK 0xfff0 +#define PGT_L1_DESC_SUPERSECTION_MASK0xff00 + +#define PGT_L1_DESC_SMALLPAGE_INDEX_SHIFT12 +#define PGT_L1_DESC_LARGEPAGE_INDEX_SHIFT16 +#define PGT_L1_DESC_SECTION_INDEX_SHIFT 20 +#define PGT_L1_DESC_SUPERSECTION_INDEX_SHIFT 24 + +#define PGT_L2_DESC_SMALLPAGE 0x02 +#define PGT_L2_DESC_LARGEPAGE 0x01 + +#define PGT_L2_DESC_SMALLPAGE_MASK 0xf000 +#define PGT_L2_DESC_LARGEPAGE_MASK 0x + +/* + * The memory for the page tables (256 KB per IPU) is placed just before + * the carveout memories for the remote processors. 16 KB of memory is + * needed for the L1 page table (4096 entries * 4 bytes per 1 MB section). + * Any smaller page (64 KB or 4 KB) entries are supported through L2 page + * tables (1 KB per table). The remain
[PATCH v4 05/11] linux: bitmap.h: Add find_next_zero_area function
From: Keerthy Add find_next_zero_area to fetch the next zero area in the map. Signed-off-by: Keerthy Signed-off-by: Amjad Ouled-Ameur --- (no changes since v1) include/linux/bitmap.h | 26 ++ 1 file changed, 26 insertions(+) diff --git a/include/linux/bitmap.h b/include/linux/bitmap.h index dae4225be549..0a8503af9f14 100644 --- a/include/linux/bitmap.h +++ b/include/linux/bitmap.h @@ -159,6 +159,32 @@ static inline unsigned long find_first_bit(const unsigned long *addr, unsigned l (bit) < (size);\ (bit) = find_next_bit((addr), (size), (bit) + 1)) +static inline unsigned long +bitmap_find_next_zero_area(unsigned long *map, + unsigned long size, + unsigned long start, + unsigned int nr, unsigned long align_mask) +{ + unsigned long index, end, i; +again: + index = find_next_zero_bit(map, size, start); + + /* +* Align allocation +*/ + index = (index + align_mask) & ~align_mask; + + end = index + nr; + if (end > size) + return end; + i = find_next_bit(map, end, index); + if (i < end) { + start = i + 1; + goto again; + } + return index; +} + static inline void bitmap_fill(unsigned long *dst, unsigned int nbits) { if (small_const_nbits(nbits)) { -- 2.25.1
[PATCH v4 04/11] drivers: misc: Makefile: Enable fs_loader compilation at SPL Level
From: Keerthy Enable fs_loader compilation at SPL Level. Signed-off-by: Keerthy [Amjad: fix compilation failures for J721e platform] Signed-off-by: Amjad Ouled-Ameur --- Changes in v4: - Enable SPL fs_loader for j7200_evm_r5 and socfpga_arria10. arch/arm/mach-k3/common.c | 10 +++--- configs/j7200_evm_r5_defconfig| 1 + configs/j721e_evm_r5_defconfig| 1 + configs/j721e_hs_evm_r5_defconfig | 1 + configs/socfpga_arria10_defconfig | 1 + drivers/misc/Kconfig | 9 + drivers/misc/Makefile | 2 +- 7 files changed, 17 insertions(+), 8 deletions(-) diff --git a/arch/arm/mach-k3/common.c b/arch/arm/mach-k3/common.c index 39d00270b7fa..b4b75f4e6c86 100644 --- a/arch/arm/mach-k3/common.c +++ b/arch/arm/mach-k3/common.c @@ -156,13 +156,15 @@ void init_env(void) #endif } -#ifdef CONFIG_FS_LOADER int load_firmware(char *name_fw, char *name_loadaddr, u32 *loadaddr) { struct udevice *fsdev; char *name = NULL; int size = 0; + if (!IS_ENABLED(CONFIG_FS_LOADER)) + return 0; + *loadaddr = 0; #ifdef CONFIG_SPL_ENV_SUPPORT switch (spl_boot_device()) { @@ -186,12 +188,6 @@ int load_firmware(char *name_fw, char *name_loadaddr, u32 *loadaddr) return size; } -#else -int load_firmware(char *name_fw, char *name_loadaddr, u32 *loadaddr) -{ - return 0; -} -#endif __weak void release_resources_for_core_shutdown(void) { diff --git a/configs/j7200_evm_r5_defconfig b/configs/j7200_evm_r5_defconfig index aeb76e8023f1..f5a8f325c0f1 100644 --- a/configs/j7200_evm_r5_defconfig +++ b/configs/j7200_evm_r5_defconfig @@ -91,6 +91,7 @@ CONFIG_SYS_I2C_OMAP24XX=y CONFIG_DM_MAILBOX=y CONFIG_K3_SEC_PROXY=y CONFIG_FS_LOADER=y +CONFIG_SPL_FS_LOADER=y CONFIG_K3_AVS0=y CONFIG_SUPPORT_EMMC_BOOT=y CONFIG_SPL_MMC_HS400_SUPPORT=y diff --git a/configs/j721e_evm_r5_defconfig b/configs/j721e_evm_r5_defconfig index b0759d1f305d..1fb13a8a707d 100644 --- a/configs/j721e_evm_r5_defconfig +++ b/configs/j721e_evm_r5_defconfig @@ -88,6 +88,7 @@ CONFIG_SYS_I2C_OMAP24XX=y CONFIG_DM_MAILBOX=y CONFIG_K3_SEC_PROXY=y CONFIG_FS_LOADER=y +CONFIG_SPL_FS_LOADER=y CONFIG_ESM_K3=y CONFIG_K3_AVS0=y CONFIG_ESM_PMIC=y diff --git a/configs/j721e_hs_evm_r5_defconfig b/configs/j721e_hs_evm_r5_defconfig index 3d2bbb4844e8..1e4a93ff53fe 100644 --- a/configs/j721e_hs_evm_r5_defconfig +++ b/configs/j721e_hs_evm_r5_defconfig @@ -82,6 +82,7 @@ CONFIG_SYS_I2C_OMAP24XX=y CONFIG_DM_MAILBOX=y CONFIG_K3_SEC_PROXY=y CONFIG_FS_LOADER=y +CONFIG_SPL_FS_LOADER=y CONFIG_K3_AVS0=y CONFIG_MMC_SDHCI=y CONFIG_SPL_MMC_SDHCI_ADMA=y diff --git a/configs/socfpga_arria10_defconfig b/configs/socfpga_arria10_defconfig index d6b744475039..63284cb0eb54 100644 --- a/configs/socfpga_arria10_defconfig +++ b/configs/socfpga_arria10_defconfig @@ -40,6 +40,7 @@ CONFIG_VERSION_VARIABLE=y CONFIG_SPL_DM_SEQ_ALIAS=y CONFIG_DWAPB_GPIO=y CONFIG_FS_LOADER=y +CONFIG_SPL_FS_LOADER=y CONFIG_MMC_DW=y CONFIG_MTD=y CONFIG_PHY_MICREL=y diff --git a/drivers/misc/Kconfig b/drivers/misc/Kconfig index a8baaeaf5cfe..0ade3e32b0ef 100644 --- a/drivers/misc/Kconfig +++ b/drivers/misc/Kconfig @@ -453,6 +453,15 @@ config FS_LOADER The consumer driver would then use this loader to program whatever, ie. the FPGA device. +config SPL_FS_LOADER + bool "Enable loader driver for file system" + help + This is file system generic loader which can be used to load + the file image from the storage into target such as memory. + + The consumer driver would then use this loader to program whatever, + ie. the FPGA device. + config GDSYS_SOC bool "Enable gdsys SOC driver" depends on MISC diff --git a/drivers/misc/Makefile b/drivers/misc/Makefile index f9826d2462d1..bca7b24e99ad 100644 --- a/drivers/misc/Makefile +++ b/drivers/misc/Makefile @@ -37,7 +37,7 @@ obj-$(CONFIG_FSL_IFC) += fsl_ifc.o obj-$(CONFIG_FSL_IIM) += fsl_iim.o obj-$(CONFIG_FSL_MC9SDZ60) += mc9sdz60.o obj-$(CONFIG_FSL_SEC_MON) += fsl_sec_mon.o -obj-$(CONFIG_FS_LOADER) += fs_loader.o +obj-$(CONFIG_$(SPL_)FS_LOADER) += fs_loader.o obj-$(CONFIG_GDSYS_IOEP) += gdsys_ioep.o obj-$(CONFIG_GDSYS_RXAUI_CTRL) += gdsys_rxaui_ctrl.o obj-$(CONFIG_GDSYS_SOC) += gdsys_soc.o -- 2.25.1
[PATCH v4 02/11] reset: dra7: Add a reset driver
From: Keerthy Add a reset driver to bring IPs out of reset. Signed-off-by: Keerthy [Amjad: reset_ops structure member "free" has been renamed to "rfree", use the latter instead] Signed-off-by: Amjad Ouled-Ameur --- (no changes since v1) MAINTAINERS| 1 + drivers/reset/Kconfig | 6 +++ drivers/reset/Makefile | 1 + drivers/reset/reset-dra7.c | 97 ++ 4 files changed, 105 insertions(+) create mode 100644 drivers/reset/reset-dra7.c diff --git a/MAINTAINERS b/MAINTAINERS index 38c68ee87d41..bd9cc4107cbe 100644 --- a/MAINTAINERS +++ b/MAINTAINERS @@ -536,6 +536,7 @@ F: drivers/ram/k3* F: drivers/remoteproc/k3_system_controller.c F: drivers/remoteproc/pruc_rpoc.c F: drivers/remoteproc/ti* +F: drivers/reset/reset-dra7.c F: drivers/reset/reset-ti-sci.c F: drivers/rtc/davinci.c F: drivers/serial/serial_omap.c diff --git a/drivers/reset/Kconfig b/drivers/reset/Kconfig index d73daf5e3189..b57714111b5a 100644 --- a/drivers/reset/Kconfig +++ b/drivers/reset/Kconfig @@ -206,4 +206,10 @@ config RESET_ZYNQMP passing request via Xilinx firmware interface to TF-A and PMU firmware. +config RESET_DRA7 + bool "Support for TI's DRA7 Reset driver" + depends on DM_RESET + help + Support for TI DRA7-RESET subsystem. Basic Assert/Deassert + is supported. endmenu diff --git a/drivers/reset/Makefile b/drivers/reset/Makefile index d69486bdeb9e..97e3a782c0d8 100644 --- a/drivers/reset/Makefile +++ b/drivers/reset/Makefile @@ -30,3 +30,4 @@ obj-$(CONFIG_RESET_SYSCON) += reset-syscon.o obj-$(CONFIG_RESET_RASPBERRYPI) += reset-raspberrypi.o obj-$(CONFIG_RESET_SCMI) += reset-scmi.o obj-$(CONFIG_RESET_ZYNQMP) += reset-zynqmp.o +obj-$(CONFIG_RESET_DRA7) += reset-dra7.o diff --git a/drivers/reset/reset-dra7.c b/drivers/reset/reset-dra7.c new file mode 100644 index ..585f8323c52e --- /dev/null +++ b/drivers/reset/reset-dra7.c @@ -0,0 +1,97 @@ +// SPDX-License-Identifier: GPL-2.0 +/* + * Texas Instruments DRA7 reset driver + * + * Copyright (C) 2019 Texas Instruments Incorporated - http://www.ti.com/ + * Author: Keerthy + */ + +#include +#include +#include +#include +#include + +struct dra7_reset_priv { + u32 rstctrl; + u32 rstst; + u8 nreset; +}; + +static int dra7_reset_request(struct reset_ctl *reset_ctl) +{ + return 0; +} + +static int dra7_reset_free(struct reset_ctl *reset_ctl) +{ + return 0; +} + +static inline void dra7_reset_rmw(u32 addr, u32 value, u32 mask) +{ + writel(((readl(addr) & (~mask)) | (value & mask)), addr); +} + +static int dra7_reset_deassert(struct reset_ctl *reset_ctl) +{ + struct dra7_reset_priv *priv = dev_get_priv(reset_ctl->dev); + int mask = 1 << reset_ctl->id; + + if (reset_ctl->id < 0 || reset_ctl->id >= priv->nreset) + return -EINVAL; + + dra7_reset_rmw(priv->rstctrl, 0x0, mask); + + while ((readl(priv->rstst) & mask) != mask) + ; + + return 0; +} + +static int dra7_reset_assert(struct reset_ctl *reset_ctl) +{ + struct dra7_reset_priv *priv = dev_get_priv(reset_ctl->dev); + int mask = 1 << reset_ctl->id; + + if (reset_ctl->id < 0 || reset_ctl->id >= priv->nreset) + return -EINVAL; + + dra7_reset_rmw(priv->rstctrl, mask, 0x0); + + return 0; +} + +struct reset_ops dra7_reset_ops = { + .request = dra7_reset_request, + .rfree = dra7_reset_free, + .rst_assert = dra7_reset_assert, + .rst_deassert = dra7_reset_deassert, +}; + +static const struct udevice_id dra7_reset_ids[] = { + { .compatible = "ti,dra7-reset" }, + { } +}; + +static int dra7_reset_probe(struct udevice *dev) +{ + struct dra7_reset_priv *priv = dev_get_priv(dev); + + priv->rstctrl = dev_read_addr(dev); + priv->rstst = priv->rstctrl + 0x4; + priv->nreset = dev_read_u32_default(dev, "ti,nresets", 1); + + dev_info(dev, "dra7-reset successfully probed %s\n", dev->name); + + return 0; +} + +U_BOOT_DRIVER(dra7_reset) = { + .name = "dra7_reset", + .id = UCLASS_RESET, + .of_match = dra7_reset_ids, + .probe = dra7_reset_probe, + .ops = &dra7_reset_ops, + .priv_auto = sizeof(struct dra7_reset_priv), +}; -- 2.25.1
[PATCH v4 03/11] arm: mach-omap2: load/start remoteproc IPU1/IPU2
From: Keerthy First check the presence of the ipu firmware in the boot partition. If present enable the ipu and the related clocks & then move on to load the firmware and eventually start remoteproc IPU1/IPU2. do_enable_clocks by default puts the clock domains into auto which does not work well with reset. Hence adding do_enable_ipu_clocks function. Signed-off-by: Keerthy [Amjad: fix IPU1_LOAD_ADDR and compile warnings] Signed-off-by: Amjad Ouled-Ameur --- (no changes since v1) arch/arm/include/asm/arch-omap5/clock.h | 3 + arch/arm/include/asm/omap_common.h | 10 +++ arch/arm/mach-omap2/boot-common.c | 95 + arch/arm/mach-omap2/clocks-common.c | 33 + arch/arm/mach-omap2/omap5/hw_data.c | 92 ++-- arch/arm/mach-omap2/omap5/prcm-regs.c | 9 ++- 6 files changed, 235 insertions(+), 7 deletions(-) diff --git a/arch/arm/include/asm/arch-omap5/clock.h b/arch/arm/include/asm/arch-omap5/clock.h index 87eb3f335ab0..a00626e357c9 100644 --- a/arch/arm/include/asm/arch-omap5/clock.h +++ b/arch/arm/include/asm/arch-omap5/clock.h @@ -135,6 +135,9 @@ #define HSMMC_CLKCTRL_CLKSEL_MASK (1 << 24) #define HSMMC_CLKCTRL_CLKSEL_DIV_MASK (3 << 25) +/* CM_IPU1_IPU1_CLKCTRL CLKSEL MASK */ +#define IPU1_CLKCTRL_CLKSEL_MASK BIT(24) + /* CM_L3INIT_SATA_CLKCTRL */ #define SATA_CLKCTRL_OPTFCLKEN_MASK(1 << 8) diff --git a/arch/arm/include/asm/omap_common.h b/arch/arm/include/asm/omap_common.h index de8fc99d0478..264a2e717a70 100644 --- a/arch/arm/include/asm/omap_common.h +++ b/arch/arm/include/asm/omap_common.h @@ -362,6 +362,10 @@ struct prcm_regs { /* IPU */ u32 cm_ipu_clkstctrl; u32 cm_ipu_i2c5_clkctrl; + u32 cm_ipu1_clkstctrl; + u32 cm_ipu1_ipu1_clkctrl; + u32 cm_ipu2_clkstctrl; + u32 cm_ipu2_ipu2_clkctrl; /*l3main1 edma*/ u32 cm_l3main1_tptc1_clkctrl; @@ -632,6 +636,12 @@ void do_disable_clocks(u32 const *clk_domains, u8 wait_for_disable); #endif /* CONFIG_OMAP44XX || CONFIG_OMAP54XX */ +void do_enable_ipu_clocks(u32 const *clk_domains, + u32 const *clk_modules_hw_auto, + u32 const *clk_modules_explicit_en, + u8 wait_for_enable); +void enable_ipu1_clocks(void); +void enable_ipu2_clocks(void); void setup_post_dividers(u32 const base, const struct dpll_params *params); u32 omap_ddr_clk(void); diff --git a/arch/arm/mach-omap2/boot-common.c b/arch/arm/mach-omap2/boot-common.c index fdb8b479ea01..afc358564191 100644 --- a/arch/arm/mach-omap2/boot-common.c +++ b/arch/arm/mach-omap2/boot-common.c @@ -10,6 +10,8 @@ #include #include #include +#include +#include #include #include #include @@ -19,9 +21,14 @@ #include #include #include +#include DECLARE_GLOBAL_DATA_PTR; +#define IPU1_LOAD_ADDR (0xa17ff000) +#define MAX_REMOTECORE_BIN_SIZE (8 * 0x10) +#define IPU2_LOAD_ADDR (IPU1_LOAD_ADDR + MAX_REMOTECORE_BIN_SIZE) + __weak u32 omap_sys_boot_device(void) { return BOOT_DEVICE_NONE; @@ -194,6 +201,91 @@ u32 spl_mmc_boot_mode(const u32 boot_device) return gd->arch.omap_boot_mode; } +int load_firmware(char *name_fw, u32 *loadaddr) +{ + struct udevice *fsdev; + int size = 0; + + if (!IS_ENABLED(CONFIG_FS_LOADER)) + return 0; + + if (!*loadaddr) + return 0; + + if (!uclass_get_device(UCLASS_FS_FIRMWARE_LOADER, 0, &fsdev)) { + size = request_firmware_into_buf(fsdev, name_fw, +(void *)*loadaddr, 0, 0); + } + + return size; +} + +void spl_boot_ipu(void) +{ + int ret, size; + u32 loadaddr = IPU1_LOAD_ADDR; + + if (!IS_ENABLED(CONFIG_SPL_BUILD) || + !IS_ENABLED(CONFIG_REMOTEPROC_TI_IPU)) + return; + + size = load_firmware("dra7-ipu1-fw.xem4", &loadaddr); + if (size <= 0) { + pr_err("Firmware loading failed\n"); + goto skip_ipu1; + } + + enable_ipu1_clocks(); + ret = rproc_dev_init(0); + if (ret) { + debug("%s: IPU1 failed to initialize on rproc (%d)\n", + __func__, ret); + goto skip_ipu1; + } + + ret = rproc_load(0, IPU1_LOAD_ADDR, 0x200); + if (ret) { + debug("%s: IPU1 failed to load on rproc (%d)\n", __func__, + ret); + goto skip_ipu1; + } + + debug("Starting IPU1...\n"); + + ret = rproc_start(0); + if (ret) + debug("%s: IPU1 failed to start (%d)\n", __func__, ret); + +skip_ipu1: + loadaddr = IPU2_LOAD_ADDR; + size = load_firmware("dra7-ipu2-fw.x
[PATCH v4 01/11] configs: dra7xx_evm: Increase the size of SPL_MULTI_DTB_FIT
Expand SPL_MULTI_DTB_FIT to accommodate new SPL IPU nodes. Signed-off-by: Amjad Ouled-Ameur --- (no changes since v1) configs/dra7xx_evm_defconfig | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/configs/dra7xx_evm_defconfig b/configs/dra7xx_evm_defconfig index d1aa91d676e1..d3a1d3e4d334 100644 --- a/configs/dra7xx_evm_defconfig +++ b/configs/dra7xx_evm_defconfig @@ -52,7 +52,7 @@ CONFIG_OF_CONTROL=y CONFIG_SPL_OF_CONTROL=y CONFIG_OF_LIST="dra7-evm dra72-evm dra72-evm-revc dra71-evm dra76-evm" CONFIG_SPL_MULTI_DTB_FIT=y -CONFIG_SPL_MULTI_DTB_FIT_UNCOMPRESS_SZ=0xA000 +CONFIG_SPL_MULTI_DTB_FIT_UNCOMPRESS_SZ=0x1 CONFIG_OF_SPL_REMOVE_PROPS="clocks clock-names interrupt-parent" CONFIG_ENV_OVERWRITE=y # CONFIG_ENV_IS_IN_FAT is not set -- 2.25.1
[PATCH v4 00/11] dra7: bring up and support IPU load/start
This patchset enables support for loading and starting IPU firmware, the following have been implemented: - Enable fs_loader compilation at SPL Level, that is necessary in order to load IPU firmware from /boot partition. - Define necessary related IPU dts nodes. - Add necessary drivers and helpers to bring up, load and start IPU firmware. The underlying patches are interdependent, therefore should be applied in the order they are numbered in this patchset. Tests: - Please find SPL, u-boot and kernel console logs in here [1] - At SPL stage, debug logs have been enabled to make sure that IPU1 and IPU2 are loaded and started properly. In fact, these two log messages are only displayed when the firmware has been loaded, and if no errors appear afterwards, it means that firmware started successfully as well: - Starting IPU1... - Starting IPU2... At U-boot stage, "rproc" command-line tool was used for the testing. In the logs [1], "rproc list" was run before and after IPU1 and IPU2 are initialized by "rproc init". The before run gave an empty list, while the after run listed successfully the two IPUs with their correct addresses: - 0 - Name:'ipu@5882' type:'internal memory mapped' - 1 - Name:'ipu@5502' type:'internal memory mapped' "rproc start" and "rproc stop" were also used for both IPU1 and IPU2, both were successful as no error logs were displayed. [0]: https://pastebin.com/QGUYSPRt These U-boot/SPL flags have been purposely enabled during tests to ensure IPU load/start work properly: - CONFIG_DM_RESET=y - CONFIG_RESET_DRA7=y - CONFIG_SPL_DM_RESET=y - CONFIG_FS_LOADER=y - CONFIG_SPL_FS_LOADER=y - CONFIG_SPL_DRIVERS_MISC_SUPPORT=y - CONFIG_REMOTEPROC_TI_IPU=y - CONFIG_SPL_REMOTEPROC=y - CONFIG_CMD_REMOTEPROC=y Changes in v4: - Enable SPL fs_loader for j7200_evm_r5 and socfpga_arria10. Changes in v3: - Add a new patch for dra7xx_evm to expand SPL_MULTI_DTB_FIT Changes in v2: - Add useful checks and remove redundant code. Amjad Ouled-Ameur (1): configs: dra7xx_evm: Increase the size of SPL_MULTI_DTB_FIT Keerthy (10): reset: dra7: Add a reset driver arm: mach-omap2: load/start remoteproc IPU1/IPU2 drivers: misc: Makefile: Enable fs_loader compilation at SPL Level linux: bitmap.h: Add find_next_zero_area function remoteproc: uclass: Add remoteproc resource handling helpers remoteproc: ipu: Add driver to bring up ipu dts: dra7-ipu-common-early-boot.dtsi: Add all the ipu early boot related nodes arm: dts: dra7: Add ipu and related nodes arm: dts: dra7*/am57xx-idk-evm-u-boot: Add ipu early boot DT changes dts: am57xx*: Add ipu early boot DT changes MAINTAINERS | 4 + .../dts/am57xx-beagle-x15-revb1-u-boot.dtsi | 7 + .../dts/am57xx-beagle-x15-revc-u-boot.dtsi| 7 + arch/arm/dts/am57xx-beagle-x15-u-boot.dtsi| 7 + arch/arm/dts/am57xx-cl-som-am57x-u-boot.dtsi | 7 + arch/arm/dts/am57xx-idk-common-u-boot.dtsi| 1 + arch/arm/dts/am57xx-sbc-am57x-u-boot.dtsi | 7 + arch/arm/dts/dra7-evm-u-boot.dtsi | 1 + arch/arm/dts/dra7-ipu-common-early-boot.dtsi | 113 +++ arch/arm/dts/dra7.dtsi| 45 +- arch/arm/dts/dra71-evm-u-boot.dtsi| 1 + arch/arm/dts/dra72-evm-revc-u-boot.dtsi | 1 + arch/arm/dts/dra76-evm-u-boot.dtsi| 1 + arch/arm/include/asm/arch-omap5/clock.h | 3 + arch/arm/include/asm/omap_common.h| 10 + arch/arm/mach-k3/common.c | 10 +- arch/arm/mach-omap2/boot-common.c | 95 +++ arch/arm/mach-omap2/clocks-common.c | 33 + arch/arm/mach-omap2/omap5/hw_data.c | 92 ++- arch/arm/mach-omap2/omap5/prcm-regs.c | 9 +- configs/dra7xx_evm_defconfig | 2 +- configs/j7200_evm_r5_defconfig| 1 + configs/j721e_evm_r5_defconfig| 1 + configs/j721e_hs_evm_r5_defconfig | 1 + configs/socfpga_arria10_defconfig | 1 + drivers/misc/Kconfig | 9 + drivers/misc/Makefile | 2 +- drivers/remoteproc/Kconfig| 10 + drivers/remoteproc/Makefile | 1 + drivers/remoteproc/ipu_rproc.c| 759 ++ drivers/remoteproc/rproc-uclass.c | 534 drivers/reset/Kconfig | 6 + drivers/reset/Makefile| 1 + drivers/reset/reset-dra7.c| 97 +++ include/linux/bitmap.h| 26 + include/remoteproc.h | 384 - 36 files changed, 2271 insertions(+), 18 deletions(-) create mode 100644 arch/arm/dts/am57xx-beagle-x15-revb1-u-boot.dtsi create mode 100644 arch/arm/dts/am57xx-beagle-x15-revc-u-boot.dtsi create mode 100644
[PATCH v3 11/11] dts: am57xx*: Add ipu early boot DT changes
From: Keerthy Add support for ipu early boot. Signed-off-by: Keerthy Signed-off-by: Amjad Ouled-Ameur --- (no changes since v1) MAINTAINERS | 1 + arch/arm/dts/am57xx-beagle-x15-revb1-u-boot.dtsi | 7 +++ arch/arm/dts/am57xx-beagle-x15-revc-u-boot.dtsi | 7 +++ arch/arm/dts/am57xx-beagle-x15-u-boot.dtsi | 7 +++ arch/arm/dts/am57xx-cl-som-am57x-u-boot.dtsi | 7 +++ arch/arm/dts/am57xx-sbc-am57x-u-boot.dtsi| 7 +++ 6 files changed, 36 insertions(+) create mode 100644 arch/arm/dts/am57xx-beagle-x15-revb1-u-boot.dtsi create mode 100644 arch/arm/dts/am57xx-beagle-x15-revc-u-boot.dtsi create mode 100644 arch/arm/dts/am57xx-beagle-x15-u-boot.dtsi create mode 100644 arch/arm/dts/am57xx-cl-som-am57x-u-boot.dtsi create mode 100644 arch/arm/dts/am57xx-sbc-am57x-u-boot.dtsi diff --git a/MAINTAINERS b/MAINTAINERS index 7adc28dbfd87..c73739a15a4b 100644 --- a/MAINTAINERS +++ b/MAINTAINERS @@ -514,6 +514,7 @@ ARM TI M: Tom Rini S: Maintained T: git https://source.denx.de/u-boot/custodians/u-boot-ti.git +F: arch/arm/dts/am57xx* F: arch/arm/dts/dra7* F: arch/arm/mach-davinci/ F: arch/arm/mach-k3/ diff --git a/arch/arm/dts/am57xx-beagle-x15-revb1-u-boot.dtsi b/arch/arm/dts/am57xx-beagle-x15-revb1-u-boot.dtsi new file mode 100644 index ..49b16215e528 --- /dev/null +++ b/arch/arm/dts/am57xx-beagle-x15-revb1-u-boot.dtsi @@ -0,0 +1,7 @@ +// SPDX-License-Identifier: GPL-2.0+ +/* + * Copyright (C) 2019 Texas Instruments Incorporated - http://www.ti.com/ + */ + +#include "omap5-u-boot.dtsi" +#include "dra7-ipu-common-early-boot.dtsi" diff --git a/arch/arm/dts/am57xx-beagle-x15-revc-u-boot.dtsi b/arch/arm/dts/am57xx-beagle-x15-revc-u-boot.dtsi new file mode 100644 index ..49b16215e528 --- /dev/null +++ b/arch/arm/dts/am57xx-beagle-x15-revc-u-boot.dtsi @@ -0,0 +1,7 @@ +// SPDX-License-Identifier: GPL-2.0+ +/* + * Copyright (C) 2019 Texas Instruments Incorporated - http://www.ti.com/ + */ + +#include "omap5-u-boot.dtsi" +#include "dra7-ipu-common-early-boot.dtsi" diff --git a/arch/arm/dts/am57xx-beagle-x15-u-boot.dtsi b/arch/arm/dts/am57xx-beagle-x15-u-boot.dtsi new file mode 100644 index ..49b16215e528 --- /dev/null +++ b/arch/arm/dts/am57xx-beagle-x15-u-boot.dtsi @@ -0,0 +1,7 @@ +// SPDX-License-Identifier: GPL-2.0+ +/* + * Copyright (C) 2019 Texas Instruments Incorporated - http://www.ti.com/ + */ + +#include "omap5-u-boot.dtsi" +#include "dra7-ipu-common-early-boot.dtsi" diff --git a/arch/arm/dts/am57xx-cl-som-am57x-u-boot.dtsi b/arch/arm/dts/am57xx-cl-som-am57x-u-boot.dtsi new file mode 100644 index ..49b16215e528 --- /dev/null +++ b/arch/arm/dts/am57xx-cl-som-am57x-u-boot.dtsi @@ -0,0 +1,7 @@ +// SPDX-License-Identifier: GPL-2.0+ +/* + * Copyright (C) 2019 Texas Instruments Incorporated - http://www.ti.com/ + */ + +#include "omap5-u-boot.dtsi" +#include "dra7-ipu-common-early-boot.dtsi" diff --git a/arch/arm/dts/am57xx-sbc-am57x-u-boot.dtsi b/arch/arm/dts/am57xx-sbc-am57x-u-boot.dtsi new file mode 100644 index ..49b16215e528 --- /dev/null +++ b/arch/arm/dts/am57xx-sbc-am57x-u-boot.dtsi @@ -0,0 +1,7 @@ +// SPDX-License-Identifier: GPL-2.0+ +/* + * Copyright (C) 2019 Texas Instruments Incorporated - http://www.ti.com/ + */ + +#include "omap5-u-boot.dtsi" +#include "dra7-ipu-common-early-boot.dtsi" -- 2.25.1
[PATCH v3 06/11] remoteproc: uclass: Add remoteproc resource handling helpers
From: Keerthy Add remoteproc resource handling helpers. These functions are primarily to parse the resource table and to handle different types of resources. Carveout, devmem, trace & vring resources are handled. Signed-off-by: Keerthy [Amjad: fix redefinition of "struct resource_table" and compile warnings ] Signed-off-by: Amjad Ouled-Ameur --- (no changes since v2) Changes in v2: - Add useful checks and remove redundant code. drivers/remoteproc/rproc-uclass.c | 534 ++ include/remoteproc.h | 384 - 2 files changed, 917 insertions(+), 1 deletion(-) diff --git a/drivers/remoteproc/rproc-uclass.c b/drivers/remoteproc/rproc-uclass.c index 87e1ec7ad7f0..50bcc9030e98 100644 --- a/drivers/remoteproc/rproc-uclass.c +++ b/drivers/remoteproc/rproc-uclass.c @@ -8,15 +8,31 @@ #define pr_fmt(fmt) "%s: " fmt, __func__ #include +#include #include #include #include +#include #include #include #include #include #include #include +#include + +DECLARE_GLOBAL_DATA_PTR; + +struct resource_table { + u32 ver; + u32 num; + u32 reserved[2]; + u32 offset[0]; +} __packed; + +typedef int (*handle_resource_t) (struct udevice *, void *, int offset, int avail); + +static struct resource_table *rsc_table; /** * for_each_remoteproc_device() - iterate through the list of rproc devices @@ -196,6 +212,80 @@ static int rproc_post_probe(struct udevice *dev) return 0; } +/** + * rproc_add_res() - After parsing the resource table add the mappings + * @dev: device we finished probing + * @mapping: rproc_mem_entry for the resource + * + * Return: if the remote proc driver has a add_res routine, invokes it and + * hands over the return value. overall, 0 if all went well, else appropriate + * error value. + */ +static int rproc_add_res(struct udevice *dev, struct rproc_mem_entry *mapping) +{ + const struct dm_rproc_ops *ops = rproc_get_ops(dev); + + if (!ops->add_res) + return -ENOSYS; + + return ops->add_res(dev, mapping); +} + +/** + * rproc_alloc_mem() - After parsing the resource table allocat mem + * @dev: device we finished probing + * @len: rproc_mem_entry for the resource + * @align: alignment for the resource + * + * Return: if the remote proc driver has a add_res routine, invokes it and + * hands over the return value. overall, 0 if all went well, else appropriate + * error value. + */ +static void *rproc_alloc_mem(struct udevice *dev, unsigned long len, +unsigned long align) +{ + const struct dm_rproc_ops *ops; + + ops = rproc_get_ops(dev); + if (!ops) { + debug("%s driver has no ops?\n", dev->name); + return NULL; + } + + if (ops->alloc_mem) + return ops->alloc_mem(dev, len, align); + + return NULL; +} + +/** + * rproc_config_pagetable() - Configure page table for remote processor + * @dev: device we finished probing + * @virt: Virtual address of the resource + * @phys: Physical address the resource + * @len: length the resource + * + * Return: if the remote proc driver has a add_res routine, invokes it and + * hands over the return value. overall, 0 if all went well, else appropriate + * error value. + */ +static int rproc_config_pagetable(struct udevice *dev, unsigned int virt, + unsigned int phys, unsigned int len) +{ + const struct dm_rproc_ops *ops; + + ops = rproc_get_ops(dev); + if (!ops) { + debug("%s driver has no ops?\n", dev->name); + return -EINVAL; + } + + if (ops->config_pagetable) + return ops->config_pagetable(dev, virt, phys, len); + + return 0; +} + UCLASS_DRIVER(rproc) = { .id = UCLASS_REMOTEPROC, .name = "remoteproc", @@ -426,3 +516,447 @@ int rproc_is_running(int id) { return _rproc_ops_wrapper(id, RPROC_RUNNING); }; + + +static int handle_trace(struct udevice *dev, struct fw_rsc_trace *rsc, + int offset, int avail) +{ + if (sizeof(*rsc) > avail) { + debug("trace rsc is truncated\n"); + return -EINVAL; + } + + /* +* make sure reserved bytes are zeroes +*/ + if (rsc->reserved) { + debug("trace rsc has non zero reserved bytes\n"); + return -EINVAL; + } + + debug("trace rsc: da 0x%x, len 0x%x\n", rsc->da, rsc->len); + + return 0; +} + +static int handle_devmem(struct udevice *dev, struct fw_rsc_devmem *rsc, +int offset, int avail) +{ + struct rproc_mem_entry *mapping; + + if (sizeof(*rsc) > avail) { + debug("devmem rsc is truncated\n"); + return -EINVAL; + } +
[PATCH v3 07/11] remoteproc: ipu: Add driver to bring up ipu
From: Keerthy The driver enables IPU support. Basically enables the clocks, timers, watchdog timers and bare minimal MMU and supports loading the firmware from mmc. Signed-off-by: Keerthy [Amjad: fix compile warnings] Signed-off-by: Amjad Ouled-Ameur --- (no changes since v1) MAINTAINERS| 1 + drivers/remoteproc/Kconfig | 10 + drivers/remoteproc/Makefile| 1 + drivers/remoteproc/ipu_rproc.c | 759 + 4 files changed, 771 insertions(+) create mode 100644 drivers/remoteproc/ipu_rproc.c diff --git a/MAINTAINERS b/MAINTAINERS index bd9cc4107cbe..311397137b27 100644 --- a/MAINTAINERS +++ b/MAINTAINERS @@ -533,6 +533,7 @@ F: drivers/phy/omap-usb2-phy.c F: drivers/phy/phy-ti-am654.c F: drivers/phy/ti-pipe3-phy.c F: drivers/ram/k3* +F: drivers/remoteproc/ipu_rproc.c F: drivers/remoteproc/k3_system_controller.c F: drivers/remoteproc/pruc_rpoc.c F: drivers/remoteproc/ti* diff --git a/drivers/remoteproc/Kconfig b/drivers/remoteproc/Kconfig index 24e536463bbd..27e4a60ff5b1 100644 --- a/drivers/remoteproc/Kconfig +++ b/drivers/remoteproc/Kconfig @@ -92,4 +92,14 @@ config REMOTEPROC_TI_PRU help Say 'y' here to add support for TI' K3 remoteproc driver. +config REMOTEPROC_TI_IPU + bool "Support for TI's K3 based IPU remoteproc driver" + select REMOTEPROC + depends on DM + depends on SPL_DRIVERS_MISC + depends on SPL_FS_LOADER + depends on OF_CONTROL + help + Say 'y' here to add support for TI' K3 remoteproc driver. + endmenu diff --git a/drivers/remoteproc/Makefile b/drivers/remoteproc/Makefile index f0e83451d66f..fbe9c172bc04 100644 --- a/drivers/remoteproc/Makefile +++ b/drivers/remoteproc/Makefile @@ -15,3 +15,4 @@ obj-$(CONFIG_REMOTEPROC_TI_K3_DSP) += ti_k3_dsp_rproc.o obj-$(CONFIG_REMOTEPROC_TI_K3_R5F) += ti_k3_r5f_rproc.o obj-$(CONFIG_REMOTEPROC_TI_POWER) += ti_power_proc.o obj-$(CONFIG_REMOTEPROC_TI_PRU) += pru_rproc.o +obj-$(CONFIG_REMOTEPROC_TI_IPU) += ipu_rproc.o diff --git a/drivers/remoteproc/ipu_rproc.c b/drivers/remoteproc/ipu_rproc.c new file mode 100644 index ..b4a06bc955a9 --- /dev/null +++ b/drivers/remoteproc/ipu_rproc.c @@ -0,0 +1,759 @@ +// SPDX-License-Identifier: GPL-2.0 +/* + * IPU remoteproc driver for various SoCs + * + * Copyright (C) 2019 Texas Instruments Incorporated - http://www.ti.com/ + * Angela Stegmaier + * Venkateswara Rao Mandela + * Keerthy + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#define IPU1_LOAD_ADDR (0xa17ff000) +#define MAX_REMOTECORE_BIN_SIZE (8 * 0x10) + +enum ipu_num { + IPU1 = 0, + IPU2, + RPROC_END_ENUMS, +}; + +#define IPU2_LOAD_ADDR (IPU1_LOAD_ADDR + MAX_REMOTECORE_BIN_SIZE) + +#define PAGE_SHIFT 12 +#define PAGESIZE_1M 0x0 +#define PAGESIZE_64K 0x1 +#define PAGESIZE_4K 0x2 +#define PAGESIZE_16M 0x3 +#define LE 0 +#define BE 1 +#define ELEMSIZE_8 0x0 +#define ELEMSIZE_16 0x1 +#define ELEMSIZE_32 0x2 +#define MIXED_TLB0x0 +#define MIXED_CPU0x1 + +#define PGT_SMALLPAGE_SIZE 0x1000 +#define PGT_LARGEPAGE_SIZE 0x0001 +#define PGT_SECTION_SIZE 0x0010 +#define PGT_SUPERSECTION_SIZE0x0100 + +#define PGT_L1_DESC_PAGE 0x1 +#define PGT_L1_DESC_SECTION 0x2 +#define PGT_L1_DESC_SUPERSECTION 0x40002 + +#define PGT_L1_DESC_PAGE_MASK0xfC00 +#define PGT_L1_DESC_SECTION_MASK 0xfff0 +#define PGT_L1_DESC_SUPERSECTION_MASK0xff00 + +#define PGT_L1_DESC_SMALLPAGE_INDEX_SHIFT12 +#define PGT_L1_DESC_LARGEPAGE_INDEX_SHIFT16 +#define PGT_L1_DESC_SECTION_INDEX_SHIFT 20 +#define PGT_L1_DESC_SUPERSECTION_INDEX_SHIFT 24 + +#define PGT_L2_DESC_SMALLPAGE 0x02 +#define PGT_L2_DESC_LARGEPAGE 0x01 + +#define PGT_L2_DESC_SMALLPAGE_MASK 0xf000 +#define PGT_L2_DESC_LARGEPAGE_MASK 0x + +/* + * The memory for the page tables (256 KB per IPU) is placed just before + * the carveout memories for the remote processors. 16 KB of memory is + * needed for the L1 page table (4096 entries * 4 bytes per 1 MB section). + * Any smaller page (64 KB or 4 KB) entries are supported through L2 page + * tables (1 KB per table). The remain
[PATCH v3 10/11] arm: dts: dra7*/am57xx-idk-evm-u-boot: Add ipu early boot DT changes
From: Keerthy Add support for ipu early boot. Signed-off-by: Keerthy Signed-off-by: Amjad Ouled-Ameur --- (no changes since v1) arch/arm/dts/am57xx-idk-common-u-boot.dtsi | 1 + arch/arm/dts/dra7-evm-u-boot.dtsi | 1 + arch/arm/dts/dra71-evm-u-boot.dtsi | 1 + arch/arm/dts/dra72-evm-revc-u-boot.dtsi| 1 + arch/arm/dts/dra76-evm-u-boot.dtsi | 1 + 5 files changed, 5 insertions(+) diff --git a/arch/arm/dts/am57xx-idk-common-u-boot.dtsi b/arch/arm/dts/am57xx-idk-common-u-boot.dtsi index b07aea0048d5..d0ce469f9189 100644 --- a/arch/arm/dts/am57xx-idk-common-u-boot.dtsi +++ b/arch/arm/dts/am57xx-idk-common-u-boot.dtsi @@ -3,6 +3,7 @@ * Copyright (C) 2019 Texas Instruments Incorporated - http://www.ti.com/ */ #include "omap5-u-boot.dtsi" +#include "dra7-ipu-common-early-boot.dtsi" / { xtal25mhz: xtal25mhz { diff --git a/arch/arm/dts/dra7-evm-u-boot.dtsi b/arch/arm/dts/dra7-evm-u-boot.dtsi index f06c701dbd1f..5622512b2401 100644 --- a/arch/arm/dts/dra7-evm-u-boot.dtsi +++ b/arch/arm/dts/dra7-evm-u-boot.dtsi @@ -4,6 +4,7 @@ */ #include "omap5-u-boot.dtsi" +#include "dra7-ipu-common-early-boot.dtsi" &pcf_gpio_21{ u-boot,i2c-offset-len = <0>; diff --git a/arch/arm/dts/dra71-evm-u-boot.dtsi b/arch/arm/dts/dra71-evm-u-boot.dtsi index b56d4fc9d896..40443da5c855 100644 --- a/arch/arm/dts/dra71-evm-u-boot.dtsi +++ b/arch/arm/dts/dra71-evm-u-boot.dtsi @@ -4,6 +4,7 @@ */ #include "omap5-u-boot.dtsi" +#include "dra7-ipu-common-early-boot.dtsi" &pcf_gpio_21{ u-boot,i2c-offset-len = <0>; diff --git a/arch/arm/dts/dra72-evm-revc-u-boot.dtsi b/arch/arm/dts/dra72-evm-revc-u-boot.dtsi index b56d4fc9d896..40443da5c855 100644 --- a/arch/arm/dts/dra72-evm-revc-u-boot.dtsi +++ b/arch/arm/dts/dra72-evm-revc-u-boot.dtsi @@ -4,6 +4,7 @@ */ #include "omap5-u-boot.dtsi" +#include "dra7-ipu-common-early-boot.dtsi" &pcf_gpio_21{ u-boot,i2c-offset-len = <0>; diff --git a/arch/arm/dts/dra76-evm-u-boot.dtsi b/arch/arm/dts/dra76-evm-u-boot.dtsi index a4dfbe7e601a..5fae6ba91936 100644 --- a/arch/arm/dts/dra76-evm-u-boot.dtsi +++ b/arch/arm/dts/dra76-evm-u-boot.dtsi @@ -4,6 +4,7 @@ */ #include "omap5-u-boot.dtsi" +#include "dra7-ipu-common-early-boot.dtsi" &cpsw_emac0 { phy-handle = <&dp83867_0>; -- 2.25.1
[PATCH v3 09/11] arm: dts: dra7: Add ipu and related nodes
From: Keerthy Add ipu and the associated nodes. Signed-off-by: Keerthy Signed-off-by: Amjad Ouled-Ameur --- (no changes since v1) arch/arm/dts/dra7.dtsi | 45 +- 1 file changed, 44 insertions(+), 1 deletion(-) diff --git a/arch/arm/dts/dra7.dtsi b/arch/arm/dts/dra7.dtsi index fd1aea0b1b16..e2e958b36626 100644 --- a/arch/arm/dts/dra7.dtsi +++ b/arch/arm/dts/dra7.dtsi @@ -41,6 +41,8 @@ d_can0 = &dcan1; d_can1 = &dcan2; spi0 = &qspi; + remoteproc0 = &ipu1; + remoteproc1 = &ipu2; }; timer { @@ -263,9 +265,12 @@ }; prm: prm@6000 { - compatible = "ti,dra7-prm"; + compatible = "ti,dra7-prm", "simple-bus"; reg = <0x6000 0x3000>; interrupts = ; + #address-cells = <1>; + #size-cells = <1>; + ranges = <0 0x6000 0x3000>; prm_clocks: clocks { #address-cells = <1>; @@ -274,6 +279,20 @@ prm_clockdomains: clockdomains { }; + + ipu1_rst: ipu1_rst@510 { + compatible = "ti,dra7-reset"; + reg = <0x510 0x8>; + ti,nresets = <3>; + #reset-cells = <1>; + }; + + ipu2_rst: ipu2_rst@910 { + compatible = "ti,dra7-reset"; + reg = <0x910 0x8>; + ti,nresets = <3>; + #reset-cells = <1>; + }; }; scm_wkup: scm_conf@c000 { @@ -2032,6 +2051,30 @@ clocks = <&l3_iclk_div>; clock-names = "fck"; }; + + ipu1: ipu@5882 { + compatible = "ti,dra7-ipu"; + reg = <0x5882 0x1>; + reg-names = "l2ram"; + ti,hwmods = "ipu1"; + resets = <&ipu1_rst 0>, <&ipu1_rst 1>, <&ipu1_rst 2>; + iommus = <&mmu_ipu1>; + ti,rproc-standby-info = <0x4a005520>; + timers = <&timer11>; + watchdog-timers = <&timer7>, <&timer8>; + }; + + ipu2: ipu@5502 { + compatible = "ti,dra7-ipu"; + reg = <0x5502 0x1>; + reg-names = "l2ram"; + ti,hwmods = "ipu2"; + resets = <&ipu2_rst 0>, <&ipu2_rst 1>, <&ipu2_rst 2>; + iommus = <&mmu_ipu2>; + ti,rproc-standby-info = <0x4a008920>; + timers = <&timer3>; + watchdog-timers = <&timer4>, <&timer9>; + }; }; thermal_zones: thermal-zones { -- 2.25.1
[PATCH v3 08/11] dts: dra7-ipu-common-early-boot.dtsi: Add all the ipu early boot related nodes
From: Keerthy Add all the ipu early boot related nodes Signed-off-by: Keerthy Signed-off-by: Amjad Ouled-Ameur --- (no changes since v1) MAINTAINERS | 1 + arch/arm/dts/dra7-ipu-common-early-boot.dtsi | 113 +++ 2 files changed, 114 insertions(+) create mode 100644 arch/arm/dts/dra7-ipu-common-early-boot.dtsi diff --git a/MAINTAINERS b/MAINTAINERS index 311397137b27..7adc28dbfd87 100644 --- a/MAINTAINERS +++ b/MAINTAINERS @@ -514,6 +514,7 @@ ARM TI M: Tom Rini S: Maintained T: git https://source.denx.de/u-boot/custodians/u-boot-ti.git +F: arch/arm/dts/dra7* F: arch/arm/mach-davinci/ F: arch/arm/mach-k3/ F: arch/arm/mach-keystone/ diff --git a/arch/arm/dts/dra7-ipu-common-early-boot.dtsi b/arch/arm/dts/dra7-ipu-common-early-boot.dtsi new file mode 100644 index ..ec6040ff93eb --- /dev/null +++ b/arch/arm/dts/dra7-ipu-common-early-boot.dtsi @@ -0,0 +1,113 @@ +// SPDX-License-Identifier: GPL-2.0+ +/* + * Copyright (C) 2019 Texas Instruments Incorporated - http://www.ti.com/ + */ + +/ { + chosen { + firmware-loader = &fs_loader0; + }; + + fs_loader0: fs_loader@0 { + u-boot,dm-pre-reloc; + compatible = "u-boot,fs-loader"; + phandlepart = <&mmc1 1>; + }; + + reserved-memory { + #address-cells = <2>; + #size-cells = <2>; + ranges; + u-boot,dm-spl; + + ipu2_memory_region: ipu2-memory@9580 { + compatible = "shared-dma-pool"; + reg = <0x0 0x9580 0x0 0x380>; + reusable; + status = "okay"; + u-boot,dm-spl; + }; + + ipu1_memory_region: ipu1-memory@9d00 { + compatible = "shared-dma-pool"; + reg = <0x0 0x9d00 0x0 0x200>; + reusable; + status = "okay"; + u-boot,dm-spl; + }; + + ipu1_pgtbl: ipu1-pgtbl@9570 { + reg = <0x0 0x9570 0x0 0x4>; + no-map; + u-boot,dm-spl; + }; + + ipu2_pgtbl: ipu2-pgtbl@9574 { + reg = <0x0 0x9574 0x0 0x4>; + no-map; + u-boot,dm-spl; + }; + }; +}; + +&timer3 { + u-boot,dm-spl; +}; + +&timer4 { + u-boot,dm-spl; +}; + +&timer7 { + u-boot,dm-spl; +}; + +&timer8 { + u-boot,dm-spl; +}; + +&timer9 { + u-boot,dm-spl; +}; + +&timer11 { + u-boot,dm-spl; +}; + +&mmu_ipu1 { + u-boot,dm-spl; +}; + +&mmu_ipu2 { + u-boot,dm-spl; +}; + +&ipu1 { + status = "okay"; + memory-region = <&ipu1_memory_region>; + pg-tbl = <&ipu1_pgtbl>; + u-boot,dm-spl; +}; + +&ipu2 { + status = "okay"; + memory-region = <&ipu2_memory_region>; + pg-tbl = <&ipu2_pgtbl>; + u-boot,dm-spl; +}; + +&l4_wkup { + u-boot,dm-spl; +}; + +&prm { + u-boot,dm-spl; +}; + +&ipu1_rst { + u-boot,dm-spl; +}; + +&ipu2_rst { + u-boot,dm-spl; +}; -- 2.25.1
[PATCH v3 05/11] linux: bitmap.h: Add find_next_zero_area function
From: Keerthy Add find_next_zero_area to fetch the next zero area in the map. Signed-off-by: Keerthy Signed-off-by: Amjad Ouled-Ameur --- (no changes since v1) include/linux/bitmap.h | 26 ++ 1 file changed, 26 insertions(+) diff --git a/include/linux/bitmap.h b/include/linux/bitmap.h index dae4225be549..0a8503af9f14 100644 --- a/include/linux/bitmap.h +++ b/include/linux/bitmap.h @@ -159,6 +159,32 @@ static inline unsigned long find_first_bit(const unsigned long *addr, unsigned l (bit) < (size);\ (bit) = find_next_bit((addr), (size), (bit) + 1)) +static inline unsigned long +bitmap_find_next_zero_area(unsigned long *map, + unsigned long size, + unsigned long start, + unsigned int nr, unsigned long align_mask) +{ + unsigned long index, end, i; +again: + index = find_next_zero_bit(map, size, start); + + /* +* Align allocation +*/ + index = (index + align_mask) & ~align_mask; + + end = index + nr; + if (end > size) + return end; + i = find_next_bit(map, end, index); + if (i < end) { + start = i + 1; + goto again; + } + return index; +} + static inline void bitmap_fill(unsigned long *dst, unsigned int nbits) { if (small_const_nbits(nbits)) { -- 2.25.1
[PATCH v3 04/11] drivers: misc: Makefile: Enable fs_loader compilation at SPL Level
From: Keerthy Enable fs_loader compilation at SPL Level. Signed-off-by: Keerthy [Amjad: fix compilation failures for J721e platform] Signed-off-by: Amjad Ouled-Ameur --- (no changes since v1) arch/arm/mach-k3/common.c | 10 +++--- configs/j721e_evm_r5_defconfig| 1 + configs/j721e_hs_evm_r5_defconfig | 1 + drivers/misc/Kconfig | 9 + drivers/misc/Makefile | 2 +- 5 files changed, 15 insertions(+), 8 deletions(-) diff --git a/arch/arm/mach-k3/common.c b/arch/arm/mach-k3/common.c index 39d00270b7fa..b4b75f4e6c86 100644 --- a/arch/arm/mach-k3/common.c +++ b/arch/arm/mach-k3/common.c @@ -156,13 +156,15 @@ void init_env(void) #endif } -#ifdef CONFIG_FS_LOADER int load_firmware(char *name_fw, char *name_loadaddr, u32 *loadaddr) { struct udevice *fsdev; char *name = NULL; int size = 0; + if (!IS_ENABLED(CONFIG_FS_LOADER)) + return 0; + *loadaddr = 0; #ifdef CONFIG_SPL_ENV_SUPPORT switch (spl_boot_device()) { @@ -186,12 +188,6 @@ int load_firmware(char *name_fw, char *name_loadaddr, u32 *loadaddr) return size; } -#else -int load_firmware(char *name_fw, char *name_loadaddr, u32 *loadaddr) -{ - return 0; -} -#endif __weak void release_resources_for_core_shutdown(void) { diff --git a/configs/j721e_evm_r5_defconfig b/configs/j721e_evm_r5_defconfig index b0759d1f305d..1fb13a8a707d 100644 --- a/configs/j721e_evm_r5_defconfig +++ b/configs/j721e_evm_r5_defconfig @@ -88,6 +88,7 @@ CONFIG_SYS_I2C_OMAP24XX=y CONFIG_DM_MAILBOX=y CONFIG_K3_SEC_PROXY=y CONFIG_FS_LOADER=y +CONFIG_SPL_FS_LOADER=y CONFIG_ESM_K3=y CONFIG_K3_AVS0=y CONFIG_ESM_PMIC=y diff --git a/configs/j721e_hs_evm_r5_defconfig b/configs/j721e_hs_evm_r5_defconfig index 3d2bbb4844e8..1e4a93ff53fe 100644 --- a/configs/j721e_hs_evm_r5_defconfig +++ b/configs/j721e_hs_evm_r5_defconfig @@ -82,6 +82,7 @@ CONFIG_SYS_I2C_OMAP24XX=y CONFIG_DM_MAILBOX=y CONFIG_K3_SEC_PROXY=y CONFIG_FS_LOADER=y +CONFIG_SPL_FS_LOADER=y CONFIG_K3_AVS0=y CONFIG_MMC_SDHCI=y CONFIG_SPL_MMC_SDHCI_ADMA=y diff --git a/drivers/misc/Kconfig b/drivers/misc/Kconfig index a8baaeaf5cfe..0ade3e32b0ef 100644 --- a/drivers/misc/Kconfig +++ b/drivers/misc/Kconfig @@ -453,6 +453,15 @@ config FS_LOADER The consumer driver would then use this loader to program whatever, ie. the FPGA device. +config SPL_FS_LOADER + bool "Enable loader driver for file system" + help + This is file system generic loader which can be used to load + the file image from the storage into target such as memory. + + The consumer driver would then use this loader to program whatever, + ie. the FPGA device. + config GDSYS_SOC bool "Enable gdsys SOC driver" depends on MISC diff --git a/drivers/misc/Makefile b/drivers/misc/Makefile index f9826d2462d1..bca7b24e99ad 100644 --- a/drivers/misc/Makefile +++ b/drivers/misc/Makefile @@ -37,7 +37,7 @@ obj-$(CONFIG_FSL_IFC) += fsl_ifc.o obj-$(CONFIG_FSL_IIM) += fsl_iim.o obj-$(CONFIG_FSL_MC9SDZ60) += mc9sdz60.o obj-$(CONFIG_FSL_SEC_MON) += fsl_sec_mon.o -obj-$(CONFIG_FS_LOADER) += fs_loader.o +obj-$(CONFIG_$(SPL_)FS_LOADER) += fs_loader.o obj-$(CONFIG_GDSYS_IOEP) += gdsys_ioep.o obj-$(CONFIG_GDSYS_RXAUI_CTRL) += gdsys_rxaui_ctrl.o obj-$(CONFIG_GDSYS_SOC) += gdsys_soc.o -- 2.25.1
[PATCH v3 03/11] arm: mach-omap2: load/start remoteproc IPU1/IPU2
From: Keerthy First check the presence of the ipu firmware in the boot partition. If present enable the ipu and the related clocks & then move on to load the firmware and eventually start remoteproc IPU1/IPU2. do_enable_clocks by default puts the clock domains into auto which does not work well with reset. Hence adding do_enable_ipu_clocks function. Signed-off-by: Keerthy [Amjad: fix IPU1_LOAD_ADDR and compile warnings] Signed-off-by: Amjad Ouled-Ameur --- (no changes since v1) arch/arm/include/asm/arch-omap5/clock.h | 3 + arch/arm/include/asm/omap_common.h | 10 +++ arch/arm/mach-omap2/boot-common.c | 95 + arch/arm/mach-omap2/clocks-common.c | 33 + arch/arm/mach-omap2/omap5/hw_data.c | 92 ++-- arch/arm/mach-omap2/omap5/prcm-regs.c | 9 ++- 6 files changed, 235 insertions(+), 7 deletions(-) diff --git a/arch/arm/include/asm/arch-omap5/clock.h b/arch/arm/include/asm/arch-omap5/clock.h index 87eb3f335ab0..a00626e357c9 100644 --- a/arch/arm/include/asm/arch-omap5/clock.h +++ b/arch/arm/include/asm/arch-omap5/clock.h @@ -135,6 +135,9 @@ #define HSMMC_CLKCTRL_CLKSEL_MASK (1 << 24) #define HSMMC_CLKCTRL_CLKSEL_DIV_MASK (3 << 25) +/* CM_IPU1_IPU1_CLKCTRL CLKSEL MASK */ +#define IPU1_CLKCTRL_CLKSEL_MASK BIT(24) + /* CM_L3INIT_SATA_CLKCTRL */ #define SATA_CLKCTRL_OPTFCLKEN_MASK(1 << 8) diff --git a/arch/arm/include/asm/omap_common.h b/arch/arm/include/asm/omap_common.h index de8fc99d0478..264a2e717a70 100644 --- a/arch/arm/include/asm/omap_common.h +++ b/arch/arm/include/asm/omap_common.h @@ -362,6 +362,10 @@ struct prcm_regs { /* IPU */ u32 cm_ipu_clkstctrl; u32 cm_ipu_i2c5_clkctrl; + u32 cm_ipu1_clkstctrl; + u32 cm_ipu1_ipu1_clkctrl; + u32 cm_ipu2_clkstctrl; + u32 cm_ipu2_ipu2_clkctrl; /*l3main1 edma*/ u32 cm_l3main1_tptc1_clkctrl; @@ -632,6 +636,12 @@ void do_disable_clocks(u32 const *clk_domains, u8 wait_for_disable); #endif /* CONFIG_OMAP44XX || CONFIG_OMAP54XX */ +void do_enable_ipu_clocks(u32 const *clk_domains, + u32 const *clk_modules_hw_auto, + u32 const *clk_modules_explicit_en, + u8 wait_for_enable); +void enable_ipu1_clocks(void); +void enable_ipu2_clocks(void); void setup_post_dividers(u32 const base, const struct dpll_params *params); u32 omap_ddr_clk(void); diff --git a/arch/arm/mach-omap2/boot-common.c b/arch/arm/mach-omap2/boot-common.c index fdb8b479ea01..afc358564191 100644 --- a/arch/arm/mach-omap2/boot-common.c +++ b/arch/arm/mach-omap2/boot-common.c @@ -10,6 +10,8 @@ #include #include #include +#include +#include #include #include #include @@ -19,9 +21,14 @@ #include #include #include +#include DECLARE_GLOBAL_DATA_PTR; +#define IPU1_LOAD_ADDR (0xa17ff000) +#define MAX_REMOTECORE_BIN_SIZE (8 * 0x10) +#define IPU2_LOAD_ADDR (IPU1_LOAD_ADDR + MAX_REMOTECORE_BIN_SIZE) + __weak u32 omap_sys_boot_device(void) { return BOOT_DEVICE_NONE; @@ -194,6 +201,91 @@ u32 spl_mmc_boot_mode(const u32 boot_device) return gd->arch.omap_boot_mode; } +int load_firmware(char *name_fw, u32 *loadaddr) +{ + struct udevice *fsdev; + int size = 0; + + if (!IS_ENABLED(CONFIG_FS_LOADER)) + return 0; + + if (!*loadaddr) + return 0; + + if (!uclass_get_device(UCLASS_FS_FIRMWARE_LOADER, 0, &fsdev)) { + size = request_firmware_into_buf(fsdev, name_fw, +(void *)*loadaddr, 0, 0); + } + + return size; +} + +void spl_boot_ipu(void) +{ + int ret, size; + u32 loadaddr = IPU1_LOAD_ADDR; + + if (!IS_ENABLED(CONFIG_SPL_BUILD) || + !IS_ENABLED(CONFIG_REMOTEPROC_TI_IPU)) + return; + + size = load_firmware("dra7-ipu1-fw.xem4", &loadaddr); + if (size <= 0) { + pr_err("Firmware loading failed\n"); + goto skip_ipu1; + } + + enable_ipu1_clocks(); + ret = rproc_dev_init(0); + if (ret) { + debug("%s: IPU1 failed to initialize on rproc (%d)\n", + __func__, ret); + goto skip_ipu1; + } + + ret = rproc_load(0, IPU1_LOAD_ADDR, 0x200); + if (ret) { + debug("%s: IPU1 failed to load on rproc (%d)\n", __func__, + ret); + goto skip_ipu1; + } + + debug("Starting IPU1...\n"); + + ret = rproc_start(0); + if (ret) + debug("%s: IPU1 failed to start (%d)\n", __func__, ret); + +skip_ipu1: + loadaddr = IPU2_LOAD_ADDR; + size = load_firmware("dra7-ipu2-fw.x
[PATCH v3 02/11] reset: dra7: Add a reset driver
From: Keerthy Add a reset driver to bring IPs out of reset. Signed-off-by: Keerthy [Amjad: reset_ops structure member "free" has been renamed to "rfree", use the latter instead] Signed-off-by: Amjad Ouled-Ameur --- (no changes since v1) MAINTAINERS| 1 + drivers/reset/Kconfig | 6 +++ drivers/reset/Makefile | 1 + drivers/reset/reset-dra7.c | 97 ++ 4 files changed, 105 insertions(+) create mode 100644 drivers/reset/reset-dra7.c diff --git a/MAINTAINERS b/MAINTAINERS index 38c68ee87d41..bd9cc4107cbe 100644 --- a/MAINTAINERS +++ b/MAINTAINERS @@ -536,6 +536,7 @@ F: drivers/ram/k3* F: drivers/remoteproc/k3_system_controller.c F: drivers/remoteproc/pruc_rpoc.c F: drivers/remoteproc/ti* +F: drivers/reset/reset-dra7.c F: drivers/reset/reset-ti-sci.c F: drivers/rtc/davinci.c F: drivers/serial/serial_omap.c diff --git a/drivers/reset/Kconfig b/drivers/reset/Kconfig index d73daf5e3189..b57714111b5a 100644 --- a/drivers/reset/Kconfig +++ b/drivers/reset/Kconfig @@ -206,4 +206,10 @@ config RESET_ZYNQMP passing request via Xilinx firmware interface to TF-A and PMU firmware. +config RESET_DRA7 + bool "Support for TI's DRA7 Reset driver" + depends on DM_RESET + help + Support for TI DRA7-RESET subsystem. Basic Assert/Deassert + is supported. endmenu diff --git a/drivers/reset/Makefile b/drivers/reset/Makefile index d69486bdeb9e..97e3a782c0d8 100644 --- a/drivers/reset/Makefile +++ b/drivers/reset/Makefile @@ -30,3 +30,4 @@ obj-$(CONFIG_RESET_SYSCON) += reset-syscon.o obj-$(CONFIG_RESET_RASPBERRYPI) += reset-raspberrypi.o obj-$(CONFIG_RESET_SCMI) += reset-scmi.o obj-$(CONFIG_RESET_ZYNQMP) += reset-zynqmp.o +obj-$(CONFIG_RESET_DRA7) += reset-dra7.o diff --git a/drivers/reset/reset-dra7.c b/drivers/reset/reset-dra7.c new file mode 100644 index ..585f8323c52e --- /dev/null +++ b/drivers/reset/reset-dra7.c @@ -0,0 +1,97 @@ +// SPDX-License-Identifier: GPL-2.0 +/* + * Texas Instruments DRA7 reset driver + * + * Copyright (C) 2019 Texas Instruments Incorporated - http://www.ti.com/ + * Author: Keerthy + */ + +#include +#include +#include +#include +#include + +struct dra7_reset_priv { + u32 rstctrl; + u32 rstst; + u8 nreset; +}; + +static int dra7_reset_request(struct reset_ctl *reset_ctl) +{ + return 0; +} + +static int dra7_reset_free(struct reset_ctl *reset_ctl) +{ + return 0; +} + +static inline void dra7_reset_rmw(u32 addr, u32 value, u32 mask) +{ + writel(((readl(addr) & (~mask)) | (value & mask)), addr); +} + +static int dra7_reset_deassert(struct reset_ctl *reset_ctl) +{ + struct dra7_reset_priv *priv = dev_get_priv(reset_ctl->dev); + int mask = 1 << reset_ctl->id; + + if (reset_ctl->id < 0 || reset_ctl->id >= priv->nreset) + return -EINVAL; + + dra7_reset_rmw(priv->rstctrl, 0x0, mask); + + while ((readl(priv->rstst) & mask) != mask) + ; + + return 0; +} + +static int dra7_reset_assert(struct reset_ctl *reset_ctl) +{ + struct dra7_reset_priv *priv = dev_get_priv(reset_ctl->dev); + int mask = 1 << reset_ctl->id; + + if (reset_ctl->id < 0 || reset_ctl->id >= priv->nreset) + return -EINVAL; + + dra7_reset_rmw(priv->rstctrl, mask, 0x0); + + return 0; +} + +struct reset_ops dra7_reset_ops = { + .request = dra7_reset_request, + .rfree = dra7_reset_free, + .rst_assert = dra7_reset_assert, + .rst_deassert = dra7_reset_deassert, +}; + +static const struct udevice_id dra7_reset_ids[] = { + { .compatible = "ti,dra7-reset" }, + { } +}; + +static int dra7_reset_probe(struct udevice *dev) +{ + struct dra7_reset_priv *priv = dev_get_priv(dev); + + priv->rstctrl = dev_read_addr(dev); + priv->rstst = priv->rstctrl + 0x4; + priv->nreset = dev_read_u32_default(dev, "ti,nresets", 1); + + dev_info(dev, "dra7-reset successfully probed %s\n", dev->name); + + return 0; +} + +U_BOOT_DRIVER(dra7_reset) = { + .name = "dra7_reset", + .id = UCLASS_RESET, + .of_match = dra7_reset_ids, + .probe = dra7_reset_probe, + .ops = &dra7_reset_ops, + .priv_auto = sizeof(struct dra7_reset_priv), +}; -- 2.25.1
[PATCH v3 01/11] configs: dra7xx_evm: Increase the size of SPL_MULTI_DTB_FIT
Expand SPL_MULTI_DTB_FIT to accommodate new SPL IPU nodes. Signed-off-by: Amjad Ouled-Ameur --- (no changes since v1) configs/dra7xx_evm_defconfig | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/configs/dra7xx_evm_defconfig b/configs/dra7xx_evm_defconfig index d1aa91d676e1..d3a1d3e4d334 100644 --- a/configs/dra7xx_evm_defconfig +++ b/configs/dra7xx_evm_defconfig @@ -52,7 +52,7 @@ CONFIG_OF_CONTROL=y CONFIG_SPL_OF_CONTROL=y CONFIG_OF_LIST="dra7-evm dra72-evm dra72-evm-revc dra71-evm dra76-evm" CONFIG_SPL_MULTI_DTB_FIT=y -CONFIG_SPL_MULTI_DTB_FIT_UNCOMPRESS_SZ=0xA000 +CONFIG_SPL_MULTI_DTB_FIT_UNCOMPRESS_SZ=0x1 CONFIG_OF_SPL_REMOVE_PROPS="clocks clock-names interrupt-parent" CONFIG_ENV_OVERWRITE=y # CONFIG_ENV_IS_IN_FAT is not set -- 2.25.1
[PATCH v3 00/11] dra7: bring up and support IPU load/start
This patchset enables support for loading and starting IPU firmware, the following have been implemented: - Enable fs_loader compilation at SPL Level, that is necessary in order to load IPU firmware from /boot partition. - Define necessary related IPU dts nodes. - Add necessary drivers and helpers to bring up, load and start IPU firmware. The underlying patches are interdependent, therefore should be applied in the order they are numbered in this patchset. Tests: - Please find SPL, u-boot and kernel console logs in here [1] - At SPL stage, debug logs have been enabled to make sure that IPU1 and IPU2 are loaded and started properly. In fact, these two log messages are only displayed when the firmware has been loaded, and if no errors appear afterwards, it means that firmware started successfully as well: - Starting IPU1... - Starting IPU2... At U-boot stage, "rproc" command-line tool was used for the testing. In the logs [1], "rproc list" was run before and after IPU1 and IPU2 are initialized by "rproc init". The before run gave an empty list, while the after run listed successfully the two IPUs with their correct addresses: - 0 - Name:'ipu@5882' type:'internal memory mapped' - 1 - Name:'ipu@5502' type:'internal memory mapped' "rproc start" and "rproc stop" were also used for both IPU1 and IPU2, both were successful as no error logs were displayed. [0]: https://pastebin.com/QGUYSPRt These U-boot/SPL flags have been purposely enabled during tests to ensure IPU load/start work properly: - CONFIG_DM_RESET=y - CONFIG_RESET_DRA7=y - CONFIG_SPL_DM_RESET=y - CONFIG_FS_LOADER=y - CONFIG_SPL_FS_LOADER=y - CONFIG_SPL_DRIVERS_MISC_SUPPORT=y - CONFIG_REMOTEPROC_TI_IPU=y - CONFIG_SPL_REMOTEPROC=y - CONFIG_CMD_REMOTEPROC=y Changes in v3: - Add a new patch for dra7xx_evm to expand SPL_MULTI_DTB_FIT Changes in v2: - Add useful checks and remove redundant code. Amjad Ouled-Ameur (1): configs: dra7xx_evm: Increase the size of SPL_MULTI_DTB_FIT Keerthy (10): reset: dra7: Add a reset driver arm: mach-omap2: load/start remoteproc IPU1/IPU2 drivers: misc: Makefile: Enable fs_loader compilation at SPL Level linux: bitmap.h: Add find_next_zero_area function remoteproc: uclass: Add remoteproc resource handling helpers remoteproc: ipu: Add driver to bring up ipu dts: dra7-ipu-common-early-boot.dtsi: Add all the ipu early boot related nodes arm: dts: dra7: Add ipu and related nodes arm: dts: dra7*/am57xx-idk-evm-u-boot: Add ipu early boot DT changes dts: am57xx*: Add ipu early boot DT changes MAINTAINERS | 4 + .../dts/am57xx-beagle-x15-revb1-u-boot.dtsi | 7 + .../dts/am57xx-beagle-x15-revc-u-boot.dtsi| 7 + arch/arm/dts/am57xx-beagle-x15-u-boot.dtsi| 7 + arch/arm/dts/am57xx-cl-som-am57x-u-boot.dtsi | 7 + arch/arm/dts/am57xx-idk-common-u-boot.dtsi| 1 + arch/arm/dts/am57xx-sbc-am57x-u-boot.dtsi | 7 + arch/arm/dts/dra7-evm-u-boot.dtsi | 1 + arch/arm/dts/dra7-ipu-common-early-boot.dtsi | 113 +++ arch/arm/dts/dra7.dtsi| 45 +- arch/arm/dts/dra71-evm-u-boot.dtsi| 1 + arch/arm/dts/dra72-evm-revc-u-boot.dtsi | 1 + arch/arm/dts/dra76-evm-u-boot.dtsi| 1 + arch/arm/include/asm/arch-omap5/clock.h | 3 + arch/arm/include/asm/omap_common.h| 10 + arch/arm/mach-k3/common.c | 10 +- arch/arm/mach-omap2/boot-common.c | 95 +++ arch/arm/mach-omap2/clocks-common.c | 33 + arch/arm/mach-omap2/omap5/hw_data.c | 92 ++- arch/arm/mach-omap2/omap5/prcm-regs.c | 9 +- configs/dra7xx_evm_defconfig | 2 +- configs/j721e_evm_r5_defconfig| 1 + configs/j721e_hs_evm_r5_defconfig | 1 + drivers/misc/Kconfig | 9 + drivers/misc/Makefile | 2 +- drivers/remoteproc/Kconfig| 10 + drivers/remoteproc/Makefile | 1 + drivers/remoteproc/ipu_rproc.c| 759 ++ drivers/remoteproc/rproc-uclass.c | 534 drivers/reset/Kconfig | 6 + drivers/reset/Makefile| 1 + drivers/reset/reset-dra7.c| 97 +++ include/linux/bitmap.h| 26 + include/remoteproc.h | 384 - 34 files changed, 2269 insertions(+), 18 deletions(-) create mode 100644 arch/arm/dts/am57xx-beagle-x15-revb1-u-boot.dtsi create mode 100644 arch/arm/dts/am57xx-beagle-x15-revc-u-boot.dtsi create mode 100644 arch/arm/dts/am57xx-beagle-x15-u-boot.dtsi create mode 100644 arch/arm/dts/am57xx-cl-som-am57x-u-boot.dtsi create mode 100644 arch/arm/dts/am57xx-sbc-am57x-u-boot.dtsi create mode
Re: [PATCH v2 07/10] dts: dra7-ipu-common-early-boot.dtsi: Add all the ipu early boot related nodes
Hi Tom, On 11/10/2021 20:59, Tom Rini wrote: On Thu, Sep 30, 2021 at 06:21:08PM +0200, Amjad Ouled-Ameur wrote: From: Keerthy Add all the ipu early boot related nodes Signed-off-by: Keerthy Signed-off-by: Amjad Ouled-Ameur --- (no changes since v1) MAINTAINERS | 1 + arch/arm/dts/dra7-ipu-common-early-boot.dtsi | 113 +++ 2 files changed, 114 insertions(+) create mode 100644 arch/arm/dts/dra7-ipu-common-early-boot.dtsi This causes my J6 Eco board: CPU : DRA752-GP ES1.1 Model: TI DRA742 Board: DRA74x EVM REV G.0 to stop booting in SPL with no output. Thank you for reporting the issue. After debugging the j6eco board, I realized that board stops booting in SPL when new nodes with "u-boot,dm-spl;"property are added to the DTS. The issue seems to be unrelated to this patchset but rather to a SPL's DTS limitation on j6eco. I am currently looking into SPL's linker file and load addresses to understand better why SPL breaks. Regards, Amjad
Re: [PATCH v2] cmd: pxe_utils: sysboot: add label override support
Hi, Is there any news about this patch please ? Regards, Amjad On 25/11/2021 01:12, Simon Glass wrote: Hi Amjad, On Sat, 13 Nov 2021 at 06:09, Amjad Ouled-Ameur wrote: This will allow consumers to choose a pxe label at runtime instead of having to prompt the user. One good use-case for this, is choosing whether or not to apply a dtbo depending on the hardware configuration. e.g: for TI's AM335x EVM, it would be convenient to apply a particular dtbo only when the J9 jumper is on PRUSS mode. To achieve this, the pxe menu should have 2 labels, one with the dtbo and the other without, then the "pxe_label_override" env variable should point to the label with the dtbo at runtime only when the jumper is on PRUSS mode. This change can be used for different use-cases and bring more flexibilty to consumers who use sysboot/pxe_utils. if "pxe_label_override" is set but does not exist in the pxe menu, the code should fallback to the default label if given, and no failure is returned but rather a warning message. Signed-off-by: Amjad Ouled-Ameur --- Changes in v2: - Use !strcmp() instead of strcmp()==0 - Add "pxe_label_override" documentation boot/pxe_utils.c | 15 +++ doc/README.pxe | 6 ++ 2 files changed, 21 insertions(+) Reviewed-by: Simon Glass Can I suggest converting the doc to rST? Regards, Simon
[PATCH] configs: am43xx_hs_evm: Add SPL_USB_STORAGE Support
Enable CONFIG_SPL_USB_STORAGE to support UBS MSC boot support. Signed-off-by: Faiz Abbas Signed-off-by: Amjad Ouled-Ameur --- configs/am43xx_hs_evm_defconfig | 1 + 1 file changed, 1 insertion(+) diff --git a/configs/am43xx_hs_evm_defconfig b/configs/am43xx_hs_evm_defconfig index 3ff2e5b62204..d4bebd2c01e9 100644 --- a/configs/am43xx_hs_evm_defconfig +++ b/configs/am43xx_hs_evm_defconfig @@ -33,6 +33,7 @@ CONFIG_SPL_NAND_BASE=y CONFIG_SPL_NET=y CONFIG_SPL_NET_VCI_STRING="AM43xx U-Boot SPL" CONFIG_SPL_USB_HOST=y +CONFIG_SPL_USB_STORAGE=y CONFIG_SPL_USB_GADGET=y CONFIG_SPL_USB_ETHER=y CONFIG_SYS_I2C_EEPROM_ADDR_LEN=2 -- 2.25.1
[PATCH v2] cmd: pxe_utils: sysboot: add label override support
This will allow consumers to choose a pxe label at runtime instead of having to prompt the user. One good use-case for this, is choosing whether or not to apply a dtbo depending on the hardware configuration. e.g: for TI's AM335x EVM, it would be convenient to apply a particular dtbo only when the J9 jumper is on PRUSS mode. To achieve this, the pxe menu should have 2 labels, one with the dtbo and the other without, then the "pxe_label_override" env variable should point to the label with the dtbo at runtime only when the jumper is on PRUSS mode. This change can be used for different use-cases and bring more flexibilty to consumers who use sysboot/pxe_utils. if "pxe_label_override" is set but does not exist in the pxe menu, the code should fallback to the default label if given, and no failure is returned but rather a warning message. Signed-off-by: Amjad Ouled-Ameur --- Changes in v2: - Use !strcmp() instead of strcmp()==0 - Add "pxe_label_override" documentation boot/pxe_utils.c | 15 +++ doc/README.pxe | 6 ++ 2 files changed, 21 insertions(+) diff --git a/boot/pxe_utils.c b/boot/pxe_utils.c index a7a84f26c1d5..defc806fdc4f 100644 --- a/boot/pxe_utils.c +++ b/boot/pxe_utils.c @@ -1349,9 +1349,11 @@ static struct menu *pxe_menu_to_menu(struct pxe_menu *cfg) struct pxe_label *label; struct list_head *pos; struct menu *m; + char *label_override; int err; int i = 1; char *default_num = NULL; + char *override_num = NULL; /* * Create a menu and add items for all the labels. @@ -1361,6 +1363,8 @@ static struct menu *pxe_menu_to_menu(struct pxe_menu *cfg) if (!m) return NULL; + label_override = env_get("pxe_label_override"); + list_for_each(pos, &cfg->labels) { label = list_entry(pos, struct pxe_label, list); @@ -1372,6 +1376,17 @@ static struct menu *pxe_menu_to_menu(struct pxe_menu *cfg) if (cfg->default_label && (strcmp(label->name, cfg->default_label) == 0)) default_num = label->num; + if (label_override && !strcmp(label->name, label_override)) + override_num = label->num; + } + + + if (label_override) { + if (override_num) + default_num = override_num; + else + printf("Missing override pxe label: %s\n", + label_override); } /* diff --git a/doc/README.pxe b/doc/README.pxe index b67151ca510e..a1f0423adbec 100644 --- a/doc/README.pxe +++ b/doc/README.pxe @@ -92,6 +92,12 @@ pxe boot fdtoverlay_addr_r - location in RAM at which 'pxe boot' will temporarily store fdt overlay(s) before applying them to the fdt blob stored at 'fdt_addr_r'. + pxe_label_override - override label to be used, if exists, instead of the + default label. This will allow consumers to choose a pxe label at + runtime instead of having to prompt the user. If "pxe_label_override" is set + but does not exist in the pxe menu, pxe would fallback to the default label if + given, and no failure is returned but rather a warning message. + pxe file format === The pxe file format is nearly a subset of the PXELINUX file format; see -- 2.25.1
Re: [PATCH] cmd: pxe_utils: sysboot: add label override support
Hi Simon, On 06/11/2021 01:18, Amjad Ouled-Ameur wrote: Hi Simon, On 05/11/2021 03:02, Simon Glass wrote: Hi Amjad, On Fri, 22 Oct 2021 at 09:55, Amjad Ouled-Ameur wrote: This will allow consumers to choose a pxe label at runtime instead of having to prompt the user. One good use-case for this, is choosing whether or not to apply a dtbo depending on the hardware configuration. e.g: for TI's AM335x EVM, it would be convenient to apply a particular dtbo only when the J9 jumper is on PRUSS mode. To achieve this, the pxe menu should have 2 labels, one with the dtbo and the other without, then the "pxe_label_override" env variable should point to the label with the dtbo at runtime only when the jumper is on PRUSS mode. This change can be used for different use-cases and bring more flexibilty to consumers who use sysboot/pxe_utils. if "pxe_label_override" is set but does not exist in the pxe menu, the code should fallback to the default label if given, and no failure is returned but rather a warning message. Signed-off-by: Amjad Ouled-Ameur ---  cmd/pxe_utils.c | 15 +++  1 file changed, 15 insertions(+) Can we add this to the docs somewhere? This would be great, I think doc/README.pxe is the best place for it. Will send a V2 with the doc change, thank you for the suggestion. Regards, Amjad diff --git a/cmd/pxe_utils.c b/cmd/pxe_utils.c index 067c24e5ff4b..b1009f9c7547 100644 --- a/cmd/pxe_utils.c +++ b/cmd/pxe_utils.c @@ -1354,9 +1354,11 @@ static struct menu *pxe_menu_to_menu(struct pxe_menu *cfg) struct pxe_label *label; struct list_head *pos; struct menu *m; +  char *label_override; int err; int i = 1; char *default_num = NULL; +  char *override_num = NULL; /*  * Create a menu and add items for all the labels. @@ -1367,6 +1369,8 @@ static struct menu *pxe_menu_to_menu(struct pxe_menu *cfg) if (!m) return NULL; +  label_override = env_get("pxe_label_override"); + list_for_each(pos, &cfg->labels) { label = list_entry(pos, struct pxe_label, list); @@ -1375,11 +1379,22 @@ static struct menu *pxe_menu_to_menu(struct pxe_menu *cfg) menu_destroy(m); return NULL; } +  if (label_override && +  (strcmp(label->name, label_override) == 0)) !strcmp() Why !strcmp() and not strcmp() ? Regards, Amjad +  override_num = label->num; if (cfg->default_label && (strcmp(label->name, cfg->default_label) == 0)) default_num = label->num; } +  if (label_override) { +  if (override_num) +  default_num = override_num; +  else +  printf("Missing override pxe label: %s\n", +  label_override); +  } + /*  * After we've created items for each label in the menu, set the  * menu's default label if one was specified. -- 2.25.1 Regards, Simon
Re: [PATCH] cmd: pxe_utils: sysboot: add label override support
Hi Simon, On 05/11/2021 03:02, Simon Glass wrote: Hi Amjad, On Fri, 22 Oct 2021 at 09:55, Amjad Ouled-Ameur wrote: This will allow consumers to choose a pxe label at runtime instead of having to prompt the user. One good use-case for this, is choosing whether or not to apply a dtbo depending on the hardware configuration. e.g: for TI's AM335x EVM, it would be convenient to apply a particular dtbo only when the J9 jumper is on PRUSS mode. To achieve this, the pxe menu should have 2 labels, one with the dtbo and the other without, then the "pxe_label_override" env variable should point to the label with the dtbo at runtime only when the jumper is on PRUSS mode. This change can be used for different use-cases and bring more flexibilty to consumers who use sysboot/pxe_utils. if "pxe_label_override" is set but does not exist in the pxe menu, the code should fallback to the default label if given, and no failure is returned but rather a warning message. Signed-off-by: Amjad Ouled-Ameur --- cmd/pxe_utils.c | 15 +++ 1 file changed, 15 insertions(+) Can we add this to the docs somewhere? This would be great, I think doc/README.pxe is the best place for it. Will send a V2 with the doc change, thank you for the suggestion. Regards, Amjad diff --git a/cmd/pxe_utils.c b/cmd/pxe_utils.c index 067c24e5ff4b..b1009f9c7547 100644 --- a/cmd/pxe_utils.c +++ b/cmd/pxe_utils.c @@ -1354,9 +1354,11 @@ static struct menu *pxe_menu_to_menu(struct pxe_menu *cfg) struct pxe_label *label; struct list_head *pos; struct menu *m; + char *label_override; int err; int i = 1; char *default_num = NULL; + char *override_num = NULL; /* * Create a menu and add items for all the labels. @@ -1367,6 +1369,8 @@ static struct menu *pxe_menu_to_menu(struct pxe_menu *cfg) if (!m) return NULL; + label_override = env_get("pxe_label_override"); + list_for_each(pos, &cfg->labels) { label = list_entry(pos, struct pxe_label, list); @@ -1375,11 +1379,22 @@ static struct menu *pxe_menu_to_menu(struct pxe_menu *cfg) menu_destroy(m); return NULL; } + if (label_override && + (strcmp(label->name, label_override) == 0)) !strcmp() + override_num = label->num; if (cfg->default_label && (strcmp(label->name, cfg->default_label) == 0)) default_num = label->num; } + if (label_override) { + if (override_num) + default_num = override_num; + else + printf("Missing override pxe label: %s\n", + label_override); + } + /* * After we've created items for each label in the menu, set the * menu's default label if one was specified. -- 2.25.1 Regards, Simon
[PATCH] board: ti: am335x: Choose CPSW or PRUSS configuration based on jumper setting
The am335x-ice-v2 board's Ethernet ports can be configured in 'MII' or 'RMII' mode to be connected to 'PRUSS' or 'CPSW' Ethernet subsystems. This patch sets the environment variable 'ice_mii' to 'mii' or 'rmii' accordingly. Based on that we choose the appropriate board devicetree i.e. 'am335x-ice-v2.dtb' or 'am335x-ice-v2-prueth.dtb'. Since there are 2 Ethernet ports with 2 modes, there can be 4 configurations but for now we consider both ports in different modes to be an invalid configuration and prevent boot in that case. Signed-off-by: Roger Quadros [Amjad: use overlay instead of using new am335x-ice-v2-prueth.dtb] Signed-off-by: Amjad Ouled-Ameur --- This depends on the currently in-review patch [0]. [0]: 20211022155526.54368-1-aouledam...@baylibre.com board/ti/am335x/board.c | 17 + include/configs/am335x_evm.h | 5 - include/configs/ti_armv7_common.h | 1 + 3 files changed, 22 insertions(+), 1 deletion(-) diff --git a/board/ti/am335x/board.c b/board/ti/am335x/board.c index e8555de9c937..b50e7a0fa466 100644 --- a/board/ti/am335x/board.c +++ b/board/ti/am335x/board.c @@ -11,6 +11,7 @@ #include #include #include +#include #include #include #include @@ -691,6 +692,8 @@ done: } #endif +static bool prueth_is_mii = true; + /* * Basic board specific setup. Pinmux has been handled already. */ @@ -710,6 +713,8 @@ int board_init(void) if (board_is_icev2()) { int rv; u32 reg; + bool eth0_is_mii = true; + bool eth1_is_mii = true; REQUEST_AND_SET_GPIO(GPIO_PR1_MII_CTRL); /* Make J19 status available on GPIO1_26 */ @@ -740,6 +745,7 @@ int board_init(void) writel(reg, GPIO0_IRQSTATUS1); /* clear irq */ /* RMII mode */ printf("ETH0, CPSW\n"); + eth0_is_mii = false; } else { /* MII mode */ printf("ETH0, PRU\n"); @@ -752,12 +758,21 @@ int board_init(void) /* RMII mode */ printf("ETH1, CPSW\n"); gpio_set_value(GPIO_MUX_MII_CTRL, 1); + eth1_is_mii = false; } else { /* MII mode */ printf("ETH1, PRU\n"); cdce913_data.pdiv2 = 4; /* 25MHz PHY clk */ } + if (eth0_is_mii != eth1_is_mii) { + printf("Unsupported Ethernet port configuration\n"); + printf("Both ports must be set as RMII or MII\n"); + hang(); + } + + prueth_is_mii = eth0_is_mii; + /* disable rising edge IRQs */ reg = readl(GPIO0_RISINGDETECT) & ~BIT(11); writel(reg, GPIO0_RISINGDETECT); @@ -852,6 +867,8 @@ int board_late_init(void) if (is_valid_ethaddr(mac_addr)) eth_env_set_enetaddr("eth1addr", mac_addr); } + + env_set("ice_mii", prueth_is_mii ? "mii" : "rmii"); #endif if (!env_get("serial#")) { diff --git a/include/configs/am335x_evm.h b/include/configs/am335x_evm.h index 7fb1b3a3e3fa..0f340806efc9 100644 --- a/include/configs/am335x_evm.h +++ b/include/configs/am335x_evm.h @@ -143,7 +143,10 @@ "if test $board_name = A335X_SK; then " \ "setenv fdtfile am335x-evmsk.dtb; fi; " \ "if test $board_name = A335_ICE; then " \ - "setenv fdtfile am335x-icev2.dtb; fi; " \ + "setenv fdtfile am335x-icev2.dtb; " \ + "if test $ice_mii = mii; then " \ + "setenv pxe_label_override Pruss; fi;" \ + "fi; " \ "if test $fdtfile = undefined; then " \ "echo WARNING: Could not determine device tree to use; fi; \0" \ "init_console=" \ diff --git a/include/configs/ti_armv7_common.h b/include/configs/ti_armv7_common.h index fa48cd2818ce..797e1211980d 100644 --- a/include/configs/ti_armv7_common.h +++ b/include/configs/ti_armv7_common.h @@ -37,6 +37,7 @@ "fdtaddr=0x8800\0" \ "dtboaddr=0x8900\0" \ "fdt_addr_r=0x8800\0" \ + "fdtoverlay_addr_r=0x8900\0" \ "rdaddr=0x8808\0" \ "ramdisk_addr_r=0x8808\0" \ "scriptaddr=0x8000\0" \ -- 2.25.1
[PATCH] cmd: pxe_utils: sysboot: add label override support
This will allow consumers to choose a pxe label at runtime instead of having to prompt the user. One good use-case for this, is choosing whether or not to apply a dtbo depending on the hardware configuration. e.g: for TI's AM335x EVM, it would be convenient to apply a particular dtbo only when the J9 jumper is on PRUSS mode. To achieve this, the pxe menu should have 2 labels, one with the dtbo and the other without, then the "pxe_label_override" env variable should point to the label with the dtbo at runtime only when the jumper is on PRUSS mode. This change can be used for different use-cases and bring more flexibilty to consumers who use sysboot/pxe_utils. if "pxe_label_override" is set but does not exist in the pxe menu, the code should fallback to the default label if given, and no failure is returned but rather a warning message. Signed-off-by: Amjad Ouled-Ameur --- cmd/pxe_utils.c | 15 +++ 1 file changed, 15 insertions(+) diff --git a/cmd/pxe_utils.c b/cmd/pxe_utils.c index 067c24e5ff4b..b1009f9c7547 100644 --- a/cmd/pxe_utils.c +++ b/cmd/pxe_utils.c @@ -1354,9 +1354,11 @@ static struct menu *pxe_menu_to_menu(struct pxe_menu *cfg) struct pxe_label *label; struct list_head *pos; struct menu *m; + char *label_override; int err; int i = 1; char *default_num = NULL; + char *override_num = NULL; /* * Create a menu and add items for all the labels. @@ -1367,6 +1369,8 @@ static struct menu *pxe_menu_to_menu(struct pxe_menu *cfg) if (!m) return NULL; + label_override = env_get("pxe_label_override"); + list_for_each(pos, &cfg->labels) { label = list_entry(pos, struct pxe_label, list); @@ -1375,11 +1379,22 @@ static struct menu *pxe_menu_to_menu(struct pxe_menu *cfg) menu_destroy(m); return NULL; } + if (label_override && + (strcmp(label->name, label_override) == 0)) + override_num = label->num; if (cfg->default_label && (strcmp(label->name, cfg->default_label) == 0)) default_num = label->num; } + if (label_override) { + if (override_num) + default_num = override_num; + else + printf("Missing override pxe label: %s\n", + label_override); + } + /* * After we've created items for each label in the menu, set the * menu's default label if one was specified. -- 2.25.1
[PATCH] configs: am335x_evm: enable CONFIG_CLK_TI_CTRL
This enables the clock controller driver support on TI's SoCs. This will fix this GPIO issue at boot time: request_and_set_gpio: Unable to request GPIO_PR1_MII_CTRL request_and_set_gpio: Unable to request GPIO_MUX_MII_CTRL request_and_set_gpio: Unable to request GPIO_FET_SWITCH_CTRL request_and_set_gpio: Unable to request GPIO_PHY_RESET This issue comes from the fact that the clock controller is not probed. Enable the TI's clock controller driver support to solve this. Signed-off-by: Amjad Ouled-Ameur --- configs/am335x_evm_defconfig | 1 + 1 file changed, 1 insertion(+) diff --git a/configs/am335x_evm_defconfig b/configs/am335x_evm_defconfig index 0f938e7de35c..4dc5d0fe347a 100644 --- a/configs/am335x_evm_defconfig +++ b/configs/am335x_evm_defconfig @@ -48,6 +48,7 @@ CONFIG_BOOTP_SEND_HOSTNAME=y CONFIG_BOOTCOUNT_LIMIT=y CONFIG_CLK=y CONFIG_CLK_CDCE9XX=y +CONFIG_CLK_TI_CTRL=y CONFIG_DFU_TFTP=y CONFIG_DFU_MMC=y CONFIG_DFU_NAND=y -- 2.25.1
[PATCH v2 05/10] remoteproc: uclass: Add remoteproc resource handling helpers
From: Keerthy Add remoteproc resource handling helpers. These functions are primarily to parse the resource table and to handle different types of resources. Carveout, devmem, trace & vring resources are handled. Signed-off-by: Keerthy [Amjad: fix redefinition of "struct resource_table" and compile warnings ] Signed-off-by: Amjad Ouled-Ameur --- Changes in v2: - Add useful checks and remove redundant code. drivers/remoteproc/rproc-uclass.c | 532 ++ include/remoteproc.h | 384 - 2 files changed, 915 insertions(+), 1 deletion(-) diff --git a/drivers/remoteproc/rproc-uclass.c b/drivers/remoteproc/rproc-uclass.c index 64c47c1e7225..6adff1f7d877 100644 --- a/drivers/remoteproc/rproc-uclass.c +++ b/drivers/remoteproc/rproc-uclass.c @@ -8,10 +8,12 @@ #define pr_fmt(fmt) "%s: " fmt, __func__ #include +#include #include #include #include #include +#include #include #include #include @@ -19,9 +21,21 @@ #include #include #include +#include DECLARE_GLOBAL_DATA_PTR; +struct resource_table { + u32 ver; + u32 num; + u32 reserved[2]; + u32 offset[0]; +} __packed; + +typedef int (*handle_resource_t) (struct udevice *, void *, int offset, int avail); + +static struct resource_table *rsc_table; + /** * for_each_remoteproc_device() - iterate through the list of rproc devices * @fn: check function to call per match, if this function returns fail, @@ -208,6 +222,80 @@ static int rproc_post_probe(struct udevice *dev) return 0; } +/** + * rproc_add_res() - After parsing the resource table add the mappings + * @dev: device we finished probing + * @mapping: rproc_mem_entry for the resource + * + * Return: if the remote proc driver has a add_res routine, invokes it and + * hands over the return value. overall, 0 if all went well, else appropriate + * error value. + */ +static int rproc_add_res(struct udevice *dev, struct rproc_mem_entry *mapping) +{ + const struct dm_rproc_ops *ops = rproc_get_ops(dev); + + if (!ops->add_res) + return -ENOSYS; + + return ops->add_res(dev, mapping); +} + +/** + * rproc_alloc_mem() - After parsing the resource table allocat mem + * @dev: device we finished probing + * @len: rproc_mem_entry for the resource + * @align: alignment for the resource + * + * Return: if the remote proc driver has a add_res routine, invokes it and + * hands over the return value. overall, 0 if all went well, else appropriate + * error value. + */ +static void *rproc_alloc_mem(struct udevice *dev, unsigned long len, +unsigned long align) +{ + const struct dm_rproc_ops *ops; + + ops = rproc_get_ops(dev); + if (!ops) { + debug("%s driver has no ops?\n", dev->name); + return NULL; + } + + if (ops->alloc_mem) + return ops->alloc_mem(dev, len, align); + + return NULL; +} + +/** + * rproc_config_pagetable() - Configure page table for remote processor + * @dev: device we finished probing + * @virt: Virtual address of the resource + * @phys: Physical address the resource + * @len: length the resource + * + * Return: if the remote proc driver has a add_res routine, invokes it and + * hands over the return value. overall, 0 if all went well, else appropriate + * error value. + */ +static int rproc_config_pagetable(struct udevice *dev, unsigned int virt, + unsigned int phys, unsigned int len) +{ + const struct dm_rproc_ops *ops; + + ops = rproc_get_ops(dev); + if (!ops) { + debug("%s driver has no ops?\n", dev->name); + return -EINVAL; + } + + if (ops->config_pagetable) + return ops->config_pagetable(dev, virt, phys, len); + + return 0; +} + UCLASS_DRIVER(rproc) = { .id = UCLASS_REMOTEPROC, .name = "remoteproc", @@ -438,3 +526,447 @@ int rproc_is_running(int id) { return _rproc_ops_wrapper(id, RPROC_RUNNING); }; + + +static int handle_trace(struct udevice *dev, struct fw_rsc_trace *rsc, + int offset, int avail) +{ + if (sizeof(*rsc) > avail) { + debug("trace rsc is truncated\n"); + return -EINVAL; + } + + /* +* make sure reserved bytes are zeroes +*/ + if (rsc->reserved) { + debug("trace rsc has non zero reserved bytes\n"); + return -EINVAL; + } + + debug("trace rsc: da 0x%x, len 0x%x\n", rsc->da, rsc->len); + + return 0; +} + +static int handle_devmem(struct udevice *dev, struct fw_rsc_devmem *rsc, +int offset, int avail) +{ + struct rproc_mem_entry *mapping; + + if (sizeof(*rsc) > avail) { + debug(&
[PATCH v2 10/10] dts: am57xx*: Add ipu early boot DT changes
From: Keerthy Add support for ipu early boot. Signed-off-by: Keerthy Signed-off-by: Amjad Ouled-Ameur --- (no changes since v1) MAINTAINERS | 1 + arch/arm/dts/am57xx-beagle-x15-revb1-u-boot.dtsi | 7 +++ arch/arm/dts/am57xx-beagle-x15-revc-u-boot.dtsi | 7 +++ arch/arm/dts/am57xx-beagle-x15-u-boot.dtsi | 7 +++ arch/arm/dts/am57xx-cl-som-am57x-u-boot.dtsi | 7 +++ arch/arm/dts/am57xx-sbc-am57x-u-boot.dtsi| 7 +++ 6 files changed, 36 insertions(+) create mode 100644 arch/arm/dts/am57xx-beagle-x15-revb1-u-boot.dtsi create mode 100644 arch/arm/dts/am57xx-beagle-x15-revc-u-boot.dtsi create mode 100644 arch/arm/dts/am57xx-beagle-x15-u-boot.dtsi create mode 100644 arch/arm/dts/am57xx-cl-som-am57x-u-boot.dtsi create mode 100644 arch/arm/dts/am57xx-sbc-am57x-u-boot.dtsi diff --git a/MAINTAINERS b/MAINTAINERS index ffaf2015ca5f..13c6c6e65915 100644 --- a/MAINTAINERS +++ b/MAINTAINERS @@ -493,6 +493,7 @@ F: arch/arm/mach-omap2/ F: arch/arm/include/asm/arch-omap*/ F: arch/arm/include/asm/ti-common/ F: arch/arm/dts/dra7* +F: arch/arm/dts/am57xx* F: board/ti/ F: drivers/dma/ti* F: drivers/firmware/ti_sci.* diff --git a/arch/arm/dts/am57xx-beagle-x15-revb1-u-boot.dtsi b/arch/arm/dts/am57xx-beagle-x15-revb1-u-boot.dtsi new file mode 100644 index ..49b16215e528 --- /dev/null +++ b/arch/arm/dts/am57xx-beagle-x15-revb1-u-boot.dtsi @@ -0,0 +1,7 @@ +// SPDX-License-Identifier: GPL-2.0+ +/* + * Copyright (C) 2019 Texas Instruments Incorporated - http://www.ti.com/ + */ + +#include "omap5-u-boot.dtsi" +#include "dra7-ipu-common-early-boot.dtsi" diff --git a/arch/arm/dts/am57xx-beagle-x15-revc-u-boot.dtsi b/arch/arm/dts/am57xx-beagle-x15-revc-u-boot.dtsi new file mode 100644 index ..49b16215e528 --- /dev/null +++ b/arch/arm/dts/am57xx-beagle-x15-revc-u-boot.dtsi @@ -0,0 +1,7 @@ +// SPDX-License-Identifier: GPL-2.0+ +/* + * Copyright (C) 2019 Texas Instruments Incorporated - http://www.ti.com/ + */ + +#include "omap5-u-boot.dtsi" +#include "dra7-ipu-common-early-boot.dtsi" diff --git a/arch/arm/dts/am57xx-beagle-x15-u-boot.dtsi b/arch/arm/dts/am57xx-beagle-x15-u-boot.dtsi new file mode 100644 index ..49b16215e528 --- /dev/null +++ b/arch/arm/dts/am57xx-beagle-x15-u-boot.dtsi @@ -0,0 +1,7 @@ +// SPDX-License-Identifier: GPL-2.0+ +/* + * Copyright (C) 2019 Texas Instruments Incorporated - http://www.ti.com/ + */ + +#include "omap5-u-boot.dtsi" +#include "dra7-ipu-common-early-boot.dtsi" diff --git a/arch/arm/dts/am57xx-cl-som-am57x-u-boot.dtsi b/arch/arm/dts/am57xx-cl-som-am57x-u-boot.dtsi new file mode 100644 index ..49b16215e528 --- /dev/null +++ b/arch/arm/dts/am57xx-cl-som-am57x-u-boot.dtsi @@ -0,0 +1,7 @@ +// SPDX-License-Identifier: GPL-2.0+ +/* + * Copyright (C) 2019 Texas Instruments Incorporated - http://www.ti.com/ + */ + +#include "omap5-u-boot.dtsi" +#include "dra7-ipu-common-early-boot.dtsi" diff --git a/arch/arm/dts/am57xx-sbc-am57x-u-boot.dtsi b/arch/arm/dts/am57xx-sbc-am57x-u-boot.dtsi new file mode 100644 index ..49b16215e528 --- /dev/null +++ b/arch/arm/dts/am57xx-sbc-am57x-u-boot.dtsi @@ -0,0 +1,7 @@ +// SPDX-License-Identifier: GPL-2.0+ +/* + * Copyright (C) 2019 Texas Instruments Incorporated - http://www.ti.com/ + */ + +#include "omap5-u-boot.dtsi" +#include "dra7-ipu-common-early-boot.dtsi" -- 2.25.1
[PATCH v2 09/10] arm: dts: dra7*/am57xx-idk-evm-u-boot: Add ipu early boot DT changes
From: Keerthy Add support for ipu early boot. Signed-off-by: Keerthy Signed-off-by: Amjad Ouled-Ameur --- (no changes since v1) arch/arm/dts/am57xx-idk-common-u-boot.dtsi | 1 + arch/arm/dts/dra7-evm-u-boot.dtsi | 1 + arch/arm/dts/dra71-evm-u-boot.dtsi | 1 + arch/arm/dts/dra72-evm-revc-u-boot.dtsi| 1 + arch/arm/dts/dra76-evm-u-boot.dtsi | 1 + 5 files changed, 5 insertions(+) diff --git a/arch/arm/dts/am57xx-idk-common-u-boot.dtsi b/arch/arm/dts/am57xx-idk-common-u-boot.dtsi index b07aea0048d5..d0ce469f9189 100644 --- a/arch/arm/dts/am57xx-idk-common-u-boot.dtsi +++ b/arch/arm/dts/am57xx-idk-common-u-boot.dtsi @@ -3,6 +3,7 @@ * Copyright (C) 2019 Texas Instruments Incorporated - http://www.ti.com/ */ #include "omap5-u-boot.dtsi" +#include "dra7-ipu-common-early-boot.dtsi" / { xtal25mhz: xtal25mhz { diff --git a/arch/arm/dts/dra7-evm-u-boot.dtsi b/arch/arm/dts/dra7-evm-u-boot.dtsi index f06c701dbd1f..5622512b2401 100644 --- a/arch/arm/dts/dra7-evm-u-boot.dtsi +++ b/arch/arm/dts/dra7-evm-u-boot.dtsi @@ -4,6 +4,7 @@ */ #include "omap5-u-boot.dtsi" +#include "dra7-ipu-common-early-boot.dtsi" &pcf_gpio_21{ u-boot,i2c-offset-len = <0>; diff --git a/arch/arm/dts/dra71-evm-u-boot.dtsi b/arch/arm/dts/dra71-evm-u-boot.dtsi index b56d4fc9d896..40443da5c855 100644 --- a/arch/arm/dts/dra71-evm-u-boot.dtsi +++ b/arch/arm/dts/dra71-evm-u-boot.dtsi @@ -4,6 +4,7 @@ */ #include "omap5-u-boot.dtsi" +#include "dra7-ipu-common-early-boot.dtsi" &pcf_gpio_21{ u-boot,i2c-offset-len = <0>; diff --git a/arch/arm/dts/dra72-evm-revc-u-boot.dtsi b/arch/arm/dts/dra72-evm-revc-u-boot.dtsi index b56d4fc9d896..40443da5c855 100644 --- a/arch/arm/dts/dra72-evm-revc-u-boot.dtsi +++ b/arch/arm/dts/dra72-evm-revc-u-boot.dtsi @@ -4,6 +4,7 @@ */ #include "omap5-u-boot.dtsi" +#include "dra7-ipu-common-early-boot.dtsi" &pcf_gpio_21{ u-boot,i2c-offset-len = <0>; diff --git a/arch/arm/dts/dra76-evm-u-boot.dtsi b/arch/arm/dts/dra76-evm-u-boot.dtsi index a4dfbe7e601a..5fae6ba91936 100644 --- a/arch/arm/dts/dra76-evm-u-boot.dtsi +++ b/arch/arm/dts/dra76-evm-u-boot.dtsi @@ -4,6 +4,7 @@ */ #include "omap5-u-boot.dtsi" +#include "dra7-ipu-common-early-boot.dtsi" &cpsw_emac0 { phy-handle = <&dp83867_0>; -- 2.25.1
[PATCH v2 06/10] remoteproc: ipu: Add driver to bring up ipu
From: Keerthy The driver enables IPU support. Basically enables the clocks, timers, watchdog timers and bare minimal MMU and supports loading the firmware from mmc. Signed-off-by: Keerthy [Amjad: fix compile warnings] Signed-off-by: Amjad Ouled-Ameur --- (no changes since v1) MAINTAINERS| 1 + drivers/remoteproc/Kconfig | 10 + drivers/remoteproc/Makefile| 1 + drivers/remoteproc/ipu_rproc.c | 759 + 4 files changed, 771 insertions(+) create mode 100644 drivers/remoteproc/ipu_rproc.c diff --git a/MAINTAINERS b/MAINTAINERS index ec586ec5466f..f7ec528af73a 100644 --- a/MAINTAINERS +++ b/MAINTAINERS @@ -508,6 +508,7 @@ F: drivers/ram/k3* F: drivers/remoteproc/k3_system_controller.c F: drivers/remoteproc/pruc_rpoc.c F: drivers/remoteproc/ti* +F: drivers/remoteproc/ipu_rproc.c F: drivers/reset/reset-ti-sci.c F: drivers/reset/reset-dra7.c F: drivers/rtc/davinci.c diff --git a/drivers/remoteproc/Kconfig b/drivers/remoteproc/Kconfig index 24e536463bbd..27e4a60ff5b1 100644 --- a/drivers/remoteproc/Kconfig +++ b/drivers/remoteproc/Kconfig @@ -92,4 +92,14 @@ config REMOTEPROC_TI_PRU help Say 'y' here to add support for TI' K3 remoteproc driver. +config REMOTEPROC_TI_IPU + bool "Support for TI's K3 based IPU remoteproc driver" + select REMOTEPROC + depends on DM + depends on SPL_DRIVERS_MISC + depends on SPL_FS_LOADER + depends on OF_CONTROL + help + Say 'y' here to add support for TI' K3 remoteproc driver. + endmenu diff --git a/drivers/remoteproc/Makefile b/drivers/remoteproc/Makefile index f0e83451d66f..fbe9c172bc04 100644 --- a/drivers/remoteproc/Makefile +++ b/drivers/remoteproc/Makefile @@ -15,3 +15,4 @@ obj-$(CONFIG_REMOTEPROC_TI_K3_DSP) += ti_k3_dsp_rproc.o obj-$(CONFIG_REMOTEPROC_TI_K3_R5F) += ti_k3_r5f_rproc.o obj-$(CONFIG_REMOTEPROC_TI_POWER) += ti_power_proc.o obj-$(CONFIG_REMOTEPROC_TI_PRU) += pru_rproc.o +obj-$(CONFIG_REMOTEPROC_TI_IPU) += ipu_rproc.o diff --git a/drivers/remoteproc/ipu_rproc.c b/drivers/remoteproc/ipu_rproc.c new file mode 100644 index ..b4a06bc955a9 --- /dev/null +++ b/drivers/remoteproc/ipu_rproc.c @@ -0,0 +1,759 @@ +// SPDX-License-Identifier: GPL-2.0 +/* + * IPU remoteproc driver for various SoCs + * + * Copyright (C) 2019 Texas Instruments Incorporated - http://www.ti.com/ + * Angela Stegmaier + * Venkateswara Rao Mandela + * Keerthy + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#define IPU1_LOAD_ADDR (0xa17ff000) +#define MAX_REMOTECORE_BIN_SIZE (8 * 0x10) + +enum ipu_num { + IPU1 = 0, + IPU2, + RPROC_END_ENUMS, +}; + +#define IPU2_LOAD_ADDR (IPU1_LOAD_ADDR + MAX_REMOTECORE_BIN_SIZE) + +#define PAGE_SHIFT 12 +#define PAGESIZE_1M 0x0 +#define PAGESIZE_64K 0x1 +#define PAGESIZE_4K 0x2 +#define PAGESIZE_16M 0x3 +#define LE 0 +#define BE 1 +#define ELEMSIZE_8 0x0 +#define ELEMSIZE_16 0x1 +#define ELEMSIZE_32 0x2 +#define MIXED_TLB0x0 +#define MIXED_CPU0x1 + +#define PGT_SMALLPAGE_SIZE 0x1000 +#define PGT_LARGEPAGE_SIZE 0x0001 +#define PGT_SECTION_SIZE 0x0010 +#define PGT_SUPERSECTION_SIZE0x0100 + +#define PGT_L1_DESC_PAGE 0x1 +#define PGT_L1_DESC_SECTION 0x2 +#define PGT_L1_DESC_SUPERSECTION 0x40002 + +#define PGT_L1_DESC_PAGE_MASK0xfC00 +#define PGT_L1_DESC_SECTION_MASK 0xfff0 +#define PGT_L1_DESC_SUPERSECTION_MASK0xff00 + +#define PGT_L1_DESC_SMALLPAGE_INDEX_SHIFT12 +#define PGT_L1_DESC_LARGEPAGE_INDEX_SHIFT16 +#define PGT_L1_DESC_SECTION_INDEX_SHIFT 20 +#define PGT_L1_DESC_SUPERSECTION_INDEX_SHIFT 24 + +#define PGT_L2_DESC_SMALLPAGE 0x02 +#define PGT_L2_DESC_LARGEPAGE 0x01 + +#define PGT_L2_DESC_SMALLPAGE_MASK 0xf000 +#define PGT_L2_DESC_LARGEPAGE_MASK 0x + +/* + * The memory for the page tables (256 KB per IPU) is placed just before + * the carveout memories for the remote processors. 16 KB of memory is + * needed for the L1 page table (4096 entries * 4 bytes per 1 MB section). + * Any smaller page (64 KB or 4 KB) entries are supported through L2 page + * tables (1 KB per table). The remaining 2
[PATCH v2 08/10] arm: dts: dra7: Add ipu and related nodes
From: Keerthy Add ipu and the associated nodes. Signed-off-by: Keerthy Signed-off-by: Amjad Ouled-Ameur --- (no changes since v1) arch/arm/dts/dra7.dtsi | 45 +- 1 file changed, 44 insertions(+), 1 deletion(-) diff --git a/arch/arm/dts/dra7.dtsi b/arch/arm/dts/dra7.dtsi index fd1aea0b1b16..e2e958b36626 100644 --- a/arch/arm/dts/dra7.dtsi +++ b/arch/arm/dts/dra7.dtsi @@ -41,6 +41,8 @@ d_can0 = &dcan1; d_can1 = &dcan2; spi0 = &qspi; + remoteproc0 = &ipu1; + remoteproc1 = &ipu2; }; timer { @@ -263,9 +265,12 @@ }; prm: prm@6000 { - compatible = "ti,dra7-prm"; + compatible = "ti,dra7-prm", "simple-bus"; reg = <0x6000 0x3000>; interrupts = ; + #address-cells = <1>; + #size-cells = <1>; + ranges = <0 0x6000 0x3000>; prm_clocks: clocks { #address-cells = <1>; @@ -274,6 +279,20 @@ prm_clockdomains: clockdomains { }; + + ipu1_rst: ipu1_rst@510 { + compatible = "ti,dra7-reset"; + reg = <0x510 0x8>; + ti,nresets = <3>; + #reset-cells = <1>; + }; + + ipu2_rst: ipu2_rst@910 { + compatible = "ti,dra7-reset"; + reg = <0x910 0x8>; + ti,nresets = <3>; + #reset-cells = <1>; + }; }; scm_wkup: scm_conf@c000 { @@ -2032,6 +2051,30 @@ clocks = <&l3_iclk_div>; clock-names = "fck"; }; + + ipu1: ipu@5882 { + compatible = "ti,dra7-ipu"; + reg = <0x5882 0x1>; + reg-names = "l2ram"; + ti,hwmods = "ipu1"; + resets = <&ipu1_rst 0>, <&ipu1_rst 1>, <&ipu1_rst 2>; + iommus = <&mmu_ipu1>; + ti,rproc-standby-info = <0x4a005520>; + timers = <&timer11>; + watchdog-timers = <&timer7>, <&timer8>; + }; + + ipu2: ipu@5502 { + compatible = "ti,dra7-ipu"; + reg = <0x5502 0x1>; + reg-names = "l2ram"; + ti,hwmods = "ipu2"; + resets = <&ipu2_rst 0>, <&ipu2_rst 1>, <&ipu2_rst 2>; + iommus = <&mmu_ipu2>; + ti,rproc-standby-info = <0x4a008920>; + timers = <&timer3>; + watchdog-timers = <&timer4>, <&timer9>; + }; }; thermal_zones: thermal-zones { -- 2.25.1
[PATCH v2 07/10] dts: dra7-ipu-common-early-boot.dtsi: Add all the ipu early boot related nodes
From: Keerthy Add all the ipu early boot related nodes Signed-off-by: Keerthy Signed-off-by: Amjad Ouled-Ameur --- (no changes since v1) MAINTAINERS | 1 + arch/arm/dts/dra7-ipu-common-early-boot.dtsi | 113 +++ 2 files changed, 114 insertions(+) create mode 100644 arch/arm/dts/dra7-ipu-common-early-boot.dtsi diff --git a/MAINTAINERS b/MAINTAINERS index f7ec528af73a..ffaf2015ca5f 100644 --- a/MAINTAINERS +++ b/MAINTAINERS @@ -492,6 +492,7 @@ F: arch/arm/mach-keystone/ F: arch/arm/mach-omap2/ F: arch/arm/include/asm/arch-omap*/ F: arch/arm/include/asm/ti-common/ +F: arch/arm/dts/dra7* F: board/ti/ F: drivers/dma/ti* F: drivers/firmware/ti_sci.* diff --git a/arch/arm/dts/dra7-ipu-common-early-boot.dtsi b/arch/arm/dts/dra7-ipu-common-early-boot.dtsi new file mode 100644 index ..ec6040ff93eb --- /dev/null +++ b/arch/arm/dts/dra7-ipu-common-early-boot.dtsi @@ -0,0 +1,113 @@ +// SPDX-License-Identifier: GPL-2.0+ +/* + * Copyright (C) 2019 Texas Instruments Incorporated - http://www.ti.com/ + */ + +/ { + chosen { + firmware-loader = &fs_loader0; + }; + + fs_loader0: fs_loader@0 { + u-boot,dm-pre-reloc; + compatible = "u-boot,fs-loader"; + phandlepart = <&mmc1 1>; + }; + + reserved-memory { + #address-cells = <2>; + #size-cells = <2>; + ranges; + u-boot,dm-spl; + + ipu2_memory_region: ipu2-memory@9580 { + compatible = "shared-dma-pool"; + reg = <0x0 0x9580 0x0 0x380>; + reusable; + status = "okay"; + u-boot,dm-spl; + }; + + ipu1_memory_region: ipu1-memory@9d00 { + compatible = "shared-dma-pool"; + reg = <0x0 0x9d00 0x0 0x200>; + reusable; + status = "okay"; + u-boot,dm-spl; + }; + + ipu1_pgtbl: ipu1-pgtbl@9570 { + reg = <0x0 0x9570 0x0 0x4>; + no-map; + u-boot,dm-spl; + }; + + ipu2_pgtbl: ipu2-pgtbl@9574 { + reg = <0x0 0x9574 0x0 0x4>; + no-map; + u-boot,dm-spl; + }; + }; +}; + +&timer3 { + u-boot,dm-spl; +}; + +&timer4 { + u-boot,dm-spl; +}; + +&timer7 { + u-boot,dm-spl; +}; + +&timer8 { + u-boot,dm-spl; +}; + +&timer9 { + u-boot,dm-spl; +}; + +&timer11 { + u-boot,dm-spl; +}; + +&mmu_ipu1 { + u-boot,dm-spl; +}; + +&mmu_ipu2 { + u-boot,dm-spl; +}; + +&ipu1 { + status = "okay"; + memory-region = <&ipu1_memory_region>; + pg-tbl = <&ipu1_pgtbl>; + u-boot,dm-spl; +}; + +&ipu2 { + status = "okay"; + memory-region = <&ipu2_memory_region>; + pg-tbl = <&ipu2_pgtbl>; + u-boot,dm-spl; +}; + +&l4_wkup { + u-boot,dm-spl; +}; + +&prm { + u-boot,dm-spl; +}; + +&ipu1_rst { + u-boot,dm-spl; +}; + +&ipu2_rst { + u-boot,dm-spl; +}; -- 2.25.1
[PATCH v2 04/10] linux: bitmap.h: Add find_next_zero_area function
From: Keerthy Add find_next_zero_area to fetch the next zero area in the map. Signed-off-by: Keerthy Signed-off-by: Amjad Ouled-Ameur --- (no changes since v1) include/linux/bitmap.h | 26 ++ 1 file changed, 26 insertions(+) diff --git a/include/linux/bitmap.h b/include/linux/bitmap.h index dae4225be549..0a8503af9f14 100644 --- a/include/linux/bitmap.h +++ b/include/linux/bitmap.h @@ -159,6 +159,32 @@ static inline unsigned long find_first_bit(const unsigned long *addr, unsigned l (bit) < (size);\ (bit) = find_next_bit((addr), (size), (bit) + 1)) +static inline unsigned long +bitmap_find_next_zero_area(unsigned long *map, + unsigned long size, + unsigned long start, + unsigned int nr, unsigned long align_mask) +{ + unsigned long index, end, i; +again: + index = find_next_zero_bit(map, size, start); + + /* +* Align allocation +*/ + index = (index + align_mask) & ~align_mask; + + end = index + nr; + if (end > size) + return end; + i = find_next_bit(map, end, index); + if (i < end) { + start = i + 1; + goto again; + } + return index; +} + static inline void bitmap_fill(unsigned long *dst, unsigned int nbits) { if (small_const_nbits(nbits)) { -- 2.25.1
[PATCH v2 03/10] drivers: misc: Makefile: Enable fs_loader compilation at SPL Level
From: Keerthy Enable fs_loader compilation at SPL Level. Signed-off-by: Keerthy [Amjad: fix compilation failures for J721e platform] Signed-off-by: Amjad Ouled-Ameur --- (no changes since v1) arch/arm/mach-k3/common.c | 10 +++--- configs/j721e_evm_r5_defconfig| 1 + configs/j721e_hs_evm_r5_defconfig | 1 + drivers/misc/Kconfig | 9 + drivers/misc/Makefile | 2 +- 5 files changed, 15 insertions(+), 8 deletions(-) diff --git a/arch/arm/mach-k3/common.c b/arch/arm/mach-k3/common.c index 2666cd2d7b17..dddad8e3b056 100644 --- a/arch/arm/mach-k3/common.c +++ b/arch/arm/mach-k3/common.c @@ -156,13 +156,15 @@ void init_env(void) #endif } -#ifdef CONFIG_FS_LOADER int load_firmware(char *name_fw, char *name_loadaddr, u32 *loadaddr) { struct udevice *fsdev; char *name = NULL; int size = 0; + if (!IS_ENABLED(CONFIG_FS_LOADER)) + return 0; + *loadaddr = 0; #ifdef CONFIG_SPL_ENV_SUPPORT switch (spl_boot_device()) { @@ -186,12 +188,6 @@ int load_firmware(char *name_fw, char *name_loadaddr, u32 *loadaddr) return size; } -#else -int load_firmware(char *name_fw, char *name_loadaddr, u32 *loadaddr) -{ - return 0; -} -#endif __weak void release_resources_for_core_shutdown(void) { diff --git a/configs/j721e_evm_r5_defconfig b/configs/j721e_evm_r5_defconfig index b5fd3bf23734..edc003f46b90 100644 --- a/configs/j721e_evm_r5_defconfig +++ b/configs/j721e_evm_r5_defconfig @@ -88,6 +88,7 @@ CONFIG_SYS_I2C_OMAP24XX=y CONFIG_DM_MAILBOX=y CONFIG_K3_SEC_PROXY=y CONFIG_FS_LOADER=y +CONFIG_SPL_FS_LOADER=y CONFIG_ESM_K3=y CONFIG_K3_AVS0=y CONFIG_ESM_PMIC=y diff --git a/configs/j721e_hs_evm_r5_defconfig b/configs/j721e_hs_evm_r5_defconfig index 3a8e0b1cd15b..6c3675c1726c 100644 --- a/configs/j721e_hs_evm_r5_defconfig +++ b/configs/j721e_hs_evm_r5_defconfig @@ -82,6 +82,7 @@ CONFIG_SYS_I2C_OMAP24XX=y CONFIG_DM_MAILBOX=y CONFIG_K3_SEC_PROXY=y CONFIG_FS_LOADER=y +CONFIG_SPL_FS_LOADER=y CONFIG_K3_AVS0=y CONFIG_MMC_SDHCI=y CONFIG_SPL_MMC_SDHCI_ADMA=y diff --git a/drivers/misc/Kconfig b/drivers/misc/Kconfig index 997b71322110..e6a1dc677d6e 100644 --- a/drivers/misc/Kconfig +++ b/drivers/misc/Kconfig @@ -468,6 +468,15 @@ config FS_LOADER The consumer driver would then use this loader to program whatever, ie. the FPGA device. +config SPL_FS_LOADER + bool "Enable loader driver for file system" + help + This is file system generic loader which can be used to load + the file image from the storage into target such as memory. + + The consumer driver would then use this loader to program whatever, + ie. the FPGA device. + config GDSYS_SOC bool "Enable gdsys SOC driver" depends on MISC diff --git a/drivers/misc/Makefile b/drivers/misc/Makefile index b64cd2a4de91..c7c95ee76767 100644 --- a/drivers/misc/Makefile +++ b/drivers/misc/Makefile @@ -37,7 +37,7 @@ obj-$(CONFIG_FSL_IFC) += fsl_ifc.o obj-$(CONFIG_FSL_IIM) += fsl_iim.o obj-$(CONFIG_FSL_MC9SDZ60) += mc9sdz60.o obj-$(CONFIG_FSL_SEC_MON) += fsl_sec_mon.o -obj-$(CONFIG_FS_LOADER) += fs_loader.o +obj-$(CONFIG_$(SPL_)FS_LOADER) += fs_loader.o obj-$(CONFIG_GDSYS_IOEP) += gdsys_ioep.o obj-$(CONFIG_GDSYS_RXAUI_CTRL) += gdsys_rxaui_ctrl.o obj-$(CONFIG_GDSYS_SOC) += gdsys_soc.o -- 2.25.1
[PATCH v2 01/10] reset: dra7: Add a reset driver
From: Keerthy Add a reset driver to bring IPs out of reset. Signed-off-by: Keerthy [Amjad: reset_ops structure member "free" has been renamed to "rfree", use the latter instead] Signed-off-by: Amjad Ouled-Ameur --- (no changes since v1) MAINTAINERS| 1 + drivers/reset/Kconfig | 6 +++ drivers/reset/Makefile | 1 + drivers/reset/reset-dra7.c | 97 ++ 4 files changed, 105 insertions(+) create mode 100644 drivers/reset/reset-dra7.c diff --git a/MAINTAINERS b/MAINTAINERS index 5370b550648e..ec586ec5466f 100644 --- a/MAINTAINERS +++ b/MAINTAINERS @@ -509,6 +509,7 @@ F: drivers/remoteproc/k3_system_controller.c F: drivers/remoteproc/pruc_rpoc.c F: drivers/remoteproc/ti* F: drivers/reset/reset-ti-sci.c +F: drivers/reset/reset-dra7.c F: drivers/rtc/davinci.c F: drivers/serial/serial_omap.c F: drivers/soc/ti/ diff --git a/drivers/reset/Kconfig b/drivers/reset/Kconfig index d73daf5e3189..b57714111b5a 100644 --- a/drivers/reset/Kconfig +++ b/drivers/reset/Kconfig @@ -206,4 +206,10 @@ config RESET_ZYNQMP passing request via Xilinx firmware interface to TF-A and PMU firmware. +config RESET_DRA7 + bool "Support for TI's DRA7 Reset driver" + depends on DM_RESET + help + Support for TI DRA7-RESET subsystem. Basic Assert/Deassert + is supported. endmenu diff --git a/drivers/reset/Makefile b/drivers/reset/Makefile index d69486bdeb9e..97e3a782c0d8 100644 --- a/drivers/reset/Makefile +++ b/drivers/reset/Makefile @@ -30,3 +30,4 @@ obj-$(CONFIG_RESET_SYSCON) += reset-syscon.o obj-$(CONFIG_RESET_RASPBERRYPI) += reset-raspberrypi.o obj-$(CONFIG_RESET_SCMI) += reset-scmi.o obj-$(CONFIG_RESET_ZYNQMP) += reset-zynqmp.o +obj-$(CONFIG_RESET_DRA7) += reset-dra7.o diff --git a/drivers/reset/reset-dra7.c b/drivers/reset/reset-dra7.c new file mode 100644 index ..585f8323c52e --- /dev/null +++ b/drivers/reset/reset-dra7.c @@ -0,0 +1,97 @@ +// SPDX-License-Identifier: GPL-2.0 +/* + * Texas Instruments DRA7 reset driver + * + * Copyright (C) 2019 Texas Instruments Incorporated - http://www.ti.com/ + * Author: Keerthy + */ + +#include +#include +#include +#include +#include + +struct dra7_reset_priv { + u32 rstctrl; + u32 rstst; + u8 nreset; +}; + +static int dra7_reset_request(struct reset_ctl *reset_ctl) +{ + return 0; +} + +static int dra7_reset_free(struct reset_ctl *reset_ctl) +{ + return 0; +} + +static inline void dra7_reset_rmw(u32 addr, u32 value, u32 mask) +{ + writel(((readl(addr) & (~mask)) | (value & mask)), addr); +} + +static int dra7_reset_deassert(struct reset_ctl *reset_ctl) +{ + struct dra7_reset_priv *priv = dev_get_priv(reset_ctl->dev); + int mask = 1 << reset_ctl->id; + + if (reset_ctl->id < 0 || reset_ctl->id >= priv->nreset) + return -EINVAL; + + dra7_reset_rmw(priv->rstctrl, 0x0, mask); + + while ((readl(priv->rstst) & mask) != mask) + ; + + return 0; +} + +static int dra7_reset_assert(struct reset_ctl *reset_ctl) +{ + struct dra7_reset_priv *priv = dev_get_priv(reset_ctl->dev); + int mask = 1 << reset_ctl->id; + + if (reset_ctl->id < 0 || reset_ctl->id >= priv->nreset) + return -EINVAL; + + dra7_reset_rmw(priv->rstctrl, mask, 0x0); + + return 0; +} + +struct reset_ops dra7_reset_ops = { + .request = dra7_reset_request, + .rfree = dra7_reset_free, + .rst_assert = dra7_reset_assert, + .rst_deassert = dra7_reset_deassert, +}; + +static const struct udevice_id dra7_reset_ids[] = { + { .compatible = "ti,dra7-reset" }, + { } +}; + +static int dra7_reset_probe(struct udevice *dev) +{ + struct dra7_reset_priv *priv = dev_get_priv(dev); + + priv->rstctrl = dev_read_addr(dev); + priv->rstst = priv->rstctrl + 0x4; + priv->nreset = dev_read_u32_default(dev, "ti,nresets", 1); + + dev_info(dev, "dra7-reset successfully probed %s\n", dev->name); + + return 0; +} + +U_BOOT_DRIVER(dra7_reset) = { + .name = "dra7_reset", + .id = UCLASS_RESET, + .of_match = dra7_reset_ids, + .probe = dra7_reset_probe, + .ops = &dra7_reset_ops, + .priv_auto = sizeof(struct dra7_reset_priv), +}; -- 2.25.1
[PATCH v2 02/10] arm: mach-omap2: load/start remoteproc IPU1/IPU2
From: Keerthy First check the presence of the ipu firmware in the boot partition. If present enable the ipu and the related clocks & then move on to load the firmware and eventually start remoteproc IPU1/IPU2. do_enable_clocks by default puts the clock domains into auto which does not work well with reset. Hence adding do_enable_ipu_clocks function. Signed-off-by: Keerthy [Amjad: fix IPU1_LOAD_ADDR and compile warnings] Signed-off-by: Amjad Ouled-Ameur --- (no changes since v1) arch/arm/include/asm/arch-omap5/clock.h | 3 + arch/arm/include/asm/omap_common.h | 10 +++ arch/arm/mach-omap2/boot-common.c | 95 + arch/arm/mach-omap2/clocks-common.c | 33 + arch/arm/mach-omap2/omap5/hw_data.c | 92 ++-- arch/arm/mach-omap2/omap5/prcm-regs.c | 9 ++- 6 files changed, 235 insertions(+), 7 deletions(-) diff --git a/arch/arm/include/asm/arch-omap5/clock.h b/arch/arm/include/asm/arch-omap5/clock.h index 87eb3f335ab0..a00626e357c9 100644 --- a/arch/arm/include/asm/arch-omap5/clock.h +++ b/arch/arm/include/asm/arch-omap5/clock.h @@ -135,6 +135,9 @@ #define HSMMC_CLKCTRL_CLKSEL_MASK (1 << 24) #define HSMMC_CLKCTRL_CLKSEL_DIV_MASK (3 << 25) +/* CM_IPU1_IPU1_CLKCTRL CLKSEL MASK */ +#define IPU1_CLKCTRL_CLKSEL_MASK BIT(24) + /* CM_L3INIT_SATA_CLKCTRL */ #define SATA_CLKCTRL_OPTFCLKEN_MASK(1 << 8) diff --git a/arch/arm/include/asm/omap_common.h b/arch/arm/include/asm/omap_common.h index de8fc99d0478..264a2e717a70 100644 --- a/arch/arm/include/asm/omap_common.h +++ b/arch/arm/include/asm/omap_common.h @@ -362,6 +362,10 @@ struct prcm_regs { /* IPU */ u32 cm_ipu_clkstctrl; u32 cm_ipu_i2c5_clkctrl; + u32 cm_ipu1_clkstctrl; + u32 cm_ipu1_ipu1_clkctrl; + u32 cm_ipu2_clkstctrl; + u32 cm_ipu2_ipu2_clkctrl; /*l3main1 edma*/ u32 cm_l3main1_tptc1_clkctrl; @@ -632,6 +636,12 @@ void do_disable_clocks(u32 const *clk_domains, u8 wait_for_disable); #endif /* CONFIG_OMAP44XX || CONFIG_OMAP54XX */ +void do_enable_ipu_clocks(u32 const *clk_domains, + u32 const *clk_modules_hw_auto, + u32 const *clk_modules_explicit_en, + u8 wait_for_enable); +void enable_ipu1_clocks(void); +void enable_ipu2_clocks(void); void setup_post_dividers(u32 const base, const struct dpll_params *params); u32 omap_ddr_clk(void); diff --git a/arch/arm/mach-omap2/boot-common.c b/arch/arm/mach-omap2/boot-common.c index 7cdf7f158981..2bf4aff74c3a 100644 --- a/arch/arm/mach-omap2/boot-common.c +++ b/arch/arm/mach-omap2/boot-common.c @@ -10,6 +10,8 @@ #include #include #include +#include +#include #include #include #include @@ -19,9 +21,14 @@ #include #include #include +#include DECLARE_GLOBAL_DATA_PTR; +#define IPU1_LOAD_ADDR (0xa17ff000) +#define MAX_REMOTECORE_BIN_SIZE (8 * 0x10) +#define IPU2_LOAD_ADDR (IPU1_LOAD_ADDR + MAX_REMOTECORE_BIN_SIZE) + __weak u32 omap_sys_boot_device(void) { return BOOT_DEVICE_NONE; @@ -194,6 +201,91 @@ u32 spl_mmc_boot_mode(const u32 boot_device) return gd->arch.omap_boot_mode; } +int load_firmware(char *name_fw, u32 *loadaddr) +{ + struct udevice *fsdev; + int size = 0; + + if (!IS_ENABLED(CONFIG_FS_LOADER)) + return 0; + + if (!*loadaddr) + return 0; + + if (!uclass_get_device(UCLASS_FS_FIRMWARE_LOADER, 0, &fsdev)) { + size = request_firmware_into_buf(fsdev, name_fw, +(void *)*loadaddr, 0, 0); + } + + return size; +} + +void spl_boot_ipu(void) +{ + int ret, size; + u32 loadaddr = IPU1_LOAD_ADDR; + + if (!IS_ENABLED(CONFIG_SPL_BUILD) || + !IS_ENABLED(CONFIG_REMOTEPROC_TI_IPU)) + return; + + size = load_firmware("dra7-ipu1-fw.xem4", &loadaddr); + if (size <= 0) { + pr_err("Firmware loading failed\n"); + goto skip_ipu1; + } + + enable_ipu1_clocks(); + ret = rproc_dev_init(0); + if (ret) { + debug("%s: IPU1 failed to initialize on rproc (%d)\n", + __func__, ret); + goto skip_ipu1; + } + + ret = rproc_load(0, IPU1_LOAD_ADDR, 0x200); + if (ret) { + debug("%s: IPU1 failed to load on rproc (%d)\n", __func__, + ret); + goto skip_ipu1; + } + + debug("Starting IPU1...\n"); + + ret = rproc_start(0); + if (ret) + debug("%s: IPU1 failed to start (%d)\n", __func__, ret); + +skip_ipu1: + loadaddr = IPU2_LOAD_ADDR; + size = load_firmware("dra7-ipu2-fw.x
[PATCH v2 00/10] dra7: bring up and support IPU load/start
This patchset enables support for loading and starting IPU firmware, the following have been implemented: - Enable fs_loader compilation at SPL Level, that is necessary in order to load IPU firmware from /boot partition. - Define necessary related IPU dts nodes. - Add necessary drivers and helpers to bring up, load and start IPU firmware. The underlying patches are interdependent, therefore should be applied in the order they are numbered in this patchset. Tests: - Please find SPL, u-boot and kernel console logs in here [1] - At SPL stage, debug logs have been enabled to make sure that IPU1 and IPU2 are loaded and started properly. In fact, these two log messages are only displayed when the firmware has been loaded, and if no errors appear afterwards, it means that firmware started successfully as well: - Starting IPU1... - Starting IPU2... At U-boot stage, "rproc" command-line tool was used for the testing. In the logs [1], "rproc list" was run before and after IPU1 and IPU2 are initialized by "rproc init". The before run gave an empty list, while the after run listed successfully the two IPUs with their correct addresses: - 0 - Name:'ipu@5882' type:'internal memory mapped' - 1 - Name:'ipu@5502' type:'internal memory mapped' "rproc start" and "rproc stop" were also used for both IPU1 and IPU2, both were successful as no error logs were displayed. [0]: https://pastebin.com/QGUYSPRt These U-boot/SPL flags have been purposely enabled during tests to ensure IPU load/start work properly: - CONFIG_DM_RESET=y - CONFIG_RESET_DRA7=y - CONFIG_SPL_DM_RESET=y - CONFIG_FS_LOADER=y - CONFIG_SPL_FS_LOADER=y - CONFIG_SPL_DRIVERS_MISC_SUPPORT=y - CONFIG_REMOTEPROC_TI_IPU=y - CONFIG_SPL_REMOTEPROC=y - CONFIG_CMD_REMOTEPROC=y Changes in v2: - Add useful checks and remove redundant code. Keerthy (10): reset: dra7: Add a reset driver arm: mach-omap2: load/start remoteproc IPU1/IPU2 drivers: misc: Makefile: Enable fs_loader compilation at SPL Level linux: bitmap.h: Add find_next_zero_area function remoteproc: uclass: Add remoteproc resource handling helpers remoteproc: ipu: Add driver to bring up ipu dts: dra7-ipu-common-early-boot.dtsi: Add all the ipu early boot related nodes arm: dts: dra7: Add ipu and related nodes arm: dts: dra7*/am57xx-idk-evm-u-boot: Add ipu early boot DT changes dts: am57xx*: Add ipu early boot DT changes MAINTAINERS | 4 + .../dts/am57xx-beagle-x15-revb1-u-boot.dtsi | 7 + .../dts/am57xx-beagle-x15-revc-u-boot.dtsi| 7 + arch/arm/dts/am57xx-beagle-x15-u-boot.dtsi| 7 + arch/arm/dts/am57xx-cl-som-am57x-u-boot.dtsi | 7 + arch/arm/dts/am57xx-idk-common-u-boot.dtsi| 1 + arch/arm/dts/am57xx-sbc-am57x-u-boot.dtsi | 7 + arch/arm/dts/dra7-evm-u-boot.dtsi | 1 + arch/arm/dts/dra7-ipu-common-early-boot.dtsi | 113 +++ arch/arm/dts/dra7.dtsi| 45 +- arch/arm/dts/dra71-evm-u-boot.dtsi| 1 + arch/arm/dts/dra72-evm-revc-u-boot.dtsi | 1 + arch/arm/dts/dra76-evm-u-boot.dtsi| 1 + arch/arm/include/asm/arch-omap5/clock.h | 3 + arch/arm/include/asm/omap_common.h| 10 + arch/arm/mach-k3/common.c | 10 +- arch/arm/mach-omap2/boot-common.c | 95 +++ arch/arm/mach-omap2/clocks-common.c | 33 + arch/arm/mach-omap2/omap5/hw_data.c | 92 ++- arch/arm/mach-omap2/omap5/prcm-regs.c | 9 +- configs/j721e_evm_r5_defconfig| 1 + configs/j721e_hs_evm_r5_defconfig | 1 + drivers/misc/Kconfig | 9 + drivers/misc/Makefile | 2 +- drivers/remoteproc/Kconfig| 10 + drivers/remoteproc/Makefile | 1 + drivers/remoteproc/ipu_rproc.c| 759 ++ drivers/remoteproc/rproc-uclass.c | 532 drivers/reset/Kconfig | 6 + drivers/reset/Makefile| 1 + drivers/reset/reset-dra7.c| 97 +++ include/linux/bitmap.h| 26 + include/remoteproc.h | 384 - 33 files changed, 2266 insertions(+), 17 deletions(-) create mode 100644 arch/arm/dts/am57xx-beagle-x15-revb1-u-boot.dtsi create mode 100644 arch/arm/dts/am57xx-beagle-x15-revc-u-boot.dtsi create mode 100644 arch/arm/dts/am57xx-beagle-x15-u-boot.dtsi create mode 100644 arch/arm/dts/am57xx-cl-som-am57x-u-boot.dtsi create mode 100644 arch/arm/dts/am57xx-sbc-am57x-u-boot.dtsi create mode 100644 arch/arm/dts/dra7-ipu-common-early-boot.dtsi create mode 100644 drivers/remoteproc/ipu_rproc.c create mode 100644 drivers/reset/reset-dra7.c -- 2.25.1
[PATCH] board: ti: Add support for the AM335x GP EVM mini board
From: Andreas Dannenberg This is not really a new board but rather a minimal bootloader solution for the AM335x GP EVM. In terms of interfaces, it only supports booting from MMC0 or UART0 and only activates a minimal set of drivers that are that are necessary to run the device such as DDR, I2C, and PMIC. The goal is to provide a bare minimum starting point to boot Linux for basing custom board-ports on. The limited complexity of this solution should make it easier to achieve a successful boot to U-Boot prompt vs. trying to pair down the full-featured multi-platform AM335x U-Boot available through am335x_evm_defconfig. Signed-off-by: Andreas Dannenberg [Amjad: fix checkpatch and compile warnings] Signed-off-by: Amjad Ouled-Ameur --- Tests: - This has been tested on Am335x platform, the board boots successfully to u-boot prompt and runs basic commands seamlessly, please find the logs here: [0] However, regarding the kernel boot test, this patch does not actually guaranteey that since its purpose is to mainly allow the user to achieve a successful boot to U-boot prompt. [0]: https://pastebin.com/ixQ2yB9n MAINTAINERS | 1 + arch/arm/dts/Makefile| 1 + arch/arm/dts/am335x-bone-common.dtsi | 1 + arch/arm/dts/am335x-evm-mini.dts | 166 ++ arch/arm/mach-omap2/am33xx/Kconfig | 30 board/ti/am335x/Kconfig | 13 +- board/ti/am335x/Makefile | 6 +- board/ti/am335x/board_hs_mini.h | 19 ++ board/ti/am335x/board_mini.c | 249 +++ board/ti/am335x/board_mini.h | 44 + board/ti/am335x/mux_mini.c | 109 configs/am335x_evm_mini_defconfig| 42 + configs/am335x_hs_evm_mini_defconfig | 46 + include/configs/am335x_evm_mini.h| 96 +++ 14 files changed, 820 insertions(+), 3 deletions(-) create mode 100644 arch/arm/dts/am335x-evm-mini.dts create mode 100644 board/ti/am335x/board_hs_mini.h create mode 100644 board/ti/am335x/board_mini.c create mode 100644 board/ti/am335x/board_mini.h create mode 100644 board/ti/am335x/mux_mini.c create mode 100644 configs/am335x_evm_mini_defconfig create mode 100644 configs/am335x_hs_evm_mini_defconfig create mode 100644 include/configs/am335x_evm_mini.h diff --git a/MAINTAINERS b/MAINTAINERS index 5370b550648e..09b942acd109 100644 --- a/MAINTAINERS +++ b/MAINTAINERS @@ -492,6 +492,7 @@ F: arch/arm/mach-keystone/ F: arch/arm/mach-omap2/ F: arch/arm/include/asm/arch-omap*/ F: arch/arm/include/asm/ti-common/ +F: arch/arm/dts/am335x* F: board/ti/ F: drivers/dma/ti* F: drivers/firmware/ti_sci.* diff --git a/arch/arm/dts/Makefile b/arch/arm/dts/Makefile index fc16a57e60b0..faf8f438bf29 100644 --- a/arch/arm/dts/Makefile +++ b/arch/arm/dts/Makefile @@ -360,6 +360,7 @@ dtb-$(CONFIG_AM33XX) += \ am335x-brsmarc1.dtb \ am335x-draco.dtb \ am335x-evm.dtb \ + am335x-evm-mini.dtb \ am335x-evmsk.dtb \ am335x-bonegreen.dtb \ am335x-icev2.dtb \ diff --git a/arch/arm/dts/am335x-bone-common.dtsi b/arch/arm/dts/am335x-bone-common.dtsi index 35ec1a8df870..a87558686709 100644 --- a/arch/arm/dts/am335x-bone-common.dtsi +++ b/arch/arm/dts/am335x-bone-common.dtsi @@ -211,6 +211,7 @@ tps: tps@24 { reg = <0x24>; + #interrupt-cells = <1>; }; baseboard_eeprom: baseboard_eeprom@50 { diff --git a/arch/arm/dts/am335x-evm-mini.dts b/arch/arm/dts/am335x-evm-mini.dts new file mode 100644 index ..f45da0fd3f6f --- /dev/null +++ b/arch/arm/dts/am335x-evm-mini.dts @@ -0,0 +1,166 @@ +// SPDX-License-Identifier: GPL-2.0 +/* + * Copyright (C) 2020 Texas Instruments Incorporated - http://www.ti.com/ + */ +/dts-v1/; + +#include "am33xx.dtsi" +#include + +/ { + model = "TI AM335x EVM MINI"; + compatible = "ti,am335x-evm-mini", "ti,am335x-evm", "ti,am33xx"; + + chosen { + stdout-path = &uart0; + tick-timer = &timer2; + }; + + cpus { + cpu@0 { + cpu0-supply = <&vdd1_reg>; + }; + }; + + memory { + device_type = "memory"; + reg = <0x8000 0x1000>; /* 256 MB */ + }; + + vbat: fixedregulator@0 { + compatible = "regulator-fixed"; + regulator-name = "vbat"; + regulator-min-microvolt = <500>; + regulator-max-microvolt = <500>; + regulator-boot-on; + }; +}; + +&am33xx_pinmux { + i2c0_pins: pinmux_i2c0_pins { + pinctrl-single,pins = < + 0x188 (PIN_INPUT_PULLUP | MUX_MODE0)/* i2c0_sda.i2c0_sda */ + 0x18c (PIN_INPUT_PULLUP |
[PATCH] board: ti: Add support for the AM437x GP EVM mini board
From: Andreas Dannenberg This is not really a new board but rather a minimal bootloader solution for the AM437x GP EVM. In terms of interfaces, it only supports booting from MMC0 or UART0 and only activates a minimal set of drivers that are that are necessary to run the device such as DDR, I2C, and PMIC. The goal is to provide a bare minimum starting point to boot Linux for basing custom board-ports on. The limited complexity of this solution should make it easier to achieve a successful boot to U-Boot prompt vs. trying to pair down the full-featured multi-platform AM437x U-Boot available through am43xx_evm_defconfig. Signed-off-by: Andreas Dannenberg [Amjad: fix compile and checkpatch warnings] Signed-off-by: Amjad Ouled-Ameur --- Tests: - This has been tested on AM43xx platform, the board boots successfully to u-boot prompt and runs basic commands seamlessly, please find the logs here: [0] However, regarding the kernel boot test, sometimes it does boot correctly, sometimes it does not, but this patch does not actually guaranteey that since its purpose is to mainly allow the user to achieve a successful boot to U-boot prompt. [0]: https://pastebin.com/zmCsjQRT MAINTAINERS | 4 + arch/arm/dts/Makefile| 5 +- arch/arm/dts/am437x-gp-evm-mini.dts | 171 ++ arch/arm/mach-omap2/am33xx/Kconfig | 22 ++ board/ti/am43xx/Kconfig | 13 +- board/ti/am43xx/Makefile | 6 +- board/ti/am43xx/board_hs_mini.h | 27 ++ board/ti/am43xx/board_mini.c | 452 +++ board/ti/am43xx/board_mini.h | 28 ++ board/ti/am43xx/mux_mini.c | 53 configs/am43xx_evm_mini_defconfig| 39 +++ configs/am43xx_hs_evm_mini_defconfig | 47 +++ include/configs/am43xx_evm_mini.h| 120 +++ 13 files changed, 983 insertions(+), 4 deletions(-) create mode 100644 arch/arm/dts/am437x-gp-evm-mini.dts create mode 100644 board/ti/am43xx/board_hs_mini.h create mode 100644 board/ti/am43xx/board_mini.c create mode 100644 board/ti/am43xx/board_mini.h create mode 100644 board/ti/am43xx/mux_mini.c create mode 100644 configs/am43xx_evm_mini_defconfig create mode 100644 configs/am43xx_hs_evm_mini_defconfig create mode 100644 include/configs/am43xx_evm_mini.h diff --git a/MAINTAINERS b/MAINTAINERS index 5370b550648e..0159be0e4673 100644 --- a/MAINTAINERS +++ b/MAINTAINERS @@ -492,6 +492,7 @@ F: arch/arm/mach-keystone/ F: arch/arm/mach-omap2/ F: arch/arm/include/asm/arch-omap*/ F: arch/arm/include/asm/ti-common/ +F: arch/arm/dts/am437x* F: board/ti/ F: drivers/dma/ti* F: drivers/firmware/ti_sci.* @@ -518,6 +519,7 @@ F: drivers/timer/omap-timer.c F: drivers/watchdog/omap_wdt.c F: include/linux/pruss_driver.h F: include/linux/soc/ti/ +F: include/configs/am43xx_evm_mini.h ARM U8500 M: Stephan Gerhold @@ -1134,6 +1136,8 @@ F:arch/arm/mach-k3/config_secure.mk F: configs/am335x_hs_evm_defconfig F: configs/am335x_hs_evm_uart_defconfig F: configs/am43xx_hs_evm_defconfig +F: configs/am43xx_evm_mini_defconfig +F: configs/am43xx_hs_evm_mini_defconfig F: configs/am57xx_hs_evm_defconfig F: configs/am57xx_hs_evm_usb_defconfig F: configs/dra7xx_hs_evm_defconfig diff --git a/arch/arm/dts/Makefile b/arch/arm/dts/Makefile index fc16a57e60b0..3b8c539a6272 100644 --- a/arch/arm/dts/Makefile +++ b/arch/arm/dts/Makefile @@ -375,7 +375,10 @@ dtb-$(CONFIG_AM33XX) += \ am335x-guardian.dtb \ am335x-wega-rdk.dtb \ am335x-regor-rdk.dtb -dtb-$(CONFIG_AM43XX) += am437x-gp-evm.dtb am437x-sk-evm.dtb\ +dtb-$(CONFIG_AM43XX) += \ + am437x-gp-evm.dtb \ + am437x-gp-evm-mini.dtb \ + am437x-sk-evm.dtb \ am43x-epos-evm.dtb \ am437x-idk-evm.dtb \ am4372-generic.dtb \ diff --git a/arch/arm/dts/am437x-gp-evm-mini.dts b/arch/arm/dts/am437x-gp-evm-mini.dts new file mode 100644 index ..07c93c47b638 --- /dev/null +++ b/arch/arm/dts/am437x-gp-evm-mini.dts @@ -0,0 +1,171 @@ +// SPDX-License-Identifier: GPL-2.0 +/* + * Copyright (C) 2020 Texas Instruments Incorporated - http://www.ti.com/ + */ + +/* AM437x GP EVM MINI */ + +/dts-v1/; + +#include "am4372.dtsi" +#include +#include + +/ { + model = "TI AM437x GP EVM MINI"; + compatible = "ti,am437x-gp-evm-mini","ti,am437x-gp-evm","ti,am4372","ti,am43"; + + chosen { + stdout-path = &uart0; + tick-timer = &timer2; + }; + + ocp { + u-boot,dm-spl; + }; + + vmmcsd_fixed: fixedregulator-sd { + compatible = "regulator-fixed"; + regulator-name = "vmmcsd_fixed"; + regulator-min-microvolt = <330>; + regulator-max-microvolt = <330>; + enable-active-high
[PATCH 2/2] ARM: DRA7: Enable OPP_HIGH for GPU voltage domain
Enable the OPP_HIGH configuration for GPU voltage domain by default for various TI DRA7xx and AM57xx boards. This is being done to meet the performance needs of 1080p GFX/MultiMedia usecases. This domain does not support DVFS and the kernel will continue to run at the boot OPP chosen here. Based on logic similar to that of DSPEVE and IVA voltage domains in commit 58a8921fe34fd5 ("ARM: DRA7: Enable OPP_HIGH for DSPEVE and IVA voltage domains") Signed-off-by: Subhajit Paul Signed-off-by: Suman Anna Signed-off-by: Amjad Ouled-Ameur --- configs/am57xx_evm_defconfig| 1 + configs/am57xx_hs_evm_defconfig | 1 + configs/am57xx_hs_evm_usb_defconfig | 1 + configs/dra7xx_evm_defconfig| 1 + configs/dra7xx_hs_evm_defconfig | 1 + configs/dra7xx_hs_evm_usb_defconfig | 1 + 6 files changed, 6 insertions(+) diff --git a/configs/am57xx_evm_defconfig b/configs/am57xx_evm_defconfig index 62fe2e5b9037..cfd742a3d80a 100644 --- a/configs/am57xx_evm_defconfig +++ b/configs/am57xx_evm_defconfig @@ -11,6 +11,7 @@ CONFIG_OMAP54XX=y CONFIG_TARGET_AM57XX_EVM=y CONFIG_DRA7_DSPEVE_OPP_HIGH=y CONFIG_DRA7_IVA_OPP_HIGH=y +CONFIG_DRA7_GPU_OPP_HIGH=y CONFIG_SPL=y CONFIG_ENV_OFFSET_REDUND=0x28 CONFIG_SPL_SPI_FLASH_SUPPORT=y diff --git a/configs/am57xx_hs_evm_defconfig b/configs/am57xx_hs_evm_defconfig index 55bc28a533c1..edc3e8e34449 100644 --- a/configs/am57xx_hs_evm_defconfig +++ b/configs/am57xx_hs_evm_defconfig @@ -14,6 +14,7 @@ CONFIG_TI_SECURE_EMIF_PROTECTED_REGION_SIZE=0x01c0 CONFIG_TARGET_AM57XX_EVM=y CONFIG_DRA7_DSPEVE_OPP_HIGH=y CONFIG_DRA7_IVA_OPP_HIGH=y +CONFIG_DRA7_GPU_OPP_HIGH=y CONFIG_SPL=y CONFIG_ENV_OFFSET_REDUND=0x28 CONFIG_SPL_SPI_FLASH_SUPPORT=y diff --git a/configs/am57xx_hs_evm_usb_defconfig b/configs/am57xx_hs_evm_usb_defconfig index cdb3af3cb69d..ba1449a6ef07 100644 --- a/configs/am57xx_hs_evm_usb_defconfig +++ b/configs/am57xx_hs_evm_usb_defconfig @@ -16,6 +16,7 @@ CONFIG_TI_SECURE_EMIF_PROTECTED_REGION_SIZE=0x01c0 CONFIG_TARGET_AM57XX_EVM=y CONFIG_DRA7_DSPEVE_OPP_HIGH=y CONFIG_DRA7_IVA_OPP_HIGH=y +CONFIG_DRA7_GPU_OPP_HIGH=y CONFIG_SPL=y CONFIG_ENV_OFFSET_REDUND=0x28 CONFIG_SPL_SPI_FLASH_SUPPORT=y diff --git a/configs/dra7xx_evm_defconfig b/configs/dra7xx_evm_defconfig index 71f6b0b6c3ff..95d4244595ab 100644 --- a/configs/dra7xx_evm_defconfig +++ b/configs/dra7xx_evm_defconfig @@ -11,6 +11,7 @@ CONFIG_OMAP54XX=y CONFIG_TARGET_DRA7XX_EVM=y CONFIG_DRA7_DSPEVE_OPP_HIGH=y CONFIG_DRA7_IVA_OPP_HIGH=y +CONFIG_DRA7_GPU_OPP_HIGH=y CONFIG_SPL=y CONFIG_ENV_OFFSET_REDUND=0x28 CONFIG_SPL_SPI_FLASH_SUPPORT=y diff --git a/configs/dra7xx_hs_evm_defconfig b/configs/dra7xx_hs_evm_defconfig index 5462a79f10c5..537d7d40fdcf 100644 --- a/configs/dra7xx_hs_evm_defconfig +++ b/configs/dra7xx_hs_evm_defconfig @@ -14,6 +14,7 @@ CONFIG_TI_SECURE_EMIF_PROTECTED_REGION_SIZE=0x01c0 CONFIG_TARGET_DRA7XX_EVM=y CONFIG_DRA7_DSPEVE_OPP_HIGH=y CONFIG_DRA7_IVA_OPP_HIGH=y +CONFIG_DRA7_GPU_OPP_HIGH=y CONFIG_SPL=y CONFIG_ENV_OFFSET_REDUND=0x28 CONFIG_SPL_SPI_FLASH_SUPPORT=y diff --git a/configs/dra7xx_hs_evm_usb_defconfig b/configs/dra7xx_hs_evm_usb_defconfig index eff9346221f4..cab7f9f5394d 100644 --- a/configs/dra7xx_hs_evm_usb_defconfig +++ b/configs/dra7xx_hs_evm_usb_defconfig @@ -16,6 +16,7 @@ CONFIG_TI_SECURE_EMIF_PROTECTED_REGION_SIZE=0x01c0 CONFIG_TARGET_DRA7XX_EVM=y CONFIG_DRA7_DSPEVE_OPP_HIGH=y CONFIG_DRA7_IVA_OPP_HIGH=y +CONFIG_DRA7_GPU_OPP_HIGH=y CONFIG_SPL=y CONFIG_ENV_OFFSET_REDUND=0x28 CONFIG_SPL_SPI_FLASH_SUPPORT=y -- 2.25.1
[PATCH 1/2] ARM: DRA7: Enable OPP_HIGH for DSPEVE and IVA voltage domains
Enable the OPP_HIGH configuration for DSPEVE and IVA voltage domains by default for various TI DRA7xx and AM57xx boards. This is being done to meet the performance needs of 1080p MultiMedia usecases and other DSP usecases. These domains do not support DVFS and the kernel will continue to run at the boot OPPs chosen here. Signed-off-by: Suman Anna Signed-off-by: Amjad Ouled-Ameur --- configs/am57xx_evm_defconfig| 2 ++ configs/am57xx_hs_evm_defconfig | 2 ++ configs/am57xx_hs_evm_usb_defconfig | 2 ++ configs/dra7xx_evm_defconfig| 2 ++ configs/dra7xx_hs_evm_defconfig | 2 ++ configs/dra7xx_hs_evm_usb_defconfig | 2 ++ 6 files changed, 12 insertions(+) diff --git a/configs/am57xx_evm_defconfig b/configs/am57xx_evm_defconfig index cc11323b9d51..62fe2e5b9037 100644 --- a/configs/am57xx_evm_defconfig +++ b/configs/am57xx_evm_defconfig @@ -9,6 +9,8 @@ CONFIG_DEFAULT_DEVICE_TREE="am572x-idk" CONFIG_SPL_TEXT_BASE=0x4030 CONFIG_OMAP54XX=y CONFIG_TARGET_AM57XX_EVM=y +CONFIG_DRA7_DSPEVE_OPP_HIGH=y +CONFIG_DRA7_IVA_OPP_HIGH=y CONFIG_SPL=y CONFIG_ENV_OFFSET_REDUND=0x28 CONFIG_SPL_SPI_FLASH_SUPPORT=y diff --git a/configs/am57xx_hs_evm_defconfig b/configs/am57xx_hs_evm_defconfig index 5763264adb1a..55bc28a533c1 100644 --- a/configs/am57xx_hs_evm_defconfig +++ b/configs/am57xx_hs_evm_defconfig @@ -12,6 +12,8 @@ CONFIG_TI_SECURE_EMIF_REGION_START=0xbdb0 CONFIG_TI_SECURE_EMIF_TOTAL_REGION_SIZE=0x0200 CONFIG_TI_SECURE_EMIF_PROTECTED_REGION_SIZE=0x01c0 CONFIG_TARGET_AM57XX_EVM=y +CONFIG_DRA7_DSPEVE_OPP_HIGH=y +CONFIG_DRA7_IVA_OPP_HIGH=y CONFIG_SPL=y CONFIG_ENV_OFFSET_REDUND=0x28 CONFIG_SPL_SPI_FLASH_SUPPORT=y diff --git a/configs/am57xx_hs_evm_usb_defconfig b/configs/am57xx_hs_evm_usb_defconfig index f2ae04583739..cdb3af3cb69d 100644 --- a/configs/am57xx_hs_evm_usb_defconfig +++ b/configs/am57xx_hs_evm_usb_defconfig @@ -14,6 +14,8 @@ CONFIG_TI_SECURE_EMIF_REGION_START=0xbdb0 CONFIG_TI_SECURE_EMIF_TOTAL_REGION_SIZE=0x0200 CONFIG_TI_SECURE_EMIF_PROTECTED_REGION_SIZE=0x01c0 CONFIG_TARGET_AM57XX_EVM=y +CONFIG_DRA7_DSPEVE_OPP_HIGH=y +CONFIG_DRA7_IVA_OPP_HIGH=y CONFIG_SPL=y CONFIG_ENV_OFFSET_REDUND=0x28 CONFIG_SPL_SPI_FLASH_SUPPORT=y diff --git a/configs/dra7xx_evm_defconfig b/configs/dra7xx_evm_defconfig index 0c253da80cb9..71f6b0b6c3ff 100644 --- a/configs/dra7xx_evm_defconfig +++ b/configs/dra7xx_evm_defconfig @@ -9,6 +9,8 @@ CONFIG_DEFAULT_DEVICE_TREE="dra7-evm" CONFIG_SPL_TEXT_BASE=0x4030 CONFIG_OMAP54XX=y CONFIG_TARGET_DRA7XX_EVM=y +CONFIG_DRA7_DSPEVE_OPP_HIGH=y +CONFIG_DRA7_IVA_OPP_HIGH=y CONFIG_SPL=y CONFIG_ENV_OFFSET_REDUND=0x28 CONFIG_SPL_SPI_FLASH_SUPPORT=y diff --git a/configs/dra7xx_hs_evm_defconfig b/configs/dra7xx_hs_evm_defconfig index 885b236f1886..5462a79f10c5 100644 --- a/configs/dra7xx_hs_evm_defconfig +++ b/configs/dra7xx_hs_evm_defconfig @@ -12,6 +12,8 @@ CONFIG_TI_SECURE_EMIF_REGION_START=0xbdb0 CONFIG_TI_SECURE_EMIF_TOTAL_REGION_SIZE=0x0200 CONFIG_TI_SECURE_EMIF_PROTECTED_REGION_SIZE=0x01c0 CONFIG_TARGET_DRA7XX_EVM=y +CONFIG_DRA7_DSPEVE_OPP_HIGH=y +CONFIG_DRA7_IVA_OPP_HIGH=y CONFIG_SPL=y CONFIG_ENV_OFFSET_REDUND=0x28 CONFIG_SPL_SPI_FLASH_SUPPORT=y diff --git a/configs/dra7xx_hs_evm_usb_defconfig b/configs/dra7xx_hs_evm_usb_defconfig index efdd9f31c74a..eff9346221f4 100644 --- a/configs/dra7xx_hs_evm_usb_defconfig +++ b/configs/dra7xx_hs_evm_usb_defconfig @@ -14,6 +14,8 @@ CONFIG_TI_SECURE_EMIF_REGION_START=0xbdb0 CONFIG_TI_SECURE_EMIF_TOTAL_REGION_SIZE=0x0200 CONFIG_TI_SECURE_EMIF_PROTECTED_REGION_SIZE=0x01c0 CONFIG_TARGET_DRA7XX_EVM=y +CONFIG_DRA7_DSPEVE_OPP_HIGH=y +CONFIG_DRA7_IVA_OPP_HIGH=y CONFIG_SPL=y CONFIG_ENV_OFFSET_REDUND=0x28 CONFIG_SPL_SPI_FLASH_SUPPORT=y -- 2.25.1
[PATCH 0/2] ARM: DRA7: Enable OPP_HIGH for GPU, DSPEVE and IVA voltage domains
This patchset enables the OPP_HIGH configuration for GPU, DSPEVE and IVA voltage domains by default for various TI DRA7xx and AM57xx boards. This is being done to meet the performance needs of 1080p MultiMedia usecases Amjad Ouled-Ameur (2): ARM: DRA7: Enable OPP_HIGH for DSPEVE and IVA voltage domains ARM: DRA7: Enable OPP_HIGH for GPU voltage domain configs/am57xx_evm_defconfig| 3 +++ configs/am57xx_hs_evm_defconfig | 3 +++ configs/am57xx_hs_evm_usb_defconfig | 3 +++ configs/dra7xx_evm_defconfig| 3 +++ configs/dra7xx_hs_evm_defconfig | 3 +++ configs/dra7xx_hs_evm_usb_defconfig | 3 +++ 6 files changed, 18 insertions(+) -- 2.25.1
[PATCH 10/10] dts: am57xx*: Add ipu early boot DT changes
From: Keerthy Add support for ipu early boot. Signed-off-by: Keerthy Signed-off-by: Amjad Ouled-Ameur --- MAINTAINERS | 1 + arch/arm/dts/am57xx-beagle-x15-revb1-u-boot.dtsi | 7 +++ arch/arm/dts/am57xx-beagle-x15-revc-u-boot.dtsi | 7 +++ arch/arm/dts/am57xx-beagle-x15-u-boot.dtsi | 7 +++ arch/arm/dts/am57xx-cl-som-am57x-u-boot.dtsi | 7 +++ arch/arm/dts/am57xx-sbc-am57x-u-boot.dtsi| 7 +++ 6 files changed, 36 insertions(+) create mode 100644 arch/arm/dts/am57xx-beagle-x15-revb1-u-boot.dtsi create mode 100644 arch/arm/dts/am57xx-beagle-x15-revc-u-boot.dtsi create mode 100644 arch/arm/dts/am57xx-beagle-x15-u-boot.dtsi create mode 100644 arch/arm/dts/am57xx-cl-som-am57x-u-boot.dtsi create mode 100644 arch/arm/dts/am57xx-sbc-am57x-u-boot.dtsi diff --git a/MAINTAINERS b/MAINTAINERS index 404ad283ff4a..c9ce9991c8b0 100644 --- a/MAINTAINERS +++ b/MAINTAINERS @@ -500,6 +500,7 @@ F: arch/arm/mach-omap2/ F: arch/arm/include/asm/arch-omap*/ F: arch/arm/include/asm/ti-common/ F: arch/arm/dts/dra7* +F: arch/arm/dts/am57xx* F: board/ti/ F: drivers/dma/ti* F: drivers/firmware/ti_sci.* diff --git a/arch/arm/dts/am57xx-beagle-x15-revb1-u-boot.dtsi b/arch/arm/dts/am57xx-beagle-x15-revb1-u-boot.dtsi new file mode 100644 index ..49b16215e528 --- /dev/null +++ b/arch/arm/dts/am57xx-beagle-x15-revb1-u-boot.dtsi @@ -0,0 +1,7 @@ +// SPDX-License-Identifier: GPL-2.0+ +/* + * Copyright (C) 2019 Texas Instruments Incorporated - http://www.ti.com/ + */ + +#include "omap5-u-boot.dtsi" +#include "dra7-ipu-common-early-boot.dtsi" diff --git a/arch/arm/dts/am57xx-beagle-x15-revc-u-boot.dtsi b/arch/arm/dts/am57xx-beagle-x15-revc-u-boot.dtsi new file mode 100644 index ..49b16215e528 --- /dev/null +++ b/arch/arm/dts/am57xx-beagle-x15-revc-u-boot.dtsi @@ -0,0 +1,7 @@ +// SPDX-License-Identifier: GPL-2.0+ +/* + * Copyright (C) 2019 Texas Instruments Incorporated - http://www.ti.com/ + */ + +#include "omap5-u-boot.dtsi" +#include "dra7-ipu-common-early-boot.dtsi" diff --git a/arch/arm/dts/am57xx-beagle-x15-u-boot.dtsi b/arch/arm/dts/am57xx-beagle-x15-u-boot.dtsi new file mode 100644 index ..49b16215e528 --- /dev/null +++ b/arch/arm/dts/am57xx-beagle-x15-u-boot.dtsi @@ -0,0 +1,7 @@ +// SPDX-License-Identifier: GPL-2.0+ +/* + * Copyright (C) 2019 Texas Instruments Incorporated - http://www.ti.com/ + */ + +#include "omap5-u-boot.dtsi" +#include "dra7-ipu-common-early-boot.dtsi" diff --git a/arch/arm/dts/am57xx-cl-som-am57x-u-boot.dtsi b/arch/arm/dts/am57xx-cl-som-am57x-u-boot.dtsi new file mode 100644 index ..49b16215e528 --- /dev/null +++ b/arch/arm/dts/am57xx-cl-som-am57x-u-boot.dtsi @@ -0,0 +1,7 @@ +// SPDX-License-Identifier: GPL-2.0+ +/* + * Copyright (C) 2019 Texas Instruments Incorporated - http://www.ti.com/ + */ + +#include "omap5-u-boot.dtsi" +#include "dra7-ipu-common-early-boot.dtsi" diff --git a/arch/arm/dts/am57xx-sbc-am57x-u-boot.dtsi b/arch/arm/dts/am57xx-sbc-am57x-u-boot.dtsi new file mode 100644 index ..49b16215e528 --- /dev/null +++ b/arch/arm/dts/am57xx-sbc-am57x-u-boot.dtsi @@ -0,0 +1,7 @@ +// SPDX-License-Identifier: GPL-2.0+ +/* + * Copyright (C) 2019 Texas Instruments Incorporated - http://www.ti.com/ + */ + +#include "omap5-u-boot.dtsi" +#include "dra7-ipu-common-early-boot.dtsi" -- 2.25.1
[PATCH 06/10] remoteproc: ipu: Add driver to bring up ipu
From: Keerthy The driver enables IPU support. Basically enables the clocks, timers, watchdog timers and bare minimal MMU and supports loading the firmware from mmc. Signed-off-by: Keerthy [Amjad: fix compile warnings] Signed-off-by: Amjad Ouled-Ameur --- MAINTAINERS| 1 + drivers/remoteproc/Kconfig | 10 + drivers/remoteproc/Makefile| 1 + drivers/remoteproc/ipu_rproc.c | 759 + 4 files changed, 771 insertions(+) create mode 100644 drivers/remoteproc/ipu_rproc.c diff --git a/MAINTAINERS b/MAINTAINERS index ce6e7ef08252..9e93c2785cf9 100644 --- a/MAINTAINERS +++ b/MAINTAINERS @@ -515,6 +515,7 @@ F: drivers/ram/k3* F: drivers/remoteproc/k3_system_controller.c F: drivers/remoteproc/pruc_rpoc.c F: drivers/remoteproc/ti* +F: drivers/remoteproc/ipu_rproc.c F: drivers/reset/reset-ti-sci.c F: drivers/reset/reset-dra7.c F: drivers/rtc/davinci.c diff --git a/drivers/remoteproc/Kconfig b/drivers/remoteproc/Kconfig index 24e536463bbd..27e4a60ff5b1 100644 --- a/drivers/remoteproc/Kconfig +++ b/drivers/remoteproc/Kconfig @@ -92,4 +92,14 @@ config REMOTEPROC_TI_PRU help Say 'y' here to add support for TI' K3 remoteproc driver. +config REMOTEPROC_TI_IPU + bool "Support for TI's K3 based IPU remoteproc driver" + select REMOTEPROC + depends on DM + depends on SPL_DRIVERS_MISC + depends on SPL_FS_LOADER + depends on OF_CONTROL + help + Say 'y' here to add support for TI' K3 remoteproc driver. + endmenu diff --git a/drivers/remoteproc/Makefile b/drivers/remoteproc/Makefile index f0e83451d66f..fbe9c172bc04 100644 --- a/drivers/remoteproc/Makefile +++ b/drivers/remoteproc/Makefile @@ -15,3 +15,4 @@ obj-$(CONFIG_REMOTEPROC_TI_K3_DSP) += ti_k3_dsp_rproc.o obj-$(CONFIG_REMOTEPROC_TI_K3_R5F) += ti_k3_r5f_rproc.o obj-$(CONFIG_REMOTEPROC_TI_POWER) += ti_power_proc.o obj-$(CONFIG_REMOTEPROC_TI_PRU) += pru_rproc.o +obj-$(CONFIG_REMOTEPROC_TI_IPU) += ipu_rproc.o diff --git a/drivers/remoteproc/ipu_rproc.c b/drivers/remoteproc/ipu_rproc.c new file mode 100644 index ..b4a06bc955a9 --- /dev/null +++ b/drivers/remoteproc/ipu_rproc.c @@ -0,0 +1,759 @@ +// SPDX-License-Identifier: GPL-2.0 +/* + * IPU remoteproc driver for various SoCs + * + * Copyright (C) 2019 Texas Instruments Incorporated - http://www.ti.com/ + * Angela Stegmaier + * Venkateswara Rao Mandela + * Keerthy + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#define IPU1_LOAD_ADDR (0xa17ff000) +#define MAX_REMOTECORE_BIN_SIZE (8 * 0x10) + +enum ipu_num { + IPU1 = 0, + IPU2, + RPROC_END_ENUMS, +}; + +#define IPU2_LOAD_ADDR (IPU1_LOAD_ADDR + MAX_REMOTECORE_BIN_SIZE) + +#define PAGE_SHIFT 12 +#define PAGESIZE_1M 0x0 +#define PAGESIZE_64K 0x1 +#define PAGESIZE_4K 0x2 +#define PAGESIZE_16M 0x3 +#define LE 0 +#define BE 1 +#define ELEMSIZE_8 0x0 +#define ELEMSIZE_16 0x1 +#define ELEMSIZE_32 0x2 +#define MIXED_TLB0x0 +#define MIXED_CPU0x1 + +#define PGT_SMALLPAGE_SIZE 0x1000 +#define PGT_LARGEPAGE_SIZE 0x0001 +#define PGT_SECTION_SIZE 0x0010 +#define PGT_SUPERSECTION_SIZE0x0100 + +#define PGT_L1_DESC_PAGE 0x1 +#define PGT_L1_DESC_SECTION 0x2 +#define PGT_L1_DESC_SUPERSECTION 0x40002 + +#define PGT_L1_DESC_PAGE_MASK0xfC00 +#define PGT_L1_DESC_SECTION_MASK 0xfff0 +#define PGT_L1_DESC_SUPERSECTION_MASK0xff00 + +#define PGT_L1_DESC_SMALLPAGE_INDEX_SHIFT12 +#define PGT_L1_DESC_LARGEPAGE_INDEX_SHIFT16 +#define PGT_L1_DESC_SECTION_INDEX_SHIFT 20 +#define PGT_L1_DESC_SUPERSECTION_INDEX_SHIFT 24 + +#define PGT_L2_DESC_SMALLPAGE 0x02 +#define PGT_L2_DESC_LARGEPAGE 0x01 + +#define PGT_L2_DESC_SMALLPAGE_MASK 0xf000 +#define PGT_L2_DESC_LARGEPAGE_MASK 0x + +/* + * The memory for the page tables (256 KB per IPU) is placed just before + * the carveout memories for the remote processors. 16 KB of memory is + * needed for the L1 page table (4096 entries * 4 bytes per 1 MB section). + * Any smaller page (64 KB or 4 KB) entries are supported through L2 page + * tables (1 KB per table). The remaining 240 KB can provide suppo
[PATCH 05/10] remoteproc: uclass: Add remoteproc resource handling helpers
From: Keerthy Add remoteproc resource handling helpers. These functions are primarily to parse the resource table and to handle different types of resources. Carveout, devmem, trace & vring resources are handled. Signed-off-by: Keerthy [Amjad: fix redefinition of "struct resource_table" and compile warnings ] Signed-off-by: Amjad Ouled-Ameur --- drivers/remoteproc/rproc-uclass.c | 562 ++ include/remoteproc.h | 384 +++- 2 files changed, 945 insertions(+), 1 deletion(-) diff --git a/drivers/remoteproc/rproc-uclass.c b/drivers/remoteproc/rproc-uclass.c index 64c47c1e7225..3f7096045548 100644 --- a/drivers/remoteproc/rproc-uclass.c +++ b/drivers/remoteproc/rproc-uclass.c @@ -8,6 +8,7 @@ #define pr_fmt(fmt) "%s: " fmt, __func__ #include +#include #include #include #include @@ -19,9 +20,21 @@ #include #include #include +#include DECLARE_GLOBAL_DATA_PTR; +struct resource_table { + u32 ver; + u32 num; + u32 reserved[2]; + u32 offset[0]; +} __packed; + +typedef int (*handle_resource_t) (struct udevice *, void *, int offset, int avail); + +static struct resource_table *rsc_table; + /** * for_each_remoteproc_device() - iterate through the list of rproc devices * @fn: check function to call per match, if this function returns fail, @@ -208,6 +221,86 @@ static int rproc_post_probe(struct udevice *dev) return 0; } +/** + * rproc_add_res() - After parsing the resource table add the mappings + * @dev: device we finished probing + * @mapping: rproc_mem_entry for the resource + * + * Return: if the remote proc driver has a add_res routine, invokes it and + * hands over the return value. overall, 0 if all went well, else appropriate + * error value. + */ +static int rproc_add_res(struct udevice *dev, struct rproc_mem_entry *mapping) +{ + const struct dm_rproc_ops *ops; + + ops = rproc_get_ops(dev); + if (!ops) { + debug("%s driver has no ops?\n", dev->name); + return -EINVAL; + } + + if (ops->add_res) + return ops->add_res(dev, mapping); + + return 0; +} + +/** + * rproc_alloc_mem() - After parsing the resource table allocat mem + * @dev: device we finished probing + * @len: rproc_mem_entry for the resource + * @align: alignment for the resource + * + * Return: if the remote proc driver has a add_res routine, invokes it and + * hands over the return value. overall, 0 if all went well, else appropriate + * error value. + */ +static void *rproc_alloc_mem(struct udevice *dev, unsigned long len, +unsigned long align) +{ + const struct dm_rproc_ops *ops; + + ops = rproc_get_ops(dev); + if (!ops) { + debug("%s driver has no ops?\n", dev->name); + return NULL; + } + + if (ops->alloc_mem) + return ops->alloc_mem(dev, len, align); + + return NULL; +} + +/** + * rproc_config_pagetable() - Configure page table for remote processor + * @dev: device we finished probing + * @virt: Virtual address of the resource + * @phys: Physical address the resource + * @len: length the resource + * + * Return: if the remote proc driver has a add_res routine, invokes it and + * hands over the return value. overall, 0 if all went well, else appropriate + * error value. + */ +static int rproc_config_pagetable(struct udevice *dev, unsigned int virt, + unsigned int phys, unsigned int len) +{ + const struct dm_rproc_ops *ops; + + ops = rproc_get_ops(dev); + if (!ops) { + debug("%s driver has no ops?\n", dev->name); + return -EINVAL; + } + + if (ops->config_pagetable) + return ops->config_pagetable(dev, virt, phys, len); + + return 0; +} + UCLASS_DRIVER(rproc) = { .id = UCLASS_REMOTEPROC, .name = "remoteproc", @@ -438,3 +531,472 @@ int rproc_is_running(int id) { return _rproc_ops_wrapper(id, RPROC_RUNNING); }; + +/* + * Virtio ring descriptors: 16 bytes. These can chain together via + * "next". + */ +struct vring_desc { + u64 addr; + u32 len; + u16 flags; + u16 next; +}; + +/* + * u32 is used here for ids for padding reasons. + */ +struct vring_used_elem { + u32 id; + u32 len; +}; + +static unsigned int vring_size(unsigned int num, unsigned long align) +{ + return ((sizeof(struct vring_desc) * num + sizeof(u16) * (3 + num) ++ align - 1) & ~(align - 1)) + + sizeof(u16) * 3 + sizeof(struct vring_used_elem) * num; +} + +static int handle_trace(struct udevice *dev, struct fw_rsc_trace *rsc, + int offset, int avail) +{ + if (sizeof(*rsc) > avail) { + debug("trace rsc is tru
[PATCH 09/10] arm: dts: dra7*/am57xx-idk-evm-u-boot: Add ipu early boot DT changes
From: Keerthy Add support for ipu early boot. Signed-off-by: Keerthy Signed-off-by: Amjad Ouled-Ameur --- arch/arm/dts/am57xx-idk-common-u-boot.dtsi | 1 + arch/arm/dts/dra7-evm-u-boot.dtsi | 1 + arch/arm/dts/dra71-evm-u-boot.dtsi | 1 + arch/arm/dts/dra72-evm-revc-u-boot.dtsi| 1 + arch/arm/dts/dra76-evm-u-boot.dtsi | 1 + 5 files changed, 5 insertions(+) diff --git a/arch/arm/dts/am57xx-idk-common-u-boot.dtsi b/arch/arm/dts/am57xx-idk-common-u-boot.dtsi index b07aea0048d5..d0ce469f9189 100644 --- a/arch/arm/dts/am57xx-idk-common-u-boot.dtsi +++ b/arch/arm/dts/am57xx-idk-common-u-boot.dtsi @@ -3,6 +3,7 @@ * Copyright (C) 2019 Texas Instruments Incorporated - http://www.ti.com/ */ #include "omap5-u-boot.dtsi" +#include "dra7-ipu-common-early-boot.dtsi" / { xtal25mhz: xtal25mhz { diff --git a/arch/arm/dts/dra7-evm-u-boot.dtsi b/arch/arm/dts/dra7-evm-u-boot.dtsi index f06c701dbd1f..5622512b2401 100644 --- a/arch/arm/dts/dra7-evm-u-boot.dtsi +++ b/arch/arm/dts/dra7-evm-u-boot.dtsi @@ -4,6 +4,7 @@ */ #include "omap5-u-boot.dtsi" +#include "dra7-ipu-common-early-boot.dtsi" &pcf_gpio_21{ u-boot,i2c-offset-len = <0>; diff --git a/arch/arm/dts/dra71-evm-u-boot.dtsi b/arch/arm/dts/dra71-evm-u-boot.dtsi index b56d4fc9d896..40443da5c855 100644 --- a/arch/arm/dts/dra71-evm-u-boot.dtsi +++ b/arch/arm/dts/dra71-evm-u-boot.dtsi @@ -4,6 +4,7 @@ */ #include "omap5-u-boot.dtsi" +#include "dra7-ipu-common-early-boot.dtsi" &pcf_gpio_21{ u-boot,i2c-offset-len = <0>; diff --git a/arch/arm/dts/dra72-evm-revc-u-boot.dtsi b/arch/arm/dts/dra72-evm-revc-u-boot.dtsi index b56d4fc9d896..40443da5c855 100644 --- a/arch/arm/dts/dra72-evm-revc-u-boot.dtsi +++ b/arch/arm/dts/dra72-evm-revc-u-boot.dtsi @@ -4,6 +4,7 @@ */ #include "omap5-u-boot.dtsi" +#include "dra7-ipu-common-early-boot.dtsi" &pcf_gpio_21{ u-boot,i2c-offset-len = <0>; diff --git a/arch/arm/dts/dra76-evm-u-boot.dtsi b/arch/arm/dts/dra76-evm-u-boot.dtsi index a4dfbe7e601a..5fae6ba91936 100644 --- a/arch/arm/dts/dra76-evm-u-boot.dtsi +++ b/arch/arm/dts/dra76-evm-u-boot.dtsi @@ -4,6 +4,7 @@ */ #include "omap5-u-boot.dtsi" +#include "dra7-ipu-common-early-boot.dtsi" &cpsw_emac0 { phy-handle = <&dp83867_0>; -- 2.25.1
[PATCH 07/10] dts: dra7-ipu-common-early-boot.dtsi: Add all the ipu early boot related nodes
From: Keerthy Add all the ipu early boot related nodes Signed-off-by: Keerthy Signed-off-by: Amjad Ouled-Ameur --- MAINTAINERS | 1 + arch/arm/dts/dra7-ipu-common-early-boot.dtsi | 113 +++ 2 files changed, 114 insertions(+) create mode 100644 arch/arm/dts/dra7-ipu-common-early-boot.dtsi diff --git a/MAINTAINERS b/MAINTAINERS index 9e93c2785cf9..404ad283ff4a 100644 --- a/MAINTAINERS +++ b/MAINTAINERS @@ -499,6 +499,7 @@ F: arch/arm/mach-keystone/ F: arch/arm/mach-omap2/ F: arch/arm/include/asm/arch-omap*/ F: arch/arm/include/asm/ti-common/ +F: arch/arm/dts/dra7* F: board/ti/ F: drivers/dma/ti* F: drivers/firmware/ti_sci.* diff --git a/arch/arm/dts/dra7-ipu-common-early-boot.dtsi b/arch/arm/dts/dra7-ipu-common-early-boot.dtsi new file mode 100644 index ..ec6040ff93eb --- /dev/null +++ b/arch/arm/dts/dra7-ipu-common-early-boot.dtsi @@ -0,0 +1,113 @@ +// SPDX-License-Identifier: GPL-2.0+ +/* + * Copyright (C) 2019 Texas Instruments Incorporated - http://www.ti.com/ + */ + +/ { + chosen { + firmware-loader = &fs_loader0; + }; + + fs_loader0: fs_loader@0 { + u-boot,dm-pre-reloc; + compatible = "u-boot,fs-loader"; + phandlepart = <&mmc1 1>; + }; + + reserved-memory { + #address-cells = <2>; + #size-cells = <2>; + ranges; + u-boot,dm-spl; + + ipu2_memory_region: ipu2-memory@9580 { + compatible = "shared-dma-pool"; + reg = <0x0 0x9580 0x0 0x380>; + reusable; + status = "okay"; + u-boot,dm-spl; + }; + + ipu1_memory_region: ipu1-memory@9d00 { + compatible = "shared-dma-pool"; + reg = <0x0 0x9d00 0x0 0x200>; + reusable; + status = "okay"; + u-boot,dm-spl; + }; + + ipu1_pgtbl: ipu1-pgtbl@9570 { + reg = <0x0 0x9570 0x0 0x4>; + no-map; + u-boot,dm-spl; + }; + + ipu2_pgtbl: ipu2-pgtbl@9574 { + reg = <0x0 0x9574 0x0 0x4>; + no-map; + u-boot,dm-spl; + }; + }; +}; + +&timer3 { + u-boot,dm-spl; +}; + +&timer4 { + u-boot,dm-spl; +}; + +&timer7 { + u-boot,dm-spl; +}; + +&timer8 { + u-boot,dm-spl; +}; + +&timer9 { + u-boot,dm-spl; +}; + +&timer11 { + u-boot,dm-spl; +}; + +&mmu_ipu1 { + u-boot,dm-spl; +}; + +&mmu_ipu2 { + u-boot,dm-spl; +}; + +&ipu1 { + status = "okay"; + memory-region = <&ipu1_memory_region>; + pg-tbl = <&ipu1_pgtbl>; + u-boot,dm-spl; +}; + +&ipu2 { + status = "okay"; + memory-region = <&ipu2_memory_region>; + pg-tbl = <&ipu2_pgtbl>; + u-boot,dm-spl; +}; + +&l4_wkup { + u-boot,dm-spl; +}; + +&prm { + u-boot,dm-spl; +}; + +&ipu1_rst { + u-boot,dm-spl; +}; + +&ipu2_rst { + u-boot,dm-spl; +}; -- 2.25.1
[PATCH 08/10] arm: dts: dra7: Add ipu and related nodes
From: Keerthy Add ipu and the associated nodes. Signed-off-by: Keerthy Signed-off-by: Amjad Ouled-Ameur --- arch/arm/dts/dra7.dtsi | 45 +- 1 file changed, 44 insertions(+), 1 deletion(-) diff --git a/arch/arm/dts/dra7.dtsi b/arch/arm/dts/dra7.dtsi index fd1aea0b1b16..e2e958b36626 100644 --- a/arch/arm/dts/dra7.dtsi +++ b/arch/arm/dts/dra7.dtsi @@ -41,6 +41,8 @@ d_can0 = &dcan1; d_can1 = &dcan2; spi0 = &qspi; + remoteproc0 = &ipu1; + remoteproc1 = &ipu2; }; timer { @@ -263,9 +265,12 @@ }; prm: prm@6000 { - compatible = "ti,dra7-prm"; + compatible = "ti,dra7-prm", "simple-bus"; reg = <0x6000 0x3000>; interrupts = ; + #address-cells = <1>; + #size-cells = <1>; + ranges = <0 0x6000 0x3000>; prm_clocks: clocks { #address-cells = <1>; @@ -274,6 +279,20 @@ prm_clockdomains: clockdomains { }; + + ipu1_rst: ipu1_rst@510 { + compatible = "ti,dra7-reset"; + reg = <0x510 0x8>; + ti,nresets = <3>; + #reset-cells = <1>; + }; + + ipu2_rst: ipu2_rst@910 { + compatible = "ti,dra7-reset"; + reg = <0x910 0x8>; + ti,nresets = <3>; + #reset-cells = <1>; + }; }; scm_wkup: scm_conf@c000 { @@ -2032,6 +2051,30 @@ clocks = <&l3_iclk_div>; clock-names = "fck"; }; + + ipu1: ipu@5882 { + compatible = "ti,dra7-ipu"; + reg = <0x5882 0x1>; + reg-names = "l2ram"; + ti,hwmods = "ipu1"; + resets = <&ipu1_rst 0>, <&ipu1_rst 1>, <&ipu1_rst 2>; + iommus = <&mmu_ipu1>; + ti,rproc-standby-info = <0x4a005520>; + timers = <&timer11>; + watchdog-timers = <&timer7>, <&timer8>; + }; + + ipu2: ipu@5502 { + compatible = "ti,dra7-ipu"; + reg = <0x5502 0x1>; + reg-names = "l2ram"; + ti,hwmods = "ipu2"; + resets = <&ipu2_rst 0>, <&ipu2_rst 1>, <&ipu2_rst 2>; + iommus = <&mmu_ipu2>; + ti,rproc-standby-info = <0x4a008920>; + timers = <&timer3>; + watchdog-timers = <&timer4>, <&timer9>; + }; }; thermal_zones: thermal-zones { -- 2.25.1
[PATCH 04/10] linux: bitmap.h: Add find_next_zero_area function
From: Keerthy Add find_next_zero_area to fetch the next zero area in the map. Signed-off-by: Keerthy Signed-off-by: Amjad Ouled-Ameur --- include/linux/bitmap.h | 26 ++ 1 file changed, 26 insertions(+) diff --git a/include/linux/bitmap.h b/include/linux/bitmap.h index dae4225be549..0a8503af9f14 100644 --- a/include/linux/bitmap.h +++ b/include/linux/bitmap.h @@ -159,6 +159,32 @@ static inline unsigned long find_first_bit(const unsigned long *addr, unsigned l (bit) < (size);\ (bit) = find_next_bit((addr), (size), (bit) + 1)) +static inline unsigned long +bitmap_find_next_zero_area(unsigned long *map, + unsigned long size, + unsigned long start, + unsigned int nr, unsigned long align_mask) +{ + unsigned long index, end, i; +again: + index = find_next_zero_bit(map, size, start); + + /* +* Align allocation +*/ + index = (index + align_mask) & ~align_mask; + + end = index + nr; + if (end > size) + return end; + i = find_next_bit(map, end, index); + if (i < end) { + start = i + 1; + goto again; + } + return index; +} + static inline void bitmap_fill(unsigned long *dst, unsigned int nbits) { if (small_const_nbits(nbits)) { -- 2.25.1
[PATCH 03/10] drivers: misc: Makefile: Enable fs_loader compilation at SPL Level
From: Keerthy Enable fs_loader compilation at SPL Level. Signed-off-by: Keerthy [Amjad: fix compilation failures for J721e platform] Signed-off-by: Amjad Ouled-Ameur --- arch/arm/mach-k3/common.c | 10 +++--- configs/j721e_evm_r5_defconfig| 1 + configs/j721e_hs_evm_r5_defconfig | 1 + drivers/misc/Kconfig | 9 + drivers/misc/Makefile | 2 +- 5 files changed, 15 insertions(+), 8 deletions(-) diff --git a/arch/arm/mach-k3/common.c b/arch/arm/mach-k3/common.c index 2666cd2d7b17..dddad8e3b056 100644 --- a/arch/arm/mach-k3/common.c +++ b/arch/arm/mach-k3/common.c @@ -156,13 +156,15 @@ void init_env(void) #endif } -#ifdef CONFIG_FS_LOADER int load_firmware(char *name_fw, char *name_loadaddr, u32 *loadaddr) { struct udevice *fsdev; char *name = NULL; int size = 0; + if (!IS_ENABLED(CONFIG_FS_LOADER)) + return 0; + *loadaddr = 0; #ifdef CONFIG_SPL_ENV_SUPPORT switch (spl_boot_device()) { @@ -186,12 +188,6 @@ int load_firmware(char *name_fw, char *name_loadaddr, u32 *loadaddr) return size; } -#else -int load_firmware(char *name_fw, char *name_loadaddr, u32 *loadaddr) -{ - return 0; -} -#endif __weak void release_resources_for_core_shutdown(void) { diff --git a/configs/j721e_evm_r5_defconfig b/configs/j721e_evm_r5_defconfig index b5fd3bf23734..edc003f46b90 100644 --- a/configs/j721e_evm_r5_defconfig +++ b/configs/j721e_evm_r5_defconfig @@ -88,6 +88,7 @@ CONFIG_SYS_I2C_OMAP24XX=y CONFIG_DM_MAILBOX=y CONFIG_K3_SEC_PROXY=y CONFIG_FS_LOADER=y +CONFIG_SPL_FS_LOADER=y CONFIG_ESM_K3=y CONFIG_K3_AVS0=y CONFIG_ESM_PMIC=y diff --git a/configs/j721e_hs_evm_r5_defconfig b/configs/j721e_hs_evm_r5_defconfig index 3a8e0b1cd15b..6c3675c1726c 100644 --- a/configs/j721e_hs_evm_r5_defconfig +++ b/configs/j721e_hs_evm_r5_defconfig @@ -82,6 +82,7 @@ CONFIG_SYS_I2C_OMAP24XX=y CONFIG_DM_MAILBOX=y CONFIG_K3_SEC_PROXY=y CONFIG_FS_LOADER=y +CONFIG_SPL_FS_LOADER=y CONFIG_K3_AVS0=y CONFIG_MMC_SDHCI=y CONFIG_SPL_MMC_SDHCI_ADMA=y diff --git a/drivers/misc/Kconfig b/drivers/misc/Kconfig index 997b71322110..e6a1dc677d6e 100644 --- a/drivers/misc/Kconfig +++ b/drivers/misc/Kconfig @@ -468,6 +468,15 @@ config FS_LOADER The consumer driver would then use this loader to program whatever, ie. the FPGA device. +config SPL_FS_LOADER + bool "Enable loader driver for file system" + help + This is file system generic loader which can be used to load + the file image from the storage into target such as memory. + + The consumer driver would then use this loader to program whatever, + ie. the FPGA device. + config GDSYS_SOC bool "Enable gdsys SOC driver" depends on MISC diff --git a/drivers/misc/Makefile b/drivers/misc/Makefile index b64cd2a4de91..c7c95ee76767 100644 --- a/drivers/misc/Makefile +++ b/drivers/misc/Makefile @@ -37,7 +37,7 @@ obj-$(CONFIG_FSL_IFC) += fsl_ifc.o obj-$(CONFIG_FSL_IIM) += fsl_iim.o obj-$(CONFIG_FSL_MC9SDZ60) += mc9sdz60.o obj-$(CONFIG_FSL_SEC_MON) += fsl_sec_mon.o -obj-$(CONFIG_FS_LOADER) += fs_loader.o +obj-$(CONFIG_$(SPL_)FS_LOADER) += fs_loader.o obj-$(CONFIG_GDSYS_IOEP) += gdsys_ioep.o obj-$(CONFIG_GDSYS_RXAUI_CTRL) += gdsys_rxaui_ctrl.o obj-$(CONFIG_GDSYS_SOC) += gdsys_soc.o -- 2.25.1
[PATCH 02/10] arm: mach-omap2: load/start remoteproc IPU1/IPU2
From: Keerthy First check the presence of the ipu firmware in the boot partition. If present enable the ipu and the related clocks & then move on to load the firmware and eventually start remoteproc IPU1/IPU2. do_enable_clocks by default puts the clock domains into auto which does not work well with reset. Hence adding do_enable_ipu_clocks function. Signed-off-by: Keerthy [Amjad: fix IPU1_LOAD_ADDR and compile warnings] Signed-off-by: Amjad Ouled-Ameur --- arch/arm/include/asm/arch-omap5/clock.h | 3 + arch/arm/include/asm/omap_common.h | 10 +++ arch/arm/mach-omap2/boot-common.c | 95 + arch/arm/mach-omap2/clocks-common.c | 33 + arch/arm/mach-omap2/omap5/hw_data.c | 92 ++-- arch/arm/mach-omap2/omap5/prcm-regs.c | 9 ++- 6 files changed, 235 insertions(+), 7 deletions(-) diff --git a/arch/arm/include/asm/arch-omap5/clock.h b/arch/arm/include/asm/arch-omap5/clock.h index 87eb3f335ab0..a00626e357c9 100644 --- a/arch/arm/include/asm/arch-omap5/clock.h +++ b/arch/arm/include/asm/arch-omap5/clock.h @@ -135,6 +135,9 @@ #define HSMMC_CLKCTRL_CLKSEL_MASK (1 << 24) #define HSMMC_CLKCTRL_CLKSEL_DIV_MASK (3 << 25) +/* CM_IPU1_IPU1_CLKCTRL CLKSEL MASK */ +#define IPU1_CLKCTRL_CLKSEL_MASK BIT(24) + /* CM_L3INIT_SATA_CLKCTRL */ #define SATA_CLKCTRL_OPTFCLKEN_MASK(1 << 8) diff --git a/arch/arm/include/asm/omap_common.h b/arch/arm/include/asm/omap_common.h index de8fc99d0478..264a2e717a70 100644 --- a/arch/arm/include/asm/omap_common.h +++ b/arch/arm/include/asm/omap_common.h @@ -362,6 +362,10 @@ struct prcm_regs { /* IPU */ u32 cm_ipu_clkstctrl; u32 cm_ipu_i2c5_clkctrl; + u32 cm_ipu1_clkstctrl; + u32 cm_ipu1_ipu1_clkctrl; + u32 cm_ipu2_clkstctrl; + u32 cm_ipu2_ipu2_clkctrl; /*l3main1 edma*/ u32 cm_l3main1_tptc1_clkctrl; @@ -632,6 +636,12 @@ void do_disable_clocks(u32 const *clk_domains, u8 wait_for_disable); #endif /* CONFIG_OMAP44XX || CONFIG_OMAP54XX */ +void do_enable_ipu_clocks(u32 const *clk_domains, + u32 const *clk_modules_hw_auto, + u32 const *clk_modules_explicit_en, + u8 wait_for_enable); +void enable_ipu1_clocks(void); +void enable_ipu2_clocks(void); void setup_post_dividers(u32 const base, const struct dpll_params *params); u32 omap_ddr_clk(void); diff --git a/arch/arm/mach-omap2/boot-common.c b/arch/arm/mach-omap2/boot-common.c index 7cdf7f158981..2bf4aff74c3a 100644 --- a/arch/arm/mach-omap2/boot-common.c +++ b/arch/arm/mach-omap2/boot-common.c @@ -10,6 +10,8 @@ #include #include #include +#include +#include #include #include #include @@ -19,9 +21,14 @@ #include #include #include +#include DECLARE_GLOBAL_DATA_PTR; +#define IPU1_LOAD_ADDR (0xa17ff000) +#define MAX_REMOTECORE_BIN_SIZE (8 * 0x10) +#define IPU2_LOAD_ADDR (IPU1_LOAD_ADDR + MAX_REMOTECORE_BIN_SIZE) + __weak u32 omap_sys_boot_device(void) { return BOOT_DEVICE_NONE; @@ -194,6 +201,91 @@ u32 spl_mmc_boot_mode(const u32 boot_device) return gd->arch.omap_boot_mode; } +int load_firmware(char *name_fw, u32 *loadaddr) +{ + struct udevice *fsdev; + int size = 0; + + if (!IS_ENABLED(CONFIG_FS_LOADER)) + return 0; + + if (!*loadaddr) + return 0; + + if (!uclass_get_device(UCLASS_FS_FIRMWARE_LOADER, 0, &fsdev)) { + size = request_firmware_into_buf(fsdev, name_fw, +(void *)*loadaddr, 0, 0); + } + + return size; +} + +void spl_boot_ipu(void) +{ + int ret, size; + u32 loadaddr = IPU1_LOAD_ADDR; + + if (!IS_ENABLED(CONFIG_SPL_BUILD) || + !IS_ENABLED(CONFIG_REMOTEPROC_TI_IPU)) + return; + + size = load_firmware("dra7-ipu1-fw.xem4", &loadaddr); + if (size <= 0) { + pr_err("Firmware loading failed\n"); + goto skip_ipu1; + } + + enable_ipu1_clocks(); + ret = rproc_dev_init(0); + if (ret) { + debug("%s: IPU1 failed to initialize on rproc (%d)\n", + __func__, ret); + goto skip_ipu1; + } + + ret = rproc_load(0, IPU1_LOAD_ADDR, 0x200); + if (ret) { + debug("%s: IPU1 failed to load on rproc (%d)\n", __func__, + ret); + goto skip_ipu1; + } + + debug("Starting IPU1...\n"); + + ret = rproc_start(0); + if (ret) + debug("%s: IPU1 failed to start (%d)\n", __func__, ret); + +skip_ipu1: + loadaddr = IPU2_LOAD_ADDR; + size = load_firmware("dra7-ipu2-fw.xem4", &loadaddr);
[PATCH 01/10] reset: dra7: Add a reset driver
From: Keerthy Add a reset driver to bring IPs out of reset. Signed-off-by: Keerthy [Amjad: reset_ops structure member "free" has been renamed to "rfree", use the latter instead] Signed-off-by: Amjad Ouled-Ameur --- MAINTAINERS| 1 + drivers/reset/Kconfig | 6 +++ drivers/reset/Makefile | 1 + drivers/reset/reset-dra7.c | 97 ++ 4 files changed, 105 insertions(+) create mode 100644 drivers/reset/reset-dra7.c diff --git a/MAINTAINERS b/MAINTAINERS index 67c96a604546..ce6e7ef08252 100644 --- a/MAINTAINERS +++ b/MAINTAINERS @@ -516,6 +516,7 @@ F: drivers/remoteproc/k3_system_controller.c F: drivers/remoteproc/pruc_rpoc.c F: drivers/remoteproc/ti* F: drivers/reset/reset-ti-sci.c +F: drivers/reset/reset-dra7.c F: drivers/rtc/davinci.c F: drivers/serial/serial_omap.c F: drivers/soc/ti/ diff --git a/drivers/reset/Kconfig b/drivers/reset/Kconfig index d73daf5e3189..b57714111b5a 100644 --- a/drivers/reset/Kconfig +++ b/drivers/reset/Kconfig @@ -206,4 +206,10 @@ config RESET_ZYNQMP passing request via Xilinx firmware interface to TF-A and PMU firmware. +config RESET_DRA7 + bool "Support for TI's DRA7 Reset driver" + depends on DM_RESET + help + Support for TI DRA7-RESET subsystem. Basic Assert/Deassert + is supported. endmenu diff --git a/drivers/reset/Makefile b/drivers/reset/Makefile index d69486bdeb9e..97e3a782c0d8 100644 --- a/drivers/reset/Makefile +++ b/drivers/reset/Makefile @@ -30,3 +30,4 @@ obj-$(CONFIG_RESET_SYSCON) += reset-syscon.o obj-$(CONFIG_RESET_RASPBERRYPI) += reset-raspberrypi.o obj-$(CONFIG_RESET_SCMI) += reset-scmi.o obj-$(CONFIG_RESET_ZYNQMP) += reset-zynqmp.o +obj-$(CONFIG_RESET_DRA7) += reset-dra7.o diff --git a/drivers/reset/reset-dra7.c b/drivers/reset/reset-dra7.c new file mode 100644 index ..585f8323c52e --- /dev/null +++ b/drivers/reset/reset-dra7.c @@ -0,0 +1,97 @@ +// SPDX-License-Identifier: GPL-2.0 +/* + * Texas Instruments DRA7 reset driver + * + * Copyright (C) 2019 Texas Instruments Incorporated - http://www.ti.com/ + * Author: Keerthy + */ + +#include +#include +#include +#include +#include + +struct dra7_reset_priv { + u32 rstctrl; + u32 rstst; + u8 nreset; +}; + +static int dra7_reset_request(struct reset_ctl *reset_ctl) +{ + return 0; +} + +static int dra7_reset_free(struct reset_ctl *reset_ctl) +{ + return 0; +} + +static inline void dra7_reset_rmw(u32 addr, u32 value, u32 mask) +{ + writel(((readl(addr) & (~mask)) | (value & mask)), addr); +} + +static int dra7_reset_deassert(struct reset_ctl *reset_ctl) +{ + struct dra7_reset_priv *priv = dev_get_priv(reset_ctl->dev); + int mask = 1 << reset_ctl->id; + + if (reset_ctl->id < 0 || reset_ctl->id >= priv->nreset) + return -EINVAL; + + dra7_reset_rmw(priv->rstctrl, 0x0, mask); + + while ((readl(priv->rstst) & mask) != mask) + ; + + return 0; +} + +static int dra7_reset_assert(struct reset_ctl *reset_ctl) +{ + struct dra7_reset_priv *priv = dev_get_priv(reset_ctl->dev); + int mask = 1 << reset_ctl->id; + + if (reset_ctl->id < 0 || reset_ctl->id >= priv->nreset) + return -EINVAL; + + dra7_reset_rmw(priv->rstctrl, mask, 0x0); + + return 0; +} + +struct reset_ops dra7_reset_ops = { + .request = dra7_reset_request, + .rfree = dra7_reset_free, + .rst_assert = dra7_reset_assert, + .rst_deassert = dra7_reset_deassert, +}; + +static const struct udevice_id dra7_reset_ids[] = { + { .compatible = "ti,dra7-reset" }, + { } +}; + +static int dra7_reset_probe(struct udevice *dev) +{ + struct dra7_reset_priv *priv = dev_get_priv(dev); + + priv->rstctrl = dev_read_addr(dev); + priv->rstst = priv->rstctrl + 0x4; + priv->nreset = dev_read_u32_default(dev, "ti,nresets", 1); + + dev_info(dev, "dra7-reset successfully probed %s\n", dev->name); + + return 0; +} + +U_BOOT_DRIVER(dra7_reset) = { + .name = "dra7_reset", + .id = UCLASS_RESET, + .of_match = dra7_reset_ids, + .probe = dra7_reset_probe, + .ops = &dra7_reset_ops, + .priv_auto = sizeof(struct dra7_reset_priv), +}; -- 2.25.1
[PATCH 00/10] dra7: bring up and support IPU load/start
This patchset enables support for loading and starting IPU firmware, the following have been implemented: - Enable fs_loader compilation at SPL Level, that is necessary in order to load IPU firmware from /boot partition. - Define necessary related IPU dts nodes. - Add necessary drivers and helpers to bring up, load and start IPU firmware. The underlying patches are interdependent, therefore should be applied in the order they are numbered in this patchset. Tests: - Please find SPL, u-boot and kernel console logs in here [0] - At SPL stage, debug logs have been enabled to make sure that IPU1 and IPU2 are loaded and started properly. In fact, these two log messages are only displayed when the firmware has been loaded, and if no errors appear afterwards, it means that firmware started successfully as well: - Starting IPU1... - Starting IPU2... At U-boot stage, "rproc" command-line tool was used for the testing. In the logs [0], "rproc list" was run before and after IPU1 and IPU2 are initialized by "rproc init". The before run gave an empty list, while the after run listed successfully the two IPUs with their correct addresses: - 0 - Name:'ipu@5882' type:'internal memory mapped' - 1 - Name:'ipu@5502' type:'internal memory mapped' "rproc start" and "rproc stop" were also used for both IPU1 and IPU2, both were successful as no error logs were displayed. [0]: https://pastebin.com/puCZ5GSm These U-boot/SPL flags have been purposely enabled during tests to ensure IPU load/start work properly: - CONFIG_DM_RESET=y - CONFIG_RESET_DRA7=y - CONFIG_SPL_DM_RESET=y - CONFIG_FS_LOADER=y - CONFIG_SPL_FS_LOADER=y - CONFIG_SPL_DRIVERS_MISC_SUPPORT=y - CONFIG_REMOTEPROC_TI_IPU=y - CONFIG_SPL_REMOTEPROC=y - CONFIG_CMD_REMOTEPROC=y Keerthy (10): reset: dra7: Add a reset driver arm: mach-omap2: load/start remoteproc IPU1/IPU2 drivers: misc: Makefile: Enable fs_loader compilation at SPL Level linux: bitmap.h: Add find_next_zero_area function remoteproc: uclass: Add remoteproc resource handling helpers remoteproc: ipu: Add driver to bring up ipu dts: dra7-ipu-common-early-boot.dtsi: Add all the ipu early boot related nodes arm: dts: dra7: Add ipu and related nodes arm: dts: dra7*/am57xx-idk-evm-u-boot: Add ipu early boot DT changes dts: am57xx*: Add ipu early boot DT changes MAINTAINERS | 4 + .../dts/am57xx-beagle-x15-revb1-u-boot.dtsi | 7 + .../dts/am57xx-beagle-x15-revc-u-boot.dtsi| 7 + arch/arm/dts/am57xx-beagle-x15-u-boot.dtsi| 7 + arch/arm/dts/am57xx-cl-som-am57x-u-boot.dtsi | 7 + arch/arm/dts/am57xx-idk-common-u-boot.dtsi| 1 + arch/arm/dts/am57xx-sbc-am57x-u-boot.dtsi | 7 + arch/arm/dts/dra7-evm-u-boot.dtsi | 1 + arch/arm/dts/dra7-ipu-common-early-boot.dtsi | 113 +++ arch/arm/dts/dra7.dtsi| 45 +- arch/arm/dts/dra71-evm-u-boot.dtsi| 1 + arch/arm/dts/dra72-evm-revc-u-boot.dtsi | 1 + arch/arm/dts/dra76-evm-u-boot.dtsi| 1 + arch/arm/include/asm/arch-omap5/clock.h | 3 + arch/arm/include/asm/omap_common.h| 10 + arch/arm/mach-k3/common.c | 10 +- arch/arm/mach-omap2/boot-common.c | 95 +++ arch/arm/mach-omap2/clocks-common.c | 33 + arch/arm/mach-omap2/omap5/hw_data.c | 92 ++- arch/arm/mach-omap2/omap5/prcm-regs.c | 9 +- configs/j721e_evm_r5_defconfig| 1 + configs/j721e_hs_evm_r5_defconfig | 1 + drivers/misc/Kconfig | 9 + drivers/misc/Makefile | 2 +- drivers/remoteproc/Kconfig| 10 + drivers/remoteproc/Makefile | 1 + drivers/remoteproc/ipu_rproc.c| 759 ++ drivers/remoteproc/rproc-uclass.c | 562 + drivers/reset/Kconfig | 6 + drivers/reset/Makefile| 1 + drivers/reset/reset-dra7.c| 97 +++ include/linux/bitmap.h| 26 + include/remoteproc.h | 384 - 33 files changed, 2296 insertions(+), 17 deletions(-) create mode 100644 arch/arm/dts/am57xx-beagle-x15-revb1-u-boot.dtsi create mode 100644 arch/arm/dts/am57xx-beagle-x15-revc-u-boot.dtsi create mode 100644 arch/arm/dts/am57xx-beagle-x15-u-boot.dtsi create mode 100644 arch/arm/dts/am57xx-cl-som-am57x-u-boot.dtsi create mode 100644 arch/arm/dts/am57xx-sbc-am57x-u-boot.dtsi create mode 100644 arch/arm/dts/dra7-ipu-common-early-boot.dtsi create mode 100644 drivers/remoteproc/ipu_rproc.c create mode 100644 drivers/reset/reset-dra7.c -- 2.25.1