[PATCH 02/10] drm/amdgpu: add update_mqd callback for queue MODIFY

Jesse Zhang <[email protected]>
Newsgroups org.freedesktop.lists.amd-gfx
Message-ID <[email protected]>
A queue MODIFY (e.g. re-enabling a queue after a queue_percentage == 0
disable) must not rebuild the MQD with init_mqd: init_mqd rebuilds the HQD
from power-on defaults and zeroes the ring pointers, discarding the state
firmware context-saved into the MQD on unmap. The re-mapped engine then
comes up idle, drops the packet queued while disabled, and wedges into a
GPU reset.

Add an optional update_mqd hook to struct amdgpu_mqd for IPs to patch the
MQD in place instead - preserving the saved ring/HQD state and forwarding
user_wptr into the MQD write pointer. KFD already handles the same
disable/re-enable sequence by patching the MQD in place rather than
re-initialising it.

Signed-off-by: Jesse Zhang <[email protected]>
---
 drivers/gpu/drm/amd/amdgpu/amdgpu_mes.h | 6 ++++++
 1 file changed, 6 insertions(+)

diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_mes.h b/drivers/gpu/drm/amd/amdgpu/amdgpu_mes.h
index 63670b41c26c..2f73eceea57d 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_mes.h
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_mes.h
@@ -500,6 +500,12 @@ struct amdgpu_mqd {
 	unsigned mqd_size;
 	int (*init_mqd)(struct amdgpu_device *adev, void *mqd,
 			struct amdgpu_mqd_prop *p);
+	/* Patch an MQD in place for a queue MODIFY: keep the ring/HQD state
+	 * firmware context-saved into it (init_mqd instead rebuilds from
+	 * defaults) and forward @user_wptr into the MQD write pointer.
+	 */
+	int (*update_mqd)(struct amdgpu_device *adev, void *mqd,
+			  struct amdgpu_mqd_prop *p, u64 user_wptr);
 };
 
 /*
-- 
2.49.0
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.