From e5515b9593fb7e74598fe744d7b1e355c5b904df 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 (cherry picked from commit 7da6345919ee59a26cf65b4bc29072eea2fc0909) --- arch/arm/include/asm/arch-imx8/sci/sci.h | 5 +++ arch/arm/include/asm/arch-imx8/sid.h | 14 +++++++ arch/arm/mach-imx/imx8/Kconfig | 5 +++ arch/arm/mach-imx/imx8/cpu.c | 47 ++++++++++++++++++++++++ drivers/misc/imx8/scu_api.c | 23 ++++++++++++ 5 files changed, 94 insertions(+) create mode 100644 arch/arm/include/asm/arch-imx8/sid.h diff --git a/arch/arm/include/asm/arch-imx8/sci/sci.h b/arch/arm/include/asm/arch-imx8/sci/sci.h index d1621669e2..4f97e2e1c9 100644 --- a/arch/arm/include/asm/arch-imx8/sci/sci.h +++ b/arch/arm/include/asm/arch-imx8/sci/sci.h @@ -85,4 +85,9 @@ sc_bool_t sc_rm_is_resource_owned(sc_ipc_t ipc, sc_rsrc_t resource); /* PAD API */ int sc_pad_set(sc_ipc_t ipc, sc_pad_t pad, u32 val); + +/* SMMU API */ +int sc_rm_set_master_sid(sc_ipc_t ipc, sc_rsrc_t resource, + sc_rm_sid_t sid); + #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..fd5c5a9545 --- /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]; +}; + +int imx8_config_smmu_sid(struct smmu_sid *dev_sids, int size); diff --git a/arch/arm/mach-imx/imx8/Kconfig b/arch/arm/mach-imx/imx8/Kconfig index 44c2ffd2ee..7e6419e786 100644 --- a/arch/arm/mach-imx/imx8/Kconfig +++ b/arch/arm/mach-imx/imx8/Kconfig @@ -1,5 +1,10 @@ if ARCH_IMX8 +config IMX_SMMU + bool "Enable SMMU on i.MX8" + help + Enable the SMMU for peripherals on i.MX8 + config IMX8 bool diff --git a/arch/arm/mach-imx/imx8/cpu.c b/arch/arm/mach-imx/imx8/cpu.c index 921334c011..ec2a2eae0d 100644 --- a/arch/arm/mach-imx/imx8/cpu.c +++ b/arch/arm/mach-imx/imx8/cpu.c @@ -12,6 +12,7 @@ #include #include #include +#include #include #include #include @@ -66,8 +67,54 @@ int arch_cpu_init_dm(void) return ret; } +#ifdef CONFIG_IMX_SMMU + int sciErr; + sciErr = sc_pm_set_resource_power_mode(-1, SC_R_SMMU, + SC_PM_PW_MODE_ON); + if (sciErr) + return 0; +#endif + + return 0; +} + +#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" }, +}; + +int imx8_config_smmu_sid(struct smmu_sid *dev_sids, int size) +{ + int i; + int sciErr = 0; + + if ((dev_sids == NULL) || (size <= 0)) + return 0; + + for (i = 0; i < size; i++) { + sciErr = sc_rm_set_master_sid(-1, + dev_sids[i].rsrc, + dev_sids[i].sid); + if (sciErr) { + printf("set master sid error\n"); + return sciErr; + } + } + return 0; } +#endif + +void arch_preboot_os(void) +{ +#ifdef CONFIG_IMX_SMMU + imx8_config_smmu_sid(dev_sids, ARRAY_SIZE(dev_sids)); +#endif +} int print_bootinfo(void) { diff --git a/drivers/misc/imx8/scu_api.c b/drivers/misc/imx8/scu_api.c index d9c4d5d784..95bcd5753d 100644 --- a/drivers/misc/imx8/scu_api.c +++ b/drivers/misc/imx8/scu_api.c @@ -365,3 +365,26 @@ sc_bool_t sc_rm_is_resource_owned(sc_ipc_t ipc, sc_rsrc_t resource) return !!result; } + +int sc_rm_set_master_sid(sc_ipc_t ipc, sc_rsrc_t resource, + sc_rm_sid_t sid) +{ + struct udevice *dev = gd->arch.scu_dev; + struct sc_rpc_msg_s msg; + int size = sizeof(struct sc_rpc_msg_s); + int ret; + + RPC_VER(&msg) = SC_RPC_VERSION; + RPC_SVC(&msg) = (u8)SC_RPC_SVC_RM; + RPC_FUNC(&msg) = (u8)RM_FUNC_SET_MASTER_SID; + RPC_U16(&msg, 0U) = (u16)resource; + RPC_U16(&msg, 2U) = (u16)sid; + RPC_SIZE(&msg) = 2U; + + ret = misc_call(dev, SC_FALSE, &msg, size, &msg, size); + if (ret) + printf("%s: resource:%d sid:%d: res:%d\n", + __func__, resource, sid, RPC_R8(&msg)); + + return ret; +} -- 2.17.1