Commit d389fd4f authored by Ben Skeggs's avatar Ben Skeggs
Browse files

drm/nouveau/mmu/gf100-: virtualise setting pdb base address for invalidation



It appears that Pascal and newer need something different.

Signed-off-by: default avatarBen Skeggs <bskeggs@redhat.com>
parent 874c1b56
Loading
Loading
Loading
Loading
+5 −1
Original line number Original line Diff line number Diff line
@@ -141,6 +141,8 @@ struct nvkm_vmm_func {
		     struct nvkm_vmm_map *);
		     struct nvkm_vmm_map *);
	void (*flush)(struct nvkm_vmm *, int depth);
	void (*flush)(struct nvkm_vmm *, int depth);


	void (*invalidate_pdb)(struct nvkm_vmm *, u64 addr);

	u64 page_block;
	u64 page_block;
	const struct nvkm_vmm_page page[];
	const struct nvkm_vmm_page page[];
};
};
@@ -186,8 +188,9 @@ int gf100_vmm_join(struct nvkm_vmm *, struct nvkm_memory *);
void gf100_vmm_part(struct nvkm_vmm *, struct nvkm_memory *);
void gf100_vmm_part(struct nvkm_vmm *, struct nvkm_memory *);
int gf100_vmm_aper(enum nvkm_memory_target);
int gf100_vmm_aper(enum nvkm_memory_target);
int gf100_vmm_valid(struct nvkm_vmm *, void *, u32, struct nvkm_vmm_map *);
int gf100_vmm_valid(struct nvkm_vmm *, void *, u32, struct nvkm_vmm_map *);
void gf100_vmm_invalidate(struct nvkm_vmm *, u32 type);
void gf100_vmm_flush(struct nvkm_vmm *, int);
void gf100_vmm_flush(struct nvkm_vmm *, int);
void gf100_vmm_invalidate(struct nvkm_vmm *, u32 type);
void gf100_vmm_invalidate_pdb(struct nvkm_vmm *, u64 addr);


int gk20a_vmm_aper(enum nvkm_memory_target);
int gk20a_vmm_aper(enum nvkm_memory_target);


@@ -200,6 +203,7 @@ int gm200_vmm_join(struct nvkm_vmm *, struct nvkm_memory *);
int gp100_vmm_join(struct nvkm_vmm *, struct nvkm_memory *);
int gp100_vmm_join(struct nvkm_vmm *, struct nvkm_memory *);
int gp100_vmm_valid(struct nvkm_vmm *, void *, u32, struct nvkm_vmm_map *);
int gp100_vmm_valid(struct nvkm_vmm *, void *, u32, struct nvkm_vmm_map *);
void gp100_vmm_flush(struct nvkm_vmm *, int);
void gp100_vmm_flush(struct nvkm_vmm *, int);
void gp100_vmm_invalidate_pdb(struct nvkm_vmm *, u64 addr);


int gv100_vmm_join(struct nvkm_vmm *, struct nvkm_memory *);
int gv100_vmm_join(struct nvkm_vmm *, struct nvkm_memory *);


+25 −1
Original line number Original line Diff line number Diff line
@@ -177,11 +177,20 @@ gf100_vmm_desc_16_16[] = {
	{}
	{}
};
};


void
gf100_vmm_invalidate_pdb(struct nvkm_vmm *vmm, u64 addr)
{
	struct nvkm_device *device = vmm->mmu->subdev.device;
	nvkm_wr32(device, 0x100cb8, addr);
}

