zephyr/drivers/dai/intel/ssp/dai-params-intel-ipc4.h

335 lines
8.7 KiB
C

/*
* Copyright (c) 2022 Intel Corporation.
*
* SPDX-License-Identifier: Apache-2.0
*/
#ifndef __DAI_PARAMS_INTEL_IPC4_H__
#define __DAI_PARAMS_INTEL_IPC4_H__
#include <stdint.h>
#define DAI_INTEL_I2S_TDM_MAX_SLOT_MAP_COUNT 8
/**< Type of the gateway. */
enum dai_intel_ipc4_connector_node_id_type {
/**< HD/A host output (-> DSP). */
dai_intel_ipc4_hda_host_output_class = 0,
/**< HD/A host input (<- DSP). */
dai_intel_ipc4_hda_host_input_class = 1,
/**< HD/A host input/output (rsvd for future use). */
dai_intel_ipc4_hda_host_inout_class = 2,
/**< HD/A link output (DSP ->). */
dai_intel_ipc4_hda_link_output_class = 8,
/**< HD/A link input (DSP <-). */
dai_intel_ipc4_hda_link_input_class = 9,
/**< HD/A link input/output (rsvd for future use). */
dai_intel_ipc4_hda_link_inout_class = 10,
/**< DMIC link input (DSP <-). */
dai_intel_ipc4_dmic_link_input_class = 11,
/**< I2S link output (DSP ->). */
dai_intel_ipc4_i2s_link_output_class = 12,
/**< I2S link input (DSP <-). */
dai_intel_ipc4_i2s_link_input_class = 13,
/**< ALH link output, legacy for SNDW (DSP ->). */
dai_intel_ipc4_alh_link_output_class = 16,
/**< ALH link input, legacy for SNDW (DSP <-). */
dai_intel_ipc4_alh_link_input_class = 17,
/**< SNDW link output (DSP ->). */
dai_intel_ipc4_alh_snd_wire_stream_link_output_class = 16,
/**< SNDW link input (DSP <-). */
dai_intel_ipc4_alh_snd_wire_stream_link_input_class = 17,
/**< UAOL link output (DSP ->). */
dai_intel_ipc4_alh_uaol_stream_link_output_class = 18,
/**< UAOL link input (DSP <-). */
dai_intel_ipc4_alh_uaol_stream_link_input_class = 19,
/**< IPC output (DSP ->). */
dai_intel_ipc4_ipc_output_class = 20,
/**< IPC input (DSP <-). */
dai_intel_ipc4_ipc_input_class = 21,
/**< I2S Multi gtw output (DSP ->). */
dai_intel_ipc4_i2s_multi_link_output_class = 22,
/**< I2S Multi gtw input (DSP <-). */
dai_intel_ipc4_i2s_multi_link_input_class = 23,
/**< GPIO */
dai_intel_ipc4_gpio_class = 24,
/**< SPI */
dai_intel_ipc4_spi_output_class = 25,
dai_intel_ipc4_spi_input_class = 26,
dai_intel_ipc4_max_connector_node_id_type
};
struct ssp_intel_aux_tlv {
uint32_t type;
uint32_t size;
uint32_t val[];
} __packed;
struct ssp_intel_mn_ctl {
uint32_t div_m;
uint32_t div_n;
} __packed;
struct ssp_intel_clk_ctl {
uint32_t start;
uint32_t stop;
} __packed;
struct ssp_intel_tr_ctl {
uint32_t sampling_frequency;
uint32_t bit_depth;
uint32_t channel_map;
uint32_t channel_config;
uint32_t interleaving_style;
uint32_t format;
} __packed;
struct ssp_intel_run_ctl {
uint32_t enabled;
} __packed;
struct ssp_intel_node_ctl {
uint32_t node_id;
uint32_t sampling_rate;
} __packed;
struct ssp_intel_sync_ctl {
uint32_t sync_denominator;
uint32_t count;
} __packed;
struct ssp_intel_ext_ctl {
uint32_t ext_data;
} __packed;
struct ssp_intel_link_ctl {
uint32_t clock_source;
} __packed;
#define SSP_MN_DIVIDER_CONTROLS 0
#define SSP_DMA_CLK_CONTROLS 1
#define SSP_DMA_TRANSMISSION_START 2
#define SSP_DMA_TRANSMISSION_STOP 3
#define SSP_DMA_ALWAYS_RUNNING_MODE 4
#define SSP_DMA_SYNC_DATA 5
#define SSP_DMA_CLK_CONTROLS_EXT 6
#define SSP_LINK_CLK_SOURCE 7
/**< Base top-level structure of an address of a gateway. */
/*!
* The virtual index value, presented on the top level as raw 8 bits,
* is expected to be encoded in a gateway specific way depending on
* the actual type of gateway.
*/
union dai_intel_ipc4_connector_node_id {
/**< Raw 32-bit value of node id. */
uint32_t dw;
/**< Bit fields */
struct {
/**< Index of the virtual DMA at the gateway. */
uint32_t v_index : 8;
/**< Type of the gateway, one of ConnectorNodeId::Type values. */
uint32_t dma_type : 5;
/**< Rsvd field. */
uint32_t _rsvd : 19;
} f; /**<< Bits */
} __packed;
/*!
* Attributes are usually provided along with the gateway configuration
* BLOB when the FW is requested to instantiate that gateway.
*
* There are flags which requests FW to allocate gateway related data
* (buffers and other items used while transferring data, like linked list)
* to be allocated from a special memory area, e.g low power memory.
*/
union dai_intel_ipc4_gateway_attributes {
/**< Raw value */
uint32_t dw;
/**< Access to the fields */
struct {
/**< Gateway data requested in low power memory. */
uint32_t lp_buffer_alloc : 1;
/**< Gateway data requested in register file memory. */
uint32_t alloc_from_reg_file : 1;
/**< Reserved field */
uint32_t _rsvd : 30;
} bits; /**<< Bits */
} __packed;
/**< Configuration for the IPC Gateway */
struct dai_intel_ipc4_gateway_config_blob {
/**< Size of the gateway buffer, specified in bytes */
uint32_t buffer_size;
/**< Flags */
union flags {
struct bits {
/**< Activates high threshold notification */
/*!
* Indicates whether notification should be sent to the host
* when the size of data in the buffer reaches the high threshold
* specified by threshold_high parameter.
*/
uint32_t notif_high : 1;
/**< Activates low threshold notification */
/*!
* Indicates whether notification should be sent to the host
* when the size of data in the buffer reaches the low threshold
* specified by threshold_low parameter.
*/
uint32_t notif_low : 1;
/**< Reserved field */
uint32_t rsvd : 30;
} f; /**<< Bits */
/**< Raw value of flags */
uint32_t flags_raw;
} u; /**<< Flags */
/**< High threshold */
/*!
* Specifies the high threshold (in bytes) for notifying the host
* about the buffered data level.
*/
uint32_t threshold_high;
/**< Low threshold */
/*!
* Specifies the low threshold (in bytes) for notifying the host
* about the buffered data level.
*/
uint32_t threshold_low;
} __packed;
/* i2s Configuration BLOB building blocks */
/* i2s registers for i2s Configuration */
struct dai_intel_ipc4_ssp_config {
uint32_t ssc0;
uint32_t ssc1;
uint32_t sscto;
uint32_t sspsp;
uint32_t sstsa;
uint32_t ssrsa;
uint32_t ssc2;
uint32_t sspsp2;
uint32_t ssc3;
uint32_t ssioc;
} __packed;
struct dai_intel_ipc4_ssp_mclk_config {
/* master clock divider control register */
uint32_t mdivc;
/* master clock divider ratio register */
uint32_t mdivr;
} __packed;
struct dai_intel_ipc4_ssp_mclk_config_2 {
uint32_t mdivctlr;
uint32_t mdivrcnt;
uint32_t mdivr[];
} __packed;
struct dai_intel_ipc4_ssp_driver_config {
struct dai_intel_ipc4_ssp_config i2s_config;
struct dai_intel_ipc4_ssp_mclk_config mclk_config;
} __packed;
struct dai_intel_ipc4_ssp_start_control {
/* delay in msec between enabling interface (moment when
* Copier instance is being attached to the interface) and actual
* interface start. Value of 0 means no delay.
*/
uint32_t clock_warm_up : 16;
/* specifies if parameters target MCLK (1) or SCLK (0) */
uint32_t mclk : 1;
/* value of 1 means that clock should be started immediately
* even if no Copier instance is currently attached to the interface.
*/
uint32_t warm_up_ovr : 1;
uint32_t rsvd0 : 14;
} __packed;
struct dai_intel_ipc4_ssp_stop_control {
/* delay in msec between stopping the interface
* (moment when Copier instance is being detached from the interface)
* and interface clock stop. Value of 0 means no delay.
*/
uint32_t clock_stop_delay : 16;
/* value of 1 means that clock should be kept running (infinite
* stop delay) after Copier instance detaches from the interface.
*/
uint32_t keep_running : 1;
/* value of 1 means that clock should be stopped immediately */
uint32_t clock_stop_ovr : 1;
uint32_t rsvd1 : 14;
} __packed;
union dai_intel_ipc4_ssp_dma_control {
struct dai_intel_ipc4_ssp_control {
struct dai_intel_ipc4_ssp_start_control start_control;
struct dai_intel_ipc4_ssp_stop_control stop_control;
} control_data;
struct dai_intel_ipc4_mn_div_config {
uint32_t mval;
uint32_t nval;
} mndiv_control_data;
} __packed;
struct dai_intel_ipc4_ssp_configuration_blob {
union dai_intel_ipc4_gateway_attributes gw_attr;
/* TDM time slot mappings */
uint32_t tdm_ts_group[DAI_INTEL_I2S_TDM_MAX_SLOT_MAP_COUNT];
/* i2s port configuration */
struct dai_intel_ipc4_ssp_driver_config i2s_driver_config;
/* optional configuration parameters */
union dai_intel_ipc4_ssp_dma_control i2s_dma_control[0];
} __packed;
#define SSP_BLOB_VER_1_5 0xee000105
struct dai_intel_ipc4_ssp_configuration_blob_ver_1_5 {
union dai_intel_ipc4_gateway_attributes gw_attr;
uint32_t version;
uint32_t size;
/* TDM time slot mappings */
uint32_t tdm_ts_group[DAI_INTEL_I2S_TDM_MAX_SLOT_MAP_COUNT];
/* i2s port configuration */
struct dai_intel_ipc4_ssp_config i2s_ssp_config;
/* clock configuration parameters */
struct dai_intel_ipc4_ssp_mclk_config_2 i2s_mclk_control;
} __packed;
#endif