All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH v2 00/16] General Tegra improvements
@ 2023-02-02 18:13 Svyatoslav Ryhel
  2023-02-02 18:13 ` [PATCH v2 01/16] tegra30: clock: add EXTPERIPH Svyatoslav Ryhel
                   ` (15 more replies)
  0 siblings, 16 replies; 26+ messages in thread
From: Svyatoslav Ryhel @ 2023-02-02 18:13 UTC (permalink / raw)
  To: Tom Warren, Alban Bedel, Stephen Warren, Marcel Ziswiler,
	Allen Martin, Jagan Teki, Lukasz Majewski, Marek Vasut,
	Svyatoslav Ryhel, Ramin Khonsari, Thierry Reding, Maxim Schwalm,
	Dmitry Osipenko
  Cc: u-boot

List of changes in patch set:
 - add missing EXTPERIPH clocks for t30
 - swap host1x and disp1 clock parents (as they should be)
 - add clk_id_to_pll_id and clock_decode_pair helpers to use
   dts deeper (in tegra clocks often go in pair child - parent)
 - include PLLD setup in T30 (DISP1 may use it as parent on
   some device)
 - fix Tegra PWM parent clock inline with linux
 - Tegra SLINK: patch to accept any word length (unlike 8bit
   aligned which was before)
 - provide default USB gadget setup for existing Nvidia boards
 - add late init function to be able to configure pre-boot stage
   (like uncovering serial number or setting mac address)
 - create common pre-dm i2c write for PMIC (used on T30 and T124
   to configure basic PMIC voltages required to boot like cpu and
   core voltages)
 - expose crypto module for all Tegra SoCs and implement BCT patching
   (ability to update bootloader from u-boot on production devices
   without need in host PC)

---
Changelog from v1
 - rebased to latest u-boot master 
 - PLLD setup for T30 moved specifically into T30 area
---

Maxim Schwalm (1):
  ARM: tegra: provide default USB gadget setup

Ramin Khonsari (1):
  ARM: tegra30: implement BCT patching

Svyatoslav Ryhel (14):
  tegra30: clock: add EXTPERIPH
  ARM: t20/t30: swap host1x and disp1 clock parents
  ARM: tegra: clock: add clk_id_to_pll_id helper
  ARM: tegra: clock: add clock_decode_pair helper
  ARM: tegra30: add PLLD to pll setup
  ARM: tegra: Fix Tegra PWM parent clock
  spi: tegra20_slink: accept any word length
  ARM: tegra: add late init support
  ARM: tegra: create common pre-dm i2c write
  board: tegra124: switch to updated pre-dm i2c write
  board: tegra30: switch to updated pre-dm i2c write
  ARM: tegra: expose crypto module for all Tegra SoCs
  ARM: tegra: crypto: extend crypto functional
  ARM: tegra20: implement BCT patching

 arch/arm/dts/tegra114.dtsi                    |  2 +-
 arch/arm/dts/tegra124.dtsi                    |  2 +-
 arch/arm/include/asm/arch-tegra/clock.h       | 21 +++++
 arch/arm/include/asm/arch-tegra/crypto.h      | 47 ++++++++++
 arch/arm/include/asm/arch-tegra/sys_proto.h   |  6 ++
 arch/arm/include/asm/arch-tegra/tegra_i2c.h   | 17 ++++
 .../include/asm/arch-tegra30/clock-tables.h   |  6 +-
 arch/arm/mach-tegra/Kconfig                   | 15 ++++
 arch/arm/mach-tegra/Makefile                  |  1 +
 arch/arm/mach-tegra/board2.c                  |  2 +
 arch/arm/mach-tegra/clock.c                   | 23 +++++
 arch/arm/mach-tegra/cpu.h                     |  1 -
 arch/arm/mach-tegra/{tegra20 => }/crypto.c    | 63 +++++++++----
 arch/arm/mach-tegra/tegra114/clock.c          | 39 +++++++-
 arch/arm/mach-tegra/tegra124/clock.c          | 40 ++++++++-
 arch/arm/mach-tegra/tegra124/cpu.c            |  4 +
 arch/arm/mach-tegra/tegra20/Kconfig           |  1 +
 arch/arm/mach-tegra/tegra20/Makefile          |  7 +-
 arch/arm/mach-tegra/tegra20/bct.c             | 78 ++++++++++++++++
 arch/arm/mach-tegra/tegra20/bct.h             | 42 +++++++++
 arch/arm/mach-tegra/tegra20/clock.c           | 43 ++++++++-
 arch/arm/mach-tegra/tegra20/crypto.h          | 19 ----
 arch/arm/mach-tegra/tegra210/clock.c          | 39 +++++++-
 arch/arm/mach-tegra/tegra30/Kconfig           |  8 --
 arch/arm/mach-tegra/tegra30/Makefile          |  1 +
 arch/arm/mach-tegra/tegra30/bct.c             | 78 ++++++++++++++++
 arch/arm/mach-tegra/tegra30/bct.h             | 42 +++++++++
 arch/arm/mach-tegra/tegra30/clock.c           | 90 +++++++++++++++++--
 arch/arm/mach-tegra/tegra30/cpu.c             | 55 +-----------
 board/avionic-design/tec-ng/Makefile          |  4 +-
 board/avionic-design/tec-ng/tec-ng-spl.c      | 34 +++++++
 board/nvidia/beaver/Makefile                  |  2 +
 board/nvidia/beaver/beaver-spl.c              | 43 +++++++++
 board/nvidia/cardhu/Makefile                  |  4 +-
 board/nvidia/cardhu/cardhu-spl.c              | 43 +++++++++
 board/nvidia/venice2/as3722_init.c            | 65 +++++++++-----
 board/nvidia/venice2/as3722_init.h            | 43 ---------
 board/toradex/apalis-tk1/as3722_init.c        | 85 ++++++++++--------
 board/toradex/apalis-tk1/as3722_init.h        | 40 ---------
 board/toradex/apalis_t30/Makefile             |  2 +
 board/toradex/apalis_t30/apalis_t30-spl.c     | 34 +++++++
 board/toradex/colibri_t30/Makefile            |  2 +
 board/toradex/colibri_t30/colibri_t30-spl.c   | 34 +++++++
 configs/beaver_defconfig                      |  3 -
 configs/cei-tk1-som_defconfig                 |  3 -
 configs/dalmore_defconfig                     |  3 -
 configs/jetson-tk1_defconfig                  |  3 -
 configs/nyan-big_defconfig                    |  3 -
 configs/p2371-0000_defconfig                  |  3 -
 configs/p2371-2180_defconfig                  |  3 -
 configs/p2571_defconfig                       |  3 -
 configs/p3450-0000_defconfig                  |  3 -
 configs/venice2_defconfig                     |  3 -
 drivers/pwm/tegra_pwm.c                       | 10 ++-
 drivers/spi/tegra20_slink.c                   | 19 ++--
 drivers/usb/gadget/Kconfig                    |  3 +
 56 files changed, 980 insertions(+), 309 deletions(-)
 create mode 100644 arch/arm/include/asm/arch-tegra/crypto.h
 rename arch/arm/mach-tegra/{tegra20 => }/crypto.c (68%)
 create mode 100644 arch/arm/mach-tegra/tegra20/bct.c
 create mode 100644 arch/arm/mach-tegra/tegra20/bct.h
 delete mode 100644 arch/arm/mach-tegra/tegra20/crypto.h
 create mode 100644 arch/arm/mach-tegra/tegra30/bct.c
 create mode 100644 arch/arm/mach-tegra/tegra30/bct.h
 create mode 100644 board/avionic-design/tec-ng/tec-ng-spl.c
 create mode 100644 board/nvidia/beaver/beaver-spl.c
 create mode 100644 board/nvidia/cardhu/cardhu-spl.c
 delete mode 100644 board/nvidia/venice2/as3722_init.h
 delete mode 100644 board/toradex/apalis-tk1/as3722_init.h
 create mode 100644 board/toradex/apalis_t30/apalis_t30-spl.c
 create mode 100644 board/toradex/colibri_t30/colibri_t30-spl.c

-- 
2.37.2


^ permalink raw reply	[flat|nested] 26+ messages in thread

* [PATCH v2 01/16] tegra30: clock: add EXTPERIPH
  2023-02-02 18:13 [PATCH v2 00/16] General Tegra improvements Svyatoslav Ryhel
@ 2023-02-02 18:13 ` Svyatoslav Ryhel
  2023-02-03  2:15   ` Simon Glass
  2023-02-02 18:13 ` [PATCH v2 02/16] ARM: t20/t30: swap host1x and disp1 clock parents Svyatoslav Ryhel
                   ` (14 subsequent siblings)
  15 siblings, 1 reply; 26+ messages in thread
From: Svyatoslav Ryhel @ 2023-02-02 18:13 UTC (permalink / raw)
  To: Tom Warren, Alban Bedel, Stephen Warren, Marcel Ziswiler,
	Allen Martin, Jagan Teki, Lukasz Majewski, Marek Vasut,
	Svyatoslav Ryhel, Ramin Khonsari, Thierry Reding, Maxim Schwalm,
	Dmitry Osipenko
  Cc: u-boot

This mappings were missing for some reason.

Tested-by: Svyatoslav Ryhel <clamor95@gmail.com> # LG P895 T30
Signed-off-by: Svyatoslav Ryhel <clamor95@gmail.com>
---
 arch/arm/include/asm/arch-tegra30/clock-tables.h | 6 +++---
 arch/arm/mach-tegra/tegra30/clock.c              | 6 +++---
 2 files changed, 6 insertions(+), 6 deletions(-)

