0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018
0019
0020
0021
0022 #include "vmm.h"
0023
0024 #include <subdev/timer.h>
0025
0026 static void
0027 tu102_vmm_flush(struct nvkm_vmm *vmm, int depth)
0028 {
0029 struct nvkm_device *device = vmm->mmu->subdev.device;
0030 u32 type = (5 - depth) << 24;
0031
0032 type |= 0x00000001;
0033 if (atomic_read(&vmm->engref[NVKM_SUBDEV_BAR]))
0034 type |= 0x00000004;
0035
0036 mutex_lock(&vmm->mmu->mutex);
0037
0038 nvkm_wr32(device, 0xb830a0, vmm->pd->pt[0]->addr >> 8);
0039 nvkm_wr32(device, 0xb830a4, 0x00000000);
0040 nvkm_wr32(device, 0x100e68, 0x00000000);
0041 nvkm_wr32(device, 0xb830b0, 0x80000000 | type);
0042
0043 nvkm_msec(device, 2000,
0044 if (!(nvkm_rd32(device, 0xb830b0) & 0x80000000))
0045 break;
0046 );
0047
0048 mutex_unlock(&vmm->mmu->mutex);
0049 }
0050
0051 static const struct nvkm_vmm_func
0052 tu102_vmm = {
0053 .join = gv100_vmm_join,
0054 .part = gf100_vmm_part,
0055 .aper = gf100_vmm_aper,
0056 .valid = gp100_vmm_valid,
0057 .flush = tu102_vmm_flush,
0058 .mthd = gp100_vmm_mthd,
0059 .page = {
0060 { 47, &gp100_vmm_desc_16[4], NVKM_VMM_PAGE_Sxxx },
0061 { 38, &gp100_vmm_desc_16[3], NVKM_VMM_PAGE_Sxxx },
0062 { 29, &gp100_vmm_desc_16[2], NVKM_VMM_PAGE_Sxxx },
0063 { 21, &gp100_vmm_desc_16[1], NVKM_VMM_PAGE_SVxC },
0064 { 16, &gp100_vmm_desc_16[0], NVKM_VMM_PAGE_SVxC },
0065 { 12, &gp100_vmm_desc_12[0], NVKM_VMM_PAGE_SVHx },
0066 {}
0067 }
0068 };
0069
0070 int
0071 tu102_vmm_new(struct nvkm_mmu *mmu, bool managed, u64 addr, u64 size,
0072 void *argv, u32 argc, struct lock_class_key *key,
0073 const char *name, struct nvkm_vmm **pvmm)
0074 {
0075 return gp100_vmm_new_(&tu102_vmm, mmu, managed, addr, size,
0076 argv, argc, key, name, pvmm);
0077 }