@@ -7157,28 +7157,35 @@ void amdgpu_pci_resume(struct pci_dev *pdev)
71577157
71587158static void amdgpu_device_cache_switch_state (struct amdgpu_device * adev )
71597159{
7160- struct pci_dev * parent = pci_upstream_bridge ( adev -> pdev ) ;
7160+ struct pci_dev * swus , * swds ;
71617161 int r ;
71627162
7163- if (!parent || parent -> vendor != PCI_VENDOR_ID_ATI )
7163+ swds = pci_upstream_bridge (adev -> pdev );
7164+ if (!swds || swds -> vendor != PCI_VENDOR_ID_ATI ||
7165+ pci_pcie_type (swds ) != PCI_EXP_TYPE_DOWNSTREAM )
7166+ return ;
7167+ swus = pci_upstream_bridge (swds );
7168+ if (!swus ||
7169+ (swus -> vendor != PCI_VENDOR_ID_ATI &&
7170+ swus -> vendor != PCI_VENDOR_ID_AMD ) ||
7171+ pci_pcie_type (swus ) != PCI_EXP_TYPE_UPSTREAM )
71647172 return ;
71657173
71667174 /* If already saved, return */
71677175 if (adev -> pcie_reset_ctx .swus )
71687176 return ;
71697177 /* Upstream bridge is ATI, assume it's SWUS/DS architecture */
7170- r = pci_save_state (parent );
7178+ r = pci_save_state (swds );
71717179 if (r )
71727180 return ;
7173- adev -> pcie_reset_ctx .swds_pcistate = pci_store_saved_state (parent );
7181+ adev -> pcie_reset_ctx .swds_pcistate = pci_store_saved_state (swds );
71747182
7175- parent = pci_upstream_bridge (parent );
7176- r = pci_save_state (parent );
7183+ r = pci_save_state (swus );
71777184 if (r )
71787185 return ;
7179- adev -> pcie_reset_ctx .swus_pcistate = pci_store_saved_state (parent );
7186+ adev -> pcie_reset_ctx .swus_pcistate = pci_store_saved_state (swus );
71807187
7181- adev -> pcie_reset_ctx .swus = parent ;
7188+ adev -> pcie_reset_ctx .swus = swus ;
71827189}
71837190
71847191static void amdgpu_device_load_switch_state (struct amdgpu_device * adev )
0 commit comments