Let's kickstart the v6.8 release cycle.
Signed-off-by: Maxime Ripard <mripard@kernel.org>
        disable_irq(vdev->irq);
        ivpu_ipc_disable(vdev);
        ivpu_mmu_disable(vdev);
 +      ivpu_job_done_thread_disable(vdev);
+ }
+ 
+ int ivpu_shutdown(struct ivpu_device *vdev)
+ {
+       int ret;
+ 
+       ivpu_prepare_for_reset(vdev);
  
        ret = ivpu_hw_power_down(vdev);
        if (ret)
 
  {
        struct ivpu_bo *ipc_mem_rx = vdev->ipc->mem_rx;
  
 -      /* In case of warm boot we only have to reset the entrypoint addr */
 +      /* In case of warm boot only update variable params */
        if (!ivpu_fw_is_cold_boot(vdev)) {
 +              boot_params->d0i3_residency_time_us =
 +                      ktime_us_delta(ktime_get_boottime(), vdev->hw->d0i3_entry_host_ts);
 +              boot_params->d0i3_entry_vpu_ts = vdev->hw->d0i3_entry_vpu_ts;
 +
 +              ivpu_dbg(vdev, FW_BOOT, "boot_params.d0i3_residency_time_us = %lld\n",
 +                       boot_params->d0i3_residency_time_us);
 +              ivpu_dbg(vdev, FW_BOOT, "boot_params.d0i3_entry_vpu_ts = %llu\n",
 +                       boot_params->d0i3_entry_vpu_ts);
 +
                boot_params->save_restore_ret_address = 0;
                vdev->pm->is_warmboot = true;
+               wmb(); /* Flush WC buffers after writing save_restore_ret_address */
                return;
        }
  
 
        int (*power_up)(struct ivpu_device *vdev);
        int (*boot_fw)(struct ivpu_device *vdev);
        int (*power_down)(struct ivpu_device *vdev);
+       int (*reset)(struct ivpu_device *vdev);
        bool (*is_idle)(struct ivpu_device *vdev);
 +      int (*wait_for_idle)(struct ivpu_device *vdev);
        void (*wdt_disable)(struct ivpu_device *vdev);
        void (*diagnose_failure)(struct ivpu_device *vdev);
 +      u32 (*profiling_freq_get)(struct ivpu_device *vdev);
 +      void (*profiling_freq_drive)(struct ivpu_device *vdev, bool enable);
        u32 (*reg_pll_freq_get)(struct ivpu_device *vdev);
        u32 (*reg_telemetry_offset_get)(struct ivpu_device *vdev);
        u32 (*reg_telemetry_size_get)(struct ivpu_device *vdev);
 
        .info_init = ivpu_hw_37xx_info_init,
        .power_up = ivpu_hw_37xx_power_up,
        .is_idle = ivpu_hw_37xx_is_idle,
 +      .wait_for_idle = ivpu_hw_37xx_wait_for_idle,
        .power_down = ivpu_hw_37xx_power_down,
+       .reset = ivpu_hw_37xx_reset,
        .boot_fw = ivpu_hw_37xx_boot_fw,
        .wdt_disable = ivpu_hw_37xx_wdt_disable,
        .diagnose_failure = ivpu_hw_37xx_diagnose_failure,
 
        .info_init = ivpu_hw_40xx_info_init,
        .power_up = ivpu_hw_40xx_power_up,
        .is_idle = ivpu_hw_40xx_is_idle,
 +      .wait_for_idle = ivpu_hw_40xx_wait_for_idle,
        .power_down = ivpu_hw_40xx_power_down,
+       .reset = ivpu_hw_40xx_reset,
        .boot_fw = ivpu_hw_40xx_boot_fw,
        .wdt_disable = ivpu_hw_40xx_wdt_disable,
        .diagnose_failure = ivpu_hw_40xx_diagnose_failure,
 
        struct ivpu_ipc_rx_msg *rx_msg;
        int wait_ret, ret = 0;
  
-       wait_ret = wait_event_interruptible_timeout(cons->rx_msg_wq,
-                                                   ivpu_ipc_rx_need_wakeup(cons),
-                                                   msecs_to_jiffies(timeout_ms));
+       wait_ret = wait_event_timeout(cons->rx_msg_wq,
 -                                    (IS_KTHREAD() && kthread_should_stop()) ||
 -                                    !list_empty(&cons->rx_msg_list),
++                                    ivpu_ipc_rx_need_wakeup(cons),
+                                     msecs_to_jiffies(timeout_ms));
  
        if (IS_KTHREAD() && kthread_should_stop())
                return -EINTR;
 
        u64 prot;
        u64 i;
  
 +      if (drm_WARN_ON(&vdev->drm, !ctx))
 +              return -EINVAL;
 +
        if (!IS_ALIGNED(vpu_addr, IVPU_MMU_PAGE_SIZE))
                return -EINVAL;
-       /*
-        * VPU is only 32 bit, but DMA engine is 38 bit
-        * Ranges < 2 GB are reserved for VPU internal registers
-        * Limit range to 8 GB
-        */
-       if (vpu_addr < SZ_2G || vpu_addr > SZ_8G)
+ 
+       if (vpu_addr & ~IVPU_MMU_VPU_ADDRESS_MASK)
                return -EINVAL;
  
        prot = IVPU_MMU_ENTRY_MAPPED;