]> Git Repo - J-linux.git/blobdiff - drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c
drm/amdgpu: use string choice helpers
[J-linux.git] / drivers / gpu / drm / amd / amdgpu / amdgpu_drv.c
index 5dd39e6c6223e3c327e4107a38334bff0805dfa4..054d1837e56620d19fd6329429e6d01884cae158 100644 (file)
  * - 3.56.0 - Update IB start address and size alignment for decode and encode
  * - 3.57.0 - Compute tunneling on GFX10+
  * - 3.58.0 - Add GFX12 DCC support
+ * - 3.59.0 - Cleared VRAM
  */
 #define KMS_DRIVER_MAJOR       3
-#define KMS_DRIVER_MINOR       58
+#define KMS_DRIVER_MINOR       59
 #define KMS_DRIVER_PATCHLEVEL  0
 
 /*
@@ -131,6 +132,7 @@ enum AMDGPU_DEBUG_MASK {
        AMDGPU_DEBUG_DISABLE_GPU_SOFT_RECOVERY = BIT(2),
        AMDGPU_DEBUG_USE_VRAM_FW_BUF = BIT(3),
        AMDGPU_DEBUG_ENABLE_RAS_ACA = BIT(4),
+       AMDGPU_DEBUG_ENABLE_EXP_RESETS = BIT(5),
 };
 
 unsigned int amdgpu_vram_limit = UINT_MAX;
@@ -168,6 +170,16 @@ uint amdgpu_sdma_phase_quantum = 32;
 char *amdgpu_disable_cu;
 char *amdgpu_virtual_display;
 bool enforce_isolation;
+
+/* Specifies the default granularity for SVM, used in buffer
+ * migration and restoration of backing memory when handling
+ * recoverable page faults.
+ *
+ * The value is given as log(numPages(buffer)); for a 2 MiB
+ * buffer it computes to be 9
+ */
+uint amdgpu_svm_default_granularity = 9;
+
 /*
  * OverDrive(bit 14) disabled by default
  * GFX DCS(bit 19) disabled by default
@@ -219,8 +231,6 @@ int amdgpu_wbrf = -1;
 int amdgpu_damage_clips = -1; /* auto */
 int amdgpu_umsch_mm_fwlog;
 
-static void amdgpu_drv_delayed_reset_work_handler(struct work_struct *work);
-
 DECLARE_DYNDBG_CLASSMAP(drm_debug_classes, DD_CLASS_TYPE_DISJOINT_BITS, 0,
                        "DRM_UT_CORE",
                        "DRM_UT_DRIVER",
@@ -235,9 +245,6 @@ DECLARE_DYNDBG_CLASSMAP(drm_debug_classes, DD_CLASS_TYPE_DISJOINT_BITS, 0,
 
 struct amdgpu_mgpu_info mgpu_info = {
        .mutex = __MUTEX_INITIALIZER(mgpu_info.mutex),
-       .delayed_reset_work = __DELAYED_WORK_INITIALIZER(
-                       mgpu_info.delayed_reset_work,
-                       amdgpu_drv_delayed_reset_work_handler, 0),
 };
 int amdgpu_ras_enable = -1;
 uint amdgpu_ras_mask = 0xffffffff;
@@ -319,6 +326,13 @@ module_param_named(pcie_gen2, amdgpu_pcie_gen2, int, 0444);
 MODULE_PARM_DESC(msi, "MSI support (1 = enable, 0 = disable, -1 = auto)");
 module_param_named(msi, amdgpu_msi, int, 0444);
 
+/**
+ * DOC: svm_default_granularity (uint)
+ * Used in buffer migration and handling of recoverable page faults
+ */
+MODULE_PARM_DESC(svm_default_granularity, "SVM's default granularity in log(2^Pages), default 9 = 2^9 = 2 MiB");
+module_param_named(svm_default_granularity, amdgpu_svm_default_granularity, uint, 0644);
+
 /**
  * DOC: lockup_timeout (string)
  * Set GPU scheduler timeout value in ms.
@@ -873,7 +887,7 @@ module_param_named(visualconfirm, amdgpu_dc_visual_confirm, uint, 0444);
  * the ABM algorithm, with 1 being the least reduction and 4 being the most
  * reduction.
  *
- * Defaults to -1, or disabled. Userspace can only override this level after
+ * Defaults to -1, or auto. Userspace can only override this level after
  * boot if it's set to auto.
  */
 int amdgpu_dm_abm_level = -1;
@@ -2199,6 +2213,11 @@ static void amdgpu_init_debug_options(struct amdgpu_device *adev)
                pr_info("debug: enable RAS ACA\n");
                adev->debug_enable_ras_aca = true;
        }
+
+       if (amdgpu_debug_mask & AMDGPU_DEBUG_ENABLE_EXP_RESETS) {
+               pr_info("debug: enable experimental reset features\n");
+               adev->debug_exp_resets = true;
+       }
 }
 
 static unsigned long amdgpu_fix_asic_type(struct pci_dev *pdev, unsigned long flags)
@@ -2410,6 +2429,7 @@ amdgpu_pci_remove(struct pci_dev *pdev)
        struct amdgpu_device *adev = drm_to_adev(dev);
 
        amdgpu_xcp_dev_unplug(adev);
