blob: 91c1e720937a976f26967241954ccd5ba47bcdf5 [file] [log] [blame]
/*
* Copyright (C) 2018 Knowles Electronics
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#ifndef _IAXXX_ODSP_HW_H_
#define _IAXXX_ODSP_HW_H_
#if __cplusplus
extern "C"
{
#endif
#include <linux/mfd/adnc/iaxxx-odsp.h>
#include <linux/mfd/adnc/iaxxx-system-identifiers.h>
#define NAME_MAX_SIZE 256
struct iaxxx_odsp_hw;
struct iaxxx_config_file {
const char *filename;
};
struct iaxxx_config_value {
uint64_t config_val;
uint32_t config_val_sz;
};
union iaxxx_config_data {
struct iaxxx_config_file fdata;
struct iaxxx_config_value vdata;
};
enum iaxxx_config_type {
CONFIG_FILE,
CONFIG_VALUE
};
struct iaxxx_create_config_data {
enum iaxxx_config_type type;
union iaxxx_config_data data;
};
struct iaxxx_plugin_status_data {
uint32_t block_id;
uint8_t create_status;
uint8_t enable_status;
uint16_t process_count;
uint16_t process_err_count;
uint32_t in_frames_consumed;
uint32_t out_frames_produced;
uint32_t private_memsize;
uint8_t frame_notification_mode;
uint8_t state_management_mode;
};
struct iaxxx_plugin_endpoint_status_data {
uint8_t status;
uint8_t frame_status;
uint8_t endpoint_status;
uint8_t usage;
uint8_t mandatory;
uint16_t counter;
uint8_t op_encoding;
uint8_t op_sample_rate;
uint16_t op_frame_length;
};
struct iaxxx_get_event_info {
uint16_t event_id;
uint32_t data;
};
enum clock_source {
SYSCLK,
INT_OSC,
EXT_OSC,
};
/**
* Initialize the ODSP HAL
*
* Input - NA
* Output - Handle to iaxxx_odsp_hw on success, NULL on failure
*/
struct iaxxx_odsp_hw* iaxxx_odsp_init();
/**
* De-Initialize the ODSP HAL
*
* Input - odsp_hw_hdl - Handle to odsp hw structure
* Output - 0 on success, on failure < 0
*/
int iaxxx_odsp_deinit(struct iaxxx_odsp_hw *odsp_hw_hdl);
/**
* Load a package
*
* Input - odsp_hw_hdl - Handle to odsp hw structure
* pkg_name - Relative path to the Package binary (Should be placed in
* the firmware location)
* pkg_id - Package ID
* Output - 0 on success, on failure < 0
*/
int iaxxx_odsp_package_load(struct iaxxx_odsp_hw *odsp_hw_hdl,
const char *pkg_name,
const uint32_t pkg_id);
/**
* Unload a package
*
* Input - odsp_hw_hdl - Handle to odsp hw structure
* pkg_id - Package ID
* Output - 0 on success, on failure < 0
*/
int iaxxx_odsp_package_unload(struct iaxxx_odsp_hw *odsp_hw_hdl,
const uint32_t pkg_id);
/**
* Get package version
*
* Input - odsp_hw_hdl - Handle to odsp hw structure
* inst_id - Instance ID
* version - Package version string buffer
* len - String buffer size
*
* Output - 0 on success, on failure < 0
*/
int iaxxx_odsp_plugin_get_package_version(struct iaxxx_odsp_hw *odsp_hw_hdl,
uint8_t inst_id, char *version, uint32_t len);
/**
* Get plugin version
*
* Input - odsp_hw_hdl - Handle to odsp hw structure
* inst_id - Instance ID
* version - Plugin version string buffer
* len - String buffer size
*
* Output - 0 on success, on failure < 0
*/
int iaxxx_odsp_plugin_get_plugin_version(struct iaxxx_odsp_hw *odsp_hw_hdl,
uint8_t inst_id, char *version, uint32_t len);
/**
* Create a plugin
*
* Input - odsp_hw_hdl - Handle to odsp hw structure
* inst_id - Instance ID
* priority - Priority of the plugin
* pkg_id - Package ID
* plg_idx - Plugin Index*
* block_id - Block ID
* config_id - Config ID
*
* Output - 0 on success, on failure < 0
*/
int iaxxx_odsp_plugin_create(struct iaxxx_odsp_hw *odsp_hw_hdl,
const uint32_t inst_id,
const uint32_t priority,
const uint32_t pkg_id,
const uint32_t plg_idx,
const uint32_t block_id,
const uint32_t config_id);
/**
* Set the creation configuration on a plugin
*
* Input - odsp_hw_hdl - Handle to odsp hw structure
* inst_id - Instance ID
* block_id - Block ID
* cdata - Creation configuration data
* Output - 0 on success, on failure < 0
*/
int iaxxx_odsp_plugin_set_creation_config(
struct iaxxx_odsp_hw *odsp_hw_hdl,
const uint32_t inst_id,
const uint32_t block_id,
struct iaxxx_create_config_data cdata);
/**
* Destroy the plugin
*
* Input - odsp_hw_hdl - Handle to odsp hw structure
* inst_id - Instance ID
* block_id - Block ID
*
* Output - 0 on success, on failure < 0
*/
int iaxxx_odsp_plugin_destroy(struct iaxxx_odsp_hw *odsp_hw_hdl,
const uint32_t inst_id,
const uint32_t block_id);
/**
* Enable the plugin
*
* Input - odsp_hw_hdl - Handle to odsp hw structure
* inst_id - Instance ID
* block_id - Block ID
* Output - 0 on success, on failure < 0
*/
int iaxxx_odsp_plugin_enable(struct iaxxx_odsp_hw *odsp_hw_hdl,
const uint32_t inst_id,
const uint32_t block_id);
/**
* Disable the plugin
*
* Input - odsp_hw_hdl - Handle to odsp hw structure
* inst_id - Instance ID
* block_id - Block ID
* Output - 0 on success, on failure < 0
*/
int iaxxx_odsp_plugin_disable(struct iaxxx_odsp_hw *odsp_hw_hdl,
const uint32_t inst_id,
const uint32_t block_id);
/**
* Reset the plugin
*
* Input - odsp_hw_hdl - Handle to odsp hw structure
* inst_id - Instance ID
* block_id - Block ID
* Output - 0 on success, on failure < 0
*/
int iaxxx_odsp_plugin_reset(struct iaxxx_odsp_hw *odsp_hw_hdl,
const uint32_t inst_id,
const uint32_t block_id);
/**
* Set a parameter on a plugin
*
* Input - odsp_hw_hdl - Handle to odsp hw structure
* inst_id - Instance ID
* param_id - Parameter ID
* param_val - Parameter Value*
* block_id - Block ID
* Output - 0 on success, on failure < 0
*/
int iaxxx_odsp_plugin_set_parameter(struct iaxxx_odsp_hw *odsp_hw_hdl,
const uint32_t inst_id,
const uint32_t param_id,
const uint32_t param_val,
const uint32_t block_id);
/**
* Get the value of parameter on a plugin
*
* Input - odsp_hw_hdl - Handle to odsp hw structure
* inst_id - Instance ID
* param_id - Parameter ID
* block_id - Block ID*
* param_val - Parameter Value
* Output - 0 on success, on failure < 0
*/
int iaxxx_odsp_plugin_get_parameter(struct iaxxx_odsp_hw *odsp_hw_hdl,
const uint32_t inst_id,
const uint32_t param_id,
const uint32_t block_id,
uint32_t *param_val);
/**
* Set a parameter block on a plugin
*
* Input - odsp_hw_hdl - Handle to odsp hw structure
* inst_id - Instance ID
* param_blk_id - Parameter block id
* block_id - Block ID
* param_buf - Pointer to the parameter block
* param_buf_sz - Parameter block size
* Output - 0 on success, on failure < 0
*/
int iaxxx_odsp_plugin_set_parameter_blk(struct iaxxx_odsp_hw *odsp_hw_hdl,
const uint32_t inst_id,
const uint32_t param_blk_id,
const uint32_t block_id,
const void *param_buf,
const uint32_t param_buf_sz);
/**
* Set a parameter block on a plugin
*
* Input - odsp_hw_hdl - Handle to odsp hw structure
* inst_id - Instance ID
* param_blk_id - Parameter block id
* block_id - Block ID
* file_name - Relative path to the Parameter File(Should be placed in
* the firmware location)
* Output - 0 on success, on failure < 0
*/
int iaxxx_odsp_plugin_set_parameter_blk_from_file(
struct iaxxx_odsp_hw *odsp_hw_hdl,
const uint32_t inst_id,
const uint32_t param_blk_id,
const uint32_t block_id,
const char *file_name);
/**
* Set custom configuration for plugin
*
* Input - odsp_hw_hdl - Handle to odsp hw structure
* inst_id - Instance ID
* block_id - Block ID
* param_blk_id - Parameter block id
* custom_config_id - Id for what type of custom configuration
* filename - Name of file with custom config data
*
* Output - 0 on success, on failure < 0
*/
int iaxxx_odsp_plugin_set_custom_cfg(struct iaxxx_odsp_hw *odsp_hw_hdl,
const uint32_t inst_id,
const uint32_t block_id,
const uint32_t param_blk_id,
const uint32_t custom_config_id,
const char *filename);
/**
* Subscribe to an event
*
* Input - odsp_hw_hdl - Handle to odsp hw structure
* src_id - System Id of event source
* event_id - Event Id
* dst_id - System Id of event destination
* dst_opaque - Info sought by destination task when even occurs
*
* Output - 0 on success, on failure < 0
*/
int iaxxx_odsp_evt_subscribe(struct iaxxx_odsp_hw *odsp_hw_hdl,
const uint16_t src_id,
const uint16_t event_id,
const uint16_t dst_id,
const uint32_t dst_opaque);
/**
* Unsubscribe an event
*
* Input - odsp_hw_hdl - Handle to odsp hw structure
* src_id - System Id of event source
* event_id - Event Id
* dst_id - System Id of event destination
*
* Output - 0 on success, on failure < 0
*/
int iaxxx_odsp_evt_unsubscribe(struct iaxxx_odsp_hw *odsp_hw_hdl,
const uint16_t src_id,
const uint16_t event_id,
const uint16_t dst_id);
/**
* Trigger an event. This may be most useful when debugging the system,
* but can also be used to trigger simultaneous behavior in entities which
* have subscribed, or to simply provide notifications regarding host status:
*
* Input - odsp_hw_hdl - Handle to odsp hw structure
* src_id - SystemId of event source
* evt_id - Id of event
* src_opaque - Source opaque to pass with event notification
*
* Output - 0 on success, on failure < 0
*/
int iaxxx_odsp_evt_trigger(struct iaxxx_odsp_hw *odsp_hw_hdl,
uint16_t src_id,
uint16_t evt_id,
uint32_t src_opaque);
/**
* Fetches next event subscription entry from the last read position
*
* Input - odsp_hw_hdl - Handle to odsp hw structure
* src_id - System Id of event source
* evt_id - Event Id
* dst_id - System Id of event destination
* dst_opaque - Destination opaque data
*
* Output - 0 on success, on failure < 0
*/
int iaxxx_odsp_evt_read_subscription(struct iaxxx_odsp_hw *odsp_hw_hdl,
uint16_t *src_id,
uint16_t *evt_id,
uint16_t *dst_id,
uint32_t *dst_opaque);
/**
* Reset index for retrieving subscription entries
*
* Input - odsp_hw_hdl - Handle to odsp hw structure
*
* Output - 0 on success, on failure < 0
*/
int iaxxx_odsp_evt_reset_read_index(struct iaxxx_odsp_hw *odsp_hw_hdl);
/**
* Retrieve an event notification
*
* Input - odsp_hw_hdl - Handle to odsp hw structure
* src_id - pointer to uint16_t for reporting SystemId of
* event source
* evt_dd - pointer to uint16_t for reporting Id of event
* src_opaque - pointer to the first parameter of event
* dst_opaque - pointer to the second parameter of event
* This will be destOpaque in case if event is
* subscribed with valid destOpaque otherwise
* it will be used as second parameter.
*
* Output - 0 on success, on failure < 0
*/
int iaxxx_odsp_evt_retrieve_notification(struct iaxxx_odsp_hw *odsp_hw_hdl,
uint16_t *src_id,
uint16_t *evt_id,
uint32_t *src_opaque,
uint32_t *dst_opaque);
/**
* Retrieve an event
*
* Input - odsp_hw_hdl - Handle to odsp hw structure
* event_info - Struct to return event info
*
* Output - 0 on success, on failure < 0
*/
int iaxxx_odsp_evt_getevent(struct iaxxx_odsp_hw *odsp_hw_hdl,
struct iaxxx_get_event_info *event_info);
/**
* Create a plugin for a statically loaded package
*
* Input - odsp_hw_hdl - Handle to odsp hw structure
* inst_id - Instance ID
* priority - Priority of the plugin
* pkg_id - Package ID
* plg_idx - Plugin Index*
* block_id - Block ID
* config_id - Config ID
*
* Output - 0 on success, on failure < 0
*/
int iaxxx_odsp_plugin_create_static_package(struct iaxxx_odsp_hw *odsp_hw_hdl,
const uint32_t inst_id,
const uint32_t priority,
const uint32_t pkg_id,
const uint32_t plg_idx,
const uint32_t block_id,
const uint32_t config_id);
/**
* Get a parameter block from a plugin
*
* Input - odsp_hw_hdl - Handle to odsp hw structure
* inst_id - Instance ID
* block_id - Block ID
* param_blk_id - Parameter block id
* param_buf - Pointer to the parameter block
* param_buf_sz - Parameter block size in words
*
* Output - 0 on success, on failure < 0
*/
int iaxxx_odsp_plugin_get_parameter_blk(struct iaxxx_odsp_hw *odsp_hw_hdl,
const uint32_t inst_id,
const uint32_t block_id,
const uint32_t param_blk_id,
uint32_t *param_buf,
const uint32_t param_buf_sz);
/**
* Set Event for the plugin
*
* Input - odsp_hw_hdl - Handle to odsp hw structure
* inst_id - Instance ID
* eventEnableMask - event Mask
* block_id - Block ID
*
* Output - 0 on success, on failure < 0
*/
int iaxxx_odsp_plugin_setevent(struct iaxxx_odsp_hw *odsp_hw_hdl,
const uint32_t inst_id,
const uint32_t eventEnableMask,
const uint32_t block_id);
/* Read Plugin Error Info
*
* Input - odsp_hw_hdl - Handle to odsp hw structure
* error_code - Pointer to uint32 to return error code
* error_instance - Pointer to uint8 to return plugin instance
* where error occurred.
*
* Output - 0 on success, on failure < 0
*/
int iaxxx_odsp_plugin_read_error(struct iaxxx_odsp_hw *odsp_hw_hdl,
const uint32_t block_id,
uint32_t *error_code,
uint8_t *error_instance);
/* Read the timestamps of all output endpoint
*
* Input - odsp_hw_hdl - Handle to odsp hw structure
* proc_id - Proc ID
* timestamps - The timestamps array(with 16 elements count)
* to be filled.
*
* Output - 0 on success, on failure < 0
*/
int iaxxx_odsp_plugin_get_ep_timestamps(struct iaxxx_odsp_hw *odsp_hw_hdl,
uint64_t *timestamps, uint8_t proc_id);
/**
* Set a parameter block on a plugin and get ack to
* ensure the data has been sent and retry if not.
*
* Input - odsp_hw_hdl - Handle to odsp hw structure
* inst_id - Instance ID
* param_blk_id - Parameter block id
* block_id - Block ID
* set_param_buf - Pointer to the parameter block
* set_param_buf_sz - Parameter block size in bytes
* response_data_buf - Buffer for response data from plugin
* response_data_sz - Size of Buffer in uint32 words for
* response data from plugin
* max_no_retries - Max number of retries in case of busy
* response from plugin.
* Output - 0 on success, on failure < 0
*/
int iaxxx_odsp_plugin_set_parameter_blk_with_ack(
struct iaxxx_odsp_hw *odsp_hw_hdl,
const uint32_t inst_id,
const uint32_t param_blk_id,
const uint32_t block_id,
const void *set_param_buf,
const uint32_t set_param_buf_sz,
uint32_t* response_data_buf,
const uint32_t response_data_sz,
const uint32_t max_no_retries);
/**
* Get Plugin status information.
*
* Input - odsp_hw_hdl - Handle to odsp hw structure
* inst_id - Instance ID
* plugin_status_data - Pointer to struct to return plugin status.
*
* Output - 0 on success, on failure < 0
*/
int iaxxx_odsp_plugin_get_status_info(
struct iaxxx_odsp_hw *odsp_hw_hdl,
const uint32_t inst_id,
struct iaxxx_plugin_status_data *plugin_status_data);
/**
* Get Plugin endpoint status information.
*
* Input - odsp_hw_hdl - Handle to odsp hw structure
* inst_id - Instance ID
* ep_index - Index of Endpoint
* direction - If Input endpoint or Output endpoint
* 0 => input, 1 => output
* plugin_ep_status_data - Pointer to struct to return plugin
* endpoint status.
*
*
* Output - 0 on success, on failure < 0
*/
int iaxxx_odsp_plugin_get_endpoint_status(
struct iaxxx_odsp_hw *odsp_hw_hdl,
const uint32_t inst_id,
const uint8_t ep_index,
const uint8_t direction,
struct iaxxx_plugin_endpoint_status_data *plugin_ep_status_data);
/**
* Returns the execution status of given processor
*
* Input - odsp_hw_hdl - Handle to odsp hw structure
* proc_id - Proc id
* status - Execution status of the processor
*
* Output - 0 on success, on failure < 0
*/
int iaxxx_odsp_get_proc_execution_status(struct iaxxx_odsp_hw *odsp_hw_hdl,
uint8_t proc_id, uint32_t *status);
/**
* Returns Rom version number, Rom version string
* Application version number, Application version string
*
* Input - odsp_hw_hdl - Handle to odsp hw structure
* rom_ver_num - Rom version number
* rom_ver_str - Rom version string
* rom_ver_str_len - Rom version string length
* app_ver_num - App version number
* app_ver_str - App version string
* app_ver_str_len - App version string length
*
* Output - 0 on success, on failure < 0
*/
int iaxxx_odsp_get_sys_versions(struct iaxxx_odsp_hw *odsp_hw_hdl,
uint32_t *rom_ver_num,
char *rom_ver_str,
uint32_t rom_ver_str_len,
uint32_t *app_ver_num,
char *app_ver_str,
uint32_t app_ver_str_len);
/**
* Returns Device ID
*
* Input - odsp_hw_hdl - Handle to odsp hw structure
* device_id - Returned Device ID
*
* Output - 0 on success, on failure < 0
*/
int iaxxx_odsp_get_device_id(struct iaxxx_odsp_hw *odsp_hw_hdl,
uint32_t *device_id);
/**
* Returns Firmware status
*
* Input - odsp_hw_hdl - Handle to odsp hw structure
* mode - Returned firmware status
* 0: Firmware has crashed
* 1: Firmware is idle
* 2: Firmware is active
*
* Output - 0 on success, on failure < 0
*/
int iaxxx_odsp_get_fw_status(struct iaxxx_odsp_hw *odsp_hw_hdl,
uint32_t *status);
/**
* Resets the firmware by redownloading the firmware
*
* Input - odsp_hw_hdl - Handle to odsp hw structure
*
* Output - 0 on success, on failure < 0
*/
int iaxxx_odsp_reset_fw(struct iaxxx_odsp_hw *odsp_hw_hdl);
#if __cplusplus
} // extern "C"
#endif
#endif // #ifndef _IAXXX_ODSP_HW_H_