feat(versal): add support to reset SGI

Add "reset" parameter in pm_register_sgi() to reset
SGI number. This will be required if OS wants to reset
SGI number to default state. Caller can reset param to
1 to reset SGI in ATF.

Change-Id: If485ff275df884f74eb67671cac7fa953458afe9
Signed-off-by: Rajan Vaja <rajan.vaja@xilinx.com>
Signed-off-by: Tanmay Shah <tanmay.shah@xilinx.com>
This commit is contained in:
Venkatesh Yadav Abbarapu 2021-04-19 07:49:57 -06:00 committed by Tanmay
parent 15e498de74
commit bf70449ba2
3 changed files with 12 additions and 5 deletions

View File

@ -496,7 +496,8 @@ enum pm_ret_status pm_api_ioctl(uint32_t device_id, uint32_t ioctl_id,
break;
case IOCTL_SET_SGI:
/* Get the sgi number */
if (pm_register_sgi(arg1) != 0) {
ret = pm_register_sgi(arg1, arg2);
if (ret != 0) {
return PM_RET_ERROR_ARGS;
}
gicd_write_irouter(gicv3_driver_data->gicd_base,

View File

@ -51,6 +51,7 @@ static uint64_t ipi_fiq_handler(uint32_t id, uint32_t flags, void *handle,
* pm_register_sgi() - PM register the IPI interrupt
*
* @sgi - SGI number to be used for communication.
* @reset - Reset to invalid SGI when reset=1.
* @return On success, the initialization function must return 0.
* Any other return value will cause the framework to ignore
* the service
@ -58,9 +59,14 @@ static uint64_t ipi_fiq_handler(uint32_t id, uint32_t flags, void *handle,
* Update the SGI number to be used.
*
*/
int pm_register_sgi(unsigned int sgi_num)
int pm_register_sgi(unsigned int sgi_num, unsigned int reset)
{
if ((unsigned int)sgi != (unsigned int)INVALID_SGI) {
if (reset == 1U) {
sgi = INVALID_SGI;
return 0;
}
if (sgi != INVALID_SGI) {
return -EBUSY;
}

View File

@ -1,5 +1,5 @@
/*
* Copyright (c) 2019, Xilinx, Inc. All rights reserved.
* Copyright (c) 2019-2022, Xilinx, Inc. All rights reserved.
*
* SPDX-License-Identifier: BSD-3-Clause
*/
@ -14,5 +14,5 @@ uint64_t pm_smc_handler(uint32_t smc_fid, uint64_t x1, uint64_t x2, uint64_t x3,
uint64_t x4, void *cookie, void *handle,
uint64_t flags);
int pm_register_sgi(unsigned int sgi_num);
int pm_register_sgi(unsigned int sgi_num, unsigned int reset);
#endif /* PM_SVC_MAIN_H */