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

drm_legacy.h (9617B)


      1#ifndef __DRM_DRM_LEGACY_H__
      2#define __DRM_DRM_LEGACY_H__
      3/*
      4 * Legacy driver interfaces for the Direct Rendering Manager
      5 *
      6 * Copyright 1999 Precision Insight, Inc., Cedar Park, Texas.
      7 * Copyright 2000 VA Linux Systems, Inc., Sunnyvale, California.
      8 * Copyright (c) 2009-2010, Code Aurora Forum.
      9 * All rights reserved.
     10 * Copyright © 2014 Intel Corporation
     11 *   Daniel Vetter <daniel.vetter@ffwll.ch>
     12 *
     13 * Author: Rickard E. (Rik) Faith <faith@valinux.com>
     14 * Author: Gareth Hughes <gareth@valinux.com>
     15 *
     16 * Permission is hereby granted, free of charge, to any person obtaining a
     17 * copy of this software and associated documentation files (the "Software"),
     18 * to deal in the Software without restriction, including without limitation
     19 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
     20 * and/or sell copies of the Software, and to permit persons to whom the
     21 * Software is furnished to do so, subject to the following conditions:
     22 *
     23 * The above copyright notice and this permission notice (including the next
     24 * paragraph) shall be included in all copies or substantial portions of the
     25 * Software.
     26 *
     27 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
     28 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
     29 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
     30 * VA LINUX SYSTEMS AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
     31 * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
     32 * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
     33 * OTHER DEALINGS IN THE SOFTWARE.
     34 */
     35
     36#include <linux/agp_backend.h>
     37
     38#include <drm/drm.h>
     39#include <drm/drm_auth.h>
     40
     41struct drm_device;
     42struct drm_driver;
     43struct file;
     44struct pci_driver;
     45
     46/*
     47 * Legacy Support for palateontologic DRM drivers
     48 *
     49 * If you add a new driver and it uses any of these functions or structures,
     50 * you're doing it terribly wrong.
     51 */
     52
     53/*
     54 * Hash-table Support
     55 */
     56
     57struct drm_hash_item {
     58	struct hlist_node head;
     59	unsigned long key;
     60};
     61
     62struct drm_open_hash {
     63	struct hlist_head *table;
     64	u8 order;
     65};
     66
     67/**
     68 * DMA buffer.
     69 */
     70struct drm_buf {
     71	int idx;		       /**< Index into master buflist */
     72	int total;		       /**< Buffer size */
     73	int order;		       /**< log-base-2(total) */
     74	int used;		       /**< Amount of buffer in use (for DMA) */
     75	unsigned long offset;	       /**< Byte offset (used internally) */
     76	void *address;		       /**< Address of buffer */
     77	unsigned long bus_address;     /**< Bus address of buffer */
     78	struct drm_buf *next;	       /**< Kernel-only: used for free list */
     79	__volatile__ int waiting;      /**< On kernel DMA queue */
     80	__volatile__ int pending;      /**< On hardware DMA queue */
     81	struct drm_file *file_priv;    /**< Private of holding file descr */
     82	int context;		       /**< Kernel queue for this buffer */
     83	int while_locked;	       /**< Dispatch this buffer while locked */
     84	enum {
     85		DRM_LIST_NONE = 0,
     86		DRM_LIST_FREE = 1,
     87		DRM_LIST_WAIT = 2,
     88		DRM_LIST_PEND = 3,
     89		DRM_LIST_PRIO = 4,
     90		DRM_LIST_RECLAIM = 5
     91	} list;			       /**< Which list we're on */
     92
     93	int dev_priv_size;		 /**< Size of buffer private storage */
     94	void *dev_private;		 /**< Per-buffer private storage */
     95};
     96
     97typedef struct drm_dma_handle {
     98	dma_addr_t busaddr;
     99	void *vaddr;
    100	size_t size;
    101} drm_dma_handle_t;
    102
    103/**
    104 * Buffer entry.  There is one of this for each buffer size order.
    105 */
    106struct drm_buf_entry {
    107	int buf_size;			/**< size */
    108	int buf_count;			/**< number of buffers */
    109	struct drm_buf *buflist;		/**< buffer list */
    110	int seg_count;
    111	int page_order;
    112	struct drm_dma_handle **seglist;
    113
    114	int low_mark;			/**< Low water mark */
    115	int high_mark;			/**< High water mark */
    116};
    117
    118/**
    119 * DMA data.
    120 */
    121struct drm_device_dma {
    122
    123	struct drm_buf_entry bufs[DRM_MAX_ORDER + 1];	/**< buffers, grouped by their size order */
    124	int buf_count;			/**< total number of buffers */
    125	struct drm_buf **buflist;		/**< Vector of pointers into drm_device_dma::bufs */
    126	int seg_count;
    127	int page_count;			/**< number of pages */
    128	unsigned long *pagelist;	/**< page list */
    129	unsigned long byte_count;
    130	enum {
    131		_DRM_DMA_USE_AGP = 0x01,
    132		_DRM_DMA_USE_SG = 0x02,
    133		_DRM_DMA_USE_FB = 0x04,
    134		_DRM_DMA_USE_PCI_RO = 0x08
    135	} flags;
    136
    137};
    138
    139/**
    140 * Scatter-gather memory.
    141 */
    142struct drm_sg_mem {
    143	unsigned long handle;
    144	void *virtual;
    145	int pages;
    146	struct page **pagelist;
    147	dma_addr_t *busaddr;
    148};
    149
    150/**
    151 * Kernel side of a mapping
    152 */
    153struct drm_local_map {
    154	dma_addr_t offset;	 /**< Requested physical address (0 for SAREA)*/
    155	unsigned long size;	 /**< Requested physical size (bytes) */
    156	enum drm_map_type type;	 /**< Type of memory to map */
    157	enum drm_map_flags flags;	 /**< Flags */
    158	void *handle;		 /**< User-space: "Handle" to pass to mmap() */
    159				 /**< Kernel-space: kernel-virtual address */
    160	int mtrr;		 /**< MTRR slot used */
    161};
    162
    163typedef struct drm_local_map drm_local_map_t;
    164
    165/**
    166 * Mappings list
    167 */
    168struct drm_map_list {
    169	struct list_head head;		/**< list head */
    170	struct drm_hash_item hash;
    171	struct drm_local_map *map;	/**< mapping */
    172	uint64_t user_token;
    173	struct drm_master *master;
    174};
    175
    176int drm_legacy_addmap(struct drm_device *d, resource_size_t offset,
    177		      unsigned int size, enum drm_map_type type,
    178		      enum drm_map_flags flags, struct drm_local_map **map_p);
    179struct drm_local_map *drm_legacy_findmap(struct drm_device *dev, unsigned int token);
    180void drm_legacy_rmmap(struct drm_device *d, struct drm_local_map *map);
    181int drm_legacy_rmmap_locked(struct drm_device *d, struct drm_local_map *map);
    182struct drm_local_map *drm_legacy_getsarea(struct drm_device *dev);
    183int drm_legacy_mmap(struct file *filp, struct vm_area_struct *vma);
    184
    185int drm_legacy_addbufs_agp(struct drm_device *d, struct drm_buf_desc *req);
    186int drm_legacy_addbufs_pci(struct drm_device *d, struct drm_buf_desc *req);
    187
    188/**
    189 * Test that the hardware lock is held by the caller, returning otherwise.
    190 *
    191 * \param dev DRM device.
    192 * \param filp file pointer of the caller.
    193 */
    194#define LOCK_TEST_WITH_RETURN( dev, _file_priv )				\
    195do {										\
    196	if (!_DRM_LOCK_IS_HELD(_file_priv->master->lock.hw_lock->lock) ||	\
    197	    _file_priv->master->lock.file_priv != _file_priv)	{		\
    198		DRM_ERROR( "%s called without lock held, held  %d owner %p %p\n",\
    199			   __func__, _DRM_LOCK_IS_HELD(_file_priv->master->lock.hw_lock->lock),\
    200			   _file_priv->master->lock.file_priv, _file_priv);	\
    201		return -EINVAL;							\
    202	}									\
    203} while (0)
    204
    205void drm_legacy_idlelock_take(struct drm_lock_data *lock);
    206void drm_legacy_idlelock_release(struct drm_lock_data *lock);
    207
    208/* drm_irq.c */
    209int drm_legacy_irq_uninstall(struct drm_device *dev);
    210
    211/* drm_pci.c */
    212
    213#ifdef CONFIG_PCI
    214
    215int drm_legacy_pci_init(const struct drm_driver *driver,
    216			struct pci_driver *pdriver);
    217void drm_legacy_pci_exit(const struct drm_driver *driver,
    218			 struct pci_driver *pdriver);
    219
    220#else
    221
    222static inline struct drm_dma_handle *drm_pci_alloc(struct drm_device *dev,
    223						   size_t size, size_t align)
    224{
    225	return NULL;
    226}
    227
    228static inline void drm_pci_free(struct drm_device *dev,
    229				struct drm_dma_handle *dmah)
    230{
    231}
    232
    233static inline int drm_legacy_pci_init(const struct drm_driver *driver,
    234				      struct pci_driver *pdriver)
    235{
    236	return -EINVAL;
    237}
    238
    239static inline void drm_legacy_pci_exit(const struct drm_driver *driver,
    240				       struct pci_driver *pdriver)
    241{
    242}
    243
    244#endif
    245
    246/*
    247 * AGP Support
    248 */
    249
    250struct drm_agp_head {
    251	struct agp_kern_info agp_info;
    252	struct list_head memory;
    253	unsigned long mode;
    254	struct agp_bridge_data *bridge;
    255	int enabled;
    256	int acquired;
    257	unsigned long base;
    258	int agp_mtrr;
    259	int cant_use_aperture;
    260	unsigned long page_mask;
    261};
    262
    263#if IS_ENABLED(CONFIG_DRM_LEGACY) && IS_ENABLED(CONFIG_AGP)
    264struct drm_agp_head *drm_legacy_agp_init(struct drm_device *dev);
    265int drm_legacy_agp_acquire(struct drm_device *dev);
    266int drm_legacy_agp_release(struct drm_device *dev);
    267int drm_legacy_agp_enable(struct drm_device *dev, struct drm_agp_mode mode);
    268int drm_legacy_agp_info(struct drm_device *dev, struct drm_agp_info *info);
    269int drm_legacy_agp_alloc(struct drm_device *dev, struct drm_agp_buffer *request);
    270int drm_legacy_agp_free(struct drm_device *dev, struct drm_agp_buffer *request);
    271int drm_legacy_agp_unbind(struct drm_device *dev, struct drm_agp_binding *request);
    272int drm_legacy_agp_bind(struct drm_device *dev, struct drm_agp_binding *request);
    273#else
    274static inline struct drm_agp_head *drm_legacy_agp_init(struct drm_device *dev)
    275{
    276	return NULL;
    277}
    278
    279static inline int drm_legacy_agp_acquire(struct drm_device *dev)
    280{
    281	return -ENODEV;
    282}
    283
    284static inline int drm_legacy_agp_release(struct drm_device *dev)
    285{
    286	return -ENODEV;
    287}
    288
    289static inline int drm_legacy_agp_enable(struct drm_device *dev,
    290					struct drm_agp_mode mode)
    291{
    292	return -ENODEV;
    293}
    294
    295static inline int drm_legacy_agp_info(struct drm_device *dev,
    296				      struct drm_agp_info *info)
    297{
    298	return -ENODEV;
    299}
    300
    301static inline int drm_legacy_agp_alloc(struct drm_device *dev,
    302				       struct drm_agp_buffer *request)
    303{
    304	return -ENODEV;
    305}
    306
    307static inline int drm_legacy_agp_free(struct drm_device *dev,
    308				      struct drm_agp_buffer *request)
    309{
    310	return -ENODEV;
    311}
    312
    313static inline int drm_legacy_agp_unbind(struct drm_device *dev,
    314					struct drm_agp_binding *request)
    315{
    316	return -ENODEV;
    317}
    318
    319static inline int drm_legacy_agp_bind(struct drm_device *dev,
    320				      struct drm_agp_binding *request)
    321{
    322	return -ENODEV;
    323}
    324#endif
    325
    326/* drm_memory.c */
    327void drm_legacy_ioremap(struct drm_local_map *map, struct drm_device *dev);
    328void drm_legacy_ioremap_wc(struct drm_local_map *map, struct drm_device *dev);
    329void drm_legacy_ioremapfree(struct drm_local_map *map, struct drm_device *dev);
    330
    331#endif /* __DRM_DRM_LEGACY_H__ */