From: Tao Zhou <tao.zh...@amd.com>

And initialize it, this is a pure software ring to store RAS CPER data.

v2: update the initialization of count_dw of cper ring, it's dword
variable.

Signed-off-by: Tao Zhou <tao.zh...@amd.com>
Reviewed-by: Hawking Zhang <hawking.zh...@amd.com>
---
 drivers/gpu/drm/amd/amdgpu/amdgpu_cper.c   | 39 +++++++++++++++++++---
 drivers/gpu/drm/amd/amdgpu/amdgpu_cper.h   |  1 +
 drivers/gpu/drm/amd/amdgpu/amdgpu_ring.c   | 29 ++++++++++------
 drivers/gpu/drm/amd/amdgpu/amdgpu_ring.h   |  1 +
 drivers/gpu/drm/amd/amdgpu/aqua_vanjaram.c |  3 +-
 5 files changed, 57 insertions(+), 16 deletions(-)

diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_cper.c 
b/drivers/gpu/drm/amd/amdgpu/amdgpu_cper.c
index f82aa12a88f4..cef7c1ec0d7c 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_cper.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_cper.c
@@ -365,6 +365,39 @@ int amdgpu_cper_generate_ce_records(struct amdgpu_device 
*adev,
        return 0;
 }
 
+static u64 amdgpu_cper_ring_get_rptr(struct amdgpu_ring *ring)
+{
+       return *(ring->rptr_cpu_addr);
+}
+
+static u64 amdgpu_cper_ring_get_wptr(struct amdgpu_ring *ring)
+{
+       return ring->wptr;
+}
+
+static const struct amdgpu_ring_funcs cper_ring_funcs = {
+       .type = AMDGPU_RING_TYPE_CPER,
+       .align_mask = 0xff,
+       .support_64bit_ptrs = false,
+       .get_rptr = amdgpu_cper_ring_get_rptr,
+       .get_wptr = amdgpu_cper_ring_get_wptr,
+};
+
+static int amdgpu_cper_ring_init(struct amdgpu_device *adev)
+{
+       struct amdgpu_ring *ring = &(adev->cper.ring_buf);
+
+       ring->adev = NULL;
+       ring->ring_obj = NULL;
+       ring->use_doorbell = false;
+       ring->no_scheduler = true;
+       ring->funcs = &cper_ring_funcs;
+
+       sprintf(ring->name, "cper");
+       return amdgpu_ring_init(adev, ring, PAGE_SIZE, NULL, 0,
+                               AMDGPU_RING_PRIO_DEFAULT, NULL);
+}
+
 int amdgpu_cper_init(struct amdgpu_device *adev)
 {
        mutex_init(&adev->cper.cper_lock);
@@ -372,16 +405,14 @@ int amdgpu_cper_init(struct amdgpu_device *adev)
        adev->cper.enabled = true;
        adev->cper.max_count = CPER_MAX_ALLOWED_COUNT;
 
-       /*TODO: initialize cper ring*/
-
-       return 0;
+       return amdgpu_cper_ring_init(adev);
 }
 
 int amdgpu_cper_fini(struct amdgpu_device *adev)
 {
        adev->cper.enabled = false;
 
-       /*TODO: free cper ring */
+       amdgpu_ring_fini(&(adev->cper.ring_buf));
        adev->cper.count = 0;
        adev->cper.wptr = 0;
 
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_cper.h 
b/drivers/gpu/drm/amd/amdgpu/amdgpu_cper.h
index 6860a809f2f5..80c8571cff9d 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_cper.h
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_cper.h
@@ -62,6 +62,7 @@ struct amdgpu_cper {
        uint32_t wptr;
 
        void *ring[CPER_MAX_ALLOWED_COUNT];
+       struct amdgpu_ring ring_buf;
 };
 
 void amdgpu_cper_entry_fill_hdr(struct amdgpu_device *adev,
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_ring.c 
b/drivers/gpu/drm/amd/amdgpu/amdgpu_ring.c
index cfbc18c12113..005cdaee9987 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_ring.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_ring.c
@@ -324,20 +324,27 @@ int amdgpu_ring_init(struct amdgpu_device *adev, struct 
amdgpu_ring *ring,
        /* always set cond_exec_polling to CONTINUE */
        *ring->cond_exe_cpu_addr = 1;
 
-       r = amdgpu_fence_driver_start_ring(ring, irq_src, irq_type);
-       if (r) {
-               dev_err(adev->dev, "failed initializing fences (%d).\n", r);
-               return r;
-       }
+       if (ring->funcs->type != AMDGPU_RING_TYPE_CPER) {
+               r = amdgpu_fence_driver_start_ring(ring, irq_src, irq_type);
+               if (r) {
+                       dev_err(adev->dev, "failed initializing fences 
(%d).\n", r);
+                       return r;
+               }
 
-       max_ibs_dw = ring->funcs->emit_frame_size +
-                    amdgpu_ring_max_ibs(ring->funcs->type) * 
ring->funcs->emit_ib_size;
-       max_ibs_dw = (max_ibs_dw + ring->funcs->align_mask) & 
~ring->funcs->align_mask;
+               max_ibs_dw = ring->funcs->emit_frame_size +
+                            amdgpu_ring_max_ibs(ring->funcs->type) * 
ring->funcs->emit_ib_size;
+               max_ibs_dw = (max_ibs_dw + ring->funcs->align_mask) & 
~ring->funcs->align_mask;
 
-       if (WARN_ON(max_ibs_dw > max_dw))
-               max_dw = max_ibs_dw;
+               if (WARN_ON(max_ibs_dw > max_dw))
+                       max_dw = max_ibs_dw;
 
-       ring->ring_size = roundup_pow_of_two(max_dw * 4 * sched_hw_submission);
+               ring->ring_size = roundup_pow_of_two(max_dw * 4 * 
sched_hw_submission);
+       } else {
+               ring->ring_size = roundup_pow_of_two(max_dw * 4);
+               ring->count_dw = (ring->ring_size - 4) >> 2;
+               /* ring buffer is empty now */
+               ring->wptr = *ring->rptr_cpu_addr = 0;
+       }
 
        ring->buf_mask = (ring->ring_size / 4) - 1;
        ring->ptr_mask = ring->funcs->support_64bit_ptrs ?
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_ring.h 
b/drivers/gpu/drm/amd/amdgpu/amdgpu_ring.h
index 04af26536f97..7372e4aed6b0 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_ring.h
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_ring.h
@@ -82,6 +82,7 @@ enum amdgpu_ring_type {
        AMDGPU_RING_TYPE_KIQ,
        AMDGPU_RING_TYPE_MES,
        AMDGPU_RING_TYPE_UMSCH_MM,
+       AMDGPU_RING_TYPE_CPER,
 };
 
 enum amdgpu_ib_pool_type {
diff --git a/drivers/gpu/drm/amd/amdgpu/aqua_vanjaram.c 
b/drivers/gpu/drm/amd/amdgpu/aqua_vanjaram.c
index 16d924acb788..83a07309a538 100644
--- a/drivers/gpu/drm/amd/amdgpu/aqua_vanjaram.c
+++ b/drivers/gpu/drm/amd/amdgpu/aqua_vanjaram.c
@@ -77,7 +77,8 @@ static void aqua_vanjaram_set_xcp_id(struct amdgpu_device 
*adev,
        ring->xcp_id = AMDGPU_XCP_NO_PARTITION;
        if (ring->funcs->type == AMDGPU_RING_TYPE_COMPUTE)
                adev->gfx.enforce_isolation[0].xcp_id = ring->xcp_id;
-       if (adev->xcp_mgr->mode == AMDGPU_XCP_MODE_NONE)
+       if ((adev->xcp_mgr->mode == AMDGPU_XCP_MODE_NONE) ||
+           (ring->funcs->type == AMDGPU_RING_TYPE_CPER))
                return;
 
        inst_mask = 1 << inst_idx;
-- 
2.34.1

Reply via email to