drm: add in-kernel entry points for rest of AGP ioctls

Allow DRM modules to call AGP internally in the kernel.

From: Ian Romanick <idr@us.ibm.com>
Signed-off-by: Dave Airlie <airlied@linux.ie>

authored by Dave Airlie and committed by Dave Airlie efa58395 732052ed

+95 -52
+8 -4
drivers/char/drm/drmP.h
··· 925 925 extern int drm_agp_info(drm_device_t * dev, drm_agp_info_t * info); 926 926 extern int drm_agp_info_ioctl(struct inode *inode, struct file *filp, 927 927 unsigned int cmd, unsigned long arg); 928 - extern int drm_agp_alloc(struct inode *inode, struct file *filp, 928 + extern int drm_agp_alloc(drm_device_t *dev, drm_agp_buffer_t *request); 929 + extern int drm_agp_alloc_ioctl(struct inode *inode, struct file *filp, 929 930 unsigned int cmd, unsigned long arg); 930 - extern int drm_agp_free(struct inode *inode, struct file *filp, 931 + extern int drm_agp_free(drm_device_t *dev, drm_agp_buffer_t *request); 932 + extern int drm_agp_free_ioctl(struct inode *inode, struct file *filp, 931 933 unsigned int cmd, unsigned long arg); 932 - extern int drm_agp_unbind(struct inode *inode, struct file *filp, 934 + extern int drm_agp_unbind(drm_device_t *dev, drm_agp_binding_t *request); 935 + extern int drm_agp_unbind_ioctl(struct inode *inode, struct file *filp, 933 936 unsigned int cmd, unsigned long arg); 934 - extern int drm_agp_bind(struct inode *inode, struct file *filp, 937 + extern int drm_agp_bind(drm_device_t *dev, drm_agp_binding_t *request); 938 + extern int drm_agp_bind_ioctl(struct inode *inode, struct file *filp, 935 939 unsigned int cmd, unsigned long arg); 936 940 extern DRM_AGP_MEM *drm_agp_allocate_memory(struct agp_bridge_data *bridge, 937 941 size_t pages, u32 type);
+81 -42
drivers/char/drm/drm_agpsupport.c
··· 208 208 * Verifies the AGP device is present and has been acquired, allocates the 209 209 * memory via alloc_agp() and creates a drm_agp_mem entry for it. 210 210 */ 211 - int drm_agp_alloc(struct inode *inode, struct file *filp, 212 - unsigned int cmd, unsigned long arg) 211 + int drm_agp_alloc(drm_device_t *dev, drm_agp_buffer_t *request) 213 212 { 214 - drm_file_t *priv = filp->private_data; 215 - drm_device_t *dev = priv->head->dev; 216 - drm_agp_buffer_t request; 217 213 drm_agp_mem_t *entry; 218 214 DRM_AGP_MEM *memory; 219 215 unsigned long pages; 220 216 u32 type; 221 - drm_agp_buffer_t __user *argp = (void __user *)arg; 222 217 223 218 if (!dev->agp || !dev->agp->acquired) 224 219 return -EINVAL; 225 - if (copy_from_user(&request, argp, sizeof(request))) 226 - return -EFAULT; 227 220 if (!(entry = drm_alloc(sizeof(*entry), DRM_MEM_AGPLISTS))) 228 221 return -ENOMEM; 229 222 230 223 memset(entry, 0, sizeof(*entry)); 231 224 232 - pages = (request.size + PAGE_SIZE - 1) / PAGE_SIZE; 233 - type = (u32) request.type; 234 - 225 + pages = (request->size + PAGE_SIZE - 1) / PAGE_SIZE; 226 + type = (u32) request->type; 235 227 if (!(memory = drm_alloc_agp(dev, pages, type))) { 236 228 drm_free(entry, sizeof(*entry), DRM_MEM_AGPLISTS); 237 229 return -ENOMEM; ··· 239 247 dev->agp->memory->prev = entry; 240 248 dev->agp->memory = entry; 241 249 242 - request.handle = entry->handle; 243 - request.physical = memory->physical; 250 + request->handle = entry->handle; 251 + request->physical = memory->physical; 252 + 253 + return 0; 254 + } 255 + EXPORT_SYMBOL(drm_agp_alloc); 256 + 257 + int drm_agp_alloc_ioctl(struct inode *inode, struct file *filp, 258 + unsigned int cmd, unsigned long arg) 259 + { 260 + drm_file_t *priv = filp->private_data; 261 + drm_device_t *dev = priv->head->dev; 262 + drm_agp_buffer_t request; 263 + drm_agp_buffer_t __user *argp = (void __user *)arg; 264 + int err; 265 + 266 + if (copy_from_user(&request, argp, sizeof(request))) 267 + return -EFAULT; 268 + 269 + err = drm_agp_alloc(dev, &request); 270 + if (err) 271 + return err; 244 272 245 273 if (copy_to_user(argp, &request, sizeof(request))) { 274 + drm_agp_mem_t *entry = dev->agp->memory; 275 + 246 276 dev->agp->memory = entry->next; 247 277 dev->agp->memory->prev = NULL; 248 - drm_free_agp(memory, pages); 278 + drm_free_agp(entry->memory, entry->pages); 249 279 drm_free(entry, sizeof(*entry), DRM_MEM_AGPLISTS); 250 280 return -EFAULT; 251 281 } 282 + 252 283 return 0; 253 284 } 254 285 ··· 308 293 * Verifies the AGP device is present and acquired, looks-up the AGP memory 309 294 * entry and passes it to the unbind_agp() function. 310 295 */ 311 - int drm_agp_unbind(struct inode *inode, struct file *filp, 312 - unsigned int cmd, unsigned long arg) 296 + int drm_agp_unbind(drm_device_t *dev, drm_agp_binding_t *request) 313 297 { 314 - drm_file_t *priv = filp->private_data; 315 - drm_device_t *dev = priv->head->dev; 316 - drm_agp_binding_t request; 317 298 drm_agp_mem_t *entry; 318 299 int ret; 319 300 320 301 if (!dev->agp || !dev->agp->acquired) 321 302 return -EINVAL; 322 - if (copy_from_user 323 - (&request, (drm_agp_binding_t __user *) arg, sizeof(request))) 324 - return -EFAULT; 325 - if (!(entry = drm_agp_lookup_entry(dev, request.handle))) 303 + if (!(entry = drm_agp_lookup_entry(dev, request->handle))) 326 304 return -EINVAL; 327 305 if (!entry->bound) 328 306 return -EINVAL; ··· 323 315 if (ret == 0) 324 316 entry->bound = 0; 325 317 return ret; 318 + } 319 + EXPORT_SYMBOL(drm_agp_unbind); 320 + 321 + int drm_agp_unbind_ioctl(struct inode *inode, struct file *filp, 322 + unsigned int cmd, unsigned long arg) 323 + { 324 + drm_file_t *priv = filp->private_data; 325 + drm_device_t *dev = priv->head->dev; 326 + drm_agp_binding_t request; 327 + 328 + if (copy_from_user 329 + (&request, (drm_agp_binding_t __user *) arg, sizeof(request))) 330 + return -EFAULT; 331 + 332 + return drm_agp_unbind(dev, &request); 326 333 } 327 334 328 335 /** ··· 353 330 * is currently bound into the GATT. Looks-up the AGP memory entry and passes 354 331 * it to bind_agp() function. 355 332 */ 356 - int drm_agp_bind(struct inode *inode, struct file *filp, 357 - unsigned int cmd, unsigned long arg) 333 + int drm_agp_bind(drm_device_t *dev, drm_agp_binding_t *request) 358 334 { 359 - drm_file_t *priv = filp->private_data; 360 - drm_device_t *dev = priv->head->dev; 361 - drm_agp_binding_t request; 362 335 drm_agp_mem_t *entry; 363 336 int retcode; 364 337 int page; 365 338 366 339 if (!dev->agp || !dev->agp->acquired) 367 340 return -EINVAL; 368 - if (copy_from_user 369 - (&request, (drm_agp_binding_t __user *) arg, sizeof(request))) 370 - return -EFAULT; 371 - if (!(entry = drm_agp_lookup_entry(dev, request.handle))) 341 + if (!(entry = drm_agp_lookup_entry(dev, request->handle))) 372 342 return -EINVAL; 373 343 if (entry->bound) 374 344 return -EINVAL; 375 - page = (request.offset + PAGE_SIZE - 1) / PAGE_SIZE; 345 + page = (request->offset + PAGE_SIZE - 1) / PAGE_SIZE; 376 346 if ((retcode = drm_bind_agp(entry->memory, page))) 377 347 return retcode; 378 348 entry->bound = dev->agp->base + (page << PAGE_SHIFT); 379 349 DRM_DEBUG("base = 0x%lx entry->bound = 0x%lx\n", 380 350 dev->agp->base, entry->bound); 381 351 return 0; 352 + } 353 + EXPORT_SYMBOL(drm_agp_bind); 354 + 355 + int drm_agp_bind_ioctl(struct inode *inode, struct file *filp, 356 + unsigned int cmd, unsigned long arg) 357 + { 358 + drm_file_t *priv = filp->private_data; 359 + drm_device_t *dev = priv->head->dev; 360 + drm_agp_binding_t request; 361 + 362 + if (copy_from_user 363 + (&request, (drm_agp_binding_t __user *) arg, sizeof(request))) 364 + return -EFAULT; 365 + 366 + return drm_agp_bind(dev, &request); 382 367 } 383 368 384 369 /** ··· 403 372 * unbind_agp(). Frees it via free_agp() as well as the entry itself 404 373 * and unlinks from the doubly linked list it's inserted in. 405 374 */ 406 - int drm_agp_free(struct inode *inode, struct file *filp, 407 - unsigned int cmd, unsigned long arg) 375 + int drm_agp_free(drm_device_t *dev, drm_agp_buffer_t *request) 408 376 { 409 - drm_file_t *priv = filp->private_data; 410 - drm_device_t *dev = priv->head->dev; 411 - drm_agp_buffer_t request; 412 377 drm_agp_mem_t *entry; 413 378 414 379 if (!dev->agp || !dev->agp->acquired) 415 380 return -EINVAL; 416 - if (copy_from_user 417 - (&request, (drm_agp_buffer_t __user *) arg, sizeof(request))) 418 - return -EFAULT; 419 - if (!(entry = drm_agp_lookup_entry(dev, request.handle))) 381 + if (!(entry = drm_agp_lookup_entry(dev, request->handle))) 420 382 return -EINVAL; 421 383 if (entry->bound) 422 384 drm_unbind_agp(entry->memory); ··· 425 401 drm_free_agp(entry->memory, entry->pages); 426 402 drm_free(entry, sizeof(*entry), DRM_MEM_AGPLISTS); 427 403 return 0; 404 + } 405 + EXPORT_SYMBOL(drm_agp_free); 406 + 407 + int drm_agp_free_ioctl(struct inode *inode, struct file *filp, 408 + unsigned int cmd, unsigned long arg) 409 + { 410 + drm_file_t *priv = filp->private_data; 411 + drm_device_t *dev = priv->head->dev; 412 + drm_agp_buffer_t request; 413 + 414 + if (copy_from_user 415 + (&request, (drm_agp_buffer_t __user *) arg, sizeof(request))) 416 + return -EFAULT; 417 + 418 + return drm_agp_free(dev, &request); 428 419 } 429 420 430 421 /**
+2 -2
drivers/char/drm/drm_core.h
··· 24 24 25 25 #define CORE_NAME "drm" 26 26 #define CORE_DESC "DRM shared core routines" 27 - #define CORE_DATE "20040925" 27 + #define CORE_DATE "20051102" 28 28 29 29 #define DRM_IF_MAJOR 1 30 30 #define DRM_IF_MINOR 2 31 31 32 32 #define CORE_MAJOR 1 33 33 #define CORE_MINOR 0 34 - #define CORE_PATCHLEVEL 0 34 + #define CORE_PATCHLEVEL 1
+4 -4
drivers/char/drm/drm_drv.c
··· 106 106 [DRM_IOCTL_NR(DRM_IOCTL_AGP_RELEASE)] = {drm_agp_release_ioctl, 1, 1}, 107 107 [DRM_IOCTL_NR(DRM_IOCTL_AGP_ENABLE)] = {drm_agp_enable_ioctl, 1, 1}, 108 108 [DRM_IOCTL_NR(DRM_IOCTL_AGP_INFO)] = {drm_agp_info_ioctl, 1, 0}, 109 - [DRM_IOCTL_NR(DRM_IOCTL_AGP_ALLOC)] = {drm_agp_alloc, 1, 1}, 110 - [DRM_IOCTL_NR(DRM_IOCTL_AGP_FREE)] = {drm_agp_free, 1, 1}, 111 - [DRM_IOCTL_NR(DRM_IOCTL_AGP_BIND)] = {drm_agp_bind, 1, 1}, 112 - [DRM_IOCTL_NR(DRM_IOCTL_AGP_UNBIND)] = {drm_agp_unbind, 1, 1}, 109 + [DRM_IOCTL_NR(DRM_IOCTL_AGP_ALLOC)] = {drm_agp_alloc_ioctl, 1, 1}, 110 + [DRM_IOCTL_NR(DRM_IOCTL_AGP_FREE)] = {drm_agp_free_ioctl, 1, 1}, 111 + [DRM_IOCTL_NR(DRM_IOCTL_AGP_BIND)] = {drm_agp_bind_ioctl, 1, 1}, 112 + [DRM_IOCTL_NR(DRM_IOCTL_AGP_UNBIND)] = {drm_agp_unbind_ioctl, 1, 1}, 113 113 #endif 114 114 115 115 [DRM_IOCTL_NR(DRM_IOCTL_SG_ALLOC)] = {drm_sg_alloc, 1, 1},