diff options
author | Ben Skeggs | 2017-10-31 18:56:19 +0100 |
---|---|---|
committer | Ben Skeggs | 2017-11-02 04:32:26 +0100 |
commit | 5f300fed645597689f1e6fed8800fc7e3d01e212 (patch) | |
tree | 71aa34582fcc45c18fbe0c89c74139c89f3a47e0 /drivers/gpu/drm/nouveau/nvkm/subdev/mmu/gm20b.c | |
parent | drm/nouveau/mmu/gk104,gk20a: implement vmm on top of new base (diff) | |
download | kernel-qcow2-linux-5f300fed645597689f1e6fed8800fc7e3d01e212.tar.gz kernel-qcow2-linux-5f300fed645597689f1e6fed8800fc7e3d01e212.tar.xz kernel-qcow2-linux-5f300fed645597689f1e6fed8800fc7e3d01e212.zip |
drm/nouveau/mmu/gm200,gm20b: implement vmm on top of new base
Adds support for:
- Per-VMM selection of big page size.
- System-memory PDs.
Signed-off-by: Ben Skeggs <bskeggs@redhat.com>
Diffstat (limited to 'drivers/gpu/drm/nouveau/nvkm/subdev/mmu/gm20b.c')
-rw-r--r-- | drivers/gpu/drm/nouveau/nvkm/subdev/mmu/gm20b.c | 25 |
1 files changed, 24 insertions, 1 deletions
diff --git a/drivers/gpu/drm/nouveau/nvkm/subdev/mmu/gm20b.c b/drivers/gpu/drm/nouveau/nvkm/subdev/mmu/gm20b.c index 06e49a9c8a9f..2894c7cbcdbb 100644 --- a/drivers/gpu/drm/nouveau/nvkm/subdev/mmu/gm20b.c +++ b/drivers/gpu/drm/nouveau/nvkm/subdev/mmu/gm20b.c @@ -19,7 +19,11 @@ * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR * OTHER DEALINGS IN THE SOFTWARE. */ -#include "priv.h" +#include "vmm.h" + +#include <subdev/fb.h> + +#include <nvif/class.h> static const struct nvkm_mmu_func gm20b_mmu = { @@ -34,10 +38,29 @@ gm20b_mmu = { .map_sg = gf100_vm_map_sg, .unmap = gf100_vm_unmap, .flush = gf100_vm_flush, + .vmm = {{ -1, 0, NVIF_CLASS_VMM_GM200}, gm20b_vmm_new }, +}; + +static const struct nvkm_mmu_func +gm20b_mmu_fixed = { + .limit = (1ULL << 40), + .dma_bits = 40, + .pgt_bits = 27 - 12, + .spg_shift = 12, + .lpg_shift = 17, + .create = gf100_vm_create, + .map_pgt = gf100_vm_map_pgt, + .map = gf100_vm_map, + .map_sg = gf100_vm_map_sg, + .unmap = gf100_vm_unmap, + .flush = gf100_vm_flush, + .vmm = {{ -1, -1, NVIF_CLASS_VMM_GM200}, gm20b_vmm_new_fixed }, }; int gm20b_mmu_new(struct nvkm_device *device, int index, struct nvkm_mmu **pmmu) { + if (device->fb->page) + return nvkm_mmu_new_(&gm20b_mmu_fixed, device, index, pmmu); return nvkm_mmu_new_(&gm20b_mmu, device, index, pmmu); } |