From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from aibo.runbox.com (aibo.runbox.com [91.220.196.211]) by gabe.freedesktop.org (Postfix) with ESMTPS id EB14789D2F for ; Tue, 16 Feb 2021 15:48:07 +0000 (UTC) From: Martin Peres Date: Tue, 16 Feb 2021 17:47:22 +0200 Message-Id: <20210216154722.775071-2-martin.peres@mupuf.org> In-Reply-To: <20210216154722.775071-1-martin.peres@mupuf.org> References: <20210216123236.693768-1-martin.peres@mupuf.org> <20210216154722.775071-1-martin.peres@mupuf.org> MIME-Version: 1.0 Subject: [igt-dev] [PATCH i-g-t v2 2/2] amdgpu/info: add timestamp-related tests List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Errors-To: igt-dev-bounces@lists.freedesktop.org Sender: "igt-dev" To: Development mailing list for IGT GPU Tools Cc: Bas Nieuwenhuizen List-ID: This test makes sure: * the clock is running at the expected rate * (potential) power gating has no effect on the clock v2: - use signed integer for the gpu timestamp diff (Bas) v3: - add test and subtest descriptions (Arek) - split the fast and long tests in different subtests (Martin) - use igt_stats to compute actual statistics (Chris) Cc: Bas Nieuwenhuizen Signed-off-by: Martin Peres --- tests/amdgpu/amd_info.c | 77 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 77 insertions(+) diff --git a/tests/amdgpu/amd_info.c b/tests/amdgpu/amd_info.c index 6764e640..d099356f 100644 --- a/tests/amdgpu/amd_info.c +++ b/tests/amdgpu/amd_info.c @@ -44,6 +44,73 @@ static void query_firmware_version_test(void) igt_assert_eq(r, 0); } +static void query_timestamp_test(uint32_t sleep_time, int sample_count) +{ + struct amdgpu_gpu_info gpu_info = {}; + double median, std_err, err_95_conf; + igt_stats_t stats; + float ns_per_tick; + int i; + + igt_stats_init_with_size(&stats, sample_count); + + /* figure out how many nanoseconds each gpu timestamp tick represents */ + igt_assert_eq(amdgpu_query_gpu_info(dev, &gpu_info), 0); + igt_assert_lt(0, gpu_info.gpu_counter_freq); + ns_per_tick = 1e9 / (gpu_info.gpu_counter_freq * 1000.0); + + /* acquire the data needed for the analysis */ + for (i = 0; i < sample_count; i++) { + uint64_t ts_start, ts_end, cpu_delta; + int64_t gpu_delta; + float corrected_gpu_delta; + struct timespec ts_cpu; + int r; + + igt_assert_eq(igt_gettime(&ts_cpu), 0); + + r = amdgpu_query_info(dev, AMDGPU_INFO_TIMESTAMP, 8, &ts_start); + igt_assert_eq(r, 0); + + usleep(sleep_time); + + r = amdgpu_query_info(dev, AMDGPU_INFO_TIMESTAMP, 8, &ts_end); + igt_assert_eq(r, 0); + + /* get the GPU and CPU deltas */ + cpu_delta = igt_nsec_elapsed(&ts_cpu); + gpu_delta = ts_end - ts_start; + corrected_gpu_delta = gpu_delta * ns_per_tick; + + /* make sure the GPU timestamps are ordered */ + igt_assert_lt_s64(0, gpu_delta); + + igt_stats_push_float(&stats, corrected_gpu_delta / cpu_delta); + } + + /* generate the statistics */ + median = igt_stats_get_median(&stats); + std_err = igt_stats_get_std_error(&stats); + err_95_conf = std_err * 1.96; + + /* check that the median ticking rate is ~1.0, meaning that the + * the GPU and CPU timestamps grow at the same rate + */ + igt_assert_f(median > 0.99 && median < 1.01, + "The GPU time elapses at %.2f%% (+/- %.2f%% at 95%% " + "confidence) of the CPU's speed\ngpu_counter_freq=%u kHz, " + "should be %.0f kHz (+/- %.1f kHz at 95%% confidence)\n", + median * 100.0, err_95_conf * 100.0, + gpu_info.gpu_counter_freq, + gpu_info.gpu_counter_freq * median, + gpu_info.gpu_counter_freq * err_95_conf); + + /* check the jitter in the ticking rate */ + igt_assert_f(err_95_conf < 0.01, + "The GPU time ticks with a jitter greater than 1%%, at " + "95%% confidence (+/- %.3f%%)\n", err_95_conf * 100.0); +} + IGT_TEST_DESCRIPTION("Test the consistency of the data provided through the " "DRM_AMDGPU_INFO IOCTL"); igt_main @@ -67,6 +134,16 @@ igt_main igt_subtest("query-firmware-version") query_firmware_version_test(); + igt_describe("Check that the GPU time ticks constantly, and at the " + "same rate as the CPU"); + igt_subtest("query-timestamp") + query_timestamp_test(10000, 100); + + igt_describe("Check that the GPU time keeps on ticking, even during " + "long idle times which could lead to clock/power gating"); + igt_subtest("query-timestamp-while-idle") + query_timestamp_test(7000000, 1); + igt_fixture { amdgpu_device_deinitialize(dev); close(fd); -- 2.30.1 _______________________________________________ igt-dev mailing list igt-dev@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/igt-dev