mirror of
https://github.com/gnif/vendor-reset.git
synced 2026-08-11 04:26:44 +02:00
Compare commits
3 Commits
31d17c5e11
...
cbb4dd5092
| Author | SHA1 | Date | |
|---|---|---|---|
| cbb4dd5092 | |||
| 3cf510f9ca | |||
| 71eb4a6672 |
@@ -62,6 +62,7 @@ updating your initrd.
|
|||||||
|AMD|Vega 20| Radeon VII |
|
|AMD|Vega 20| Radeon VII |
|
||||||
|AMD|Vega 20| Instinct MI100 |
|
|AMD|Vega 20| Instinct MI100 |
|
||||||
|AMD|Navi 10| 5600XT, 5700, 5700XT
|
|AMD|Navi 10| 5600XT, 5700, 5700XT
|
||||||
|
|AMD|Navi 10| 680M Rembrandt |
|
||||||
|AMD|Navi 12| Pro 5600M |
|
|AMD|Navi 12| Pro 5600M |
|
||||||
|AMD|Navi 14| Pro 5300, RX 5300, 5500XT
|
|AMD|Navi 14| Pro 5300, RX 5300, 5500XT
|
||||||
|
|
||||||
|
|||||||
+58
-7
@@ -30,6 +30,7 @@ Place, Suite 330, Boston, MA 02111-1307 USA
|
|||||||
#include "common.h"
|
#include "common.h"
|
||||||
#include "compat.h"
|
#include "compat.h"
|
||||||
#include "common_baco.h"
|
#include "common_baco.h"
|
||||||
|
#include "psp_gfx_if.h"
|
||||||
|
|
||||||
/* MP Apertures, from smu9_smumgr.c */
|
/* MP Apertures, from smu9_smumgr.c */
|
||||||
#define MP0_Public 0x03800000
|
#define MP0_Public 0x03800000
|
||||||
@@ -95,6 +96,11 @@ static const struct soc15_baco_cmd_entry clean_baco_tbl[] = {
|
|||||||
|
|
||||||
int vega10_baco_set_state(struct amd_fake_dev *adev, enum BACO_STATE state)
|
int vega10_baco_set_state(struct amd_fake_dev *adev, enum BACO_STATE state)
|
||||||
{
|
{
|
||||||
|
enum BACO_STATE cur_state;
|
||||||
|
|
||||||
|
smu9_baco_get_state(adev, &cur_state);
|
||||||
|
if (cur_state == state)
|
||||||
|
return 0;
|
||||||
|
|
||||||
if (state == BACO_STATE_IN)
|
if (state == BACO_STATE_IN)
|
||||||
{
|
{
|
||||||
@@ -126,6 +132,41 @@ int vega10_baco_set_state(struct amd_fake_dev *adev, enum BACO_STATE state)
|
|||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int amd_vega10_mode1_reset(struct amd_fake_dev *adev)
|
||||||
|
{
|
||||||
|
int ret, i;
|
||||||
|
uint32_t offset;
|
||||||
|
uint32_t pci_regs[128];
|
||||||
|
struct pci_dev *pdev = adev_to_amd_private(adev)->vdev->pdev;
|
||||||
|
|
||||||
|
offset = SOC15_REG_OFFSET(MP0, 0, mmMP0_SMN_C2PMSG_64);
|
||||||
|
ret = psp_wait_for(adev, offset, 0x80000000, 0x8000FFFF, false);
|
||||||
|
if (ret) {
|
||||||
|
vr_warn(adev_to_amd_private(adev)->vdev,
|
||||||
|
"psp not working for mode1 reset\n");
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* send mode 1 reset command to PSP */
|
||||||
|
WREG32(offset, GFX_CTRL_CMD_ID_MODE1_RST);
|
||||||
|
msleep(500);
|
||||||
|
|
||||||
|
/* check if PSP came back */
|
||||||
|
offset = SOC15_REG_OFFSET(MP0, 0, mmMP0_SMN_C2PMSG_33);
|
||||||
|
ret = psp_wait_for(adev, offset, 0x80000000, 0x80000000, false);
|
||||||
|
|
||||||
|
if (ret) {
|
||||||
|
vr_warn(adev_to_amd_private(adev)->vdev,
|
||||||
|
"psp mode1 reset completed but PSP not responding\n");
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
vr_info(adev_to_amd_private(adev)->vdev,
|
||||||
|
"psp mode1 reset succeeded\n");
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
static int amd_vega10_reset(struct vendor_reset_dev *dev)
|
static int amd_vega10_reset(struct vendor_reset_dev *dev)
|
||||||
{
|
{
|
||||||
struct amd_vendor_private *priv = amd_private(dev);
|
struct amd_vendor_private *priv = amd_private(dev);
|
||||||
@@ -150,13 +191,6 @@ static int amd_vega10_reset(struct vendor_reset_dev *dev)
|
|||||||
goto free_adev;
|
goto free_adev;
|
||||||
}
|
}
|
||||||
|
|
||||||
ret = atom_bios_init(adev);
|
|
||||||
if (ret)
|
|
||||||
{
|
|
||||||
vr_err(dev, "atom_bios_init failed: %d\n", ret);
|
|
||||||
goto free_adev;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* it's important we wait for the SOC to be ready */
|
/* it's important we wait for the SOC to be ready */
|
||||||
for (timeout = 100000; timeout; --timeout)
|
for (timeout = 100000; timeout; --timeout)
|
||||||
{
|
{
|
||||||
@@ -183,6 +217,23 @@ static int amd_vega10_reset(struct vendor_reset_dev *dev)
|
|||||||
psp_bl_ready ? "yes" : "no",
|
psp_bl_ready ? "yes" : "no",
|
||||||
baco_state == BACO_STATE_IN ? "on" : "off");
|
baco_state == BACO_STATE_IN ? "on" : "off");
|
||||||
|
|
||||||
|
/* Try PSP Mode 1 Reset first. Preferred when the SMU is unresponsive */
|
||||||
|
ret = amd_vega10_mode1_reset(adev);
|
||||||
|
if (!ret)
|
||||||
|
{
|
||||||
|
vr_info(dev, "mode1 reset succeeded, skipping BACO\n");
|
||||||
|
goto free_adev;
|
||||||
|
}
|
||||||
|
|
||||||
|
vr_info(dev, "mode1 reset failed, falling back to BACO\n");
|
||||||
|
|
||||||
|
ret = atom_bios_init(adev);
|
||||||
|
if (ret)
|
||||||
|
{
|
||||||
|
vr_err(dev, "atom_bios_init failed: %d\n", ret);
|
||||||
|
goto free_adev;
|
||||||
|
}
|
||||||
|
|
||||||
if (sol == ~1L && baco_state != BACO_STATE_IN)
|
if (sol == ~1L && baco_state != BACO_STATE_IN)
|
||||||
{
|
{
|
||||||
vr_warn(dev, "timed out waiting for SOL to be valid\n");
|
vr_warn(dev, "timed out waiting for SOL to be valid\n");
|
||||||
|
|||||||
+2
-1
@@ -90,7 +90,8 @@ Place, Suite 330, Boston, MA 02111-1307 USA
|
|||||||
{PCI_VENDOR_ID_ATI, 0x731a, op, DEVICE_INFO(AMD_NAVI10)}, \
|
{PCI_VENDOR_ID_ATI, 0x731a, op, DEVICE_INFO(AMD_NAVI10)}, \
|
||||||
{PCI_VENDOR_ID_ATI, 0x731b, op, DEVICE_INFO(AMD_NAVI10)}, \
|
{PCI_VENDOR_ID_ATI, 0x731b, op, DEVICE_INFO(AMD_NAVI10)}, \
|
||||||
{PCI_VENDOR_ID_ATI, 0x731e, op, DEVICE_INFO(AMD_NAVI10)}, \
|
{PCI_VENDOR_ID_ATI, 0x731e, op, DEVICE_INFO(AMD_NAVI10)}, \
|
||||||
{PCI_VENDOR_ID_ATI, 0x731f, op, DEVICE_INFO(AMD_NAVI10)}
|
{PCI_VENDOR_ID_ATI, 0x731f, op, DEVICE_INFO(AMD_NAVI10)}, \
|
||||||
|
{PCI_VENDOR_ID_ATI, 0x1681, op, DEVICE_INFO(AMD_NAVI10)}
|
||||||
|
|
||||||
#define _AMD_NAVI14(op) \
|
#define _AMD_NAVI14(op) \
|
||||||
{PCI_VENDOR_ID_ATI, 0x7340, op, DEVICE_INFO(AMD_NAVI14)}, \
|
{PCI_VENDOR_ID_ATI, 0x7340, op, DEVICE_INFO(AMD_NAVI14)}, \
|
||||||
|
|||||||
@@ -133,3 +133,6 @@ ACTION=="add", SUBSYSTEM=="pci", ATTR{vendor}=="0x1002", ATTR{device}=="0x7360",
|
|||||||
ACTION=="add", SUBSYSTEM=="pci", ATTR{vendor}=="0x1002", ATTR{device}=="0x7362", RUN+="/bin/sh -c '/sbin/modprobe vendor-reset; echo device_specific > /sys$env{DEVPATH}/reset_method'"
|
ACTION=="add", SUBSYSTEM=="pci", ATTR{vendor}=="0x1002", ATTR{device}=="0x7362", RUN+="/bin/sh -c '/sbin/modprobe vendor-reset; echo device_specific > /sys$env{DEVPATH}/reset_method'"
|
||||||
|
|
||||||
ACTION=="add", SUBSYSTEM=="pci", ATTR{vendor}=="0x1002", ATTR{device}=="0x738c", RUN+="/bin/sh -c '/sbin/modprobe vendor-reset; echo device_specific > /sys$env{DEVPATH}/reset_method'"
|
ACTION=="add", SUBSYSTEM=="pci", ATTR{vendor}=="0x1002", ATTR{device}=="0x738c", RUN+="/bin/sh -c '/sbin/modprobe vendor-reset; echo device_specific > /sys$env{DEVPATH}/reset_method'"
|
||||||
|
|
||||||
|
ACTION=="add", SUBSYSTEM=="pci", ATTR{vendor}=="0x1002", ATTR{device}=="0x1681", RUN+="/bin/sh -c '/sbin/modprobe vendor-reset; echo device_specific > /sys$env{DEVPATH}/reset_method'"
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user