diff options
author | Anshuman Gupta <anshuman.gupta@intel.com> | 2022-05-17 19:01:10 +0530 |
---|---|---|
committer | Ashutosh Dixit <ashutosh.dixit@intel.com> | 2022-05-18 09:28:41 -0700 |
commit | 930c3a5b40e739d46790beafa5b2725abe1be171 (patch) | |
tree | d8638620272c2160fa43e113f46e8d96e794b746 /lib | |
parent | 20a77efc9608910ca4b0da5491bc4e58102d87ef (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.c | 48 | ||||
-rw-r--r-- | lib/igt_pm.h | 3 |
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); |