]> git.baikalelectronics.ru Git - arm-tf.git/commitdiff
xilinx: versal: Do not pass ACPU0 always in set_wakeup_source()
authorRavi Patel <ravi.patel@xilinx.com>
Tue, 30 Jul 2019 11:10:07 +0000 (04:10 -0700)
committerManish Pandey <manish.pandey2@arm.com>
Mon, 7 Dec 2020 11:07:24 +0000 (11:07 +0000)
Existing code passes ACPU0 to LibPM as node_id in set_wakeup_source()
call because last suspending core will be ACPU0 in most of the case.

Now it may be possible that user may disable the ACPU0 using hot-plug
and after that it suspends Linux. So in that case ACPU0 will not be
last suspending core.

To overcome above scenario, pass the current running processor ID
while calling set_wakeup_source().

Signed-off-by: Ravi Patel <ravi.patel@xilinx.com>
Signed-off-by: Rajan Vaja <rajan.vaja@xilinx.com>
Change-Id: If15354c2150b5bb1305b5f93ca4e8c7a81d59f0a

plat/xilinx/versal/pm_service/pm_client.c

index 5b47838e907299663623f8a35d4afcff1a51bbe3..9ab921ee7cf17227361b458aaf74c1a44e96b04e 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2019, Xilinx, Inc. All rights reserved.
+ * Copyright (c) 2019-2020, Xilinx, Inc. All rights reserved.
  *
  * SPDX-License-Identifier: BSD-3-Clause
  */
@@ -113,8 +113,9 @@ static enum pm_device_node_idx irq_to_pm_node_idx(unsigned int irq)
 /**
  * pm_client_set_wakeup_sources - Set all devices with enabled interrupts as
  *                               wake sources in the LibPM.
+ * @node_id:   Node id of processor
  */
-static void pm_client_set_wakeup_sources(void)
+static void pm_client_set_wakeup_sources(uint32_t node_id)
 {
        uint32_t reg_num;
        uint32_t device_id;
@@ -147,7 +148,7 @@ static void pm_client_set_wakeup_sources(void)
                            (!pm_wakeup_nodes_set[node_idx])) {
                                /* Get device ID from node index */
                                device_id = PERIPH_DEVID(node_idx);
-                               ret = pm_set_wakeup_source(XPM_DEVID_ACPU_0,
+                               ret = pm_set_wakeup_source(node_id,
                                                           device_id, 1);
                                pm_wakeup_nodes_set[node_idx] = !ret;
                        }
@@ -167,7 +168,7 @@ void pm_client_suspend(const struct pm_proc *proc, unsigned int state)
        bakery_lock_get(&pm_client_secure_lock);
 
        if (state == PM_STATE_SUSPEND_TO_RAM)
-               pm_client_set_wakeup_sources();
+               pm_client_set_wakeup_sources(proc->node_id);
 
        /* Set powerdown request */
        mmio_write_32(FPD_APU_PWRCTL, mmio_read_32(FPD_APU_PWRCTL) |