Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

This tutorial explains procedure to measure transition times and respected power values when either PS or PL suspends or wake up. By following below procedure, suspend and wake up time of APU, These procedures are for 2017.1 and later releases.  There are some differences for later releases which are indicated when appropriate.

...

Different power states and measure transition time of APU and PL

Generating required images/binaries

Steps to build Linux images

Create petalinux project

  • Run below commands from bash terminal to create petalinux project.

    Code Block
    source <petalinux-install-dir>/settings.sh
    petalinux-create -t project -s xilinx-zcu102-v20xx.x.bsp

Apply Linux kernel patch to signal wakeup

Create directory <plnx-proj-root>/project-spec/meta-user/recipes-kernel/linux/linux-xlnx/ (if not present)

...

Copy below patch files to <plnx-proj-root>/project-spec/meta-user/recipes-kernel/linux/linux-xlnx/.  (v2018.x - later)

...

Rename the downloaded patch file to pm_wakeup_latency.patch.

...

Prebuilt binaries for reference

For 2017.1-4

For 2018.2 and above

To generate binaries on your own please refer below steps for generating required images/binaries.

Generating required images/binaries

Steps to build Linux images

Create petalinux project

  • Run below commands from bash terminal to create petalinux project.

    Code Block
    source <petalinux-install-dir>/settings.sh
    petalinux-create -t project -s xilinx-zcu102-v20xx.x.bsp

Apply Linux kernel patch to signal wakeup

  • Create directory <plnx-proj-root>/project-spec/meta-user/recipes-kernel/linux/linux-xlnx

    _%.bbappend

    / (

    create

    if not present)

    • Add below lines in file:

    • For v2017.x - v2018.1

      Code Block
      FILESEXTRAPATHS_prepend := "${THISDIR}/${PN}:"
      SRC_URI_append = " file://pm_wakeup_latency.patch"
    • For v2018.2 only

      Copy below patch files to <plnx-proj-root>/project-spec/meta-user/recipes-kernel/linux/linux-xlnx/.  (v2018.x - later)

    • Rename the downloaded patch file to pm_wakeup_latency.patch.

    • Open file <plnx-proj-root>/project-spec/meta-user/recipes-kernel/linux/linux-xlnx_%.bbappend (create if not present)

    • Add below lines in file:

      • For v2017.x - v2018.1

        Code Block
        FILESEXTRAPATHS_prepend := "${THISDIR}/${PN}:"
        SRC_URI_append = " file://mailboxpm_wakeup_latency.patch"
      • For v2018.2 only

        Code Block
        FILESEXTRAPATHS_prepend := "${THISDIR}/${PN}:"
        SRC_URI_append = " file://mailbox.patch"
        SRC_URI_append = " file://pm_wakeup_latency.patch"
      • For v2018.3 - 2019.1

        Code Block
        FILESEXTRAPATHS_prepend := "${THISDIR}/${PN}:"
        SRC_URI_append = " file://pm_wakeup_latency.patch"
        SRC_URI_append = " file://pm_firmware_debug.cfg"
      • For v2019.2-later

        Code Block
        FILESEXTRAPATHS_prepend := "${THISDIR}/${PN}:"
        SRC_URI += " file://pm_wakeup_latency.patch"
        SRC_URI_append = " file://pm_firmware_debug.cfg"

...

...

  • Create RPU_0 application rpu_0.elf from SDK as described in above section.

  • Create a new folder and copy pmufw.elf, zynqmp_fsbl.elf, bl31.elf and u-boot.elf from petalinux generated images (present at <plnx-proj-root>/images/linux/). Also copy rpu_0.elf into same folder.

  • Create boot.bif file in same folder as shown below.

    • for 2017.x-2019.2

      Code Block
      the_ROM_image:
      {
           [fsbl_config] a53_x64
           [pmufw_image] pmufw.elf
           [bootloader,destination_cpu=a53-0] zynqmp_fsbl.elf
           [bootloader,destination_cpu=r5-0] rpu_0.elf
           [destination_cpu=a53-0, exception_level=el-3,trustzone] bl31.elf
           [destination_cpu=a53-0, exception_level=el-2] u-boot.elf
      }
    • For 2020.1-later

      Code Block
      the_ROM_image:
      {
              [bootloader, destination_cpu=a53-0] fsbl.elf
              [pmufw_image] pmufw.elf
              [destination_cpu=r5-0] rpu.elf
              [destination_cpu=a53-0,exception_level=el-3,trustzone] bl31.elf
              [destination_cpu=a53-0, load=0x00100000] system.dtb
              [destination_cpu=a53-0,exception_level=el-2] u-boot.elf
      }
  • Create BOOT.BIN file using following command.

    Code Block
    bootgen -arch zynqmp -image boot.bif -w -o BOOT.BIN
  • Create a boot partition in SD card and copy BOOT.BIN and image.ub file (present at <plnx-proj-root>/images/linux/) to boot partition.

  • Boot the ZCU102 board in SD boot mode.

  • Once boot start U-boot prompt will appear on serial. Press Enter again and again to interrupt u-boot till ZynqMP prompt appear. Run below command from u-boot to disable cpuidle.

    Code Block
    ZynqMP > setenv bootargs ${bootargs} cpuidle.off=1
  • After that start the linux by writing "boot" on the U-boot prompt

