diff --git a/plat/xilinx/versal/pm_service/pm_api_sys.c b/plat/xilinx/versal/pm_service/pm_api_sys.c index c7b60476f..04258cc0a 100644 --- a/plat/xilinx/versal/pm_service/pm_api_sys.c +++ b/plat/xilinx/versal/pm_service/pm_api_sys.c @@ -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, diff --git a/plat/xilinx/versal/pm_service/pm_svc_main.c b/plat/xilinx/versal/pm_service/pm_svc_main.c index 75c12684a..f779ad78b 100644 --- a/plat/xilinx/versal/pm_service/pm_svc_main.c +++ b/plat/xilinx/versal/pm_service/pm_svc_main.c @@ -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; } diff --git a/plat/xilinx/versal/pm_service/pm_svc_main.h b/plat/xilinx/versal/pm_service/pm_svc_main.h index 4f8dc2b7f..2dff5b296 100644 --- a/plat/xilinx/versal/pm_service/pm_svc_main.h +++ b/plat/xilinx/versal/pm_service/pm_svc_main.h @@ -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 */