Commit 0ac7facb authored by Thierry Reding's avatar Thierry Reding Committed by Ben Skeggs
Browse files

drm/nouveau/fault: Add support for GP10B



There is no BAR2 on GP10B and there is no need to map through BAR2
because all memory is shared between the GPU and the CPU. Add a custom
implementation of the fault sub-device that uses nvkm_memory_addr()
instead of nvkm_memory_bar2() to return the address of a pinned fault
buffer.

Signed-off-by: default avatarThierry Reding <treding@nvidia.com>
Signed-off-by: default avatarBen Skeggs <bskeggs@redhat.com>
parent f42e4b33
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -31,6 +31,7 @@ struct nvkm_fault_data {
};

int gp100_fault_new(struct nvkm_device *, int, struct nvkm_fault **);
int gp10b_fault_new(struct nvkm_device *, int, struct nvkm_fault **);
int gv100_fault_new(struct nvkm_device *, int, struct nvkm_fault **);
int tu102_fault_new(struct nvkm_device *, int, struct nvkm_fault **);
#endif
+1 −1
Original line number Diff line number Diff line
@@ -2375,7 +2375,7 @@ nv13b_chipset = {
	.name = "GP10B",
	.bar = gm20b_bar_new,
	.bus = gf100_bus_new,
	.fault = gp100_fault_new,
	.fault = gp10b_fault_new,
	.fb = gp10b_fb_new,
	.fuse = gm107_fuse_new,
	.ibus = gp10b_ibus_new,
+1 −0
Original line number Diff line number Diff line
@@ -2,5 +2,6 @@
nvkm-y += nvkm/subdev/fault/base.o
nvkm-y += nvkm/subdev/fault/user.o
nvkm-y += nvkm/subdev/fault/gp100.o
nvkm-y += nvkm/subdev/fault/gp10b.o
nvkm-y += nvkm/subdev/fault/gv100.o
nvkm-y += nvkm/subdev/fault/tu102.o
+1 −1
Original line number Diff line number Diff line
@@ -108,7 +108,7 @@ nvkm_fault_oneinit_buffer(struct nvkm_fault *fault, int id)
		return ret;

	/* Pin fault buffer in BAR2. */
	buffer->addr = nvkm_memory_bar2(buffer->mem);
	buffer->addr = fault->func->buffer.pin(buffer);
	if (buffer->addr == ~0ULL)
		return -EFAULT;

+12 −5
Original line number Diff line number Diff line
@@ -21,25 +21,26 @@
 */
#include "priv.h"

#include <core/memory.h>
#include <subdev/mc.h>

#include <nvif/class.h>

static void
void
gp100_fault_buffer_intr(struct nvkm_fault_buffer *buffer, bool enable)
{
	struct nvkm_device *device = buffer->fault->subdev.device;
	nvkm_mc_intr_mask(device, NVKM_SUBDEV_FAULT, enable);
}

static void
void
gp100_fault_buffer_fini(struct nvkm_fault_buffer *buffer)
{
	struct nvkm_device *device = buffer->fault->subdev.device;
	nvkm_mask(device, 0x002a70, 0x00000001, 0x00000000);
}

static void
void
gp100_fault_buffer_init(struct nvkm_fault_buffer *buffer)
{
	struct nvkm_device *device = buffer->fault->subdev.device;
@@ -48,7 +49,12 @@ gp100_fault_buffer_init(struct nvkm_fault_buffer *buffer)
	nvkm_mask(device, 0x002a70, 0x00000001, 0x00000001);
}

static void
u64 gp100_fault_buffer_pin(struct nvkm_fault_buffer *buffer)
{
	return nvkm_memory_bar2(buffer->mem);
}

void
gp100_fault_buffer_info(struct nvkm_fault_buffer *buffer)
{
	buffer->entries = nvkm_rd32(buffer->fault->subdev.device, 0x002a78);
@@ -56,7 +62,7 @@ gp100_fault_buffer_info(struct nvkm_fault_buffer *buffer)
	buffer->put = 0x002a80;
}

static void
void
gp100_fault_intr(struct nvkm_fault *fault)
{
	nvkm_event_send(&fault->event, 1, 0, NULL, 0);
@@ -68,6 +74,7 @@ gp100_fault = {
	.buffer.nr = 1,
	.buffer.entry_size = 32,
	.buffer.info = gp100_fault_buffer_info,
	.buffer.pin = gp100_fault_buffer_pin,
	.buffer.init = gp100_fault_buffer_init,
	.buffer.fini = gp100_fault_buffer_fini,
	.buffer.intr = gp100_fault_buffer_intr,
Loading