]> www.infradead.org Git - users/dwmw2/linux.git/commitdiff
drm/amd/display: Implement INBOX0 usage in driver
authorAlvin Lee <Alvin.Lee2@amd.com>
Mon, 10 May 2021 14:11:46 +0000 (10:11 -0400)
committerAlex Deucher <alexander.deucher@amd.com>
Thu, 27 May 2021 16:25:35 +0000 (12:25 -0400)
[Why]
Start using INBOX0 for HW Lock command

[How]
- Implement initial interface for INBOX0 HW lock message

Signed-off-by: Alvin Lee <Alvin.Lee2@amd.com>
Reviewed-by: Jun Lei <Jun.Lei@amd.com>
Acked-by: Qingqing Zhuo <qingqing.zhuo@amd.com>
Tested-by: Daniel Wheeler <daniel.wheeler@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
drivers/gpu/drm/amd/display/dc/dc_dmub_srv.c
drivers/gpu/drm/amd/display/dc/dc_dmub_srv.h
drivers/gpu/drm/amd/display/dc/dce/dmub_hw_lock_mgr.c
drivers/gpu/drm/amd/display/dc/dce/dmub_hw_lock_mgr.h
drivers/gpu/drm/amd/display/dmub/dmub_srv.h

index c5dc3a947020ad589ba599253f7d90aef90aecdd..4b2854d1d98158463c6802915dd4feef4b7c0d1f 100644 (file)
@@ -110,6 +110,15 @@ void dc_dmub_srv_wait_idle(struct dc_dmub_srv *dc_dmub_srv)
                DC_ERROR("Error waiting for DMUB idle: status=%d\n", status);
 }
 
+void dc_dmub_srv_send_inbox0_cmd(struct dc_dmub_srv *dmub_srv,
+               union dmub_inbox0_data_register data)
+{
+       struct dmub_srv *dmub = dmub_srv->dmub;
+       if (dmub->hw_funcs.send_inbox0_cmd)
+               dmub->hw_funcs.send_inbox0_cmd(dmub, data);
+       // TODO: Add wait command -- poll register for ACK
+}
+
 bool dc_dmub_srv_cmd_with_reply_data(struct dc_dmub_srv *dc_dmub_srv, union dmub_rb_cmd *cmd)
 {
        struct dmub_srv *dmub;
index 338f776990dbb6effda063205704d593d9951a9d..f615e3a76d017544f57fd3c3fc2c7d879bee37a2 100644 (file)
@@ -66,4 +66,6 @@ bool dc_dmub_srv_get_dmub_outbox0_msg(const struct dc *dc, struct dmcub_trace_bu
 
 void dc_dmub_trace_event_control(struct dc *dc, bool enable);
 
+void dc_dmub_srv_send_inbox0_cmd(struct dc_dmub_srv *dmub_srv, union dmub_inbox0_data_register data);
+
 #endif /* _DMUB_DC_SRV_H_ */
index c97ee5abc0efd9f442964bff80857a04d78d132c..9baf8ca0a920f82d4efcd318c332cb62423e4da5 100644 (file)
@@ -52,6 +52,14 @@ void dmub_hw_lock_mgr_cmd(struct dc_dmub_srv *dmub_srv,
        dc_dmub_srv_wait_idle(dmub_srv);
 }
 
+void dmub_hw_lock_mgr_inbox0_cmd(struct dc_dmub_srv *dmub_srv,
+               union dmub_inbox0_cmd_lock_hw hw_lock_cmd)
+{
+       union dmub_inbox0_data_register data = { 0 };
+       data.inbox0_cmd_lock_hw = hw_lock_cmd;
+       dc_dmub_srv_send_inbox0_cmd(dmub_srv, data);
+}
+
 bool should_use_dmub_lock(struct dc_link *link)
 {
        return false;
index bc5906347493b4d82bbef8b0450459d77b5c9ad9..5a72b168fb4ae311d5c8fc92e2b04c2ae1e29f1b 100644 (file)
@@ -34,6 +34,9 @@ void dmub_hw_lock_mgr_cmd(struct dc_dmub_srv *dmub_srv,
                                union dmub_hw_lock_flags *hw_locks,
                                struct dmub_hw_lock_inst_flags *inst_flags);
 
+void dmub_hw_lock_mgr_inbox0_cmd(struct dc_dmub_srv *dmub_srv,
+               union dmub_inbox0_cmd_lock_hw hw_lock_cmd);
+
 bool should_use_dmub_lock(struct dc_link *link);
 
 #endif /*_DMUB_HW_LOCK_MGR_H_ */
index 79ff68c1390251100cd45b95d5919bb6f83d21f4..ed58abc5b3f9ff4cfac1435b10bd5a364b005ebc 100644 (file)
@@ -324,6 +324,7 @@ struct dmub_srv_hw_funcs {
 
        uint32_t (*get_gpint_response)(struct dmub_srv *dmub);
 
+       void (*send_inbox0_cmd)(struct dmub_srv *dmub, union dmub_inbox0_data_register data);
        uint32_t (*get_current_time)(struct dmub_srv *dmub);
 };