From: Sam McNally <sammc@chromium.org> To: LKML <linux-kernel@vger.kernel.org> Cc: Lyude Paul <lyude@redhat.com>, Hans Verkuil <hverkuil@xs4all.nl>, Sam McNally <sammc@chromium.org>, Daniel Vetter <daniel@ffwll.ch>, David Airlie <airlied@linux.ie>, Lee Jones <lee.jones@linaro.org>, Maarten Lankhorst <maarten.lankhorst@linux.intel.com>, Maxime Ripard <mripard@kernel.org>, Sean Paul <seanpaul@chromium.org>, Thomas Zimmermann <tzimmermann@suse.de>, dri-devel@lists.freedesktop.org Subject: [PATCH v7 1/3] drm/dp_mst: Add self-tests for up requests Date: Mon, 28 Jun 2021 19:17:01 +1000 [thread overview] Message-ID: <20210628191617.v7.1.I6f50a7996687318ba298c24a3663c8be7dd432c7@changeid> (raw) Up requests are decoded by drm_dp_sideband_parse_req(), which operates on a drm_dp_sideband_msg_rx, unlike down requests. Expand the existing self-test helper sideband_msg_req_encode_decode() to copy the message contents and length from a drm_dp_sideband_msg_tx to drm_dp_sideband_msg_rx and use the parse function under test in place of decode. Add an additional helper for testing clearly-invalid up messages, verifying that parse rejects them. Add support for currently-supported up requests to drm_dp_dump_sideband_msg_req_body(); add support to drm_dp_encode_sideband_req() to allow encoding for the self-tests. Add self-tests for CONNECTION_STATUS_NOTIFY and RESOURCE_STATUS_NOTIFY. Reviewed-by: Lyude Paul <lyude@redhat.com> Signed-off-by: Sam McNally <sammc@chromium.org> --- (no changes since v5) Changes in v5: - Set mock device name to more clearly attribute error/debug logging to the self-test, in particular for cases where failures are expected Changes in v4: - New in v4 drivers/gpu/drm/drm_dp_mst_topology.c | 54 ++++++- .../gpu/drm/drm_dp_mst_topology_internal.h | 4 + .../drm/selftests/test-drm_dp_mst_helper.c | 149 ++++++++++++++++-- 3 files changed, 192 insertions(+), 15 deletions(-) diff --git a/drivers/gpu/drm/drm_dp_mst_topology.c b/drivers/gpu/drm/drm_dp_mst_topology.c index ad0795afc21c..ee58f6517482 100644 --- a/drivers/gpu/drm/drm_dp_mst_topology.c +++ b/drivers/gpu/drm/drm_dp_mst_topology.c @@ -445,6 +445,37 @@ drm_dp_encode_sideband_req(const struct drm_dp_sideband_msg_req_body *req, idx++; } break; + case DP_CONNECTION_STATUS_NOTIFY: { + const struct drm_dp_connection_status_notify *msg; + + msg = &req->u.conn_stat; + buf[idx] = (msg->port_number & 0xf) << 4; + idx++; + memcpy(&raw->msg[idx], msg->guid, 16); + idx += 16; + raw->msg[idx] = 0; + raw->msg[idx] |= msg->legacy_device_plug_status ? BIT(6) : 0; + raw->msg[idx] |= msg->displayport_device_plug_status ? BIT(5) : 0; + raw->msg[idx] |= msg->message_capability_status ? BIT(4) : 0; + raw->msg[idx] |= msg->input_port ? BIT(3) : 0; + raw->msg[idx] |= FIELD_PREP(GENMASK(2, 0), msg->peer_device_type); + idx++; + break; + } + case DP_RESOURCE_STATUS_NOTIFY: { + const struct drm_dp_resource_status_notify *msg; + + msg = &req->u.resource_stat; + buf[idx] = (msg->port_number & 0xf) << 4; + idx++; + memcpy(&raw->msg[idx], msg->guid, 16); + idx += 16; + buf[idx] = (msg->available_pbn & 0xff00) >> 8; + idx++; + buf[idx] = (msg->available_pbn & 0xff); + idx++; + break; + } } raw->cur_len = idx; } @@ -675,6 +706,22 @@ drm_dp_dump_sideband_msg_req_body(const struct drm_dp_sideband_msg_req_body *req req->u.enc_status.stream_behavior, req->u.enc_status.valid_stream_behavior); break; + case DP_CONNECTION_STATUS_NOTIFY: + P("port=%d guid=%*ph legacy=%d displayport=%d messaging=%d input=%d peer_type=%d", + req->u.conn_stat.port_number, + (int)ARRAY_SIZE(req->u.conn_stat.guid), req->u.conn_stat.guid, + req->u.conn_stat.legacy_device_plug_status, + req->u.conn_stat.displayport_device_plug_status, + req->u.conn_stat.message_capability_status, + req->u.conn_stat.input_port, + req->u.conn_stat.peer_device_type); + break; + case DP_RESOURCE_STATUS_NOTIFY: + P("port=%d guid=%*ph pbn=%d", + req->u.resource_stat.port_number, + (int)ARRAY_SIZE(req->u.resource_stat.guid), req->u.resource_stat.guid, + req->u.resource_stat.available_pbn); + break; default: P("???\n"); break; @@ -1119,9 +1166,9 @@ static bool drm_dp_sideband_parse_resource_status_notify(const struct drm_dp_mst return false; } -static bool drm_dp_sideband_parse_req(const struct drm_dp_mst_topology_mgr *mgr, - struct drm_dp_sideband_msg_rx *raw, - struct drm_dp_sideband_msg_req_body *msg) +bool drm_dp_sideband_parse_req(const struct drm_dp_mst_topology_mgr *mgr, + struct drm_dp_sideband_msg_rx *raw, + struct drm_dp_sideband_msg_req_body *msg) { memset(msg, 0, sizeof(*msg)); msg->req_type = (raw->msg[0] & 0x7f); @@ -1137,6 +1184,7 @@ static bool drm_dp_sideband_parse_req(const struct drm_dp_mst_topology_mgr *mgr, return false; } } +EXPORT_SYMBOL_FOR_TESTS_ONLY(drm_dp_sideband_parse_req); static void build_dpcd_write(struct drm_dp_sideband_msg_tx *msg, u8 port_num, u32 offset, u8 num_bytes, u8 *bytes) diff --git a/drivers/gpu/drm/drm_dp_mst_topology_internal.h b/drivers/gpu/drm/drm_dp_mst_topology_internal.h index eeda9a61c657..0356a2e0dba1 100644 --- a/drivers/gpu/drm/drm_dp_mst_topology_internal.h +++ b/drivers/gpu/drm/drm_dp_mst_topology_internal.h @@ -21,4 +21,8 @@ void drm_dp_dump_sideband_msg_req_body(const struct drm_dp_sideband_msg_req_body *req, int indent, struct drm_printer *printer); +bool +drm_dp_sideband_parse_req(const struct drm_dp_mst_topology_mgr *mgr, + struct drm_dp_sideband_msg_rx *raw, + struct drm_dp_sideband_msg_req_body *msg); #endif /* !_DRM_DP_MST_HELPER_INTERNAL_H_ */ diff --git a/drivers/gpu/drm/selftests/test-drm_dp_mst_helper.c b/drivers/gpu/drm/selftests/test-drm_dp_mst_helper.c index 6b4759ed6bfd..7bbeb1e5bc97 100644 --- a/drivers/gpu/drm/selftests/test-drm_dp_mst_helper.c +++ b/drivers/gpu/drm/selftests/test-drm_dp_mst_helper.c @@ -13,6 +13,10 @@ #include "../drm_dp_mst_topology_internal.h" #include "test-drm_modeset_common.h" +static void mock_release(struct device *dev) +{ +} + int igt_dp_mst_calc_pbn_mode(void *ignored) { int pbn, i; @@ -120,27 +124,60 @@ sideband_msg_req_equal(const struct drm_dp_sideband_msg_req_body *in, static bool sideband_msg_req_encode_decode(struct drm_dp_sideband_msg_req_body *in) { - struct drm_dp_sideband_msg_req_body *out; + struct drm_dp_sideband_msg_req_body *out = NULL; struct drm_printer p = drm_err_printer(PREFIX_STR); - struct drm_dp_sideband_msg_tx *txmsg; + struct drm_dp_sideband_msg_tx *txmsg = NULL; + struct drm_dp_sideband_msg_rx *rxmsg = NULL; + struct drm_dp_mst_topology_mgr *mgr = NULL; int i, ret; - bool result = true; + bool result = false; out = kzalloc(sizeof(*out), GFP_KERNEL); if (!out) - return false; + goto out; txmsg = kzalloc(sizeof(*txmsg), GFP_KERNEL); if (!txmsg) - return false; + goto out; - drm_dp_encode_sideband_req(in, txmsg); - ret = drm_dp_decode_sideband_req(txmsg, out); - if (ret < 0) { - drm_printf(&p, "Failed to decode sideband request: %d\n", - ret); - result = false; + rxmsg = kzalloc(sizeof(*rxmsg), GFP_KERNEL); + if (!rxmsg) goto out; + + mgr = kzalloc(sizeof(*mgr), GFP_KERNEL); + if (!mgr) + goto out; + + mgr->dev = kzalloc(sizeof(*mgr->dev), GFP_KERNEL); + if (!mgr->dev) + goto out; + + mgr->dev->dev = kzalloc(sizeof(*mgr->dev->dev), GFP_KERNEL); + if (!mgr->dev->dev) + goto out; + + mgr->dev->dev->release = mock_release; + mgr->dev->dev->init_name = PREFIX_STR; + device_initialize(mgr->dev->dev); + + drm_dp_encode_sideband_req(in, txmsg); + switch (in->req_type) { + case DP_CONNECTION_STATUS_NOTIFY: + case DP_RESOURCE_STATUS_NOTIFY: + memcpy(&rxmsg->msg, txmsg->msg, ARRAY_SIZE(rxmsg->msg)); + rxmsg->curlen = txmsg->cur_len; + if (!drm_dp_sideband_parse_req(mgr, rxmsg, out)) { + drm_printf(&p, "Failed to decode sideband request\n"); + goto out; + } + break; + default: + ret = drm_dp_decode_sideband_req(txmsg, out); + if (ret < 0) { + drm_printf(&p, "Failed to decode sideband request: %d\n", ret); + goto out; + } + break; } if (!sideband_msg_req_equal(in, out)) { @@ -148,9 +185,9 @@ sideband_msg_req_encode_decode(struct drm_dp_sideband_msg_req_body *in) drm_dp_dump_sideband_msg_req_body(in, 1, &p); drm_printf(&p, "Got:\n"); drm_dp_dump_sideband_msg_req_body(out, 1, &p); - result = false; goto out; } + result = true; switch (in->req_type) { case DP_REMOTE_DPCD_WRITE: @@ -171,6 +208,66 @@ sideband_msg_req_encode_decode(struct drm_dp_sideband_msg_req_body *in) out: kfree(out); kfree(txmsg); + kfree(rxmsg); + if (mgr) { + if (mgr->dev) { + put_device(mgr->dev->dev); + kfree(mgr->dev); + } + kfree(mgr); + } + return result; +} + +static bool +sideband_msg_req_parse(int req_type) +{ + struct drm_dp_sideband_msg_req_body *out = NULL; + struct drm_printer p = drm_err_printer(PREFIX_STR); + struct drm_dp_sideband_msg_rx *rxmsg = NULL; + struct drm_dp_mst_topology_mgr *mgr = NULL; + bool result = false; + + out = kzalloc(sizeof(*out), GFP_KERNEL); + if (!out) + goto out; + + rxmsg = kzalloc(sizeof(*rxmsg), GFP_KERNEL); + if (!rxmsg) + goto out; + + mgr = kzalloc(sizeof(*mgr), GFP_KERNEL); + if (!mgr) + goto out; + + mgr->dev = kzalloc(sizeof(*mgr->dev), GFP_KERNEL); + if (!mgr->dev) + goto out; + + mgr->dev->dev = kzalloc(sizeof(*mgr->dev->dev), GFP_KERNEL); + if (!mgr->dev->dev) + goto out; + + mgr->dev->dev->release = mock_release; + mgr->dev->dev->init_name = PREFIX_STR " expected parse failure"; + device_initialize(mgr->dev->dev); + + rxmsg->curlen = 1; + rxmsg->msg[0] = req_type & 0x7f; + if (drm_dp_sideband_parse_req(mgr, rxmsg, out)) + drm_printf(&p, "Unexpectedly decoded invalid sideband request\n"); + else + result = true; +out: + kfree(out); + kfree(rxmsg); + if (mgr) { + if (mgr->dev) { + put_device(mgr->dev->dev); + kfree(mgr->dev); + } + kfree(mgr); + } return result; } @@ -268,6 +365,34 @@ int igt_dp_mst_sideband_msg_req_decode(void *unused) in.u.enc_status.valid_stream_behavior = 1; DO_TEST(); + in.req_type = DP_CONNECTION_STATUS_NOTIFY; + in.u.conn_stat.port_number = 0xf; + get_random_bytes(in.u.conn_stat.guid, sizeof(in.u.conn_stat.guid)); + in.u.conn_stat.legacy_device_plug_status = 1; + in.u.conn_stat.displayport_device_plug_status = 0; + in.u.conn_stat.message_capability_status = 0; + in.u.conn_stat.input_port = 0; + in.u.conn_stat.peer_device_type = 7; + DO_TEST(); + in.u.conn_stat.displayport_device_plug_status = 1; + DO_TEST(); + in.u.conn_stat.message_capability_status = 1; + DO_TEST(); + in.u.conn_stat.input_port = 1; + DO_TEST(); + + in.req_type = DP_RESOURCE_STATUS_NOTIFY; + in.u.resource_stat.port_number = 0xf; + get_random_bytes(in.u.resource_stat.guid, sizeof(in.u.resource_stat.guid)); + in.u.resource_stat.available_pbn = 0xcdef; + DO_TEST(); + +#undef DO_TEST +#define DO_TEST(req_type) FAIL_ON(!sideband_msg_req_parse(req_type)) + DO_TEST(DP_CONNECTION_STATUS_NOTIFY); + DO_TEST(DP_RESOURCE_STATUS_NOTIFY); + + DO_TEST(DP_REMOTE_I2C_WRITE); #undef DO_TEST return 0; } -- 2.32.0.93.g670b81a890-goog
WARNING: multiple messages have this Message-ID (diff)
From: Sam McNally <sammc@chromium.org> To: LKML <linux-kernel@vger.kernel.org> Cc: Thomas Zimmermann <tzimmermann@suse.de>, David Airlie <airlied@linux.ie>, Hans Verkuil <hverkuil@xs4all.nl>, Sam McNally <sammc@chromium.org>, Sean Paul <seanpaul@chromium.org>, dri-devel@lists.freedesktop.org, Lee Jones <lee.jones@linaro.org> Subject: [PATCH v7 1/3] drm/dp_mst: Add self-tests for up requests Date: Mon, 28 Jun 2021 19:17:01 +1000 [thread overview] Message-ID: <20210628191617.v7.1.I6f50a7996687318ba298c24a3663c8be7dd432c7@changeid> (raw) Up requests are decoded by drm_dp_sideband_parse_req(), which operates on a drm_dp_sideband_msg_rx, unlike down requests. Expand the existing self-test helper sideband_msg_req_encode_decode() to copy the message contents and length from a drm_dp_sideband_msg_tx to drm_dp_sideband_msg_rx and use the parse function under test in place of decode. Add an additional helper for testing clearly-invalid up messages, verifying that parse rejects them. Add support for currently-supported up requests to drm_dp_dump_sideband_msg_req_body(); add support to drm_dp_encode_sideband_req() to allow encoding for the self-tests. Add self-tests for CONNECTION_STATUS_NOTIFY and RESOURCE_STATUS_NOTIFY. Reviewed-by: Lyude Paul <lyude@redhat.com> Signed-off-by: Sam McNally <sammc@chromium.org> --- (no changes since v5) Changes in v5: - Set mock device name to more clearly attribute error/debug logging to the self-test, in particular for cases where failures are expected Changes in v4: - New in v4 drivers/gpu/drm/drm_dp_mst_topology.c | 54 ++++++- .../gpu/drm/drm_dp_mst_topology_internal.h | 4 + .../drm/selftests/test-drm_dp_mst_helper.c | 149 ++++++++++++++++-- 3 files changed, 192 insertions(+), 15 deletions(-) diff --git a/drivers/gpu/drm/drm_dp_mst_topology.c b/drivers/gpu/drm/drm_dp_mst_topology.c index ad0795afc21c..ee58f6517482 100644 --- a/drivers/gpu/drm/drm_dp_mst_topology.c +++ b/drivers/gpu/drm/drm_dp_mst_topology.c @@ -445,6 +445,37 @@ drm_dp_encode_sideband_req(const struct drm_dp_sideband_msg_req_body *req, idx++; } break; + case DP_CONNECTION_STATUS_NOTIFY: { + const struct drm_dp_connection_status_notify *msg; + + msg = &req->u.conn_stat; + buf[idx] = (msg->port_number & 0xf) << 4; + idx++; + memcpy(&raw->msg[idx], msg->guid, 16); + idx += 16; + raw->msg[idx] = 0; + raw->msg[idx] |= msg->legacy_device_plug_status ? BIT(6) : 0; + raw->msg[idx] |= msg->displayport_device_plug_status ? BIT(5) : 0; + raw->msg[idx] |= msg->message_capability_status ? BIT(4) : 0; + raw->msg[idx] |= msg->input_port ? BIT(3) : 0; + raw->msg[idx] |= FIELD_PREP(GENMASK(2, 0), msg->peer_device_type); + idx++; + break; + } + case DP_RESOURCE_STATUS_NOTIFY: { + const struct drm_dp_resource_status_notify *msg; + + msg = &req->u.resource_stat; + buf[idx] = (msg->port_number & 0xf) << 4; + idx++; + memcpy(&raw->msg[idx], msg->guid, 16); + idx += 16; + buf[idx] = (msg->available_pbn & 0xff00) >> 8; + idx++; + buf[idx] = (msg->available_pbn & 0xff); + idx++; + break; + } } raw->cur_len = idx; } @@ -675,6 +706,22 @@ drm_dp_dump_sideband_msg_req_body(const struct drm_dp_sideband_msg_req_body *req req->u.enc_status.stream_behavior, req->u.enc_status.valid_stream_behavior); break; + case DP_CONNECTION_STATUS_NOTIFY: + P("port=%d guid=%*ph legacy=%d displayport=%d messaging=%d input=%d peer_type=%d", + req->u.conn_stat.port_number, + (int)ARRAY_SIZE(req->u.conn_stat.guid), req->u.conn_stat.guid, + req->u.conn_stat.legacy_device_plug_status, + req->u.conn_stat.displayport_device_plug_status, + req->u.conn_stat.message_capability_status, + req->u.conn_stat.input_port, + req->u.conn_stat.peer_device_type); + break; + case DP_RESOURCE_STATUS_NOTIFY: + P("port=%d guid=%*ph pbn=%d", + req->u.resource_stat.port_number, + (int)ARRAY_SIZE(req->u.resource_stat.guid), req->u.resource_stat.guid, + req->u.resource_stat.available_pbn); + break; default: P("???\n"); break; @@ -1119,9 +1166,9 @@ static bool drm_dp_sideband_parse_resource_status_notify(const struct drm_dp_mst return false; } -static bool drm_dp_sideband_parse_req(const struct drm_dp_mst_topology_mgr *mgr, - struct drm_dp_sideband_msg_rx *raw, - struct drm_dp_sideband_msg_req_body *msg) +bool drm_dp_sideband_parse_req(const struct drm_dp_mst_topology_mgr *mgr, + struct drm_dp_sideband_msg_rx *raw, + struct drm_dp_sideband_msg_req_body *msg) { memset(msg, 0, sizeof(*msg)); msg->req_type = (raw->msg[0] & 0x7f); @@ -1137,6 +1184,7 @@ static bool drm_dp_sideband_parse_req(const struct drm_dp_mst_topology_mgr *mgr, return false; } } +EXPORT_SYMBOL_FOR_TESTS_ONLY(drm_dp_sideband_parse_req); static void build_dpcd_write(struct drm_dp_sideband_msg_tx *msg, u8 port_num, u32 offset, u8 num_bytes, u8 *bytes) diff --git a/drivers/gpu/drm/drm_dp_mst_topology_internal.h b/drivers/gpu/drm/drm_dp_mst_topology_internal.h index eeda9a61c657..0356a2e0dba1 100644 --- a/drivers/gpu/drm/drm_dp_mst_topology_internal.h +++ b/drivers/gpu/drm/drm_dp_mst_topology_internal.h @@ -21,4 +21,8 @@ void drm_dp_dump_sideband_msg_req_body(const struct drm_dp_sideband_msg_req_body *req, int indent, struct drm_printer *printer); +bool +drm_dp_sideband_parse_req(const struct drm_dp_mst_topology_mgr *mgr, + struct drm_dp_sideband_msg_rx *raw, + struct drm_dp_sideband_msg_req_body *msg); #endif /* !_DRM_DP_MST_HELPER_INTERNAL_H_ */ diff --git a/drivers/gpu/drm/selftests/test-drm_dp_mst_helper.c b/drivers/gpu/drm/selftests/test-drm_dp_mst_helper.c index 6b4759ed6bfd..7bbeb1e5bc97 100644 --- a/drivers/gpu/drm/selftests/test-drm_dp_mst_helper.c +++ b/drivers/gpu/drm/selftests/test-drm_dp_mst_helper.c @@ -13,6 +13,10 @@ #include "../drm_dp_mst_topology_internal.h" #include "test-drm_modeset_common.h" +static void mock_release(struct device *dev) +{ +} + int igt_dp_mst_calc_pbn_mode(void *ignored) { int pbn, i; @@ -120,27 +124,60 @@ sideband_msg_req_equal(const struct drm_dp_sideband_msg_req_body *in, static bool sideband_msg_req_encode_decode(struct drm_dp_sideband_msg_req_body *in) { - struct drm_dp_sideband_msg_req_body *out; + struct drm_dp_sideband_msg_req_body *out = NULL; struct drm_printer p = drm_err_printer(PREFIX_STR); - struct drm_dp_sideband_msg_tx *txmsg; + struct drm_dp_sideband_msg_tx *txmsg = NULL; + struct drm_dp_sideband_msg_rx *rxmsg = NULL; + struct drm_dp_mst_topology_mgr *mgr = NULL; int i, ret; - bool result = true; + bool result = false; out = kzalloc(sizeof(*out), GFP_KERNEL); if (!out) - return false; + goto out; txmsg = kzalloc(sizeof(*txmsg), GFP_KERNEL); if (!txmsg) - return false; + goto out; - drm_dp_encode_sideband_req(in, txmsg); - ret = drm_dp_decode_sideband_req(txmsg, out); - if (ret < 0) { - drm_printf(&p, "Failed to decode sideband request: %d\n", - ret); - result = false; + rxmsg = kzalloc(sizeof(*rxmsg), GFP_KERNEL); + if (!rxmsg) goto out; + + mgr = kzalloc(sizeof(*mgr), GFP_KERNEL); + if (!mgr) + goto out; + + mgr->dev = kzalloc(sizeof(*mgr->dev), GFP_KERNEL); + if (!mgr->dev) + goto out; + + mgr->dev->dev = kzalloc(sizeof(*mgr->dev->dev), GFP_KERNEL); + if (!mgr->dev->dev) + goto out; + + mgr->dev->dev->release = mock_release; + mgr->dev->dev->init_name = PREFIX_STR; + device_initialize(mgr->dev->dev); + + drm_dp_encode_sideband_req(in, txmsg); + switch (in->req_type) { + case DP_CONNECTION_STATUS_NOTIFY: + case DP_RESOURCE_STATUS_NOTIFY: + memcpy(&rxmsg->msg, txmsg->msg, ARRAY_SIZE(rxmsg->msg)); + rxmsg->curlen = txmsg->cur_len; + if (!drm_dp_sideband_parse_req(mgr, rxmsg, out)) { + drm_printf(&p, "Failed to decode sideband request\n"); + goto out; + } + break; + default: + ret = drm_dp_decode_sideband_req(txmsg, out); + if (ret < 0) { + drm_printf(&p, "Failed to decode sideband request: %d\n", ret); + goto out; + } + break; } if (!sideband_msg_req_equal(in, out)) { @@ -148,9 +185,9 @@ sideband_msg_req_encode_decode(struct drm_dp_sideband_msg_req_body *in) drm_dp_dump_sideband_msg_req_body(in, 1, &p); drm_printf(&p, "Got:\n"); drm_dp_dump_sideband_msg_req_body(out, 1, &p); - result = false; goto out; } + result = true; switch (in->req_type) { case DP_REMOTE_DPCD_WRITE: @@ -171,6 +208,66 @@ sideband_msg_req_encode_decode(struct drm_dp_sideband_msg_req_body *in) out: kfree(out); kfree(txmsg); + kfree(rxmsg); + if (mgr) { + if (mgr->dev) { + put_device(mgr->dev->dev); + kfree(mgr->dev); + } + kfree(mgr); + } + return result; +} + +static bool +sideband_msg_req_parse(int req_type) +{ + struct drm_dp_sideband_msg_req_body *out = NULL; + struct drm_printer p = drm_err_printer(PREFIX_STR); + struct drm_dp_sideband_msg_rx *rxmsg = NULL; + struct drm_dp_mst_topology_mgr *mgr = NULL; + bool result = false; + + out = kzalloc(sizeof(*out), GFP_KERNEL); + if (!out) + goto out; + + rxmsg = kzalloc(sizeof(*rxmsg), GFP_KERNEL); + if (!rxmsg) + goto out; + + mgr = kzalloc(sizeof(*mgr), GFP_KERNEL); + if (!mgr) + goto out; + + mgr->dev = kzalloc(sizeof(*mgr->dev), GFP_KERNEL); + if (!mgr->dev) + goto out; + + mgr->dev->dev = kzalloc(sizeof(*mgr->dev->dev), GFP_KERNEL); + if (!mgr->dev->dev) + goto out; + + mgr->dev->dev->release = mock_release; + mgr->dev->dev->init_name = PREFIX_STR " expected parse failure"; + device_initialize(mgr->dev->dev); + + rxmsg->curlen = 1; + rxmsg->msg[0] = req_type & 0x7f; + if (drm_dp_sideband_parse_req(mgr, rxmsg, out)) + drm_printf(&p, "Unexpectedly decoded invalid sideband request\n"); + else + result = true; +out: + kfree(out); + kfree(rxmsg); + if (mgr) { + if (mgr->dev) { + put_device(mgr->dev->dev); + kfree(mgr->dev); + } + kfree(mgr); + } return result; } @@ -268,6 +365,34 @@ int igt_dp_mst_sideband_msg_req_decode(void *unused) in.u.enc_status.valid_stream_behavior = 1; DO_TEST(); + in.req_type = DP_CONNECTION_STATUS_NOTIFY; + in.u.conn_stat.port_number = 0xf; + get_random_bytes(in.u.conn_stat.guid, sizeof(in.u.conn_stat.guid)); + in.u.conn_stat.legacy_device_plug_status = 1; + in.u.conn_stat.displayport_device_plug_status = 0; + in.u.conn_stat.message_capability_status = 0; + in.u.conn_stat.input_port = 0; + in.u.conn_stat.peer_device_type = 7; + DO_TEST(); + in.u.conn_stat.displayport_device_plug_status = 1; + DO_TEST(); + in.u.conn_stat.message_capability_status = 1; + DO_TEST(); + in.u.conn_stat.input_port = 1; + DO_TEST(); + + in.req_type = DP_RESOURCE_STATUS_NOTIFY; + in.u.resource_stat.port_number = 0xf; + get_random_bytes(in.u.resource_stat.guid, sizeof(in.u.resource_stat.guid)); + in.u.resource_stat.available_pbn = 0xcdef; + DO_TEST(); + +#undef DO_TEST +#define DO_TEST(req_type) FAIL_ON(!sideband_msg_req_parse(req_type)) + DO_TEST(DP_CONNECTION_STATUS_NOTIFY); + DO_TEST(DP_RESOURCE_STATUS_NOTIFY); + + DO_TEST(DP_REMOTE_I2C_WRITE); #undef DO_TEST return 0; } -- 2.32.0.93.g670b81a890-goog
next reply other threads:[~2021-06-28 9:17 UTC|newest] Thread overview: 6+ messages / expand[flat|nested] mbox.gz Atom feed top 2021-06-28 9:17 Sam McNally [this message] 2021-06-28 9:17 ` [PATCH v7 1/3] drm/dp_mst: Add self-tests for up requests Sam McNally 2021-06-28 9:17 ` [PATCH v7 2/3] drm/dp_mst: Add support for sink event notify messages Sam McNally 2021-06-28 9:17 ` Sam McNally 2021-06-28 9:17 ` [PATCH v7 3/3] drm_dp_cec: add MST support Sam McNally 2021-06-28 9:17 ` Sam McNally
Reply instructions: You may reply publicly to this message via plain-text email using any one of the following methods: * Save the following mbox file, import it into your mail client, and reply-to-all from there: mbox Avoid top-posting and favor interleaved quoting: https://en.wikipedia.org/wiki/Posting_style#Interleaved_style * Reply using the --to, --cc, and --in-reply-to switches of git-send-email(1): git send-email \ --in-reply-to=20210628191617.v7.1.I6f50a7996687318ba298c24a3663c8be7dd432c7@changeid \ --to=sammc@chromium.org \ --cc=airlied@linux.ie \ --cc=daniel@ffwll.ch \ --cc=dri-devel@lists.freedesktop.org \ --cc=hverkuil@xs4all.nl \ --cc=lee.jones@linaro.org \ --cc=linux-kernel@vger.kernel.org \ --cc=lyude@redhat.com \ --cc=maarten.lankhorst@linux.intel.com \ --cc=mripard@kernel.org \ --cc=seanpaul@chromium.org \ --cc=tzimmermann@suse.de \ /path/to/YOUR_REPLY https://kernel.org/pub/software/scm/git/docs/git-send-email.html * If your mail client supports setting the In-Reply-To header via mailto: links, try the mailto: linkBe sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes, see mirroring instructions on how to clone and mirror all data and code used by this external index.