drivers/gpu/drm/nouveau/nvkm/core/engine.c

Source file repositories/reference/linux-study-clean/drivers/gpu/drm/nouveau/nvkm/core/engine.c

File Facts

System
Linux kernel
Corpus path
drivers/gpu/drm/nouveau/nvkm/core/engine.c
Extension
.c
Size
4748 bytes
Lines
190
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

#include <core/engine.h>
#include <core/device.h>
#include <core/option.h>

#include <subdev/fb.h>

bool
nvkm_engine_chsw_load(struct nvkm_engine *engine)
{
	if (engine->func->chsw_load)
		return engine->func->chsw_load(engine);
	return false;
}

int
nvkm_engine_reset(struct nvkm_engine *engine)
{
	if (engine->func->reset)
		return engine->func->reset(engine);

	nvkm_subdev_fini(&engine->subdev, NVKM_POWEROFF);
	return nvkm_subdev_init(&engine->subdev);
}

void
nvkm_engine_unref(struct nvkm_engine **pengine)
{
	struct nvkm_engine *engine = *pengine;

	if (engine) {
		nvkm_subdev_unref(&engine->subdev);
		*pengine = NULL;
	}
}

struct nvkm_engine *
nvkm_engine_ref(struct nvkm_engine *engine)
{
	int ret;

	if (engine) {
		ret = nvkm_subdev_ref(&engine->subdev);
		if (ret)
			return ERR_PTR(ret);
	}

	return engine;
}

void
nvkm_engine_tile(struct nvkm_engine *engine, int region)
{
	struct nvkm_fb *fb = engine->subdev.device->fb;
	if (engine->func->tile)
		engine->func->tile(engine, region, &fb->tile.region[region]);
}

static void
nvkm_engine_intr(struct nvkm_subdev *subdev)
{
	struct nvkm_engine *engine = nvkm_engine(subdev);
	if (engine->func->intr)
		engine->func->intr(engine);
}

static int
nvkm_engine_info(struct nvkm_subdev *subdev, u64 mthd, u64 *data)
{
	struct nvkm_engine *engine = nvkm_engine(subdev);

	if (engine->func->info)
		return engine->func->info(engine, mthd, data);

	return -ENOSYS;
}

static int
nvkm_engine_fini(struct nvkm_subdev *subdev, enum nvkm_suspend_state suspend)
{
	struct nvkm_engine *engine = nvkm_engine(subdev);
	if (engine->func->fini)
		return engine->func->fini(engine, suspend);
	return 0;
}

static int
nvkm_engine_init(struct nvkm_subdev *subdev)
{
	struct nvkm_engine *engine = nvkm_engine(subdev);
	struct nvkm_fb *fb = subdev->device->fb;

Annotation

Implementation Notes