alsa-utils/topology/nhlt/nhlt.h

182 lines
4.9 KiB
C
Raw Normal View History

// SPDX-License-Identifier: BSD-3-Clause
//
// Copyright(c) 2021 Intel Corporation. All rights reserved.
//
// Author: Jaska Uimonen <jaska.uimonen@linux.intel.com>
#ifndef __NHLT_H
#define __NHLT_H
#include <stdint.h>
/*
* Nhlt defines and structs are derived from:
* https://01.org/sites/default/files/595976_intel_sst_nhlt.pdf
*
* Acpi description header for example:
* https://uefi.org/sites/default/files/resources/ACPI_6_3_final_Jan30.pdf
*
* Idea is to generate similar blob as you would get from:
* 'cat /sys/firmware/acpi/tables/NHLT'
*
*/
#define NHLT_LINK_TYPE_HDAUDIO 0
#define NHLT_LINK_TYPE_DSP 1
#define NHLT_LINK_TYPE_PDM 2
#define NHLT_LINK_TYPE_SSP 3
#define NHLT_LINK_TYPE_SLIMBUS 4
#define NHLT_LINK_TYPE_SOUNDWIRE 5
#define NHLT_VENDOR_ID_INTEL 0x8086
#define NHLT_DEVICE_ID_INTEL_PDM_DMIC 0xAE20
#define NHLT_DEVICE_ID_INTEL_BT_SIDEBAND 0xAE30
#define NHLT_DEVICE_ID_INTEL_I2S_TDM 0xAE34
#define NHLT_DEVICE_TYPE_SSP_BT_SIDEBAND 0
#define NHLT_DEVICE_TYPE_SSP_FM 1
#define NHLT_DEVICE_TYPE_SSP_MODEM 2
#define NHLT_DEVICE_TYPE_SSP_ANALOG 4
#define NHLT_ENDPOINT_DIRECTION_RENDER 0
#define NHLT_ENDPOINT_DIRECTION_CAPTURE 1
#define NHLT_ENDPOINT_DIRECTION_RENDER_WITH_LOOPBACK 2
#define NHLT_ENDPOINT_DIRECTION_FEEDBACK_FOR_RENDER 3
#define NHLT_DEVICE_CONFIG_TYPE_GENERIC 0
#define NHLT_DEVICE_CONFIG_TYPE_MICARRAY 1
#define NHLT_DEVICE_CONFIG_TYPE_RENDERWITHLOOPBACK 2
#define NHLT_DEVICE_CONFIG_TYPE_RENDERFEEDBACK 3
#define NHLT_MIC_ARRAY_TYPE_LINEAR_2_ELEMENT_SMALL 0xA
#define NHLT_MIC_ARRAY_TYPE_LINEAR_2_ELEMENT_BIG 0xB
#define NHLT_MIC_ARRAY_TYPE_LINEAR_4_ELEMENT_1ST_GEOMETRY 0xC
#define NHLT_MIC_ARRAY_TYPE_PLANAR_4_ELEMENT_L_SHAPED 0xD
#define NHLT_MIC_ARRAY_TYPE_PLANAR_4_ELEMENT_2ND_GEOMETRY 0xE
#define NHLT_MIC_ARRAY_TYPE_VENDOR_DEFINED 0xF
#define NHLT_MIC_ARRAY_NO_EXTENSION 0x0
#define NHLT_MIC_ARRAY_SNR_AND_SENSITIVITY_EXTENSION 0x1
#define NHLT_MIC_TYPE_OMNIDIRECTIONAL 0
#define NHLT_MIC_TYPE_SUBCARDIOID 1
#define NHLT_MIC_TYPE_CARDIOID 2
#define NHLT_MIC_TYPE_SUPERCARDIOID 3
#define NHLT_MIC_TYPE_HYPERCARDIOID 4
#define NHLT_MIC_TYPE_8SHAPED 5
#define NHLT_MIC_TYPE_RESERVED 6
#define NHLT_MIC_TYPE_VENDORDEFINED 7
#define NHLT_MIC_POSITION_TOP 0
#define NHLT_MIC_POSITION_BOTTOM 1
#define NHLT_MIC_POSITION_LEFT 2
#define NHLT_MIC_POSITION_RIGHT 3
#define NHLT_MIC_POSITION_FRONT 4 /*(default) */
#define NHLT_MIC_POSITION_REAR 5
struct specific_config {
uint32_t capabilities_size; /* does not include size of this field */
uint8_t capabilities[];
} __attribute__((packed));
struct device_specific_config {
uint8_t virtual_slot;
uint8_t config_type;
} __attribute__((packed));
struct ssp_device_specific_config {
struct specific_config config;
struct device_specific_config device_config;
} __attribute__((packed));
struct mic_snr_sensitivity_extension {
uint32_t snr;
uint32_t sensitivity;
} __attribute__((packed));
struct mic_vendor_config {
uint8_t type;
uint8_t panel;
uint32_t speaker_position_distance;
uint32_t horizontal_offset;
uint32_t vertical_offset;
uint8_t frequency_low_band;
uint8_t frequency_high_band;
uint16_t direction_angle;
uint16_t elevation_angle;
uint16_t vertical_angle_begin;
uint16_t vertical_angle_end;
uint16_t horizontal_angle_begin;
uint16_t horizontal_angle_end;
} __attribute__((packed));
struct mic_array_device_specific_config {
struct specific_config config;
struct device_specific_config device_config;
uint8_t array_type_ex;
} __attribute__((packed));
struct mic_array_device_specific_vendor_config {
struct specific_config config;
struct device_specific_config device_config;
uint8_t array_type_ex;
uint8_t number_of_microphones;
uint8_t mic_vendor_configs[];
} __attribute__((packed));
struct WAVEFORMATEXTENSIBLE {
uint16_t wFormatTag;
uint16_t nChannels;
uint32_t nSamplesPerSec;
uint32_t nAvgBytesPerSec;
uint16_t nBlockAlign;
uint16_t wBitsPerSample;
uint16_t cbSize;
uint16_t wValidBitsPerSample;
uint32_t dwChannelMask;
uint32_t SubFormat[4];
} __attribute__((packed));
struct format_config {
struct WAVEFORMATEXTENSIBLE format;
struct specific_config vendor_blob;
} __attribute__((packed));
struct formats_config {
uint8_t formats_count;
uint8_t f_configs[];
} __attribute__((packed));
struct endpoint_descriptor {
uint32_t length; /* includes the length of this field also */
uint8_t link_type;
uint8_t instance_id;
uint16_t vendor_id;
uint16_t device_id;
uint16_t revision_id;
uint32_t subsystem_id;
uint8_t device_type;
uint8_t direction;
uint8_t virtualbus_id;
} __attribute__((packed));
struct efi_acpi_description_header {
uint32_t signature;
uint32_t length;
uint8_t revision;
uint8_t checksum;
uint8_t oem_id[6];
uint64_t oem_table_id;
uint32_t oem_revision;
uint32_t creator_id;
uint32_t creator_revision;
} __attribute__((packed));
struct nhlt {
struct efi_acpi_description_header efi_acpi;
uint8_t endpoint_count;
uint8_t endpoints[];
} __attribute__((packed));
#endif /* __NHLT_H */