1. 10 Jan, 2014 1 commit
    • Lorenzo Pieralisi's avatar
      arm64: kernel: restore HW breakpoint registers in cpu_suspend · 65c021bb
      Lorenzo Pieralisi authored
      When a CPU resumes from low-power, it restores HW breakpoint and
      watchpoint slots through a CPU PM notifier. Since we want to enable
      debugging as early as possible in the resume path, the mdscr content
      is restored along the general purpose registers in the cpu_suspend API
      and debug exceptions are reenabled when cpu_suspend returns. Since the
      CPU PM notifier is run after a CPU has been resumed, we cannot expect
      HW breakpoint registers to contain sane values till the notifier is run,
      since the HW breakpoints registers content is unknown at reset; this means
      that the CPU might run with debug exceptions enabled, mdscr restored but HW
      breakpoint registers containing junk values that can trigger spurious
      debug exceptions.
      
      This patch fixes current HW breakpoints restore by moving the HW breakpoints
      registers restoration to the cpu_suspend API, before the debug exceptions are
      enabled. This way, as soon as the cpu_suspend function returns the
      kernel can resume debugging with sane values in HW breakpoint registers.
      Signed-off-by: default avatarLorenzo Pieralisi <lorenzo.pieralisi@arm.com>
      Acked-by: default avatarWill Deacon <will.deacon@arm.com>
      Signed-off-by: default avatarCatalin Marinas <catalin.marinas@arm.com>
      65c021bb
  2. 08 Jan, 2014 7 commits
  3. 20 Dec, 2013 2 commits
  4. 19 Dec, 2013 20 commits
  5. 16 Dec, 2013 10 commits
    • Lorenzo Pieralisi's avatar
      arm64: add CPU power management menu/entries · 1307220d
      Lorenzo Pieralisi authored
      This patch provides a menu for CPU power management options in the
      arm64 Kconfig and adds an entry to enable the generic CPU idle configuration.
      Acked-by: default avatarDaniel Lezcano <daniel.lezcano@linaro.org>
      Signed-off-by: default avatarLorenzo Pieralisi <lorenzo.pieralisi@arm.com>
      1307220d
    • Lorenzo Pieralisi's avatar
      arm64: kernel: add PM build infrastructure · 166936ba
      Lorenzo Pieralisi authored
      This patch adds the required makefile and kconfig entries to enable PM
      for arm64 systems.
      
      The kernel relies on the cpu_{suspend}/{resume} infrastructure to
      properly save the context for a CPU and put it to sleep, hence this
      patch adds the config option required to enable cpu_{suspend}/{resume}
      API.
      
      In order to rely on the CPU PM implementation for saving and restoring
      of CPU subsystems like GIC and PMU, the arch Kconfig must be also
      augmented to select the CONFIG_CPU_PM option when SUSPEND or CPU_IDLE
      kernel implementations are selected.
      Signed-off-by: default avatarLorenzo Pieralisi <lorenzo.pieralisi@arm.com>
      166936ba
    • Lorenzo Pieralisi's avatar
      arm64: kernel: add CPU idle call · b8824dfe
      Lorenzo Pieralisi authored
      When CPU idle is enabled, the architectural idle call should go through
      the idle subsystem to allow CPUs to enter idle states defined
      by the platform CPU idle back-end operations.
      
      This patch, mirroring other archs behaviour, adds the CPU idle call to the
      architectural arch_cpu_idle implementation for arm64.
      Acked-by: default avatarDaniel Lezcano <daniel.lezcano@linaro.org>
      Signed-off-by: default avatarLorenzo Pieralisi <lorenzo.pieralisi@arm.com>
      b8824dfe
    • Lorenzo Pieralisi's avatar
      arm64: enable generic clockevent broadcast · 1f85008e
      Lorenzo Pieralisi authored
      On platforms with power management capabilities, timers that are shut
      down when a CPU enters deep C-states must be emulated using an always-on
      timer and a timer IPI to relay the timer IRQ to target CPUs on an SMP
      system.
      
      This patch enables the generic clockevents broadcast infrastructure for
      arm64, by providing the required Kconfig entries and adding the timer
      IPI infrastructure.
      Acked-by: default avatarDaniel Lezcano <daniel.lezcano@linaro.org>
      Signed-off-by: default avatarLorenzo Pieralisi <lorenzo.pieralisi@arm.com>
      1f85008e
    • Lorenzo Pieralisi's avatar
      arm64: kernel: implement HW breakpoints CPU PM notifier · 60fc6942
      Lorenzo Pieralisi authored
      When a CPU is shutdown either through CPU idle or suspend to RAM, the
      content of HW breakpoint registers must be reset or restored to proper
      values when CPU resume from low power states. This patch adds debug register
      restore operations to the HW breakpoint control function and implements a
      CPU PM notifier that allows to restore the content of HW breakpoint registers
      to allow proper suspend/resume operations.
      Signed-off-by: default avatarLorenzo Pieralisi <lorenzo.pieralisi@arm.com>
      60fc6942
    • Lorenzo Pieralisi's avatar
      arm64: kernel: refactor code to install/uninstall breakpoints · 2f043045
      Lorenzo Pieralisi authored
      Most of the code executed to install and uninstall breakpoints is
      common and can be factored out in a function that through a runtime
      operations type provides the requested implementation.
      
      This patch creates a common function that can be used to install/uninstall
      breakpoints and defines the set of operations that can be carried out
      through it.
      Reviewed-by: default avatarWill Deacon <will.deacon@arm.com>
      Signed-off-by: default avatarLorenzo Pieralisi <lorenzo.pieralisi@arm.com>
      2f043045
    • Lorenzo Pieralisi's avatar
      arm: kvm: implement CPU PM notifier · 1fcf7ce0
      Lorenzo Pieralisi authored
      Upon CPU shutdown and consequent warm-reboot, the hypervisor CPU state
      must be re-initialized. This patch implements a CPU PM notifier that
      upon warm-boot calls a KVM hook to reinitialize properly the hypervisor
      state so that the CPU can be safely resumed.
      Acked-by: default avatarMarc Zyngier <marc.zyngier@arm.com>
      Acked-by: default avatarChristoffer Dall <christoffer.dall@linaro.org>
      Signed-off-by: default avatarLorenzo Pieralisi <lorenzo.pieralisi@arm.com>
      1fcf7ce0
    • Lorenzo Pieralisi's avatar
      arm64: kernel: implement fpsimd CPU PM notifier · fb1ab1ab
      Lorenzo Pieralisi authored
      When a CPU enters a low power state, its FP register content is lost.
      This patch adds a notifier to save the FP context on CPU shutdown
      and restore it on CPU resume. The context is saved and restored only
      if the suspending thread is not a kernel thread, mirroring the current
      context switch behaviour.
      Signed-off-by: default avatarLorenzo Pieralisi <lorenzo.pieralisi@arm.com>
      fb1ab1ab
    • Lorenzo Pieralisi's avatar
      arm64: kernel: cpu_{suspend/resume} implementation · 95322526
      Lorenzo Pieralisi authored
      Kernel subsystems like CPU idle and suspend to RAM require a generic
      mechanism to suspend a processor, save its context and put it into
      a quiescent state. The cpu_{suspend}/{resume} implementation provides
      such a framework through a kernel interface allowing to save/restore
      registers, flush the context to DRAM and suspend/resume to/from
      low-power states where processor context may be lost.
      
      The CPU suspend implementation relies on the suspend protocol registered
      in CPU operations to carry out a suspend request after context is
      saved and flushed to DRAM. The cpu_suspend interface:
      
      int cpu_suspend(unsigned long arg);
      
      allows to pass an opaque parameter that is handed over to the suspend CPU
      operations back-end so that it can take action according to the
      semantics attached to it. The arg parameter allows suspend to RAM and CPU
      idle drivers to communicate to suspend protocol back-ends; it requires
      standardization so that the interface can be reused seamlessly across
      systems, paving the way for generic drivers.
      
      Context memory is allocated on the stack, whose address is stashed in a
      per-cpu variable to keep track of it and passed to core functions that
      save/restore the registers required by the architecture.
      
      Even though, upon successful execution, the cpu_suspend function shuts
      down the suspending processor, the warm boot resume mechanism, based
      on the cpu_resume function, makes the resume path operate as a
      cpu_suspend function return, so that cpu_suspend can be treated as a C
      function by the caller, which simplifies coding the PM drivers that rely
      on the cpu_suspend API.
      
      Upon context save, the minimal amount of memory is flushed to DRAM so
      that it can be retrieved when the MMU is off and caches are not searched.
      
      The suspend CPU operation, depending on the required operations (eg CPU vs
      Cluster shutdown) is in charge of flushing the cache hierarchy either
      implicitly (by calling firmware implementations like PSCI) or explicitly
      by executing the required cache maintainance functions.
      
      Debug exceptions are disabled during cpu_{suspend}/{resume} operations
      so that debug registers can be saved and restored properly preventing
      preemption from debug agents enabled in the kernel.
      Signed-off-by: default avatarLorenzo Pieralisi <lorenzo.pieralisi@arm.com>
      95322526
    • Lorenzo Pieralisi's avatar
      arm64: kernel: suspend/resume registers save/restore · 6732bc65
      Lorenzo Pieralisi authored
      Power management software requires the kernel to save and restore
      CPU registers while going through suspend and resume operations
      triggered by kernel subsystems like CPU idle and suspend to RAM.
      
      This patch implements code that provides save and restore mechanism
      for the arm v8 implementation. Memory for the context is passed as
      parameter to both cpu_do_suspend and cpu_do_resume functions, and allows
      the callers to implement context allocation as they deem fit.
      
      The registers that are saved and restored correspond to the registers set
      actually required by the kernel to be up and running which represents a
      subset of v8 ISA.
      Signed-off-by: default avatarLorenzo Pieralisi <lorenzo.pieralisi@arm.com>
      6732bc65