[igt-dev] [PATCH] tests/i915/gem_huc_copy: cover reset and suspend/resume scenarios
Ye, Tony
tony.ye at intel.com
Fri Apr 29 06:25:57 UTC 2022
Reviewed-by: Tony Ye <tony.ye at intel.com>
Thanks,
Tony
> 在 2022年4月27日,下午3:12,Ceraolo Spurio, Daniele <daniele.ceraolospurio at intel.com> 写道:
>
>
>
>> On 4/27/2022 2:58 PM, Ye, Tony wrote:
>>
>>> On 4/27/2022 2:44 PM, Daniele Ceraolo Spurio wrote:
>>> Additional subtests have been added to make sure the HuC keeps working
>>> after GT reset and suspend/resume.
>>>
>>> Cc: Tony Ye <tony.ye at intel.com>
>>> Signed-off-by: Daniele Ceraolo Spurio <daniele.ceraolospurio at intel.com>
>>> ---
>>> tests/i915/gem_huc_copy.c | 118 ++++++++++++++++++++++++++++----------
>>> 1 file changed, 89 insertions(+), 29 deletions(-)
>>>
>>> diff --git a/tests/i915/gem_huc_copy.c b/tests/i915/gem_huc_copy.c
>>> index ea32b705..ef577824 100644
>>> --- a/tests/i915/gem_huc_copy.c
>>> +++ b/tests/i915/gem_huc_copy.c
>>> @@ -40,6 +40,13 @@ IGT_TEST_DESCRIPTION("A very simple workload for the HuC.");
>>> #define HUC_COPY_DATA_BUF_SIZE 4096
>>> +enum operation {
>>> + GPU_RESET,
>>> + SUSPEND_RESUME,
>>> + HIBERNATE_RESUME,
>>> + SIMPLE_COPY,
>>> +};
>>> +
>>> static void
>>> compare_huc_copy_result(int drm_fd, uint32_t src_handle, uint32_t dst_handle)
>>> {
>>> @@ -84,12 +91,77 @@ static void test_huc_load(int fd)
>>> igt_fail_on_f(status == 0, "HuC firmware is not running!\n");
>>> }
>>> +static void huc_copy_test(int drm_fd, uint64_t ahnd,
>>> + igt_huc_copyfunc_t huc_copy, enum operation op)
>>> +{
>>> + char inputs[HUC_COPY_DATA_BUF_SIZE];
>>> + struct drm_i915_gem_exec_object2 obj[3];
>>> + uint64_t objsize[3] = { HUC_COPY_DATA_BUF_SIZE,
>>> + HUC_COPY_DATA_BUF_SIZE,
>>> + 4096 };
>>> +
>>> + switch (op) {
>>> + case GPU_RESET:
>>> + igt_force_gpu_reset(drm_fd);
>>
>> The issue in VLK-33957 is not reproducible with a forced gpu reset through the i915_wedged debugfs. It is also not reproducible with igt_hang_ctx(). Only a real GPU HANG can reproduce the issue.
>
> The bug you're referencing is about recovery of an hung context and it is not what these new tests are for. What I want to test here is whether the HuC itself is working correctly after a GT reset or suspend/resume flow. This is to make sure we don't break anything with the upcoming DG2 changes, because the flow and timing are completely different with GSC loading the HuC. Hibernation/resume is going to be especially tricky, because HuC load will happen after i915 resume is complete, so we'll have to synchronize.
>
> Daniele
>
>>
>> Thanks,
>>
>> Tony
>>
>>> + break;
>>> +
>>> + case SUSPEND_RESUME:
>>> + igt_system_suspend_autoresume(SUSPEND_STATE_MEM,
>>> + SUSPEND_TEST_NONE);
>>> + break;
>>> +
>>> + case HIBERNATE_RESUME:
>>> + igt_system_suspend_autoresume(SUSPEND_STATE_DISK,
>>> + SUSPEND_TEST_NONE);
>>> + break;
>>> +
>>> + case SIMPLE_COPY:
>>> + break;
>>> +
>>> + default:
>>> + igt_assert(0);
>>> + }
>>> +
>>> + test_huc_load(drm_fd);
>>> + /* Initialize src buffer randomly */
>>> + srand(time(NULL));
>>> + for (int i = 0; i < HUC_COPY_DATA_BUF_SIZE; i++)
>>> + inputs[i] = (char) (rand() % 256);
>>> +
>>> + memset(obj, 0, sizeof(obj));
>>> + /* source buffer object for storing input */
>>> + obj[0].handle = gem_create(drm_fd, HUC_COPY_DATA_BUF_SIZE);
>>> + /* destination buffer object to receive input */
>>> + obj[1].handle = gem_create(drm_fd, HUC_COPY_DATA_BUF_SIZE);
>>> + /* execution buffer object */
>>> + obj[2].handle = gem_create(drm_fd, 4096);
>>> +
>>> + gem_write(drm_fd, obj[0].handle, 0, inputs, HUC_COPY_DATA_BUF_SIZE);
>>> +
>>> + huc_copy(drm_fd, ahnd, obj, objsize);
>>> + compare_huc_copy_result(drm_fd, obj[0].handle, obj[1].handle);
>>> +
>>> + gem_close(drm_fd, obj[0].handle);
>>> + gem_close(drm_fd, obj[1].handle);
>>> + gem_close(drm_fd, obj[2].handle);
>>> +}
>>> +
>>> igt_main
>>> {
>>> int drm_fd = -1;
>>> uint32_t devid;
>>> igt_huc_copyfunc_t huc_copy;
>>> uint64_t ahnd;
>>> + const struct {
>>> + const char *name;
>>> + enum operation op;
>>> + } ops[] = {
>>> + { "", SIMPLE_COPY },
>>> + { "-after-reset", GPU_RESET },
>>> + { "-after-suspend-resume", SUSPEND_RESUME },
>>> + { "-after-hibernate-resume", HIBERNATE_RESUME },
>>> + { }
>>> + }, *op;
>>> igt_fixture {
>>> drm_fd = drm_open_driver(DRIVER_INTEL);
>>> @@ -106,35 +178,23 @@ igt_main
>>> "by copying a char array using Huc"
>>> "and verifying the copied result");
>>> - igt_subtest("huc-copy") {
>>> - char inputs[HUC_COPY_DATA_BUF_SIZE];
>>> - struct drm_i915_gem_exec_object2 obj[3];
>>> - uint64_t objsize[3] = { HUC_COPY_DATA_BUF_SIZE,
>>> - HUC_COPY_DATA_BUF_SIZE,
>>> - 4096 };
>>> -
>>> - test_huc_load(drm_fd);
>>> - /* Initialize src buffer randomly */
>>> - srand(time(NULL));
>>> - for (int i = 0; i < HUC_COPY_DATA_BUF_SIZE; i++)
>>> - inputs[i] = (char) (rand() % 256);
>>> -
>>> - memset(obj, 0, sizeof(obj));
>>> - /* source buffer object for storing input */
>>> - obj[0].handle = gem_create(drm_fd, HUC_COPY_DATA_BUF_SIZE);
>>> - /* destination buffer object to receive input */
>>> - obj[1].handle = gem_create(drm_fd, HUC_COPY_DATA_BUF_SIZE);
>>> - /* execution buffer object */
>>> - obj[2].handle = gem_create(drm_fd, 4096);
>>> -
>>> - gem_write(drm_fd, obj[0].handle, 0, inputs, HUC_COPY_DATA_BUF_SIZE);
>>> -
>>> - huc_copy(drm_fd, ahnd, obj, objsize);
>>> - compare_huc_copy_result(drm_fd, obj[0].handle, obj[1].handle);
>>> -
>>> - gem_close(drm_fd, obj[0].handle);
>>> - gem_close(drm_fd, obj[1].handle);
>>> - gem_close(drm_fd, obj[2].handle);
>>> + for (op = ops; op->name; op++) {
>>> + igt_subtest_group {
>>> + igt_hang_t hang = {};
>>> +
>>> + igt_fixture {
>>> + if (op->op == GPU_RESET)
>>> + hang = igt_allow_hang(drm_fd, 0, HANG_ALLOW_CAPTURE);
>>> + }
>>> +
>>> + igt_subtest_f("huc-copy%s", op->name)
>>> + huc_copy_test(drm_fd, ahnd, huc_copy, op->op);
>>> +
>>> + igt_fixture {
>>> + if (op->op == GPU_RESET)
>>> + igt_disallow_hang(drm_fd, hang);
>>> + }
>>> + }
>>> }
>>> igt_fixture {
>
More information about the igt-dev
mailing list