@@ -1591,6 +1591,68 @@ static void psp_ras_ta_check_status(struct psp_context *psp)
15911591 }
15921592}
15931593
1594+ static int psp_ras_send_cmd (struct psp_context * psp ,
1595+ enum ras_command cmd_id , void * in , void * out )
1596+ {
1597+ struct ta_ras_shared_memory * ras_cmd ;
1598+ uint32_t cmd = cmd_id ;
1599+ int ret = 0 ;
1600+
1601+ if (!in )
1602+ return - EINVAL ;
1603+
1604+ mutex_lock (& psp -> ras_context .mutex );
1605+ ras_cmd = (struct ta_ras_shared_memory * )psp -> ras_context .context .mem_context .shared_buf ;
1606+ memset (ras_cmd , 0 , sizeof (struct ta_ras_shared_memory ));
1607+
1608+ switch (cmd ) {
1609+ case TA_RAS_COMMAND__ENABLE_FEATURES :
1610+ case TA_RAS_COMMAND__DISABLE_FEATURES :
1611+ memcpy (& ras_cmd -> ras_in_message ,
1612+ in , sizeof (ras_cmd -> ras_in_message ));
1613+ break ;
1614+ case TA_RAS_COMMAND__TRIGGER_ERROR :
1615+ memcpy (& ras_cmd -> ras_in_message .trigger_error ,
1616+ in , sizeof (ras_cmd -> ras_in_message .trigger_error ));
1617+ break ;
1618+ case TA_RAS_COMMAND__QUERY_ADDRESS :
1619+ memcpy (& ras_cmd -> ras_in_message .address ,
1620+ in , sizeof (ras_cmd -> ras_in_message .address ));
1621+ break ;
1622+ default :
1623+ dev_err (psp -> adev -> dev , "Invalid ras cmd id: %u\n" , cmd );
1624+ ret = - EINVAL ;
1625+ goto err_out ;
1626+ }
1627+
1628+ ras_cmd -> cmd_id = cmd ;
1629+ ret = psp_ras_invoke (psp , ras_cmd -> cmd_id );
1630+
1631+ switch (cmd ) {
1632+ case TA_RAS_COMMAND__TRIGGER_ERROR :
1633+ if (ret || psp -> cmd_buf_mem -> resp .status )
1634+ ret = - EINVAL ;
1635+ else if (out )
1636+ memcpy (out , & ras_cmd -> ras_status , sizeof (ras_cmd -> ras_status ));
1637+ break ;
1638+ case TA_RAS_COMMAND__QUERY_ADDRESS :
1639+ if (ret || ras_cmd -> ras_status || psp -> cmd_buf_mem -> resp .status )
1640+ ret = - EINVAL ;
1641+ else if (out )
1642+ memcpy (out ,
1643+ & ras_cmd -> ras_out_message .address ,
1644+ sizeof (ras_cmd -> ras_out_message .address ));
1645+ break ;
1646+ default :
1647+ break ;
1648+ }
1649+
1650+ err_out :
1651+ mutex_unlock (& psp -> ras_context .mutex );
1652+
1653+ return ret ;
1654+ }
1655+
15941656int psp_ras_invoke (struct psp_context * psp , uint32_t ta_cmd_id )
15951657{
15961658 struct ta_ras_shared_memory * ras_cmd ;
@@ -1632,23 +1694,15 @@ int psp_ras_invoke(struct psp_context *psp, uint32_t ta_cmd_id)
16321694int psp_ras_enable_features (struct psp_context * psp ,
16331695 union ta_ras_cmd_input * info , bool enable )
16341696{
1635- struct ta_ras_shared_memory * ras_cmd ;
1697+ enum ras_command cmd_id ;
16361698 int ret ;
16371699
1638- if (!psp -> ras_context .context .initialized )
1700+ if (!psp -> ras_context .context .initialized || ! info )
16391701 return - EINVAL ;
16401702
1641- ras_cmd = (struct ta_ras_shared_memory * )psp -> ras_context .context .mem_context .shared_buf ;
1642- memset (ras_cmd , 0 , sizeof (struct ta_ras_shared_memory ));
1643-
1644- if (enable )
1645- ras_cmd -> cmd_id = TA_RAS_COMMAND__ENABLE_FEATURES ;
1646- else
1647- ras_cmd -> cmd_id = TA_RAS_COMMAND__DISABLE_FEATURES ;
1648-
1649- ras_cmd -> ras_in_message = * info ;
1650-
1651- ret = psp_ras_invoke (psp , ras_cmd -> cmd_id );
1703+ cmd_id = enable ?
1704+ TA_RAS_COMMAND__ENABLE_FEATURES : TA_RAS_COMMAND__DISABLE_FEATURES ;
1705+ ret = psp_ras_send_cmd (psp , cmd_id , info , NULL );
16521706 if (ret )
16531707 return - EINVAL ;
16541708
@@ -1672,6 +1726,8 @@ int psp_ras_terminate(struct psp_context *psp)
16721726
16731727 psp -> ras_context .context .initialized = false;
16741728
1729+ mutex_destroy (& psp -> ras_context .mutex );
1730+
16751731 return ret ;
16761732}
16771733
@@ -1756,9 +1812,10 @@ int psp_ras_initialize(struct psp_context *psp)
17561812
17571813 ret = psp_ta_load (psp , & psp -> ras_context .context );
17581814
1759- if (!ret && !ras_cmd -> ras_status )
1815+ if (!ret && !ras_cmd -> ras_status ) {
17601816 psp -> ras_context .context .initialized = true;
1761- else {
1817+ mutex_init (& psp -> ras_context .mutex );
1818+ } else {
17621819 if (ras_cmd -> ras_status )
17631820 dev_warn (adev -> dev , "RAS Init Status: 0x%X\n" , ras_cmd -> ras_status );
17641821
@@ -1772,12 +1829,12 @@ int psp_ras_initialize(struct psp_context *psp)
17721829int psp_ras_trigger_error (struct psp_context * psp ,
17731830 struct ta_ras_trigger_error_input * info , uint32_t instance_mask )
17741831{
1775- struct ta_ras_shared_memory * ras_cmd ;
17761832 struct amdgpu_device * adev = psp -> adev ;
17771833 int ret ;
17781834 uint32_t dev_mask ;
1835+ uint32_t ras_status = 0 ;
17791836
1780- if (!psp -> ras_context .context .initialized )
1837+ if (!psp -> ras_context .context .initialized || ! info )
17811838 return - EINVAL ;
17821839
17831840 switch (info -> block_id ) {
@@ -1801,13 +1858,8 @@ int psp_ras_trigger_error(struct psp_context *psp,
18011858 dev_mask &= AMDGPU_RAS_INST_MASK ;
18021859 info -> sub_block_index |= dev_mask ;
18031860
1804- ras_cmd = (struct ta_ras_shared_memory * )psp -> ras_context .context .mem_context .shared_buf ;
1805- memset (ras_cmd , 0 , sizeof (struct ta_ras_shared_memory ));
1806-
1807- ras_cmd -> cmd_id = TA_RAS_COMMAND__TRIGGER_ERROR ;
1808- ras_cmd -> ras_in_message .trigger_error = * info ;
1809-
1810- ret = psp_ras_invoke (psp , ras_cmd -> cmd_id );
1861+ ret = psp_ras_send_cmd (psp ,
1862+ TA_RAS_COMMAND__TRIGGER_ERROR , info , & ras_status );
18111863 if (ret )
18121864 return - EINVAL ;
18131865
@@ -1817,9 +1869,9 @@ int psp_ras_trigger_error(struct psp_context *psp,
18171869 if (amdgpu_ras_intr_triggered ())
18181870 return 0 ;
18191871
1820- if (ras_cmd -> ras_status == TA_RAS_STATUS__TEE_ERROR_ACCESS_DENIED )
1872+ if (ras_status == TA_RAS_STATUS__TEE_ERROR_ACCESS_DENIED )
18211873 return - EACCES ;
1822- else if (ras_cmd -> ras_status )
1874+ else if (ras_status )
18231875 return - EINVAL ;
18241876
18251877 return 0 ;
@@ -1829,25 +1881,16 @@ int psp_ras_query_address(struct psp_context *psp,
18291881 struct ta_ras_query_address_input * addr_in ,
18301882 struct ta_ras_query_address_output * addr_out )
18311883{
1832- struct ta_ras_shared_memory * ras_cmd ;
18331884 int ret ;
18341885
1835- if (!psp -> ras_context .context .initialized )
1836- return - EINVAL ;
1837-
1838- ras_cmd = (struct ta_ras_shared_memory * )psp -> ras_context .context .mem_context .shared_buf ;
1839- memset (ras_cmd , 0 , sizeof (struct ta_ras_shared_memory ));
1840-
1841- ras_cmd -> cmd_id = TA_RAS_COMMAND__QUERY_ADDRESS ;
1842- ras_cmd -> ras_in_message .address = * addr_in ;
1843-
1844- ret = psp_ras_invoke (psp , ras_cmd -> cmd_id );
1845- if (ret || ras_cmd -> ras_status || psp -> cmd_buf_mem -> resp .status )
1886+ if (!psp -> ras_context .context .initialized ||
1887+ !addr_in || !addr_out )
18461888 return - EINVAL ;
18471889
1848- * addr_out = ras_cmd -> ras_out_message .address ;
1890+ ret = psp_ras_send_cmd (psp ,
1891+ TA_RAS_COMMAND__QUERY_ADDRESS , addr_in , addr_out );
18491892
1850- return 0 ;
1893+ return ret ;
18511894}
18521895// ras end
18531896
0 commit comments