rules: Add automatic suspend udev rules

The ChromeOS ecosystem has a large amount of testing, both automated
and manual across devices including measurement of power regressions.

It's safe to assume that any of these devices will handle USB
auto-suspend appropriately.  Use the script from ChromeOS
https://chromium.googlesource.com/chromiumos/platform2/+/master/power_manager/udev/gen_autosuspend_rules.py
to generate udev rules at build time.

This script in systemd `tools/chromeos/gen_autosuspend_rules.py` should be kept
in sync with the ChromeOS version of the script.

Manually added autosuspend devices should be placed in the new
template `rules/61-autosuspend-manual.rules`

Suggested-by: Hans de Goede <hdegoede@redhat.com>
Signed-off-by: Mario Limonciello <mario.limonciello@dell.com>
This commit is contained in:
Mario Limonciello 2019-09-09 22:49:35 +01:00 committed by Zbigniew Jędrzejewski-Szmek
parent 3a77f9fb4c
commit b61d777abe
5 changed files with 361 additions and 0 deletions

View File

@ -1464,6 +1464,9 @@ install_libsystemd_static = static_library(
libgcrypt],
c_args : libsystemd_c_args + (static_libsystemd_pic ? [] : ['-fno-PIC']))
#Generate autosuspend rules
make_autosuspend_rules_py = find_program('tools/make-autosuspend-rules.py')
############################################################
# binaries that have --help and are intended for use by humans,

View File

@ -0,0 +1,20 @@
# This udev rule is for any devices that should enter automatic suspend
# but are not already included in generated rules from ChromeOS via
# tools/make-autosuspend-rules.py
#
ACTION!="add", GOTO="autosuspend_manual_end"
SUBSYSTEM!="usb", GOTO="autosuspend_manual_end"
SUBSYSTEM=="usb", GOTO="autosuspend_manual_usb"
# USB rules
LABEL="autosuspend_manual_usb"
GOTO="autosuspend_manual_end"
# Enable autosuspend
LABEL="autosuspend_manual_enable"
TEST=="power/control", ATTR{power/control}="auto", GOTO="autosuspend_manual_end"
LABEL="autosuspend_manual_end"

View File

