summaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm/nouveau/nvkm/subdev/mmu/gm20b.c
diff options
context:
space:
mode:
authorBen Skeggs2017-10-31 18:56:19 +0100
committerBen Skeggs2017-11-02 04:32:26 +0100
commit5f300fed645597689f1e6fed8800fc7e3d01e212 (patch)
tree71aa34582fcc45c18fbe0c89c74139c89f3a47e0 /drivers/gpu/drm/nouveau/nvkm/subdev/mmu/gm20b.c
parentdrm/nouveau/mmu/gk104,gk20a: implement vmm on top of new base (diff)
downloadkernel-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.c25
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);
}