mirror of
https://github.com/torvalds/linux.git
synced 2026-09-22 04:34:03 +02:00
drm/amdgpu: move struct amdgpu_wb and helpers into separate files
Move struct amdgpu_wb and helpers out of the monolithic header amdgpu.h into its own dedicated header amdgpu_wb.h. Add amdgpu_wb_init() and amdgpu_wb_fini() into amdgpu_wb.h. Move functions amdgpu_device_wb_get(), amdgpu_device_wb_free(), amdgpu_device_wb_init(), and amdgpu_device_wb_fini() out of amdgpu_device.c into new dedicated amdgpu_wb.c file. Removed static from functions amdgpu_device_wb_init() and amdgpu_device_wb_fini(). Rename functions amdgpu_device_wb_get(), amdgpu_device_wb_free(), amdgpu_device_wb_init(), and amdgpu_device_wb_fini() into amdgpu_wb_get(), amdgpu_wb_free(), amdgpu_wb_init(), and amdgpu_wb_fini(). Update amdgpu/Makefile to build amdgpu_wb.o. This is part of the ongoing effort to reduce the size of amdgpu.h into their own respective separate headers. Signed-off-by: Shahyan Soltani <shahyan.soltani@amd.com> Reviewed-by: Christian König <christian.koenig@amd.com> Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
This commit is contained in:
parent
679c6f09d9
commit
fbf41e0511
|
|
@ -71,7 +71,8 @@ amdgpu-y += amdgpu_device.o amdgpu_reg_access.o amdgpu_doorbell_mgr.o amdgpu_kms
|
|||
amdgpu_fw_attestation.o amdgpu_securedisplay.o \
|
||||
amdgpu_eeprom.o amdgpu_mca.o amdgpu_psp_ta.o amdgpu_lsdma.o amdgpu_lockdep.o \
|
||||
amdgpu_ring_mux.o amdgpu_xcp.o amdgpu_seq64.o amdgpu_dev_coredump.o \
|
||||
amdgpu_cper.o amdgpu_userq_fence.o amdgpu_eviction_fence.o amdgpu_ip.o
|
||||
amdgpu_cper.o amdgpu_userq_fence.o amdgpu_eviction_fence.o amdgpu_ip.o \
|
||||
amdgpu_wb.o
|
||||
|
||||
amdgpu-$(CONFIG_PROC_FS) += amdgpu_fdinfo.o
|
||||
|
||||
|
|
|
|||
|
|
@ -112,6 +112,7 @@
|
|||
#include "amdgpu_reg_state.h"
|
||||
#include "amdgpu_userq.h"
|
||||
#include "amdgpu_eviction_fence.h"
|
||||
#include "amdgpu_wb.h"
|
||||
#include "amdgpu_ip.h"
|
||||
#include "amdgpu_sa.h"
|
||||
#if defined(CONFIG_DRM_AMD_ISP)
|
||||
|
|
@ -429,73 +430,6 @@ struct amdgpu_fpriv {
|
|||
|
||||
int amdgpu_file_to_fpriv(struct file *filp, struct amdgpu_fpriv **fpriv);
|
||||
|
||||
/*
|
||||
* Writeback
|
||||
*/
|
||||
#define AMDGPU_MAX_WB 1024 /* Reserve at most 1024 WB slots for amdgpu-owned rings. */
|
||||
|
||||
/**
|
||||
* struct amdgpu_wb - This struct is used for small GPU memory allocation.
|
||||
*
|
||||
* This struct is used to allocate a small amount of GPU memory that can be
|
||||
* used to shadow certain states into the memory. This is especially useful for
|
||||
* providing easy CPU access to some states without requiring register access
|
||||
* (e.g., if some block is power gated, reading register may be problematic).
|
||||
*
|
||||
* Note: the term writeback was initially used because many of the amdgpu
|
||||
* components had some level of writeback memory, and this struct initially
|
||||
* described those components.
|
||||
*/
|
||||
struct amdgpu_wb {
|
||||
|
||||
/**
|
||||
* @wb_obj:
|
||||
*
|
||||
* Buffer Object used for the writeback memory.
|
||||
*/
|
||||
struct amdgpu_bo *wb_obj;
|
||||
|
||||
/**
|
||||
* @wb:
|
||||
*
|
||||
* Pointer to the first writeback slot. In terms of CPU address
|
||||
* this value can be accessed directly by using the offset as an index.
|
||||
* For the GPU address, it is necessary to use gpu_addr and the offset.
|
||||
*/
|
||||
uint32_t *wb;
|
||||
|
||||
/**
|
||||
* @gpu_addr:
|
||||
*
|
||||
* Writeback base address in the GPU.
|
||||
*/
|
||||
uint64_t gpu_addr;
|
||||
|
||||
/**
|
||||
* @num_wb:
|
||||
*
|
||||
* Number of writeback slots reserved for amdgpu.
|
||||
*/
|
||||
u32 num_wb;
|
||||
|
||||
/**
|
||||
* @used:
|
||||
*
|
||||
* Track the writeback slot already used.
|
||||
*/
|
||||
unsigned long used[DIV_ROUND_UP(AMDGPU_MAX_WB, BITS_PER_LONG)];
|
||||
|
||||
/**
|
||||
* @lock:
|
||||
*
|
||||
* Protects read and write of the used field array.
|
||||
*/
|
||||
spinlock_t lock;
|
||||
};
|
||||
|
||||
int amdgpu_device_wb_get(struct amdgpu_device *adev, u32 *wb);
|
||||
void amdgpu_device_wb_free(struct amdgpu_device *adev, u32 wb);
|
||||
|
||||
/*
|
||||
* Benchmarking
|
||||
*/
|
||||
|
|
|
|||
|
|
@ -72,6 +72,7 @@
|
|||
|
||||
#include "amdgpu_xgmi.h"
|
||||
#include "amdgpu_ras.h"
|
||||
#include "amdgpu_wb.h"
|
||||
#include "amdgpu_ras_mgr.h"
|
||||
#include "amdgpu_pmu.h"
|
||||
#include "amdgpu_smu.h"
|
||||
|
|
@ -1006,109 +1007,6 @@ int amdgpu_device_pci_reset(struct amdgpu_device *adev)
|
|||
return pci_reset_function(adev->pdev);
|
||||
}
|
||||
|
||||
/*
|
||||
* amdgpu_device_wb_*()
|
||||
* Writeback is the method by which the GPU updates special pages in memory
|
||||
* with the status of certain GPU events (fences, ring pointers,etc.).
|
||||
*/
|
||||
|
||||
/**
|
||||
* amdgpu_device_wb_fini - Disable Writeback and free memory
|
||||
*
|
||||
* @adev: amdgpu_device pointer
|
||||
*
|
||||
* Disables Writeback and frees the Writeback memory (all asics).
|
||||
* Used at driver shutdown.
|
||||
*/
|
||||
static void amdgpu_device_wb_fini(struct amdgpu_device *adev)
|
||||
{
|
||||
if (adev->wb.wb_obj) {
|
||||
amdgpu_bo_free_kernel(&adev->wb.wb_obj,
|
||||
&adev->wb.gpu_addr,
|
||||
(void **)&adev->wb.wb);
|
||||
adev->wb.wb_obj = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* amdgpu_device_wb_init - Init Writeback driver info and allocate memory
|
||||
*
|
||||
* @adev: amdgpu_device pointer
|
||||
*
|
||||
* Initializes writeback and allocates writeback memory (all asics).
|
||||
* Used at driver startup.
|
||||
* Returns 0 on success or an -error on failure.
|
||||
*/
|
||||
static int amdgpu_device_wb_init(struct amdgpu_device *adev)
|
||||
{
|
||||
int r;
|
||||
|
||||
if (adev->wb.wb_obj == NULL) {
|
||||
/* AMDGPU_MAX_WB * sizeof(uint32_t) * 8 = AMDGPU_MAX_WB 256bit slots */
|
||||
r = amdgpu_bo_create_kernel(adev, AMDGPU_MAX_WB * sizeof(uint32_t) * 8,
|
||||
PAGE_SIZE, AMDGPU_GEM_DOMAIN_GTT,
|
||||
&adev->wb.wb_obj, &adev->wb.gpu_addr,
|
||||
(void **)&adev->wb.wb);
|
||||
if (r) {
|
||||
dev_warn(adev->dev, "(%d) create WB bo failed\n", r);
|
||||
return r;
|
||||
}
|
||||
|
||||
adev->wb.num_wb = AMDGPU_MAX_WB;
|
||||
memset(&adev->wb.used, 0, sizeof(adev->wb.used));
|
||||
|
||||
/* clear wb memory */
|
||||
memset((char *)adev->wb.wb, 0, AMDGPU_MAX_WB * sizeof(uint32_t) * 8);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* amdgpu_device_wb_get - Allocate a wb entry
|
||||
*
|
||||
* @adev: amdgpu_device pointer
|
||||
* @wb: wb index
|
||||
*
|
||||
* Allocate a wb slot for use by the driver (all asics).
|
||||
* Returns 0 on success or -EINVAL on failure.
|
||||
*/
|
||||
int amdgpu_device_wb_get(struct amdgpu_device *adev, u32 *wb)
|
||||
{
|
||||
unsigned long flags, offset;
|
||||
|
||||
spin_lock_irqsave(&adev->wb.lock, flags);
|
||||
offset = find_first_zero_bit(adev->wb.used, adev->wb.num_wb);
|
||||
if (offset < adev->wb.num_wb) {
|
||||
__set_bit(offset, adev->wb.used);
|
||||
spin_unlock_irqrestore(&adev->wb.lock, flags);
|
||||
*wb = offset << 3; /* convert to dw offset */
|
||||
return 0;
|
||||
} else {
|
||||
spin_unlock_irqrestore(&adev->wb.lock, flags);
|
||||
return -EINVAL;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* amdgpu_device_wb_free - Free a wb entry
|
||||
*
|
||||
* @adev: amdgpu_device pointer
|
||||
* @wb: wb index
|
||||
*
|
||||
* Free a wb slot allocated for use by the driver (all asics)
|
||||
*/
|
||||
void amdgpu_device_wb_free(struct amdgpu_device *adev, u32 wb)
|
||||
{
|
||||
unsigned long flags;
|
||||
|
||||
wb >>= 3;
|
||||
spin_lock_irqsave(&adev->wb.lock, flags);
|
||||
if (wb < adev->wb.num_wb)
|
||||
__clear_bit(wb, adev->wb.used);
|
||||
spin_unlock_irqrestore(&adev->wb.lock, flags);
|
||||
}
|
||||
|
||||
/**
|
||||
* amdgpu_device_resize_fb_bar - try to resize FB BAR
|
||||
*
|
||||
|
|
@ -2374,10 +2272,10 @@ static int amdgpu_device_ip_init(struct amdgpu_device *adev)
|
|||
r);
|
||||
goto init_failed;
|
||||
}
|
||||
r = amdgpu_device_wb_init(adev);
|
||||
r = amdgpu_wb_init(adev);
|
||||
if (r) {
|
||||
dev_err(adev->dev,
|
||||
"amdgpu_device_wb_init failed %d\n", r);
|
||||
"amdgpu_wb_init failed %d\n", r);
|
||||
goto init_failed;
|
||||
}
|
||||
adev->ip_blocks[i].status.hw = true;
|
||||
|
|
@ -2909,7 +2807,7 @@ static int amdgpu_device_ip_fini(struct amdgpu_device *adev)
|
|||
if (adev->ip_blocks[i].version->type == AMD_IP_BLOCK_TYPE_GMC) {
|
||||
amdgpu_ucode_free_bo(adev);
|
||||
amdgpu_free_static_csa(&adev->virt.csa_obj);
|
||||
amdgpu_device_wb_fini(adev);
|
||||
amdgpu_wb_fini(adev);
|
||||
amdgpu_device_mem_scratch_fini(adev);
|
||||
amdgpu_ib_pool_fini(adev);
|
||||
amdgpu_seq64_fini(adev);
|
||||
|
|
|
|||
|
|
@ -1170,7 +1170,7 @@ uint32_t amdgpu_kiq_rreg(struct amdgpu_device *adev, uint32_t reg, uint32_t xcc_
|
|||
BUG_ON(!ring->funcs->emit_rreg);
|
||||
|
||||
spin_lock_irqsave(&kiq->ring_lock, flags);
|
||||
if (amdgpu_device_wb_get(adev, ®_val_offs)) {
|
||||
if (amdgpu_wb_get(adev, ®_val_offs)) {
|
||||
pr_err("critical bug! too many kiq readers\n");
|
||||
goto failed_unlock;
|
||||
}
|
||||
|
|
@ -1213,7 +1213,7 @@ uint32_t amdgpu_kiq_rreg(struct amdgpu_device *adev, uint32_t reg, uint32_t xcc_
|
|||
|
||||
mb();
|
||||
value = adev->wb.wb[reg_val_offs];
|
||||
amdgpu_device_wb_free(adev, reg_val_offs);
|
||||
amdgpu_wb_free(adev, reg_val_offs);
|
||||
return value;
|
||||
|
||||
failed_undo:
|
||||
|
|
@ -1222,7 +1222,7 @@ uint32_t amdgpu_kiq_rreg(struct amdgpu_device *adev, uint32_t reg, uint32_t xcc_
|
|||
spin_unlock_irqrestore(&kiq->ring_lock, flags);
|
||||
failed_kiq_read:
|
||||
if (reg_val_offs)
|
||||
amdgpu_device_wb_free(adev, reg_val_offs);
|
||||
amdgpu_wb_free(adev, reg_val_offs);
|
||||
dev_err(adev->dev, "failed to read reg:%x\n", reg);
|
||||
return ~0;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -75,13 +75,13 @@ int amdgpu_ih_ring_init(struct amdgpu_device *adev, struct amdgpu_ih_ring *ih,
|
|||
} else {
|
||||
unsigned wptr_offs, rptr_offs;
|
||||
|
||||
r = amdgpu_device_wb_get(adev, &wptr_offs);
|
||||
r = amdgpu_wb_get(adev, &wptr_offs);
|
||||
if (r)
|
||||
return r;
|
||||
|
||||
r = amdgpu_device_wb_get(adev, &rptr_offs);
|
||||
r = amdgpu_wb_get(adev, &rptr_offs);
|
||||
if (r) {
|
||||
amdgpu_device_wb_free(adev, wptr_offs);
|
||||
amdgpu_wb_free(adev, wptr_offs);
|
||||
return r;
|
||||
}
|
||||
|
||||
|
|
@ -90,8 +90,8 @@ int amdgpu_ih_ring_init(struct amdgpu_device *adev, struct amdgpu_ih_ring *ih,
|
|||
&ih->ring_obj, &ih->gpu_addr,
|
||||
(void **)&ih->ring);
|
||||
if (r) {
|
||||
amdgpu_device_wb_free(adev, rptr_offs);
|
||||
amdgpu_device_wb_free(adev, wptr_offs);
|
||||
amdgpu_wb_free(adev, rptr_offs);
|
||||
amdgpu_wb_free(adev, wptr_offs);
|
||||
return r;
|
||||
}
|
||||
|
||||
|
|
@ -131,8 +131,8 @@ void amdgpu_ih_ring_fini(struct amdgpu_device *adev, struct amdgpu_ih_ring *ih)
|
|||
} else {
|
||||
amdgpu_bo_free_kernel(&ih->ring_obj, &ih->gpu_addr,
|
||||
(void **)&ih->ring);
|
||||
amdgpu_device_wb_free(adev, (ih->wptr_addr - ih->gpu_addr) / 4);
|
||||
amdgpu_device_wb_free(adev, (ih->rptr_addr - ih->gpu_addr) / 4);
|
||||
amdgpu_wb_free(adev, (ih->wptr_addr - ih->gpu_addr) / 4);
|
||||
amdgpu_wb_free(adev, (ih->rptr_addr - ih->gpu_addr) / 4);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -183,7 +183,7 @@ int amdgpu_mes_init(struct amdgpu_device *adev)
|
|||
adev->mes.sdma_hqd_mask[0]);
|
||||
|
||||
for (i = 0; i < AMDGPU_MAX_MES_PIPES * num_xcc; i++) {
|
||||
r = amdgpu_device_wb_get(adev, &adev->mes.sch_ctx_offs[i]);
|
||||
r = amdgpu_wb_get(adev, &adev->mes.sch_ctx_offs[i]);
|
||||
if (r) {
|
||||
dev_err(adev->dev,
|
||||
"(%d) ring trail_fence_offs wb alloc failed\n",
|
||||
|
|
@ -195,7 +195,7 @@ int amdgpu_mes_init(struct amdgpu_device *adev)
|
|||
adev->mes.sch_ctx_ptr[i] =
|
||||
(uint64_t *)&adev->wb.wb[adev->mes.sch_ctx_offs[i]];
|
||||
|
||||
r = amdgpu_device_wb_get(adev,
|
||||
r = amdgpu_wb_get(adev,
|
||||
&adev->mes.query_status_fence_offs[i]);
|
||||
if (r) {
|
||||
dev_err(adev->dev,
|
||||
|
|
@ -268,9 +268,9 @@ int amdgpu_mes_init(struct amdgpu_device *adev)
|
|||
error:
|
||||
for (i = 0; i < AMDGPU_MAX_MES_PIPES * num_xcc; i++) {
|
||||
if (adev->mes.sch_ctx_ptr[i])
|
||||
amdgpu_device_wb_free(adev, adev->mes.sch_ctx_offs[i]);
|
||||
amdgpu_wb_free(adev, adev->mes.sch_ctx_offs[i]);
|
||||
if (adev->mes.query_status_fence_ptr[i])
|
||||
amdgpu_device_wb_free(adev,
|
||||
amdgpu_wb_free(adev,
|
||||
adev->mes.query_status_fence_offs[i]);
|
||||
if (adev->mes.hung_queue_db_array_gpu_obj[i])
|
||||
amdgpu_bo_free_kernel(&adev->mes.hung_queue_db_array_gpu_obj[i],
|
||||
|
|
@ -300,9 +300,9 @@ void amdgpu_mes_fini(struct amdgpu_device *adev)
|
|||
&adev->mes.hung_queue_db_array_gpu_addr[i],
|
||||
&adev->mes.hung_queue_db_array_cpu_addr[i]);
|
||||
if (adev->mes.sch_ctx_ptr[i])
|
||||
amdgpu_device_wb_free(adev, adev->mes.sch_ctx_offs[i]);
|
||||
amdgpu_wb_free(adev, adev->mes.sch_ctx_offs[i]);
|
||||
if (adev->mes.query_status_fence_ptr[i])
|
||||
amdgpu_device_wb_free(adev,
|
||||
amdgpu_wb_free(adev,
|
||||
adev->mes.query_status_fence_offs[i]);
|
||||
}
|
||||
|
||||
|
|
@ -572,7 +572,7 @@ uint32_t amdgpu_mes_rreg(struct amdgpu_device *adev, uint32_t reg,
|
|||
uint64_t read_val_gpu_addr;
|
||||
uint32_t *read_val_ptr;
|
||||
|
||||
if (amdgpu_device_wb_get(adev, &addr_offset)) {
|
||||
if (amdgpu_wb_get(adev, &addr_offset)) {
|
||||
dev_err(adev->dev, "critical bug! too many mes readers\n");
|
||||
goto error;
|
||||
}
|
||||
|
|
@ -598,7 +598,7 @@ uint32_t amdgpu_mes_rreg(struct amdgpu_device *adev, uint32_t reg,
|
|||
|
||||
error:
|
||||
if (addr_offset)
|
||||
amdgpu_device_wb_free(adev, addr_offset);
|
||||
amdgpu_wb_free(adev, addr_offset);
|
||||
return val;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -264,31 +264,31 @@ int amdgpu_ring_init(struct amdgpu_device *adev, struct amdgpu_ring *ring,
|
|||
return r;
|
||||
}
|
||||
|
||||
r = amdgpu_device_wb_get(adev, &ring->rptr_offs);
|
||||
r = amdgpu_wb_get(adev, &ring->rptr_offs);
|
||||
if (r) {
|
||||
dev_err(adev->dev, "(%d) ring rptr_offs wb alloc failed\n", r);
|
||||
return r;
|
||||
}
|
||||
|
||||
r = amdgpu_device_wb_get(adev, &ring->wptr_offs);
|
||||
r = amdgpu_wb_get(adev, &ring->wptr_offs);
|
||||
if (r) {
|
||||
dev_err(adev->dev, "(%d) ring wptr_offs wb alloc failed\n", r);
|
||||
return r;
|
||||
}
|
||||
|
||||
r = amdgpu_device_wb_get(adev, &ring->fence_offs);
|
||||
r = amdgpu_wb_get(adev, &ring->fence_offs);
|
||||
if (r) {
|
||||
dev_err(adev->dev, "(%d) ring fence_offs wb alloc failed\n", r);
|
||||
return r;
|
||||
}
|
||||
|
||||
r = amdgpu_device_wb_get(adev, &ring->trail_fence_offs);
|
||||
r = amdgpu_wb_get(adev, &ring->trail_fence_offs);
|
||||
if (r) {
|
||||
dev_err(adev->dev, "(%d) ring trail_fence_offs wb alloc failed\n", r);
|
||||
return r;
|
||||
}
|
||||
|
||||
r = amdgpu_device_wb_get(adev, &ring->cond_exe_offs);
|
||||
r = amdgpu_wb_get(adev, &ring->cond_exe_offs);
|
||||
if (r) {
|
||||
dev_err(adev->dev, "(%d) ring cond_exec_polling wb alloc failed\n", r);
|
||||
return r;
|
||||
|
|
@ -401,11 +401,11 @@ void amdgpu_ring_fini(struct amdgpu_ring *ring)
|
|||
|
||||
ring->sched.ready = false;
|
||||
|
||||
amdgpu_device_wb_free(ring->adev, ring->rptr_offs);
|
||||
amdgpu_device_wb_free(ring->adev, ring->wptr_offs);
|
||||
amdgpu_wb_free(ring->adev, ring->rptr_offs);
|
||||
amdgpu_wb_free(ring->adev, ring->wptr_offs);
|
||||
|
||||
amdgpu_device_wb_free(ring->adev, ring->cond_exe_offs);
|
||||
amdgpu_device_wb_free(ring->adev, ring->fence_offs);
|
||||
amdgpu_wb_free(ring->adev, ring->cond_exe_offs);
|
||||
amdgpu_wb_free(ring->adev, ring->fence_offs);
|
||||
|
||||
amdgpu_bo_free_kernel(&ring->ring_obj,
|
||||
&ring->gpu_addr,
|
||||
|
|
|
|||
|
|
@ -272,7 +272,7 @@ static int umsch_mm_init(struct amdgpu_device *adev)
|
|||
adev->umsch_mm.engine_mask = (1 << UMSCH_SWIP_ENGINE_TYPE_VPE);
|
||||
adev->umsch_mm.vpe_hqd_mask = 0xfe;
|
||||
|
||||
r = amdgpu_device_wb_get(adev, &adev->umsch_mm.wb_index);
|
||||
r = amdgpu_wb_get(adev, &adev->umsch_mm.wb_index);
|
||||
if (r) {
|
||||
dev_err(adev->dev, "failed to alloc wb for umsch: %d\n", r);
|
||||
return r;
|
||||
|
|
@ -288,7 +288,7 @@ static int umsch_mm_init(struct amdgpu_device *adev)
|
|||
(void **)&adev->umsch_mm.cmd_buf_ptr);
|
||||
if (r) {
|
||||
dev_err(adev->dev, "failed to allocate cmdbuf bo %d\n", r);
|
||||
amdgpu_device_wb_free(adev, adev->umsch_mm.wb_index);
|
||||
amdgpu_wb_free(adev, adev->umsch_mm.wb_index);
|
||||
return r;
|
||||
}
|
||||
|
||||
|
|
@ -380,7 +380,7 @@ static int umsch_mm_sw_fini(struct amdgpu_ip_block *ip_block)
|
|||
&adev->umsch_mm.log_gpu_addr,
|
||||
(void **)&adev->umsch_mm.log_cpu_addr);
|
||||
|
||||
amdgpu_device_wb_free(adev, adev->umsch_mm.wb_index);
|
||||
amdgpu_wb_free(adev, adev->umsch_mm.wb_index);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -789,7 +789,7 @@ static int vpe_ring_test_ring(struct amdgpu_ring *ring)
|
|||
uint64_t wb_addr;
|
||||
int ret;
|
||||
|
||||
ret = amdgpu_device_wb_get(adev, &index);
|
||||
ret = amdgpu_wb_get(adev, &index);
|
||||
if (ret) {
|
||||
dev_err(adev->dev, "(%d) failed to allocate wb slot\n", ret);
|
||||
return ret;
|
||||
|
|
@ -818,7 +818,7 @@ static int vpe_ring_test_ring(struct amdgpu_ring *ring)
|
|||
|
||||
ret = -ETIMEDOUT;
|
||||
out:
|
||||
amdgpu_device_wb_free(adev, index);
|
||||
amdgpu_wb_free(adev, index);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
|
@ -833,7 +833,7 @@ static int vpe_ring_test_ib(struct amdgpu_ring *ring, long timeout)
|
|||
uint64_t wb_addr;
|
||||
int ret;
|
||||
|
||||
ret = amdgpu_device_wb_get(adev, &index);
|
||||
ret = amdgpu_wb_get(adev, &index);
|
||||
if (ret) {
|
||||
dev_err(adev->dev, "(%d) failed to allocate wb slot\n", ret);
|
||||
return ret;
|
||||
|
|
@ -872,7 +872,7 @@ static int vpe_ring_test_ib(struct amdgpu_ring *ring, long timeout)
|
|||
amdgpu_ib_free(&ib, NULL);
|
||||
dma_fence_put(f);
|
||||
err0:
|
||||
amdgpu_device_wb_free(adev, index);
|
||||
amdgpu_wb_free(adev, index);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
|
|
|||
129
drivers/gpu/drm/amd/amdgpu/amdgpu_wb.c
Normal file
129
drivers/gpu/drm/amd/amdgpu/amdgpu_wb.c
Normal file
|
|
@ -0,0 +1,129 @@
|
|||
// SPDX-License-Identifier: GPL-2.0 OR MIT
|
||||
/*
|
||||
* Copyright 2026 Advanced Micro Devices, Inc.
|
||||
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a
|
||||
* copy of this software and associated documentation files (the "Software"),
|
||||
* to deal in the Software without restriction, including without limitation
|
||||
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
|
||||
* and/or sell copies of the Software, and to permit persons to whom the
|
||||
* Software is furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included in
|
||||
* all copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
|
||||
* THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
|
||||
* OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
|
||||
* ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
|
||||
* OTHER DEALINGS IN THE SOFTWARE.
|
||||
*/
|
||||
#include <linux/spinlock.h>
|
||||
|
||||
#include "amdgpu.h"
|
||||
#include "amdgpu_wb.h"
|
||||
|
||||
/*
|
||||
* amdgpu_wb_*()
|
||||
* Writeback is the method by which the GPU updates special pages in memory
|
||||
* with the status of certain GPU events (fences, ring pointers,etc.).
|
||||
*/
|
||||
|
||||
/**
|
||||
* amdgpu_wb_fini - Disable Writeback and free memory
|
||||
*
|
||||
* @adev: amdgpu_device pointer
|
||||
*
|
||||
* Disables Writeback and frees the Writeback memory (all asics).
|
||||
* Used at driver shutdown.
|
||||
*/
|
||||
void amdgpu_wb_fini(struct amdgpu_device *adev)
|
||||
{
|
||||
if (adev->wb.wb_obj) {
|
||||
amdgpu_bo_free_kernel(&adev->wb.wb_obj,
|
||||
&adev->wb.gpu_addr,
|
||||
(void **)&adev->wb.wb);
|
||||
adev->wb.wb_obj = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* amdgpu_wb_init - Init Writeback driver info and allocate memory
|
||||
*
|
||||
* @adev: amdgpu_device pointer
|
||||
*
|
||||
* Initializes writeback and allocates writeback memory (all asics).
|
||||
* Used at driver startup.
|
||||
* Returns 0 on success or an -error on failure.
|
||||
*/
|
||||
int amdgpu_wb_init(struct amdgpu_device *adev)
|
||||
{
|
||||
int r;
|
||||
|
||||
if (adev->wb.wb_obj == NULL) {
|
||||
/* AMDGPU_MAX_WB * sizeof(uint32_t) * 8 = AMDGPU_MAX_WB 256bit slots */
|
||||
r = amdgpu_bo_create_kernel(adev, AMDGPU_MAX_WB * sizeof(uint32_t) * 8,
|
||||
PAGE_SIZE, AMDGPU_GEM_DOMAIN_GTT,
|
||||
&adev->wb.wb_obj, &adev->wb.gpu_addr,
|
||||
(void **)&adev->wb.wb);
|
||||
if (r) {
|
||||
dev_warn(adev->dev, "(%d) create WB bo failed\n", r);
|
||||
return r;
|
||||
}
|
||||
|
||||
adev->wb.num_wb = AMDGPU_MAX_WB;
|
||||
memset(&adev->wb.used, 0, sizeof(adev->wb.used));
|
||||
|
||||
/* clear wb memory */
|
||||
memset((char *)adev->wb.wb, 0, AMDGPU_MAX_WB * sizeof(uint32_t) * 8);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* amdgpu_wb_get - Allocate a wb entry
|
||||
*
|
||||
* @adev: amdgpu_device pointer
|
||||
* @wb: wb index
|
||||
*
|
||||
* Allocate a wb slot for use by the driver (all asics).
|
||||
* Returns 0 on success or -EINVAL on failure.
|
||||
*/
|
||||
int amdgpu_wb_get(struct amdgpu_device *adev, u32 *wb)
|
||||
{
|
||||
unsigned long flags, offset;
|
||||
|
||||
spin_lock_irqsave(&adev->wb.lock, flags);
|
||||
offset = find_first_zero_bit(adev->wb.used, adev->wb.num_wb);
|
||||
if (offset < adev->wb.num_wb) {
|
||||
__set_bit(offset, adev->wb.used);
|
||||
spin_unlock_irqrestore(&adev->wb.lock, flags);
|
||||
*wb = offset << 3; /* convert to dw offset */
|
||||
return 0;
|
||||
} else {
|
||||
spin_unlock_irqrestore(&adev->wb.lock, flags);
|
||||
return -EINVAL;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* amdgpu_wb_free - Free a wb entry
|
||||
*
|
||||
* @adev: amdgpu_device pointer
|
||||
* @wb: wb index
|
||||
*
|
||||
* Free a wb slot allocated for use by the driver (all asics)
|
||||
*/
|
||||
void amdgpu_wb_free(struct amdgpu_device *adev, u32 wb)
|
||||
{
|
||||
unsigned long flags;
|
||||
|
||||
wb >>= 3;
|
||||
spin_lock_irqsave(&adev->wb.lock, flags);
|
||||
if (wb < adev->wb.num_wb)
|
||||
__clear_bit(wb, adev->wb.used);
|
||||
spin_unlock_irqrestore(&adev->wb.lock, flags);
|
||||
}
|
||||
102
drivers/gpu/drm/amd/amdgpu/amdgpu_wb.h
Normal file
102
drivers/gpu/drm/amd/amdgpu/amdgpu_wb.h
Normal file
|
|
@ -0,0 +1,102 @@
|
|||
/* SPDX-License-Identifier: GPL-2.0 OR MIT
|
||||
*
|
||||
* Copyright 2026 Advanced Micro Devices, Inc.
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a
|
||||
* copy of this software and associated documentation files (the "Software"),
|
||||
* to deal in the Software without restriction, including without limitation
|
||||
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
|
||||
* and/or sell copies of the Software, and to permit persons to whom the
|
||||
* Software is furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included in
|
||||
* all copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
|
||||
* THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
|
||||
* OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
|
||||
* ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
|
||||
* OTHER DEALINGS IN THE SOFTWARE.
|
||||
*/
|
||||
#ifndef __AMDGPU_WB_H__
|
||||
#define __AMDGPU_WB_H__
|
||||
|
||||
#include <linux/types.h>
|
||||
#include <linux/spinlock_types.h>
|
||||
#include <linux/math.h>
|
||||
|
||||
/*
|
||||
* Writeback
|
||||
*/
|
||||
#define AMDGPU_MAX_WB 1024 /* Reserve at most 1024 WB slots for amdgpu-owned rings. */
|
||||
|
||||
/**
|
||||
* struct amdgpu_wb - This struct is used for small GPU memory allocation.
|
||||
*
|
||||
* This struct is used to allocate a small amount of GPU memory that can be
|
||||
* used to shadow certain states into the memory. This is especially useful for
|
||||
* providing easy CPU access to some states without requiring register access
|
||||
* (e.g., if some block is power gated, reading register may be problematic).
|
||||
*
|
||||
* Note: the term writeback was initially used because many of the amdgpu
|
||||
* components had some level of writeback memory, and this struct initially
|
||||
* described those components.
|
||||
*/
|
||||
|
||||
struct amdgpu_bo;
|
||||
struct amdgpu_device;
|
||||
|
||||
struct amdgpu_wb {
|
||||
|
||||
/**
|
||||
* @wb_obj:
|
||||
*
|
||||
* Buffer Object used for the writeback memory.
|
||||
*/
|
||||
struct amdgpu_bo *wb_obj;
|
||||
|
||||
/**
|
||||
* @wb:
|
||||
*
|
||||
* Pointer to the first writeback slot. In terms of CPU address
|
||||
* this value can be accessed directly by using the offset as an index.
|
||||
* For the GPU address, it is necessary to use gpu_addr and the offset.
|
||||
*/
|
||||
uint32_t *wb;
|
||||
|
||||
/**
|
||||
* @gpu_addr:
|
||||
*
|
||||
* Writeback base address in the GPU.
|
||||
*/
|
||||
uint64_t gpu_addr;
|
||||
|
||||
/**
|
||||
* @num_wb:
|
||||
*
|
||||
* Number of writeback slots reserved for amdgpu.
|
||||
*/
|
||||
u32 num_wb;
|
||||
|
||||
/**
|
||||
* @used:
|
||||
*
|
||||
* Track the writeback slot already used.
|
||||
*/
|
||||
unsigned long used[DIV_ROUND_UP(AMDGPU_MAX_WB, BITS_PER_LONG)];
|
||||
|
||||
/**
|
||||
* @lock:
|
||||
*
|
||||
* Protects read and write of the used field array.
|
||||
*/
|
||||
spinlock_t lock;
|
||||
};
|
||||
|
||||
void amdgpu_wb_fini(struct amdgpu_device *adev);
|
||||
int amdgpu_wb_init(struct amdgpu_device *adev);
|
||||
int amdgpu_wb_get(struct amdgpu_device *adev, u32 *wb);
|
||||
void amdgpu_wb_free(struct amdgpu_device *adev, u32 wb);
|
||||
#endif
|
||||
|
|
@ -605,7 +605,7 @@ static int cik_sdma_ring_test_ring(struct amdgpu_ring *ring)
|
|||
u32 tmp;
|
||||
u64 gpu_addr;
|
||||
|
||||
r = amdgpu_device_wb_get(adev, &index);
|
||||
r = amdgpu_wb_get(adev, &index);
|
||||
if (r)
|
||||
return r;
|
||||
|
||||
|
|
@ -635,7 +635,7 @@ static int cik_sdma_ring_test_ring(struct amdgpu_ring *ring)
|
|||
r = -ETIMEDOUT;
|
||||
|
||||
error_free_wb:
|
||||
amdgpu_device_wb_free(adev, index);
|
||||
amdgpu_wb_free(adev, index);
|
||||
return r;
|
||||
}
|
||||
|
||||
|
|
@ -658,7 +658,7 @@ static int cik_sdma_ring_test_ib(struct amdgpu_ring *ring, long timeout)
|
|||
u64 gpu_addr;
|
||||
long r;
|
||||
|
||||
r = amdgpu_device_wb_get(adev, &index);
|
||||
r = amdgpu_wb_get(adev, &index);
|
||||
if (r)
|
||||
return r;
|
||||
|
||||
|
|
@ -699,7 +699,7 @@ static int cik_sdma_ring_test_ib(struct amdgpu_ring *ring, long timeout)
|
|||
amdgpu_ib_free(&ib, NULL);
|
||||
dma_fence_put(f);
|
||||
err0:
|
||||
amdgpu_device_wb_free(adev, index);
|
||||
amdgpu_wb_free(adev, index);
|
||||
return r;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -4080,7 +4080,7 @@ static int gfx_v10_0_ring_test_ib(struct amdgpu_ring *ring, long timeout)
|
|||
|
||||
memset(&ib, 0, sizeof(ib));
|
||||
|
||||
r = amdgpu_device_wb_get(adev, &index);
|
||||
r = amdgpu_wb_get(adev, &index);
|
||||
if (r)
|
||||
return r;
|
||||
|
||||
|
|
@ -4121,7 +4121,7 @@ static int gfx_v10_0_ring_test_ib(struct amdgpu_ring *ring, long timeout)
|
|||
amdgpu_ib_free(&ib, NULL);
|
||||
dma_fence_put(f);
|
||||
err1:
|
||||
amdgpu_device_wb_free(adev, index);
|
||||
amdgpu_wb_free(adev, index);
|
||||
return r;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -635,7 +635,7 @@ static int gfx_v11_0_ring_test_ib(struct amdgpu_ring *ring, long timeout)
|
|||
|
||||
memset(&ib, 0, sizeof(ib));
|
||||
|
||||
r = amdgpu_device_wb_get(adev, &index);
|
||||
r = amdgpu_wb_get(adev, &index);
|
||||
if (r)
|
||||
return r;
|
||||
|
||||
|
|
@ -676,7 +676,7 @@ static int gfx_v11_0_ring_test_ib(struct amdgpu_ring *ring, long timeout)
|
|||
amdgpu_ib_free(&ib, NULL);
|
||||
dma_fence_put(f);
|
||||
err1:
|
||||
amdgpu_device_wb_free(adev, index);
|
||||
amdgpu_wb_free(adev, index);
|
||||
return r;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -507,7 +507,7 @@ static int gfx_v12_0_ring_test_ib(struct amdgpu_ring *ring, long timeout)
|
|||
|
||||
memset(&ib, 0, sizeof(ib));
|
||||
|
||||
r = amdgpu_device_wb_get(adev, &index);
|
||||
r = amdgpu_wb_get(adev, &index);
|
||||
if (r)
|
||||
return r;
|
||||
|
||||
|
|
@ -548,7 +548,7 @@ static int gfx_v12_0_ring_test_ib(struct amdgpu_ring *ring, long timeout)
|
|||
amdgpu_ib_free(&ib, NULL);
|
||||
dma_fence_put(f);
|
||||
err1:
|
||||
amdgpu_device_wb_free(adev, index);
|
||||
amdgpu_wb_free(adev, index);
|
||||
return r;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -320,7 +320,7 @@ static int gfx_v12_1_ring_test_ib(struct amdgpu_ring *ring, long timeout)
|
|||
|
||||
memset(&ib, 0, sizeof(ib));
|
||||
|
||||
r = amdgpu_device_wb_get(adev, &index);
|
||||
r = amdgpu_wb_get(adev, &index);
|
||||
if (r)
|
||||
return r;
|
||||
|
||||
|
|
@ -361,7 +361,7 @@ static int gfx_v12_1_ring_test_ib(struct amdgpu_ring *ring, long timeout)
|
|||
amdgpu_ib_free(&ib, NULL);
|
||||
dma_fence_put(f);
|
||||
err1:
|
||||
amdgpu_device_wb_free(adev, index);
|
||||
amdgpu_wb_free(adev, index);
|
||||
return r;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -876,7 +876,7 @@ static int gfx_v8_0_ring_test_ib(struct amdgpu_ring *ring, long timeout)
|
|||
uint32_t tmp;
|
||||
long r;
|
||||
|
||||
r = amdgpu_device_wb_get(adev, &index);
|
||||
r = amdgpu_wb_get(adev, &index);
|
||||
if (r)
|
||||
return r;
|
||||
|
||||
|
|
@ -917,7 +917,7 @@ static int gfx_v8_0_ring_test_ib(struct amdgpu_ring *ring, long timeout)
|
|||
amdgpu_ib_free(&ib, NULL);
|
||||
dma_fence_put(f);
|
||||
err1:
|
||||
amdgpu_device_wb_free(adev, index);
|
||||
amdgpu_wb_free(adev, index);
|
||||
return r;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -1232,7 +1232,7 @@ static int gfx_v9_0_ring_test_ib(struct amdgpu_ring *ring, long timeout)
|
|||
uint32_t tmp;
|
||||
long r;
|
||||
|
||||
r = amdgpu_device_wb_get(adev, &index);
|
||||
r = amdgpu_wb_get(adev, &index);
|
||||
if (r)
|
||||
return r;
|
||||
|
||||
|
|
@ -1273,7 +1273,7 @@ static int gfx_v9_0_ring_test_ib(struct amdgpu_ring *ring, long timeout)
|
|||
amdgpu_ib_free(&ib, NULL);
|
||||
dma_fence_put(f);
|
||||
err1:
|
||||
amdgpu_device_wb_free(adev, index);
|
||||
amdgpu_wb_free(adev, index);
|
||||
return r;
|
||||
}
|
||||
|
||||
|
|
@ -4267,7 +4267,7 @@ static uint64_t gfx_v9_0_kiq_read_clock(struct amdgpu_device *adev)
|
|||
BUG_ON(!ring->funcs->emit_rreg);
|
||||
|
||||
spin_lock_irqsave(&kiq->ring_lock, flags);
|
||||
if (amdgpu_device_wb_get(adev, ®_val_offs)) {
|
||||
if (amdgpu_wb_get(adev, ®_val_offs)) {
|
||||
pr_err("critical bug! too many kiq readers\n");
|
||||
goto failed_unlock;
|
||||
}
|
||||
|
|
@ -4315,7 +4315,7 @@ static uint64_t gfx_v9_0_kiq_read_clock(struct amdgpu_device *adev)
|
|||
mb();
|
||||
value = (uint64_t)adev->wb.wb[reg_val_offs] |
|
||||
(uint64_t)adev->wb.wb[reg_val_offs + 1 ] << 32ULL;
|
||||
amdgpu_device_wb_free(adev, reg_val_offs);
|
||||
amdgpu_wb_free(adev, reg_val_offs);
|
||||
return value;
|
||||
|
||||
failed_undo:
|
||||
|
|
@ -4324,7 +4324,7 @@ static uint64_t gfx_v9_0_kiq_read_clock(struct amdgpu_device *adev)
|
|||
spin_unlock_irqrestore(&kiq->ring_lock, flags);
|
||||
failed_kiq_read:
|
||||
if (reg_val_offs)
|
||||
amdgpu_device_wb_free(adev, reg_val_offs);
|
||||
amdgpu_wb_free(adev, reg_val_offs);
|
||||
pr_err("failed to read gpu clock\n");
|
||||
return ~0;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -458,7 +458,7 @@ static int gfx_v9_4_3_ring_test_ib(struct amdgpu_ring *ring, long timeout)
|
|||
uint32_t tmp;
|
||||
long r;
|
||||
|
||||
r = amdgpu_device_wb_get(adev, &index);
|
||||
r = amdgpu_wb_get(adev, &index);
|
||||
if (r)
|
||||
return r;
|
||||
|
||||
|
|
@ -499,7 +499,7 @@ static int gfx_v9_4_3_ring_test_ib(struct amdgpu_ring *ring, long timeout)
|
|||
amdgpu_ib_free(&ib, NULL);
|
||||
dma_fence_put(f);
|
||||
err1:
|
||||
amdgpu_device_wb_free(adev, index);
|
||||
amdgpu_wb_free(adev, index);
|
||||
return r;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -521,7 +521,7 @@ static int mes_userq_preempt(struct amdgpu_usermode_queue *queue)
|
|||
|
||||
if (queue->state != AMDGPU_USERQ_STATE_MAPPED)
|
||||
return 0;
|
||||
r = amdgpu_device_wb_get(adev, &fence_offset);
|
||||
r = amdgpu_wb_get(adev, &fence_offset);
|
||||
if (r)
|
||||
return r;
|
||||
|
||||
|
|
@ -549,7 +549,7 @@ static int mes_userq_preempt(struct amdgpu_usermode_queue *queue)
|
|||
r = -ETIMEDOUT;
|
||||
|
||||
out:
|
||||
amdgpu_device_wb_free(adev, fence_offset);
|
||||
amdgpu_wb_free(adev, fence_offset);
|
||||
return r;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -198,7 +198,7 @@ static int mes_v11_0_submit_pkt_and_poll_completion(struct amdgpu_mes *mes,
|
|||
timeout = 15 * 600 * 1000;
|
||||
}
|
||||
|
||||
ret = amdgpu_device_wb_get(adev, &status_offset);
|
||||
ret = amdgpu_wb_get(adev, &status_offset);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
|
|
@ -270,7 +270,7 @@ static int mes_v11_0_submit_pkt_and_poll_completion(struct amdgpu_mes *mes,
|
|||
goto error_wb_free;
|
||||
}
|
||||
|
||||
amdgpu_device_wb_free(adev, status_offset);
|
||||
amdgpu_wb_free(adev, status_offset);
|
||||
return 0;
|
||||
|
||||
error_undo:
|
||||
|
|
@ -281,7 +281,7 @@ static int mes_v11_0_submit_pkt_and_poll_completion(struct amdgpu_mes *mes,
|
|||
spin_unlock_irqrestore(&mes->ring_lock[0], flags);
|
||||
|
||||
error_wb_free:
|
||||
amdgpu_device_wb_free(adev, status_offset);
|
||||
amdgpu_wb_free(adev, status_offset);
|
||||
return r;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -175,7 +175,7 @@ static int mes_v12_0_submit_pkt_and_poll_completion(struct amdgpu_mes *mes,
|
|||
timeout = 15 * 600 * 1000;
|
||||
}
|
||||
|
||||
ret = amdgpu_device_wb_get(adev, &status_offset);
|
||||
ret = amdgpu_wb_get(adev, &status_offset);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
|
|
@ -253,7 +253,7 @@ static int mes_v12_0_submit_pkt_and_poll_completion(struct amdgpu_mes *mes,
|
|||
goto error_wb_free;
|
||||
}
|
||||
|
||||
amdgpu_device_wb_free(adev, status_offset);
|
||||
amdgpu_wb_free(adev, status_offset);
|
||||
return 0;
|
||||
|
||||
error_undo:
|
||||
|
|
@ -264,7 +264,7 @@ static int mes_v12_0_submit_pkt_and_poll_completion(struct amdgpu_mes *mes,
|
|||
spin_unlock_irqrestore(ring_lock, flags);
|
||||
|
||||
error_wb_free:
|
||||
amdgpu_device_wb_free(adev, status_offset);
|
||||
amdgpu_wb_free(adev, status_offset);
|
||||
return r;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -177,7 +177,7 @@ static int mes_v12_1_submit_pkt_and_poll_completion(struct amdgpu_mes *mes,
|
|||
timeout = 15 * 600 * 1000;
|
||||
}
|
||||
|
||||
ret = amdgpu_device_wb_get(adev, &status_offset);
|
||||
ret = amdgpu_wb_get(adev, &status_offset);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
|
|
@ -252,7 +252,7 @@ static int mes_v12_1_submit_pkt_and_poll_completion(struct amdgpu_mes *mes,
|
|||
goto error_wb_free;
|
||||
}
|
||||
|
||||
amdgpu_device_wb_free(adev, status_offset);
|
||||
amdgpu_wb_free(adev, status_offset);
|
||||
return 0;
|
||||
|
||||
error_undo:
|
||||
|
|
@ -263,7 +263,7 @@ static int mes_v12_1_submit_pkt_and_poll_completion(struct amdgpu_mes *mes,
|
|||
spin_unlock_irqrestore(ring_lock, flags);
|
||||
|
||||
error_wb_free:
|
||||
amdgpu_device_wb_free(adev, status_offset);
|
||||
amdgpu_wb_free(adev, status_offset);
|
||||
return r;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -536,7 +536,7 @@ static int sdma_v2_4_ring_test_ring(struct amdgpu_ring *ring)
|
|||
u32 tmp;
|
||||
u64 gpu_addr;
|
||||
|
||||
r = amdgpu_device_wb_get(adev, &index);
|
||||
r = amdgpu_wb_get(adev, &index);
|
||||
if (r)
|
||||
return r;
|
||||
|
||||
|
|
@ -567,7 +567,7 @@ static int sdma_v2_4_ring_test_ring(struct amdgpu_ring *ring)
|
|||
r = -ETIMEDOUT;
|
||||
|
||||
error_free_wb:
|
||||
amdgpu_device_wb_free(adev, index);
|
||||
amdgpu_wb_free(adev, index);
|
||||
return r;
|
||||
}
|
||||
|
||||
|
|
@ -590,7 +590,7 @@ static int sdma_v2_4_ring_test_ib(struct amdgpu_ring *ring, long timeout)
|
|||
u64 gpu_addr;
|
||||
long r;
|
||||
|
||||
r = amdgpu_device_wb_get(adev, &index);
|
||||
r = amdgpu_wb_get(adev, &index);
|
||||
if (r)
|
||||
return r;
|
||||
|
||||
|
|
@ -635,7 +635,7 @@ static int sdma_v2_4_ring_test_ib(struct amdgpu_ring *ring, long timeout)
|
|||
amdgpu_ib_free(&ib, NULL);
|
||||
dma_fence_put(f);
|
||||
err0:
|
||||
amdgpu_device_wb_free(adev, index);
|
||||
amdgpu_wb_free(adev, index);
|
||||
return r;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -810,7 +810,7 @@ static int sdma_v3_0_ring_test_ring(struct amdgpu_ring *ring)
|
|||
u32 tmp;
|
||||
u64 gpu_addr;
|
||||
|
||||
r = amdgpu_device_wb_get(adev, &index);
|
||||
r = amdgpu_wb_get(adev, &index);
|
||||
if (r)
|
||||
return r;
|
||||
|
||||
|
|
@ -841,7 +841,7 @@ static int sdma_v3_0_ring_test_ring(struct amdgpu_ring *ring)
|
|||
r = -ETIMEDOUT;
|
||||
|
||||
error_free_wb:
|
||||
amdgpu_device_wb_free(adev, index);
|
||||
amdgpu_wb_free(adev, index);
|
||||
return r;
|
||||
}
|
||||
|
||||
|
|
@ -864,7 +864,7 @@ static int sdma_v3_0_ring_test_ib(struct amdgpu_ring *ring, long timeout)
|
|||
u64 gpu_addr;
|
||||
long r;
|
||||
|
||||
r = amdgpu_device_wb_get(adev, &index);
|
||||
r = amdgpu_wb_get(adev, &index);
|
||||
if (r)
|
||||
return r;
|
||||
|
||||
|
|
@ -908,7 +908,7 @@ static int sdma_v3_0_ring_test_ib(struct amdgpu_ring *ring, long timeout)
|
|||
amdgpu_ib_free(&ib, NULL);
|
||||
dma_fence_put(f);
|
||||
err0:
|
||||
amdgpu_device_wb_free(adev, index);
|
||||
amdgpu_wb_free(adev, index);
|
||||
return r;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -1468,7 +1468,7 @@ static int sdma_v4_0_ring_test_ring(struct amdgpu_ring *ring)
|
|||
u32 tmp;
|
||||
u64 gpu_addr;
|
||||
|
||||
r = amdgpu_device_wb_get(adev, &index);
|
||||
r = amdgpu_wb_get(adev, &index);
|
||||
if (r)
|
||||
return r;
|
||||
|
||||
|
|
@ -1499,7 +1499,7 @@ static int sdma_v4_0_ring_test_ring(struct amdgpu_ring *ring)
|
|||
r = -ETIMEDOUT;
|
||||
|
||||
error_free_wb:
|
||||
amdgpu_device_wb_free(adev, index);
|
||||
amdgpu_wb_free(adev, index);
|
||||
return r;
|
||||
}
|
||||
|
||||
|
|
@ -1522,7 +1522,7 @@ static int sdma_v4_0_ring_test_ib(struct amdgpu_ring *ring, long timeout)
|
|||
u32 tmp = 0;
|
||||
u64 gpu_addr;
|
||||
|
||||
r = amdgpu_device_wb_get(adev, &index);
|
||||
r = amdgpu_wb_get(adev, &index);
|
||||
if (r)
|
||||
return r;
|
||||
|
||||
|
|
@ -1567,7 +1567,7 @@ static int sdma_v4_0_ring_test_ib(struct amdgpu_ring *ring, long timeout)
|
|||
amdgpu_ib_free(&ib, NULL);
|
||||
dma_fence_put(f);
|
||||
err0:
|
||||
amdgpu_device_wb_free(adev, index);
|
||||
amdgpu_wb_free(adev, index);
|
||||
return r;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -1062,7 +1062,7 @@ static int sdma_v4_4_2_ring_test_ring(struct amdgpu_ring *ring)
|
|||
u32 tmp;
|
||||
u64 gpu_addr;
|
||||
|
||||
r = amdgpu_device_wb_get(adev, &index);
|
||||
r = amdgpu_wb_get(adev, &index);
|
||||
if (r)
|
||||
return r;
|
||||
|
||||
|
|
@ -1093,7 +1093,7 @@ static int sdma_v4_4_2_ring_test_ring(struct amdgpu_ring *ring)
|
|||
r = -ETIMEDOUT;
|
||||
|
||||
error_free_wb:
|
||||
amdgpu_device_wb_free(adev, index);
|
||||
amdgpu_wb_free(adev, index);
|
||||
return r;
|
||||
}
|
||||
|
||||
|
|
@ -1116,7 +1116,7 @@ static int sdma_v4_4_2_ring_test_ib(struct amdgpu_ring *ring, long timeout)
|
|||
u32 tmp = 0;
|
||||
u64 gpu_addr;
|
||||
|
||||
r = amdgpu_device_wb_get(adev, &index);
|
||||
r = amdgpu_wb_get(adev, &index);
|
||||
if (r)
|
||||
return r;
|
||||
|
||||
|
|
@ -1161,7 +1161,7 @@ static int sdma_v4_4_2_ring_test_ib(struct amdgpu_ring *ring, long timeout)
|
|||
amdgpu_ib_free(&ib, NULL);
|
||||
dma_fence_put(f);
|
||||
err0:
|
||||
amdgpu_device_wb_free(adev, index);
|
||||
amdgpu_wb_free(adev, index);
|
||||
return r;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -1019,7 +1019,7 @@ static int sdma_v5_0_ring_test_ring(struct amdgpu_ring *ring)
|
|||
|
||||
tmp = 0xCAFEDEAD;
|
||||
|
||||
r = amdgpu_device_wb_get(adev, &index);
|
||||
r = amdgpu_wb_get(adev, &index);
|
||||
if (r) {
|
||||
dev_err(adev->dev, "(%d) failed to allocate wb slot\n", r);
|
||||
return r;
|
||||
|
|
@ -1031,7 +1031,7 @@ static int sdma_v5_0_ring_test_ring(struct amdgpu_ring *ring)
|
|||
r = amdgpu_ring_alloc(ring, 20);
|
||||
if (r) {
|
||||
drm_err(adev_to_drm(adev), "dma failed to lock ring %d (%d).\n", ring->idx, r);
|
||||
amdgpu_device_wb_free(adev, index);
|
||||
amdgpu_wb_free(adev, index);
|
||||
return r;
|
||||
}
|
||||
|
||||
|
|
@ -1056,7 +1056,7 @@ static int sdma_v5_0_ring_test_ring(struct amdgpu_ring *ring)
|
|||
if (i >= adev->usec_timeout)
|
||||
r = -ETIMEDOUT;
|
||||
|
||||
amdgpu_device_wb_free(adev, index);
|
||||
amdgpu_wb_free(adev, index);
|
||||
|
||||
return r;
|
||||
}
|
||||
|
|
@ -1083,7 +1083,7 @@ static int sdma_v5_0_ring_test_ib(struct amdgpu_ring *ring, long timeout)
|
|||
tmp = 0xCAFEDEAD;
|
||||
memset(&ib, 0, sizeof(ib));
|
||||
|
||||
r = amdgpu_device_wb_get(adev, &index);
|
||||
r = amdgpu_wb_get(adev, &index);
|
||||
if (r) {
|
||||
dev_err(adev->dev, "(%ld) failed to allocate wb slot\n", r);
|
||||
return r;
|
||||
|
|
@ -1135,7 +1135,7 @@ static int sdma_v5_0_ring_test_ib(struct amdgpu_ring *ring, long timeout)
|
|||
amdgpu_ib_free(&ib, NULL);
|
||||
dma_fence_put(f);
|
||||
err0:
|
||||
amdgpu_device_wb_free(adev, index);
|
||||
amdgpu_wb_free(adev, index);
|
||||
return r;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -919,7 +919,7 @@ static int sdma_v5_2_ring_test_ring(struct amdgpu_ring *ring)
|
|||
|
||||
tmp = 0xCAFEDEAD;
|
||||
|
||||
r = amdgpu_device_wb_get(adev, &index);
|
||||
r = amdgpu_wb_get(adev, &index);
|
||||
if (r) {
|
||||
dev_err(adev->dev, "(%d) failed to allocate wb slot\n", r);
|
||||
return r;
|
||||
|
|
@ -931,7 +931,7 @@ static int sdma_v5_2_ring_test_ring(struct amdgpu_ring *ring)
|
|||
r = amdgpu_ring_alloc(ring, 20);
|
||||
if (r) {
|
||||
drm_err(adev_to_drm(adev), "dma failed to lock ring %d (%d).\n", ring->idx, r);
|
||||
amdgpu_device_wb_free(adev, index);
|
||||
amdgpu_wb_free(adev, index);
|
||||
return r;
|
||||
}
|
||||
|
||||
|
|
@ -956,7 +956,7 @@ static int sdma_v5_2_ring_test_ring(struct amdgpu_ring *ring)
|
|||
if (i >= adev->usec_timeout)
|
||||
r = -ETIMEDOUT;
|
||||
|
||||
amdgpu_device_wb_free(adev, index);
|
||||
amdgpu_wb_free(adev, index);
|
||||
|
||||
return r;
|
||||
}
|
||||
|
|
@ -983,7 +983,7 @@ static int sdma_v5_2_ring_test_ib(struct amdgpu_ring *ring, long timeout)
|
|||
tmp = 0xCAFEDEAD;
|
||||
memset(&ib, 0, sizeof(ib));
|
||||
|
||||
r = amdgpu_device_wb_get(adev, &index);
|
||||
r = amdgpu_wb_get(adev, &index);
|
||||
if (r) {
|
||||
dev_err(adev->dev, "(%ld) failed to allocate wb slot\n", r);
|
||||
return r;
|
||||
|
|
@ -1034,7 +1034,7 @@ static int sdma_v5_2_ring_test_ib(struct amdgpu_ring *ring, long timeout)
|
|||
amdgpu_ib_free(&ib, NULL);
|
||||
dma_fence_put(f);
|
||||
err0:
|
||||
amdgpu_device_wb_free(adev, index);
|
||||
amdgpu_wb_free(adev, index);
|
||||
return r;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -910,7 +910,7 @@ static int sdma_v6_0_ring_test_ring(struct amdgpu_ring *ring)
|
|||
|
||||
tmp = 0xCAFEDEAD;
|
||||
|
||||
r = amdgpu_device_wb_get(adev, &index);
|
||||
r = amdgpu_wb_get(adev, &index);
|
||||
if (r) {
|
||||
dev_err(adev->dev, "(%d) failed to allocate wb slot\n", r);
|
||||
return r;
|
||||
|
|
@ -922,7 +922,7 @@ static int sdma_v6_0_ring_test_ring(struct amdgpu_ring *ring)
|
|||
r = amdgpu_ring_alloc(ring, 5);
|
||||
if (r) {
|
||||
drm_err(adev_to_drm(adev), "dma failed to lock ring %d (%d).\n", ring->idx, r);
|
||||
amdgpu_device_wb_free(adev, index);
|
||||
amdgpu_wb_free(adev, index);
|
||||
return r;
|
||||
}
|
||||
|
||||
|
|
@ -947,7 +947,7 @@ static int sdma_v6_0_ring_test_ring(struct amdgpu_ring *ring)
|
|||
if (i >= adev->usec_timeout)
|
||||
r = -ETIMEDOUT;
|
||||
|
||||
amdgpu_device_wb_free(adev, index);
|
||||
amdgpu_wb_free(adev, index);
|
||||
|
||||
return r;
|
||||
}
|
||||
|
|
@ -974,7 +974,7 @@ static int sdma_v6_0_ring_test_ib(struct amdgpu_ring *ring, long timeout)
|
|||
tmp = 0xCAFEDEAD;
|
||||
memset(&ib, 0, sizeof(ib));
|
||||
|
||||
r = amdgpu_device_wb_get(adev, &index);
|
||||
r = amdgpu_wb_get(adev, &index);
|
||||
if (r) {
|
||||
dev_err(adev->dev, "(%ld) failed to allocate wb slot\n", r);
|
||||
return r;
|
||||
|
|
@ -1025,7 +1025,7 @@ static int sdma_v6_0_ring_test_ib(struct amdgpu_ring *ring, long timeout)
|
|||
amdgpu_ib_free(&ib, NULL);
|
||||
dma_fence_put(f);
|
||||
err0:
|
||||
amdgpu_device_wb_free(adev, index);
|
||||
amdgpu_wb_free(adev, index);
|
||||
return r;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -925,7 +925,7 @@ static int sdma_v7_0_ring_test_ring(struct amdgpu_ring *ring)
|
|||
|
||||
tmp = 0xCAFEDEAD;
|
||||
|
||||
r = amdgpu_device_wb_get(adev, &index);
|
||||
r = amdgpu_wb_get(adev, &index);
|
||||
if (r) {
|
||||
dev_err(adev->dev, "(%d) failed to allocate wb slot\n", r);
|
||||
return r;
|
||||
|
|
@ -937,7 +937,7 @@ static int sdma_v7_0_ring_test_ring(struct amdgpu_ring *ring)
|
|||
r = amdgpu_ring_alloc(ring, 5);
|
||||
if (r) {
|
||||
drm_err(adev_to_drm(adev), "dma failed to lock ring %d (%d).\n", ring->idx, r);
|
||||
amdgpu_device_wb_free(adev, index);
|
||||
amdgpu_wb_free(adev, index);
|
||||
return r;
|
||||
}
|
||||
|
||||
|
|
@ -962,7 +962,7 @@ static int sdma_v7_0_ring_test_ring(struct amdgpu_ring *ring)
|
|||
if (i >= adev->usec_timeout)
|
||||
r = -ETIMEDOUT;
|
||||
|
||||
amdgpu_device_wb_free(adev, index);
|
||||
amdgpu_wb_free(adev, index);
|
||||
|
||||
return r;
|
||||
}
|
||||
|
|
@ -989,7 +989,7 @@ static int sdma_v7_0_ring_test_ib(struct amdgpu_ring *ring, long timeout)
|
|||
tmp = 0xCAFEDEAD;
|
||||
memset(&ib, 0, sizeof(ib));
|
||||
|
||||
r = amdgpu_device_wb_get(adev, &index);
|
||||
r = amdgpu_wb_get(adev, &index);
|
||||
if (r) {
|
||||
dev_err(adev->dev, "(%ld) failed to allocate wb slot\n", r);
|
||||
return r;
|
||||
|
|
@ -1040,7 +1040,7 @@ static int sdma_v7_0_ring_test_ib(struct amdgpu_ring *ring, long timeout)
|
|||
amdgpu_ib_free(&ib, NULL);
|
||||
dma_fence_put(f);
|
||||
err0:
|
||||
amdgpu_device_wb_free(adev, index);
|
||||
amdgpu_wb_free(adev, index);
|
||||
return r;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -915,7 +915,7 @@ static int sdma_v7_1_ring_test_ring(struct amdgpu_ring *ring)
|
|||
|
||||
tmp = 0xCAFEDEAD;
|
||||
|
||||
r = amdgpu_device_wb_get(adev, &index);
|
||||
r = amdgpu_wb_get(adev, &index);
|
||||
if (r) {
|
||||
dev_err(adev->dev, "(%d) failed to allocate wb slot\n", r);
|
||||
return r;
|
||||
|
|
@ -927,7 +927,7 @@ static int sdma_v7_1_ring_test_ring(struct amdgpu_ring *ring)
|
|||
r = amdgpu_ring_alloc(ring, 5);
|
||||
if (r) {
|
||||
DRM_ERROR("amdgpu: dma failed to lock ring %d (%d).\n", ring->idx, r);
|
||||
amdgpu_device_wb_free(adev, index);
|
||||
amdgpu_wb_free(adev, index);
|
||||
return r;
|
||||
}
|
||||
|
||||
|
|
@ -952,7 +952,7 @@ static int sdma_v7_1_ring_test_ring(struct amdgpu_ring *ring)
|
|||
if (i >= adev->usec_timeout)
|
||||
r = -ETIMEDOUT;
|
||||
|
||||
amdgpu_device_wb_free(adev, index);
|
||||
amdgpu_wb_free(adev, index);
|
||||
|
||||
return r;
|
||||
}
|
||||
|
|
@ -979,7 +979,7 @@ static int sdma_v7_1_ring_test_ib(struct amdgpu_ring *ring, long timeout)
|
|||
tmp = 0xCAFEDEAD;
|
||||
memset(&ib, 0, sizeof(ib));
|
||||
|
||||
r = amdgpu_device_wb_get(adev, &index);
|
||||
r = amdgpu_wb_get(adev, &index);
|
||||
if (r) {
|
||||
dev_err(adev->dev, "(%ld) failed to allocate wb slot\n", r);
|
||||
return r;
|
||||
|
|
@ -1030,7 +1030,7 @@ static int sdma_v7_1_ring_test_ib(struct amdgpu_ring *ring, long timeout)
|
|||
amdgpu_ib_free(&ib, NULL);
|
||||
dma_fence_put(f);
|
||||
err0:
|
||||
amdgpu_device_wb_free(adev, index);
|
||||
amdgpu_wb_free(adev, index);
|
||||
return r;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -213,7 +213,7 @@ static int si_dma_ring_test_ring(struct amdgpu_ring *ring)
|
|||
u32 tmp;
|
||||
u64 gpu_addr;
|
||||
|
||||
r = amdgpu_device_wb_get(adev, &index);
|
||||
r = amdgpu_wb_get(adev, &index);
|
||||
if (r)
|
||||
return r;
|
||||
|
||||
|
|
@ -242,7 +242,7 @@ static int si_dma_ring_test_ring(struct amdgpu_ring *ring)
|
|||
r = -ETIMEDOUT;
|
||||
|
||||
error_free_wb:
|
||||
amdgpu_device_wb_free(adev, index);
|
||||
amdgpu_wb_free(adev, index);
|
||||
return r;
|
||||
}
|
||||
|
||||
|
|
@ -265,7 +265,7 @@ static int si_dma_ring_test_ib(struct amdgpu_ring *ring, long timeout)
|
|||
u64 gpu_addr;
|
||||
long r;
|
||||
|
||||
r = amdgpu_device_wb_get(adev, &index);
|
||||
r = amdgpu_wb_get(adev, &index);
|
||||
if (r)
|
||||
return r;
|
||||
|
||||
|
|
@ -304,7 +304,7 @@ static int si_dma_ring_test_ib(struct amdgpu_ring *ring, long timeout)
|
|||
amdgpu_ib_free(&ib, NULL);
|
||||
dma_fence_put(f);
|
||||
err0:
|
||||
amdgpu_device_wb_free(adev, index);
|
||||
amdgpu_wb_free(adev, index);
|
||||
return r;
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user