1 /* SPDX-License-Identifier: GPL-2.0 */
2 #ifndef _DRM_AGPSUPPORT_H_
3 #define _DRM_AGPSUPPORT_H_
4 
5 #include <linux/agp_backend.h>
6 #include <linux/kernel.h>
7 #include <linux/list.h>
8 #include <linux/mm.h>
9 #include <linux/mutex.h>
10 #include <linux/types.h>
11 #include <uapi/drm/drm.h>
12 
13 struct drm_device;
14 struct drm_file;
15 
16 struct drm_agp_head {
17 	struct agp_kern_info agp_info;
18 	struct list_head memory;
19 	unsigned long mode;
20 	struct agp_bridge_data *bridge;
21 	int enabled;
22 	int acquired;
23 	unsigned long base;
24 	int agp_mtrr;
25 	int cant_use_aperture;
26 	unsigned long page_mask;
27 };
28 
29 #if IS_ENABLED(CONFIG_AGP)
30 
31 void drm_free_agp(struct agp_memory * handle, int pages);
32 int drm_bind_agp(struct agp_memory * handle, unsigned int start);
33 int drm_unbind_agp(struct agp_memory * handle);
34 struct agp_memory *drm_agp_bind_pages(struct drm_device *dev,
35 				struct page **pages,
36 				unsigned long num_pages,
37 				uint32_t gtt_offset,
38 				uint32_t type);
39 
40 struct drm_agp_head *drm_agp_init(struct drm_device *dev);
41 void drm_legacy_agp_clear(struct drm_device *dev);
42 int drm_agp_acquire(struct drm_device *dev);
43 int drm_agp_acquire_ioctl(struct drm_device *dev, void *data,
44 			  struct drm_file *file_priv);
45 int drm_agp_release(struct drm_device *dev);
46 int drm_agp_release_ioctl(struct drm_device *dev, void *data,
47 			  struct drm_file *file_priv);
48 int drm_agp_enable(struct drm_device *dev, struct drm_agp_mode mode);
49 int drm_agp_enable_ioctl(struct drm_device *dev, void *data,
50 			 struct drm_file *file_priv);
51 int drm_agp_info(struct drm_device *dev, struct drm_agp_info *info);
52 int drm_agp_info_ioctl(struct drm_device *dev, void *data,
53 		       struct drm_file *file_priv);
54 int drm_agp_alloc(struct drm_device *dev, struct drm_agp_buffer *request);
55 int drm_agp_alloc_ioctl(struct drm_device *dev, void *data,
56 			struct drm_file *file_priv);
57 int drm_agp_free(struct drm_device *dev, struct drm_agp_buffer *request);
58 int drm_agp_free_ioctl(struct drm_device *dev, void *data,
59 		       struct drm_file *file_priv);
60 int drm_agp_unbind(struct drm_device *dev, struct drm_agp_binding *request);
61 int drm_agp_unbind_ioctl(struct drm_device *dev, void *data,
62 			 struct drm_file *file_priv);
63 int drm_agp_bind(struct drm_device *dev, struct drm_agp_binding *request);
64 int drm_agp_bind_ioctl(struct drm_device *dev, void *data,
65 		       struct drm_file *file_priv);
66 
67 #else /* CONFIG_AGP */
68 
drm_free_agp(struct agp_memory * handle,int pages)69 static inline void drm_free_agp(struct agp_memory * handle, int pages)
70 {
71 }
72 
drm_bind_agp(struct agp_memory * handle,unsigned int start)73 static inline int drm_bind_agp(struct agp_memory * handle, unsigned int start)
74 {
75 	return -ENODEV;
76 }
77 
drm_unbind_agp(struct agp_memory * handle)78 static inline int drm_unbind_agp(struct agp_memory * handle)
79 {
80 	return -ENODEV;
81 }
82 
drm_agp_bind_pages(struct drm_device * dev,struct page ** pages,unsigned long num_pages,uint32_t gtt_offset,uint32_t type)83 static inline struct agp_memory *drm_agp_bind_pages(struct drm_device *dev,
84 					      struct page **pages,
85 					      unsigned long num_pages,
86 					      uint32_t gtt_offset,
87 					      uint32_t type)
88 {
89 	return NULL;
90 }
91 
drm_agp_init(struct drm_device * dev)92 static inline struct drm_agp_head *drm_agp_init(struct drm_device *dev)
93 {
94 	return NULL;
95 }
96 
drm_legacy_agp_clear(struct drm_device * dev)97 static inline void drm_legacy_agp_clear(struct drm_device *dev)
98 {
99 }
100 
drm_agp_acquire(struct drm_device * dev)101 static inline int drm_agp_acquire(struct drm_device *dev)
102 {
103 	return -ENODEV;
104 }
105 
drm_agp_release(struct drm_device * dev)106 static inline int drm_agp_release(struct drm_device *dev)
107 {
108 	return -ENODEV;
109 }
110 
drm_agp_enable(struct drm_device * dev,struct drm_agp_mode mode)111 static inline int drm_agp_enable(struct drm_device *dev,
112 				 struct drm_agp_mode mode)
113 {
114 	return -ENODEV;
115 }
116 
drm_agp_info(struct drm_device * dev,struct drm_agp_info * info)117 static inline int drm_agp_info(struct drm_device *dev,
118 			       struct drm_agp_info *info)
119 {
120 	return -ENODEV;
121 }
122 
drm_agp_alloc(struct drm_device * dev,struct drm_agp_buffer * request)123 static inline int drm_agp_alloc(struct drm_device *dev,
124 				struct drm_agp_buffer *request)
125 {
126 	return -ENODEV;
127 }
128 
drm_agp_free(struct drm_device * dev,struct drm_agp_buffer * request)129 static inline int drm_agp_free(struct drm_device *dev,
130 			       struct drm_agp_buffer *request)
131 {
132 	return -ENODEV;
133 }
134 
drm_agp_unbind(struct drm_device * dev,struct drm_agp_binding * request)135 static inline int drm_agp_unbind(struct drm_device *dev,
136 				 struct drm_agp_binding *request)
137 {
138 	return -ENODEV;
139 }
140 
drm_agp_bind(struct drm_device * dev,struct drm_agp_binding * request)141 static inline int drm_agp_bind(struct drm_device *dev,
142 			       struct drm_agp_binding *request)
143 {
144 	return -ENODEV;
145 }
146 
147 #endif /* CONFIG_AGP */
148 
149 #endif /* _DRM_AGPSUPPORT_H_ */
150