summaryrefslogtreecommitdiff
path: root/tools
diff options
context:
space:
mode:
Diffstat (limited to 'tools')
-rw-r--r--tools/intel_display_poller.c134
1 files changed, 112 insertions, 22 deletions
diff --git a/tools/intel_display_poller.c b/tools/intel_display_poller.c
index 3b3375ec..37383dc8 100644
--- a/tools/intel_display_poller.c
+++ b/tools/intel_display_poller.c
@@ -159,6 +159,29 @@ static uint32_t dspsurf_reg(uint32_t devid, int pipe, bool async)
return PIPE_REG(plane, DSPASURF);
}
+static int pipe_to_transcoder(uint32_t devid, int pipe)
+{
+ int gen = intel_gen(devid);
+
+ if (IS_HASWELL(devid) || IS_BROADWELL(devid) ||
+ gen == 9 || gen == 10 || gen == 11) {
+ /* FIXME not 100% robust */
+ if (read_reg(PIPE_REG(pipe, PIPEACONF)) & PIPEACONF_ENABLE)
+ return pipe;
+ else
+ return 0xf; /* EDP */
+ } else {
+ return pipe;
+ }
+}
+
+static uint32_t trans_reg(uint32_t devid, int pipe, uint32_t reg)
+{
+ int trans = pipe_to_transcoder(devid, pipe);
+
+ return PIPE_REG(trans, reg);
+}
+
static void enable_async_flip(uint32_t devid, int pipe, bool enable)
{
int plane = pipe_to_plane(devid, pipe);
@@ -175,6 +198,26 @@ static void enable_async_flip(uint32_t devid, int pipe, bool enable)
write_reg(PIPE_REG(plane, DSPACNTR), tmp);
}
+static void push_vrr(uint32_t devid, int pipe, int vrr_push_scanline)
+{
+ uint32_t dsl = PIPE_REG(pipe, PIPEA_DSL);
+ uint32_t push = trans_reg(devid, pipe, TRANS_PUSH_A);
+
+ if (vrr_push_scanline < 0)
+ return;
+
+ if (read_reg(push) & 0x40000000)
+ return;
+
+ while (!quit) {
+ uint32_t dsl1 = read_reg(dsl) & ~0x80000000;
+ if (dsl1 == vrr_push_scanline)
+ break;
+ }
+
+ write_reg(push, 0xc0000000);
+}
+
static int wait_scanline(int pipe, int target_scanline, bool *field)
{
uint32_t dsl_reg = PIPE_REG(pipe, PIPEA_DSL);
@@ -545,7 +588,8 @@ static void poll_dsl_iir_gen3(int pipe, int bit,
}
static void poll_dsl_deiir(uint32_t devid, int pipe, int bit,
- uint32_t *min, uint32_t *max, const int count)
+ uint32_t *min, uint32_t *max, const int count,
+ int vrr_push_scanline)
{
uint32_t dsl, dsl1, dsl2, iir1, iir2, imr_save, ier_save;
bool field1, field2;
@@ -574,6 +618,8 @@ static void poll_dsl_deiir(uint32_t devid, int pipe, int bit,
write_reg(iir, bit);
while (!quit) {
+ push_vrr(devid, pipe, vrr_push_scanline);
+
while (!quit) {
dsl1 = read_reg(dsl);
iir1 = read_reg(iir);
@@ -608,7 +654,9 @@ static void poll_dsl_deiir(uint32_t devid, int pipe, int bit,
write_reg(ier, ier_save);
}
-static void poll_dsl_framecount_g4x(int pipe, uint32_t *min, uint32_t *max, const int count)
+static void poll_dsl_framecount_g4x(uint32_t devid, int pipe,
+ uint32_t *min, uint32_t *max, const int count,
+ int vrr_push_scanline)
{
uint32_t dsl, dsl1, dsl2, frm, frm1, frm2;
bool field1, field2;
@@ -618,6 +666,8 @@ static void poll_dsl_framecount_g4x(int pipe, uint32_t *min, uint32_t *max, cons
dsl = PIPE_REG(pipe, PIPEA_DSL);
while (!quit) {
+ push_vrr(devid, pipe, vrr_push_scanline);
+
while (!quit) {
dsl1 = read_reg(dsl);
frm1 = read_reg(frm);
@@ -645,7 +695,8 @@ static void poll_dsl_framecount_g4x(int pipe, uint32_t *min, uint32_t *max, cons
}
static void poll_dsl_flipcount_g4x(uint32_t devid, int pipe,
- uint32_t *min, uint32_t *max, const int count)
+ uint32_t *min, uint32_t *max, const int count,
+ int vrr_push_scanline)
{
uint32_t dsl, dsl1, dsl2, flp, flp1, flp2, surf;
bool field1, field2;
@@ -676,6 +727,7 @@ static void poll_dsl_flipcount_g4x(uint32_t devid, int pipe,
return;
write_reg(surf, read_reg(surf));
+ push_vrr(devid, pipe, vrr_push_scanline);
while (!quit) {
dsl1 = read_reg(dsl);
@@ -738,7 +790,8 @@ static void poll_dsl_framecount_gen3(int pipe, uint32_t *min, uint32_t *max, con
static void poll_dsl_frametimestamp(uint32_t devid, int pipe,
- uint32_t *min, uint32_t *max, const int count)
+ uint32_t *min, uint32_t *max, const int count,
+ int vrr_push_scanline)
{
uint32_t dsl, dsl1, dsl2, frm, frm1, frm2;
bool field1, field2;
@@ -748,6 +801,8 @@ static void poll_dsl_frametimestamp(uint32_t devid, int pipe,
dsl = PIPE_REG(pipe, PIPEA_DSL);
while (!quit) {
+ push_vrr(devid, pipe, vrr_push_scanline);
+
while (!quit) {
dsl1 = read_reg(dsl);
frm1 = read_reg(frm);
@@ -785,7 +840,8 @@ static uint32_t timestamp_reg(uint32_t devid)
}
static void poll_dsl_timestamp(uint32_t devid, int pipe, int target_scanline,
- uint32_t *min, uint32_t *max, const int count)
+ uint32_t *min, uint32_t *max, const int count,
+ int vrr_push_scanline)
{
uint32_t dsl1, frm, frm1, ts, ts1;
bool field1;
@@ -795,6 +851,8 @@ static void poll_dsl_timestamp(uint32_t devid, int pipe, int target_scanline,
frm = PIPE_REG(pipe, PIPEAFRMTMSMTP);
while (!quit) {
+ push_vrr(devid, pipe, vrr_push_scanline);
+
dsl1 = wait_scanline(pipe, target_scanline, &field1);
frm1 = read_reg(frm);
@@ -811,7 +869,8 @@ static void poll_dsl_timestamp(uint32_t devid, int pipe, int target_scanline,
}
static void poll_dsl_pan(uint32_t devid, int pipe, int target_scanline, int target_fuzz,
- uint32_t *min, uint32_t *max, const int count)
+ uint32_t *min, uint32_t *max, const int count,
+ int vrr_push_scanline)
{
uint32_t dsl1 = 0, dsl2 = 0;
bool field1 = false, field2 = false;
@@ -826,6 +885,7 @@ static void poll_dsl_pan(uint32_t devid, int pipe, int target_scanline, int targ
dsl1 = wait_scanline(pipe, target_scanline, &field1);
write_reg(surf, saved+256);
+ push_vrr(devid, pipe, vrr_push_scanline);
dsl2 = wait_scanline(pipe, target_scanline + target_fuzz, &field2);
@@ -845,7 +905,8 @@ static void poll_dsl_pan(uint32_t devid, int pipe, int target_scanline, int targ
}
static void poll_dsl_flip(uint32_t devid, int pipe, int target_scanline, int target_fuzz,
- uint32_t *min, uint32_t *max, const int count, bool async)
+ uint32_t *min, uint32_t *max, const int count, bool async,
+ int vrr_push_scanline)
{
uint32_t dsl1 = 0, dsl2 = 0;
bool field1 = false, field2 = false;
@@ -862,6 +923,7 @@ static void poll_dsl_flip(uint32_t devid, int pipe, int target_scanline, int tar
dsl1 = wait_scanline(pipe, target_scanline, &field1);
write_reg(surf, saved+256*1024);
+ push_vrr(devid, pipe, vrr_push_scanline);
dsl2 = wait_scanline(pipe, target_scanline + target_fuzz, &field2);
@@ -944,7 +1006,8 @@ static void poll_dsl_flipdone_pipestat(uint32_t devid, int pipe, int target_scan
}
static void poll_dsl_flipdone_deiir(uint32_t devid, int pipe, int target_scanline, int target_fuzz,
- uint32_t *min, uint32_t *max, const int count, bool async)
+ uint32_t *min, uint32_t *max, const int count, bool async,
+ int vrr_push_scanline)
{
uint32_t dsl, dsl1 = 0, dsl2 = 0;
uint32_t iir, iir2, ier, imr;
@@ -997,6 +1060,7 @@ static void poll_dsl_flipdone_deiir(uint32_t devid, int pipe, int target_scanlin
else
next = saved;
write_reg(surf, next);
+ push_vrr(devid, pipe, vrr_push_scanline);
while (!quit) {
iir2 = read_reg(iir);
@@ -1028,7 +1092,8 @@ static void poll_dsl_flipdone_deiir(uint32_t devid, int pipe, int target_scanlin
}
static void poll_dsl_surflive(uint32_t devid, int pipe,
- uint32_t *min, uint32_t *max, const int count, bool async)
+ uint32_t *min, uint32_t *max, const int count, bool async,
+ int vrr_push_scanline)
{
uint32_t dsl, dsl1 = 0, dsl2 = 0, surf, surf1, surf2, surflive, surfl1 = 0, surfl2, saved, tmp;
bool field1 = false, field2 = false;
@@ -1047,6 +1112,7 @@ static void poll_dsl_surflive(uint32_t devid, int pipe,
while (!quit) {
write_reg(surf, surf2);
+ push_vrr(devid, pipe, vrr_push_scanline);
while (!quit) {
dsl1 = read_reg(dsl);
@@ -1083,7 +1149,9 @@ static void poll_dsl_surflive(uint32_t devid, int pipe,
write_reg(surf, saved);
}
-static void poll_dsl_wrap(int pipe, uint32_t *min, uint32_t *max, const int count)
+static void poll_dsl_wrap(uint32_t devid, int pipe,
+ uint32_t *min, uint32_t *max, const int count,
+ int vrr_push_scanline)
{
uint32_t dsl, dsl1, dsl2;
bool field1, field2;
@@ -1092,6 +1160,8 @@ static void poll_dsl_wrap(int pipe, uint32_t *min, uint32_t *max, const int coun
dsl = PIPE_REG(pipe, PIPEA_DSL);
while (!quit) {
+ push_vrr(devid, pipe, vrr_push_scanline);
+
while (!quit) {
dsl1 = read_reg(dsl);
dsl2 = read_reg(dsl);
@@ -1211,7 +1281,8 @@ static void __attribute__((noreturn)) usage(const char *name)
" -l,--line <target scanline/pixel>\n"
" -f,--fuzz <target fuzz>\n"
" -x,--pixel\n"
- " -a,--async\n",
+ " -a,--async\n"
+ " -v,--vrr-push <push scanline>\n",
name);
exit(1);
}
@@ -1223,6 +1294,7 @@ int main(int argc, char *argv[])
int pipe = 0, bit = 0, target_scanline = 0, target_fuzz = 1;
bool test_pixelcount = false;
bool test_async_flip = false;
+ int vrr_push_scanline = -1;
uint32_t devid;
uint32_t min[2*128] = {};
uint32_t max[2*128] = {};
@@ -1239,10 +1311,11 @@ int main(int argc, char *argv[])
{ .name = "fuzz", .has_arg = required_argument, },
{ .name = "pixel", .has_arg = no_argument, },
{ .name = "async", .has_arg = no_argument, },
+ { .name = "vrr-push", .has_arg = required_argument, },
{ },
};
- int opt = getopt_long(argc, argv, "t:p:b:l:f:xa", long_options, NULL);
+ int opt = getopt_long(argc, argv, "t:p:b:l:f:xav:", long_options, NULL);
if (opt == -1)
break;
@@ -1311,6 +1384,11 @@ int main(int argc, char *argv[])
case 'a':
test_async_flip = true;
break;
+ case 'v':
+ vrr_push_scanline = atoi(optarg);
+ if (vrr_push_scanline < 0)
+ usage(argv[0]);
+ break;
}
}
@@ -1330,6 +1408,9 @@ int main(int argc, char *argv[])
if (test_async_flip)
usage(argv[0]);
+ if (vrr_push_scanline >= 0)
+ usage(argv[0]);
+
switch (test) {
case TEST_IIR:
test = TEST_IIR_GEN2;
@@ -1350,6 +1431,9 @@ int main(int argc, char *argv[])
if (test_async_flip)
usage(argv[0]);
+ if (vrr_push_scanline >= 0)
+ usage(argv[0]);
+
switch (test) {
case TEST_IIR:
test = TEST_IIR_GEN3;
@@ -1383,6 +1467,9 @@ int main(int argc, char *argv[])
if (test_pixelcount)
usage(argv[0]);
+ if (vrr_push_scanline >= 0)
+ usage(argv[0]);
+
switch (test) {
case TEST_IIR:
test = TEST_IIR_GEN3;
@@ -1427,6 +1514,9 @@ int main(int argc, char *argv[])
if (test_pixelcount)
usage(argv[0]);
+ if (vrr_push_scanline >= 0 && intel_gen(devid) < 11)
+ usage(argv[0]);
+
switch (test) {
case TEST_IIR:
test = TEST_DEIIR;
@@ -1488,7 +1578,7 @@ int main(int argc, char *argv[])
break;
case TEST_DEIIR:
assert(!test_pixelcount);
- poll_dsl_deiir(devid, pipe, bit, min, max, count);
+ poll_dsl_deiir(devid, pipe, bit, min, max, count, vrr_push_scanline);
break;
case TEST_FRAMECOUNT_GEN3:
if (test_pixelcount)
@@ -1498,19 +1588,19 @@ int main(int argc, char *argv[])
break;
case TEST_FRAMECOUNT_G4X:
assert(!test_pixelcount);
- poll_dsl_framecount_g4x(pipe, min, max, count);
+ poll_dsl_framecount_g4x(devid, pipe, min, max, count, vrr_push_scanline);
break;
case TEST_FRAMETIMESTAMP:
assert(!test_pixelcount);
- poll_dsl_frametimestamp(devid, pipe, min, max, count);
+ poll_dsl_frametimestamp(devid, pipe, min, max, count, vrr_push_scanline);
break;
case TEST_TIMESTAMP:
assert(!test_pixelcount);
- poll_dsl_timestamp(devid, pipe, target_scanline, min, max, count);
+ poll_dsl_timestamp(devid, pipe, target_scanline, min, max, count, vrr_push_scanline);
break;
case TEST_FLIPCOUNT:
assert(!test_pixelcount);
- poll_dsl_flipcount_g4x(devid, pipe, min, max, count);
+ poll_dsl_flipcount_g4x(devid, pipe, min, max, count, vrr_push_scanline);
break;
case TEST_PAN:
if (test_pixelcount)
@@ -1518,7 +1608,7 @@ int main(int argc, char *argv[])
min, max, count);
else
poll_dsl_pan(devid, pipe, target_scanline, target_fuzz,
- min, max, count);
+ min, max, count, vrr_push_scanline);
break;
case TEST_FLIP:
if (test_pixelcount)
@@ -1526,7 +1616,7 @@ int main(int argc, char *argv[])
min, max, count);
else
poll_dsl_flip(devid, pipe, target_scanline, target_fuzz,
- min, max, count, test_async_flip);
+ min, max, count, test_async_flip, vrr_push_scanline);
break;
case TEST_FLIPDONE_PIPESTAT:
poll_dsl_flipdone_pipestat(devid, pipe, target_scanline, target_fuzz,
@@ -1534,16 +1624,16 @@ int main(int argc, char *argv[])
break;
case TEST_FLIPDONE_DEIIR:
poll_dsl_flipdone_deiir(devid, pipe, target_scanline, target_fuzz,
- min, max, count, test_async_flip);
+ min, max, count, test_async_flip, vrr_push_scanline);
break;
case TEST_SURFLIVE:
- poll_dsl_surflive(devid, pipe, min, max, count, test_async_flip);
+ poll_dsl_surflive(devid, pipe, min, max, count, test_async_flip, vrr_push_scanline);
break;
case TEST_WRAP:
if (test_pixelcount)
poll_pixel_wrap(pipe, min, max, count);
else
- poll_dsl_wrap(pipe, min, max, count);
+ poll_dsl_wrap(devid, pipe, min, max, count, vrr_push_scanline);
break;
case TEST_FIELD:
poll_dsl_field(pipe, min, max, count);