Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

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

drm/gf100-/gr: implement the proper SetShaderExceptions method



We have another version of it implemented in SW, however, that version
isn't serialised with normal PGRAPH operation and can possibly clobber
the enables for another context.

This is the same method that's implemented by the NVIDIA binary driver.

Signed-off-by: default avatarBen Skeggs <bskeggs@redhat.com>
parent e8873773
Loading
Loading
Loading
Loading
+2 −2
Original line number Diff line number Diff line
@@ -27,8 +27,8 @@ static struct nouveau_oclass
gk20a_graph_sclass[] = {
	{ 0x902d, &nouveau_object_ofuncs },
	{ 0xa040, &nouveau_object_ofuncs },
	{ KEPLER_C, &nvc0_fermi_ofuncs },
	{ 0xa0c0, &nouveau_object_ofuncs },
	{ KEPLER_C, &nvc0_fermi_ofuncs, nvc0_graph_9097_omthds },
	{ KEPLER_COMPUTE_A, &nouveau_object_ofuncs, nvc0_graph_90c0_omthds },
	{}
};

+2 −2
Original line number Diff line number Diff line
@@ -36,8 +36,8 @@ static struct nouveau_oclass
gm107_graph_sclass[] = {
	{ 0x902d, &nouveau_object_ofuncs },
	{ 0xa140, &nouveau_object_ofuncs },
	{ MAXWELL_A, &nvc0_fermi_ofuncs },
	{ 0xb0c0, &nouveau_object_ofuncs },
	{ MAXWELL_A, &nvc0_fermi_ofuncs, nvc0_graph_9097_omthds },
	{ MAXWELL_COMPUTE_A, &nouveau_object_ofuncs, nvc0_graph_90c0_omthds },
	{}
};

+28 −2
Original line number Diff line number Diff line
@@ -214,12 +214,38 @@ nvc0_fermi_ofuncs = {
	.mthd = nvc0_fermi_mthd,
};

static int
nvc0_graph_set_shader_exceptions(struct nouveau_object *object, u32 mthd,
				 void *pdata, u32 size)
{
	struct nvc0_graph_priv *priv = (void *)nv_engine(object);
	if (size >= sizeof(u32)) {
		u32 data = *(u32 *)pdata ? 0xffffffff : 0x00000000;
		nv_wr32(priv, 0x419e44, data);
		nv_wr32(priv, 0x419e4c, data);
		return 0;
	}
	return -EINVAL;
}

struct nouveau_omthds
nvc0_graph_9097_omthds[] = {
	{ 0x1528, 0x1528, nvc0_graph_set_shader_exceptions },
	{}
};

struct nouveau_omthds
nvc0_graph_90c0_omthds[] = {
	{ 0x1528, 0x1528, nvc0_graph_set_shader_exceptions },
	{}
};

struct nouveau_oclass
nvc0_graph_sclass[] = {
	{ 0x902d, &nouveau_object_ofuncs },
	{ 0x9039, &nouveau_object_ofuncs },
	{ FERMI_A, &nvc0_fermi_ofuncs },
	{ 0x90c0, &nouveau_object_ofuncs },
	{ FERMI_A, &nvc0_fermi_ofuncs, nvc0_graph_9097_omthds },
	{ FERMI_COMPUTE_A, &nouveau_object_ofuncs, nvc0_graph_90c0_omthds },
	{}
};

+2 −0
Original line number Diff line number Diff line
@@ -150,6 +150,8 @@ int nvf0_graph_fini(struct nouveau_object *, bool);
extern struct nouveau_ofuncs nvc0_fermi_ofuncs;

extern struct nouveau_oclass nvc0_graph_sclass[];
extern struct nouveau_omthds nvc0_graph_9097_omthds[];
extern struct nouveau_omthds nvc0_graph_90c0_omthds[];
extern struct nouveau_oclass nvc8_graph_sclass[];
extern struct nouveau_oclass nvf0_graph_sclass[];

+3 −3
Original line number Diff line number Diff line
@@ -33,9 +33,9 @@ static struct nouveau_oclass
nvc1_graph_sclass[] = {
	{ 0x902d, &nouveau_object_ofuncs },
	{ 0x9039, &nouveau_object_ofuncs },
	{ FERMI_A, &nvc0_fermi_ofuncs },
	{ FERMI_B, &nvc0_fermi_ofuncs },
	{ 0x90c0, &nouveau_object_ofuncs },
	{ FERMI_A, &nvc0_fermi_ofuncs, nvc0_graph_9097_omthds },
	{ FERMI_B, &nvc0_fermi_ofuncs, nvc0_graph_9097_omthds },
	{ FERMI_COMPUTE_A, &nouveau_object_ofuncs, nvc0_graph_90c0_omthds },
	{}
};

Loading