0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018
0019
0020
0021
0022 #include "mem.h"
0023 #include "vmm.h"
0024
0025 #include <subdev/fb.h>
0026
0027 #include <nvif/class.h>
0028
0029 const u8 *
0030 gm200_mmu_kind(struct nvkm_mmu *mmu, int *count, u8 *invalid)
0031 {
0032 static const u8
0033 kind[256] = {
0034 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0xff, 0x01,
0035 0x01, 0x01, 0x01, 0xff, 0xff, 0xff, 0xff, 0xff,
0036 0xff, 0x11, 0xff, 0xff, 0xff, 0xff, 0xff, 0x11,
0037 0x11, 0x11, 0x11, 0xff, 0xff, 0xff, 0xff, 0xff,
0038 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x26, 0x27,
0039 0x28, 0x29, 0x2a, 0x2b, 0xff, 0xff, 0xff, 0xff,
0040 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0041 0xff, 0xff, 0x26, 0x27, 0x28, 0x29, 0x26, 0x27,
0042 0x28, 0x29, 0xff, 0xff, 0xff, 0xff, 0x46, 0xff,
0043 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0044 0xff, 0x46, 0x46, 0x46, 0x46, 0xff, 0xff, 0xff,
0045 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0046 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0047 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0048 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0049 0xff, 0xff, 0xff, 0x7b, 0xff, 0xff, 0xff, 0xff,
0050 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7b, 0x7b,
0051 0x7b, 0x7b, 0xff, 0x8b, 0x8c, 0x8d, 0x8e, 0xff,
0052 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0053 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0054 0xff, 0xff, 0xff, 0x8b, 0x8c, 0x8d, 0x8e, 0xa7,
0055 0xa8, 0xa9, 0xaa, 0xff, 0xff, 0xff, 0xff, 0xff,
0056 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0057 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa7,
0058 0xa8, 0xa9, 0xaa, 0xc3, 0xff, 0xff, 0xff, 0xff,
0059 0xff, 0xff, 0xff, 0xff, 0xfe, 0xfe, 0xc3, 0xc3,
0060 0xc3, 0xc3, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0061 0xfe, 0xff, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe,
0062 0xfe, 0xff, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xff,
0063 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xfe, 0xff,
0064 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe,
0065 0xfe, 0xfe, 0xfe, 0xfe, 0xff, 0xfd, 0xfe, 0xff
0066 };
0067 *count = ARRAY_SIZE(kind);
0068 *invalid = 0xff;
0069 return kind;
0070 }
0071
0072 static const struct nvkm_mmu_func
0073 gm200_mmu = {
0074 .dma_bits = 40,
0075 .mmu = {{ -1, -1, NVIF_CLASS_MMU_GF100}},
0076 .mem = {{ -1, 0, NVIF_CLASS_MEM_GF100}, gf100_mem_new, gf100_mem_map },
0077 .vmm = {{ -1, 0, NVIF_CLASS_VMM_GM200}, gm200_vmm_new },
0078 .kind = gm200_mmu_kind,
0079 .kind_sys = true,
0080 };
0081
0082 static const struct nvkm_mmu_func
0083 gm200_mmu_fixed = {
0084 .dma_bits = 40,
0085 .mmu = {{ -1, -1, NVIF_CLASS_MMU_GF100}},
0086 .mem = {{ -1, 0, NVIF_CLASS_MEM_GF100}, gf100_mem_new, gf100_mem_map },
0087 .vmm = {{ -1, -1, NVIF_CLASS_VMM_GM200}, gm200_vmm_new_fixed },
0088 .kind = gm200_mmu_kind,
0089 .kind_sys = true,
0090 };
0091
0092 int
0093 gm200_mmu_new(struct nvkm_device *device, enum nvkm_subdev_type type, int inst,
0094 struct nvkm_mmu **pmmu)
0095 {
0096 if (device->fb->page)
0097 return nvkm_mmu_new_(&gm200_mmu_fixed, device, type, inst, pmmu);
0098 return nvkm_mmu_new_(&gm200_mmu, device, type, inst, pmmu);
0099 }