forked from rrcarlosr/Jetpack
251 lines
7.1 KiB
C
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_ */
|