...

  • Power off all 3 secondary APUs and set frequency of primary APU0 to minimum using above commands for minimum latency measurement.

  • Run following command from Linux terminal to release unnecessary nodes and signal the RPU_0:
    (For v2017.1-4)

    Code Block
    root@plnx_aarch64:~# echo request_wakeup 8 1 0 1 > /sys/kernel/debug/zynqmp_pm/power
    root@plnx_aarch64:~# echo force_powerdown 8 >  /sys/kernel/debug/zynqmp_pm/power
    root@plnx_aarch64:~# echo release_node 69 > /sys/kernel/debug/zynqmp_pm/power
    root@plnx_aarch64:~# echo 0 > /sys/module/printk/parameters/console_suspend
    root@plnx_aarch64:~# echo MMIO_WRITE 0xFFD80064 1 1 > /sys/kernel/debug/zynqmp_pm/power

    (For v2018.2)

    Code Block
    root@plnx_aarch64:~# echo pm_request_wakeup 8 1 0 1 > /sys/kernel/debug/zynqmp-firmware/pm
    root@plnx_aarch64:~# echo pm_force_powerdown 8 >  /sys/kernel/debug/zynqmp-firmware/pm
    root@plnx_aarch64:~# echo pm_release_node 69 > /sys/kernel/debug/zynqmp-firmware/pm
    root@plnx_aarch64:~# echo 0 > /sys/module/printk/parameters/console_suspend
    root@plnx_aarch64:~# echo 0x1 0x1 > /sys/firmware/zynqmp/pggs3

    (For v2018.3)

    Code Block
    root@plnx_aarch64:~# echo disabled > /sys/devices/platform/amba/ffa60000.rtc/power/wakeup
    root@plnx_aarch64:~# echo disabled > /sys/devices/platform/amba/ff000000.serial/power/wakeup
    root@plnx_aarch64:~# echo disabled > /sys/devices/platform/amba/ff010000.serial/power/wakeup
    root@plnx_aarch64:~# echo pm_release_node 69 > /sys/kernel/debug/zynqmp-firmware/pm
    root@plnx_aarch64:~# echo 0 > /sys/module/printk/parameters/console_suspend
    root@plnx_aarch64:~# echo 0x1 0x1 > /sys/firmware/zynqmp/pggs3

    (For v2019.1 - Later)

    Code Block
    root@plnx_aarch64:~# echo disabled > /sys/devices/platform/amba/ffa60000.rtc/power/wakeup
    root@plnx_aarch64:~# echo disabled > /sys/devices/platform/amba/ff000000.serial/power/wakeup
    root@plnx_aarch64:~# echo disabled > /sys/devices/platform/amba/ff010000.serial/power/wakeup
    root@plnx_aarch64:~# echo disabled > /sys/devices/platform/amba/ff0a0000.gpio/power/wakeup
    root@plnx_aarch64:~# echo pm_release_node 69 > /sys/kernel/debug/zynqmp-firmware/pm
    root@plnx_aarch64:~# echo 0 > /sys/module/printk/parameters/console_suspend
    root@plnx_aarch64:~# echo 0x1 0x1 > /sys/firmware/zynqmp/pggs3
  • Now, Linux will be suspended and it will be resumed by RPU after suspend. RPU has requested NODE_GPU SATA from FPD, so Linux will be suspended with FPD on.

  • After 10 second of Linux suspend, RPU application will release NODE_GPUSATA. Once NODE_GPU SATA is released, FPD will be off. Use Power Advantage Tool in these 10 seconds to get power value for Suspend to RAM.

    Following are two print messages to identify these 10 second window.

    Code Block
    RPU0: Suspended to RAM, FPD is on
    RPU0: (10 seconds delay)
    RPU0: Release NODE_SATA, FPD will be off after releasing NODE_SATA
  • Once FPD is off, RPU will resume APU after 10 second of FPD off. To measure power with FPD off, Use Power Advantage Tool in these 10 seconds.
    Following are two print messages to identify these 10 second window.

    Code Block
    RPU0: Suspended.
    RPU0: (10 seconds delay)
    RPU0: Resuming APU.
  • Above loop will run for 5 times and print minimum, maximum and average values for latency. On console, you should able to see suspend/wakeup latency of APU from RPU print message as shown below.

    Code Block
    RPU0: Request Suspend Latency in useconds of Node NODE_APU_0:  Min: 42701, Max: 45728, Avg: 45058
    RPU0: FPD off Latency in useconds of Node NODE_APU_0:  Min: 5902, Max: 5902, Avg: 5902
    RPU0: FPD on Latency in useconds of Node NODE_APU_0:  Min: 121025, Max: 121251, Avg: 121116
    RPU0: APU0 Wakeup Latency in useconds of Node NODE_APU_0:  Min: 8061, Max: 8067, Avg: 8063
    RPU0: Wakeup Latency in useconds of Node NODE_APU_0:  Min: 14062, Max: 14088, Avg: 14080

    Here,
    RPU0: Request Suspend Latency in useconds of Node NODE_APU_0: Latency for power state transition from "3 APU off (min frequency)" to "Suspend to RAM".
    RPU0: FPD off Latency in useconds of Node NODE_APU_0:                  Latency for power state transition from "Suspend to RAM" to "FPD off".
    RPU0: FPD on Latency in useconds of Node NODE_APU_0:                  Latency for power state transition from FPD off to "Suspend to RAM".
    RPU0: APU0 Wakeup Latency in useconds of Node NODE_APU_0:       Time require to wakeup APU_0 after RequestWakeup call.
    RPU0: Wakeup Latency in useconds of Node NODE_APU_0:                 Latency for power state transition from "Suspend to RAM" to "3 APU off (min frequency).

  • R5 Sleep and Deep-Sleep mode

    • Once above measurements are done, RPU puts FPD in off state and goes to idle mode (wfi state) for 10 seconds.

    • To measure power with R5 sleep mode, Use Power Advantage Tool in these 10 seconds.
      Following are two print messages to identify these 10 second window.

      Code Block
      RPU0: Go to RPU Sleep mode
      RPU0: (10 seconds timer)
      RPU0: Go to deep sleep
    • After 10 seconds RPU gets timer interrupt after that it suspend itself and goes to deep sleep mode for 10 seconds.

    • After RPU goes to deep sleep, Use Power Advantage tool for measuring power values within these 10 seconds.
      Following are two print messages to identify these 10 second window.

      Code Block
      RPU0: Go to deep sleep
      RPU0: (10 seconds timer)
      RPU0: Disabling RPU Lock-Step Fault Log...
    • After 10 seconds timer will generate interrupt and Resumes RPU. Then RPU resumes APU. This state is same as 3 APU off with minimum frequency.

    • Now to measure latency/power from left to right of dimmer mode table, use below commands:

      • Set max APU0 frequency using frequency scaling.

      • Power on all 3 secondary APUs.

      • Power on PL.

