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