blob: 86806fd111e3831bd11ffe0323bc7af0199bf922 [file] [log] [blame]
/*
* 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
};
/**< 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_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;
#endif