diff --git a/arch/arm/include/asm/arch-tegra30/clock-tables.h b/arch/arm/include/asm/arch-tegra30/clock-tables.h
index 8588009c61..6c899ff64c 100644
--- a/arch/arm/include/asm/arch-tegra30/clock-tables.h
+++ b/arch/arm/include/asm/arch-tegra30/clock-tables.h
@@ -190,9 +190,9 @@ enum periph_id {
 	PERIPH_ID_ACTMON,
 
 	/* 24 */
-	PERIPH_ID_EX_RESERVED24,
-	PERIPH_ID_EX_RESERVED25,
-	PERIPH_ID_EX_RESERVED26,
+	PERIPH_ID_EXTPERIPH1,
+	PERIPH_ID_EXTPERIPH2,
+	PERIPH_ID_EXTPERIPH3,
 	PERIPH_ID_EX_RESERVED27,
 	PERIPH_ID_SATA,
 	PERIPH_ID_HDA,
diff --git a/arch/arm/mach-tegra/tegra30/clock.c b/arch/arm/mach-tegra/tegra30/clock.c
index 449b66e3b2..04ad5c504d 100644
--- a/arch/arm/mach-tegra/tegra30/clock.c
+++ b/arch/arm/mach-tegra/tegra30/clock.c
@@ -377,9 +377,9 @@ static s8 periph_id_to_internal_id[PERIPH_ID_COUNT] = {
 	PERIPHC_ACTMON,
 
 	/* 24 */
-	NONE(RESERVED24),
-	NONE(RESERVED25),
-	NONE(RESERVED26),
+	PERIPHC_EXTPERIPH1,
+	PERIPHC_EXTPERIPH2,
+	PERIPHC_EXTPERIPH3,
 	NONE(RESERVED27),
 	PERIPHC_SATA,
 	PERIPHC_HDA,
-- 
2.37.2


^ permalink raw reply related	[flat|nested] 26+ messages in thread

* [PATCH v2 02/16] ARM: t20/t30: swap host1x and disp1 clock parents
  2023-02-02 18:13 [PATCH v2 00/16] General Tegra improvements Svyatoslav Ryhel
  2023-02-02 18:13 ` [PATCH v2 01/16] tegra30: clock: add EXTPERIPH Svyatoslav Ryhel
@ 2023-02-02 18:13 ` Svyatoslav Ryhel
  2023-02-02 18:13 ` [PATCH v2 03/16] ARM: tegra: clock: add clk_id_to_pll_id helper Svyatoslav Ryhel
                   ` (13 subsequent siblings)
  15 siblings, 0 replies; 26+ messages in thread
From: Svyatoslav Ryhel @ 2023-02-02 18:13 UTC (permalink / raw)
  To: Tom Warren, Alban Bedel, Stephen Warren, Marcel Ziswiler,
	Allen Martin, Jagan Teki, Lukasz Majewski, Marek Vasut,
	Svyatoslav Ryhel, Ramin Khonsari, Thierry Reding, Maxim Schwalm,
	Dmitry Osipenko
  Cc: u-boot

According to mainline clock tables and TRM HOST1X
parent is PLLC, while DISP1 usually uses PLLP as
parent clock.

Tested-by: Andreas Westman Dorcsak <hedmoo@yahoo.com> # ASUS TF T30
Tested-by: Robert Eckelmann <longnoserob@gmail.com> # ASUS TF101 T20
Tested-by: Svyatoslav Ryhel <clamor95@gmail.com> # LG P895 T30
Signed-off-by: Svyatoslav Ryhel <clamor95@gmail.com>
---
 arch/arm/mach-tegra/tegra20/clock.c | 4 ++--
 arch/arm/mach-tegra/tegra30/clock.c | 4 ++--
 2 files changed, 4 insertions(+), 4 deletions(-)

diff --git a/arch/arm/mach-tegra/tegra20/clock.c b/arch/arm/mach-tegra/tegra20/clock.c
index 8c127430aa..0316073d1a 100644
--- a/arch/arm/mach-tegra/tegra20/clock.c
+++ b/arch/arm/mach-tegra/tegra20/clock.c
@@ -760,8 +760,8 @@ struct periph_clk_init periph_clk_init_table[] = {
 	{ PERIPH_ID_SBC2, CLOCK_ID_PERIPH },
 	{ PERIPH_ID_SBC3, CLOCK_ID_PERIPH },
 	{ PERIPH_ID_SBC4, CLOCK_ID_PERIPH },
-	{ PERIPH_ID_HOST1X, CLOCK_ID_PERIPH },
-	{ PERIPH_ID_DISP1, CLOCK_ID_CGENERAL },
+	{ PERIPH_ID_HOST1X, CLOCK_ID_CGENERAL },
+	{ PERIPH_ID_DISP1, CLOCK_ID_PERIPH },
 	{ PERIPH_ID_NDFLASH, CLOCK_ID_PERIPH },
 	{ PERIPH_ID_SDMMC1, CLOCK_ID_PERIPH },
 	{ PERIPH_ID_SDMMC2, CLOCK_ID_PERIPH },
diff --git a/arch/arm/mach-tegra/tegra30/clock.c b/arch/arm/mach-tegra/tegra30/clock.c
index 04ad5c504d..e5c2fd542c 100644
--- a/arch/arm/mach-tegra/tegra30/clock.c
+++ b/arch/arm/mach-tegra/tegra30/clock.c
@@ -799,8 +799,8 @@ struct periph_clk_init periph_clk_init_table[] = {
 	{ PERIPH_ID_SBC4, CLOCK_ID_PERIPH },
 	{ PERIPH_ID_SBC5, CLOCK_ID_PERIPH },
 	{ PERIPH_ID_SBC6, CLOCK_ID_PERIPH },
-	{ PERIPH_ID_HOST1X, CLOCK_ID_PERIPH },
-	{ PERIPH_ID_DISP1, CLOCK_ID_CGENERAL },
+	{ PERIPH_ID_HOST1X, CLOCK_ID_CGENERAL },
+	{ PERIPH_ID_DISP1, CLOCK_ID_PERIPH },
 	{ PERIPH_ID_NDFLASH, CLOCK_ID_PERIPH },
 	{ PERIPH_ID_SDMMC1, CLOCK_ID_PERIPH },
 	{ PERIPH_ID_SDMMC2, CLOCK_ID_PERIPH },
-- 
2.37.2


^ permalink raw reply related	[flat|nested] 26+ messages in thread

* [PATCH v2 03/16] ARM: tegra: clock: add clk_id_to_pll_id helper
  2023-02-02 18:13 [PATCH v2 00/16] General Tegra improvements Svyatoslav Ryhel
  2023-02-02 18:13 ` [PATCH v2 01/16] tegra30: clock: add EXTPERIPH Svyatoslav Ryhel
  2023-02-02 18:13 ` [PATCH v2 02/16] ARM: t20/t30: swap host1x and disp1 clock parents Svyatoslav Ryhel
@ 2023-02-02 18:13 ` Svyatoslav Ryhel
  2023-02-02 22:05   ` Tom Warren
  2023-02-02 18:13 ` [PATCH v2 04/16] ARM: tegra: clock: add clock_decode_pair helper Svyatoslav Ryhel
                   ` (12 subsequent siblings)
  15 siblings, 1 reply; 26+ messages in thread
From: Svyatoslav Ryhel @ 2023-02-02 18:13 UTC (permalink / raw)
  To: Tom Warren, Alban Bedel, Stephen Warren, Marcel Ziswiler,
	Allen Martin, Jagan Teki, Lukasz Majewski, Marek Vasut,
	Svyatoslav Ryhel, Ramin Khonsari, Thierry Reding, Maxim Schwalm,
	Dmitry Osipenko
  Cc: u-boot

This function allows to convert a device tree clock ID to PLL ID.

Tested-by: Andreas Westman Dorcsak <hedmoo@yahoo.com> # ASUS TF T30
Tested-by: Robert Eckelmann <longnoserob@gmail.com> # ASUS TF101 T20
Tested-by: Svyatoslav Ryhel <clamor95@gmail.com> # HTC One X
Signed-off-by: Svyatoslav Ryhel <clamor95@gmail.com>
---
 arch/arm/include/asm/arch-tegra/clock.h |  8 ++++++
 arch/arm/mach-tegra/tegra114/clock.c    | 37 ++++++++++++++++++++++++
 arch/arm/mach-tegra/tegra124/clock.c    | 38 +++++++++++++++++++++++++
 arch/arm/mach-tegra/tegra20/clock.c     | 37 ++++++++++++++++++++++++
 arch/arm/mach-tegra/tegra210/clock.c    | 37 ++++++++++++++++++++++++
 arch/arm/mach-tegra/tegra30/clock.c     | 37 ++++++++++++++++++++++++
 6 files changed, 194 insertions(+)

diff --git a/arch/arm/include/asm/arch-tegra/clock.h b/arch/arm/include/asm/arch-tegra/clock.h
index 1dd5d0742c..2270501406 100644
--- a/arch/arm/include/asm/arch-tegra/clock.h
+++ b/arch/arm/include/asm/arch-tegra/clock.h
@@ -354,6 +354,14 @@ int get_periph_clock_source(enum periph_id periph_id,
  */
 enum periph_id clk_id_to_periph_id(int clk_id);
 
+/*
+ * Convert a device tree clock ID to our PLL ID.
+ *
+ * @param clk_id	Clock ID according to tegra device tree binding
+ * Return: clock ID, or CLOCK_ID_NONE if the clock ID is invalid
+ */
+enum clock_id clk_id_to_pll_id(int clk_id);
+
 /**
  * Set the output frequency you want for each PLL clock.
  * PLL output frequencies are programmed by setting their N, M and P values.
diff --git a/arch/arm/mach-tegra/tegra114/clock.c b/arch/arm/mach-tegra/tegra114/clock.c
index 143f86863f..c019b2d0cd 100644
--- a/arch/arm/mach-tegra/tegra114/clock.c
+++ b/arch/arm/mach-tegra/tegra114/clock.c
@@ -19,6 +19,8 @@
 #include <fdtdec.h>
 #include <linux/delay.h>
 
+#include <dt-bindings/clock/tegra114-car.h>
+
 /*
  * Clock types that we can use as a source. The Tegra114 has muxes for the
  * peripheral clocks, and in most cases there are four options for the clock
@@ -646,6 +648,41 @@ enum periph_id clk_id_to_periph_id(int clk_id)
 		return clk_id;
 	}
 }
+
+/*
+ * Convert a device tree clock ID to our PLL ID.
+ *
+ * @param clk_id	Clock ID according to tegra114 device tree binding
+ * Return: clock ID, or CLOCK_ID_NONE if the clock ID is invalid
+ */
+enum clock_id clk_id_to_pll_id(int clk_id)
+{
+	switch (clk_id) {
+	case TEGRA114_CLK_PLL_C:
+		return CLOCK_ID_CGENERAL;
+	case TEGRA114_CLK_PLL_M:
+		return CLOCK_ID_MEMORY;
+	case TEGRA114_CLK_PLL_P:
+		return CLOCK_ID_PERIPH;
+	case TEGRA114_CLK_PLL_A:
+		return CLOCK_ID_AUDIO;
+	case TEGRA114_CLK_PLL_U:
+		return CLOCK_ID_USB;
+	case TEGRA114_CLK_PLL_D:
+	case TEGRA114_CLK_PLL_D_OUT0:
+		return CLOCK_ID_DISPLAY;
+	case TEGRA114_CLK_PLL_X:
+		return CLOCK_ID_XCPU;
+	case TEGRA114_CLK_PLL_E:
+		return CLOCK_ID_EPCI;
+	case TEGRA114_CLK_CLK_32K:
+		return CLOCK_ID_32KHZ;
+	case TEGRA114_CLK_CLK_M:
+		return CLOCK_ID_CLK_M;
+	default:
+		return CLOCK_ID_NONE;
+	}
+}
 #endif /* CONFIG_IS_ENABLED(OF_CONTROL) */
 
 void clock_early_init(void)
diff --git a/arch/arm/mach-tegra/tegra124/clock.c b/arch/arm/mach-tegra/tegra124/clock.c
index da38b26c27..415ba15e5d 100644
--- a/arch/arm/mach-tegra/tegra124/clock.c
+++ b/arch/arm/mach-tegra/tegra124/clock.c
@@ -19,6 +19,9 @@
 #include <fdtdec.h>
 #include <linux/delay.h>
 
+#include <dt-bindings/clock/tegra124-car.h>
+#include <dt-bindings/clock/tegra124-car-common.h>
+
 /*
  * Clock types that we can use as a source. The Tegra124 has muxes for the
  * peripheral clocks, and in most cases there are four options for the clock
@@ -826,6 +829,41 @@ enum periph_id clk_id_to_periph_id(int clk_id)
 		return clk_id;
 	}
 }
+
+/*
+ * Convert a device tree clock ID to our PLL ID.
+ *
+ * @param clk_id	Clock ID according to tegra124 device tree binding
+ * Return: clock ID, or CLOCK_ID_NONE if the clock ID is invalid
+ */
+enum clock_id clk_id_to_pll_id(int clk_id)
+{
+	switch (clk_id) {
+	case TEGRA124_CLK_PLL_C:
+		return CLOCK_ID_CGENERAL;
+	case TEGRA124_CLK_PLL_M:
+		return CLOCK_ID_MEMORY;
+	case TEGRA124_CLK_PLL_P:
+		return CLOCK_ID_PERIPH;
+	case TEGRA124_CLK_PLL_A:
+		return CLOCK_ID_AUDIO;
+	case TEGRA124_CLK_PLL_U:
+		return CLOCK_ID_USB;
+	case TEGRA124_CLK_PLL_D:
+	case TEGRA124_CLK_PLL_D_OUT0:
+		return CLOCK_ID_DISPLAY;
+	case TEGRA124_CLK_PLL_X:
+		return CLOCK_ID_XCPU;
+	case TEGRA124_CLK_PLL_E:
+		return CLOCK_ID_EPCI;
+	case TEGRA124_CLK_CLK_32K:
+		return CLOCK_ID_32KHZ;
+	case TEGRA124_CLK_CLK_M:
+		return CLOCK_ID_CLK_M;
+	default:
+		return CLOCK_ID_NONE;
+	}
+}
 #endif /* CONFIG_IS_ENABLED(OF_CONTROL) */
 
 void clock_early_init(void)
diff --git a/arch/arm/mach-tegra/tegra20/clock.c b/arch/arm/mach-tegra/tegra20/clock.c
index 0316073d1a..593622bfdc 100644
--- a/arch/arm/mach-tegra/tegra20/clock.c
+++ b/arch/arm/mach-tegra/tegra20/clock.c
@@ -20,6 +20,8 @@
 #include <fdtdec.h>
 #include <linux/delay.h>
 
+#include <dt-bindings/clock/tegra20-car.h>
+
 /*
  * Clock types that we can use as a source. The Tegra20 has muxes for the
  * peripheral clocks, and in most cases there are four options for the clock
@@ -578,6 +580,41 @@ enum periph_id clk_id_to_periph_id(int clk_id)
 		return clk_id;
 	}
 }
+
+/*
+ * Convert a device tree clock ID to our PLL ID.
+ *
+ * @param clk_id	Clock ID according to tegra20 device tree binding
+ * Return: clock ID, or CLOCK_ID_NONE if the clock ID is invalid
+ */
+enum clock_id clk_id_to_pll_id(int clk_id)
+{
+	switch (clk_id) {
+	case TEGRA20_CLK_PLL_C:
+		return CLOCK_ID_CGENERAL;
+	case TEGRA20_CLK_PLL_M:
+		return CLOCK_ID_MEMORY;
+	case TEGRA20_CLK_PLL_P:
+		return CLOCK_ID_PERIPH;
+	case TEGRA20_CLK_PLL_A:
+		return CLOCK_ID_AUDIO;
+	case TEGRA20_CLK_PLL_U:
+		return CLOCK_ID_USB;
+	case TEGRA20_CLK_PLL_D:
+	case TEGRA20_CLK_PLL_D_OUT0:
+		return CLOCK_ID_DISPLAY;
+	case TEGRA20_CLK_PLL_X:
+		return CLOCK_ID_XCPU;
+	case TEGRA20_CLK_PLL_E:
+		return CLOCK_ID_EPCI;
+	case TEGRA20_CLK_CLK_32K:
+		return CLOCK_ID_32KHZ;
+	case TEGRA20_CLK_CLK_M:
+		return CLOCK_ID_CLK_M;
+	default:
+		return CLOCK_ID_NONE;
+	}
+}
 #endif /* CONFIG_IS_ENABLED(OF_CONTROL) */
 
 void clock_early_init(void)
diff --git a/arch/arm/mach-tegra/tegra210/clock.c b/arch/arm/mach-tegra/tegra210/clock.c
index 330753f2ad..76fbfef580 100644
--- a/arch/arm/mach-tegra/tegra210/clock.c
+++ b/arch/arm/mach-tegra/tegra210/clock.c
@@ -22,6 +22,8 @@
 #include <linux/bitops.h>
 #include <linux/delay.h>
 
+#include <dt-bindings/clock/tegra210-car.h>
+
 /*
  * Clock types that we can use as a source. The Tegra210 has muxes for the
  * peripheral clocks, and in most cases there are four options for the clock
@@ -914,6 +916,41 @@ enum periph_id clk_id_to_periph_id(int clk_id)
 		return clk_id;
 	}
 }
+
+/*
+ * Convert a device tree clock ID to our PLL ID.
+ *
+ * @param clk_id	Clock ID according to tegra210 device tree binding
+ * Return: clock ID, or CLOCK_ID_NONE if the clock ID is invalid
+ */
+enum clock_id clk_id_to_pll_id(int clk_id)
+{
+	switch (clk_id) {
+	case TEGRA210_CLK_PLL_C:
+		return CLOCK_ID_CGENERAL;
+	case TEGRA210_CLK_PLL_M:
+		return CLOCK_ID_MEMORY;
+	case TEGRA210_CLK_PLL_P:
+		return CLOCK_ID_PERIPH;
+	case TEGRA210_CLK_PLL_A:
+		return CLOCK_ID_AUDIO;
+	case TEGRA210_CLK_PLL_U:
+		return CLOCK_ID_USB;
+	case TEGRA210_CLK_PLL_D:
+	case TEGRA210_CLK_PLL_D_OUT0:
+		return CLOCK_ID_DISPLAY;
+	case TEGRA210_CLK_PLL_X:
+		return CLOCK_ID_XCPU;
+	case TEGRA210_CLK_PLL_E:
+		return CLOCK_ID_EPCI;
+	case TEGRA210_CLK_CLK_32K:
+		return CLOCK_ID_32KHZ;
+	case TEGRA210_CLK_CLK_M:
+		return CLOCK_ID_CLK_M;
+	default:
+		return CLOCK_ID_NONE;
+	}
+}
 #endif /* CONFIG_OF_CONTROL */
 
 /*
diff --git a/arch/arm/mach-tegra/tegra30/clock.c b/arch/arm/mach-tegra/tegra30/clock.c
index e5c2fd542c..dcdd0d0978 100644
--- a/arch/arm/mach-tegra/tegra30/clock.c
+++ b/arch/arm/mach-tegra/tegra30/clock.c
@@ -19,6 +19,8 @@
 #include <fdtdec.h>
 #include <linux/delay.h>
 
+#include <dt-bindings/clock/tegra30-car.h>
+
 /*
  * Clock types that we can use as a source. The Tegra30 has muxes for the
  * peripheral clocks, and in most cases there are four options for the clock
@@ -628,6 +630,41 @@ enum periph_id clk_id_to_periph_id(int clk_id)
 		return clk_id;
 	}
 }
+
+/*
+ * Convert a device tree clock ID to our PLL ID.
+ *
+ * @param clk_id	Clock ID according to tegra30 device tree binding
+ * Return: clock ID, or CLOCK_ID_NONE if the clock ID is invalid
+ */
+enum clock_id clk_id_to_pll_id(int clk_id)
+{
+	switch (clk_id) {
+	case TEGRA30_CLK_PLL_C:
+		return CLOCK_ID_CGENERAL;
+	case TEGRA30_CLK_PLL_M:
+		return CLOCK_ID_MEMORY;
+	case TEGRA30_CLK_PLL_P:
+		return CLOCK_ID_PERIPH;
+	case TEGRA30_CLK_PLL_A:
+		return CLOCK_ID_AUDIO;
+	case TEGRA30_CLK_PLL_U:
+		return CLOCK_ID_USB;
+	case TEGRA30_CLK_PLL_D:
+	case TEGRA30_CLK_PLL_D_OUT0:
+		return CLOCK_ID_DISPLAY;
+	case TEGRA30_CLK_PLL_X:
+		return CLOCK_ID_XCPU;
+	case TEGRA30_CLK_PLL_E:
+		return CLOCK_ID_EPCI;
+	case TEGRA30_CLK_CLK_32K:
+		return CLOCK_ID_32KHZ;
+	case TEGRA30_CLK_CLK_M:
+		return CLOCK_ID_CLK_M;
+	default:
+		return CLOCK_ID_NONE;
+	}
+}
 #endif /* CONFIG_IS_ENABLED(OF_CONTROL) */
 
 void clock_early_init(void)
-- 
2.37.2


^ permalink raw reply related	[flat|nested] 26+ messages in thread

* [PATCH v2 04/16] ARM: tegra: clock: add clock_decode_pair helper
  2023-02-02 18:13 [PATCH v2 00/16] General Tegra improvements Svyatoslav Ryhel
                   ` (2 preceding siblings ...)
  2023-02-02 18:13 ` [PATCH v2 03/16] ARM: tegra: clock: add clk_id_to_pll_id helper Svyatoslav Ryhel
@ 2023-02-02 18:13 ` Svyatoslav Ryhel
  2023-02-02 18:13 ` [PATCH v2 05/16] ARM: tegra30: add PLLD to pll setup Svyatoslav Ryhel
                   ` (11 subsequent siblings)
  15 siblings, 0 replies; 26+ messages in thread
From: Svyatoslav Ryhel @ 2023-02-02 18:13 UTC (permalink / raw)
  To: Tom Warren, Alban Bedel, Stephen Warren, Marcel Ziswiler,
	Allen Martin, Jagan Teki, Lukasz Majewski, Marek Vasut,
	Svyatoslav Ryhel, Ramin Khonsari, Thierry Reding, Maxim Schwalm,
	Dmitry Osipenko
  Cc: u-boot

Get periph clock id and its parent from device tree.
This works by looking up the peripheral's 'clocks' node and
reading out the second and fourth cells, which are the
peripheral and PLL clock numbers.

Signed-off-by: Svyatoslav Ryhel <clamor95@gmail.com>
---
 arch/arm/include/asm/arch-tegra/clock.h | 13 +++++++++++++
 arch/arm/mach-tegra/clock.c             | 23 +++++++++++++++++++++++
 2 files changed, 36 insertions(+)

diff --git a/arch/arm/include/asm/arch-tegra/clock.h b/arch/arm/include/asm/arch-tegra/clock.h
index 2270501406..61ef81e7fe 100644
--- a/arch/arm/include/asm/arch-tegra/clock.h
+++ b/arch/arm/include/asm/arch-tegra/clock.h
@@ -270,6 +270,19 @@ void clock_ll_start_uart(enum periph_id periph_id);
  */
 int clock_decode_periph_id(struct udevice *dev);
 
+/**
+ * Get periph clock id and its parent from device tree.
+ *
+ * This works by looking up the peripheral's 'clocks' node and reading out
+ * the second and fourth cells, which are the peripheral and PLL clock numbers.
+ *
+ * @param dev          udevice associated with FDT node
+ * @param clk_id       pointer to int array of 2 values
+ *                     first is periph clock, second is
+ *                     its PLL parent according to FDT.
+ */
+int clock_decode_pair(struct udevice *dev, int *clk_id);
+
 /**
  * Checks if the oscillator bypass is enabled (XOBP bit)
  *
diff --git a/arch/arm/mach-tegra/clock.c b/arch/arm/mach-tegra/clock.c
index 11bffc1701..966009f375 100644
--- a/arch/arm/mach-tegra/clock.c
+++ b/arch/arm/mach-tegra/clock.c
@@ -678,6 +678,29 @@ int clock_decode_periph_id(struct udevice *dev)
 	assert(clock_periph_id_isvalid(id));
 	return id;
 }
+
+/*
+ * Get periph clock id and its parent from device tree.
+ *
+ * @param dev		udevice associated with FDT node
+ * @param clk_id	pointer to u32 array of 2 values
+ *			first is periph clock, second is
+ *			its PLL parent according to FDT.
+ */
+int clock_decode_pair(struct udevice *dev, int *clk_id)
+{
+	u32 cell[4];
+	int err;
+
+	err = dev_read_u32_array(dev, "clocks", cell, ARRAY_SIZE(cell));
+	if (err)
+		return -EINVAL;
+
+	clk_id[0] = clk_id_to_periph_id(cell[1]);
+	clk_id[1] = clk_id_to_pll_id(cell[3]);
+
+	return 0;
+}
 #endif /* CONFIG_IS_ENABLED(OF_CONTROL) */
 
 int clock_verify(void)
-- 
2.37.2


^ permalink raw reply related	[flat|nested] 26+ messages in thread

* [PATCH v2 05/16] ARM: tegra30: add PLLD to pll setup
  2023-02-02 18:13 [PATCH v2 00/16] General Tegra improvements Svyatoslav Ryhel
                   ` (3 preceding siblings ...)
  2023-02-02 18:13 ` [PATCH v2 04/16] ARM: tegra: clock: add clock_decode_pair helper Svyatoslav Ryhel
@ 2023-02-02 18:13 ` Svyatoslav Ryhel
  2023-02-02 18:13 ` [PATCH v2 06/16] ARM: tegra: Fix Tegra PWM parent clock Svyatoslav Ryhel
                   ` (10 subsequent siblings)
  15 siblings, 0 replies; 26+ messages in thread
From: Svyatoslav Ryhel @ 2023-02-02 18:13 UTC (permalink / raw)
  To: Tom Warren, Alban Bedel, Stephen Warren, Marcel Ziswiler,
	Allen Martin, Jagan Teki, Lukasz Majewski, Marek Vasut,
	Svyatoslav Ryhel, Ramin Khonsari, Thierry Reding, Maxim Schwalm,
	Dmitry Osipenko
  Cc: u-boot

On T30 unlike T20 dsi panels are wider used on devices
and PLLD is used as DISP1 parent more often, so lets
enable it as well for this cases.

Tested-by: Andreas Westman Dorcsak <hedmoo@yahoo.com> # ASUS TF700T T30
Tested-by: Svyatoslav Ryhel <clamor95@gmail.com> # HTC One X T30
Signed-off-by: Svyatoslav Ryhel <clamor95@gmail.com>
---
 arch/arm/mach-tegra/tegra30/clock.c | 41 +++++++++++++++++++++++++++++
 1 file changed, 41 insertions(+)

diff --git a/arch/arm/mach-tegra/tegra30/clock.c b/arch/arm/mach-tegra/tegra30/clock.c
index dcdd0d0978..b66211ce94 100644
--- a/arch/arm/mach-tegra/tegra30/clock.c
+++ b/arch/arm/mach-tegra/tegra30/clock.c
@@ -669,7 +669,48 @@ enum clock_id clk_id_to_pll_id(int clk_id)
 
 void clock_early_init(void)
 {
+	struct clk_rst_ctlr *clkrst =
+		(struct clk_rst_ctlr *)NV_PA_CLK_RST_BASE;
+	struct clk_pll_info *pllinfo;
+	u32 data;
+
 	tegra30_set_up_pllp();
+
+	/*
+	 * PLLD output frequency set to 925Mhz
+	 */
+	switch (clock_get_osc_freq()) {
+	case CLOCK_OSC_FREQ_12_0: /* OSC is 12Mhz */
+	case CLOCK_OSC_FREQ_48_0: /* OSC is 48Mhz */
+		clock_set_rate(CLOCK_ID_DISPLAY, 925, 12, 0, 12);
+		break;
+
+	case CLOCK_OSC_FREQ_26_0: /* OSC is 26Mhz */
+		clock_set_rate(CLOCK_ID_DISPLAY, 925, 26, 0, 12);
+		break;
+
+	case CLOCK_OSC_FREQ_13_0: /* OSC is 13Mhz */
+	case CLOCK_OSC_FREQ_16_8: /* OSC is 16.8Mhz */
+		clock_set_rate(CLOCK_ID_DISPLAY, 925, 13, 0, 12);
+		break;
+
+	case CLOCK_OSC_FREQ_19_2:
+	case CLOCK_OSC_FREQ_38_4:
+	default:
+		/*
+		 * These are not supported. It is too early to print a
+		 * message and the UART likely won't work anyway due to the
+		 * oscillator being wrong.
+		 */
+		break;
+	}
+
+	/* PLLD_MISC: Set CLKENABLE, CPCON 12, LFCON 1, and enable lock */
+	pllinfo = &tegra_pll_info_table[CLOCK_ID_DISPLAY];
+	data = (12 << pllinfo->kcp_shift) | (1 << pllinfo->kvco_shift);
+	data |= (1 << PLLD_CLKENABLE) | (1 << pllinfo->lock_ena);
+	writel(data, &clkrst->crc_pll[CLOCK_ID_DISPLAY].pll_misc);
+	udelay(2);
 }
 
 void arch_timer_init(void)
-- 
2.37.2


^ permalink raw reply related	[flat|nested] 26+ messages in thread

* [PATCH v2 06/16] ARM: tegra: Fix Tegra PWM parent clock
  2023-02-02 18:13 [PATCH v2 00/16] General Tegra improvements Svyatoslav Ryhel
                   ` (4 preceding siblings ...)
  2023-02-02 18:13 ` [PATCH v2 05/16] ARM: tegra30: add PLLD to pll setup Svyatoslav Ryhel
@ 2023-02-02 18:13 ` Svyatoslav Ryhel
  2023-02-02 18:13 ` [PATCH v2 07/16] spi: tegra20_slink: accept any word length Svyatoslav Ryhel
                   ` (9 subsequent siblings)
  15 siblings, 0 replies; 26+ messages in thread
From: Svyatoslav Ryhel @ 2023-02-02 18:13 UTC (permalink / raw)
  To: Tom Warren, Alban Bedel, Stephen Warren, Marcel Ziswiler,
	Allen Martin, Jagan Teki, Lukasz Majewski, Marek Vasut,
	Svyatoslav Ryhel, Ramin Khonsari, Thierry Reding, Maxim Schwalm,
	Dmitry Osipenko
  Cc: u-boot

Default parent clock for the PWM on Tegra is a 32kHz clock and
is unable to support the requested PWM period.

Fix PWM support on Tegra20, Tegra30, Tegra114, Tegra124 and Tegra210 by
updating the parent clock for the PWM to be the PLL_P.

This commit is equivalent to Linux kernel commit:
https://lore.kernel.org/all/20221010100046.6477-1-jonathanh@nvidia.com/

Tested-by: Andreas Westman Dorcsak <hedmoo@yahoo.com> # ASUS TF T30
Tested-by: Robert Eckelmann <longnoserob@gmail.com> # ASUS TF101 T20
Tested-by: Svyatoslav Ryhel <clamor95@gmail.com> # ASUS TF201 T30
Signed-off-by: Svyatoslav Ryhel <clamor95@gmail.com>
---
 arch/arm/dts/tegra114.dtsi           |  2 +-
 arch/arm/dts/tegra124.dtsi           |  2 +-
 arch/arm/mach-tegra/tegra114/clock.c |  2 +-
 arch/arm/mach-tegra/tegra124/clock.c |  2 +-
 arch/arm/mach-tegra/tegra20/clock.c  |  2 +-
 arch/arm/mach-tegra/tegra210/clock.c |  2 +-
 arch/arm/mach-tegra/tegra30/clock.c  |  2 +-
 drivers/pwm/tegra_pwm.c              | 10 ++++++----
 8 files changed, 13 insertions(+), 11 deletions(-)

diff --git a/arch/arm/dts/tegra114.dtsi b/arch/arm/dts/tegra114.dtsi
index 8932ea3afd..68ee7f3165 100644
--- a/arch/arm/dts/tegra114.dtsi
+++ b/arch/arm/dts/tegra114.dtsi
@@ -312,7 +312,7 @@
 	};
 
 	pwm: pwm@7000a000 {
-		compatible = "nvidia,tegra114-pwm", "nvidia,tegra20-pwm";
+		compatible = "nvidia,tegra114-pwm";
 		reg = <0x7000a000 0x100>;
 		#pwm-cells = <2>;
 		clocks = <&tegra_car TEGRA114_CLK_PWM>;
diff --git a/arch/arm/dts/tegra124.dtsi b/arch/arm/dts/tegra124.dtsi
index f473ba28e4..ffec9cae09 100644
--- a/arch/arm/dts/tegra124.dtsi
+++ b/arch/arm/dts/tegra124.dtsi
@@ -377,7 +377,7 @@
 	};
 
 	pwm: pwm@7000a000 {
-		compatible = "nvidia,tegra124-pwm", "nvidia,tegra20-pwm";
+		compatible = "nvidia,tegra124-pwm", "nvidia,tegra114-pwm";
 		reg = <0x7000a000 0x100>;
 		#pwm-cells = <2>;
 		clocks = <&tegra_car TEGRA124_CLK_PWM>;
diff --git a/arch/arm/mach-tegra/tegra114/clock.c b/arch/arm/mach-tegra/tegra114/clock.c
index c019b2d0cd..11b8c56d55 100644
--- a/arch/arm/mach-tegra/tegra114/clock.c
+++ b/arch/arm/mach-tegra/tegra114/clock.c
@@ -782,7 +782,7 @@ struct periph_clk_init periph_clk_init_table[] = {
 	{ PERIPH_ID_SDMMC2, CLOCK_ID_PERIPH },
 	{ PERIPH_ID_SDMMC3, CLOCK_ID_PERIPH },
 	{ PERIPH_ID_SDMMC4, CLOCK_ID_PERIPH },
-	{ PERIPH_ID_PWM, CLOCK_ID_SFROM32KHZ },
+	{ PERIPH_ID_PWM, CLOCK_ID_PERIPH },
 	{ PERIPH_ID_I2C1, CLOCK_ID_PERIPH },
 	{ PERIPH_ID_I2C2, CLOCK_ID_PERIPH },
 	{ PERIPH_ID_I2C3, CLOCK_ID_PERIPH },
diff --git a/arch/arm/mach-tegra/tegra124/clock.c b/arch/arm/mach-tegra/tegra124/clock.c
index 415ba15e5d..ca9549a318 100644
--- a/arch/arm/mach-tegra/tegra124/clock.c
+++ b/arch/arm/mach-tegra/tegra124/clock.c
@@ -1208,7 +1208,7 @@ struct periph_clk_init periph_clk_init_table[] = {
 	{ PERIPH_ID_SDMMC2, CLOCK_ID_PERIPH },
 	{ PERIPH_ID_SDMMC3, CLOCK_ID_PERIPH },
 	{ PERIPH_ID_SDMMC4, CLOCK_ID_PERIPH },
-	{ PERIPH_ID_PWM, CLOCK_ID_SFROM32KHZ },
+	{ PERIPH_ID_PWM, CLOCK_ID_PERIPH },
 	{ PERIPH_ID_I2C1, CLOCK_ID_PERIPH },
 	{ PERIPH_ID_I2C2, CLOCK_ID_PERIPH },
 	{ PERIPH_ID_I2C3, CLOCK_ID_PERIPH },
diff --git a/arch/arm/mach-tegra/tegra20/clock.c b/arch/arm/mach-tegra/tegra20/clock.c
index 593622bfdc..067a9f1a2f 100644
--- a/arch/arm/mach-tegra/tegra20/clock.c
+++ b/arch/arm/mach-tegra/tegra20/clock.c
@@ -804,7 +804,7 @@ struct periph_clk_init periph_clk_init_table[] = {
 	{ PERIPH_ID_SDMMC2, CLOCK_ID_PERIPH },
 	{ PERIPH_ID_SDMMC3, CLOCK_ID_PERIPH },
 	{ PERIPH_ID_SDMMC4, CLOCK_ID_PERIPH },
-	{ PERIPH_ID_PWM, CLOCK_ID_SFROM32KHZ },
+	{ PERIPH_ID_PWM, CLOCK_ID_PERIPH },
 	{ PERIPH_ID_DVC_I2C, CLOCK_ID_PERIPH },
 	{ PERIPH_ID_I2C1, CLOCK_ID_PERIPH },
 	{ PERIPH_ID_I2C2, CLOCK_ID_PERIPH },
diff --git a/arch/arm/mach-tegra/tegra210/clock.c b/arch/arm/mach-tegra/tegra210/clock.c
index 76fbfef580..900537afbe 100644
--- a/arch/arm/mach-tegra/tegra210/clock.c
+++ b/arch/arm/mach-tegra/tegra210/clock.c
@@ -1278,7 +1278,7 @@ struct periph_clk_init periph_clk_init_table[] = {
 	{ PERIPH_ID_SDMMC2, CLOCK_ID_PERIPH },
 	{ PERIPH_ID_SDMMC3, CLOCK_ID_PERIPH },
 	{ PERIPH_ID_SDMMC4, CLOCK_ID_PERIPH },
-	{ PERIPH_ID_PWM, CLOCK_ID_SFROM32KHZ },
+	{ PERIPH_ID_PWM, CLOCK_ID_PERIPH },
 	{ PERIPH_ID_I2C1, CLOCK_ID_PERIPH },
 	{ PERIPH_ID_I2C2, CLOCK_ID_PERIPH },
 	{ PERIPH_ID_I2C3, CLOCK_ID_PERIPH },
diff --git a/arch/arm/mach-tegra/tegra30/clock.c b/arch/arm/mach-tegra/tegra30/clock.c
index b66211ce94..1dc9d09dba 100644
--- a/arch/arm/mach-tegra/tegra30/clock.c
+++ b/arch/arm/mach-tegra/tegra30/clock.c
@@ -884,7 +884,7 @@ struct periph_clk_init periph_clk_init_table[] = {
 	{ PERIPH_ID_SDMMC2, CLOCK_ID_PERIPH },
 	{ PERIPH_ID_SDMMC3, CLOCK_ID_PERIPH },
 	{ PERIPH_ID_SDMMC4, CLOCK_ID_PERIPH },
-	{ PERIPH_ID_PWM, CLOCK_ID_SFROM32KHZ },
+	{ PERIPH_ID_PWM, CLOCK_ID_PERIPH },
 	{ PERIPH_ID_DVC_I2C, CLOCK_ID_PERIPH },
 	{ PERIPH_ID_I2C1, CLOCK_ID_PERIPH },
 	{ PERIPH_ID_I2C2, CLOCK_ID_PERIPH },
diff --git a/drivers/pwm/tegra_pwm.c b/drivers/pwm/tegra_pwm.c
index 36c35c608b..95fc26458b 100644
--- a/drivers/pwm/tegra_pwm.c
+++ b/drivers/pwm/tegra_pwm.c
@@ -20,19 +20,21 @@ static int tegra_pwm_set_config(struct udevice *dev, uint channel,
 {
 	struct tegra_pwm_priv *priv = dev_get_priv(dev);
 	struct pwm_ctlr *regs = priv->regs;
+	const u32 pwm_max_freq = dev_get_driver_data(dev);
 	uint pulse_width;
 	u32 reg;
 
 	if (channel >= 4)
 		return -EINVAL;
 	debug("%s: Configure '%s' channel %u\n", __func__, dev->name, channel);
-	/* We ignore the period here and just use 32KHz */
-	clock_start_periph_pll(PERIPH_ID_PWM, CLOCK_ID_SFROM32KHZ, 32768);
+
+	clock_start_periph_pll(PERIPH_ID_PWM, CLOCK_ID_PERIPH, pwm_max_freq);
 
 	pulse_width = duty_ns * 255 / period_ns;
 
 	reg = pulse_width << PWM_WIDTH_SHIFT;
 	reg |= 1 << PWM_DIVIDER_SHIFT;
+	reg |= PWM_ENABLE_MASK;
 	writel(reg, &regs[channel].control);
 	debug("%s: pulse_width=%u\n", __func__, pulse_width);
 
@@ -68,8 +70,8 @@ static const struct pwm_ops tegra_pwm_ops = {
 };
 
 static const struct udevice_id tegra_pwm_ids[] = {
-	{ .compatible = "nvidia,tegra124-pwm" },
-	{ .compatible = "nvidia,tegra20-pwm" },
+	{ .compatible = "nvidia,tegra20-pwm", .data = 48 * 1000000 },
+	{ .compatible = "nvidia,tegra114-pwm", .data = 408 * 1000000 },
 	{ }
 };
 
-- 
2.37.2


^ permalink raw reply related	[flat|nested] 26+ messages in thread

* [PATCH v2 07/16] spi: tegra20_slink: accept any word length
  2023-02-02 18:13 [PATCH v2 00/16] General Tegra improvements Svyatoslav Ryhel
                   ` (5 preceding siblings ...)
  2023-02-02 18:13 ` [PATCH v2 06/16] ARM: tegra: Fix Tegra PWM parent clock Svyatoslav Ryhel
@ 2023-02-02 18:13 ` Svyatoslav Ryhel
  2023-02-02 18:13 ` [PATCH v2 08/16] ARM: tegra: provide default USB gadget setup Svyatoslav Ryhel
                   ` (8 subsequent siblings)
  15 siblings, 0 replies; 26+ messages in thread
From: Svyatoslav Ryhel @ 2023-02-02 18:13 UTC (permalink / raw)
  To: Tom Warren, Alban Bedel, Stephen Warren, Marcel Ziswiler,
	Allen Martin, Jagan Teki, Lukasz Majewski, Marek Vasut,
	Svyatoslav Ryhel, Ramin Khonsari, Thierry Reding, Maxim Schwalm,
	Dmitry Osipenko
  Cc: u-boot

Original t20 slink could work with commands only
fully divisible by 8. This patch removes such
restriction, so commands of any bitlength now
can be passed and processed.

Tested-by: Andreas Westman Dorcsak <hedmoo@yahoo.com> # ASUS TF600T T30
Tested-by: Svyatoslav Ryhel <clamor95@gmail.com> # LG P895 T30
Signed-off-by: Svyatoslav Ryhel <clamor95@gmail.com>
---
 drivers/spi/tegra20_slink.c | 19 +++++++++++--------
 1 file changed, 11 insertions(+), 8 deletions(-)

diff --git a/drivers/spi/tegra20_slink.c b/drivers/spi/tegra20_slink.c
index 209ba8b0cc..d0e788539e 100644
--- a/drivers/spi/tegra20_slink.c
+++ b/drivers/spi/tegra20_slink.c
@@ -208,16 +208,14 @@ static int tegra30_spi_xfer(struct udevice *dev, unsigned int bitlen,
 	u32 reg, tmpdout, tmpdin = 0;
 	const u8 *dout = data_out;
 	u8 *din = data_in;
-	int num_bytes;
-	int ret;
+	int num_bytes, overflow;
+	int ret = 0;
 
 	debug("%s: slave %u:%u dout %p din %p bitlen %u\n",
 	      __func__, dev_seq(bus), spi_chip_select(dev), dout, din, bitlen);
-	if (bitlen % 8)
-		return -1;
-	num_bytes = bitlen / 8;
 
-	ret = 0;
+	num_bytes = DIV_ROUND_UP(bitlen, 8);
+	overflow = bitlen % 8;
 
 	reg = readl(&regs->status);
 	writel(reg, &regs->status);	/* Clear all SPI events via R/W */
@@ -254,8 +252,13 @@ static int tegra30_spi_xfer(struct udevice *dev, unsigned int bitlen,
 
 		num_bytes -= bytes;
 
-		clrsetbits_le32(&regs->command, SLINK_CMD_BIT_LENGTH_MASK,
-				bytes * 8 - 1);
+		if (overflow && !num_bytes)
+			clrsetbits_le32(&regs->command, SLINK_CMD_BIT_LENGTH_MASK,
+					(bytes - 1) * 8 + overflow - 1);
+		else
+			clrsetbits_le32(&regs->command, SLINK_CMD_BIT_LENGTH_MASK,
+					bytes * 8 - 1);
+
 		writel(tmpdout, &regs->tx_fifo);
 		setbits_le32(&regs->command, SLINK_CMD_GO);
 
-- 
2.37.2


^ permalink raw reply related	[flat|nested] 26+ messages in thread

* [PATCH v2 08/16] ARM: tegra: provide default USB gadget setup
  2023-02-02 18:13 [PATCH v2 00/16] General Tegra improvements Svyatoslav Ryhel
                   ` (6 preceding siblings ...)
  2023-02-02 18:13 ` [PATCH v2 07/16] spi: tegra20_slink: accept any word length Svyatoslav Ryhel
@ 2023-02-02 18:13 ` Svyatoslav Ryhel
  2023-02-02 18:13 ` [PATCH v2 09/16] ARM: tegra: add late init support Svyatoslav Ryhel
                   ` (7 subsequent siblings)
  15 siblings, 0 replies; 26+ messages in thread
From: Svyatoslav Ryhel @ 2023-02-02 18:13 UTC (permalink / raw)
  To: Tom Warren, Alban Bedel, Stephen Warren, Marcel Ziswiler,
	Allen Martin, Jagan Teki, Lukasz Majewski, Marek Vasut,
	Svyatoslav Ryhel, Ramin Khonsari, Thierry Reding, Maxim Schwalm,
	Dmitry Osipenko
  Cc: u-boot

From: Maxim Schwalm <maxim.schwalm@gmail.com>

All Nvidia boards use the same manufacturer, vendor ID and product ID
for the gadgets. Make them the defaults to remove some boilerplate from
the defconfigs.

Inspired by commit e02687bda96c ("sunxi: provide default USB gadget
setup") which did the same for Allwinner boards.

Signed-off-by: Maxim Schwalm <maxim.schwalm@gmail.com>
---
 configs/beaver_defconfig      | 3 ---
 configs/cei-tk1-som_defconfig | 3 ---
 configs/dalmore_defconfig     | 3 ---
 configs/jetson-tk1_defconfig  | 3 ---
 configs/nyan-big_defconfig    | 3 ---
 configs/p2371-0000_defconfig  | 3 ---
 configs/p2371-2180_defconfig  | 3 ---
 configs/p2571_defconfig       | 3 ---
 configs/p3450-0000_defconfig  | 3 ---
 configs/venice2_defconfig     | 3 ---
 drivers/usb/gadget/Kconfig    | 3 +++
 11 files changed, 3 insertions(+), 30 deletions(-)

diff --git a/configs/beaver_defconfig b/configs/beaver_defconfig
index 0967367e6a..693ccb893d 100644
--- a/configs/beaver_defconfig
+++ b/configs/beaver_defconfig
@@ -64,8 +64,5 @@ CONFIG_USB_EHCI_TEGRA=y
 CONFIG_USB_HOST_ETHER=y
 CONFIG_USB_ETHER_ASIX=y
 CONFIG_USB_GADGET=y
-CONFIG_USB_GADGET_MANUFACTURER="NVIDIA"
-CONFIG_USB_GADGET_VENDOR_NUM=0x0955
-CONFIG_USB_GADGET_PRODUCT_NUM=0x701a
 CONFIG_CI_UDC=y
 CONFIG_USB_GADGET_DOWNLOAD=y
diff --git a/configs/cei-tk1-som_defconfig b/configs/cei-tk1-som_defconfig
index 0c4627aff0..6578ee83d9 100644
--- a/configs/cei-tk1-som_defconfig
+++ b/configs/cei-tk1-som_defconfig
@@ -70,8 +70,5 @@ CONFIG_USB_EHCI_TEGRA=y
 CONFIG_USB_HOST_ETHER=y
 CONFIG_USB_ETHER_ASIX=y
 CONFIG_USB_GADGET=y
-CONFIG_USB_GADGET_MANUFACTURER="NVIDIA"
-CONFIG_USB_GADGET_VENDOR_NUM=0x0955
-CONFIG_USB_GADGET_PRODUCT_NUM=0x701a
 CONFIG_CI_UDC=y
 CONFIG_USB_GADGET_DOWNLOAD=y
diff --git a/configs/dalmore_defconfig b/configs/dalmore_defconfig
index 5d29dae341..4507ddc84b 100644
--- a/configs/dalmore_defconfig
+++ b/configs/dalmore_defconfig
@@ -60,8 +60,5 @@ CONFIG_USB_EHCI_TEGRA=y
 CONFIG_USB_HOST_ETHER=y
 CONFIG_USB_ETHER_ASIX=y
 CONFIG_USB_GADGET=y
-CONFIG_USB_GADGET_MANUFACTURER="NVIDIA"
-CONFIG_USB_GADGET_VENDOR_NUM=0x0955
-CONFIG_USB_GADGET_PRODUCT_NUM=0x701a
 CONFIG_CI_UDC=y
 CONFIG_USB_GADGET_DOWNLOAD=y
diff --git a/configs/jetson-tk1_defconfig b/configs/jetson-tk1_defconfig
index d935e784ab..bcf45458a6 100644
--- a/configs/jetson-tk1_defconfig
+++ b/configs/jetson-tk1_defconfig
@@ -70,8 +70,5 @@ CONFIG_USB_EHCI_TEGRA=y
 CONFIG_USB_HOST_ETHER=y
 CONFIG_USB_ETHER_ASIX=y
 CONFIG_USB_GADGET=y
-CONFIG_USB_GADGET_MANUFACTURER="NVIDIA"
-CONFIG_USB_GADGET_VENDOR_NUM=0x0955
-CONFIG_USB_GADGET_PRODUCT_NUM=0x701a
 CONFIG_CI_UDC=y
 CONFIG_USB_GADGET_DOWNLOAD=y
diff --git a/configs/nyan-big_defconfig b/configs/nyan-big_defconfig
index e2e8bebf6d..fef9141d35 100644
--- a/configs/nyan-big_defconfig
+++ b/configs/nyan-big_defconfig
@@ -93,9 +93,6 @@ CONFIG_USB_EHCI_TEGRA=y
 CONFIG_USB_HOST_ETHER=y
 CONFIG_USB_ETHER_ASIX=y
 CONFIG_USB_GADGET=y
-CONFIG_USB_GADGET_MANUFACTURER="NVIDIA"
-CONFIG_USB_GADGET_VENDOR_NUM=0x0955
-CONFIG_USB_GADGET_PRODUCT_NUM=0x701a
 CONFIG_CI_UDC=y
 CONFIG_USB_GADGET_DOWNLOAD=y
 CONFIG_VIDEO=y
diff --git a/configs/p2371-0000_defconfig b/configs/p2371-0000_defconfig
index e8074914c8..2962a7db75 100644
--- a/configs/p2371-0000_defconfig
+++ b/configs/p2371-0000_defconfig
@@ -48,8 +48,5 @@ CONFIG_USB_EHCI_TEGRA=y
 CONFIG_USB_HOST_ETHER=y
 CONFIG_USB_ETHER_ASIX=y
 CONFIG_USB_GADGET=y
-CONFIG_USB_GADGET_MANUFACTURER="NVIDIA"
-CONFIG_USB_GADGET_VENDOR_NUM=0x0955
-CONFIG_USB_GADGET_PRODUCT_NUM=0x701a
 CONFIG_CI_UDC=y
 CONFIG_USB_GADGET_DOWNLOAD=y
diff --git a/configs/p2371-2180_defconfig b/configs/p2371-2180_defconfig
index ea62e18f73..6b44361b5b 100644
--- a/configs/p2371-2180_defconfig
+++ b/configs/p2371-2180_defconfig
@@ -57,8 +57,5 @@ CONFIG_USB_EHCI_TEGRA=y
 CONFIG_USB_HOST_ETHER=y
 CONFIG_USB_ETHER_ASIX=y
 CONFIG_USB_GADGET=y
-CONFIG_USB_GADGET_MANUFACTURER="NVIDIA"
-CONFIG_USB_GADGET_VENDOR_NUM=0x0955
-CONFIG_USB_GADGET_PRODUCT_NUM=0x701a
 CONFIG_CI_UDC=y
 CONFIG_USB_GADGET_DOWNLOAD=y
diff --git a/configs/p2571_defconfig b/configs/p2571_defconfig
index bc3fb3e5ae..00b0dc6109 100644
--- a/configs/p2571_defconfig
+++ b/configs/p2571_defconfig
@@ -49,8 +49,5 @@ CONFIG_USB_EHCI_TEGRA=y
 CONFIG_USB_HOST_ETHER=y
 CONFIG_USB_ETHER_ASIX=y
 CONFIG_USB_GADGET=y
-CONFIG_USB_GADGET_MANUFACTURER="NVIDIA"
-CONFIG_USB_GADGET_VENDOR_NUM=0x0955
-CONFIG_USB_GADGET_PRODUCT_NUM=0x701a
 CONFIG_CI_UDC=y
 CONFIG_USB_GADGET_DOWNLOAD=y
diff --git a/configs/p3450-0000_defconfig b/configs/p3450-0000_defconfig
index 8e16afde91..d35bea4220 100644
--- a/configs/p3450-0000_defconfig
+++ b/configs/p3450-0000_defconfig
@@ -61,8 +61,5 @@ CONFIG_USB_EHCI_TEGRA=y
 CONFIG_USB_HOST_ETHER=y
 CONFIG_USB_ETHER_ASIX=y
 CONFIG_USB_GADGET=y
-CONFIG_USB_GADGET_MANUFACTURER="NVIDIA"
-CONFIG_USB_GADGET_VENDOR_NUM=0x0955
-CONFIG_USB_GADGET_PRODUCT_NUM=0x701a
 CONFIG_CI_UDC=y
 CONFIG_USB_GADGET_DOWNLOAD=y
diff --git a/configs/venice2_defconfig b/configs/venice2_defconfig
index a754c20046..fe794b76ff 100644
--- a/configs/venice2_defconfig
+++ b/configs/venice2_defconfig
@@ -59,8 +59,5 @@ CONFIG_USB_EHCI_TEGRA=y
 CONFIG_USB_HOST_ETHER=y
 CONFIG_USB_ETHER_ASIX=y
 CONFIG_USB_GADGET=y
-CONFIG_USB_GADGET_MANUFACTURER="NVIDIA"
-CONFIG_USB_GADGET_VENDOR_NUM=0x0955
-CONFIG_USB_GADGET_PRODUCT_NUM=0x701a
 CONFIG_CI_UDC=y
 CONFIG_USB_GADGET_DOWNLOAD=y
diff --git a/drivers/usb/gadget/Kconfig b/drivers/usb/gadget/Kconfig
index e120efeb00..941f97c96d 100644
--- a/drivers/usb/gadget/Kconfig
+++ b/drivers/usb/gadget/Kconfig
@@ -40,6 +40,7 @@ if USB_GADGET
 
 config USB_GADGET_MANUFACTURER
 	string "Vendor name of the USB device"
+	default "NVIDIA" if ARCH_TEGRA
 	default "Allwinner Technology" if ARCH_SUNXI
 	default "Rockchip" if ARCH_ROCKCHIP
 	default "U-Boot"
@@ -49,6 +50,7 @@ config USB_GADGET_MANUFACTURER
 
 config USB_GADGET_VENDOR_NUM
 	hex "Vendor ID of the USB device"
+	default 0x0955 if ARCH_TEGRA
 	default 0x1f3a if ARCH_SUNXI
 	default 0x2207 if ARCH_ROCKCHIP
 	default 0x0
@@ -59,6 +61,7 @@ config USB_GADGET_VENDOR_NUM
 
 config USB_GADGET_PRODUCT_NUM
 	hex "Product ID of the USB device"
+	default 0x701a if ARCH_TEGRA
 	default 0x1010 if ARCH_SUNXI
 	default 0x310a if ROCKCHIP_RK3036
 	default 0x300a if ROCKCHIP_RK3066
-- 
2.37.2


^ permalink raw reply related	[flat|nested] 26+ messages in thread

* [PATCH v2 09/16] ARM: tegra: add late init support
  2023-02-02 18:13 [PATCH v2 00/16] General Tegra improvements Svyatoslav Ryhel
                   ` (7 preceding siblings ...)
  2023-02-02 18:13 ` [PATCH v2 08/16] ARM: tegra: provide default USB gadget setup Svyatoslav Ryhel
@ 2023-02-02 18:13 ` Svyatoslav Ryhel
  2023-02-02 18:13 ` [PATCH v2 10/16] ARM: tegra: create common pre-dm i2c write Svyatoslav Ryhel
                   ` (6 subsequent siblings)
  15 siblings, 0 replies; 26+ messages in thread
From: Svyatoslav Ryhel @ 2023-02-02 18:13 UTC (permalink / raw)
  To: Tom Warren, Alban Bedel, Stephen Warren, Marcel Ziswiler,
	Allen Martin, Jagan Teki, Lukasz Majewski, Marek Vasut,
	Svyatoslav Ryhel, Ramin Khonsari, Thierry Reding, Maxim Schwalm,
	Dmitry Osipenko
  Cc: u-boot

Late init function allows passing values like identifiers and
perform device specific configurations of pre-boot stage.

Tested-by: Andreas Westman Dorcsak <hedmoo@yahoo.com> # ASUS TF T30
Tested-by: Svyatoslav Ryhel <clamor95@gmail.com> # LG P895 T30
Signed-off-by: Svyatoslav Ryhel <clamor95@gmail.com>
---
 arch/arm/include/asm/arch-tegra/sys_proto.h | 6 ++++++
 arch/arm/mach-tegra/board2.c                | 2 ++
 2 files changed, 8 insertions(+)

diff --git a/arch/arm/include/asm/arch-tegra/sys_proto.h b/arch/arm/include/asm/arch-tegra/sys_proto.h
index c3a2673e6c..566666a9a0 100644
--- a/arch/arm/include/asm/arch-tegra/sys_proto.h
+++ b/arch/arm/include/asm/arch-tegra/sys_proto.h
@@ -31,4 +31,10 @@ int tegra_lcd_pmic_init(int board_id);
  */
 int nvidia_board_init(void);
 
+/**
+ * nvidia_board_late_init() - perform any board-specific
+ *			      init on late stages
+ */
+void nvidia_board_late_init(void);
+
 #endif
diff --git a/arch/arm/mach-tegra/board2.c b/arch/arm/mach-tegra/board2.c
index c7a45f4ff8..0df18360ca 100644
--- a/arch/arm/mach-tegra/board2.c
+++ b/arch/arm/mach-tegra/board2.c
@@ -56,6 +56,7 @@ __weak void gpio_early_init_uart(void) {}
 __weak void pin_mux_display(void) {}
 __weak void start_cpu_fan(void) {}
 __weak void cboot_late_init(void) {}
+__weak void nvidia_board_late_init(void) {}
 
 #if defined(CONFIG_TEGRA_NAND)
 __weak void pin_mux_nand(void)
@@ -267,6 +268,7 @@ int board_late_init(void)
 #endif
 	start_cpu_fan();
 	cboot_late_init();
+	nvidia_board_late_init();
 
 	return 0;
 }
-- 
2.37.2


^ permalink raw reply related	[flat|nested] 26+ messages in thread

* [PATCH v2 10/16] ARM: tegra: create common pre-dm i2c write
  2023-02-02 18:13 [PATCH v2 00/16] General Tegra improvements Svyatoslav Ryhel
                   ` (8 preceding siblings ...)
  2023-02-02 18:13 ` [PATCH v2 09/16] ARM: tegra: add late init support Svyatoslav Ryhel
@ 2023-02-02 18:13 ` Svyatoslav Ryhel
  2023-02-03  2:15   ` Simon Glass
  2023-02-02 18:13 ` [PATCH v2 11/16] board: tegra124: switch to updated " Svyatoslav Ryhel
                   ` (5 subsequent siblings)
  15 siblings, 1 reply; 26+ messages in thread
From: Svyatoslav Ryhel @ 2023-02-02 18:13 UTC (permalink / raw)
  To: Tom Warren, Alban Bedel, Stephen Warren, Marcel Ziswiler,
	Allen Martin, Jagan Teki, Lukasz Majewski, Marek Vasut,
	Svyatoslav Ryhel, Ramin Khonsari, Thierry Reding, Maxim Schwalm,
	Dmitry Osipenko
  Cc: u-boot

This implementation allows pwr i2c writing on early
stages when DM was not yet setup.

Such writing is needed to configure main voltages of PMIC.

Tested-by: Andreas Westman Dorcsak <hedmoo@yahoo.com> # ASUS TF T30
Tested-by: Robert Eckelmann <longnoserob@gmail.com> # ASUS TF101 T20
Tested-by: Svyatoslav Ryhel <clamor95@gmail.com> # LG P895 T30
Signed-off-by: Svyatoslav Ryhel <clamor95@gmail.com>
---
 arch/arm/include/asm/arch-tegra/tegra_i2c.h | 17 ++++++++++
 arch/arm/mach-tegra/cpu.h                   |  1 -
 arch/arm/mach-tegra/tegra124/cpu.c          |  4 +++
 arch/arm/mach-tegra/tegra30/cpu.c           | 37 +++++++--------------
 4 files changed, 33 insertions(+), 26 deletions(-)

diff --git a/arch/arm/include/asm/arch-tegra/tegra_i2c.h b/arch/arm/include/asm/arch-tegra/tegra_i2c.h
index c49f43251d..afec6bbdda 100644
--- a/arch/arm/include/asm/arch-tegra/tegra_i2c.h
+++ b/arch/arm/include/asm/arch-tegra/tegra_i2c.h
@@ -8,6 +8,7 @@
 #ifndef _TEGRA_I2C_H_
 #define _TEGRA_I2C_H_
 
+#include <asm/io.h>
 #include <asm/types.h>
 
 struct udevice;
@@ -154,4 +155,20 @@ struct i2c_ctlr {
  */
 int tegra_i2c_get_dvc_bus(struct udevice **busp);
 
+/* Pre-dm section used for initial setup of PMIC */
+#define I2C_SEND_2_BYTES		0x0A02
+
+static inline void tegra_i2c_ll_write(uint addr, uint data)
+{
+	struct i2c_ctlr *reg = (struct i2c_ctlr *)TEGRA_DVC_BASE;
+
+	writel(addr, &reg->cmd_addr0);
+	writel(0x2, &reg->cnfg);
+
+	writel(data, &reg->cmd_data1);
+	writel(I2C_SEND_2_BYTES, &reg->cnfg);
+}
+
+void pmic_enable_cpu_vdd(void);
+
 #endif	/* _TEGRA_I2C_H_ */
diff --git a/arch/arm/mach-tegra/cpu.h b/arch/arm/mach-tegra/cpu.h
index d541825441..006aae3d07 100644
--- a/arch/arm/mach-tegra/cpu.h
+++ b/arch/arm/mach-tegra/cpu.h
@@ -74,4 +74,3 @@ int tegra_get_chip(void);
 int tegra_get_sku_info(void);
 int tegra_get_chip_sku(void);
 void adjust_pllp_out_freqs(void);
-void pmic_enable_cpu_vdd(void);
diff --git a/arch/arm/mach-tegra/tegra124/cpu.c b/arch/arm/mach-tegra/tegra124/cpu.c
index d5f2683b26..b1bfe8fb5e 100644
--- a/arch/arm/mach-tegra/tegra124/cpu.c
+++ b/arch/arm/mach-tegra/tegra124/cpu.c
@@ -14,10 +14,14 @@
 #include <asm/arch/tegra.h>
 #include <asm/arch-tegra/clk_rst.h>
 #include <asm/arch-tegra/pmc.h>
+#include <asm/arch-tegra/tegra_i2c.h>
 #include <asm/arch-tegra/ap.h>
 #include <linux/delay.h>
 #include "../cpu.h"
 
+/* In case this function is not defined */
+__weak void pmic_enable_cpu_vdd(void) {}
+
 /* Tegra124-specific CPU init code */
 
 static void enable_cpu_power_rail(void)
diff --git a/arch/arm/mach-tegra/tegra30/cpu.c b/arch/arm/mach-tegra/tegra30/cpu.c
index 651edd27ee..6ac45af51a 100644
--- a/arch/arm/mach-tegra/tegra30/cpu.c
+++ b/arch/arm/mach-tegra/tegra30/cpu.c
@@ -15,23 +15,6 @@
 #include <linux/delay.h>
 #include "../cpu.h"
 
-/* Tegra30-specific CPU init code */
-void tegra_i2c_ll_write_addr(uint addr, uint config)
-{
-	struct i2c_ctlr *reg = (struct i2c_ctlr *)TEGRA_DVC_BASE;
-
-	writel(addr, &reg->cmd_addr0);
-	writel(config, &reg->cnfg);
-}
-
-void tegra_i2c_ll_write_data(uint data, uint config)
-{
-	struct i2c_ctlr *reg = (struct i2c_ctlr *)TEGRA_DVC_BASE;
-
-	writel(data, &reg->cmd_data1);
-	writel(config, &reg->cnfg);
-}
-
 #define TPS62366A_I2C_ADDR		0xC0
 #define TPS62366A_SET1_REG		0x01
 #define TPS62366A_SET1_DATA		(0x4600 | TPS62366A_SET1_REG)
@@ -45,7 +28,9 @@ void tegra_i2c_ll_write_data(uint data, uint config)
 #define TPS65911_VDDCTRL_SR_REG		0x27
 #define TPS65911_VDDCTRL_OP_DATA	(0x2400 | TPS65911_VDDCTRL_OP_REG)
 #define TPS65911_VDDCTRL_SR_DATA	(0x0100 | TPS65911_VDDCTRL_SR_REG)
-#define I2C_SEND_2_BYTES		0x0A02
+
+/* In case this function is not defined */
+__weak void pmic_enable_cpu_vdd(void) {}
 
 static void enable_cpu_power_rail(void)
 {
@@ -59,12 +44,12 @@ static void enable_cpu_power_rail(void)
 
 	/* Set VDD_CORE to 1.200V. */
 #ifdef CONFIG_TEGRA_VDD_CORE_TPS62366A_SET1
-	tegra_i2c_ll_write_addr(TPS62366A_I2C_ADDR, 2);
-	tegra_i2c_ll_write_data(TPS62366A_SET1_DATA, I2C_SEND_2_BYTES);
+	tegra_i2c_ll_write(TPS62366A_I2C_ADDR,
+			   TPS62366A_SET1_DATA);
 #endif
 #ifdef CONFIG_TEGRA_VDD_CORE_TPS62361B_SET3
-	tegra_i2c_ll_write_addr(TPS62361B_I2C_ADDR, 2);
-	tegra_i2c_ll_write_data(TPS62361B_SET3_DATA, I2C_SEND_2_BYTES);
+	tegra_i2c_ll_write(TPS62361B_I2C_ADDR,
+			   TPS62361B_SET3_DATA);
 #endif
 	udelay(1000);
 
@@ -72,10 +57,11 @@ static void enable_cpu_power_rail(void)
 	 * Bring up CPU VDD via the TPS65911x PMIC on the DVC I2C bus.
 	 * First set VDD to 1.0125V, then enable the VDD regulator.
 	 */
-	tegra_i2c_ll_write_addr(TPS65911_I2C_ADDR, 2);
-	tegra_i2c_ll_write_data(TPS65911_VDDCTRL_OP_DATA, I2C_SEND_2_BYTES);
+	tegra_i2c_ll_write(TPS65911_I2C_ADDR,
+			   TPS65911_VDDCTRL_OP_DATA);
 	udelay(1000);
-	tegra_i2c_ll_write_data(TPS65911_VDDCTRL_SR_DATA, I2C_SEND_2_BYTES);
+	tegra_i2c_ll_write(TPS65911_I2C_ADDR,
+			   TPS65911_VDDCTRL_SR_DATA);
 	udelay(10 * 1000);
 }
 
@@ -142,6 +128,7 @@ void start_cpu(u32 reset_vector)
 
 	/* Enable VDD_CPU */
 	enable_cpu_power_rail();
+	pmic_enable_cpu_vdd();
 
 	set_cpu_running(0);
 
-- 
2.37.2


^ permalink raw reply related	[flat|nested] 26+ messages in thread

* [PATCH v2 11/16] board: tegra124: switch to updated pre-dm i2c write
  2023-02-02 18:13 [PATCH v2 00/16] General Tegra improvements Svyatoslav Ryhel
                   ` (9 preceding siblings ...)
  2023-02-02 18:13 ` [PATCH v2 10/16] ARM: tegra: create common pre-dm i2c write Svyatoslav Ryhel
@ 2023-02-02 18:13 ` Svyatoslav Ryhel
  2023-02-03  2:15   ` Simon Glass
  2023-02-02 18:13 ` [PATCH v2 12/16] board: tegra30: " Svyatoslav Ryhel
                   ` (4 subsequent siblings)
  15 siblings, 1 reply; 26+ messages in thread
From: Svyatoslav Ryhel @ 2023-02-02 18:13 UTC (permalink / raw)
  To: Tom Warren, Alban Bedel, Stephen Warren, Marcel Ziswiler,
	Allen Martin, Jagan Teki, Lukasz Majewski, Marek Vasut,
	Svyatoslav Ryhel, Ramin Khonsari, Thierry Reding, Maxim Schwalm,
	Dmitry Osipenko
  Cc: u-boot

Configure PMIC for early stages using updated i2c write.

Signed-off-by: Svyatoslav Ryhel <clamor95@gmail.com>
---
 board/nvidia/venice2/as3722_init.c     | 65 ++++++++++++--------
 board/nvidia/venice2/as3722_init.h     | 43 -------------
 board/toradex/apalis-tk1/as3722_init.c | 85 ++++++++++++++------------
 board/toradex/apalis-tk1/as3722_init.h | 40 ------------
 4 files changed, 88 insertions(+), 145 deletions(-)
 delete mode 100644 board/nvidia/venice2/as3722_init.h
 delete mode 100644 board/toradex/apalis-tk1/as3722_init.h

diff --git a/board/nvidia/venice2/as3722_init.c b/board/nvidia/venice2/as3722_init.c
index ba676547d3..395bdd99c7 100644
--- a/board/nvidia/venice2/as3722_init.c
+++ b/board/nvidia/venice2/as3722_init.c
@@ -9,25 +9,42 @@
 #include <asm/io.h>
 #include <asm/arch-tegra/tegra_i2c.h>
 #include <linux/delay.h>
-#include "as3722_init.h"
 
-/* AS3722-PMIC-specific early init code - get CPU rails up, etc */
+/* AS3722-PMIC-specific early init regs */
 
-void tegra_i2c_ll_write_addr(uint addr, uint config)
-{
-	struct i2c_ctlr *reg = (struct i2c_ctlr *)TEGRA_DVC_BASE;
+#define AS3722_I2C_ADDR		0x80
 
-	writel(addr, &reg->cmd_addr0);
-	writel(config, &reg->cnfg);
-}
+#define AS3722_SD0VOLTAGE_REG	0x00	/* CPU */
+#define AS3722_SD1VOLTAGE_REG	0x01	/* CORE, already set by OTP */
+#define AS3722_SD6VOLTAGE_REG	0x06	/* GPU */
+#define AS3722_SDCONTROL_REG	0x4D
 
-void tegra_i2c_ll_write_data(uint data, uint config)
-{
-	struct i2c_ctlr *reg = (struct i2c_ctlr *)TEGRA_DVC_BASE;
+#define AS3722_LDO2VOLTAGE_REG	0x12	/* VPP_FUSE */
+#define AS3722_LDO6VOLTAGE_REG	0x16	/* VDD_SDMMC */
+#define AS3722_LDCONTROL_REG	0x4E
 
-	writel(data, &reg->cmd_data1);
-	writel(config, &reg->cnfg);
-}
+#if defined(CONFIG_TARGET_VENICE2)
+#define AS3722_SD0VOLTAGE_DATA	(0x2800 | AS3722_SD0VOLTAGE_REG)
+#else /* TK1 or Nyan-Big */
+#define AS3722_SD0VOLTAGE_DATA	(0x3C00 | AS3722_SD0VOLTAGE_REG)
+#endif
+#define AS3722_SD0CONTROL_DATA	(0x0100 | AS3722_SDCONTROL_REG)
+
+#if defined(CONFIG_TARGET_JETSON_TK1) || defined(CONFIG_TARGET_CEI_TK1_SOM)
+#define AS3722_SD1VOLTAGE_DATA	(0x2800 | AS3722_SD1VOLTAGE_REG)
+#define AS3722_SD1CONTROL_DATA	(0x0200 | AS3722_SDCONTROL_REG)
+#endif
+
+#define AS3722_SD6CONTROL_DATA	(0x4000 | AS3722_SDCONTROL_REG)
+#define AS3722_SD6VOLTAGE_DATA	(0x2800 | AS3722_SD6VOLTAGE_REG)
+
+#define AS3722_LDO2CONTROL_DATA	(0x0400 | AS3722_LDCONTROL_REG)
+#define AS3722_LDO2VOLTAGE_DATA	(0x1000 | AS3722_LDO2VOLTAGE_REG)
+
+#define AS3722_LDO6CONTROL_DATA	(0x4000 | AS3722_LDCONTROL_REG)
+#define AS3722_LDO6VOLTAGE_DATA	(0x3F00 | AS3722_LDO6VOLTAGE_REG)
+
+/* AS3722-PMIC-specific early init code - get CPU rails up, etc */
 
 void pmic_enable_cpu_vdd(void)
 {
@@ -37,8 +54,8 @@ void pmic_enable_cpu_vdd(void)
 	/* Set up VDD_CORE, for boards where OTP is incorrect*/
 	debug("%s: Setting VDD_CORE via AS3722 reg 1\n", __func__);
 	/* Configure VDD_CORE via the AS3722 PMIC on the PWR I2C bus */
-	tegra_i2c_ll_write_addr(AS3722_I2C_ADDR, 2);
-	tegra_i2c_ll_write_data(AS3722_SD1VOLTAGE_DATA, I2C_SEND_2_BYTES);
+	tegra_i2c_ll_write(AS3722_I2C_ADDR,
+			   AS3722_SD1VOLTAGE_DATA);
 	/*
 	 * Don't write SDCONTROL - it's already 0x7F, i.e. all SDs enabled.
 	 * tegra_i2c_ll_write_data(AS3722_SD1CONTROL_DATA, I2C_SEND_2_BYTES);
@@ -51,8 +68,8 @@ void pmic_enable_cpu_vdd(void)
 	 * Bring up VDD_CPU via the AS3722 PMIC on the PWR I2C bus.
 	 * First set VDD to 1.0V, then enable the VDD regulator.
 	 */
-	tegra_i2c_ll_write_addr(AS3722_I2C_ADDR, 2);
-	tegra_i2c_ll_write_data(AS3722_SD0VOLTAGE_DATA, I2C_SEND_2_BYTES);
+	tegra_i2c_ll_write(AS3722_I2C_ADDR,
+			   AS3722_SD0VOLTAGE_DATA);
 	/*
 	 * Don't write SDCONTROL - it's already 0x7F, i.e. all SDs enabled.
 	 * tegra_i2c_ll_write_data(AS3722_SD0CONTROL_DATA, I2C_SEND_2_BYTES);
@@ -64,8 +81,8 @@ void pmic_enable_cpu_vdd(void)
 	 * Bring up VDD_GPU via the AS3722 PMIC on the PWR I2C bus.
 	 * First set VDD to 1.0V, then enable the VDD regulator.
 	 */
-	tegra_i2c_ll_write_addr(AS3722_I2C_ADDR, 2);
-	tegra_i2c_ll_write_data(AS3722_SD6VOLTAGE_DATA, I2C_SEND_2_BYTES);
+	tegra_i2c_ll_write(AS3722_I2C_ADDR,
+			   AS3722_SD6VOLTAGE_DATA);
 	/*
 	 * Don't write SDCONTROL - it's already 0x7F, i.e. all SDs enabled.
 	 * tegra_i2c_ll_write_data(AS3722_SD6CONTROL_DATA, I2C_SEND_2_BYTES);
@@ -77,8 +94,8 @@ void pmic_enable_cpu_vdd(void)
 	 * Bring up VPP_FUSE via the AS3722 PMIC on the PWR I2C bus.
 	 * First set VDD to 1.2V, then enable the VDD regulator.
 	 */
-	tegra_i2c_ll_write_addr(AS3722_I2C_ADDR, 2);
-	tegra_i2c_ll_write_data(AS3722_LDO2VOLTAGE_DATA, I2C_SEND_2_BYTES);
+	tegra_i2c_ll_write(AS3722_I2C_ADDR,
+			   AS3722_LDO2VOLTAGE_DATA);
 	/*
 	 * Don't write LDCONTROL - it's already 0xFF, i.e. all LDOs enabled.
 	 * tegra_i2c_ll_write_data(AS3722_LDO2CONTROL_DATA, I2C_SEND_2_BYTES);
@@ -93,8 +110,8 @@ void pmic_enable_cpu_vdd(void)
 	 * NOTE: We do this early because doing it later seems to hose the CPU
 	 * power rail/partition startup. Need to debug.
 	 */
-	tegra_i2c_ll_write_addr(AS3722_I2C_ADDR, 2);
-	tegra_i2c_ll_write_data(AS3722_LDO6VOLTAGE_DATA, I2C_SEND_2_BYTES);
+	tegra_i2c_ll_write(AS3722_I2C_ADDR,
+			   AS3722_LDO6VOLTAGE_DATA);
 	/*
 	 * Don't write LDCONTROL - it's already 0xFF, i.e. all LDOs enabled.
 	 * tegra_i2c_ll_write_data(AS3722_LDO6CONTROL_DATA, I2C_SEND_2_BYTES);
diff --git a/board/nvidia/venice2/as3722_init.h b/board/nvidia/venice2/as3722_init.h
deleted file mode 100644
index 17e7d76ae7..0000000000
--- a/board/nvidia/venice2/as3722_init.h
+++ /dev/null
@@ -1,43 +0,0 @@
-/* SPDX-License-Identifier: GPL-2.0+ */
-/*
- * (C) Copyright 2013
- * NVIDIA Corporation <www.nvidia.com>
- */
-
-/* AS3722-PMIC-specific early init regs */
-
-#define AS3722_I2C_ADDR		0x80
-
-#define AS3722_SD0VOLTAGE_REG	0x00	/* CPU */
-#define AS3722_SD1VOLTAGE_REG	0x01	/* CORE, already set by OTP */
-#define AS3722_SD6VOLTAGE_REG	0x06	/* GPU */
-#define AS3722_SDCONTROL_REG	0x4D
-
-#define AS3722_LDO2VOLTAGE_REG	0x12	/* VPP_FUSE */
-#define AS3722_LDO6VOLTAGE_REG	0x16	/* VDD_SDMMC */
-#define AS3722_LDCONTROL_REG	0x4E
-
-#if defined(CONFIG_TARGET_VENICE2)
-#define AS3722_SD0VOLTAGE_DATA	(0x2800 | AS3722_SD0VOLTAGE_REG)
-#else /* TK1 or Nyan-Big */
-#define AS3722_SD0VOLTAGE_DATA	(0x3C00 | AS3722_SD0VOLTAGE_REG)
-#endif
-#define AS3722_SD0CONTROL_DATA	(0x0100 | AS3722_SDCONTROL_REG)
-
-#if defined(CONFIG_TARGET_JETSON_TK1) || defined(CONFIG_TARGET_CEI_TK1_SOM)
-#define AS3722_SD1VOLTAGE_DATA	(0x2800 | AS3722_SD1VOLTAGE_REG)
-#define AS3722_SD1CONTROL_DATA	(0x0200 | AS3722_SDCONTROL_REG)
-#endif
-
-#define AS3722_SD6CONTROL_DATA	(0x4000 | AS3722_SDCONTROL_REG)
-#define AS3722_SD6VOLTAGE_DATA	(0x2800 | AS3722_SD6VOLTAGE_REG)
-
-#define AS3722_LDO2CONTROL_DATA	(0x0400 | AS3722_LDCONTROL_REG)
-#define AS3722_LDO2VOLTAGE_DATA	(0x1000 | AS3722_LDO2VOLTAGE_REG)
-
-#define AS3722_LDO6CONTROL_DATA	(0x4000 | AS3722_LDCONTROL_REG)
-#define AS3722_LDO6VOLTAGE_DATA	(0x3F00 | AS3722_LDO6VOLTAGE_REG)
-
-#define I2C_SEND_2_BYTES	0x0A02
-
-void pmic_enable_cpu_vdd(void);
diff --git a/board/toradex/apalis-tk1/as3722_init.c b/board/toradex/apalis-tk1/as3722_init.c
index 68169f5548..e9bd1028be 100644
--- a/board/toradex/apalis-tk1/as3722_init.c
+++ b/board/toradex/apalis-tk1/as3722_init.c
@@ -8,25 +8,40 @@
 #include <asm/io.h>
 #include <asm/arch-tegra/tegra_i2c.h>
 #include <linux/delay.h>
-#include "as3722_init.h"
 
-/* AS3722-PMIC-specific early init code - get CPU rails up, etc */
+/* AS3722-PMIC-specific early init regs */
 
-void tegra_i2c_ll_write_addr(uint addr, uint config)
-{
-	struct i2c_ctlr *reg = (struct i2c_ctlr *)TEGRA_DVC_BASE;
+#define AS3722_I2C_ADDR		0x80
 
-	writel(addr, &reg->cmd_addr0);
-	writel(config, &reg->cnfg);
-}
+#define AS3722_SD0VOLTAGE_REG	0x00	/* CPU */
+#define AS3722_SD1VOLTAGE_REG	0x01	/* CORE, already set by OTP */
+#define AS3722_SD6VOLTAGE_REG	0x06	/* GPU */
+#define AS3722_SDCONTROL_REG	0x4D
 
-void tegra_i2c_ll_write_data(uint data, uint config)
-{
-	struct i2c_ctlr *reg = (struct i2c_ctlr *)TEGRA_DVC_BASE;
+#define AS3722_LDO1VOLTAGE_REG	0x11	/* VDD_SDMMC1 */
+#define AS3722_LDO2VOLTAGE_REG	0x12	/* VPP_FUSE */
+#define AS3722_LDO6VOLTAGE_REG	0x16	/* VDD_SDMMC3 */
+#define AS3722_LDCONTROL_REG	0x4E
 
-	writel(data, &reg->cmd_data1);
-	writel(config, &reg->cnfg);
-}
+#define AS3722_SD0VOLTAGE_DATA	(0x3C00 | AS3722_SD0VOLTAGE_REG)
+#define AS3722_SD0CONTROL_DATA	(0x0100 | AS3722_SDCONTROL_REG)
+
+#define AS3722_SD1VOLTAGE_DATA	(0x3200 | AS3722_SD1VOLTAGE_REG)
+#define AS3722_SD1CONTROL_DATA	(0x0200 | AS3722_SDCONTROL_REG)
+
+#define AS3722_SD6CONTROL_DATA	(0x4000 | AS3722_SDCONTROL_REG)
+#define AS3722_SD6VOLTAGE_DATA	(0x2800 | AS3722_SD6VOLTAGE_REG)
+
+#define AS3722_LDO1CONTROL_DATA	(0x0200 | AS3722_LDCONTROL_REG)
+#define AS3722_LDO1VOLTAGE_DATA	(0x7F00 | AS3722_LDO1VOLTAGE_REG)
+
+#define AS3722_LDO2CONTROL_DATA	(0x0400 | AS3722_LDCONTROL_REG)
+#define AS3722_LDO2VOLTAGE_DATA	(0x1000 | AS3722_LDO2VOLTAGE_REG)
+
+#define AS3722_LDO6CONTROL_DATA	(0x4000 | AS3722_LDCONTROL_REG)
+#define AS3722_LDO6VOLTAGE_DATA	(0x3F00 | AS3722_LDO6VOLTAGE_REG)
+
+/* AS3722-PMIC-specific early init code - get CPU rails up, etc */
 
 void pmic_enable_cpu_vdd(void)
 {
@@ -36,8 +51,8 @@ void pmic_enable_cpu_vdd(void)
 	/* Set up VDD_CORE, for boards where OTP is incorrect*/
 	debug("%s: Setting VDD_CORE via AS3722 reg 1\n", __func__);
 	/* Configure VDD_CORE via the AS3722 PMIC on the PWR I2C bus */
-	tegra_i2c_ll_write_addr(AS3722_I2C_ADDR, 2);
-	tegra_i2c_ll_write_data(AS3722_SD1VOLTAGE_DATA, I2C_SEND_2_BYTES);
+	tegra_i2c_ll_write(AS3722_I2C_ADDR,
+			   AS3722_SD1VOLTAGE_DATA);
 	/*
 	 * Don't write SDCONTROL - it's already 0x7F, i.e. all SDs enabled.
 	 * tegra_i2c_ll_write_data(AS3722_SD1CONTROL_DATA, I2C_SEND_2_BYTES);
@@ -49,23 +64,17 @@ void pmic_enable_cpu_vdd(void)
 	 * Make sure all non-fused regulators are down.
 	 * That way we're in known state after software reboot from linux
 	 */
-	tegra_i2c_ll_write_addr(AS3722_I2C_ADDR, 2);
-	tegra_i2c_ll_write_data(0x0003, I2C_SEND_2_BYTES);
+	tegra_i2c_ll_write(AS3722_I2C_ADDR, 0x0003);
 	udelay(10 * 1000);
-	tegra_i2c_ll_write_addr(AS3722_I2C_ADDR, 2);
-	tegra_i2c_ll_write_data(0x0004, I2C_SEND_2_BYTES);
+	tegra_i2c_ll_write(AS3722_I2C_ADDR, 0x0004);
 	udelay(10 * 1000);
-	tegra_i2c_ll_write_addr(AS3722_I2C_ADDR, 2);
-	tegra_i2c_ll_write_data(0x001b, I2C_SEND_2_BYTES);
+	tegra_i2c_ll_write(AS3722_I2C_ADDR, 0x001b);
 	udelay(10 * 1000);
-	tegra_i2c_ll_write_addr(AS3722_I2C_ADDR, 2);
-	tegra_i2c_ll_write_data(0x0014, I2C_SEND_2_BYTES);
+	tegra_i2c_ll_write(AS3722_I2C_ADDR, 0x0014);
 	udelay(10 * 1000);
-	tegra_i2c_ll_write_addr(AS3722_I2C_ADDR, 2);
-	tegra_i2c_ll_write_data(0x001a, I2C_SEND_2_BYTES);
+	tegra_i2c_ll_write(AS3722_I2C_ADDR, 0x001a);
 	udelay(10 * 1000);
-	tegra_i2c_ll_write_addr(AS3722_I2C_ADDR, 2);
-	tegra_i2c_ll_write_data(0x0019, I2C_SEND_2_BYTES);
+	tegra_i2c_ll_write(AS3722_I2C_ADDR, 0x0019);
 	udelay(10 * 1000);
 
 	debug("%s: Setting VDD_CPU to 1.0V via AS3722 reg 0/4D\n", __func__);
@@ -73,8 +82,8 @@ void pmic_enable_cpu_vdd(void)
 	 * Bring up VDD_CPU via the AS3722 PMIC on the PWR I2C bus.
 	 * First set VDD to 1.0V, then enable the VDD regulator.
 	 */
-	tegra_i2c_ll_write_addr(AS3722_I2C_ADDR, 2);
-	tegra_i2c_ll_write_data(AS3722_SD0VOLTAGE_DATA, I2C_SEND_2_BYTES);
+	tegra_i2c_ll_write(AS3722_I2C_ADDR,
+			   AS3722_SD0VOLTAGE_DATA);
 	/*
 	 * Don't write SDCONTROL - it's already 0x7F, i.e. all SDs enabled.
 	 * tegra_i2c_ll_write_data(AS3722_SD0CONTROL_DATA, I2C_SEND_2_BYTES);
@@ -86,8 +95,8 @@ void pmic_enable_cpu_vdd(void)
 	 * Bring up VDD_GPU via the AS3722 PMIC on the PWR I2C bus.
 	 * First set VDD to 1.0V, then enable the VDD regulator.
 	 */
-	tegra_i2c_ll_write_addr(AS3722_I2C_ADDR, 2);
-	tegra_i2c_ll_write_data(AS3722_SD6VOLTAGE_DATA, I2C_SEND_2_BYTES);
+	tegra_i2c_ll_write(AS3722_I2C_ADDR,
+			   AS3722_SD6VOLTAGE_DATA);
 	/*
 	 * Don't write SDCONTROL - it's already 0x7F, i.e. all SDs enabled.
 	 * tegra_i2c_ll_write_data(AS3722_SD6CONTROL_DATA, I2C_SEND_2_BYTES);
@@ -99,8 +108,8 @@ void pmic_enable_cpu_vdd(void)
 	 * Bring up VPP_FUSE via the AS3722 PMIC on the PWR I2C bus.
 	 * First set VDD to 1.2V, then enable the VDD regulator.
 	 */
-	tegra_i2c_ll_write_addr(AS3722_I2C_ADDR, 2);
-	tegra_i2c_ll_write_data(AS3722_LDO2VOLTAGE_DATA, I2C_SEND_2_BYTES);
+	tegra_i2c_ll_write(AS3722_I2C_ADDR,
+			   AS3722_LDO2VOLTAGE_DATA);
 	/*
 	 * Don't write LDCONTROL - it's already 0xFF, i.e. all LDOs enabled.
 	 * tegra_i2c_ll_write_data(AS3722_LDO2CONTROL_DATA, I2C_SEND_2_BYTES);
@@ -115,8 +124,8 @@ void pmic_enable_cpu_vdd(void)
 	 * NOTE: We do this early because doing it later seems to hose the CPU
 	 * power rail/partition startup. Need to debug.
 	 */
-	tegra_i2c_ll_write_addr(AS3722_I2C_ADDR, 2);
-	tegra_i2c_ll_write_data(AS3722_LDO1VOLTAGE_DATA, I2C_SEND_2_BYTES);
+	tegra_i2c_ll_write(AS3722_I2C_ADDR,
+			   AS3722_LDO1VOLTAGE_DATA);
 	/*
 	 * Don't write LDCONTROL - it's already 0xFF, i.e. all LDOs enabled.
 	 * tegra_i2c_ll_write_data(AS3722_LDO1CONTROL_DATA, I2C_SEND_2_BYTES);
@@ -131,8 +140,8 @@ void pmic_enable_cpu_vdd(void)
 	 * NOTE: We do this early because doing it later seems to hose the CPU
 	 * power rail/partition startup. Need to debug.
 	 */
-	tegra_i2c_ll_write_addr(AS3722_I2C_ADDR, 2);
-	tegra_i2c_ll_write_data(AS3722_LDO6VOLTAGE_DATA, I2C_SEND_2_BYTES);
+	tegra_i2c_ll_write(AS3722_I2C_ADDR,
+			   AS3722_LDO6VOLTAGE_DATA);
 	/*
 	 * Don't write LDCONTROL - it's already 0xFF, i.e. all LDOs enabled.
 	 * tegra_i2c_ll_write_data(AS3722_LDO6CONTROL_DATA, I2C_SEND_2_BYTES);
diff --git a/board/toradex/apalis-tk1/as3722_init.h b/board/toradex/apalis-tk1/as3722_init.h
deleted file mode 100644
index 99836de966..0000000000
--- a/board/toradex/apalis-tk1/as3722_init.h
+++ /dev/null
@@ -1,40 +0,0 @@
-/* SPDX-License-Identifier: GPL-2.0+ */
-/*
- * Copyright (c) 2012-2016 Toradex, Inc.
- */
-
-/* AS3722-PMIC-specific early init regs */
-
-#define AS3722_I2C_ADDR		0x80
-
-#define AS3722_SD0VOLTAGE_REG	0x00	/* CPU */
-#define AS3722_SD1VOLTAGE_REG	0x01	/* CORE, already set by OTP */
-#define AS3722_SD6VOLTAGE_REG	0x06	/* GPU */
-#define AS3722_SDCONTROL_REG	0x4D
-
-#define AS3722_LDO1VOLTAGE_REG	0x11	/* VDD_SDMMC1 */
-#define AS3722_LDO2VOLTAGE_REG	0x12	/* VPP_FUSE */
-#define AS3722_LDO6VOLTAGE_REG	0x16	/* VDD_SDMMC3 */
-#define AS3722_LDCONTROL_REG	0x4E
-
-#define AS3722_SD0VOLTAGE_DATA	(0x3C00 | AS3722_SD0VOLTAGE_REG)
-#define AS3722_SD0CONTROL_DATA	(0x0100 | AS3722_SDCONTROL_REG)
-
-#define AS3722_SD1VOLTAGE_DATA	(0x3200 | AS3722_SD1VOLTAGE_REG)
-#define AS3722_SD1CONTROL_DATA	(0x0200 | AS3722_SDCONTROL_REG)
-
-#define AS3722_SD6CONTROL_DATA	(0x4000 | AS3722_SDCONTROL_REG)
-#define AS3722_SD6VOLTAGE_DATA	(0x2800 | AS3722_SD6VOLTAGE_REG)
-
-#define AS3722_LDO1CONTROL_DATA	(0x0200 | AS3722_LDCONTROL_REG)
-#define AS3722_LDO1VOLTAGE_DATA	(0x7F00 | AS3722_LDO1VOLTAGE_REG)
-
-#define AS3722_LDO2CONTROL_DATA	(0x0400 | AS3722_LDCONTROL_REG)
-#define AS3722_LDO2VOLTAGE_DATA	(0x1000 | AS3722_LDO2VOLTAGE_REG)
-
-#define AS3722_LDO6CONTROL_DATA	(0x4000 | AS3722_LDCONTROL_REG)
-#define AS3722_LDO6VOLTAGE_DATA	(0x3F00 | AS3722_LDO6VOLTAGE_REG)
-
-#define I2C_SEND_2_BYTES	0x0A02
-
-void pmic_enable_cpu_vdd(void);
-- 
2.37.2


^ permalink raw reply related	[flat|nested] 26+ messages in thread

* [PATCH v2 12/16] board: tegra30: switch to updated pre-dm i2c write
  2023-02-02 18:13 [PATCH v2 00/16] General Tegra improvements Svyatoslav Ryhel
                   ` (10 preceding siblings ...)
  2023-02-02 18:13 ` [PATCH v2 11/16] board: tegra124: switch to updated " Svyatoslav Ryhel
@ 2023-02-02 18:13 ` Svyatoslav Ryhel
  2023-02-03  2:15   ` Simon Glass
  2023-02-02 18:13 ` [PATCH v2 13/16] ARM: tegra: expose crypto module for all Tegra SoCs Svyatoslav Ryhel
                   ` (3 subsequent siblings)
  15 siblings, 1 reply; 26+ messages in thread
From: Svyatoslav Ryhel @ 2023-02-02 18:13 UTC (permalink / raw)
  To: Tom Warren, Alban Bedel, Stephen Warren, Marcel Ziswiler,
	Allen Martin, Jagan Teki, Lukasz Majewski, Marek Vasut,
	Svyatoslav Ryhel, Ramin Khonsari, Thierry Reding, Maxim Schwalm,
	Dmitry Osipenko
  Cc: u-boot

Configure PMIC voltages for early stages using updated
early i2c write.

Signed-off-by: Svyatoslav Ryhel <clamor95@gmail.com>
---
 arch/arm/mach-tegra/tegra30/Kconfig         |  8 ----
 arch/arm/mach-tegra/tegra30/cpu.c           | 36 -----------------
 board/avionic-design/tec-ng/Makefile        |  4 +-
 board/avionic-design/tec-ng/tec-ng-spl.c    | 34 ++++++++++++++++
 board/nvidia/beaver/Makefile                |  2 +
 board/nvidia/beaver/beaver-spl.c            | 43 +++++++++++++++++++++
 board/nvidia/cardhu/Makefile                |  4 +-
 board/nvidia/cardhu/cardhu-spl.c            | 43 +++++++++++++++++++++
 board/toradex/apalis_t30/Makefile           |  2 +
 board/toradex/apalis_t30/apalis_t30-spl.c   | 34 ++++++++++++++++
 board/toradex/colibri_t30/Makefile          |  2 +
 board/toradex/colibri_t30/colibri_t30-spl.c | 34 ++++++++++++++++
 12 files changed, 200 insertions(+), 46 deletions(-)
 create mode 100644 board/avionic-design/tec-ng/tec-ng-spl.c
 create mode 100644 board/nvidia/beaver/beaver-spl.c
 create mode 100644 board/nvidia/cardhu/cardhu-spl.c
 create mode 100644 board/toradex/apalis_t30/apalis_t30-spl.c
 create mode 100644 board/toradex/colibri_t30/colibri_t30-spl.c

diff --git a/arch/arm/mach-tegra/tegra30/Kconfig b/arch/arm/mach-tegra/tegra30/Kconfig
index 5619d1cd42..85b8ce294f 100644
--- a/arch/arm/mach-tegra/tegra30/Kconfig
+++ b/arch/arm/mach-tegra/tegra30/Kconfig
@@ -1,11 +1,5 @@
 if TEGRA30
 
-config TEGRA_VDD_CORE_TPS62361B_SET3
-	bool
-
-config TEGRA_VDD_CORE_TPS62366A_SET1
-	bool
-
 choice
 	prompt "Tegra30 board select"
 	optional
@@ -17,12 +11,10 @@ config TARGET_APALIS_T30
 config TARGET_BEAVER
 	bool "NVIDIA Tegra30 Beaver evaluation board"
 	select BOARD_LATE_INIT
-	select TEGRA_VDD_CORE_TPS62366A_SET1
 
 config TARGET_CARDHU
 	bool "NVIDIA Tegra30 Cardhu evaluation board"
 	select BOARD_LATE_INIT
-	select TEGRA_VDD_CORE_TPS62361B_SET3
 
 config TARGET_COLIBRI_T30
 	bool "Toradex Colibri T30 board"
diff --git a/arch/arm/mach-tegra/tegra30/cpu.c b/arch/arm/mach-tegra/tegra30/cpu.c
index 6ac45af51a..60bbf13ea5 100644
--- a/arch/arm/mach-tegra/tegra30/cpu.c
+++ b/arch/arm/mach-tegra/tegra30/cpu.c
@@ -15,20 +15,6 @@
 #include <linux/delay.h>
 #include "../cpu.h"
 
-#define TPS62366A_I2C_ADDR		0xC0
-#define TPS62366A_SET1_REG		0x01
-#define TPS62366A_SET1_DATA		(0x4600 | TPS62366A_SET1_REG)
-
-#define TPS62361B_I2C_ADDR		0xC0
-#define TPS62361B_SET3_REG		0x03
-#define TPS62361B_SET3_DATA		(0x4600 | TPS62361B_SET3_REG)
-
-#define TPS65911_I2C_ADDR		0x5A
-#define TPS65911_VDDCTRL_OP_REG		0x28
-#define TPS65911_VDDCTRL_SR_REG		0x27
-#define TPS65911_VDDCTRL_OP_DATA	(0x2400 | TPS65911_VDDCTRL_OP_REG)
-#define TPS65911_VDDCTRL_SR_DATA	(0x0100 | TPS65911_VDDCTRL_SR_REG)
-
 /* In case this function is not defined */
 __weak void pmic_enable_cpu_vdd(void) {}
 
@@ -41,28 +27,6 @@ static void enable_cpu_power_rail(void)
 	reg = readl(&pmc->pmc_cntrl);
 	reg |= CPUPWRREQ_OE;
 	writel(reg, &pmc->pmc_cntrl);
-
-	/* Set VDD_CORE to 1.200V. */
-#ifdef CONFIG_TEGRA_VDD_CORE_TPS62366A_SET1
-	tegra_i2c_ll_write(TPS62366A_I2C_ADDR,
-			   TPS62366A_SET1_DATA);
-#endif
-#ifdef CONFIG_TEGRA_VDD_CORE_TPS62361B_SET3
-	tegra_i2c_ll_write(TPS62361B_I2C_ADDR,
-			   TPS62361B_SET3_DATA);
-#endif
-	udelay(1000);
-
-	/*
-	 * Bring up CPU VDD via the TPS65911x PMIC on the DVC I2C bus.
-	 * First set VDD to 1.0125V, then enable the VDD regulator.
-	 */
-	tegra_i2c_ll_write(TPS65911_I2C_ADDR,
-			   TPS65911_VDDCTRL_OP_DATA);
-	udelay(1000);
-	tegra_i2c_ll_write(TPS65911_I2C_ADDR,
-			   TPS65911_VDDCTRL_SR_DATA);
-	udelay(10 * 1000);
 }
 
 /**
diff --git a/board/avionic-design/tec-ng/Makefile b/board/avionic-design/tec-ng/Makefile
index 46df14d991..d6890e5797 100644
--- a/board/avionic-design/tec-ng/Makefile
+++ b/board/avionic-design/tec-ng/Makefile
@@ -3,4 +3,6 @@
 # (C) Copyright 2013
 # Avionic Design GmbH <www.avionic-design.de>
 
-obj-y	:= ../common/tamonten-ng.o
+obj-$(CONFIG_SPL_BUILD) += tec-ng-spl.o
+
+obj-y	+= ../common/tamonten-ng.o
diff --git a/board/avionic-design/tec-ng/tec-ng-spl.c b/board/avionic-design/tec-ng/tec-ng-spl.c
new file mode 100644
index 0000000000..6e54464183
--- /dev/null
+++ b/board/avionic-design/tec-ng/tec-ng-spl.c
@@ -0,0 +1,34 @@
+// SPDX-License-Identifier: GPL-2.0-or-later
+/*
+ *  (C) Copyright 2010-2013
+ *  NVIDIA Corporation <www.nvidia.com>
+ *
+ *  (C) Copyright 2021
+ *  Svyatoslav Ryhel <clamor95@gmail.com>
+ */
+
+#include <common.h>
+#include <asm/arch-tegra/tegra_i2c.h>
+#include <linux/delay.h>
+
+/* I2C addr is in 8 bit */
+#define TPS65911_I2C_ADDR		0x5A
+#define TPS65911_VDDCTRL_OP_REG		0x28
+#define TPS65911_VDDCTRL_SR_REG		0x27
+#define TPS65911_VDDCTRL_OP_DATA	(0x2400 | TPS65911_VDDCTRL_OP_REG)
+#define TPS65911_VDDCTRL_SR_DATA	(0x0100 | TPS65911_VDDCTRL_SR_REG)
+
+void pmic_enable_cpu_vdd(void)
+{
+	/*
+	 * Bring up CPU VDD via the TPS65911x PMIC on the DVC I2C bus.
+	 * First set VDD to 1.0125V, then enable the VDD regulator.
+	 */
+	udelay(1000);
+	tegra_i2c_ll_write(TPS65911_I2C_ADDR,
+			   TPS65911_VDDCTRL_OP_DATA);
+	udelay(1000);
+	tegra_i2c_ll_write(TPS65911_I2C_ADDR,
+			   TPS65911_VDDCTRL_SR_DATA);
+	udelay(10 * 1000);
+}
diff --git a/board/nvidia/beaver/Makefile b/board/nvidia/beaver/Makefile
index 80cff3eb9c..5e9e70825c 100644
--- a/board/nvidia/beaver/Makefile
+++ b/board/nvidia/beaver/Makefile
@@ -2,4 +2,6 @@
 #
 # Copyright (c) 2010-2013, NVIDIA CORPORATION.  All rights reserved.
 
+obj-$(CONFIG_SPL_BUILD) += beaver-spl.o
+
 obj-y	= ../cardhu/cardhu.o
diff --git a/board/nvidia/beaver/beaver-spl.c b/board/nvidia/beaver/beaver-spl.c
new file mode 100644
index 0000000000..b5d0c14854
--- /dev/null
+++ b/board/nvidia/beaver/beaver-spl.c
@@ -0,0 +1,43 @@
+// SPDX-License-Identifier: GPL-2.0-or-later
+/*
+ *  (C) Copyright 2010-2013
+ *  NVIDIA Corporation <www.nvidia.com>
+ *
+ *  (C) Copyright 2021
+ *  Svyatoslav Ryhel <clamor95@gmail.com>
+ */
+
+#include <common.h>
+#include <asm/arch-tegra/tegra_i2c.h>
+#include <linux/delay.h>
+
+/* I2C addr is in 8 bit */
+#define TPS65911_I2C_ADDR		0x5A
+#define TPS65911_VDDCTRL_OP_REG		0x28
+#define TPS65911_VDDCTRL_SR_REG		0x27
+#define TPS65911_VDDCTRL_OP_DATA	(0x2400 | TPS65911_VDDCTRL_OP_REG)
+#define TPS65911_VDDCTRL_SR_DATA	(0x0100 | TPS65911_VDDCTRL_SR_REG)
+
+#define TPS62366A_I2C_ADDR		0xC0
+#define TPS62366A_SET1_REG		0x01
+#define TPS62366A_SET1_DATA		(0x4600 | TPS62366A_SET1_REG)
+
+void pmic_enable_cpu_vdd(void)
+{
+	/* Set VDD_CORE to 1.200V. */
+	tegra_i2c_ll_write(TPS62366A_I2C_ADDR,
+			   TPS62366A_SET1_DATA);
+
+	udelay(1000);
+
+	/*
+	 * Bring up CPU VDD via the TPS65911x PMIC on the DVC I2C bus.
+	 * First set VDD to 1.0125V, then enable the VDD regulator.
+	 */
+	tegra_i2c_ll_write(TPS65911_I2C_ADDR,
+			   TPS65911_VDDCTRL_OP_DATA);
+	udelay(1000);
+	tegra_i2c_ll_write(TPS65911_I2C_ADDR,
+			   TPS65911_VDDCTRL_SR_DATA);
+	udelay(10 * 1000);
+}
diff --git a/board/nvidia/cardhu/Makefile b/board/nvidia/cardhu/Makefile
index 95971053d9..6f480cdfd3 100644
--- a/board/nvidia/cardhu/Makefile
+++ b/board/nvidia/cardhu/Makefile
@@ -3,4 +3,6 @@
 #  (C) Copyright 2010-2012
 #  NVIDIA Corporation <www.nvidia.com>
 
-obj-y	:= cardhu.o
+obj-$(CONFIG_SPL_BUILD) += cardhu-spl.o
+
+obj-y	+= cardhu.o
diff --git a/board/nvidia/cardhu/cardhu-spl.c b/board/nvidia/cardhu/cardhu-spl.c
new file mode 100644
index 0000000000..de2fa300f1
--- /dev/null
+++ b/board/nvidia/cardhu/cardhu-spl.c
@@ -0,0 +1,43 @@
+// SPDX-License-Identifier: GPL-2.0-or-later
+/*
+ *  (C) Copyright 2010-2013
+ *  NVIDIA Corporation <www.nvidia.com>
+ *
+ *  (C) Copyright 2021
+ *  Svyatoslav Ryhel <clamor95@gmail.com>
+ */
+
+#include <common.h>
+#include <asm/arch-tegra/tegra_i2c.h>
+#include <linux/delay.h>
+
+/* I2C addr is in 8 bit */
+#define TPS65911_I2C_ADDR		0x5A
+#define TPS65911_VDDCTRL_OP_REG		0x28
+#define TPS65911_VDDCTRL_SR_REG		0x27
+#define TPS65911_VDDCTRL_OP_DATA	(0x2400 | TPS65911_VDDCTRL_OP_REG)
+#define TPS65911_VDDCTRL_SR_DATA	(0x0100 | TPS65911_VDDCTRL_SR_REG)
+
+#define TPS62361B_I2C_ADDR		0xC0
+#define TPS62361B_SET3_REG		0x03
+#define TPS62361B_SET3_DATA		(0x4600 | TPS62361B_SET3_REG)
+
+void pmic_enable_cpu_vdd(void)
+{
+	/* Set VDD_CORE to 1.200V. */
+	tegra_i2c_ll_write(TPS62361B_I2C_ADDR,
+			   TPS62361B_SET3_DATA);
+
+	udelay(1000);
+
+	/*
+	 * Bring up CPU VDD via the TPS65911x PMIC on the DVC I2C bus.
+	 * First set VDD to 1.0125V, then enable the VDD regulator.
+	 */
+	tegra_i2c_ll_write(TPS65911_I2C_ADDR,
+			   TPS65911_VDDCTRL_OP_DATA);
+	udelay(1000);
+	tegra_i2c_ll_write(TPS65911_I2C_ADDR,
+			   TPS65911_VDDCTRL_SR_DATA);
+	udelay(10 * 1000);
+}
diff --git a/board/toradex/apalis_t30/Makefile b/board/toradex/apalis_t30/Makefile
index 0ea3d8f217..eed607043f 100644
--- a/board/toradex/apalis_t30/Makefile
+++ b/board/toradex/apalis_t30/Makefile
@@ -1,4 +1,6 @@
 # Copyright (c) 2014 Marcel Ziswiler
 # SPDX-License-Identifier:      GPL-2.0+
 
+obj-$(CONFIG_SPL_BUILD) += apalis_t30-spl.o
+
 obj-y	+= apalis_t30.o
diff --git a/board/toradex/apalis_t30/apalis_t30-spl.c b/board/toradex/apalis_t30/apalis_t30-spl.c
new file mode 100644
index 0000000000..6e54464183
--- /dev/null
+++ b/board/toradex/apalis_t30/apalis_t30-spl.c
@@ -0,0 +1,34 @@
+// SPDX-License-Identifier: GPL-2.0-or-later
+/*
+ *  (C) Copyright 2010-2013
+ *  NVIDIA Corporation <www.nvidia.com>
+ *
+ *  (C) Copyright 2021
+ *  Svyatoslav Ryhel <clamor95@gmail.com>
+ */
+
+#include <common.h>
+#include <asm/arch-tegra/tegra_i2c.h>
+#include <linux/delay.h>
+
+/* I2C addr is in 8 bit */
+#define TPS65911_I2C_ADDR		0x5A
+#define TPS65911_VDDCTRL_OP_REG		0x28
+#define TPS65911_VDDCTRL_SR_REG		0x27
+#define TPS65911_VDDCTRL_OP_DATA	(0x2400 | TPS65911_VDDCTRL_OP_REG)
+#define TPS65911_VDDCTRL_SR_DATA	(0x0100 | TPS65911_VDDCTRL_SR_REG)
+
+void pmic_enable_cpu_vdd(void)
+{
+	/*
+	 * Bring up CPU VDD via the TPS65911x PMIC on the DVC I2C bus.
+	 * First set VDD to 1.0125V, then enable the VDD regulator.
+	 */
+	udelay(1000);
+	tegra_i2c_ll_write(TPS65911_I2C_ADDR,
+			   TPS65911_VDDCTRL_OP_DATA);
+	udelay(1000);
+	tegra_i2c_ll_write(TPS65911_I2C_ADDR,
+			   TPS65911_VDDCTRL_SR_DATA);
+	udelay(10 * 1000);
+}
diff --git a/board/toradex/colibri_t30/Makefile b/board/toradex/colibri_t30/Makefile
index 4242902dae..8f333235b1 100644
--- a/board/toradex/colibri_t30/Makefile
+++ b/board/toradex/colibri_t30/Makefile
@@ -1,4 +1,6 @@
 # Copyright (c) 2013-2014 Stefan Agner
 # SPDX-License-Identifier:      GPL-2.0+
 
+obj-$(CONFIG_SPL_BUILD) += colibri_t30-spl.o
+
 obj-y	+= colibri_t30.o
diff --git a/board/toradex/colibri_t30/colibri_t30-spl.c b/board/toradex/colibri_t30/colibri_t30-spl.c
new file mode 100644
index 0000000000..6e54464183
--- /dev/null
+++ b/board/toradex/colibri_t30/colibri_t30-spl.c
@@ -0,0 +1,34 @@
+// SPDX-License-Identifier: GPL-2.0-or-later
+/*
+ *  (C) Copyright 2010-2013
+ *  NVIDIA Corporation <www.nvidia.com>
+ *
+ *  (C) Copyright 2021
+ *  Svyatoslav Ryhel <clamor95@gmail.com>
+ */
+
+#include <common.h>
+#include <asm/arch-tegra/tegra_i2c.h>
+#include <linux/delay.h>
+
+/* I2C addr is in 8 bit */
+#define TPS65911_I2C_ADDR		0x5A
+#define TPS65911_VDDCTRL_OP_REG		0x28
+#define TPS65911_VDDCTRL_SR_REG		0x27
+#define TPS65911_VDDCTRL_OP_DATA	(0x2400 | TPS65911_VDDCTRL_OP_REG)
+#define TPS65911_VDDCTRL_SR_DATA	(0x0100 | TPS65911_VDDCTRL_SR_REG)
+
+void pmic_enable_cpu_vdd(void)
+{
+	/*
+	 * Bring up CPU VDD via the TPS65911x PMIC on the DVC I2C bus.
+	 * First set VDD to 1.0125V, then enable the VDD regulator.
+	 */
+	udelay(1000);
+	tegra_i2c_ll_write(TPS65911_I2C_ADDR,
+			   TPS65911_VDDCTRL_OP_DATA);
+	udelay(1000);
+	tegra_i2c_ll_write(TPS65911_I2C_ADDR,
+			   TPS65911_VDDCTRL_SR_DATA);
+	udelay(10 * 1000);
+}
-- 
2.37.2


^ permalink raw reply related	[flat|nested] 26+ messages in thread

* [PATCH v2 13/16] ARM: tegra: expose crypto module for all Tegra SoCs
  2023-02-02 18:13 [PATCH v2 00/16] General Tegra improvements Svyatoslav Ryhel
                   ` (11 preceding siblings ...)
  2023-02-02 18:13 ` [PATCH v2 12/16] board: tegra30: " Svyatoslav Ryhel
@ 2023-02-02 18:13 ` Svyatoslav Ryhel
  2023-02-02 18:13 ` [PATCH v2 14/16] ARM: tegra: crypto: extend crypto functional Svyatoslav Ryhel
                   ` (2 subsequent siblings)
  15 siblings, 0 replies; 26+ messages in thread
From: Svyatoslav Ryhel @ 2023-02-02 18:13 UTC (permalink / raw)
  To: Tom Warren, Alban Bedel, Stephen Warren, Marcel Ziswiler,
	Allen Martin, Jagan Teki, Lukasz Majewski, Marek Vasut,
	Svyatoslav Ryhel, Ramin Khonsari, Thierry Reding, Maxim Schwalm,
	Dmitry Osipenko
  Cc: u-boot

Move crypto module from T20 only into common Tegra dir.

Signed-off-by: Svyatoslav Ryhel <clamor95@gmail.com>
---
 arch/arm/mach-tegra/Kconfig                | 5 +++++
 arch/arm/mach-tegra/Makefile               | 1 +
 arch/arm/mach-tegra/{tegra20 => }/crypto.c | 0
 arch/arm/mach-tegra/{tegra20 => }/crypto.h | 0
 arch/arm/mach-tegra/tegra20/Kconfig        | 1 +
 arch/arm/mach-tegra/tegra20/Makefile       | 2 +-
 6 files changed, 8 insertions(+), 1 deletion(-)
 rename arch/arm/mach-tegra/{tegra20 => }/crypto.c (100%)
 rename arch/arm/mach-tegra/{tegra20 => }/crypto.h (100%)

diff --git a/arch/arm/mach-tegra/Kconfig b/arch/arm/mach-tegra/Kconfig
index 4fc79ebadb..5b0cd92d9e 100644
--- a/arch/arm/mach-tegra/Kconfig
+++ b/arch/arm/mach-tegra/Kconfig
@@ -15,6 +15,11 @@ config SPL_SERIAL
 config TEGRA_CLKRST
 	bool
 
+config TEGRA_CRYPTO
+	bool "Tegra AES128 crypto module"
+	select AES
+	default n
+
 config TEGRA_GP_PADCTRL
 	bool
 
diff --git a/arch/arm/mach-tegra/Makefile b/arch/arm/mach-tegra/Makefile
index 7165d70a60..9147050b32 100644
--- a/arch/arm/mach-tegra/Makefile
+++ b/arch/arm/mach-tegra/Makefile
@@ -16,6 +16,7 @@ obj-$(CONFIG_TEGRA_GP_PADCTRL) += ap.o
 obj-y += board.o board2.o
 obj-y += cache.o
 obj-$(CONFIG_TEGRA_CLKRST) += clock.o
+obj-$(CONFIG_$(SPL_)TEGRA_CRYPTO) += crypto.o
 obj-$(CONFIG_TEGRA_PINCTRL) += pinmux-common.o
 obj-$(CONFIG_TEGRA_PMC) += powergate.o
 obj-y += xusb-padctl-dummy.o
diff --git a/arch/arm/mach-tegra/tegra20/crypto.c b/arch/arm/mach-tegra/crypto.c
similarity index 100%
rename from arch/arm/mach-tegra/tegra20/crypto.c
rename to arch/arm/mach-tegra/crypto.c
diff --git a/arch/arm/mach-tegra/tegra20/crypto.h b/arch/arm/mach-tegra/crypto.h
similarity index 100%
rename from arch/arm/mach-tegra/tegra20/crypto.h
rename to arch/arm/mach-tegra/crypto.h
diff --git a/arch/arm/mach-tegra/tegra20/Kconfig b/arch/arm/mach-tegra/tegra20/Kconfig
index 955786c0c4..57d11024bf 100644
--- a/arch/arm/mach-tegra/tegra20/Kconfig
+++ b/arch/arm/mach-tegra/tegra20/Kconfig
@@ -3,6 +3,7 @@ if TEGRA20
 config TEGRA_LP0
 	bool
 	select TEGRA_CLOCK_SCALING
+	select TEGRA_CRYPTO
 
 config TEGRA_PMU
 	bool
diff --git a/arch/arm/mach-tegra/tegra20/Makefile b/arch/arm/mach-tegra/tegra20/Makefile
index bb17c90cca..67454ff5f4 100644
--- a/arch/arm/mach-tegra/tegra20/Makefile
+++ b/arch/arm/mach-tegra/tegra20/Makefile
@@ -13,6 +13,6 @@ CFLAGS_warmboot_avp.o = -march=armv4t -U__LINUX_ARM_ARCH__ \
 CFLAGS_REMOVE_warmboot_avp.o := $(LTO_CFLAGS)
 
 obj-y	+= clock.o funcmux.o pinmux.o
-obj-$(CONFIG_TEGRA_LP0) += warmboot.o crypto.o warmboot_avp.o
+obj-$(CONFIG_TEGRA_LP0) += warmboot.o warmboot_avp.o
 obj-$(CONFIG_TEGRA_CLOCK_SCALING) += emc.o
 obj-$(CONFIG_TEGRA_PMU) += pmu.o
-- 
2.37.2


^ permalink raw reply related	[flat|nested] 26+ messages in thread

* [PATCH v2 14/16] ARM: tegra: crypto: extend crypto functional
  2023-02-02 18:13 [PATCH v2 00/16] General Tegra improvements Svyatoslav Ryhel
                   ` (12 preceding siblings ...)
  2023-02-02 18:13 ` [PATCH v2 13/16] ARM: tegra: expose crypto module for all Tegra SoCs Svyatoslav Ryhel
@ 2023-02-02 18:13 ` Svyatoslav Ryhel
  2023-02-02 18:13 ` [PATCH v2 15/16] ARM: tegra30: implement BCT patching Svyatoslav Ryhel
  2023-02-02 18:13 ` [PATCH v2 16/16] ARM: tegra20: " Svyatoslav Ryhel
  15 siblings, 0 replies; 26+ messages in thread
From: Svyatoslav Ryhel @ 2023-02-02 18:13 UTC (permalink / raw)
  To: Tom Warren, Alban Bedel, Stephen Warren, Marcel Ziswiler,
	Allen Martin, Jagan Teki, Lukasz Majewski, Marek Vasut,
	Svyatoslav Ryhel, Ramin Khonsari, Thierry Reding, Maxim Schwalm,
	Dmitry Osipenko
  Cc: u-boot

Add support for encryption, decryption and signinig with
non-zero key saving backward compatibility.

Signed-off-by: Svyatoslav Ryhel <clamor95@gmail.com>
---
 arch/arm/include/asm/arch-tegra/crypto.h | 47 ++++++++++++++++++
 arch/arm/mach-tegra/crypto.c             | 63 +++++++++++++++++-------
 arch/arm/mach-tegra/crypto.h             | 19 -------
 3 files changed, 91 insertions(+), 38 deletions(-)
 create mode 100644 arch/arm/include/asm/arch-tegra/crypto.h
 delete mode 100644 arch/arm/mach-tegra/crypto.h

diff --git a/arch/arm/include/asm/arch-tegra/crypto.h b/arch/arm/include/asm/arch-tegra/crypto.h
new file mode 100644
index 0000000000..7646163b97
--- /dev/null
+++ b/arch/arm/include/asm/arch-tegra/crypto.h
@@ -0,0 +1,47 @@
+/* SPDX-License-Identifier: GPL-2.0+ */
+/*
+ * Copyright (c) 2011 The Chromium OS Authors.
+ * (C) Copyright 2010 - 2011 NVIDIA Corporation <www.nvidia.com>
+ */
+
+#ifndef _CRYPTO_H_
+#define _CRYPTO_H_
+
+/**
+ * Sign a block of data
+ *
+ * \param source	Source data
+ * \param length	Size of source data
+ * \param signature	Destination address for signature, AES_KEY_LENGTH bytes
+ */
+int sign_data_block(u8 *source, unsigned int length, u8 *signature);
+
+/**
+ * Sign an encrypted block of data
+ *
+ * \param source	Source data
+ * \param length	Size of source data
+ * \param signature	Destination address for signature, AES_KEY_LENGTH bytes
+ * \param key		AES128 encryption key
+ */
+int sign_enc_data_block(u8 *source, unsigned int length, u8 *signature, u8 *key);
+
+/**
+ * Encrypt a block of data
+ *
+ * \param source	Source data
+ * \param length	Size of source data
+ * \param key		AES128 encryption key
+ */
+int encrypt_data_block(u8 *source, unsigned int length, u8 *key);
+
+/**
+ * Decrypt a block of data
+ *
+ * \param source	Source data
+ * \param length	Size of source data
+ * \param key		AES128 encryption key
+ */
+int decrypt_data_block(u8 *source, unsigned int length, u8 *key);
+
+#endif /* #ifndef _CRYPTO_H_ */
diff --git a/arch/arm/mach-tegra/crypto.c b/arch/arm/mach-tegra/crypto.c
index 1efaa5c3ec..893da35e0b 100644
--- a/arch/arm/mach-tegra/crypto.c
+++ b/arch/arm/mach-tegra/crypto.c
@@ -7,7 +7,7 @@
 #include <common.h>
 #include <log.h>
 #include <linux/errno.h>
-#include "crypto.h"
+#include <asm/arch-tegra/crypto.h>
 #include "uboot_aes.h"
 
 static u8 zero_key[16];
@@ -17,6 +17,7 @@ static u8 zero_key[16];
 enum security_op {
 	SECURITY_SIGN		= 1 << 0,	/* Sign the data */
 	SECURITY_ENCRYPT	= 1 << 1,	/* Encrypt the data */
+	SECURITY_DECRYPT	= 1 << 2,	/* Dectypt the data */
 };
 
 /**
@@ -54,7 +55,7 @@ static void sign_object(u8 *key, u8 *key_schedule, u8 *src, u8 *dst,
 	u8 left[AES128_KEY_LENGTH];
 	u8 k1[AES128_KEY_LENGTH];
 	u8 *cbc_chain_data;
-	unsigned i;
+	unsigned int i;
 
 	cbc_chain_data = zero_key;	/* Convenient array of 0's for IV */
 
@@ -92,7 +93,7 @@ static void sign_object(u8 *key, u8 *key_schedule, u8 *src, u8 *dst,
 }
 
 /**
- * Encrypt and sign a block of data (depending on security mode).
+ * Decrypt, encrypt or sign a block of data (depending on security mode).
  *
  * \param key		Input AES key, length AES128_KEY_LENGTH
  * \param oper		Security operations mask to perform (enum security_op)
@@ -100,44 +101,68 @@ static void sign_object(u8 *key, u8 *key_schedule, u8 *src, u8 *dst,
  * \param length	Size of source data
  * \param sig_dst	Destination address for signature, AES128_KEY_LENGTH bytes
  */
-static int encrypt_and_sign(u8 *key, enum security_op oper, u8 *src,
-			    u32 length, u8 *sig_dst)
+static int tegra_crypto_core(u8 *key, enum security_op oper, u8 *src,
+			     u32 length, u8 *sig_dst)
 {
 	u32 num_aes_blocks;
 	u8 key_schedule[AES128_EXPAND_KEY_LENGTH];
 	u8 iv[AES128_KEY_LENGTH] = {0};
 
-	debug("encrypt_and_sign: length = %d\n", length);
+	debug("%s: length = %d\n", __func__, length);
 
-	/*
-	 * The only need for a key is for signing/checksum purposes, so
-	 * if not encrypting, expand a key of 0s.
-	 */
-	aes_expand_key(oper & SECURITY_ENCRYPT ? key : zero_key,
-		       AES128_KEY_LENGTH, key_schedule);
+	aes_expand_key(key, AES128_KEY_LENGTH, key_schedule);
 
 	num_aes_blocks = (length + AES128_KEY_LENGTH - 1) / AES128_KEY_LENGTH;
 
+	if (oper & SECURITY_DECRYPT) {
+		/* Perform this in place, resulting in src being decrypted. */
+		debug("%s: begin decryption\n", __func__);
+		aes_cbc_decrypt_blocks(AES128_KEY_LENGTH, key_schedule, iv, src,
+				       src, num_aes_blocks);
+		debug("%s: end decryption\n", __func__);
+	}
+
 	if (oper & SECURITY_ENCRYPT) {
 		/* Perform this in place, resulting in src being encrypted. */
-		debug("encrypt_and_sign: begin encryption\n");
+		debug("%s: begin encryption\n", __func__);
 		aes_cbc_encrypt_blocks(AES128_KEY_LENGTH, key_schedule, iv, src,
 				       src, num_aes_blocks);
-		debug("encrypt_and_sign: end encryption\n");
+		debug("%s: end encryption\n", __func__);
 	}
 
 	if (oper & SECURITY_SIGN) {
 		/* encrypt the data, overwriting the result in signature. */
-		debug("encrypt_and_sign: begin signing\n");
+		debug("%s: begin signing\n", __func__);
 		sign_object(key, key_schedule, src, sig_dst, num_aes_blocks);
-		debug("encrypt_and_sign: end signing\n");
+		debug("%s: end signing\n", __func__);
 	}
 
 	return 0;
 }
 
-int sign_data_block(u8 *source, unsigned length, u8 *signature)
+/**
+ * Tegra crypto group
+ */
+int sign_data_block(u8 *source, unsigned int length, u8 *signature)
+{
+	return tegra_crypto_core(zero_key, SECURITY_SIGN, source,
+				 length, signature);
+}
+
+int sign_enc_data_block(u8 *source, unsigned int length, u8 *signature, u8 *key)
+{
+	return tegra_crypto_core(key, SECURITY_SIGN, source,
+				 length, signature);
+}
+
+int encrypt_data_block(u8 *source, unsigned int length, u8 *key)
+{
+	return tegra_crypto_core(key, SECURITY_ENCRYPT, source,
+				 length, NULL);
+}
+
+int decrypt_data_block(u8 *source, unsigned int length, u8 *key)
 {
-	return encrypt_and_sign(zero_key, SECURITY_SIGN, source,
-				length, signature);
+	return tegra_crypto_core(key, SECURITY_DECRYPT, source,
+				 length, NULL);
 }
diff --git a/arch/arm/mach-tegra/crypto.h b/arch/arm/mach-tegra/crypto.h
deleted file mode 100644
index a773d03fc7..0000000000
--- a/arch/arm/mach-tegra/crypto.h
+++ /dev/null
@@ -1,19 +0,0 @@
-/* SPDX-License-Identifier: GPL-2.0+ */
-/*
- * Copyright (c) 2011 The Chromium OS Authors.
- * (C) Copyright 2010 - 2011 NVIDIA Corporation <www.nvidia.com>
- */
-
-#ifndef _CRYPTO_H_
-#define _CRYPTO_H_
-
-/**
- * Sign a block of data
- *
- * \param source	Source data
- * \param length	Size of source data
- * \param signature	Destination address for signature, AES_KEY_LENGTH bytes
- */
-int sign_data_block(u8 *source, unsigned length, u8 *signature);
-
-#endif /* #ifndef _CRYPTO_H_ */
-- 
2.37.2


^ permalink raw reply related	[flat|nested] 26+ messages in thread

* [PATCH v2 15/16] ARM: tegra30: implement BCT patching
  2023-02-02 18:13 [PATCH v2 00/16] General Tegra improvements Svyatoslav Ryhel
                   ` (13 preceding siblings ...)
  2023-02-02 18:13 ` [PATCH v2 14/16] ARM: tegra: crypto: extend crypto functional Svyatoslav Ryhel
@ 2023-02-02 18:13 ` Svyatoslav Ryhel
  2023-02-03  2:15   ` Simon Glass
  2023-02-02 18:13 ` [PATCH v2 16/16] ARM: tegra20: " Svyatoslav Ryhel
  15 siblings, 1 reply; 26+ messages in thread
From: Svyatoslav Ryhel @ 2023-02-02 18:13 UTC (permalink / raw)
  To: Tom Warren, Alban Bedel, Stephen Warren, Marcel Ziswiler,
	Allen Martin, Jagan Teki, Lukasz Majewski, Marek Vasut,
	Svyatoslav Ryhel, Ramin Khonsari, Thierry Reding, Maxim Schwalm,
	Dmitry Osipenko
  Cc: u-boot

From: Ramin Khonsari <raminterex@yahoo.com>

This function allows updating bootloader from u-boot
on production devices without need in host PC.

Be aware! It works only with re-crypted BCT.

Tested-by: Andreas Westman Dorcsak <hedmoo@yahoo.com> # ASUS TF T30
Tested-by: Svyatoslav Ryhel <clamor95@gmail.com> # LG P895 T30
Signed-off-by: Ramin Khonsari <raminterex@yahoo.com>
Signed-off-by: Svyatoslav Ryhel <clamor95@gmail.com>
---
 arch/arm/mach-tegra/Kconfig          | 10 ++++
 arch/arm/mach-tegra/tegra30/Makefile |  1 +
 arch/arm/mach-tegra/tegra30/bct.c    | 78 ++++++++++++++++++++++++++++
 arch/arm/mach-tegra/tegra30/bct.h    | 42 +++++++++++++++
 4 files changed, 131 insertions(+)
 create mode 100644 arch/arm/mach-tegra/tegra30/bct.c
 create mode 100644 arch/arm/mach-tegra/tegra30/bct.h

diff --git a/arch/arm/mach-tegra/Kconfig b/arch/arm/mach-tegra/Kconfig
index 5b0cd92d9e..922e57726f 100644
--- a/arch/arm/mach-tegra/Kconfig
+++ b/arch/arm/mach-tegra/Kconfig
@@ -229,4 +229,14 @@ config CMD_ENTERRCM
 	  for mechanical button actuators, or hooking up relays/... to the
 	  button.
 
+config CMD_EBTUPDATE
+	bool "Enable 'ebtupdate' command"
+	depends on TEGRA30
+	select TEGRA_CRYPTO
+	default n
+	help
+	  Updating u-boot from within u-boot in rather complex or even
+	  impossible on production devices. To make it easier procedure of
+	  re-cryption was created. If your device was re-crypted choose Y.
+
 endif
diff --git a/arch/arm/mach-tegra/tegra30/Makefile b/arch/arm/mach-tegra/tegra30/Makefile
index 9f170576e7..28dd486d8d 100644
--- a/arch/arm/mach-tegra/tegra30/Makefile
+++ b/arch/arm/mach-tegra/tegra30/Makefile
@@ -3,5 +3,6 @@
 # Copyright (c) 2010-2012, NVIDIA CORPORATION.  All rights reserved.
 
 obj-$(CONFIG_SPL_BUILD) += cpu.o
+obj-$(CONFIG_$(SPL_)CMD_EBTUPDATE) += bct.o
 
 obj-y	+= clock.o funcmux.o pinmux.o
diff --git a/arch/arm/mach-tegra/tegra30/bct.c b/arch/arm/mach-tegra/tegra30/bct.c
new file mode 100644
index 0000000000..c26338e263
--- /dev/null
+++ b/arch/arm/mach-tegra/tegra30/bct.c
@@ -0,0 +1,78 @@
+// SPDX-License-Identifier: GPL-2.0-or-later
+/*
+ * Copyright (c) 2022, Ramin <raminterex@yahoo.com>
+ * Copyright (c) 2022, Svyatoslav Ryhel <clamor95@gmail.com>
+ */
+
+#include <common.h>
+#include <command.h>
+#include <log.h>
+#include <asm/arch-tegra/crypto.h>
+#include "bct.h"
+#include "uboot_aes.h"
+
+/*
+ * \param bct		boot config table start in RAM
+ * \param ect		bootloader start in RAM
+ * \param ebt_size	bootloader file size in bytes
+ */
+static int bct_patch(u8 *bct, u8 *ebt, u32 ebt_size)
+{
+	struct nvboot_config_table *bct_tbl = NULL;
+	u8 ebt_hash[AES128_KEY_LENGTH] = { 0 };
+	u8 sbk[AES128_KEY_LENGTH] = { 0 };
+	u8 *bct_hash = bct;
+	int ret;
+
+	bct += BCT_HASH;
+
+	memcpy(sbk, (u8 *)(bct + BCT_LENGTH),
+	       NVBOOT_CMAC_AES_HASH_LENGTH * 4);
+
+	ret = decrypt_data_block(bct, BCT_LENGTH, sbk);
+	if (ret)
+		return 1;
+
+	ebt_size = roundup(ebt_size, EBT_ALIGNMENT);
+
+	ret = encrypt_data_block(ebt, ebt_size, sbk);
+	if (ret)
+		return 1;
+
+	ret = sign_enc_data_block(ebt, ebt_size, ebt_hash, sbk);
+	if (ret)
+		return 1;
+
+	bct_tbl = (struct nvboot_config_table *)bct;
+
+	memcpy((u8 *)&bct_tbl->bootloader[0].crypto_hash,
+	       ebt_hash, NVBOOT_CMAC_AES_HASH_LENGTH * 4);
+	bct_tbl->bootloader[0].entry_point = CONFIG_SPL_TEXT_BASE;
+	bct_tbl->bootloader[0].load_addr = CONFIG_SPL_TEXT_BASE;
+	bct_tbl->bootloader[0].length = ebt_size;
+
+	ret = encrypt_data_block(bct, BCT_LENGTH, sbk);
+	if (ret)
+		return 1;
+
+	ret = sign_enc_data_block(bct, BCT_LENGTH, bct_hash, sbk);
+	if (ret)
+		return 1;
+
+	return 0;
+}
+
+static int do_ebtupdate(struct cmd_tbl *cmdtp, int flag, int argc,
+			char *const argv[])
+{
+	u32 bct_addr = hextoul(argv[1], NULL);
+	u32 ebt_addr = hextoul(argv[2], NULL);
+	u32 ebt_size = hextoul(argv[3], NULL);
+
+	return bct_patch((u8 *)bct_addr, (u8 *)ebt_addr, ebt_size);
+}
+
+U_BOOT_CMD(ebtupdate,	4,	0,	do_ebtupdate,
+	   "update bootloader on re-crypted Tegra30 devices",
+	   ""
+);
diff --git a/arch/arm/mach-tegra/tegra30/bct.h b/arch/arm/mach-tegra/tegra30/bct.h
new file mode 100644
index 0000000000..9797384da3
--- /dev/null
+++ b/arch/arm/mach-tegra/tegra30/bct.h
@@ -0,0 +1,42 @@
+/* SPDX-License-Identifier: GPL-2.0+ */
+
+#ifndef _BCT_H_
+#define _BCT_H_
+
+/*
+ * Defines the BCT parametres for T30
+ */
+#define BCT_LENGTH		0x17E0
+#define BCT_HASH		0x10
+#define EBT_ALIGNMENT		0x10
+
+/*
+ * Defines the CMAC-AES-128 hash length in 32 bit words. (128 bits = 4 words)
+ */
+#define NVBOOT_CMAC_AES_HASH_LENGTH		4
+
+/*
+ * Defines the maximum number of bootloader descriptions in the BCT.
+ */
+#define NVBOOT_MAX_BOOTLOADERS			4
+
+struct nv_bootloader_info {
+	u32 version;
+	u32 start_blk;
+	u32 start_page;
+	u32 length;
+	u32 load_addr;
+	u32 entry_point;
+	u32 attribute;
+	u32 crypto_hash[NVBOOT_CMAC_AES_HASH_LENGTH];
+};
+
+struct nvboot_config_table {
+	u32 unused0[4];
+	u32 boot_data_version;
+	u32 unused1[972];
+	struct nv_bootloader_info bootloader[NVBOOT_MAX_BOOTLOADERS];
+	u32 unused2[508];
+};
+
+#endif /* _BCT_H_ */
-- 
2.37.2


^ permalink raw reply related	[flat|nested] 26+ messages in thread

* [PATCH v2 16/16] ARM: tegra20: implement BCT patching
  2023-02-02 18:13 [PATCH v2 00/16] General Tegra improvements Svyatoslav Ryhel
                   ` (14 preceding siblings ...)
  2023-02-02 18:13 ` [PATCH v2 15/16] ARM: tegra30: implement BCT patching Svyatoslav Ryhel
@ 2023-02-02 18:13 ` Svyatoslav Ryhel
  15 siblings, 0 replies; 26+ messages in thread
From: Svyatoslav Ryhel @ 2023-02-02 18:13 UTC (permalink / raw)
  To: Tom Warren, Alban Bedel, Stephen Warren, Marcel Ziswiler,
	Allen Martin, Jagan Teki, Lukasz Majewski, Marek Vasut,
	Svyatoslav Ryhel, Ramin Khonsari, Thierry Reding, Maxim Schwalm,
	Dmitry Osipenko
  Cc: u-boot

This function allows updating bootloader from u-boot
on production devices without need in host PC.

Be aware! It works only with re-crypt BCT.

Tested-by: Robert Eckelmann <longnoserob@gmail.com> # ASUS TF101 T20
Signed-off-by: Ramin Khonsari <raminterex@yahoo.com>
Signed-off-by: Svyatoslav Ryhel <clamor95@gmail.com>
---
 arch/arm/mach-tegra/Kconfig          |  2 +-
 arch/arm/mach-tegra/tegra20/Makefile |  5 +-
 arch/arm/mach-tegra/tegra20/bct.c    | 78 ++++++++++++++++++++++++++++
 arch/arm/mach-tegra/tegra20/bct.h    | 42 +++++++++++++++
 4 files changed, 123 insertions(+), 4 deletions(-)
 create mode 100644 arch/arm/mach-tegra/tegra20/bct.c
 create mode 100644 arch/arm/mach-tegra/tegra20/bct.h

diff --git a/arch/arm/mach-tegra/Kconfig b/arch/arm/mach-tegra/Kconfig
index 922e57726f..901235047c 100644
--- a/arch/arm/mach-tegra/Kconfig
+++ b/arch/arm/mach-tegra/Kconfig
@@ -231,7 +231,7 @@ config CMD_ENTERRCM
 
 config CMD_EBTUPDATE
 	bool "Enable 'ebtupdate' command"
-	depends on TEGRA30
+	depends on TEGRA20 || TEGRA30
 	select TEGRA_CRYPTO
 	default n
 	help
diff --git a/arch/arm/mach-tegra/tegra20/Makefile b/arch/arm/mach-tegra/tegra20/Makefile
index 67454ff5f4..991cabeec5 100644
--- a/arch/arm/mach-tegra/tegra20/Makefile
+++ b/arch/arm/mach-tegra/tegra20/Makefile
@@ -2,9 +2,8 @@
 #
 # (C) Copyright 2010,2011 Nvidia Corporation.
 
-ifdef CONFIG_SPL_BUILD
-obj-y	+= cpu.o
-endif
+obj-$(CONFIG_SPL_BUILD) += cpu.o
+obj-$(CONFIG_$(SPL_)CMD_EBTUPDATE) += bct.o
 
 # The AVP is ARMv4T architecture so we must use special compiler
 # flags for any startup files it might use.
diff --git a/arch/arm/mach-tegra/tegra20/bct.c b/arch/arm/mach-tegra/tegra20/bct.c
new file mode 100644
index 0000000000..4a7cf498dd
--- /dev/null
+++ b/arch/arm/mach-tegra/tegra20/bct.c
@@ -0,0 +1,78 @@
+// SPDX-License-Identifier: GPL-2.0-or-later
+/*
+ * Copyright (c) 2022, Ramin <raminterex@yahoo.com>
+ * Copyright (c) 2022, Svyatoslav Ryhel <clamor95@gmail.com>
+ */
+
+#include <common.h>
+#include <command.h>
+#include <log.h>
+#include <asm/arch-tegra/crypto.h>
+#include "bct.h"
+#include "uboot_aes.h"
+
+/*
+ * \param bct		boot config table start in RAM
+ * \param ect		bootloader start in RAM
+ * \param ebt_size	bootloader file size in bytes
+ */
+static int bct_patch(u8 *bct, u8 *ebt, u32 ebt_size)
+{
+	struct nvboot_config_table *bct_tbl = NULL;
+	u8 ebt_hash[AES128_KEY_LENGTH] = { 0 };
+	u8 sbk[AES128_KEY_LENGTH] = { 0 };
+	u8 *bct_hash = bct;
+	int ret;
+
+	bct += BCT_HASH;
+
+	memcpy(sbk, (u8 *)(bct + BCT_LENGTH),
+	       NVBOOT_CMAC_AES_HASH_LENGTH * 4);
+
+	ret = decrypt_data_block(bct, BCT_LENGTH, sbk);
+	if (ret)
+		return 1;
+
+	ebt_size = roundup(ebt_size, EBT_ALIGNMENT);
+
+	ret = encrypt_data_block(ebt, ebt_size, sbk);
+	if (ret)
+		return 1;
+
+	ret = sign_enc_data_block(ebt, ebt_size, ebt_hash, sbk);
+	if (ret)
+		return 1;
+
+	bct_tbl = (struct nvboot_config_table *)bct;
+
+	memcpy((u8 *)&bct_tbl->bootloader[0].crypto_hash,
+	       ebt_hash, NVBOOT_CMAC_AES_HASH_LENGTH * 4);
+	bct_tbl->bootloader[0].entry_point = CONFIG_SPL_TEXT_BASE;
+	bct_tbl->bootloader[0].load_addr = CONFIG_SPL_TEXT_BASE;
+	bct_tbl->bootloader[0].length = ebt_size;
+
+	ret = encrypt_data_block(bct, BCT_LENGTH, sbk);
+	if (ret)
+		return 1;
+
+	ret = sign_enc_data_block(bct, BCT_LENGTH, bct_hash, sbk);
+	if (ret)
+		return 1;
+
+	return 0;
+}
+
+static int do_ebtupdate(struct cmd_tbl *cmdtp, int flag, int argc,
+			char *const argv[])
+{
+	u32 bct_addr = hextoul(argv[1], NULL);
+	u32 ebt_addr = hextoul(argv[2], NULL);
+	u32 ebt_size = hextoul(argv[3], NULL);
+
+	return bct_patch((u8 *)bct_addr, (u8 *)ebt_addr, ebt_size);
+}
+
+U_BOOT_CMD(ebtupdate,	4,	0,	do_ebtupdate,
+	   "update bootloader on re-crypted Tegra20 devices",
+	   ""
+);
diff --git a/arch/arm/mach-tegra/tegra20/bct.h b/arch/arm/mach-tegra/tegra20/bct.h
new file mode 100644
index 0000000000..4b78aef7cf
--- /dev/null
+++ b/arch/arm/mach-tegra/tegra20/bct.h
@@ -0,0 +1,42 @@
+/* SPDX-License-Identifier: GPL-2.0+ */
+
+#ifndef _BCT_H_
+#define _BCT_H_
+
+/*
+ * Defines the BCT parametres for T20
+ */
+#define BCT_LENGTH		0xFE0
+#define BCT_HASH		0x10
+#define EBT_ALIGNMENT		0x10
+
+/*
+ * Defines the CMAC-AES-128 hash length in 32 bit words. (128 bits = 4 words)
+ */
+#define NVBOOT_CMAC_AES_HASH_LENGTH		4
+
+/*
+ * Defines the maximum number of bootloader descriptions in the BCT.
+ */
+#define NVBOOT_MAX_BOOTLOADERS			4
+
+struct nv_bootloader_info {
+	u32 version;
+	u32 start_blk;
+	u32 start_page;
+	u32 length;
+	u32 load_addr;
+	u32 entry_point;
+	u32 attribute;
+	u32 crypto_hash[NVBOOT_CMAC_AES_HASH_LENGTH];
+};
+
+struct nvboot_config_table {
+	u32 unused0[4];
+	u32 boot_data_version;
+	u32 unused1[668];
+	struct nv_bootloader_info bootloader[NVBOOT_MAX_BOOTLOADERS];
+	u32 unused2[508];
+};
+
+#endif /* _BCT_H_ */
-- 
2.37.2


^ permalink raw reply related	[flat|nested] 26+ messages in thread

* RE: [PATCH v2 03/16] ARM: tegra: clock: add clk_id_to_pll_id helper
  2023-02-02 18:13 ` [PATCH v2 03/16] ARM: tegra: clock: add clk_id_to_pll_id helper Svyatoslav Ryhel
@ 2023-02-02 22:05   ` Tom Warren
  2023-02-03  7:19     ` Svyatoslav Ryhel
  0 siblings, 1 reply; 26+ messages in thread
From: Tom Warren @ 2023-02-02 22:05 UTC (permalink / raw)
  To: Svyatoslav Ryhel, Thierry Reding; +Cc: u-boot

Svyatoslav,

I was able to apply all of your V2 'General Tegra' patches OK on top of current u-boot-tegra/master. But buildman (and normal make dalmore_defconfig/make) fail to build Dalmore (T114) with the following error:

  CC      arch/arm/mach-tegra/tegra114/clock.o
arch/arm/mach-tegra/tegra114/clock.c: In function 'clk_id_to_pll_id':
arch/arm/mach-tegra/tegra114/clock.c:676:7: error: 'TEGRA114_CLK_PLL_E' undeclared (first use in this function)
  case TEGRA114_CLK_PLL_E:
       ^~~~~~~~~~~~~~~~~~

PTAL.

Thanks,

Tom

-----Original Message-----
From: Svyatoslav Ryhel <clamor95@gmail.com> 
Sent: Thursday, February 2, 2023 11:14 AM
To: Tom Warren <twarren@nvidia.com>; Alban Bedel <alban.bedel@avionic-design.de>; Stephen Warren <swarren@nvidia.com>; Marcel Ziswiler <marcel.ziswiler@toradex.com>; Allen Martin <amartin@nvidia.com>; Jagan Teki <jagan@amarulasolutions.com>; Lukasz Majewski <lukma@denx.de>; Marek Vasut <marex@denx.de>; Svyatoslav Ryhel <clamor95@gmail.com>; Ramin Khonsari <raminterex@yahoo.com>; Thierry Reding <thierry.reding@gmail.com>; Maxim Schwalm <maxim.schwalm@gmail.com>; Dmitry Osipenko <digetx@gmail.com>
Cc: u-boot@lists.denx.de
Subject: [PATCH v2 03/16] ARM: tegra: clock: add clk_id_to_pll_id helper

External email: Use caution opening links or attachments


This function allows to convert a device tree clock ID to PLL ID.

Tested-by: Andreas Westman Dorcsak <hedmoo@yahoo.com> # ASUS TF T30
Tested-by: Robert Eckelmann <longnoserob@gmail.com> # ASUS TF101 T20
Tested-by: Svyatoslav Ryhel <clamor95@gmail.com> # HTC One X
Signed-off-by: Svyatoslav Ryhel <clamor95@gmail.com>
---
 arch/arm/include/asm/arch-tegra/clock.h |  8 ++++++
 arch/arm/mach-tegra/tegra114/clock.c    | 37 ++++++++++++++++++++++++
 arch/arm/mach-tegra/tegra124/clock.c    | 38 +++++++++++++++++++++++++
 arch/arm/mach-tegra/tegra20/clock.c     | 37 ++++++++++++++++++++++++
 arch/arm/mach-tegra/tegra210/clock.c    | 37 ++++++++++++++++++++++++
 arch/arm/mach-tegra/tegra30/clock.c     | 37 ++++++++++++++++++++++++
 6 files changed, 194 insertions(+)

diff --git a/arch/arm/include/asm/arch-tegra/clock.h b/arch/arm/include/asm/arch-tegra/clock.h
index 1dd5d0742c..2270501406 100644
--- a/arch/arm/include/asm/arch-tegra/clock.h
+++ b/arch/arm/include/asm/arch-tegra/clock.h
@@ -354,6 +354,14 @@ int get_periph_clock_source(enum periph_id periph_id,
  */
 enum periph_id clk_id_to_periph_id(int clk_id);

+/*
+ * Convert a device tree clock ID to our PLL ID.
+ *
+ * @param clk_id       Clock ID according to tegra device tree binding
+ * Return: clock ID, or CLOCK_ID_NONE if the clock ID is invalid  */ 
+enum clock_id clk_id_to_pll_id(int clk_id);
+
 /**
  * Set the output frequency you want for each PLL clock.
  * PLL output frequencies are programmed by setting their N, M and P values.
diff --git a/arch/arm/mach-tegra/tegra114/clock.c b/arch/arm/mach-tegra/tegra114/clock.c
index 143f86863f..c019b2d0cd 100644
--- a/arch/arm/mach-tegra/tegra114/clock.c
+++ b/arch/arm/mach-tegra/tegra114/clock.c
@@ -19,6 +19,8 @@
 #include <fdtdec.h>
 #include <linux/delay.h>

+#include <dt-bindings/clock/tegra114-car.h>
+
 /*
  * Clock types that we can use as a source. The Tegra114 has muxes for the
  * peripheral clocks, and in most cases there are four options for the clock @@ -646,6 +648,41 @@ enum periph_id clk_id_to_periph_id(int clk_id)
                return clk_id;
        }
 }
+
+/*
+ * Convert a device tree clock ID to our PLL ID.
+ *
+ * @param clk_id       Clock ID according to tegra114 device tree binding
+ * Return: clock ID, or CLOCK_ID_NONE if the clock ID is invalid  */ 
+enum clock_id clk_id_to_pll_id(int clk_id) {
+       switch (clk_id) {
+       case TEGRA114_CLK_PLL_C:
+               return CLOCK_ID_CGENERAL;
+       case TEGRA114_CLK_PLL_M:
+               return CLOCK_ID_MEMORY;
+       case TEGRA114_CLK_PLL_P:
+               return CLOCK_ID_PERIPH;
+       case TEGRA114_CLK_PLL_A:
+               return CLOCK_ID_AUDIO;
+       case TEGRA114_CLK_PLL_U:
+               return CLOCK_ID_USB;
+       case TEGRA114_CLK_PLL_D:
+       case TEGRA114_CLK_PLL_D_OUT0:
+               return CLOCK_ID_DISPLAY;
+       case TEGRA114_CLK_PLL_X:
+               return CLOCK_ID_XCPU;
+       case TEGRA114_CLK_PLL_E:
+               return CLOCK_ID_EPCI;
+       case TEGRA114_CLK_CLK_32K:
+               return CLOCK_ID_32KHZ;
+       case TEGRA114_CLK_CLK_M:
+               return CLOCK_ID_CLK_M;
+       default:
+               return CLOCK_ID_NONE;
+       }
+}
 #endif /* CONFIG_IS_ENABLED(OF_CONTROL) */

 void clock_early_init(void)
diff --git a/arch/arm/mach-tegra/tegra124/clock.c b/arch/arm/mach-tegra/tegra124/clock.c
index da38b26c27..415ba15e5d 100644
--- a/arch/arm/mach-tegra/tegra124/clock.c
+++ b/arch/arm/mach-tegra/tegra124/clock.c
@@ -19,6 +19,9 @@
 #include <fdtdec.h>
 #include <linux/delay.h>

+#include <dt-bindings/clock/tegra124-car.h>
+#include <dt-bindings/clock/tegra124-car-common.h>
+
 /*
  * Clock types that we can use as a source. The Tegra124 has muxes for the
  * peripheral clocks, and in most cases there are four options for the clock
@@ -826,6 +829,41 @@ enum periph_id clk_id_to_periph_id(int clk_id)
                return clk_id;
        }
 }
+
+/*
+ * Convert a device tree clock ID to our PLL ID.
+ *
+ * @param clk_id       Clock ID according to tegra124 device tree binding
+ * Return: clock ID, or CLOCK_ID_NONE if the clock ID is invalid
+ */
+enum clock_id clk_id_to_pll_id(int clk_id)
+{
+       switch (clk_id) {
+       case TEGRA124_CLK_PLL_C:
+               return CLOCK_ID_CGENERAL;
+       case TEGRA124_CLK_PLL_M:
+               return CLOCK_ID_MEMORY;
+       case TEGRA124_CLK_PLL_P:
+               return CLOCK_ID_PERIPH;
+       case TEGRA124_CLK_PLL_A:
+               return CLOCK_ID_AUDIO;
+       case TEGRA124_CLK_PLL_U:
+               return CLOCK_ID_USB;
+       case TEGRA124_CLK_PLL_D:
+       case TEGRA124_CLK_PLL_D_OUT0:
+               return CLOCK_ID_DISPLAY;
+       case TEGRA124_CLK_PLL_X:
+               return CLOCK_ID_XCPU;
+       case TEGRA124_CLK_PLL_E:
+               return CLOCK_ID_EPCI;
+       case TEGRA124_CLK_CLK_32K:
+               return CLOCK_ID_32KHZ;
+       case TEGRA124_CLK_CLK_M:
+               return CLOCK_ID_CLK_M;
+       default:
+               return CLOCK_ID_NONE;
+       }
+}
 #endif /* CONFIG_IS_ENABLED(OF_CONTROL) */

 void clock_early_init(void)
diff --git a/arch/arm/mach-tegra/tegra20/clock.c b/arch/arm/mach-tegra/tegra20/clock.c
index 0316073d1a..593622bfdc 100644
--- a/arch/arm/mach-tegra/tegra20/clock.c
+++ b/arch/arm/mach-tegra/tegra20/clock.c
@@ -20,6 +20,8 @@
 #include <fdtdec.h>
 #include <linux/delay.h>

+#include <dt-bindings/clock/tegra20-car.h>
+
 /*
  * Clock types that we can use as a source. The Tegra20 has muxes for the
  * peripheral clocks, and in most cases there are four options for the clock
@@ -578,6 +580,41 @@ enum periph_id clk_id_to_periph_id(int clk_id)
                return clk_id;
        }
 }
+
+/*
+ * Convert a device tree clock ID to our PLL ID.
+ *
+ * @param clk_id       Clock ID according to tegra20 device tree binding
+ * Return: clock ID, or CLOCK_ID_NONE if the clock ID is invalid
+ */
+enum clock_id clk_id_to_pll_id(int clk_id)
+{
+       switch (clk_id) {
+       case TEGRA20_CLK_PLL_C:
+               return CLOCK_ID_CGENERAL;
+       case TEGRA20_CLK_PLL_M:
+               return CLOCK_ID_MEMORY;
+       case TEGRA20_CLK_PLL_P:
+               return CLOCK_ID_PERIPH;
+       case TEGRA20_CLK_PLL_A:
+               return CLOCK_ID_AUDIO;
+       case TEGRA20_CLK_PLL_U:
+               return CLOCK_ID_USB;
+       case TEGRA20_CLK_PLL_D:
+       case TEGRA20_CLK_PLL_D_OUT0:
+               return CLOCK_ID_DISPLAY;
+       case TEGRA20_CLK_PLL_X:
+               return CLOCK_ID_XCPU;
+       case TEGRA20_CLK_PLL_E:
+               return CLOCK_ID_EPCI;
+       case TEGRA20_CLK_CLK_32K:
+               return CLOCK_ID_32KHZ;
+       case TEGRA20_CLK_CLK_M:
+               return CLOCK_ID_CLK_M;
+       default:
+               return CLOCK_ID_NONE;
+       }
+}
 #endif /* CONFIG_IS_ENABLED(OF_CONTROL) */

 void clock_early_init(void)
diff --git a/arch/arm/mach-tegra/tegra210/clock.c b/arch/arm/mach-tegra/tegra210/clock.c
index 330753f2ad..76fbfef580 100644
--- a/arch/arm/mach-tegra/tegra210/clock.c
+++ b/arch/arm/mach-tegra/tegra210/clock.c
@@ -22,6 +22,8 @@
 #include <linux/bitops.h>
 #include <linux/delay.h>

+#include <dt-bindings/clock/tegra210-car.h>
+
 /*
  * Clock types that we can use as a source. The Tegra210 has muxes for the
  * peripheral clocks, and in most cases there are four options for the clock
@@ -914,6 +916,41 @@ enum periph_id clk_id_to_periph_id(int clk_id)
                return clk_id;
        }
 }
+
+/*
+ * Convert a device tree clock ID to our PLL ID.
+ *
+ * @param clk_id       Clock ID according to tegra210 device tree binding
+ * Return: clock ID, or CLOCK_ID_NONE if the clock ID is invalid
+ */
+enum clock_id clk_id_to_pll_id(int clk_id)
+{
+       switch (clk_id) {
+       case TEGRA210_CLK_PLL_C:
+               return CLOCK_ID_CGENERAL;
+       case TEGRA210_CLK_PLL_M:
+               return CLOCK_ID_MEMORY;
+       case TEGRA210_CLK_PLL_P:
+               return CLOCK_ID_PERIPH;
+       case TEGRA210_CLK_PLL_A:
+               return CLOCK_ID_AUDIO;
+       case TEGRA210_CLK_PLL_U:
+               return CLOCK_ID_USB;
+       case TEGRA210_CLK_PLL_D:
+       case TEGRA210_CLK_PLL_D_OUT0:
+               return CLOCK_ID_DISPLAY;
+       case TEGRA210_CLK_PLL_X:
+               return CLOCK_ID_XCPU;
+       case TEGRA210_CLK_PLL_E:
+               return CLOCK_ID_EPCI;
+       case TEGRA210_CLK_CLK_32K:
+               return CLOCK_ID_32KHZ;
+       case TEGRA210_CLK_CLK_M:
+               return CLOCK_ID_CLK_M;
+       default:
+               return CLOCK_ID_NONE;
+       }
+}
 #endif /* CONFIG_OF_CONTROL */

 /*
diff --git a/arch/arm/mach-tegra/tegra30/clock.c b/arch/arm/mach-tegra/tegra30/clock.c
index e5c2fd542c..dcdd0d0978 100644
--- a/arch/arm/mach-tegra/tegra30/clock.c
+++ b/arch/arm/mach-tegra/tegra30/clock.c
@@ -19,6 +19,8 @@
 #include <fdtdec.h>
 #include <linux/delay.h>

+#include <dt-bindings/clock/tegra30-car.h>
+
 /*
  * Clock types that we can use as a source. The Tegra30 has muxes for the
  * peripheral clocks, and in most cases there are four options for the clock
@@ -628,6 +630,41 @@ enum periph_id clk_id_to_periph_id(int clk_id)
                return clk_id;
        }
 }
+
+/*
+ * Convert a device tree clock ID to our PLL ID.
+ *
+ * @param clk_id       Clock ID according to tegra30 device tree binding
+ * Return: clock ID, or CLOCK_ID_NONE if the clock ID is invalid
+ */
+enum clock_id clk_id_to_pll_id(int clk_id)
+{
+       switch (clk_id) {
+       case TEGRA30_CLK_PLL_C:
+               return CLOCK_ID_CGENERAL;
+       case TEGRA30_CLK_PLL_M:
+               return CLOCK_ID_MEMORY;
+       case TEGRA30_CLK_PLL_P:
+               return CLOCK_ID_PERIPH;
+       case TEGRA30_CLK_PLL_A:
+               return CLOCK_ID_AUDIO;
+       case TEGRA30_CLK_PLL_U:
+               return CLOCK_ID_USB;
+       case TEGRA30_CLK_PLL_D:
+       case TEGRA30_CLK_PLL_D_OUT0:
+               return CLOCK_ID_DISPLAY;
+       case TEGRA30_CLK_PLL_X:
+               return CLOCK_ID_XCPU;
+       case TEGRA30_CLK_PLL_E:
+               return CLOCK_ID_EPCI;
+       case TEGRA30_CLK_CLK_32K:
+               return CLOCK_ID_32KHZ;
+       case TEGRA30_CLK_CLK_M:
+               return CLOCK_ID_CLK_M;
+       default:
+               return CLOCK_ID_NONE;
+       }
+}
 #endif /* CONFIG_IS_ENABLED(OF_CONTROL) */

 void clock_early_init(void)
--
2.37.2


^ permalink raw reply related	[flat|nested] 26+ messages in thread

* Re: [PATCH v2 01/16] tegra30: clock: add EXTPERIPH
  2023-02-02 18:13 ` [PATCH v2 01/16] tegra30: clock: add EXTPERIPH Svyatoslav Ryhel
@ 2023-02-03  2:15   ` Simon Glass
  0 siblings, 0 replies; 26+ messages in thread
From: Simon Glass @ 2023-02-03  2:15 UTC (permalink / raw)
  To: Svyatoslav Ryhel
  Cc: Tom Warren, Alban Bedel, Stephen Warren, Marcel Ziswiler,
	Allen Martin, Jagan Teki, Lukasz Majewski, Marek Vasut,
	Ramin Khonsari, Thierry Reding, Maxim Schwalm, Dmitry Osipenko,
	u-boot

On Thu, 2 Feb 2023 at 11:14, Svyatoslav Ryhel <clamor95@gmail.com> wrote:
>
> This mappings were missing for some reason.
>
> Tested-by: Svyatoslav Ryhel <clamor95@gmail.com> # LG P895 T30
> Signed-off-by: Svyatoslav Ryhel <clamor95@gmail.com>
> ---
>  arch/arm/include/asm/arch-tegra30/clock-tables.h | 6 +++---
>  arch/arm/mach-tegra/tegra30/clock.c              | 6 +++---
>  2 files changed, 6 insertions(+), 6 deletions(-)

Reviewed-by: Simon Glass <sjg@chromium.org>

^ permalink raw reply	[flat|nested] 26+ messages in thread

* Re: [PATCH v2 11/16] board: tegra124: switch to updated pre-dm i2c write
  2023-02-02 18:13 ` [PATCH v2 11/16] board: tegra124: switch to updated " Svyatoslav Ryhel
@ 2023-02-03  2:15   ` Simon Glass
  0 siblings, 0 replies; 26+ messages in thread
From: Simon Glass @ 2023-02-03  2:15 UTC (permalink / raw)
  To: Svyatoslav Ryhel
  Cc: Tom Warren, Alban Bedel, Stephen Warren, Marcel Ziswiler,
	Allen Martin, Jagan Teki, Lukasz Majewski, Marek Vasut,
	Ramin Khonsari, Thierry Reding, Maxim Schwalm, Dmitry Osipenko,
	u-boot

On Thu, 2 Feb 2023 at 11:17, Svyatoslav Ryhel <clamor95@gmail.com> wrote:
>
> Configure PMIC for early stages using updated i2c write.
>
> Signed-off-by: Svyatoslav Ryhel <clamor95@gmail.com>
> ---
>  board/nvidia/venice2/as3722_init.c     | 65 ++++++++++++--------
>  board/nvidia/venice2/as3722_init.h     | 43 -------------
>  board/toradex/apalis-tk1/as3722_init.c | 85 ++++++++++++++------------
>  board/toradex/apalis-tk1/as3722_init.h | 40 ------------
>  4 files changed, 88 insertions(+), 145 deletions(-)
>  delete mode 100644 board/nvidia/venice2/as3722_init.h
>  delete mode 100644 board/toradex/apalis-tk1/as3722_init.h
>

Reviewed-by: Simon Glass <sjg@chromium.org>

^ permalink raw reply	[flat|nested] 26+ messages in thread

* Re: [PATCH v2 15/16] ARM: tegra30: implement BCT patching
  2023-02-02 18:13 ` [PATCH v2 15/16] ARM: tegra30: implement BCT patching Svyatoslav Ryhel
@ 2023-02-03  2:15   ` Simon Glass
  2023-02-03  7:27     ` Svyatoslav Ryhel
  0 siblings, 1 reply; 26+ messages in thread
From: Simon Glass @ 2023-02-03  2:15 UTC (permalink / raw)
  To: Svyatoslav Ryhel
  Cc: Tom Warren, Alban Bedel, Stephen Warren, Marcel Ziswiler,
	Allen Martin, Jagan Teki, Lukasz Majewski, Marek Vasut,
	Ramin Khonsari, Thierry Reding, Maxim Schwalm, Dmitry Osipenko,
	u-boot

Hi Svyatoslav,

On Thu, 2 Feb 2023 at 11:23, Svyatoslav Ryhel <clamor95@gmail.com> wrote:
>
> From: Ramin Khonsari <raminterex@yahoo.com>
>
> This function allows updating bootloader from u-boot
> on production devices without need in host PC.
>
> Be aware! It works only with re-crypted BCT.
>
> Tested-by: Andreas Westman Dorcsak <hedmoo@yahoo.com> # ASUS TF T30
> Tested-by: Svyatoslav Ryhel <clamor95@gmail.com> # LG P895 T30
> Signed-off-by: Ramin Khonsari <raminterex@yahoo.com>
> Signed-off-by: Svyatoslav Ryhel <clamor95@gmail.com>
> ---
>  arch/arm/mach-tegra/Kconfig          | 10 ++++
>  arch/arm/mach-tegra/tegra30/Makefile |  1 +
>  arch/arm/mach-tegra/tegra30/bct.c    | 78 ++++++++++++++++++++++++++++
>  arch/arm/mach-tegra/tegra30/bct.h    | 42 +++++++++++++++
>  4 files changed, 131 insertions(+)
>  create mode 100644 arch/arm/mach-tegra/tegra30/bct.c
>  create mode 100644 arch/arm/mach-tegra/tegra30/bct.h

Please add something to doc/ about this.

>
> diff --git a/arch/arm/mach-tegra/Kconfig b/arch/arm/mach-tegra/Kconfig
> index 5b0cd92d9e..922e57726f 100644
> --- a/arch/arm/mach-tegra/Kconfig
> +++ b/arch/arm/mach-tegra/Kconfig
> @@ -229,4 +229,14 @@ config CMD_ENTERRCM
>           for mechanical button actuators, or hooking up relays/... to the
>           button.
>
> +config CMD_EBTUPDATE
> +       bool "Enable 'ebtupdate' command"
> +       depends on TEGRA30
> +       select TEGRA_CRYPTO
> +       default n

That is always the default so you can drop this line

> +       help
> +         Updating u-boot from within u-boot in rather complex or even
> +         impossible on production devices. To make it easier procedure of
> +         re-cryption was created. If your device was re-crypted choose Y.
> +
>  endif
> diff --git a/arch/arm/mach-tegra/tegra30/Makefile b/arch/arm/mach-tegra/tegra30/Makefile
> index 9f170576e7..28dd486d8d 100644
> --- a/arch/arm/mach-tegra/tegra30/Makefile
> +++ b/arch/arm/mach-tegra/tegra30/Makefile
> @@ -3,5 +3,6 @@
>  # Copyright (c) 2010-2012, NVIDIA CORPORATION.  All rights reserved.
>
>  obj-$(CONFIG_SPL_BUILD) += cpu.o
> +obj-$(CONFIG_$(SPL_)CMD_EBTUPDATE) += bct.o
>
>  obj-y  += clock.o funcmux.o pinmux.o
> diff --git a/arch/arm/mach-tegra/tegra30/bct.c b/arch/arm/mach-tegra/tegra30/bct.c
> new file mode 100644
> index 0000000000..c26338e263
> --- /dev/null
> +++ b/arch/arm/mach-tegra/tegra30/bct.c
> @@ -0,0 +1,78 @@
> +// SPDX-License-Identifier: GPL-2.0-or-later
> +/*
> + * Copyright (c) 2022, Ramin <raminterex@yahoo.com>
> + * Copyright (c) 2022, Svyatoslav Ryhel <clamor95@gmail.com>
> + */
> +
> +#include <common.h>
> +#include <command.h>
> +#include <log.h>
> +#include <asm/arch-tegra/crypto.h>
> +#include "bct.h"
> +#include "uboot_aes.h"
> +
> +/*
> + * \param bct          boot config table start in RAM
> + * \param ect          bootloader start in RAM
> + * \param ebt_size     bootloader file size in bytes

Returns ?

> + */
> +static int bct_patch(u8 *bct, u8 *ebt, u32 ebt_size)
> +{
> +       struct nvboot_config_table *bct_tbl = NULL;
> +       u8 ebt_hash[AES128_KEY_LENGTH] = { 0 };
> +       u8 sbk[AES128_KEY_LENGTH] = { 0 };
> +       u8 *bct_hash = bct;
> +       int ret;
> +
> +       bct += BCT_HASH;
> +
> +       memcpy(sbk, (u8 *)(bct + BCT_LENGTH),
> +              NVBOOT_CMAC_AES_HASH_LENGTH * 4);
> +
> +       ret = decrypt_data_block(bct, BCT_LENGTH, sbk);
> +       if (ret)
> +               return 1;
> +
> +       ebt_size = roundup(ebt_size, EBT_ALIGNMENT);
> +
> +       ret = encrypt_data_block(ebt, ebt_size, sbk);
> +       if (ret)
> +               return 1;
> +
> +       ret = sign_enc_data_block(ebt, ebt_size, ebt_hash, sbk);
> +       if (ret)
> +               return 1;
> +
> +       bct_tbl = (struct nvboot_config_table *)bct;
> +
> +       memcpy((u8 *)&bct_tbl->bootloader[0].crypto_hash,
> +              ebt_hash, NVBOOT_CMAC_AES_HASH_LENGTH * 4);
> +       bct_tbl->bootloader[0].entry_point = CONFIG_SPL_TEXT_BASE;
> +       bct_tbl->bootloader[0].load_addr = CONFIG_SPL_TEXT_BASE;
> +       bct_tbl->bootloader[0].length = ebt_size;
> +
> +       ret = encrypt_data_block(bct, BCT_LENGTH, sbk);
> +       if (ret)
> +               return 1;
> +
> +       ret = sign_enc_data_block(bct, BCT_LENGTH, bct_hash, sbk);
> +       if (ret)
> +               return 1;
> +
> +       return 0;
> +}
> +
> +static int do_ebtupdate(struct cmd_tbl *cmdtp, int flag, int argc,
> +                       char *const argv[])
> +{
> +       u32 bct_addr = hextoul(argv[1], NULL);
> +       u32 ebt_addr = hextoul(argv[2], NULL);
> +       u32 ebt_size = hextoul(argv[3], NULL);
> +
> +       return bct_patch((u8 *)bct_addr, (u8 *)ebt_addr, ebt_size);
> +}
> +
> +U_BOOT_CMD(ebtupdate,  4,      0,      do_ebtupdate,
> +          "update bootloader on re-crypted Tegra30 devices",
> +          ""

Please add doc/usage/cmd file

> +);
> diff --git a/arch/arm/mach-tegra/tegra30/bct.h b/arch/arm/mach-tegra/tegra30/bct.h
> new file mode 100644
> index 0000000000..9797384da3
> --- /dev/null
> +++ b/arch/arm/mach-tegra/tegra30/bct.h
> @@ -0,0 +1,42 @@
> +/* SPDX-License-Identifier: GPL-2.0+ */
> +
> +#ifndef _BCT_H_
> +#define _BCT_H_
> +
> +/*
> + * Defines the BCT parametres for T30
> + */
> +#define BCT_LENGTH             0x17E0
> +#define BCT_HASH               0x10
> +#define EBT_ALIGNMENT          0x10
> +
> +/*
> + * Defines the CMAC-AES-128 hash length in 32 bit words. (128 bits = 4 words)
> + */
> +#define NVBOOT_CMAC_AES_HASH_LENGTH            4
> +
> +/*
> + * Defines the maximum number of bootloader descriptions in the BCT.
> + */
> +#define NVBOOT_MAX_BOOTLOADERS                 4
> +
> +struct nv_bootloader_info {
> +       u32 version;
> +       u32 start_blk;
> +       u32 start_page;
> +       u32 length;
> +       u32 load_addr;
> +       u32 entry_point;
> +       u32 attribute;
> +       u32 crypto_hash[NVBOOT_CMAC_AES_HASH_LENGTH];
> +};
> +
> +struct nvboot_config_table {
> +       u32 unused0[4];
> +       u32 boot_data_version;
> +       u32 unused1[972];
> +       struct nv_bootloader_info bootloader[NVBOOT_MAX_BOOTLOADERS];
> +       u32 unused2[508];
> +};
> +
> +#endif /* _BCT_H_ */
> --
> 2.37.2
>

Regards,
Simon

^ permalink raw reply	[flat|nested] 26+ messages in thread

* Re: [PATCH v2 12/16] board: tegra30: switch to updated pre-dm i2c write
  2023-02-02 18:13 ` [PATCH v2 12/16] board: tegra30: " Svyatoslav Ryhel
@ 2023-02-03  2:15   ` Simon Glass
  0 siblings, 0 replies; 26+ messages in thread
From: Simon Glass @ 2023-02-03  2:15 UTC (permalink / raw)
  To: Svyatoslav Ryhel
  Cc: Tom Warren, Alban Bedel, Stephen Warren, Marcel Ziswiler,
	Allen Martin, Jagan Teki, Lukasz Majewski, Marek Vasut,
	Ramin Khonsari, Thierry Reding, Maxim Schwalm, Dmitry Osipenko,
	u-boot

On Thu, 2 Feb 2023 at 11:28, Svyatoslav Ryhel <clamor95@gmail.com> wrote:
>
> Configure PMIC voltages for early stages using updated
> early i2c write.
>
> Signed-off-by: Svyatoslav Ryhel <clamor95@gmail.com>
> ---
>  arch/arm/mach-tegra/tegra30/Kconfig         |  8 ----
>  arch/arm/mach-tegra/tegra30/cpu.c           | 36 -----------------
>  board/avionic-design/tec-ng/Makefile        |  4 +-
>  board/avionic-design/tec-ng/tec-ng-spl.c    | 34 ++++++++++++++++
>  board/nvidia/beaver/Makefile                |  2 +
>  board/nvidia/beaver/beaver-spl.c            | 43 +++++++++++++++++++++
>  board/nvidia/cardhu/Makefile                |  4 +-
>  board/nvidia/cardhu/cardhu-spl.c            | 43 +++++++++++++++++++++
>  board/toradex/apalis_t30/Makefile           |  2 +
>  board/toradex/apalis_t30/apalis_t30-spl.c   | 34 ++++++++++++++++
>  board/toradex/colibri_t30/Makefile          |  2 +
>  board/toradex/colibri_t30/colibri_t30-spl.c | 34 ++++++++++++++++
>  12 files changed, 200 insertions(+), 46 deletions(-)
>  create mode 100644 board/avionic-design/tec-ng/tec-ng-spl.c
>  create mode 100644 board/nvidia/beaver/beaver-spl.c
>  create mode 100644 board/nvidia/cardhu/cardhu-spl.c
>  create mode 100644 board/toradex/apalis_t30/apalis_t30-spl.c
>  create mode 100644 board/toradex/colibri_t30/colibri_t30-spl.c
>

Reviewed-by: Simon Glass <sjg@chromium.org>

^ permalink raw reply	[flat|nested] 26+ messages in thread

* Re: [PATCH v2 10/16] ARM: tegra: create common pre-dm i2c write
  2023-02-02 18:13 ` [PATCH v2 10/16] ARM: tegra: create common pre-dm i2c write Svyatoslav Ryhel
@ 2023-02-03  2:15   ` Simon Glass
  2023-02-03  7:15     ` Svyatoslav Ryhel
  0 siblings, 1 reply; 26+ messages in thread
From: Simon Glass @ 2023-02-03  2:15 UTC (permalink / raw)
  To: Svyatoslav Ryhel
  Cc: Tom Warren, Alban Bedel, Stephen Warren, Marcel Ziswiler,
	Allen Martin, Jagan Teki, Lukasz Majewski, Marek Vasut,
	Ramin Khonsari, Thierry Reding, Maxim Schwalm, Dmitry Osipenko,
	u-boot

Hi Svyatoslav,

On Thu, 2 Feb 2023 at 11:43, Svyatoslav Ryhel <clamor95@gmail.com> wrote:
>
> This implementation allows pwr i2c writing on early
> stages when DM was not yet setup.

s/was/is/ ?

>
> Such writing is needed to configure main voltages of PMIC.

Is this in SPL?

>
> Tested-by: Andreas Westman Dorcsak <hedmoo@yahoo.com> # ASUS TF T30
> Tested-by: Robert Eckelmann <longnoserob@gmail.com> # ASUS TF101 T20
> Tested-by: Svyatoslav Ryhel <clamor95@gmail.com> # LG P895 T30
> Signed-off-by: Svyatoslav Ryhel <clamor95@gmail.com>
> ---
>  arch/arm/include/asm/arch-tegra/tegra_i2c.h | 17 ++++++++++
>  arch/arm/mach-tegra/cpu.h                   |  1 -
>  arch/arm/mach-tegra/tegra124/cpu.c          |  4 +++
>  arch/arm/mach-tegra/tegra30/cpu.c           | 37 +++++++--------------
>  4 files changed, 33 insertions(+), 26 deletions(-)

Regards,
Simon

^ permalink raw reply	[flat|nested] 26+ messages in thread

* Re: [PATCH v2 10/16] ARM: tegra: create common pre-dm i2c write
  2023-02-03  2:15   ` Simon Glass
@ 2023-02-03  7:15     ` Svyatoslav Ryhel
  0 siblings, 0 replies; 26+ messages in thread
From: Svyatoslav Ryhel @ 2023-02-03  7:15 UTC (permalink / raw)
  To: Simon Glass
  Cc: Tom Warren, Alban Bedel, Stephen Warren, Marcel Ziswiler,
	Allen Martin, Jagan Teki, Lukasz Majewski, Marek Vasut,
	Ramin Khonsari, Thierry Reding, Maxim Schwalm, Dmitry Osipenko,
	u-boot

пт, 3 лют. 2023 р. о 04:16 Simon Glass <sjg@chromium.org> пише:
>
> Hi Svyatoslav,
>
> On Thu, 2 Feb 2023 at 11:43, Svyatoslav Ryhel <clamor95@gmail.com> wrote:
> >
> > This implementation allows pwr i2c writing on early
> > stages when DM was not yet setup.
>
> s/was/is/ ?

Greetings!

is

>
> >
> > Such writing is needed to configure main voltages of PMIC.
>
> Is this in SPL?

Yes, this is an early SPL stage, when i2c DM is not yet set, and
u-boot to be able to boot itself has to set PMIC core and cpu
voltages. This is the case for T30 and T124, though it may not be
exclusive

Best regards,
Svyatoslav R.

>
> >
> > Tested-by: Andreas Westman Dorcsak <hedmoo@yahoo.com> # ASUS TF T30
> > Tested-by: Robert Eckelmann <longnoserob@gmail.com> # ASUS TF101 T20
> > Tested-by: Svyatoslav Ryhel <clamor95@gmail.com> # LG P895 T30
> > Signed-off-by: Svyatoslav Ryhel <clamor95@gmail.com>
> > ---
> >  arch/arm/include/asm/arch-tegra/tegra_i2c.h | 17 ++++++++++
> >  arch/arm/mach-tegra/cpu.h                   |  1 -
> >  arch/arm/mach-tegra/tegra124/cpu.c          |  4 +++
> >  arch/arm/mach-tegra/tegra30/cpu.c           | 37 +++++++--------------
> >  4 files changed, 33 insertions(+), 26 deletions(-)
>
> Regards,
> Simon

^ permalink raw reply	[flat|nested] 26+ messages in thread

* Re: [PATCH v2 03/16] ARM: tegra: clock: add clk_id_to_pll_id helper
  2023-02-02 22:05   ` Tom Warren
@ 2023-02-03  7:19     ` Svyatoslav Ryhel
  0 siblings, 0 replies; 26+ messages in thread
From: Svyatoslav Ryhel @ 2023-02-03  7:19 UTC (permalink / raw)
  To: Tom Warren; +Cc: Thierry Reding, u-boot

пт, 3 лют. 2023 р. о 00:05 Tom Warren <TWarren@nvidia.com> пише:
>
> Svyatoslav,
>
> I was able to apply all of your V2 'General Tegra' patches OK on top of current u-boot-tegra/master. But buildman (and normal make dalmore_defconfig/make) fail to build Dalmore (T114) with the following error:
>
>   CC      arch/arm/mach-tegra/tegra114/clock.o
> arch/arm/mach-tegra/tegra114/clock.c: In function 'clk_id_to_pll_id':
> arch/arm/mach-tegra/tegra114/clock.c:676:7: error: 'TEGRA114_CLK_PLL_E' undeclared (first use in this function)
>   case TEGRA114_CLK_PLL_E:
>        ^~~~~~~~~~~~~~~~~~

Greetings!
This is quite an interesting situation. T114 has no TEGRA114_CLK_PLL_E
but it has TEGRA114_CLK_PLL_E_OUT0 directly.
I will fix this in v3

On other generations the patchset should be still testable.
Thanks.

Best regards
Svyatoslav R.

> PTAL.
>
> Thanks,
>
> Tom
>
> -----Original Message-----
> From: Svyatoslav Ryhel <clamor95@gmail.com>
> Sent: Thursday, February 2, 2023 11:14 AM
> To: Tom Warren <twarren@nvidia.com>; Alban Bedel <alban.bedel@avionic-design.de>; Stephen Warren <swarren@nvidia.com>; Marcel Ziswiler <marcel.ziswiler@toradex.com>; Allen Martin <amartin@nvidia.com>; Jagan Teki <jagan@amarulasolutions.com>; Lukasz Majewski <lukma@denx.de>; Marek Vasut <marex@denx.de>; Svyatoslav Ryhel <clamor95@gmail.com>; Ramin Khonsari <raminterex@yahoo.com>; Thierry Reding <thierry.reding@gmail.com>; Maxim Schwalm <maxim.schwalm@gmail.com>; Dmitry Osipenko <digetx@gmail.com>
> Cc: u-boot@lists.denx.de
> Subject: [PATCH v2 03/16] ARM: tegra: clock: add clk_id_to_pll_id helper
>
> External email: Use caution opening links or attachments
>
>
> This function allows to convert a device tree clock ID to PLL ID.
>
> Tested-by: Andreas Westman Dorcsak <hedmoo@yahoo.com> # ASUS TF T30
> Tested-by: Robert Eckelmann <longnoserob@gmail.com> # ASUS TF101 T20
> Tested-by: Svyatoslav Ryhel <clamor95@gmail.com> # HTC One X
> Signed-off-by: Svyatoslav Ryhel <clamor95@gmail.com>
> ---
>  arch/arm/include/asm/arch-tegra/clock.h |  8 ++++++
>  arch/arm/mach-tegra/tegra114/clock.c    | 37 ++++++++++++++++++++++++
>  arch/arm/mach-tegra/tegra124/clock.c    | 38 +++++++++++++++++++++++++
>  arch/arm/mach-tegra/tegra20/clock.c     | 37 ++++++++++++++++++++++++
>  arch/arm/mach-tegra/tegra210/clock.c    | 37 ++++++++++++++++++++++++
>  arch/arm/mach-tegra/tegra30/clock.c     | 37 ++++++++++++++++++++++++
>  6 files changed, 194 insertions(+)
>
> diff --git a/arch/arm/include/asm/arch-tegra/clock.h b/arch/arm/include/asm/arch-tegra/clock.h
> index 1dd5d0742c..2270501406 100644
> --- a/arch/arm/include/asm/arch-tegra/clock.h
> +++ b/arch/arm/include/asm/arch-tegra/clock.h
> @@ -354,6 +354,14 @@ int get_periph_clock_source(enum periph_id periph_id,
>   */
>  enum periph_id clk_id_to_periph_id(int clk_id);
>
> +/*
> + * Convert a device tree clock ID to our PLL ID.
> + *
> + * @param clk_id       Clock ID according to tegra device tree binding
> + * Return: clock ID, or CLOCK_ID_NONE if the clock ID is invalid  */
> +enum clock_id clk_id_to_pll_id(int clk_id);
> +
>  /**
>   * Set the output frequency you want for each PLL clock.
>   * PLL output frequencies are programmed by setting their N, M and P values.
> diff --git a/arch/arm/mach-tegra/tegra114/clock.c b/arch/arm/mach-tegra/tegra114/clock.c
> index 143f86863f..c019b2d0cd 100644
> --- a/arch/arm/mach-tegra/tegra114/clock.c
> +++ b/arch/arm/mach-tegra/tegra114/clock.c
> @@ -19,6 +19,8 @@
>  #include <fdtdec.h>
>  #include <linux/delay.h>
>
> +#include <dt-bindings/clock/tegra114-car.h>
> +
>  /*
>   * Clock types that we can use as a source. The Tegra114 has muxes for the
>   * peripheral clocks, and in most cases there are four options for the clock @@ -646,6 +648,41 @@ enum periph_id clk_id_to_periph_id(int clk_id)
>                 return clk_id;
>         }
>  }
> +
> +/*
> + * Convert a device tree clock ID to our PLL ID.
> + *
> + * @param clk_id       Clock ID according to tegra114 device tree binding
> + * Return: clock ID, or CLOCK_ID_NONE if the clock ID is invalid  */
> +enum clock_id clk_id_to_pll_id(int clk_id) {
> +       switch (clk_id) {
> +       case TEGRA114_CLK_PLL_C:
> +               return CLOCK_ID_CGENERAL;
> +       case TEGRA114_CLK_PLL_M:
> +               return CLOCK_ID_MEMORY;
> +       case TEGRA114_CLK_PLL_P:
> +               return CLOCK_ID_PERIPH;
> +       case TEGRA114_CLK_PLL_A:
> +               return CLOCK_ID_AUDIO;
> +       case TEGRA114_CLK_PLL_U:
> +               return CLOCK_ID_USB;
> +       case TEGRA114_CLK_PLL_D:
> +       case TEGRA114_CLK_PLL_D_OUT0:
> +               return CLOCK_ID_DISPLAY;
> +       case TEGRA114_CLK_PLL_X:
> +               return CLOCK_ID_XCPU;
> +       case TEGRA114_CLK_PLL_E:
> +               return CLOCK_ID_EPCI;
> +       case TEGRA114_CLK_CLK_32K:
> +               return CLOCK_ID_32KHZ;
> +       case TEGRA114_CLK_CLK_M:
> +               return CLOCK_ID_CLK_M;
> +       default:
> +               return CLOCK_ID_NONE;
> +       }
> +}
>  #endif /* CONFIG_IS_ENABLED(OF_CONTROL) */
>
>  void clock_early_init(void)
> diff --git a/arch/arm/mach-tegra/tegra124/clock.c b/arch/arm/mach-tegra/tegra124/clock.c
> index da38b26c27..415ba15e5d 100644
> --- a/arch/arm/mach-tegra/tegra124/clock.c
> +++ b/arch/arm/mach-tegra/tegra124/clock.c
> @@ -19,6 +19,9 @@
>  #include <fdtdec.h>
>  #include <linux/delay.h>
>
> +#include <dt-bindings/clock/tegra124-car.h>
> +#include <dt-bindings/clock/tegra124-car-common.h>
> +
>  /*
>   * Clock types that we can use as a source. The Tegra124 has muxes for the
>   * peripheral clocks, and in most cases there are four options for the clock
> @@ -826,6 +829,41 @@ enum periph_id clk_id_to_periph_id(int clk_id)
>                 return clk_id;
>         }
>  }
> +
> +/*
> + * Convert a device tree clock ID to our PLL ID.
> + *
> + * @param clk_id       Clock ID according to tegra124 device tree binding
> + * Return: clock ID, or CLOCK_ID_NONE if the clock ID is invalid
> + */
> +enum clock_id clk_id_to_pll_id(int clk_id)
> +{
> +       switch (clk_id) {
> +       case TEGRA124_CLK_PLL_C:
> +               return CLOCK_ID_CGENERAL;
> +       case TEGRA124_CLK_PLL_M:
> +               return CLOCK_ID_MEMORY;
> +       case TEGRA124_CLK_PLL_P:
> +               return CLOCK_ID_PERIPH;
> +       case TEGRA124_CLK_PLL_A:
> +               return CLOCK_ID_AUDIO;
> +       case TEGRA124_CLK_PLL_U:
> +               return CLOCK_ID_USB;
> +       case TEGRA124_CLK_PLL_D:
> +       case TEGRA124_CLK_PLL_D_OUT0:
> +               return CLOCK_ID_DISPLAY;
> +       case TEGRA124_CLK_PLL_X:
> +               return CLOCK_ID_XCPU;
> +       case TEGRA124_CLK_PLL_E:
> +               return CLOCK_ID_EPCI;
> +       case TEGRA124_CLK_CLK_32K:
> +               return CLOCK_ID_32KHZ;
> +       case TEGRA124_CLK_CLK_M:
> +               return CLOCK_ID_CLK_M;
> +       default:
> +               return CLOCK_ID_NONE;
> +       }
> +}
>  #endif /* CONFIG_IS_ENABLED(OF_CONTROL) */
>
>  void clock_early_init(void)
> diff --git a/arch/arm/mach-tegra/tegra20/clock.c b/arch/arm/mach-tegra/tegra20/clock.c
> index 0316073d1a..593622bfdc 100644
> --- a/arch/arm/mach-tegra/tegra20/clock.c
> +++ b/arch/arm/mach-tegra/tegra20/clock.c
> @@ -20,6 +20,8 @@
>  #include <fdtdec.h>
>  #include <linux/delay.h>
>
> +#include <dt-bindings/clock/tegra20-car.h>
> +
>  /*
>   * Clock types that we can use as a source. The Tegra20 has muxes for the
>   * peripheral clocks, and in most cases there are four options for the clock
> @@ -578,6 +580,41 @@ enum periph_id clk_id_to_periph_id(int clk_id)
>                 return clk_id;
>         }
>  }
> +
> +/*
> + * Convert a device tree clock ID to our PLL ID.
> + *
> + * @param clk_id       Clock ID according to tegra20 device tree binding
> + * Return: clock ID, or CLOCK_ID_NONE if the clock ID is invalid
> + */
> +enum clock_id clk_id_to_pll_id(int clk_id)
> +{
> +       switch (clk_id) {
> +       case TEGRA20_CLK_PLL_C:
> +               return CLOCK_ID_CGENERAL;
> +       case TEGRA20_CLK_PLL_M:
> +               return CLOCK_ID_MEMORY;
> +       case TEGRA20_CLK_PLL_P:
> +               return CLOCK_ID_PERIPH;
> +       case TEGRA20_CLK_PLL_A:
> +               return CLOCK_ID_AUDIO;
> +       case TEGRA20_CLK_PLL_U:
> +               return CLOCK_ID_USB;
> +       case TEGRA20_CLK_PLL_D:
> +       case TEGRA20_CLK_PLL_D_OUT0:
> +               return CLOCK_ID_DISPLAY;
> +       case TEGRA20_CLK_PLL_X:
> +               return CLOCK_ID_XCPU;
> +       case TEGRA20_CLK_PLL_E:
> +               return CLOCK_ID_EPCI;
> +       case TEGRA20_CLK_CLK_32K:
> +               return CLOCK_ID_32KHZ;
> +       case TEGRA20_CLK_CLK_M:
> +               return CLOCK_ID_CLK_M;
> +       default:
> +               return CLOCK_ID_NONE;
> +       }
> +}
>  #endif /* CONFIG_IS_ENABLED(OF_CONTROL) */
>
>  void clock_early_init(void)
> diff --git a/arch/arm/mach-tegra/tegra210/clock.c b/arch/arm/mach-tegra/tegra210/clock.c
> index 330753f2ad..76fbfef580 100644
> --- a/arch/arm/mach-tegra/tegra210/clock.c
> +++ b/arch/arm/mach-tegra/tegra210/clock.c
> @@ -22,6 +22,8 @@
>  #include <linux/bitops.h>
>  #include <linux/delay.h>
>
> +#include <dt-bindings/clock/tegra210-car.h>
> +
>  /*
>   * Clock types that we can use as a source. The Tegra210 has muxes for the
>   * peripheral clocks, and in most cases there are four options for the clock
> @@ -914,6 +916,41 @@ enum periph_id clk_id_to_periph_id(int clk_id)
>                 return clk_id;
>         }
>  }
> +
> +/*
> + * Convert a device tree clock ID to our PLL ID.
> + *
> + * @param clk_id       Clock ID according to tegra210 device tree binding
> + * Return: clock ID, or CLOCK_ID_NONE if the clock ID is invalid
> + */
> +enum clock_id clk_id_to_pll_id(int clk_id)
> +{
> +       switch (clk_id) {
> +       case TEGRA210_CLK_PLL_C:
> +               return CLOCK_ID_CGENERAL;
> +       case TEGRA210_CLK_PLL_M:
> +               return CLOCK_ID_MEMORY;
> +       case TEGRA210_CLK_PLL_P:
> +               return CLOCK_ID_PERIPH;
> +       case TEGRA210_CLK_PLL_A:
> +               return CLOCK_ID_AUDIO;
> +       case TEGRA210_CLK_PLL_U:
> +               return CLOCK_ID_USB;
> +       case TEGRA210_CLK_PLL_D:
> +       case TEGRA210_CLK_PLL_D_OUT0:
> +               return CLOCK_ID_DISPLAY;
> +       case TEGRA210_CLK_PLL_X:
> +               return CLOCK_ID_XCPU;
> +       case TEGRA210_CLK_PLL_E:
> +               return CLOCK_ID_EPCI;
> +       case TEGRA210_CLK_CLK_32K:
> +               return CLOCK_ID_32KHZ;
> +       case TEGRA210_CLK_CLK_M:
> +               return CLOCK_ID_CLK_M;
> +       default:
> +               return CLOCK_ID_NONE;
> +       }
> +}
>  #endif /* CONFIG_OF_CONTROL */
>
>  /*
> diff --git a/arch/arm/mach-tegra/tegra30/clock.c b/arch/arm/mach-tegra/tegra30/clock.c
> index e5c2fd542c..dcdd0d0978 100644
> --- a/arch/arm/mach-tegra/tegra30/clock.c
> +++ b/arch/arm/mach-tegra/tegra30/clock.c
> @@ -19,6 +19,8 @@
>  #include <fdtdec.h>
>  #include <linux/delay.h>
>
> +#include <dt-bindings/clock/tegra30-car.h>
> +
>  /*
>   * Clock types that we can use as a source. The Tegra30 has muxes for the
>   * peripheral clocks, and in most cases there are four options for the clock
> @@ -628,6 +630,41 @@ enum periph_id clk_id_to_periph_id(int clk_id)
>                 return clk_id;
>         }
>  }
> +
> +/*
> + * Convert a device tree clock ID to our PLL ID.
> + *
> + * @param clk_id       Clock ID according to tegra30 device tree binding
> + * Return: clock ID, or CLOCK_ID_NONE if the clock ID is invalid
> + */
> +enum clock_id clk_id_to_pll_id(int clk_id)
> +{
> +       switch (clk_id) {
> +       case TEGRA30_CLK_PLL_C:
> +               return CLOCK_ID_CGENERAL;
> +       case TEGRA30_CLK_PLL_M:
> +               return CLOCK_ID_MEMORY;
> +       case TEGRA30_CLK_PLL_P:
> +               return CLOCK_ID_PERIPH;
> +       case TEGRA30_CLK_PLL_A:
> +               return CLOCK_ID_AUDIO;
> +       case TEGRA30_CLK_PLL_U:
> +               return CLOCK_ID_USB;
> +       case TEGRA30_CLK_PLL_D:
> +       case TEGRA30_CLK_PLL_D_OUT0:
> +               return CLOCK_ID_DISPLAY;
> +       case TEGRA30_CLK_PLL_X:
> +               return CLOCK_ID_XCPU;
> +       case TEGRA30_CLK_PLL_E:
> +               return CLOCK_ID_EPCI;
> +       case TEGRA30_CLK_CLK_32K:
> +               return CLOCK_ID_32KHZ;
> +       case TEGRA30_CLK_CLK_M:
> +               return CLOCK_ID_CLK_M;
> +       default:
> +               return CLOCK_ID_NONE;
> +       }
> +}
>  #endif /* CONFIG_IS_ENABLED(OF_CONTROL) */
>
>  void clock_early_init(void)
> --
> 2.37.2
>

^ permalink raw reply	[flat|nested] 26+ messages in thread

* Re: [PATCH v2 15/16] ARM: tegra30: implement BCT patching
  2023-02-03  2:15   ` Simon Glass
@ 2023-02-03  7:27     ` Svyatoslav Ryhel
  0 siblings, 0 replies; 26+ messages in thread
From: Svyatoslav Ryhel @ 2023-02-03  7:27 UTC (permalink / raw)
  To: Simon Glass
  Cc: Tom Warren, Stephen Warren, Marcel Ziswiler, Allen Martin,
	Jagan Teki, Lukasz Majewski, Marek Vasut, Ramin Khonsari,
	Thierry Reding, Maxim Schwalm, Dmitry Osipenko, u-boot

Greetings!

пт, 3 лют. 2023 р. о 04:15 Simon Glass <sjg@chromium.org> пише:
>
> Hi Svyatoslav,
>
> On Thu, 2 Feb 2023 at 11:23, Svyatoslav Ryhel <clamor95@gmail.com> wrote:
> >
> > From: Ramin Khonsari <raminterex@yahoo.com>
> >
> > This function allows updating bootloader from u-boot
> > on production devices without need in host PC.
> >
> > Be aware! It works only with re-crypted BCT.
> >
> > Tested-by: Andreas Westman Dorcsak <hedmoo@yahoo.com> # ASUS TF T30
> > Tested-by: Svyatoslav Ryhel <clamor95@gmail.com> # LG P895 T30
> > Signed-off-by: Ramin Khonsari <raminterex@yahoo.com>
> > Signed-off-by: Svyatoslav Ryhel <clamor95@gmail.com>
> > ---
> >  arch/arm/mach-tegra/Kconfig          | 10 ++++
> >  arch/arm/mach-tegra/tegra30/Makefile |  1 +
> >  arch/arm/mach-tegra/tegra30/bct.c    | 78 ++++++++++++++++++++++++++++
> >  arch/arm/mach-tegra/tegra30/bct.h    | 42 +++++++++++++++
> >  4 files changed, 131 insertions(+)
> >  create mode 100644 arch/arm/mach-tegra/tegra30/bct.c
> >  create mode 100644 arch/arm/mach-tegra/tegra30/bct.h
>
> Please add something to doc/ about this.
>
> >
> > diff --git a/arch/arm/mach-tegra/Kconfig b/arch/arm/mach-tegra/Kconfig
> > index 5b0cd92d9e..922e57726f 100644
> > --- a/arch/arm/mach-tegra/Kconfig
> > +++ b/arch/arm/mach-tegra/Kconfig
> > @@ -229,4 +229,14 @@ config CMD_ENTERRCM
> >           for mechanical button actuators, or hooking up relays/... to the
> >           button.
> >
> > +config CMD_EBTUPDATE
> > +       bool "Enable 'ebtupdate' command"
> > +       depends on TEGRA30
> > +       select TEGRA_CRYPTO
> > +       default n
>
> That is always the default so you can drop this line

Will do

>
> > +       help
> > +         Updating u-boot from within u-boot in rather complex or even
> > +         impossible on production devices. To make it easier procedure of
> > +         re-cryption was created. If your device was re-crypted choose Y.
> > +
> >  endif
> > diff --git a/arch/arm/mach-tegra/tegra30/Makefile b/arch/arm/mach-tegra/tegra30/Makefile
> > index 9f170576e7..28dd486d8d 100644
> > --- a/arch/arm/mach-tegra/tegra30/Makefile
> > +++ b/arch/arm/mach-tegra/tegra30/Makefile
> > @@ -3,5 +3,6 @@
> >  # Copyright (c) 2010-2012, NVIDIA CORPORATION.  All rights reserved.
> >
> >  obj-$(CONFIG_SPL_BUILD) += cpu.o
> > +obj-$(CONFIG_$(SPL_)CMD_EBTUPDATE) += bct.o
> >
> >  obj-y  += clock.o funcmux.o pinmux.o
> > diff --git a/arch/arm/mach-tegra/tegra30/bct.c b/arch/arm/mach-tegra/tegra30/bct.c
> > new file mode 100644
> > index 0000000000..c26338e263
> > --- /dev/null
> > +++ b/arch/arm/mach-tegra/tegra30/bct.c
> > @@ -0,0 +1,78 @@
> > +// SPDX-License-Identifier: GPL-2.0-or-later
> > +/*
> > + * Copyright (c) 2022, Ramin <raminterex@yahoo.com>
> > + * Copyright (c) 2022, Svyatoslav Ryhel <clamor95@gmail.com>
> > + */
> > +
> > +#include <common.h>
> > +#include <command.h>
> > +#include <log.h>
> > +#include <asm/arch-tegra/crypto.h>
> > +#include "bct.h"
> > +#include "uboot_aes.h"
> > +
> > +/*
> > + * \param bct          boot config table start in RAM
> > + * \param ect          bootloader start in RAM
> > + * \param ebt_size     bootloader file size in bytes
>
> Returns ?

will add

>
> > + */
> > +static int bct_patch(u8 *bct, u8 *ebt, u32 ebt_size)
> > +{
> > +       struct nvboot_config_table *bct_tbl = NULL;
> > +       u8 ebt_hash[AES128_KEY_LENGTH] = { 0 };
> > +       u8 sbk[AES128_KEY_LENGTH] = { 0 };
> > +       u8 *bct_hash = bct;
> > +       int ret;
> > +
> > +       bct += BCT_HASH;
> > +
> > +       memcpy(sbk, (u8 *)(bct + BCT_LENGTH),
> > +              NVBOOT_CMAC_AES_HASH_LENGTH * 4);
> > +
> > +       ret = decrypt_data_block(bct, BCT_LENGTH, sbk);
> > +       if (ret)
> > +               return 1;
> > +
> > +       ebt_size = roundup(ebt_size, EBT_ALIGNMENT);
> > +
> > +       ret = encrypt_data_block(ebt, ebt_size, sbk);
> > +       if (ret)
> > +               return 1;
> > +
> > +       ret = sign_enc_data_block(ebt, ebt_size, ebt_hash, sbk);
> > +       if (ret)
> > +               return 1;
> > +
> > +       bct_tbl = (struct nvboot_config_table *)bct;
> > +
> > +       memcpy((u8 *)&bct_tbl->bootloader[0].crypto_hash,
> > +              ebt_hash, NVBOOT_CMAC_AES_HASH_LENGTH * 4);
> > +       bct_tbl->bootloader[0].entry_point = CONFIG_SPL_TEXT_BASE;
> > +       bct_tbl->bootloader[0].load_addr = CONFIG_SPL_TEXT_BASE;
> > +       bct_tbl->bootloader[0].length = ebt_size;
> > +
> > +       ret = encrypt_data_block(bct, BCT_LENGTH, sbk);
> > +       if (ret)
> > +               return 1;
> > +
> > +       ret = sign_enc_data_block(bct, BCT_LENGTH, bct_hash, sbk);
> > +       if (ret)
> > +               return 1;
> > +
> > +       return 0;
> > +}
> > +
> > +static int do_ebtupdate(struct cmd_tbl *cmdtp, int flag, int argc,
> > +                       char *const argv[])
> > +{
> > +       u32 bct_addr = hextoul(argv[1], NULL);
> > +       u32 ebt_addr = hextoul(argv[2], NULL);
> > +       u32 ebt_size = hextoul(argv[3], NULL);
> > +
> > +       return bct_patch((u8 *)bct_addr, (u8 *)ebt_addr, ebt_size);
> > +}
> > +
> > +U_BOOT_CMD(ebtupdate,  4,      0,      do_ebtupdate,
> > +          "update bootloader on re-crypted Tegra30 devices",
> > +          ""
>
> Please add doc/usage/cmd file

will do

>
> > +);
> > diff --git a/arch/arm/mach-tegra/tegra30/bct.h b/arch/arm/mach-tegra/tegra30/bct.h
> > new file mode 100644
> > index 0000000000..9797384da3
> > --- /dev/null
> > +++ b/arch/arm/mach-tegra/tegra30/bct.h
> > @@ -0,0 +1,42 @@
> > +/* SPDX-License-Identifier: GPL-2.0+ */
> > +
> > +#ifndef _BCT_H_
> > +#define _BCT_H_
> > +
> > +/*
> > + * Defines the BCT parametres for T30
> > + */
> > +#define BCT_LENGTH             0x17E0
> > +#define BCT_HASH               0x10
> > +#define EBT_ALIGNMENT          0x10
> > +
> > +/*
> > + * Defines the CMAC-AES-128 hash length in 32 bit words. (128 bits = 4 words)
> > + */
> > +#define NVBOOT_CMAC_AES_HASH_LENGTH            4
> > +
> > +/*
> > + * Defines the maximum number of bootloader descriptions in the BCT.
> > + */
> > +#define NVBOOT_MAX_BOOTLOADERS                 4
> > +
> > +struct nv_bootloader_info {
> > +       u32 version;
> > +       u32 start_blk;
> > +       u32 start_page;
> > +       u32 length;
> > +       u32 load_addr;
> > +       u32 entry_point;
> > +       u32 attribute;
> > +       u32 crypto_hash[NVBOOT_CMAC_AES_HASH_LENGTH];
> > +};
> > +
> > +struct nvboot_config_table {
> > +       u32 unused0[4];
> > +       u32 boot_data_version;
> > +       u32 unused1[972];
> > +       struct nv_bootloader_info bootloader[NVBOOT_MAX_BOOTLOADERS];
> > +       u32 unused2[508];
> > +};
> > +
> > +#endif /* _BCT_H_ */
> > --
> > 2.37.2
> >
>
> Regards,
> Simon

Thanks!
Best regards
Svyatoslav R.

^ permalink raw reply	[flat|nested] 26+ messages in thread

end of thread, other threads:[~2023-02-03  7:27 UTC | newest]

Thread overview: 26+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2023-02-02 18:13 [PATCH v2 00/16] General Tegra improvements Svyatoslav Ryhel
2023-02-02 18:13 ` [PATCH v2 01/16] tegra30: clock: add EXTPERIPH Svyatoslav Ryhel
2023-02-03  2:15   ` Simon Glass
2023-02-02 18:13 ` [PATCH v2 02/16] ARM: t20/t30: swap host1x and disp1 clock parents Svyatoslav Ryhel
2023-02-02 18:13 ` [PATCH v2 03/16] ARM: tegra: clock: add clk_id_to_pll_id helper Svyatoslav Ryhel
2023-02-02 22:05   ` Tom Warren
2023-02-03  7:19     ` Svyatoslav Ryhel
2023-02-02 18:13 ` [PATCH v2 04/16] ARM: tegra: clock: add clock_decode_pair helper Svyatoslav Ryhel
2023-02-02 18:13 ` [PATCH v2 05/16] ARM: tegra30: add PLLD to pll setup Svyatoslav Ryhel
2023-02-02 18:13 ` [PATCH v2 06/16] ARM: tegra: Fix Tegra PWM parent clock Svyatoslav Ryhel
2023-02-02 18:13 ` [PATCH v2 07/16] spi: tegra20_slink: accept any word length Svyatoslav Ryhel
2023-02-02 18:13 ` [PATCH v2 08/16] ARM: tegra: provide default USB gadget setup Svyatoslav Ryhel
2023-02-02 18:13 ` [PATCH v2 09/16] ARM: tegra: add late init support Svyatoslav Ryhel
2023-02-02 18:13 ` [PATCH v2 10/16] ARM: tegra: create common pre-dm i2c write Svyatoslav Ryhel
2023-02-03  2:15   ` Simon Glass
2023-02-03  7:15     ` Svyatoslav Ryhel
2023-02-02 18:13 ` [PATCH v2 11/16] board: tegra124: switch to updated " Svyatoslav Ryhel
2023-02-03  2:15   ` Simon Glass
2023-02-02 18:13 ` [PATCH v2 12/16] board: tegra30: " Svyatoslav Ryhel
2023-02-03  2:15   ` Simon Glass
2023-02-02 18:13 ` [PATCH v2 13/16] ARM: tegra: expose crypto module for all Tegra SoCs Svyatoslav Ryhel
2023-02-02 18:13 ` [PATCH v2 14/16] ARM: tegra: crypto: extend crypto functional Svyatoslav Ryhel
2023-02-02 18:13 ` [PATCH v2 15/16] ARM: tegra30: implement BCT patching Svyatoslav Ryhel
2023-02-03  2:15   ` Simon Glass
2023-02-03  7:27     ` Svyatoslav Ryhel
2023-02-02 18:13 ` [PATCH v2 16/16] ARM: tegra20: " Svyatoslav Ryhel

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.