summaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authorAnshuman Gupta <anshuman.gupta@intel.com>2022-05-17 19:01:10 +0530
committerAshutosh Dixit <ashutosh.dixit@intel.com>2022-05-18 09:28:41 -0700
commit930c3a5b40e739d46790beafa5b2725abe1be171 (patch)
treed8638620272c2160fa43e113f46e8d96e794b746 /lib
parent20a77efc9608910ca4b0da5491bc4e58102d87ef (diff)
lib: Optional autosuspend_delay_ms configuration
Add an option to configure autosuspend_delay_ms as i915 read autosuspend_delay_ms to all PCI devices under GFX root port. configuring autosuspend_delay_ms as optional. Signed-off-by: Anshuman Gupta <anshuman.gupta@intel.com> Reviewed-by: Badal Nilawar <badal.nilawar@intel.com>
Diffstat (limited to 'lib')
-rw-r--r--lib/igt_pm.c48
-rw-r--r--lib/igt_pm.h3
2 files changed, 41 insertions, 10 deletions
diff --git a/lib/igt_pm.c b/lib/igt_pm.c
index 4768deef..6ebbad33 100644
--- a/lib/igt_pm.c
+++ b/lib/igt_pm.c
@@ -988,11 +988,25 @@ static void igt_pm_write_power_attr(int fd, const char *val, int len)
igt_assert(strncmp(buf, val, len) == 0);
}
+static int igt_pm_get_autosuspend_delay(struct pci_device *pci_dev)
+{
+ char delay_str[64];
+ int delay, delay_fd;
+
+ delay_fd = igt_pm_get_power_attr_fd(pci_dev, "autosuspend_delay_ms");
+ if (igt_pm_read_power_attr(delay_fd, delay_str, 64, true))
+ igt_assert(sscanf(delay_str, "%d", &delay) > 0);
+
+ return delay;
+}
+
static void
-igt_pm_setup_pci_dev_power_attrs(struct pci_device *pci_dev, struct igt_pm_pci_dev_pwrattr *pwrattr)
+igt_pm_setup_pci_dev_power_attrs(struct pci_device *pci_dev,
+ struct igt_pm_pci_dev_pwrattr *pwrattr, int delay_ms)
{
int control_fd, delay_fd, control_size, delay_size;
char *control, *delay;
+ char buff[64];
delay_fd = igt_pm_get_power_attr_fd(pci_dev, "autosuspend_delay_ms");
control_fd = igt_pm_get_power_attr_fd(pci_dev, "control");
@@ -1022,7 +1036,12 @@ igt_pm_setup_pci_dev_power_attrs(struct pci_device *pci_dev, struct igt_pm_pci_d
write_power_attr:
- igt_pm_write_power_attr(delay_fd, "0\n", 2);
+ if (delay_ms >= 0) {
+ int wc;
+ wc = snprintf(buff, 64, "%d\n", delay_ms);
+ igt_pm_write_power_attr(delay_fd, buff, wc);
+ }
+
igt_pm_write_power_attr(control_fd, "auto\n", 5);
close(delay_fd);
@@ -1030,7 +1049,7 @@ write_power_attr:
}
static void
-igt_pm_setup_pci_card_power_attrs(struct pci_device *pci_dev, bool save_attrs)
+igt_pm_setup_pci_card_power_attrs(struct pci_device *pci_dev, bool save_attrs, int delay)
{
int primary, secondary, subordinate, ret;
struct pci_device_iterator *iter;
@@ -1052,11 +1071,15 @@ igt_pm_setup_pci_card_power_attrs(struct pci_device *pci_dev, bool save_attrs)
igt_assert(iter);
/* Setup power attrs for PCI root port */
- igt_pm_setup_pci_dev_power_attrs(pci_dev, save_attrs ? &__pci_dev_pwrattr[i++] : NULL);
+ igt_pm_setup_pci_dev_power_attrs(pci_dev,
+ save_attrs ? &__pci_dev_pwrattr[i++] : NULL,
+ delay);
+
while ((dev = pci_device_next(iter)) != NULL) {
if (dev->bus >= secondary && dev->bus <= subordinate) {
igt_pm_setup_pci_dev_power_attrs(dev,
- save_attrs ? &__pci_dev_pwrattr[i++] : NULL);
+ save_attrs ? &__pci_dev_pwrattr[i++] : NULL,
+ delay);
if (save_attrs)
igt_assert(i < MAX_PCI_DEVICES);
}
@@ -1067,14 +1090,21 @@ igt_pm_setup_pci_card_power_attrs(struct pci_device *pci_dev, bool save_attrs)
/**
* igt_pm_enable_pci_card_runtime_pm:
- * @pci_dev: root port pci_dev.
+ * @root: root port pci_dev.
+ * @i915: i915 pci_dev.
* Enable runtime PM for all PCI endpoints devices for a given root port by
* setting power/control attr to "auto" and setting autosuspend_delay_ms
* to zero.
*/
-void igt_pm_enable_pci_card_runtime_pm(struct pci_device *pci_dev)
+void igt_pm_enable_pci_card_runtime_pm(struct pci_device *root,
+ struct pci_device *i915)
{
- igt_pm_setup_pci_card_power_attrs(pci_dev, false);
+ int delay = -1;
+
+ if (i915)
+ delay = igt_pm_get_autosuspend_delay(i915);
+
+ igt_pm_setup_pci_card_power_attrs(root, false, delay);
pci_system_cleanup();
}
@@ -1089,7 +1119,7 @@ void igt_pm_enable_pci_card_runtime_pm(struct pci_device *pci_dev)
void igt_pm_setup_pci_card_runtime_pm(struct pci_device *pci_dev)
{
memset(__pci_dev_pwrattr, 0, sizeof(__pci_dev_pwrattr));
- igt_pm_setup_pci_card_power_attrs(pci_dev, true);
+ igt_pm_setup_pci_card_power_attrs(pci_dev, true, 0);
}
static void
diff --git a/lib/igt_pm.h b/lib/igt_pm.h
index c53dae2c..f28b6ebf 100644
--- a/lib/igt_pm.h
+++ b/lib/igt_pm.h
@@ -74,7 +74,8 @@ bool i915_output_is_lpsp_capable(int drm_fd, igt_output_t *output);
bool igt_pm_acpi_d3cold_supported(struct pci_device *pci_dev);
enum igt_acpi_d_state
igt_pm_get_acpi_real_d_state(struct pci_device *pci_dev);
-void igt_pm_enable_pci_card_runtime_pm(struct pci_device *pci_dev);
+void igt_pm_enable_pci_card_runtime_pm(struct pci_device *root,
+ struct pci_device *i915);
void igt_pm_setup_pci_card_runtime_pm(struct pci_device *pci_dev);
void igt_pm_restore_pci_card_runtime_pm(void);
void igt_pm_print_pci_card_runtime_status(void);