drm: update mga driver for new bootstrap code

The MGA driver needs to use the full AGP interface.

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

authored by Dave Airlie and committed by Dave Airlie 7ccf800e c0be4d24

+94 -64
+89 -59
drivers/char/drm/mga_dma.c
··· 44 44 #define MGA_DEFAULT_USEC_TIMEOUT 10000 45 45 #define MGA_FREELIST_DEBUG 0 46 46 47 - static int mga_do_cleanup_dma(drm_device_t * dev); 47 + #define MINIMAL_CLEANUP 0 48 + #define FULL_CLEANUP 1 49 + static int mga_do_cleanup_dma(drm_device_t *dev, int full_cleanup); 48 50 49 51 /* ================================================================ 50 52 * Engine control ··· 448 446 drm_buf_desc_t req; 449 447 drm_agp_mode_t mode; 450 448 drm_agp_info_t info; 449 + drm_agp_buffer_t agp_req; 450 + drm_agp_binding_t bind_req; 451 451 452 452 /* Acquire AGP. */ 453 453 err = drm_agp_acquire(dev); 454 454 if (err) { 455 - DRM_ERROR("Unable to acquire AGP\n"); 455 + DRM_ERROR("Unable to acquire AGP: %d\n", err); 456 456 return err; 457 457 } 458 458 459 459 err = drm_agp_info(dev, &info); 460 460 if (err) { 461 - DRM_ERROR("Unable to get AGP info\n"); 461 + DRM_ERROR("Unable to get AGP info: %d\n", err); 462 462 return err; 463 463 } 464 464 ··· 484 480 } 485 481 486 482 /* Allocate and bind AGP memory. */ 487 - dev_priv->agp_pages = agp_size / PAGE_SIZE; 488 - dev_priv->agp_mem = drm_alloc_agp(dev, dev_priv->agp_pages, 0); 489 - if (dev_priv->agp_mem == NULL) { 490 - dev_priv->agp_pages = 0; 483 + agp_req.size = agp_size; 484 + agp_req.type = 0; 485 + err = drm_agp_alloc(dev, &agp_req); 486 + if (err) { 487 + dev_priv->agp_size = 0; 491 488 DRM_ERROR("Unable to allocate %uMB AGP memory\n", 492 489 dma_bs->agp_size); 493 - return DRM_ERR(ENOMEM); 490 + return err; 494 491 } 492 + 493 + dev_priv->agp_size = agp_size; 494 + dev_priv->agp_handle = agp_req.handle; 495 495 496 - err = drm_bind_agp(dev_priv->agp_mem, 0); 496 + bind_req.handle = agp_req.handle; 497 + bind_req.offset = 0; 498 + err = drm_agp_bind(dev, &bind_req); 497 499 if (err) { 498 - DRM_ERROR("Unable to bind AGP memory\n"); 500 + DRM_ERROR("Unable to bind AGP memory: %d\n", err); 499 501 return err; 500 502 } 501 503 ··· 515 505 err = drm_addmap(dev, offset, warp_size, 516 506 _DRM_AGP, _DRM_READ_ONLY, &dev_priv->warp); 517 507 if (err) { 518 - DRM_ERROR("Unable to map WARP microcode\n"); 508 + DRM_ERROR("Unable to map WARP microcode: %d\n", err); 519 509 return err; 520 510 } 521 511 ··· 523 513 err = drm_addmap(dev, offset, dma_bs->primary_size, 524 514 _DRM_AGP, _DRM_READ_ONLY, &dev_priv->primary); 525 515 if (err) { 526 - DRM_ERROR("Unable to map primary DMA region\n"); 516 + DRM_ERROR("Unable to map primary DMA region: %d\n", err); 527 517 return err; 528 518 } 529 519 ··· 531 521 err = drm_addmap(dev, offset, secondary_size, 532 522 _DRM_AGP, 0, &dev->agp_buffer_map); 533 523 if (err) { 534 - DRM_ERROR("Unable to map secondary DMA region\n"); 524 + DRM_ERROR("Unable to map secondary DMA region: %d\n", err); 535 525 return err; 536 526 } 537 527 ··· 543 533 544 534 err = drm_addbufs_agp(dev, &req); 545 535 if (err) { 546 - DRM_ERROR("Unable to add secondary DMA buffers\n"); 536 + DRM_ERROR("Unable to add secondary DMA buffers: %d\n", err); 547 537 return err; 538 + } 539 + 540 + { 541 + drm_map_list_t *_entry; 542 + unsigned long agp_token = 0; 543 + 544 + list_for_each_entry(_entry, &dev->maplist->head, head) { 545 + if (_entry->map == dev->agp_buffer_map) 546 + agp_token = _entry->user_token; 547 + } 548 + if (!agp_token) 549 + return -EFAULT; 550 + 551 + dev->agp_buffer_token = agp_token; 548 552 } 549 553 550 554 offset += secondary_size; 551 555 err = drm_addmap(dev, offset, agp_size - offset, 552 556 _DRM_AGP, 0, &dev_priv->agp_textures); 553 557 if (err) { 554 - DRM_ERROR("Unable to map AGP texture region\n"); 558 + DRM_ERROR("Unable to map AGP texture region %d\n", err); 555 559 return err; 556 560 } 557 561 ··· 635 611 err = drm_addmap(dev, 0, warp_size, _DRM_CONSISTENT, 636 612 _DRM_READ_ONLY, &dev_priv->warp); 637 613 if (err != 0) { 638 - DRM_ERROR("Unable to create mapping for WARP microcode\n"); 614 + DRM_ERROR("Unable to create mapping for WARP microcode: %d\n", 615 + err); 639 616 return err; 640 617 } 641 618 ··· 655 630 } 656 631 657 632 if (err != 0) { 658 - DRM_ERROR("Unable to allocate primary DMA region\n"); 633 + DRM_ERROR("Unable to allocate primary DMA region: %d\n", err); 659 634 return DRM_ERR(ENOMEM); 660 635 } 661 636 ··· 679 654 } 680 655 681 656 if (bin_count == 0) { 682 - DRM_ERROR("Unable to add secondary DMA buffers\n"); 657 + DRM_ERROR("Unable to add secondary DMA buffers: %d\n", err); 683 658 return err; 684 659 } 685 660 ··· 715 690 err = drm_addmap(dev, dev_priv->mmio_base, dev_priv->mmio_size, 716 691 _DRM_REGISTERS, _DRM_READ_ONLY, &dev_priv->mmio); 717 692 if (err) { 718 - DRM_ERROR("Unable to map MMIO region\n"); 693 + DRM_ERROR("Unable to map MMIO region: %d\n", err); 719 694 return err; 720 695 } 721 696 ··· 723 698 _DRM_READ_ONLY | _DRM_LOCKED | _DRM_KERNEL, 724 699 &dev_priv->status); 725 700 if (err) { 726 - DRM_ERROR("Unable to map status region\n"); 701 + DRM_ERROR("Unable to map status region: %d\n", err); 727 702 return err; 728 703 } 729 704 ··· 741 716 */ 742 717 743 718 if (err) { 744 - mga_do_cleanup_dma(dev); 719 + mga_do_cleanup_dma(dev, MINIMAL_CLEANUP); 745 720 } 746 721 747 722 /* Not only do we want to try and initialized PCI cards for PCI DMA, ··· 764 739 DRM_DEVICE; 765 740 drm_mga_dma_bootstrap_t bootstrap; 766 741 int err; 742 + static const int modes[] = { 0, 1, 2, 2, 4, 4, 4, 4 }; 743 + const drm_mga_private_t *const dev_priv = 744 + (drm_mga_private_t *) dev->dev_private; 767 745 768 746 DRM_COPY_FROM_USER_IOCTL(bootstrap, 769 747 (drm_mga_dma_bootstrap_t __user *) data, 770 748 sizeof(bootstrap)); 771 749 772 750 err = mga_do_dma_bootstrap(dev, &bootstrap); 773 - if (!err) { 774 - static const int modes[] = { 0, 1, 2, 2, 4, 4, 4, 4 }; 775 - const drm_mga_private_t *const dev_priv = 776 - (drm_mga_private_t *) dev->dev_private; 777 - 778 - if (dev_priv->agp_textures != NULL) { 779 - bootstrap.texture_handle = 780 - dev_priv->agp_textures->offset; 781 - bootstrap.texture_size = dev_priv->agp_textures->size; 782 - } else { 783 - bootstrap.texture_handle = 0; 784 - bootstrap.texture_size = 0; 785 - } 786 - 787 - bootstrap.agp_mode = modes[bootstrap.agp_mode & 0x07]; 788 - if (DRM_COPY_TO_USER((void __user *)data, &bootstrap, 789 - sizeof(bootstrap))) { 790 - err = DRM_ERR(EFAULT); 791 - } 792 - } else { 793 - mga_do_cleanup_dma(dev); 751 + if (err) { 752 + mga_do_cleanup_dma(dev, FULL_CLEANUP); 753 + return err; 794 754 } 755 + 756 + if (dev_priv->agp_textures != NULL) { 757 + bootstrap.texture_handle = dev_priv->agp_textures->offset; 758 + bootstrap.texture_size = dev_priv->agp_textures->size; 759 + } else { 760 + bootstrap.texture_handle = 0; 761 + bootstrap.texture_size = 0; 762 + } 763 + 764 + bootstrap.agp_mode = modes[bootstrap.agp_mode & 0x07]; 765 + DRM_COPY_TO_USER_IOCTL((drm_mga_dma_bootstrap_t __user *)data, 766 + bootstrap, sizeof(bootstrap)); 795 767 796 768 return err; 797 769 } ··· 883 861 884 862 ret = mga_warp_install_microcode(dev_priv); 885 863 if (ret < 0) { 886 - DRM_ERROR("failed to install WARP ucode!\n"); 864 + DRM_ERROR("failed to install WARP ucode!: %d\n", ret); 887 865 return ret; 888 866 } 889 867 890 868 ret = mga_warp_init(dev_priv); 891 869 if (ret < 0) { 892 - DRM_ERROR("failed to init WARP engine!\n"); 870 + DRM_ERROR("failed to init WARP engine!: %d\n", ret); 893 871 return ret; 894 872 } 895 873 ··· 934 912 return 0; 935 913 } 936 914 937 - static int mga_do_cleanup_dma(drm_device_t * dev) 915 + static int mga_do_cleanup_dma(drm_device_t *dev, int full_cleanup) 938 916 { 939 917 int err = 0; 940 918 DRM_DEBUG("\n"); ··· 962 940 963 941 if (dev_priv->used_new_dma_init) { 964 942 #if __OS_HAS_AGP 965 - if (dev_priv->agp_mem != NULL) { 966 - dev_priv->agp_textures = NULL; 967 - drm_unbind_agp(dev_priv->agp_mem); 943 + if (dev_priv->agp_handle != 0) { 944 + drm_agp_binding_t unbind_req; 945 + drm_agp_buffer_t free_req; 968 946 969 - drm_free_agp(dev_priv->agp_mem, 970 - dev_priv->agp_pages); 971 - dev_priv->agp_pages = 0; 972 - dev_priv->agp_mem = NULL; 947 + unbind_req.handle = dev_priv->agp_handle; 948 + drm_agp_unbind(dev, &unbind_req); 949 + 950 + free_req.handle = dev_priv->agp_handle; 951 + drm_agp_free(dev, &free_req); 952 + 953 + dev_priv->agp_textures = NULL; 954 + dev_priv->agp_size = 0; 955 + dev_priv->agp_handle = 0; 973 956 } 974 957 975 958 if ((dev->agp != NULL) && dev->agp->acquired) { 976 959 err = drm_agp_release(dev); 977 960 } 978 961 #endif 979 - dev_priv->used_new_dma_init = 0; 980 962 } 981 963 982 964 dev_priv->warp = NULL; 983 965 dev_priv->primary = NULL; 984 - dev_priv->mmio = NULL; 985 - dev_priv->status = NULL; 986 966 dev_priv->sarea = NULL; 987 967 dev_priv->sarea_priv = NULL; 988 968 dev->agp_buffer_map = NULL; 969 + 970 + if (full_cleanup) { 971 + dev_priv->mmio = NULL; 972 + dev_priv->status = NULL; 973 + dev_priv->used_new_dma_init = 0; 974 + } 989 975 990 976 memset(&dev_priv->prim, 0, sizeof(dev_priv->prim)); 991 977 dev_priv->warp_pipe = 0; ··· 1005 975 } 1006 976 } 1007 977 1008 - return err; 978 + return 0; 1009 979 } 1010 980 1011 981 int mga_dma_init(DRM_IOCTL_ARGS) ··· 1023 993 case MGA_INIT_DMA: 1024 994 err = mga_do_init_dma(dev, &init); 1025 995 if (err) { 1026 - (void)mga_do_cleanup_dma(dev); 996 + (void)mga_do_cleanup_dma(dev, FULL_CLEANUP); 1027 997 } 1028 998 return err; 1029 999 case MGA_CLEANUP_DMA: 1030 - return mga_do_cleanup_dma(dev); 1000 + return mga_do_cleanup_dma(dev, FULL_CLEANUP); 1031 1001 } 1032 1002 1033 1003 return DRM_ERR(EINVAL); ··· 1169 1139 */ 1170 1140 void mga_driver_lastclose(drm_device_t * dev) 1171 1141 { 1172 - mga_do_cleanup_dma(dev); 1142 + mga_do_cleanup_dma(dev, FULL_CLEANUP); 1173 1143 } 1174 1144 1175 1145 int mga_driver_dma_quiescent(drm_device_t * dev)
+1 -1
drivers/char/drm/mga_drv.c
··· 45 45 46 46 static struct drm_driver driver = { 47 47 .driver_features = 48 - DRIVER_USE_AGP | DRIVER_REQUIRE_AGP | DRIVER_USE_MTRR | 48 + DRIVER_USE_AGP | DRIVER_USE_MTRR | DRIVER_PCI_DMA | 49 49 DRIVER_HAVE_DMA | DRIVER_HAVE_IRQ | DRIVER_IRQ_SHARED | 50 50 DRIVER_IRQ_VBL, 51 51 .load = mga_driver_load,
+4 -4
drivers/char/drm/mga_drv.h
··· 38 38 39 39 #define DRIVER_NAME "mga" 40 40 #define DRIVER_DESC "Matrox G200/G400" 41 - #define DRIVER_DATE "20050607" 41 + #define DRIVER_DATE "20051102" 42 42 43 43 #define DRIVER_MAJOR 3 44 44 #define DRIVER_MINOR 2 45 - #define DRIVER_PATCHLEVEL 0 45 + #define DRIVER_PATCHLEVEL 1 46 46 47 47 typedef struct drm_mga_primary_buffer { 48 48 u8 *start; ··· 144 144 drm_local_map_t *primary; 145 145 drm_local_map_t *agp_textures; 146 146 147 - DRM_AGP_MEM *agp_mem; 148 - unsigned int agp_pages; 147 + unsigned long agp_handle; 148 + unsigned int agp_size; 149 149 } drm_mga_private_t; 150 150 151 151 extern drm_ioctl_desc_t mga_ioctls[];