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

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

File Facts

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

struct nvkm_uevent {
	struct nvkm_object object;
	struct nvkm_object *parent;
	nvkm_uevent_func func;
	bool wait;

	struct nvkm_event_ntfy ntfy;
	atomic_t allowed;
};

static int
nvkm_uevent_mthd_block(struct nvkm_uevent *uevent, union nvif_event_block_args *args, u32 argc)
{
	if (argc != sizeof(args->vn))
		return -ENOSYS;

	nvkm_event_ntfy_block(&uevent->ntfy);
	atomic_set(&uevent->allowed, 0);
	return 0;
}

static int
nvkm_uevent_mthd_allow(struct nvkm_uevent *uevent, union nvif_event_allow_args *args, u32 argc)
{
	if (argc != sizeof(args->vn))
		return -ENOSYS;

	nvkm_event_ntfy_allow(&uevent->ntfy);
	atomic_set(&uevent->allowed, 1);
	return 0;
}

static int
nvkm_uevent_mthd(struct nvkm_object *object, u32 mthd, void *argv, u32 argc)
{
	struct nvkm_uevent *uevent = nvkm_uevent(object);

	switch (mthd) {
	case NVIF_EVENT_V0_ALLOW: return nvkm_uevent_mthd_allow(uevent, argv, argc);
	case NVIF_EVENT_V0_BLOCK: return nvkm_uevent_mthd_block(uevent, argv, argc);
	default:
		break;
	}

	return -EINVAL;
}

static int
nvkm_uevent_fini(struct nvkm_object *object, enum nvkm_suspend_state suspend)
{
	struct nvkm_uevent *uevent = nvkm_uevent(object);

	nvkm_event_ntfy_block(&uevent->ntfy);
	return 0;
}

static int
nvkm_uevent_init(struct nvkm_object *object)
{
	struct nvkm_uevent *uevent = nvkm_uevent(object);

	if (atomic_read(&uevent->allowed))
		nvkm_event_ntfy_allow(&uevent->ntfy);

	return 0;
}

static void *
nvkm_uevent_dtor(struct nvkm_object *object)
{
	struct nvkm_uevent *uevent = nvkm_uevent(object);

	nvkm_event_ntfy_del(&uevent->ntfy);
	return uevent;
}

static const struct nvkm_object_func
nvkm_uevent = {
	.dtor = nvkm_uevent_dtor,
	.init = nvkm_uevent_init,
	.fini = nvkm_uevent_fini,
	.mthd = nvkm_uevent_mthd,
};

static int
nvkm_uevent_ntfy(struct nvkm_event_ntfy *ntfy, u32 bits)
{
	struct nvkm_uevent *uevent = container_of(ntfy, typeof(*uevent), ntfy);
	struct nvkm_client *client = uevent->object.client;

Annotation

Implementation Notes