From 7da6345919ee59a26cf65b4bc29072eea2fc0909 Mon Sep 17 00:00:00 2001 From: Ye Li Date: Wed, 17 May 2017 02:19:25 -0500 Subject: [PATCH] MLK-14938-8 imx8: Add SMMU setup to Soc codes We setup SMMU in arch_preboot_os to avoid breaking u-boot driver. Add a kconfig entry CONFIG_IMX_SMMU to enable it. So far, the USDHC0-USDHC1 and FEC0-FEC1 are added into sid. Signed-off-by: Peng Fan Signed-off-by: Ye Li --- arch/arm/cpu/armv8/imx8/Kconfig | 5 ++++ arch/arm/cpu/armv8/imx8/cpu.c | 44 ++++++++++++++++++++++++++++ arch/arm/include/asm/arch-imx8/sid.h | 14 +++++++++ 3 files changed, 63 insertions(+) create mode 100644 arch/arm/include/asm/arch-imx8/sid.h diff --git a/arch/arm/cpu/armv8/imx8/Kconfig b/arch/arm/cpu/armv8/imx8/Kconfig index 5e44a5cbf6..3acddf3239 100644 --- a/arch/arm/cpu/armv8/imx8/Kconfig +++ b/arch/arm/cpu/armv8/imx8/Kconfig @@ -5,6 +5,11 @@ config HAVE_SC_FIRMWARE help Have SCU on the SoC +config IMX_SMMU + bool "Enable SMMU on i.MX8" + help + Enable the SMMU for peripherals on i.MX8 + config IMX8 bool default y diff --git a/arch/arm/cpu/armv8/imx8/cpu.c b/arch/arm/cpu/armv8/imx8/cpu.c index 61c71d1bd1..1fc760a9a7 100644 --- a/arch/arm/cpu/armv8/imx8/cpu.c +++ b/arch/arm/cpu/armv8/imx8/cpu.c @@ -13,6 +13,7 @@ #include #include #include +#include #include DECLARE_GLOBAL_DATA_PTR; @@ -129,6 +130,13 @@ int arch_cpu_init(void) gd->arch.ipc_channel_handle = ipcHndl; +#ifdef CONFIG_IMX_SMMU + sciErr = sc_pm_set_resource_power_mode(ipcHndl, SC_R_SMMU, + SC_PM_PW_MODE_ON); + if (sciErr != SC_ERR_NONE) + return 0; +#endif + return 0; } @@ -318,3 +326,39 @@ void imx_get_mac_from_fuse(int dev_id, unsigned char *mac) mac[4] = val2; mac[5] = val2 >> 8; } + +#ifdef CONFIG_IMX_SMMU +struct smmu_sid dev_sids[] = { + { SC_R_SDHC_0, 0x11, "SDHC0" }, + { SC_R_SDHC_1, 0x11, "SDHC1" }, + { SC_R_SDHC_2, 0x11, "SDHC2" }, + { SC_R_ENET_0, 0x12, "FEC0" }, + { SC_R_ENET_1, 0x12, "FEC1" }, +}; + +sc_err_t imx8_config_smmu_sid(struct smmu_sid *dev_sids, int size) +{ + int i; + sc_err_t sciErr = SC_ERR_NONE; + + if ((dev_sids == NULL) || (size <= 0)) + return SC_ERR_NONE; + + for (i = 0; i < size; i++) { + sciErr = sc_rm_set_master_sid(gd->arch.ipc_channel_handle, + dev_sids[i].rsrc, + dev_sids[i].sid); + if (sciErr != SC_ERR_NONE) { + printf("set master sid error\n"); + return sciErr; + } + } + + return SC_ERR_NONE; +} + +void arch_preboot_os(void) +{ + imx8_config_smmu_sid(dev_sids, ARRAY_SIZE(dev_sids)); +} +#endif diff --git a/arch/arm/include/asm/arch-imx8/sid.h b/arch/arm/include/asm/arch-imx8/sid.h new file mode 100644 index 0000000000..1bc1dbb65c --- /dev/null +++ b/arch/arm/include/asm/arch-imx8/sid.h @@ -0,0 +1,14 @@ +/* + * Copyright 2017 NXP + * + * SPDX-License-Identifier: GPL-2.0+ + */ +#include + +struct smmu_sid { + sc_rsrc_t rsrc; + sc_rm_sid_t sid; + char dev_name[32]; +}; + +sc_err_t imx8_config_smmu_sid(struct smmu_sid *dev_sids, int size); -- 2.17.1