From bce9e7942ad39b8ecbbe592e6cae351c34b6991f Mon Sep 17 00:00:00 2001 From: Sajid Dalvi Date: Tue, 27 Jul 2021 17:31:07 -0500 Subject: [PATCH] ANDROID: PCI/PM: Use usleep_range for d3hot_delay This patch implements a vendor hook that changes d3hot_delay to use usleep_range() instead of msleep() to reduce the resume time from 20ms to 10ms. The call sequence is as follows: pci_pm_resume_noirq() pci_pm_default_resume_early() pci_power_up() pci_raw_set_power_state() --> msleep(10) The default d3hot_delay is 10ms. Using msleep for delays less than 20ms could result in delays up to 20ms. Reference: Documentation/timers/timers-howto.rst Using usleep_range() results in the delay being closer to 10ms and this reduces the resume time. Bug: 194231641 Change-Id: If3e4dcfb99edad302371273933fa6784854cf892 Signed-off-by: Sajid Dalvi --- drivers/android/vendor_hooks.c | 2 ++ drivers/pci/pci.c | 11 +++++++++-- include/trace/hooks/pci.h | 22 ++++++++++++++++++++++ 3 files changed, 33 insertions(+), 2 deletions(-) create mode 100644 include/trace/hooks/pci.h diff --git a/drivers/android/vendor_hooks.c b/drivers/android/vendor_hooks.c index 0ae5d2f5e055..1302b9b0f5f2 100644 --- a/drivers/android/vendor_hooks.c +++ b/drivers/android/vendor_hooks.c @@ -73,6 +73,7 @@ #include #include #include +#include /* * Export tracepoints that act as a bare tracehook (ie: have no trace event @@ -378,3 +379,4 @@ EXPORT_TRACEPOINT_SYMBOL_GPL(android_rvh_tcp_recvmsg); EXPORT_TRACEPOINT_SYMBOL_GPL(android_rvh_udp_sendmsg); EXPORT_TRACEPOINT_SYMBOL_GPL(android_rvh_udp_recvmsg); EXPORT_TRACEPOINT_SYMBOL_GPL(android_rvh_tcp_recvmsg_stat); +EXPORT_TRACEPOINT_SYMBOL_GPL(android_rvh_pci_d3_sleep); diff --git a/drivers/pci/pci.c b/drivers/pci/pci.c index d5d9ea864fe6..e5c3fb43a791 100644 --- a/drivers/pci/pci.c +++ b/drivers/pci/pci.c @@ -31,6 +31,9 @@ #include #include #include +#ifndef __GENKSYMS__ +#include +#endif #include "pci.h" DEFINE_MUTEX(pci_slot_mutex); @@ -64,12 +67,16 @@ struct pci_pme_device { static void pci_dev_d3_sleep(struct pci_dev *dev) { unsigned int delay = dev->d3hot_delay; + int err = -EOPNOTSUPP; if (delay < pci_pm_d3hot_delay) delay = pci_pm_d3hot_delay; - if (delay) - msleep(delay); + if (delay) { + trace_android_rvh_pci_d3_sleep(dev, delay, &err); + if (err == -EOPNOTSUPP) + msleep(delay); + } } #ifdef CONFIG_PCI_DOMAINS diff --git a/include/trace/hooks/pci.h b/include/trace/hooks/pci.h new file mode 100644 index 000000000000..d9c5e4aec7d1 --- /dev/null +++ b/include/trace/hooks/pci.h @@ -0,0 +1,22 @@ +/* SPDX-License-Identifier: GPL-2.0 */ +#undef TRACE_SYSTEM +#define TRACE_SYSTEM pci +#define TRACE_INCLUDE_PATH trace/hooks + +#if !defined(_TRACE_HOOK_PCI_H) || defined(TRACE_HEADER_MULTI_READ) +#define _TRACE_HOOK_PCI_H +#include +#include +/* + * Following tracepoints are not exported in tracefs and provide a + * mechanism for vendor modules to hook and extend functionality + */ + +DECLARE_RESTRICTED_HOOK(android_rvh_pci_d3_sleep, + TP_PROTO(struct pci_dev *dev, unsigned int delay, int *err), + TP_ARGS(dev, delay, err), 1); + +#endif /* _TRACE_HOOK_PCI_H */ + +/* This part must be outside protection */ +#include