drivers/gpu/drm/nouveau/nvkm/subdev/gsp/rm/r535/bar.c

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

File Facts

System
Linux kernel
Corpus path
drivers/gpu/drm/nouveau/nvkm/subdev/gsp/rm/r535/bar.c
Extension
.c
Size
5205 bytes
Lines
203
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 == 0) {
			ret = nvkm_memory_kmap(fbZero, &bar->flushFBZero);
			nvkm_memory_unref(&fbZero);
		}
		WARN_ON(ret);
	}

	bar->bar2 = true;
	bar->flushBAR2 = nvkm_kmap(bar->flushFBZero);
	WARN_ON(!bar->flushBAR2);
}

static void
r535_bar_bar1_wait(struct nvkm_bar *base)
{
}

static void
r535_bar_bar1_fini(struct nvkm_bar *base)
{
}

static void
r535_bar_bar1_init(struct nvkm_bar *bar)
{
	struct nvkm_device *device = bar->subdev.device;
	struct nvkm_gsp *gsp = device->gsp;
	struct nvkm_vmm *vmm = gf100_bar(bar)->bar[1].vmm;
	struct nvkm_memory *pd3;
	int ret;

	ret = nvkm_ram_wrap(device, gsp->bar.rm_bar1_pdb, 0x1000, &pd3);
	if (WARN_ON(ret))
		return;

	nvkm_memory_unref(&vmm->pd->pt[0]->memory);

	ret = nvkm_memory_kmap(pd3, &vmm->pd->pt[0]->memory);
	nvkm_memory_unref(&pd3);
	if (WARN_ON(ret))
		return;

	vmm->pd->pt[0]->addr = nvkm_memory_addr(vmm->pd->pt[0]->memory);
}

static void *
r535_bar_dtor(struct nvkm_bar *bar)
{
	void *data = gf100_bar_dtor(bar);

	nvkm_memory_unref(&bar->flushFBZero);

	if (bar->flushBAR2PhysMode)
		iounmap(bar->flushBAR2PhysMode);

	kfree(bar->func);
	return data;
}

int
r535_bar_new_(const struct nvkm_bar_func *hw, struct nvkm_device *device,
	      enum nvkm_subdev_type type, int inst, struct nvkm_bar **pbar)
{
	struct nvkm_bar_func *rm;
	struct nvkm_bar *bar;
	int ret;

	if (!(rm = kzalloc_obj(*rm)))
		return -ENOMEM;

	rm->dtor = r535_bar_dtor;
	rm->oneinit = hw->oneinit;
	rm->bar1.init = r535_bar_bar1_init;
	rm->bar1.fini = r535_bar_bar1_fini;
	rm->bar1.wait = r535_bar_bar1_wait;
	rm->bar1.vmm = hw->bar1.vmm;
	rm->bar2.init = r535_bar_bar2_init;
	rm->bar2.fini = r535_bar_bar2_fini;
	rm->bar2.wait = r535_bar_bar2_wait;
	rm->bar2.vmm = hw->bar2.vmm;
	rm->flush = r535_bar_flush;

	ret = gf100_bar_new_(rm, device, type, inst, &bar);
	if (ret) {
		kfree(rm);
		return ret;
	}
	*pbar = bar;

	bar->flushBAR2PhysMode = ioremap(device->func->resource_addr(device, NVKM_BAR2_INST), PAGE_SIZE);

Annotation

Implementation Notes