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

pcxhr.h (6220B)


      1/* SPDX-License-Identifier: GPL-2.0-or-later */
      2/*
      3 * Driver for Digigram pcxhr soundcards
      4 *
      5 * main header file
      6 *
      7 * Copyright (c) 2004 by Digigram <alsa@digigram.com>
      8 */
      9
     10#ifndef __SOUND_PCXHR_H
     11#define __SOUND_PCXHR_H
     12
     13#include <linux/interrupt.h>
     14#include <linux/mutex.h>
     15#include <sound/pcm.h>
     16
     17#define PCXHR_DRIVER_VERSION		0x000906	/* 0.9.6 */
     18#define PCXHR_DRIVER_VERSION_STRING	"0.9.6"		/* 0.9.6 */
     19
     20
     21#define PCXHR_MAX_CARDS		6
     22#define PCXHR_PLAYBACK_STREAMS	4
     23
     24#define PCXHR_GRANULARITY	96	/* min 96 and multiple of 48 */
     25/* transfer granularity of pipes and the dsp time (MBOX4) */
     26#define PCXHR_GRANULARITY_MIN	96
     27/* TODO : granularity could be 64 or 128 */
     28#define PCXHR_GRANULARITY_HR22	192	/* granularity for stereo cards */
     29
     30struct snd_pcxhr;
     31struct pcxhr_mgr;
     32
     33struct pcxhr_stream;
     34struct pcxhr_pipe;
     35
     36enum pcxhr_clock_type {
     37	PCXHR_CLOCK_TYPE_INTERNAL = 0,
     38	PCXHR_CLOCK_TYPE_WORD_CLOCK,
     39	PCXHR_CLOCK_TYPE_AES_SYNC,
     40	PCXHR_CLOCK_TYPE_AES_1,
     41	PCXHR_CLOCK_TYPE_AES_2,
     42	PCXHR_CLOCK_TYPE_AES_3,
     43	PCXHR_CLOCK_TYPE_AES_4,
     44	PCXHR_CLOCK_TYPE_MAX = PCXHR_CLOCK_TYPE_AES_4,
     45	HR22_CLOCK_TYPE_INTERNAL = PCXHR_CLOCK_TYPE_INTERNAL,
     46	HR22_CLOCK_TYPE_AES_SYNC,
     47	HR22_CLOCK_TYPE_AES_1,
     48	HR22_CLOCK_TYPE_MAX = HR22_CLOCK_TYPE_AES_1,
     49};
     50
     51struct pcxhr_mgr {
     52	unsigned int num_cards;
     53	struct snd_pcxhr *chip[PCXHR_MAX_CARDS];
     54
     55	struct pci_dev *pci;
     56
     57	int irq;
     58
     59	int granularity;
     60
     61	/* card access with 1 mem bar and 2 io bar's */
     62	unsigned long port[3];
     63
     64	/* share the name */
     65	char name[40];			/* name of this soundcard */
     66
     67	struct pcxhr_rmh *prmh;
     68
     69	struct mutex lock;		/* interrupt lock */
     70	struct mutex msg_lock;		/* message lock */
     71
     72	struct mutex setup_mutex;	/* mutex used in hw_params, open and close */
     73	struct mutex mixer_mutex;	/* mutex for mixer */
     74
     75	/* hardware interface */
     76	unsigned int dsp_loaded;	/* bit flags of loaded dsp indices */
     77	unsigned int dsp_version;	/* read from embedded once firmware is loaded */
     78	int playback_chips;
     79	int capture_chips;
     80	int fw_file_set;
     81	int firmware_num;
     82	unsigned int is_hr_stereo:1;
     83	unsigned int board_has_aes1:1;	/* if 1 board has AES1 plug and SRC */
     84	unsigned int board_has_analog:1; /* if 0 the board is digital only */
     85	unsigned int board_has_mic:1; /* if 1 the board has microphone input */
     86	unsigned int board_aes_in_192k:1;/* if 1 the aes input plugs do support 192kHz */
     87	unsigned int mono_capture:1; /* if 1 the board does mono capture */
     88	unsigned int capture_ltc:1; /* if 1 the board captures LTC input */
     89
     90	struct snd_dma_buffer hostport;
     91
     92	enum pcxhr_clock_type use_clock_type;	/* clock type selected by mixer */
     93	enum pcxhr_clock_type cur_clock_type;	/* current clock type synced */
     94	int sample_rate;
     95	int ref_count_rate;
     96	int timer_toggle;		/* timer interrupt toggles between the two values 0x200 and 0x300 */
     97	int dsp_time_last;		/* the last dsp time (read by interrupt) */
     98	int dsp_time_err;		/* dsp time errors */
     99	unsigned int src_it_dsp;	/* dsp interrupt source */
    100	unsigned int io_num_reg_cont;	/* backup of IO_NUM_REG_CONT */
    101	unsigned int codec_speed;	/* speed mode of the codecs */
    102	unsigned int sample_rate_real;	/* current real sample rate */
    103	int last_reg_stat;
    104	int async_err_stream_xrun;
    105	int async_err_pipe_xrun;
    106	int async_err_other_last;
    107
    108	unsigned char xlx_cfg;		/* copy of PCXHR_XLX_CFG register */
    109	unsigned char xlx_selmic;	/* copy of PCXHR_XLX_SELMIC register */
    110	unsigned char dsp_reset;	/* copy of PCXHR_DSP_RESET register */
    111};
    112
    113
    114enum pcxhr_stream_status {
    115	PCXHR_STREAM_STATUS_FREE,
    116	PCXHR_STREAM_STATUS_OPEN,
    117	PCXHR_STREAM_STATUS_SCHEDULE_RUN,
    118	PCXHR_STREAM_STATUS_STARTED,
    119	PCXHR_STREAM_STATUS_RUNNING,
    120	PCXHR_STREAM_STATUS_SCHEDULE_STOP,
    121	PCXHR_STREAM_STATUS_STOPPED,
    122	PCXHR_STREAM_STATUS_PAUSED
    123};
    124
    125struct pcxhr_stream {
    126	struct snd_pcm_substream *substream;
    127	snd_pcm_format_t format;
    128	struct pcxhr_pipe *pipe;
    129
    130	enum pcxhr_stream_status status;	/* free, open, running, draining, pause */
    131
    132	u_int64_t timer_abs_periods;	/* timer: samples elapsed since TRIGGER_START (multiple of period_size) */
    133	u_int32_t timer_period_frag;	/* timer: samples elapsed since last call to snd_pcm_period_elapsed (0..period_size) */
    134	u_int32_t timer_buf_periods;	/* nb of periods in the buffer that have already elapsed */
    135	int timer_is_synced;		/* if(0) : timer needs to be resynced with real hardware pointer */
    136
    137	int channels;
    138};
    139
    140
    141enum pcxhr_pipe_status {
    142	PCXHR_PIPE_UNDEFINED,
    143	PCXHR_PIPE_DEFINED
    144};
    145
    146struct pcxhr_pipe {
    147	enum pcxhr_pipe_status status;
    148	int is_capture;		/* this is a capture pipe */
    149	int first_audio;	/* first audio num */
    150};
    151
    152
    153struct snd_pcxhr {
    154	struct snd_card *card;
    155	struct pcxhr_mgr *mgr;
    156	int chip_idx;		/* zero based */
    157
    158	struct snd_pcm *pcm;		/* PCM */
    159
    160	struct pcxhr_pipe playback_pipe;	/* 1 stereo pipe only */
    161	struct pcxhr_pipe capture_pipe[2];	/* 1 stereo or 2 mono pipes */
    162
    163	struct pcxhr_stream playback_stream[PCXHR_PLAYBACK_STREAMS];
    164	struct pcxhr_stream capture_stream[2];	/* 1 stereo or 2 mono streams */
    165	int nb_streams_play;
    166	int nb_streams_capt;
    167
    168	int analog_playback_active[2];	/* Mixer : Master Playback !mute */
    169	int analog_playback_volume[2];	/* Mixer : Master Playback Volume */
    170	int analog_capture_volume[2];	/* Mixer : Master Capture Volume */
    171	int digital_playback_active[PCXHR_PLAYBACK_STREAMS][2];
    172	int digital_playback_volume[PCXHR_PLAYBACK_STREAMS][2];
    173	int digital_capture_volume[2];	/* Mixer : Digital Capture Volume */
    174	int monitoring_active[2];	/* Mixer : Monitoring Active */
    175	int monitoring_volume[2];	/* Mixer : Monitoring Volume */
    176	int audio_capture_source;	/* Mixer : Audio Capture Source */
    177	int mic_volume;			/* used by cards with MIC only */
    178	int mic_boost;			/* used by cards with MIC only */
    179	int mic_active;			/* used by cards with MIC only */
    180	int analog_capture_active;	/* used by cards with MIC only */
    181	int phantom_power;		/* used by cards with MIC only */
    182
    183	unsigned char aes_bits[5];	/* Mixer : IEC958_AES bits */
    184};
    185
    186struct pcxhr_hostport
    187{
    188	char purgebuffer[6];
    189	char reserved[2];
    190};
    191
    192/* exported */
    193int pcxhr_create_pcm(struct snd_pcxhr *chip);
    194int pcxhr_set_clock(struct pcxhr_mgr *mgr, unsigned int rate);
    195int pcxhr_get_external_clock(struct pcxhr_mgr *mgr,
    196			     enum pcxhr_clock_type clock_type,
    197			     int *sample_rate);
    198
    199#endif /* __SOUND_PCXHR_H */