Skip to content

Commit 4d614ce

Browse files
Tao Zhoualexdeucher
authored andcommitted
drm/amdgpu: add RAS CPER ring buffer
And initialize it, this is a pure software ring to store RAS CPER data. v2: change ring size to 0x100000 v2: update the initialization of count_dw of cper ring, it's dword variable v3: skip VM inv eng for cper v3: init/fini when aca enabled Signed-off-by: Tao Zhou <[email protected]> Signed-off-by: Xiang Liu <[email protected]> Reviewed-by: Hawking Zhang <[email protected]> Signed-off-by: Alex Deucher <[email protected]>
1 parent b3060f5 commit 4d614ce

File tree

7 files changed

+64
-19
lines changed

7 files changed

+64
-19
lines changed

drivers/gpu/drm/amd/amdgpu/amdgpu_cper.c

Lines changed: 35 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -382,23 +382,54 @@ int amdgpu_cper_generate_ce_records(struct amdgpu_device *adev,
382382
return 0;
383383
}
384384

385+
static u64 amdgpu_cper_ring_get_rptr(struct amdgpu_ring *ring)
386+
{
387+
return *(ring->rptr_cpu_addr);
388+
}
389+
390+
static u64 amdgpu_cper_ring_get_wptr(struct amdgpu_ring *ring)
391+
{
392+
return ring->wptr;
393+
}
394+
395+
static const struct amdgpu_ring_funcs cper_ring_funcs = {
396+
.type = AMDGPU_RING_TYPE_CPER,
397+
.align_mask = 0xff,
398+
.support_64bit_ptrs = false,
399+
.get_rptr = amdgpu_cper_ring_get_rptr,
400+
.get_wptr = amdgpu_cper_ring_get_wptr,
401+
};
402+
403+
static int amdgpu_cper_ring_init(struct amdgpu_device *adev)
404+
{
405+
struct amdgpu_ring *ring = &(adev->cper.ring_buf);
406+
407+
ring->adev = NULL;
408+
ring->ring_obj = NULL;
409+
ring->use_doorbell = false;
410+
ring->no_scheduler = true;
411+
ring->funcs = &cper_ring_funcs;
412+
413+
sprintf(ring->name, "cper");
414+
return amdgpu_ring_init(adev, ring, CPER_MAX_RING_SIZE, NULL, 0,
415+
AMDGPU_RING_PRIO_DEFAULT, NULL);
416+
}
417+
385418
int amdgpu_cper_init(struct amdgpu_device *adev)
386419
{
387420
mutex_init(&adev->cper.cper_lock);
388421

389422
adev->cper.enabled = true;
390423
adev->cper.max_count = CPER_MAX_ALLOWED_COUNT;
391424

392-
/*TODO: initialize cper ring*/
393-
394-
return 0;
425+
return amdgpu_cper_ring_init(adev);
395426
}
396427

