]> git.proxmox.com Git - mirror_ubuntu-hirsute-kernel.git/commitdiff
habanalabs: use PI in MMU cache invalidation
authorOmer Shpigelman <oshpigelman@habana.ai>
Wed, 3 Jun 2020 10:03:35 +0000 (13:03 +0300)
committerOded Gabbay <oded.gabbay@gmail.com>
Wed, 24 Jun 2020 06:09:10 +0000 (09:09 +0300)
The PS flow for MMU cache invalidation caused timeouts in stress tests.
Use PS + PI flow so no timeouts should happen whatsoever.

Signed-off-by: Omer Shpigelman <oshpigelman@habana.ai>
Reviewed-by: Oded Gabbay <oded.gabbay@gmail.com>
Signed-off-by: Oded Gabbay <oded.gabbay@gmail.com>
drivers/misc/habanalabs/gaudi/gaudi.c
drivers/misc/habanalabs/gaudi/gaudiP.h

index f34ac8d35a14189b07fa0433a83dfd7c0c767262..211547d4f8a7b1086465407f9f5024a3c338cc57 100644 (file)
@@ -2725,6 +2725,12 @@ static int gaudi_mmu_init(struct hl_device *hdev)
        WREG32(mmSTLB_HOP_CONFIGURATION,
                        hdev->mmu_huge_page_opt ? 0x30440 : 0x40440);
 
+       /*
+        * The H/W expects the first PI after init to be 1. After wraparound
+        * we'll write 0.
+        */
+       gaudi->mmu_cache_inv_pi = 1;
+
        gaudi->hw_cap_initialized |= HW_CAP_MMU;
 
        return 0;
@@ -6017,6 +6023,8 @@ static int gaudi_mmu_invalidate_cache(struct hl_device *hdev, bool is_hard,
        mutex_lock(&hdev->mmu_cache_lock);
 
        /* L0 & L1 invalidation */
+       WREG32(mmSTLB_INV_PS, 3);
+       WREG32(mmSTLB_CACHE_INV, gaudi->mmu_cache_inv_pi++);
        WREG32(mmSTLB_INV_PS, 2);
 
        rc = hl_poll_timeout(
index a46530d375fa2c14ed6ceedca20096e6f921404c..41a8d9bff6bf9a77d90c3365bceda898c515343b 100644 (file)
@@ -229,6 +229,8 @@ struct gaudi_internal_qman_info {
  * @multi_msi_mode: whether we are working in multi MSI single MSI mode.
  *                  Multi MSI is possible only with IOMMU enabled.
  * @ext_queue_idx: helper index for external queues initialization.
+ * @mmu_cache_inv_pi: PI for MMU cache invalidation flow. The H/W expects an
+ *                    8-bit value so use u8.
  */
 struct gaudi_device {
        int (*armcp_info_get)(struct hl_device *hdev);
@@ -248,6 +250,7 @@ struct gaudi_device {
        u32                             hw_cap_initialized;
        u8                              multi_msi_mode;
        u8                              ext_queue_idx;
+       u8                              mmu_cache_inv_pi;
 };
 
 void gaudi_init_security(struct hl_device *hdev);