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

276 lines
6.8 KiB
C

/*
* tegra_nvfx.h - Shared NVFX interface between Tegra ADSP ALSA driver and
* ADSP side user space code.
*
* Copyright (c) 2015-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_H_
#define _TEGRA_NVFX_H_
/**
* variant_t
*
*/
typedef union {
uint64_t ptr;
/* Standard C */
void *pvoid;
char *pchar;
unsigned char *puchar;
short *pshort;
unsigned short *pushort;
long *plong;
unsigned long *pulong;
int *pint;
unsigned int *puint;
float *pfloat;
long long *pllong;
unsigned long long *pullong;
double *pdouble;
/* stdint.h */
int8_t *pint8;
uint8_t *puint8;
int16_t *pint16;
uint16_t *puint16;
int32_t *pint32;
uint32_t *puint32;
} variant_t;
/* Memory can not be used for in-place transform */
#define NVFX_MEM_READ_ACCESS 0x1
/* Memory can only be written to */
#define NVFX_MEM_WRITE_ACCESS 0x2
/* Memory can read from or written to */
#define NVFX_MEM_ALL_ACCESS \
(NVFX_MEM_READ_ACCESS | NVFX_MEM_WRITE_ACCESS)
/**
* nvfx_process_state_t - Required shared process state
*
* @state Current process state (i.e. active, inactive, etc.)
* @count Number invfx_t::process calls
* @ts_last Timestamp of last invfx_t::process call
* @time_total Time spent in all invfx_t::process calls
* @time_high Highest time spent in all invfx_t::process calls
* @time_low Lowest time spent in all invfx_t::process calls
* @time_last Time spent in the last invfx_t::process calls
* @period Actual scheduling period
*
*/
typedef struct {
int32_t state;
uint32_t count;
uint64_t ts_last;
uint64_t time_total;
uint32_t time_high;
uint32_t time_low;
uint32_t time_last;
uint32_t period;
} nvfx_process_state_t;
/**
* nvfx_pin_state_t - Required shared pin state
*
* @bytes Bytes consumed or produced
* @frames Frames consumed or produced
*
*/
typedef struct {
uint64_t bytes;
uint32_t frames;
} nvfx_pin_state_t;
/**
* Pin counts
*
* @NVFX_MAX_INPUT_PINS The maximum number of input pins for an effect
* @NVFX_MAX_OUTPUT_PINS The maximum number of output pins for an effect
*/
#define NVFX_MAX_INPUT_PINS 6
#define NVFX_MAX_OUTPUT_PINS 2
#define NVFX_MAX_RAW_DATA_WSIZE 1024
/**
* nvfx_shared_state_t - Required shared state information
*
* @process invfx_t::process related state
* @input State of input pins
* @output State of output pins
*
*/
typedef struct {
nvfx_process_state_t process;
nvfx_pin_state_t input[NVFX_MAX_INPUT_PINS];
nvfx_pin_state_t output[NVFX_MAX_OUTPUT_PINS];
/* custom params */
} nvfx_shared_state_t;
/**
* nvfx_call_params_t
*
* @NVFX_MAX_CALL_PARAMS_WSIZE Max size in int32s of unioned call parameters
* @size Size of the call parameters
* @method The index of the function to call
* [custom params] Variable length buffer of parameters e.g.:
* uint32_t custom_params[...]
*/
typedef struct {
#define NVFX_MAX_CALL_PARAMS_WSIZE 128
uint32_t size;
uint32_t method;
/* custom params */
} nvfx_call_params_t;
/**
* Required FX Methods
*
* @nvfx_method_reset Resets FX to default state
* @nvfx_method_set_state Sets the FX state
* @nvfx_method_flush Flushes input and cached data buffers
* to support seek operations
*
* @nvfx_method_external_start: Start of externally defined FX methods
*
*/
enum {
nvfx_method_reset = 0,
nvfx_method_set_state,
nvfx_method_flush,
nvfx_method_read_params,
nvfx_method_error_event,
/*
* CPU to ADSP : Used to indicate end of stream
* ADSP to CPU : Used to notify that all input data is consumed
*/
nvfx_method_set_eos,
nvfx_method_external_start = 65536,
nvfx_method_force32 = 0x7fffffff
};
/**
* nvfx_reset_params_t - Resets FX to default state
*
* @call nvfx_call_t parameters
*
*/
typedef struct {
nvfx_call_params_t call;
} nvfx_reset_params_t;
/**
* nvfx_method_set_state - Required FX States
*
* @nvfx_state_inactive No processing except copying cached data
* @nvfx_state_active Process cached and/or new input data
*
* @nvfx_state_external_start Start of externally defined FX States
*
*/
enum {
nvfx_state_inactive = 0,
nvfx_state_active,
nvfx_state_external_start = 65536,
nvfx_state_force32 = 0x7fffffff
};
/**
* nvfx_set_state_params_t - Sets the FX state
*
* @call nvfx_call_t parameters
* @state State to set the FX
*
*/
typedef struct {
nvfx_call_params_t call;
int32_t state;
} nvfx_set_state_params_t;
/**
* nvfx_method_error_event - Required FX States
*
* @nvfx_event_no_error
* @nvfx_event_error
*
*/
enum {
nvfx_event_no_error = 0,
nvfx_event_error,
};
/**
* nvfx_error_event_params_t - Sets the FX state
*
* @call nvfx_call_t parameters
* @state State to set the FX
*
*/
typedef struct {
nvfx_call_params_t call;
int32_t err;
} nvfx_error_event_params_t;
/**
* nvfx_flush_params_t - Flushes input and cached data buffers to
* support seek operations
*
* @call nvfx_call_t parameters
*
*/
typedef struct {
nvfx_call_params_t call;
} nvfx_flush_params_t;
/**
* nvfx_req_call_params_t - Parameters for required call functions
*
*/
typedef union {
nvfx_call_params_t call;
nvfx_reset_params_t reset;
nvfx_set_state_params_t set_state;
nvfx_flush_params_t flush;
} nvfx_req_call_params_t;
/**
* FX Types
*
* @NVFX_TYPE_HARDWARE No software intervention (e.g. HW Module)
* @NVFX_TYPE_IN_PORT Brings data in (e.g. Stream)
* @NVFX_TYPE_OUT_PORT Returns data out (e.g. Stream, DMA)
* @NVFX_TYPE_N_INPUT Requires n input buffers (e.g. Mix)
* @NVFX_TYPE_N_OUTPUT Requires n output buffers (e.g. Splitter)
* @NVFX_TYPE_IN_PLACE Supports in place processing (e.g. Volume)
* @NVFX_TYPE_REFORMAT Reformats the data (e.g. Deycrypt, Decoder, SRC)
* @NVFX_TYPE_MULTIPASS Multiple processing passes (e.g. AEC)
* @NVFX_TYPE_NONLINEAR Non-linear processing (e.g. Reverb)
*
*/
#define NVFX_TYPE_HARDWARE 0x1
#define NVFX_TYPE_IN_PORT 0x2
#define NVFX_TYPE_OUT_PORT 0x4
#define NVFX_TYPE_N_INPUT 0x10
#define NVFX_TYPE_N_OUTPUT 0x20
#define NVFX_TYPE_IN_PLACE 0x40
#define NVFX_TYPE_REFORMAT 0x80
#define NVFX_TYPE_MULTIPASS 0x100
#define NVFX_TYPE_NONLINEAR 0x200
#endif /* #ifndef _TEGRA_NVFX_H_ */