Commit 8e39abff authored by Ben Skeggs's avatar Ben Skeggs
Browse files

drm/nouveau/mmu/gp100,gp10b: implement vmm on top of new base



Adds support for:
- Selection of old/new-style page table layout (GP100MmuLayout=0/1).
- System-memory PDs.

New layout disabled by default for the moment, as we don't have a
backend that can handle it yet.

Signed-off-by: default avatarBen Skeggs <bskeggs@redhat.com>
parent 5f300fed
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -19,6 +19,7 @@
#define NVIF_CLASS_VMM_NV50                          /* if500d.h */  0x8000500d
#define NVIF_CLASS_VMM_GF100                         /* if900d.h */  0x8000900d
#define NVIF_CLASS_VMM_GM200                         /* ifb00d.h */  0x8000b00d
#define NVIF_CLASS_VMM_GP100                         /* ifc00d.h */  0x8000c00d

/* the below match nvidia-assigned (either in hw, or sw) class numbers */
#define NV_NULL_CLASS                                                0x00000030
+8 −0
Original line number Diff line number Diff line
#ifndef __NVIF_IFC00D_H__
#define __NVIF_IFC00D_H__
#include "if000c.h"

struct gp100_vmm_vn {
	/* nvif_vmm_vX ... */
};
#endif
+2 −0
Original line number Diff line number Diff line
@@ -22,3 +22,5 @@ nvkm-y += nvkm/subdev/mmu/vmmgk104.o
nvkm-y += nvkm/subdev/mmu/vmmgk20a.o
nvkm-y += nvkm/subdev/mmu/vmmgm200.o
nvkm-y += nvkm/subdev/mmu/vmmgm20b.o
nvkm-y += nvkm/subdev/mmu/vmmgp100.o
nvkm-y += nvkm/subdev/mmu/vmmgp10b.o
+11 −12
Original line number Diff line number Diff line
@@ -19,25 +19,24 @@
 * 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 <core/option.h>

#include <nvif/class.h>

static const struct nvkm_mmu_func
gp100_mmu = {
	.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,
	.limit = (1ULL << 49),
	.dma_bits = 47,
	.lpg_shift = 16,
	.vmm = {{ -1, -1, NVIF_CLASS_VMM_GP100}, gp100_vmm_new },
};

int
gp100_mmu_new(struct nvkm_device *device, int index, struct nvkm_mmu **pmmu)
{
	if (!nvkm_boolopt(device->cfgopt, "GP100MmuLayout", false))
		return gm200_mmu_new(device, index, pmmu);
	return nvkm_mmu_new_(&gp100_mmu, device, index, pmmu);
}
+11 −12
Original line number Diff line number Diff line
@@ -19,25 +19,24 @@
 * 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 <core/option.h>

#include <nvif/class.h>

static const struct nvkm_mmu_func
gp10b_mmu = {
	.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,
	.limit = (1ULL << 49),
	.dma_bits = 47,
	.lpg_shift = 16,
	.vmm = {{ -1, -1, NVIF_CLASS_VMM_GP100}, gp10b_vmm_new },
};

int
gp10b_mmu_new(struct nvkm_device *device, int index, struct nvkm_mmu **pmmu)
{
	if (!nvkm_boolopt(device->cfgopt, "GP100MmuLayout", false))
		return gm20b_mmu_new(device, index, pmmu);
	return nvkm_mmu_new_(&gp10b_mmu, device, index, pmmu);
}
Loading