drivers/gpu/drm/nouveau/nvkm/subdev/gsp/base.c

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

File Facts

System
Linux kernel
Corpus path
drivers/gpu/drm/nouveau/nvkm/subdev/gsp/base.c
Extension
.c
Size
4151 bytes
Lines
164
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 (gsp->intr[i].type == type && gsp->intr[i].inst == inst) {
			if (gsp->intr[i].stall != ~0)
				return gsp->intr[i].stall;

			return -EINVAL;
		}
	}

	return -ENOENT;
}

static int
nvkm_gsp_fini(struct nvkm_subdev *subdev, enum nvkm_suspend_state suspend)
{
	struct nvkm_gsp *gsp = nvkm_gsp(subdev);

	if (!gsp->func->fini || !gsp->running)
		return 0;

	return gsp->func->fini(gsp, suspend);
}

static int
nvkm_gsp_init(struct nvkm_subdev *subdev)
{
	struct nvkm_gsp *gsp = nvkm_gsp(subdev);

	if (!gsp->func->init)
		return 0;

	return gsp->func->init(gsp);
}

static int
nvkm_gsp_oneinit(struct nvkm_subdev *subdev)
{
	struct nvkm_gsp *gsp = nvkm_gsp(subdev);

	if (!gsp->func->oneinit)
		return 0;

	return gsp->func->oneinit(gsp);
}

void
nvkm_gsp_dtor_fws(struct nvkm_gsp *gsp)
{
	nvkm_firmware_put(gsp->fws.fmc);
	gsp->fws.fmc = NULL;
	nvkm_firmware_put(gsp->fws.bl);
	gsp->fws.bl = NULL;
	nvkm_firmware_put(gsp->fws.booter.unload);
	gsp->fws.booter.unload = NULL;
	nvkm_firmware_put(gsp->fws.booter.load);
	gsp->fws.booter.load = NULL;
	nvkm_firmware_put(gsp->fws.rm);
	gsp->fws.rm = NULL;
}

static void *
nvkm_gsp_dtor(struct nvkm_subdev *subdev)
{
	struct nvkm_gsp *gsp = nvkm_gsp(subdev);

	if (gsp->func && gsp->func->dtor)
		gsp->func->dtor(gsp);

	nvkm_falcon_dtor(&gsp->falcon);
	kfree(gsp->rm);
	return gsp;
}

static const struct nvkm_subdev_func
nvkm_gsp = {
	.dtor = nvkm_gsp_dtor,
	.oneinit = nvkm_gsp_oneinit,
	.init = nvkm_gsp_init,
	.fini = nvkm_gsp_fini,
};

int
nvkm_gsp_load_fw(struct nvkm_gsp *gsp, const char *name, const char *ver,
		 const struct firmware **pfw)
{
	char fwname[64];

	snprintf(fwname, sizeof(fwname), "gsp/%s-%s", name, ver);
	return nvkm_firmware_get(&gsp->subdev, fwname, 0, pfw);
}

Annotation

Implementation Notes