drivers/gpu/drm/nouveau/nvkm/engine/sw/nv04.c

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

File Facts

System
Linux kernel
Corpus path
drivers/gpu/drm/nouveau/nvkm/engine/sw/nv04.c
Extension
.c
Size
3900 bytes
Lines
140
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 nv04_sw_chan {
	struct nvkm_sw_chan base;
	atomic_t ref;
};

/*******************************************************************************
 * software object classes
 ******************************************************************************/

static int
nv04_nvsw_mthd_get_ref(struct nvkm_nvsw *nvsw, void *data, u32 size)
{
	struct nv04_sw_chan *chan = nv04_sw_chan(nvsw->chan);
	union {
		struct nv04_nvsw_get_ref_v0 v0;
	} *args = data;
	int ret = -ENOSYS;

	if (!(ret = nvif_unpack(ret, &data, &size, args->v0, 0, 0, false))) {
		args->v0.ref = atomic_read(&chan->ref);
	}

	return ret;
}

static int
nv04_nvsw_mthd(struct nvkm_nvsw *nvsw, u32 mthd, void *data, u32 size)
{
	switch (mthd) {
	case NV04_NVSW_GET_REF:
		return nv04_nvsw_mthd_get_ref(nvsw, data, size);
	default:
		break;
	}
	return -EINVAL;
}

static const struct nvkm_nvsw_func
nv04_nvsw = {
	.mthd = nv04_nvsw_mthd,
};

static int
nv04_nvsw_new(struct nvkm_sw_chan *chan, const struct nvkm_oclass *oclass,
	      void *data, u32 size, struct nvkm_object **pobject)
{
	return nvkm_nvsw_new_(&nv04_nvsw, chan, oclass, data, size, pobject);
}

/*******************************************************************************
 * software context
 ******************************************************************************/

static bool
nv04_sw_chan_mthd(struct nvkm_sw_chan *base, int subc, u32 mthd, u32 data)
{
	struct nv04_sw_chan *chan = nv04_sw_chan(base);

	switch (mthd) {
	case 0x0150:
		atomic_set(&chan->ref, data);
		return true;
	default:
		break;
	}

	return false;
}

static const struct nvkm_sw_chan_func
nv04_sw_chan = {
	.mthd = nv04_sw_chan_mthd,
};

static int
nv04_sw_chan_new(struct nvkm_sw *sw, struct nvkm_chan *fifo,
		 const struct nvkm_oclass *oclass, struct nvkm_object **pobject)
{
	struct nv04_sw_chan *chan;

	if (!(chan = kzalloc_obj(*chan)))
		return -ENOMEM;
	atomic_set(&chan->ref, 0);
	*pobject = &chan->base.object;

	return nvkm_sw_chan_ctor(&nv04_sw_chan, sw, fifo, oclass, &chan->base);
}

/*******************************************************************************
 * software engine/subdev functions

Annotation

Implementation Notes