@ -14,6 +14,7 @@ rules = files('''
60-persistent-v4l.rules
60-sensor.rules
60-serial.rules
61-autosuspend-manual.rules
70-joystick.rules
70-mouse.rules
70-touchpad.rules
@ -44,3 +45,11 @@ foreach file : rules_in
install_dir : udevrulesdir)
all_rules += gen
endforeach
auto_suspend_rules = custom_target(
'60-autosuspend-chromeos.rules',
output : '60-autosuspend-chromeos.rules',
command : make_autosuspend_rules_py,
capture : true,
install : true,
install_dir: [udevrulesdir])

View File

@ -0,0 +1,315 @@
#!/usr/bin/env python2
# -*- coding: utf-8 -*-
# Copyright 2017 The Chromium OS Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
"""Autosuspend udev rule generator
This script is executed at build time to generate udev rules. The
resulting rules file is installed on the device, the script itself
is not.
"""
from __future__ import print_function
# List of USB devices (vendorid:productid) for which it is safe to enable
# autosuspend.
USB_IDS = []
# Host Controllers and internal hubs
USB_IDS += [
# Linux Host Controller (UHCI) (most older x86 boards)
'1d6b:0001',
# Linux Host Controller (EHCI) (all boards)
'1d6b:0002',
# Linux Host Controller (XHCI) (most newer boards)
'1d6b:0003',
# SMSC (Internal HSIC Hub) (most Exynos boards)
'0424:3503',
# Intel (Rate Matching Hub) (all x86 boards)
'05e3:0610',
# Intel (Internal Hub?) (peppy, falco)
'8087:0024',
# Genesys Logic (Internal Hub) (rambi)
'8087:8000',
]
# Webcams
USB_IDS += [
# Chicony (zgb)
'04f2:b1d8',
# Chicony (mario)
'04f2:b262',
# Chicony (stout)
'04f2:b2fe',
# Chicony (butterfly)
'04f2:b35f',
# Chicony (rambi)
'04f2:b443',
# Chicony (glados)
'04f2:b552',
# LiteOn (spring)
'058f:b001',
# Foxlink? (butterfly)
'05c8:0351',
# Foxlink? (butterfly)
'05c8:0355',
# Cheng Uei? (falco)
'05c8:036e',
# SuYin (parrot)
'064e:d251',
# Realtek (falco)
'0bda:571c',
# IMC Networks (squawks)
'13d3:5657',
# Sunplus (parrot)
'1bcf:2c17',
# (C-13HDO10B39N) (alex)
'2232:1013',
# (C-10HDP11538N) (lumpy)
'2232:1017',
# (Namuga) (link)
'2232:1033',
# (C-03FFM12339N) (daisy)
'2232:1037',
# (C-10HDO13531N) (peach)
'2232:1056',
# (NCM-G102) (samus)
'2232:6001',
# Acer (stout)
'5986:0299',
]
# Bluetooth Host Controller
USB_IDS += [
# Hon-hai (parrot)
'0489:e04e',
# Hon-hai (peppy)
'0489:e056',
# Hon-hai (Kahlee)
'0489:e09f',
# QCA6174A (delan)
'0489:e0a2',
# LiteOn (parrot)
'04ca:3006',
# LiteOn (aleena)
'04ca:3016',
# LiteOn (scarlet)
'04ca:301a',
# Atheros (stumpy, stout)
'0cf3:3004',
# Atheros (AR3011) (mario, alex, zgb)
'0cf3:3005',
# Atheros (stumyp)
'0cf3:3007',
# Atheros (butterfly)
'0cf3:311e',
# Atheros (scarlet)
'0cf3:e300',
# Marvell (rambi)
'1286:2046',
# Marvell (gru)
'1286:204e',
# Intel (rambi, samus)
'8087:07dc',
# Intel (strago, glados)
'8087:0a2a',
# Intel (octopus)
'8087:0aaa',
# Intel (hatch)
'8087:0026',
# Intel (atlas)
'8087:0025',
]
# WWAN (LTE)
USB_IDS += [
# Huawei (ME936) (kip)
'12d1:15bb',
# Fibocom (L850-GL) (coral, nautilus, sarien)
'2cb7:0007',
]
# Mass Storage
USB_IDS += [
# Genesys (SD card reader) (lumpy, link, peppy)
'05e3:0727',
# Realtek (SD card reader) (mario, alex)
'0bda:0138',
# Realtek (SD card reader) (helios)
'0bda:0136',
# Realtek (SD card reader) (falco)
'0bda:0177',
]
# Security Key
USB_IDS += [
# Yubico.com
'1050:0211',
# Yubico.com (HID firmware)
'1050:0200',
# Google Titan key
'18d1:5026',
]
# USB Audio devices
USB_IDS += [
# Google USB-C to 3.5mm Digital Headphone Jack Adapter 'Mir'
'18d1:5025',
# Google USB-C to 3.5mm Digital Headphone Jack Adapter 'Mir' (HID only)
'18d1:5029',
# Google USB-C to 3.5mm Digital Headphone Jack Adapter 2018 'Condor'
'18d1:5034',
# Google Pixel USB-C Earbuds 'Blackbird'
'18d1:5033',
# Libratone Q Adapt In-Ear USB-C Earphones, Made for Google
'03eb:2433',
# Moshi USB-C to 3.5 mm Adapter/Charger, Made for Google
'282b:48f0',
# Moshi USB-C to 3.5 mm Adapter/Charger, Made for Google (HID only)
'282b:0026',
# AiAiAi TMA-2 C60 Cable, Made for Google
'0572:1a08',
# Apple USB-C to 3.5mm Headphone Jack Adapter
'05ac:110a',
]
# List of PCI devices (vendorid:deviceid) for which it is safe to enable
# autosuspend.
PCI_IDS = []
# Intel
PCI_IDS += [
# Host bridge
'8086:590c',
# i915
'8086:591e',
# proc_thermal
'8086:1903',
# xhci_hcd
'8086:9d2f',
# intel_pmc_core
'8086:9d21',
# i801_smbus
'8086:9d23',
# iwlwifi
'8086:095a',
# GMM
'8086:1911',
# Thermal
'8086:9d31',
# MME
'8086:9d3a',
# CrOS EC
'8086:9d4b',
# PCH SPI
'8086:9d24',
# SATA
'8086:02d3',
# RAM memory
'8086:02ef',
# ISA bridge
'8086:0284',
# Communication controller
'8086:02e0',
# Network controller
'8086:02f0',
# Serial bus controller
'8086:02a4',
# USB controller
'8086:02ed',
# Graphics
'8086:9b41',
# DSP
'8086:02f9',
# Host bridge
'8086:9b61',
# Host bridge
'8086:9b71',
# PCI Bridge
'8086:02b0',
# i915 (atlas)
'8086:591c',
# iwlwifi (atlas)
'8086:2526',
]
# Samsung
PCI_IDS += [
# NVMe KUS030205M-B001
'144d:a806',
# NVMe MZVLB256HAHQ
'144d:a808',
]
# Lite-on
PCI_IDS += [
# 3C07110288
'14a4:9100',
]
# Seagate
PCI_IDS += [
# ZP256CM30011
'7089:5012',
]
# Kingston
PCI_IDS += [
# RBUSNS8154P3128GJ3
'2646:5008',
]
################################################################################
UDEV_RULE = """\
ACTION!="add", GOTO="autosuspend_end"
SUBSYSTEM!="i2c|pci|usb", GOTO="autosuspend_end"
SUBSYSTEM=="i2c", GOTO="autosuspend_i2c"
SUBSYSTEM=="pci", GOTO="autosuspend_pci"
SUBSYSTEM=="usb", GOTO="autosuspend_usb"
# I2C rules
LABEL="autosuspend_i2c"
ATTR{name}=="cyapa", ATTR{power/control}="on", GOTO="autosuspend_end"
GOTO="autosuspend_end"
# PCI rules
LABEL="autosuspend_pci"
%(pci_rules)s\
GOTO="autosuspend_end"
# USB rules
LABEL="autosuspend_usb"
%(usb_rules)s\
GOTO="autosuspend_end"
# Enable autosuspend
LABEL="autosuspend_enable"
TEST=="power/control", ATTR{power/control}="auto", GOTO="autosuspend_end"
LABEL="autosuspend_end"
"""
def main():
pci_rules = ''
for dev_ids in PCI_IDS:
vendor, device = dev_ids.split(':')
pci_rules += ('ATTR{vendor}=="0x%s", ATTR{device}=="0x%s", '
'GOTO="autosuspend_enable"\n' % (vendor, device))
usb_rules = ''
for dev_ids in USB_IDS:
vid, pid = dev_ids.split(':')
usb_rules += ('ATTR{idVendor}=="%s", ATTR{idProduct}=="%s", '
'GOTO="autosuspend_enable"\n' % (vid, pid))
print(UDEV_RULE % {'pci_rules': pci_rules, 'usb_rules': usb_rules})
if __name__ == '__main__':
main()

14
tools/make-autosuspend-rules.py Executable file
View File

@ -0,0 +1,14 @@
#!/usr/bin/env python3
# SPDX-License-Identifier: LGPL-2.1+
# Generate autosuspend rules for devices that have been whitelisted (IE tested)
# by the ChromeOS team. Please keep this script in sync with:
# https://chromium.googlesource.com/chromiumos/platform2/+/master/power_manager/udev/gen_autosuspend_rules.py
import sys
import chromeos.gen_autosuspend_rules
if __name__ == '__main__':
if len(sys.argv) > 1:
sys.stdout = open(sys.argv[1], 'w')
chromeos.gen_autosuspend_rules.main()