drm/nouveau/mmu/gf100-: virtualise setting pdb base address for invalidation
It appears that Pascal and newer need something different. Signed-off-by: Ben Skeggs <bskeggs@redhat.com>
This commit is contained in:
parent
874c1b56f3
commit
d389fd4fa9
@ -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 *);
|
||||||
|
|
||||||
|
@ -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 },
|
||||||
|
@ -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 },
|
||||||
|
@ -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 },
|
||||||
|
@ -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 },
|
||||||
|
@ -28,6 +28,7 @@ gm20b_vmm_17 = {
|
|||||||
.aper = gk20a_vmm_aper,
|
.aper = gk20a_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_SxHC },
|
{ 17, &gm200_vmm_desc_17_17[0], NVKM_VMM_PAGE_SxHC },
|
||||||
@ -43,6 +44,7 @@ gm20b_vmm_16 = {
|
|||||||
.aper = gk20a_vmm_aper,
|
.aper = gk20a_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_SxHC },
|
{ 16, &gm200_vmm_desc_16_16[0], NVKM_VMM_PAGE_SxHC },
|
||||||
|
@ -306,6 +306,14 @@ gp100_vmm_valid(struct nvkm_vmm *vmm, void *argv, u32 argc,
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
gp100_vmm_invalidate_pdb(struct nvkm_vmm *vmm, u64 addr)
|
||||||
|
{
|
||||||
|
struct nvkm_device *device = vmm->mmu->subdev.device;
|
||||||
|
nvkm_wr32(device, 0x100cb8, lower_32_bits(addr));
|
||||||
|
nvkm_wr32(device, 0x100cec, upper_32_bits(addr));
|
||||||
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
gp100_vmm_flush(struct nvkm_vmm *vmm, int depth)
|
gp100_vmm_flush(struct nvkm_vmm *vmm, int depth)
|
||||||
{
|
{
|
||||||
@ -331,6 +339,7 @@ gp100_vmm = {
|
|||||||
.aper = gf100_vmm_aper,
|
.aper = gf100_vmm_aper,
|
||||||
.valid = gp100_vmm_valid,
|
.valid = gp100_vmm_valid,
|
||||||
.flush = gp100_vmm_flush,
|
.flush = gp100_vmm_flush,
|
||||||
|
.invalidate_pdb = gp100_vmm_invalidate_pdb,
|
||||||
.page = {
|
.page = {
|
||||||
{ 47, &gp100_vmm_desc_16[4], NVKM_VMM_PAGE_Sxxx },
|
{ 47, &gp100_vmm_desc_16[4], NVKM_VMM_PAGE_Sxxx },
|
||||||
{ 38, &gp100_vmm_desc_16[3], NVKM_VMM_PAGE_Sxxx },
|
{ 38, &gp100_vmm_desc_16[3], NVKM_VMM_PAGE_Sxxx },
|
||||||
|
@ -28,6 +28,7 @@ gp10b_vmm = {
|
|||||||
.aper = gk20a_vmm_aper,
|
.aper = gk20a_vmm_aper,
|
||||||
.valid = gp100_vmm_valid,
|
.valid = gp100_vmm_valid,
|
||||||
.flush = gp100_vmm_flush,
|
.flush = gp100_vmm_flush,
|
||||||
|
.invalidate_pdb = gp100_vmm_invalidate_pdb,
|
||||||
.page = {
|
.page = {
|
||||||
{ 47, &gp100_vmm_desc_16[4], NVKM_VMM_PAGE_Sxxx },
|
{ 47, &gp100_vmm_desc_16[4], NVKM_VMM_PAGE_Sxxx },
|
||||||
{ 38, &gp100_vmm_desc_16[3], NVKM_VMM_PAGE_Sxxx },
|
{ 38, &gp100_vmm_desc_16[3], NVKM_VMM_PAGE_Sxxx },
|
||||||
|
@ -66,6 +66,7 @@ gv100_vmm = {
|
|||||||
.aper = gf100_vmm_aper,
|
.aper = gf100_vmm_aper,
|
||||||
.valid = gp100_vmm_valid,
|
.valid = gp100_vmm_valid,
|
||||||
.flush = gp100_vmm_flush,
|
.flush = gp100_vmm_flush,
|
||||||
|
.invalidate_pdb = gp100_vmm_invalidate_pdb,
|
||||||
.page = {
|
.page = {
|
||||||
{ 47, &gp100_vmm_desc_16[4], NVKM_VMM_PAGE_Sxxx },
|
{ 47, &gp100_vmm_desc_16[4], NVKM_VMM_PAGE_Sxxx },
|
||||||
{ 38, &gp100_vmm_desc_16[3], NVKM_VMM_PAGE_Sxxx },
|
{ 38, &gp100_vmm_desc_16[3], NVKM_VMM_PAGE_Sxxx },
|
||||||
|
Loading…
Reference in New Issue
Block a user