Note: "time" command used in above steps, will give time to execute that command. "time" gives real, user and sys time values. "real" time is considered from time command.

...

Measure transition time of RPU

Prebuilt binaries for reference

...

...

For 2018.2 and above

Measure transition time of RPU

Generating required images/binaries

...

To generate images on your own please refer below steps for generating required images/binaries.

Generating required images/binaries

Steps to build RPU_0 baremetal

Steps to build APU baremetal

Steps to

...

  • Start with an empty APU application (like the Hello World example here).

  • Replace the main.c with this file (apu_host.c)

  • Build apu application elf.

Steps to run the run the images

  • Create rpu_0.elf and apu.elf from SDK as described in above section.

  • Create a new folder and copy pmufw.elf and zynqmp_fsbl.elf from petalinux generated images (present at <plnx-proj-root>/images/linux/). Also copy rpu_0.elf and apu.elf into same folder.

  • Create boot.bif file in same folder as shown below.

    Code Block
    the_ROM_image:
    {
         [fsbl_config] a53_x64
         [pmufw_image] pmufw.elf
         [bootloader,destination_cpu=a53-0] zynqmp_fsbl.elf
         [destination_cpu=r5-0] rpu_0.elf
         [destination_cpu=a53-0] apu.elf
    }
  • Create BOOT.BIN file using following command.

    Code Block
    bootgen -arch zynqmp -image boot.bif -w -o BOOT.BIN
  • Create a boot partition in SD card and copy BOOT.BIN to boot partition.

  • Boot the ZCU102 board in SD boot mode and observe the output on uart console.

  • APU suspends and resumes RPU and measures its transition time.

Generated binaries for reference


Related Links