@@ -1843,21 +1843,12 @@ static int amdgpu_dm_init(struct amdgpu_device *adev)
18431843 DRM_ERROR ("amdgpu: fail to register dmub aux callback" );
18441844 goto error ;
18451845 }
1846- if (!register_dmub_notify_callback (adev , DMUB_NOTIFICATION_HPD , dmub_hpd_callback , true)) {
1847- DRM_ERROR ("amdgpu: fail to register dmub hpd callback" );
1848- goto error ;
1849- }
1850- if (!register_dmub_notify_callback (adev , DMUB_NOTIFICATION_HPD_IRQ , dmub_hpd_callback , true)) {
1851- DRM_ERROR ("amdgpu: fail to register dmub hpd callback" );
1852- goto error ;
1853- }
1854- }
1855-
1856- /* Enable outbox notification only after IRQ handlers are registered and DMUB is alive.
1857- * It is expected that DMUB will resend any pending notifications at this point, for
1858- * example HPD from DPIA.
1859- */
1860- if (dc_is_dmub_outbox_supported (adev -> dm .dc )) {
1846+ /* Enable outbox notification only after IRQ handlers are registered and DMUB is alive.
1847+ * It is expected that DMUB will resend any pending notifications at this point. Note
1848+ * that hpd and hpd_irq handler registration are deferred to register_hpd_handlers() to
1849+ * align legacy interface initialization sequence. Connection status will be proactivly
1850+ * detected once in the amdgpu_dm_initialize_drm_device.
1851+ */
18611852 dc_enable_dmub_outbox (adev -> dm .dc );
18621853
18631854 /* DPIA trace goes to dmesg logs only if outbox is enabled */
@@ -2287,6 +2278,7 @@ static int dm_sw_fini(void *handle)
22872278
22882279 if (adev -> dm .dmub_srv ) {
22892280 dmub_srv_destroy (adev -> dm .dmub_srv );
2281+ kfree (adev -> dm .dmub_srv );
22902282 adev -> dm .dmub_srv = NULL ;
22912283 }
22922284
@@ -3536,6 +3528,14 @@ static void register_hpd_handlers(struct amdgpu_device *adev)
35363528 int_params .requested_polarity = INTERRUPT_POLARITY_DEFAULT ;
35373529 int_params .current_polarity = INTERRUPT_POLARITY_DEFAULT ;
35383530
3531+ if (dc_is_dmub_outbox_supported (adev -> dm .dc )) {
3532+ if (!register_dmub_notify_callback (adev , DMUB_NOTIFICATION_HPD , dmub_hpd_callback , true))
3533+ DRM_ERROR ("amdgpu: fail to register dmub hpd callback" );
3534+
3535+ if (!register_dmub_notify_callback (adev , DMUB_NOTIFICATION_HPD_IRQ , dmub_hpd_callback , true))
3536+ DRM_ERROR ("amdgpu: fail to register dmub hpd callback" );
3537+ }
3538+
35393539 list_for_each_entry (connector ,
35403540 & dev -> mode_config .connector_list , head ) {
35413541
@@ -3564,10 +3564,6 @@ static void register_hpd_handlers(struct amdgpu_device *adev)
35643564 handle_hpd_rx_irq ,
35653565 (void * ) aconnector );
35663566 }
3567-
3568- if (adev -> dm .hpd_rx_offload_wq )
3569- adev -> dm .hpd_rx_offload_wq [connector -> index ].aconnector =
3570- aconnector ;
35713567 }
35723568}
35733569
@@ -4561,6 +4557,10 @@ static int amdgpu_dm_initialize_drm_device(struct amdgpu_device *adev)
45614557 goto fail ;
45624558 }
45634559
4560+ if (dm -> hpd_rx_offload_wq )
4561+ dm -> hpd_rx_offload_wq [aconnector -> base .index ].aconnector =
4562+ aconnector ;
4563+
45644564 if (!dc_link_detect_connection_type (link , & new_connection_type ))
45654565 DRM_ERROR ("KMS: Failed to detect connector\n" );
45664566
@@ -6534,18 +6534,23 @@ amdgpu_dm_connector_late_register(struct drm_connector *connector)
65346534static void amdgpu_dm_connector_funcs_force (struct drm_connector * connector )
65356535{
65366536 struct amdgpu_dm_connector * aconnector = to_amdgpu_dm_connector (connector );
6537- struct amdgpu_connector * amdgpu_connector = to_amdgpu_connector (connector );
65386537 struct dc_link * dc_link = aconnector -> dc_link ;
65396538 struct dc_sink * dc_em_sink = aconnector -> dc_em_sink ;
65406539 struct edid * edid ;
6540+ struct i2c_adapter * ddc ;
6541+
6542+ if (dc_link -> aux_mode )
6543+ ddc = & aconnector -> dm_dp_aux .aux .ddc ;
6544+ else
6545+ ddc = & aconnector -> i2c -> base ;
65416546
65426547 /*
65436548 * Note: drm_get_edid gets edid in the following order:
65446549 * 1) override EDID if set via edid_override debugfs,
65456550 * 2) firmware EDID if set via edid_firmware module parameter
65466551 * 3) regular DDC read.
65476552 */
6548- edid = drm_get_edid (connector , & amdgpu_connector -> ddc_bus -> aux . ddc );
6553+ edid = drm_get_edid (connector , ddc );
65496554 if (!edid ) {
65506555 DRM_ERROR ("No EDID found on connector: %s.\n" , connector -> name );
65516556 return ;
@@ -6586,20 +6591,26 @@ static int get_modes(struct drm_connector *connector)
65866591static void create_eml_sink (struct amdgpu_dm_connector * aconnector )
65876592{
65886593 struct drm_connector * connector = & aconnector -> base ;
6589- struct amdgpu_connector * amdgpu_connector = to_amdgpu_connector ( & aconnector -> base ) ;
6594+ struct dc_link * dc_link = aconnector -> dc_link ;
65906595 struct dc_sink_init_data init_params = {
65916596 .link = aconnector -> dc_link ,
65926597 .sink_signal = SIGNAL_TYPE_VIRTUAL
65936598 };
65946599 struct edid * edid ;
6600+ struct i2c_adapter * ddc ;
6601+
6602+ if (dc_link -> aux_mode )
6603+ ddc = & aconnector -> dm_dp_aux .aux .ddc ;
6604+ else
6605+ ddc = & aconnector -> i2c -> base ;
65956606
65966607 /*
65976608 * Note: drm_get_edid gets edid in the following order:
65986609 * 1) override EDID if set via edid_override debugfs,
65996610 * 2) firmware EDID if set via edid_firmware module parameter
66006611 * 3) regular DDC read.
66016612 */
6602- edid = drm_get_edid (connector , & amdgpu_connector -> ddc_bus -> aux . ddc );
6613+ edid = drm_get_edid (connector , ddc );
66036614 if (!edid ) {
66046615 DRM_ERROR ("No EDID found on connector: %s.\n" , connector -> name );
66056616 return ;
0 commit comments