@@ -147,6 +147,14 @@ MODULE_FIRMWARE(FIRMWARE_NAVI12_DMCU);
147147/* Number of bytes in PSP footer for firmware. */
148148#define PSP_FOOTER_BYTES 0x100
149149
150+ /*
151+ * DMUB Async to Sync Mechanism Status
152+ */
153+ #define DMUB_ASYNC_TO_SYNC_ACCESS_FAIL 1
154+ #define DMUB_ASYNC_TO_SYNC_ACCESS_TIMEOUT 2
155+ #define DMUB_ASYNC_TO_SYNC_ACCESS_SUCCESS 3
156+ #define DMUB_ASYNC_TO_SYNC_ACCESS_INVALID 4
157+
150158/**
151159 * DOC: overview
152160 *
@@ -1637,19 +1645,19 @@ static int amdgpu_dm_init(struct amdgpu_device *adev)
16371645 }
16381646 }
16391647
1640- if (amdgpu_dm_initialize_drm_device (adev )) {
1641- DRM_ERROR (
1642- "amdgpu: failed to initialize sw for display support.\n" );
1643- goto error ;
1644- }
1645-
16461648 /* Enable outbox notification only after IRQ handlers are registered and DMUB is alive.
16471649 * It is expected that DMUB will resend any pending notifications at this point, for
16481650 * example HPD from DPIA.
16491651 */
16501652 if (dc_is_dmub_outbox_supported (adev -> dm .dc ))
16511653 dc_enable_dmub_outbox (adev -> dm .dc );
16521654
1655+ if (amdgpu_dm_initialize_drm_device (adev )) {
1656+ DRM_ERROR (
1657+ "amdgpu: failed to initialize sw for display support.\n" );
1658+ goto error ;
1659+ }
1660+
16531661 /* create fake encoders for MST */
16541662 dm_dp_create_fake_mst_encoders (adev );
16551663
@@ -10109,6 +10117,8 @@ static int amdgpu_dm_set_dmub_async_sync_status(bool is_cmd_aux,
1010910117 * operation_result = AUX_RET_ERROR_TIMEOUT ;
1011010118 } else if (status_type == DMUB_ASYNC_TO_SYNC_ACCESS_FAIL ) {
1011110119 * operation_result = AUX_RET_ERROR_ENGINE_ACQUIRE ;
10120+ } else if (status_type == DMUB_ASYNC_TO_SYNC_ACCESS_INVALID ) {
10121+ * operation_result = AUX_RET_ERROR_INVALID_REPLY ;
1011210122 } else {
1011310123 * operation_result = AUX_RET_ERROR_UNKNOWN ;
1011410124 }
@@ -10156,6 +10166,16 @@ int amdgpu_dm_process_dmub_aux_transfer_sync(bool is_cmd_aux, struct dc_context
1015610166 payload -> reply [0 ] = adev -> dm .dmub_notify -> aux_reply .command ;
1015710167 if (!payload -> write && adev -> dm .dmub_notify -> aux_reply .length &&
1015810168 payload -> reply [0 ] == AUX_TRANSACTION_REPLY_AUX_ACK ) {
10169+
10170+ if (payload -> length != adev -> dm .dmub_notify -> aux_reply .length ) {
10171+ DRM_WARN ("invalid read from DPIA AUX %x(%d) got length %d!\n" ,
10172+ payload -> address , payload -> length ,
10173+ adev -> dm .dmub_notify -> aux_reply .length );
10174+ return amdgpu_dm_set_dmub_async_sync_status (is_cmd_aux , ctx ,
10175+ DMUB_ASYNC_TO_SYNC_ACCESS_INVALID ,
10176+ (uint32_t * )operation_result );
10177+ }
10178+
1015910179 memcpy (payload -> data , adev -> dm .dmub_notify -> aux_reply .data ,
1016010180 adev -> dm .dmub_notify -> aux_reply .length );
1016110181 }
0 commit comments