397428
int amdgpu_cper_fini(struct amdgpu_device *adev)
398429
{
399430
adev->cper.enabled = false;
400431

401-
/*TODO: free cper ring */
432+
amdgpu_ring_fini(&(adev->cper.ring_buf));
402433
adev->cper.count = 0;
403434
adev->cper.wptr = 0;
404435

drivers/gpu/drm/amd/amdgpu/amdgpu_cper.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@
2929
#include "amdgpu_aca.h"
3030

3131
#define CPER_MAX_ALLOWED_COUNT 0x1000
32+
#define CPER_MAX_RING_SIZE 0X100000
3233
#define HDR_LEN (sizeof(struct cper_hdr))
3334
#define SEC_DESC_LEN (sizeof(struct cper_sec_desc))
3435

@@ -62,6 +63,7 @@ struct amdgpu_cper {
6263
uint32_t wptr;
6364

6465
void *ring[CPER_MAX_ALLOWED_COUNT];
66+
struct amdgpu_ring ring_buf;
6567
};
6668

6769
void amdgpu_cper_entry_fill_hdr(struct amdgpu_device *adev,

drivers/gpu/drm/amd/amdgpu/amdgpu_device.c

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3091,7 +3091,8 @@ static int amdgpu_device_ip_init(struct amdgpu_device *adev)
30913091

30923092
amdgpu_fru_get_product_info(adev);
30933093

3094-
r = amdgpu_cper_init(adev);
3094+
if (amdgpu_aca_is_enabled(adev))
3095+
r = amdgpu_cper_init(adev);
30953096

30963097
init_failed:
30973098

@@ -3453,7 +3454,8 @@ static int amdgpu_device_ip_fini(struct amdgpu_device *adev)
34533454
{
34543455
int i, r;
34553456

3456-
amdgpu_cper_fini(adev);
3457+
if (amdgpu_aca_is_enabled(adev))
3458+
amdgpu_cper_fini(adev);
34573459

34583460
if (amdgpu_sriov_vf(adev) && adev->virt.ras_init_done)
34593461
amdgpu_virt_release_ras_err_handler_data(adev);

drivers/gpu/drm/amd/amdgpu/amdgpu_gmc.c

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -591,7 +591,8 @@ int amdgpu_gmc_allocate_vm_inv_eng(struct amdgpu_device *adev)
591591

592592
if (ring == &adev->mes.ring[0] ||
593593
ring == &adev->mes.ring[1] ||
594-
ring == &adev->umsch_mm.ring)
594+
ring == &adev->umsch_mm.ring ||
595+
ring == &adev->cper.ring_buf)
595596
continue;
596597

597598
inv_eng = ffs(vm_inv_engs[vmhub]);

drivers/gpu/drm/amd/amdgpu/amdgpu_ring.c

Lines changed: 18 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -324,20 +324,27 @@ int amdgpu_ring_init(struct amdgpu_device *adev, struct amdgpu_ring *ring,
324324
/* always set cond_exec_polling to CONTINUE */
325325
*ring->cond_exe_cpu_addr = 1;
326326

327-
r = amdgpu_fence_driver_start_ring(ring, irq_src, irq_type);
328-
if (r) {
329-
dev_err(adev->dev, "failed initializing fences (%d).\n", r);
330-
return r;
331-
}
327+
if (ring->funcs->type != AMDGPU_RING_TYPE_CPER) {
328+
r = amdgpu_fence_driver_start_ring(ring, irq_src, irq_type);
329+
if (r) {
330+
dev_err(adev->dev, "failed initializing fences (%d).\n", r);
331+
return r;
332+
}
332333

333-
max_ibs_dw = ring->funcs->emit_frame_size +
334-
amdgpu_ring_max_ibs(ring->funcs->type) * ring->funcs->emit_ib_size;
335-
max_ibs_dw = (max_ibs_dw + ring->funcs->align_mask) & ~ring->funcs->align_mask;
334+
max_ibs_dw = ring->funcs->emit_frame_size +
335+
amdgpu_ring_max_ibs(ring->funcs->type) * ring->funcs->emit_ib_size;
336+
max_ibs_dw = (max_ibs_dw + ring->funcs->align_mask) & ~ring->funcs->align_mask;
336337

337-
if (WARN_ON(max_ibs_dw > max_dw))
338-
max_dw = max_ibs_dw;
338+
if (WARN_ON(max_ibs_dw > max_dw))
339+
max_dw = max_ibs_dw;
339340

340-
ring->ring_size = roundup_pow_of_two(max_dw * 4 * sched_hw_submission);
341+
ring->ring_size = roundup_pow_of_two(max_dw * 4 * sched_hw_submission);
342+
} else {
343+
ring->ring_size = roundup_pow_of_two(max_dw * 4);
344+
ring->count_dw = (ring->ring_size - 4) >> 2;
345+
/* ring buffer is empty now */
346+
ring->wptr = *ring->rptr_cpu_addr = 0;
347+
}
341348

342349
ring->buf_mask = (ring->ring_size / 4) - 1;
343350
ring->ptr_mask = ring->funcs->support_64bit_ptrs ?

drivers/gpu/drm/amd/amdgpu/amdgpu_ring.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -82,6 +82,7 @@ enum amdgpu_ring_type {
8282
AMDGPU_RING_TYPE_KIQ,
8383
AMDGPU_RING_TYPE_MES,
8484
AMDGPU_RING_TYPE_UMSCH_MM,
85+
AMDGPU_RING_TYPE_CPER,
8586
};
8687

8788
enum amdgpu_ib_pool_type {

drivers/gpu/drm/amd/amdgpu/aqua_vanjaram.c

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -77,7 +77,8 @@ static void aqua_vanjaram_set_xcp_id(struct amdgpu_device *adev,
7777
ring->xcp_id = AMDGPU_XCP_NO_PARTITION;
7878
if (ring->funcs->type == AMDGPU_RING_TYPE_COMPUTE)
7979
adev->gfx.enforce_isolation[0].xcp_id = ring->xcp_id;
80-
if (adev->xcp_mgr->mode == AMDGPU_XCP_MODE_NONE)
80+
if ((adev->xcp_mgr->mode == AMDGPU_XCP_MODE_NONE) ||
81+
(ring->funcs->type == AMDGPU_RING_TYPE_CPER))
8182
return;
8283

8384
inst_mask = 1 << inst_idx;

0 commit comments

Comments
 (0)