Loading drivers/gpu/drm/drm_dp_mst_topology.c +41 −0 Original line number Original line Diff line number Diff line Loading @@ -56,6 +56,8 @@ static void drm_dp_send_link_address(struct drm_dp_mst_topology_mgr *mgr, static int drm_dp_send_enum_path_resources(struct drm_dp_mst_topology_mgr *mgr, static int drm_dp_send_enum_path_resources(struct drm_dp_mst_topology_mgr *mgr, struct drm_dp_mst_branch *mstb, struct drm_dp_mst_branch *mstb, struct drm_dp_mst_port *port); struct drm_dp_mst_port *port); static int drm_dp_send_clear_payload_table(struct drm_dp_mst_topology_mgr *mgr, struct drm_dp_mst_branch *mstb); static bool drm_dp_validate_guid(struct drm_dp_mst_topology_mgr *mgr, static bool drm_dp_validate_guid(struct drm_dp_mst_topology_mgr *mgr, u8 *guid); u8 *guid); Loading Loading @@ -588,6 +590,8 @@ static bool drm_dp_sideband_parse_reply(struct drm_dp_sideband_msg_rx *raw, case DP_POWER_DOWN_PHY: case DP_POWER_DOWN_PHY: case DP_POWER_UP_PHY: case DP_POWER_UP_PHY: return drm_dp_sideband_parse_power_updown_phy_ack(raw, msg); return drm_dp_sideband_parse_power_updown_phy_ack(raw, msg); case DP_CLEAR_PAYLOAD_ID_TABLE: return true; default: default: DRM_ERROR("Got unknown reply 0x%02x\n", msg->req_type); DRM_ERROR("Got unknown reply 0x%02x\n", msg->req_type); return false; return false; Loading Loading @@ -730,6 +734,15 @@ static int build_power_updown_phy(struct drm_dp_sideband_msg_tx *msg, return 0; return 0; } } static int build_clear_payload_id_table(struct drm_dp_sideband_msg_tx *msg) { struct drm_dp_sideband_msg_req_body req; req.req_type = DP_CLEAR_PAYLOAD_ID_TABLE; drm_dp_encode_sideband_req(&req, msg); return 0; } static int drm_dp_mst_assign_payload_id(struct drm_dp_mst_topology_mgr *mgr, static int drm_dp_mst_assign_payload_id(struct drm_dp_mst_topology_mgr *mgr, struct drm_dp_vcpi *vcpi) struct drm_dp_vcpi *vcpi) { { Loading Loading @@ -1805,6 +1818,32 @@ int drm_dp_send_power_updown_phy(struct drm_dp_mst_topology_mgr *mgr, } } EXPORT_SYMBOL(drm_dp_send_power_updown_phy); EXPORT_SYMBOL(drm_dp_send_power_updown_phy); static int drm_dp_send_clear_payload_table(struct drm_dp_mst_topology_mgr *mgr, struct drm_dp_mst_branch *mstb) { struct drm_dp_sideband_msg_tx *txmsg; int len, ret; txmsg = kzalloc(sizeof(*txmsg), GFP_KERNEL); if (!txmsg) return -ENOMEM; txmsg->dst = mstb; len = build_clear_payload_id_table(txmsg); drm_dp_queue_down_tx(mgr, txmsg); ret = drm_dp_mst_wait_tx_reply(mstb, txmsg); if (ret > 0) { if (txmsg->reply.reply_type == 1) ret = -EINVAL; else ret = 0; } kfree(txmsg); return ret; } static int drm_dp_create_payload_step1(struct drm_dp_mst_topology_mgr *mgr, static int drm_dp_create_payload_step1(struct drm_dp_mst_topology_mgr *mgr, int id, int id, struct drm_dp_payload *payload) struct drm_dp_payload *payload) Loading Loading @@ -2198,6 +2237,8 @@ int drm_dp_mst_topology_mgr_set_mst(struct drm_dp_mst_topology_mgr *mgr, bool ms drm_dp_dpcd_write_payload(mgr, 0, &reset_pay); drm_dp_dpcd_write_payload(mgr, 0, &reset_pay); } } drm_dp_send_clear_payload_table(mgr, mstb); queue_work(system_long_wq, &mgr->work); queue_work(system_long_wq, &mgr->work); ret = 0; ret = 0; Loading Loading
drivers/gpu/drm/drm_dp_mst_topology.c +41 −0 Original line number Original line Diff line number Diff line Loading @@ -56,6 +56,8 @@ static void drm_dp_send_link_address(struct drm_dp_mst_topology_mgr *mgr, static int drm_dp_send_enum_path_resources(struct drm_dp_mst_topology_mgr *mgr, static int drm_dp_send_enum_path_resources(struct drm_dp_mst_topology_mgr *mgr, struct drm_dp_mst_branch *mstb, struct drm_dp_mst_branch *mstb, struct drm_dp_mst_port *port); struct drm_dp_mst_port *port); static int drm_dp_send_clear_payload_table(struct drm_dp_mst_topology_mgr *mgr, struct drm_dp_mst_branch *mstb); static bool drm_dp_validate_guid(struct drm_dp_mst_topology_mgr *mgr, static bool drm_dp_validate_guid(struct drm_dp_mst_topology_mgr *mgr, u8 *guid); u8 *guid); Loading Loading @@ -588,6 +590,8 @@ static bool drm_dp_sideband_parse_reply(struct drm_dp_sideband_msg_rx *raw, case DP_POWER_DOWN_PHY: case DP_POWER_DOWN_PHY: case DP_POWER_UP_PHY: case DP_POWER_UP_PHY: return drm_dp_sideband_parse_power_updown_phy_ack(raw, msg); return drm_dp_sideband_parse_power_updown_phy_ack(raw, msg); case DP_CLEAR_PAYLOAD_ID_TABLE: return true; default: default: DRM_ERROR("Got unknown reply 0x%02x\n", msg->req_type); DRM_ERROR("Got unknown reply 0x%02x\n", msg->req_type); return false; return false; Loading Loading @@ -730,6 +734,15 @@ static int build_power_updown_phy(struct drm_dp_sideband_msg_tx *msg, return 0; return 0; } } static int build_clear_payload_id_table(struct drm_dp_sideband_msg_tx *msg) { struct drm_dp_sideband_msg_req_body req; req.req_type = DP_CLEAR_PAYLOAD_ID_TABLE; drm_dp_encode_sideband_req(&req, msg); return 0; } static int drm_dp_mst_assign_payload_id(struct drm_dp_mst_topology_mgr *mgr, static int drm_dp_mst_assign_payload_id(struct drm_dp_mst_topology_mgr *mgr, struct drm_dp_vcpi *vcpi) struct drm_dp_vcpi *vcpi) { { Loading Loading @@ -1805,6 +1818,32 @@ int drm_dp_send_power_updown_phy(struct drm_dp_mst_topology_mgr *mgr, } } EXPORT_SYMBOL(drm_dp_send_power_updown_phy); EXPORT_SYMBOL(drm_dp_send_power_updown_phy); static int drm_dp_send_clear_payload_table(struct drm_dp_mst_topology_mgr *mgr, struct drm_dp_mst_branch *mstb) { struct drm_dp_sideband_msg_tx *txmsg; int len, ret; txmsg = kzalloc(sizeof(*txmsg), GFP_KERNEL); if (!txmsg) return -ENOMEM; txmsg->dst = mstb; len = build_clear_payload_id_table(txmsg); drm_dp_queue_down_tx(mgr, txmsg); ret = drm_dp_mst_wait_tx_reply(mstb, txmsg); if (ret > 0) { if (txmsg->reply.reply_type == 1) ret = -EINVAL; else ret = 0; } kfree(txmsg); return ret; } static int drm_dp_create_payload_step1(struct drm_dp_mst_topology_mgr *mgr, static int drm_dp_create_payload_step1(struct drm_dp_mst_topology_mgr *mgr, int id, int id, struct drm_dp_payload *payload) struct drm_dp_payload *payload) Loading Loading @@ -2198,6 +2237,8 @@ int drm_dp_mst_topology_mgr_set_mst(struct drm_dp_mst_topology_mgr *mgr, bool ms drm_dp_dpcd_write_payload(mgr, 0, &reset_pay); drm_dp_dpcd_write_payload(mgr, 0, &reset_pay); } } drm_dp_send_clear_payload_table(mgr, mstb); queue_work(system_long_wq, &mgr->work); queue_work(system_long_wq, &mgr->work); ret = 0; ret = 0; Loading