xref: /openbmc/linux/drivers/gpu/drm/drm_legacy.h (revision a21800bc)
1e7b96070SDavid Herrmann #ifndef __DRM_LEGACY_H__
2e7b96070SDavid Herrmann #define __DRM_LEGACY_H__
3e7b96070SDavid Herrmann 
4e7b96070SDavid Herrmann /*
5e7b96070SDavid Herrmann  * Copyright (c) 2014 David Herrmann <dh.herrmann@gmail.com>
6e7b96070SDavid Herrmann  *
7e7b96070SDavid Herrmann  * Permission is hereby granted, free of charge, to any person obtaining a
8e7b96070SDavid Herrmann  * copy of this software and associated documentation files (the "Software"),
9e7b96070SDavid Herrmann  * to deal in the Software without restriction, including without limitation
10e7b96070SDavid Herrmann  * the rights to use, copy, modify, merge, publish, distribute, sublicense,
11e7b96070SDavid Herrmann  * and/or sell copies of the Software, and to permit persons to whom the
12e7b96070SDavid Herrmann  * Software is furnished to do so, subject to the following conditions:
13e7b96070SDavid Herrmann  *
14e7b96070SDavid Herrmann  * The above copyright notice and this permission notice shall be included in
15e7b96070SDavid Herrmann  * all copies or substantial portions of the Software.
16e7b96070SDavid Herrmann  *
17e7b96070SDavid Herrmann  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
18e7b96070SDavid Herrmann  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
19e7b96070SDavid Herrmann  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
20e7b96070SDavid Herrmann  * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
21e7b96070SDavid Herrmann  * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
22e7b96070SDavid Herrmann  * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
23e7b96070SDavid Herrmann  * OTHER DEALINGS IN THE SOFTWARE.
24e7b96070SDavid Herrmann  */
25e7b96070SDavid Herrmann 
269fc5cde7SDavid Herrmann /*
279fc5cde7SDavid Herrmann  * This file contains legacy interfaces that modern drm drivers
289fc5cde7SDavid Herrmann  * should no longer be using. They cannot be removed as legacy
299fc5cde7SDavid Herrmann  * drivers use them, and removing them are API breaks.
309fc5cde7SDavid Herrmann  */
31cc5ea594SDavid Herrmann #include <linux/list.h>
32b8d11488SSam Ravnborg 
33b8d11488SSam Ravnborg #include <drm/drm.h>
34b8d11488SSam Ravnborg #include <drm/drm_device.h>
354f03b1fcSDaniel Vetter #include <drm/drm_legacy.h>
36cc5ea594SDavid Herrmann 
37cc5ea594SDavid Herrmann struct agp_memory;
38*a21800bcSThomas Zimmermann struct drm_buf_desc;
39e7b96070SDavid Herrmann struct drm_device;
40e7b96070SDavid Herrmann struct drm_file;
41*a21800bcSThomas Zimmermann struct drm_hash_item;
42*a21800bcSThomas Zimmermann struct drm_open_hash;
43*a21800bcSThomas Zimmermann 
44*a21800bcSThomas Zimmermann /*
45*a21800bcSThomas Zimmermann  * Hash-table Support
46*a21800bcSThomas Zimmermann  */
47*a21800bcSThomas Zimmermann 
48*a21800bcSThomas Zimmermann #define drm_hash_entry(_ptr, _type, _member) container_of(_ptr, _type, _member)
49*a21800bcSThomas Zimmermann 
50*a21800bcSThomas Zimmermann /* drm_hashtab.c */
51*a21800bcSThomas Zimmermann #if IS_ENABLED(CONFIG_DRM_LEGACY)
52*a21800bcSThomas Zimmermann int drm_ht_create(struct drm_open_hash *ht, unsigned int order);
53*a21800bcSThomas Zimmermann int drm_ht_insert_item(struct drm_open_hash *ht, struct drm_hash_item *item);
54*a21800bcSThomas Zimmermann int drm_ht_just_insert_please(struct drm_open_hash *ht, struct drm_hash_item *item,
55*a21800bcSThomas Zimmermann 			      unsigned long seed, int bits, int shift,
56*a21800bcSThomas Zimmermann 			      unsigned long add);
57*a21800bcSThomas Zimmermann int drm_ht_find_item(struct drm_open_hash *ht, unsigned long key, struct drm_hash_item **item);
58*a21800bcSThomas Zimmermann 
59*a21800bcSThomas Zimmermann void drm_ht_verbose_list(struct drm_open_hash *ht, unsigned long key);
60*a21800bcSThomas Zimmermann int drm_ht_remove_key(struct drm_open_hash *ht, unsigned long key);
61*a21800bcSThomas Zimmermann int drm_ht_remove_item(struct drm_open_hash *ht, struct drm_hash_item *item);
62*a21800bcSThomas Zimmermann void drm_ht_remove(struct drm_open_hash *ht);
63*a21800bcSThomas Zimmermann #endif
64*a21800bcSThomas Zimmermann 
65*a21800bcSThomas Zimmermann /*
66*a21800bcSThomas Zimmermann  * RCU-safe interface
67*a21800bcSThomas Zimmermann  *
68*a21800bcSThomas Zimmermann  * The user of this API needs to make sure that two or more instances of the
69*a21800bcSThomas Zimmermann  * hash table manipulation functions are never run simultaneously.
70*a21800bcSThomas Zimmermann  * The lookup function drm_ht_find_item_rcu may, however, run simultaneously
71*a21800bcSThomas Zimmermann  * with any of the manipulation functions as long as it's called from within
72*a21800bcSThomas Zimmermann  * an RCU read-locked section.
73*a21800bcSThomas Zimmermann  */
74*a21800bcSThomas Zimmermann #define drm_ht_insert_item_rcu drm_ht_insert_item
75*a21800bcSThomas Zimmermann #define drm_ht_just_insert_please_rcu drm_ht_just_insert_please
76*a21800bcSThomas Zimmermann #define drm_ht_remove_key_rcu drm_ht_remove_key
77*a21800bcSThomas Zimmermann #define drm_ht_remove_item_rcu drm_ht_remove_item
78*a21800bcSThomas Zimmermann #define drm_ht_find_item_rcu drm_ht_find_item
79e7b96070SDavid Herrmann 
80e7b96070SDavid Herrmann /*
81e7b96070SDavid Herrmann  * Generic DRM Contexts
82e7b96070SDavid Herrmann  */
83e7b96070SDavid Herrmann 
84e7b96070SDavid Herrmann #define DRM_KERNEL_CONTEXT		0
85e7b96070SDavid Herrmann #define DRM_RESERVED_CONTEXTS		1
86e7b96070SDavid Herrmann 
8761ae2270SDave Airlie #if IS_ENABLED(CONFIG_DRM_LEGACY)
88ba6976c1SDaniel Vetter void drm_legacy_ctxbitmap_init(struct drm_device *dev);
89e7b96070SDavid Herrmann void drm_legacy_ctxbitmap_cleanup(struct drm_device *dev);
90e7b96070SDavid Herrmann void drm_legacy_ctxbitmap_flush(struct drm_device *dev, struct drm_file *file);
9161ae2270SDave Airlie #else
drm_legacy_ctxbitmap_init(struct drm_device * dev)9261ae2270SDave Airlie static inline void drm_legacy_ctxbitmap_init(struct drm_device *dev) {}
drm_legacy_ctxbitmap_cleanup(struct drm_device * dev)9361ae2270SDave Airlie static inline void drm_legacy_ctxbitmap_cleanup(struct drm_device *dev) {}
drm_legacy_ctxbitmap_flush(struct drm_device * dev,struct drm_file * file)9461ae2270SDave Airlie static inline void drm_legacy_ctxbitmap_flush(struct drm_device *dev, struct drm_file *file) {}
9561ae2270SDave Airlie #endif
96e7b96070SDavid Herrmann 
9761ae2270SDave Airlie void drm_legacy_ctxbitmap_free(struct drm_device *dev, int ctx_handle);
9861ae2270SDave Airlie 
9961ae2270SDave Airlie #if IS_ENABLED(CONFIG_DRM_LEGACY)
100e7b96070SDavid Herrmann int drm_legacy_resctx(struct drm_device *d, void *v, struct drm_file *f);
101e7b96070SDavid Herrmann int drm_legacy_addctx(struct drm_device *d, void *v, struct drm_file *f);
102e7b96070SDavid Herrmann int drm_legacy_getctx(struct drm_device *d, void *v, struct drm_file *f);
103e7b96070SDavid Herrmann int drm_legacy_switchctx(struct drm_device *d, void *v, struct drm_file *f);
104e7b96070SDavid Herrmann int drm_legacy_newctx(struct drm_device *d, void *v, struct drm_file *f);
105e7b96070SDavid Herrmann int drm_legacy_rmctx(struct drm_device *d, void *v, struct drm_file *f);
106e7b96070SDavid Herrmann 
107e7b96070SDavid Herrmann int drm_legacy_setsareactx(struct drm_device *d, void *v, struct drm_file *f);
108e7b96070SDavid Herrmann int drm_legacy_getsareactx(struct drm_device *d, void *v, struct drm_file *f);
10961ae2270SDave Airlie #endif
110e7b96070SDavid Herrmann 
1119fc5cde7SDavid Herrmann /*
1129fc5cde7SDavid Herrmann  * Generic Buffer Management
1139fc5cde7SDavid Herrmann  */
1149fc5cde7SDavid Herrmann 
1159fc5cde7SDavid Herrmann #define DRM_MAP_HASH_OFFSET 0x10000000
1169fc5cde7SDavid Herrmann 
11783c163f7SDave Airlie #if IS_ENABLED(CONFIG_DRM_LEGACY)
drm_legacy_create_map_hash(struct drm_device * dev)118fabb0e2aSDave Airlie static inline int drm_legacy_create_map_hash(struct drm_device *dev)
119fabb0e2aSDave Airlie {
120fabb0e2aSDave Airlie 	return drm_ht_create(&dev->map_hash, 12);
121fabb0e2aSDave Airlie }
122fabb0e2aSDave Airlie 
drm_legacy_remove_map_hash(struct drm_device * dev)123fabb0e2aSDave Airlie static inline void drm_legacy_remove_map_hash(struct drm_device *dev)
124fabb0e2aSDave Airlie {
125fabb0e2aSDave Airlie 	drm_ht_remove(&dev->map_hash);
126fabb0e2aSDave Airlie }
12783c163f7SDave Airlie #else
drm_legacy_create_map_hash(struct drm_device * dev)12883c163f7SDave Airlie static inline int drm_legacy_create_map_hash(struct drm_device *dev)
12983c163f7SDave Airlie {
13083c163f7SDave Airlie 	return 0;
13183c163f7SDave Airlie }
13283c163f7SDave Airlie 
drm_legacy_remove_map_hash(struct drm_device * dev)13383c163f7SDave Airlie static inline void drm_legacy_remove_map_hash(struct drm_device *dev) {}
13483c163f7SDave Airlie #endif
135fabb0e2aSDave Airlie 
13661ae2270SDave Airlie 
13761ae2270SDave Airlie #if IS_ENABLED(CONFIG_DRM_LEGACY)
138ec1f52efSDaniel Vetter int drm_legacy_getmap_ioctl(struct drm_device *dev, void *data,
139ec1f52efSDaniel Vetter 			    struct drm_file *file_priv);
1409fc5cde7SDavid Herrmann int drm_legacy_addmap_ioctl(struct drm_device *d, void *v, struct drm_file *f);
1419fc5cde7SDavid Herrmann int drm_legacy_rmmap_ioctl(struct drm_device *d, void *v, struct drm_file *f);
14261ae2270SDave Airlie 
1439fc5cde7SDavid Herrmann int drm_legacy_addbufs(struct drm_device *d, void *v, struct drm_file *f);
1449fc5cde7SDavid Herrmann int drm_legacy_infobufs(struct drm_device *d, void *v, struct drm_file *f);
1459fc5cde7SDavid Herrmann int drm_legacy_markbufs(struct drm_device *d, void *v, struct drm_file *f);
1469fc5cde7SDavid Herrmann int drm_legacy_freebufs(struct drm_device *d, void *v, struct drm_file *f);
1479fc5cde7SDavid Herrmann int drm_legacy_mapbufs(struct drm_device *d, void *v, struct drm_file *f);
1489fc5cde7SDavid Herrmann int drm_legacy_dma_ioctl(struct drm_device *d, void *v, struct drm_file *f);
14961ae2270SDave Airlie #endif
1509fc5cde7SDavid Herrmann 
1515c7640abSAl Viro int __drm_legacy_infobufs(struct drm_device *, void *, int *,
1525c7640abSAl Viro 			  int (*)(void *, int, struct drm_buf_entry *));
15387d3ce11SAl Viro int __drm_legacy_mapbufs(struct drm_device *, void *, int *,
15487d3ce11SAl Viro 			  void __user **,
15587d3ce11SAl Viro 			  int (*)(void *, int, unsigned long, struct drm_buf *),
15687d3ce11SAl Viro 			  struct drm_file *);
1575c7640abSAl Viro 
15861ae2270SDave Airlie #if IS_ENABLED(CONFIG_DRM_LEGACY)
15915e60851SDave Airlie void drm_legacy_master_rmmaps(struct drm_device *dev,
16015e60851SDave Airlie 			      struct drm_master *master);
16135a28021SDave Airlie void drm_legacy_rmmaps(struct drm_device *dev);
16261ae2270SDave Airlie #else
drm_legacy_master_rmmaps(struct drm_device * dev,struct drm_master * master)16361ae2270SDave Airlie static inline void drm_legacy_master_rmmaps(struct drm_device *dev,
16461ae2270SDave Airlie 					    struct drm_master *master) {}
drm_legacy_rmmaps(struct drm_device * dev)16561ae2270SDave Airlie static inline void drm_legacy_rmmaps(struct drm_device *dev) {}
16661ae2270SDave Airlie #endif
16715e60851SDave Airlie 
16802e415f8SThomas Zimmermann #if IS_ENABLED(CONFIG_DRM_LEGACY)
169a677f4ccSDaniel Vetter void drm_legacy_vma_flush(struct drm_device *d);
17099c48e1eSBenjamin Gaignard #else
drm_legacy_vma_flush(struct drm_device * d)17199c48e1eSBenjamin Gaignard static inline void drm_legacy_vma_flush(struct drm_device *d)
17299c48e1eSBenjamin Gaignard {
17399c48e1eSBenjamin Gaignard 	/* do nothing */
17499c48e1eSBenjamin Gaignard }
17599c48e1eSBenjamin Gaignard #endif
176a677f4ccSDaniel Vetter 
177cc5ea594SDavid Herrmann /*
178cc5ea594SDavid Herrmann  * AGP Support
179cc5ea594SDavid Herrmann  */
180cc5ea594SDavid Herrmann 
181cc5ea594SDavid Herrmann struct drm_agp_mem {
182cc5ea594SDavid Herrmann 	unsigned long handle;
183cc5ea594SDavid Herrmann 	struct agp_memory *memory;
184cc5ea594SDavid Herrmann 	unsigned long bound;
185cc5ea594SDavid Herrmann 	int pages;
186cc5ea594SDavid Herrmann 	struct list_head head;
187cc5ea594SDavid Herrmann };
188cc5ea594SDavid Herrmann 
18904dfe19aSThomas Zimmermann /* drm_agpsupport.c */
19004dfe19aSThomas Zimmermann #if IS_ENABLED(CONFIG_DRM_LEGACY) && IS_ENABLED(CONFIG_AGP)
19104dfe19aSThomas Zimmermann void drm_legacy_agp_clear(struct drm_device *dev);
19204dfe19aSThomas Zimmermann 
19304dfe19aSThomas Zimmermann int drm_legacy_agp_acquire_ioctl(struct drm_device *dev, void *data,
19404dfe19aSThomas Zimmermann 				 struct drm_file *file_priv);
19504dfe19aSThomas Zimmermann int drm_legacy_agp_release_ioctl(struct drm_device *dev, void *data,
19604dfe19aSThomas Zimmermann 				 struct drm_file *file_priv);
19704dfe19aSThomas Zimmermann int drm_legacy_agp_enable_ioctl(struct drm_device *dev, void *data,
19804dfe19aSThomas Zimmermann 				struct drm_file *file_priv);
19904dfe19aSThomas Zimmermann int drm_legacy_agp_info_ioctl(struct drm_device *dev, void *data,
20004dfe19aSThomas Zimmermann 			      struct drm_file *file_priv);
20104dfe19aSThomas Zimmermann int drm_legacy_agp_alloc_ioctl(struct drm_device *dev, void *data,
20204dfe19aSThomas Zimmermann 			       struct drm_file *file_priv);
20304dfe19aSThomas Zimmermann int drm_legacy_agp_free_ioctl(struct drm_device *dev, void *data,
20404dfe19aSThomas Zimmermann 			      struct drm_file *file_priv);
20504dfe19aSThomas Zimmermann int drm_legacy_agp_unbind_ioctl(struct drm_device *dev, void *data,
20604dfe19aSThomas Zimmermann 				struct drm_file *file_priv);
20704dfe19aSThomas Zimmermann int drm_legacy_agp_bind_ioctl(struct drm_device *dev, void *data,
20804dfe19aSThomas Zimmermann 			      struct drm_file *file_priv);
20904dfe19aSThomas Zimmermann #else
drm_legacy_agp_clear(struct drm_device * dev)21004dfe19aSThomas Zimmermann static inline void drm_legacy_agp_clear(struct drm_device *dev) {}
21104dfe19aSThomas Zimmermann #endif
21204dfe19aSThomas Zimmermann 
2131a75a222SDaniel Vetter /* drm_lock.c */
21461ae2270SDave Airlie #if IS_ENABLED(CONFIG_DRM_LEGACY)
215bb6d822eSDavid Herrmann int drm_legacy_lock(struct drm_device *d, void *v, struct drm_file *f);
216bb6d822eSDavid Herrmann int drm_legacy_unlock(struct drm_device *d, void *v, struct drm_file *f);
2171a75a222SDaniel Vetter void drm_legacy_lock_release(struct drm_device *dev, struct file *filp);
21861ae2270SDave Airlie #else
drm_legacy_lock_release(struct drm_device * dev,struct file * filp)21961ae2270SDave Airlie static inline void drm_legacy_lock_release(struct drm_device *dev, struct file *filp) {}
22061ae2270SDave Airlie #endif
221bb6d822eSDavid Herrmann 
222a266162aSDaniel Vetter /* DMA support */
22361ae2270SDave Airlie #if IS_ENABLED(CONFIG_DRM_LEGACY)
224a266162aSDaniel Vetter int drm_legacy_dma_setup(struct drm_device *dev);
225a266162aSDaniel Vetter void drm_legacy_dma_takedown(struct drm_device *dev);
22661ae2270SDave Airlie #else
drm_legacy_dma_setup(struct drm_device * dev)22761ae2270SDave Airlie static inline int drm_legacy_dma_setup(struct drm_device *dev)
22861ae2270SDave Airlie {
22961ae2270SDave Airlie 	return 0;
23061ae2270SDave Airlie }
23161ae2270SDave Airlie #endif
23261ae2270SDave Airlie 
233a266162aSDaniel Vetter void drm_legacy_free_buffer(struct drm_device *dev,
234a266162aSDaniel Vetter 			    struct drm_buf * buf);
23561ae2270SDave Airlie #if IS_ENABLED(CONFIG_DRM_LEGACY)
236a266162aSDaniel Vetter void drm_legacy_reclaim_buffers(struct drm_device *dev,
237a266162aSDaniel Vetter 				struct drm_file *filp);
23861ae2270SDave Airlie #else
drm_legacy_reclaim_buffers(struct drm_device * dev,struct drm_file * filp)23961ae2270SDave Airlie static inline void drm_legacy_reclaim_buffers(struct drm_device *dev,
24061ae2270SDave Airlie 					      struct drm_file *filp) {}
24161ae2270SDave Airlie #endif
242a266162aSDaniel Vetter 
2439ec4e2ffSDaniel Vetter /* Scatter Gather Support */
24461ae2270SDave Airlie #if IS_ENABLED(CONFIG_DRM_LEGACY)
2459ec4e2ffSDaniel Vetter void drm_legacy_sg_cleanup(struct drm_device *dev);
2469ec4e2ffSDaniel Vetter int drm_legacy_sg_alloc(struct drm_device *dev, void *data,
2479ec4e2ffSDaniel Vetter 			struct drm_file *file_priv);
2489ec4e2ffSDaniel Vetter int drm_legacy_sg_free(struct drm_device *dev, void *data,
2499ec4e2ffSDaniel Vetter 		       struct drm_file *file_priv);
25061ae2270SDave Airlie #endif
2519ec4e2ffSDaniel Vetter 
25261ae2270SDave Airlie #if IS_ENABLED(CONFIG_DRM_LEGACY)
2538437dd73SDave Airlie void drm_legacy_init_members(struct drm_device *dev);
2548437dd73SDave Airlie void drm_legacy_destroy_members(struct drm_device *dev);
2551fa32cb6SDave Airlie void drm_legacy_dev_reinit(struct drm_device *dev);
256094aa54fSDaniel Vetter int drm_legacy_setup(struct drm_device * dev);
25761ae2270SDave Airlie #else
drm_legacy_init_members(struct drm_device * dev)25861ae2270SDave Airlie static inline void drm_legacy_init_members(struct drm_device *dev) {}
drm_legacy_destroy_members(struct drm_device * dev)25961ae2270SDave Airlie static inline void drm_legacy_destroy_members(struct drm_device *dev) {}
drm_legacy_dev_reinit(struct drm_device * dev)26061ae2270SDave Airlie static inline void drm_legacy_dev_reinit(struct drm_device *dev) {}
drm_legacy_setup(struct drm_device * dev)261094aa54fSDaniel Vetter static inline int drm_legacy_setup(struct drm_device * dev) { return 0; }
26261ae2270SDave Airlie #endif
2638437dd73SDave Airlie 
26461ae2270SDave Airlie #if IS_ENABLED(CONFIG_DRM_LEGACY)
265058ca50cSDave Airlie void drm_legacy_lock_master_cleanup(struct drm_device *dev, struct drm_master *master);
26661ae2270SDave Airlie #else
drm_legacy_lock_master_cleanup(struct drm_device * dev,struct drm_master * master)26761ae2270SDave Airlie static inline void drm_legacy_lock_master_cleanup(struct drm_device *dev, struct drm_master *master) {}
26861ae2270SDave Airlie #endif
26961ae2270SDave Airlie 
270ee22f763SDave Airlie #if IS_ENABLED(CONFIG_DRM_LEGACY)
271ee22f763SDave Airlie void drm_master_legacy_init(struct drm_master *master);
272ee22f763SDave Airlie #else
drm_master_legacy_init(struct drm_master * master)273ee22f763SDave Airlie static inline void drm_master_legacy_init(struct drm_master *master) {}
274ee22f763SDave Airlie #endif
275ee22f763SDave Airlie 
276644adc3dSThomas Zimmermann /* drm_pci.c */
2776bff2279SThomas Zimmermann #if IS_ENABLED(CONFIG_DRM_LEGACY) && IS_ENABLED(CONFIG_PCI)
278644adc3dSThomas Zimmermann int drm_legacy_irq_by_busid(struct drm_device *dev, void *data, struct drm_file *file_priv);
2796bff2279SThomas Zimmermann void drm_legacy_pci_agp_destroy(struct drm_device *dev);
2806bff2279SThomas Zimmermann #else
drm_legacy_irq_by_busid(struct drm_device * dev,void * data,struct drm_file * file_priv)281644adc3dSThomas Zimmermann static inline int drm_legacy_irq_by_busid(struct drm_device *dev, void *data,
282644adc3dSThomas Zimmermann 					  struct drm_file *file_priv)
283644adc3dSThomas Zimmermann {
284644adc3dSThomas Zimmermann 	return -EINVAL;
285644adc3dSThomas Zimmermann }
286644adc3dSThomas Zimmermann 
drm_legacy_pci_agp_destroy(struct drm_device * dev)2876bff2279SThomas Zimmermann static inline void drm_legacy_pci_agp_destroy(struct drm_device *dev) {}
2886bff2279SThomas Zimmermann #endif
2896bff2279SThomas Zimmermann 
290e7b96070SDavid Herrmann #endif /* __DRM_LEGACY_H__ */
291