]> www.infradead.org Git - users/jedix/linux-maple.git/commitdiff
accel/ivpu: Add wp0_during_power_up WA
authorWachowski, Karol <karol.wachowski@intel.com>
Tue, 11 Jun 2024 12:04:18 +0000 (14:04 +0200)
committerJacek Lawrynowicz <jacek.lawrynowicz@linux.intel.com>
Fri, 14 Jun 2024 07:09:36 +0000 (09:09 +0200)
Send workpoint 0 request during power up on 37xx.
This is needed in rare case where WP0 was not sent
during power down due to device hang.

Signed-off-by: Wachowski, Karol <karol.wachowski@intel.com>
Reviewed-by: Jacek Lawrynowicz <jacek.lawrynowicz@linux.intel.com>
Signed-off-by: Jacek Lawrynowicz <jacek.lawrynowicz@linux.intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20240611120433.1012423-2-jacek.lawrynowicz@linux.intel.com
drivers/accel/ivpu/ivpu_drv.h
drivers/accel/ivpu/ivpu_hw.c

index 39df96a7623bcc7b01127277f961738b19723b9c..823e10c41816f58625704f85eb301fe4988c2109 100644 (file)
@@ -102,6 +102,7 @@ struct ivpu_wa_table {
        bool interrupt_clear_with_0;
        bool disable_clock_relinquish;
        bool disable_d0i3_msg;
+       bool wp0_during_power_up;
 };
 
 struct ivpu_hw_info;
index 9f5e3875baf1967f4a2361be774eeb0984989ed0..daf1e4afb479fe0dc1dd41e570e8caace27c0d9f 100644 (file)
@@ -64,10 +64,14 @@ static void wa_init(struct ivpu_device *vdev)
        if (ivpu_device_id(vdev) == PCI_DEVICE_ID_LNL)
                vdev->wa.disable_clock_relinquish = true;
 
+       if (ivpu_hw_ip_gen(vdev) == IVPU_HW_IP_37XX)
+               vdev->wa.wp0_during_power_up = true;
+
        IVPU_PRINT_WA(punit_disabled);
        IVPU_PRINT_WA(clear_runtime_mem);
        IVPU_PRINT_WA(interrupt_clear_with_0);
        IVPU_PRINT_WA(disable_clock_relinquish);
+       IVPU_PRINT_WA(wp0_during_power_up);
 }
 
 static void timeouts_init(struct ivpu_device *vdev)
@@ -125,6 +129,13 @@ int ivpu_hw_power_up(struct ivpu_device *vdev)
 {
        int ret;
 
+       if (IVPU_WA(wp0_during_power_up)) {
+               /* WP requests may fail when powering down, so issue WP 0 here */
+               ret = wp_disable(vdev);
+               if (ret)
+                       ivpu_warn(vdev, "Failed to disable workpoint: %d\n", ret);
+       }
+
        ret = ivpu_hw_btrs_d0i3_disable(vdev);
        if (ret)
                ivpu_warn(vdev, "Failed to disable D0I3: %d\n", ret);