Commit 0adfd612 authored by Ben Skeggs's avatar Ben Skeggs Committed by Dave Airlie
Browse files

drm/nouveau/instmem: add hal for set_bar0_window_addr()



GH100/GBxxx have moved the register that controls where in VRAM the
the BAR0 NV_PRAMIN window points.

Add a HAL for this, as the BAR0 window is needed for BAR2 bootstrap.

Signed-off-by: default avatarBen Skeggs <bskeggs@nvidia.com>
Reviewed-by: default avatarDave Airlie <airlied@redhat.com>
Reviewed-by: default avatarTimur Tabi <ttabi@nvidia.com>
Tested-by: default avatarTimur Tabi <ttabi@nvidia.com>
Signed-off-by: default avatarDave Airlie <airlied@redhat.com>
parent 2f89bb32
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -317,6 +317,7 @@ r535_instmem_new(const struct nvkm_instmem_func *hw,
	rm->memory_new = hw->memory_new;
	rm->memory_wrap = hw->memory_wrap;
	rm->zero = false;
	rm->set_bar0_window_addr = hw->set_bar0_window_addr;

	ret = nv50_instmem_new_(rm, device, type, inst, pinstmem);
	if (ret)
+9 −2
Original line number Diff line number Diff line
@@ -65,7 +65,7 @@ nv50_instobj_wr32_slow(struct nvkm_memory *memory, u64 offset, u32 data)

	spin_lock_irqsave(&imem->base.lock, flags);
	if (unlikely(imem->addr != base)) {
		nvkm_wr32(device, 0x001700, base >> 16);
		imem->base.func->set_bar0_window_addr(device, base);
		imem->addr = base;
	}
	nvkm_wr32(device, 0x700000 + addr, data);
@@ -85,7 +85,7 @@ nv50_instobj_rd32_slow(struct nvkm_memory *memory, u64 offset)

	spin_lock_irqsave(&imem->base.lock, flags);
	if (unlikely(imem->addr != base)) {
		nvkm_wr32(device, 0x001700, base >> 16);
		imem->base.func->set_bar0_window_addr(device, base);
		imem->addr = base;
	}
	data = nvkm_rd32(device, 0x700000 + addr);
@@ -394,6 +394,12 @@ nv50_instobj_new(struct nvkm_instmem *imem, u32 size, u32 align, bool zero,
 * instmem subdev implementation
 *****************************************************************************/

static void
nv50_instmem_set_bar0_window_addr(struct nvkm_device *device, u64 addr)
{
	nvkm_wr32(device, 0x001700, addr >> 16);
}

static void
nv50_instmem_fini(struct nvkm_instmem *base)
{
@@ -415,6 +421,7 @@ nv50_instmem = {
	.memory_new = nv50_instobj_new,
	.memory_wrap = nv50_instobj_wrap,
	.zero = false,
	.set_bar0_window_addr = nv50_instmem_set_bar0_window_addr,
};

int
+1 −0
Original line number Diff line number Diff line
@@ -16,6 +16,7 @@ struct nvkm_instmem_func {
			  bool zero, struct nvkm_memory **);
	int (*memory_wrap)(struct nvkm_instmem *, struct nvkm_memory *, struct nvkm_memory **);
	bool zero;
	void (*set_bar0_window_addr)(struct nvkm_device *, u64 addr);
};

int nv50_instmem_new_(const struct nvkm_instmem_func *, struct nvkm_device *,