temp/u-boot-pinephone: upgrade to 2021.07 (MR 2315)
- switch sources to official repo https://source.denx.de/u-boot - use tag v2021.07 - extract patches from pine64-org - enable DMA transfers from eMMC and mSD (u-boot from Megi) [ci:skip-build] already built successfully in CI
This commit is contained in:
parent
cc6eb4d1f4
commit
63e2807916
31 changed files with 4070 additions and 22 deletions
|
@ -0,0 +1,73 @@
|
||||||
|
From af0ac30c08414e65f299149285dc81de664fc3f0 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Andre Przywara <andre.przywara@arm.com>
|
||||||
|
Date: Fri, 18 Dec 2020 22:02:11 +0000
|
||||||
|
Subject: [PATCH 01/29] mmc: sunxi: Avoid #ifdefs in delay and width setup
|
||||||
|
|
||||||
|
The delay and bus-width setup are slightly different across the
|
||||||
|
Allwinner SoC generations, and we covered this so far with some
|
||||||
|
preprocessor conditionals.
|
||||||
|
|
||||||
|
Use the more readable IS_ENABLE() instead.
|
||||||
|
|
||||||
|
Signed-off-by: Andre Przywara <andre.przywara@arm.com>
|
||||||
|
---
|
||||||
|
drivers/mmc/sunxi_mmc.c | 33 +++++++++++++++------------------
|
||||||
|
1 file changed, 15 insertions(+), 18 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/drivers/mmc/sunxi_mmc.c b/drivers/mmc/sunxi_mmc.c
|
||||||
|
index 3503ccdb2e..87b79fcf5e 100644
|
||||||
|
--- a/drivers/mmc/sunxi_mmc.c
|
||||||
|
+++ b/drivers/mmc/sunxi_mmc.c
|
||||||
|
@@ -156,23 +156,19 @@ static int mmc_set_mod_clk(struct sunxi_mmc_priv *priv, unsigned int hz)
|
||||||
|
} else if (hz <= 25000000) {
|
||||||
|
oclk_dly = 0;
|
||||||
|
sclk_dly = 5;
|
||||||
|
-#ifdef CONFIG_MACH_SUN9I
|
||||||
|
- } else if (hz <= 52000000) {
|
||||||
|
- oclk_dly = 5;
|
||||||
|
- sclk_dly = 4;
|
||||||
|
- } else {
|
||||||
|
- /* hz > 52000000 */
|
||||||
|
- oclk_dly = 2;
|
||||||
|
- sclk_dly = 4;
|
||||||
|
-#else
|
||||||
|
- } else if (hz <= 52000000) {
|
||||||
|
- oclk_dly = 3;
|
||||||
|
- sclk_dly = 4;
|
||||||
|
} else {
|
||||||
|
- /* hz > 52000000 */
|
||||||
|
- oclk_dly = 1;
|
||||||
|
+ if (IS_ENABLED(CONFIG_MACH_SUN9I)) {
|
||||||
|
+ if (hz <= 52000000)
|
||||||
|
+ oclk_dly = 5;
|
||||||
|
+ else
|
||||||
|
+ oclk_dly = 2;
|
||||||
|
+ } else {
|
||||||
|
+ if (hz <= 52000000)
|
||||||
|
+ oclk_dly = 3;
|
||||||
|
+ else
|
||||||
|
+ oclk_dly = 1;
|
||||||
|
+ }
|
||||||
|
sclk_dly = 4;
|
||||||
|
-#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
if (new_mode) {
|
||||||
|
@@ -521,10 +517,11 @@ struct mmc *sunxi_mmc_init(int sdc_no)
|
||||||
|
|
||||||
|
cfg->voltages = MMC_VDD_32_33 | MMC_VDD_33_34;
|
||||||
|
cfg->host_caps = MMC_MODE_4BIT;
|
||||||
|
-#if defined(CONFIG_MACH_SUN50I) || defined(CONFIG_MACH_SUN8I) || defined(CONFIG_SUN50I_GEN_H6)
|
||||||
|
- if (sdc_no == 2)
|
||||||
|
+
|
||||||
|
+ if ((IS_ENABLED(CONFIG_MACH_SUN50I) || IS_ENABLED(CONFIG_MACH_SUN8I) ||
|
||||||
|
+ IS_ENABLED(CONFIG_SUN50I_GEN_H6)) && (sdc_no == 2))
|
||||||
|
cfg->host_caps = MMC_MODE_8BIT;
|
||||||
|
-#endif
|
||||||
|
+
|
||||||
|
cfg->host_caps |= MMC_MODE_HS_52MHz | MMC_MODE_HS;
|
||||||
|
cfg->b_max = CONFIG_SYS_MMC_MAX_BLK_COUNT;
|
||||||
|
|
||||||
|
--
|
||||||
|
2.31.1
|
||||||
|
|
|
@ -0,0 +1,41 @@
|
||||||
|
From 43e334d01e4ffb3d536bee35d8eeb57a2e0c497f Mon Sep 17 00:00:00 2001
|
||||||
|
From: Andre Przywara <andre.przywara@arm.com>
|
||||||
|
Date: Thu, 29 Apr 2021 09:31:58 +0100
|
||||||
|
Subject: [PATCH 02/29] mmc: sunxi: Fix warnings with CONFIG_PHYS_64BIT
|
||||||
|
|
||||||
|
When enabling PHYS_64BIT on 32-bit platforms, we get two warnings about
|
||||||
|
pointer casts in sunxi_mmc.c. Those are related to MMIO addresses, which
|
||||||
|
are always below 1GB on all Allwinner SoCs, so there is no problem with
|
||||||
|
anything having more than 32 bits.
|
||||||
|
|
||||||
|
Add the proper casts to make it compile cleanly.
|
||||||
|
|
||||||
|
Signed-off-by: Andre Przywara <andre.przywara@arm.com>
|
||||||
|
---
|
||||||
|
drivers/mmc/sunxi_mmc.c | 4 ++--
|
||||||
|
1 file changed, 2 insertions(+), 2 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/drivers/mmc/sunxi_mmc.c b/drivers/mmc/sunxi_mmc.c
|
||||||
|
index 87b79fcf5e..869af993d3 100644
|
||||||
|
--- a/drivers/mmc/sunxi_mmc.c
|
||||||
|
+++ b/drivers/mmc/sunxi_mmc.c
|
||||||
|
@@ -631,14 +631,14 @@ static int sunxi_mmc_probe(struct udevice *dev)
|
||||||
|
cfg->f_min = 400000;
|
||||||
|
cfg->f_max = 52000000;
|
||||||
|
|
||||||
|
- priv->reg = (void *)dev_read_addr(dev);
|
||||||
|
+ priv->reg = dev_read_addr_ptr(dev);
|
||||||
|
|
||||||
|
/* We don't have a sunxi clock driver so find the clock address here */
|
||||||
|
ret = dev_read_phandle_with_args(dev, "clocks", "#clock-cells", 0,
|
||||||
|
1, &args);
|
||||||
|
if (ret)
|
||||||
|
return ret;
|
||||||
|
- ccu_reg = (u32 *)ofnode_get_addr(args.node);
|
||||||
|
+ ccu_reg = (u32 *)(uintptr_t)ofnode_get_addr(args.node);
|
||||||
|
|
||||||
|
priv->mmc_no = ((uintptr_t)priv->reg - SUNXI_MMC0_BASE) / 0x1000;
|
||||||
|
priv->mclkreg = (void *)ccu_reg + get_mclk_offset() + priv->mmc_no * 4;
|
||||||
|
--
|
||||||
|
2.31.1
|
||||||
|
|
|
@ -0,0 +1,64 @@
|
||||||
|
From 8bd521470df1cb6324520babf9d3a2e96bc7b96e Mon Sep 17 00:00:00 2001
|
||||||
|
From: Andre Przywara <andre.przywara@arm.com>
|
||||||
|
Date: Wed, 5 May 2021 09:57:47 +0100
|
||||||
|
Subject: [PATCH 03/29] mmc: sunxi: Fix MMC clock parent selection
|
||||||
|
|
||||||
|
Most Allwinner SoCs which use the so called "new timing mode" in their
|
||||||
|
MMC controllers actually use the double-rate PLL6/PERIPH0 clock as their
|
||||||
|
parent input clock. This is interestingly enough compensated by a hidden
|
||||||
|
"by 2" post-divider in the mod clock, so the divider and actual output
|
||||||
|
rate stay the same.
|
||||||
|
|
||||||
|
Even though for the H6 and H616 (but only for them!) we use the doubled
|
||||||
|
input clock for the divider computation, we never accounted for the
|
||||||
|
implicit post-divider, so the clock was only half the speed on those SoCs.
|
||||||
|
|
||||||
|
Clean up the code around that selection, to always use the normal PLL6
|
||||||
|
(PERIPH0(1x)) clock as an input. As the rate and divider are the same,
|
||||||
|
that makes no difference.
|
||||||
|
Explain the hardware differences in a comment.
|
||||||
|
|
||||||
|
Signed-off-by: Andre Przywara <andre.przywara@arm.com>
|
||||||
|
---
|
||||||
|
arch/arm/include/asm/arch-sunxi/clock_sun50i_h6.h | 2 +-
|
||||||
|
drivers/mmc/sunxi_mmc.c | 10 +++++++---
|
||||||
|
2 files changed, 8 insertions(+), 4 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/arch/arm/include/asm/arch-sunxi/clock_sun50i_h6.h b/arch/arm/include/asm/arch-sunxi/clock_sun50i_h6.h
|
||||||
|
index 62abfc4ef6..e000f78ff4 100644
|
||||||
|
--- a/arch/arm/include/asm/arch-sunxi/clock_sun50i_h6.h
|
||||||
|
+++ b/arch/arm/include/asm/arch-sunxi/clock_sun50i_h6.h
|
||||||
|
@@ -326,7 +326,7 @@ struct sunxi_ccm_reg {
|
||||||
|
#define CCM_MMC_CTRL_M(x) ((x) - 1)
|
||||||
|
#define CCM_MMC_CTRL_N(x) ((x) << 8)
|
||||||
|
#define CCM_MMC_CTRL_OSCM24 (0x0 << 24)
|
||||||
|
-#define CCM_MMC_CTRL_PLL6X2 (0x1 << 24)
|
||||||
|
+#define CCM_MMC_CTRL_PLL6 (0x1 << 24)
|
||||||
|
#define CCM_MMC_CTRL_PLL_PERIPH2X2 (0x2 << 24)
|
||||||
|
#define CCM_MMC_CTRL_ENABLE (0x1 << 31)
|
||||||
|
/* H6 doesn't have these delays */
|
||||||
|
diff --git a/drivers/mmc/sunxi_mmc.c b/drivers/mmc/sunxi_mmc.c
|
||||||
|
index 869af993d3..bc68debdad 100644
|
||||||
|
--- a/drivers/mmc/sunxi_mmc.c
|
||||||
|
+++ b/drivers/mmc/sunxi_mmc.c
|
||||||
|
@@ -124,10 +124,14 @@ static int mmc_set_mod_clk(struct sunxi_mmc_priv *priv, unsigned int hz)
|
||||||
|
#ifdef CONFIG_MACH_SUN9I
|
||||||
|
pll = CCM_MMC_CTRL_PLL_PERIPH0;
|
||||||
|
pll_hz = clock_get_pll4_periph0();
|
||||||
|
-#elif defined(CONFIG_SUN50I_GEN_H6)
|
||||||
|
- pll = CCM_MMC_CTRL_PLL6X2;
|
||||||
|
- pll_hz = clock_get_pll6() * 2;
|
||||||
|
#else
|
||||||
|
+ /*
|
||||||
|
+ * SoCs since the A64 (H5, H6, H616) actually use the doubled
|
||||||
|
+ * rate of PLL6/PERIPH0 as an input clock, but compensate for
|
||||||
|
+ * that with a fixed post-divider of 2 in the mod clock.
|
||||||
|
+ * This cancels each other out, so for simplicity we just
|
||||||
|
+ * pretend it's always PLL6 without a post divider here.
|
||||||
|
+ */
|
||||||
|
pll = CCM_MMC_CTRL_PLL6;
|
||||||
|
pll_hz = clock_get_pll6();
|
||||||
|
#endif
|
||||||
|
--
|
||||||
|
2.31.1
|
||||||
|
|
|
@ -0,0 +1,65 @@
|
||||||
|
From b8e83c3840068beb42ca821e20aaaa82369b84bc Mon Sep 17 00:00:00 2001
|
||||||
|
From: Andre Przywara <andre.przywara@arm.com>
|
||||||
|
Date: Wed, 5 May 2021 09:57:47 +0100
|
||||||
|
Subject: [PATCH 04/29] mmc: sunxi: Cleanup "new timing mode" selection
|
||||||
|
|
||||||
|
Among the SoCs using the "new timing mode", only the A83T needs to
|
||||||
|
explicitly switch to that mode.
|
||||||
|
|
||||||
|
By just defining the symbol for that one odd A83T bit to 0 for any other
|
||||||
|
SoCs, we can always OR that in, and save the confusing nested #ifdefs.
|
||||||
|
|
||||||
|
Clean up the also confusing new_mode setting on the way.
|
||||||
|
|
||||||
|
Signed-off-by: Andre Przywara <andre.przywara@arm.com>
|
||||||
|
---
|
||||||
|
drivers/mmc/sunxi_mmc.c | 15 ++++++---------
|
||||||
|
1 file changed, 6 insertions(+), 9 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/drivers/mmc/sunxi_mmc.c b/drivers/mmc/sunxi_mmc.c
|
||||||
|
index bc68debdad..33cedb4edb 100644
|
||||||
|
--- a/drivers/mmc/sunxi_mmc.c
|
||||||
|
+++ b/drivers/mmc/sunxi_mmc.c
|
||||||
|
@@ -23,6 +23,10 @@
|
||||||
|
#include <asm-generic/gpio.h>
|
||||||
|
#include <linux/delay.h>
|
||||||
|
|
||||||
|
+#ifndef CCM_MMC_CTRL_MODE_SEL_NEW
|
||||||
|
+#define CCM_MMC_CTRL_MODE_SEL_NEW 0
|
||||||
|
+#endif
|
||||||
|
+
|
||||||
|
struct sunxi_mmc_plat {
|
||||||
|
struct mmc_config cfg;
|
||||||
|
struct mmc mmc;
|
||||||
|
@@ -102,13 +106,10 @@ static int mmc_resource_init(int sdc_no)
|
||||||
|
static int mmc_set_mod_clk(struct sunxi_mmc_priv *priv, unsigned int hz)
|
||||||
|
{
|
||||||
|
unsigned int pll, pll_hz, div, n, oclk_dly, sclk_dly;
|
||||||
|
- bool new_mode = true;
|
||||||
|
+ bool new_mode = IS_ENABLED(CONFIG_MMC_SUNXI_HAS_NEW_MODE);
|
||||||
|
bool calibrate = false;
|
||||||
|
u32 val = 0;
|
||||||
|
|
||||||
|
- if (!IS_ENABLED(CONFIG_MMC_SUNXI_HAS_NEW_MODE))
|
||||||
|
- new_mode = false;
|
||||||
|
-
|
||||||
|
/* A83T support new mode only on eMMC */
|
||||||
|
if (IS_ENABLED(CONFIG_MACH_SUN8I_A83T) && priv->mmc_no != 2)
|
||||||
|
new_mode = false;
|
||||||
|
@@ -176,12 +177,8 @@ static int mmc_set_mod_clk(struct sunxi_mmc_priv *priv, unsigned int hz)
|
||||||
|
}
|
||||||
|
|
||||||
|
if (new_mode) {
|
||||||
|
-#ifdef CONFIG_MMC_SUNXI_HAS_NEW_MODE
|
||||||
|
-#ifdef CONFIG_MMC_SUNXI_HAS_MODE_SWITCH
|
||||||
|
- val = CCM_MMC_CTRL_MODE_SEL_NEW;
|
||||||
|
-#endif
|
||||||
|
+ val |= CCM_MMC_CTRL_MODE_SEL_NEW;
|
||||||
|
setbits_le32(&priv->reg->ntsr, SUNXI_MMC_NTSR_MODE_SEL_NEW);
|
||||||
|
-#endif
|
||||||
|
} else if (!calibrate) {
|
||||||
|
/*
|
||||||
|
* Use hardcoded delay values if controller doesn't support
|
||||||
|
--
|
||||||
|
2.31.1
|
||||||
|
|
|
@ -0,0 +1,44 @@
|
||||||
|
From 5f2f7a0ed7346c3369cd22348c372892e903c60e Mon Sep 17 00:00:00 2001
|
||||||
|
From: Andre Przywara <andre.przywara@arm.com>
|
||||||
|
Date: Wed, 5 May 2021 10:04:41 +0100
|
||||||
|
Subject: [PATCH 05/29] mmc: sunxi: Enable "new timing mode" on all new SoCs
|
||||||
|
|
||||||
|
All SoCs since the Allwinner A64 (H5, H6, R40, H616) feature to so
|
||||||
|
called "new timing mode", so enable this in Kconfig for those SoCs.
|
||||||
|
|
||||||
|
Signed-off-by: Andre Przywara <andre.przywara@arm.com>
|
||||||
|
---
|
||||||
|
arch/arm/mach-sunxi/Kconfig | 3 +++
|
||||||
|
1 file changed, 3 insertions(+)
|
||||||
|
|
||||||
|
diff --git a/arch/arm/mach-sunxi/Kconfig b/arch/arm/mach-sunxi/Kconfig
|
||||||
|
index 8e9012dbbf..e22a9c9103 100644
|
||||||
|
--- a/arch/arm/mach-sunxi/Kconfig
|
||||||
|
+++ b/arch/arm/mach-sunxi/Kconfig
|
||||||
|
@@ -152,6 +152,7 @@ config SUN50I_GEN_H6
|
||||||
|
bool
|
||||||
|
select FIT
|
||||||
|
select SPL_LOAD_FIT
|
||||||
|
+ select MMC_SUNXI_HAS_NEW_MODE
|
||||||
|
select SUPPORT_SPL
|
||||||
|
---help---
|
||||||
|
Select this for sunxi SoCs which have H6 like peripherals, clocks
|
||||||
|
@@ -297,6 +298,7 @@ config MACH_SUN8I_R40
|
||||||
|
select CPU_V7_HAS_VIRT
|
||||||
|
select ARCH_SUPPORT_PSCI
|
||||||
|
select SUNXI_GEN_SUN6I
|
||||||
|
+ select MMC_SUNXI_HAS_NEW_MODE
|
||||||
|
select SUPPORT_SPL
|
||||||
|
select SUNXI_DRAM_DW
|
||||||
|
select SUNXI_DRAM_DW_32BIT
|
||||||
|
@@ -346,6 +348,7 @@ config MACH_SUN50I_H5
|
||||||
|
bool "sun50i (Allwinner H5)"
|
||||||
|
select ARM64
|
||||||
|
select MACH_SUNXI_H3_H5
|
||||||
|
+ select MMC_SUNXI_HAS_NEW_MODE
|
||||||
|
select FIT
|
||||||
|
select SPL_LOAD_FIT
|
||||||
|
|
||||||
|
--
|
||||||
|
2.31.1
|
||||||
|
|
|
@ -0,0 +1,87 @@
|
||||||
|
From 0c12222a222529e46589eb2ea147d0e62ee4b838 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Andre Przywara <andre.przywara@arm.com>
|
||||||
|
Date: Wed, 5 May 2021 10:06:24 +0100
|
||||||
|
Subject: [PATCH 06/29] mmc: sunxi: Cleanup and fix self-calibration code
|
||||||
|
|
||||||
|
Newer SoCs have a self calibration feature, which avoids us writing hard
|
||||||
|
coded phase delay values into the controller.
|
||||||
|
|
||||||
|
Consolidate the code by avoiding unnecessary #ifdefs, and also enabling
|
||||||
|
the feature for all those newer SoCs.
|
||||||
|
|
||||||
|
Signed-off-by: Andre Przywara <andre.przywara@arm.com>
|
||||||
|
---
|
||||||
|
drivers/mmc/sunxi_mmc.c | 27 +++++++++++++++++++--------
|
||||||
|
1 file changed, 19 insertions(+), 8 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/drivers/mmc/sunxi_mmc.c b/drivers/mmc/sunxi_mmc.c
|
||||||
|
index 33cedb4edb..a30fd8fbdb 100644
|
||||||
|
--- a/drivers/mmc/sunxi_mmc.c
|
||||||
|
+++ b/drivers/mmc/sunxi_mmc.c
|
||||||
|
@@ -103,21 +103,29 @@ static int mmc_resource_init(int sdc_no)
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
+/*
|
||||||
|
+ * All A64 and later MMC controllers feature auto-calibration. This would
|
||||||
|
+ * normally be detected via the compatible string, but we need something
|
||||||
|
+ * which works in the SPL as well.
|
||||||
|
+ */
|
||||||
|
+static bool sunxi_mmc_can_calibrate(void)
|
||||||
|
+{
|
||||||
|
+ return IS_ENABLED(CONFIG_MACH_SUN50I) ||
|
||||||
|
+ IS_ENABLED(CONFIG_MACH_SUN50I_H5) ||
|
||||||
|
+ IS_ENABLED(CONFIG_SUN50I_GEN_H6) ||
|
||||||
|
+ IS_ENABLED(CONFIG_MACH_SUN8I_R40);
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
static int mmc_set_mod_clk(struct sunxi_mmc_priv *priv, unsigned int hz)
|
||||||
|
{
|
||||||
|
unsigned int pll, pll_hz, div, n, oclk_dly, sclk_dly;
|
||||||
|
bool new_mode = IS_ENABLED(CONFIG_MMC_SUNXI_HAS_NEW_MODE);
|
||||||
|
- bool calibrate = false;
|
||||||
|
u32 val = 0;
|
||||||
|
|
||||||
|
/* A83T support new mode only on eMMC */
|
||||||
|
if (IS_ENABLED(CONFIG_MACH_SUN8I_A83T) && priv->mmc_no != 2)
|
||||||
|
new_mode = false;
|
||||||
|
|
||||||
|
-#if defined(CONFIG_MACH_SUN50I) || defined(CONFIG_SUN50I_GEN_H6)
|
||||||
|
- calibrate = true;
|
||||||
|
-#endif
|
||||||
|
-
|
||||||
|
if (hz <= 24000000) {
|
||||||
|
pll = CCM_MMC_CTRL_OSCM24;
|
||||||
|
pll_hz = 24000000;
|
||||||
|
@@ -179,7 +187,9 @@ static int mmc_set_mod_clk(struct sunxi_mmc_priv *priv, unsigned int hz)
|
||||||
|
if (new_mode) {
|
||||||
|
val |= CCM_MMC_CTRL_MODE_SEL_NEW;
|
||||||
|
setbits_le32(&priv->reg->ntsr, SUNXI_MMC_NTSR_MODE_SEL_NEW);
|
||||||
|
- } else if (!calibrate) {
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ if (!sunxi_mmc_can_calibrate()) {
|
||||||
|
/*
|
||||||
|
* Use hardcoded delay values if controller doesn't support
|
||||||
|
* calibration
|
||||||
|
@@ -237,14 +247,15 @@ static int mmc_config_clock(struct sunxi_mmc_priv *priv, struct mmc *mmc)
|
||||||
|
rval &= ~SUNXI_MMC_CLK_DIVIDER_MASK;
|
||||||
|
writel(rval, &priv->reg->clkcr);
|
||||||
|
|
||||||
|
-#if defined(CONFIG_MACH_SUN50I) || defined(CONFIG_SUN50I_GEN_H6)
|
||||||
|
+#if defined(CONFIG_SUNXI_GEN_SUN6I) || defined(CONFIG_SUN50I_GEN_H6)
|
||||||
|
/* A64 supports calibration of delays on MMC controller and we
|
||||||
|
* have to set delay of zero before starting calibration.
|
||||||
|
* Allwinner BSP driver sets a delay only in the case of
|
||||||
|
* using HS400 which is not supported by mainline U-Boot or
|
||||||
|
* Linux at the moment
|
||||||
|
*/
|
||||||
|
- writel(SUNXI_MMC_CAL_DL_SW_EN, &priv->reg->samp_dl);
|
||||||
|
+ if (sunxi_mmc_can_calibrate())
|
||||||
|
+ writel(SUNXI_MMC_CAL_DL_SW_EN, &priv->reg->samp_dl);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* Re-enable Clock */
|
||||||
|
--
|
||||||
|
2.31.1
|
||||||
|
|
|
@ -0,0 +1,114 @@
|
||||||
|
From 570ba1826f2962f63168e9b65aa5620956234901 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Andre Przywara <andre.przywara@arm.com>
|
||||||
|
Date: Wed, 5 May 2021 11:33:40 +0100
|
||||||
|
Subject: [PATCH 07/29] mmc: sunxi: Increase MMIO FIFO read performance
|
||||||
|
|
||||||
|
To avoid the complexity of DMA operations (with chained descriptors), we
|
||||||
|
use repeated MMIO reads and writes to the SD_FIFO_REG, which allows us
|
||||||
|
to drain or fill the MMC data buffer FIFO very easily.
|
||||||
|
|
||||||
|
However those MMIO accesses are somewhat costly, so this limits our MMC
|
||||||
|
performance, to around 20MB/s on most SoCs, but down to 10MB/s on others
|
||||||
|
(H6, partly due to the lower AHB1 frequency).
|
||||||
|
|
||||||
|
As it turns out we read the FIFO status register after *every* word we
|
||||||
|
read or write, which effectively doubles the number of MMIO accesses,
|
||||||
|
thus effectively more than halving our performance.
|
||||||
|
|
||||||
|
To avoid this overhead, we can make use of the FIFO level bits, which are
|
||||||
|
in the very same FIFO status registers.
|
||||||
|
So for a read request, we now can collect as many words as the FIFO
|
||||||
|
level originally indicated, and only then need to update the status
|
||||||
|
register.
|
||||||
|
|
||||||
|
We don't know for sure the size of the FIFO (and it seems to differ
|
||||||
|
across SoCs anyway), so writing is more fragile, which is why we still
|
||||||
|
use the old method for that. If we find a minimum FIFO size available on
|
||||||
|
all SoCs, we could use that, in a later optimisation.
|
||||||
|
|
||||||
|
This patch increases the eMMC read speed on a Pine64-LTS from about
|
||||||
|
21MB/s to 43 MB/s. SD card reads increase slightly from about 20MB/s to
|
||||||
|
23MB/s, which is the practical limit for a 3.3V SD card anyway.
|
||||||
|
|
||||||
|
Signed-off-by: Andre Przywara <andre.przywara@arm.com>
|
||||||
|
---
|
||||||
|
arch/arm/include/asm/arch-sunxi/mmc.h | 1 +
|
||||||
|
drivers/mmc/sunxi_mmc.c | 39 +++++++++++++++++++++------
|
||||||
|
2 files changed, 32 insertions(+), 8 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/arch/arm/include/asm/arch-sunxi/mmc.h b/arch/arm/include/asm/arch-sunxi/mmc.h
|
||||||
|
index 340e25b04d..5daacf10eb 100644
|
||||||
|
--- a/arch/arm/include/asm/arch-sunxi/mmc.h
|
||||||
|
+++ b/arch/arm/include/asm/arch-sunxi/mmc.h
|
||||||
|
@@ -119,6 +119,7 @@ struct sunxi_mmc {
|
||||||
|
#define SUNXI_MMC_STATUS_CARD_PRESENT (0x1 << 8)
|
||||||
|
#define SUNXI_MMC_STATUS_CARD_DATA_BUSY (0x1 << 9)
|
||||||
|
#define SUNXI_MMC_STATUS_DATA_FSM_BUSY (0x1 << 10)
|
||||||
|
+#define SUNXI_MMC_STATUS_FIFO_LEVEL(reg) (((reg) >> 17) & 0x3fff)
|
||||||
|
|
||||||
|
#define SUNXI_MMC_NTSR_MODE_SEL_NEW (0x1 << 31)
|
||||||
|
|
||||||
|
diff --git a/drivers/mmc/sunxi_mmc.c b/drivers/mmc/sunxi_mmc.c
|
||||||
|
index a30fd8fbdb..ce085c69f5 100644
|
||||||
|
--- a/drivers/mmc/sunxi_mmc.c
|
||||||
|
+++ b/drivers/mmc/sunxi_mmc.c
|
||||||
|
@@ -311,8 +311,9 @@ static int mmc_trans_data_by_cpu(struct sunxi_mmc_priv *priv, struct mmc *mmc,
|
||||||
|
SUNXI_MMC_STATUS_FIFO_FULL;
|
||||||
|
unsigned i;
|
||||||
|
unsigned *buff = (unsigned int *)(reading ? data->dest : data->src);
|
||||||
|
- unsigned byte_cnt = data->blocksize * data->blocks;
|
||||||
|
- unsigned timeout_msecs = byte_cnt >> 8;
|
||||||
|
+ unsigned word_cnt = (data->blocksize * data->blocks) >> 2;
|
||||||
|
+ unsigned timeout_msecs = word_cnt >> 6;
|
||||||
|
+ uint32_t status;
|
||||||
|
unsigned long start;
|
||||||
|
|
||||||
|
if (timeout_msecs < 2000)
|
||||||
|
@@ -323,16 +324,38 @@ static int mmc_trans_data_by_cpu(struct sunxi_mmc_priv *priv, struct mmc *mmc,
|
||||||
|
|
||||||
|
start = get_timer(0);
|
||||||
|
|
||||||
|
- for (i = 0; i < (byte_cnt >> 2); i++) {
|
||||||
|
- while (readl(&priv->reg->status) & status_bit) {
|
||||||
|
+ for (i = 0; i < word_cnt;) {
|
||||||
|
+ unsigned int in_fifo;
|
||||||
|
+
|
||||||
|
+ while ((status = readl(&priv->reg->status)) & status_bit) {
|
||||||
|
if (get_timer(start) > timeout_msecs)
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
- if (reading)
|
||||||
|
- buff[i] = readl(&priv->reg->fifo);
|
||||||
|
- else
|
||||||
|
- writel(buff[i], &priv->reg->fifo);
|
||||||
|
+ /*
|
||||||
|
+ * For writing we do not easily know the FIFO size, so have
|
||||||
|
+ * to check the FIFO status after every word written.
|
||||||
|
+ * TODO: For optimisation we could work out a minimum FIFO
|
||||||
|
+ * size across all SoCs, and use that together with the current
|
||||||
|
+ * fill level to write chunks for words.
|
||||||
|
+ */
|
||||||
|
+ if (!reading) {
|
||||||
|
+ writel(buff[i++], &priv->reg->fifo);
|
||||||
|
+ continue;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ /*
|
||||||
|
+ * The status register holds the current FIFO level, so we
|
||||||
|
+ * can be sure to collect as many words from the FIFO
|
||||||
|
+ * register without checking the status register after every
|
||||||
|
+ * read. That saves half of the costly MMIO reads, effectively
|
||||||
|
+ * doubling the read performance.
|
||||||
|
+ */
|
||||||
|
+ for (in_fifo = SUNXI_MMC_STATUS_FIFO_LEVEL(status);
|
||||||
|
+ in_fifo > 0;
|
||||||
|
+ in_fifo--)
|
||||||
|
+ buff[i++] = readl_relaxed(&priv->reg->fifo);
|
||||||
|
+ dmb();
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
--
|
||||||
|
2.31.1
|
||||||
|
|
107
temp/u-boot-pinephone/0008-mmc-sunxi-Use-mmc_of_parse.patch
Normal file
107
temp/u-boot-pinephone/0008-mmc-sunxi-Use-mmc_of_parse.patch
Normal file
|
@ -0,0 +1,107 @@
|
||||||
|
From 93962fbf1fe4ea4a53bffa035b991315b1af46a0 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Andre Przywara <andre.przywara@arm.com>
|
||||||
|
Date: Wed, 21 Apr 2021 09:33:04 +0100
|
||||||
|
Subject: [PATCH 08/29] mmc: sunxi: Use mmc_of_parse()
|
||||||
|
|
||||||
|
At the moment the Allwinner MMC driver parses the bus-width and
|
||||||
|
non-removable DT properties itself, in the probe() routine.
|
||||||
|
|
||||||
|
There is actually a generic function provided by the MMC framework doing
|
||||||
|
this job, also it parses more generic properties like broken-cd and
|
||||||
|
advanced transfer modes.
|
||||||
|
|
||||||
|
Drop our own code and call mmc_of_parse() instead, to get all new
|
||||||
|
features for free.
|
||||||
|
|
||||||
|
Signed-off-by: Andre Przywara <andre.przywara@arm.com>
|
||||||
|
---
|
||||||
|
drivers/mmc/sunxi_mmc.c | 32 +++++++++++++++++---------------
|
||||||
|
1 file changed, 17 insertions(+), 15 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/drivers/mmc/sunxi_mmc.c b/drivers/mmc/sunxi_mmc.c
|
||||||
|
index ce085c69f5..28af8e6ac5 100644
|
||||||
|
--- a/drivers/mmc/sunxi_mmc.c
|
||||||
|
+++ b/drivers/mmc/sunxi_mmc.c
|
||||||
|
@@ -37,7 +37,6 @@ struct sunxi_mmc_priv {
|
||||||
|
uint32_t *mclkreg;
|
||||||
|
unsigned fatal_err;
|
||||||
|
struct gpio_desc cd_gpio; /* Change Detect GPIO */
|
||||||
|
- int cd_inverted; /* Inverted Card Detect */
|
||||||
|
struct sunxi_mmc *reg;
|
||||||
|
struct mmc_config cfg;
|
||||||
|
};
|
||||||
|
@@ -612,12 +611,21 @@ static int sunxi_mmc_send_cmd(struct udevice *dev, struct mmc_cmd *cmd,
|
||||||
|
|
||||||
|
static int sunxi_mmc_getcd(struct udevice *dev)
|
||||||
|
{
|
||||||
|
+ struct mmc *mmc = mmc_get_mmc_dev(dev);
|
||||||
|
struct sunxi_mmc_priv *priv = dev_get_priv(dev);
|
||||||
|
|
||||||
|
+ /* If polling, assume that the card is always present. */
|
||||||
|
+ if ((mmc->cfg->host_caps & MMC_CAP_NONREMOVABLE) ||
|
||||||
|
+ (mmc->cfg->host_caps & MMC_CAP_NEEDS_POLL))
|
||||||
|
+ return 1;
|
||||||
|
+
|
||||||
|
if (dm_gpio_is_valid(&priv->cd_gpio)) {
|
||||||
|
int cd_state = dm_gpio_get_value(&priv->cd_gpio);
|
||||||
|
|
||||||
|
- return cd_state ^ priv->cd_inverted;
|
||||||
|
+ if (mmc->cfg->host_caps & MMC_CAP_CD_ACTIVE_HIGH)
|
||||||
|
+ return !cd_state;
|
||||||
|
+ else
|
||||||
|
+ return cd_state;
|
||||||
|
}
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
@@ -649,23 +657,21 @@ static int sunxi_mmc_probe(struct udevice *dev)
|
||||||
|
struct mmc_config *cfg = &plat->cfg;
|
||||||
|
struct ofnode_phandle_args args;
|
||||||
|
u32 *ccu_reg;
|
||||||
|
- int bus_width, ret;
|
||||||
|
+ int ret;
|
||||||
|
|
||||||
|
cfg->name = dev->name;
|
||||||
|
- bus_width = dev_read_u32_default(dev, "bus-width", 1);
|
||||||
|
|
||||||
|
cfg->voltages = MMC_VDD_32_33 | MMC_VDD_33_34;
|
||||||
|
- cfg->host_caps = 0;
|
||||||
|
- if (bus_width == 8)
|
||||||
|
- cfg->host_caps |= MMC_MODE_8BIT;
|
||||||
|
- if (bus_width >= 4)
|
||||||
|
- cfg->host_caps |= MMC_MODE_4BIT;
|
||||||
|
- cfg->host_caps |= MMC_MODE_HS_52MHz | MMC_MODE_HS;
|
||||||
|
+ cfg->host_caps = MMC_MODE_HS_52MHz | MMC_MODE_HS;
|
||||||
|
cfg->b_max = CONFIG_SYS_MMC_MAX_BLK_COUNT;
|
||||||
|
|
||||||
|
cfg->f_min = 400000;
|
||||||
|
cfg->f_max = 52000000;
|
||||||
|
|
||||||
|
+ ret = mmc_of_parse(dev, cfg);
|
||||||
|
+ if (ret)
|
||||||
|
+ return ret;
|
||||||
|
+
|
||||||
|
priv->reg = dev_read_addr_ptr(dev);
|
||||||
|
|
||||||
|
/* We don't have a sunxi clock driver so find the clock address here */
|
||||||
|
@@ -691,17 +697,13 @@ static int sunxi_mmc_probe(struct udevice *dev)
|
||||||
|
return ret;
|
||||||
|
|
||||||
|
/* This GPIO is optional */
|
||||||
|
- if (!dev_read_bool(dev, "non-removable") &&
|
||||||
|
- !gpio_request_by_name(dev, "cd-gpios", 0, &priv->cd_gpio,
|
||||||
|
+ if (!gpio_request_by_name(dev, "cd-gpios", 0, &priv->cd_gpio,
|
||||||
|
GPIOD_IS_IN)) {
|
||||||
|
int cd_pin = gpio_get_number(&priv->cd_gpio);
|
||||||
|
|
||||||
|
sunxi_gpio_set_pull(cd_pin, SUNXI_GPIO_PULL_UP);
|
||||||
|
}
|
||||||
|
|
||||||
|
- /* Check if card detect is inverted */
|
||||||
|
- priv->cd_inverted = dev_read_bool(dev, "cd-inverted");
|
||||||
|
-
|
||||||
|
upriv->mmc = &plat->mmc;
|
||||||
|
|
||||||
|
/* Reset controller */
|
||||||
|
--
|
||||||
|
2.31.1
|
||||||
|
|
|
@ -0,0 +1,334 @@
|
||||||
|
From 10aa9515a2b13ad865c1c134266fcfc7c4fa90ad Mon Sep 17 00:00:00 2001
|
||||||
|
From: Samuel Holland <samuel@sholland.org>
|
||||||
|
Date: Thu, 7 May 2020 18:50:28 -0500
|
||||||
|
Subject: [PATCH 09/29] sunxi: DT: H5: update device tree files
|
||||||
|
|
||||||
|
Import updated device trees from Linux v5.9.
|
||||||
|
|
||||||
|
Signed-off-by: Samuel Holland <samuel@sholland.org>
|
||||||
|
---
|
||||||
|
.../dts/sun50i-h5-bananapi-m2-plus-v1.2.dts | 1 +
|
||||||
|
arch/arm/dts/sun50i-h5-cpu-opp.dtsi | 79 +++++++++++++++++++
|
||||||
|
.../arm/dts/sun50i-h5-libretech-all-h3-cc.dts | 1 +
|
||||||
|
arch/arm/dts/sun50i-h5-orangepi-pc2.dts | 21 +++++
|
||||||
|
.../arm/dts/sun50i-h5-orangepi-zero-plus2.dts | 38 +++++++++
|
||||||
|
arch/arm/dts/sun50i-h5.dtsi | 41 +++++++++-
|
||||||
|
6 files changed, 179 insertions(+), 2 deletions(-)
|
||||||
|
create mode 100644 arch/arm/dts/sun50i-h5-cpu-opp.dtsi
|
||||||
|
|
||||||
|
diff --git a/arch/arm/dts/sun50i-h5-bananapi-m2-plus-v1.2.dts b/arch/arm/dts/sun50i-h5-bananapi-m2-plus-v1.2.dts
|
||||||
|
index 2e2b14c0ae..8857a37915 100644
|
||||||
|
--- a/arch/arm/dts/sun50i-h5-bananapi-m2-plus-v1.2.dts
|
||||||
|
+++ b/arch/arm/dts/sun50i-h5-bananapi-m2-plus-v1.2.dts
|
||||||
|
@@ -3,6 +3,7 @@
|
||||||
|
|
||||||
|
/dts-v1/;
|
||||||
|
#include "sun50i-h5.dtsi"
|
||||||
|
+#include "sun50i-h5-cpu-opp.dtsi"
|
||||||
|
#include <arm/sunxi-bananapi-m2-plus-v1.2.dtsi>
|
||||||
|
|
||||||
|
/ {
|
||||||
|
diff --git a/arch/arm/dts/sun50i-h5-cpu-opp.dtsi b/arch/arm/dts/sun50i-h5-cpu-opp.dtsi
|
||||||
|
new file mode 100644
|
||||||
|
index 0000000000..b265720195
|
||||||
|
--- /dev/null
|
||||||
|
+++ b/arch/arm/dts/sun50i-h5-cpu-opp.dtsi
|
||||||
|
@@ -0,0 +1,79 @@
|
||||||
|
+// SPDX-License-Identifier: (GPL-2.0+ OR MIT)
|
||||||
|
+// Copyright (C) 2020 Chen-Yu Tsai <wens@csie.org>
|
||||||
|
+
|
||||||
|
+/ {
|
||||||
|
+ cpu_opp_table: cpu-opp-table {
|
||||||
|
+ compatible = "operating-points-v2";
|
||||||
|
+ opp-shared;
|
||||||
|
+
|
||||||
|
+ opp-408000000 {
|
||||||
|
+ opp-hz = /bits/ 64 <408000000>;
|
||||||
|
+ opp-microvolt = <1000000 1000000 1310000>;
|
||||||
|
+ clock-latency-ns = <244144>; /* 8 32k periods */
|
||||||
|
+ };
|
||||||
|
+
|
||||||
|
+ opp-648000000 {
|
||||||
|
+ opp-hz = /bits/ 64 <648000000>;
|
||||||
|
+ opp-microvolt = <1040000 1040000 1310000>;
|
||||||
|
+ clock-latency-ns = <244144>; /* 8 32k periods */
|
||||||
|
+ };
|
||||||
|
+
|
||||||
|
+ opp-816000000 {
|
||||||
|
+ opp-hz = /bits/ 64 <816000000>;
|
||||||
|
+ opp-microvolt = <1080000 1080000 1310000>;
|
||||||
|
+ clock-latency-ns = <244144>; /* 8 32k periods */
|
||||||
|
+ };
|
||||||
|
+
|
||||||
|
+ opp-912000000 {
|
||||||
|
+ opp-hz = /bits/ 64 <912000000>;
|
||||||
|
+ opp-microvolt = <1120000 1120000 1310000>;
|
||||||
|
+ clock-latency-ns = <244144>; /* 8 32k periods */
|
||||||
|
+ };
|
||||||
|
+
|
||||||
|
+ opp-960000000 {
|
||||||
|
+ opp-hz = /bits/ 64 <960000000>;
|
||||||
|
+ opp-microvolt = <1160000 1160000 1310000>;
|
||||||
|
+ clock-latency-ns = <244144>; /* 8 32k periods */
|
||||||
|
+ };
|
||||||
|
+
|
||||||
|
+ opp-1008000000 {
|
||||||
|
+ opp-hz = /bits/ 64 <1008000000>;
|
||||||
|
+ opp-microvolt = <1200000 1200000 1310000>;
|
||||||
|
+ clock-latency-ns = <244144>; /* 8 32k periods */
|
||||||
|
+ };
|
||||||
|
+
|
||||||
|
+ opp-1056000000 {
|
||||||
|
+ opp-hz = /bits/ 64 <1056000000>;
|
||||||
|
+ opp-microvolt = <1240000 1240000 1310000>;
|
||||||
|
+ clock-latency-ns = <244144>; /* 8 32k periods */
|
||||||
|
+ };
|
||||||
|
+
|
||||||
|
+ opp-1104000000 {
|
||||||
|
+ opp-hz = /bits/ 64 <1104000000>;
|
||||||
|
+ opp-microvolt = <1260000 1260000 1310000>;
|
||||||
|
+ clock-latency-ns = <244144>; /* 8 32k periods */
|
||||||
|
+ };
|
||||||
|
+
|
||||||
|
+ opp-1152000000 {
|
||||||
|
+ opp-hz = /bits/ 64 <1152000000>;
|
||||||
|
+ opp-microvolt = <1300000 1300000 1310000>;
|
||||||
|
+ clock-latency-ns = <244144>; /* 8 32k periods */
|
||||||
|
+ };
|
||||||
|
+ };
|
||||||
|
+};
|
||||||
|
+
|
||||||
|
+&cpu0 {
|
||||||
|
+ operating-points-v2 = <&cpu_opp_table>;
|
||||||
|
+};
|
||||||
|
+
|
||||||
|
+&cpu1 {
|
||||||
|
+ operating-points-v2 = <&cpu_opp_table>;
|
||||||
|
+};
|
||||||
|
+
|
||||||
|
+&cpu2 {
|
||||||
|
+ operating-points-v2 = <&cpu_opp_table>;
|
||||||
|
+};
|
||||||
|
+
|
||||||
|
+&cpu3 {
|
||||||
|
+ operating-points-v2 = <&cpu_opp_table>;
|
||||||
|
+};
|
||||||
|
diff --git a/arch/arm/dts/sun50i-h5-libretech-all-h3-cc.dts b/arch/arm/dts/sun50i-h5-libretech-all-h3-cc.dts
|
||||||
|
index a91806618e..016da3ec32 100644
|
||||||
|
--- a/arch/arm/dts/sun50i-h5-libretech-all-h3-cc.dts
|
||||||
|
+++ b/arch/arm/dts/sun50i-h5-libretech-all-h3-cc.dts
|
||||||
|
@@ -4,6 +4,7 @@
|
||||||
|
|
||||||
|
/dts-v1/;
|
||||||
|
#include "sun50i-h5.dtsi"
|
||||||
|
+#include "sun50i-h5-cpu-opp.dtsi"
|
||||||
|
#include <sunxi-libretech-all-h3-cc.dtsi>
|
||||||
|
|
||||||
|
/ {
|
||||||
|
diff --git a/arch/arm/dts/sun50i-h5-orangepi-pc2.dts b/arch/arm/dts/sun50i-h5-orangepi-pc2.dts
|
||||||
|
index 70b5f09984..7d7aad18f0 100644
|
||||||
|
--- a/arch/arm/dts/sun50i-h5-orangepi-pc2.dts
|
||||||
|
+++ b/arch/arm/dts/sun50i-h5-orangepi-pc2.dts
|
||||||
|
@@ -61,6 +61,7 @@
|
||||||
|
label = "sw4";
|
||||||
|
linux,code = <BTN_0>;
|
||||||
|
gpios = <&r_pio 0 3 GPIO_ACTIVE_LOW>;
|
||||||
|
+ wakeup-source;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
@@ -93,6 +94,10 @@
|
||||||
|
status = "okay";
|
||||||
|
};
|
||||||
|
|
||||||
|
+&cpu0 {
|
||||||
|
+ cpu-supply = <®_vdd_cpux>;
|
||||||
|
+};
|
||||||
|
+
|
||||||
|
&de {
|
||||||
|
status = "okay";
|
||||||
|
};
|
||||||
|
@@ -168,6 +173,22 @@
|
||||||
|
status = "okay";
|
||||||
|
};
|
||||||
|
|
||||||
|
+&r_i2c {
|
||||||
|
+ status = "okay";
|
||||||
|
+
|
||||||
|
+ reg_vdd_cpux: regulator@65 {
|
||||||
|
+ compatible = "silergy,sy8106a";
|
||||||
|
+ reg = <0x65>;
|
||||||
|
+ regulator-name = "vdd-cpux";
|
||||||
|
+ silergy,fixed-microvolt = <1100000>;
|
||||||
|
+ regulator-min-microvolt = <1000000>;
|
||||||
|
+ regulator-max-microvolt = <1400000>;
|
||||||
|
+ regulator-ramp-delay = <200>;
|
||||||
|
+ regulator-boot-on;
|
||||||
|
+ regulator-always-on;
|
||||||
|
+ };
|
||||||
|
+};
|
||||||
|
+
|
||||||
|
&spi0 {
|
||||||
|
status = "okay";
|
||||||
|
|
||||||
|
diff --git a/arch/arm/dts/sun50i-h5-orangepi-zero-plus2.dts b/arch/arm/dts/sun50i-h5-orangepi-zero-plus2.dts
|
||||||
|
index c95a685413..de19e68eb8 100644
|
||||||
|
--- a/arch/arm/dts/sun50i-h5-orangepi-zero-plus2.dts
|
||||||
|
+++ b/arch/arm/dts/sun50i-h5-orangepi-zero-plus2.dts
|
||||||
|
@@ -30,6 +30,21 @@
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
+ leds {
|
||||||
|
+ compatible = "gpio-leds";
|
||||||
|
+
|
||||||
|
+ pwr {
|
||||||
|
+ label = "orangepi:green:pwr";
|
||||||
|
+ gpios = <&r_pio 0 10 GPIO_ACTIVE_HIGH>;
|
||||||
|
+ default-state = "on";
|
||||||
|
+ };
|
||||||
|
+
|
||||||
|
+ status {
|
||||||
|
+ label = "orangepi:red:status";
|
||||||
|
+ gpios = <&pio 0 17 GPIO_ACTIVE_HIGH>;
|
||||||
|
+ };
|
||||||
|
+ };
|
||||||
|
+
|
||||||
|
reg_vcc3v3: vcc3v3 {
|
||||||
|
compatible = "regulator-fixed";
|
||||||
|
regulator-name = "vcc3v3";
|
||||||
|
@@ -48,6 +63,10 @@
|
||||||
|
status = "okay";
|
||||||
|
};
|
||||||
|
|
||||||
|
+&ehci0 {
|
||||||
|
+ status = "okay";
|
||||||
|
+};
|
||||||
|
+
|
||||||
|
&hdmi {
|
||||||
|
status = "okay";
|
||||||
|
};
|
||||||
|
@@ -92,6 +111,10 @@
|
||||||
|
status = "okay";
|
||||||
|
};
|
||||||
|
|
||||||
|
+&ohci0 {
|
||||||
|
+ status = "okay";
|
||||||
|
+};
|
||||||
|
+
|
||||||
|
&uart0 {
|
||||||
|
pinctrl-names = "default";
|
||||||
|
pinctrl-0 = <&uart0_pa_pins>;
|
||||||
|
@@ -103,3 +126,18 @@
|
||||||
|
pinctrl-0 = <&uart1_pins>, <&uart1_rts_cts_pins>;
|
||||||
|
status = "okay";
|
||||||
|
};
|
||||||
|
+
|
||||||
|
+&usb_otg {
|
||||||
|
+ /*
|
||||||
|
+ * According to schematics CN1 MicroUSB port can be used to take
|
||||||
|
+ * external 5V to power up the board VBUS. On the contrary CN1 MicroUSB
|
||||||
|
+ * port cannot provide power externally even if the board is powered
|
||||||
|
+ * via GPIO pins. It thus makes sense to force peripheral mode.
|
||||||
|
+ */
|
||||||
|
+ dr_mode = "peripheral";
|
||||||
|
+ status = "okay";
|
||||||
|
+};
|
||||||
|
+
|
||||||
|
+&usbphy {
|
||||||
|
+ status = "okay";
|
||||||
|
+};
|
||||||
|
diff --git a/arch/arm/dts/sun50i-h5.dtsi b/arch/arm/dts/sun50i-h5.dtsi
|
||||||
|
index 3a1c8b2efd..9c73c4e4c3 100644
|
||||||
|
--- a/arch/arm/dts/sun50i-h5.dtsi
|
||||||
|
+++ b/arch/arm/dts/sun50i-h5.dtsi
|
||||||
|
@@ -3,6 +3,8 @@
|
||||||
|
|
||||||
|
#include <sunxi-h3-h5.dtsi>
|
||||||
|
|
||||||
|
+#include <dt-bindings/thermal/thermal.h>
|
||||||
|
+
|
||||||
|
/ {
|
||||||
|
cpus {
|
||||||
|
#address-cells = <1>;
|
||||||
|
@@ -13,6 +15,9 @@
|
||||||
|
device_type = "cpu";
|
||||||
|
reg = <0>;
|
||||||
|
enable-method = "psci";
|
||||||
|
+ clocks = <&ccu CLK_CPUX>;
|
||||||
|
+ clock-latency-ns = <244144>; /* 8 32k periods */
|
||||||
|
+ #cooling-cells = <2>;
|
||||||
|
};
|
||||||
|
|
||||||
|
cpu1: cpu@1 {
|
||||||
|
@@ -20,6 +25,9 @@
|
||||||
|
device_type = "cpu";
|
||||||
|
reg = <1>;
|
||||||
|
enable-method = "psci";
|
||||||
|
+ clocks = <&ccu CLK_CPUX>;
|
||||||
|
+ clock-latency-ns = <244144>; /* 8 32k periods */
|
||||||
|
+ #cooling-cells = <2>;
|
||||||
|
};
|
||||||
|
|
||||||
|
cpu2: cpu@2 {
|
||||||
|
@@ -27,6 +35,9 @@
|
||||||
|
device_type = "cpu";
|
||||||
|
reg = <2>;
|
||||||
|
enable-method = "psci";
|
||||||
|
+ clocks = <&ccu CLK_CPUX>;
|
||||||
|
+ clock-latency-ns = <244144>; /* 8 32k periods */
|
||||||
|
+ #cooling-cells = <2>;
|
||||||
|
};
|
||||||
|
|
||||||
|
cpu3: cpu@3 {
|
||||||
|
@@ -34,12 +45,14 @@
|
||||||
|
device_type = "cpu";
|
||||||
|
reg = <3>;
|
||||||
|
enable-method = "psci";
|
||||||
|
+ clocks = <&ccu CLK_CPUX>;
|
||||||
|
+ clock-latency-ns = <244144>; /* 8 32k periods */
|
||||||
|
+ #cooling-cells = <2>;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
pmu {
|
||||||
|
- compatible = "arm,cortex-a53-pmu",
|
||||||
|
- "arm,armv8-pmuv3";
|
||||||
|
+ compatible = "arm,cortex-a53-pmu";
|
||||||
|
interrupts = <GIC_SPI 116 IRQ_TYPE_LEVEL_HIGH>,
|
||||||
|
<GIC_SPI 117 IRQ_TYPE_LEVEL_HIGH>,
|
||||||
|
<GIC_SPI 118 IRQ_TYPE_LEVEL_HIGH>,
|
||||||
|
@@ -166,6 +179,30 @@
|
||||||
|
polling-delay-passive = <0>;
|
||||||
|
polling-delay = <0>;
|
||||||
|
thermal-sensors = <&ths 0>;
|
||||||
|
+
|
||||||
|
+ trips {
|
||||||
|
+ cpu_hot_trip: cpu-hot {
|
||||||
|
+ temperature = <80000>;
|
||||||
|
+ hysteresis = <2000>;
|
||||||
|
+ type = "passive";
|
||||||
|
+ };
|
||||||
|
+
|
||||||
|
+ cpu_very_hot_trip: cpu-very-hot {
|
||||||
|
+ temperature = <100000>;
|
||||||
|
+ hysteresis = <0>;
|
||||||
|
+ type = "critical";
|
||||||
|
+ };
|
||||||
|
+ };
|
||||||
|
+
|
||||||
|
+ cooling-maps {
|
||||||
|
+ cpu-hot-limit {
|
||||||
|
+ trip = <&cpu_hot_trip>;
|
||||||
|
+ cooling-device = <&cpu0 THERMAL_NO_LIMIT THERMAL_NO_LIMIT>,
|
||||||
|
+ <&cpu1 THERMAL_NO_LIMIT THERMAL_NO_LIMIT>,
|
||||||
|
+ <&cpu2 THERMAL_NO_LIMIT THERMAL_NO_LIMIT>,
|
||||||
|
+ <&cpu3 THERMAL_NO_LIMIT THERMAL_NO_LIMIT>;
|
||||||
|
+ };
|
||||||
|
+ };
|
||||||
|
};
|
||||||
|
|
||||||
|
gpu_thermal {
|
||||||
|
--
|
||||||
|
2.31.1
|
||||||
|
|
|
@ -0,0 +1,56 @@
|
||||||
|
From 153c7e167201f9c17cee7ea919146a5168daa74e Mon Sep 17 00:00:00 2001
|
||||||
|
From: Samuel Holland <samuel@sholland.org>
|
||||||
|
Date: Thu, 7 May 2020 18:50:37 -0500
|
||||||
|
Subject: [PATCH 10/29] sunxi: DT: H6: update device tree files
|
||||||
|
|
||||||
|
Import updated device trees from Linux v5.9.
|
||||||
|
|
||||||
|
Signed-off-by: Samuel Holland <samuel@sholland.org>
|
||||||
|
---
|
||||||
|
arch/arm/dts/Makefile | 1 +
|
||||||
|
arch/arm/dts/sun50i-h6-pine-h64-model-b.dts | 21 +++++++++++++++++++++
|
||||||
|
2 files changed, 22 insertions(+)
|
||||||
|
create mode 100644 arch/arm/dts/sun50i-h6-pine-h64-model-b.dts
|
||||||
|
|
||||||
|
diff --git a/arch/arm/dts/Makefile b/arch/arm/dts/Makefile
|
||||||
|
index 9fb38682e6..ec40983df2 100644
|
||||||
|
--- a/arch/arm/dts/Makefile
|
||||||
|
+++ b/arch/arm/dts/Makefile
|
||||||
|
@@ -633,6 +633,7 @@ dtb-$(CONFIG_MACH_SUN50I_H6) += \
|
||||||
|
sun50i-h6-orangepi-lite2.dtb \
|
||||||
|
sun50i-h6-orangepi-one-plus.dtb \
|
||||||
|
sun50i-h6-pine-h64.dtb \
|
||||||
|
+ sun50i-h6-pine-h64-model-b.dtb \
|
||||||
|
sun50i-h6-tanix-tx6.dtb
|
||||||
|
dtb-$(CONFIG_MACH_SUN50I_H616) += \
|
||||||
|
sun50i-h616-orangepi-zero2.dtb
|
||||||
|
diff --git a/arch/arm/dts/sun50i-h6-pine-h64-model-b.dts b/arch/arm/dts/sun50i-h6-pine-h64-model-b.dts
|
||||||
|
new file mode 100644
|
||||||
|
index 0000000000..f4c8966a64
|
||||||
|
--- /dev/null
|
||||||
|
+++ b/arch/arm/dts/sun50i-h6-pine-h64-model-b.dts
|
||||||
|
@@ -0,0 +1,21 @@
|
||||||
|
+// SPDX-License-Identifier: (GPL-2.0+ or MIT)
|
||||||
|
+/*
|
||||||
|
+ * Copyright (C) 2019 Corentin LABBE <clabbe@baylibre.com>
|
||||||
|
+ */
|
||||||
|
+
|
||||||
|
+#include "sun50i-h6-pine-h64.dts"
|
||||||
|
+
|
||||||
|
+/ {
|
||||||
|
+ model = "Pine H64 model B";
|
||||||
|
+ compatible = "pine64,pine-h64-model-b", "allwinner,sun50i-h6";
|
||||||
|
+
|
||||||
|
+ /delete-node/ reg_gmac_3v3;
|
||||||
|
+};
|
||||||
|
+
|
||||||
|
+&hdmi_connector {
|
||||||
|
+ /delete-property/ ddc-en-gpios;
|
||||||
|
+};
|
||||||
|
+
|
||||||
|
+&emac {
|
||||||
|
+ phy-supply = <®_aldo2>;
|
||||||
|
+};
|
||||||
|
--
|
||||||
|
2.31.1
|
||||||
|
|
|
@ -0,0 +1,222 @@
|
||||||
|
From a2fceed3e1d2ac4cce4a86274c57f2bb1e177646 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Samuel Holland <samuel@sholland.org>
|
||||||
|
Date: Sat, 30 May 2020 03:05:29 -0500
|
||||||
|
Subject: [PATCH 11/29] phy: sun50i-usb3: Add a driver for the H6 USB3 PHY
|
||||||
|
|
||||||
|
This driver is needed for XHCI to work on the Allwinner H6 SoC. The
|
||||||
|
driver is copied from Linux v5.10.
|
||||||
|
|
||||||
|
Reviewed-by: Andre Przywara <andre.przywara@arm.com>
|
||||||
|
Signed-off-by: Samuel Holland <samuel@sholland.org>
|
||||||
|
---
|
||||||
|
drivers/phy/allwinner/Kconfig | 8 ++
|
||||||
|
drivers/phy/allwinner/Makefile | 1 +
|
||||||
|
drivers/phy/allwinner/phy-sun50i-usb3.c | 171 ++++++++++++++++++++++++
|
||||||
|
3 files changed, 180 insertions(+)
|
||||||
|
create mode 100644 drivers/phy/allwinner/phy-sun50i-usb3.c
|
||||||
|
|
||||||
|
diff --git a/drivers/phy/allwinner/Kconfig b/drivers/phy/allwinner/Kconfig
|
||||||
|
index dba3bae61c..6bfb79cbca 100644
|
||||||
|
--- a/drivers/phy/allwinner/Kconfig
|
||||||
|
+++ b/drivers/phy/allwinner/Kconfig
|
||||||
|
@@ -11,3 +11,11 @@ config PHY_SUN4I_USB
|
||||||
|
|
||||||
|
This driver controls the entire USB PHY block, both the USB OTG
|
||||||
|
parts, as well as the 2 regular USB 2 host PHYs.
|
||||||
|
+
|
||||||
|
+config PHY_SUN50I_USB3
|
||||||
|
+ bool "Allwinner sun50i USB3 PHY driver"
|
||||||
|
+ depends on ARCH_SUNXI
|
||||||
|
+ select PHY
|
||||||
|
+ help
|
||||||
|
+ Enable this to support the USB3 transceiver that is part of
|
||||||
|
+ Allwinner sun50i SoCs.
|
||||||
|
diff --git a/drivers/phy/allwinner/Makefile b/drivers/phy/allwinner/Makefile
|
||||||
|
index e709fca643..f2b60ce1a6 100644
|
||||||
|
--- a/drivers/phy/allwinner/Makefile
|
||||||
|
+++ b/drivers/phy/allwinner/Makefile
|
||||||
|
@@ -4,3 +4,4 @@
|
||||||
|
#
|
||||||
|
|
||||||
|
obj-$(CONFIG_PHY_SUN4I_USB) += phy-sun4i-usb.o
|
||||||
|
+obj-$(CONFIG_PHY_SUN50I_USB3) += phy-sun50i-usb3.o
|
||||||
|
diff --git a/drivers/phy/allwinner/phy-sun50i-usb3.c b/drivers/phy/allwinner/phy-sun50i-usb3.c
|
||||||
|
new file mode 100644
|
||||||
|
index 0000000000..e5a3d2d92e
|
||||||
|
--- /dev/null
|
||||||
|
+++ b/drivers/phy/allwinner/phy-sun50i-usb3.c
|
||||||
|
@@ -0,0 +1,171 @@
|
||||||
|
+// SPDX-License-Identifier: GPL-2.0+
|
||||||
|
+/*
|
||||||
|
+ * Allwinner sun50i(H6) USB 3.0 phy driver
|
||||||
|
+ *
|
||||||
|
+ * Copyright (C) 2020 Samuel Holland <samuel@sholland.org>
|
||||||
|
+ *
|
||||||
|
+ * Based on the Linux driver, which is:
|
||||||
|
+ *
|
||||||
|
+ * Copyright (C) 2017 Icenowy Zheng <icenowy@aosc.io>
|
||||||
|
+ *
|
||||||
|
+ * Based on phy-sun9i-usb.c, which is:
|
||||||
|
+ *
|
||||||
|
+ * Copyright (C) 2014-2015 Chen-Yu Tsai <wens@csie.org>
|
||||||
|
+ *
|
||||||
|
+ * Based on code from Allwinner BSP, which is:
|
||||||
|
+ *
|
||||||
|
+ * Copyright (c) 2010-2015 Allwinner Technology Co., Ltd.
|
||||||
|
+ */
|
||||||
|
+
|
||||||
|
+#include <asm/io.h>
|
||||||
|
+#include <clk.h>
|
||||||
|
+#include <dm.h>
|
||||||
|
+#include <dm/device_compat.h>
|
||||||
|
+#include <generic-phy.h>
|
||||||
|
+#include <linux/bitops.h>
|
||||||
|
+#include <reset.h>
|
||||||
|
+
|
||||||
|
+/* Interface Status and Control Registers */
|
||||||
|
+#define SUNXI_ISCR 0x00
|
||||||
|
+#define SUNXI_PIPE_CLOCK_CONTROL 0x14
|
||||||
|
+#define SUNXI_PHY_TUNE_LOW 0x18
|
||||||
|
+#define SUNXI_PHY_TUNE_HIGH 0x1c
|
||||||
|
+#define SUNXI_PHY_EXTERNAL_CONTROL 0x20
|
||||||
|
+
|
||||||
|
+/* USB2.0 Interface Status and Control Register */
|
||||||
|
+#define SUNXI_ISCR_FORCE_VBUS (3 << 12)
|
||||||
|
+
|
||||||
|
+/* PIPE Clock Control Register */
|
||||||
|
+#define SUNXI_PCC_PIPE_CLK_OPEN (1 << 6)
|
||||||
|
+
|
||||||
|
+/* PHY External Control Register */
|
||||||
|
+#define SUNXI_PEC_EXTERN_VBUS (3 << 1)
|
||||||
|
+#define SUNXI_PEC_SSC_EN (1 << 24)
|
||||||
|
+#define SUNXI_PEC_REF_SSP_EN (1 << 26)
|
||||||
|
+
|
||||||
|
+/* PHY Tune High Register */
|
||||||
|
+#define SUNXI_TX_DEEMPH_3P5DB(n) ((n) << 19)
|
||||||
|
+#define SUNXI_TX_DEEMPH_3P5DB_MASK GENMASK(24, 19)
|
||||||
|
+#define SUNXI_TX_DEEMPH_6DB(n) ((n) << 13)
|
||||||
|
+#define SUNXI_TX_DEEMPH_6GB_MASK GENMASK(18, 13)
|
||||||
|
+#define SUNXI_TX_SWING_FULL(n) ((n) << 6)
|
||||||
|
+#define SUNXI_TX_SWING_FULL_MASK GENMASK(12, 6)
|
||||||
|
+#define SUNXI_LOS_BIAS(n) ((n) << 3)
|
||||||
|
+#define SUNXI_LOS_BIAS_MASK GENMASK(5, 3)
|
||||||
|
+#define SUNXI_TXVBOOSTLVL(n) ((n) << 0)
|
||||||
|
+#define SUNXI_TXVBOOSTLVL_MASK GENMASK(2, 0)
|
||||||
|
+
|
||||||
|
+struct sun50i_usb3_phy_priv {
|
||||||
|
+ void __iomem *regs;
|
||||||
|
+ struct reset_ctl reset;
|
||||||
|
+ struct clk clk;
|
||||||
|
+};
|
||||||
|
+
|
||||||
|
+static void sun50i_usb3_phy_open(struct sun50i_usb3_phy_priv *phy)
|
||||||
|
+{
|
||||||
|
+ u32 val;
|
||||||
|
+
|
||||||
|
+ val = readl(phy->regs + SUNXI_PHY_EXTERNAL_CONTROL);
|
||||||
|
+ val |= SUNXI_PEC_EXTERN_VBUS;
|
||||||
|
+ val |= SUNXI_PEC_SSC_EN | SUNXI_PEC_REF_SSP_EN;
|
||||||
|
+ writel(val, phy->regs + SUNXI_PHY_EXTERNAL_CONTROL);
|
||||||
|
+
|
||||||
|
+ val = readl(phy->regs + SUNXI_PIPE_CLOCK_CONTROL);
|
||||||
|
+ val |= SUNXI_PCC_PIPE_CLK_OPEN;
|
||||||
|
+ writel(val, phy->regs + SUNXI_PIPE_CLOCK_CONTROL);
|
||||||
|
+
|
||||||
|
+ val = readl(phy->regs + SUNXI_ISCR);
|
||||||
|
+ val |= SUNXI_ISCR_FORCE_VBUS;
|
||||||
|
+ writel(val, phy->regs + SUNXI_ISCR);
|
||||||
|
+
|
||||||
|
+ /*
|
||||||
|
+ * All the magic numbers written to the PHY_TUNE_{LOW_HIGH}
|
||||||
|
+ * registers are directly taken from the BSP USB3 driver from
|
||||||
|
+ * Allwiner.
|
||||||
|
+ */
|
||||||
|
+ writel(0x0047fc87, phy->regs + SUNXI_PHY_TUNE_LOW);
|
||||||
|
+
|
||||||
|
+ val = readl(phy->regs + SUNXI_PHY_TUNE_HIGH);
|
||||||
|
+ val &= ~(SUNXI_TXVBOOSTLVL_MASK | SUNXI_LOS_BIAS_MASK |
|
||||||
|
+ SUNXI_TX_SWING_FULL_MASK | SUNXI_TX_DEEMPH_6GB_MASK |
|
||||||
|
+ SUNXI_TX_DEEMPH_3P5DB_MASK);
|
||||||
|
+ val |= SUNXI_TXVBOOSTLVL(0x7);
|
||||||
|
+ val |= SUNXI_LOS_BIAS(0x7);
|
||||||
|
+ val |= SUNXI_TX_SWING_FULL(0x55);
|
||||||
|
+ val |= SUNXI_TX_DEEMPH_6DB(0x20);
|
||||||
|
+ val |= SUNXI_TX_DEEMPH_3P5DB(0x15);
|
||||||
|
+ writel(val, phy->regs + SUNXI_PHY_TUNE_HIGH);
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+static int sun50i_usb3_phy_init(struct phy *phy)
|
||||||
|
+{
|
||||||
|
+ struct sun50i_usb3_phy_priv *priv = dev_get_priv(phy->dev);
|
||||||
|
+ int ret;
|
||||||
|
+
|
||||||
|
+ ret = clk_prepare_enable(&priv->clk);
|
||||||
|
+ if (ret)
|
||||||
|
+ return ret;
|
||||||
|
+
|
||||||
|
+ ret = reset_deassert(&priv->reset);
|
||||||
|
+ if (ret) {
|
||||||
|
+ clk_disable_unprepare(&priv->clk);
|
||||||
|
+ return ret;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ sun50i_usb3_phy_open(priv);
|
||||||
|
+
|
||||||
|
+ return 0;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+static int sun50i_usb3_phy_exit(struct phy *phy)
|
||||||
|
+{
|
||||||
|
+ struct sun50i_usb3_phy_priv *priv = dev_get_priv(phy->dev);
|
||||||
|
+
|
||||||
|
+ reset_assert(&priv->reset);
|
||||||
|
+ clk_disable_unprepare(&priv->clk);
|
||||||
|
+
|
||||||
|
+ return 0;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+static const struct phy_ops sun50i_usb3_phy_ops = {
|
||||||
|
+ .init = sun50i_usb3_phy_init,
|
||||||
|
+ .exit = sun50i_usb3_phy_exit,
|
||||||
|
+};
|
||||||
|
+
|
||||||
|
+static int sun50i_usb3_phy_probe(struct udevice *dev)
|
||||||
|
+{
|
||||||
|
+ struct sun50i_usb3_phy_priv *priv = dev_get_priv(dev);
|
||||||
|
+ int ret;
|
||||||
|
+
|
||||||
|
+ ret = clk_get_by_index(dev, 0, &priv->clk);
|
||||||
|
+ if (ret) {
|
||||||
|
+ dev_err(dev, "failed to get phy clock\n");
|
||||||
|
+ return ret;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ ret = reset_get_by_index(dev, 0, &priv->reset);
|
||||||
|
+ if (ret) {
|
||||||
|
+ dev_err(dev, "failed to get reset control\n");
|
||||||
|
+ return ret;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ priv->regs = (void __iomem *)dev_read_addr(dev);
|
||||||
|
+ if (IS_ERR(priv->regs))
|
||||||
|
+ return PTR_ERR(priv->regs);
|
||||||
|
+
|
||||||
|
+ return 0;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+static const struct udevice_id sun50i_usb3_phy_ids[] = {
|
||||||
|
+ { .compatible = "allwinner,sun50i-h6-usb3-phy" },
|
||||||
|
+ { },
|
||||||
|
+};
|
||||||
|
+
|
||||||
|
+U_BOOT_DRIVER(sun50i_usb3_phy) = {
|
||||||
|
+ .name = "sun50i-usb3-phy",
|
||||||
|
+ .id = UCLASS_PHY,
|
||||||
|
+ .of_match = sun50i_usb3_phy_ids,
|
||||||
|
+ .ops = &sun50i_usb3_phy_ops,
|
||||||
|
+ .probe = sun50i_usb3_phy_probe,
|
||||||
|
+ .priv_auto = sizeof(struct sun50i_usb3_phy_priv),
|
||||||
|
+};
|
||||||
|
--
|
||||||
|
2.31.1
|
||||||
|
|
|
@ -0,0 +1,206 @@
|
||||||
|
From 1453bfc951cd05cfee6293b139f8bbefa7c42cb9 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Samuel Holland <samuel@sholland.org>
|
||||||
|
Date: Sun, 7 Feb 2021 23:21:26 -0600
|
||||||
|
Subject: [PATCH 12/29] usb: xhci-pci: Move reset logic out of XHCI core
|
||||||
|
|
||||||
|
Resetting an XHCI controller inside xhci_register undoes any register
|
||||||
|
setup performed by the platform driver. And at least on the Allwinner
|
||||||
|
H6, resetting the XHCI controller also resets the PHY, which prevents
|
||||||
|
the controller from working. That means the controller must be taken out
|
||||||
|
of reset before initializing the PHY, which must be done before calling
|
||||||
|
xhci_register.
|
||||||
|
|
||||||
|
The logic in the XHCI core was added to support the Raspberry Pi 4
|
||||||
|
(although this was not mentioned in the commit log!), which uses the
|
||||||
|
xhci-pci platform driver. Move the reset logic to the platform driver,
|
||||||
|
where it belongs, and where it cannot interfere with other platform
|
||||||
|
drivers.
|
||||||
|
|
||||||
|
This also fixes a failure to call reset_free if xhci_register failed.
|
||||||
|
|
||||||
|
Fixes: 0b80371b350e ("usb: xhci: Add reset controller support")
|
||||||
|
Signed-off-by: Samuel Holland <samuel@sholland.org>
|
||||||
|
---
|
||||||
|
drivers/usb/host/xhci-mem.c | 2 --
|
||||||
|
drivers/usb/host/xhci-pci.c | 51 ++++++++++++++++++++++++++++++++++---
|
||||||
|
drivers/usb/host/xhci.c | 35 -------------------------
|
||||||
|
include/usb/xhci.h | 2 --
|
||||||
|
4 files changed, 47 insertions(+), 43 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/drivers/usb/host/xhci-mem.c b/drivers/usb/host/xhci-mem.c
|
||||||
|
index 1c11c2e7e0..0d9da62bab 100644
|
||||||
|
--- a/drivers/usb/host/xhci-mem.c
|
||||||
|
+++ b/drivers/usb/host/xhci-mem.c
|
||||||
|
@@ -180,8 +180,6 @@ void xhci_cleanup(struct xhci_ctrl *ctrl)
|
||||||
|
xhci_free_virt_devices(ctrl);
|
||||||
|
free(ctrl->erst.entries);
|
||||||
|
free(ctrl->dcbaa);
|
||||||
|
- if (reset_valid(&ctrl->reset))
|
||||||
|
- reset_free(&ctrl->reset);
|
||||||
|
memset(ctrl, '\0', sizeof(struct xhci_ctrl));
|
||||||
|
}
|
||||||
|
|
||||||
|
diff --git a/drivers/usb/host/xhci-pci.c b/drivers/usb/host/xhci-pci.c
|
||||||
|
index aaa243f291..ea8e8f3211 100644
|
||||||
|
--- a/drivers/usb/host/xhci-pci.c
|
||||||
|
+++ b/drivers/usb/host/xhci-pci.c
|
||||||
|
@@ -10,9 +10,14 @@
|
||||||
|
#include <init.h>
|
||||||
|
#include <log.h>
|
||||||
|
#include <pci.h>
|
||||||
|
+#include <reset.h>
|
||||||
|
#include <usb.h>
|
||||||
|
#include <usb/xhci.h>
|
||||||
|
|
||||||
|
+struct xhci_pci_plat {
|
||||||
|
+ struct reset_ctl reset;
|
||||||
|
+};
|
||||||
|
+
|
||||||
|
static int xhci_pci_init(struct udevice *dev, struct xhci_hccr **ret_hccr,
|
||||||
|
struct xhci_hcor **ret_hcor)
|
||||||
|
{
|
||||||
|
@@ -45,15 +50,53 @@ static int xhci_pci_init(struct udevice *dev, struct xhci_hccr **ret_hccr,
|
||||||
|
|
||||||
|
static int xhci_pci_probe(struct udevice *dev)
|
||||||
|
{
|
||||||
|
+ struct xhci_pci_plat = dev_get_plat(dev);
|
||||||
|
struct xhci_hccr *hccr;
|
||||||
|
struct xhci_hcor *hcor;
|
||||||
|
int ret;
|
||||||
|
|
||||||
|
+ ret = reset_get_by_index(dev, 0, &plat->reset);
|
||||||
|
+ if (ret && ret != -ENOENT && ret != -ENOTSUPP) {
|
||||||
|
+ dev_err(dev, "failed to get reset\n");
|
||||||
|
+ return ret;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ if (reset_valid(&plat->reset)) {
|
||||||
|
+ ret = reset_assert(&plat->reset);
|
||||||
|
+ if (ret)
|
||||||
|
+ goto err_reset;
|
||||||
|
+
|
||||||
|
+ ret = reset_deassert(&plat->reset);
|
||||||
|
+ if (ret)
|
||||||
|
+ goto err_reset;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
ret = xhci_pci_init(dev, &hccr, &hcor);
|
||||||
|
if (ret)
|
||||||
|
- return ret;
|
||||||
|
+ goto err_reset;
|
||||||
|
+
|
||||||
|
+ ret = xhci_register(dev, hccr, hcor);
|
||||||
|
+ if (ret)
|
||||||
|
+ goto err_reset;
|
||||||
|
+
|
||||||
|
+ return 0;
|
||||||
|
+
|
||||||
|
+err_reset:
|
||||||
|
+ if (reset_valid(&plat->reset))
|
||||||
|
+ reset_free(&plat->reset);
|
||||||
|
+
|
||||||
|
+ return ret;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+static int xhci_pci_remove(struct udevice *dev)
|
||||||
|
+{
|
||||||
|
+ struct xhci_pci_plat = dev_get_plat(dev);
|
||||||
|
|
||||||
|
- return xhci_register(dev, hccr, hcor);
|
||||||
|
+ xhci_deregister(dev);
|
||||||
|
+ if (reset_valid(&plat->reset))
|
||||||
|
+ reset_free(&plat->reset);
|
||||||
|
+
|
||||||
|
+ return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static const struct udevice_id xhci_pci_ids[] = {
|
||||||
|
@@ -65,10 +108,10 @@ U_BOOT_DRIVER(xhci_pci) = {
|
||||||
|
.name = "xhci_pci",
|
||||||
|
.id = UCLASS_USB,
|
||||||
|
.probe = xhci_pci_probe,
|
||||||
|
- .remove = xhci_deregister,
|
||||||
|
+ .remove = xhci_pci_remove,
|
||||||
|
.of_match = xhci_pci_ids,
|
||||||
|
.ops = &xhci_usb_ops,
|
||||||
|
- .plat_auto = sizeof(struct usb_plat),
|
||||||
|
+ .plat_auto = sizeof(struct xhci_pci_plat),
|
||||||
|
.priv_auto = sizeof(struct xhci_ctrl),
|
||||||
|
.flags = DM_FLAG_OS_PREPARE | DM_FLAG_ALLOC_PRIV_DMA,
|
||||||
|
};
|
||||||
|
diff --git a/drivers/usb/host/xhci.c b/drivers/usb/host/xhci.c
|
||||||
|
index d27ac01c83..452dacc0af 100644
|
||||||
|
--- a/drivers/usb/host/xhci.c
|
||||||
|
+++ b/drivers/usb/host/xhci.c
|
||||||
|
@@ -188,37 +188,6 @@ static int xhci_start(struct xhci_hcor *hcor)
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
-#if CONFIG_IS_ENABLED(DM_USB)
|
||||||
|
-/**
|
||||||
|
- * Resets XHCI Hardware
|
||||||
|
- *
|
||||||
|
- * @param ctrl pointer to host controller
|
||||||
|
- * @return 0 if OK, or a negative error code.
|
||||||
|
- */
|
||||||
|
-static int xhci_reset_hw(struct xhci_ctrl *ctrl)
|
||||||
|
-{
|
||||||
|
- int ret;
|
||||||
|
-
|
||||||
|
- ret = reset_get_by_index(ctrl->dev, 0, &ctrl->reset);
|
||||||
|
- if (ret && ret != -ENOENT && ret != -ENOTSUPP) {
|
||||||
|
- dev_err(ctrl->dev, "failed to get reset\n");
|
||||||
|
- return ret;
|
||||||
|
- }
|
||||||
|
-
|
||||||
|
- if (reset_valid(&ctrl->reset)) {
|
||||||
|
- ret = reset_assert(&ctrl->reset);
|
||||||
|
- if (ret)
|
||||||
|
- return ret;
|
||||||
|
-
|
||||||
|
- ret = reset_deassert(&ctrl->reset);
|
||||||
|
- if (ret)
|
||||||
|
- return ret;
|
||||||
|
- }
|
||||||
|
-
|
||||||
|
- return 0;
|
||||||
|
-}
|
||||||
|
-#endif
|
||||||
|
-
|
||||||
|
/**
|
||||||
|
* Resets the XHCI Controller
|
||||||
|
*
|
||||||
|
@@ -1534,10 +1503,6 @@ int xhci_register(struct udevice *dev, struct xhci_hccr *hccr,
|
||||||
|
|
||||||
|
ctrl->dev = dev;
|
||||||
|
|
||||||
|
- ret = xhci_reset_hw(ctrl);
|
||||||
|
- if (ret)
|
||||||
|
- goto err;
|
||||||
|
-
|
||||||
|
/*
|
||||||
|
* XHCI needs to issue a Address device command to setup
|
||||||
|
* proper device context structures, before it can interact
|
||||||
|
diff --git a/include/usb/xhci.h b/include/usb/xhci.h
|
||||||
|
index 8d95e213b0..01e63cf0fc 100644
|
||||||
|
--- a/include/usb/xhci.h
|
||||||
|
+++ b/include/usb/xhci.h
|
||||||
|
@@ -17,7 +17,6 @@
|
||||||
|
#define HOST_XHCI_H_
|
||||||
|
|
||||||
|
#include <phys2bus.h>
|
||||||
|
-#include <reset.h>
|
||||||
|
#include <asm/types.h>
|
||||||
|
#include <asm/cache.h>
|
||||||
|
#include <asm/io.h>
|
||||||
|
@@ -1200,7 +1199,6 @@ struct xhci_ctrl {
|
||||||
|
#if CONFIG_IS_ENABLED(DM_USB)
|
||||||
|
struct udevice *dev;
|
||||||
|
#endif
|
||||||
|
- struct reset_ctl reset;
|
||||||
|
struct xhci_hccr *hccr; /* R/O registers, not need for volatile */
|
||||||
|
struct xhci_hcor *hcor;
|
||||||
|
struct xhci_doorbell_array *dba;
|
||||||
|
--
|
||||||
|
2.31.1
|
||||||
|
|
|
@ -0,0 +1,118 @@
|
||||||
|
From 03ea01cff249ec4204507e0252464de385fde4a0 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Samuel Holland <samuel@sholland.org>
|
||||||
|
Date: Sat, 30 May 2020 02:57:04 -0500
|
||||||
|
Subject: [PATCH 13/29] usb: xhci-dwc3: Add support for clocks/resets
|
||||||
|
|
||||||
|
Some platforms, like the Allwinner H6, do not have a separate glue layer
|
||||||
|
around the dwc3. Instead, they rely on the clocks/resets/phys referenced
|
||||||
|
from the dwc3 DT node itself. Add support for enabling the clocks/resets
|
||||||
|
referenced from the dwc3 DT node.
|
||||||
|
|
||||||
|
Signed-off-by: Samuel Holland <samuel@sholland.org>
|
||||||
|
---
|
||||||
|
drivers/usb/host/xhci-dwc3.c | 56 ++++++++++++++++++++++++++++++++++++
|
||||||
|
1 file changed, 56 insertions(+)
|
||||||
|
|
||||||
|
diff --git a/drivers/usb/host/xhci-dwc3.c b/drivers/usb/host/xhci-dwc3.c
|
||||||
|
index 3e0ae80cec..5b12d1358e 100644
|
||||||
|
--- a/drivers/usb/host/xhci-dwc3.c
|
||||||
|
+++ b/drivers/usb/host/xhci-dwc3.c
|
||||||
|
@@ -7,10 +7,12 @@
|
||||||
|
* Author: Ramneek Mehresh<ramneek.mehresh@freescale.com>
|
||||||
|
*/
|
||||||
|
|
||||||
|
+#include <clk.h>
|
||||||
|
#include <common.h>
|
||||||
|
#include <dm.h>
|
||||||
|
#include <generic-phy.h>
|
||||||
|
#include <log.h>
|
||||||
|
+#include <reset.h>
|
||||||
|
#include <usb.h>
|
||||||
|
#include <dwc3-uboot.h>
|
||||||
|
#include <linux/delay.h>
|
||||||
|
@@ -21,7 +23,9 @@
|
||||||
|
#include <linux/usb/otg.h>
|
||||||
|
|
||||||
|
struct xhci_dwc3_plat {
|
||||||
|
+ struct clk_bulk clks;
|
||||||
|
struct phy_bulk phys;
|
||||||
|
+ struct reset_ctl_bulk resets;
|
||||||
|
};
|
||||||
|
|
||||||
|
void dwc3_set_mode(struct dwc3 *dwc3_reg, u32 mode)
|
||||||
|
@@ -111,6 +115,46 @@ void dwc3_set_fladj(struct dwc3 *dwc3_reg, u32 val)
|
||||||
|
}
|
||||||
|
|
||||||
|
#if CONFIG_IS_ENABLED(DM_USB)
|
||||||
|
+static int xhci_dwc3_reset_init(struct udevice *dev,
|
||||||
|
+ struct xhci_dwc3_plat *plat)
|
||||||
|
+{
|
||||||
|
+ int ret;
|
||||||
|
+
|
||||||
|
+ ret = reset_get_bulk(dev, &plat->resets);
|
||||||
|
+ if (ret == -ENOTSUPP || ret == -ENOENT)
|
||||||
|
+ return 0;
|
||||||
|
+ else if (ret)
|
||||||
|
+ return ret;
|
||||||
|
+
|
||||||
|
+ ret = reset_deassert_bulk(&plat->resets);
|
||||||
|
+ if (ret) {
|
||||||
|
+ reset_release_bulk(&plat->resets);
|
||||||
|
+ return ret;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ return 0;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+static int xhci_dwc3_clk_init(struct udevice *dev,
|
||||||
|
+ struct xhci_dwc3_plat *plat)
|
||||||
|
+{
|
||||||
|
+ int ret;
|
||||||
|
+
|
||||||
|
+ ret = clk_get_bulk(dev, &plat->clks);
|
||||||
|
+ if (ret == -ENOSYS || ret == -ENOENT)
|
||||||
|
+ return 0;
|
||||||
|
+ if (ret)
|
||||||
|
+ return ret;
|
||||||
|
+
|
||||||
|
+ ret = clk_enable_bulk(&plat->clks);
|
||||||
|
+ if (ret) {
|
||||||
|
+ clk_release_bulk(&plat->clks);
|
||||||
|
+ return ret;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ return 0;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
static int xhci_dwc3_probe(struct udevice *dev)
|
||||||
|
{
|
||||||
|
struct xhci_hcor *hcor;
|
||||||
|
@@ -122,6 +166,14 @@ static int xhci_dwc3_probe(struct udevice *dev)
|
||||||
|
u32 reg;
|
||||||
|
int ret;
|
||||||
|
|
||||||
|
+ ret = xhci_dwc3_reset_init(dev, plat);
|
||||||
|
+ if (ret)
|
||||||
|
+ return ret;
|
||||||
|
+
|
||||||
|
+ ret = xhci_dwc3_clk_init(dev, plat);
|
||||||
|
+ if (ret)
|
||||||
|
+ return ret;
|
||||||
|
+
|
||||||
|
hccr = (struct xhci_hccr *)((uintptr_t)dev_remap_addr(dev));
|
||||||
|
hcor = (struct xhci_hcor *)((uintptr_t)hccr +
|
||||||
|
HC_LENGTH(xhci_readl(&(hccr)->cr_capbase)));
|
||||||
|
@@ -171,6 +223,10 @@ static int xhci_dwc3_remove(struct udevice *dev)
|
||||||
|
|
||||||
|
dwc3_shutdown_phy(dev, &plat->phys);
|
||||||
|
|
||||||
|
+ clk_release_bulk(&plat->clks);
|
||||||
|
+
|
||||||
|
+ reset_release_bulk(&plat->resets);
|
||||||
|
+
|
||||||
|
return xhci_deregister(dev);
|
||||||
|
}
|
||||||
|
|
||||||
|
--
|
||||||
|
2.31.1
|
||||||
|
|
|
@ -0,0 +1,47 @@
|
||||||
|
From 29867a32db349667947c32f966faf22a0f2b0369 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Samuel Holland <samuel@sholland.org>
|
||||||
|
Date: Sat, 30 May 2020 03:39:45 -0500
|
||||||
|
Subject: [PATCH 14/29] configs: Enable USB3 on Allwinner H6 boards
|
||||||
|
|
||||||
|
Pine H64 and Orange Pi 3 both provide a USB3 type A port.
|
||||||
|
Enable it in U-Boot.
|
||||||
|
|
||||||
|
Signed-off-by: Samuel Holland <samuel@sholland.org>
|
||||||
|
---
|
||||||
|
configs/orangepi_3_defconfig | 5 +++++
|
||||||
|
configs/pine_h64_defconfig | 5 +++++
|
||||||
|
2 files changed, 10 insertions(+)
|
||||||
|
|
||||||
|
diff --git a/configs/orangepi_3_defconfig b/configs/orangepi_3_defconfig
|
||||||
|
index 82b9815205..eb25bd9f50 100644
|
||||||
|
--- a/configs/orangepi_3_defconfig
|
||||||
|
+++ b/configs/orangepi_3_defconfig
|
||||||
|
@@ -8,5 +8,10 @@ CONFIG_MMC_SUNXI_SLOT_EXTRA=2
|
||||||
|
CONFIG_BLUETOOTH_DT_DEVICE_FIXUP="brcm,bcm4345c5"
|
||||||
|
CONFIG_DEFAULT_DEVICE_TREE="sun50i-h6-orangepi-3"
|
||||||
|
# CONFIG_SYS_MALLOC_CLEAR_ON_INIT is not set
|
||||||
|
+CONFIG_PHY_SUN50I_USB3=y
|
||||||
|
+CONFIG_USB_XHCI_HCD=y
|
||||||
|
+CONFIG_USB_XHCI_DWC3=y
|
||||||
|
CONFIG_USB_EHCI_HCD=y
|
||||||
|
CONFIG_USB_OHCI_HCD=y
|
||||||
|
+CONFIG_USB_DWC3=y
|
||||||
|
+# CONFIG_USB_DWC3_GADGET is not set
|
||||||
|
diff --git a/configs/pine_h64_defconfig b/configs/pine_h64_defconfig
|
||||||
|
index 2fa66f3834..0095fb222e 100644
|
||||||
|
--- a/configs/pine_h64_defconfig
|
||||||
|
+++ b/configs/pine_h64_defconfig
|
||||||
|
@@ -12,5 +12,10 @@ CONFIG_SPL_SPI_SUNXI=y
|
||||||
|
CONFIG_DEFAULT_DEVICE_TREE="sun50i-h6-pine-h64"
|
||||||
|
# CONFIG_SYS_MALLOC_CLEAR_ON_INIT is not set
|
||||||
|
CONFIG_SUN8I_EMAC=y
|
||||||
|
+CONFIG_PHY_SUN50I_USB3=y
|
||||||
|
+CONFIG_USB_XHCI_HCD=y
|
||||||
|
+CONFIG_USB_XHCI_DWC3=y
|
||||||
|
CONFIG_USB_EHCI_HCD=y
|
||||||
|
CONFIG_USB_OHCI_HCD=y
|
||||||
|
+CONFIG_USB_DWC3=y
|
||||||
|
+# CONFIG_USB_DWC3_GADGET is not set
|
||||||
|
--
|
||||||
|
2.31.1
|
||||||
|
|
|
@ -0,0 +1,181 @@
|
||||||
|
From 0aa9ea61cfbd9b4ddb9339ac1e0f4692bdc831da Mon Sep 17 00:00:00 2001
|
||||||
|
From: Samuel Holland <samuel@sholland.org>
|
||||||
|
Date: Sun, 20 Jun 2021 13:50:35 -0500
|
||||||
|
Subject: [PATCH 15/29] tools: Refactor mkimage linking with OpenSSL
|
||||||
|
|
||||||
|
Some mkimage features require linking with OpenSSL. Instead of linking
|
||||||
|
OpenSSL based on the individual platform symbols, create a single
|
||||||
|
Kconfig symbol which can be selected by platforms as necessary. Then,
|
||||||
|
all OpenSSL-dependent image types can be enabled at once.
|
||||||
|
|
||||||
|
Signed-off-by: Samuel Holland <samuel@sholland.org>
|
||||||
|
---
|
||||||
|
arch/arm/mach-imx/mxs/Kconfig | 2 ++
|
||||||
|
arch/arm/mach-mvebu/Kconfig | 1 +
|
||||||
|
common/Kconfig.boot | 2 ++
|
||||||
|
scripts/config_whitelist.txt | 1 -
|
||||||
|
tools/Kconfig | 3 +++
|
||||||
|
tools/Makefile | 22 +++++++---------------
|
||||||
|
tools/mxsimage.c | 3 ---
|
||||||
|
7 files changed, 15 insertions(+), 19 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/arch/arm/mach-imx/mxs/Kconfig b/arch/arm/mach-imx/mxs/Kconfig
|
||||||
|
index 9f48ffda41..f067a9c38e 100644
|
||||||
|
--- a/arch/arm/mach-imx/mxs/Kconfig
|
||||||
|
+++ b/arch/arm/mach-imx/mxs/Kconfig
|
||||||
|
@@ -3,6 +3,7 @@ if ARCH_MX23
|
||||||
|
config MX23
|
||||||
|
bool
|
||||||
|
default y
|
||||||
|
+ select MKIMAGE_LINK_OPENSSL
|
||||||
|
|
||||||
|
choice
|
||||||
|
prompt "MX23 board select"
|
||||||
|
@@ -34,6 +35,7 @@ if ARCH_MX28
|
||||||
|
config MX28
|
||||||
|
bool
|
||||||
|
default y
|
||||||
|
+ select MKIMAGE_LINK_OPENSSL
|
||||||
|
|
||||||
|
choice
|
||||||
|
prompt "MX28 board select"
|
||||||
|
diff --git a/arch/arm/mach-mvebu/Kconfig b/arch/arm/mach-mvebu/Kconfig
|
||||||
|
index cda65f7478..2a4f861015 100644
|
||||||
|
--- a/arch/arm/mach-mvebu/Kconfig
|
||||||
|
+++ b/arch/arm/mach-mvebu/Kconfig
|
||||||
|
@@ -29,6 +29,7 @@ config ARMADA_38X
|
||||||
|
bool
|
||||||
|
select ARMADA_32BIT
|
||||||
|
select HAVE_MVEBU_EFUSE
|
||||||
|
+ select MKIMAGE_LINK_OPENSSL
|
||||||
|
|
||||||
|
config ARMADA_38X_HS_IMPEDANCE_THRESH
|
||||||
|
hex "Armada 38x USB 2.0 High-Speed Impedance Threshold (0x0 - 0x7)"
|
||||||
|
diff --git a/common/Kconfig.boot b/common/Kconfig.boot
|
||||||
|
index 89a3161f1f..7d022d1ccf 100644
|
||||||
|
--- a/common/Kconfig.boot
|
||||||
|
+++ b/common/Kconfig.boot
|
||||||
|
@@ -80,6 +80,7 @@ config FIT_SIGNATURE
|
||||||
|
select RSA_VERIFY
|
||||||
|
select IMAGE_SIGN_INFO
|
||||||
|
select FIT_FULL_CHECK
|
||||||
|
+ select MKIMAGE_LINK_OPENSSL
|
||||||
|
help
|
||||||
|
This option enables signature verification of FIT uImages,
|
||||||
|
using a hash signed and verified using RSA. If
|
||||||
|
@@ -115,6 +116,7 @@ config FIT_CIPHER
|
||||||
|
bool "Enable ciphering data in a FIT uImages"
|
||||||
|
depends on DM
|
||||||
|
select AES
|
||||||
|
+ select MKIMAGE_LINK_OPENSSL
|
||||||
|
help
|
||||||
|
Enable the feature of data ciphering/unciphering in the tool mkimage
|
||||||
|
and in the u-boot support of the FIT image.
|
||||||
|
diff --git a/scripts/config_whitelist.txt b/scripts/config_whitelist.txt
|
||||||
|
index 3dbcc042a8..e013e1f26a 100644
|
||||||
|
--- a/scripts/config_whitelist.txt
|
||||||
|
+++ b/scripts/config_whitelist.txt
|
||||||
|
@@ -1066,7 +1066,6 @@ CONFIG_MXC_UART_BASE
|
||||||
|
CONFIG_MXC_USB_FLAGS
|
||||||
|
CONFIG_MXC_USB_PORT
|
||||||
|
CONFIG_MXC_USB_PORTSC
|
||||||
|
-CONFIG_MXS
|
||||||
|
CONFIG_MXS_AUART
|
||||||
|
CONFIG_MXS_AUART_BASE
|
||||||
|
CONFIG_MXS_OCOTP
|
||||||
|
diff --git a/tools/Kconfig b/tools/Kconfig
|
||||||
|
index b2f5012240..df3dffa9e1 100644
|
||||||
|
--- a/tools/Kconfig
|
||||||
|
+++ b/tools/Kconfig
|
||||||
|
@@ -9,4 +9,7 @@ config MKIMAGE_DTC_PATH
|
||||||
|
some cases the system dtc may not support all required features
|
||||||
|
and the path to a different version should be given here.
|
||||||
|
|
||||||
|
+config MKIMAGE_LINK_OPENSSL
|
||||||
|
+ bool
|
||||||
|
+
|
||||||
|
endmenu
|
||||||
|
diff --git a/tools/Makefile b/tools/Makefile
|
||||||
|
index d020c55d66..8843185703 100644
|
||||||
|
--- a/tools/Makefile
|
||||||
|
+++ b/tools/Makefile
|
||||||
|
@@ -75,9 +75,10 @@ ECDSA_OBJS-$(CONFIG_FIT_SIGNATURE) := $(addprefix lib/ecdsa/, ecdsa-libcrypto.o)
|
||||||
|
AES_OBJS-$(CONFIG_FIT_CIPHER) := $(addprefix lib/aes/, \
|
||||||
|
aes-encrypt.o aes-decrypt.o)
|
||||||
|
|
||||||
|
-# Cryptographic helpers that depend on openssl/libcrypto
|
||||||
|
-LIBCRYPTO_OBJS-$(CONFIG_FIT_SIGNATURE) := $(addprefix lib/, \
|
||||||
|
- fdt-libcrypto.o)
|
||||||
|
+# Cryptographic helpers and image types that depend on openssl/libcrypto
|
||||||
|
+OPENSSL_OBJS-$(CONFIG_MKIMAGE_LINK_OPENSSL) := \
|
||||||
|
+ lib/fdt-libcrypto.o \
|
||||||
|
+ mxsimage.o \
|
||||||
|
|
||||||
|
ROCKCHIP_OBS = lib/rc4.o rkcommon.o rkimage.o rksd.o rkspi.o
|
||||||
|
|
||||||
|
@@ -101,7 +102,6 @@ dumpimage-mkimage-objs := aisimage.o \
|
||||||
|
kwbimage.o \
|
||||||
|
lib/md5.o \
|
||||||
|
lpc32xximage.o \
|
||||||
|
- mxsimage.o \
|
||||||
|
omapimage.o \
|
||||||
|
os_support.o \
|
||||||
|
pblimage.o \
|
||||||
|
@@ -121,7 +121,7 @@ dumpimage-mkimage-objs := aisimage.o \
|
||||||
|
zynqimage.o \
|
||||||
|
zynqmpimage.o \
|
||||||
|
zynqmpbif.o \
|
||||||
|
- $(LIBCRYPTO_OBJS-y) \
|
||||||
|
+ $(OPENSSL_OBJS-y) \
|
||||||
|
$(LIBFDT_OBJS) \
|
||||||
|
gpimage.o \
|
||||||
|
gpimage-common.o \
|
||||||
|
@@ -136,12 +136,7 @@ fit_info-objs := $(dumpimage-mkimage-objs) fit_info.o
|
||||||
|
fit_check_sign-objs := $(dumpimage-mkimage-objs) fit_check_sign.o
|
||||||
|
file2include-objs := file2include.o
|
||||||
|
|
||||||
|
-ifneq ($(CONFIG_MX23)$(CONFIG_MX28)$(CONFIG_FIT_SIGNATURE),)
|
||||||
|
-# Add CONFIG_MXS into host CFLAGS, so we can check whether or not register
|
||||||
|
-# the mxsimage support within tools/mxsimage.c .
|
||||||
|
-HOSTCFLAGS_mxsimage.o += -DCONFIG_MXS
|
||||||
|
-endif
|
||||||
|
-
|
||||||
|
+ifneq ($(CONFIG_MKIMAGE_LINK_OPENSSL),)
|
||||||
|
ifdef CONFIG_FIT_SIGNATURE
|
||||||
|
# This affects include/image.h, but including the board config file
|
||||||
|
# is tricky, so manually define this options here.
|
||||||
|
@@ -159,12 +154,9 @@ ifdef CONFIG_SYS_U_BOOT_OFFS
|
||||||
|
HOSTCFLAGS_kwbimage.o += -DCONFIG_SYS_U_BOOT_OFFS=$(CONFIG_SYS_U_BOOT_OFFS)
|
||||||
|
endif
|
||||||
|
|
||||||
|
-ifneq ($(CONFIG_ARMADA_38X),)
|
||||||
|
+# Enable image features which depend on OpenSSL.
|
||||||
|
HOSTCFLAGS_kwbimage.o += -DCONFIG_KWB_SECURE
|
||||||
|
-endif
|
||||||
|
|
||||||
|
-# MXSImage needs LibSSL
|
||||||
|
-ifneq ($(CONFIG_MX23)$(CONFIG_MX28)$(CONFIG_ARMADA_38X)$(CONFIG_FIT_SIGNATURE)$(CONFIG_FIT_CIPHER),)
|
||||||
|
HOSTCFLAGS_kwbimage.o += \
|
||||||
|
$(shell pkg-config --cflags libssl libcrypto 2> /dev/null || echo "")
|
||||||
|
HOSTLDLIBS_mkimage += \
|
||||||
|
diff --git a/tools/mxsimage.c b/tools/mxsimage.c
|
||||||
|
index 002f4b525a..2bfbb421eb 100644
|
||||||
|
--- a/tools/mxsimage.c
|
||||||
|
+++ b/tools/mxsimage.c
|
||||||
|
@@ -5,8 +5,6 @@
|
||||||
|
* Copyright (C) 2012-2013 Marek Vasut <marex@denx.de>
|
||||||
|
*/
|
||||||
|
|
||||||
|
-#ifdef CONFIG_MXS
|
||||||
|
-
|
||||||
|
#include <errno.h>
|
||||||
|
#include <fcntl.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
@@ -2363,4 +2361,3 @@ U_BOOT_IMAGE_TYPE(
|
||||||
|
NULL,
|
||||||
|
mxsimage_generate
|
||||||
|
);
|
||||||
|
-#endif
|
||||||
|
--
|
||||||
|
2.31.1
|
||||||
|
|
File diff suppressed because it is too large
Load diff
|
@ -0,0 +1,99 @@
|
||||||
|
From 4bb23c0a439a47e34c04ce4c117465e669918f26 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Samuel Holland <samuel@sholland.org>
|
||||||
|
Date: Sun, 20 Jun 2021 14:23:11 -0500
|
||||||
|
Subject: [PATCH 17/29] sunxi: Support both SPL image types
|
||||||
|
|
||||||
|
SPL uses the image header to detect the boot device and to find the
|
||||||
|
offset of U-Boot proper. Since this information is stored differently in
|
||||||
|
eGON and TOC0 image headers, add code to find the correct value based on
|
||||||
|
the image type currently in use.
|
||||||
|
|
||||||
|
Signed-off-by: Samuel Holland <samuel@sholland.org>
|
||||||
|
---
|
||||||
|
arch/arm/include/asm/arch-sunxi/spl.h | 2 --
|
||||||
|
arch/arm/mach-sunxi/board.c | 20 ++++++++++++++------
|
||||||
|
include/sunxi_image.h | 14 ++++++++++++++
|
||||||
|
3 files changed, 28 insertions(+), 8 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/arch/arm/include/asm/arch-sunxi/spl.h b/arch/arm/include/asm/arch-sunxi/spl.h
|
||||||
|
index 58cdf806d9..157b11e489 100644
|
||||||
|
--- a/arch/arm/include/asm/arch-sunxi/spl.h
|
||||||
|
+++ b/arch/arm/include/asm/arch-sunxi/spl.h
|
||||||
|
@@ -19,8 +19,6 @@
|
||||||
|
#define SUNXI_BOOTED_FROM_MMC0_HIGH 0x10
|
||||||
|
#define SUNXI_BOOTED_FROM_MMC2_HIGH 0x12
|
||||||
|
|
||||||
|
-#define is_boot0_magic(addr) (memcmp((void *)(addr), BOOT0_MAGIC, 8) == 0)
|
||||||
|
-
|
||||||
|
uint32_t sunxi_get_boot_device(void);
|
||||||
|
|
||||||
|
#endif
|
||||||
|
diff --git a/arch/arm/mach-sunxi/board.c b/arch/arm/mach-sunxi/board.c
|
||||||
|
index 9b84132eda..8147f250f8 100644
|
||||||
|
--- a/arch/arm/mach-sunxi/board.c
|
||||||
|
+++ b/arch/arm/mach-sunxi/board.c
|
||||||
|
@@ -237,10 +237,13 @@ void s_init(void)
|
||||||
|
|
||||||
|
static int sunxi_get_boot_source(void)
|
||||||
|
{
|
||||||
|
- if (!is_boot0_magic(SPL_ADDR + 4)) /* eGON.BT0 */
|
||||||
|
- return SUNXI_INVALID_BOOT_SOURCE;
|
||||||
|
+ if (is_egon_image((void *)SPL_ADDR))
|
||||||
|
+ return ((struct boot_file_head *)SPL_ADDR)->boot_media;
|
||||||
|
+ if (is_toc0_image((void *)SPL_ADDR))
|
||||||
|
+ return ((struct toc0_main_info *)SPL_ADDR)->platform[0];
|
||||||
|
|
||||||
|
- return readb(SPL_ADDR + 0x28);
|
||||||
|
+ /* Not a valid BROM image, so we must have been booted via FEL. */
|
||||||
|
+ return SUNXI_INVALID_BOOT_SOURCE;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* The sunxi internal brom will try to loader external bootloader
|
||||||
|
@@ -285,13 +288,18 @@ uint32_t sunxi_get_boot_device(void)
|
||||||
|
return -1; /* Never reached */
|
||||||
|
}
|
||||||
|
|
||||||
|
+#define is_toc0_magic(foo) true
|
||||||
|
+
|
||||||
|
#ifdef CONFIG_SPL_BUILD
|
||||||
|
static u32 sunxi_get_spl_size(void)
|
||||||
|
{
|
||||||
|
- if (!is_boot0_magic(SPL_ADDR + 4)) /* eGON.BT0 */
|
||||||
|
- return 0;
|
||||||
|
+ if (is_egon_image((void *)SPL_ADDR))
|
||||||
|
+ return ((struct boot_file_head *)SPL_ADDR)->length;
|
||||||
|
+ if (is_toc0_image((void *)SPL_ADDR))
|
||||||
|
+ return ((struct toc0_main_info *)SPL_ADDR)->length;
|
||||||
|
|
||||||
|
- return readl(SPL_ADDR + 0x10);
|
||||||
|
+ /* Unknown size, so fall back to the default offset. */
|
||||||
|
+ return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
diff --git a/include/sunxi_image.h b/include/sunxi_image.h
|
||||||
|
index bdf80ec0e0..b0424b6b7f 100644
|
||||||
|
--- a/include/sunxi_image.h
|
||||||
|
+++ b/include/sunxi_image.h
|
||||||
|
@@ -270,4 +270,18 @@ struct toc0_key_item {
|
||||||
|
sizeof(struct toc0_key_item), \
|
||||||
|
32)
|
||||||
|
|
||||||
|
+static inline bool is_egon_image(void *addr)
|
||||||
|
+{
|
||||||
|
+ struct boot_file_head *head = addr;
|
||||||
|
+
|
||||||
|
+ return memcmp(head->magic, BOOT0_MAGIC, 8) == 0;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+static inline bool is_toc0_image(void *addr)
|
||||||
|
+{
|
||||||
|
+ struct toc0_main_info *main = addr;
|
||||||
|
+
|
||||||
|
+ return memcmp(main->name, TOC0_MAIN_INFO_NAME, 8) == 0;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
#endif
|
||||||
|
--
|
||||||
|
2.31.1
|
||||||
|
|
|
@ -0,0 +1,77 @@
|
||||||
|
From 84fbf777e029e28cf0cd182f8bf5e1c41c3b2c93 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Samuel Holland <samuel@sholland.org>
|
||||||
|
Date: Sun, 20 Jun 2021 14:24:29 -0500
|
||||||
|
Subject: [PATCH 18/29] sunxi: Support building a SPL as a TOC0 image
|
||||||
|
|
||||||
|
Now that mkimage can generate TOC0 images, and the SPL can interpret
|
||||||
|
them, hook up the build infrastructure so the user can choose which
|
||||||
|
image type to build.
|
||||||
|
|
||||||
|
Signed-off-by: Samuel Holland <samuel@sholland.org>
|
||||||
|
---
|
||||||
|
arch/arm/mach-sunxi/Kconfig | 2 ++
|
||||||
|
board/sunxi/Kconfig | 24 ++++++++++++++++++++++++
|
||||||
|
scripts/Makefile.spl | 3 ++-
|
||||||
|
3 files changed, 28 insertions(+), 1 deletion(-)
|
||||||
|
create mode 100644 board/sunxi/Kconfig
|
||||||
|
|
||||||
|
diff --git a/arch/arm/mach-sunxi/Kconfig b/arch/arm/mach-sunxi/Kconfig
|
||||||
|
index bc8509b72a..4c466325f3 100644
|
||||||
|
--- a/arch/arm/mach-sunxi/Kconfig
|
||||||
|
+++ b/arch/arm/mach-sunxi/Kconfig
|
||||||
|
@@ -1088,6 +1088,8 @@ config BLUETOOTH_DT_DEVICE_FIXUP
|
||||||
|
The used address is "bdaddr" if set, and "ethaddr" with the LSB
|
||||||
|
flipped elsewise.
|
||||||
|
|
||||||
|
+source "board/sunxi/Kconfig"
|
||||||
|
+
|
||||||
|
endif
|
||||||
|
|
||||||
|
config CHIP_DIP_SCAN
|
||||||
|
diff --git a/board/sunxi/Kconfig b/board/sunxi/Kconfig
|
||||||
|
new file mode 100644
|
||||||
|
index 0000000000..c5c0929db5
|
||||||
|
--- /dev/null
|
||||||
|
+++ b/board/sunxi/Kconfig
|
||||||
|
@@ -0,0 +1,24 @@
|
||||||
|
+choice
|
||||||
|
+ prompt "SPL Image Type"
|
||||||
|
+ default SUNXI_SPL_IMAGE_EGON
|
||||||
|
+
|
||||||
|
+config SUNXI_SPL_IMAGE_EGON
|
||||||
|
+ bool "eGON (non-secure)"
|
||||||
|
+ help
|
||||||
|
+ Select this option to embed the SPL binary in an eGON.BT0 image,
|
||||||
|
+ which is compatible with the non-secure boot ROM (NBROM).
|
||||||
|
+
|
||||||
|
+ This is usually the correct option to choose.
|
||||||
|
+
|
||||||
|
+config SUNXI_SPL_IMAGE_TOC0
|
||||||
|
+ bool "TOC0 (secure)"
|
||||||
|
+ help
|
||||||
|
+ Select this option to embed the SPL binary in a TOC0 image,
|
||||||
|
+ which is compatible with the secure boot ROM (SBROM).
|
||||||
|
+
|
||||||
|
+endchoice
|
||||||
|
+
|
||||||
|
+config SUNXI_SPL_IMAGE_TYPE
|
||||||
|
+ string
|
||||||
|
+ default "sunxi_egon" if SUNXI_SPL_IMAGE_EGON
|
||||||
|
+ default "sunxi_toc0" if SUNXI_SPL_IMAGE_TOC0
|
||||||
|
diff --git a/scripts/Makefile.spl b/scripts/Makefile.spl
|
||||||
|
index 5be1a9ba1b..7cc78bb318 100644
|
||||||
|
--- a/scripts/Makefile.spl
|
||||||
|
+++ b/scripts/Makefile.spl
|
||||||
|
@@ -414,7 +414,8 @@ endif
|
||||||
|
$(obj)/$(SPL_BIN).sfp: $(obj)/$(SPL_BIN).bin FORCE
|
||||||
|
$(call if_changed,mkimage)
|
||||||
|
|
||||||
|
-MKIMAGEFLAGS_sunxi-spl.bin = -T sunxi_egon \
|
||||||
|
+MKIMAGEFLAGS_sunxi-spl.bin = -T $(CONFIG_SUNXI_SPL_IMAGE_TYPE) \
|
||||||
|
+ -a $(CONFIG_SPL_TEXT_BASE) \
|
||||||
|
-n $(CONFIG_DEFAULT_DEVICE_TREE)
|
||||||
|
|
||||||
|
OBJCOPYFLAGS_u-boot-spl-dtb.hex := -I binary -O ihex --change-address=$(CONFIG_SPL_TEXT_BASE)
|
||||||
|
--
|
||||||
|
2.31.1
|
||||||
|
|
|
@ -0,0 +1,55 @@
|
||||||
|
From 91ceaa78ab678743d5b998657160dc3f82a99944 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Andre Przywara <andre.przywara@arm.com>
|
||||||
|
Date: Wed, 28 Apr 2021 23:53:04 +0100
|
||||||
|
Subject: [PATCH 19/29] sunxi: H616: Enable full 4GB of DRAM
|
||||||
|
|
||||||
|
The H616 is our first supported Allwinner SoC which goes beyond the 4GB
|
||||||
|
address space "barrier", by having more than 32 address bits.
|
||||||
|
|
||||||
|
Lift the preliminary 3GB DRAM limit for the H616, and update the page
|
||||||
|
table setup on the way, to actually map that last GB as well.
|
||||||
|
|
||||||
|
This will presumably break the EMAC, as the DMA descriptors only hold
|
||||||
|
32 bits worth of addresses, but this is no problem for now, as all
|
||||||
|
boards with 4GB of DRAM cannot use the EMAC at the moment (missing
|
||||||
|
PHY support).
|
||||||
|
|
||||||
|
Signed-off-by: Andre Przywara <andre.przywara@arm.com>
|
||||||
|
---
|
||||||
|
arch/arm/mach-sunxi/Kconfig | 4 ++--
|
||||||
|
arch/arm/mach-sunxi/board.c | 2 +-
|
||||||
|
2 files changed, 3 insertions(+), 3 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/arch/arm/mach-sunxi/Kconfig b/arch/arm/mach-sunxi/Kconfig
|
||||||
|
index d409ab3051..b0191d0080 100644
|
||||||
|
--- a/arch/arm/mach-sunxi/Kconfig
|
||||||
|
+++ b/arch/arm/mach-sunxi/Kconfig
|
||||||
|
@@ -191,10 +191,10 @@ config MACH_SUNXI_H3_H5
|
||||||
|
select SUPPORT_SPL
|
||||||
|
|
||||||
|
# TODO: try out A80's 8GiB DRAM space
|
||||||
|
-# TODO: H616 supports 4 GiB DRAM space
|
||||||
|
config SUNXI_DRAM_MAX_SIZE
|
||||||
|
hex
|
||||||
|
- default 0xC0000000 if MACH_SUN50I || MACH_SUN50I_H5 || MACH_SUN50I_H6 || MACH_SUN50I_H616
|
||||||
|
+ default 0x100000000 if MACH_SUN50I_H616
|
||||||
|
+ default 0xC0000000 if MACH_SUN50I || MACH_SUN50I_H5 || MACH_SUN50I_H6
|
||||||
|
default 0x80000000
|
||||||
|
|
||||||
|
choice
|
||||||
|
diff --git a/arch/arm/mach-sunxi/board.c b/arch/arm/mach-sunxi/board.c
|
||||||
|
index 8147f250f8..fe9d292e8e 100644
|
||||||
|
--- a/arch/arm/mach-sunxi/board.c
|
||||||
|
+++ b/arch/arm/mach-sunxi/board.c
|
||||||
|
@@ -56,7 +56,7 @@ static struct mm_region sunxi_mem_map[] = {
|
||||||
|
/* RAM */
|
||||||
|
.virt = 0x40000000UL,
|
||||||
|
.phys = 0x40000000UL,
|
||||||
|
- .size = 0xC0000000UL,
|
||||||
|
+ .size = CONFIG_SUNXI_DRAM_MAX_SIZE,
|
||||||
|
.attrs = PTE_BLOCK_MEMTYPE(MT_NORMAL) |
|
||||||
|
PTE_BLOCK_INNER_SHARE
|
||||||
|
}, {
|
||||||
|
--
|
||||||
|
2.31.1
|
||||||
|
|
|
@ -0,0 +1,36 @@
|
||||||
|
From 793378573dbb8a3ad041dfd769cd6c23ce61f45a Mon Sep 17 00:00:00 2001
|
||||||
|
From: Samuel Holland <samuel@sholland.org>
|
||||||
|
Date: Sat, 17 Apr 2021 14:21:45 -0500
|
||||||
|
Subject: [PATCH 20/29] sunxi: DT: H6: Add USB3 to Pine H64 DTS
|
||||||
|
|
||||||
|
Signed-off-by: Samuel Holland <samuel@sholland.org>
|
||||||
|
---
|
||||||
|
arch/arm/dts/sun50i-h6-pine-h64.dts | 8 ++++++++
|
||||||
|
1 file changed, 8 insertions(+)
|
||||||
|
|
||||||
|
diff --git a/arch/arm/dts/sun50i-h6-pine-h64.dts b/arch/arm/dts/sun50i-h6-pine-h64.dts
|
||||||
|
index 961732c52a..76f84ad184 100644
|
||||||
|
--- a/arch/arm/dts/sun50i-h6-pine-h64.dts
|
||||||
|
+++ b/arch/arm/dts/sun50i-h6-pine-h64.dts
|
||||||
|
@@ -89,6 +89,10 @@
|
||||||
|
status = "okay";
|
||||||
|
};
|
||||||
|
|
||||||
|
+&dwc3 {
|
||||||
|
+ status = "okay";
|
||||||
|
+};
|
||||||
|
+
|
||||||
|
&ehci0 {
|
||||||
|
status = "okay";
|
||||||
|
};
|
||||||
|
@@ -331,3 +335,7 @@
|
||||||
|
usb3_vbus-supply = <®_usb_vbus>;
|
||||||
|
status = "okay";
|
||||||
|
};
|
||||||
|
+
|
||||||
|
+&usb3phy {
|
||||||
|
+ status = "okay";
|
||||||
|
+};
|
||||||
|
--
|
||||||
|
2.31.1
|
||||||
|
|
|
@ -0,0 +1,63 @@
|
||||||
|
From 7342a9cb423ef2f58566387d7cfb9325fce92293 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Samuel Holland <samuel@sholland.org>
|
||||||
|
Date: Sat, 17 Apr 2021 14:08:31 -0500
|
||||||
|
Subject: [PATCH 21/29] sunxi: Select environment MMC based on boot device
|
||||||
|
|
||||||
|
Currently, the environment is always stored in eMMC if eMMC is enabled
|
||||||
|
in the config. This means images written to SD and eMMC will cross-
|
||||||
|
contaminate their environments unless the configuration is changed.
|
||||||
|
|
||||||
|
By dropping the device number from the environment location string and
|
||||||
|
implementing mmc_get_env_dev, we will always use the environment from
|
||||||
|
the boot device when booting from SD/eMMC.
|
||||||
|
|
||||||
|
Signed-off-by: Samuel Holland <samuel@sholland.org>
|
||||||
|
---
|
||||||
|
board/sunxi/board.c | 14 ++++++++++++++
|
||||||
|
env/Kconfig | 3 +--
|
||||||
|
2 files changed, 15 insertions(+), 2 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/board/sunxi/board.c b/board/sunxi/board.c
|
||||||
|
index 21651a1bfc..b97ca578f7 100644
|
||||||
|
--- a/board/sunxi/board.c
|
||||||
|
+++ b/board/sunxi/board.c
|
||||||
|
@@ -623,6 +623,20 @@ int board_mmc_init(struct bd_info *bis)
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
+
|
||||||
|
+#if CONFIG_MMC_SUNXI_SLOT_EXTRA != -1
|
||||||
|
+int mmc_get_env_dev(void)
|
||||||
|
+{
|
||||||
|
+ switch (sunxi_get_boot_device()) {
|
||||||
|
+ case BOOT_DEVICE_MMC1:
|
||||||
|
+ return 0;
|
||||||
|
+ case BOOT_DEVICE_MMC2:
|
||||||
|
+ return 1;
|
||||||
|
+ default:
|
||||||
|
+ return CONFIG_SYS_MMC_ENV_DEV;
|
||||||
|
+ }
|
||||||
|
+}
|
||||||
|
+#endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef CONFIG_SPL_BUILD
|
||||||
|
diff --git a/env/Kconfig b/env/Kconfig
|
||||||
|
index 1411f9e815..cccde2d855 100644
|
||||||
|
--- a/env/Kconfig
|
||||||
|
+++ b/env/Kconfig
|
||||||
|
@@ -444,10 +444,9 @@ config ENV_FAT_INTERFACE
|
||||||
|
config ENV_FAT_DEVICE_AND_PART
|
||||||
|
string "Device and partition for where to store the environemt in FAT"
|
||||||
|
depends on ENV_IS_IN_FAT
|
||||||
|
+ default ":auto" if ARCH_SUNXI
|
||||||
|
default "0:1" if TI_COMMON_CMD_OPTIONS
|
||||||
|
default "0:auto" if ARCH_ZYNQ || ARCH_ZYNQMP || ARCH_VERSAL
|
||||||
|
- default "0:auto" if ARCH_SUNXI && MMC_SUNXI_SLOT_EXTRA = -1
|
||||||
|
- default "1:auto" if ARCH_SUNXI && MMC_SUNXI_SLOT_EXTRA != -1
|
||||||
|
default "0" if ARCH_AT91
|
||||||
|
help
|
||||||
|
Define this to a string to specify the partition of the device. It can
|
||||||
|
--
|
||||||
|
2.31.1
|
||||||
|
|
|
@ -0,0 +1,63 @@
|
||||||
|
From 8f57cff6cb93478f665564f7ef493b7d85053124 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Samuel Holland <samuel@sholland.org>
|
||||||
|
Date: Sat, 17 Apr 2021 10:43:58 -0500
|
||||||
|
Subject: [PATCH 22/29] sunxi: Load sun8i secure monitor to SRAM A2
|
||||||
|
|
||||||
|
Most sun6i-derived SoCs contain SRAM A2, a secure SRAM area for ARISC
|
||||||
|
SCP firmware. H3 has a smaller SRAM than other SoCs (A31/A33/A23/A83T).
|
||||||
|
|
||||||
|
On sun8i SoCs which do not have SRAM B, we can use part of this SRAM for
|
||||||
|
the secure monitor. Follow the design of 64-bit SoCs and use the first
|
||||||
|
part for the monitor, and the last 16 KiB for the SCP firmware. With
|
||||||
|
this change, the monitor no longer needs to reserve a region in DRAM.
|
||||||
|
|
||||||
|
Signed-off-by: Samuel Holland <samuel@sholland.org>
|
||||||
|
---
|
||||||
|
arch/arm/include/asm/arch-sunxi/cpu_sun4i.h | 11 +++++++++++
|
||||||
|
include/configs/sun8i.h | 7 +++++++
|
||||||
|
2 files changed, 18 insertions(+)
|
||||||
|
|
||||||
|
diff --git a/arch/arm/include/asm/arch-sunxi/cpu_sun4i.h b/arch/arm/include/asm/arch-sunxi/cpu_sun4i.h
|
||||||
|
index 02ce73954d..d4c795d89c 100644
|
||||||
|
--- a/arch/arm/include/asm/arch-sunxi/cpu_sun4i.h
|
||||||
|
+++ b/arch/arm/include/asm/arch-sunxi/cpu_sun4i.h
|
||||||
|
@@ -11,7 +11,18 @@
|
||||||
|
#define SUNXI_SRAM_A1_BASE 0x00000000
|
||||||
|
#define SUNXI_SRAM_A1_SIZE (16 * 1024) /* 16 kiB */
|
||||||
|
|
||||||
|
+#if defined(CONFIG_SUNXI_GEN_SUN6I) && \
|
||||||
|
+ !defined(CONFIG_MACH_SUN8I_R40) && \
|
||||||
|
+ !defined(CONFIG_MACH_SUN8I_V3S)
|
||||||
|
+#define SUNXI_SRAM_A2_BASE 0x00040000
|
||||||
|
+#ifdef CONFIG_MACH_SUN8I_H3
|
||||||
|
+#define SUNXI_SRAM_A2_SIZE (48 * 1024) /* 16+32 kiB */
|
||||||
|
+#else
|
||||||
|
+#define SUNXI_SRAM_A2_SIZE (80 * 1024) /* 16+64 kiB */
|
||||||
|
+#endif
|
||||||
|
+#else
|
||||||
|
#define SUNXI_SRAM_A2_BASE 0x00004000 /* 16 kiB */
|
||||||
|
+#endif
|
||||||
|
#define SUNXI_SRAM_A3_BASE 0x00008000 /* 13 kiB */
|
||||||
|
#define SUNXI_SRAM_A4_BASE 0x0000b400 /* 3 kiB */
|
||||||
|
#define SUNXI_SRAM_D_BASE 0x00010000 /* 4 kiB */
|
||||||
|
diff --git a/include/configs/sun8i.h b/include/configs/sun8i.h
|
||||||
|
index 9b4675e4c3..545d27996c 100644
|
||||||
|
--- a/include/configs/sun8i.h
|
||||||
|
+++ b/include/configs/sun8i.h
|
||||||
|
@@ -12,6 +12,13 @@
|
||||||
|
* A23 specific configuration
|
||||||
|
*/
|
||||||
|
|
||||||
|
+/*
|
||||||
|
+ * Skip the first 16 KiB of SRAM A2, which is not usable, as only certain bytes
|
||||||
|
+ * are writable. Reserve the last 17 KiB for the resume shim and SCP firmware.
|
||||||
|
+ */
|
||||||
|
+#define CONFIG_ARMV7_SECURE_BASE (SUNXI_SRAM_A2_BASE + 16 * 1024)
|
||||||
|
+#define CONFIG_ARMV7_SECURE_MAX_SIZE (SUNXI_SRAM_A2_SIZE - 33 * 1024)
|
||||||
|
+
|
||||||
|
/*
|
||||||
|
* Include common sunxi configuration where most the settings are
|
||||||
|
*/
|
||||||
|
--
|
||||||
|
2.31.1
|
||||||
|
|
|
@ -0,0 +1,177 @@
|
||||||
|
From 0612580e68fa584d415f8080f65da2d4873664fe Mon Sep 17 00:00:00 2001
|
||||||
|
From: Ondrej Jirman <megous@megous.com>
|
||||||
|
Date: Tue, 11 Feb 2020 14:10:05 +0100
|
||||||
|
Subject: [PATCH 23/29] pinephone: Add volume_key environment variable
|
||||||
|
|
||||||
|
When the user has a volume key pressed volume_key variable will
|
||||||
|
contain either value 'down' or 'up', otherwise it will be empty.
|
||||||
|
|
||||||
|
Signed-off-by: Ondrej Jirman <megous@megous.com>
|
||||||
|
---
|
||||||
|
board/sunxi/Makefile | 1 +
|
||||||
|
board/sunxi/board.c | 18 ++++++++++
|
||||||
|
board/sunxi/lradc.c | 81 ++++++++++++++++++++++++++++++++++++++++++++
|
||||||
|
board/sunxi/lradc.h | 11 ++++++
|
||||||
|
4 files changed, 111 insertions(+)
|
||||||
|
create mode 100644 board/sunxi/lradc.c
|
||||||
|
create mode 100644 board/sunxi/lradc.h
|
||||||
|
|
||||||
|
diff --git a/board/sunxi/Makefile b/board/sunxi/Makefile
|
||||||
|
index d96b7897b6..a096a5c771 100644
|
||||||
|
--- a/board/sunxi/Makefile
|
||||||
|
+++ b/board/sunxi/Makefile
|
||||||
|
@@ -12,3 +12,4 @@ obj-$(CONFIG_MACH_SUN4I) += dram_sun4i_auto.o
|
||||||
|
obj-$(CONFIG_MACH_SUN5I) += dram_sun5i_auto.o
|
||||||
|
obj-$(CONFIG_MACH_SUN7I) += dram_sun5i_auto.o
|
||||||
|
obj-$(CONFIG_CHIP_DIP_SCAN) += chip.o
|
||||||
|
+obj-$(CONFIG_MACH_SUN50I) += lradc.o
|
||||||
|
diff --git a/board/sunxi/board.c b/board/sunxi/board.c
|
||||||
|
index b97ca578f7..2bc9883092 100644
|
||||||
|
--- a/board/sunxi/board.c
|
||||||
|
+++ b/board/sunxi/board.c
|
||||||
|
@@ -46,6 +46,7 @@
|
||||||
|
#include <spl.h>
|
||||||
|
#include <sy8106a.h>
|
||||||
|
#include <asm/setup.h>
|
||||||
|
+#include "lradc.h"
|
||||||
|
|
||||||
|
#if defined CONFIG_VIDEO_LCD_PANEL_I2C && !(defined CONFIG_SPL_BUILD)
|
||||||
|
/* So that we can use pin names in Kconfig and sunxi_name_to_gpio() */
|
||||||
|
@@ -659,6 +660,12 @@ void sunxi_board_init(void)
|
||||||
|
{
|
||||||
|
int power_failed = 0;
|
||||||
|
|
||||||
|
+#ifdef CONFIG_MACH_SUN50I
|
||||||
|
+ // we init the lradc in SPL to get the ADC started early to have
|
||||||
|
+ // a valid sample when U-Boot main binary gets executed.
|
||||||
|
+ lradc_enable();
|
||||||
|
+#endif
|
||||||
|
+
|
||||||
|
#ifdef CONFIG_SY8106A_POWER
|
||||||
|
power_failed = sy8106a_set_vout1(CONFIG_SY8106A_VOUT1_VOLT);
|
||||||
|
#endif
|
||||||
|
@@ -933,6 +940,17 @@ int misc_init_r(void)
|
||||||
|
env_set("fdtfile", str);
|
||||||
|
}
|
||||||
|
|
||||||
|
+#ifdef CONFIG_MACH_SUN50I
|
||||||
|
+ int key = lradc_get_pressed_key();
|
||||||
|
+ if (key == KEY_VOLUMEDOWN)
|
||||||
|
+ env_set("volume_key", "down");
|
||||||
|
+ else if (key == KEY_VOLUMEUP)
|
||||||
|
+ env_set("volume_key", "up");
|
||||||
|
+
|
||||||
|
+ // no longer needed
|
||||||
|
+ lradc_disable();
|
||||||
|
+#endif
|
||||||
|
+
|
||||||
|
setup_environment(gd->fdt_blob);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
diff --git a/board/sunxi/lradc.c b/board/sunxi/lradc.c
|
||||||
|
new file mode 100644
|
||||||
|
index 0000000000..693b198e25
|
||||||
|
--- /dev/null
|
||||||
|
+++ b/board/sunxi/lradc.c
|
||||||
|
@@ -0,0 +1,81 @@
|
||||||
|
+#include <common.h>
|
||||||
|
+#include <asm/io.h>
|
||||||
|
+#include "lradc.h"
|
||||||
|
+
|
||||||
|
+#define LRADC_BASE 0x1c21800
|
||||||
|
+
|
||||||
|
+#define LRADC_CTRL (LRADC_BASE + 0x00)
|
||||||
|
+#define LRADC_INTC (LRADC_BASE + 0x04)
|
||||||
|
+#define LRADC_INTS (LRADC_BASE + 0x08)
|
||||||
|
+#define LRADC_DATA0 (LRADC_BASE + 0x0c)
|
||||||
|
+#define LRADC_DATA1 (LRADC_BASE + 0x10)
|
||||||
|
+
|
||||||
|
+/* LRADC_CTRL bits */
|
||||||
|
+#define FIRST_CONVERT_DLY(x) ((x) << 24) /* 8 bits */
|
||||||
|
+#define CHAN_SELECT(x) ((x) << 22) /* 2 bits */
|
||||||
|
+#define CONTINUE_TIME_SEL(x) ((x) << 16) /* 4 bits */
|
||||||
|
+#define KEY_MODE_SEL(x) ((x) << 12) /* 2 bits */
|
||||||
|
+#define LEVELA_B_CNT(x) ((x) << 8) /* 4 bits */
|
||||||
|
+#define HOLD_KEY_EN(x) ((x) << 7)
|
||||||
|
+#define HOLD_EN(x) ((x) << 6)
|
||||||
|
+#define LEVELB_VOL(x) ((x) << 4) /* 2 bits */
|
||||||
|
+#define SAMPLE_RATE(x) ((x) << 2) /* 2 bits */
|
||||||
|
+#define ENABLE(x) ((x) << 0)
|
||||||
|
+
|
||||||
|
+/* LRADC_INTC and LRADC_INTS bits */
|
||||||
|
+#define CHAN1_KEYUP_IRQ BIT(12)
|
||||||
|
+#define CHAN1_ALRDY_HOLD_IRQ BIT(11)
|
||||||
|
+#define CHAN1_HOLD_IRQ BIT(10)
|
||||||
|
+#define CHAN1_KEYDOWN_IRQ BIT(9)
|
||||||
|
+#define CHAN1_DATA_IRQ BIT(8)
|
||||||
|
+#define CHAN0_KEYUP_IRQ BIT(4)
|
||||||
|
+#define CHAN0_ALRDY_HOLD_IRQ BIT(3)
|
||||||
|
+#define CHAN0_HOLD_IRQ BIT(2)
|
||||||
|
+#define CHAN0_KEYDOWN_IRQ BIT(1)
|
||||||
|
+#define CHAN0_DATA_IRQ BIT(0)
|
||||||
|
+
|
||||||
|
+// this is for PinePhone only
|
||||||
|
+
|
||||||
|
+int lradc_get_pressed_key(void)
|
||||||
|
+{
|
||||||
|
+ uint32_t val;
|
||||||
|
+ uint32_t vref = 3000000 * 2 / 3;
|
||||||
|
+
|
||||||
|
+ val = readl(LRADC_DATA0) & 0x3f;
|
||||||
|
+ val = val * vref / 63;
|
||||||
|
+
|
||||||
|
+// printf("lradc=%u\n", val);
|
||||||
|
+
|
||||||
|
+ if (val < 200000) // 158730
|
||||||
|
+ return KEY_VOLUMEUP;
|
||||||
|
+ else if (val < 400000) // 349206
|
||||||
|
+ return KEY_VOLUMEDOWN;
|
||||||
|
+
|
||||||
|
+ return 0;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+void lradc_enable(void)
|
||||||
|
+{
|
||||||
|
+ // aldo3 is always on and defaults to 3V
|
||||||
|
+
|
||||||
|
+ writel(0xffffffff, LRADC_INTS);
|
||||||
|
+ writel(0, LRADC_INTC);
|
||||||
|
+
|
||||||
|
+ /*
|
||||||
|
+ * Set sample time to 4 ms / 250 Hz. Wait 2 * 4 ms for key to
|
||||||
|
+ * stabilize on press, wait (1 + 1) * 4 ms for key release
|
||||||
|
+ */
|
||||||
|
+ writel(FIRST_CONVERT_DLY(0) | LEVELA_B_CNT(0) | HOLD_EN(0) |
|
||||||
|
+ SAMPLE_RATE(0) | ENABLE(1), LRADC_CTRL);
|
||||||
|
+
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+void lradc_disable(void)
|
||||||
|
+{
|
||||||
|
+ writel(0xffffffff, LRADC_INTS);
|
||||||
|
+ writel(0, LRADC_INTC);
|
||||||
|
+
|
||||||
|
+ /* Disable lradc, leave other settings unchanged */
|
||||||
|
+ writel(FIRST_CONVERT_DLY(2) | LEVELA_B_CNT(1) | HOLD_EN(1) |
|
||||||
|
+ SAMPLE_RATE(2), LRADC_CTRL);
|
||||||
|
+}
|
||||||
|
diff --git a/board/sunxi/lradc.h b/board/sunxi/lradc.h
|
||||||
|
new file mode 100644
|
||||||
|
index 0000000000..c908401b5b
|
||||||
|
--- /dev/null
|
||||||
|
+++ b/board/sunxi/lradc.h
|
||||||
|
@@ -0,0 +1,11 @@
|
||||||
|
+#pragma once
|
||||||
|
+
|
||||||
|
+enum {
|
||||||
|
+ KEY_NONE = 0,
|
||||||
|
+ KEY_VOLUMEDOWN = 1,
|
||||||
|
+ KEY_VOLUMEUP = 2,
|
||||||
|
+};
|
||||||
|
+
|
||||||
|
+int lradc_get_pressed_key(void);
|
||||||
|
+void lradc_enable(void);
|
||||||
|
+void lradc_disable(void);
|
||||||
|
--
|
||||||
|
2.31.1
|
||||||
|
|
|
@ -0,0 +1,58 @@
|
||||||
|
From bbb3d10356bcbf931a63a70610f1e7869eeebd21 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Marius Gripsgard <marius@ubports.com>
|
||||||
|
Date: Tue, 5 May 2020 16:51:13 +0200
|
||||||
|
Subject: [PATCH 24/29] Enable led on boot to notify user of boot status
|
||||||
|
|
||||||
|
---
|
||||||
|
arch/arm/mach-sunxi/Kconfig | 5 +++++
|
||||||
|
board/sunxi/board.c | 6 ++++++
|
||||||
|
configs/pinephone_defconfig | 1 +
|
||||||
|
3 files changed, 12 insertions(+)
|
||||||
|
|
||||||
|
diff --git a/arch/arm/mach-sunxi/Kconfig b/arch/arm/mach-sunxi/Kconfig
|
||||||
|
index b0191d0080..7a46bb4481 100644
|
||||||
|
--- a/arch/arm/mach-sunxi/Kconfig
|
||||||
|
+++ b/arch/arm/mach-sunxi/Kconfig
|
||||||
|
@@ -1,5 +1,10 @@
|
||||||
|
if ARCH_SUNXI
|
||||||
|
|
||||||
|
+config PINEPHONE_LEDS
|
||||||
|
+ bool "Notify boot status via LEDs on PinePhone"
|
||||||
|
+ ---help---
|
||||||
|
+ LED boot notification.
|
||||||
|
+
|
||||||
|
config SPL_LDSCRIPT
|
||||||
|
default "arch/arm/cpu/armv7/sunxi/u-boot-spl.lds" if !ARM64
|
||||||
|
|
||||||
|
diff --git a/board/sunxi/board.c b/board/sunxi/board.c
|
||||||
|
index 2bc9883092..59f7c2c5f1 100644
|
||||||
|
--- a/board/sunxi/board.c
|
||||||
|
+++ b/board/sunxi/board.c
|
||||||
|
@@ -666,6 +666,12 @@ void sunxi_board_init(void)
|
||||||
|
lradc_enable();
|
||||||
|
#endif
|
||||||
|
|
||||||
|
+#ifdef CONFIG_PINEPHONE_LEDS
|
||||||
|
+ /* PD18:G PD19:R PD20:B */
|
||||||
|
+ gpio_request(SUNXI_GPD(19), "led:red");
|
||||||
|
+ gpio_direction_output(SUNXI_GPD(19), 1);
|
||||||
|
+#endif
|
||||||
|
+
|
||||||
|
#ifdef CONFIG_SY8106A_POWER
|
||||||
|
power_failed = sy8106a_set_vout1(CONFIG_SY8106A_VOUT1_VOLT);
|
||||||
|
#endif
|
||||||
|
diff --git a/configs/pinephone_defconfig b/configs/pinephone_defconfig
|
||||||
|
index 64ecef59c9..623265d719 100644
|
||||||
|
--- a/configs/pinephone_defconfig
|
||||||
|
+++ b/configs/pinephone_defconfig
|
||||||
|
@@ -1,6 +1,7 @@
|
||||||
|
CONFIG_ARM=y
|
||||||
|
CONFIG_ARCH_SUNXI=y
|
||||||
|
CONFIG_SPL=y
|
||||||
|
+CONFIG_PINEPHONE_LEDS=y
|
||||||
|
CONFIG_MACH_SUN50I=y
|
||||||
|
CONFIG_SUNXI_DRAM_LPDDR3_STOCK=y
|
||||||
|
CONFIG_DRAM_CLK=552
|
||||||
|
--
|
||||||
|
2.31.1
|
||||||
|
|
21
temp/u-boot-pinephone/0025-disable-bootdelay.patch
Normal file
21
temp/u-boot-pinephone/0025-disable-bootdelay.patch
Normal file
|
@ -0,0 +1,21 @@
|
||||||
|
From 89cb280f35abc0f2b0b66ddec035d1ebf1674e64 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Marius Gripsgard <marius@ubports.com>
|
||||||
|
Date: Mon, 4 May 2020 22:28:42 +0200
|
||||||
|
Subject: [PATCH 25/29] disable bootdelay
|
||||||
|
|
||||||
|
---
|
||||||
|
configs/pinephone_defconfig | 1 +
|
||||||
|
1 file changed, 1 insertion(+)
|
||||||
|
|
||||||
|
diff --git a/configs/pinephone_defconfig b/configs/pinephone_defconfig
|
||||||
|
index 623265d719..d8ee930a69 100644
|
||||||
|
--- a/configs/pinephone_defconfig
|
||||||
|
+++ b/configs/pinephone_defconfig
|
||||||
|
@@ -11,3 +11,4 @@ CONFIG_PINEPHONE_DT_SELECTION=y
|
||||||
|
CONFIG_DEFAULT_DEVICE_TREE="sun50i-a64-pinephone-1.2"
|
||||||
|
# CONFIG_SYS_MALLOC_CLEAR_ON_INIT is not set
|
||||||
|
CONFIG_OF_LIST="sun50i-a64-pinephone-1.1 sun50i-a64-pinephone-1.2"
|
||||||
|
+CONFIG_BOOTDELAY=0
|
||||||
|
--
|
||||||
|
2.31.1
|
||||||
|
|
|
@ -0,0 +1,26 @@
|
||||||
|
From 880f5035decae44a5be943875f35ed9d9efc011d Mon Sep 17 00:00:00 2001
|
||||||
|
From: Dalton Durst <dalton@ubports.com>
|
||||||
|
Date: Wed, 10 Mar 2021 11:44:07 -0600
|
||||||
|
Subject: [PATCH 26/29] Reduce DRAM speed to 528 for better compatibility with
|
||||||
|
all PinePhones
|
||||||
|
|
||||||
|
---
|
||||||
|
configs/pinephone_defconfig | 2 +-
|
||||||
|
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||||
|
|
||||||
|
diff --git a/configs/pinephone_defconfig b/configs/pinephone_defconfig
|
||||||
|
index d8ee930a69..702e2bdc14 100644
|
||||||
|
--- a/configs/pinephone_defconfig
|
||||||
|
+++ b/configs/pinephone_defconfig
|
||||||
|
@@ -4,7 +4,7 @@ CONFIG_SPL=y
|
||||||
|
CONFIG_PINEPHONE_LEDS=y
|
||||||
|
CONFIG_MACH_SUN50I=y
|
||||||
|
CONFIG_SUNXI_DRAM_LPDDR3_STOCK=y
|
||||||
|
-CONFIG_DRAM_CLK=552
|
||||||
|
+CONFIG_DRAM_CLK=528
|
||||||
|
CONFIG_DRAM_ZQ=3881949
|
||||||
|
CONFIG_MMC_SUNXI_SLOT_EXTRA=2
|
||||||
|
CONFIG_PINEPHONE_DT_SELECTION=y
|
||||||
|
--
|
||||||
|
2.31.1
|
||||||
|
|
|
@ -0,0 +1,354 @@
|
||||||
|
From b0950e4696b391578f7428337e41fa8ca14b225d Mon Sep 17 00:00:00 2001
|
||||||
|
From: Ondrej Jirman <megous@megous.com>
|
||||||
|
Date: Wed, 11 Sep 2019 20:45:28 +0200
|
||||||
|
Subject: [PATCH 27/29] mmc: sunxi: Add support for DMA transfers
|
||||||
|
|
||||||
|
Allwinner MMC controller supports DMA via internal DMA controller,
|
||||||
|
use it.
|
||||||
|
|
||||||
|
Signed-off-by: Ondrej Jirman <megous@megous.com>
|
||||||
|
---
|
||||||
|
arch/arm/include/asm/arch-sunxi/mmc.h | 7 +
|
||||||
|
drivers/mmc/sunxi_mmc.c | 204 +++++++++++++++++++++++---
|
||||||
|
2 files changed, 192 insertions(+), 19 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/arch/arm/include/asm/arch-sunxi/mmc.h b/arch/arm/include/asm/arch-sunxi/mmc.h
|
||||||
|
index 5daacf10eb..dc8ea6f43a 100644
|
||||||
|
--- a/arch/arm/include/asm/arch-sunxi/mmc.h
|
||||||
|
+++ b/arch/arm/include/asm/arch-sunxi/mmc.h
|
||||||
|
@@ -112,6 +112,10 @@ struct sunxi_mmc {
|
||||||
|
SUNXI_MMC_RINT_COMMAND_DONE | \
|
||||||
|
SUNXI_MMC_RINT_VOLTAGE_CHANGE_DONE)
|
||||||
|
|
||||||
|
+#define SUNXI_MMC_FTRGLEVEL_BURST_SIZE(v) (((v) & 0x7) << 28)
|
||||||
|
+#define SUNXI_MMC_FTRGLEVEL_RX_TL(v) (((v) & 0xfff) << 16)
|
||||||
|
+#define SUNXI_MMC_FTRGLEVEL_TX_TL(v) (((v) & 0xffff) << 0)
|
||||||
|
+
|
||||||
|
#define SUNXI_MMC_STATUS_RXWL_FLAG (0x1 << 0)
|
||||||
|
#define SUNXI_MMC_STATUS_TXWL_FLAG (0x1 << 1)
|
||||||
|
#define SUNXI_MMC_STATUS_FIFO_EMPTY (0x1 << 2)
|
||||||
|
@@ -130,6 +134,9 @@ struct sunxi_mmc {
|
||||||
|
#define SUNXI_MMC_IDIE_TXIRQ (0x1 << 0)
|
||||||
|
#define SUNXI_MMC_IDIE_RXIRQ (0x1 << 1)
|
||||||
|
|
||||||
|
+#define SUNXI_MMC_IDST_TXIRQ (0x1 << 0)
|
||||||
|
+#define SUNXI_MMC_IDST_RXIRQ (0x1 << 1)
|
||||||
|
+
|
||||||
|
#define SUNXI_MMC_COMMON_CLK_GATE (1 << 16)
|
||||||
|
#define SUNXI_MMC_COMMON_RESET (1 << 18)
|
||||||
|
|
||||||
|
diff --git a/drivers/mmc/sunxi_mmc.c b/drivers/mmc/sunxi_mmc.c
|
||||||
|
index 28af8e6ac5..47c947cdb8 100644
|
||||||
|
--- a/drivers/mmc/sunxi_mmc.c
|
||||||
|
+++ b/drivers/mmc/sunxi_mmc.c
|
||||||
|
@@ -9,6 +9,7 @@
|
||||||
|
|
||||||
|
#include <common.h>
|
||||||
|
#include <dm.h>
|
||||||
|
+#include <cpu_func.h>
|
||||||
|
#include <errno.h>
|
||||||
|
#include <log.h>
|
||||||
|
#include <malloc.h>
|
||||||
|
@@ -27,6 +28,27 @@
|
||||||
|
#define CCM_MMC_CTRL_MODE_SEL_NEW 0
|
||||||
|
#endif
|
||||||
|
|
||||||
|
+#define DMA_CONFIG_DIC BIT(1) // flag: disable interrupt after this descriptor's buffer is processed
|
||||||
|
+#define DMA_CONFIG_LAST BIT(2) // flag: last descriptor
|
||||||
|
+#define DMA_CONFIG_FIRST BIT(3) // flag: first descriptor
|
||||||
|
+#define DMA_CONFIG_CHAIN BIT(4) // flag: buf_addr_ptr2 points to next descriptor
|
||||||
|
+#define DMA_CONFIG_ERROR BIT(30) // flag: out: error happened
|
||||||
|
+#define DMA_CONFIG_HOLD BIT(31) // flag: desc owned by IDMAC (set to 1)
|
||||||
|
+
|
||||||
|
+#if defined(CONFIG_MACH_SUN50I)
|
||||||
|
+// mmc2 on A64 only allows for 8k
|
||||||
|
+#define DMA_BUF_MAX_SIZE (1 << 13)
|
||||||
|
+#else
|
||||||
|
+#define DMA_BUF_MAX_SIZE (1 << 16)
|
||||||
|
+#endif
|
||||||
|
+
|
||||||
|
+struct sunxi_idma_desc {
|
||||||
|
+ u32 config;
|
||||||
|
+ u32 buf_size;
|
||||||
|
+ u32 buf_addr_ptr1;
|
||||||
|
+ u32 buf_addr_ptr2;
|
||||||
|
+};
|
||||||
|
+
|
||||||
|
struct sunxi_mmc_plat {
|
||||||
|
struct mmc_config cfg;
|
||||||
|
struct mmc mmc;
|
||||||
|
@@ -39,6 +61,8 @@ struct sunxi_mmc_priv {
|
||||||
|
struct gpio_desc cd_gpio; /* Change Detect GPIO */
|
||||||
|
struct sunxi_mmc *reg;
|
||||||
|
struct mmc_config cfg;
|
||||||
|
+ unsigned n_dma_descs;
|
||||||
|
+ struct sunxi_idma_desc* dma_descs;
|
||||||
|
};
|
||||||
|
|
||||||
|
#if !CONFIG_IS_ENABLED(DM_MMC)
|
||||||
|
@@ -318,7 +342,7 @@ static int mmc_trans_data_by_cpu(struct sunxi_mmc_priv *priv, struct mmc *mmc,
|
||||||
|
if (timeout_msecs < 2000)
|
||||||
|
timeout_msecs = 2000;
|
||||||
|
|
||||||
|
- /* Always read / write data through the CPU */
|
||||||
|
+ /* Read / write data through the CPU */
|
||||||
|
setbits_le32(&priv->reg->gctrl, SUNXI_MMC_GCTRL_ACCESS_BY_AHB);
|
||||||
|
|
||||||
|
start = get_timer(0);
|
||||||
|
@@ -328,7 +352,7 @@ static int mmc_trans_data_by_cpu(struct sunxi_mmc_priv *priv, struct mmc *mmc,
|
||||||
|
|
||||||
|
while ((status = readl(&priv->reg->status)) & status_bit) {
|
||||||
|
if (get_timer(start) > timeout_msecs)
|
||||||
|
- return -1;
|
||||||
|
+ return -ETIMEDOUT;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
@@ -360,21 +384,142 @@ static int mmc_trans_data_by_cpu(struct sunxi_mmc_priv *priv, struct mmc *mmc,
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
+static void flush_cache_auto_align(void* buf, size_t len)
|
||||||
|
+{
|
||||||
|
+ uintptr_t mask = ~((uintptr_t)CONFIG_SYS_CACHELINE_SIZE - 1);
|
||||||
|
+ uintptr_t start = (uintptr_t)buf & mask;
|
||||||
|
+
|
||||||
|
+ len = (len + 2 * CONFIG_SYS_CACHELINE_SIZE) & mask;
|
||||||
|
+
|
||||||
|
+ flush_cache(start, len);
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+static int mmc_trans_data_by_dma(struct sunxi_mmc_priv *priv, struct mmc *mmc,
|
||||||
|
+ struct mmc_data *data)
|
||||||
|
+{
|
||||||
|
+ const int reading = !!(data->flags & MMC_DATA_READ);
|
||||||
|
+ uint8_t *buff = (uint8_t*)(reading ? data->dest : data->src);
|
||||||
|
+ unsigned byte_cnt = data->blocksize * data->blocks;
|
||||||
|
+ unsigned i, n_desc, last_block_size;
|
||||||
|
+ u32 rval;
|
||||||
|
+
|
||||||
|
+ /* data pointer and transfer size needs to be aligned to 4 bytes */
|
||||||
|
+
|
||||||
|
+ /* Read / write data through IDMAC */
|
||||||
|
+ clrbits_le32(&priv->reg->gctrl, SUNXI_MMC_GCTRL_ACCESS_BY_AHB);
|
||||||
|
+
|
||||||
|
+ n_desc = byte_cnt / DMA_BUF_MAX_SIZE;
|
||||||
|
+ last_block_size = byte_cnt % DMA_BUF_MAX_SIZE;
|
||||||
|
+ if (last_block_size)
|
||||||
|
+ n_desc++;
|
||||||
|
+
|
||||||
|
+ if (n_desc > priv->n_dma_descs)
|
||||||
|
+ return -ENOMEM;
|
||||||
|
+
|
||||||
|
+ memset(priv->dma_descs, 0, sizeof(struct sunxi_idma_desc) * n_desc);
|
||||||
|
+
|
||||||
|
+ for (i = 0; i < n_desc; i++) {
|
||||||
|
+ struct sunxi_idma_desc* desc = &priv->dma_descs[i];
|
||||||
|
+ bool is_last = i == n_desc - 1;
|
||||||
|
+ bool is_first = i == 0;
|
||||||
|
+
|
||||||
|
+ desc->config = DMA_CONFIG_CHAIN | DMA_CONFIG_HOLD
|
||||||
|
+ | (is_last ? DMA_CONFIG_LAST : DMA_CONFIG_DIC)
|
||||||
|
+ | (is_first ? DMA_CONFIG_FIRST : 0);
|
||||||
|
+
|
||||||
|
+ if (is_last && last_block_size)
|
||||||
|
+ desc->buf_size = last_block_size;
|
||||||
|
+ else
|
||||||
|
+ desc->buf_size = DMA_BUF_MAX_SIZE;
|
||||||
|
+
|
||||||
|
+ desc->buf_addr_ptr1 = (uintptr_t)buff + i * DMA_BUF_MAX_SIZE;
|
||||||
|
+ if (!is_last)
|
||||||
|
+ desc->buf_addr_ptr2 = (uintptr_t)(desc + 1);
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ /*
|
||||||
|
+ * Make sure everyhting needed for a transfer is in DRAM.
|
||||||
|
+ */
|
||||||
|
+
|
||||||
|
+ flush_cache_auto_align(buff, byte_cnt);
|
||||||
|
+ flush_cache_auto_align(priv->dma_descs,
|
||||||
|
+ sizeof(struct sunxi_idma_desc) * n_desc);
|
||||||
|
+
|
||||||
|
+ dsb();
|
||||||
|
+ isb();
|
||||||
|
+
|
||||||
|
+ /* dma enable */
|
||||||
|
+ setbits_le32(&priv->reg->gctrl, SUNXI_MMC_GCTRL_DMA_RESET
|
||||||
|
+ | SUNXI_MMC_GCTRL_DMA_ENABLE);
|
||||||
|
+
|
||||||
|
+ /* idma reset */
|
||||||
|
+ writel(SUNXI_MMC_IDMAC_RESET, &priv->reg->dmac);
|
||||||
|
+
|
||||||
|
+ /* wait idma reset done */
|
||||||
|
+ while (readl(&priv->reg->dmac) & SUNXI_MMC_IDMAC_RESET);
|
||||||
|
+
|
||||||
|
+ /* idma on */
|
||||||
|
+ writel(SUNXI_MMC_IDMAC_ENABLE | SUNXI_MMC_IDMAC_FIXBURST,
|
||||||
|
+ &priv->reg->dmac);
|
||||||
|
+
|
||||||
|
+ /* enable interrupt flags */
|
||||||
|
+ rval = readl(&priv->reg->idie)
|
||||||
|
+ & ~(SUNXI_MMC_IDIE_RXIRQ | SUNXI_MMC_IDIE_TXIRQ);
|
||||||
|
+ rval |= reading ? SUNXI_MMC_IDIE_RXIRQ : SUNXI_MMC_IDIE_TXIRQ;
|
||||||
|
+ writel(rval, &priv->reg->idie);
|
||||||
|
+
|
||||||
|
+ /* set address of the first descriptor */
|
||||||
|
+ writel((uintptr_t)priv->dma_descs, &priv->reg->dlba);
|
||||||
|
+
|
||||||
|
+ /* set fifo fill tresholds for issuing dma */
|
||||||
|
+
|
||||||
|
+#if defined(CONFIG_MACH_SUN50I) || defined(CONFIG_MACH_SUN50I_H6)
|
||||||
|
+ if (priv->mmc_no == 2) {
|
||||||
|
+ // for mmc 2 we need to set this differently
|
||||||
|
+ writel(SUNXI_MMC_FTRGLEVEL_BURST_SIZE(3) // burst-16
|
||||||
|
+ | SUNXI_MMC_FTRGLEVEL_RX_TL(15)
|
||||||
|
+ | SUNXI_MMC_FTRGLEVEL_TX_TL(240),
|
||||||
|
+ &priv->reg->ftrglevel);
|
||||||
|
+ } else {
|
||||||
|
+ writel(SUNXI_MMC_FTRGLEVEL_BURST_SIZE(2) // burst-8
|
||||||
|
+ | SUNXI_MMC_FTRGLEVEL_RX_TL(7)
|
||||||
|
+ | SUNXI_MMC_FTRGLEVEL_TX_TL(248),
|
||||||
|
+ &priv->reg->ftrglevel);
|
||||||
|
+ }
|
||||||
|
+#else
|
||||||
|
+ writel(SUNXI_MMC_FTRGLEVEL_BURST_SIZE(2) // burst-8
|
||||||
|
+ | SUNXI_MMC_FTRGLEVEL_RX_TL(7)
|
||||||
|
+ | SUNXI_MMC_FTRGLEVEL_TX_TL(8),
|
||||||
|
+ &priv->reg->ftrglevel);
|
||||||
|
+#endif
|
||||||
|
+
|
||||||
|
+ writel(0xffffffff, &priv->reg->idst);
|
||||||
|
+
|
||||||
|
+ return 0;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
static int mmc_rint_wait(struct sunxi_mmc_priv *priv, struct mmc *mmc,
|
||||||
|
- uint timeout_msecs, uint done_bit, const char *what)
|
||||||
|
+ uint timeout_msecs, uint done_bit, bool wait_dma,
|
||||||
|
+ const char *what)
|
||||||
|
{
|
||||||
|
unsigned int status;
|
||||||
|
unsigned long start = get_timer(0);
|
||||||
|
+ bool dma_done = true;
|
||||||
|
|
||||||
|
do {
|
||||||
|
status = readl(&priv->reg->rint);
|
||||||
|
+
|
||||||
|
if ((get_timer(start) > timeout_msecs) ||
|
||||||
|
(status & SUNXI_MMC_RINT_INTERRUPT_ERROR_BIT)) {
|
||||||
|
debug("%s timeout %x\n", what,
|
||||||
|
status & SUNXI_MMC_RINT_INTERRUPT_ERROR_BIT);
|
||||||
|
return -ETIMEDOUT;
|
||||||
|
}
|
||||||
|
- } while (!(status & done_bit));
|
||||||
|
+
|
||||||
|
+ if (wait_dma)
|
||||||
|
+ dma_done = readl(&priv->reg->idst)
|
||||||
|
+ & (SUNXI_MMC_IDST_TXIRQ | SUNXI_MMC_IDST_RXIRQ);
|
||||||
|
+ } while (!(status & done_bit) || !dma_done);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
@@ -388,6 +533,7 @@ static int sunxi_mmc_send_cmd_common(struct sunxi_mmc_priv *priv,
|
||||||
|
int error = 0;
|
||||||
|
unsigned int status = 0;
|
||||||
|
unsigned int bytecnt = 0;
|
||||||
|
+ bool usedma = false;
|
||||||
|
|
||||||
|
if (priv->fatal_err)
|
||||||
|
return -1;
|
||||||
|
@@ -424,42 +570,45 @@ static int sunxi_mmc_send_cmd_common(struct sunxi_mmc_priv *priv,
|
||||||
|
cmd->cmdidx, cmdval | cmd->cmdidx, cmd->cmdarg);
|
||||||
|
writel(cmd->cmdarg, &priv->reg->arg);
|
||||||
|
|
||||||
|
- if (!data)
|
||||||
|
- writel(cmdval | cmd->cmdidx, &priv->reg->cmd);
|
||||||
|
-
|
||||||
|
/*
|
||||||
|
* transfer data and check status
|
||||||
|
* STATREG[2] : FIFO empty
|
||||||
|
* STATREG[3] : FIFO full
|
||||||
|
*/
|
||||||
|
if (data) {
|
||||||
|
- int ret = 0;
|
||||||
|
-
|
||||||
|
bytecnt = data->blocksize * data->blocks;
|
||||||
|
debug("trans data %d bytes\n", bytecnt);
|
||||||
|
- writel(cmdval | cmd->cmdidx, &priv->reg->cmd);
|
||||||
|
- ret = mmc_trans_data_by_cpu(priv, mmc, data);
|
||||||
|
- if (ret) {
|
||||||
|
- error = readl(&priv->reg->rint) &
|
||||||
|
- SUNXI_MMC_RINT_INTERRUPT_ERROR_BIT;
|
||||||
|
- error = -ETIMEDOUT;
|
||||||
|
- goto out;
|
||||||
|
+
|
||||||
|
+ if (bytecnt > 64 && !IS_ENABLED(SPL_BUILD)) {
|
||||||
|
+ debug(" using dma %d\n", bytecnt);
|
||||||
|
+ error = mmc_trans_data_by_dma(priv, mmc, data);
|
||||||
|
+ writel(cmdval | cmd->cmdidx, &priv->reg->cmd);
|
||||||
|
+ usedma = true;
|
||||||
|
+ } else {
|
||||||
|
+ debug(" using pio\n");
|
||||||
|
+ writel(cmdval | cmd->cmdidx, &priv->reg->cmd);
|
||||||
|
+ error = mmc_trans_data_by_cpu(priv, mmc, data);
|
||||||
|
}
|
||||||
|
+
|
||||||
|
+ if (error)
|
||||||
|
+ goto out;
|
||||||
|
+ } else {
|
||||||
|
+ writel(cmdval | cmd->cmdidx, &priv->reg->cmd);
|
||||||
|
}
|
||||||
|
|
||||||
|
error = mmc_rint_wait(priv, mmc, 1000, SUNXI_MMC_RINT_COMMAND_DONE,
|
||||||
|
- "cmd");
|
||||||
|
+ false, "cmd");
|
||||||
|
if (error)
|
||||||
|
goto out;
|
||||||
|
|
||||||
|
if (data) {
|
||||||
|
- timeout_msecs = 120;
|
||||||
|
+ timeout_msecs = 10000;
|
||||||
|
debug("cacl timeout %x msec\n", timeout_msecs);
|
||||||
|
error = mmc_rint_wait(priv, mmc, timeout_msecs,
|
||||||
|
data->blocks > 1 ?
|
||||||
|
SUNXI_MMC_RINT_AUTO_COMMAND_DONE :
|
||||||
|
SUNXI_MMC_RINT_DATA_OVER,
|
||||||
|
- "data");
|
||||||
|
+ usedma, "data");
|
||||||
|
if (error)
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
|
@@ -491,6 +640,14 @@ static int sunxi_mmc_send_cmd_common(struct sunxi_mmc_priv *priv,
|
||||||
|
debug("mmc resp 0x%08x\n", cmd->response[0]);
|
||||||
|
}
|
||||||
|
out:
|
||||||
|
+ if (data && usedma) {
|
||||||
|
+ //status = readl(®->idst);
|
||||||
|
+ writel(0, &priv->reg->idie);
|
||||||
|
+ writel(0xffffffff, &priv->reg->idst);
|
||||||
|
+ writel(0, &priv->reg->dmac);
|
||||||
|
+ clrbits_le32(&priv->reg->gctrl, SUNXI_MMC_GCTRL_DMA_ENABLE);
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
if (error < 0) {
|
||||||
|
writel(SUNXI_MMC_GCTRL_RESET, &priv->reg->gctrl);
|
||||||
|
mmc_update_clk(priv);
|
||||||
|
@@ -674,6 +831,15 @@ static int sunxi_mmc_probe(struct udevice *dev)
|
||||||
|
|
||||||
|
priv->reg = dev_read_addr_ptr(dev);
|
||||||
|
|
||||||
|
+ // make sure we have enough space for descritors for BLK_SIZE * b_max
|
||||||
|
+ priv->n_dma_descs = 512 * 65536 / DMA_BUF_MAX_SIZE;
|
||||||
|
+ priv->dma_descs = malloc(sizeof(struct sunxi_idma_desc)
|
||||||
|
+ * priv->n_dma_descs);
|
||||||
|
+ if (priv->dma_descs == NULL) {
|
||||||
|
+ debug("init mmc alloc failed\n");
|
||||||
|
+ return -ENOMEM;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
/* We don't have a sunxi clock driver so find the clock address here */
|
||||||
|
ret = dev_read_phandle_with_args(dev, "clocks", "#clock-cells", 0,
|
||||||
|
1, &args);
|
||||||
|
--
|
||||||
|
2.31.1
|
||||||
|
|
|
@ -0,0 +1,50 @@
|
||||||
|
From 1af4c86329397bc553122c650226bd5c7acb1ed0 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Ondrej Jirman <megous@megous.com>
|
||||||
|
Date: Fri, 13 Sep 2019 22:14:43 +0200
|
||||||
|
Subject: [PATCH 28/29] mmc: sunxi: DDR/DMA support for SPL
|
||||||
|
|
||||||
|
---
|
||||||
|
drivers/mmc/sunxi_mmc.c | 16 +++++++++++++++-
|
||||||
|
1 file changed, 15 insertions(+), 1 deletion(-)
|
||||||
|
|
||||||
|
diff --git a/drivers/mmc/sunxi_mmc.c b/drivers/mmc/sunxi_mmc.c
|
||||||
|
index 47c947cdb8..855dfd35d9 100644
|
||||||
|
--- a/drivers/mmc/sunxi_mmc.c
|
||||||
|
+++ b/drivers/mmc/sunxi_mmc.c
|
||||||
|
@@ -579,7 +579,12 @@ static int sunxi_mmc_send_cmd_common(struct sunxi_mmc_priv *priv,
|
||||||
|
bytecnt = data->blocksize * data->blocks;
|
||||||
|
debug("trans data %d bytes\n", bytecnt);
|
||||||
|
|
||||||
|
- if (bytecnt > 64 && !IS_ENABLED(SPL_BUILD)) {
|
||||||
|
+ // DMA doesn't work when the target is SRAM for some reason.
|
||||||
|
+ int reading = !!(data->flags & MMC_DATA_READ);
|
||||||
|
+ uint8_t* buf = (uint8_t*)(reading ? data->dest : data->src);
|
||||||
|
+ bool is_dram = (uintptr_t)buf >= 0x4000000;
|
||||||
|
+
|
||||||
|
+ if (bytecnt > 64 && is_dram) {
|
||||||
|
debug(" using dma %d\n", bytecnt);
|
||||||
|
error = mmc_trans_data_by_dma(priv, mmc, data);
|
||||||
|
writel(cmdval | cmd->cmdidx, &priv->reg->cmd);
|
||||||
|
@@ -715,10 +720,19 @@ struct mmc *sunxi_mmc_init(int sdc_no)
|
||||||
|
|
||||||
|
cfg->host_caps |= MMC_MODE_HS_52MHz | MMC_MODE_HS;
|
||||||
|
cfg->b_max = CONFIG_SYS_MMC_MAX_BLK_COUNT;
|
||||||
|
+ if (sdc_no == 2)
|
||||||
|
+ cfg->host_caps |= MMC_MODE_DDR_52MHz;
|
||||||
|
|
||||||
|
cfg->f_min = 400000;
|
||||||
|
cfg->f_max = 52000000;
|
||||||
|
|
||||||
|
+ // enough descs for a realy big u-boot (4MiB)
|
||||||
|
+ priv->n_dma_descs = 4*1024*1024 / DMA_BUF_MAX_SIZE;
|
||||||
|
+ priv->dma_descs = malloc(sizeof(struct sunxi_idma_desc)
|
||||||
|
+ * priv->n_dma_descs);
|
||||||
|
+ if (priv->dma_descs == NULL)
|
||||||
|
+ return NULL;
|
||||||
|
+
|
||||||
|
if (mmc_resource_init(sdc_no) != 0)
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
--
|
||||||
|
2.31.1
|
||||||
|
|
148
temp/u-boot-pinephone/0029-spl-ARM-Enable-CPU-caches.patch
Normal file
148
temp/u-boot-pinephone/0029-spl-ARM-Enable-CPU-caches.patch
Normal file
|
@ -0,0 +1,148 @@
|
||||||
|
From 6ad822cb4d64beda76cade8761c49b55620a8b5b Mon Sep 17 00:00:00 2001
|
||||||
|
From: Ondrej Jirman <megous@megous.com>
|
||||||
|
Date: Tue, 14 Jan 2020 03:56:32 +0100
|
||||||
|
Subject: [PATCH 29/29] spl: ARM: Enable CPU caches
|
||||||
|
|
||||||
|
http://u-boot.10912.n7.nabble.com/RFC-PATCH-0-3-spl-Add-D-cache-support-td274750.html
|
||||||
|
|
||||||
|
Signed-off-by: Ondrej Jirman <megous@megous.com>
|
||||||
|
---
|
||||||
|
arch/arm/lib/cache-cp15.c | 29 ++++++++++++++++++++++++
|
||||||
|
common/spl/spl.c | 46 +++++++++++++++++++++++++++++++++++++++
|
||||||
|
2 files changed, 75 insertions(+)
|
||||||
|
|
||||||
|
diff --git a/arch/arm/lib/cache-cp15.c b/arch/arm/lib/cache-cp15.c
|
||||||
|
index aab1bf4360..c2fe0acdc4 100644
|
||||||
|
--- a/arch/arm/lib/cache-cp15.c
|
||||||
|
+++ b/arch/arm/lib/cache-cp15.c
|
||||||
|
@@ -116,6 +116,25 @@ __weak void dram_bank_mmu_setup(int bank)
|
||||||
|
set_section_dcache(i, DCACHE_DEFAULT_OPTION);
|
||||||
|
}
|
||||||
|
|
||||||
|
+#if defined(CONFIG_SPL_BUILD) && (defined(CONFIG_SPL_MAX_SIZE) || \
|
||||||
|
+ defined(CONFIG_SPL_MAX_FOOTPRINT))
|
||||||
|
+__weak void sram_bank_mmu_setup(phys_addr_t start, phys_addr_t size)
|
||||||
|
+{
|
||||||
|
+ int i;
|
||||||
|
+
|
||||||
|
+ for (i = start >> MMU_SECTION_SHIFT;
|
||||||
|
+ i < (start >> MMU_SECTION_SHIFT) + (size >> MMU_SECTION_SHIFT);
|
||||||
|
+ i++)
|
||||||
|
+#if defined(CONFIG_SYS_ARM_CACHE_WRITETHROUGH)
|
||||||
|
+ set_section_dcache(i, DCACHE_WRITETHROUGH);
|
||||||
|
+#elif defined(CONFIG_SYS_ARM_CACHE_WRITEALLOC)
|
||||||
|
+ set_section_dcache(i, DCACHE_WRITEALLOC);
|
||||||
|
+#else
|
||||||
|
+ set_section_dcache(i, DCACHE_WRITEBACK);
|
||||||
|
+#endif
|
||||||
|
+}
|
||||||
|
+#endif
|
||||||
|
+
|
||||||
|
/* to activate the MMU we need to set up virtual memory: use 1M areas */
|
||||||
|
static inline void mmu_setup(void)
|
||||||
|
{
|
||||||
|
@@ -131,6 +150,16 @@ static inline void mmu_setup(void)
|
||||||
|
dram_bank_mmu_setup(i);
|
||||||
|
}
|
||||||
|
|
||||||
|
+#if defined(CONFIG_SPL_BUILD)
|
||||||
|
+#if defined(CONFIG_SPL_MAX_SIZE)
|
||||||
|
+ sram_bank_mmu_setup(CONFIG_SPL_TEXT_BASE,
|
||||||
|
+ ALIGN(CONFIG_SPL_MAX_SIZE, MMU_SECTION_SIZE));
|
||||||
|
+#elif defined(CONFIG_SPL_MAX_FOOTPRINT)
|
||||||
|
+ sram_bank_mmu_setup(CONFIG_SPL_TEXT_BASE,
|
||||||
|
+ ALIGN(CONFIG_SPL_MAX_FOOTPRINT, MMU_SECTION_SIZE));
|
||||||
|
+#endif
|
||||||
|
+#endif
|
||||||
|
+
|
||||||
|
#if defined(CONFIG_ARMV7_LPAE) && __LINUX_ARM_ARCH__ != 4
|
||||||
|
/* Set up 4 PTE entries pointing to our 4 1GB page tables */
|
||||||
|
for (i = 0; i < 4; i++) {
|
||||||
|
diff --git a/common/spl/spl.c b/common/spl/spl.c
|
||||||
|
index a0a608fd77..40c9022928 100644
|
||||||
|
--- a/common/spl/spl.c
|
||||||
|
+++ b/common/spl/spl.c
|
||||||
|
@@ -10,6 +10,7 @@
|
||||||
|
#include <bloblist.h>
|
||||||
|
#include <binman_sym.h>
|
||||||
|
#include <bootstage.h>
|
||||||
|
+#include <cpu_func.h>
|
||||||
|
#include <dm.h>
|
||||||
|
#include <handoff.h>
|
||||||
|
#include <hang.h>
|
||||||
|
@@ -636,6 +637,35 @@ void board_init_f(ulong dummy)
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
+#if !(defined(CONFIG_SYS_ICACHE_OFF) && defined(CONFIG_SYS_DCACHE_OFF)) && \
|
||||||
|
+ defined(CONFIG_ARM)
|
||||||
|
+int reserve_mmu(void)
|
||||||
|
+{
|
||||||
|
+ phys_addr_t ram_top = 0;
|
||||||
|
+ /* reserve TLB table */
|
||||||
|
+ gd->arch.tlb_size = PGTABLE_SIZE;
|
||||||
|
+
|
||||||
|
+#ifdef CONFIG_SYS_SDRAM_BASE
|
||||||
|
+ ram_top = CONFIG_SYS_SDRAM_BASE;
|
||||||
|
+#endif
|
||||||
|
+ ram_top += get_effective_memsize();
|
||||||
|
+ gd->arch.tlb_addr = ram_top - gd->arch.tlb_size;
|
||||||
|
+ debug("TLB table from %08lx to %08lx\n", gd->arch.tlb_addr,
|
||||||
|
+ gd->arch.tlb_addr + gd->arch.tlb_size);
|
||||||
|
+ return 0;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+__weak int dram_init_banksize(void)
|
||||||
|
+{
|
||||||
|
+#if defined(CONFIG_NR_DRAM_BANKS) && defined(CONFIG_SYS_SDRAM_BASE)
|
||||||
|
+ gd->bd->bi_dram[0].start = CONFIG_SYS_SDRAM_BASE;
|
||||||
|
+ gd->bd->bi_dram[0].size = get_effective_memsize();
|
||||||
|
+#endif
|
||||||
|
+ return 0;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+#endif
|
||||||
|
+
|
||||||
|
void board_init_r(gd_t *dummy1, ulong dummy2)
|
||||||
|
{
|
||||||
|
u32 spl_boot_list[] = {
|
||||||
|
@@ -651,6 +681,12 @@ void board_init_r(gd_t *dummy1, ulong dummy2)
|
||||||
|
debug(">>" SPL_TPL_PROMPT "board_init_r()\n");
|
||||||
|
|
||||||
|
spl_set_bd();
|
||||||
|
+#if !(defined(CONFIG_SYS_ICACHE_OFF) && defined(CONFIG_SYS_DCACHE_OFF)) && \
|
||||||
|
+ defined(CONFIG_ARM)
|
||||||
|
+ dram_init_banksize();
|
||||||
|
+ reserve_mmu();
|
||||||
|
+ enable_caches();
|
||||||
|
+#endif
|
||||||
|
|
||||||
|
#if defined(CONFIG_SYS_SPL_MALLOC_START)
|
||||||
|
mem_malloc_init(CONFIG_SYS_SPL_MALLOC_START,
|
||||||
|
@@ -661,6 +697,11 @@ void board_init_r(gd_t *dummy1, ulong dummy2)
|
||||||
|
if (spl_init())
|
||||||
|
hang();
|
||||||
|
}
|
||||||
|
+ if (IS_ENABLED(CONFIG_SPL_ALLOC_BD) && spl_alloc_bd()) {
|
||||||
|
+ puts("Cannot alloc bd\n");
|
||||||
|
+ hang();
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
#if !defined(CONFIG_PPC) && !defined(CONFIG_ARCH_MX6)
|
||||||
|
/*
|
||||||
|
* timer_init() does not exist on PPC systems. The timer is initialized
|
||||||
|
@@ -728,6 +769,11 @@ void board_init_r(gd_t *dummy1, ulong dummy2)
|
||||||
|
ret);
|
||||||
|
}
|
||||||
|
|
||||||
|
+#if !(defined(CONFIG_SYS_ICACHE_OFF) && defined(CONFIG_SYS_DCACHE_OFF)) && \
|
||||||
|
+ defined(CONFIG_ARM)
|
||||||
|
+ cleanup_before_linux();
|
||||||
|
+#endif
|
||||||
|
+
|
||||||
|
#ifdef CONFIG_CPU_V7M
|
||||||
|
spl_image.entry_point |= 0x1;
|
||||||
|
#endif
|
||||||
|
--
|
||||||
|
2.31.1
|
||||||
|
|
|
@ -1,18 +1,19 @@
|
||||||
From b94ee51a5d818e55b3288d2fa3cbc27837981307 Mon Sep 17 00:00:00 2001
|
From a568d5efe609fec974d44fec4cba31288ab0f621 Mon Sep 17 00:00:00 2001
|
||||||
From: Bobby The Builder <bob@najdan.com>
|
From: Bobby The Builder <bob@najdan.com>
|
||||||
Date: Mon, 29 Mar 2021 16:42:07 -0400
|
Date: Mon, 29 Mar 2021 16:42:07 -0400
|
||||||
Subject: [PATCH] expose DRAM clock speed
|
Subject: [PATCH 4/5] common: expose DRAM clock speed
|
||||||
|
|
||||||
|
add memory/ram_freq
|
||||||
---
|
---
|
||||||
common/board_f.c | 6 ++++--
|
common/board_f.c | 6 ++++--
|
||||||
common/main.c | 7 +++++++
|
common/main.c | 7 +++++++
|
||||||
2 files changed, 11 insertions(+), 2 deletions(-)
|
2 files changed, 11 insertions(+), 2 deletions(-)
|
||||||
|
|
||||||
diff --git a/common/board_f.c b/common/board_f.c
|
diff --git a/common/board_f.c b/common/board_f.c
|
||||||
index 9f441c44f1..8e005337e6 100644
|
index 0cddf0359d..e481c70ef0 100644
|
||||||
--- a/common/board_f.c
|
--- a/common/board_f.c
|
||||||
+++ b/common/board_f.c
|
+++ b/common/board_f.c
|
||||||
@@ -226,12 +226,14 @@ static int show_dram_config(void)
|
@@ -227,12 +227,14 @@ static int show_dram_config(void)
|
||||||
print_size(gd->bd->bi_dram[i].size, "\n");
|
print_size(gd->bd->bi_dram[i].size, "\n");
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
@ -30,17 +31,17 @@ index 9f441c44f1..8e005337e6 100644
|
||||||
}
|
}
|
||||||
|
|
||||||
diff --git a/common/main.c b/common/main.c
|
diff --git a/common/main.c b/common/main.c
|
||||||
index 4b3cd302c3..1dbb44060d 100644
|
index ae5bcdb32f..85adcc6c13 100644
|
||||||
--- a/common/main.c
|
--- a/common/main.c
|
||||||
+++ b/common/main.c
|
+++ b/common/main.c
|
||||||
@@ -45,6 +45,13 @@ void main_loop(void)
|
@@ -46,6 +46,13 @@ void main_loop(void)
|
||||||
if (IS_ENABLED(CONFIG_VERSION_VARIABLE))
|
if (IS_ENABLED(CONFIG_VERSION_VARIABLE))
|
||||||
env_set("ver", version_string); /* set version variable */
|
env_set("ver", version_string); /* set version variable */
|
||||||
|
|
||||||
+#if defined(CONFIG_DRAM_CLK)
|
+#if defined(CONFIG_DRAM_CLK)
|
||||||
+ char ram_clk_string[11];
|
+ char ram_clk_string[11];
|
||||||
+ sprintf(ram_clk_string, "%d", CONFIG_DRAM_CLK);
|
+ sprintf(ram_clk_string, "%d", CONFIG_DRAM_CLK);
|
||||||
+ int ret = env_set("ram_freq", ram_clk_string);
|
+ env_set("ram_freq", ram_clk_string);
|
||||||
+ printf("Set ram_freq : %s\n", ram_clk_string);
|
+ printf("Set ram_freq : %s\n", ram_clk_string);
|
||||||
+#endif
|
+#endif
|
||||||
+
|
+
|
||||||
|
@ -48,5 +49,5 @@ index 4b3cd302c3..1dbb44060d 100644
|
||||||
|
|
||||||
if (IS_ENABLED(CONFIG_USE_PREBOOT))
|
if (IS_ENABLED(CONFIG_USE_PREBOOT))
|
||||||
--
|
--
|
||||||
2.30.2
|
2.31.1
|
||||||
|
|
|
@ -1,23 +1,49 @@
|
||||||
# U-boot with patches to make the PinePhone boot faster and have control over the ddr clock speed
|
# U-boot with patches to make the PinePhone boot faster and have control over the ddr clock speed
|
||||||
pkgname=u-boot-pinephone
|
pkgname=u-boot-pinephone
|
||||||
pkgver=2021.01_git20201228
|
pkgver=2021.07
|
||||||
pkgrel=4
|
pkgrel=0
|
||||||
# Last commit from "crust" branch, as used in "crust-meta":
|
pkgdesc="U-Boot bootloader for the PINE64 PinePhone"
|
||||||
# https://gitlab.com/pine64-org/crust-meta/-/blob/8886bcc829179bf77216fade71f0ede9bd014e67/Makefile#L78
|
url="https://source.denx.de/u-boot"
|
||||||
_commit="7492749fec31b1086bc8933bf113a766aea021aa"
|
|
||||||
pkgdesc="u-boot bootloader for the PINE64 PinePhone"
|
|
||||||
url="https://gitlab.com/pine64-org/u-boot"
|
|
||||||
arch="aarch64"
|
arch="aarch64"
|
||||||
license="GPL-2.0-or-later OFL-1.1 BSD-2-Clause BSD-3-Clause eCos-2.0 IBM-pibs
|
license="GPL-2.0-or-later OFL-1.1 BSD-2-Clause BSD-3-Clause eCos-2.0 IBM-pibs
|
||||||
ISC LGPL-2.0-only LGPL-2.1-only X11"
|
ISC LGPL-2.0-only LGPL-2.1-only X11"
|
||||||
depends="linux-postmarketos-allwinner>=5.12"
|
depends="linux-postmarketos-allwinner>=5.12"
|
||||||
makedepends="$depends_dev bc dtc python3-dev py3-setuptools swig bison flex openssl-dev arm-trusted-firmware-sun50i crust"
|
makedepends="$depends_dev bc dtc python3-dev py3-setuptools swig bison flex openssl-dev arm-trusted-firmware crust"
|
||||||
options="!check"
|
options="!check"
|
||||||
source="https://gitlab.com/pine64-org/u-boot/-/archive/$_commit/u-boot-$_commit.tar.gz
|
source="https://source.denx.de/u-boot/u-boot/-/archive/v$pkgver/u-boot-v$pkgver.tar.gz
|
||||||
0001-expose-DRAM-clock-speed.patch
|
|
||||||
update-u-boot
|
update-u-boot
|
||||||
|
0001-mmc-sunxi-Avoid-ifdefs-in-delay-and-width-setup.patch
|
||||||
|
0002-mmc-sunxi-Fix-warnings-with-CONFIG_PHYS_64BIT.patch
|
||||||
|
0003-mmc-sunxi-Fix-MMC-clock-parent-selection.patch
|
||||||
|
0004-mmc-sunxi-Cleanup-new-timing-mode-selection.patch
|
||||||
|
0005-mmc-sunxi-Enable-new-timing-mode-on-all-new-SoCs.patch
|
||||||
|
0006-mmc-sunxi-Cleanup-and-fix-self-calibration-code.patch
|
||||||
|
0007-mmc-sunxi-Increase-MMIO-FIFO-read-performance.patch
|
||||||
|
0008-mmc-sunxi-Use-mmc_of_parse.patch
|
||||||
|
0009-sunxi-DT-H5-update-device-tree-files.patch
|
||||||
|
0010-sunxi-DT-H6-update-device-tree-files.patch
|
||||||
|
0011-phy-sun50i-usb3-Add-a-driver-for-the-H6-USB3-PHY.patch
|
||||||
|
0012-usb-xhci-pci-Move-reset-logic-out-of-XHCI-core.patch
|
||||||
|
0013-usb-xhci-dwc3-Add-support-for-clocks-resets.patch
|
||||||
|
0014-configs-Enable-USB3-on-Allwinner-H6-boards.patch
|
||||||
|
0015-tools-Refactor-mkimage-linking-with-OpenSSL.patch
|
||||||
|
0016-tools-mkimage-Add-Allwinner-TOC0-support.patch
|
||||||
|
0017-sunxi-Support-both-SPL-image-types.patch
|
||||||
|
0018-sunxi-Support-building-a-SPL-as-a-TOC0-image.patch
|
||||||
|
0019-sunxi-H616-Enable-full-4GB-of-DRAM.patch
|
||||||
|
0020-sunxi-DT-H6-Add-USB3-to-Pine-H64-DTS.patch
|
||||||
|
0021-sunxi-Select-environment-MMC-based-on-boot-device.patch
|
||||||
|
0022-sunxi-Load-sun8i-secure-monitor-to-SRAM-A2.patch
|
||||||
|
0023-pinephone-Add-volume_key-environment-variable.patch
|
||||||
|
0024-Enable-led-on-boot-to-notify-user-of-boot-status.patch
|
||||||
|
0025-disable-bootdelay.patch
|
||||||
|
0026-Reduce-DRAM-speed-to-528-for-better-compatibility-wi.patch
|
||||||
|
0027-mmc-sunxi-Add-support-for-DMA-transfers.patch
|
||||||
|
0028-mmc-sunxi-DDR-DMA-support-for-SPL.patch
|
||||||
|
0029-spl-ARM-Enable-CPU-caches.patch
|
||||||
|
0030-common-expose-DRAM-clock-speed.patch
|
||||||
"
|
"
|
||||||
builddir="$srcdir/u-boot-$_commit"
|
builddir="$srcdir/u-boot-v$pkgver"
|
||||||
install="$pkgname.post-upgrade"
|
install="$pkgname.post-upgrade"
|
||||||
frequencies='528 552 624'
|
frequencies='528 552 624'
|
||||||
|
|
||||||
|
@ -26,7 +52,7 @@ build() {
|
||||||
LC_ALL=C date +'#define U_BOOT_DATE "%b %d %C%y"' > include/timestamp_autogenerated.h
|
LC_ALL=C date +'#define U_BOOT_DATE "%b %d %C%y"' > include/timestamp_autogenerated.h
|
||||||
LC_ALL=C date +'#define U_BOOT_TIME "%T"' >> include/timestamp_autogenerated.h
|
LC_ALL=C date +'#define U_BOOT_TIME "%T"' >> include/timestamp_autogenerated.h
|
||||||
|
|
||||||
export BL31="/usr/share/arm-trusted-firmware/sun50i/bl31.bin"
|
export BL31="/usr/share/arm-trusted-firmware/sun50i_a64/bl31.bin"
|
||||||
export SCP="/usr/share/crust/pinephone/scp.bin"
|
export SCP="/usr/share/crust/pinephone/scp.bin"
|
||||||
export BUILD_DIR="$builddir"/build
|
export BUILD_DIR="$builddir"/build
|
||||||
|
|
||||||
|
@ -51,7 +77,36 @@ package() {
|
||||||
}
|
}
|
||||||
|
|
||||||
sha512sums="
|
sha512sums="
|
||||||
73b132cdc26113a83d060f0d243320ca989b4efa98fe95a2205526a42f615ced7046bb9d4878c67a9a550b04c2519d90be3c2272be97c878d759bf5d027cf536 u-boot-7492749fec31b1086bc8933bf113a766aea021aa.tar.gz
|
bbfc92bda2d9229787f507d2e3c120a8536788b198b910fb018f851e6990f73de4a57bc9686664f777c1665573c2f9015e1e7bbfcec5773dc957dbb71f2aa56b u-boot-v2021.07.tar.gz
|
||||||
3cba8a0e899be8cb0b9260b7a86d4115f74c279a1bac8c1403ee669adf91dca8215d8d2d6395ebb3cd67ce000f37a51d6e033b62a8d616b346a9072fa58a4b70 0001-expose-DRAM-clock-speed.patch
|
|
||||||
4857d5f6e4f591f97b8842cc9fb7d1131d71af63d05f6bd8457f4323886fb2334614a00699a3efc8d1b32d149d130c3cca0205150eedb40e9da60e4508281e36 update-u-boot
|
4857d5f6e4f591f97b8842cc9fb7d1131d71af63d05f6bd8457f4323886fb2334614a00699a3efc8d1b32d149d130c3cca0205150eedb40e9da60e4508281e36 update-u-boot
|
||||||
|
05ae2fa9ce48567f91589b6bbf69f0849b37ef11b2cc98c400e3d08fd5d52d02ad4bc30111cbf2e9bfe75a2b2b68606193110019bfc8e2e451c8ab0a2d6153ca 0001-mmc-sunxi-Avoid-ifdefs-in-delay-and-width-setup.patch
|
||||||
|
57ff8c7bbd697e183cce079e6d4fb272909aa1d00aa4d6a0fabb2cfd395c1e051be11846aad8aafdf92b4fe98760742e0a1a3d7ecd763e8b8a4e0b656fe53d1e 0002-mmc-sunxi-Fix-warnings-with-CONFIG_PHYS_64BIT.patch
|
||||||
|
bb10dabb6b66d38ca406fd8be656be9fc5582e5224e54d2fd4cd33dd7ee20a1c976fa1b5807a3c740534ddc22782330fbd5e4b436917416acc05a63dd3e9d181 0003-mmc-sunxi-Fix-MMC-clock-parent-selection.patch
|
||||||
|
6fe63a013a3716c962647f166c085cbb3edd0ed18511a97e51f5c32aff752c3a3581f6b68ff7bf482e91ebf29cb098b3f6bd5f11f491aff65f999120b3520267 0004-mmc-sunxi-Cleanup-new-timing-mode-selection.patch
|
||||||
|
1eb21c9f5af6580937d7e107f742a226d3b95d49adf4ea77b7812c76d9102506adbc219a49476d0e8f84a536bc43fb53a288eec0708f41454327f85a7e7ab59d 0005-mmc-sunxi-Enable-new-timing-mode-on-all-new-SoCs.patch
|
||||||
|
e794d989d31672d7ad05730dd469ad91e3ed1c1cb40bff25f2df6bdb364417ad288b79700ca7223d0f82ce750cfa158a72d19191d7b5e8fa549efc59b0cf902f 0006-mmc-sunxi-Cleanup-and-fix-self-calibration-code.patch
|
||||||
|
1b5c17632f4a680727c2548940bcccca6615f6847fed121ddef03dcadc5b9eceb1de8e03dcc71abc0cc496a73068c40cfb50ad98aa051b3e9af090e959e23cca 0007-mmc-sunxi-Increase-MMIO-FIFO-read-performance.patch
|
||||||
|
752d8831c348c019c67593a6d8c23ce238ab96957fda0f56f2dc2831afc8a5367bff33627c8002a9ead55e9a878440ffee5da2d9a73d2c0733895cf2f4f076a8 0008-mmc-sunxi-Use-mmc_of_parse.patch
|
||||||
|
4076ee3fcf746e7b3ca1519646af5a9cc5befb8dedbd32b6737cbe4e422e0a0e7100da265f2feac2d77fa1fd5d510c5251c9d3672b006cd290c9f906d8af673c 0009-sunxi-DT-H5-update-device-tree-files.patch
|
||||||
|
aa951994ccd7cfdfa6e5f34cf87229d6cf5d87c4c7eaeab38904f3fa704c17dd8cfe9c67b9f1e123a80dbed9e7724314bb9914630a7df4d3bff55d11a10b3241 0010-sunxi-DT-H6-update-device-tree-files.patch
|
||||||
|
c59a36a6dfc0313076baaa3ada2ffd17710d816b0590aa4970354ccf60e503df1b23c7701c2abf6c9625df7b76e0b0ff81079bd6b7c8c7c68cabf56b26c2b25f 0011-phy-sun50i-usb3-Add-a-driver-for-the-H6-USB3-PHY.patch
|
||||||
|
1f1f5394ef2699d011ba89fe8161f6b792b3862a26c112d9085404db4ccbe090376e9f7487268aeb492bc7bc72d6217e3e29612b30d8e687af3990d781786fe8 0012-usb-xhci-pci-Move-reset-logic-out-of-XHCI-core.patch
|
||||||
|
d93307d1d0d583cd041b54bd17e0b60ff6cd886435f528898495bdfaa9e19ab578ee7d8edcd6523757bfe6a2f70305e4633a082a994cdc5850deba3ff4720d89 0013-usb-xhci-dwc3-Add-support-for-clocks-resets.patch
|
||||||
|
c426c2145654d5ad34980ee2255155f63d7e6aa374a21f7d4d3a9ff7cc96ceec6a6267beef9ca2024d1f8c82285d6e0c76e5f9dc0b4af12c1316fd7a0e483936 0014-configs-Enable-USB3-on-Allwinner-H6-boards.patch
|
||||||
|
c32c8a8760239350408d3c78dcad0226cf8576ca7b75cbe52cb4eee7d0a9f8d824b022c5767d703aae89a811c8ac6b953620cb5ec69166e3d8b31bad8a501c25 0015-tools-Refactor-mkimage-linking-with-OpenSSL.patch
|
||||||
|
607a86a2f76fc8338da083ccb068bc140ff8513d2a48c479a4f4c2e3307853485db708cbe381cd36498240d7752c83b6667d696251fd27ac96b41a2dec9f8911 0016-tools-mkimage-Add-Allwinner-TOC0-support.patch
|
||||||
|
9eaf3a854250df8863eec109912f5351e3a3a165677770c016b0c3b60e66e9dd8370cf6e6bd4b3f0ba00e777c1a3a1e05e4fc69a1e709e6e784f71b306ba6e13 0017-sunxi-Support-both-SPL-image-types.patch
|
||||||
|
07c1cad4b3e6ff2a220c2e1f7b613bb0265e58b203016e523d3c1055e465c2a4b697b1761cf8823b80fa8ad056beb7a4169aa551c76a2814675f841f15adab28 0018-sunxi-Support-building-a-SPL-as-a-TOC0-image.patch
|
||||||
|
19f7f99e0649780226915f97b22c30fb1963aa5267d7f07bef727cbae4c6a4750ba31a4f807601d53f53fd605c16f1c462b4b255783220fe91faa297db6de3c1 0019-sunxi-H616-Enable-full-4GB-of-DRAM.patch
|
||||||
|
44ce977b41a07b64f61328e17a5b7bb19b8ff2cfc0664946a869b22b2e03ecbfab8a64bec41adafcce7c6351d570882246020fcdaa81b43c1af512d41a239d62 0020-sunxi-DT-H6-Add-USB3-to-Pine-H64-DTS.patch
|
||||||
|
5d77c5c253c31b47c41f159d3c0f0954ce84bd8cde39c39a5894e40ff5e89439ea6e133c66e254a39aab621cb6f3b252ab36ea91a3beff122cdb2e023b9599f1 0021-sunxi-Select-environment-MMC-based-on-boot-device.patch
|
||||||
|
299be54d9cc6bc5190ae28d020db1d0e91cdc2ff15c28a5779972c5b77cc80dd9cf8209f1a380971118356963efea0b5afcbd49753b8f192d8667f65eaa87825 0022-sunxi-Load-sun8i-secure-monitor-to-SRAM-A2.patch
|
||||||
|
95a1f9277b92b4dfeac8dd2ebd00425ef266d5dd1f3874d3d283b88421a84698df09513f4b6d317de983b3ce4351deba660c5d6c0ef9fa4abcd3e0030dc53ada 0023-pinephone-Add-volume_key-environment-variable.patch
|
||||||
|
4e2f803f287fde9874a3e49f7a1ba07bce8760270bffa5d204915eaf8fd26be2ca7575bb3e4fc997e05321e93ecea14eba7f733ad78f78075e42b63239c76f67 0024-Enable-led-on-boot-to-notify-user-of-boot-status.patch
|
||||||
|
c9b0e640fe021c33be3e60defbef6a784cd482566ca0cfc54d05a63fe9bd4bc4c9e87eed4262eb531ac47e8af69660baf29906130542704d23a51f4a680690cc 0025-disable-bootdelay.patch
|
||||||
|
f982f87bb34544d3dca38bfda3157a355d48a058315a80fe525acefa14a03698857e14ed40c40d36b78db9158d2e158af88a000c239b0470a6ca70c5ad74847b 0026-Reduce-DRAM-speed-to-528-for-better-compatibility-wi.patch
|
||||||
|
ae2d0baf7c2048e142230741368db1d0520b1764d62e798098d2548b0ba9622f098f64edc0988db10963543ca0169ae6f3db609f436e1fd090d785274cf30283 0027-mmc-sunxi-Add-support-for-DMA-transfers.patch
|
||||||
|
eff2901ac5e14949f326a9d8b553f6f32d7e89502929090595b360d1b76d0d3335c94d0c4960b25603f9786524baf2386251bd4a18582ed1012a6db3e5e84618 0028-mmc-sunxi-DDR-DMA-support-for-SPL.patch
|
||||||
|
f2ee73c774758bd13872d370bc7990474adc453531dacf15664609ca0fdc2a4844d4769376c370b7d18896ac734a7080ee709066659647a4cf0368928bf5e198 0029-spl-ARM-Enable-CPU-caches.patch
|
||||||
|
86d9587cb2b0ca99fb4090bd0daacd47c0043858654f6f7114c8d0ed6c660eb2b8bc0b37de6723e738df9b1137d62482f00764c284f4aa0a6054db9efe754db9 0030-common-expose-DRAM-clock-speed.patch
|
||||||
"
|
"
|
||||||
|
|
Loading…
Reference in a new issue