tools: rewrite make-autosuspend-rules.py and add udev rules

Concatenating strings is not a very efficient approach. And in this case fully
unnecessary. We also need some rules to make use of those hwdb entries.

PCI needs to be 8 characters, not 4. And we need to use uppercase hexadecimal
for both. With udev rules this made no difference, but hwdb match is case
sensitive.

Fixes #16119.
This commit is contained in:
Zbigniew Jędrzejewski-Szmek 2020-06-13 17:52:41 +02:00
parent 876c75fe87
commit 79dc5d35dd
3 changed files with 29 additions and 23 deletions

View File

@ -0,0 +1,14 @@
# do not edit this file, it will be overwritten on update
ACTION!="add", GOTO="autosuspend_end"
# I2C rules
SUBSYSTEM=="i2c", ATTR{name}=="cyapa", \
ATTR{power/control}="on", GOTO="autosuspend_end"
# Enable autosuspend if hwdb says so. Here we are relying on
# the hwdb import done earlier based on MODALIAS.
ENV{ID_AUTOSUSPEND}=="1", TEST=="power/control", \
ATTR{power/control}="auto"
LABEL="autosuspend_end"

View File

@ -1,6 +1,7 @@
# SPDX-License-Identifier: LGPL-2.1+
rules = files('''
60-autosuspend.rules
60-block.rules
60-cdrom_id.rules
60-drm.rules

View File

@ -2,32 +2,23 @@
# SPDX-License-Identifier: LGPL-2.1+
# Generate autosuspend rules for devices that have been whitelisted (IE tested)
# by the Chromium OS team. Please keep this script in sync with:
# by the Chromium OS team. Based on
# https://chromium.googlesource.com/chromiumos/platform2/+/master/power_manager/udev/gen_autosuspend_rules.py
import sys
import chromiumos.gen_autosuspend_rules
HWDB_FILE = """\
%(usb_entries)s\
%(pci_entries)s\
"""
print('# pci:v<00VENDOR>d<00DEVICE> (8 uppercase hexadecimal digits twice)')
for entry in chromiumos.gen_autosuspend_rules.PCI_IDS:
vendor, device = entry.split(':')
vendor = int(vendor, 16)
device = int(device, 16)
print(f'pci:v{vendor:08X}d{device:08X}*')
if __name__ == '__main__':
if len(sys.argv) > 1:
sys.stdout = open(sys.argv[1], 'w')
print('# usb:v<VEND>p<PROD> (4 uppercase hexadecimal digits twice')
for entry in chromiumos.gen_autosuspend_rules.USB_IDS:
vendor, product = entry.split(':')
vendor = int(vendor, 16)
product = int(product, 16)
print(f'usb:v{vendor:04X}p{product:04X}*')
pci_entries = ''
for dev_ids in chromiumos.gen_autosuspend_rules.PCI_IDS:
vendor, device = dev_ids.split(':')
pci_entries += ('usb:v%sp%s*\n'
' ID_AUTOSUSPEND=1\n' % (vendor, device))
usb_entries = ''
for dev_ids in chromiumos.gen_autosuspend_rules.USB_IDS:
vendor, device = dev_ids.split(':')
usb_entries += ('pci:v%sp%s*\n'
' ID_AUTOSUSPEND=1\n' % (vendor, device))
print(HWDB_FILE % {'pci_entries' : pci_entries, 'usb_entries': usb_entries})
print(' ID_AUTOSUSPEND=1')