void
void
gf100_vmm_invalidate(struct nvkm_vmm *vmm, u32 type)
gf100_vmm_invalidate(struct nvkm_vmm *vmm, u32 type)
{
{
	struct nvkm_subdev *subdev = &vmm->mmu->subdev;
	struct nvkm_subdev *subdev = &vmm->mmu->subdev;
	struct nvkm_device *device = subdev->device;
	struct nvkm_device *device = subdev->device;
	struct nvkm_mmu_pt *pd = vmm->pd->pt[0];
	u64 addr = 0;


	mutex_lock(&subdev->mutex);
	mutex_lock(&subdev->mutex);
	/* Looks like maybe a "free flush slots" counter, the
	/* Looks like maybe a "free flush slots" counter, the
@@ -192,7 +201,20 @@ gf100_vmm_invalidate(struct nvkm_vmm *vmm, u32 type)
			break;
			break;
	);
	);


	nvkm_wr32(device, 0x100cb8, vmm->pd->pt[0]->addr >> 8);
	if (!(type & 0x00000002) /* ALL_PDB. */) {
		switch (nvkm_memory_target(pd->memory)) {
		case NVKM_MEM_TARGET_VRAM: addr |= 0x00000000; break;
		case NVKM_MEM_TARGET_HOST: addr |= 0x00000002; break;
		case NVKM_MEM_TARGET_NCOH: addr |= 0x00000003; break;
		default:
			WARN_ON(1);
			break;
		}
		addr |= (vmm->pd->pt[0]->addr >> 12) << 4;

		vmm->func->invalidate_pdb(vmm, addr);
	}

	nvkm_wr32(device, 0x100cbc, 0x80000000 | type);
	nvkm_wr32(device, 0x100cbc, 0x80000000 | type);


	/* Wait for flush to be queued? */
	/* Wait for flush to be queued? */
@@ -352,6 +374,7 @@ gf100_vmm_17 = {
	.aper = gf100_vmm_aper,
	.aper = gf100_vmm_aper,
	.valid = gf100_vmm_valid,
	.valid = gf100_vmm_valid,
	.flush = gf100_vmm_flush,
	.flush = gf100_vmm_flush,
	.invalidate_pdb = gf100_vmm_invalidate_pdb,
	.page = {
	.page = {
		{ 17, &gf100_vmm_desc_17_17[0], NVKM_VMM_PAGE_xVxC },
		{ 17, &gf100_vmm_desc_17_17[0], NVKM_VMM_PAGE_xVxC },
		{ 12, &gf100_vmm_desc_17_12[0], NVKM_VMM_PAGE_xVHx },
		{ 12, &gf100_vmm_desc_17_12[0], NVKM_VMM_PAGE_xVHx },
@@ -366,6 +389,7 @@ gf100_vmm_16 = {
	.aper = gf100_vmm_aper,
	.aper = gf100_vmm_aper,
	.valid = gf100_vmm_valid,
	.valid = gf100_vmm_valid,
	.flush = gf100_vmm_flush,
	.flush = gf100_vmm_flush,
	.invalidate_pdb = gf100_vmm_invalidate_pdb,
	.page = {
	.page = {
		{ 16, &gf100_vmm_desc_16_16[0], NVKM_VMM_PAGE_xVxC },
		{ 16, &gf100_vmm_desc_16_16[0], NVKM_VMM_PAGE_xVxC },
		{ 12, &gf100_vmm_desc_16_12[0], NVKM_VMM_PAGE_xVHx },
		{ 12, &gf100_vmm_desc_16_12[0], NVKM_VMM_PAGE_xVHx },
+2 −0
Original line number Original line Diff line number Diff line
@@ -71,6 +71,7 @@ gk104_vmm_17 = {
	.aper = gf100_vmm_aper,
	.aper = gf100_vmm_aper,
	.valid = gf100_vmm_valid,
	.valid = gf100_vmm_valid,
	.flush = gf100_vmm_flush,
	.flush = gf100_vmm_flush,
	.invalidate_pdb = gf100_vmm_invalidate_pdb,
	.page = {
	.page = {
		{ 17, &gk104_vmm_desc_17_17[0], NVKM_VMM_PAGE_xVxC },
		{ 17, &gk104_vmm_desc_17_17[0], NVKM_VMM_PAGE_xVxC },
		{ 12, &gk104_vmm_desc_17_12[0], NVKM_VMM_PAGE_xVHx },
		{ 12, &gk104_vmm_desc_17_12[0], NVKM_VMM_PAGE_xVHx },
@@ -85,6 +86,7 @@ gk104_vmm_16 = {
	.aper = gf100_vmm_aper,
	.aper = gf100_vmm_aper,
	.valid = gf100_vmm_valid,
	.valid = gf100_vmm_valid,
	.flush = gf100_vmm_flush,
	.flush = gf100_vmm_flush,
	.invalidate_pdb = gf100_vmm_invalidate_pdb,
	.page = {
	.page = {
		{ 16, &gk104_vmm_desc_16_16[0], NVKM_VMM_PAGE_xVxC },
		{ 16, &gk104_vmm_desc_16_16[0], NVKM_VMM_PAGE_xVxC },
		{ 12, &gk104_vmm_desc_16_12[0], NVKM_VMM_PAGE_xVHx },
		{ 12, &gk104_vmm_desc_16_12[0], NVKM_VMM_PAGE_xVHx },
+2 −0
Original line number Original line Diff line number Diff line
@@ -40,6 +40,7 @@ gk20a_vmm_17 = {
	.aper = gf100_vmm_aper,
	.aper = gf100_vmm_aper,
	.valid = gf100_vmm_valid,
	.valid = gf100_vmm_valid,
	.flush = gf100_vmm_flush,
	.flush = gf100_vmm_flush,
	.invalidate_pdb = gf100_vmm_invalidate_pdb,
	.page = {
	.page = {
		{ 17, &gk104_vmm_desc_17_17[0], NVKM_VMM_PAGE_xxHC },
		{ 17, &gk104_vmm_desc_17_17[0], NVKM_VMM_PAGE_xxHC },
		{ 12, &gk104_vmm_desc_17_12[0], NVKM_VMM_PAGE_xxHx },
		{ 12, &gk104_vmm_desc_17_12[0], NVKM_VMM_PAGE_xxHx },
@@ -54,6 +55,7 @@ gk20a_vmm_16 = {
	.aper = gf100_vmm_aper,
	.aper = gf100_vmm_aper,
	.valid = gf100_vmm_valid,
	.valid = gf100_vmm_valid,
	.flush = gf100_vmm_flush,
	.flush = gf100_vmm_flush,
	.invalidate_pdb = gf100_vmm_invalidate_pdb,
	.page = {
	.page = {
		{ 16, &gk104_vmm_desc_16_16[0], NVKM_VMM_PAGE_xxHC },
		{ 16, &gk104_vmm_desc_16_16[0], NVKM_VMM_PAGE_xxHC },
		{ 12, &gk104_vmm_desc_16_12[0], NVKM_VMM_PAGE_xxHx },
		{ 12, &gk104_vmm_desc_16_12[0], NVKM_VMM_PAGE_xxHx },
+2 −0
Original line number Original line Diff line number Diff line
@@ -113,6 +113,7 @@ gm200_vmm_17 = {
	.aper = gf100_vmm_aper,
	.aper = gf100_vmm_aper,
	.valid = gf100_vmm_valid,
	.valid = gf100_vmm_valid,
	.flush = gf100_vmm_flush,
	.flush = gf100_vmm_flush,
	.invalidate_pdb = gf100_vmm_invalidate_pdb,
	.page = {
	.page = {
		{ 27, &gm200_vmm_desc_17_17[1], NVKM_VMM_PAGE_Sxxx },
		{ 27, &gm200_vmm_desc_17_17[1], NVKM_VMM_PAGE_Sxxx },
		{ 17, &gm200_vmm_desc_17_17[0], NVKM_VMM_PAGE_SVxC },
		{ 17, &gm200_vmm_desc_17_17[0], NVKM_VMM_PAGE_SVxC },
@@ -128,6 +129,7 @@ gm200_vmm_16 = {
	.aper = gf100_vmm_aper,
	.aper = gf100_vmm_aper,
	.valid = gf100_vmm_valid,
	.valid = gf100_vmm_valid,
	.flush = gf100_vmm_flush,
	.flush = gf100_vmm_flush,
	.invalidate_pdb = gf100_vmm_invalidate_pdb,
	.page = {
	.page = {
		{ 27, &gm200_vmm_desc_16_16[1], NVKM_VMM_PAGE_Sxxx },
		{ 27, &gm200_vmm_desc_16_16[1], NVKM_VMM_PAGE_Sxxx },
		{ 16, &gm200_vmm_desc_16_16[0], NVKM_VMM_PAGE_SVxC },
		{ 16, &gm200_vmm_desc_16_16[0], NVKM_VMM_PAGE_SVxC },
Loading