Op 20-10-17 om 12:16 schreef Mika Kahola: > On Fri, 2017-10-20 at 12:08 +0200, Maarten Lankhorst wrote: >> Op 20-10-17 om 12:02 schreef Mika Kahola: >>> On Thu, 2017-10-12 at 17:33 +0200, Maarten Lankhorst wrote: >>>> Now that we can set individual properties through the igt_kms >>>> api, >>>> we no longer need to duplicate functionality from igt_kms. Set >>>> invalid >>>> properties directly, and rewrite kms_atomic.c to use igt_display. >>>> This will allow us to remove a lot of code in kms_atomic.c, >>>> and benefit from how igt_kms can set up a valid configuration, >>>> instead of having to inherit it from fbcon. >>>> >>>> Changes since v1: >>>> - Fix test failure when atomic_invalid_params is run standalone. >>>> >>>> Signed-off-by: Maarten Lankhorst <maarten.lankhorst@linux.intel.c >>>> om> >>>> Cc: Daniel Stone <daniels@xxxxxxxxxxxxx> >>>> --- >>>> tests/kms_atomic.c | 1668 ++++++++++++++++-------------------- >>>> ---- >>>> ------------ >>>> 1 file changed, 512 insertions(+), 1156 deletions(-) >>>> >>>> diff --git a/tests/kms_atomic.c b/tests/kms_atomic.c >>>> index 042a7c263aab..e0fc324eab61 100644 >>>> --- a/tests/kms_atomic.c >>>> +++ b/tests/kms_atomic.c >>>> @@ -46,10 +46,6 @@ >>>> #include "igt_aux.h" >>>> #include "sw_sync.h" >>>> >>>> -#ifndef DRM_CLIENT_CAP_ATOMIC >>>> -#define DRM_CLIENT_CAP_ATOMIC 3 >>>> -#endif >>>> - >>>> #ifndef DRM_CAP_CURSOR_WIDTH >>>> #define DRM_CAP_CURSOR_WIDTH 0x8 >>>> #endif >>>> @@ -58,23 +54,6 @@ >>>> #define DRM_CAP_CURSOR_HEIGHT 0x9 >>>> #endif >>>> >>>> -#ifndef DRM_MODE_ATOMIC_TEST_ONLY >>>> -#define DRM_MODE_ATOMIC_TEST_ONLY 0x0100 >>>> -#define DRM_MODE_ATOMIC_NONBLOCK 0x0200 >>>> -#define DRM_MODE_ATOMIC_ALLOW_MODESET 0x0400 >>>> - >>>> -struct drm_mode_atomic { >>>> - __u32 flags; >>>> - __u32 count_objs; >>>> - __u64 objs_ptr; >>>> - __u64 count_props_ptr; >>>> - __u64 props_ptr; >>>> - __u64 prop_values_ptr; >>>> - __u64 reserved; >>>> - __u64 user_data; >>>> -}; >>>> -#endif >>>> - >>>> IGT_TEST_DESCRIPTION("Test atomic modesetting API"); >>>> >>>> enum kms_atomic_check_relax { >>>> @@ -83,1259 +62,652 @@ enum kms_atomic_check_relax { >>>> PLANE_RELAX_FB = (1 << 1) >>>> }; >>>> >>>> -/** >>>> - * KMS plane type enum >>>> - * >>>> - * KMS plane types are represented by enums, which do not have >>>> stable numeric >>>> - * values, but must be looked up by their string value each >>>> time. >>>> - * >>>> - * To make the code more simple, we define a plane_type enum >>>> which >>>> maps to >>>> - * each KMS enum value. These values must be looked up through >>>> the >>>> map, and >>>> - * cannot be passed directly to KMS functions. >>>> - */ >>>> -enum plane_type { >>>> - PLANE_TYPE_PRIMARY = 0, >>>> - PLANE_TYPE_OVERLAY, >>>> - PLANE_TYPE_CURSOR, >>>> - NUM_PLANE_TYPE_PROPS >>>> -}; >>>> - >>>> -static const char *plane_type_prop_names[NUM_PLANE_TYPE_PROPS] = >>>> { >>>> - "Primary", >>>> - "Overlay", >>>> - "Cursor" >>>> -}; >>>> - >>>> -struct kms_atomic_blob { >>>> - uint32_t id; /* 0 if not already allocated */ >>>> - size_t len; >>>> - void *data; >>>> -}; >>>> - >>>> -struct kms_atomic_connector_state { >>>> - struct kms_atomic_state *state; >>>> - uint32_t obj; >>>> - uint32_t crtc_id; >>>> -}; >>>> - >>>> -struct kms_atomic_plane_state { >>>> - struct kms_atomic_state *state; >>>> - uint32_t obj; >>>> - enum plane_type type; >>>> - uint32_t crtc_mask; >>>> - uint32_t crtc_id; /* 0 to disable */ >>>> - uint32_t fb_id; /* 0 to disable */ >>>> - uint32_t src_x, src_y, src_w, src_h; /* 16.16 fixed- >>>> point */ >>>> - uint32_t crtc_x, crtc_y, crtc_w, crtc_h; /* normal >>>> integers >>>> */ >>>> - int32_t fence_fd; >>>> -}; >>>> - >>>> -struct kms_atomic_crtc_state { >>>> - struct kms_atomic_state *state; >>>> - uint32_t obj; >>>> - int idx; >>>> - bool active; >>>> - int32_t *out_fence_ptr; >>>> - struct kms_atomic_blob mode; >>>> -}; >>>> - >>>> -struct kms_atomic_state { >>>> - struct kms_atomic_connector_state *connectors; >>>> - int num_connectors; >>>> - struct kms_atomic_crtc_state *crtcs; >>>> - int num_crtcs; >>>> - struct kms_atomic_plane_state *planes; >>>> - int num_planes; >>>> - struct kms_atomic_desc *desc; >>>> -}; >>>> - >>>> -struct kms_atomic_desc { >>>> - int fd; >>>> - uint32_t props_connector[IGT_NUM_CONNECTOR_PROPS]; >>>> - uint32_t props_crtc[IGT_NUM_CRTC_PROPS]; >>>> - uint32_t props_plane[IGT_NUM_PLANE_PROPS]; >>>> - uint64_t props_plane_type[NUM_PLANE_TYPE_PROPS]; >>>> -}; >>>> - >>>> -static uint32_t blob_duplicate(int fd, uint32_t id_orig) >>>> +static bool plane_filter(enum igt_atomic_plane_properties prop) >>>> { >>>> - drmModePropertyBlobPtr orig = drmModeGetPropertyBlob(fd, >>>> id_orig); >>>> - uint32_t id_new; >>>> - >>>> - igt_assert(orig); >>>> - do_or_die(drmModeCreatePropertyBlob(fd, orig->data, >>>> orig- >>>>> length, >>>> - &id_new)); >>>> - drmModeFreePropertyBlob(orig); >>>> + if ((1 << prop) & IGT_PLANE_COORD_CHANGED_MASK) >>>> + return false; >>>> >>>> - return id_new; >>>> -} >>>> - >>>> -#define crtc_set_prop(req, crtc, prop, value) \ >>>> - igt_assert_lt(0, drmModeAtomicAddProperty(req, crtc- >>>>> obj, \ >>>> - crtc->state- >>>>> desc- >>>>> >>>>> props_crtc[prop], \ >>>> - value)); >>>> - >>>> -#define plane_set_prop(req, plane, prop, value) \ >>>> - igt_assert_lt(0, drmModeAtomicAddProperty(req, plane- >>>>> obj, \ >>>> - plane->state- >>>>> desc->props_plane[prop], \ >>>> - value)); >>>> - >>>> -#define do_atomic_commit(fd, req, flags) \ >>>> - do_or_die(drmModeAtomicCommit(fd, req, flags, NULL)); >>>> + if (prop == IGT_PLANE_CRTC_ID || prop == >>>> IGT_PLANE_FB_ID) >>>> + return false; >>>> >>>> -#define do_atomic_commit_err(fd, req, flags, err) { \ >>>> - igt_assert_neq(drmModeAtomicCommit(fd, req, flags, >>>> NULL), >>>> 0); \ >>>> - igt_assert_eq(errno, err); \ >>>> -} >>>> - >>>> -#define crtc_commit_atomic(crtc, plane, req, relax, flags) { \ >>>> - drmModeAtomicSetCursor(req, 0); \ >>>> - crtc_populate_req(crtc, req); \ >>>> - plane_populate_req(plane, req); \ >>>> - do_atomic_commit((crtc)->state->desc->fd, req, flags); \ >>>> - if (!(flags & DRM_MODE_ATOMIC_TEST_ONLY)) { \ >>>> - crtc_check_current_state(crtc, plane, relax); \ >>>> - plane_check_current_state(plane, relax); \ >>>> - } \ >>>> -} >>>> + if (prop == IGT_PLANE_IN_FENCE_FD) >>>> + return false; >>>> >>>> -#define crtc_commit_atomic_err(crtc, plane, crtc_old, plane_old, >>>> req, flags, relax, e) { \ >>>> - drmModeAtomicSetCursor(req, 0); \ >>>> - crtc_populate_req(crtc, req); \ >>>> - plane_populate_req(plane, req); \ >>>> - do_atomic_commit_err((crtc)->state->desc->fd, req, >>>> flags, >>>> e); \ >>>> - crtc_check_current_state(crtc_old, plane_old, relax); \ >>>> - plane_check_current_state(plane_old, relax); \ >>>> + /* Don't care about other properties */ >>>> + return true; >>>> } >>>> >>>> -#define plane_commit_atomic(plane, req, relax) { \ >>>> - drmModeAtomicSetCursor(req, 0); \ >>>> - plane_populate_req(plane, req); \ >>>> - do_atomic_commit((plane)->state->desc->fd, req, 0); \ >>>> - plane_check_current_state(plane, relax); \ >>>> -} >>>> - >>>> -#define plane_commit_atomic_err(plane, plane_old, req, relax, e) >>>> { \ >>>> - drmModeAtomicSetCursor(req, 0); \ >>>> - plane_populate_req(plane, req); \ >>>> - do_atomic_commit_err((plane)->state->desc->fd, req, 0, >>>> e); \ >>>> - plane_check_current_state(plane_old, relax); \ >>>> -} >>>> - >>>> -static void >>>> -connector_get_current_state(struct kms_atomic_connector_state >>>> *connector) >>>> -{ >>>> - drmModeObjectPropertiesPtr props; >>>> - int i; >>>> - >>>> - props = drmModeObjectGetProperties(connector->state- >>>>> desc- >>>>> >>>>> fd, >>>> - connector->obj, >>>> - DRM_MODE_OBJECT_CONNE >>>> CTOR >>>> ); >>>> - igt_assert(props); >>>> - >>>> - for (i = 0; i < props->count_props; i++) { >>>> - uint32_t *prop_ids = connector->state->desc- >>>>> props_connector; >>>> - >>>> - if (props->props[i] == >>>> prop_ids[IGT_CONNECTOR_CRTC_ID]) >>>> - connector->crtc_id = props- >>>>> prop_values[i]; >>>> - } >>>> - drmModeFreeObjectProperties(props); >>>> -} >>>> - >>>> -#if 0 >>>> -/* XXX: Checking this repeatedly actually hangs the GPU. I have >>>> literally no >>>> - * idea why. */ >>>> -static void >>>> -connector_check_current_state(struct kms_atomic_connector_state >>>> *connector) >>>> -{ >>>> - struct kms_atomic_connector_state connector_kernel; >>>> - drmModeConnectorPtr legacy; >>>> - uint32_t crtc_id; >>>> - >>>> - legacy = drmModeGetConnectorCurrent(connector->state- >>>>> desc- >>>>> >>>>> fd, >>>> - connector->obj); >>>> - igt_assert(legacy); >>>> - >>>> - if (legacy->encoder_id) { >>>> - drmModeEncoderPtr legacy_enc; >>>> - >>>> - legacy_enc = drmModeGetEncoder(connector->state- >>>>> desc->fd, >>>> - legacy- >>>>> encoder_id); >>>> - igt_assert(legacy_enc); >>>> - >>>> - crtc_id = legacy_enc->crtc_id; >>>> - drmModeFreeEncoder(legacy_enc); >>>> - } else { >>>> - crtc_id = 0; >>>> - } >>>> - >>>> - igt_assert_eq_u32(crtc_id, connector->crtc_id); >>>> - >>>> - memcpy(&connector_kernel, connector, >>>> sizeof(connector_kernel)); >>>> - connector_get_current_state(&connector_kernel); >>>> - do_or_die(memcmp(&connector_kernel, connector, >>>> - sizeof(connector_kernel))); >>>> - >>>> - drmModeFreeConnector(legacy); >>>> -} >>>> -#endif >>>> - >>>> -static struct kms_atomic_connector_state * >>>> -find_connector(struct kms_atomic_state *state, >>>> - struct kms_atomic_crtc_state *crtc) >>>> +static void plane_get_current_state(igt_plane_t *plane, uint64_t >>>> *values) >>>> { >>>> int i; >>>> >>>> - for (i = 0; i < state->num_connectors; i++) { >>>> - struct kms_atomic_connector_state *connector = >>>> - &state->connectors[i]; >>>> - >>>> - if (!connector->obj) >>>> + for (i = 0; i < IGT_NUM_PLANE_PROPS; i++) { >>>> + if (plane_filter(i)) { >>>> + values[i] = 0; >>>> continue; >>>> - if (crtc && connector->crtc_id != crtc->obj) >>>> - continue; >>>> - >>>> - return connector; >>>> - } >>>> - >>>> - return NULL; >>>> -} >>>> - >>>> -static void plane_populate_req(struct kms_atomic_plane_state >>>> *plane, >>>> - drmModeAtomicReq *req) >>>> -{ >>>> - if (plane->fence_fd) >>>> - plane_set_prop(req, plane, >>>> IGT_PLANE_IN_FENCE_FD, >>>> plane->fence_fd); >>>> - >>>> - plane_set_prop(req, plane, IGT_PLANE_CRTC_ID, plane- >>>>> crtc_id); >>>> - plane_set_prop(req, plane, IGT_PLANE_FB_ID, plane- >>>>> fb_id); >>>> - plane_set_prop(req, plane, IGT_PLANE_SRC_X, plane- >>>>> src_x); >>>> - plane_set_prop(req, plane, IGT_PLANE_SRC_Y, plane- >>>>> src_y); >>>> - plane_set_prop(req, plane, IGT_PLANE_SRC_W, plane- >>>>> src_w); >>>> - plane_set_prop(req, plane, IGT_PLANE_SRC_H, plane- >>>>> src_h); >>>> - plane_set_prop(req, plane, IGT_PLANE_CRTC_X, plane- >>>>> crtc_x); >>>> - plane_set_prop(req, plane, IGT_PLANE_CRTC_Y, plane- >>>>> crtc_y); >>>> - plane_set_prop(req, plane, IGT_PLANE_CRTC_W, plane- >>>>> crtc_w); >>>> - plane_set_prop(req, plane, IGT_PLANE_CRTC_H, plane- >>>>> crtc_h); >>>> -} >>>> - >>>> -static void plane_get_current_state(struct >>>> kms_atomic_plane_state >>>> *plane) >>>> -{ >>>> - struct kms_atomic_desc *desc = plane->state->desc; >>>> - drmModeObjectPropertiesPtr props; >>>> - int i; >>>> - >>>> - props = drmModeObjectGetProperties(desc->fd, plane->obj, >>>> - DRM_MODE_OBJECT_PLANE >>>> ); >>>> - igt_assert(props); >>>> - >>>> - for (i = 0; i < props->count_props; i++) { >>>> - uint32_t *prop_ids = desc->props_plane; >>>> - >>>> - if (props->props[i] == >>>> prop_ids[IGT_PLANE_CRTC_ID]) >>>> - plane->crtc_id = props->prop_values[i]; >>>> - else if (props->props[i] == >>>> prop_ids[IGT_PLANE_FB_ID]) >>>> - plane->fb_id = props->prop_values[i]; >>>> - else if (props->props[i] == >>>> prop_ids[IGT_PLANE_CRTC_X]) >>>> - plane->crtc_x = props->prop_values[i]; >>>> - else if (props->props[i] == >>>> prop_ids[IGT_PLANE_CRTC_Y]) >>>> - plane->crtc_y = props->prop_values[i]; >>>> - else if (props->props[i] == >>>> prop_ids[IGT_PLANE_CRTC_W]) >>>> - plane->crtc_w = props->prop_values[i]; >>>> - else if (props->props[i] == >>>> prop_ids[IGT_PLANE_CRTC_H]) >>>> - plane->crtc_h = props->prop_values[i]; >>>> - else if (props->props[i] == >>>> prop_ids[IGT_PLANE_SRC_X]) >>>> - plane->src_x = props->prop_values[i]; >>>> - else if (props->props[i] == >>>> prop_ids[IGT_PLANE_SRC_Y]) >>>> - plane->src_y = props->prop_values[i]; >>>> - else if (props->props[i] == >>>> prop_ids[IGT_PLANE_SRC_W]) >>>> - plane->src_w = props->prop_values[i]; >>>> - else if (props->props[i] == >>>> prop_ids[IGT_PLANE_SRC_H]) >>>> - plane->src_h = props->prop_values[i]; >>>> - else if (props->props[i] == >>>> prop_ids[IGT_PLANE_TYPE]) { >>>> - int j; >>>> - >>>> - for (j = 0; j < ARRAY_SIZE(desc- >>>>> props_plane_type); j++) { >>>> - if (props->prop_values[i] == >>>> desc- >>>>> props_plane_type[j]) { >>>> - plane->type = j; >>>> - break; >>>> - } >>>> - } >>>> } >>>> - } >>>> >>>> - drmModeFreeObjectProperties(props); >>>> + values[i] = igt_plane_get_prop(plane, i); >>>> + } >>>> } >>>> >>>> -static void plane_check_current_state(struct >>>> kms_atomic_plane_state >>>> *plane, >>>> +static void plane_check_current_state(igt_plane_t *plane, const >>>> uint64_t *values, >>>> enum >>>> kms_atomic_check_relax >>>> relax) >>>> { >>>> drmModePlanePtr legacy; >>>> - struct kms_atomic_plane_state plane_kernel; >>>> + uint64_t current_values[IGT_NUM_PLANE_PROPS]; >>>> + int i; >>>> >>>> - legacy = drmModeGetPlane(plane->state->desc->fd, plane- >>>>> obj); >>>> + legacy = drmModeGetPlane(plane->pipe->display->drm_fd, >>>> plane->drm_plane->plane_id); >>>> igt_assert(legacy); >>>> >>>> - igt_assert_eq_u32(legacy->crtc_id, plane->crtc_id); >>>> + igt_assert_eq_u32(legacy->crtc_id, >>>> values[IGT_PLANE_CRTC_ID]); >>>> >>>> if (!(relax & PLANE_RELAX_FB)) >>>> - igt_assert_eq_u32(legacy->fb_id, plane->fb_id); >>>> + igt_assert_eq_u32(legacy->fb_id, >>>> values[IGT_PLANE_FB_ID]); >>>> >>>> - memcpy(&plane_kernel, plane, sizeof(plane_kernel)); >>>> - plane_get_current_state(&plane_kernel); >>>> + plane_get_current_state(plane, current_values); >>>> >>>> /* Legacy cursor ioctls create their own, unknowable, >>>> internal >>>> * framebuffer which we can't reason about. */ >>>> if (relax & PLANE_RELAX_FB) >>>> - plane_kernel.fb_id = plane->fb_id; >>>> - do_or_die(memcmp(&plane_kernel, plane, >>>> sizeof(plane_kernel))); >>>> + current_values[IGT_PLANE_FB_ID] = >>>> values[IGT_PLANE_FB_ID]; >>>> + >>>> + for (i = 0; i < IGT_NUM_PLANE_PROPS; i++) >>>> + if (!plane_filter(i)) >>>> + igt_assert_eq_u64(current_values[i], >>>> values[i]); >>>> >>>> drmModeFreePlane(legacy); >>>> } >>>> >>>> -static void plane_commit_legacy(struct kms_atomic_plane_state >>>> *plane, >>>> +static void plane_commit(igt_plane_t *plane, enum >>>> igt_commit_style >>>> s, >>>> enum kms_atomic_check_relax >>>> relax) >>>> { >>>> - do_or_die(drmModeSetPlane(plane->state->desc->fd, plane- >>>>> obj, >>>> - plane->crtc_id, >>>> - plane->fb_id, 0, >>>> - plane->crtc_x, plane->crtc_y, >>>> - plane->crtc_w, plane->crtc_h, >>>> - plane->src_x, plane->src_y, >>>> - plane->src_w, plane->src_h)); >>>> - plane_check_current_state(plane, relax); >>>> + igt_display_commit2(plane->pipe->display, s); >>>> + plane_check_current_state(plane, plane->values, relax); >>>> } >>>> >>>> -static struct kms_atomic_plane_state * >>>> -find_plane(struct kms_atomic_state *state, enum plane_type type, >>>> - struct kms_atomic_crtc_state *crtc) >>>> +static void plane_commit_atomic_err(igt_plane_t *plane, >>>> + enum kms_atomic_check_relax >>>> relax, >>>> + int err) >>>> { >>>> - struct kms_atomic_plane_state *ret = NULL; >>>> - int i; >>>> - >>>> - for (i = 0; i < state->num_planes; i++) { >>>> - struct kms_atomic_plane_state *plane = &state- >>>>> planes[i]; >>>> - >>>> - if (!plane->obj) >>>> - continue; >>>> - if (type != NUM_PLANE_TYPE_PROPS && plane->type >>>> != >>>> type) >>>> - continue; >>>> - if (crtc && !(plane->crtc_mask & (1 << crtc- >>>>> idx))) >>>> - continue; >>>> + uint64_t current_values[IGT_NUM_PLANE_PROPS]; >>>> >>>> - plane_get_current_state(plane); >>>> + plane_get_current_state(plane, current_values); >>>> >>>> - /* Try to find a plane that's already on this >>>> CRTC. >>>> In >>>> - * particular, this ensures that for special >>>> (primary/cursor) >>>> - * planes that can be on multiple CRTCs, we find >>>> the >>>> same >>>> - * one that the legacy ioctls will. */ >>>> - if (!crtc || plane->crtc_id == crtc->obj) >>>> - return plane; >>>> - >>>> - ret = plane; >>>> - } >>>> + igt_assert_eq(-err, igt_display_try_commit2(plane->pipe- >>>>> display, COMMIT_ATOMIC)); >>>> >>>> - return ret; >>>> + plane_check_current_state(plane, current_values, relax); >>>> } >>>> >>>> -static void crtc_populate_req(struct kms_atomic_crtc_state >>>> *crtc, >>>> - drmModeAtomicReq *req) >>>> +static bool crtc_filter(enum igt_atomic_crtc_properties prop) >>>> { >>>> - if (crtc->out_fence_ptr) >>>> - crtc_set_prop(req, crtc, IGT_CRTC_OUT_FENCE_PTR, >>>> - to_user_pointer(crtc- >>>>> out_fence_ptr)); >>>> + if (prop == IGT_CRTC_MODE_ID || prop == IGT_CRTC_ACTIVE) >>>> + return false; >>>> >>>> - crtc_set_prop(req, crtc, IGT_CRTC_MODE_ID, crtc- >>>>> mode.id); >>>> - crtc_set_prop(req, crtc, IGT_CRTC_ACTIVE, crtc->active); >>>> + return true; >>>> } >>>> >>>> -static void crtc_get_current_state(struct kms_atomic_crtc_state >>>> *crtc) >>>> +static void crtc_get_current_state(igt_pipe_t *pipe, uint64_t >>>> *values) >>>> { >>>> - drmModeObjectPropertiesPtr props; >>>> int i; >>>> >>>> - props = drmModeObjectGetProperties(crtc->state->desc- >>>>> fd, >>>> crtc->obj, >>>> - DRM_MODE_OBJECT_CRTC) >>>> ; >>>> - igt_assert(props); >>>> - >>>> - for (i = 0; i < props->count_props; i++) { >>>> - uint32_t *prop_ids = crtc->state->desc- >>>>> props_crtc; >>>> - >>>> - if (props->props[i] == >>>> prop_ids[IGT_CRTC_MODE_ID]) { >>>> - drmModePropertyBlobPtr blob; >>>> - >>>> - crtc->mode.id = props->prop_values[i]; >>>> - if (!crtc->mode.id) { >>>> - crtc->mode.len = 0; >>>> - continue; >>>> - } >>>> - >>>> - blob = drmModeGetPropertyBlob(crtc- >>>>> state- >>>>> >>>>> desc->fd, >>>> - crtc- >>>>> mode.id); >>>> - igt_assert(blob); >>>> - igt_assert_eq_u32(blob->length, >>>> - sizeof(struct >>>> drm_mode_modeinfo)); >>>> - >>>> - if (!crtc->mode.data || >>>> - memcmp(crtc->mode.data, blob->data, >>>> blob->length) != 0) >>>> - crtc->mode.data = blob->data; >>>> - crtc->mode.len = blob->length; >>>> - } >>>> - else if (props->props[i] == >>>> prop_ids[IGT_CRTC_ACTIVE]) { >>>> - crtc->active = props->prop_values[i]; >>>> + for (i = 0; i < IGT_NUM_CRTC_PROPS; i++) { >>>> + if (crtc_filter(i)) { >>>> + values[i] = 0; >>>> + continue; >>>> } >>>> - } >>>> >>>> - drmModeFreeObjectProperties(props); >>>> + values[i] = igt_pipe_obj_get_prop(pipe, i); >>>> + } >>>> } >>>> >>>> -static void crtc_check_current_state(struct >>>> kms_atomic_crtc_state >>>> *crtc, >>>> - struct >>>> kms_atomic_plane_state >>>> *primary, >>>> +static void crtc_check_current_state(igt_pipe_t *pipe, >>>> + const uint64_t >>>> *pipe_values, >>>> + const uint64_t >>>> *primary_values, >>>> enum kms_atomic_check_relax >>>> relax) >>>> { >>>> - struct kms_atomic_crtc_state crtc_kernel; >>>> + uint64_t current_pipe_values[IGT_NUM_CRTC_PROPS]; >>>> drmModeCrtcPtr legacy; >>>> + drmModePropertyBlobRes *mode_prop = NULL; >>>> + struct drm_mode_modeinfo *mode = NULL; >>>> >>>> - legacy = drmModeGetCrtc(crtc->state->desc->fd, crtc- >>>>> obj); >>>> - igt_assert(legacy); >>>> - >>>> - igt_assert_eq_u32(legacy->crtc_id, crtc->obj); >>>> - igt_assert_eq_u32(legacy->x, primary->src_x >> 16); >>>> - igt_assert_eq_u32(legacy->y, primary->src_y >> 16); >>>> - >>>> - if (crtc->active) >>>> - igt_assert_eq_u32(legacy->buffer_id, primary- >>>>> fb_id); >>>> - else >>>> - igt_assert_eq_u32(legacy->buffer_id, 0); >>>> + if (pipe_values[IGT_CRTC_MODE_ID]) { >>>> + mode_prop = drmModeGetPropertyBlob(pipe- >>>>> display- >>>>> >>>>> drm_fd, >>>> + pipe_values[I >>>> GT_C >>>> RTC_MODE_ID]); >>>> >>>> - if (legacy->mode_valid) { >>>> - igt_assert_neq(legacy->mode_valid, 0); >>>> - igt_assert_eq(crtc->mode.len, >>>> - sizeof(struct drm_mode_modeinfo)); >>>> - do_or_die(memcmp(&legacy->mode, crtc->mode.data, >>>> - crtc->mode.len)); >>>> - igt_assert_eq(legacy->width, legacy- >>>>> mode.hdisplay); >>>> - igt_assert_eq(legacy->height, legacy- >>>>> mode.vdisplay); >>>> - } else { >>>> - igt_assert_eq(legacy->mode_valid, 0); >>>> - } >>>> + igt_assert(mode_prop); >>>> >>>> - memcpy(&crtc_kernel, crtc, sizeof(crtc_kernel)); >>>> - crtc_get_current_state(&crtc_kernel); >>>> - >>>> - if (crtc_kernel.mode.id != 0) >>>> - igt_assert_eq(crtc_kernel.mode.len, >>>> + igt_assert_eq(mode_prop->length, >>>> sizeof(struct drm_mode_modeinfo)); >>>> - >>>> - /* Optionally relax the check for MODE_ID: using the >>>> legacy >>>> SetCrtc >>>> - * API can potentially change MODE_ID even if the mode >>>> itself remains >>>> - * unchanged. */ >>>> - if (((relax & CRTC_RELAX_MODE) && >>>> - (crtc_kernel.mode.id != crtc->mode.id && >>>> - crtc_kernel.mode.id != 0 && crtc->mode.id != 0)) && >>>> - memcmp(crtc_kernel.mode.data, crtc->mode.data, >>>> - sizeof(struct drm_mode_modeinfo)) == 0) { >>>> - crtc_kernel.mode.id = crtc->mode.id; >>>> - crtc_kernel.mode.data = crtc->mode.data; >>>> - } >>>> - >>>> - do_or_die(memcmp(&crtc_kernel, crtc, >>>> sizeof(crtc_kernel))); >>>> - >>>> - drmModeFreeCrtc(legacy); >>>> -} >>>> - >>>> -static void crtc_commit_legacy(struct kms_atomic_crtc_state >>>> *crtc, >>>> - struct kms_atomic_plane_state >>>> *plane, >>>> - enum kms_atomic_check_relax >>>> relax) >>>> -{ >>>> - drmModeObjectPropertiesPtr props; >>>> - uint32_t *connectors; >>>> - int num_connectors = 0; >>>> - int i; >>>> - >>>> - if (!crtc->active) { >>>> - do_or_die(drmModeSetCrtc(crtc->state->desc->fd, >>>> - crtc->obj, 0, 0, 0, >>>> NULL, >>>> 0, NULL)); >>>> - return; >>>> - } >>>> - >>>> - connectors = calloc(crtc->state->num_connectors, >>>> - sizeof(*connectors)); >>>> - igt_assert(connectors); >>>> - >>>> - igt_assert_neq_u32(crtc->mode.id, 0); >>>> - >>>> - for (i = 0; i < crtc->state->num_connectors; i++) { >>>> - struct kms_atomic_connector_state *connector = >>>> - &crtc->state->connectors[i]; >>>> - >>>> - if (connector->crtc_id != crtc->obj) >>>> - continue; >>>> - >>>> - connectors[num_connectors++] = connector->obj; >>>> + mode = mode_prop->data; >>>> } >>>> >>>> - do_or_die(drmModeSetCrtc(crtc->state->desc->fd, crtc- >>>>> obj, >>>> - plane->fb_id, >>>> - plane->src_x >> 16, plane- >>>>> src_y >> >>>> 16, >>>> - (num_connectors) ? connectors : >>>> NULL, >>>> - num_connectors, >>>> - crtc->mode.data)); >>>> - /* When doing a legacy commit, the core may update >>>> MODE_ID >>>> to be a new >>>> - * blob implicitly created by the legacy request. Hence >>>> we >>>> backfill >>>> - * the value in the state object to ensure they match. >>>> */ >>>> - props = drmModeObjectGetProperties(crtc->state->desc- >>>>> fd, >>>> crtc->obj, >>>> - DRM_MODE_OBJECT_CRTC) >>>> ; >>>> - igt_assert(props); >>>> - >>>> - for (i = 0; i < props->count_props; i++) { >>>> - if (props->props[i] != >>>> - crtc->state->desc- >>>>> props_crtc[IGT_CRTC_MODE_ID]) >>>> - continue; >>>> - crtc->mode.id = props->prop_values[i]; >>>> - break; >>>> - } >>>> + legacy = drmModeGetCrtc(pipe->display->drm_fd, pipe- >>>>> crtc_id); >>>> + igt_assert(legacy); >>>> >>>> - drmModeFreeObjectProperties(props); >>>> + igt_assert_eq_u32(legacy->crtc_id, pipe->crtc_id); >>>> + igt_assert_eq_u32(legacy->x, >>>> primary_values[IGT_PLANE_SRC_X] >>>>>> 16); >>>> + igt_assert_eq_u32(legacy->y, >>>> primary_values[IGT_PLANE_SRC_Y] >>>>>> 16); >>>> >>>> - crtc_check_current_state(crtc, plane, relax); >>>> - plane_check_current_state(plane, relax); >>>> -} >>>> + igt_assert_eq_u32(legacy->buffer_id, >>>> primary_values[IGT_PLANE_FB_ID]); >>>> >>>> -static struct kms_atomic_crtc_state *find_crtc(struct >>>> kms_atomic_state *state, >>>> - bool >>>> must_be_enabled) >>>> -{ >>>> - int i; >>>> + if (legacy->mode_valid) { >>>> + igt_assert(mode_prop); >>>> >>>> - for (i = 0; i < state->num_crtcs; i++) { >>>> - struct kms_atomic_crtc_state *crtc = &state- >>>>> crtcs[i]; >>>> + do_or_die(memcmp(&legacy->mode, mode, >>>> sizeof(*mode))); >>>> >>>> - if (!crtc->obj) >>>> - continue; >>>> - if (must_be_enabled && !crtc->active) >>>> - continue; >>>> + igt_assert_eq(legacy->width, legacy- >>>>> mode.hdisplay); >>>> + igt_assert_eq(legacy->height, legacy- >>>>> mode.vdisplay); >>>> >>>> - crtc_get_current_state(crtc); >>>> - return crtc; >>>> + igt_assert_neq(pipe_values[IGT_CRTC_MODE_ID], >>>> 0); >>>> + } else { >>>> + igt_assert(!mode_prop); >>>> } >>>> >>>> - return NULL; >>>> -} >>>> + crtc_get_current_state(pipe, current_pipe_values); >>>> >>>> -static void fill_obj_props(int fd, uint32_t id, int type, int >>>> num_props, >>>> - const char **prop_names, uint32_t >>>> *prop_ids) >>>> -{ >>>> - drmModeObjectPropertiesPtr props; >>>> - int i, j; >>>> - >>>> - props = drmModeObjectGetProperties(fd, id, type); >>>> - igt_assert(props); >>>> + /* Optionally relax the check for MODE_ID: using the >>>> legacy >>>> SetCrtc >>>> + * API can potentially change MODE_ID even if the mode >>>> itself remains >>>> + * unchanged. */ >>>> + if (relax & CRTC_RELAX_MODE && mode && >>>> current_pipe_values[IGT_CRTC_MODE_ID] && >>>> + current_pipe_values[IGT_CRTC_MODE_ID] != >>>> pipe_values[IGT_CRTC_MODE_ID]) { >>>> + drmModePropertyBlobRes *cur_prop = >>>> + drmModeGetPropertyBlob(pipe->display- >>>>> drm_fd, >>>> + current_pipe_valu >>>> es[I >>>> GT_CRTC_MODE_ID]); >>>> >>>> - for (i = 0; i < props->count_props; i++) { >>>> - drmModePropertyPtr prop = >>>> - drmModeGetProperty(fd, props->props[i]); >>>> + igt_assert(cur_prop); >>>> + igt_assert_eq(cur_prop->length, sizeof(struct >>>> drm_mode_modeinfo)); >>>> >>>> - for (j = 0; j < num_props; j++) { >>>> - if (strcmp(prop->name, prop_names[j]) != >>>> 0) >>>> - continue; >>>> - prop_ids[j] = props->props[i]; >>>> - break; >>>> - } >>>> + if (!memcmp(cur_prop->data, mode, >>>> sizeof(*mode))) >>>> + current_pipe_values[IGT_CRTC_MODE_ID] = >>>> pipe_values[IGT_CRTC_MODE_ID]; >>>> >>>> - drmModeFreeProperty(prop); >>>> + drmModeFreePropertyBlob(cur_prop); >>>> } >>>> >>>> - drmModeFreeObjectProperties(props); >>>> -} >>>> + do_or_die(memcmp(pipe_values, current_pipe_values, >>>> sizeof(current_pipe_values))); >>>> >>>> -static void fill_obj_prop_map(int fd, uint32_t id, int type, >>>> const >>>> char *name, >>>> - int num_enums, const char >>>> **enum_names, >>>> - uint64_t *enum_ids) >>>> -{ >>>> - drmModeObjectPropertiesPtr props; >>>> - int i, j, k; >>>> - >>>> - props = drmModeObjectGetProperties(fd, id, type); >>>> - igt_assert(props); >>>> - >>>> - for (i = 0; i < props->count_props; i++) { >>>> - drmModePropertyPtr prop = >>>> - drmModeGetProperty(fd, props->props[i]); >>>> - >>>> - igt_assert(prop); >>>> - >>>> - if (strcmp(prop->name, name) != 0) { >>>> - drmModeFreeProperty(prop); >>>> - continue; >>>> - } >>>> - >>>> - for (j = 0; j < prop->count_enums; j++) { >>>> - struct drm_mode_property_enum *e = >>>> &prop- >>>>> enums[j]; >>>> - >>>> - for (k = 0; k < num_enums; k++) { >>>> - if (strcmp(e->name, >>>> enum_names[k]) >>>> != 0) >>>> - continue; >>>> - >>>> - enum_ids[k] = e->value; >>>> - break; >>>> - } >>>> - } >>>> - >>>> - drmModeFreeProperty(prop); >>>> - } >>>> + drmModeFreeCrtc(legacy); >>>> + drmModeFreePropertyBlob(mode_prop); >>>> } >>>> >>>> -static void atomic_setup(struct kms_atomic_state *state) >>>> +static void crtc_commit(igt_pipe_t *pipe, igt_plane_t *plane, >>>> + enum igt_commit_style s, >>>> + enum kms_atomic_check_relax relax) >>>> { >>>> - struct kms_atomic_desc *desc = state->desc; >>>> - drmModeResPtr res; >>>> - drmModePlaneResPtr res_plane; >>>> - int i; >>>> - >>>> - desc->fd = drm_open_driver_master(DRIVER_ANY); >>>> - igt_assert_fd(desc->fd); >>>> - >>>> - igt_skip_on(drmSetClientCap(desc->fd, >>>> DRM_CLIENT_CAP_ATOMIC, >>>> 1)); >>>> - >>>> - res = drmModeGetResources(desc->fd); >>>> - res_plane = drmModeGetPlaneResources(desc->fd); >>>> - igt_assert(res); >>>> - igt_assert(res_plane); >>>> - >>>> - igt_assert_lt(0, res->count_crtcs); >>>> - state->num_crtcs = res->count_crtcs; >>>> - state->crtcs = calloc(state->num_crtcs, sizeof(*state- >>>>> crtcs)); >>>> - igt_assert(state->crtcs); >>>> - >>>> - igt_assert_lt(0, res_plane->count_planes); >>>> - state->num_planes = res_plane->count_planes; >>>> - state->planes = calloc(state->num_planes, sizeof(*state- >>>>> planes)); >>>> - igt_assert(state->planes); >>>> - >>>> - igt_assert_lt(0, res->count_connectors); >>>> - state->num_connectors = res->count_connectors; >>>> - state->connectors = calloc(state->num_connectors, >>>> - sizeof(*state->connectors)); >>>> - igt_assert(state->connectors); >>>> - >>>> - fill_obj_props(desc->fd, res->crtcs[0], >>>> - DRM_MODE_OBJECT_CRTC, IGT_NUM_CRTC_PROPS, >>>> - igt_crtc_prop_names, desc->props_crtc); >>>> - >>>> - fill_obj_props(desc->fd, res_plane->planes[0], >>>> - DRM_MODE_OBJECT_PLANE, >>>> IGT_NUM_PLANE_PROPS, >>>> - igt_plane_prop_names, desc->props_plane); >>>> - fill_obj_prop_map(desc->fd, res_plane->planes[0], >>>> - DRM_MODE_OBJECT_PLANE, "type", >>>> - NUM_PLANE_TYPE_PROPS, >>>> plane_type_prop_names, >>>> - desc->props_plane_type); >>>> - >>>> - fill_obj_props(desc->fd, res->connectors[0], >>>> - DRM_MODE_OBJECT_CONNECTOR, >>>> IGT_NUM_CONNECTOR_PROPS, >>>> - igt_connector_prop_names, desc- >>>>> props_connector); >>>> - >>>> - for (i = 0; i < state->num_crtcs; i++) { >>>> - struct kms_atomic_crtc_state *crtc = &state- >>>>> crtcs[i]; >>>> - >>>> - crtc->state = state; >>>> - crtc->obj = res->crtcs[i]; >>>> - crtc->idx = i; >>>> - crtc_get_current_state(crtc); >>>> - >>>> - /* The blob pointed to by MODE_ID could well be >>>> transient, >>>> - * and lose its last reference as we switch away >>>> from it. >>>> - * Duplicate the blob here so we have a >>>> reference we >>>> know we >>>> - * own. */ >>>> - if (crtc->mode.id != 0) >>>> - crtc->mode.id = blob_duplicate(desc->fd, >>>> crtc- >>>>> mode.id); >>>> - } >>>> + igt_display_commit2(pipe->display, s); >>>> >>>> - for (i = 0; i < state->num_planes; i++) { >>>> - drmModePlanePtr plane = >>>> - drmModeGetPlane(desc->fd, res_plane- >>>>> planes[i]); >>>> - igt_assert(plane); >>>> - >>>> - state->planes[i].state = state; >>>> - state->planes[i].obj = res_plane->planes[i]; >>>> - state->planes[i].crtc_mask = plane- >>>>> possible_crtcs; >>>> - plane_get_current_state(&state->planes[i]); >>>> - } >>>> - >>>> - for (i = 0; i < state->num_connectors; i++) { >>>> - state->connectors[i].state = state; >>>> - state->connectors[i].obj = res->connectors[i]; >>>> - connector_get_current_state(&state- >>>>> connectors[i]); >>>> - } >>>> - >>>> - drmModeFreePlaneResources(res_plane); >>>> - drmModeFreeResources(res); >>>> + crtc_check_current_state(pipe, pipe->values, plane- >>>>> values, >>>> relax); >>>> + plane_check_current_state(plane, plane->values, relax); >>>> } >>>> >>>> -static struct kms_atomic_state * >>>> -atomic_state_dup(const struct kms_atomic_state *state) >>>> +static void crtc_commit_atomic_flags_err(igt_pipe_t *pipe, >>>> igt_plane_t *plane, >>>> + unsigned flags, >>>> + enum >>>> kms_atomic_check_relax >>>> relax, >>>> + int err) >>>> { >>>> - struct kms_atomic_state *ret = calloc(1, sizeof(*ret)); >>>> - >>>> - igt_assert(ret); >>>> - *ret = *state; >>>> + uint64_t current_pipe_values[IGT_NUM_CRTC_PROPS]; >>>> + uint64_t current_plane_values[IGT_NUM_PLANE_PROPS]; >>>> >>>> - ret->crtcs = calloc(ret->num_crtcs, sizeof(*ret- >>>>> crtcs)); >>>> - igt_assert(ret->crtcs); >>>> - memcpy(ret->crtcs, state->crtcs, ret->num_crtcs * >>>> sizeof(*ret->crtcs)); >>>> + crtc_get_current_state(pipe, current_pipe_values); >>>> + plane_get_current_state(plane, current_plane_values); >>>> >>>> - ret->planes = calloc(ret->num_planes, sizeof(*ret- >>>>> planes)); >>>> - igt_assert(ret->planes); >>>> - memcpy(ret->planes, state->planes, >>>> - ret->num_planes * sizeof(*ret->planes)); >>>> + igt_assert_eq(-err, igt_display_try_commit_atomic(pipe- >>>>> display, flags, NULL)); >>>> >>>> - ret->connectors = calloc(ret->num_connectors, >>>> sizeof(*ret- >>>>> connectors)); >>>> - igt_assert(ret->connectors); >>>> - memcpy(ret->connectors, state->connectors, >>>> - ret->num_connectors * sizeof(*ret->connectors)); >>>> - >>>> - return ret; >>>> + crtc_check_current_state(pipe, current_pipe_values, >>>> current_plane_values, relax); >>>> + plane_check_current_state(plane, current_plane_values, >>>> relax); >>>> } >>>> >>>> -static void atomic_state_free(struct kms_atomic_state *state) >>>> -{ >>>> - free(state->crtcs); >>>> - free(state->planes); >>>> - free(state->connectors); >>>> - free(state); >>>> -} >>>> +#define crtc_commit_atomic_err(pipe, plane, relax, err) \ >>>> + crtc_commit_atomic_flags_err(pipe, plane, >>>> DRM_MODE_ATOMIC_ALLOW_MODESET, relax, err) >>>> >>>> -static uint32_t plane_get_igt_format(struct >>>> kms_atomic_plane_state >>>> *plane) >>>> +static uint32_t plane_get_igt_format(igt_plane_t *plane) >>>> { >>>> drmModePlanePtr plane_kms; >>>> const uint32_t *igt_formats; >>>> - uint32_t ret = 0; >>>> int num_igt_formats; >>>> int i; >>>> >>>> - plane_kms = drmModeGetPlane(plane->state->desc->fd, >>>> plane- >>>>> obj); >>>> - igt_assert(plane_kms); >>>> + plane_kms = plane->drm_plane; >>>> >>>> igt_get_all_cairo_formats(&igt_formats, >>>> &num_igt_formats); >>>> for (i = 0; i < num_igt_formats; i++) { >>>> int j; >>>> >>>> for (j = 0; j < plane_kms->count_formats; j++) { >>>> - if (plane_kms->formats[j] == >>>> igt_formats[i]) >>>> { >>>> - ret = plane_kms->formats[j]; >>>> - break; >>>> - } >>>> + if (plane_kms->formats[j] == >>>> igt_formats[i]) >>>> + return plane_kms->formats[j]; >>>> } >>>> } >>>> >>>> - drmModeFreePlane(plane_kms); >>>> - return ret; >>>> + return 0; >>>> } >>>> >>>> static void >>>> -set_dpms(int fd, int mode) >>>> +set_dpms(igt_output_t *output, int mode) >>>> { >>>> - int i; >>>> - drmModeConnector *connector; >>>> - uint32_t id; >>>> - drmModeRes *resources = drmModeGetResources(fd); >>>> - >>>> - for (i = 0; i < resources->count_connectors; i++) { >>>> - id = resources->connectors[i]; >>>> - >>>> - connector = drmModeGetConnectorCurrent(fd, id); >>>> - >>>> - kmstest_set_connector_dpms(fd, connector, mode); >>>> - >>>> - drmModeFreeConnector(connector); >>>> - } >>>> + do_or_die(drmModeConnectorSetProperty(output->display- >>>>> drm_fd, output->id, >>>> + output- >>>>> props[IGT_CONNECTOR_DPMS], mode)); >>>> } >>>> >>>> -static void plane_overlay(struct kms_atomic_crtc_state *crtc, >>>> - struct kms_atomic_plane_state >>>> *plane_old) >>>> +static void plane_overlay(igt_pipe_t *pipe, igt_output_t >>>> *output, >>>> igt_plane_t *plane) >>>> { >>>> - struct drm_mode_modeinfo *mode = crtc->mode.data; >>>> - struct kms_atomic_plane_state plane = *plane_old; >>>> - uint32_t format = plane_get_igt_format(&plane); >>>> - drmModeAtomicReq *req = drmModeAtomicAlloc(); >>>> + drmModeModeInfo *mode = igt_output_get_mode(output); >>>> + uint32_t format = plane_get_igt_format(plane); >>>> struct igt_fb fb; >>>> + uint32_t w = mode->hdisplay / 2; >>>> + uint32_t h = mode->vdisplay / 2; >>>> >>>> - igt_require(req); >>>> igt_require(format != 0); >>>> >>>> - plane.src_x = 0; >>>> - plane.src_y = 0; >>>> - plane.src_w = (mode->hdisplay / 2) << 16; >>>> - plane.src_h = (mode->vdisplay / 2) << 16; >>>> - plane.crtc_x = mode->hdisplay / 4; >>>> - plane.crtc_y = mode->vdisplay / 4; >>>> - plane.crtc_w = mode->hdisplay / 2; >>>> - plane.crtc_h = mode->vdisplay / 2; >>>> - plane.crtc_id = crtc->obj; >>>> - plane.fb_id = igt_create_pattern_fb(plane.state->desc- >>>>> fd, >>>> - plane.crtc_w, >>>> plane.crtc_h, >>>> - format, >>>> I915_TILING_NONE, &fb); >>>> + igt_create_pattern_fb(pipe->display->drm_fd, w, h, >>>> + format, I915_TILING_NONE, &fb); >>>> + >>>> + igt_plane_set_fb(plane, &fb); >>>> + igt_plane_set_position(plane, w/2, h/2); >>>> >>>> /* Enable the overlay plane using the atomic API, and >>>> double-check >>>> * state is what we think it should be. */ >>>> - plane_commit_atomic(&plane, req, ATOMIC_RELAX_NONE); >>>> + plane_commit(plane, COMMIT_ATOMIC, ATOMIC_RELAX_NONE); >>>> >>>> /* Disable the plane and check the state matches the >>>> old. */ >>>> - plane_commit_atomic(plane_old, req, ATOMIC_RELAX_NONE); >>>> + igt_plane_set_fb(plane, NULL); >>>> + igt_plane_set_position(plane, 0, 0); >>>> + plane_commit(plane, COMMIT_ATOMIC, ATOMIC_RELAX_NONE); >>>> >>>> /* Re-enable the plane through the legacy plane API, and >>>> verify through >>>> * atomic. */ >>>> - plane_commit_legacy(&plane, ATOMIC_RELAX_NONE); >>>> + igt_plane_set_fb(plane, &fb); >>>> + igt_plane_set_position(plane, w/2, h/2); >>>> + plane_commit(plane, COMMIT_LEGACY, ATOMIC_RELAX_NONE); >>>> >>>> /* Restore the plane to its original settings through >>>> the >>>> legacy plane >>>> * API, and verify through atomic. */ >>>> - plane_commit_legacy(plane_old, ATOMIC_RELAX_NONE); >>>> + igt_plane_set_fb(plane, NULL); >>>> + igt_plane_set_position(plane, 0, 0); >>>> + plane_commit(plane, COMMIT_LEGACY, ATOMIC_RELAX_NONE); >>>> >>>> - drmModeAtomicFree(req); >>>> + igt_remove_fb(pipe->display->drm_fd, &fb); >>>> } >>>> >>>> -static void plane_primary(struct kms_atomic_crtc_state *crtc, >>>> - struct kms_atomic_plane_state >>>> *plane_old) >>>> +static void plane_primary(igt_pipe_t *pipe, igt_plane_t *plane, >>>> struct igt_fb *fb) >>>> { >>>> - struct drm_mode_modeinfo *mode = crtc->mode.data; >>>> - struct kms_atomic_plane_state plane = *plane_old; >>>> - uint32_t format = plane_get_igt_format(&plane); >>>> - drmModeAtomicReq *req = drmModeAtomicAlloc(); >>>> - struct igt_fb fb; >>>> - uint32_t flags = 0; >>>> - int ret; >>>> - >>>> - igt_require(format != 0); >>>> + struct igt_fb fb2; >>>> >>>> - plane.src_x = 0; >>>> - plane.src_y = 0; >>>> - plane.src_w = mode->hdisplay << 16; >>>> - plane.src_h = mode->vdisplay << 16; >>>> - plane.crtc_x = 0; >>>> - plane.crtc_y = 0; >>>> - plane.crtc_w = mode->hdisplay; >>>> - plane.crtc_h = mode->vdisplay; >>>> - plane.crtc_id = crtc->obj; >>>> - plane.fb_id = igt_create_pattern_fb(plane.state->desc- >>>>> fd, >>>> - plane.crtc_w, >>>> plane.crtc_h, >>>> - format, >>>> I915_TILING_NONE, &fb); >>>> - >>>> - drmModeAtomicSetCursor(req, 0); >>>> - crtc_populate_req(crtc, req); >>>> - plane_populate_req(&plane, req); >>>> - ret = drmModeAtomicCommit(crtc->state->desc->fd, req, >>>> - DRM_MODE_ATOMIC_TEST_ONLY, >>>> NULL); >>>> - /* Try harder in case the failure is caused by >>>> disallowing >>>> modeset. */ >>>> - if (ret == -EINVAL) >>>> - flags |= DRM_MODE_ATOMIC_ALLOW_MODESET; >>>> + igt_create_color_pattern_fb(pipe->display->drm_fd, >>>> + fb->width, fb->height, >>>> + fb->drm_format, >>>> I915_TILING_NONE, >>>> + 0.2, 0.2, 0.2, &fb2); >>>> >>>> /* Flip the primary plane using the atomic API, and >>>> double- >>>> check >>>> * state is what we think it should be. */ >>>> - crtc_commit_atomic(crtc, &plane, req, ATOMIC_RELAX_NONE, >>>> flags); >>>> + igt_plane_set_fb(plane, &fb2); >>>> + crtc_commit(pipe, plane, COMMIT_ATOMIC, >>>> ATOMIC_RELAX_NONE); >>>> >>>> /* Restore the primary plane and check the state matches >>>> the >>>> old. */ >>>> - crtc_commit_atomic(crtc, plane_old, req, >>>> ATOMIC_RELAX_NONE, >>>> flags); >>>> + igt_plane_set_fb(plane, fb); >>>> + crtc_commit(pipe, plane, COMMIT_ATOMIC, >>>> ATOMIC_RELAX_NONE); >>>> >>>> - /* Re-enable the plane through the legacy CRTC/primary- >>>> plane >>>> API, and >>>> + /* Set the plane through the legacy CRTC/primary-plane >>>> API, >>>> and >>>> * verify through atomic. */ >>>> - crtc_commit_legacy(crtc, &plane, CRTC_RELAX_MODE); >>>> + igt_plane_set_fb(plane, &fb2); >>>> + crtc_commit(pipe, plane, COMMIT_LEGACY, >>>> CRTC_RELAX_MODE); >>>> >>>> /* Restore the plane to its original settings through >>>> the >>>> legacy CRTC >>>> * API, and verify through atomic. */ >>>> - crtc_commit_legacy(crtc, plane_old, CRTC_RELAX_MODE); >>>> - >>>> - /* Finally, restore to the original state. */ >>>> - crtc_commit_atomic(crtc, plane_old, req, >>>> ATOMIC_RELAX_NONE, >>>> flags); >>>> + igt_plane_set_fb(plane, fb); >>>> + crtc_commit(pipe, plane, COMMIT_LEGACY, >>>> CRTC_RELAX_MODE); >>>> >>>> - drmModeAtomicFree(req); >>>> + /* Set the plane through the universal setplane API, and >>>> + * verify through atomic. */ >>>> + igt_plane_set_fb(plane, &fb2); >>>> + plane_commit(plane, COMMIT_UNIVERSAL, >>>> ATOMIC_RELAX_NONE); >>>> } >>>> >>>> /* test to ensure that DRM_MODE_ATOMIC_TEST_ONLY really only >>>> touches >>>> the >>>> * free-standing state objects and nothing else. >>>> */ >>>> -static void test_only(struct kms_atomic_crtc_state *crtc, >>>> - struct kms_atomic_plane_state *plane_old) >>>> +static void test_only(igt_pipe_t *pipe_obj, >>>> + igt_plane_t *primary, >>>> + igt_output_t *output) >>>> { >>>> - struct drm_mode_modeinfo *mode = crtc->mode.data; >>>> - struct kms_atomic_plane_state plane = *plane_old; >>>> - uint32_t format = plane_get_igt_format(&plane); >>>> - drmModeAtomicReq *req = drmModeAtomicAlloc(); >>>> + drmModeModeInfo *mode = igt_output_get_mode(output); >>>> + uint32_t format = plane_get_igt_format(primary); >>>> struct igt_fb fb; >>>> - int ret; >>>> + uint64_t old_plane_values[IGT_NUM_PLANE_PROPS], >>>> old_crtc_values[IGT_NUM_CRTC_PROPS]; >>>> >>>> igt_require(format != 0); >>>> >>>> - plane.src_x = 0; >>>> - plane.src_y = 0; >>>> - plane.src_w = mode->hdisplay << 16; >>>> - plane.src_h = mode->vdisplay << 16; >>>> - plane.crtc_x = 0; >>>> - plane.crtc_y = 0; >>>> - plane.crtc_w = mode->hdisplay; >>>> - plane.crtc_h = mode->vdisplay; >>>> - plane.crtc_id = crtc->obj; >>>> - plane.fb_id = igt_create_pattern_fb(plane.state->desc- >>>>> fd, >>>> - plane.crtc_w, >>>> plane.crtc_h, >>>> - format, >>>> I915_TILING_NONE, &fb); >>>> - >>>> - drmModeAtomicSetCursor(req, 0); >>>> - crtc_populate_req(crtc, req); >>>> - plane_populate_req(&plane, req); >>>> - ret = drmModeAtomicCommit(crtc->state->desc->fd, req, >>>> - DRM_MODE_ATOMIC_TEST_ONLY, >>>> NULL); >>>> - >>>> - igt_assert_eq(ret, 0); >>>> - >>>> - /* go through dpms off/on cycle */ >>>> - set_dpms(crtc->state->desc->fd, DRM_MODE_DPMS_OFF); >>>> - set_dpms(crtc->state->desc->fd, DRM_MODE_DPMS_ON); >>>> - >>>> - /* check the state */ >>>> - crtc_check_current_state(crtc, plane_old, >>>> ATOMIC_RELAX_NONE); >>>> - plane_check_current_state(plane_old, ATOMIC_RELAX_NONE); >>>> - >>>> - /* Re-enable the plane through the legacy CRTC/primary- >>>> plane >>>> API, and >>>> - * verify through atomic. */ >>>> - crtc_commit_legacy(crtc, plane_old, CRTC_RELAX_MODE); >>>> + plane_get_current_state(primary, old_plane_values); >>>> + crtc_get_current_state(pipe_obj, old_crtc_values); >>>> + >>>> + igt_assert(!old_crtc_values[IGT_CRTC_MODE_ID]); >>>> + >>>> + igt_create_pattern_fb(pipe_obj->display->drm_fd, >>>> + mode->hdisplay, mode->vdisplay, >>>> + format, I915_TILING_NONE, &fb); >>>> + igt_plane_set_fb(primary, &fb); >>>> + igt_output_set_pipe(output, pipe_obj->pipe); >>>> + >>>> + igt_display_commit_atomic(pipe_obj->display, >>>> DRM_MODE_ATOMIC_TEST_ONLY | DRM_MODE_ATOMIC_ALLOW_MODESET, NULL); >>>> + >>>> + /* check the state, should still be old state */ >>>> + crtc_check_current_state(pipe_obj, old_crtc_values, >>>> old_plane_values, ATOMIC_RELAX_NONE); >>>> + plane_check_current_state(primary, old_plane_values, >>>> ATOMIC_RELAX_NONE); >>>> + >>>> + /* >>>> + * Enable the plane through the legacy CRTC/primary- >>>> plane >>>> API, and >>>> + * verify through atomic. >>>> + */ >>>> + crtc_commit(pipe_obj, primary, COMMIT_LEGACY, >>>> CRTC_RELAX_MODE); >>>> + >>>> + /* Same for disable.. */ >>>> + plane_get_current_state(primary, old_plane_values); >>>> + crtc_get_current_state(pipe_obj, old_crtc_values); >>>> + >>>> + igt_plane_set_fb(primary, NULL); >>>> + igt_output_set_pipe(output, PIPE_NONE); >>>> + >>>> + igt_display_commit_atomic(pipe_obj->display, >>>> DRM_MODE_ATOMIC_TEST_ONLY | DRM_MODE_ATOMIC_ALLOW_MODESET, NULL); >>>> >>>> - drmModeAtomicFree(req); >>>> + /* for extra stress, go through dpms off/on cycle */ >>>> + set_dpms(output, DRM_MODE_DPMS_OFF); >>>> + set_dpms(output, DRM_MODE_DPMS_ON); >>> There is this library function 'kmstest_set_connector_dpms()'. >>> Could we >>> utilize this function here instead? >> Sure, I never understood what the dpms call was supposed to expose >> though.. >> >> Want me to resend or is replacing the call with >> kmstest_set_connector_dpms(s, output->config.connector, >> DRM_MODE_DPMS_OFF); enough? > Well, my point of view is that we should use library functions as much > as possible. I guess that's the reason why we have the libraries in the > first place. So a vote for a replacement. > Thanks for review and irc r-b with fixes, pushed. :) _______________________________________________ Intel-gfx mailing list Intel-gfx@xxxxxxxxxxxxxxxxxxxxx https://lists.freedesktop.org/mailman/listinfo/intel-gfx