Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

drm/amdgpu: added synchronization for psp cmd buf access

resolved race condition accessing psp cmd submission memory

Signed-off-by: John Clements <john.clements@amd.com>
Reviewed-by: Guchun Chen <guchun.chen@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>

authored by

John Clements and committed by
Alex Deucher
4b296527 9712ee0e

+139 -66
+139 -66
drivers/gpu/drm/amd/amdgpu/amdgpu_psp.c
··· 426 426 if (!drm_dev_enter(&psp->adev->ddev, &idx)) 427 427 return 0; 428 428 429 - mutex_lock(&psp->mutex); 430 - 431 429 memset(psp->cmd_buf_mem, 0, PSP_CMD_BUFFER_SIZE); 432 430 433 431 memcpy(psp->cmd_buf_mem, cmd, sizeof(struct psp_gfx_cmd_resp)); ··· 485 487 } 486 488 487 489 exit: 488 - mutex_unlock(&psp->mutex); 489 490 drm_dev_exit(idx); 490 491 return ret; 492 + } 493 + 494 + static struct psp_gfx_cmd_resp *acquire_psp_cmd_buf(struct psp_context *psp) 495 + { 496 + struct psp_gfx_cmd_resp *cmd = psp->cmd; 497 + 498 + mutex_lock(&psp->mutex); 499 + 500 + memset(cmd, 0, sizeof(struct psp_gfx_cmd_resp)); 501 + 502 + return cmd; 503 + } 504 + 505 + void release_psp_cmd_buf(struct psp_context *psp) 506 + { 507 + mutex_unlock(&psp->mutex); 491 508 } 492 509 493 510 static void psp_prep_tmr_cmd_buf(struct psp_context *psp, ··· 512 499 struct amdgpu_device *adev = psp->adev; 513 500 uint32_t size = amdgpu_bo_size(tmr_bo); 514 501 uint64_t tmr_pa = amdgpu_gmc_vram_pa(adev, tmr_bo); 515 - 516 - memset(cmd, 0, sizeof(struct psp_gfx_cmd_resp)); 517 502 518 503 if (amdgpu_sriov_vf(psp->adev)) 519 504 cmd->cmd_id = GFX_CMD_ID_SETUP_VMR; ··· 528 517 static void psp_prep_load_toc_cmd_buf(struct psp_gfx_cmd_resp *cmd, 529 518 uint64_t pri_buf_mc, uint32_t size) 530 519 { 531 - memset(cmd, 0, sizeof(struct psp_gfx_cmd_resp)); 532 - 533 520 cmd->cmd_id = GFX_CMD_ID_LOAD_TOC; 534 521 cmd->cmd.cmd_load_toc.toc_phy_addr_lo = lower_32_bits(pri_buf_mc); 535 522 cmd->cmd.cmd_load_toc.toc_phy_addr_hi = upper_32_bits(pri_buf_mc); ··· 539 530 uint32_t *tmr_size) 540 531 { 541 532 int ret; 542 - struct psp_gfx_cmd_resp *cmd = psp->cmd; 533 + struct psp_gfx_cmd_resp *cmd = acquire_psp_cmd_buf(psp); 543 534 544 535 /* Copy toc to psp firmware private buffer */ 545 536 psp_copy_fw(psp, psp->toc.start_addr, psp->toc.size_bytes); ··· 550 541 psp->fence_buf_mc_addr); 551 542 if (!ret) 552 543 *tmr_size = psp->cmd_buf_mem->resp.tmr_size; 544 + 545 + release_psp_cmd_buf(psp); 553 546 554 547 return ret; 555 548 } ··· 609 598 static int psp_tmr_load(struct psp_context *psp) 610 599 { 611 600 int ret; 612 - struct psp_gfx_cmd_resp *cmd = psp->cmd; 601 + struct psp_gfx_cmd_resp *cmd; 613 602 614 603 /* For Navi12 and CHIP_SIENNA_CICHLID SRIOV, do not set up TMR. 615 604 * Already set up by host driver. 616 605 */ 617 606 if (amdgpu_sriov_vf(psp->adev) && psp_skip_tmr(psp)) 618 607 return 0; 608 + 609 + cmd = acquire_psp_cmd_buf(psp); 619 610 620 611 psp_prep_tmr_cmd_buf(psp, cmd, psp->tmr_mc_addr, psp->tmr_bo); 621 612 DRM_INFO("reserve 0x%lx from 0x%llx for PSP TMR\n", ··· 626 613 ret = psp_cmd_submit_buf(psp, NULL, cmd, 627 614 psp->fence_buf_mc_addr); 628 615 616 + release_psp_cmd_buf(psp); 617 + 629 618 return ret; 630 619 } 631 620 632 621 static void psp_prep_tmr_unload_cmd_buf(struct psp_context *psp, 633 622 struct psp_gfx_cmd_resp *cmd) 634 623 { 635 - memset(cmd, 0, sizeof(struct psp_gfx_cmd_resp)); 636 - 637 624 if (amdgpu_sriov_vf(psp->adev)) 638 625 cmd->cmd_id = GFX_CMD_ID_DESTROY_VMR; 639 626 else ··· 643 630 static int psp_tmr_unload(struct psp_context *psp) 644 631 { 645 632 int ret; 646 - struct psp_gfx_cmd_resp *cmd = psp->cmd; 633 + struct psp_gfx_cmd_resp *cmd = acquire_psp_cmd_buf(psp); 647 634 648 635 psp_prep_tmr_unload_cmd_buf(psp, cmd); 649 636 DRM_INFO("free PSP TMR buffer\n"); 650 637 651 638 ret = psp_cmd_submit_buf(psp, NULL, cmd, 652 639 psp->fence_buf_mc_addr); 640 + 641 + release_psp_cmd_buf(psp); 653 642 654 643 return ret; 655 644 } ··· 677 662 uint64_t *output_ptr) 678 663 { 679 664 int ret; 680 - struct psp_gfx_cmd_resp *cmd = psp->cmd; 681 - 682 - memset(cmd, 0, sizeof(struct psp_gfx_cmd_resp)); 665 + struct psp_gfx_cmd_resp *cmd; 683 666 684 667 if (!output_ptr) 685 668 return -EINVAL; 686 669 687 670 if (amdgpu_sriov_vf(psp->adev)) 688 671 return 0; 672 + 673 + cmd = acquire_psp_cmd_buf(psp); 689 674 690 675 cmd->cmd_id = GFX_CMD_ID_GET_FW_ATTESTATION; 691 676 ··· 697 682 ((uint64_t)cmd->resp.uresp.fwar_db_info.fwar_db_addr_hi << 32); 698 683 } 699 684 685 + release_psp_cmd_buf(psp); 686 + 700 687 return ret; 701 688 } 702 689 703 690 static int psp_boot_config_get(struct amdgpu_device *adev, uint32_t *boot_cfg) 704 691 { 705 692 struct psp_context *psp = &adev->psp; 706 - struct psp_gfx_cmd_resp *cmd = psp->cmd; 693 + struct psp_gfx_cmd_resp *cmd; 707 694 int ret; 708 695 709 696 if (amdgpu_sriov_vf(adev)) 710 697 return 0; 711 698 712 - memset(cmd, 0, sizeof(struct psp_gfx_cmd_resp)); 699 + cmd = acquire_psp_cmd_buf(psp); 713 700 714 701 cmd->cmd_id = GFX_CMD_ID_BOOT_CFG; 715 702 cmd->cmd.boot_cfg.sub_cmd = BOOTCFG_CMD_GET; ··· 722 705 (cmd->resp.uresp.boot_cfg.boot_cfg & BOOT_CONFIG_GECC) ? 1 : 0; 723 706 } 724 707 708 + release_psp_cmd_buf(psp); 709 + 725 710 return ret; 726 711 } 727 712 728 713 static int psp_boot_config_set(struct amdgpu_device *adev, uint32_t boot_cfg) 729 714 { 715 + int ret; 730 716 struct psp_context *psp = &adev->psp; 731 - struct psp_gfx_cmd_resp *cmd = psp->cmd; 717 + struct psp_gfx_cmd_resp *cmd; 732 718 733 719 if (amdgpu_sriov_vf(adev)) 734 720 return 0; 735 721 736 - memset(cmd, 0, sizeof(struct psp_gfx_cmd_resp)); 722 + cmd = acquire_psp_cmd_buf(psp); 737 723 738 724 cmd->cmd_id = GFX_CMD_ID_BOOT_CFG; 739 725 cmd->cmd.boot_cfg.sub_cmd = BOOTCFG_CMD_SET; 740 726 cmd->cmd.boot_cfg.boot_config = boot_cfg; 741 727 cmd->cmd.boot_cfg.boot_config_valid = boot_cfg; 742 728 743 - return psp_cmd_submit_buf(psp, NULL, cmd, psp->fence_buf_mc_addr); 729 + ret = psp_cmd_submit_buf(psp, NULL, cmd, psp->fence_buf_mc_addr); 730 + 731 + release_psp_cmd_buf(psp); 732 + 733 + return ret; 744 734 } 745 735 746 736 static int psp_rl_load(struct amdgpu_device *adev) 747 737 { 738 + int ret; 748 739 struct psp_context *psp = &adev->psp; 749 - struct psp_gfx_cmd_resp *cmd = psp->cmd; 750 - 751 - memset(cmd, 0, sizeof(struct psp_gfx_cmd_resp)); 740 + struct psp_gfx_cmd_resp *cmd; 752 741 753 742 if (!is_psp_fw_valid(psp->rl)) 754 743 return 0; 744 + 745 + cmd = acquire_psp_cmd_buf(psp); 755 746 756 747 memset(psp->fw_pri_buf, 0, PSP_1_MEG); 757 748 memcpy(psp->fw_pri_buf, psp->rl.start_addr, psp->rl.size_bytes); ··· 770 745 cmd->cmd.cmd_load_ip_fw.fw_size = psp->rl.size_bytes; 771 746 cmd->cmd.cmd_load_ip_fw.fw_type = GFX_FW_TYPE_REG_LIST; 772 747 773 - return psp_cmd_submit_buf(psp, NULL, cmd, psp->fence_buf_mc_addr); 748 + ret = psp_cmd_submit_buf(psp, NULL, cmd, psp->fence_buf_mc_addr); 749 + 750 + release_psp_cmd_buf(psp); 751 + 752 + return ret; 774 753 } 775 754 776 755 static void psp_prep_asd_load_cmd_buf(struct psp_gfx_cmd_resp *cmd, 777 756 uint64_t asd_mc, uint32_t size) 778 757 { 779 - memset(cmd, 0, sizeof(struct psp_gfx_cmd_resp)); 780 - 781 758 cmd->cmd_id = GFX_CMD_ID_LOAD_ASD; 782 759 cmd->cmd.cmd_load_ta.app_phy_addr_lo = lower_32_bits(asd_mc); 783 760 cmd->cmd.cmd_load_ta.app_phy_addr_hi = upper_32_bits(asd_mc); ··· 793 766 static int psp_asd_load(struct psp_context *psp) 794 767 { 795 768 int ret; 796 - struct psp_gfx_cmd_resp *cmd = psp->cmd; 769 + struct psp_gfx_cmd_resp *cmd; 797 770 798 771 /* If PSP version doesn't match ASD version, asd loading will be failed. 799 772 * add workaround to bypass it for sriov now. ··· 801 774 */ 802 775 if (amdgpu_sriov_vf(psp->adev) || !psp->asd_ucode_size) 803 776 return 0; 777 + 778 + cmd = acquire_psp_cmd_buf(psp); 804 779 805 780 psp_copy_fw(psp, psp->asd_start_addr, psp->asd_ucode_size); 806 781 ··· 816 787 psp->asd_context.session_id = cmd->resp.session_id; 817 788 } 818 789 790 + release_psp_cmd_buf(psp); 791 + 819 792 return ret; 820 793 } 821 794 822 795 static void psp_prep_ta_unload_cmd_buf(struct psp_gfx_cmd_resp *cmd, 823 796 uint32_t session_id) 824 797 { 825 - memset(cmd, 0, sizeof(struct psp_gfx_cmd_resp)); 826 - 827 798 cmd->cmd_id = GFX_CMD_ID_UNLOAD_TA; 828 799 cmd->cmd.cmd_unload_ta.session_id = session_id; 829 800 } ··· 831 802 static int psp_asd_unload(struct psp_context *psp) 832 803 { 833 804 int ret; 834 - struct psp_gfx_cmd_resp *cmd = psp->cmd; 805 + struct psp_gfx_cmd_resp *cmd; 835 806 836 807 if (amdgpu_sriov_vf(psp->adev)) 837 808 return 0; 838 809 839 810 if (!psp->asd_context.asd_initialized) 840 811 return 0; 812 + 813 + cmd = acquire_psp_cmd_buf(psp); 841 814 842 815 psp_prep_ta_unload_cmd_buf(cmd, psp->asd_context.session_id); 843 816 ··· 848 817 if (!ret) 849 818 psp->asd_context.asd_initialized = false; 850 819 820 + release_psp_cmd_buf(psp); 821 + 851 822 return ret; 852 823 } 853 824 854 825 static void psp_prep_reg_prog_cmd_buf(struct psp_gfx_cmd_resp *cmd, 855 826 uint32_t id, uint32_t value) 856 827 { 857 - memset(cmd, 0, sizeof(struct psp_gfx_cmd_resp)); 858 - 859 828 cmd->cmd_id = GFX_CMD_ID_PROG_REG; 860 829 cmd->cmd.cmd_setup_reg_prog.reg_value = value; 861 830 cmd->cmd.cmd_setup_reg_prog.reg_id = id; ··· 864 833 int psp_reg_program(struct psp_context *psp, enum psp_reg_prog_id reg, 865 834 uint32_t value) 866 835 { 867 - struct psp_gfx_cmd_resp *cmd = psp->cmd; 836 + struct psp_gfx_cmd_resp *cmd; 868 837 int ret = 0; 869 838 870 839 if (reg >= PSP_REG_LAST) 871 840 return -EINVAL; 872 841 842 + cmd = acquire_psp_cmd_buf(psp); 843 + 873 844 psp_prep_reg_prog_cmd_buf(cmd, reg, value); 874 845 ret = psp_cmd_submit_buf(psp, NULL, cmd, psp->fence_buf_mc_addr); 875 846 if (ret) 876 847 DRM_ERROR("PSP failed to program reg id %d", reg); 848 + 849 + release_psp_cmd_buf(psp); 877 850 878 851 return ret; 879 852 } ··· 888 853 uint64_t ta_shared_mc, 889 854 uint32_t ta_shared_size) 890 855 { 891 - memset(cmd, 0, sizeof(struct psp_gfx_cmd_resp)); 892 - 893 856 cmd->cmd_id = GFX_CMD_ID_LOAD_TA; 894 857 cmd->cmd.cmd_load_ta.app_phy_addr_lo = lower_32_bits(ta_bin_mc); 895 858 cmd->cmd.cmd_load_ta.app_phy_addr_hi = upper_32_bits(ta_bin_mc); ··· 919 886 uint32_t ta_cmd_id, 920 887 uint32_t session_id) 921 888 { 922 - memset(cmd, 0, sizeof(struct psp_gfx_cmd_resp)); 923 - 924 889 cmd->cmd_id = GFX_CMD_ID_INVOKE_CMD; 925 890 cmd->cmd.cmd_invoke_cmd.session_id = session_id; 926 891 cmd->cmd.cmd_invoke_cmd.ta_cmd_id = ta_cmd_id; ··· 929 898 uint32_t session_id) 930 899 { 931 900 int ret; 932 - struct psp_gfx_cmd_resp *cmd = psp->cmd; 901 + struct psp_gfx_cmd_resp *cmd = acquire_psp_cmd_buf(psp); 933 902 934 903 psp_prep_ta_invoke_cmd_buf(cmd, ta_cmd_id, session_id); 935 904 936 905 ret = psp_cmd_submit_buf(psp, NULL, cmd, 937 906 psp->fence_buf_mc_addr); 907 + 908 + release_psp_cmd_buf(psp); 938 909 939 910 return ret; 940 911 } ··· 944 911 static int psp_xgmi_load(struct psp_context *psp) 945 912 { 946 913 int ret; 947 - struct psp_gfx_cmd_resp *cmd = psp->cmd; 914 + struct psp_gfx_cmd_resp *cmd; 948 915 949 916 /* 950 917 * TODO: bypass the loading in sriov for now 951 918 */ 919 + 920 + cmd = acquire_psp_cmd_buf(psp); 952 921 953 922 psp_copy_fw(psp, psp->ta_xgmi_start_addr, psp->ta_xgmi_ucode_size); 954 923 ··· 968 933 psp->xgmi_context.session_id = cmd->resp.session_id; 969 934 } 970 935 936 + release_psp_cmd_buf(psp); 937 + 971 938 return ret; 972 939 } 973 940 974 941 static int psp_xgmi_unload(struct psp_context *psp) 975 942 { 976 943 int ret; 977 - struct psp_gfx_cmd_resp *cmd = psp->cmd; 944 + struct psp_gfx_cmd_resp *cmd; 978 945 struct amdgpu_device *adev = psp->adev; 979 946 980 947 /* XGMI TA unload currently is not supported on Arcturus/Aldebaran A+A */ ··· 988 951 * TODO: bypass the unloading in sriov for now 989 952 */ 990 953 954 + cmd = acquire_psp_cmd_buf(psp); 955 + 991 956 psp_prep_ta_unload_cmd_buf(cmd, psp->xgmi_context.session_id); 992 957 993 958 ret = psp_cmd_submit_buf(psp, NULL, cmd, 994 959 psp->fence_buf_mc_addr); 960 + 961 + release_psp_cmd_buf(psp); 995 962 996 963 return ret; 997 964 } ··· 1216 1175 static int psp_ras_load(struct psp_context *psp) 1217 1176 { 1218 1177 int ret; 1219 - struct psp_gfx_cmd_resp *cmd = psp->cmd; 1178 + struct psp_gfx_cmd_resp *cmd; 1220 1179 struct ta_ras_shared_memory *ras_cmd; 1221 1180 1222 1181 /* ··· 1233 1192 ras_cmd->ras_in_message.init_flags.poison_mode_en = 1; 1234 1193 else 1235 1194 ras_cmd->ras_in_message.init_flags.dgpu_mode = 1; 1195 + 1196 + cmd = acquire_psp_cmd_buf(psp); 1236 1197 1237 1198 psp_prep_ta_load_cmd_buf(cmd, 1238 1199 psp->fw_pri_mc_addr, ··· 1254 1211 dev_warn(psp->adev->dev, "RAS Init Status: 0x%X\n", ras_cmd->ras_status); 1255 1212 } 1256 1213 1214 + release_psp_cmd_buf(psp); 1215 + 1257 1216 if (ret || ras_cmd->ras_status) 1258 1217 amdgpu_ras_fini(psp->adev); 1259 1218 ··· 1265 1220 static int psp_ras_unload(struct psp_context *psp) 1266 1221 { 1267 1222 int ret; 1268 - struct psp_gfx_cmd_resp *cmd = psp->cmd; 1223 + struct psp_gfx_cmd_resp *cmd; 1269 1224 1270 1225 /* 1271 1226 * TODO: bypass the unloading in sriov for now ··· 1273 1228 if (amdgpu_sriov_vf(psp->adev)) 1274 1229 return 0; 1275 1230 1231 + cmd = acquire_psp_cmd_buf(psp); 1232 + 1276 1233 psp_prep_ta_unload_cmd_buf(cmd, psp->ras.session_id); 1277 1234 1278 1235 ret = psp_cmd_submit_buf(psp, NULL, cmd, 1279 1236 psp->fence_buf_mc_addr); 1237 + 1238 + release_psp_cmd_buf(psp); 1280 1239 1281 1240 return ret; 1282 1241 } ··· 1522 1473 static int psp_hdcp_load(struct psp_context *psp) 1523 1474 { 1524 1475 int ret; 1525 - struct psp_gfx_cmd_resp *cmd = psp->cmd; 1476 + struct psp_gfx_cmd_resp *cmd; 1526 1477 1527 1478 /* 1528 1479 * TODO: bypass the loading in sriov for now ··· 1532 1483 1533 1484 psp_copy_fw(psp, psp->ta_hdcp_start_addr, 1534 1485 psp->ta_hdcp_ucode_size); 1486 + 1487 + cmd = acquire_psp_cmd_buf(psp); 1535 1488 1536 1489 psp_prep_ta_load_cmd_buf(cmd, 1537 1490 psp->fw_pri_mc_addr, ··· 1548 1497 psp->hdcp_context.session_id = cmd->resp.session_id; 1549 1498 mutex_init(&psp->hdcp_context.mutex); 1550 1499 } 1500 + 1501 + release_psp_cmd_buf(psp); 1551 1502 1552 1503 return ret; 1553 1504 } ··· 1585 1532 static int psp_hdcp_unload(struct psp_context *psp) 1586 1533 { 1587 1534 int ret; 1588 - struct psp_gfx_cmd_resp *cmd = psp->cmd; 1535 + struct psp_gfx_cmd_resp *cmd; 1589 1536 1590 1537 /* 1591 1538 * TODO: bypass the unloading in sriov for now ··· 1593 1540 if (amdgpu_sriov_vf(psp->adev)) 1594 1541 return 0; 1595 1542 1543 + cmd = acquire_psp_cmd_buf(psp); 1544 + 1596 1545 psp_prep_ta_unload_cmd_buf(cmd, psp->hdcp_context.session_id); 1597 1546 1598 1547 ret = psp_cmd_submit_buf(psp, NULL, cmd, psp->fence_buf_mc_addr); 1548 + 1549 + release_psp_cmd_buf(psp); 1599 1550 1600 1551 return ret; 1601 1552 } ··· 1669 1612 static int psp_dtm_load(struct psp_context *psp) 1670 1613 { 1671 1614 int ret; 1672 - struct psp_gfx_cmd_resp *cmd = psp->cmd; 1615 + struct psp_gfx_cmd_resp *cmd; 1673 1616 1674 1617 /* 1675 1618 * TODO: bypass the loading in sriov for now ··· 1678 1621 return 0; 1679 1622 1680 1623 psp_copy_fw(psp, psp->ta_dtm_start_addr, psp->ta_dtm_ucode_size); 1624 + 1625 + cmd = acquire_psp_cmd_buf(psp); 1681 1626 1682 1627 psp_prep_ta_load_cmd_buf(cmd, 1683 1628 psp->fw_pri_mc_addr, ··· 1694 1635 psp->dtm_context.session_id = cmd->resp.session_id; 1695 1636 mutex_init(&psp->dtm_context.mutex); 1696 1637 } 1638 + 1639 + release_psp_cmd_buf(psp); 1697 1640 1698 1641 return ret; 1699 1642 } ··· 1732 1671 static int psp_dtm_unload(struct psp_context *psp) 1733 1672 { 1734 1673 int ret; 1735 - struct psp_gfx_cmd_resp *cmd = psp->cmd; 1674 + struct psp_gfx_cmd_resp *cmd; 1736 1675 1737 1676 /* 1738 1677 * TODO: bypass the unloading in sriov for now ··· 1740 1679 if (amdgpu_sriov_vf(psp->adev)) 1741 1680 return 0; 1742 1681 1682 + cmd = acquire_psp_cmd_buf(psp); 1683 + 1743 1684 psp_prep_ta_unload_cmd_buf(cmd, psp->dtm_context.session_id); 1744 1685 1745 1686 ret = psp_cmd_submit_buf(psp, NULL, cmd, psp->fence_buf_mc_addr); 1687 + 1688 + release_psp_cmd_buf(psp); 1746 1689 1747 1690 return ret; 1748 1691 } ··· 1816 1751 static int psp_rap_load(struct psp_context *psp) 1817 1752 { 1818 1753 int ret; 1819 - struct psp_gfx_cmd_resp *cmd = psp->cmd; 1754 + struct psp_gfx_cmd_resp *cmd; 1820 1755 1821 1756 psp_copy_fw(psp, psp->ta_rap_start_addr, psp->ta_rap_ucode_size); 1757 + 1758 + cmd = acquire_psp_cmd_buf(psp); 1822 1759 1823 1760 psp_prep_ta_load_cmd_buf(cmd, 1824 1761 psp->fw_pri_mc_addr, ··· 1836 1769 mutex_init(&psp->rap_context.mutex); 1837 1770 } 1838 1771 1772 + release_psp_cmd_buf(psp); 1773 + 1839 1774 return ret; 1840 1775 } 1841 1776 1842 1777 static int psp_rap_unload(struct psp_context *psp) 1843 1778 { 1844 1779 int ret; 1845 - struct psp_gfx_cmd_resp *cmd = psp->cmd; 1780 + struct psp_gfx_cmd_resp *cmd = acquire_psp_cmd_buf(psp); 1846 1781 1847 1782 psp_prep_ta_unload_cmd_buf(cmd, psp->rap_context.session_id); 1848 1783 1849 1784 ret = psp_cmd_submit_buf(psp, NULL, cmd, psp->fence_buf_mc_addr); 1785 + 1786 + release_psp_cmd_buf(psp); 1850 1787 1851 1788 return ret; 1852 1789 } ··· 1976 1905 static int psp_securedisplay_load(struct psp_context *psp) 1977 1906 { 1978 1907 int ret; 1979 - struct psp_gfx_cmd_resp *cmd = psp->cmd; 1908 + struct psp_gfx_cmd_resp *cmd = acquire_psp_cmd_buf(psp); 1980 1909 1981 1910 memset(psp->fw_pri_buf, 0, PSP_1_MEG); 1982 1911 memcpy(psp->fw_pri_buf, psp->ta_securedisplay_start_addr, psp->ta_securedisplay_ucode_size); ··· 1989 1918 1990 1919 ret = psp_cmd_submit_buf(psp, NULL, cmd, psp->fence_buf_mc_addr); 1991 1920 1992 - if (ret) 1993 - goto failed; 1921 + if (!ret) { 1922 + psp->securedisplay_context.securedisplay_initialized = true; 1923 + psp->securedisplay_context.session_id = cmd->resp.session_id; 1924 + mutex_init(&psp->securedisplay_context.mutex); 1925 + } 1994 1926 1995 - psp->securedisplay_context.securedisplay_initialized = true; 1996 - psp->securedisplay_context.session_id = cmd->resp.session_id; 1997 - mutex_init(&psp->securedisplay_context.mutex); 1927 + release_psp_cmd_buf(psp); 1998 1928 1999 - failed: 2000 1929 return ret; 2001 1930 } 2002 1931 2003 1932 static int psp_securedisplay_unload(struct psp_context *psp) 2004 1933 { 2005 1934 int ret; 2006 - struct psp_gfx_cmd_resp *cmd = psp->cmd; 1935 + struct psp_gfx_cmd_resp *cmd = acquire_psp_cmd_buf(psp); 2007 1936 2008 1937 psp_prep_ta_unload_cmd_buf(cmd, psp->securedisplay_context.session_id); 2009 1938 2010 1939 ret = psp_cmd_submit_buf(psp, NULL, cmd, psp->fence_buf_mc_addr); 1940 + 1941 + release_psp_cmd_buf(psp); 2011 1942 2012 1943 return ret; 2013 1944 } ··· 2385 2312 int ret; 2386 2313 uint64_t fw_mem_mc_addr = ucode->mc_addr; 2387 2314 2388 - memset(cmd, 0, sizeof(struct psp_gfx_cmd_resp)); 2389 - 2390 2315 cmd->cmd_id = GFX_CMD_ID_LOAD_IP_FW; 2391 2316 cmd->cmd.cmd_load_ip_fw.fw_phy_addr_lo = lower_32_bits(fw_mem_mc_addr); 2392 2317 cmd->cmd.cmd_load_ip_fw.fw_phy_addr_hi = upper_32_bits(fw_mem_mc_addr); ··· 2401 2330 struct amdgpu_firmware_info *ucode) 2402 2331 { 2403 2332 int ret = 0; 2333 + struct psp_gfx_cmd_resp *cmd = acquire_psp_cmd_buf(psp); 2404 2334 2405 - ret = psp_prep_load_ip_fw_cmd_buf(ucode, psp->cmd); 2406 - if (ret) 2407 - return ret; 2335 + ret = psp_prep_load_ip_fw_cmd_buf(ucode, cmd); 2336 + if (!ret) { 2337 + ret = psp_cmd_submit_buf(psp, ucode, cmd, 2338 + psp->fence_buf_mc_addr); 2339 + } 2408 2340 2409 - ret = psp_cmd_submit_buf(psp, ucode, psp->cmd, 2410 - psp->fence_buf_mc_addr); 2341 + release_psp_cmd_buf(psp); 2411 2342 2412 2343 return ret; 2413 2344 } ··· 2880 2807 int psp_rlc_autoload_start(struct psp_context *psp) 2881 2808 { 2882 2809 int ret; 2883 - struct psp_gfx_cmd_resp *cmd = psp->cmd; 2884 - 2885 - memset(cmd, 0, sizeof(struct psp_gfx_cmd_resp)); 2810 + struct psp_gfx_cmd_resp *cmd = acquire_psp_cmd_buf(psp); 2886 2811 2887 2812 cmd->cmd_id = GFX_CMD_ID_AUTOLOAD_RLC; 2888 2813 2889 2814 ret = psp_cmd_submit_buf(psp, NULL, cmd, 2890 2815 psp->fence_buf_mc_addr); 2816 + 2817 + release_psp_cmd_buf(psp); 2891 2818 2892 2819 return ret; 2893 2820 }