https://bugs.freedesktop.org/show_bug.cgi?id=105760
--- Comment #38 from Alex Deucher alexdeucher@gmail.com --- (In reply to Thomas Martitz from comment #36)
Created attachment 140591 [details] [review] workaround without memcpy
I made the following patch as an alternative workaround. The printks I added indicate what's going wrong. The smu_data->header pointer does not become busted. Instead, the toc->num_entries member somehow gets set to -1 (perhaps by accident), and since toc->num_entries is used as an index for the toc->entry array, the smu7_populate_single_firmware_entry() function gets passed an invalid pointer.
The workaround uses a temp. variable as the index (which seems to make resume work), but it's still to be found out why toc->num_entries changes to -1. Also, I still get lots of powerplay error messages with this patch. I'll attach dmesg next, below is just the output of the printks I added.
That explains it. The problem is that the GPU does not power up properly on resume so when you read back from vram to get the index, it returns all 1s since the device is offline.