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
392 struct pci_dev *pdev = to_pci_dev(dev->dev); in mga_driver_load()
397 * same PCI ID as the AGP G450, but have an additional PCI-to-PCI in mga_driver_load()
401 * device is 0x0021 (HB6 Universal PCI-PCI bridge), we reject the in mga_driver_load()
404 if ((pdev->device == 0x0525) && pdev->bus->self in mga_driver_load()
405 && (pdev->bus->self->vendor == 0x3388) in mga_driver_load()
406 && (pdev->bus->self->device == 0x0021) in mga_driver_load()
407 && dev->agp) { in mga_driver_load()
410 arch_phys_wc_del(dev->agp->agp_mtrr); in mga_driver_load()
411 kfree(dev->agp); in mga_driver_load()
412 dev->agp = NULL; in mga_driver_load()
416 return -ENOMEM; in mga_driver_load()
418 dev->dev_private = (void *)dev_priv; in mga_driver_load()
420 dev_priv->usec_timeout = MGA_DEFAULT_USEC_TIMEOUT; in mga_driver_load()
421 dev_priv->chipset = flags; in mga_driver_load()
425 dev_priv->mmio_base = pci_resource_start(pdev, 1); in mga_driver_load()
426 dev_priv->mmio_size = pci_resource_len(pdev, 1); in mga_driver_load()
440 * Bootstrap the driver for AGP DMA.
448 * This routine needs to set dma_bs->agp_mode to the mode actually configured
458 (drm_mga_private_t *) dev->dev_private; in mga_do_agp_dma_bootstrap()
462 const unsigned secondary_size = dma_bs->secondary_bin_count in mga_do_agp_dma_bootstrap()
463 * dma_bs->secondary_bin_size; in mga_do_agp_dma_bootstrap()
464 const unsigned agp_size = (dma_bs->agp_size << 20); in mga_do_agp_dma_bootstrap()
484 mode.mode = (info.mode & ~0x07) | dma_bs->agp_mode; in mga_do_agp_dma_bootstrap()
495 if (dev_priv->chipset == MGA_CARD_TYPE_G200) { in mga_do_agp_dma_bootstrap()
507 dev_priv->agp_size = 0; in mga_do_agp_dma_bootstrap()
509 dma_bs->agp_size); in mga_do_agp_dma_bootstrap()
513 dev_priv->agp_size = agp_size; in mga_do_agp_dma_bootstrap()
514 dev_priv->agp_handle = agp_req.handle; in mga_do_agp_dma_bootstrap()
532 _DRM_AGP, _DRM_READ_ONLY, &dev_priv->warp); in mga_do_agp_dma_bootstrap()
534 DRM_ERROR("Unable to map WARP microcode: %d\n", err); in mga_do_agp_dma_bootstrap()
539 err = drm_legacy_addmap(dev, offset, dma_bs->primary_size, in mga_do_agp_dma_bootstrap()
540 _DRM_AGP, _DRM_READ_ONLY, &dev_priv->primary); in mga_do_agp_dma_bootstrap()
542 DRM_ERROR("Unable to map primary DMA region: %d\n", err); in mga_do_agp_dma_bootstrap()
546 offset += dma_bs->primary_size; in mga_do_agp_dma_bootstrap()
548 _DRM_AGP, 0, &dev->agp_buffer_map); in mga_do_agp_dma_bootstrap()
550 DRM_ERROR("Unable to map secondary DMA region: %d\n", err); in mga_do_agp_dma_bootstrap()
555 req.count = dma_bs->secondary_bin_count; in mga_do_agp_dma_bootstrap()
556 req.size = dma_bs->secondary_bin_size; in mga_do_agp_dma_bootstrap()
562 DRM_ERROR("Unable to add secondary DMA buffers: %d\n", err); in mga_do_agp_dma_bootstrap()
570 list_for_each_entry(_entry, &dev->maplist, head) { in mga_do_agp_dma_bootstrap()
571 if (_entry->map == dev->agp_buffer_map) in mga_do_agp_dma_bootstrap()
572 agp_token = _entry->user_token; in mga_do_agp_dma_bootstrap()
575 return -EFAULT; in mga_do_agp_dma_bootstrap()
577 dev->agp_buffer_token = agp_token; in mga_do_agp_dma_bootstrap()
581 err = drm_legacy_addmap(dev, offset, agp_size - offset, in mga_do_agp_dma_bootstrap()
582 _DRM_AGP, 0, &dev_priv->agp_textures); in mga_do_agp_dma_bootstrap()
584 DRM_ERROR("Unable to map AGP texture region %d\n", err); in mga_do_agp_dma_bootstrap()
588 drm_legacy_ioremap(dev_priv->warp, dev); in mga_do_agp_dma_bootstrap()
589 drm_legacy_ioremap(dev_priv->primary, dev); in mga_do_agp_dma_bootstrap()
590 drm_legacy_ioremap(dev->agp_buffer_map, dev); in mga_do_agp_dma_bootstrap()
592 if (!dev_priv->warp->handle || in mga_do_agp_dma_bootstrap()
593 !dev_priv->primary->handle || !dev->agp_buffer_map->handle) { in mga_do_agp_dma_bootstrap()
595 dev_priv->warp->handle, dev_priv->primary->handle, in mga_do_agp_dma_bootstrap()
596 dev->agp_buffer_map->handle); in mga_do_agp_dma_bootstrap()
597 return -ENOMEM; in mga_do_agp_dma_bootstrap()
600 dev_priv->dma_access = MGA_PAGPXFER; in mga_do_agp_dma_bootstrap()
601 dev_priv->wagp_enable = MGA_WAGP_ENABLE; in mga_do_agp_dma_bootstrap()
603 DRM_INFO("Initialized card for AGP DMA.\n"); in mga_do_agp_dma_bootstrap()
610 return -EINVAL; in mga_do_agp_dma_bootstrap()
615 * Bootstrap the driver for PCI DMA.
618 * The algorithm for decreasing the size of the primary DMA buffer could be
632 (drm_mga_private_t *) dev->dev_private; in mga_do_pci_dma_bootstrap()
639 if (dev->dma == NULL) { in mga_do_pci_dma_bootstrap()
640 DRM_ERROR("dev->dma is NULL\n"); in mga_do_pci_dma_bootstrap()
641 return -EFAULT; in mga_do_pci_dma_bootstrap()
652 _DRM_READ_ONLY, &dev_priv->warp); in mga_do_pci_dma_bootstrap()
661 * alignment of the primary or secondary DMA buffers. in mga_do_pci_dma_bootstrap()
664 for (primary_size = dma_bs->primary_size; primary_size != 0; in mga_do_pci_dma_bootstrap()
668 _DRM_READ_ONLY, &dev_priv->primary); in mga_do_pci_dma_bootstrap()
674 DRM_ERROR("Unable to allocate primary DMA region: %d\n", err); in mga_do_pci_dma_bootstrap()
675 return -ENOMEM; in mga_do_pci_dma_bootstrap()
678 if (dev_priv->primary->size != dma_bs->primary_size) { in mga_do_pci_dma_bootstrap()
679 DRM_INFO("Primary DMA buffer size reduced from %u to %u.\n", in mga_do_pci_dma_bootstrap()
680 dma_bs->primary_size, in mga_do_pci_dma_bootstrap()
681 (unsigned)dev_priv->primary->size); in mga_do_pci_dma_bootstrap()
682 dma_bs->primary_size = dev_priv->primary->size; in mga_do_pci_dma_bootstrap()
685 for (bin_count = dma_bs->secondary_bin_count; bin_count > 0; in mga_do_pci_dma_bootstrap()
686 bin_count--) { in mga_do_pci_dma_bootstrap()
689 req.size = dma_bs->secondary_bin_size; in mga_do_pci_dma_bootstrap()
697 DRM_ERROR("Unable to add secondary DMA buffers: %d\n", err); in mga_do_pci_dma_bootstrap()
701 if (bin_count != dma_bs->secondary_bin_count) { in mga_do_pci_dma_bootstrap()
702 DRM_INFO("Secondary PCI DMA buffer bin count reduced from %u " in mga_do_pci_dma_bootstrap()
703 "to %u.\n", dma_bs->secondary_bin_count, bin_count); in mga_do_pci_dma_bootstrap()
705 dma_bs->secondary_bin_count = bin_count; in mga_do_pci_dma_bootstrap()
708 dev_priv->dma_access = 0; in mga_do_pci_dma_bootstrap()
709 dev_priv->wagp_enable = 0; in mga_do_pci_dma_bootstrap()
711 dma_bs->agp_mode = 0; in mga_do_pci_dma_bootstrap()
713 DRM_INFO("Initialized card for PCI DMA.\n"); in mga_do_pci_dma_bootstrap()
720 const int is_agp = (dma_bs->agp_mode != 0) && dev->agp; in mga_do_dma_bootstrap()
723 (drm_mga_private_t *) dev->dev_private; in mga_do_dma_bootstrap()
725 dev_priv->used_new_dma_init = 1; in mga_do_dma_bootstrap()
727 /* The first steps are the same for both PCI and AGP based DMA. Map in mga_do_dma_bootstrap()
728 * the cards MMIO registers and map a status page. in mga_do_dma_bootstrap()
730 err = drm_legacy_addmap(dev, dev_priv->mmio_base, dev_priv->mmio_size, in mga_do_dma_bootstrap()
732 &dev_priv->mmio); in mga_do_dma_bootstrap()
734 DRM_ERROR("Unable to map MMIO region: %d\n", err); in mga_do_dma_bootstrap()
740 &dev_priv->status); in mga_do_dma_bootstrap()
742 DRM_ERROR("Unable to map status region: %d\n", err); in mga_do_dma_bootstrap()
746 /* The DMA initialization procedure is slightly different for PCI and in mga_do_dma_bootstrap()
749 * is returned to user-mode to be used for AGP textures. in mga_do_dma_bootstrap()
754 /* If we attempted to initialize the card for AGP DMA but failed, in mga_do_dma_bootstrap()
755 * clean-up any mess that may have been created. in mga_do_dma_bootstrap()
761 /* Not only do we want to try and initialized PCI cards for PCI DMA, in mga_do_dma_bootstrap()
763 * initialized for AGP DMA. This covers the case where we have an AGP in mga_do_dma_bootstrap()
782 (drm_mga_private_t *) dev->dev_private; in mga_dma_bootstrap()
790 if (dev_priv->agp_textures != NULL) { in mga_dma_bootstrap()
791 bootstrap->texture_handle = dev_priv->agp_textures->offset; in mga_dma_bootstrap()
792 bootstrap->texture_size = dev_priv->agp_textures->size; in mga_dma_bootstrap()
794 bootstrap->texture_handle = 0; in mga_dma_bootstrap()
795 bootstrap->texture_size = 0; in mga_dma_bootstrap()
798 bootstrap->agp_mode = modes[bootstrap->agp_mode & 0x07]; in mga_dma_bootstrap()
809 dev_priv = dev->dev_private; in mga_do_init_dma()
811 if (init->sgram) in mga_do_init_dma()
812 dev_priv->clear_cmd = MGA_DWGCTL_CLEAR | MGA_ATYPE_BLK; in mga_do_init_dma()
814 dev_priv->clear_cmd = MGA_DWGCTL_CLEAR | MGA_ATYPE_RSTR; in mga_do_init_dma()
815 dev_priv->maccess = init->maccess; in mga_do_init_dma()
817 dev_priv->fb_cpp = init->fb_cpp; in mga_do_init_dma()
818 dev_priv->front_offset = init->front_offset; in mga_do_init_dma()
819 dev_priv->front_pitch = init->front_pitch; in mga_do_init_dma()
820 dev_priv->back_offset = init->back_offset; in mga_do_init_dma()
821 dev_priv->back_pitch = init->back_pitch; in mga_do_init_dma()
823 dev_priv->depth_cpp = init->depth_cpp; in mga_do_init_dma()
824 dev_priv->depth_offset = init->depth_offset; in mga_do_init_dma()
825 dev_priv->depth_pitch = init->depth_pitch; in mga_do_init_dma()
829 dev_priv->texture_offset = init->texture_offset[0]; in mga_do_init_dma()
830 dev_priv->texture_size = init->texture_size[0]; in mga_do_init_dma()
832 dev_priv->sarea = drm_legacy_getsarea(dev); in mga_do_init_dma()
833 if (!dev_priv->sarea) { in mga_do_init_dma()
835 return -EINVAL; in mga_do_init_dma()
838 if (!dev_priv->used_new_dma_init) { in mga_do_init_dma()
840 dev_priv->dma_access = MGA_PAGPXFER; in mga_do_init_dma()
841 dev_priv->wagp_enable = MGA_WAGP_ENABLE; in mga_do_init_dma()
843 dev_priv->status = drm_legacy_findmap(dev, init->status_offset); in mga_do_init_dma()
844 if (!dev_priv->status) { in mga_do_init_dma()
846 return -EINVAL; in mga_do_init_dma()
848 dev_priv->mmio = drm_legacy_findmap(dev, init->mmio_offset); in mga_do_init_dma()
849 if (!dev_priv->mmio) { in mga_do_init_dma()
851 return -EINVAL; in mga_do_init_dma()
853 dev_priv->warp = drm_legacy_findmap(dev, init->warp_offset); in mga_do_init_dma()
854 if (!dev_priv->warp) { in mga_do_init_dma()
856 return -EINVAL; in mga_do_init_dma()
858 dev_priv->primary = drm_legacy_findmap(dev, init->primary_offset); in mga_do_init_dma()
859 if (!dev_priv->primary) { in mga_do_init_dma()
860 DRM_ERROR("failed to find primary dma region!\n"); in mga_do_init_dma()
861 return -EINVAL; in mga_do_init_dma()
863 dev->agp_buffer_token = init->buffers_offset; in mga_do_init_dma()
864 dev->agp_buffer_map = in mga_do_init_dma()
865 drm_legacy_findmap(dev, init->buffers_offset); in mga_do_init_dma()
866 if (!dev->agp_buffer_map) { in mga_do_init_dma()
867 DRM_ERROR("failed to find dma buffer region!\n"); in mga_do_init_dma()
868 return -EINVAL; in mga_do_init_dma()
871 drm_legacy_ioremap(dev_priv->warp, dev); in mga_do_init_dma()
872 drm_legacy_ioremap(dev_priv->primary, dev); in mga_do_init_dma()
873 drm_legacy_ioremap(dev->agp_buffer_map, dev); in mga_do_init_dma()
876 dev_priv->sarea_priv = in mga_do_init_dma()
877 (drm_mga_sarea_t *) ((u8 *) dev_priv->sarea->handle + in mga_do_init_dma()
878 init->sarea_priv_offset); in mga_do_init_dma()
880 if (!dev_priv->warp->handle || in mga_do_init_dma()
881 !dev_priv->primary->handle || in mga_do_init_dma()
882 ((dev_priv->dma_access != 0) && in mga_do_init_dma()
883 ((dev->agp_buffer_map == NULL) || in mga_do_init_dma()
884 (dev->agp_buffer_map->handle == NULL)))) { in mga_do_init_dma()
886 return -ENOMEM; in mga_do_init_dma()
901 dev_priv->prim.status = (u32 *) dev_priv->status->handle; in mga_do_init_dma()
905 /* Init the primary DMA registers. in mga_do_init_dma()
907 MGA_WRITE(MGA_PRIMADDRESS, dev_priv->primary->offset | MGA_DMA_GENERAL); in mga_do_init_dma()
909 …MGA_WRITE(MGA_PRIMPTR, virt_to_bus((void *)dev_priv->prim.status) | MGA_PRIMPTREN0 | /* Soft trap,… in mga_do_init_dma()
913 dev_priv->prim.start = (u8 *) dev_priv->primary->handle; in mga_do_init_dma()
914 dev_priv->prim.end = ((u8 *) dev_priv->primary->handle in mga_do_init_dma()
915 + dev_priv->primary->size); in mga_do_init_dma()
916 dev_priv->prim.size = dev_priv->primary->size; in mga_do_init_dma()
918 dev_priv->prim.tail = 0; in mga_do_init_dma()
919 dev_priv->prim.space = dev_priv->prim.size; in mga_do_init_dma()
920 dev_priv->prim.wrapped = 0; in mga_do_init_dma()
922 dev_priv->prim.last_flush = 0; in mga_do_init_dma()
923 dev_priv->prim.last_wrap = 0; in mga_do_init_dma()
925 dev_priv->prim.high_mark = 256 * DMA_BLOCK_SIZE; in mga_do_init_dma()
927 dev_priv->prim.status[0] = dev_priv->primary->offset; in mga_do_init_dma()
928 dev_priv->prim.status[1] = 0; in mga_do_init_dma()
930 dev_priv->sarea_priv->last_wrap = 0; in mga_do_init_dma()
931 dev_priv->sarea_priv->last_frame.head = 0; in mga_do_init_dma()
932 dev_priv->sarea_priv->last_frame.wrap = 0; in mga_do_init_dma()
936 return -ENOMEM; in mga_do_init_dma()
951 if (dev->irq_enabled) in mga_do_cleanup_dma()
954 if (dev->dev_private) { in mga_do_cleanup_dma()
955 drm_mga_private_t *dev_priv = dev->dev_private; in mga_do_cleanup_dma()
957 if ((dev_priv->warp != NULL) in mga_do_cleanup_dma()
958 && (dev_priv->warp->type != _DRM_CONSISTENT)) in mga_do_cleanup_dma()
959 drm_legacy_ioremapfree(dev_priv->warp, dev); in mga_do_cleanup_dma()
961 if ((dev_priv->primary != NULL) in mga_do_cleanup_dma()
962 && (dev_priv->primary->type != _DRM_CONSISTENT)) in mga_do_cleanup_dma()
963 drm_legacy_ioremapfree(dev_priv->primary, dev); in mga_do_cleanup_dma()
965 if (dev->agp_buffer_map != NULL) in mga_do_cleanup_dma()
966 drm_legacy_ioremapfree(dev->agp_buffer_map, dev); in mga_do_cleanup_dma()
968 if (dev_priv->used_new_dma_init) { in mga_do_cleanup_dma()
970 if (dev_priv->agp_handle != 0) { in mga_do_cleanup_dma()
974 unbind_req.handle = dev_priv->agp_handle; in mga_do_cleanup_dma()
977 free_req.handle = dev_priv->agp_handle; in mga_do_cleanup_dma()
980 dev_priv->agp_textures = NULL; in mga_do_cleanup_dma()
981 dev_priv->agp_size = 0; in mga_do_cleanup_dma()
982 dev_priv->agp_handle = 0; in mga_do_cleanup_dma()
985 if ((dev->agp != NULL) && dev->agp->acquired) in mga_do_cleanup_dma()
990 dev_priv->warp = NULL; in mga_do_cleanup_dma()
991 dev_priv->primary = NULL; in mga_do_cleanup_dma()
992 dev_priv->sarea = NULL; in mga_do_cleanup_dma()
993 dev_priv->sarea_priv = NULL; in mga_do_cleanup_dma()
994 dev->agp_buffer_map = NULL; in mga_do_cleanup_dma()
997 dev_priv->mmio = NULL; in mga_do_cleanup_dma()
998 dev_priv->status = NULL; in mga_do_cleanup_dma()
999 dev_priv->used_new_dma_init = 0; in mga_do_cleanup_dma()
1002 memset(&dev_priv->prim, 0, sizeof(dev_priv->prim)); in mga_do_cleanup_dma()
1003 dev_priv->warp_pipe = 0; in mga_do_cleanup_dma()
1004 memset(dev_priv->warp_pipe_phys, 0, in mga_do_cleanup_dma()
1005 sizeof(dev_priv->warp_pipe_phys)); in mga_do_cleanup_dma()
1007 if (dev_priv->head != NULL) in mga_do_cleanup_dma()
1022 switch (init->func) { in mga_dma_init()
1032 return -EINVAL; in mga_dma_init()
1036 * Primary DMA stream management
1042 drm_mga_private_t *dev_priv = (drm_mga_private_t *) dev->dev_private; in mga_dma_flush()
1048 (lock->flags & _DRM_LOCK_FLUSH) ? "flush, " : "", in mga_dma_flush()
1049 (lock->flags & _DRM_LOCK_FLUSH_ALL) ? "flush all, " : "", in mga_dma_flush()
1050 (lock->flags & _DRM_LOCK_QUIESCENT) ? "idle, " : ""); in mga_dma_flush()
1054 if (lock->flags & (_DRM_LOCK_FLUSH | _DRM_LOCK_FLUSH_ALL)) in mga_dma_flush()
1057 if (lock->flags & _DRM_LOCK_QUIESCENT) { in mga_dma_flush()
1061 DRM_INFO("-EBUSY\n"); in mga_dma_flush()
1074 drm_mga_private_t *dev_priv = (drm_mga_private_t *) dev->dev_private; in mga_dma_reset()
1082 * DMA buffer management
1091 for (i = d->granted_count; i < d->request_count; i++) { in mga_dma_get_buffers()
1094 return -EAGAIN; in mga_dma_get_buffers()
1096 buf->file_priv = file_priv; in mga_dma_get_buffers()
1098 if (copy_to_user(&d->request_indices[i], in mga_dma_get_buffers()
1099 &buf->idx, sizeof(buf->idx))) in mga_dma_get_buffers()
1100 return -EFAULT; in mga_dma_get_buffers()
1101 if (copy_to_user(&d->request_sizes[i], in mga_dma_get_buffers()
1102 &buf->total, sizeof(buf->total))) in mga_dma_get_buffers()
1103 return -EFAULT; in mga_dma_get_buffers()
1105 d->granted_count++; in mga_dma_get_buffers()
1113 struct drm_device_dma *dma = dev->dma; in mga_dma_buffers() local
1114 drm_mga_private_t *dev_priv = (drm_mga_private_t *) dev->dev_private; in mga_dma_buffers()
1122 if (d->send_count != 0) { in mga_dma_buffers()
1124 task_pid_nr(current), d->send_count); in mga_dma_buffers()
1125 return -EINVAL; in mga_dma_buffers()
1130 if (d->request_count < 0 || d->request_count > dma->buf_count) { in mga_dma_buffers()
1132 task_pid_nr(current), d->request_count, in mga_dma_buffers()
1133 dma->buf_count); in mga_dma_buffers()
1134 return -EINVAL; in mga_dma_buffers()
1139 d->granted_count = 0; in mga_dma_buffers()
1141 if (d->request_count) in mga_dma_buffers()
1152 kfree(dev->dev_private); in mga_driver_unload()
1153 dev->dev_private = NULL; in mga_driver_unload()
1166 drm_mga_private_t *dev_priv = dev->dev_private; in mga_driver_dma_quiescent()