Lines Matching +full:dma +full:- +full:safe +full:- +full:map

1 /* mga_dma.c -- DMA support for mga g200/g400 -*- linux-c -*-
30 * DMA support for MGA G200 / G400.
59 for (i = 0; i < dev_priv->usec_timeout; i++) { in mga_do_wait_for_idle()
72 return -EBUSY; in mga_do_wait_for_idle()
77 drm_mga_sarea_t *sarea_priv = dev_priv->sarea_priv; in mga_do_dma_reset()
78 drm_mga_primary_buffer_t *primary = &dev_priv->prim; in mga_do_dma_reset()
82 /* The primary DMA stream should look like new right about now. in mga_do_dma_reset()
84 primary->tail = 0; in mga_do_dma_reset()
85 primary->space = primary->size; in mga_do_dma_reset()
86 primary->last_flush = 0; in mga_do_dma_reset()
88 sarea_priv->last_wrap = 0; in mga_do_dma_reset()
100 * Primary DMA stream
105 drm_mga_primary_buffer_t *primary = &dev_priv->prim; in mga_do_dma_flush()
112 /* We need to wait so that we can do an safe flush */ in mga_do_dma_flush()
113 for (i = 0; i < dev_priv->usec_timeout; i++) { in mga_do_dma_flush()
120 if (primary->tail == primary->last_flush) { in mga_do_dma_flush()
125 tail = primary->tail + dev_priv->primary->offset; in mga_do_dma_flush()
129 * See page 4-16 in the G400 manual, middle of the page or so. in mga_do_dma_flush()
139 primary->last_flush = primary->tail; in mga_do_dma_flush()
144 primary->space = primary->size - primary->tail; in mga_do_dma_flush()
146 primary->space = head - tail; in mga_do_dma_flush()
148 DRM_DEBUG(" head = 0x%06lx\n", (unsigned long)(head - dev_priv->primary->offset)); in mga_do_dma_flush()
149 DRM_DEBUG(" tail = 0x%06lx\n", (unsigned long)(tail - dev_priv->primary->offset)); in mga_do_dma_flush()
150 DRM_DEBUG(" space = 0x%06x\n", primary->space); in mga_do_dma_flush()
153 MGA_WRITE(MGA_PRIMEND, tail | dev_priv->dma_access); in mga_do_dma_flush()
160 drm_mga_primary_buffer_t *primary = &dev_priv->prim; in mga_do_dma_wrap_start()
173 tail = primary->tail + dev_priv->primary->offset; in mga_do_dma_wrap_start()
175 primary->tail = 0; in mga_do_dma_wrap_start()
176 primary->last_flush = 0; in mga_do_dma_wrap_start()
177 primary->last_wrap++; in mga_do_dma_wrap_start()
181 if (head == dev_priv->primary->offset) in mga_do_dma_wrap_start()
182 primary->space = primary->size; in mga_do_dma_wrap_start()
184 primary->space = head - dev_priv->primary->offset; in mga_do_dma_wrap_start()
186 DRM_DEBUG(" head = 0x%06lx\n", (unsigned long)(head - dev_priv->primary->offset)); in mga_do_dma_wrap_start()
187 DRM_DEBUG(" tail = 0x%06x\n", primary->tail); in mga_do_dma_wrap_start()
188 DRM_DEBUG(" wrap = %d\n", primary->last_wrap); in mga_do_dma_wrap_start()
189 DRM_DEBUG(" space = 0x%06x\n", primary->space); in mga_do_dma_wrap_start()
192 MGA_WRITE(MGA_PRIMEND, tail | dev_priv->dma_access); in mga_do_dma_wrap_start()
194 set_bit(0, &primary->wrapped); in mga_do_dma_wrap_start()
200 drm_mga_primary_buffer_t *primary = &dev_priv->prim; in mga_do_dma_wrap_end()
201 drm_mga_sarea_t *sarea_priv = dev_priv->sarea_priv; in mga_do_dma_wrap_end()
202 u32 head = dev_priv->primary->offset; in mga_do_dma_wrap_end()
205 sarea_priv->last_wrap++; in mga_do_dma_wrap_end()
206 DRM_DEBUG(" wrap = %d\n", sarea_priv->last_wrap); in mga_do_dma_wrap_end()
211 clear_bit(0, &primary->wrapped); in mga_do_dma_wrap_end()
225 drm_mga_private_t *dev_priv = dev->dev_private; in mga_freelist_print()
230 dev_priv->sarea_priv->last_dispatch, in mga_freelist_print()
231 (unsigned int)(MGA_READ(MGA_PRIMADDRESS) - in mga_freelist_print()
232 dev_priv->primary->offset)); in mga_freelist_print()
235 for (entry = dev_priv->head->next; entry; entry = entry->next) { in mga_freelist_print()
237 entry, entry->buf->idx, entry->age.head, in mga_freelist_print()
238 (unsigned long)(entry->age.head - dev_priv->primary->offset)); in mga_freelist_print()
246 struct drm_device_dma *dma = dev->dma; in mga_freelist_init() local
251 DRM_DEBUG("count=%d\n", dma->buf_count); in mga_freelist_init()
253 dev_priv->head = kzalloc(sizeof(drm_mga_freelist_t), GFP_KERNEL); in mga_freelist_init()
254 if (dev_priv->head == NULL) in mga_freelist_init()
255 return -ENOMEM; in mga_freelist_init()
257 SET_AGE(&dev_priv->head->age, MGA_BUFFER_USED, 0); in mga_freelist_init()
259 for (i = 0; i < dma->buf_count; i++) { in mga_freelist_init()
260 buf = dma->buflist[i]; in mga_freelist_init()
261 buf_priv = buf->dev_private; in mga_freelist_init()
265 return -ENOMEM; in mga_freelist_init()
267 entry->next = dev_priv->head->next; in mga_freelist_init()
268 entry->prev = dev_priv->head; in mga_freelist_init()
269 SET_AGE(&entry->age, MGA_BUFFER_FREE, 0); in mga_freelist_init()
270 entry->buf = buf; in mga_freelist_init()
272 if (dev_priv->head->next != NULL) in mga_freelist_init()
273 dev_priv->head->next->prev = entry; in mga_freelist_init()
274 if (entry->next == NULL) in mga_freelist_init()
275 dev_priv->tail = entry; in mga_freelist_init()
277 buf_priv->list_entry = entry; in mga_freelist_init()
278 buf_priv->discard = 0; in mga_freelist_init()
279 buf_priv->dispatched = 0; in mga_freelist_init()
281 dev_priv->head->next = entry; in mga_freelist_init()
289 drm_mga_private_t *dev_priv = dev->dev_private; in mga_freelist_cleanup()
294 entry = dev_priv->head; in mga_freelist_cleanup()
296 next = entry->next; in mga_freelist_cleanup()
301 dev_priv->head = dev_priv->tail = NULL; in mga_freelist_cleanup()
309 struct drm_device_dma *dma = dev->dma;
314 for (i = 0; i < dma->buf_count; i++) {
315 buf = dma->buflist[i];
316 buf_priv = buf->dev_private;
317 SET_AGE(&buf_priv->list_entry->age, MGA_BUFFER_FREE, 0);
324 drm_mga_private_t *dev_priv = dev->dev_private; in mga_freelist_get()
327 drm_mga_freelist_t *tail = dev_priv->tail; in mga_freelist_get()
332 wrap = dev_priv->sarea_priv->last_wrap; in mga_freelist_get()
335 tail->age.head ? in mga_freelist_get()
336 (unsigned long)(tail->age.head - dev_priv->primary->offset) : 0, in mga_freelist_get()
337 tail->age.wrap); in mga_freelist_get()
339 (unsigned long)(head - dev_priv->primary->offset), wrap); in mga_freelist_get()
341 if (TEST_AGE(&tail->age, head, wrap)) { in mga_freelist_get()
342 prev = dev_priv->tail->prev; in mga_freelist_get()
343 next = dev_priv->tail; in mga_freelist_get()
344 prev->next = NULL; in mga_freelist_get()
345 next->prev = next->next = NULL; in mga_freelist_get()
346 dev_priv->tail = prev; in mga_freelist_get()
347 SET_AGE(&next->age, MGA_BUFFER_USED, 0); in mga_freelist_get()
348 return next->buf; in mga_freelist_get()
357 drm_mga_private_t *dev_priv = dev->dev_private; in mga_freelist_put()
358 drm_mga_buf_priv_t *buf_priv = buf->dev_private; in mga_freelist_put()
362 (unsigned long)(buf_priv->list_entry->age.head - in mga_freelist_put()
363 dev_priv->primary->offset), in mga_freelist_put()
364 buf_priv->list_entry->age.wrap); in mga_freelist_put()
366 entry = buf_priv->list_entry; in mga_freelist_put()
367 head = dev_priv->head; in mga_freelist_put()
369 if (buf_priv->list_entry->age.head == MGA_BUFFER_USED) { in mga_freelist_put()
370 SET_AGE(&entry->age, MGA_BUFFER_FREE, 0); in mga_freelist_put()
371 prev = dev_priv->tail; in mga_freelist_put()
372 prev->next = entry; in mga_freelist_put()
373 entry->prev = prev; in mga_freelist_put()
374 entry->next = NULL; in mga_freelist_put()
376 prev = head->next; in mga_freelist_put()
377 head->next = entry; in mga_freelist_put()
378 prev->prev = entry; in mga_freelist_put()
379 entry->prev = head; in mga_freelist_put()
380 entry->next = prev; in mga_freelist_put()
387 * DMA initialization, cleanup
396 * same PCI ID as the AGP G450, but have an additional PCI-to-PCI in mga_driver_load()
400 * device is 0x0021 (HB6 Universal PCI-PCI bridge), we reject the in mga_driver_load()
403 if ((dev->pdev->device == 0x0525) && dev->pdev->bus->self in mga_driver_load()
404 && (dev->pdev->bus->self->vendor == 0x3388) in mga_driver_load()
405 && (dev->pdev->bus->self->device == 0x0021) in mga_driver_load()
406 && dev->agp) { in mga_driver_load()
409 arch_phys_wc_del(dev->agp->agp_mtrr); in mga_driver_load()
410 kfree(dev->agp); in mga_driver_load()
411 dev->agp = NULL; in mga_driver_load()
415 return -ENOMEM; in mga_driver_load()
417 dev->dev_private = (void *)dev_priv; in mga_driver_load()
419 dev_priv->usec_timeout = MGA_DEFAULT_USEC_TIMEOUT; in mga_driver_load()
420 dev_priv->chipset = flags; in mga_driver_load()
422 pci_set_master(dev->pdev); in mga_driver_load()
424 dev_priv->mmio_base = pci_resource_start(dev->pdev, 1); in mga_driver_load()
425 dev_priv->mmio_size = pci_resource_len(dev->pdev, 1); in mga_driver_load()
439 * Bootstrap the driver for AGP DMA.
447 * This routine needs to set dma_bs->agp_mode to the mode actually configured
457 (drm_mga_private_t *) dev->dev_private; in mga_do_agp_dma_bootstrap()
461 const unsigned secondary_size = dma_bs->secondary_bin_count in mga_do_agp_dma_bootstrap()
462 * dma_bs->secondary_bin_size; in mga_do_agp_dma_bootstrap()
463 const unsigned agp_size = (dma_bs->agp_size << 20); in mga_do_agp_dma_bootstrap()
483 mode.mode = (info.mode & ~0x07) | dma_bs->agp_mode; in mga_do_agp_dma_bootstrap()
494 if (dev_priv->chipset == MGA_CARD_TYPE_G200) { in mga_do_agp_dma_bootstrap()
506 dev_priv->agp_size = 0; in mga_do_agp_dma_bootstrap()
508 dma_bs->agp_size); in mga_do_agp_dma_bootstrap()
512 dev_priv->agp_size = agp_size; in mga_do_agp_dma_bootstrap()
513 dev_priv->agp_handle = agp_req.handle; in mga_do_agp_dma_bootstrap()
531 _DRM_AGP, _DRM_READ_ONLY, &dev_priv->warp); in mga_do_agp_dma_bootstrap()
533 DRM_ERROR("Unable to map WARP microcode: %d\n", err); in mga_do_agp_dma_bootstrap()
538 err = drm_legacy_addmap(dev, offset, dma_bs->primary_size, in mga_do_agp_dma_bootstrap()
539 _DRM_AGP, _DRM_READ_ONLY, &dev_priv->primary); in mga_do_agp_dma_bootstrap()
541 DRM_ERROR("Unable to map primary DMA region: %d\n", err); in mga_do_agp_dma_bootstrap()
545 offset += dma_bs->primary_size; in mga_do_agp_dma_bootstrap()
547 _DRM_AGP, 0, &dev->agp_buffer_map); in mga_do_agp_dma_bootstrap()
549 DRM_ERROR("Unable to map secondary DMA region: %d\n", err); in mga_do_agp_dma_bootstrap()
554 req.count = dma_bs->secondary_bin_count; in mga_do_agp_dma_bootstrap()
555 req.size = dma_bs->secondary_bin_size; in mga_do_agp_dma_bootstrap()
561 DRM_ERROR("Unable to add secondary DMA buffers: %d\n", err); in mga_do_agp_dma_bootstrap()
569 list_for_each_entry(_entry, &dev->maplist, head) { in mga_do_agp_dma_bootstrap()
570 if (_entry->map == dev->agp_buffer_map) in mga_do_agp_dma_bootstrap()
571 agp_token = _entry->user_token; in mga_do_agp_dma_bootstrap()
574 return -EFAULT; in mga_do_agp_dma_bootstrap()
576 dev->agp_buffer_token = agp_token; in mga_do_agp_dma_bootstrap()
580 err = drm_legacy_addmap(dev, offset, agp_size - offset, in mga_do_agp_dma_bootstrap()
581 _DRM_AGP, 0, &dev_priv->agp_textures); in mga_do_agp_dma_bootstrap()
583 DRM_ERROR("Unable to map AGP texture region %d\n", err); in mga_do_agp_dma_bootstrap()
587 drm_legacy_ioremap(dev_priv->warp, dev); in mga_do_agp_dma_bootstrap()
588 drm_legacy_ioremap(dev_priv->primary, dev); in mga_do_agp_dma_bootstrap()
589 drm_legacy_ioremap(dev->agp_buffer_map, dev); in mga_do_agp_dma_bootstrap()
591 if (!dev_priv->warp->handle || in mga_do_agp_dma_bootstrap()
592 !dev_priv->primary->handle || !dev->agp_buffer_map->handle) { in mga_do_agp_dma_bootstrap()
594 dev_priv->warp->handle, dev_priv->primary->handle, in mga_do_agp_dma_bootstrap()
595 dev->agp_buffer_map->handle); in mga_do_agp_dma_bootstrap()
596 return -ENOMEM; in mga_do_agp_dma_bootstrap()
599 dev_priv->dma_access = MGA_PAGPXFER; in mga_do_agp_dma_bootstrap()
600 dev_priv->wagp_enable = MGA_WAGP_ENABLE; in mga_do_agp_dma_bootstrap()
602 DRM_INFO("Initialized card for AGP DMA.\n"); in mga_do_agp_dma_bootstrap()
609 return -EINVAL; in mga_do_agp_dma_bootstrap()
614 * Bootstrap the driver for PCI DMA.
617 * The algorithm for decreasing the size of the primary DMA buffer could be
631 (drm_mga_private_t *) dev->dev_private; in mga_do_pci_dma_bootstrap()
638 if (dev->dma == NULL) { in mga_do_pci_dma_bootstrap()
639 DRM_ERROR("dev->dma is NULL\n"); in mga_do_pci_dma_bootstrap()
640 return -EFAULT; in mga_do_pci_dma_bootstrap()
651 _DRM_READ_ONLY, &dev_priv->warp); in mga_do_pci_dma_bootstrap()
660 * alignment of the primary or secondary DMA buffers. in mga_do_pci_dma_bootstrap()
663 for (primary_size = dma_bs->primary_size; primary_size != 0; in mga_do_pci_dma_bootstrap()
667 _DRM_READ_ONLY, &dev_priv->primary); in mga_do_pci_dma_bootstrap()
673 DRM_ERROR("Unable to allocate primary DMA region: %d\n", err); in mga_do_pci_dma_bootstrap()
674 return -ENOMEM; in mga_do_pci_dma_bootstrap()
677 if (dev_priv->primary->size != dma_bs->primary_size) { in mga_do_pci_dma_bootstrap()
678 DRM_INFO("Primary DMA buffer size reduced from %u to %u.\n", in mga_do_pci_dma_bootstrap()
679 dma_bs->primary_size, in mga_do_pci_dma_bootstrap()
680 (unsigned)dev_priv->primary->size); in mga_do_pci_dma_bootstrap()
681 dma_bs->primary_size = dev_priv->primary->size; in mga_do_pci_dma_bootstrap()
684 for (bin_count = dma_bs->secondary_bin_count; bin_count > 0; in mga_do_pci_dma_bootstrap()
685 bin_count--) { in mga_do_pci_dma_bootstrap()
688 req.size = dma_bs->secondary_bin_size; in mga_do_pci_dma_bootstrap()
696 DRM_ERROR("Unable to add secondary DMA buffers: %d\n", err); in mga_do_pci_dma_bootstrap()
700 if (bin_count != dma_bs->secondary_bin_count) { in mga_do_pci_dma_bootstrap()
701 DRM_INFO("Secondary PCI DMA buffer bin count reduced from %u " in mga_do_pci_dma_bootstrap()
702 "to %u.\n", dma_bs->secondary_bin_count, bin_count); in mga_do_pci_dma_bootstrap()
704 dma_bs->secondary_bin_count = bin_count; in mga_do_pci_dma_bootstrap()
707 dev_priv->dma_access = 0; in mga_do_pci_dma_bootstrap()
708 dev_priv->wagp_enable = 0; in mga_do_pci_dma_bootstrap()
710 dma_bs->agp_mode = 0; in mga_do_pci_dma_bootstrap()
712 DRM_INFO("Initialized card for PCI DMA.\n"); in mga_do_pci_dma_bootstrap()
719 const int is_agp = (dma_bs->agp_mode != 0) && dev->agp; in mga_do_dma_bootstrap()
722 (drm_mga_private_t *) dev->dev_private; in mga_do_dma_bootstrap()
724 dev_priv->used_new_dma_init = 1; in mga_do_dma_bootstrap()
726 /* The first steps are the same for both PCI and AGP based DMA. Map in mga_do_dma_bootstrap()
727 * the cards MMIO registers and map a status page. in mga_do_dma_bootstrap()
729 err = drm_legacy_addmap(dev, dev_priv->mmio_base, dev_priv->mmio_size, in mga_do_dma_bootstrap()
731 &dev_priv->mmio); in mga_do_dma_bootstrap()
733 DRM_ERROR("Unable to map MMIO region: %d\n", err); in mga_do_dma_bootstrap()
739 &dev_priv->status); in mga_do_dma_bootstrap()
741 DRM_ERROR("Unable to map status region: %d\n", err); in mga_do_dma_bootstrap()
745 /* The DMA initialization procedure is slightly different for PCI and in mga_do_dma_bootstrap()
748 * is returned to user-mode to be used for AGP textures. in mga_do_dma_bootstrap()
753 /* If we attempted to initialize the card for AGP DMA but failed, in mga_do_dma_bootstrap()
754 * clean-up any mess that may have been created. in mga_do_dma_bootstrap()
760 /* Not only do we want to try and initialized PCI cards for PCI DMA, in mga_do_dma_bootstrap()
762 * initialized for AGP DMA. This covers the case where we have an AGP in mga_do_dma_bootstrap()
781 (drm_mga_private_t *) dev->dev_private; in mga_dma_bootstrap()
789 if (dev_priv->agp_textures != NULL) { in mga_dma_bootstrap()
790 bootstrap->texture_handle = dev_priv->agp_textures->offset; in mga_dma_bootstrap()
791 bootstrap->texture_size = dev_priv->agp_textures->size; in mga_dma_bootstrap()
793 bootstrap->texture_handle = 0; in mga_dma_bootstrap()
794 bootstrap->texture_size = 0; in mga_dma_bootstrap()
797 bootstrap->agp_mode = modes[bootstrap->agp_mode & 0x07]; in mga_dma_bootstrap()
808 dev_priv = dev->dev_private; in mga_do_init_dma()
810 if (init->sgram) in mga_do_init_dma()
811 dev_priv->clear_cmd = MGA_DWGCTL_CLEAR | MGA_ATYPE_BLK; in mga_do_init_dma()
813 dev_priv->clear_cmd = MGA_DWGCTL_CLEAR | MGA_ATYPE_RSTR; in mga_do_init_dma()
814 dev_priv->maccess = init->maccess; in mga_do_init_dma()
816 dev_priv->fb_cpp = init->fb_cpp; in mga_do_init_dma()
817 dev_priv->front_offset = init->front_offset; in mga_do_init_dma()
818 dev_priv->front_pitch = init->front_pitch; in mga_do_init_dma()
819 dev_priv->back_offset = init->back_offset; in mga_do_init_dma()
820 dev_priv->back_pitch = init->back_pitch; in mga_do_init_dma()
822 dev_priv->depth_cpp = init->depth_cpp; in mga_do_init_dma()
823 dev_priv->depth_offset = init->depth_offset; in mga_do_init_dma()
824 dev_priv->depth_pitch = init->depth_pitch; in mga_do_init_dma()
828 dev_priv->texture_offset = init->texture_offset[0]; in mga_do_init_dma()
829 dev_priv->texture_size = init->texture_size[0]; in mga_do_init_dma()
831 dev_priv->sarea = drm_legacy_getsarea(dev); in mga_do_init_dma()
832 if (!dev_priv->sarea) { in mga_do_init_dma()
834 return -EINVAL; in mga_do_init_dma()
837 if (!dev_priv->used_new_dma_init) { in mga_do_init_dma()
839 dev_priv->dma_access = MGA_PAGPXFER; in mga_do_init_dma()
840 dev_priv->wagp_enable = MGA_WAGP_ENABLE; in mga_do_init_dma()
842 dev_priv->status = drm_legacy_findmap(dev, init->status_offset); in mga_do_init_dma()
843 if (!dev_priv->status) { in mga_do_init_dma()
845 return -EINVAL; in mga_do_init_dma()
847 dev_priv->mmio = drm_legacy_findmap(dev, init->mmio_offset); in mga_do_init_dma()
848 if (!dev_priv->mmio) { in mga_do_init_dma()
850 return -EINVAL; in mga_do_init_dma()
852 dev_priv->warp = drm_legacy_findmap(dev, init->warp_offset); in mga_do_init_dma()
853 if (!dev_priv->warp) { in mga_do_init_dma()
855 return -EINVAL; in mga_do_init_dma()
857 dev_priv->primary = drm_legacy_findmap(dev, init->primary_offset); in mga_do_init_dma()
858 if (!dev_priv->primary) { in mga_do_init_dma()
859 DRM_ERROR("failed to find primary dma region!\n"); in mga_do_init_dma()
860 return -EINVAL; in mga_do_init_dma()
862 dev->agp_buffer_token = init->buffers_offset; in mga_do_init_dma()
863 dev->agp_buffer_map = in mga_do_init_dma()
864 drm_legacy_findmap(dev, init->buffers_offset); in mga_do_init_dma()
865 if (!dev->agp_buffer_map) { in mga_do_init_dma()
866 DRM_ERROR("failed to find dma buffer region!\n"); in mga_do_init_dma()
867 return -EINVAL; in mga_do_init_dma()
870 drm_legacy_ioremap(dev_priv->warp, dev); in mga_do_init_dma()
871 drm_legacy_ioremap(dev_priv->primary, dev); in mga_do_init_dma()
872 drm_legacy_ioremap(dev->agp_buffer_map, dev); in mga_do_init_dma()
875 dev_priv->sarea_priv = in mga_do_init_dma()
876 (drm_mga_sarea_t *) ((u8 *) dev_priv->sarea->handle + in mga_do_init_dma()
877 init->sarea_priv_offset); in mga_do_init_dma()
879 if (!dev_priv->warp->handle || in mga_do_init_dma()
880 !dev_priv->primary->handle || in mga_do_init_dma()
881 ((dev_priv->dma_access != 0) && in mga_do_init_dma()
882 ((dev->agp_buffer_map == NULL) || in mga_do_init_dma()
883 (dev->agp_buffer_map->handle == NULL)))) { in mga_do_init_dma()
885 return -ENOMEM; in mga_do_init_dma()
900 dev_priv->prim.status = (u32 *) dev_priv->status->handle; in mga_do_init_dma()
904 /* Init the primary DMA registers. in mga_do_init_dma()
906 MGA_WRITE(MGA_PRIMADDRESS, dev_priv->primary->offset | MGA_DMA_GENERAL); in mga_do_init_dma()
908 …MGA_WRITE(MGA_PRIMPTR, virt_to_bus((void *)dev_priv->prim.status) | MGA_PRIMPTREN0 | /* Soft trap,… in mga_do_init_dma()
912 dev_priv->prim.start = (u8 *) dev_priv->primary->handle; in mga_do_init_dma()
913 dev_priv->prim.end = ((u8 *) dev_priv->primary->handle in mga_do_init_dma()
914 + dev_priv->primary->size); in mga_do_init_dma()
915 dev_priv->prim.size = dev_priv->primary->size; in mga_do_init_dma()
917 dev_priv->prim.tail = 0; in mga_do_init_dma()
918 dev_priv->prim.space = dev_priv->prim.size; in mga_do_init_dma()
919 dev_priv->prim.wrapped = 0; in mga_do_init_dma()
921 dev_priv->prim.last_flush = 0; in mga_do_init_dma()
922 dev_priv->prim.last_wrap = 0; in mga_do_init_dma()
924 dev_priv->prim.high_mark = 256 * DMA_BLOCK_SIZE; in mga_do_init_dma()
926 dev_priv->prim.status[0] = dev_priv->primary->offset; in mga_do_init_dma()
927 dev_priv->prim.status[1] = 0; in mga_do_init_dma()
929 dev_priv->sarea_priv->last_wrap = 0; in mga_do_init_dma()
930 dev_priv->sarea_priv->last_frame.head = 0; in mga_do_init_dma()
931 dev_priv->sarea_priv->last_frame.wrap = 0; in mga_do_init_dma()
935 return -ENOMEM; in mga_do_init_dma()
950 if (dev->irq_enabled) in mga_do_cleanup_dma()
953 if (dev->dev_private) { in mga_do_cleanup_dma()
954 drm_mga_private_t *dev_priv = dev->dev_private; in mga_do_cleanup_dma()
956 if ((dev_priv->warp != NULL) in mga_do_cleanup_dma()
957 && (dev_priv->warp->type != _DRM_CONSISTENT)) in mga_do_cleanup_dma()
958 drm_legacy_ioremapfree(dev_priv->warp, dev); in mga_do_cleanup_dma()
960 if ((dev_priv->primary != NULL) in mga_do_cleanup_dma()
961 && (dev_priv->primary->type != _DRM_CONSISTENT)) in mga_do_cleanup_dma()
962 drm_legacy_ioremapfree(dev_priv->primary, dev); in mga_do_cleanup_dma()
964 if (dev->agp_buffer_map != NULL) in mga_do_cleanup_dma()
965 drm_legacy_ioremapfree(dev->agp_buffer_map, dev); in mga_do_cleanup_dma()
967 if (dev_priv->used_new_dma_init) { in mga_do_cleanup_dma()
969 if (dev_priv->agp_handle != 0) { in mga_do_cleanup_dma()
973 unbind_req.handle = dev_priv->agp_handle; in mga_do_cleanup_dma()
976 free_req.handle = dev_priv->agp_handle; in mga_do_cleanup_dma()
979 dev_priv->agp_textures = NULL; in mga_do_cleanup_dma()
980 dev_priv->agp_size = 0; in mga_do_cleanup_dma()
981 dev_priv->agp_handle = 0; in mga_do_cleanup_dma()
984 if ((dev->agp != NULL) && dev->agp->acquired) in mga_do_cleanup_dma()
989 dev_priv->warp = NULL; in mga_do_cleanup_dma()
990 dev_priv->primary = NULL; in mga_do_cleanup_dma()
991 dev_priv->sarea = NULL; in mga_do_cleanup_dma()
992 dev_priv->sarea_priv = NULL; in mga_do_cleanup_dma()
993 dev->agp_buffer_map = NULL; in mga_do_cleanup_dma()
996 dev_priv->mmio = NULL; in mga_do_cleanup_dma()
997 dev_priv->status = NULL; in mga_do_cleanup_dma()
998 dev_priv->used_new_dma_init = 0; in mga_do_cleanup_dma()
1001 memset(&dev_priv->prim, 0, sizeof(dev_priv->prim)); in mga_do_cleanup_dma()
1002 dev_priv->warp_pipe = 0; in mga_do_cleanup_dma()
1003 memset(dev_priv->warp_pipe_phys, 0, in mga_do_cleanup_dma()
1004 sizeof(dev_priv->warp_pipe_phys)); in mga_do_cleanup_dma()
1006 if (dev_priv->head != NULL) in mga_do_cleanup_dma()
1021 switch (init->func) { in mga_dma_init()
1031 return -EINVAL; in mga_dma_init()
1035 * Primary DMA stream management
1041 drm_mga_private_t *dev_priv = (drm_mga_private_t *) dev->dev_private; in mga_dma_flush()
1047 (lock->flags & _DRM_LOCK_FLUSH) ? "flush, " : "", in mga_dma_flush()
1048 (lock->flags & _DRM_LOCK_FLUSH_ALL) ? "flush all, " : "", in mga_dma_flush()
1049 (lock->flags & _DRM_LOCK_QUIESCENT) ? "idle, " : ""); in mga_dma_flush()
1053 if (lock->flags & (_DRM_LOCK_FLUSH | _DRM_LOCK_FLUSH_ALL)) in mga_dma_flush()
1056 if (lock->flags & _DRM_LOCK_QUIESCENT) { in mga_dma_flush()
1060 DRM_INFO("-EBUSY\n"); in mga_dma_flush()
1073 drm_mga_private_t *dev_priv = (drm_mga_private_t *) dev->dev_private; in mga_dma_reset()
1081 * DMA buffer management
1090 for (i = d->granted_count; i < d->request_count; i++) { in mga_dma_get_buffers()
1093 return -EAGAIN; in mga_dma_get_buffers()
1095 buf->file_priv = file_priv; in mga_dma_get_buffers()
1097 if (copy_to_user(&d->request_indices[i], in mga_dma_get_buffers()
1098 &buf->idx, sizeof(buf->idx))) in mga_dma_get_buffers()
1099 return -EFAULT; in mga_dma_get_buffers()
1100 if (copy_to_user(&d->request_sizes[i], in mga_dma_get_buffers()
1101 &buf->total, sizeof(buf->total))) in mga_dma_get_buffers()
1102 return -EFAULT; in mga_dma_get_buffers()
1104 d->granted_count++; in mga_dma_get_buffers()
1112 struct drm_device_dma *dma = dev->dma; in mga_dma_buffers() local
1113 drm_mga_private_t *dev_priv = (drm_mga_private_t *) dev->dev_private; in mga_dma_buffers()
1121 if (d->send_count != 0) { in mga_dma_buffers()
1123 task_pid_nr(current), d->send_count); in mga_dma_buffers()
1124 return -EINVAL; in mga_dma_buffers()
1129 if (d->request_count < 0 || d->request_count > dma->buf_count) { in mga_dma_buffers()
1131 task_pid_nr(current), d->request_count, in mga_dma_buffers()
1132 dma->buf_count); in mga_dma_buffers()
1133 return -EINVAL; in mga_dma_buffers()
1138 d->granted_count = 0; in mga_dma_buffers()
1140 if (d->request_count) in mga_dma_buffers()
1151 kfree(dev->dev_private); in mga_driver_unload()
1152 dev->dev_private = NULL; in mga_driver_unload()
1165 drm_mga_private_t *dev_priv = dev->dev_private; in mga_driver_dma_quiescent()