Hi Hanjun,

Okay, you are right, thank you for providing a better way and patch set.

------------------------------------------------------------------

Hi Guo Hui,

Thanks a lot for this patch, I got some comments inline.

On 2021/8/12 20:30, Guo Hui wrote:
> uniontech inclusion
> category: bugfix
> bugzilla: NA
> CVE: NA
>
> Due to a problem with the IOMMU hardware of Phytium S2500/FT-2500,
> running the following commands on a Phytium S2500/FT-2500 machine
> will cause the system to hang
> "dd if=/dev/zero of=tmp.img bs=1M count=409600"
> and "I/O error" will be printed in the console.
>
> This patch can solve the problem on Phytium S2500/FT-2500
> by passthrough IOMMU.After installing the kernel using this patch,
> use the following command to check the parameter "iommu.passthrough=on":
> "cat /proc/cmdline"

I don't think it's a good solution, if we add iommu.passthrough=off or
iommu=nopt in boot cmdline, will this be overlapped or replaced?

>
> Signed-off-by: Guo Hui
> ---
> arch/arm64/include/asm/cputype.h | 4 ++++
> init/main.c | 16 ++++++++++++++++
> 2 files changed, 20 insertions(+)
>
> diff --git a/arch/arm64/include/asm/cputype.h b/arch/arm64/include/asm/cputype.h
> index f33947af79d9..32687e4316fb 100644
> --- a/arch/arm64/include/asm/cputype.h
> +++ b/arch/arm64/include/asm/cputype.h
> @@ -85,6 +85,8 @@
>
> #define APM_CPU_PART_POTENZA 0x000
>
> +#define PHYTIUM_CPU_PART_2500 0X663

X -> x

> +
> #define CAVIUM_CPU_PART_THUNDERX 0x0A1
> #define CAVIUM_CPU_PART_THUNDERX_81XX 0x0A2
> #define CAVIUM_CPU_PART_THUNDERX_83XX 0x0A3
> @@ -123,6 +125,8 @@
> #define MIDR_NVIDIA_CARMEL MIDR_CPU_MODEL(ARM_CPU_IMP_NVIDIA, NVIDIA_CPU_PART_CARMEL)
> #define MIDR_HISI_TSV110 MIDR_CPU_MODEL(ARM_CPU_IMP_HISI, HISI_CPU_PART_TSV110)
> #define MIDR_HISI_TSV200 MIDR_CPU_MODEL(ARM_CPU_IMP_HISI, HISI_CPU_PART_TSV200)
> +#define MIDR_FT_2500 MIDR_CPU_MODEL(ARM_CPU_IMP_PHYTIUM,
> + PHYTIUM_CPU_PART_2500)

This can be a separate path, and FT-2000 have the same issue, so we
can add FT-2000 as well.

>
> #ifndef __ASSEMBLY__
>
> diff --git a/init/main.c b/init/main.c
> index c149972b46ad..388d6bd3b5b3 100644
> --- a/init/main.c
> +++ b/init/main.c
> @@ -473,6 +473,22 @@ void __init parse_early_param(void)
> static int done __initdata;
> static char tmp_cmdline[COMMAND_LINE_SIZE] __initdata;
>
> +#ifdef CONFIG_ARM_GIC_PHYTIUM_2500
> + if ((read_cpuid_id() & MIDR_CPU_MODEL_MASK) == MIDR_FT_2500) {
> + char *iommu_cmd = " iommu.passthrough=on";
> + int iommu_cmd_len = strlen(iommu_cmd);
> + int boot_cmd_line_len = strlen(boot_command_line);
> + int last_args_len = COMMAND_LINE_SIZE - boot_cmd_line_len;
> +
> + if (last_args_len >= (iommu_cmd_len + 1)) {
> + pr_info("FT S2500 iommu type: IOMMU_DOMAIN_IDENTITY");
> + strncat(boot_command_line, iommu_cmd, iommu_cmd_len);
> + } else {
> + pr_err("FT S2500 boot_cmd_line is too long, add 'iommu.passthrough=on' failed.");
> + }
> + }
> +#endif

As I said above, I think there is a better way to fix the issue,
if it's fine to you, I can help to prepare a patch set for this issue.

Thanks
Hanjun