Home | History | Annotate | Line # | Download | only in drm
      1 /*	$NetBSD: drm_agpsupport.h,v 1.10 2022/07/19 22:24:34 riastradh Exp $	*/
      2 
      3 /* SPDX-License-Identifier: GPL-2.0 */
      4 #ifndef _DRM_AGPSUPPORT_H_
      5 #define _DRM_AGPSUPPORT_H_
      6 
      7 #include <linux/agp_backend.h>
      8 #include <linux/kernel.h>
      9 #include <linux/list.h>
     10 #include <linux/mm.h>
     11 #include <linux/mutex.h>
     12 #include <linux/types.h>
     13 #include <uapi/drm/drm.h>
     14 
     15 #ifdef __NetBSD__
     16 #include <drm/drm_agp_netbsd.h>
     17 #endif
     18 
     19 struct drm_device;
     20 struct drm_file;
     21 
     22 struct drm_agp_hooks {
     23 	void	(*agph_flush)(void);
     24 
     25 	struct drm_agp_head *
     26 		(*agph_init)(struct drm_device *);
     27 	void	(*agph_clear)(struct drm_device *);
     28 	int	(*agph_acquire)(struct drm_device *);
     29 	int	(*agph_release)(struct drm_device *);
     30 	int	(*agph_enable)(struct drm_device *, struct drm_agp_mode);
     31 	int	(*agph_info)(struct drm_device *, struct drm_agp_info *);
     32 	int	(*agph_alloc)(struct drm_device *, struct drm_agp_buffer *);
     33 	int	(*agph_free)(struct drm_device *, struct drm_agp_buffer *);
     34 	int	(*agph_bind)(struct drm_device *, struct drm_agp_binding *);
     35 	int	(*agph_unbind)(struct drm_device *, struct drm_agp_binding *);
     36 
     37 	int	(*agph_acquire_ioctl)(struct drm_device *, void *,
     38 		    struct drm_file *);
     39 	int	(*agph_release_ioctl)(struct drm_device *, void *,
     40 		    struct drm_file *);
     41 	int	(*agph_enable_ioctl)(struct drm_device *, void *,
     42 		    struct drm_file *);
     43 	int	(*agph_info_ioctl)(struct drm_device *, void *,
     44 		    struct drm_file *);
     45 	int	(*agph_alloc_ioctl)(struct drm_device *, void *,
     46 		    struct drm_file *);
     47 	int	(*agph_free_ioctl)(struct drm_device *, void *,
     48 		    struct drm_file *);
     49 	int	(*agph_bind_ioctl)(struct drm_device *, void *,
     50 		    struct drm_file *);
     51 	int	(*agph_unbind_ioctl)(struct drm_device *, void *,
     52 		    struct drm_file *);
     53 };
     54 
     55 struct drm_agp_head {
     56 	const struct drm_agp_hooks *hooks;
     57 	struct agp_kern_info agp_info;
     58 	struct list_head memory;
     59 	unsigned long mode;
     60 	struct agp_bridge_data *bridge;
     61 	int enabled;
     62 	int acquired;
     63 	unsigned long base;
     64 	int agp_mtrr;
     65 	int cant_use_aperture;
     66 	unsigned long page_mask;
     67 };
     68 
     69 #if IS_ENABLED(CONFIG_AGP)
     70 
     71 #ifdef __NetBSD__
     72 static inline void drm_free_agp(struct agp_bridge_data *, struct agp_memory *, int);
     73 static inline int drm_bind_agp(struct agp_bridge_data *, struct agp_memory *, unsigned);
     74 static inline int drm_unbind_agp(struct agp_bridge_data *, struct agp_memory *);
     75 #else
     76 void drm_free_agp(struct agp_memory * handle, int pages);
     77 int drm_bind_agp(struct agp_memory * handle, unsigned int start);
     78 int drm_unbind_agp(struct agp_memory * handle);
     79 #endif
     80 
     81 struct drm_agp_head *drm_agp_init(struct drm_device *dev);
     82 void drm_legacy_agp_clear(struct drm_device *dev);
     83 int drm_agp_acquire(struct drm_device *dev);
     84 int drm_agp_acquire_ioctl(struct drm_device *dev, void *data,
     85 			  struct drm_file *file_priv);
     86 int drm_agp_release(struct drm_device *dev);
     87 int drm_agp_release_ioctl(struct drm_device *dev, void *data,
     88 			  struct drm_file *file_priv);
     89 int drm_agp_enable(struct drm_device *dev, struct drm_agp_mode mode);
     90 int drm_agp_enable_ioctl(struct drm_device *dev, void *data,
     91 			 struct drm_file *file_priv);
     92 int drm_agp_info(struct drm_device *dev, struct drm_agp_info *info);
     93 int drm_agp_info_ioctl(struct drm_device *dev, void *data,
     94 		       struct drm_file *file_priv);
     95 int drm_agp_alloc(struct drm_device *dev, struct drm_agp_buffer *request);
     96 int drm_agp_alloc_ioctl(struct drm_device *dev, void *data,
     97 			struct drm_file *file_priv);
     98 int drm_agp_free(struct drm_device *dev, struct drm_agp_buffer *request);
     99 int drm_agp_free_ioctl(struct drm_device *dev, void *data,
    100 		       struct drm_file *file_priv);
    101 int drm_agp_unbind(struct drm_device *dev, struct drm_agp_binding *request);
    102 int drm_agp_unbind_ioctl(struct drm_device *dev, void *data,
    103 			 struct drm_file *file_priv);
    104 int drm_agp_bind(struct drm_device *dev, struct drm_agp_binding *request);
    105 int drm_agp_bind_ioctl(struct drm_device *dev, void *data,
    106 		       struct drm_file *file_priv);
    107 
    108 #ifdef __NetBSD__
    109 void drm_agp_flush(void);
    110 void drm_agp_fini(struct drm_device *);
    111 int drm_agp_register(const struct drm_agp_hooks *);
    112 int drm_agp_deregister(const struct drm_agp_hooks *);
    113 void drm_agp_hooks_init(void);
    114 void drm_agp_hooks_fini(void);
    115 int drmkms_agp_guarantee_initialized(void);
    116 #endif
    117 
    118 #else /* CONFIG_AGP */
    119 
    120 #if !defined(__NetBSD__)
    121 
    122 static inline void drm_free_agp(struct agp_memory * handle, int pages)
    123 {
    124 }
    125 
    126 static inline int drm_bind_agp(struct agp_memory * handle, unsigned int start)
    127 {
    128 	return -ENODEV;
    129 }
    130 
    131 static inline int drm_unbind_agp(struct agp_memory * handle)
    132 {
    133 	return -ENODEV;
    134 }
    135 #endif
    136 
    137 static inline struct drm_agp_head *drm_agp_init(struct drm_device *dev)
    138 {
    139 	return NULL;
    140 }
    141 
    142 static inline void drm_legacy_agp_clear(struct drm_device *dev)
    143 {
    144 }
    145 
    146 static inline int drm_agp_acquire(struct drm_device *dev)
    147 {
    148 	return -ENODEV;
    149 }
    150 
    151 static inline int drm_agp_release(struct drm_device *dev)
    152 {
    153 	return -ENODEV;
    154 }
    155 
    156 static inline int drm_agp_enable(struct drm_device *dev,
    157 				 struct drm_agp_mode mode)
    158 {
    159 	return -ENODEV;
    160 }
    161 
    162 static inline int drm_agp_info(struct drm_device *dev,
    163 			       struct drm_agp_info *info)
    164 {
    165 	return -ENODEV;
    166 }
    167 
    168 static inline int drm_agp_alloc(struct drm_device *dev,
    169 				struct drm_agp_buffer *request)
    170 {
    171 	return -ENODEV;
    172 }
    173 
    174 static inline int drm_agp_free(struct drm_device *dev,
    175 			       struct drm_agp_buffer *request)
    176 {
    177 	return -ENODEV;
    178 }
    179 
    180 static inline int drm_agp_unbind(struct drm_device *dev,
    181 				 struct drm_agp_binding *request)
    182 {
    183 	return -ENODEV;
    184 }
    185 
    186 static inline int drm_agp_bind(struct drm_device *dev,
    187 			       struct drm_agp_binding *request)
    188 {
    189 	return -ENODEV;
    190 }
    191 
    192 #endif /* CONFIG_AGP */
    193 
    194 #endif /* _DRM_AGPSUPPORT_H_ */
    195