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