drm/amdgpu: add module parameter choose reset mode
authorWenhui Sheng <Wenhui.Sheng@amd.com>
Tue, 14 Jul 2020 08:29:18 +0000 (16:29 +0800)
committerAlex Deucher <alexander.deucher@amd.com>
Wed, 15 Jul 2020 16:42:01 +0000 (12:42 -0400)
Default value is auto, doesn't change
original reset method logic.

v2: change to use parameter reset_method
v3: add warn msg if specified mode isn't supported

Signed-off-by: Likun Gao <Likun.Gao@amd.com>
Signed-off-by: Wenhui Sheng <Wenhui.Sheng@amd.com>
Reviewed-by: Hawking Zhang <Hawking.Zhang@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
drivers/gpu/drm/amd/amdgpu/amdgpu.h
drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c
drivers/gpu/drm/amd/amdgpu/cik.c
drivers/gpu/drm/amd/amdgpu/nv.c
drivers/gpu/drm/amd/amdgpu/si.c
drivers/gpu/drm/amd/amdgpu/soc15.c
drivers/gpu/drm/amd/amdgpu/vi.c

index c99df80..327a0da 100644 (file)
@@ -193,6 +193,7 @@ static const bool debug_evictions; /* = false */
 #endif
 
 extern int amdgpu_tmz;
+extern int amdgpu_reset_method;
 
 #ifdef CONFIG_DRM_AMDGPU_SI
 extern int amdgpu_si_support;
index 2f12f3a..2eacf1f 100644 (file)
@@ -149,6 +149,7 @@ int amdgpu_mes = 0;
 int amdgpu_noretry;
 int amdgpu_force_asic_type = -1;
 int amdgpu_tmz = 0;
+int amdgpu_reset_method = -1; /* auto */
 
 struct amdgpu_mgpu_info mgpu_info = {
        .mutex = __MUTEX_INITIALIZER(mgpu_info.mutex),
@@ -757,6 +758,13 @@ module_param_named(abmlevel, amdgpu_dm_abm_level, uint, 0444);
 MODULE_PARM_DESC(tmz, "Enable TMZ feature (-1 = auto, 0 = off (default), 1 = on)");
 module_param_named(tmz, amdgpu_tmz, int, 0444);
 
+/**
+ * DOC: reset_method (int)
+ * GPU reset method (-1 = auto (default), 0 = legacy, 1 = mode0, 2 = mode1, 3 = mode2, 4 = baco)
+ */
+MODULE_PARM_DESC(reset_method, "GPU reset method (-1 = auto (default), 0 = legacy, 1 = mode0, 2 = mode1, 3 = mode2, 4 = baco)");
+module_param_named(reset_method, amdgpu_reset_method, int, 0444);
+
 static const struct pci_device_id pciidlist[] = {
 #ifdef  CONFIG_DRM_AMDGPU_SI
        {0x1002, 0x6780, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_TAHITI},
index fe306d0..c2c67ab 100644 (file)
@@ -1326,6 +1326,14 @@ cik_asic_reset_method(struct amdgpu_device *adev)
 {
        bool baco_reset;
 
+       if (amdgpu_reset_method == AMD_RESET_METHOD_LEGACY ||
+           amdgpu_reset_method == AMD_RESET_METHOD_BACO)
+               return amdgpu_reset_method;
+
+       if (amdgpu_reset_method != -1)
+               dev_warn(adev->dev, "Specified reset:%d isn't supported, using AUTO instead.\n",
+                                 amdgpu_reset_method);
+
        switch (adev->asic_type) {
        case CHIP_BONAIRE:
        case CHIP_HAWAII:
index 9f1240b..aa3101a 100644 (file)
@@ -311,6 +311,14 @@ nv_asic_reset_method(struct amdgpu_device *adev)
 {
        struct smu_context *smu = &adev->smu;
 
+       if (amdgpu_reset_method == AMD_RESET_METHOD_MODE1 ||
+           amdgpu_reset_method == AMD_RESET_METHOD_BACO)
+               return amdgpu_reset_method;
+
+       if (amdgpu_reset_method != -1)
+               dev_warn(adev->dev, "Specified reset method:%d isn't supported, using AUTO instead.\n",
+                                 amdgpu_reset_method);
+
        if (smu_baco_is_support(smu))
                return AMD_RESET_METHOD_BACO;
        else
index 9d7b4cc..1b44929 100644 (file)
@@ -1229,6 +1229,11 @@ static bool si_asic_supports_baco(struct amdgpu_device *adev)
 static enum amd_reset_method
 si_asic_reset_method(struct amdgpu_device *adev)
 {
+       if (amdgpu_reset_method != AMD_RESET_METHOD_LEGACY &&
+           amdgpu_reset_method != -1)
+               dev_warn(adev->dev, "Specified reset method:%d isn't supported, using AUTO instead.\n",
+                                 amdgpu_reset_method);
+
        return AMD_RESET_METHOD_LEGACY;
 }
 
index 8c739b2..84d811b 100644 (file)
@@ -532,6 +532,15 @@ soc15_asic_reset_method(struct amdgpu_device *adev)
        bool baco_reset = false;
        struct amdgpu_ras *ras = amdgpu_ras_get_context(adev);
 
+       if (amdgpu_reset_method == AMD_RESET_METHOD_MODE1 ||
+           amdgpu_reset_method == AMD_RESET_METHOD_MODE2 ||
+               amdgpu_reset_method == AMD_RESET_METHOD_BACO)
+               return amdgpu_reset_method;
+
+       if (amdgpu_reset_method != -1)
+               dev_warn(adev->dev, "Specified reset method:%d isn't supported, using AUTO instead.\n",
+                                 amdgpu_reset_method);
+
        switch (adev->asic_type) {
        case CHIP_RAVEN:
        case CHIP_RENOIR:
index 4e5e918..f6f2ed0 100644 (file)
@@ -710,6 +710,14 @@ vi_asic_reset_method(struct amdgpu_device *adev)
 {
        bool baco_reset;
 
+       if (amdgpu_reset_method == AMD_RESET_METHOD_LEGACY ||
+           amdgpu_reset_method == AMD_RESET_METHOD_BACO)
+               return amdgpu_reset_method;
+
+       if (amdgpu_reset_method != -1)
+               dev_warn(adev->dev, "Specified reset method:%d isn't supported, using AUTO instead.\n",
+                                 amdgpu_reset_method);
+
        switch (adev->asic_type) {
        case CHIP_FIJI:
        case CHIP_TONGA: