示例#1
0
void decode_gf100_m2mf_verbose(struct gpu_object *obj, struct pushbuf_decode_state *pstate)
{
	int mthd = pstate->mthd;
	uint32_t data = pstate->mthd_data;
	struct gf100_m2mf_data *objdata = obj->class_data;

	if (check_addresses_verbose(pstate, objdata->addresses))
	{ }
	else if (mthd == 0x0300) // EXEC
	{
		int flags_ok = (data & 0x111) == 0x111 ? 1 : 0;
		mmt_debug("m2mf exec: 0x%08x push&linear: %d\n", data, flags_ok);

		if (!flags_ok || objdata->offset_out.gpu_mapping == NULL)
		{
			objdata->offset_out.address = 0;
			objdata->offset_out.gpu_mapping = NULL;
		}
	}
	else if (mthd == 0x0304) // DATA
	{
		mmt_debug("m2mf data: 0x%08x\n", data);
		if (objdata->offset_out.gpu_mapping)
		{
			gpu_mapping_register_write(objdata->offset_out.gpu_mapping,
					objdata->offset_out.address + objdata->data_offset, 4, &data);
			objdata->data_offset += 4;
		}
	}
}
示例#2
0
void decode_gk104_3d_verbose(struct gpu_object *obj, struct pushbuf_decode_state *pstate)
{
	int mthd = pstate->mthd;
	uint32_t data = pstate->mthd_data;
	struct gk104_3d_data *objdata = obj->class_data;

	if (check_addresses_verbose(pstate, objdata->addresses))
	{ }
	else if (mthd == 0x0f10) // SetSelectMaxwellTextureHeaders
		objdata->tic2 = data;
	else if (mthd == 0x1234) // LINKED_TSC
		objdata->linked_tsc = data;
	else if (mthd == 0x2608) // TEX_CB_INDEX
	{
		// This gets done pretty early. To be truly correct,
		// we'd have to go fish out any past CB bindings to
		// this CB index.
		objdata->tex_cb_index = data;
	}
	else if (mthd >= 0x2410 && mthd < 0x2410 + 0x20 * 5) // CB_BIND
	{
		int i;
		int cb_index = data >> 4;
		if (cb_index != objdata->tex_cb_index)
			return;

		for (i = 0; i < 5; i++)
		{
			if (mthd != 0x2410 + 0x20 * i)
				continue;
			objdata->texcb[i] = objdata->cb;
			break;
		}
	}
示例#3
0
void decode_g80_3d_verbose(struct pushbuf_decode_state *pstate)
{
	int mthd = pstate->mthd;
	uint32_t data = pstate->mthd_data;

	if (check_addresses_verbose(pstate, g80_3d_addresses))
	{ }
	else if (mthd == 0x140c && dump_vp) // VP_START_ID
		g80_3d_disassemble(g80_3d.vp.buffer, "vp", data);
	else if (mthd == 0x1414 && dump_fp) // FP_START_ID
		g80_3d_disassemble(g80_3d.fp.buffer, "fp", data);
	else if (mthd == 0x1410 && dump_gp) // GP_START_ID
		g80_3d_disassemble(g80_3d.gp.buffer, "gp", data);
	else if (mthd >= 0x1444 && mthd < 0x1448 + 0x8 * 3)
	{
		int i;
		for (i = 0; i < 3; ++i)
		{
			if (dump_tsc && g80_3d.tsc.buffer && mthd == 0x1444 + i * 0x8) // BIND_TSC[i]
			{
				int j, tsc = (data >> 12) & 0xff;
				mmt_debug("bind tsc[%d]: 0x%08x\n", i, tsc);
				uint32_t *tsc_data = (uint32_t *)&g80_3d.tsc.buffer->data[8 * tsc];

				for (j = 0; j < 8; ++j)
					decode_tsc(tsc, j, tsc_data);

				break;
			}
			if (dump_tic && g80_3d.tic.buffer && mthd == 0x1448 + i * 0x8) // BIND_TIC[i]
			{
				int j, tic = (data >> 9) & 0x1ffff;
				mmt_debug("bind tic[%d]: 0x%08x\n", i, tic);
				uint32_t *tic_data = (uint32_t *)&g80_3d.tic.buffer->data[8 * tic];

				for (j = 0; j < 8; ++j)
					decode_tic(tic, j, tic_data);

				break;
			}
示例#4
0
void decode_g80_compute_verbose(struct gpu_object *obj, struct pushbuf_decode_state *pstate)
{
	int mthd = pstate->mthd;
	uint32_t data = pstate->mthd_data;
	struct g80_compute_data *objdata = obj->class_data;

	if (check_addresses_verbose(pstate, objdata->addresses))
	{ }
	else if (mthd == 0x0378)
		objdata->linked_tsc = data;
	else if (mthd == 0x03b4 && dump_cp) // CP_START_ID
		g80_3d_disassemble(pstate, &objdata->cp, "cp", data);
	else if (mthd == 0x3c0 || mthd == 0x3c4)
	{
		uint32_t is_tsc = mthd == 0x3c0;

		if (dump_tsc && objdata->tsc.gpu_mapping && (
			    is_tsc || objdata->linked_tsc))
		{
			int tsc;
			if (is_tsc)
				tsc = (data >> 12) & 0xff;
			else