--- # Split out of _detect_hardware.yml so fixtures can seed the lscpu/lspci/lsusb # registers and assert the result with no real hardware. Keep regex exprs # double-quoted single-line: ansible-core 2.21 set_fact mangles backslash escapes # inside folded (>-) scalars. - name: Resolve detected hardware profile vars: _vendor_keys: "{{ environment_pci_vendor_map.keys() | list }}" _cpu_vendor_raw: "{{ _hardware_lscpu.stdout | regex_findall('(?im)^Vendor ID:\\s*(\\S+)') | first | default('') }}" _cpu_vendor: >- {{ 'intel' if _cpu_vendor_raw == 'GenuineIntel' else ('amd' if _cpu_vendor_raw == 'AuthenticAMD' else '') }} # PCI classes: 0300 = VGA, 0302 = 3D, 0280 = wireless network controller. _gpu_lines: "{{ _hardware_lspci.stdout_lines | select('search', '\\[(0300|0302)\\]:') | list }}" _gpu_pairs: "{{ (_gpu_lines | join('\n')) | regex_findall('\\[([0-9a-f]{4}):([0-9a-f]{4})\\]') | list }}" _gpu_vendor_ids: "{{ _gpu_pairs | map('first') | select('in', _vendor_keys) | list }}" _gpu_vendors: "{{ _gpu_vendor_ids | map('extract', environment_pci_vendor_map) | unique | list }}" _nvidia_device_ids: "{{ _gpu_pairs | selectattr('0', 'equalto', '10de') | map(attribute=1) | list }}" _nvidia_min_id: >- {{ (_nvidia_device_ids | map('int', base=16) | list | min) if _nvidia_device_ids | length > 0 else 0 }} # 0x1e00 = 7680 = first Turing device id; Turing+ supports nvidia-open. _nvidia_supports_open: "{{ _nvidia_device_ids | length > 0 and (_nvidia_min_id | int) >= 7680 }}" _wifi_lines: "{{ _hardware_lspci.stdout_lines | select('search', '\\[0280\\]:') | list }}" _wifi_vendor_ids: "{{ (_wifi_lines | join('\n')) | regex_findall('\\[([0-9a-f]{4}):[0-9a-f]{4}\\]') | select('in', _vendor_keys) | list }}" _wifi_vendors: "{{ _wifi_vendor_ids | map('extract', environment_pci_vendor_map) | unique | list }}" # PCI class 0403 = audio device (HD-audio controller). Vendor drives SOF/firmware. _audio_lines: "{{ _hardware_lspci.stdout_lines | select('search', '\\[0403\\]:') | list }}" _audio_vendor_ids: "{{ (_audio_lines | join('\n')) | regex_findall('\\[([0-9a-f]{4}):[0-9a-f]{4}\\]') | select('in', _vendor_keys) | list }}" _audio_vendors: "{{ _audio_vendor_ids | map('extract', environment_pci_vendor_map) | unique | list }}" _fingerprint_present: "{{ (_hardware_lsusb.stdout | default('')) | regex_search('(?i)ID (' ~ (environment_fingerprint_vendor_ids | join('|')) ~ '):') is not none }}" _camera_uvc_present: "{{ (_hardware_lsusb.stdout | default('')) is search('(?i)camera|webcam') }}" # Intel IPU6 MIPI camera: PCI class 0480 (multimedia) under Intel 8086, or an ISP description. Out-of-tree userspace. _camera_ipu6_desc: "{{ (_hardware_lspci.stdout | default('')) is search('(?i)image signal processor|IPU6') }}" _camera_ipu6_pci: "{{ (_hardware_lspci.stdout_lines | select('search', '\\[0480\\]:') | select('search', '\\[8086:') | list) | length > 0 }}" # No backslash escapes here, so a folded scalar is safe (unlike the \[..\] regexes above). _bluetooth_present: >- {{ ((_hardware_lsusb.stdout | default('')) | regex_search('(?i)ID (' ~ (environment_bluetooth_vendor_ids | join('|')) ~ '):') is not none) or ((_hardware_lsusb.stdout | default('')) is search('(?i)bluetooth')) }} ansible.builtin.set_fact: hardware_profile_active: cpu: "{{ _cpu_vendor }}" gpus: "{{ _gpu_vendors }}" nvidia_supports_open: "{{ _nvidia_supports_open | bool }}" wireless: "{{ _wifi_vendors }}" audio: "{{ _audio_vendors }}" fingerprint: "{{ _fingerprint_present | bool }}" bluetooth: "{{ _bluetooth_present | bool }}" camera: uvc: "{{ _camera_uvc_present | bool }}" ipu6: "{{ (_camera_ipu6_desc | bool) or (_camera_ipu6_pci | bool) }}"