mirror of
git://nv-tegra.nvidia.com/linux-nv-oot.git
synced 2025-12-22 09:11:26 +03:00
ASoC: tegra: add adsp audio driver
Added ADSP audio driver support for tegra soc and tegra virt alt. Below are the changes made with respect to Kernel 5.10: - Removed the ADSP COMPR DAI links due to differences in compress DAI link registration in Android (ACK 6.6) which causes build issues. - Omitted the callback function for dumping ADMA registers, as the upstream ADMA driver does not support it. Bug 3910602 Bug 4635899 Change-Id: I63ea878ef2e9a960d127d02470e8048535878518 Signed-off-by: Dara Ramesh <dramesh@nvidia.com> Reviewed-on: https://git-master.nvidia.com/r/c/linux-nv-oot/+/3132128 Reviewed-by: Sameer Pujar <spujar@nvidia.com> GVS: buildbot_gerritrpt <buildbot_gerritrpt@nvidia.com>
This commit is contained in:
committed by
mobile promotions
parent
a77ffaf1d0
commit
ee8a8e9853
269
include/sound/tegra_nvfx.h
Normal file
269
include/sound/tegra_nvfx.h
Normal file
@@ -0,0 +1,269 @@
|
||||
/* SPDX-License-Identifier: GPL-2.0-only */
|
||||
/*
|
||||
* Copyright (c) 2021-2024 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
|
||||
*
|
||||
* tegra_nvfx.h - Shared NVFX interface between Tegra ADSP ALSA driver and
|
||||
* ADSP side user space code.
|
||||
*/
|
||||
|
||||
#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,
|
||||
nvfx_method_set_apr_params,
|
||||
|
||||
/*
|
||||
* 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_ */
|
||||
245
include/sound/tegra_nvfx_apm.h
Normal file
245
include/sound/tegra_nvfx_apm.h
Normal file
@@ -0,0 +1,245 @@
|
||||
/* SPDX-License-Identifier: GPL-2.0-only */
|
||||
/*
|
||||
* Copyright (c) 2021-2024 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
|
||||
*
|
||||
* tegra_nvfx_apm.h - Shared APM interface between Tegra ADSP ALSA driver and
|
||||
* ADSP side user space code.
|
||||
*/
|
||||
|
||||
#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 (1U << 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.
|
||||
*/
|
||||
enum {
|
||||
NVFX_APM_INPUT_MODE_PUSH = 0,
|
||||
NVFX_APM_INPUT_MODE_PULL,
|
||||
NVFX_APM_INPUT_MODE_MAX = NVFX_APM_INPUT_MODE_PULL,
|
||||
};
|
||||
|
||||
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_ */
|
||||
84
include/sound/tegra_nvfx_plugin.h
Normal file
84
include/sound/tegra_nvfx_plugin.h
Normal file
@@ -0,0 +1,84 @@
|
||||
/* SPDX-License-Identifier: GPL-2.0-only */
|
||||
/*
|
||||
* Copyright (c) 2021-2024 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
|
||||
*
|
||||
* tegra_nvfx_plugin.h - Shared NVFX interface for different plugins between
|
||||
* Tegra ADSP ALSA driver and ADSP side user space code.
|
||||
*/
|
||||
|
||||
#ifndef _TEGRA_NVFX_PLUGIN_H_
|
||||
#define _TEGRA_NVFX_PLUGIN_H_
|
||||
|
||||
/* Mode */
|
||||
#define ADMA_MODE_ONESHOT 1
|
||||
#define ADMA_MODE_CONTINUOUS 2
|
||||
#define ADMA_MODE_LINKED_LIST 4
|
||||
|
||||
/* Direction */
|
||||
#define ADMA_MEMORY_TO_MEMORY 1
|
||||
#define ADMA_AHUB_TO_MEMORY 2
|
||||
#define ADMA_MEMORY_TO_AHUB 4
|
||||
#define ADMA_AHUB_TO_AHUB 8
|
||||
|
||||
#define EAVB_RX_DMA 0
|
||||
#define EAVB_TX_DMA 1
|
||||
|
||||
/* EAVB DMA PLUGIN NAMES */
|
||||
#define EAVB_RX_PLUGIN "eavb_dma_rx"
|
||||
#define EAVB_TX_PLUGIN "eavb_dma_tx"
|
||||
|
||||
/* ADMA plugin related interface */
|
||||
enum {
|
||||
/* NVFX ADMA params */
|
||||
nvfx_adma_method_init = nvfx_method_external_start,
|
||||
nvfx_adma_method_get_position,
|
||||
nvfx_adma_set_custom_params,
|
||||
nvfx_adma_set_null_sink_mode,
|
||||
};
|
||||
|
||||
typedef struct {
|
||||
nvfx_call_params_t call_params;
|
||||
int32_t adma_channel;
|
||||
int32_t mode;
|
||||
int32_t direction;
|
||||
int32_t ahub_channel;
|
||||
int32_t periods;
|
||||
uint32_t adma_ch_page;
|
||||
variant_t event;
|
||||
uint32_t burst_size;
|
||||
uint32_t intr_dur;
|
||||
} nvfx_adma_init_params_t;
|
||||
|
||||
typedef struct {
|
||||
nvfx_call_params_t nvfx_call_params;
|
||||
uint32_t is_enabled;
|
||||
uint32_t buffer;
|
||||
uint32_t offset;
|
||||
uint64_t bytes_transferred;
|
||||
} nvfx_adma_get_position_params_t;
|
||||
|
||||
typedef union {
|
||||
nvfx_req_call_params_t req_call;
|
||||
nvfx_adma_init_params_t init;
|
||||
nvfx_adma_get_position_params_t get_position;
|
||||
} nvfx_adma_req_call_params_t;
|
||||
|
||||
/* EAVB DMA plugin related interface */
|
||||
enum {
|
||||
/* NVFX EAVB DMA params */
|
||||
nvfx_eavbdma_method_init = nvfx_method_external_start,
|
||||
nvfx_eavbdma_method_get_position,
|
||||
};
|
||||
|
||||
typedef struct {
|
||||
nvfx_call_params_t call_params;
|
||||
int32_t direction;
|
||||
variant_t event;
|
||||
} nvfx_eavbdma_init_params_t;
|
||||
|
||||
typedef union {
|
||||
nvfx_req_call_params_t req_call;
|
||||
nvfx_eavbdma_init_params_t init;
|
||||
} nvfx_eavbdma_req_call_params_t;
|
||||
|
||||
#endif /* #ifndef _TEGRA_NVFX_PLUGIN_H_ */
|
||||
@@ -1,5 +1,5 @@
|
||||
# SPDX-License-Identifier: GPL-2.0-only
|
||||
# Copyright (c) 2022-2023, NVIDIA CORPORATION. All rights reserved.
|
||||
# Copyright (c) 2022-2024, NVIDIA CORPORATION. All rights reserved.
|
||||
|
||||
GCOV_PROFILE := y
|
||||
|
||||
@@ -26,3 +26,6 @@ snd-soc-tegra210-virt-alt-admaif-objs := tegra210_virt_alt_admaif.o \
|
||||
snd-soc-tegra-virt-t210ref-pcm-objs := tegra_virt_ref_alt.o
|
||||
obj-m += snd-soc-tegra210-virt-alt-admaif.o
|
||||
obj-m += snd-soc-tegra-virt-t210ref-pcm.o
|
||||
|
||||
snd-soc-tegra210-virt-alt-adsp-objs := tegra210_adsp_virt_alt.o
|
||||
obj-m += snd-soc-tegra210-virt-alt-adsp.o
|
||||
|
||||
216
sound/soc/tegra-virt-alt/include/tegra210_adsp_virt_alt.h
Normal file
216
sound/soc/tegra-virt-alt/include/tegra210_adsp_virt_alt.h
Normal file
@@ -0,0 +1,216 @@
|
||||
/* SPDX-License-Identifier: GPL-2.0-only */
|
||||
/*
|
||||
* Copyright (c) 2021-2024 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
|
||||
*
|
||||
* tegra210_adsp_virt_alt.h - Tegra210 ADSP header
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef __TEGRA210_ADSP_ALT_H__
|
||||
#define __TEGRA210_ADSP_ALT_H__
|
||||
|
||||
/* This enum is linked with tegra210_adsp_mux_texts array.*/
|
||||
/* Anything changed in enum define should be also reflected in text array */
|
||||
enum tegra210_adsp_virt_regs {
|
||||
TEGRA210_ADSP_NONE,
|
||||
|
||||
/* End-point virtual regs */
|
||||
TEGRA210_ADSP_FRONT_END1,
|
||||
TEGRA210_ADSP_FRONT_END2,
|
||||
TEGRA210_ADSP_FRONT_END3,
|
||||
TEGRA210_ADSP_FRONT_END4,
|
||||
TEGRA210_ADSP_FRONT_END5,
|
||||
TEGRA210_ADSP_FRONT_END6,
|
||||
TEGRA210_ADSP_FRONT_END7,
|
||||
TEGRA210_ADSP_FRONT_END8,
|
||||
TEGRA210_ADSP_FRONT_END9,
|
||||
TEGRA210_ADSP_FRONT_END10,
|
||||
TEGRA210_ADSP_FRONT_END11,
|
||||
TEGRA210_ADSP_FRONT_END12,
|
||||
TEGRA210_ADSP_FRONT_END13,
|
||||
TEGRA210_ADSP_FRONT_END14,
|
||||
TEGRA210_ADSP_FRONT_END15,
|
||||
|
||||
TEGRA210_ADSP_EAVB,
|
||||
|
||||
TEGRA210_ADSP_ADMAIF1,
|
||||
TEGRA210_ADSP_ADMAIF2,
|
||||
TEGRA210_ADSP_ADMAIF3,
|
||||
TEGRA210_ADSP_ADMAIF4,
|
||||
TEGRA210_ADSP_ADMAIF5,
|
||||
TEGRA210_ADSP_ADMAIF6,
|
||||
TEGRA210_ADSP_ADMAIF7,
|
||||
TEGRA210_ADSP_ADMAIF8,
|
||||
TEGRA210_ADSP_ADMAIF9,
|
||||
TEGRA210_ADSP_ADMAIF10,
|
||||
TEGRA210_ADSP_ADMAIF11,
|
||||
TEGRA210_ADSP_ADMAIF12,
|
||||
TEGRA210_ADSP_ADMAIF13,
|
||||
TEGRA210_ADSP_ADMAIF14,
|
||||
TEGRA210_ADSP_ADMAIF15,
|
||||
TEGRA210_ADSP_ADMAIF16,
|
||||
TEGRA210_ADSP_ADMAIF17,
|
||||
TEGRA210_ADSP_ADMAIF18,
|
||||
TEGRA210_ADSP_ADMAIF19,
|
||||
TEGRA210_ADSP_ADMAIF20,
|
||||
|
||||
/* Virtual regs for apps */
|
||||
TEGRA210_ADSP_APM_IN1,
|
||||
TEGRA210_ADSP_APM_IN2,
|
||||
TEGRA210_ADSP_APM_IN3,
|
||||
TEGRA210_ADSP_APM_IN4,
|
||||
TEGRA210_ADSP_APM_IN5,
|
||||
TEGRA210_ADSP_APM_IN6,
|
||||
TEGRA210_ADSP_APM_IN7,
|
||||
TEGRA210_ADSP_APM_IN8,
|
||||
TEGRA210_ADSP_APM_IN9,
|
||||
TEGRA210_ADSP_APM_IN10,
|
||||
TEGRA210_ADSP_APM_IN11,
|
||||
TEGRA210_ADSP_APM_IN12,
|
||||
TEGRA210_ADSP_APM_IN13,
|
||||
TEGRA210_ADSP_APM_IN14,
|
||||
TEGRA210_ADSP_APM_IN15,
|
||||
|
||||
TEGRA210_ADSP_APM_OUT1,
|
||||
TEGRA210_ADSP_APM_OUT2,
|
||||
TEGRA210_ADSP_APM_OUT3,
|
||||
TEGRA210_ADSP_APM_OUT4,
|
||||
TEGRA210_ADSP_APM_OUT5,
|
||||
TEGRA210_ADSP_APM_OUT6,
|
||||
TEGRA210_ADSP_APM_OUT7,
|
||||
TEGRA210_ADSP_APM_OUT8,
|
||||
TEGRA210_ADSP_APM_OUT9,
|
||||
TEGRA210_ADSP_APM_OUT10,
|
||||
TEGRA210_ADSP_APM_OUT11,
|
||||
TEGRA210_ADSP_APM_OUT12,
|
||||
TEGRA210_ADSP_APM_OUT13,
|
||||
TEGRA210_ADSP_APM_OUT14,
|
||||
TEGRA210_ADSP_APM_OUT15,
|
||||
|
||||
TEGRA210_ADSP_PLUGIN_ADMA1,
|
||||
TEGRA210_ADSP_PLUGIN_ADMA2,
|
||||
TEGRA210_ADSP_PLUGIN_ADMA3,
|
||||
TEGRA210_ADSP_PLUGIN_ADMA4,
|
||||
TEGRA210_ADSP_PLUGIN_ADMA5,
|
||||
TEGRA210_ADSP_PLUGIN_ADMA6,
|
||||
TEGRA210_ADSP_PLUGIN_ADMA7,
|
||||
TEGRA210_ADSP_PLUGIN_ADMA8,
|
||||
TEGRA210_ADSP_PLUGIN_ADMA9,
|
||||
TEGRA210_ADSP_PLUGIN_ADMA10,
|
||||
TEGRA210_ADSP_PLUGIN_ADMA11,
|
||||
TEGRA210_ADSP_PLUGIN_ADMA12,
|
||||
TEGRA210_ADSP_PLUGIN_ADMA13,
|
||||
TEGRA210_ADSP_PLUGIN_ADMA14,
|
||||
TEGRA210_ADSP_PLUGIN_ADMA15,
|
||||
TEGRA210_ADSP_PLUGIN_ADMA1_TX,
|
||||
TEGRA210_ADSP_PLUGIN_ADMA2_TX,
|
||||
TEGRA210_ADSP_PLUGIN_ADMA3_TX,
|
||||
TEGRA210_ADSP_PLUGIN_ADMA4_TX,
|
||||
TEGRA210_ADSP_PLUGIN_ADMA5_TX,
|
||||
TEGRA210_ADSP_PLUGIN_ADMA6_TX,
|
||||
TEGRA210_ADSP_PLUGIN_ADMA7_TX,
|
||||
TEGRA210_ADSP_PLUGIN_ADMA8_TX,
|
||||
TEGRA210_ADSP_PLUGIN_ADMA9_TX,
|
||||
TEGRA210_ADSP_PLUGIN_ADMA10_TX,
|
||||
TEGRA210_ADSP_PLUGIN_ADMA11_TX,
|
||||
TEGRA210_ADSP_PLUGIN_ADMA12_TX,
|
||||
TEGRA210_ADSP_PLUGIN_ADMA13_TX,
|
||||
TEGRA210_ADSP_PLUGIN_ADMA14_TX,
|
||||
TEGRA210_ADSP_PLUGIN_ADMA15_TX,
|
||||
|
||||
TEGRA210_ADSP_PLUGIN1,
|
||||
TEGRA210_ADSP_PLUGIN2,
|
||||
TEGRA210_ADSP_PLUGIN3,
|
||||
TEGRA210_ADSP_PLUGIN4,
|
||||
TEGRA210_ADSP_PLUGIN5,
|
||||
TEGRA210_ADSP_PLUGIN6,
|
||||
TEGRA210_ADSP_PLUGIN7,
|
||||
TEGRA210_ADSP_PLUGIN8,
|
||||
TEGRA210_ADSP_PLUGIN9,
|
||||
TEGRA210_ADSP_PLUGIN10,
|
||||
TEGRA210_ADSP_PLUGIN11,
|
||||
TEGRA210_ADSP_PLUGIN12,
|
||||
TEGRA210_ADSP_PLUGIN13,
|
||||
TEGRA210_ADSP_PLUGIN14,
|
||||
TEGRA210_ADSP_PLUGIN15,
|
||||
TEGRA210_ADSP_PLUGIN16,
|
||||
TEGRA210_ADSP_PLUGIN17,
|
||||
TEGRA210_ADSP_PLUGIN18,
|
||||
TEGRA210_ADSP_PLUGIN19,
|
||||
TEGRA210_ADSP_PLUGIN20,
|
||||
|
||||
TEGRA210_ADSP_VIRT_REG_MAX,
|
||||
};
|
||||
|
||||
/* Supports widget id 0x0 - 0xFF */
|
||||
#define TEGRA210_ADSP_WIDGET_SOURCE_SHIFT 0
|
||||
#define TEGRA210_ADSP_WIDGET_SOURCE_MASK (0xff << \
|
||||
TEGRA210_ADSP_WIDGET_SOURCE_SHIFT)
|
||||
|
||||
#define TEGRA210_ADSP_WIDGET_EN_SHIFT 31
|
||||
#define TEGRA210_ADSP_WIDGET_EN_MASK (0x1 << \
|
||||
TEGRA210_ADSP_WIDGET_EN_SHIFT)
|
||||
|
||||
/* TODO : Check if we can remove these macros */
|
||||
#define ADSP_FE_START TEGRA210_ADSP_FRONT_END1
|
||||
#define ADSP_FE_END TEGRA210_ADSP_FRONT_END15
|
||||
#define ADSP_ADMAIF_START TEGRA210_ADSP_ADMAIF1
|
||||
#define ADSP_ADMAIF_END TEGRA210_ADSP_ADMAIF20
|
||||
#define ADSP_EAVB_START TEGRA210_ADSP_EAVB
|
||||
#define ADSP_FE_COUNT ADSP_EAVB_START
|
||||
#define APM_IN_START TEGRA210_ADSP_APM_IN1
|
||||
#define APM_IN_END TEGRA210_ADSP_APM_IN15
|
||||
#define APM_OUT_START TEGRA210_ADSP_APM_OUT1
|
||||
#define APM_OUT_END TEGRA210_ADSP_APM_OUT15
|
||||
#define ADMA_START TEGRA210_ADSP_PLUGIN_ADMA1
|
||||
#define ADMA_END TEGRA210_ADSP_PLUGIN_ADMA15
|
||||
#define ADMA_TX_START TEGRA210_ADSP_PLUGIN_ADMA1_TX
|
||||
#define ADMA_TX_END TEGRA210_ADSP_PLUGIN_ADMA15_TX
|
||||
#define PLUGIN_START TEGRA210_ADSP_PLUGIN1
|
||||
#define PLUGIN_END TEGRA210_ADSP_PLUGIN20
|
||||
#define PLUGIN_NUM ((PLUGIN_END - PLUGIN_START) + 1)
|
||||
|
||||
#define IS_APM_IN(reg) ((reg >= APM_IN_START) && (reg <= APM_IN_END))
|
||||
#define IS_APM_OUT(reg) ((reg >= APM_OUT_START) && (reg <= APM_OUT_END))
|
||||
#define IS_APM(reg) (IS_APM_IN(reg) | IS_APM_OUT(reg))
|
||||
#define IS_PLUGIN(reg) ((reg >= PLUGIN_START) && (reg <= PLUGIN_END))
|
||||
#define IS_ADMA_RX(reg) ((reg >= ADMA_START) && (reg <= ADMA_END))
|
||||
#define IS_ADMA_TX(reg) ((reg >= ADMA_TX_START) && (reg <= ADMA_TX_END))
|
||||
#define IS_ADMA(reg) (IS_ADMA_RX(reg) || IS_ADMA_TX(reg))
|
||||
#define IS_ADSP_APP(reg) (IS_APM(reg) | IS_PLUGIN(reg) | IS_ADMA(reg))
|
||||
#define IS_ADSP_FE(reg) (((reg >= ADSP_FE_START) \
|
||||
&& (reg <= ADSP_FE_END)) || \
|
||||
(reg == ADSP_EAVB_START))
|
||||
#define IS_ADSP_ADMAIF(reg) ((reg >= ADSP_ADMAIF_START) \
|
||||
&& (reg <= ADSP_ADMAIF_END))
|
||||
|
||||
/* ADSP_MSG_FLAGs */
|
||||
#define TEGRA210_ADSP_MSG_FLAG_SEND 0x0
|
||||
#define TEGRA210_ADSP_MSG_FLAG_HOLD 0x1
|
||||
#define TEGRA210_ADSP_MSG_FLAG_NEED_ACK 0x2
|
||||
|
||||
/* TODO : Remove hard-coding and get data from DTS */
|
||||
#define TEGRA210_ADSP_ADMA_CHANNEL_START 10
|
||||
#define TEGRA210_ADSP_ADMA_CHANNEL_COUNT 10
|
||||
#define TEGRA210_ADSP_ADMA_BITMAP_COUNT 64
|
||||
#define TEGRA210_MAX_ADMA_CHANNEL 22
|
||||
#define TEGRA186_MAX_ADMA_CHANNEL 32
|
||||
|
||||
|
||||
#define TEGRA210_ADSP_ADMA_CHANNEL_START_HV 16
|
||||
|
||||
/* ADSP base index for widget name update */
|
||||
|
||||
#define TEGRA210_ADSP_ROUTE_BASE ((TEGRA210_ADSP_ADMAIF20 * 18) + \
|
||||
(15 * TEGRA210_ADSP_APM_OUT1))
|
||||
#define TEGRA210_ADSP_WIDGET_BASE \
|
||||
((TEGRA210_ADSP_ADMAIF20 * 3) + \
|
||||
(TEGRA210_ADSP_PLUGIN1 - TEGRA210_ADSP_APM_IN1) * 2)
|
||||
|
||||
#define IS_MMAP_ACCESS(access) \
|
||||
((access == SNDRV_PCM_ACCESS_MMAP_INTERLEAVED) || \
|
||||
(access == SNDRV_PCM_ACCESS_MMAP_NONINTERLEAVED) || \
|
||||
(access == SNDRV_PCM_ACCESS_MMAP_COMPLEX))
|
||||
#endif
|
||||
|
||||
#define ADSP_BACKEND_TO_ADMAIF(be_reg) (be_reg - ADSP_ADMAIF_START)
|
||||
5362
sound/soc/tegra-virt-alt/tegra210_adsp_virt_alt.c
Normal file
5362
sound/soc/tegra-virt-alt/tegra210_adsp_virt_alt.c
Normal file
File diff suppressed because it is too large
Load Diff
@@ -6,6 +6,7 @@ snd-soc-tegra-utils-objs := tegra_asoc_utils.o tegra_asoc_machine.o \
|
||||
snd-soc-tegra210-afc-objs := tegra210_afc.o
|
||||
snd-soc-tegra210-iqc-objs := tegra210_iqc.o
|
||||
snd-soc-tegra186-arad-objs := tegra186_arad.o
|
||||
snd-soc-tegra210-adsp-objs := tegra210_adsp.o
|
||||
snd-soc-tegra-machine-driver-objs := tegra_machine_driver.o
|
||||
snd-soc-tegra-controls-objs := tegra_mixer_control.o
|
||||
|
||||
@@ -13,5 +14,6 @@ obj-m += snd-soc-tegra-utils.o
|
||||
obj-m += snd-soc-tegra210-afc.o
|
||||
obj-m += snd-soc-tegra210-iqc.o
|
||||
obj-m += snd-soc-tegra186-arad.o
|
||||
obj-m += snd-soc-tegra210-adsp.o
|
||||
obj-m += snd-soc-tegra-machine-driver.o
|
||||
obj-m += snd-soc-tegra-controls.o
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
* tegra210_adsp.c - Tegra ADSP audio driver
|
||||
*
|
||||
* Author: Sumit Bhattacharya <sumitb@nvidia.com>
|
||||
* Copyright (c) 2014-2022 NVIDIA CORPORATION. All rights reserved.
|
||||
* Copyright (c) 2014-2024 NVIDIA CORPORATION. All rights reserved.
|
||||
*
|
||||
*/
|
||||
|
||||
@@ -13,7 +13,6 @@
|
||||
#include <linux/fs.h>
|
||||
#include <linux/io.h>
|
||||
#include <linux/of.h>
|
||||
#include <../arch/arm/mach-tegra/iomap.h>
|
||||
#include <linux/completion.h>
|
||||
#include <linux/uaccess.h>
|
||||
#include <linux/delay.h>
|
||||
@@ -35,6 +34,7 @@
|
||||
#include <sound/pcm_params.h>
|
||||
#include <sound/soc.h>
|
||||
#include <soc/tegra/fuse.h>
|
||||
#include <soc/tegra/fuse-helper.h>
|
||||
#include <sound/compress_driver.h>
|
||||
#include <sound/dmaengine_pcm.h>
|
||||
#include <sound/tegra_nvfx.h>
|
||||
@@ -373,11 +373,6 @@ static void tegra210_adsp_deallocate_dma_buffer(struct snd_dma_buffer *buf)
|
||||
buf->addr = 0;
|
||||
}
|
||||
|
||||
#if IS_ENABLED(CONFIG_TEGRA210_ADMA)
|
||||
/* implemented in adma driver */
|
||||
void tegra_adma_dump_ch_reg(void);
|
||||
#endif
|
||||
|
||||
/* ADSP OS boot and init API */
|
||||
static int tegra210_adsp_init(struct tegra210_adsp *adsp)
|
||||
{
|
||||
@@ -411,10 +406,9 @@ static int tegra210_adsp_init(struct tegra210_adsp *adsp)
|
||||
}
|
||||
}
|
||||
|
||||
#if IS_ENABLED(CONFIG_TEGRA210_ADMA)
|
||||
/* set callback function for adsp to dump adma registers for debug */
|
||||
nvadsp_set_adma_dump_reg(&tegra_adma_dump_ch_reg);
|
||||
#endif
|
||||
/* TODO: set callback function for adsp to dump adma registers for debug
|
||||
* purpose, see more details in Bug 3798682
|
||||
*/
|
||||
|
||||
/* Suspend OS for now. Resume will happen via runtime pm calls */
|
||||
ret = nvadsp_os_suspend();
|
||||
@@ -2848,19 +2842,6 @@ static struct snd_soc_dai_ops tegra210_adsp_eavb_dai_ops = {
|
||||
}, \
|
||||
}
|
||||
|
||||
#define ADSP_COMPR_DAI(id) \
|
||||
{ \
|
||||
.name = "ADSP COMPR" #id, \
|
||||
.compress_new = snd_soc_new_compress, \
|
||||
.playback = { \
|
||||
.stream_name = "ADSP COMPR" #id " Receive", \
|
||||
.channels_min = 1, \
|
||||
.channels_max = 2, \
|
||||
.rates = SNDRV_PCM_RATE_8000_48000, \
|
||||
.formats = SNDRV_PCM_FMTBIT_S16_LE, \
|
||||
}, \
|
||||
}
|
||||
|
||||
#define ADSP_EAVB_DAI() \
|
||||
{ \
|
||||
.name = "ADSP EAVB", \
|
||||
@@ -2999,8 +2980,6 @@ static struct snd_soc_dai_driver tegra210_adsp_cmpnt_dai[] = {
|
||||
ADSP_PCM_DAI(13),
|
||||
ADSP_PCM_DAI(14),
|
||||
ADSP_PCM_DAI(15),
|
||||
ADSP_COMPR_DAI(1),
|
||||
ADSP_COMPR_DAI(2),
|
||||
ADSP_EAVB_DAI(),
|
||||
};
|
||||
|
||||
@@ -4825,4 +4804,3 @@ MODULE_DESCRIPTION("Tegra210 ADSP Audio driver");
|
||||
MODULE_LICENSE("GPL");
|
||||
MODULE_ALIAS("platform:" DRV_NAME);
|
||||
MODULE_DEVICE_TABLE(of, tegra210_adsp_audio_of_match);
|
||||
|
||||
|
||||
Reference in New Issue
Block a user