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

core.h (15632B)


      1/* SPDX-License-Identifier: GPL-2.0-or-later */
      2#ifndef __SOUND_CORE_H
      3#define __SOUND_CORE_H
      4
      5/*
      6 *  Main header file for the ALSA driver
      7 *  Copyright (c) 1994-2001 by Jaroslav Kysela <perex@perex.cz>
      8 */
      9
     10#include <linux/device.h>
     11#include <linux/sched.h>		/* wake_up() */
     12#include <linux/mutex.h>		/* struct mutex */
     13#include <linux/rwsem.h>		/* struct rw_semaphore */
     14#include <linux/pm.h>			/* pm_message_t */
     15#include <linux/stringify.h>
     16#include <linux/printk.h>
     17
     18/* number of supported soundcards */
     19#ifdef CONFIG_SND_DYNAMIC_MINORS
     20#define SNDRV_CARDS CONFIG_SND_MAX_CARDS
     21#else
     22#define SNDRV_CARDS 8		/* don't change - minor numbers */
     23#endif
     24
     25#define CONFIG_SND_MAJOR	116	/* standard configuration */
     26
     27/* forward declarations */
     28struct pci_dev;
     29struct module;
     30struct completion;
     31
     32/* device allocation stuff */
     33
     34/* type of the object used in snd_device_*()
     35 * this also defines the calling order
     36 */
     37enum snd_device_type {
     38	SNDRV_DEV_LOWLEVEL,
     39	SNDRV_DEV_INFO,
     40	SNDRV_DEV_BUS,
     41	SNDRV_DEV_CODEC,
     42	SNDRV_DEV_PCM,
     43	SNDRV_DEV_COMPRESS,
     44	SNDRV_DEV_RAWMIDI,
     45	SNDRV_DEV_TIMER,
     46	SNDRV_DEV_SEQUENCER,
     47	SNDRV_DEV_HWDEP,
     48	SNDRV_DEV_JACK,
     49	SNDRV_DEV_CONTROL,	/* NOTE: this must be the last one */
     50};
     51
     52enum snd_device_state {
     53	SNDRV_DEV_BUILD,
     54	SNDRV_DEV_REGISTERED,
     55	SNDRV_DEV_DISCONNECTED,
     56};
     57
     58struct snd_device;
     59
     60struct snd_device_ops {
     61	int (*dev_free)(struct snd_device *dev);
     62	int (*dev_register)(struct snd_device *dev);
     63	int (*dev_disconnect)(struct snd_device *dev);
     64};
     65
     66struct snd_device {
     67	struct list_head list;		/* list of registered devices */
     68	struct snd_card *card;		/* card which holds this device */
     69	enum snd_device_state state;	/* state of the device */
     70	enum snd_device_type type;	/* device type */
     71	void *device_data;		/* device structure */
     72	const struct snd_device_ops *ops;	/* operations */
     73};
     74
     75#define snd_device(n) list_entry(n, struct snd_device, list)
     76
     77/* main structure for soundcard */
     78
     79struct snd_card {
     80	int number;			/* number of soundcard (index to
     81								snd_cards) */
     82
     83	char id[16];			/* id string of this card */
     84	char driver[16];		/* driver name */
     85	char shortname[32];		/* short name of this soundcard */
     86	char longname[80];		/* name of this soundcard */
     87	char irq_descr[32];		/* Interrupt description */
     88	char mixername[80];		/* mixer name */
     89	char components[128];		/* card components delimited with
     90								space */
     91	struct module *module;		/* top-level module */
     92
     93	void *private_data;		/* private data for soundcard */
     94	void (*private_free) (struct snd_card *card); /* callback for freeing of
     95								private data */
     96	struct list_head devices;	/* devices */
     97
     98	struct device ctl_dev;		/* control device */
     99	unsigned int last_numid;	/* last used numeric ID */
    100	struct rw_semaphore controls_rwsem;	/* controls list lock */
    101	rwlock_t ctl_files_rwlock;	/* ctl_files list lock */
    102	int controls_count;		/* count of all controls */
    103	size_t user_ctl_alloc_size;	// current memory allocation by user controls.
    104	struct list_head controls;	/* all controls for this card */
    105	struct list_head ctl_files;	/* active control files */
    106
    107	struct snd_info_entry *proc_root;	/* root for soundcard specific files */
    108	struct proc_dir_entry *proc_root_link;	/* number link to real id */
    109
    110	struct list_head files_list;	/* all files associated to this card */
    111	struct snd_shutdown_f_ops *s_f_ops; /* file operations in the shutdown
    112								state */
    113	spinlock_t files_lock;		/* lock the files for this card */
    114	int shutdown;			/* this card is going down */
    115	struct completion *release_completion;
    116	struct device *dev;		/* device assigned to this card */
    117	struct device card_dev;		/* cardX object for sysfs */
    118	const struct attribute_group *dev_groups[4]; /* assigned sysfs attr */
    119	bool registered;		/* card_dev is registered? */
    120	bool managed;			/* managed via devres */
    121	bool releasing;			/* during card free process */
    122	int sync_irq;			/* assigned irq, used for PCM sync */
    123	wait_queue_head_t remove_sleep;
    124
    125	size_t total_pcm_alloc_bytes;	/* total amount of allocated buffers */
    126	struct mutex memory_mutex;	/* protection for the above */
    127#ifdef CONFIG_SND_DEBUG
    128	struct dentry *debugfs_root;    /* debugfs root for card */
    129#endif
    130
    131#ifdef CONFIG_PM
    132	unsigned int power_state;	/* power state */
    133	atomic_t power_ref;
    134	wait_queue_head_t power_sleep;
    135	wait_queue_head_t power_ref_sleep;
    136#endif
    137
    138#if IS_ENABLED(CONFIG_SND_MIXER_OSS)
    139	struct snd_mixer_oss *mixer_oss;
    140	int mixer_oss_change_count;
    141#endif
    142};
    143
    144#define dev_to_snd_card(p)	container_of(p, struct snd_card, card_dev)
    145
    146#ifdef CONFIG_PM
    147static inline unsigned int snd_power_get_state(struct snd_card *card)
    148{
    149	return READ_ONCE(card->power_state);
    150}
    151
    152static inline void snd_power_change_state(struct snd_card *card, unsigned int state)
    153{
    154	WRITE_ONCE(card->power_state, state);
    155	wake_up(&card->power_sleep);
    156}
    157
    158/**
    159 * snd_power_ref - Take the reference count for power control
    160 * @card: sound card object
    161 *
    162 * The power_ref reference of the card is used for managing to block
    163 * the snd_power_sync_ref() operation.  This function increments the reference.
    164 * The counterpart snd_power_unref() has to be called appropriately later.
    165 */
    166static inline void snd_power_ref(struct snd_card *card)
    167{
    168	atomic_inc(&card->power_ref);
    169}
    170
    171/**
    172 * snd_power_unref - Release the reference count for power control
    173 * @card: sound card object
    174 */
    175static inline void snd_power_unref(struct snd_card *card)
    176{
    177	if (atomic_dec_and_test(&card->power_ref))
    178		wake_up(&card->power_ref_sleep);
    179}
    180
    181/**
    182 * snd_power_sync_ref - wait until the card power_ref is freed
    183 * @card: sound card object
    184 *
    185 * This function is used to synchronize with the pending power_ref being
    186 * released.
    187 */
    188static inline void snd_power_sync_ref(struct snd_card *card)
    189{
    190	wait_event(card->power_ref_sleep, !atomic_read(&card->power_ref));
    191}
    192
    193/* init.c */
    194int snd_power_wait(struct snd_card *card);
    195int snd_power_ref_and_wait(struct snd_card *card);
    196
    197#else /* ! CONFIG_PM */
    198
    199static inline int snd_power_wait(struct snd_card *card) { return 0; }
    200static inline void snd_power_ref(struct snd_card *card) {}
    201static inline void snd_power_unref(struct snd_card *card) {}
    202static inline int snd_power_ref_and_wait(struct snd_card *card) { return 0; }
    203static inline void snd_power_sync_ref(struct snd_card *card) {}
    204#define snd_power_get_state(card)	({ (void)(card); SNDRV_CTL_POWER_D0; })
    205#define snd_power_change_state(card, state)	do { (void)(card); } while (0)
    206
    207#endif /* CONFIG_PM */
    208
    209struct snd_minor {
    210	int type;			/* SNDRV_DEVICE_TYPE_XXX */
    211	int card;			/* card number */
    212	int device;			/* device number */
    213	const struct file_operations *f_ops;	/* file operations */
    214	void *private_data;		/* private data for f_ops->open */
    215	struct device *dev;		/* device for sysfs */
    216	struct snd_card *card_ptr;	/* assigned card instance */
    217};
    218
    219/* return a device pointer linked to each sound device as a parent */
    220static inline struct device *snd_card_get_device_link(struct snd_card *card)
    221{
    222	return card ? &card->card_dev : NULL;
    223}
    224
    225/* sound.c */
    226
    227extern int snd_major;
    228extern int snd_ecards_limit;
    229extern struct class *sound_class;
    230#ifdef CONFIG_SND_DEBUG
    231extern struct dentry *sound_debugfs_root;
    232#endif
    233
    234void snd_request_card(int card);
    235
    236void snd_device_initialize(struct device *dev, struct snd_card *card);
    237
    238int snd_register_device(int type, struct snd_card *card, int dev,
    239			const struct file_operations *f_ops,
    240			void *private_data, struct device *device);
    241int snd_unregister_device(struct device *dev);
    242void *snd_lookup_minor_data(unsigned int minor, int type);
    243
    244#ifdef CONFIG_SND_OSSEMUL
    245int snd_register_oss_device(int type, struct snd_card *card, int dev,
    246			    const struct file_operations *f_ops, void *private_data);
    247int snd_unregister_oss_device(int type, struct snd_card *card, int dev);
    248void *snd_lookup_oss_minor_data(unsigned int minor, int type);
    249#endif
    250
    251int snd_minor_info_init(void);
    252
    253/* sound_oss.c */
    254
    255#ifdef CONFIG_SND_OSSEMUL
    256int snd_minor_info_oss_init(void);
    257#else
    258static inline int snd_minor_info_oss_init(void) { return 0; }
    259#endif
    260
    261/* memory.c */
    262
    263int copy_to_user_fromio(void __user *dst, const volatile void __iomem *src, size_t count);
    264int copy_from_user_toio(volatile void __iomem *dst, const void __user *src, size_t count);
    265
    266/* init.c */
    267
    268int snd_card_locked(int card);
    269#if IS_ENABLED(CONFIG_SND_MIXER_OSS)
    270#define SND_MIXER_OSS_NOTIFY_REGISTER	0
    271#define SND_MIXER_OSS_NOTIFY_DISCONNECT	1
    272#define SND_MIXER_OSS_NOTIFY_FREE	2
    273extern int (*snd_mixer_oss_notify_callback)(struct snd_card *card, int cmd);
    274#endif
    275
    276int snd_card_new(struct device *parent, int idx, const char *xid,
    277		 struct module *module, int extra_size,
    278		 struct snd_card **card_ret);
    279int snd_devm_card_new(struct device *parent, int idx, const char *xid,
    280		      struct module *module, size_t extra_size,
    281		      struct snd_card **card_ret);
    282
    283int snd_card_disconnect(struct snd_card *card);
    284void snd_card_disconnect_sync(struct snd_card *card);
    285int snd_card_free(struct snd_card *card);
    286int snd_card_free_when_closed(struct snd_card *card);
    287int snd_card_free_on_error(struct device *dev, int ret);
    288void snd_card_set_id(struct snd_card *card, const char *id);
    289int snd_card_register(struct snd_card *card);
    290int snd_card_info_init(void);
    291int snd_card_add_dev_attr(struct snd_card *card,
    292			  const struct attribute_group *group);
    293int snd_component_add(struct snd_card *card, const char *component);
    294int snd_card_file_add(struct snd_card *card, struct file *file);
    295int snd_card_file_remove(struct snd_card *card, struct file *file);
    296
    297struct snd_card *snd_card_ref(int card);
    298
    299/**
    300 * snd_card_unref - Unreference the card object
    301 * @card: the card object to unreference
    302 *
    303 * Call this function for the card object that was obtained via snd_card_ref()
    304 * or snd_lookup_minor_data().
    305 */
    306static inline void snd_card_unref(struct snd_card *card)
    307{
    308	put_device(&card->card_dev);
    309}
    310
    311#define snd_card_set_dev(card, devptr) ((card)->dev = (devptr))
    312
    313/* device.c */
    314
    315int snd_device_new(struct snd_card *card, enum snd_device_type type,
    316		   void *device_data, const struct snd_device_ops *ops);
    317int snd_device_register(struct snd_card *card, void *device_data);
    318int snd_device_register_all(struct snd_card *card);
    319void snd_device_disconnect(struct snd_card *card, void *device_data);
    320void snd_device_disconnect_all(struct snd_card *card);
    321void snd_device_free(struct snd_card *card, void *device_data);
    322void snd_device_free_all(struct snd_card *card);
    323int snd_device_get_state(struct snd_card *card, void *device_data);
    324
    325/* isadma.c */
    326
    327#ifdef CONFIG_ISA_DMA_API
    328#define DMA_MODE_NO_ENABLE	0x0100
    329
    330void snd_dma_program(unsigned long dma, unsigned long addr, unsigned int size, unsigned short mode);
    331void snd_dma_disable(unsigned long dma);
    332unsigned int snd_dma_pointer(unsigned long dma, unsigned int size);
    333int snd_devm_request_dma(struct device *dev, int dma, const char *name);
    334#endif
    335
    336/* misc.c */
    337struct resource;
    338void release_and_free_resource(struct resource *res);
    339
    340/* --- */
    341
    342/* sound printk debug levels */
    343enum {
    344	SND_PR_ALWAYS,
    345	SND_PR_DEBUG,
    346	SND_PR_VERBOSE,
    347};
    348
    349#if defined(CONFIG_SND_DEBUG) || defined(CONFIG_SND_VERBOSE_PRINTK)
    350__printf(4, 5)
    351void __snd_printk(unsigned int level, const char *file, int line,
    352		  const char *format, ...);
    353#else
    354#define __snd_printk(level, file, line, format, ...) \
    355	printk(format, ##__VA_ARGS__)
    356#endif
    357
    358/**
    359 * snd_printk - printk wrapper
    360 * @fmt: format string
    361 *
    362 * Works like printk() but prints the file and the line of the caller
    363 * when configured with CONFIG_SND_VERBOSE_PRINTK.
    364 */
    365#define snd_printk(fmt, ...) \
    366	__snd_printk(0, __FILE__, __LINE__, fmt, ##__VA_ARGS__)
    367
    368#ifdef CONFIG_SND_DEBUG
    369/**
    370 * snd_printd - debug printk
    371 * @fmt: format string
    372 *
    373 * Works like snd_printk() for debugging purposes.
    374 * Ignored when CONFIG_SND_DEBUG is not set.
    375 */
    376#define snd_printd(fmt, ...) \
    377	__snd_printk(1, __FILE__, __LINE__, fmt, ##__VA_ARGS__)
    378#define _snd_printd(level, fmt, ...) \
    379	__snd_printk(level, __FILE__, __LINE__, fmt, ##__VA_ARGS__)
    380
    381/**
    382 * snd_BUG - give a BUG warning message and stack trace
    383 *
    384 * Calls WARN() if CONFIG_SND_DEBUG is set.
    385 * Ignored when CONFIG_SND_DEBUG is not set.
    386 */
    387#define snd_BUG()		WARN(1, "BUG?\n")
    388
    389/**
    390 * snd_printd_ratelimit - Suppress high rates of output when
    391 * 			  CONFIG_SND_DEBUG is enabled.
    392 */
    393#define snd_printd_ratelimit() printk_ratelimit()
    394
    395/**
    396 * snd_BUG_ON - debugging check macro
    397 * @cond: condition to evaluate
    398 *
    399 * Has the same behavior as WARN_ON when CONFIG_SND_DEBUG is set,
    400 * otherwise just evaluates the conditional and returns the value.
    401 */
    402#define snd_BUG_ON(cond)	WARN_ON((cond))
    403
    404#else /* !CONFIG_SND_DEBUG */
    405
    406__printf(1, 2)
    407static inline void snd_printd(const char *format, ...) {}
    408__printf(2, 3)
    409static inline void _snd_printd(int level, const char *format, ...) {}
    410
    411#define snd_BUG()			do { } while (0)
    412
    413#define snd_BUG_ON(condition) ({ \
    414	int __ret_warn_on = !!(condition); \
    415	unlikely(__ret_warn_on); \
    416})
    417
    418static inline bool snd_printd_ratelimit(void) { return false; }
    419
    420#endif /* CONFIG_SND_DEBUG */
    421
    422#ifdef CONFIG_SND_DEBUG_VERBOSE
    423/**
    424 * snd_printdd - debug printk
    425 * @format: format string
    426 *
    427 * Works like snd_printk() for debugging purposes.
    428 * Ignored when CONFIG_SND_DEBUG_VERBOSE is not set.
    429 */
    430#define snd_printdd(format, ...) \
    431	__snd_printk(2, __FILE__, __LINE__, format, ##__VA_ARGS__)
    432#else
    433__printf(1, 2)
    434static inline void snd_printdd(const char *format, ...) {}
    435#endif
    436
    437
    438#define SNDRV_OSS_VERSION         ((3<<16)|(8<<8)|(1<<4)|(0))	/* 3.8.1a */
    439
    440/* for easier backward-porting */
    441#if IS_ENABLED(CONFIG_GAMEPORT)
    442#define gameport_set_dev_parent(gp,xdev) ((gp)->dev.parent = (xdev))
    443#define gameport_set_port_data(gp,r) ((gp)->port_data = (r))
    444#define gameport_get_port_data(gp) (gp)->port_data
    445#endif
    446
    447/* PCI quirk list helper */
    448struct snd_pci_quirk {
    449	unsigned short subvendor;	/* PCI subvendor ID */
    450	unsigned short subdevice;	/* PCI subdevice ID */
    451	unsigned short subdevice_mask;	/* bitmask to match */
    452	int value;			/* value */
    453#ifdef CONFIG_SND_DEBUG_VERBOSE
    454	const char *name;		/* name of the device (optional) */
    455#endif
    456};
    457
    458#define _SND_PCI_QUIRK_ID_MASK(vend, mask, dev)	\
    459	.subvendor = (vend), .subdevice = (dev), .subdevice_mask = (mask)
    460#define _SND_PCI_QUIRK_ID(vend, dev) \
    461	_SND_PCI_QUIRK_ID_MASK(vend, 0xffff, dev)
    462#define SND_PCI_QUIRK_ID(vend,dev) {_SND_PCI_QUIRK_ID(vend, dev)}
    463#ifdef CONFIG_SND_DEBUG_VERBOSE
    464#define SND_PCI_QUIRK(vend,dev,xname,val) \
    465	{_SND_PCI_QUIRK_ID(vend, dev), .value = (val), .name = (xname)}
    466#define SND_PCI_QUIRK_VENDOR(vend, xname, val)			\
    467	{_SND_PCI_QUIRK_ID_MASK(vend, 0, 0), .value = (val), .name = (xname)}
    468#define SND_PCI_QUIRK_MASK(vend, mask, dev, xname, val)			\
    469	{_SND_PCI_QUIRK_ID_MASK(vend, mask, dev),			\
    470			.value = (val), .name = (xname)}
    471#define snd_pci_quirk_name(q)	((q)->name)
    472#else
    473#define SND_PCI_QUIRK(vend,dev,xname,val) \
    474	{_SND_PCI_QUIRK_ID(vend, dev), .value = (val)}
    475#define SND_PCI_QUIRK_MASK(vend, mask, dev, xname, val)			\
    476	{_SND_PCI_QUIRK_ID_MASK(vend, mask, dev), .value = (val)}
    477#define SND_PCI_QUIRK_VENDOR(vend, xname, val)			\
    478	{_SND_PCI_QUIRK_ID_MASK(vend, 0, 0), .value = (val)}
    479#define snd_pci_quirk_name(q)	""
    480#endif
    481
    482#ifdef CONFIG_PCI
    483const struct snd_pci_quirk *
    484snd_pci_quirk_lookup(struct pci_dev *pci, const struct snd_pci_quirk *list);
    485
    486const struct snd_pci_quirk *
    487snd_pci_quirk_lookup_id(u16 vendor, u16 device,
    488			const struct snd_pci_quirk *list);
    489#else
    490static inline const struct snd_pci_quirk *
    491snd_pci_quirk_lookup(struct pci_dev *pci, const struct snd_pci_quirk *list)
    492{
    493	return NULL;
    494}
    495
    496static inline const struct snd_pci_quirk *
    497snd_pci_quirk_lookup_id(u16 vendor, u16 device,
    498			const struct snd_pci_quirk *list)
    499{
    500	return NULL;
    501}
    502#endif
    503
    504#endif /* __SOUND_CORE_H */