[igt-dev] [PATCH i-g-t 2/8] tools/intel_watermark: Use WM_SR_CNT to observe SR residency
Ville Syrjala
ville.syrjala at linux.intel.com
Wed Apr 14 02:27:48 UTC 2021
From: Ville Syrjälä <ville.syrjala at linux.intel.com>
WM_SR_CNT (exists since HSW) has some kind of SR residency counter,
which is nice for checking whether the watermarks work decently.
Let's use it.
Signed-off-by: Ville Syrjälä <ville.syrjala at linux.intel.com>
---
tools/intel_watermark.c | 53 ++++++++++++++++++++++++++++++++++++++++-
1 file changed, 52 insertions(+), 1 deletion(-)
diff --git a/tools/intel_watermark.c b/tools/intel_watermark.c
index bc2a46232772..39aaf9fbe055 100644
--- a/tools/intel_watermark.c
+++ b/tools/intel_watermark.c
@@ -35,6 +35,7 @@
static uint32_t display_base;
static uint32_t devid;
+static unsigned int sr_sleep;
static uint32_t read_reg(uint32_t addr)
{
@@ -240,6 +241,22 @@ static const char *skl_nv12_buf_cfg_reg_name(int pipe, int plane)
return reg_name;
}
+static void hsw_wm_sr_cnt(void)
+{
+ if (sr_sleep) {
+ uint32_t pre, post;
+
+ pre = read_reg(0x45264);
+ sleep(sr_sleep);
+ post = read_reg(0x45264);
+
+ printf("WM_SR_CNT: 0x%08x->0x%08x\n", pre, post);
+ printf("SR residency: %u%%\n", ((post - pre) * 8 / (sr_sleep * 10000)));
+ } else {
+ printf("WM_SR_CNT: 0x%08x\n", read_reg(0x45264));
+ }
+}
+
static void skl_wm_dump(void)
{
struct intel_mmio_data mmio_data;
@@ -462,6 +479,8 @@ static void skl_wm_dump(void)
printf("* plane watermark enabled\n");
printf("(x) line watermark if enabled\n");
+ hsw_wm_sr_cnt();
+
wm_dbg = read_reg(0x45280);
printf("WM_DBG: 0x%08x\n", wm_dbg);
printf(" LP used:");
@@ -627,7 +646,11 @@ static void ilk_wm_dump(void)
endis(!REG_DECODE1(arb_ctl, 15, 1)));
if (IS_BROADWELL(devid) || IS_HASWELL(devid)) {
- uint32_t wm_dbg = read_reg(0x45280);
+ uint32_t wm_dbg;
+
+ hsw_wm_sr_cnt();
+
+ wm_dbg = read_reg(0x45280);
printf("WM_DBG: 0x%08x\n", wm_dbg);
if (wm_dbg & (1 << 31))
printf(" Full maxfifo used\n");
@@ -1265,10 +1288,38 @@ static void gen2_wm_dump(void)
}
}
+static void __attribute__((noreturn)) usage(const char *name)
+{
+ fprintf(stderr, "Usage: %s [options]\n"
+ " -s,--sr-sleep <seconds>\n",
+ name);
+ exit(1);
+}
+
int main(int argc, char *argv[])
{
devid = intel_get_pci_device()->device_id;
+ for (;;) {
+ static const struct option long_options[] = {
+ { .name = "sr-sleep", .has_arg = required_argument, },
+ {}
+ };
+
+ int opt = getopt_long(argc, argv, "s:", long_options, NULL);
+ if (opt == -1)
+ break;
+
+ switch (opt) {
+ case 's':
+ sr_sleep = atoi(optarg);
+ break;
+ default:
+ usage(argv[0]);
+ break;
+ }
+ }
+
if (intel_gen(devid) >= 9) {
skl_wm_dump();
} else if (IS_VALLEYVIEW(devid) || IS_CHERRYVIEW(devid)) {
--
2.26.3
More information about the igt-dev
mailing list