alsa-utils/topology/nhlt/nhlt.h
Jaska Uimonen f9e6010d5e topology: plugins - add Intel nhlt encoder plugin
Add Intel nhlt acpi table encoder plugin into topology2.0 processing.
Nhlt internal structure is defined in:
https://01.org/sites/default/files/595976_intel_sst_nhlt.pdf
Nhlt acpi table contain vendor specific binary data blobs that are used
in some Intel dsp platforms for configuring the dmic and ssp hardware.

The function of this code is mainly to generate the vendor specific
binary blobs, but as there is existing nhlt parser code and header in
kernel there's no point of re-inventing the container: just use the
existing nhlt acpi table format. Basically this code is creating similar
nhlt acpi table that you would get from: cat
/sys/firmware/acpi/tables/NHLT

This code will have implementation for dmic and ssp endpoints. Thus the
code will translate the topology dai tokens into vendor specific binary
blobs and pack them into nhlt acpi table. Ssp and dmic code is lifted
from Sound Open Firmware (sof) code base, thus it will have BSD-3
license.

This plugin can be enabled from command line with:

alsatplg -DPREPROCESS_PLUGINS="nhlt" -c foo.conf -p -o bar.tplg

You can also dump the nhlt binary into a file with additional define:

-DNHLT_BIN="nhlt.bin"

Link: https://github.com/alsa-project/alsa-utils/pull/129
Signed-off-by: Jaska Uimonen <jaska.uimonen@linux.intel.com>
Signed-off-by: Jaroslav Kysela <perex@perex.cz>
2022-05-03 13:24:03 +02:00

182 lines
4.9 KiB
C

// 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 */