meta-st-stm32mp/recipes-bsp/u-boot/u-boot-stm32mp/0008-ARM-v2018.11-stm32mp-r...

291 lines
8.8 KiB
Diff

From 8db9dfe442ded4ec2d320d61a5b92d9bc1c771d4 Mon Sep 17 00:00:00 2001
From: christophe montaud <christophe.montaud@st.com>
Date: Mon, 28 Jan 2019 11:07:22 +0100
Subject: [PATCH 8/8] ARM v2018.11 stm32mp r2 MISC
---
Makefile | 2 +-
drivers/remoteproc/rproc-uclass.c | 10 +++++++--
drivers/remoteproc/stm32_copro.c | 44 +++++++++++++++------------------------
drivers/video/stm32/stm32_dsi.c | 41 ++++++++++++++++++++++--------------
4 files changed, 51 insertions(+), 46 deletions(-)
diff --git a/Makefile b/Makefile
index 84cb372..693ffae 100644
--- a/Makefile
+++ b/Makefile
@@ -3,7 +3,7 @@
VERSION = 2018
PATCHLEVEL = 11
SUBLEVEL =
-EXTRAVERSION = -stm32mp-r1
+EXTRAVERSION = -stm32mp-r2
NAME =
# *DOCUMENTATION*
diff --git a/drivers/remoteproc/rproc-uclass.c b/drivers/remoteproc/rproc-uclass.c
index 8ea92f7..204e6e8 100644
--- a/drivers/remoteproc/rproc-uclass.c
+++ b/drivers/remoteproc/rproc-uclass.c
@@ -449,7 +449,10 @@ static int rproc_load_elf_image(struct udevice *dev, unsigned long addr,
if (phdr->p_filesz != phdr->p_memsz)
memset(dst + phdr->p_filesz, 0x00,
phdr->p_memsz - phdr->p_filesz);
- flush_cache((unsigned long)dst, phdr->p_filesz);
+ flush_cache(rounddown((int)dst, ARCH_DMA_MINALIGN),
+ roundup((int)dst + phdr->p_filesz,
+ ARCH_DMA_MINALIGN) -
+ rounddown((int)dst, ARCH_DMA_MINALIGN));
++phdr;
}
@@ -561,7 +564,10 @@ static int rproc_elf_find_load_rsc_table(struct udevice *dev,
src = (void *)fw_addr + shdr->sh_offset;
memcpy(dst, src, shdr->sh_size);
- flush_cache((unsigned long)dst, shdr->sh_size);
+ flush_cache(rounddown((int)dst, ARCH_DMA_MINALIGN),
+ roundup((int)dst + shdr->sh_size,
+ ARCH_DMA_MINALIGN) -
+ rounddown((int)dst, ARCH_DMA_MINALIGN));
return 0;
}
diff --git a/drivers/remoteproc/stm32_copro.c b/drivers/remoteproc/stm32_copro.c
index 310d077..44230ff 100644
--- a/drivers/remoteproc/stm32_copro.c
+++ b/drivers/remoteproc/stm32_copro.c
@@ -18,7 +18,6 @@
/**
* struct stm32_copro_privdata - power processor private data
- * @loadaddr: base address for loading the power processor
* @reset_ctl: reset controller handle
* @hold_boot_regmap
* @hold_boot_offset
@@ -26,7 +25,6 @@
* @secured_soc: TZEN flag (register protection)
*/
struct stm32_copro_privdata {
- phys_addr_t loadaddr;
struct reset_ctl reset_ctl;
struct regmap *hold_boot_regmap;
uint hold_boot_offset;
@@ -46,21 +44,9 @@ static int st_of_to_priv(struct udevice *dev,
{
struct regmap *regmap;
const fdt32_t *cell;
- const void *blob = gd->fdt_blob;
uint tz_offset, tz_mask, tzen;
int len, ret;
- if (!blob) {
- dev_dbg(dev, "no dt?\n");
- return -EINVAL;
- }
-
- priv->loadaddr = dev_read_addr(dev);
- if (priv->loadaddr == FDT_ADDR_T_NONE) {
- dev_dbg(dev, "no 'reg' property\n");
- return -EINVAL;
- }
-
regmap = syscon_phandle_to_regmap(dev, "st,syscfg-holdboot");
if (IS_ERR(regmap)) {
dev_dbg(dev, "unable to find holdboot regmap (%ld)\n",
@@ -123,8 +109,7 @@ static int stm32_copro_probe(struct udevice *dev)
ret = st_of_to_priv(dev, priv);
- dev_dbg(dev, "probed with slave_addr=0x%08lX (%d)\n",
- priv->loadaddr, ret);
+ dev_dbg(dev, "probed (%d)\n", ret);
return ret;
}
@@ -163,6 +148,17 @@ static int stm32_copro_set_hold_boot(struct udevice *dev, bool hold)
return ret;
}
+static ulong stm32_copro_da_to_pa(struct udevice *dev, ulong da)
+{
+ /* to update with address translate by DT range */
+
+ /* CM4 boot at address 0x0 = RETRAM alias, not available for CA7 load */
+ if (da >= 0 && da < STM32_RETRAM_SIZE)
+ return (da + STM32_RETRAM_BASE);
+
+ return da;
+}
+
/**
* stm32_copro_load() - Loadup the STM32 Cortex-M4 remote processor
* @dev: corresponding STM32 remote processor device
@@ -174,6 +170,7 @@ static int stm32_copro_set_hold_boot(struct udevice *dev, bool hold)
static int stm32_copro_load(struct udevice *dev, ulong addr, ulong size)
{
struct stm32_copro_privdata *priv;
+ phys_addr_t loadaddr;
int ret;
priv = dev_get_priv(dev);
@@ -186,10 +183,12 @@ static int stm32_copro_load(struct udevice *dev, ulong addr, ulong size)
return ret;
}
+ /* by default load for copro BOOT address = 0x0 */
+ loadaddr = stm32_copro_da_to_pa(dev, 0x0);
dev_dbg(dev, "Loading binary from 0x%08lX, size 0x%08lX to 0x%08lX\n",
- addr, size, priv->loadaddr);
+ addr, size, loadaddr);
- memcpy((void *)priv->loadaddr, (void *)addr, size);
+ memcpy((void *)loadaddr, (void *)addr, size);
dev_dbg(dev, "Complete!\n");
return 0;
@@ -241,15 +240,6 @@ static int stm32_copro_reset(struct udevice *dev)
return 0;
}
-ulong stm32_copro_da_to_pa(struct udevice *dev, ulong da)
-{
- /* to update according to lastest DT */
- if (da >= 0 && da < 0x10000)
- return (da + 0x38000000);
-
- return da;
-}
-
static const struct dm_rproc_ops stm32_copro_ops = {
.load = stm32_copro_load,
.start = stm32_copro_start,
diff --git a/drivers/video/stm32/stm32_dsi.c b/drivers/video/stm32/stm32_dsi.c
index 09266fe..f8f7c83 100644
--- a/drivers/video/stm32/stm32_dsi.c
+++ b/drivers/video/stm32/stm32_dsi.c
@@ -242,7 +242,6 @@ static int dsi_get_lane_mbps(void *priv_data, struct display_timing *timings,
u32 val;
/* Update lane capabilities according to hw version */
- dsi->hw_version = dsi_read(dsi, DSI_VERSION) & VERSION;
dsi->lane_min_kbps = LANE_MIN_KBPS;
dsi->lane_max_kbps = LANE_MAX_KBPS;
if (dsi->hw_version == HWVER_131) {
@@ -310,9 +309,9 @@ static const struct dw_mipi_dsi_phy_ops dw_mipi_dsi_stm_phy_ops = {
static int stm32_dsi_attach(struct udevice *dev)
{
- struct stm32_dsi_priv *priv = dev_get_priv(dev);
+ struct stm32_dsi_priv *dsi = dev_get_priv(dev);
struct dw_mipi_dsi_plat_data *platdata = dev_get_platdata(dev);
- struct mipi_dsi_device *device = &priv->device;
+ struct mipi_dsi_device *device = &dsi->device;
int ret;
platdata->max_data_lanes = 2;
@@ -336,8 +335,8 @@ static int stm32_dsi_attach(struct udevice *dev)
static int stm32_dsi_set_backlight(struct udevice *dev, int percent)
{
struct dw_mipi_dsi_plat_data *dplat = dev_get_platdata(dev);
- struct stm32_dsi_priv *priv = dev_get_priv(dev);
- struct mipi_dsi_device *device = &priv->device;
+ struct stm32_dsi_priv *dsi = dev_get_priv(dev);
+ struct mipi_dsi_device *device = &dsi->device;
struct udevice *panel = dplat->panel;
struct mipi_dsi_panel_plat *mplat;
int ret;
@@ -359,29 +358,29 @@ static int stm32_dsi_set_backlight(struct udevice *dev, int percent)
static int stm32_dsi_probe(struct udevice *dev)
{
- struct stm32_dsi_priv *priv = dev_get_priv(dev);
- struct mipi_dsi_device *device = &priv->device;
+ struct stm32_dsi_priv *dsi = dev_get_priv(dev);
+ struct mipi_dsi_device *device = &dsi->device;
struct reset_ctl rst;
struct clk clk;
int ret;
device->dev = dev;
- priv->base = (void *)dev_read_addr(dev);
- if ((fdt_addr_t)priv->base == FDT_ADDR_T_NONE) {
+ dsi->base = (void *)dev_read_addr(dev);
+ if ((fdt_addr_t)dsi->base == FDT_ADDR_T_NONE) {
dev_err(dev, "dsi dt register address error\n");
return -EINVAL;
}
if (IS_ENABLED(CONFIG_DM_REGULATOR)) {
ret = device_get_supply_regulator(dev, "phy-dsi-supply",
- &priv->vdd_reg);
+ &dsi->vdd_reg);
if (ret && ret != -ENOENT) {
dev_err(dev, "Warning: cannot get phy dsi supply\n");
return -ENODEV;
}
- ret = regulator_set_enable(priv->vdd_reg, true);
+ ret = regulator_set_enable(dsi->vdd_reg, true);
if (ret)
return -ENODEV;
}
@@ -389,14 +388,14 @@ static int stm32_dsi_probe(struct udevice *dev)
ret = clk_get_by_name(device->dev, "pclk", &clk);
if (ret) {
dev_err(dev, "peripheral clock get error %d\n", ret);
- regulator_set_enable(priv->vdd_reg, false);
+ regulator_set_enable(dsi->vdd_reg, false);
return -ENODEV;
}
ret = clk_enable(&clk);
if (ret) {
dev_err(dev, "peripheral clock enable error %d\n", ret);
- regulator_set_enable(priv->vdd_reg, false);
+ regulator_set_enable(dsi->vdd_reg, false);
return -ENODEV;
}
@@ -404,23 +403,33 @@ static int stm32_dsi_probe(struct udevice *dev)
if (ret) {
dev_err(dev, "pll reference clock get error %d\n", ret);
clk_disable(&clk);
- regulator_set_enable(priv->vdd_reg, false);
+ regulator_set_enable(dsi->vdd_reg, false);
return ret;
}
- priv->pllref_clk = (unsigned int)clk_get_rate(&clk);
+ dsi->pllref_clk = (unsigned int)clk_get_rate(&clk);
ret = reset_get_by_index(device->dev, 0, &rst);
if (ret) {
dev_err(dev, "missing dsi hardware reset\n");
clk_disable(&clk);
- regulator_set_enable(priv->vdd_reg, false);
+ regulator_set_enable(dsi->vdd_reg, false);
return -ENODEV;
}
/* Reset */
reset_deassert(&rst);
+ /* check hardware version */
+ dsi->hw_version = dsi_read(dsi, DSI_VERSION) & VERSION;
+ if (dsi->hw_version != HWVER_130 &&
+ dsi->hw_version != HWVER_131) {
+ dev_err(dev, "bad dsi hardware version\n");
+ clk_disable(&clk);
+ regulator_set_enable(dsi->vdd_reg, false);
+ return -ENODEV;
+ }
+
return 0;
}
--
2.7.4