a36fc1fff6
-----BEGIN PGP SIGNATURE----- iQIzBAABCAAdFiEEZH8oZUiU471FcZm+ONu9yGCSaT4FAl3aL2UACgkQONu9yGCS aT73GA//VSRJjGzdohy0+NVK3Dk7tCb2GfXFyLfRasyCbpCVGudaN9IltPU20pmj U67BRp3jJg6AFRFDxJn4uyAxqcYF6VFp77BiBLiF6lZEv3+0xxOqdyFL2IY9Cyew 5XGNWcjXAR/bZ0r/rRXw8GUBMmW/8oewW7Iay4YhriUWv/afucbMVK7cNgyj/qvP jSbHh4mp15BGg1aIanM7YSlJgXX2MimXwEceyHPQJgKpSx1CApI2uRMSNZw/RXeP hFox3Ord5o/K+dowtKW+eTXUMkbm+7Htsi0p+WvE69y6KjyBzh3CEXrQqJsLtd0Y 1myphKOX42z0/hbysUZQV8AvY5jrZu/SPoH8quXD/MNxPvNe0OjO3UiMruAdohQh I3SjKZB+HprtsCGn4X6/PiHUxq8PCLwtMaa9IIRmtFOXeuxPPeQLdEoM8m2eCEiL DnwkDXVVtQhKymmYgWUxcAsFpXl+s3k5ZRFmWEDDTuwlyZRWMPuRaWEOH8YuIHzz QETCyodrOis90TFgG1XJDijzPpZtxZKuJ8HdGmO7J8BMDXi6r0aoTzBk8cPAAe3A TUqRnHoMKLLYC+9vxA90aThXsibL6DuD06beJy3H1XCSj2vKvkM/iLaL8R95JjAW XZaEv/SH9zoEynypd+b8tOHHdPSaZcTe3pd3SDmOPLpejOuSTJU= =VtIx -----END PGP SIGNATURE----- Merge 4.19.86 into android-4.19 Changes in 4.19.86 spi: mediatek: use correct mata->xfer_len when in fifo transfer i2c: mediatek: modify threshold passed to i2c_get_dma_safe_msg_buf() tee: optee: add missing of_node_put after of_device_is_available Revert "OPP: Protect dev_list with opp_table lock" net: cdc_ncm: Signedness bug in cdc_ncm_set_dgram_size() idr: Fix idr_get_next race with idr_remove mm/memory_hotplug: don't access uninitialized memmaps in shrink_pgdat_span() mm/memory_hotplug: fix updating the node span arm64: uaccess: Ensure PAN is re-enabled after unhandled uaccess fault fbdev: Ditch fb_edid_add_monspecs bpf, x32: Fix bug for BPF_ALU64 | BPF_NEG bpf, x32: Fix bug with ALU64 {LSH, RSH, ARSH} BPF_X shift by 0 bpf, x32: Fix bug with ALU64 {LSH, RSH, ARSH} BPF_K shift by 0 bpf, x32: Fix bug for BPF_JMP | {BPF_JSGT, BPF_JSLE, BPF_JSLT, BPF_JSGE} net: ovs: fix return type of ndo_start_xmit function net: xen-netback: fix return type of ndo_start_xmit function ARM: dts: dra7: Enable workaround for errata i870 in PCIe host mode ARM: dts: omap5: enable OTG role for DWC3 controller net: hns3: Fix for netdev not up problem when setting mtu net: hns3: Fix loss of coal configuration while doing reset f2fs: return correct errno in f2fs_gc ARM: dts: sun8i: h3-h5: ir register size should be the whole memory block ARM: dts: sun8i: h3: bpi-m2-plus: Fix address for external RGMII Ethernet PHY tcp: up initial rmem to 128KB and SYN rwin to around 64KB SUNRPC: Fix priority queue fairness ACPI / LPSS: Make acpi_lpss_find_device() also find PCI devices ACPI / LPSS: Resume BYT/CHT I2C controllers from resume_noirq f2fs: keep lazytime on remount IB/hfi1: Error path MAD response size is incorrect IB/hfi1: Ensure ucast_dlid access doesnt exceed bounds mt76x2: fix tx power configuration for VHT mcs 9 mt76x2: disable WLAN core before probe mt76: fix handling ps-poll frames iommu/io-pgtable-arm: Fix race handling in split_blk_unmap() iommu/arm-smmu-v3: Fix unexpected CMD_SYNC timeout kvm: arm/arm64: Fix stage2_flush_memslot for 4 level page table arm64/numa: Report correct memblock range for the dummy node ath10k: fix vdev-start timeout on error rtlwifi: btcoex: Use proper enumerated types for Wi-Fi only interface ata: ahci_brcm: Allow using driver or DSL SoCs PM / devfreq: Fix devfreq_add_device() when drivers are built as modules. PM / devfreq: Fix handling of min/max_freq == 0 PM / devfreq: stopping the governor before device_unregister() ath9k: fix reporting calculated new FFT upper max selftests/tls: Fix recv(MSG_PEEK) & splice() test cases usb: gadget: udc: fotg210-udc: Fix a sleep-in-atomic-context bug in fotg210_get_status() usb: dwc3: gadget: Check ENBLSLPM before sending ep command nl80211: Fix a GET_KEY reply attribute irqchip/irq-mvebu-icu: Fix wrong private data retrieval watchdog: core: fix null pointer dereference when releasing cdev watchdog: renesas_wdt: stop when unregistering watchdog: sama5d4: fix timeout-sec usage watchdog: w83627hf_wdt: Support NCT6796D, NCT6797D, NCT6798D KVM: PPC: Inform the userspace about TCE update failures printk: Do not miss new messages when replaying the log printk: CON_PRINTBUFFER console registration is a bit racy dmaengine: ep93xx: Return proper enum in ep93xx_dma_chan_direction dmaengine: timb_dma: Use proper enum in td_prep_slave_sg ALSA: hda: Fix mismatch for register mask and value in ext controller. ext4: fix build error when DX_DEBUG is defined clk: keystone: Enable TISCI clocks if K3_ARCH sunrpc: Fix connect metrics x86/PCI: Apply VMD's AERSID fixup generically mei: samples: fix a signedness bug in amt_host_if_call() cxgb4: Use proper enum in cxgb4_dcb_handle_fw_update cxgb4: Use proper enum in IEEE_FAUX_SYNC powerpc/pseries: Fix DTL buffer registration powerpc/pseries: Fix how we iterate over the DTL entries powerpc/xive: Move a dereference below a NULL test ARM: dts: at91: sama5d4_xplained: fix addressable nand flash size ARM: dts: at91: at91sam9x5cm: fix addressable nand flash size ARM: dts: at91: sama5d2_ptc_ek: fix bootloader env offsets mtd: rawnand: sh_flctl: Use proper enum for flctl_dma_fifo0_transfer PM / hibernate: Check the success of generating md5 digest before hibernation tools: PCI: Fix compilation warnings clocksource/drivers/sh_cmt: Fixup for 64-bit machines clocksource/drivers/sh_cmt: Fix clocksource width for 32-bit machines ice: Fix forward to queue group logic md: allow metadata updates while suspending an array - fix ixgbe: Fix ixgbe TX hangs with XDP_TX beyond queue limit i40e: Use proper enum in i40e_ndo_set_vf_link_state ixgbe: Fix crash with VFs and flow director on interface flap IB/mthca: Fix error return code in __mthca_init_one() IB/rxe: avoid srq memory leak RDMA/hns: Bugfix for reserved qp number RDMA/hns: Submit bad wr when post send wr exception RDMA/hns: Bugfix for CM test RDMA/hns: Limit the size of extend sge of sq IB/mlx4: Avoid implicit enumerated type conversion rpmsg: glink: smem: Support rx peak for size less than 4 bytes msm/gpu/a6xx: Force of_dma_configure to setup DMA for GMU OPP: Return error on error from dev_pm_opp_get_opp_count() ACPICA: Never run _REG on system_memory and system_IO cpuidle: menu: Fix wakeup statistics updates for polling state ASoC: qdsp6: q6asm-dai: checking NULL vs IS_ERR() powerpc/time: Use clockevents_register_device(), fixing an issue with large decrementer powerpc/64s/radix: Explicitly flush ERAT with local LPID invalidation ata: ep93xx: Use proper enums for directions qed: Avoid implicit enum conversion in qed_ooo_submit_tx_buffers media: rc: ir-rc6-decoder: enable toggle bit for Kathrein RCU-676 remote media: pxa_camera: Fix check for pdev->dev.of_node media: rcar-vin: fix redeclaration of symbol media: i2c: adv748x: Support probing a single output ALSA: hda/sigmatel - Disable automute for Elo VuPoint bnxt_en: return proper error when FW returns HWRM_ERR_CODE_RESOURCE_ACCESS_DENIED KVM: PPC: Book3S PR: Exiting split hack mode needs to fixup both PC and LR USB: serial: cypress_m8: fix interrupt-out transfer length usb: dwc2: disable power_down on rockchip devices mtd: physmap_of: Release resources on error cpu/SMT: State SMT is disabled even with nosmt and without "=force" brcmfmac: reduce timeout for action frame scan brcmfmac: fix full timeout waiting for action frame on-channel tx qtnfmac: request userspace to do OBSS scanning if FW can not qtnfmac: pass sgi rate info flag to wireless core qtnfmac: inform wireless core about supported extended capabilities qtnfmac: drop error reports for out-of-bounds key indexes clk: samsung: Use NOIRQ stage for Exynos5433 clocks suspend/resume clk: samsung: exynos5420: Define CLK_SECKEY gate clock only or Exynos5420 clk: samsung: Use clk_hw API for calling clk framework from clk notifiers i2c: brcmstb: Allow enabling the driver on DSL SoCs printk: Correct wrong casting NFSv4.x: fix lock recovery during delegation recall dmaengine: ioat: fix prototype of ioat_enumerate_channels media: ov5640: fix framerate update media: cec-gpio: select correct Signal Free Time gfs2: slow the deluge of io error messages i2c: omap: use core to detect 'no zero length' quirk i2c: qup: use core to detect 'no zero length' quirk i2c: tegra: use core to detect 'no zero length' quirk i2c: zx2967: use core to detect 'no zero length' quirk Input: st1232 - set INPUT_PROP_DIRECT property Input: silead - try firmware reload after unsuccessful resume soc: fsl: bman_portals: defer probe after bman's probe net: hns3: Fix for rx vlan id handle to support Rev 0x21 hardware tc-testing: fix build of eBPF programs remoteproc: Check for NULL firmwares in sysfs interface remoteproc: qcom: q6v5: Fix a race condition on fatal crash kexec: Allocate decrypted control pages for kdump if SME is enabled x86/olpc: Fix build error with CONFIG_MFD_CS5535=m dmaengine: rcar-dmac: set scatter/gather max segment size crypto: mxs-dcp - Fix SHA null hashes and output length crypto: mxs-dcp - Fix AES issues xfrm: use correct size to initialise sp->ovec ACPI / SBS: Fix rare oops when removing modules iwlwifi: mvm: don't send keys when entering D3 xsk: proper AF_XDP socket teardown ordering x86/fsgsbase/64: Fix ptrace() to read the FS/GS base accurately mmc: renesas_sdhi_internal_dmac: Whitelist r8a774a1 mmc: tmio: Fix SCC error detection mmc: renesas_sdhi_internal_dmac: set scatter/gather max segment size atmel_lcdfb: support native-mode display-timings fbdev: sbuslib: use checked version of put_user() fbdev: sbuslib: integer overflow in sbusfb_ioctl_helper() fbdev: fix broken menu dependencies reset: Fix potential use-after-free in __of_reset_control_get() bcache: account size of buckets used in uuid write to ca->meta_sectors_written bcache: recal cached_dev_sectors on detach platform/x86: mlx-platform: Properly use mlxplat_mlxcpld_msn201x_items media: dw9714: Fix error handling in probe function media: dw9807-vcm: Fix probe error handling media: cx18: Don't check for address of video_dev mtd: spi-nor: cadence-quadspi: Use proper enum for dma_[un]map_single mtd: devices: m25p80: Make sure WRITE_EN is issued before each write x86/intel_rdt: Introduce utility to obtain CDP peer x86/intel_rdt: CBM overlap should also check for overlap with CDP peer mmc: mmci: expand startbiterr to irqmask and error check s390/kasan: avoid vdso instrumentation s390/kasan: avoid instrumentation of early C code s390/kasan: avoid user access code instrumentation proc/vmcore: Fix i386 build error of missing copy_oldmem_page_encrypted() backlight: lm3639: Unconditionally call led_classdev_unregister mfd: ti_am335x_tscadc: Keep ADC interface on if child is wakeup capable printk: Give error on attempt to set log buffer length to over 2G media: isif: fix a NULL pointer dereference bug GFS2: Flush the GFS2 delete workqueue before stopping the kernel threads media: cx231xx: fix potential sign-extension overflow on large shift media: venus: vdec: fix decoded data size ALSA: hda/ca0132 - Fix input effect controls for desktop cards lightnvm: pblk: fix rqd.error return value in pblk_blk_erase_sync lightnvm: pblk: fix incorrect min_write_pgs lightnvm: pblk: guarantee emeta on line close lightnvm: pblk: fix write amplificiation calculation lightnvm: pblk: guarantee mw_cunits on read buffer lightnvm: do no update csecs and sos on 1.2 lightnvm: pblk: fix error handling of pblk_lines_init() lightnvm: pblk: consider max hw sectors supported for max_write_pgs x86/kexec: Correct KEXEC_BACKUP_SRC_END off-by-one error bpf: btf: Fix a missing check bug net: fix generic XDP to handle if eth header was mangled gpio: syscon: Fix possible NULL ptr usage spi: fsl-lpspi: Prevent FIFO under/overrun by default pinctrl: gemini: Mask and set properly spi: spidev: Fix OF tree warning logic ARM: 8802/1: Call syscall_trace_exit even when system call skipped x86/mm: Do not warn about PCI BIOS W+X mappings orangefs: rate limit the client not running info message pinctrl: gemini: Fix up TVC clock group scsi: arcmsr: clean up clang warning on extraneous parentheses hwmon: (k10temp) Support all Family 15h Model 6xh and Model 7xh processors hwmon: (nct6775) Fix names of DIMM temperature sources hwmon: (pwm-fan) Silence error on probe deferral hwmon: (ina3221) Fix INA3221_CONFIG_MODE macros hwmon: (npcm-750-pwm-fan) Change initial pwm target to 255 selftests: forwarding: Have lldpad_app_wait_set() wait for unknown, too net: sched: avoid writing on noop_qdisc netfilter: nft_compat: do not dump private area misc: cxl: Fix possible null pointer dereference mac80211: minstrel: fix using short preamble CCK rates on HT clients mac80211: minstrel: fix CCK rate group streams value mac80211: minstrel: fix sampling/reporting of CCK rates in HT mode spi: rockchip: initialize dma_slave_config properly mlxsw: spectrum_switchdev: Check notification relevance based on upper device ARM: dts: omap5: Fix dual-role mode on Super-Speed port tcp: start receiver buffer autotuning sooner ACPI / LPSS: Use acpi_lpss_* instead of acpi_subsys_* functions for hibernate PM / devfreq: Fix static checker warning in try_then_request_governor tools: PCI: Fix broken pcitest compilation powerpc/time: Fix clockevent_decrementer initalisation for PR KVM mmc: tmio: fix SCC error handling to avoid false positive CRC error x86/resctrl: Fix rdt_find_domain() return value and checks Linux 4.19.86 Signed-off-by: Greg Kroah-Hartman <gregkh@google.com> Change-Id: Ib9de820e5026cadf4fab89e69d1324302cdae9c3
294 lines
9.3 KiB
C
294 lines
9.3 KiB
C
/*
|
|
* cpuidle.h - a generic framework for CPU idle power management
|
|
*
|
|
* (C) 2007 Venkatesh Pallipadi <venkatesh.pallipadi@intel.com>
|
|
* Shaohua Li <shaohua.li@intel.com>
|
|
* Adam Belay <abelay@novell.com>
|
|
*
|
|
* This code is licenced under the GPL.
|
|
*/
|
|
|
|
#ifndef _LINUX_CPUIDLE_H
|
|
#define _LINUX_CPUIDLE_H
|
|
|
|
#include <linux/percpu.h>
|
|
#include <linux/list.h>
|
|
#include <linux/hrtimer.h>
|
|
|
|
#define CPUIDLE_STATE_MAX 10
|
|
#define CPUIDLE_NAME_LEN 16
|
|
#define CPUIDLE_DESC_LEN 32
|
|
|
|
struct module;
|
|
|
|
struct cpuidle_device;
|
|
struct cpuidle_driver;
|
|
|
|
|
|
/****************************
|
|
* CPUIDLE DEVICE INTERFACE *
|
|
****************************/
|
|
|
|
struct cpuidle_state_usage {
|
|
unsigned long long disable;
|
|
unsigned long long usage;
|
|
unsigned long long time; /* in US */
|
|
#ifdef CONFIG_SUSPEND
|
|
unsigned long long s2idle_usage;
|
|
unsigned long long s2idle_time; /* in US */
|
|
#endif
|
|
};
|
|
|
|
struct cpuidle_state {
|
|
char name[CPUIDLE_NAME_LEN];
|
|
char desc[CPUIDLE_DESC_LEN];
|
|
|
|
unsigned int flags;
|
|
unsigned int exit_latency; /* in US */
|
|
int power_usage; /* in mW */
|
|
unsigned int target_residency; /* in US */
|
|
bool disabled; /* disabled on all CPUs */
|
|
|
|
int (*enter) (struct cpuidle_device *dev,
|
|
struct cpuidle_driver *drv,
|
|
int index);
|
|
|
|
int (*enter_dead) (struct cpuidle_device *dev, int index);
|
|
|
|
/*
|
|
* CPUs execute ->enter_s2idle with the local tick or entire timekeeping
|
|
* suspended, so it must not re-enable interrupts at any point (even
|
|
* temporarily) or attempt to change states of clock event devices.
|
|
*/
|
|
void (*enter_s2idle) (struct cpuidle_device *dev,
|
|
struct cpuidle_driver *drv,
|
|
int index);
|
|
};
|
|
|
|
/* Idle State Flags */
|
|
#define CPUIDLE_FLAG_NONE (0x00)
|
|
#define CPUIDLE_FLAG_POLLING (0x01) /* polling state */
|
|
#define CPUIDLE_FLAG_COUPLED (0x02) /* state applies to multiple cpus */
|
|
#define CPUIDLE_FLAG_TIMER_STOP (0x04) /* timer is stopped on this state */
|
|
|
|
#define CPUIDLE_DRIVER_FLAGS_MASK (0xFFFF0000)
|
|
|
|
struct cpuidle_device_kobj;
|
|
struct cpuidle_state_kobj;
|
|
struct cpuidle_driver_kobj;
|
|
|
|
struct cpuidle_device {
|
|
unsigned int registered:1;
|
|
unsigned int enabled:1;
|
|
unsigned int use_deepest_state:1;
|
|
unsigned int poll_time_limit:1;
|
|
unsigned int cpu;
|
|
|
|
int last_residency;
|
|
struct cpuidle_state_usage states_usage[CPUIDLE_STATE_MAX];
|
|
struct cpuidle_state_kobj *kobjs[CPUIDLE_STATE_MAX];
|
|
struct cpuidle_driver_kobj *kobj_driver;
|
|
struct cpuidle_device_kobj *kobj_dev;
|
|
struct list_head device_list;
|
|
|
|
#ifdef CONFIG_ARCH_NEEDS_CPU_IDLE_COUPLED
|
|
cpumask_t coupled_cpus;
|
|
struct cpuidle_coupled *coupled;
|
|
#endif
|
|
};
|
|
|
|
DECLARE_PER_CPU(struct cpuidle_device *, cpuidle_devices);
|
|
DECLARE_PER_CPU(struct cpuidle_device, cpuidle_dev);
|
|
|
|
/**
|
|
* cpuidle_get_last_residency - retrieves the last state's residency time
|
|
* @dev: the target CPU
|
|
*/
|
|
static inline int cpuidle_get_last_residency(struct cpuidle_device *dev)
|
|
{
|
|
return dev->last_residency;
|
|
}
|
|
|
|
|
|
/****************************
|
|
* CPUIDLE DRIVER INTERFACE *
|
|
****************************/
|
|
|
|
struct cpuidle_driver {
|
|
const char *name;
|
|
struct module *owner;
|
|
int refcnt;
|
|
|
|
/* used by the cpuidle framework to setup the broadcast timer */
|
|
unsigned int bctimer:1;
|
|
/* states array must be ordered in decreasing power consumption */
|
|
struct cpuidle_state states[CPUIDLE_STATE_MAX];
|
|
int state_count;
|
|
int safe_state_index;
|
|
|
|
/* the driver handles the cpus in cpumask */
|
|
struct cpumask *cpumask;
|
|
};
|
|
|
|
#ifdef CONFIG_CPU_IDLE
|
|
extern void disable_cpuidle(void);
|
|
extern bool cpuidle_not_available(struct cpuidle_driver *drv,
|
|
struct cpuidle_device *dev);
|
|
|
|
extern int cpuidle_select(struct cpuidle_driver *drv,
|
|
struct cpuidle_device *dev,
|
|
bool *stop_tick);
|
|
extern int cpuidle_enter(struct cpuidle_driver *drv,
|
|
struct cpuidle_device *dev, int index);
|
|
extern void cpuidle_reflect(struct cpuidle_device *dev, int index);
|
|
|
|
extern int cpuidle_register_driver(struct cpuidle_driver *drv);
|
|
extern struct cpuidle_driver *cpuidle_get_driver(void);
|
|
extern struct cpuidle_driver *cpuidle_driver_ref(void);
|
|
extern void cpuidle_driver_unref(void);
|
|
extern void cpuidle_unregister_driver(struct cpuidle_driver *drv);
|
|
extern int cpuidle_register_device(struct cpuidle_device *dev);
|
|
extern void cpuidle_unregister_device(struct cpuidle_device *dev);
|
|
extern int cpuidle_register(struct cpuidle_driver *drv,
|
|
const struct cpumask *const coupled_cpus);
|
|
extern void cpuidle_unregister(struct cpuidle_driver *drv);
|
|
extern void cpuidle_pause_and_lock(void);
|
|
extern void cpuidle_resume_and_unlock(void);
|
|
extern void cpuidle_pause(void);
|
|
extern void cpuidle_resume(void);
|
|
extern int cpuidle_enable_device(struct cpuidle_device *dev);
|
|
extern void cpuidle_disable_device(struct cpuidle_device *dev);
|
|
extern int cpuidle_play_dead(void);
|
|
|
|
extern struct cpuidle_driver *cpuidle_get_cpu_driver(struct cpuidle_device *dev);
|
|
static inline struct cpuidle_device *cpuidle_get_device(void)
|
|
{return __this_cpu_read(cpuidle_devices); }
|
|
#else
|
|
static inline void disable_cpuidle(void) { }
|
|
static inline bool cpuidle_not_available(struct cpuidle_driver *drv,
|
|
struct cpuidle_device *dev)
|
|
{return true; }
|
|
static inline int cpuidle_select(struct cpuidle_driver *drv,
|
|
struct cpuidle_device *dev, bool *stop_tick)
|
|
{return -ENODEV; }
|
|
static inline int cpuidle_enter(struct cpuidle_driver *drv,
|
|
struct cpuidle_device *dev, int index)
|
|
{return -ENODEV; }
|
|
static inline void cpuidle_reflect(struct cpuidle_device *dev, int index) { }
|
|
static inline int cpuidle_register_driver(struct cpuidle_driver *drv)
|
|
{return -ENODEV; }
|
|
static inline struct cpuidle_driver *cpuidle_get_driver(void) {return NULL; }
|
|
static inline struct cpuidle_driver *cpuidle_driver_ref(void) {return NULL; }
|
|
static inline void cpuidle_driver_unref(void) {}
|
|
static inline void cpuidle_unregister_driver(struct cpuidle_driver *drv) { }
|
|
static inline int cpuidle_register_device(struct cpuidle_device *dev)
|
|
{return -ENODEV; }
|
|
static inline void cpuidle_unregister_device(struct cpuidle_device *dev) { }
|
|
static inline int cpuidle_register(struct cpuidle_driver *drv,
|
|
const struct cpumask *const coupled_cpus)
|
|
{return -ENODEV; }
|
|
static inline void cpuidle_unregister(struct cpuidle_driver *drv) { }
|
|
static inline void cpuidle_pause_and_lock(void) { }
|
|
static inline void cpuidle_resume_and_unlock(void) { }
|
|
static inline void cpuidle_pause(void) { }
|
|
static inline void cpuidle_resume(void) { }
|
|
static inline int cpuidle_enable_device(struct cpuidle_device *dev)
|
|
{return -ENODEV; }
|
|
static inline void cpuidle_disable_device(struct cpuidle_device *dev) { }
|
|
static inline int cpuidle_play_dead(void) {return -ENODEV; }
|
|
static inline struct cpuidle_driver *cpuidle_get_cpu_driver(
|
|
struct cpuidle_device *dev) {return NULL; }
|
|
static inline struct cpuidle_device *cpuidle_get_device(void) {return NULL; }
|
|
#endif
|
|
|
|
#ifdef CONFIG_CPU_IDLE
|
|
extern int cpuidle_find_deepest_state(struct cpuidle_driver *drv,
|
|
struct cpuidle_device *dev);
|
|
extern int cpuidle_enter_s2idle(struct cpuidle_driver *drv,
|
|
struct cpuidle_device *dev);
|
|
extern void cpuidle_use_deepest_state(bool enable);
|
|
#else
|
|
static inline int cpuidle_find_deepest_state(struct cpuidle_driver *drv,
|
|
struct cpuidle_device *dev)
|
|
{return -ENODEV; }
|
|
static inline int cpuidle_enter_s2idle(struct cpuidle_driver *drv,
|
|
struct cpuidle_device *dev)
|
|
{return -ENODEV; }
|
|
static inline void cpuidle_use_deepest_state(bool enable)
|
|
{
|
|
}
|
|
#endif
|
|
|
|
/* kernel/sched/idle.c */
|
|
extern void sched_idle_set_state(struct cpuidle_state *idle_state, int index);
|
|
extern void default_idle_call(void);
|
|
|
|
#ifdef CONFIG_ARCH_NEEDS_CPU_IDLE_COUPLED
|
|
void cpuidle_coupled_parallel_barrier(struct cpuidle_device *dev, atomic_t *a);
|
|
#else
|
|
static inline void cpuidle_coupled_parallel_barrier(struct cpuidle_device *dev, atomic_t *a)
|
|
{
|
|
}
|
|
#endif
|
|
|
|
#if defined(CONFIG_CPU_IDLE) && defined(CONFIG_ARCH_HAS_CPU_RELAX)
|
|
void cpuidle_poll_state_init(struct cpuidle_driver *drv);
|
|
#else
|
|
static inline void cpuidle_poll_state_init(struct cpuidle_driver *drv) {}
|
|
#endif
|
|
|
|
/******************************
|
|
* CPUIDLE GOVERNOR INTERFACE *
|
|
******************************/
|
|
|
|
struct cpuidle_governor {
|
|
char name[CPUIDLE_NAME_LEN];
|
|
struct list_head governor_list;
|
|
unsigned int rating;
|
|
|
|
int (*enable) (struct cpuidle_driver *drv,
|
|
struct cpuidle_device *dev);
|
|
void (*disable) (struct cpuidle_driver *drv,
|
|
struct cpuidle_device *dev);
|
|
|
|
int (*select) (struct cpuidle_driver *drv,
|
|
struct cpuidle_device *dev,
|
|
bool *stop_tick);
|
|
void (*reflect) (struct cpuidle_device *dev, int index);
|
|
};
|
|
|
|
#ifdef CONFIG_CPU_IDLE
|
|
extern int cpuidle_register_governor(struct cpuidle_governor *gov);
|
|
extern int cpuidle_governor_latency_req(unsigned int cpu);
|
|
#else
|
|
static inline int cpuidle_register_governor(struct cpuidle_governor *gov)
|
|
{return 0;}
|
|
#endif
|
|
|
|
#define __CPU_PM_CPU_IDLE_ENTER(low_level_idle_enter, idx, is_retention) \
|
|
({ \
|
|
int __ret = 0; \
|
|
\
|
|
if (!idx) { \
|
|
cpu_do_idle(); \
|
|
return idx; \
|
|
} \
|
|
\
|
|
if (!is_retention) \
|
|
__ret = cpu_pm_enter(); \
|
|
if (!__ret) { \
|
|
__ret = low_level_idle_enter(idx); \
|
|
if (!is_retention) \
|
|
cpu_pm_exit(); \
|
|
} \
|
|
\
|
|
__ret ? -1 : idx; \
|
|
})
|
|
|
|
#define CPU_PM_CPU_IDLE_ENTER(low_level_idle_enter, idx) \
|
|
__CPU_PM_CPU_IDLE_ENTER(low_level_idle_enter, idx, 0)
|
|
|
|
#define CPU_PM_CPU_IDLE_ENTER_RETENTION(low_level_idle_enter, idx) \
|
|
__CPU_PM_CPU_IDLE_ENTER(low_level_idle_enter, idx, 1)
|
|
|
|
#endif /* _LINUX_CPUIDLE_H */
|