[PATCH v11 09/11] iommu/arm-smmu-v3: Retain CR0_SMMUEN during kdump device reset

John Garry john.garry at arm.com
Wed Oct 21 09:53:23 PDT 2026


On 10/5/26 20:30, Nicolin Chen wrote:
> +	/*
> +	 * In a kdump case (set when CR0_SMMUEN=1 and !GERROR_SFM_ERR), retain
> +	 * all the live CR0 fields, e.g. CR0_SMMUEN to avoid aborting in-flight
> +	 * DMA and CR0_ATSCHK to carry on the ATS-check policy, while clearing
> +	 * only the queue enable bits for this kernel to take over the queues.
> +	 *
> +	 * According to spec, updating STRTAB_BASE/CR1/CR2 when CR0_SMMUEN=1 is
> +	 * CONSTRAINED UNPREDICTABLE. So, skip those register updates and rely
> +	 * on the adopted stream table from the crashed kernel.
> +	 */
> +	if (smmu->options & ARM_SMMU_OPT_KDUMP_ADOPT) {
> +		dev_info(smmu->dev,
> +			 "kdump: retaining SMMUEN for in-flight DMA\n");
> +		enables = reg & ~(CR0_CMDQEN | CR0_EVTQEN | CR0_PRIQEN);
> +		goto reset_queues;

nit: Is there some reason to separate the call to 
arm_smmu_write_reg_sync() under the ARM_SMMU_OPT_KDUMP_ADOPT check, below?

> +	}
> +
> +	/* Clear CR0 and sync (disables SMMU and queue processing) */
>   	if (reg & CR0_SMMUEN) {
>   		dev_warn(smmu->dev, "SMMU currently enabled! Resetting...\n");
>   		arm_smmu_update_gbpa(smmu, GBPA_ABORT, 0);
> @@ -5181,12 +5199,41 @@ static int arm_smmu_device_reset(struct arm_smmu_device *smmu)
>   	/* Stream table */
>   	arm_smmu_write_strtab(smmu);
>   
> +reset_queues:
> +	if (smmu->options & ARM_SMMU_OPT_KDUMP_ADOPT) {
 > +		/*> +		 * Disable queues since arm_smmu_device_disable() was skipped.
> +		 * CR0 fields are independent per spec, so the queue enable bits
> +		 * can be cleared while retaining SMMUEN=1.
> +		 */
> +		ret = arm_smmu_write_reg_sync(smmu, enables, ARM_SMMU_CR0,
> +					      ARM_SMMU_CR0ACK);
> +		if (ret) {
> +			dev_err(smmu->dev, "failed to disable queues\n");
> +			return ret;
> +		}
> +	}




More information about the linux-arm-kernel mailing list