diff options
Diffstat (limited to 'tests/amdgpu/amd_abm.c')
-rw-r--r-- | tests/amdgpu/amd_abm.c | 147 |
1 files changed, 63 insertions, 84 deletions
diff --git a/tests/amdgpu/amd_abm.c b/tests/amdgpu/amd_abm.c index 363b1e90..74156462 100644 --- a/tests/amdgpu/amd_abm.c +++ b/tests/amdgpu/amd_abm.c @@ -34,6 +34,14 @@ #define BACKLIGHT_PATH "/sys/class/backlight/amdgpu_bl0" +typedef struct data { + igt_display_t display; + int drm_fd; + int debugfs; + uint32_t output_id; + uint32_t abm_prop_id; +} data_t; + static int read_current_backlight_pwm(int debugfs_dir) { char buf[20]; @@ -76,35 +84,14 @@ static int backlight_write_brightness(int value) return 0; } -static void set_abm_level(igt_display_t *display, int level) +static void set_abm_level(data_t *data, int level) { - int i, ret; - int output_id; - drmModeObjectPropertiesPtr props; - uint32_t prop_id; - drmModePropertyPtr prop; uint32_t type = DRM_MODE_OBJECT_CONNECTOR; + int ret; - for (i = 0; i < display->n_outputs; i++) { - output_id = display->outputs[i].id; - props = drmModeObjectGetProperties(display->drm_fd, output_id, type); - - for (i = 0; i < props->count_props; i++) { - prop_id = props->props[i]; - prop = drmModeGetProperty(display->drm_fd, prop_id); - - igt_assert(prop); - - if (strcmp(prop->name, "abm level") == 0) { - ret = drmModeObjectSetProperty(display->drm_fd, output_id, type, prop_id, level); - - igt_assert_eq(ret, 0); - } - - drmModeFreeProperty(prop); - } - } - + ret = drmModeObjectSetProperty(data->drm_fd, data->output_id, type, + data->abm_prop_id, level); + igt_assert_eq(ret, 0); } static int backlight_read_max_brightness(int *result) @@ -132,24 +119,21 @@ static int backlight_read_max_brightness(int *result) return errno; } -static void skip_if_incompatible(igt_display_t *display, int debugfs_dir) +static void test_init(data_t *data) { + igt_display_t *display = &data->display; int ret, i; char buf[20]; bool abm_prop_exists; - int output_id; - drmModeObjectPropertiesPtr props; uint32_t type = DRM_MODE_OBJECT_CONNECTOR; - uint32_t prop_id; - drmModePropertyPtr prop; - ret = igt_debugfs_simple_read(debugfs_dir, "amdgpu_current_backlight_pwm", + ret = igt_debugfs_simple_read(data->debugfs, "amdgpu_current_backlight_pwm", buf, sizeof(buf)); if (ret < 0) igt_skip("No current backlight debugfs entry.\n"); - ret = igt_debugfs_simple_read(debugfs_dir, "amdgpu_target_backlight_pwm", + ret = igt_debugfs_simple_read(data->debugfs, "amdgpu_target_backlight_pwm", buf, sizeof(buf)); if (ret < 0) @@ -158,18 +142,14 @@ static void skip_if_incompatible(igt_display_t *display, int debugfs_dir) abm_prop_exists = false; for (i = 0; i < display->n_outputs; i++) { - output_id = display->outputs[i].id; - props = drmModeObjectGetProperties(display->drm_fd, output_id, type); + data->output_id = display->outputs[i].id; - for (i = 0; i < props->count_props; i++) { - prop_id = props->props[i]; - prop = drmModeGetProperty(display->drm_fd, prop_id); + abm_prop_exists = kmstest_get_property( + data->drm_fd, data->output_id, type, "abm level", + &data->abm_prop_id, NULL, NULL); - if (strcmp(prop->name, "abm level") == 0) - abm_prop_exists = true; - - drmModeFreeProperty(prop); - } + if (abm_prop_exists) + break; } if (!abm_prop_exists) @@ -177,7 +157,7 @@ static void skip_if_incompatible(igt_display_t *display, int debugfs_dir) } -static void backlight_dpms_cycle(igt_display_t *display, int debugfs, igt_output_t *output) +static void backlight_dpms_cycle(data_t *data, igt_output_t *output) { int ret; int max_brightness; @@ -186,19 +166,19 @@ static void backlight_dpms_cycle(igt_display_t *display, int debugfs, igt_output ret = backlight_read_max_brightness(&max_brightness); igt_assert_eq(ret, 0); - set_abm_level(display, 0); + set_abm_level(data, 0); backlight_write_brightness(max_brightness / 2); usleep(100000); - pwm_1 = read_target_backlight_pwm(debugfs); + pwm_1 = read_target_backlight_pwm(data->debugfs); - kmstest_set_connector_dpms(display->drm_fd, output->config.connector, DRM_MODE_DPMS_OFF); - kmstest_set_connector_dpms(display->drm_fd, output->config.connector, DRM_MODE_DPMS_ON); + kmstest_set_connector_dpms(data->drm_fd, output->config.connector, DRM_MODE_DPMS_OFF); + kmstest_set_connector_dpms(data->drm_fd, output->config.connector, DRM_MODE_DPMS_ON); usleep(100000); - pwm_2 = read_target_backlight_pwm(debugfs); + pwm_2 = read_target_backlight_pwm(data->debugfs); igt_assert_eq(pwm_1, pwm_2); } -static void backlight_monotonic_basic(igt_display_t *display, int debugfs) +static void backlight_monotonic_basic(data_t *data) { int ret; int max_brightness; @@ -211,23 +191,23 @@ static void backlight_monotonic_basic(igt_display_t *display, int debugfs) brightness_step = max_brightness / 10; - set_abm_level(display, 0); + set_abm_level(data, 0); backlight_write_brightness(max_brightness); usleep(100000); - prev_pwm = read_target_backlight_pwm(debugfs); + prev_pwm = read_target_backlight_pwm(data->debugfs); for (brightness = max_brightness - brightness_step; brightness > 0; brightness -= brightness_step) { backlight_write_brightness(brightness); usleep(100000); - pwm = read_target_backlight_pwm(debugfs); + pwm = read_target_backlight_pwm(data->debugfs); igt_assert(pwm < prev_pwm); prev_pwm = pwm; } } -static void backlight_monotonic_abm(igt_display_t *display, int debugfs) +static void backlight_monotonic_abm(data_t *data) { int ret, i; int max_brightness; @@ -240,23 +220,23 @@ static void backlight_monotonic_abm(igt_display_t *display, int debugfs) brightness_step = max_brightness / 10; for (i = 1; i < 5; i++) { - set_abm_level(display, i); + set_abm_level(data, i); backlight_write_brightness(max_brightness); usleep(100000); - prev_pwm = read_target_backlight_pwm(debugfs); + prev_pwm = read_target_backlight_pwm(data->debugfs); for (brightness = max_brightness - brightness_step; brightness > 0; brightness -= brightness_step) { backlight_write_brightness(brightness); usleep(100000); - pwm = read_target_backlight_pwm(debugfs); + pwm = read_target_backlight_pwm(data->debugfs); igt_assert(pwm < prev_pwm); prev_pwm = pwm; } } } -static void abm_enabled(igt_display_t *display, int debugfs) +static void abm_enabled(data_t *data) { int ret, i; int max_brightness; @@ -265,16 +245,16 @@ static void abm_enabled(igt_display_t *display, int debugfs) ret = backlight_read_max_brightness(&max_brightness); igt_assert_eq(ret, 0); - set_abm_level(display, 0); + set_abm_level(data, 0); backlight_write_brightness(max_brightness); usleep(100000); - prev_pwm = read_target_backlight_pwm(debugfs); + prev_pwm = read_target_backlight_pwm(data->debugfs); pwm_without_abm = prev_pwm; for (i = 1; i < 5; i++) { - set_abm_level(display, i); + set_abm_level(data, i); usleep(100000); - pwm = read_target_backlight_pwm(debugfs); + pwm = read_target_backlight_pwm(data->debugfs); igt_assert(pwm <= prev_pwm); igt_assert(pwm < pwm_without_abm); prev_pwm = pwm; @@ -282,7 +262,7 @@ static void abm_enabled(igt_display_t *display, int debugfs) } -static void abm_gradual(igt_display_t *display, int debugfs) +static void abm_gradual(data_t *data) { int ret, i; int convergence_delay = 15; @@ -293,71 +273,70 @@ static void abm_gradual(igt_display_t *display, int debugfs) igt_assert_eq(ret, 0); - set_abm_level(display, 0); + set_abm_level(data, 0); backlight_write_brightness(max_brightness); sleep(convergence_delay); - prev_pwm = read_target_backlight_pwm(debugfs); - curr = read_current_backlight_pwm(debugfs); + prev_pwm = read_target_backlight_pwm(data->debugfs); + curr = read_current_backlight_pwm(data->debugfs); igt_assert_eq(prev_pwm, curr); - set_abm_level(display, 4); + set_abm_level(data, 4); for (i = 0; i < 10; i++) { usleep(100000); - pwm = read_current_backlight_pwm(debugfs); + pwm = read_current_backlight_pwm(data->debugfs); igt_assert(pwm < prev_pwm); prev_pwm = pwm; } sleep(convergence_delay - 1); - prev_pwm = read_target_backlight_pwm(debugfs); - curr = read_current_backlight_pwm(debugfs); + prev_pwm = read_target_backlight_pwm(data->debugfs); + curr = read_current_backlight_pwm(data->debugfs); igt_assert_eq(prev_pwm, curr); } igt_main { - igt_display_t display; - int debugfs; + data_t data = { 0 }; enum pipe pipe; igt_output_t *output; igt_skip_on_simulation(); igt_fixture { - display.drm_fd = drm_open_driver_master(DRIVER_AMDGPU); + data.drm_fd = drm_open_driver_master(DRIVER_AMDGPU); - if (display.drm_fd == -1) + if (data.drm_fd == -1) igt_skip("Not an amdgpu driver.\n"); - debugfs = igt_debugfs_dir(display.drm_fd); + data.debugfs = igt_debugfs_dir(data.drm_fd); kmstest_set_vt_graphics_mode(); - igt_display_require(&display, display.drm_fd); + igt_display_require(&data.display, data.drm_fd); - skip_if_incompatible(&display, debugfs); + test_init(&data); - for_each_pipe_with_valid_output(&display, pipe, output) { + for_each_pipe_with_valid_output(&data.display, pipe, output) { if (output->config.connector->connector_type == DRM_MODE_CONNECTOR_eDP) break; } } igt_subtest("dpms_cycle") - backlight_dpms_cycle(&display, debugfs, output); + backlight_dpms_cycle(&data, output); igt_subtest("backlight_monotonic_basic") - backlight_monotonic_basic(&display, debugfs); + backlight_monotonic_basic(&data); igt_subtest("backlight_monotonic_abm") - backlight_monotonic_abm(&display, debugfs); + backlight_monotonic_abm(&data); igt_subtest("abm_enabled") - abm_enabled(&display, debugfs); + abm_enabled(&data); igt_subtest("abm_gradual") - abm_gradual(&display, debugfs); + abm_gradual(&data); igt_fixture { - igt_display_fini(&display); + igt_display_fini(&data.display); } } |