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

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

File Facts

System
Linux kernel
Corpus path
drivers/gpu/drm/nouveau/nvkm/core/subdev.c
Extension
.c
Size
7001 bytes
Lines
288
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 (ret) {
			nvkm_error(subdev, "%s failed, %d\n", action, ret);
			if (suspend)
				return ret;
		}
	}
	subdev->use.enabled = false;

	nvkm_mc_reset(device, subdev->type, subdev->inst);

	time = ktime_to_us(ktime_get()) - time;
	nvkm_trace(subdev, "%s completed in %lldus\n", action, time);
	return 0;
}

int
nvkm_subdev_preinit(struct nvkm_subdev *subdev)
{
	s64 time;

	nvkm_trace(subdev, "preinit running...\n");
	time = ktime_to_us(ktime_get());

	if (subdev->func->preinit) {
		int ret = subdev->func->preinit(subdev);
		if (ret) {
			nvkm_error(subdev, "preinit failed, %d\n", ret);
			return ret;
		}
	}

	time = ktime_to_us(ktime_get()) - time;
	nvkm_trace(subdev, "preinit completed in %lldus\n", time);
	return 0;
}

static int
nvkm_subdev_oneinit_(struct nvkm_subdev *subdev)
{
	s64 time;
	int ret;

	if (!subdev->func->oneinit || subdev->oneinit)
		return 0;

	nvkm_trace(subdev, "one-time init running...\n");
	time = ktime_to_us(ktime_get());
	ret = subdev->func->oneinit(subdev);
	if (ret) {
		nvkm_error(subdev, "one-time init failed, %d\n", ret);
		return ret;
	}

	subdev->oneinit = true;
	time = ktime_to_us(ktime_get()) - time;
	nvkm_trace(subdev, "one-time init completed in %lldus\n", time);
	return 0;
}

static int
nvkm_subdev_init_(struct nvkm_subdev *subdev)
{
	s64 time;
	int ret;

	if (subdev->use.enabled) {
		nvkm_trace(subdev, "init skipped, already running\n");
		return 0;
	}

	nvkm_trace(subdev, "init running...\n");
	time = ktime_to_us(ktime_get());

	ret = nvkm_subdev_oneinit_(subdev);
	if (ret)
		return ret;

	subdev->use.enabled = true;

	if (subdev->func->init) {
		ret = subdev->func->init(subdev);
		if (ret) {
			nvkm_error(subdev, "init failed, %d\n", ret);
			return ret;
		}
	}

	time = ktime_to_us(ktime_get()) - time;
	nvkm_trace(subdev, "init completed in %lldus\n", time);
	return 0;

Annotation

Implementation Notes