[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