cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

messages.h (9231B)


      1/* SPDX-License-Identifier: GPL-2.0-only */
      2/*
      3 * Copyright(c) 2020 Intel Corporation. All rights reserved.
      4 *
      5 * Author: Cezary Rojewski <cezary.rojewski@intel.com>
      6 */
      7
      8#ifndef __SND_SOC_INTEL_CATPT_MSG_H
      9#define __SND_SOC_INTEL_CATPT_MSG_H
     10
     11struct catpt_dev;
     12
     13/* IPC messages base types  */
     14
     15enum catpt_reply_status {
     16	CATPT_REPLY_SUCCESS = 0,
     17	CATPT_REPLY_ERROR_INVALID_PARAM = 1,
     18	CATPT_REPLY_UNKNOWN_MESSAGE_TYPE = 2,
     19	CATPT_REPLY_OUT_OF_RESOURCES = 3,
     20	CATPT_REPLY_BUSY = 4,
     21	CATPT_REPLY_PENDING = 5,
     22	CATPT_REPLY_FAILURE = 6,
     23	CATPT_REPLY_INVALID_REQUEST = 7,
     24	CATPT_REPLY_UNINITIALIZED = 8,
     25	CATPT_REPLY_NOT_FOUND = 9,
     26	CATPT_REPLY_SOURCE_NOT_STARTED = 10,
     27};
     28
     29/* GLOBAL messages */
     30
     31enum catpt_global_msg_type {
     32	CATPT_GLB_GET_FW_VERSION = 0,
     33	CATPT_GLB_ALLOCATE_STREAM = 3,
     34	CATPT_GLB_FREE_STREAM = 4,
     35	CATPT_GLB_STREAM_MESSAGE = 6,
     36	CATPT_GLB_REQUEST_CORE_DUMP = 7,
     37	CATPT_GLB_SET_DEVICE_FORMATS = 10,
     38	CATPT_GLB_ENTER_DX_STATE = 12,
     39	CATPT_GLB_GET_MIXER_STREAM_INFO = 13,
     40};
     41
     42union catpt_global_msg {
     43	u32 val;
     44	struct {
     45		u32 status:5;
     46		u32 context:19; /* stream or module specific */
     47		u32 global_msg_type:5;
     48		u32 fw_ready:1;
     49		u32 done:1;
     50		u32 busy:1;
     51	};
     52} __packed;
     53
     54#define CATPT_MSG(hdr) { .val = hdr }
     55#define CATPT_GLOBAL_MSG(msg_type) \
     56	{ .global_msg_type = CATPT_GLB_##msg_type }
     57
     58#define BUILD_HASH_SIZE		40
     59
     60struct catpt_fw_version {
     61	u8 build;
     62	u8 minor;
     63	u8 major;
     64	u8 type;
     65	u8 build_hash[BUILD_HASH_SIZE];
     66	u32 log_providers_hash;
     67} __packed;
     68
     69int catpt_ipc_get_fw_version(struct catpt_dev *cdev,
     70			     struct catpt_fw_version *version);
     71
     72enum catpt_pin_id {
     73	CATPT_PIN_ID_SYSTEM = 0,
     74	CATPT_PIN_ID_REFERENCE = 1,
     75	CATPT_PIN_ID_CAPTURE1 = 2,
     76	CATPT_PIN_ID_CAPTURE2 = 3,
     77	CATPT_PIN_ID_OFFLOAD1 = 4,
     78	CATPT_PIN_ID_OFFLOAD2 = 5,
     79	CATPT_PIN_ID_MIXER = 7,
     80	CATPT_PIN_ID_BLUETOOTH_CAPTURE = 8,
     81	CATPT_PIN_ID_BLUETOOTH_RENDER = 9,
     82};
     83
     84enum catpt_path_id {
     85	CATPT_PATH_SSP0_OUT = 0,
     86	CATPT_PATH_SSP0_IN = 1,
     87	CATPT_PATH_SSP1_OUT = 2,
     88	CATPT_PATH_SSP1_IN = 3,
     89	/* duplicated audio in capture path */
     90	CATPT_PATH_SSP0_IN_DUP = 4,
     91};
     92
     93enum catpt_stream_type {
     94	CATPT_STRM_TYPE_RENDER = 0, /* offload */
     95	CATPT_STRM_TYPE_SYSTEM = 1,
     96	CATPT_STRM_TYPE_CAPTURE = 2,
     97	CATPT_STRM_TYPE_LOOPBACK = 3,
     98	CATPT_STRM_TYPE_BLUETOOTH_RENDER = 4,
     99	CATPT_STRM_TYPE_BLUETOOTH_CAPTURE = 5,
    100};
    101
    102enum catpt_format_id {
    103	CATPT_FORMAT_PCM = 0,
    104	CATPT_FORMAT_MP3 = 1,
    105	CATPT_FORMAT_AAC = 2,
    106	CATPT_FORMAT_WMA = 3,
    107};
    108
    109enum catpt_channel_index {
    110	CATPT_CHANNEL_LEFT = 0x0,
    111	CATPT_CHANNEL_CENTER = 0x1,
    112	CATPT_CHANNEL_RIGHT = 0x2,
    113	CATPT_CHANNEL_LEFT_SURROUND = 0x3,
    114	CATPT_CHANNEL_CENTER_SURROUND = 0x3,
    115	CATPT_CHANNEL_RIGHT_SURROUND = 0x4,
    116	CATPT_CHANNEL_LFE = 0x7,
    117	CATPT_CHANNEL_INVALID = 0xF,
    118};
    119
    120enum catpt_channel_config {
    121	CATPT_CHANNEL_CONFIG_MONO	= 0, /* One channel only */
    122	CATPT_CHANNEL_CONFIG_STEREO	= 1, /* L & R */
    123	CATPT_CHANNEL_CONFIG_2_POINT_1	= 2, /* L, R & LFE; PCM only */
    124	CATPT_CHANNEL_CONFIG_3_POINT_0	= 3, /* L, C & R; MP3 & AAC only */
    125	CATPT_CHANNEL_CONFIG_3_POINT_1	= 4, /* L, C, R & LFE; PCM only */
    126	CATPT_CHANNEL_CONFIG_QUATRO	= 5, /* L, R, Ls & Rs; PCM only */
    127	CATPT_CHANNEL_CONFIG_4_POINT_0	= 6, /* L, C, R & Cs; MP3 & AAC only */
    128	CATPT_CHANNEL_CONFIG_5_POINT_0	= 7, /* L, C, R, Ls & Rs */
    129	CATPT_CHANNEL_CONFIG_5_POINT_1	= 8, /* L, C, R, Ls, Rs & LFE */
    130	CATPT_CHANNEL_CONFIG_DUAL_MONO	= 9, /* One channel replicated in two */
    131	CATPT_CHANNEL_CONFIG_INVALID	= 10,
    132};
    133
    134enum catpt_interleaving_style {
    135	CATPT_INTERLEAVING_PER_CHANNEL	= 0,
    136	CATPT_INTERLEAVING_PER_SAMPLE	= 1,
    137};
    138
    139struct catpt_audio_format {
    140	u32 sample_rate;
    141	u32 bit_depth;
    142	u32 channel_map;
    143	u32 channel_config;
    144	u32 interleaving;
    145	u8 num_channels;
    146	u8 valid_bit_depth;
    147	u8 reserved[2];
    148} __packed;
    149
    150struct catpt_ring_info {
    151	u32 page_table_addr;
    152	u32 num_pages;
    153	u32 size;
    154	u32 offset;
    155	u32 ring_first_page_pfn;
    156} __packed;
    157
    158#define CATPT_MODULE_COUNT (CATPT_MODID_LAST + 1)
    159
    160enum catpt_module_id {
    161	CATPT_MODID_BASE_FW		= 0x0,
    162	CATPT_MODID_MP3			= 0x1,
    163	CATPT_MODID_AAC_5_1		= 0x2,
    164	CATPT_MODID_AAC_2_0		= 0x3,
    165	CATPT_MODID_SRC			= 0x4,
    166	CATPT_MODID_WAVES		= 0x5,
    167	CATPT_MODID_DOLBY		= 0x6,
    168	CATPT_MODID_BOOST		= 0x7,
    169	CATPT_MODID_LPAL		= 0x8,
    170	CATPT_MODID_DTS			= 0x9,
    171	CATPT_MODID_PCM_CAPTURE		= 0xA,
    172	CATPT_MODID_PCM_SYSTEM		= 0xB,
    173	CATPT_MODID_PCM_REFERENCE	= 0xC,
    174	CATPT_MODID_PCM			= 0xD, /* offload */
    175	CATPT_MODID_BLUETOOTH_RENDER	= 0xE,
    176	CATPT_MODID_BLUETOOTH_CAPTURE	= 0xF,
    177	CATPT_MODID_LAST		= CATPT_MODID_BLUETOOTH_CAPTURE,
    178};
    179
    180struct catpt_module_entry {
    181	u32 module_id;
    182	u32 entry_point;
    183} __packed;
    184
    185struct catpt_module_map {
    186	u8 num_entries;
    187	struct catpt_module_entry entries[];
    188} __packed;
    189
    190struct catpt_memory_info {
    191	u32 offset;
    192	u32 size;
    193} __packed;
    194
    195#define CATPT_CHANNELS_MAX	4
    196#define CATPT_ALL_CHANNELS_MASK	UINT_MAX
    197
    198struct catpt_stream_info {
    199	u32 stream_hw_id;
    200	u32 reserved;
    201	u32 read_pos_regaddr;
    202	u32 pres_pos_regaddr;
    203	u32 peak_meter_regaddr[CATPT_CHANNELS_MAX];
    204	u32 volume_regaddr[CATPT_CHANNELS_MAX];
    205} __packed;
    206
    207int catpt_ipc_alloc_stream(struct catpt_dev *cdev,
    208			   enum catpt_path_id path_id,
    209			   enum catpt_stream_type type,
    210			   struct catpt_audio_format *afmt,
    211			   struct catpt_ring_info *rinfo,
    212			   u8 num_modules,
    213			   struct catpt_module_entry *modules,
    214			   struct resource *persistent,
    215			   struct resource *scratch,
    216			   struct catpt_stream_info *sinfo);
    217int catpt_ipc_free_stream(struct catpt_dev *cdev, u8 stream_hw_id);
    218
    219enum catpt_ssp_iface {
    220	CATPT_SSP_IFACE_0 = 0,
    221	CATPT_SSP_IFACE_1 = 1,
    222	CATPT_SSP_COUNT,
    223};
    224
    225enum catpt_mclk_frequency {
    226	CATPT_MCLK_OFF = 0,
    227	CATPT_MCLK_FREQ_6_MHZ = 1,
    228	CATPT_MCLK_FREQ_21_MHZ = 2,
    229	CATPT_MCLK_FREQ_24_MHZ = 3,
    230};
    231
    232enum catpt_ssp_mode {
    233	CATPT_SSP_MODE_I2S_CONSUMER = 0,
    234	CATPT_SSP_MODE_I2S_PROVIDER = 1,
    235	CATPT_SSP_MODE_TDM_PROVIDER = 2,
    236};
    237
    238struct catpt_ssp_device_format {
    239	u32 iface;
    240	u32 mclk;
    241	u32 mode;
    242	u16 clock_divider;
    243	u8 channels;
    244} __packed;
    245
    246int catpt_ipc_set_device_format(struct catpt_dev *cdev,
    247				struct catpt_ssp_device_format *devfmt);
    248
    249enum catpt_dx_state {
    250	CATPT_DX_STATE_D3 = 3,
    251};
    252
    253enum catpt_dx_type {
    254	CATPT_DX_TYPE_FW_IMAGE = 0,
    255	CATPT_DX_TYPE_MEMORY_DUMP = 1,
    256};
    257
    258struct catpt_save_meminfo {
    259	u32 offset;
    260	u32 size;
    261	u32 source;
    262} __packed;
    263
    264#define SAVE_MEMINFO_MAX	14
    265
    266struct catpt_dx_context {
    267	u32 num_meminfo;
    268	struct catpt_save_meminfo meminfo[SAVE_MEMINFO_MAX];
    269} __packed;
    270
    271int catpt_ipc_enter_dxstate(struct catpt_dev *cdev, enum catpt_dx_state state,
    272			    struct catpt_dx_context *context);
    273
    274struct catpt_mixer_stream_info {
    275	u32 mixer_hw_id;
    276	u32 peak_meter_regaddr[CATPT_CHANNELS_MAX];
    277	u32 volume_regaddr[CATPT_CHANNELS_MAX];
    278} __packed;
    279
    280int catpt_ipc_get_mixer_stream_info(struct catpt_dev *cdev,
    281				    struct catpt_mixer_stream_info *info);
    282
    283/* STREAM messages */
    284
    285enum catpt_stream_msg_type {
    286	CATPT_STRM_RESET_STREAM = 0,
    287	CATPT_STRM_PAUSE_STREAM = 1,
    288	CATPT_STRM_RESUME_STREAM = 2,
    289	CATPT_STRM_STAGE_MESSAGE = 3,
    290	CATPT_STRM_NOTIFICATION = 4,
    291};
    292
    293enum catpt_stage_action {
    294	CATPT_STG_SET_VOLUME = 1,
    295	CATPT_STG_SET_WRITE_POSITION = 2,
    296	CATPT_STG_MUTE_LOOPBACK = 3,
    297};
    298
    299union catpt_stream_msg {
    300	u32 val;
    301	struct {
    302		u32 status:5;
    303		u32 reserved:7;
    304		u32 stage_action:4;
    305		u32 stream_hw_id:4;
    306		u32 stream_msg_type:4;
    307		u32 global_msg_type:5;
    308		u32 fw_ready:1;
    309		u32 done:1;
    310		u32 busy:1;
    311	};
    312} __packed;
    313
    314#define CATPT_STREAM_MSG(msg_type) \
    315{ \
    316	.stream_msg_type = CATPT_STRM_##msg_type, \
    317	.global_msg_type = CATPT_GLB_STREAM_MESSAGE }
    318#define CATPT_STAGE_MSG(msg_type) \
    319{ \
    320	.stage_action = CATPT_STG_##msg_type, \
    321	.stream_msg_type = CATPT_STRM_STAGE_MESSAGE, \
    322	.global_msg_type = CATPT_GLB_STREAM_MESSAGE }
    323
    324int catpt_ipc_reset_stream(struct catpt_dev *cdev, u8 stream_hw_id);
    325int catpt_ipc_pause_stream(struct catpt_dev *cdev, u8 stream_hw_id);
    326int catpt_ipc_resume_stream(struct catpt_dev *cdev, u8 stream_hw_id);
    327
    328/* STREAM messages - STAGE subtype */
    329
    330enum catpt_audio_curve_type {
    331	CATPT_AUDIO_CURVE_NONE = 0,
    332	CATPT_AUDIO_CURVE_WINDOWS_FADE = 1,
    333};
    334
    335int catpt_ipc_set_volume(struct catpt_dev *cdev, u8 stream_hw_id,
    336			 u32 channel, u32 volume,
    337			 u32 curve_duration,
    338			 enum catpt_audio_curve_type curve_type);
    339
    340int catpt_ipc_set_write_pos(struct catpt_dev *cdev, u8 stream_hw_id,
    341			    u32 pos, bool eob, bool ll);
    342
    343int catpt_ipc_mute_loopback(struct catpt_dev *cdev, u8 stream_hw_id, bool mute);
    344
    345/* NOTIFICATION messages */
    346
    347enum catpt_notify_reason {
    348	CATPT_NOTIFY_POSITION_CHANGED = 0,
    349	CATPT_NOTIFY_GLITCH_OCCURRED = 1,
    350};
    351
    352union catpt_notify_msg {
    353	u32 val;
    354	struct {
    355		u32 mailbox_address:29;
    356		u32 fw_ready:1;
    357		u32 done:1;
    358		u32 busy:1;
    359	};
    360	struct {
    361		u32 status:5;
    362		u32 reserved:7;
    363		u32 notify_reason:4;
    364		u32 stream_hw_id:4;
    365		u32 stream_msg_type:4;
    366		u32 global_msg_type:5;
    367		u32 hdr:3; /* fw_ready, done, busy */
    368	};
    369} __packed;
    370
    371#define FW_INFO_SIZE_MAX	100
    372
    373struct catpt_fw_ready {
    374	u32 inbox_offset;
    375	u32 outbox_offset;
    376	u32 inbox_size;
    377	u32 outbox_size;
    378	u32 fw_info_size;
    379	char fw_info[FW_INFO_SIZE_MAX];
    380} __packed;
    381
    382struct catpt_notify_position {
    383	u32 stream_position;
    384	u32 fw_cycle_count;
    385} __packed;
    386
    387enum catpt_glitch_type {
    388	CATPT_GLITCH_UNDERRUN = 1,
    389	CATPT_GLITCH_DECODER_ERROR = 2,
    390	CATPT_GLITCH_DOUBLED_WRITE_POS = 3,
    391};
    392
    393struct catpt_notify_glitch {
    394	u32 type;
    395	u64 presentation_pos;
    396	u32 write_pos;
    397} __packed;
    398
    399#endif