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

memalloc.h (3962B)


      1/* SPDX-License-Identifier: GPL-2.0-or-later */
      2/*
      3 *  Copyright (c) by Jaroslav Kysela <perex@perex.cz>
      4 *                   Takashi Iwai <tiwai@suse.de>
      5 * 
      6 *  Generic memory allocators
      7 */
      8
      9#ifndef __SOUND_MEMALLOC_H
     10#define __SOUND_MEMALLOC_H
     11
     12#include <linux/dma-direction.h>
     13#include <asm/page.h>
     14
     15struct device;
     16struct vm_area_struct;
     17struct sg_table;
     18
     19/*
     20 * buffer device info
     21 */
     22struct snd_dma_device {
     23	int type;			/* SNDRV_DMA_TYPE_XXX */
     24	enum dma_data_direction dir;	/* DMA direction */
     25	bool need_sync;			/* explicit sync needed? */
     26	struct device *dev;		/* generic device */
     27};
     28
     29#define snd_dma_continuous_data(x)	((struct device *)(__force unsigned long)(x))
     30
     31
     32/*
     33 * buffer types
     34 */
     35#define SNDRV_DMA_TYPE_UNKNOWN		0	/* not defined */
     36#define SNDRV_DMA_TYPE_CONTINUOUS	1	/* continuous no-DMA memory */
     37#define SNDRV_DMA_TYPE_DEV		2	/* generic device continuous */
     38#define SNDRV_DMA_TYPE_DEV_WC		5	/* continuous write-combined */
     39#ifdef CONFIG_GENERIC_ALLOCATOR
     40#define SNDRV_DMA_TYPE_DEV_IRAM		4	/* generic device iram-buffer */
     41#else
     42#define SNDRV_DMA_TYPE_DEV_IRAM	SNDRV_DMA_TYPE_DEV
     43#endif
     44#define SNDRV_DMA_TYPE_VMALLOC		7	/* vmalloc'ed buffer */
     45#define SNDRV_DMA_TYPE_NONCONTIG	8	/* non-coherent SG buffer */
     46#define SNDRV_DMA_TYPE_NONCOHERENT	9	/* non-coherent buffer */
     47#ifdef CONFIG_SND_DMA_SGBUF
     48#define SNDRV_DMA_TYPE_DEV_SG		SNDRV_DMA_TYPE_NONCONTIG
     49#define SNDRV_DMA_TYPE_DEV_WC_SG	6	/* SG write-combined */
     50#else
     51#define SNDRV_DMA_TYPE_DEV_SG	SNDRV_DMA_TYPE_DEV /* no SG-buf support */
     52#define SNDRV_DMA_TYPE_DEV_WC_SG	SNDRV_DMA_TYPE_DEV_WC
     53#endif
     54/* fallback types, don't use those directly */
     55#ifdef CONFIG_SND_DMA_SGBUF
     56#define SNDRV_DMA_TYPE_DEV_SG_FALLBACK		10
     57#define SNDRV_DMA_TYPE_DEV_WC_SG_FALLBACK	11
     58#endif
     59
     60/*
     61 * info for buffer allocation
     62 */
     63struct snd_dma_buffer {
     64	struct snd_dma_device dev;	/* device type */
     65	unsigned char *area;	/* virtual pointer */
     66	dma_addr_t addr;	/* physical address */
     67	size_t bytes;		/* buffer size in bytes */
     68	void *private_data;	/* private for allocator; don't touch */
     69};
     70
     71/*
     72 * return the pages matching with the given byte size
     73 */
     74static inline unsigned int snd_sgbuf_aligned_pages(size_t size)
     75{
     76	return (size + PAGE_SIZE - 1) >> PAGE_SHIFT;
     77}
     78
     79/* allocate/release a buffer */
     80int snd_dma_alloc_dir_pages(int type, struct device *dev,
     81			    enum dma_data_direction dir, size_t size,
     82			    struct snd_dma_buffer *dmab);
     83
     84static inline int snd_dma_alloc_pages(int type, struct device *dev,
     85				      size_t size, struct snd_dma_buffer *dmab)
     86{
     87	return snd_dma_alloc_dir_pages(type, dev, DMA_BIDIRECTIONAL, size, dmab);
     88}
     89
     90int snd_dma_alloc_pages_fallback(int type, struct device *dev, size_t size,
     91                                 struct snd_dma_buffer *dmab);
     92void snd_dma_free_pages(struct snd_dma_buffer *dmab);
     93int snd_dma_buffer_mmap(struct snd_dma_buffer *dmab,
     94			struct vm_area_struct *area);
     95
     96enum snd_dma_sync_mode { SNDRV_DMA_SYNC_CPU, SNDRV_DMA_SYNC_DEVICE };
     97#ifdef CONFIG_HAS_DMA
     98void snd_dma_buffer_sync(struct snd_dma_buffer *dmab,
     99			 enum snd_dma_sync_mode mode);
    100#else
    101static inline void snd_dma_buffer_sync(struct snd_dma_buffer *dmab,
    102				       enum snd_dma_sync_mode mode) {}
    103#endif
    104
    105dma_addr_t snd_sgbuf_get_addr(struct snd_dma_buffer *dmab, size_t offset);
    106struct page *snd_sgbuf_get_page(struct snd_dma_buffer *dmab, size_t offset);
    107unsigned int snd_sgbuf_get_chunk_size(struct snd_dma_buffer *dmab,
    108				      unsigned int ofs, unsigned int size);
    109
    110/* device-managed memory allocator */
    111struct snd_dma_buffer *snd_devm_alloc_dir_pages(struct device *dev, int type,
    112						enum dma_data_direction dir,
    113						size_t size);
    114
    115static inline struct snd_dma_buffer *
    116snd_devm_alloc_pages(struct device *dev, int type, size_t size)
    117{
    118	return snd_devm_alloc_dir_pages(dev, type, DMA_BIDIRECTIONAL, size);
    119}
    120
    121static inline struct sg_table *
    122snd_dma_noncontig_sg_table(struct snd_dma_buffer *dmab)
    123{
    124	return dmab->private_data;
    125}
    126
    127#endif /* __SOUND_MEMALLOC_H */
    128