summaryrefslogtreecommitdiff
path: root/tools/intel_display_poller.c
diff options
context:
space:
mode:
Diffstat (limited to 'tools/intel_display_poller.c')
-rw-r--r--tools/intel_display_poller.c61
1 files changed, 60 insertions, 1 deletions
diff --git a/tools/intel_display_poller.c b/tools/intel_display_poller.c
index 37383dc8..30d9242c 100644
--- a/tools/intel_display_poller.c
+++ b/tools/intel_display_poller.c
@@ -60,6 +60,7 @@ enum test {
TEST_SURFLIVE,
TEST_WRAP,
TEST_FIELD,
+ TEST_VRR_PUSH,
};
static uint32_t vlv_offset;
@@ -1213,6 +1214,50 @@ static void poll_dsl_field(int pipe, uint32_t *min, uint32_t *max, const int cou
}
}
+static void poll_dsl_vrr_push(uint32_t devid, int pipe,
+ uint32_t *min, uint32_t *max, const int count,
+ int vrr_push_scanline)
+{
+ uint32_t dsl, dsl1, dsl2;
+ uint32_t vrr, vrr1, vrr2;
+ bool field1, field2;
+ int i[2] = {};
+
+ dsl = PIPE_REG(pipe, PIPEA_DSL);
+ vrr = trans_reg(devid, pipe, TRANS_PUSH_A);
+
+ while (!quit) {
+ push_vrr(devid, pipe, vrr_push_scanline);
+
+ while (!quit) {
+ dsl1 = read_reg(dsl);
+ vrr1 = read_reg(vrr);
+ vrr2 = read_reg(vrr);
+ dsl2 = read_reg(dsl);
+
+ field1 = dsl1 & 0x80000000;
+ field2 = dsl2 & 0x80000000;
+ dsl1 &= ~0x80000000;
+ dsl2 &= ~0x80000000;
+
+ if (!(vrr2 & 0x40000000))
+ break;
+ }
+
+ if (!(vrr1 & 0x40000000))
+ continue;
+
+ if (field1 != field2)
+ printf("fields are different (%u:%u -> %u:%u)\n",
+ field1, dsl1, field2, dsl2);
+
+ min[field1*count+i[field1]] = dsl1;
+ max[field1*count+i[field1]] = dsl2;
+ if (++i[field1] >= count)
+ break;
+ }
+}
+
static const char *test_name(enum test test, int pipe, int bit, bool test_pixel_count)
{
static char str[64];
@@ -1267,6 +1312,9 @@ static const char *test_name(enum test test, int pipe, int bit, bool test_pixel_
case TEST_FIELD:
snprintf(str, sizeof str, "%s / pipe %c / Field", type, pipe_name(pipe));
return str;
+ case TEST_VRR_PUSH:
+ snprintf(str, sizeof str, "%s / pipe %c / VRR push", type, pipe_name(pipe));
+ return str;
default:
return "";
}
@@ -1275,7 +1323,7 @@ static const char *test_name(enum test test, int pipe, int bit, bool test_pixel_
static void __attribute__((noreturn)) usage(const char *name)
{
fprintf(stderr, "Usage: %s [options]\n"
- " -t,--test <pipestat|iir|framecount|flipcount|frametimestamp|timestamp|pan|flip|flipdone|surflive|wrap|field>\n"
+ " -t,--test <pipestat|iir|framecount|flipcount|frametimestamp|timestamp|pan|flip|flipdone|surflive|wrap|field|vrr-push>\n"
" -p,--pipe <pipe>\n"
" -b,--bit <bit>\n"
" -l,--line <target scanline/pixel>\n"
@@ -1345,6 +1393,8 @@ int main(int argc, char *argv[])
test = TEST_WRAP;
else if (!strcmp(optarg, "field"))
test = TEST_FIELD;
+ else if (!strcmp(optarg, "vrr-push"))
+ test = TEST_VRR_PUSH;
else
usage(argv[0]);
break;
@@ -1527,6 +1577,12 @@ int main(int argc, char *argv[])
case TEST_FLIPDONE:
test = TEST_FLIPDONE_DEIIR;
break;
+ case TEST_VRR_PUSH:
+ if (vrr_push_scanline < 0)
+ usage(argv[0]);
+ if (intel_gen(devid) < 11)
+ usage(argv[0]);
+ break;
case TEST_FLIPCOUNT:
case TEST_PAN:
case TEST_FLIP:
@@ -1638,6 +1694,9 @@ int main(int argc, char *argv[])
case TEST_FIELD:
poll_dsl_field(pipe, min, max, count);
break;
+ case TEST_VRR_PUSH:
+ poll_dsl_vrr_push(devid, pipe, min, max, count, vrr_push_scanline);
+ break;
default:
assert(0);
}