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
0024 #include <core/memory.h>
0025 #include <subdev/bar.h>
0026 #include <subdev/fb.h>
0027
0028 #include <nvif/class.h>
0029 #include <nvif/if500b.h>
0030 #include <nvif/if500d.h>
0031 #include <nvif/unpack.h>
0032
0033 int
0034 nv50_mem_map(struct nvkm_mmu *mmu, struct nvkm_memory *memory, void *argv,
0035 u32 argc, u64 *paddr, u64 *psize, struct nvkm_vma **pvma)
0036 {
0037 struct nv50_vmm_map_v0 uvmm = {};
0038 union {
0039 struct nv50_mem_map_vn vn;
0040 struct nv50_mem_map_v0 v0;
0041 } *args = argv;
0042 struct nvkm_device *device = mmu->subdev.device;
0043 struct nvkm_vmm *bar = nvkm_bar_bar1_vmm(device);
0044 u64 size = nvkm_memory_size(memory);
0045 int ret = -ENOSYS;
0046
0047 if (!(ret = nvif_unpack(ret, &argv, &argc, args->v0, 0, 0, false))) {
0048 uvmm.ro = args->v0.ro;
0049 uvmm.kind = args->v0.kind;
0050 uvmm.comp = args->v0.comp;
0051 } else
0052 if (!(ret = nvif_unvers(ret, &argv, &argc, args->vn))) {
0053 } else
0054 return ret;
0055
0056 ret = nvkm_vmm_get(bar, 12, size, pvma);
0057 if (ret)
0058 return ret;
0059
0060 *paddr = device->func->resource_addr(device, 1) + (*pvma)->addr;
0061 *psize = (*pvma)->size;
0062 return nvkm_memory_map(memory, 0, bar, *pvma, &uvmm, sizeof(uvmm));
0063 }
0064
0065 int
0066 nv50_mem_new(struct nvkm_mmu *mmu, int type, u8 page, u64 size,
0067 void *argv, u32 argc, struct nvkm_memory **pmemory)
0068 {
0069 union {
0070 struct nv50_mem_vn vn;
0071 struct nv50_mem_v0 v0;
0072 } *args = argv;
0073 int ret = -ENOSYS;
0074 bool contig;
0075
0076 if (!(ret = nvif_unpack(ret, &argv, &argc, args->v0, 0, 0, false))) {
0077 type = args->v0.bankswz ? 0x02 : 0x01;
0078 contig = args->v0.contig;
0079 } else
0080 if (!(ret = nvif_unvers(ret, &argv, &argc, args->vn))) {
0081 type = 0x01;
0082 contig = false;
0083 } else
0084 return -ENOSYS;
0085
0086 return nvkm_ram_get(mmu->subdev.device, NVKM_RAM_MM_NORMAL, type,
0087 page, size, contig, false, pmemory);
0088 }