On Tue, Mar 04, 2025 at 11:56:47AM -0500, Connor Abbott wrote:
> This will be used by drm/msm for GPU page faults, replacing the manual
> register reading it does.
> 
> Signed-off-by: Connor Abbott <cwabbo...@gmail.com>
> ---
>  drivers/iommu/arm/arm-smmu/arm-smmu-qcom-debug.c |  4 ++--
>  drivers/iommu/arm/arm-smmu/arm-smmu.c            | 27 
> +++++++++++++-----------
>  drivers/iommu/arm/arm-smmu/arm-smmu.h            |  5 ++++-
>  3 files changed, 21 insertions(+), 15 deletions(-)
> 
> diff --git a/drivers/iommu/arm/arm-smmu/arm-smmu-qcom-debug.c 
> b/drivers/iommu/arm/arm-smmu/arm-smmu-qcom-debug.c
> index 
> 548783f3f8e89fd978367afa65c473002f66e2e7..ae4fdbbce6ba80440f539557a39866a932360d4e
>  100644
> --- a/drivers/iommu/arm/arm-smmu/arm-smmu-qcom-debug.c
> +++ b/drivers/iommu/arm/arm-smmu/arm-smmu-qcom-debug.c
> @@ -400,7 +400,7 @@ irqreturn_t qcom_smmu_context_fault(int irq, void *dev)
>  
>       if (list_empty(&tbu_list)) {
>               ret = report_iommu_fault(&smmu_domain->domain, NULL, cfi.iova,
> -                                      cfi.fsynr & ARM_SMMU_CB_FSYNR0_WNR ? 
> IOMMU_FAULT_WRITE : IOMMU_FAULT_READ);
> +                                      cfi.fsynr0 & ARM_SMMU_CB_FSYNR0_WNR ? 
> IOMMU_FAULT_WRITE : IOMMU_FAULT_READ);
>  
>               if (ret == -ENOSYS)
>                       arm_smmu_print_context_fault_info(smmu, idx, &cfi);
> @@ -412,7 +412,7 @@ irqreturn_t qcom_smmu_context_fault(int irq, void *dev)
>       phys_soft = ops->iova_to_phys(ops, cfi.iova);
>  
>       tmp = report_iommu_fault(&smmu_domain->domain, NULL, cfi.iova,
> -                              cfi.fsynr & ARM_SMMU_CB_FSYNR0_WNR ? 
> IOMMU_FAULT_WRITE : IOMMU_FAULT_READ);
> +                              cfi.fsynr0 & ARM_SMMU_CB_FSYNR0_WNR ? 
> IOMMU_FAULT_WRITE : IOMMU_FAULT_READ);
>       if (!tmp || tmp == -EBUSY) {
>               ret = IRQ_HANDLED;
>               resume = ARM_SMMU_RESUME_TERMINATE;
> diff --git a/drivers/iommu/arm/arm-smmu/arm-smmu.c 
> b/drivers/iommu/arm/arm-smmu/arm-smmu.c
> index 
> ade4684c14c9b2724a71e2457288dbfaf7562c83..a9213e0f1579d1e3be0bfba75eea1d5de23117de
>  100644
> --- a/drivers/iommu/arm/arm-smmu/arm-smmu.c
> +++ b/drivers/iommu/arm/arm-smmu/arm-smmu.c
> @@ -409,9 +409,12 @@ void arm_smmu_read_context_fault_info(struct 
> arm_smmu_device *smmu, int idx,
>                                     struct arm_smmu_context_fault_info *cfi)
>  {
>       cfi->iova = arm_smmu_cb_readq(smmu, idx, ARM_SMMU_CB_FAR);
> +     cfi->ttbr0 = arm_smmu_cb_readq(smmu, idx, ARM_SMMU_CB_TTBR0);
>       cfi->fsr = arm_smmu_cb_read(smmu, idx, ARM_SMMU_CB_FSR);
> -     cfi->fsynr = arm_smmu_cb_read(smmu, idx, ARM_SMMU_CB_FSYNR0);
> +     cfi->fsynr0 = arm_smmu_cb_read(smmu, idx, ARM_SMMU_CB_FSYNR0);
> +     cfi->fsynr1 = arm_smmu_cb_read(smmu, idx, ARM_SMMU_CB_FSYNR1);

We already have an implementation hook (->get_fault_info()) which the
qcom SMMU driver can override with qcom_adreno_smmu_get_fault_info().
That thing dumps these registers already so if we're moving that into
the core SMMU driver, let's get rid of the hook and move everybody over
rather than having it done in both places.

>       cfi->cbfrsynra = arm_smmu_gr1_read(smmu, ARM_SMMU_GR1_CBFRSYNRA(idx));
> +     cfi->contextidr = arm_smmu_cb_read(smmu, idx, ARM_SMMU_CB_CONTEXTIDR);

I think the CONTEXTIDR register is stage-1 only, so we shouldn't dump
it for stage-2 domains.

Will

Reply via email to