drivers/gpu/drm/amd/ras/rascore/ras_psp.c

Source file repositories/reference/linux-study-clean/drivers/gpu/drm/amd/ras/rascore/ras_psp.c

File Facts

System
Linux kernel
Corpus path
drivers/gpu/drm/amd/ras/rascore/ras_psp.c
Extension
.c
Size
21131 bytes
Lines
753
Domain
Driver Families
Bucket
drivers/gpu
Inferred role
Driver Families: implementation source
Status
source implementation candidate

Why This File Exists

Repeatable hardware-adapter layer. Deep compatibility for every driver is out of scope; this atlas records patterns, probe lifecycles, bus glue, IRQ/DMA usage, and links back to core abstractions.

Dependency Surface

Detected Declarations

Annotated Snippet

if (status.initialized) {
			ta_ctx->preload_ras_ta_enabled = true;
			ta_ctx->ras_ta_initialized = status.initialized;
			ta_ctx->session_id = status.session_id;
		}

		psp_ctx->external_mutex = status.psp_cmd_mutex;
	}

	return 0;
}

static int ras_psp_get_ras_ta_init_param(struct ras_core_context *ras_core,
	struct ras_ta_init_param *ras_ta_param)
{
	struct ras_psp *psp = &ras_core->ras_psp;

	if (psp->sys_func && psp->sys_func->get_ras_ta_init_param)
		return psp->sys_func->get_ras_ta_init_param(ras_core, ras_ta_param);

	RAS_DEV_ERR(ras_core->dev, "Not config get_ras_ta_init_param API!!\n");
	return -EACCES;
}

static struct gpu_mem_block *ras_psp_get_gpu_mem(struct ras_core_context *ras_core,
			enum gpu_mem_type mem_type)
{
	struct ras_psp *psp = &ras_core->ras_psp;
	struct gpu_mem_block *gpu_mem = NULL;
	int ret;

	switch (mem_type) {
	case GPU_MEM_TYPE_RAS_PSP_RING:
		gpu_mem = &psp->psp_ring.ras_ring_gpu_mem;
		break;
	case GPU_MEM_TYPE_RAS_PSP_CMD:
		gpu_mem = &psp->psp_ctx.psp_cmd_gpu_mem;
		break;
	case GPU_MEM_TYPE_RAS_PSP_FENCE:
		gpu_mem = &psp->psp_ctx.out_fence_gpu_mem;
		break;
	case GPU_MEM_TYPE_RAS_TA_FW:
		gpu_mem = &psp->ta_ctx.fw_gpu_mem;
		break;
	case GPU_MEM_TYPE_RAS_TA_CMD:
		gpu_mem = &psp->ta_ctx.cmd_gpu_mem;
		break;
	default:
		return NULL;
	}

	if (!gpu_mem->ref_count) {
		ret = ras_core_get_gpu_mem(ras_core, mem_type, gpu_mem);
		if (ret)
			return NULL;
		gpu_mem->mem_type = mem_type;
	}

	gpu_mem->ref_count++;

	return gpu_mem;
}

static int ras_psp_put_gpu_mem(struct ras_core_context *ras_core,
			struct gpu_mem_block *gpu_mem)
{
	if (!gpu_mem)
		return 0;

	gpu_mem->ref_count--;

	if (gpu_mem->ref_count > 0) {
		return 0;
	} else if (gpu_mem->ref_count < 0) {
		RAS_DEV_WARN(ras_core->dev,
			"Duplicate free gpu memory %u\n", gpu_mem->mem_type);
	} else {
		ras_core_put_gpu_mem(ras_core, gpu_mem->mem_type, gpu_mem);
		memset(gpu_mem, 0, sizeof(*gpu_mem));
	}

	return 0;
}

static void __acquire_psp_cmd_lock(struct ras_core_context *ras_core)
{
	struct ras_psp_ctx *psp_ctx = &ras_core->ras_psp.psp_ctx;

	if (psp_ctx->external_mutex)
		mutex_lock(psp_ctx->external_mutex);

Annotation

Implementation Notes