tici: speedup power save setting (#29100)

* speedup

* update type

---------

Co-authored-by: Comma Device <device@comma.ai>
pull/29102/head
Adeeb Shihadeh 2 years ago committed by GitHub
parent 128f261173
commit d92c9aef23
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
  1. 3
      Jenkinsfile
  2. 22
      common/gpio.py
  3. 40
      system/hardware/tici/hardware.py
  4. 31
      system/hardware/tici/tests/test_hardware.py
  5. 4
      system/sensord/tests/test_sensord.py

3
Jenkinsfile vendored

@ -166,7 +166,8 @@ pipeline {
["test sensord", "cd system/sensord/tests && python -m unittest test_sensord.py"], ["test sensord", "cd system/sensord/tests && python -m unittest test_sensord.py"],
["test camerad", "python system/camerad/test/test_camerad.py"], ["test camerad", "python system/camerad/test/test_camerad.py"],
["test exposure", "python system/camerad/test/test_exposure.py"], ["test exposure", "python system/camerad/test/test_exposure.py"],
["test amp", "python system/hardware/tici/tests/test_amplifier.py"], ["test amp", "pytest system/hardware/tici/tests/test_amplifier.py"],
["test hw", "pytest system/hardware/tici/tests/test_hardware.py"],
["test rawgpsd", "python system/sensord/rawgps/test_rawgps.py"], ["test rawgpsd", "python system/sensord/rawgps/test_rawgps.py"],
]) ])
} }

@ -1,4 +1,4 @@
import glob from functools import cache
from typing import Optional, List from typing import Optional, List
def gpio_init(pin: int, output: bool) -> None: def gpio_init(pin: int, output: bool) -> None:
@ -25,12 +25,20 @@ def gpio_read(pin: int) -> Optional[bool]:
return val return val
def get_irq_for_action(action: str) -> List[int]: @cache
ret = [] def get_irq_action(irq: int) -> List[str]:
for fn in glob.glob('/sys/kernel/irq/*/actions'): try:
with open(fn) as f: with open(f"/sys/kernel/irq/{irq}/actions") as f:
actions = f.read().strip().split(',') actions = f.read().strip().split(',')
if action in actions: return actions
irq = int(fn.split('/')[-2]) except FileNotFoundError:
return []
def get_irqs_for_action(action: str) -> List[str]:
ret = []
with open("/proc/interrupts") as f:
for l in f.readlines():
irq = l.split(':')[0].strip()
if irq.isdigit() and action in get_irq_action(irq):
ret.append(irq) ret.append(irq)
return ret return ret

