adev->gfx.cu_info.max_scratch_slots_per_cu =
                        le32_to_cpu(gpu_info_fw->gc_max_scratch_slots_per_cu);
                adev->gfx.cu_info.lds_size = le32_to_cpu(gpu_info_fw->gc_lds_size);
-               if (hdr->version_minor == 1) {
+               if (hdr->version_minor >= 1) {
                        const struct gpu_info_firmware_v1_1 *gpu_info_fw =
                                (const struct gpu_info_firmware_v1_1 *)(adev->firmware.gpu_info_fw->data +
                                                                        le32_to_cpu(hdr->header.ucode_array_offset_bytes));
                        adev->gfx.config.num_packer_per_sc =
                                le32_to_cpu(gpu_info_fw->num_packer_per_sc);
                }
+#ifdef CONFIG_DRM_AMD_DC_DCN2_0
+               if (hdr->version_minor == 2) {
+                       const struct gpu_info_firmware_v1_2 *gpu_info_fw =
+                               (const struct gpu_info_firmware_v1_2 *)(adev->firmware.gpu_info_fw->data +
+                                                                       le32_to_cpu(hdr->header.ucode_array_offset_bytes));
+                       adev->dm.soc_bounding_box = &gpu_info_fw->soc_bounding_box;
+               }
+#endif
                break;
        }
        default:
 
        uint32_t num_packer_per_sc;
 };
 
+struct gpu_info_voltage_scaling_v1_0 {
+       int state;
+       uint32_t dscclk_mhz;
+       uint32_t dcfclk_mhz;
+       uint32_t socclk_mhz;
+       uint32_t dram_speed_mts;
+       uint32_t fabricclk_mhz;
+       uint32_t dispclk_mhz;
+       uint32_t phyclk_mhz;
+       uint32_t dppclk_mhz;
+};
+
+struct gpu_info_soc_bounding_box_v1_0 {
+       uint32_t sr_exit_time_us;
+       uint32_t sr_enter_plus_exit_time_us;
+       uint32_t urgent_latency_us;
+       uint32_t urgent_latency_pixel_data_only_us;
+       uint32_t urgent_latency_pixel_mixed_with_vm_data_us;
+       uint32_t urgent_latency_vm_data_only_us;
+       uint32_t writeback_latency_us;
+       uint32_t ideal_dram_bw_after_urgent_percent;
+       uint32_t pct_ideal_dram_sdp_bw_after_urgent_pixel_only; // PercentOfIdealDRAMFabricAndSDPPortBWReceivedAfterUrgLatencyPixelDataOnly
+       uint32_t pct_ideal_dram_sdp_bw_after_urgent_pixel_and_vm;
+       uint32_t pct_ideal_dram_sdp_bw_after_urgent_vm_only;
+       uint32_t max_avg_sdp_bw_use_normal_percent;
+       uint32_t max_avg_dram_bw_use_normal_percent;
+       unsigned int max_request_size_bytes;
+       uint32_t downspread_percent;
+       uint32_t dram_page_open_time_ns;
+       uint32_t dram_rw_turnaround_time_ns;
+       uint32_t dram_return_buffer_per_channel_bytes;
+       uint32_t dram_channel_width_bytes;
+       uint32_t fabric_datapath_to_dcn_data_return_bytes;
+       uint32_t dcn_downspread_percent;
+       uint32_t dispclk_dppclk_vco_speed_mhz;
+       uint32_t dfs_vco_period_ps;
+       unsigned int urgent_out_of_order_return_per_channel_pixel_only_bytes;
+       unsigned int urgent_out_of_order_return_per_channel_pixel_and_vm_bytes;
+       unsigned int urgent_out_of_order_return_per_channel_vm_only_bytes;
+       unsigned int round_trip_ping_latency_dcfclk_cycles;
+       unsigned int urgent_out_of_order_return_per_channel_bytes;
+       unsigned int channel_interleave_bytes;
+       unsigned int num_banks;
+       unsigned int num_chans;
+       unsigned int vmm_page_size_bytes;
+       uint32_t dram_clock_change_latency_us;
+       uint32_t writeback_dram_clock_change_latency_us;
+       unsigned int return_bus_width_bytes;
+       unsigned int voltage_override;
+       uint32_t xfc_bus_transport_time_us;
+       uint32_t xfc_xbuf_latency_tolerance_us;
+       int use_urgent_burst_bw;
+       unsigned int num_states;
+       struct gpu_info_voltage_scaling_v1_0 clock_limits[8];
+};
+
+/* gpu info payload
+ * version_major=1, version_minor=1 */
+struct gpu_info_firmware_v1_2 {
+       struct gpu_info_firmware_v1_1 v1_1;
+       struct gpu_info_soc_bounding_box_v1_0 soc_bounding_box;
+};
+
 /* version_major=1, version_minor=0 */
 struct gpu_info_firmware_header_v1_0 {
        struct common_firmware_header header;