WREG32(CP_PFP_UCODE_ADDR, 0);
                for (i = 0; i < fw_size; i++)
                        WREG32(CP_PFP_UCODE_DATA, le32_to_cpup(fw_data++));
-               WREG32(CP_PFP_UCODE_ADDR, 0);
+               WREG32(CP_PFP_UCODE_ADDR, le32_to_cpu(pfp_hdr->header.ucode_version));
 
                /* CE */
                fw_data = (const __le32 *)
                WREG32(CP_CE_UCODE_ADDR, 0);
                for (i = 0; i < fw_size; i++)
                        WREG32(CP_CE_UCODE_DATA, le32_to_cpup(fw_data++));
-               WREG32(CP_CE_UCODE_ADDR, 0);
+               WREG32(CP_CE_UCODE_ADDR, le32_to_cpu(ce_hdr->header.ucode_version));
 
                /* ME */
                fw_data = (const __be32 *)
                WREG32(CP_ME_RAM_WADDR, 0);
                for (i = 0; i < fw_size; i++)
                        WREG32(CP_ME_RAM_DATA, le32_to_cpup(fw_data++));
-               WREG32(CP_ME_RAM_WADDR, 0);
+               WREG32(CP_ME_RAM_WADDR, le32_to_cpu(me_hdr->header.ucode_version));
+               WREG32(CP_ME_RAM_RADDR, le32_to_cpu(me_hdr->header.ucode_version));
        } else {
                const __be32 *fw_data;
 
                WREG32(CP_ME_RAM_WADDR, 0);
        }
 
-       WREG32(CP_PFP_UCODE_ADDR, 0);
-       WREG32(CP_CE_UCODE_ADDR, 0);
-       WREG32(CP_ME_RAM_WADDR, 0);
-       WREG32(CP_ME_RAM_RADDR, 0);
        return 0;
 }
 
                WREG32(CP_MEC_ME1_UCODE_ADDR, 0);
                for (i = 0; i < fw_size; i++)
                        WREG32(CP_MEC_ME1_UCODE_DATA, le32_to_cpup(fw_data++));
-               WREG32(CP_MEC_ME1_UCODE_ADDR, 0);
+               WREG32(CP_MEC_ME1_UCODE_ADDR, le32_to_cpu(mec_hdr->header.ucode_version));
 
                /* MEC2 */
                if (rdev->family == CHIP_KAVERI) {
                        WREG32(CP_MEC_ME2_UCODE_ADDR, 0);
                        for (i = 0; i < fw_size; i++)
                                WREG32(CP_MEC_ME2_UCODE_DATA, le32_to_cpup(fw_data++));
-                       WREG32(CP_MEC_ME2_UCODE_ADDR, 0);
+                       WREG32(CP_MEC_ME2_UCODE_ADDR, le32_to_cpu(mec2_hdr->header.ucode_version));
                }
        } else {
                const __be32 *fw_data;
                WREG32(RLC_GPM_UCODE_ADDR, 0);
                for (i = 0; i < size; i++)
                        WREG32(RLC_GPM_UCODE_DATA, le32_to_cpup(fw_data++));
-               WREG32(RLC_GPM_UCODE_ADDR, 0);
+               WREG32(RLC_GPM_UCODE_ADDR, le32_to_cpu(hdr->header.ucode_version));
        } else {
                const __be32 *fw_data;