+       amdgpu_gmc_prepare_nps_mode_change(adev);
        drm_dev_unplug(dev);
 
        if (adev->pm.rpm_mode != AMDGPU_RUNPM_NONE) {
@@ -2448,82 +2468,6 @@ amdgpu_pci_shutdown(struct pci_dev *pdev)
        adev->mp1_state = PP_MP1_STATE_NONE;
 }
 
-/**
- * amdgpu_drv_delayed_reset_work_handler - work handler for reset
- *
- * @work: work_struct.
- */
-static void amdgpu_drv_delayed_reset_work_handler(struct work_struct *work)
-{
-       struct list_head device_list;
-       struct amdgpu_device *adev;
-       int i, r;
-       struct amdgpu_reset_context reset_context;
-
-       memset(&reset_context, 0, sizeof(reset_context));
-
-       mutex_lock(&mgpu_info.mutex);
-       if (mgpu_info.pending_reset == true) {
-               mutex_unlock(&mgpu_info.mutex);
-               return;
-       }
-       mgpu_info.pending_reset = true;
-       mutex_unlock(&mgpu_info.mutex);
-
-       /* Use a common context, just need to make sure full reset is done */
-       reset_context.method = AMD_RESET_METHOD_NONE;
-       set_bit(AMDGPU_NEED_FULL_RESET, &reset_context.flags);
-
-       for (i = 0; i < mgpu_info.num_dgpu; i++) {
-               adev = mgpu_info.gpu_ins[i].adev;
-               reset_context.reset_req_dev = adev;
-               r = amdgpu_device_pre_asic_reset(adev, &reset_context);
-               if (r) {
-                       dev_err(adev->dev, "GPU pre asic reset failed with err, %d for drm dev, %s ",
-                               r, adev_to_drm(adev)->unique);
-               }
-               if (!queue_work(system_unbound_wq, &adev->xgmi_reset_work))
-                       r = -EALREADY;
-       }
-       for (i = 0; i < mgpu_info.num_dgpu; i++) {
-               adev = mgpu_info.gpu_ins[i].adev;
-               flush_work(&adev->xgmi_reset_work);
-               adev->gmc.xgmi.pending_reset = false;
-       }
-
-       /* reset function will rebuild the xgmi hive info , clear it now */
-       for (i = 0; i < mgpu_info.num_dgpu; i++)
-               amdgpu_xgmi_remove_device(mgpu_info.gpu_ins[i].adev);
-
-       INIT_LIST_HEAD(&device_list);
-
-       for (i = 0; i < mgpu_info.num_dgpu; i++)
-               list_add_tail(&mgpu_info.gpu_ins[i].adev->reset_list, &device_list);
-
-       /* unregister the GPU first, reset function will add them back */
-       list_for_each_entry(adev, &device_list, reset_list)
-               amdgpu_unregister_gpu_instance(adev);
-
-       /* Use a common context, just need to make sure full reset is done */
-       set_bit(AMDGPU_SKIP_HW_RESET, &reset_context.flags);
-       set_bit(AMDGPU_SKIP_COREDUMP, &reset_context.flags);
-       r = amdgpu_do_asic_reset(&device_list, &reset_context);
-
-       if (r) {
-               DRM_ERROR("reinit gpus failure");
-               return;
-       }
-       for (i = 0; i < mgpu_info.num_dgpu; i++) {
-               adev = mgpu_info.gpu_ins[i].adev;
-               if (!adev->kfd.init_complete) {
-                       kgd2kfd_init_zone_device(adev);
-                       amdgpu_amdkfd_device_init(adev);
-                       amdgpu_amdkfd_drm_client_create(adev);
-               }
-               amdgpu_ttm_set_buffer_funcs_status(adev, true);
-       }
-}
-
 static int amdgpu_pmops_prepare(struct device *dev)
 {
        struct drm_device *drm_dev = dev_get_drvdata(dev);
@@ -2556,7 +2500,6 @@ static int amdgpu_pmops_suspend(struct device *dev)
        struct drm_device *drm_dev = dev_get_drvdata(dev);
        struct amdgpu_device *adev = drm_to_adev(drm_dev);
 
-       adev->suspend_complete = false;
        if (amdgpu_acpi_is_s0ix_active(adev))
                adev->in_s0ix = true;
        else if (amdgpu_acpi_is_s3_active(adev))
@@ -2571,7 +2514,6 @@ static int amdgpu_pmops_suspend_noirq(struct device *dev)
        struct drm_device *drm_dev = dev_get_drvdata(dev);
        struct amdgpu_device *adev = drm_to_adev(drm_dev);
 
-       adev->suspend_complete = true;
        if (amdgpu_acpi_should_gpu_reset(adev))
                return amdgpu_asic_reset(adev);
 
@@ -3043,6 +2985,12 @@ static int __init amdgpu_init(void)
        /* Ignore KFD init failures. Normal when CONFIG_HSA_AMD is not set. */
        amdgpu_amdkfd_init();
 
+       if (amdgpu_pp_feature_mask & PP_OVERDRIVE_MASK) {
+               add_taint(TAINT_CPU_OUT_OF_SPEC, LOCKDEP_STILL_OK);
+               pr_crit("Overdrive is enabled, please disable it before "
+                       "reporting any bugs unrelated to overdrive.\n");
+       }
+
        /* let modprobe override vga console setting */
        return pci_register_driver(&amdgpu_kms_pci_driver);
 
This page took 0.042969 seconds and 4 git commands to generate.