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

Commit 694c6caf authored by Ben Skeggs's avatar Ben Skeggs
Browse files

drm/gf100-/gr: improve initial context patch list helpers



Removes need for fixed buffer indices, and allows the functions
utilising them to also be run outside of context generation.

Signed-off-by: default avatarBen Skeggs <bskeggs@redhat.com>
parent ac9738bb
Loading
Loading
Loading
Loading
+38 −0
Original line number Diff line number Diff line
@@ -982,6 +982,44 @@ nvc0_grctx_pack_tpc[] = {
 * PGRAPH context implementation
 ******************************************************************************/

int
nvc0_grctx_mmio_data(struct nvc0_grctx *info, u32 size, u32 align, u32 access)
{
	if (info->data) {
		info->buffer[info->buffer_nr] = round_up(info->addr, align);
		info->addr = info->buffer[info->buffer_nr] + size;
		info->data->size = size;
		info->data->align = align;
		info->data->access = access;
		info->data++;
		return info->buffer_nr++;
	}
	return -1;
}

void
nvc0_grctx_mmio_item(struct nvc0_grctx *info, u32 addr, u32 data,
		     int shift, int buffer)
{
	if (info->data) {
		if (shift >= 0) {
			info->mmio->addr = addr;
			info->mmio->data = data;
			info->mmio->shift = shift;
			info->mmio->buffer = buffer;
			if (buffer >= 0)
				data |= info->buffer[buffer] >> shift;
			info->mmio++;
		} else
			return;
	} else {
		if (buffer >= 0)
			return;
	}

	nv_wr32(info->priv, addr, data);
}

void
nvc0_grctx_generate_mods(struct nvc0_graph_priv *priv, struct nvc0_grctx *info)
{
+11 −18
Original line number Diff line number Diff line
@@ -12,6 +12,17 @@ struct nvc0_grctx {
	u64 addr;
};

int  nvc0_grctx_mmio_data(struct nvc0_grctx *, u32 size, u32 align, u32 access);
void nvc0_grctx_mmio_item(struct nvc0_grctx *, u32 addr, u32 data, int s, int);

#define mmio_data(a,b,c) nvc0_grctx_mmio_data(info, (a), (b), (c))
#define mmio_list(a,b,c,d) nvc0_grctx_mmio_item(info, (a), (b), (c), (d))

#define mmio_vram(a,b,c,d) nvc0_grctx_mmio_data((a), (b), (c), (d))
#define mmio_refn(a,b,c,d,e) nvc0_grctx_mmio_item((a), (b), (c), (d), (e))
#define mmio_skip(a,b,c) mmio_refn((a), (b), (c), -1, -1)
#define mmio_wr32(a,b,c) mmio_refn((a), (b), (c),  0, -1)

struct nvc0_grctx_oclass {
	struct nouveau_oclass base;
	/* main context generation function */
@@ -30,24 +41,6 @@ struct nvc0_grctx_oclass {
	const struct nvc0_graph_pack *mthd;
};

#define mmio_data(s,a,p) do {                                                  \
	info->buffer[info->buffer_nr] = round_up(info->addr, (a));             \
	info->addr = info->buffer[info->buffer_nr++] + (s);                    \
	info->data->size = (s);                                                \
	info->data->align = (a);                                               \
	info->data->access = (p);                                              \
	info->data++;                                                          \
} while(0)

#define mmio_list(r,d,s,b) do {                                                \
	info->mmio->addr = (r);                                                \
	info->mmio->data = (d);                                                \
	info->mmio->shift = (s);                                               \
	info->mmio->buffer = (b);                                              \
	info->mmio++;                                                          \
	nv_wr32(priv, (r), (d) | ((s) ? (info->buffer[(b)] >> (s)) : 0));      \
} while(0)

extern struct nouveau_oclass *nvc0_grctx_oclass;
int  nvc0_grctx_generate(struct nvc0_graph_priv *);
void nvc0_grctx_generate_main(struct nvc0_graph_priv *, struct nvc0_grctx *);
+1 −1
Original line number Diff line number Diff line
@@ -283,7 +283,7 @@ nvc0_graph_context_ctor(struct nouveau_object *parent,
		u32 addr = mmio->addr;
		u32 data = mmio->data;

		if (mmio->shift) {
		if (mmio->buffer >= 0) {
			u64 info = chan->data[mmio->buffer].vma.offset;
			data |= info >> mmio->shift;
		}
+1 −1
Original line number Diff line number Diff line
@@ -65,7 +65,7 @@ struct nvc0_graph_mmio {
	u32 addr;
	u32 data;
	u32 shift;
	u32 buffer;
	int buffer;
};

struct nvc0_graph_fuc {