@ -8,7 +8,7 @@ from functools import cached_property, lru_cache
from pathlib import Path from pathlib import Path
from cereal import log from cereal import log
from common.gpio import gpio_set, gpio_init, get_irq_for_action from common.gpio import gpio_set, gpio_init, get_irqs_for_action
from system.hardware.base import HardwareBase, ThermalConfig from system.hardware.base import HardwareBase, ThermalConfig
from system.hardware.tici import iwlist from system.hardware.tici import iwlist
from system.hardware.tici.pins import GPIO from system.hardware.tici.pins import GPIO
@ -61,17 +61,27 @@ MM_MODEM_ACCESS_TECHNOLOGY_LTE = 1 << 14
def sudo_write(val, path): def sudo_write(val, path):
try:
with open(path, 'w') as f:
f.write(str(val))
except PermissionError:
os.system(f"sudo chmod a+w {path}")
try:
with open(path, 'w') as f:
f.write(str(val))
except PermissionError:
# fallback for debugfs files
os.system(f"sudo su -c 'echo {val} > {path}'") os.system(f"sudo su -c 'echo {val} > {path}'")
def affine_irq(val, action): def affine_irq(val, action):
irq = get_irq_for_action(action) irqs = get_irqs_for_action(action)
if len(irq) == 0: if len(irqs) == 0:
print(f"No IRQs found for '{action}'") print(f"No IRQs found for '{action}'")
return return
for i in irq:
sudo_write(str(val), f"/proc/irq/{i}/smp_affinity_list")
for i in irqs:
sudo_write(str(val), f"/proc/irq/{i}/smp_affinity_list")
class Tici(HardwareBase): class Tici(HardwareBase):
@cached_property @cached_property
@ -438,17 +448,17 @@ class Tici(HardwareBase):
# *** IRQ config *** # *** IRQ config ***
# GPU
affine_irq(5, "kgsl-3d0")
# boardd core # boardd core
affine_irq(4, "spi_geni") # SPI affine_irq(4, "spi_geni") # SPI
affine_irq(4, "xhci-hcd:usb3") # aux panda USB (or potentially anything else on USB) affine_irq(4, "xhci-hcd:usb3") # aux panda USB (or potentially anything else on USB)
if "tici" in self.get_device_type(): if "tici" in self.get_device_type():
affine_irq(4, "xhci-hcd:usb1") # internal panda USB affine_irq(4, "xhci-hcd:usb1") # internal panda USB (also modem)
# GPU
affine_irq(5, "kgsl-3d0")
# camerad core # camerad core
camera_irqs = ("cci", "cpas_camnoc", "cpas-cdm", "csid", "ife", "csid", "csid-lite", "ife-lite") camera_irqs = ("cci", "cpas_camnoc", "cpas-cdm", "csid", "ife", "csid-lite", "ife-lite")
for n in camera_irqs: for n in camera_irqs:
affine_irq(5, n) affine_irq(5, n)
@ -472,14 +482,14 @@ class Tici(HardwareBase):
# *** IRQ config *** # *** IRQ config ***
# move these off the default core
affine_irq(1, "msm_drm")
affine_irq(1, "msm_vidc")
affine_irq(1, "i2c_geni")
# mask off big cluster from default affinity # mask off big cluster from default affinity
sudo_write("f", "/proc/irq/default_smp_affinity") sudo_write("f", "/proc/irq/default_smp_affinity")
# move these off the default core
affine_irq(1, "msm_drm") # display
affine_irq(1, "msm_vidc") # encoders
affine_irq(1, "i2c_geni") # sensors
# *** GPU config *** # *** GPU config ***
# https://github.com/commaai/agnos-kernel-sdm845/blob/master/arch/arm64/boot/dts/qcom/sdm845-gpu.dtsi#L216 # https://github.com/commaai/agnos-kernel-sdm845/blob/master/arch/arm64/boot/dts/qcom/sdm845-gpu.dtsi#L216
sudo_write("1", "/sys/class/kgsl/kgsl-3d0/min_pwrlevel") sudo_write("1", "/sys/class/kgsl/kgsl-3d0/min_pwrlevel")

@ -0,0 +1,31 @@
#!/usr/bin/env python3
import time
import unittest
import numpy as np
from system.hardware import TICI
from system.hardware.tici.hardware import Tici
HARDWARE = Tici()
class TestHardware(unittest.TestCase):
@classmethod
def setUpClass(cls):
if not TICI:
raise unittest.SkipTest
def test_power_save_time(self):
ts = []
for _ in range(5):
for on in (True, False):
st = time.monotonic()
HARDWARE.set_power_save(on)
ts.append(time.monotonic() - st)
assert 0.1 < np.mean(ts) < 0.2
assert max(ts) < 0.3
if __name__ == "__main__":
unittest.main()

@ -7,7 +7,7 @@ from collections import namedtuple, defaultdict
import cereal.messaging as messaging import cereal.messaging as messaging
from cereal import log from cereal import log
from common.gpio import get_irq_for_action from common.gpio import get_irqs_for_action
from system.hardware import TICI from system.hardware import TICI
from selfdrive.manager.process_config import managed_processes from selfdrive.manager.process_config import managed_processes
@ -113,7 +113,7 @@ class TestSensord(unittest.TestCase):
cls.events = read_sensor_events(cls.sample_secs) cls.events = read_sensor_events(cls.sample_secs)
# determine sensord's irq # determine sensord's irq
cls.sensord_irq = get_irq_for_action("sensord")[0] cls.sensord_irq = get_irqs_for_action("sensord")[0]
finally: finally:
# teardown won't run if this doesn't succeed # teardown won't run if this doesn't succeed
managed_processes["sensord"].stop() managed_processes["sensord"].stop()

Loading…
Cancel
Save