Commit f7cc47e4 authored by Ben Skeggs's avatar Ben Skeggs
Browse files

drm/nouveau/fifo/gm200-: read pbdma count more directly



The trick we used (and still use for older GPUs) doesn't work on Turing.

Signed-off-by: default avatarBen Skeggs <bskeggs@redhat.com>
parent f37a302e
Loading
Loading
Loading
Loading
+11 −3
Original line number Diff line number Diff line
@@ -256,8 +256,18 @@ gk104_fifo_pbdma_init(struct gk104_fifo *fifo)
	nvkm_wr32(device, 0x000204, (1 << fifo->pbdma_nr) - 1);
}

int
gk104_fifo_pbdma_nr(struct gk104_fifo *fifo)
{
	struct nvkm_device *device = fifo->base.engine.subdev.device;
	/* Determine number of PBDMAs by checking valid enable bits. */
	nvkm_wr32(device, 0x000204, 0xffffffff);
	return hweight32(nvkm_rd32(device, 0x000204));
}

const struct gk104_fifo_pbdma_func
gk104_fifo_pbdma = {
	.nr = gk104_fifo_pbdma_nr,
	.init = gk104_fifo_pbdma_init,
};

@@ -925,9 +935,7 @@ gk104_fifo_oneinit(struct nvkm_fifo *base)
	enum nvkm_devidx engidx;
	u32 *map;

	/* Determine number of PBDMAs by checking valid enable bits. */
	nvkm_wr32(device, 0x000204, 0xffffffff);
	fifo->pbdma_nr = hweight32(nvkm_rd32(device, 0x000204));
	fifo->pbdma_nr = fifo->func->pbdma->nr(fifo);
	nvkm_debug(subdev, "%d PBDMA(s)\n", fifo->pbdma_nr);

	/* Read PBDMA->runlist(s) mapping from HW. */
+5 −0
Original line number Diff line number Diff line
@@ -46,6 +46,7 @@ struct gk104_fifo {

struct gk104_fifo_func {
	const struct gk104_fifo_pbdma_func {
		int (*nr)(struct gk104_fifo *);
		void (*init)(struct gk104_fifo *);
		void (*init_timeout)(struct gk104_fifo *);
	} *pbdma;
@@ -89,6 +90,7 @@ void gk104_fifo_runlist_remove(struct gk104_fifo *, struct gk104_fifo_chan *);
void gk104_fifo_runlist_update(struct gk104_fifo *, int runl);

extern const struct gk104_fifo_pbdma_func gk104_fifo_pbdma;
int gk104_fifo_pbdma_nr(struct gk104_fifo *);
void gk104_fifo_pbdma_init(struct gk104_fifo *);
extern const struct nvkm_enum gk104_fifo_fault_access[];
extern const struct nvkm_enum gk104_fifo_fault_engine[];
@@ -111,5 +113,8 @@ void gk208_fifo_pbdma_init_timeout(struct gk104_fifo *);
extern const struct nvkm_enum gm107_fifo_fault_engine[];
extern const struct gk104_fifo_runlist_func gm107_fifo_runlist;

extern const struct gk104_fifo_pbdma_func gm200_fifo_pbdma;
int gm200_fifo_pbdma_nr(struct gk104_fifo *);

extern const struct nvkm_enum gp100_fifo_fault_engine[];
#endif
+1 −0
Original line number Diff line number Diff line
@@ -38,6 +38,7 @@ gk208_fifo_pbdma_init_timeout(struct gk104_fifo *fifo)

const struct gk104_fifo_pbdma_func
gk208_fifo_pbdma = {
	.nr = gk104_fifo_pbdma_nr,
	.init = gk104_fifo_pbdma_init,
	.init_timeout = gk208_fifo_pbdma_init_timeout,
};
+15 −1
Original line number Diff line number Diff line
@@ -26,9 +26,23 @@

#include <nvif/class.h>

int
gm200_fifo_pbdma_nr(struct gk104_fifo *fifo)
{
	struct nvkm_device *device = fifo->base.engine.subdev.device;
	return nvkm_rd32(device, 0x002004) & 0x000000ff;
}

const struct gk104_fifo_pbdma_func
gm200_fifo_pbdma = {
	.nr = gm200_fifo_pbdma_nr,
	.init = gk104_fifo_pbdma_init,
	.init_timeout = gk208_fifo_pbdma_init_timeout,
};

static const struct gk104_fifo_func
gm200_fifo = {
	.pbdma = &gk208_fifo_pbdma,
	.pbdma = &gm200_fifo_pbdma,
	.fault.access = gk104_fifo_fault_access,
	.fault.engine = gm107_fifo_fault_engine,
	.fault.reason = gk104_fifo_fault_reason,
+1 −1
Original line number Diff line number Diff line
@@ -26,7 +26,7 @@

static const struct gk104_fifo_func
gm20b_fifo = {
	.pbdma = &gk208_fifo_pbdma,
	.pbdma = &gm200_fifo_pbdma,
	.fault.access = gk104_fifo_fault_access,
	.fault.engine = gm107_fifo_fault_engine,
	.fault.reason = gk104_fifo_fault_reason,
Loading