| # Manage CrOS Video Capabilities |
| We define static capabilities, because dynamic detection of capabilities may |
| fail in case of issues (e.g. a driver issue). If we used dynamic detection, |
| no capability would be detected, we would have not run a corresponding test, |
| and no failure would be reported. Instead, we prefer to run tests based on |
| static capabilities and to be alerted in case they fail, and make a decision |
| either to remove the static capability from configuration if the capability |
| should not supported, or that we need to fix an actual issue. |
| |
| ## Overview of components in the system |
| Autotest capability works with autotest. While autotest runs, the component |
| on DUT should be like the following. |
| |
| - /etc/autotest-capabilities/ |
| Installed by this package "autotest-capability". The configuration files which |
| defines the capabilities on the device. |
| |
| - /usr/local/autotest/cros/video/detectors |
| - DeviceCapability.py |
| Utility to parse the configuration and get the capabilities on the DUT. |
| - detectors/ |
| scripts to detect the hardware configuration on DUT. |
| |
| This document describes how the components work. |
| |
| ## Gentoo Package: autotest-capability |
| |
| This package will install the configuration files into |
| "/etc/autotest-capability/". Take board "jecht" as an example, there could be |
| the following files in the directory: |
| |
| |
| * managed-capabilities.yaml |
| * 15-chipset-bdw-capabilities.yaml |
| * 18-baseboard-jecht-capabilities.yaml |
| * 20-guado-capabilities.yaml |
| |
| managed-capabilities.yaml lists all possible capabilities managed |
| by the package. If an unexpected capability is found while discovering |
| board-specific capability definition files, |
| video\_VideoCapability (explained later) will fail. |
| |
| The remaining files contain capability configurations for the particular |
| board hierarchy and will be loaded in the order of their priorities (The first |
| number of the filename). Each of the file is installed by different overlays: |
| |
| * 15-chipset-bdw-capabilities.yaml: installed by "chipset-bdw" overlay |
| * 18-baseboard-jecht-capabilities.yaml: installed by "baseboard-jecht" overlay |
| * 20-guado-capabilities.yaml: installed by "overlay-guado" overlay |
| |
| |
| ## Capabilities Configuration |
| |
| We list all the the managed capabilities line by line in |
| "managed-capabilities.yaml". For example, |
| |
| |
| ``` |
| # This file list all the managed capabilities. These capabilities |
| # indicate the capabilities of the DUT. |
| - hw_dec_h264_1080_60 # Decode h264 1080p 60fps videos in hardware. |
| - hw_dec_h264_2160_30 # Decode h264 2160p 30fps videos in hardware. |
| - hw_enc_vp8_1080_30 # Encode vp8 1080p 30fps videos in hardware. |
| - hw_dec_jpeg # Decode mjpeg in hardware. |
| - builtin_usb_camera # DUT has a built-in USB camera. |
| - no builtin_mipi_camera # DUT doesn't have a built-in MIPI camera. |
| - no vivid_camera # vivid is not available on DUT. |
| - builtin_camera |
| - builtin_or_vivid_camera |
| ``` |
| |
| An unlisted capability will be treated as unknown capabilities, and will raise |
| exceptions while parsing the configuration yaml files. |
| |
| In the configuration of each level, it defines the most general capabilities. |
| For example, there could be the following capabilities defined |
| in 15-chipset-bsw-capabilities.yaml, |
| |
| |
| ``` |
| - hw_dec_h264_1080_60 |
| - builtin_usb_camera |
| - no builtin_mipi_camera |
| - no vivid_camera |
| - builtin_camera |
| - builtin_or_vivid_camera |
| ``` |
| |
| |
| It defines common capabilities for all chipset-bsw platforms. |
| We may override those settings in baseboard and board specific settings, |
| for example, removing camera capabilities and adding "hw\_dec\_h264\_2160\_30" in |
| "18-baseboard-jecht-capabilities.yaml". |
| |
| |
| ``` |
| - hw_dec_h264_2160_30 |
| - no builtin_or_vivid_camera |
| - no builtin_camera |
| - no builtin_usb_camera |
| ``` |
| |
| |
| Final capabilities after processing the above files: |
| |
| |
| ``` |
| hw_dec_h264_1080_60 |
| hw_dec_h264_2160_30 |
| ``` |
| |
| |
| |
| ### Disabling a capability temporarily |
| |
| In some cases, we may like to disable a capability temporarily, |
| while fixing a known issue, to prevent lab tests from failing. |
| Depending on how we disable the feature, the "avtest\_label\_detect" may or may |
| not detect the capability. To ignore the result of avtest\_label\_detect for it, |
| "disable _capability_" can be added in the configuration yaml, e.g., |
| |
| |
| ``` |
| - disable hw_dec_h264_2160_30 |
| ``` |
| |
| |
| If a capability will be disabled forever, it should either be removed from |
| the applicable configuration file, or overriden using the "no _capability_" |
| syntax instead. |
| |
| |
| ### SKU-specific Capabilities |
| |
| There could be more than one SKU for a single board, with different hardware, |
| and thus different capability sets. In such cases it is not possible to use |
| static configuration files and runtime detection is required. To support that, |
| capability files may contain hardware specific sections to define those |
| capabilities. A capability is applied only if the hardware configuration |
| detected in runtime matches the condition. |
| |
| |
| ### Detectors |
| |
| We use detectors to detect the hardware type or the existence of the hardware. |
| Those detectors are installed by autotest package on |
| the DUT directory: /usr/local/autotest/cros/video/detectors. |
| |
| |
| #### Detector: CPU Type |
| |
| There is a board which has a different specification if a cpu type is different. |
| For example, HW H264 encoding is unavailable only on panther boards whose cpu |
| type is intel celeron. The information is written in |
| "20-panther-capabilities.yaml." |
| |
| ``` |
| # HW encoding |
| - detector: intel_cpu |
| match: |
| - intel_celeron_2955U |
| capabilities: |
| - no hw_enc_h264_1080_30 |
| ``` |
| |
| 'detector' is the name of the running detector. In this case, "intel\_cpu.py" |
| in the detector directory will be executed. |
| 'match' is a list of all acceptable values, if the results of detector is one |
| of the values, then all capabilities in 'capability' will be applied. |
| |
| In this example, if intel\_cpu.py returns 'intel\_celeron\_2955U', |
| we disable HW h264 encoding. |
| |
| Detectors are python scripts which return a string. |
| It must have the function detect(). |
| For example, the following cpu detectors return "i5" or "m3" to indicate |
| the CPU on the DUT. |
| |
| |
| ``` |
| # cpu.py |
| def detect(): |
| |
| cpu_data = lscpu() |
| if ‘i5-7Y57’ in cpu_data.model_name: return ‘i5’ |
| if `m3-7y32’ in cpu_data.model_name: return ‘m3’ |
| throw Exception(“Unknown cpu: “ + cpu_data.model_name) |
| ``` |
| |
| ## Run video autotest with static capabilities |
| |
| In the current autotest system, autotest scheduler looks the labels on DUT, and |
| only runs a test if the DUT has labels required for the test. |
| |
| The goal of this work is to replace this mechanism and the need for autotest |
| labels with capability checks. All available tests would be executed |
| on all boards. Each test would first check if the required capabilities for it |
| are present. If a capability is found, the actual test is performed; if not, |
| the test returns TEST\_NA as a test result. |
| |
| This is realized by calling DeviceCapability().check\_capability(). |
| |
| [device\_capability.py](https://chromium.googlesource.com/chromiumos/third\_party/autotest/+/master/client/cros/video/device\_capability.py) |
| |
| ### DeviceCapability: decide if a test should run on DUT |
| |
| DeviceCapability is a class to check, based on static capability, |
| if a required capability is available on DUT. It constructs all the capabilities |
| from yaml files installed in the specified directory |
| (default path is /etc/autotest-capability). |
| A running detector is specified by a configuration file. |
| |
| A user of DeviceCapability mainly call the following two functions. |
| |
| __get_capability(cap)__ |
| |
| Query the status of a capability, |cap|. |cap| must be one of capabilities in |
| managed-capabilities.yaml. The return value is 'yes', 'disable' and 'no.' |
| |
| Obviously 'yes' means available, 'no' means unavailable. |
| 'disable' may be detectable and supported by hardware but we disable it due to |
| hardware/software issues. |
| |
| __ensure\_capability(cap)__ |
| |
| This is a similar to get\_capability. The difference is this throws |
| test.TestNAError unless the status of |cap| is 'yes'. |
| |
| |
| ### How to modify static capability |
| |
| __Modify a capability in an existing chipset/baseboard/board overlay__ |
| |
| Edit the existing yaml file, if any, or add a new yaml file to an existing |
| overlay. |
| It is worth noting that we will be notified if a test runs on DUT |
| without required capabilities. |
| For example, since IvyBridge doesn't support HW VP8 encoding, HW VP8 encoding |
| test will fail if it runs on IvyBridge device. |
| Following this observation, we should maximize the available capability rather |
| than minimize them when we set up the configuration. |
| Concretely, when one writes 'no _capability_', we should minimize the targeted |
| devices. |
| For example, in '20-peppy-capabilities.yaml', we disable HW h264 encoding |
| only if the CPU type is intel celeron 2955U. In other words, this describes |
| HW h264 encoding is available on all the peppy whose CPU type isn't intel |
| celeron 2955U. |
| |
| ``` |
| # HW encoding |
| - detector: intel_cpu |
| match: |
| - intel_celeron_2955U |
| capabilities: |
| - no hw_enc_h264_1080_30 |
| ``` |
| |
| Conversely, when one writes '_capability_', we should maximize the targeted |
| devices. |
| |
| __add an existing to chipset/baseboard/board__ |
| |
| Example of adding a new chipset overlay, "chipset-mhl" (standing for |
| Meihua Lake). |
| |
| Please create the following files. |
| |
| |
| ``` |
| chipset-mhl/chromeos-base/autotest-capability-chipset-mhl/autotest-capability-chipset-mhl.ebuild |
| chipset-mhl/chromeos-base/autotest-capability-chipset-mhl/files/15-chipset-mhl-capabilities.yaml |
| chipset-mhl/virtual/autotest-capability/autotest-capability-1.5.ebuild |
| ``` |
| |
| |
| The capabilities applicable to all boards for chipset-mhl should be listed |
| in the yaml file. |
| |
| The first two digits of yaml file, here 15, will be 18 and 20 for baseboard and |
| board, respectively. |
| |
| The PV of ebuild in virtual, here 1.5, will be 1.8 and 2.0 for baseboard and |
| board, respectively. |
| |
| __add a new capability__ |
| |
| First of all, you need to add the new capability to |
| //third\_party/chromiumos-overlay/chromeos-base/autotest-capability-default/files/managed-capabilities.yaml. |
| Set up the capability in applicable //overlays following two above ways. |
| |
| __add a new detector__ |
| |
| If some capabilities depend on the hardware configuration, it is necessary |
| to create a new detector if it is not available yet. All the detectors are put |
| in //third\_party/autotest/files/client/cros/video/detectors. |