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>, Anshuman Gupta <anshuman.gupta@intel.com>, 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 2/3] drm/dp_mst: Add support for sink event notify messages Date: Mon, 28 Jun 2021 19:17:02 +1000 [thread overview] Message-ID: <20210628191617.v7.2.I8693156f555875e5c8342e86ab37ce968dfdd277@changeid> (raw) In-Reply-To: <20210628191617.v7.1.I6f50a7996687318ba298c24a3663c8be7dd432c7@changeid> Sink event notify messages are used for MST CEC IRQs. Add parsing support for sink event notify messages in preparation for handling MST CEC IRQs. Reviewed-by: Lyude Paul <lyude@redhat.com> Signed-off-by: Sam McNally <sammc@chromium.org> --- (no changes since v4) Changes in v4: - Changed logging to use drm_dbg_kms() - Added self-test drivers/gpu/drm/drm_dp_mst_topology.c | 57 ++++++++++++++++++- .../drm/selftests/test-drm_dp_mst_helper.c | 8 +++ include/drm/drm_dp_mst_helper.h | 14 +++++ 3 files changed, 78 insertions(+), 1 deletion(-) diff --git a/drivers/gpu/drm/drm_dp_mst_topology.c b/drivers/gpu/drm/drm_dp_mst_topology.c index ee58f6517482..1cc1a58cfa8b 100644 --- a/drivers/gpu/drm/drm_dp_mst_topology.c +++ b/drivers/gpu/drm/drm_dp_mst_topology.c @@ -476,6 +476,20 @@ drm_dp_encode_sideband_req(const struct drm_dp_sideband_msg_req_body *req, idx++; break; } + case DP_SINK_EVENT_NOTIFY: { + const struct drm_dp_sink_event_notify *msg; + + msg = &req->u.sink_event; + buf[idx] = (msg->port_number & 0xf) << 4; + idx++; + memcpy(&raw->msg[idx], msg->guid, 16); + idx += 16; + buf[idx] = (msg->event_id & 0xff00) >> 8; + idx++; + buf[idx] = (msg->event_id & 0xff); + idx++; + break; + } } raw->cur_len = idx; } @@ -722,6 +736,12 @@ drm_dp_dump_sideband_msg_req_body(const struct drm_dp_sideband_msg_req_body *req (int)ARRAY_SIZE(req->u.resource_stat.guid), req->u.resource_stat.guid, req->u.resource_stat.available_pbn); break; + case DP_SINK_EVENT_NOTIFY: + P("port=%d guid=%*ph event=%d", + req->u.sink_event.port_number, + (int)ARRAY_SIZE(req->u.sink_event.guid), req->u.sink_event.guid, + req->u.sink_event.event_id); + break; default: P("???\n"); break; @@ -1166,6 +1186,30 @@ static bool drm_dp_sideband_parse_resource_status_notify(const struct drm_dp_mst return false; } +static bool drm_dp_sideband_parse_sink_event_notify(const struct drm_dp_mst_topology_mgr *mgr, + struct drm_dp_sideband_msg_rx *raw, + struct drm_dp_sideband_msg_req_body *msg) +{ + int idx = 1; + + msg->u.sink_event.port_number = (raw->msg[idx] & 0xf0) >> 4; + idx++; + if (idx > raw->curlen) + goto fail_len; + + memcpy(msg->u.sink_event.guid, &raw->msg[idx], 16); + idx += 16; + if (idx > raw->curlen) + goto fail_len; + + msg->u.sink_event.event_id = (raw->msg[idx] << 8) | (raw->msg[idx + 1]); + idx++; + return true; +fail_len: + drm_dbg_kms(mgr->dev, "sink event notify parse length fail %d %d\n", idx, raw->curlen); + return false; +} + 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) @@ -1178,6 +1222,8 @@ bool drm_dp_sideband_parse_req(const struct drm_dp_mst_topology_mgr *mgr, return drm_dp_sideband_parse_connection_status_notify(mgr, raw, msg); case DP_RESOURCE_STATUS_NOTIFY: return drm_dp_sideband_parse_resource_status_notify(mgr, raw, msg); + case DP_SINK_EVENT_NOTIFY: + return drm_dp_sideband_parse_sink_event_notify(mgr, raw, msg); default: drm_err(mgr->dev, "Got unknown request 0x%02x (%s)\n", msg->req_type, drm_dp_mst_req_type_str(msg->req_type)); @@ -4113,6 +4159,8 @@ drm_dp_mst_process_up_req(struct drm_dp_mst_topology_mgr *mgr, guid = msg->u.conn_stat.guid; else if (msg->req_type == DP_RESOURCE_STATUS_NOTIFY) guid = msg->u.resource_stat.guid; + else if (msg->req_type == DP_SINK_EVENT_NOTIFY) + guid = msg->u.sink_event.guid; if (guid) mstb = drm_dp_get_mst_branch_device_by_guid(mgr, guid); @@ -4184,7 +4232,8 @@ static int drm_dp_mst_handle_up_req(struct drm_dp_mst_topology_mgr *mgr) drm_dp_sideband_parse_req(mgr, &mgr->up_req_recv, &up_req->msg); if (up_req->msg.req_type != DP_CONNECTION_STATUS_NOTIFY && - up_req->msg.req_type != DP_RESOURCE_STATUS_NOTIFY) { + up_req->msg.req_type != DP_RESOURCE_STATUS_NOTIFY && + up_req->msg.req_type != DP_SINK_EVENT_NOTIFY) { drm_dbg_kms(mgr->dev, "Received unknown up req type, ignoring: %x\n", up_req->msg.req_type); kfree(up_req); @@ -4212,6 +4261,12 @@ static int drm_dp_mst_handle_up_req(struct drm_dp_mst_topology_mgr *mgr) drm_dbg_kms(mgr->dev, "Got RSN: pn: %d avail_pbn %d\n", res_stat->port_number, res_stat->available_pbn); + } else if (up_req->msg.req_type == DP_SINK_EVENT_NOTIFY) { + const struct drm_dp_sink_event_notify *sink_event = + &up_req->msg.u.sink_event; + + drm_dbg_kms(mgr->dev, "Got SEN: pn: %d event_id %d\n", + sink_event->port_number, sink_event->event_id); } up_req->hdr = mgr->up_req_recv.initial_hdr; 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 7bbeb1e5bc97..d49c10d52d88 100644 --- a/drivers/gpu/drm/selftests/test-drm_dp_mst_helper.c +++ b/drivers/gpu/drm/selftests/test-drm_dp_mst_helper.c @@ -164,6 +164,7 @@ sideband_msg_req_encode_decode(struct drm_dp_sideband_msg_req_body *in) switch (in->req_type) { case DP_CONNECTION_STATUS_NOTIFY: case DP_RESOURCE_STATUS_NOTIFY: + case DP_SINK_EVENT_NOTIFY: memcpy(&rxmsg->msg, txmsg->msg, ARRAY_SIZE(rxmsg->msg)); rxmsg->curlen = txmsg->cur_len; if (!drm_dp_sideband_parse_req(mgr, rxmsg, out)) { @@ -387,10 +388,17 @@ int igt_dp_mst_sideband_msg_req_decode(void *unused) in.u.resource_stat.available_pbn = 0xcdef; DO_TEST(); + in.req_type = DP_SINK_EVENT_NOTIFY; + in.u.sink_event.port_number = 0xf; + get_random_bytes(in.u.sink_event.guid, sizeof(in.u.sink_event.guid)); + in.u.sink_event.event_id = 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_SINK_EVENT_NOTIFY); DO_TEST(DP_REMOTE_I2C_WRITE); #undef DO_TEST diff --git a/include/drm/drm_dp_mst_helper.h b/include/drm/drm_dp_mst_helper.h index ddb9231d0309..dd1cac5cdb0f 100644 --- a/include/drm/drm_dp_mst_helper.h +++ b/include/drm/drm_dp_mst_helper.h @@ -439,6 +439,19 @@ struct drm_dp_resource_status_notify { u16 available_pbn; }; +#define DP_SINK_EVENT_PANEL_REPLAY_ACTIVE_FRAME_CRC_ERROR BIT(0) +#define DP_SINK_EVENT_PANEL_REPLAY_RFB_STORAGE_ERROR BIT(1) +#define DP_SINK_EVENT_DSC_RC_BUFFER_UNDER_RUN BIT(2) +#define DP_SINK_EVENT_DSC_RC_BUFFER_OVERFLOW BIT(3) +#define DP_SINK_EVENT_DSC_CHUNK_LENGTH_ERROR BIT(4) +#define DP_SINK_EVENT_CEC_IRQ_EVENT BIT(5) + +struct drm_dp_sink_event_notify { + u8 port_number; + u8 guid[16]; + u16 event_id; +}; + struct drm_dp_query_payload_ack_reply { u8 port_number; u16 allocated_pbn; @@ -450,6 +463,7 @@ struct drm_dp_sideband_msg_req_body { struct drm_dp_connection_status_notify conn_stat; struct drm_dp_port_number_req port_num; struct drm_dp_resource_status_notify resource_stat; + struct drm_dp_sink_event_notify sink_event; struct drm_dp_query_payload query_payload; struct drm_dp_allocate_payload allocate_payload; -- 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>, Anshuman Gupta <anshuman.gupta@intel.com>, 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 2/3] drm/dp_mst: Add support for sink event notify messages Date: Mon, 28 Jun 2021 19:17:02 +1000 [thread overview] Message-ID: <20210628191617.v7.2.I8693156f555875e5c8342e86ab37ce968dfdd277@changeid> (raw) In-Reply-To: <20210628191617.v7.1.I6f50a7996687318ba298c24a3663c8be7dd432c7@changeid> Sink event notify messages are used for MST CEC IRQs. Add parsing support for sink event notify messages in preparation for handling MST CEC IRQs. Reviewed-by: Lyude Paul <lyude@redhat.com> Signed-off-by: Sam McNally <sammc@chromium.org> --- (no changes since v4) Changes in v4: - Changed logging to use drm_dbg_kms() - Added self-test drivers/gpu/drm/drm_dp_mst_topology.c | 57 ++++++++++++++++++- .../drm/selftests/test-drm_dp_mst_helper.c | 8 +++ include/drm/drm_dp_mst_helper.h | 14 +++++ 3 files changed, 78 insertions(+), 1 deletion(-) diff --git a/drivers/gpu/drm/drm_dp_mst_topology.c b/drivers/gpu/drm/drm_dp_mst_topology.c index ee58f6517482..1cc1a58cfa8b 100644 --- a/drivers/gpu/drm/drm_dp_mst_topology.c +++ b/drivers/gpu/drm/drm_dp_mst_topology.c @@ -476,6 +476,20 @@ drm_dp_encode_sideband_req(const struct drm_dp_sideband_msg_req_body *req, idx++; break; } + case DP_SINK_EVENT_NOTIFY: { + const struct drm_dp_sink_event_notify *msg; + + msg = &req->u.sink_event; + buf[idx] = (msg->port_number & 0xf) << 4; + idx++; + memcpy(&raw->msg[idx], msg->guid, 16); + idx += 16; + buf[idx] = (msg->event_id & 0xff00) >> 8; + idx++; + buf[idx] = (msg->event_id & 0xff); + idx++; + break; + } } raw->cur_len = idx; } @@ -722,6 +736,12 @@ drm_dp_dump_sideband_msg_req_body(const struct drm_dp_sideband_msg_req_body *req (int)ARRAY_SIZE(req->u.resource_stat.guid), req->u.resource_stat.guid, req->u.resource_stat.available_pbn); break; + case DP_SINK_EVENT_NOTIFY: + P("port=%d guid=%*ph event=%d", + req->u.sink_event.port_number, + (int)ARRAY_SIZE(req->u.sink_event.guid), req->u.sink_event.guid, + req->u.sink_event.event_id); + break; default: P("???\n"); break; @@ -1166,6 +1186,30 @@ static bool drm_dp_sideband_parse_resource_status_notify(const struct drm_dp_mst return false; } +static bool drm_dp_sideband_parse_sink_event_notify(const struct drm_dp_mst_topology_mgr *mgr, + struct drm_dp_sideband_msg_rx *raw, + struct drm_dp_sideband_msg_req_body *msg) +{ + int idx = 1; + + msg->u.sink_event.port_number = (raw->msg[idx] & 0xf0) >> 4; + idx++; + if (idx > raw->curlen) + goto fail_len; + + memcpy(msg->u.sink_event.guid, &raw->msg[idx], 16); + idx += 16; + if (idx > raw->curlen) + goto fail_len; + + msg->u.sink_event.event_id = (raw->msg[idx] << 8) | (raw->msg[idx + 1]); + idx++; + return true; +fail_len: + drm_dbg_kms(mgr->dev, "sink event notify parse length fail %d %d\n", idx, raw->curlen); + return false; +} + 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) @@ -1178,6 +1222,8 @@ bool drm_dp_sideband_parse_req(const struct drm_dp_mst_topology_mgr *mgr, return drm_dp_sideband_parse_connection_status_notify(mgr, raw, msg); case DP_RESOURCE_STATUS_NOTIFY: return drm_dp_sideband_parse_resource_status_notify(mgr, raw, msg); + case DP_SINK_EVENT_NOTIFY: + return drm_dp_sideband_parse_sink_event_notify(mgr, raw, msg); default: drm_err(mgr->dev, "Got unknown request 0x%02x (%s)\n", msg->req_type, drm_dp_mst_req_type_str(msg->req_type)); @@ -4113,6 +4159,8 @@ drm_dp_mst_process_up_req(struct drm_dp_mst_topology_mgr *mgr, guid = msg->u.conn_stat.guid; else if (msg->req_type == DP_RESOURCE_STATUS_NOTIFY) guid = msg->u.resource_stat.guid; + else if (msg->req_type == DP_SINK_EVENT_NOTIFY) + guid = msg->u.sink_event.guid; if (guid) mstb = drm_dp_get_mst_branch_device_by_guid(mgr, guid); @@ -4184,7 +4232,8 @@ static int drm_dp_mst_handle_up_req(struct drm_dp_mst_topology_mgr *mgr) drm_dp_sideband_parse_req(mgr, &mgr->up_req_recv, &up_req->msg); if (up_req->msg.req_type != DP_CONNECTION_STATUS_NOTIFY && - up_req->msg.req_type != DP_RESOURCE_STATUS_NOTIFY) { + up_req->msg.req_type != DP_RESOURCE_STATUS_NOTIFY && + up_req->msg.req_type != DP_SINK_EVENT_NOTIFY) { drm_dbg_kms(mgr->dev, "Received unknown up req type, ignoring: %x\n", up_req->msg.req_type); kfree(up_req); @@ -4212,6 +4261,12 @@ static int drm_dp_mst_handle_up_req(struct drm_dp_mst_topology_mgr *mgr) drm_dbg_kms(mgr->dev, "Got RSN: pn: %d avail_pbn %d\n", res_stat->port_number, res_stat->available_pbn); + } else if (up_req->msg.req_type == DP_SINK_EVENT_NOTIFY) { + const struct drm_dp_sink_event_notify *sink_event = + &up_req->msg.u.sink_event; + + drm_dbg_kms(mgr->dev, "Got SEN: pn: %d event_id %d\n", + sink_event->port_number, sink_event->event_id); } up_req->hdr = mgr->up_req_recv.initial_hdr; 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 7bbeb1e5bc97..d49c10d52d88 100644 --- a/drivers/gpu/drm/selftests/test-drm_dp_mst_helper.c +++ b/drivers/gpu/drm/selftests/test-drm_dp_mst_helper.c @@ -164,6 +164,7 @@ sideband_msg_req_encode_decode(struct drm_dp_sideband_msg_req_body *in) switch (in->req_type) { case DP_CONNECTION_STATUS_NOTIFY: case DP_RESOURCE_STATUS_NOTIFY: + case DP_SINK_EVENT_NOTIFY: memcpy(&rxmsg->msg, txmsg->msg, ARRAY_SIZE(rxmsg->msg)); rxmsg->curlen = txmsg->cur_len; if (!drm_dp_sideband_parse_req(mgr, rxmsg, out)) { @@ -387,10 +388,17 @@ int igt_dp_mst_sideband_msg_req_decode(void *unused) in.u.resource_stat.available_pbn = 0xcdef; DO_TEST(); + in.req_type = DP_SINK_EVENT_NOTIFY; + in.u.sink_event.port_number = 0xf; + get_random_bytes(in.u.sink_event.guid, sizeof(in.u.sink_event.guid)); + in.u.sink_event.event_id = 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_SINK_EVENT_NOTIFY); DO_TEST(DP_REMOTE_I2C_WRITE); #undef DO_TEST diff --git a/include/drm/drm_dp_mst_helper.h b/include/drm/drm_dp_mst_helper.h index ddb9231d0309..dd1cac5cdb0f 100644 --- a/include/drm/drm_dp_mst_helper.h +++ b/include/drm/drm_dp_mst_helper.h @@ -439,6 +439,19 @@ struct drm_dp_resource_status_notify { u16 available_pbn; }; +#define DP_SINK_EVENT_PANEL_REPLAY_ACTIVE_FRAME_CRC_ERROR BIT(0) +#define DP_SINK_EVENT_PANEL_REPLAY_RFB_STORAGE_ERROR BIT(1) +#define DP_SINK_EVENT_DSC_RC_BUFFER_UNDER_RUN BIT(2) +#define DP_SINK_EVENT_DSC_RC_BUFFER_OVERFLOW BIT(3) +#define DP_SINK_EVENT_DSC_CHUNK_LENGTH_ERROR BIT(4) +#define DP_SINK_EVENT_CEC_IRQ_EVENT BIT(5) + +struct drm_dp_sink_event_notify { + u8 port_number; + u8 guid[16]; + u16 event_id; +}; + struct drm_dp_query_payload_ack_reply { u8 port_number; u16 allocated_pbn; @@ -450,6 +463,7 @@ struct drm_dp_sideband_msg_req_body { struct drm_dp_connection_status_notify conn_stat; struct drm_dp_port_number_req port_num; struct drm_dp_resource_status_notify resource_stat; + struct drm_dp_sink_event_notify sink_event; struct drm_dp_query_payload query_payload; struct drm_dp_allocate_payload allocate_payload; -- 2.32.0.93.g670b81a890-goog
next prev parent 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 [PATCH v7 1/3] drm/dp_mst: Add self-tests for up requests Sam McNally 2021-06-28 9:17 ` Sam McNally 2021-06-28 9:17 ` Sam McNally [this message] 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 ` [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.2.I8693156f555875e5c8342e86ab37ce968dfdd277@changeid \ --to=sammc@chromium.org \ --cc=airlied@linux.ie \ --cc=anshuman.gupta@intel.com \ --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.