<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=us-ascii">
<style type="text/css" style="display:none;"> P {margin-top:0;margin-bottom:0;} </style>
</head>
<body dir="ltr">
<div style="font-family: Calibri, Arial, Helvetica, sans-serif; font-size: 12pt; color: rgb(0, 0, 0);">
Reviewed-by: Alex Deucher <alexander.deucher@amd.com><br>
</div>
<div id="appendonsend"></div>
<hr style="display:inline-block;width:98%" tabindex="-1">
<div id="divRplyFwdMsg" dir="ltr"><font face="Calibri, sans-serif" style="font-size:11pt" color="#000000"><b>From:</b> Hawking Zhang <Hawking.Zhang@amd.com><br>
<b>Sent:</b> Sunday, November 10, 2019 11:41 PM<br>
<b>To:</b> amd-gfx@lists.freedesktop.org <amd-gfx@lists.freedesktop.org>; Deucher, Alexander <Alexander.Deucher@amd.com>; Clements John <clements.john@amd.com>; Ma, Le <Le.Ma@amd.com><br>
<b>Cc:</b> Zhang, Hawking <Hawking.Zhang@amd.com><br>
<b>Subject:</b> [PATCH] drm/amdgpu: avoid upload corrupted ta ucode to psp</font>
<div> </div>
</div>
<div class="BodyFragment"><font size="2"><span style="font-size:11pt;">
<div class="PlainText">xgmi, ras, hdcp and dtm ta are actually separated ucode and<br>
need to handled case by case to upload to psp.<br>
<br>
We support the case that ta binary have one or multiple of<br>
them built-in. As a result, the driver should check each ta<br>
binariy's availablity before decide to upload them to psp.<br>
<br>
In the terminate (unload) case, the driver will check the<br>
context readiness before perform unload activity. It's fine<br>
to keep it as is.<br>
<br>
Change-Id: I493116970ffb557f33c06de10f786684fdcef85b<br>
Signed-off-by: Hawking Zhang <Hawking.Zhang@amd.com><br>
---<br>
 drivers/gpu/drm/amd/amdgpu/amdgpu_psp.c | 22 +++++++++++++++++++++-<br>
 1 file changed, 21 insertions(+), 1 deletion(-)<br>
<br>
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_psp.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_psp.c<br>
index 456ac04b246c..9621e207a9ca 100644<br>
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_psp.c<br>
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_psp.c<br>
@@ -558,7 +558,9 @@ static int psp_xgmi_initialize(struct psp_context *psp)<br>
         struct ta_xgmi_shared_memory *xgmi_cmd;<br>
         int ret;<br>
 <br>
-       if (!psp->adev->psp.ta_fw)<br>
+       if (!psp->adev->psp.ta_fw ||<br>
+           !psp->adev->psp.ta_xgmi_ucode_size ||<br>
+           !psp->adev->psp.ta_xgmi_start_addr)<br>
                 return -ENOENT;<br>
 <br>
         if (!psp->xgmi_context.initialized) {<br>
@@ -768,6 +770,12 @@ static int psp_ras_initialize(struct psp_context *psp)<br>
 {<br>
         int ret;<br>
 <br>
+       if (!psp->adev->psp.ta_ras_ucode_size ||<br>
+           !psp->adev->psp.ta_ras_start_addr) {<br>
+               dev_warn(psp->adev->dev, "RAS: ras ta ucode is not available\n");<br>
+               return 0;<br>
+       }<br>
+<br>
         if (!psp->ras.ras_initialized) {<br>
                 ret = psp_ras_init_shared_buf(psp);<br>
                 if (ret)<br>
@@ -857,6 +865,12 @@ static int psp_hdcp_initialize(struct psp_context *psp)<br>
 {<br>
         int ret;<br>
 <br>
+       if (!psp->adev->psp.ta_hdcp_ucode_size ||<br>
+           !psp->adev->psp.ta_hdcp_start_addr) {<br>
+               dev_warn(psp->adev->dev, "HDCP: hdcp ta ucode is not available\n");<br>
+               return 0;<br>
+       }<br>
+<br>
         if (!psp->hdcp_context.hdcp_initialized) {<br>
                 ret = psp_hdcp_init_shared_buf(psp);<br>
                 if (ret)<br>
@@ -1030,6 +1044,12 @@ static int psp_dtm_initialize(struct psp_context *psp)<br>
 {<br>
         int ret;<br>
 <br>
+       if (!psp->adev->psp.ta_dtm_ucode_size ||<br>
+           !psp->adev->psp.ta_dtm_start_addr) {<br>
+               dev_warn(psp->adev->dev, "DTM: dtm ta ucode is not available\n");<br>
+               return 0;<br>
+       }<br>
+<br>
         if (!psp->dtm_context.dtm_initialized) {<br>
                 ret = psp_dtm_init_shared_buf(psp);<br>
                 if (ret)<br>
-- <br>
2.17.1<br>
<br>
</div>
</span></font></div>
</body>
</html>