summaryrefslogtreecommitdiff
path: root/mali_kbase
diff options
context:
space:
mode:
authorSuzanne Candanedo <suzanne.candanedo@arm.com>2022-10-27 14:32:12 +0100
committerTreehugger Robot <android-test-infra-autosubmit@system.gserviceaccount.com>2023-06-15 17:38:36 +0000
commit9f1798282259b99011ba7a837d1555ebd05a0341 (patch)
tree5b5c7d77e68c243afc3932e46f3a1268aa87fe76 /mali_kbase
parent6a572627ad9d22add2850d546e75cbb4db885935 (diff)
downloadgpu-9f1798282259b99011ba7a837d1555ebd05a0341.tar.gz
GPUCORE-35754: Add barrier before updating GLB_DB_REQ to ring CSG DB
GPUCORE-35974: Add Memory Barrier between CS_REQ/ACK and CSG_DB_REQ/ACK The access to GLB_DB_REQ/ACK needs to be ordered with respect to CSG_REQ/ACK and CSG_DB_REQ/ACK to avoid a scenario where a CSI request overlaps with a CSG request or 2 CSI requests overlap and FW ends up missing the 2nd request. Memory barrier is required, both on Host and FW side, to guarantee the ordering. Bug: 286056062 Test: SST soak test Provenance: https://code.ipdelivery.arm.com/c/GPU/mali-ddk/+/4688 Provenance: https://code.ipdelivery.arm.com/c/GPU/mali-ddk/+/5435 Change-Id: I4de23e3f37b81749c6d668952b4f8dd21c669fea
Diffstat (limited to 'mali_kbase')
-rw-r--r--mali_kbase/csf/mali_kbase_csf.c17
1 files changed, 17 insertions, 0 deletions
diff --git a/mali_kbase/csf/mali_kbase_csf.c b/mali_kbase/csf/mali_kbase_csf.c
index 29542a6..fce6aaa 100644
--- a/mali_kbase/csf/mali_kbase_csf.c
+++ b/mali_kbase/csf/mali_kbase_csf.c
@@ -852,6 +852,15 @@ void kbase_csf_ring_csg_slots_doorbell(struct kbase_device *kbdev,
if (WARN_ON(slot_bitmap > allowed_bitmap))
return;
+ /* The access to GLB_DB_REQ/ACK needs to be ordered with respect to CSG_REQ/ACK and
+ * CSG_DB_REQ/ACK to avoid a scenario where a CSI request overlaps with a CSG request
+ * or 2 CSI requests overlap and FW ends up missing the 2nd request.
+ * Memory barrier is required, both on Host and FW side, to guarantee the ordering.
+ *
+ * 'osh' is used as CPU and GPU would be in the same Outer shareable domain.
+ */
+ dmb(osh);
+
value = kbase_csf_firmware_global_output(global_iface, GLB_DB_ACK);
value ^= slot_bitmap;
kbase_csf_firmware_global_input_mask(global_iface, GLB_DB_REQ, value,
@@ -890,6 +899,14 @@ void kbase_csf_ring_cs_kernel_doorbell(struct kbase_device *kbdev,
WARN_ON(csi_index >= ginfo->stream_num))
return;
+ /* The access to CSG_DB_REQ/ACK needs to be ordered with respect to
+ * CS_REQ/ACK to avoid a scenario where CSG_DB_REQ/ACK becomes visible to
+ * FW before CS_REQ/ACK is set.
+ *
+ * 'osh' is used as CPU and GPU would be in the same outer shareable domain.
+ */
+ dmb(osh);
+
value = kbase_csf_firmware_csg_output(ginfo, CSG_DB_ACK);
value ^= (1 << csi_index);
kbase_csf_firmware_csg_input_mask(ginfo, CSG_DB_REQ, value,