Store pointer to vendor struct, fix crash in lock.

This commit is contained in:
Adam Madsen 2020-11-01 19:16:25 -06:00
parent b8517880ea
commit db50c45f35
3 changed files with 8 additions and 4 deletions

View File

@ -35,6 +35,7 @@ int amd_common_pre_reset(struct vendor_reset_dev *dev)
return -ENOMEM; return -ENOMEM;
dev->vendor_private = priv; dev->vendor_private = priv;
priv->vdev = dev;
spin_lock_init(&priv->pcie_lock); spin_lock_init(&priv->pcie_lock);
spin_lock_init(&priv->reg_lock); spin_lock_init(&priv->reg_lock);
@ -80,6 +81,9 @@ int amd_common_post_reset(struct vendor_reset_dev *dev)
if (!dev->reset_ret) if (!dev->reset_ret)
pci_set_power_state(pdev, PCI_D3hot); pci_set_power_state(pdev, PCI_D3hot);
kzfree(priv);
dev->vendor_private = NULL;
return 0; return 0;
} }
@ -96,7 +100,7 @@ int smum_send_msg_to_smc(struct amd_fake_dev *adev, uint16_t msg, uint32_t *resp
--timeout) --timeout)
udelay(1); udelay(1);
if ((ret = RREG32(mmMP1_SMN_C2PMSG_90)) != 0x1) if ((ret = RREG32(mmMP1_SMN_C2PMSG_90)) != 0x1)
pci_info(to_vendor_reset_dev(adev->private)->pdev, "SMU error 0x%x (line %d)\n", pci_info(adev->private->vdev->pdev, "SMU error 0x%x (line %d)\n",
ret, __LINE__); ret, __LINE__);
mutex_unlock(&adev->private->smu_lock); mutex_unlock(&adev->private->smu_lock);

View File

@ -163,6 +163,7 @@ struct amd_vendor_private
{ {
u16 cfg; u16 cfg;
struct vendor_reset_dev *vdev;
struct pci_saved_state *saved_state; struct pci_saved_state *saved_state;
struct amd_fake_dev adev; struct amd_fake_dev adev;
@ -175,7 +176,6 @@ struct amd_vendor_private
struct mutex smu_lock; struct mutex smu_lock;
}; };
#define to_vendor_reset_dev(priv) container_of((void *)priv, struct vendor_reset_dev, vendor_private)
#define amd_private(vdev) ((struct amd_vendor_private *)(vdev->vendor_private)) #define amd_private(vdev) ((struct amd_vendor_private *)(vdev->vendor_private))
int amd_common_pre_reset(struct vendor_reset_dev *); int amd_common_pre_reset(struct vendor_reset_dev *);

View File

@ -134,12 +134,12 @@ static int amd_vega10_reset(struct vendor_reset_dev *dev)
for (timeout = 100000; timeout; --timeout) for (timeout = 100000; timeout; --timeout)
{ {
sol = RREG32(mmMP0_SMN_C2PMSG_81); sol = RREG32(mmMP0_SMN_C2PMSG_81);
if (sol != 0xFFFFFFFF) if (sol != 0xFFFFFFFF && sol != 0)
break; break;
udelay(1); udelay(1);
} }
if (sol == 0xFFFFFFFF) if (!sol)
{ {
pci_warn(dev->pdev, "Vega10: Timed out waiting for SOL to be valid\n"); pci_warn(dev->pdev, "Vega10: Timed out waiting for SOL to be valid\n");
return -EINVAL; return -EINVAL;