tegrakernel/kernel/nvidia/include/sound/tegra_nvfx_apm.h

251 lines
7.1 KiB
C

/*
* tegra_nvfx_apm.h - Shared APM interface between Tegra ADSP ALSA driver and
* ADSP side user space code.
*
* Copyright (c) 2014-2018, NVIDIA CORPORATION. All rights reserved.
*
* This program is free software; you can redistribute it and/or modify it
* under the terms and conditions of the GNU General Public License,
* version 2, as published by the Free Software Foundation.
*
* This program is distributed in the hope it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
* more details.
*/
#ifndef _TEGRA_NVFX_APM_H_
#define _TEGRA_NVFX_APM_H_
#define NVFX_APM_CMD_QUEUE_WSIZE 2048
/**
* Pin types
*
* @NVFX_PIN_TYPE_INPUT Pin type for input pin
* @NVFX_PIN_TYPE_OUTPUT Pin type for output pin
*/
#define NVFX_PIN_TYPE_INPUT 0
#define NVFX_PIN_TYPE_OUTPUT 1
/**
* apm_mbx_cmd: commands exchanged using mailbox.
*
* @apm_cmd_none: no operation.
* @apm_cmd_msg_ready message queue holds a new message.
* @apm_cmd_raw_data_ready message queue holds a raw data message
* @apm_cmd_msg_exit exit command
*/
enum apm_mbx_cmd {
apm_cmd_none = 0,
apm_cmd_msg_ready,
apm_cmd_raw_data_ready,
apm_cmd_msg_exit,
};
/**
* APM methods
*
*/
#define NVFX_APM_METHOD_ACK_BIT (1 << 31) /* Flag to request ACK */
/* Input modes of APM
* In PUSH mode, APM blocks if there is no input available. Usually
* a continuous mode ADMA sends interrupt when input data is available.
* In PULL mode, APM blocks only if there is no input available and
* a input fetch request is pending. Usually a one shot mode ADMA
* fetches input data when required and signals event to wake up APM.
*/
#define NVFX_APM_INPUT_MODE_PUSH 0
#define NVFX_APM_INPUT_MODE_PULL 1
enum {
/* NVFX APM params */
nvfx_apm_method_fx_connect = nvfx_method_external_start,
nvfx_apm_method_fx_remove_all,
nvfx_apm_method_fx_set_param,
nvfx_apm_method_set_io_buffer,
nvfx_apm_method_set_notification_size,
/*
* CPU to ADSP : Used to indicate new write or read position
* ADSP to CPU : Used to notify buffer position as per notification size
*/
nvfx_apm_method_set_position,
/*
* CPU to ADSP : Used to indicate end of stream
* ADSP to CPU : Used to notify that all input data is consumed
*/
nvfx_apm_method_set_eos,
nvfx_apm_method_set_priority,
/* ADSP to CPU : To send acknowledgement */
nvfx_apm_method_ack,
nvfx_apm_method_raw_ack,
/* CPU to ADSP : To set APM input mode */
nvfx_apm_method_set_input_mode,
nvfx_apm_method_write_data,
nvfx_apm_method_read_data,
/* ADSP to CPU : To report plugin error */
nvfx_apm_method_fx_error_event,
};
/* For method nvfx_apm_method_set_io_buffer */
typedef struct {
nvfx_call_params_t call_params;
uint32_t pin_type; /* NVFX_PIN_TYPE_INPUT or NVFX_PIN_TYPE_INPUT */
uint32_t pin_id;
variant_t addr;
uint32_t size;
uint32_t flags;
} apm_io_buffer_params_t;
/* For method nvfx_apm_method_set_position */
typedef struct {
nvfx_call_params_t call_params;
uint32_t pin_type; /* NVFX_PIN_TYPE_INPUT or NVFX_PIN_TYPE_INPUT */
uint32_t pin_id;
uint32_t offset;
} apm_position_params_t;
/* For method nvfx_apm_method_set_notification_size */
typedef struct {
nvfx_call_params_t call_params;
uint32_t pin_type; /* NVFX_PIN_TYPE_INPUT or NVFX_PIN_TYPE_INPUT */
uint32_t pin_id;
uint32_t size;
} apm_notification_params_t;
/* For nvfx_method_set_eos */
typedef struct {
nvfx_call_params_t call_params;
} apm_eos_params_t;
/* For nvfx_apm_method_set_priority */
typedef struct {
nvfx_call_params_t call_params;
uint32_t priority;
} apm_set_priority_params_t;
/* For nvfx_apm_method_set_input_mode */
typedef struct {
nvfx_call_params_t call_params;
uint32_t mode;
} apm_set_input_mode_params_t;
/* Module specific structures */
typedef struct {
nvfx_call_params_t call_params;
variant_t plugin_src; /* source plugin pointer */
int32_t pin_src; /* input pin id */
variant_t plugin_dst; /* destination plugin pointer */
int32_t pin_dst; /* destination pin id */
} apm_fx_connect_params_t;
typedef struct {
nvfx_call_params_t call_params;
variant_t plugin;
} apm_fx_remove_params_t;
typedef struct {
nvfx_call_params_t call_params;
variant_t plugin; /* pointer to plugin_t */
int32_t params[NVFX_MAX_CALL_PARAMS_WSIZE];
} apm_fx_set_param_params_t;
typedef struct {
nvfx_call_params_t call_params;
variant_t plugin; /* pointer to plugin_t */
int32_t data[NVFX_MAX_RAW_DATA_WSIZE];
int32_t size;
} apm_fx_raw_data_params_t;
typedef struct {
nvfx_call_params_t call_params;
variant_t plugin; /* pointer to plugin_t */
uint32_t req_size;
} apm_fx_read_request_params_t;
typedef struct {
nvfx_call_params_t call_params;
variant_t plugin; /* pointer to plugin_t */
uint32_t err;
uint32_t data[NVFX_MAX_CALL_PARAMS_WSIZE];
} apm_fx_error_event_params_t;
/* unified app message structure */
#pragma pack(4)
typedef union {
msgq_message_t msgq_msg;
struct {
int32_t header[MSGQ_MESSAGE_HEADER_WSIZE];
union {
nvfx_call_params_t call_params;
apm_io_buffer_params_t io_buffer_params;
apm_position_params_t position_params;
apm_notification_params_t notification_params;
nvfx_set_state_params_t state_params;
nvfx_reset_params_t reset_params;
apm_eos_params_t eos_params;
apm_set_priority_params_t priority_params;
apm_set_input_mode_params_t input_mode_params;
apm_fx_connect_params_t fx_connect_params;
apm_fx_remove_params_t fx_remove_params;
apm_fx_set_param_params_t fx_set_param_params;
apm_fx_read_request_params_t fx_read_request_params;
apm_fx_error_event_params_t fx_error_event_params;
};
} msg;
} apm_msg_t;
typedef union {
msgq_message_t msgq_msg;
struct {
int32_t header[MSGQ_MESSAGE_HEADER_WSIZE];
union {
nvfx_call_params_t call_params;
apm_fx_raw_data_params_t fx_raw_data_params;
};
} msg;
} apm_raw_data_msg_t;
/* app message queue */
typedef union {
msgq_t msgq;
struct {
int32_t header[MSGQ_HEADER_WSIZE];
int32_t queue[NVFX_APM_CMD_QUEUE_WSIZE];
} app_msgq;
} apm_msgq_t;
#pragma pack()
/**
* APM state structure shared between ADSP & CPU
*/
typedef struct {
nvfx_shared_state_t nvfx_shared_state;
uint16_t mbox_id; /* mailbox for communication */
apm_msgq_t msgq_recv;
apm_msgq_t msgq_send;
variant_t input_event; /* event_t pointer to signal input ready */
variant_t output_event;/* event_t pointer to signal output needed */
} apm_shared_state_t;
typedef struct {
variant_t plugin;
/* NVFX specific shared memory follows */
} plugin_shared_mem_t;
/**
* Defines for APM priority levels
* 48 corresponds to HIGH_PRIORITY in LK.
*/
#define APM_PRIORITY_MAX (58)
#define APM_PRIORITY_DEFAULT (48)
#define PLUGIN_SHARED_MEM(x) ((plugin_shared_mem_t *)x)
#define APM_SHARED_STATE(x) (apm_shared_state_t *)(PLUGIN_SHARED_MEM(x) + 1)
#define NVFX_SHARED_STATE(x) (nvfx_shared_state_t *)(PLUGIN_SHARED_MEM(x) + 1)
#endif /* #ifndef _TEGRA_NVFX_APM_H_ */