/* * Copyright (c) 2022 Intel Corporation. * * SPDX-License-Identifier: Apache-2.0 */ #ifndef __DAI_PARAMS_INTEL_IPC4_H__ #define __DAI_PARAMS_INTEL_IPC4_H__ #include #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