Loading drivers/iommu/arm-smmu.c +19 −5 Original line number Diff line number Diff line Loading @@ -1195,7 +1195,18 @@ static void arm_smmu_testbus_dump(struct arm_smmu_device *smmu, u16 sid) } } static void __arm_smmu_tlb_sync_timeout(struct arm_smmu_device *smmu) static void __arm_smmu_tlb_sync_timeout_SMMUV2(struct arm_smmu_device *smmu) { static DEFINE_RATELIMIT_STATE(_rs, DEFAULT_RATELIMIT_INTERVAL, DEFAULT_RATELIMIT_BURST); if (__ratelimit(&_rs)) dev_err(smmu->dev, "TLB sync timed out -- SMMUV2 may be deadlocked\n"); } static void __arm_smmu_tlb_sync_timeout_SMMUV500(struct arm_smmu_device *smmu) { u32 sync_inv_ack, tbu_pwr_status, sync_inv_progress; u32 tbu_inv_pending = 0, tbu_sync_pending = 0; Loading Loading @@ -1241,7 +1252,7 @@ static void __arm_smmu_tlb_sync_timeout(struct arm_smmu_device *smmu) unsigned long tbu_id, tbus_t = tbu_ids; dev_err(smmu->dev, "TLB sync timed out -- SMMU may be deadlocked\n" "TLB sync timed out -- SMMUV500 may be deadlocked\n" "TBU ACK 0x%x TBU PWR 0x%x TCU sync_inv 0x%x\n", sync_inv_ack, tbu_pwr_status, sync_inv_progress); dev_err(smmu->dev, Loading Loading @@ -1274,8 +1285,6 @@ static void __arm_smmu_tlb_sync_timeout(struct arm_smmu_device *smmu) /*dump TCU testbus*/ arm_smmu_testbus_dump(smmu, U16_MAX); } BUG_ON(IS_ENABLED(CONFIG_IOMMU_TLBSYNC_DEBUG)); } /* Wait for any pending TLB invalidations to complete */ Loading @@ -1295,7 +1304,12 @@ static int __arm_smmu_tlb_sync(struct arm_smmu_device *smmu, inc *= 2; } trace_tlbsync_timeout(smmu->dev, 0); __arm_smmu_tlb_sync_timeout(smmu); if (smmu->model == QCOM_SMMUV500) __arm_smmu_tlb_sync_timeout_SMMUV500(smmu); else if (smmu->model == QCOM_SMMUV2) __arm_smmu_tlb_sync_timeout_SMMUV2(smmu); BUG_ON(IS_ENABLED(CONFIG_IOMMU_TLBSYNC_DEBUG)); return -EINVAL; } Loading Loading
drivers/iommu/arm-smmu.c +19 −5 Original line number Diff line number Diff line Loading @@ -1195,7 +1195,18 @@ static void arm_smmu_testbus_dump(struct arm_smmu_device *smmu, u16 sid) } } static void __arm_smmu_tlb_sync_timeout(struct arm_smmu_device *smmu) static void __arm_smmu_tlb_sync_timeout_SMMUV2(struct arm_smmu_device *smmu) { static DEFINE_RATELIMIT_STATE(_rs, DEFAULT_RATELIMIT_INTERVAL, DEFAULT_RATELIMIT_BURST); if (__ratelimit(&_rs)) dev_err(smmu->dev, "TLB sync timed out -- SMMUV2 may be deadlocked\n"); } static void __arm_smmu_tlb_sync_timeout_SMMUV500(struct arm_smmu_device *smmu) { u32 sync_inv_ack, tbu_pwr_status, sync_inv_progress; u32 tbu_inv_pending = 0, tbu_sync_pending = 0; Loading Loading @@ -1241,7 +1252,7 @@ static void __arm_smmu_tlb_sync_timeout(struct arm_smmu_device *smmu) unsigned long tbu_id, tbus_t = tbu_ids; dev_err(smmu->dev, "TLB sync timed out -- SMMU may be deadlocked\n" "TLB sync timed out -- SMMUV500 may be deadlocked\n" "TBU ACK 0x%x TBU PWR 0x%x TCU sync_inv 0x%x\n", sync_inv_ack, tbu_pwr_status, sync_inv_progress); dev_err(smmu->dev, Loading Loading @@ -1274,8 +1285,6 @@ static void __arm_smmu_tlb_sync_timeout(struct arm_smmu_device *smmu) /*dump TCU testbus*/ arm_smmu_testbus_dump(smmu, U16_MAX); } BUG_ON(IS_ENABLED(CONFIG_IOMMU_TLBSYNC_DEBUG)); } /* Wait for any pending TLB invalidations to complete */ Loading @@ -1295,7 +1304,12 @@ static int __arm_smmu_tlb_sync(struct arm_smmu_device *smmu, inc *= 2; } trace_tlbsync_timeout(smmu->dev, 0); __arm_smmu_tlb_sync_timeout(smmu); if (smmu->model == QCOM_SMMUV500) __arm_smmu_tlb_sync_timeout_SMMUV500(smmu); else if (smmu->model == QCOM_SMMUV2) __arm_smmu_tlb_sync_timeout_SMMUV2(smmu); BUG_ON(IS_ENABLED(CONFIG_IOMMU_TLBSYNC_DEBUG)); return -EINVAL; } Loading