static struct eu_rdata
collect_rdata(int eu, int tid) {
	struct eu_rdata rdata;

	intel_register_write(0x7800, eu << 16 | (3 * tid) << 8);
	rdata.ud0.dword = intel_register_read(0x7840);

	intel_register_write(0x7800, eu << 16 | (3 * tid + 1) << 8);
	rdata.ud1.dword = intel_register_read(0x7840);

	intel_register_write(0x7800, eu << 16 | (3 * tid + 2) << 8);
	rdata.ud2.dword = intel_register_read(0x7840);

	return rdata;
}
예제 #2
0
static int workaround_fail_count(void)
{
    int i, fail_count = 0;

    /* There is a small delay after coming ot of rc6 to the correct
       render context values will get loaded by hardware (bdw,chv).
       This here ensures that we have the correct context loaded before
       we start to read values */
    wait_gpu();

    igt_debug("Address\tval\t\tmask\t\tread\t\tresult\n");

    for (i = 0; i < num_wa_regs; ++i) {
        const uint32_t val = intel_register_read(wa_regs[i].addr);
        const bool ok = (wa_regs[i].value & wa_regs[i].mask) ==
                        (val & wa_regs[i].mask);

        igt_debug("0x%05X\t0x%08X\t0x%08X\t0x%08X\t%s\n",
                  wa_regs[i].addr, wa_regs[i].value, wa_regs[i].mask,
                  val, ok ? "OK" : "FAIL");

        if (!ok) {
            igt_warn("0x%05X\t0x%08X\t0x%08X\t0x%08X\t%s\n",
                     wa_regs[i].addr, wa_regs[i].value,
                     wa_regs[i].mask,
                     val, ok ? "OK" : "FAIL");
            fail_count++;
        }
    }

    return fail_count;
}
예제 #3
0
static int vlv_sideband_rw(uint32_t port, uint8_t opcode, uint32_t addr,
			   uint32_t *val)
{
	int timeout = 0;
	uint32_t cmd, devfn, be, bar;
	int is_read = (opcode == SB_CRRDDA_NP || opcode == SB_MRD_NP);

	bar = 0;
	be = 0xf;
	devfn = 0;

	cmd = (devfn << IOSF_DEVFN_SHIFT) | (opcode << IOSF_OPCODE_SHIFT) |
		(port << IOSF_PORT_SHIFT) | (be << IOSF_BYTE_ENABLES_SHIFT) |
		(bar << IOSF_BAR_SHIFT);

	if (intel_register_read(VLV_IOSF_DOORBELL_REQ) & IOSF_SB_BUSY) {
		igt_warn("warning: pcode (%s) mailbox access failed\n", is_read ? "read" : "write");
		return -EAGAIN;
	}

	intel_register_write(VLV_IOSF_ADDR, addr);
	if (!is_read)
		intel_register_write(VLV_IOSF_DATA, *val);

	intel_register_write(VLV_IOSF_DOORBELL_REQ, cmd);

	do {
		usleep(1);
		timeout++;
	} while (intel_register_read(VLV_IOSF_DOORBELL_REQ) & IOSF_SB_BUSY &&
		 timeout < TIMEOUT_US);

	if (timeout >= TIMEOUT_US) {
		igt_warn("timeout waiting for pcode %s (%d) to finish\n", is_read ? "read" : "write", addr);
		return -ETIMEDOUT;
	}

	if (is_read)
		*val = intel_register_read(VLV_IOSF_DATA);
	intel_register_write(VLV_IOSF_DATA, 0);

	return 0;
}