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

dice.h (7451B)


      1/* SPDX-License-Identifier: GPL-2.0-only */
      2/*
      3 * dice.h - a part of driver for Dice based devices
      4 *
      5 * Copyright (c) Clemens Ladisch
      6 * Copyright (c) 2014 Takashi Sakamoto
      7 */
      8
      9#ifndef SOUND_DICE_H_INCLUDED
     10#define SOUND_DICE_H_INCLUDED
     11
     12#include <linux/compat.h>
     13#include <linux/completion.h>
     14#include <linux/delay.h>
     15#include <linux/device.h>
     16#include <linux/firewire.h>
     17#include <linux/firewire-constants.h>
     18#include <linux/jiffies.h>
     19#include <linux/module.h>
     20#include <linux/mod_devicetable.h>
     21#include <linux/mutex.h>
     22#include <linux/slab.h>
     23#include <linux/spinlock.h>
     24#include <linux/wait.h>
     25#include <linux/sched/signal.h>
     26
     27#include <sound/control.h>
     28#include <sound/core.h>
     29#include <sound/firewire.h>
     30#include <sound/hwdep.h>
     31#include <sound/info.h>
     32#include <sound/initval.h>
     33#include <sound/pcm.h>
     34#include <sound/pcm_params.h>
     35#include <sound/rawmidi.h>
     36
     37#include "../amdtp-am824.h"
     38#include "../iso-resources.h"
     39#include "../lib.h"
     40#include "dice-interface.h"
     41
     42/*
     43 * This module support maximum 2 pairs of tx/rx isochronous streams for
     44 * our convinience.
     45 *
     46 * In documents for ASICs called with a name of 'DICE':
     47 *  - ASIC for DICE II:
     48 *   - Maximum 2 tx and 4 rx are supported.
     49 *   - A packet supports maximum 16 data channels.
     50 *  - TCD2210/2210-E (so-called 'Dice Mini'):
     51 *   - Maximum 2 tx and 2 rx are supported.
     52 *   - A packet supports maximum 16 data channels.
     53 *  - TCD2220/2220-E (so-called 'Dice Jr.')
     54 *   - 2 tx and 2 rx are supported.
     55 *   - A packet supports maximum 16 data channels.
     56 *  - TCD3070-CH (so-called 'Dice III')
     57 *   - Maximum 2 tx and 2 rx are supported.
     58 *   - A packet supports maximum 32 data channels.
     59 *
     60 * For the above, MIDI conformant data channel is just on the first isochronous
     61 * stream.
     62 */
     63#define MAX_STREAMS	2
     64
     65enum snd_dice_rate_mode {
     66	SND_DICE_RATE_MODE_LOW = 0,
     67	SND_DICE_RATE_MODE_MIDDLE,
     68	SND_DICE_RATE_MODE_HIGH,
     69	SND_DICE_RATE_MODE_COUNT,
     70};
     71
     72struct snd_dice;
     73typedef int (*snd_dice_detect_formats_t)(struct snd_dice *dice);
     74
     75struct snd_dice {
     76	struct snd_card *card;
     77	struct fw_unit *unit;
     78	spinlock_t lock;
     79	struct mutex mutex;
     80
     81	/* Offsets for sub-addresses */
     82	unsigned int global_offset;
     83	unsigned int rx_offset;
     84	unsigned int tx_offset;
     85	unsigned int sync_offset;
     86	unsigned int rsrv_offset;
     87
     88	unsigned int clock_caps;
     89	unsigned int tx_pcm_chs[MAX_STREAMS][SND_DICE_RATE_MODE_COUNT];
     90	unsigned int rx_pcm_chs[MAX_STREAMS][SND_DICE_RATE_MODE_COUNT];
     91	unsigned int tx_midi_ports[MAX_STREAMS];
     92	unsigned int rx_midi_ports[MAX_STREAMS];
     93
     94	struct fw_address_handler notification_handler;
     95	int owner_generation;
     96	u32 notification_bits;
     97
     98	/* For uapi */
     99	int dev_lock_count; /* > 0 driver, < 0 userspace */
    100	bool dev_lock_changed;
    101	wait_queue_head_t hwdep_wait;
    102
    103	/* For streaming */
    104	struct fw_iso_resources tx_resources[MAX_STREAMS];
    105	struct fw_iso_resources rx_resources[MAX_STREAMS];
    106	struct amdtp_stream tx_stream[MAX_STREAMS];
    107	struct amdtp_stream rx_stream[MAX_STREAMS];
    108	bool global_enabled:1;
    109	bool disable_double_pcm_frames:1;
    110	struct completion clock_accepted;
    111	unsigned int substreams_counter;
    112
    113	struct amdtp_domain domain;
    114};
    115
    116enum snd_dice_addr_type {
    117	SND_DICE_ADDR_TYPE_PRIVATE,
    118	SND_DICE_ADDR_TYPE_GLOBAL,
    119	SND_DICE_ADDR_TYPE_TX,
    120	SND_DICE_ADDR_TYPE_RX,
    121	SND_DICE_ADDR_TYPE_SYNC,
    122	SND_DICE_ADDR_TYPE_RSRV,
    123};
    124
    125int snd_dice_transaction_write(struct snd_dice *dice,
    126			       enum snd_dice_addr_type type,
    127			       unsigned int offset,
    128			       void *buf, unsigned int len);
    129int snd_dice_transaction_read(struct snd_dice *dice,
    130			      enum snd_dice_addr_type type, unsigned int offset,
    131			      void *buf, unsigned int len);
    132
    133static inline int snd_dice_transaction_write_global(struct snd_dice *dice,
    134						    unsigned int offset,
    135						    void *buf, unsigned int len)
    136{
    137	return snd_dice_transaction_write(dice,
    138					  SND_DICE_ADDR_TYPE_GLOBAL, offset,
    139					  buf, len);
    140}
    141static inline int snd_dice_transaction_read_global(struct snd_dice *dice,
    142						   unsigned int offset,
    143						   void *buf, unsigned int len)
    144{
    145	return snd_dice_transaction_read(dice,
    146					 SND_DICE_ADDR_TYPE_GLOBAL, offset,
    147					 buf, len);
    148}
    149static inline int snd_dice_transaction_write_tx(struct snd_dice *dice,
    150						unsigned int offset,
    151						void *buf, unsigned int len)
    152{
    153	return snd_dice_transaction_write(dice, SND_DICE_ADDR_TYPE_TX, offset,
    154					  buf, len);
    155}
    156static inline int snd_dice_transaction_read_tx(struct snd_dice *dice,
    157					       unsigned int offset,
    158					       void *buf, unsigned int len)
    159{
    160	return snd_dice_transaction_read(dice, SND_DICE_ADDR_TYPE_TX, offset,
    161					 buf, len);
    162}
    163static inline int snd_dice_transaction_write_rx(struct snd_dice *dice,
    164						unsigned int offset,
    165						void *buf, unsigned int len)
    166{
    167	return snd_dice_transaction_write(dice, SND_DICE_ADDR_TYPE_RX, offset,
    168					  buf, len);
    169}
    170static inline int snd_dice_transaction_read_rx(struct snd_dice *dice,
    171					       unsigned int offset,
    172					       void *buf, unsigned int len)
    173{
    174	return snd_dice_transaction_read(dice, SND_DICE_ADDR_TYPE_RX, offset,
    175					 buf, len);
    176}
    177static inline int snd_dice_transaction_write_sync(struct snd_dice *dice,
    178						  unsigned int offset,
    179						  void *buf, unsigned int len)
    180{
    181	return snd_dice_transaction_write(dice, SND_DICE_ADDR_TYPE_SYNC, offset,
    182					  buf, len);
    183}
    184static inline int snd_dice_transaction_read_sync(struct snd_dice *dice,
    185						 unsigned int offset,
    186						 void *buf, unsigned int len)
    187{
    188	return snd_dice_transaction_read(dice, SND_DICE_ADDR_TYPE_SYNC, offset,
    189					 buf, len);
    190}
    191
    192int snd_dice_transaction_get_clock_source(struct snd_dice *dice,
    193					  unsigned int *source);
    194int snd_dice_transaction_get_rate(struct snd_dice *dice, unsigned int *rate);
    195int snd_dice_transaction_set_enable(struct snd_dice *dice);
    196void snd_dice_transaction_clear_enable(struct snd_dice *dice);
    197int snd_dice_transaction_init(struct snd_dice *dice);
    198int snd_dice_transaction_reinit(struct snd_dice *dice);
    199void snd_dice_transaction_destroy(struct snd_dice *dice);
    200
    201#define SND_DICE_RATES_COUNT	7
    202extern const unsigned int snd_dice_rates[SND_DICE_RATES_COUNT];
    203
    204int snd_dice_stream_get_rate_mode(struct snd_dice *dice, unsigned int rate,
    205				  enum snd_dice_rate_mode *mode);
    206int snd_dice_stream_start_duplex(struct snd_dice *dice);
    207void snd_dice_stream_stop_duplex(struct snd_dice *dice);
    208int snd_dice_stream_init_duplex(struct snd_dice *dice);
    209void snd_dice_stream_destroy_duplex(struct snd_dice *dice);
    210int snd_dice_stream_reserve_duplex(struct snd_dice *dice, unsigned int rate,
    211				   unsigned int events_per_period,
    212				   unsigned int events_per_buffer);
    213void snd_dice_stream_update_duplex(struct snd_dice *dice);
    214int snd_dice_stream_detect_current_formats(struct snd_dice *dice);
    215
    216int snd_dice_stream_lock_try(struct snd_dice *dice);
    217void snd_dice_stream_lock_release(struct snd_dice *dice);
    218
    219int snd_dice_create_pcm(struct snd_dice *dice);
    220
    221int snd_dice_create_hwdep(struct snd_dice *dice);
    222
    223void snd_dice_create_proc(struct snd_dice *dice);
    224
    225int snd_dice_create_midi(struct snd_dice *dice);
    226
    227int snd_dice_detect_tcelectronic_formats(struct snd_dice *dice);
    228int snd_dice_detect_alesis_formats(struct snd_dice *dice);
    229int snd_dice_detect_alesis_mastercontrol_formats(struct snd_dice *dice);
    230int snd_dice_detect_extension_formats(struct snd_dice *dice);
    231int snd_dice_detect_mytek_formats(struct snd_dice *dice);
    232int snd_dice_detect_presonus_formats(struct snd_dice *dice);
    233int snd_dice_detect_harman_formats(struct snd_dice *dice);
    234
    235#endif