Deleted Added
full compact
mga_state.c (97683) mga_state.c (112015)
1/* mga_state.c -- State support for MGA G200/G400 -*- linux-c -*-
2 * Created: Thu Jan 27 02:53:43 2000 by jhartmann@precisioninsight.com
3 *
4 * Copyright 1999 Precision Insight, Inc., Cedar Park, Texas.
5 * Copyright 2000 VA Linux Systems, Inc., Sunnyvale, California.
6 * All Rights Reserved.
7 *
8 * Permission is hereby granted, free of charge, to any person obtaining a

--- 12 unchanged lines hidden (view full) ---

21 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
22 * VA LINUX SYSTEMS AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
23 * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
24 * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
25 * OTHER DEALINGS IN THE SOFTWARE.
26 *
27 * Authors:
28 * Jeff Hartmann <jhartmann@valinux.com>
1/* mga_state.c -- State support for MGA G200/G400 -*- linux-c -*-
2 * Created: Thu Jan 27 02:53:43 2000 by jhartmann@precisioninsight.com
3 *
4 * Copyright 1999 Precision Insight, Inc., Cedar Park, Texas.
5 * Copyright 2000 VA Linux Systems, Inc., Sunnyvale, California.
6 * All Rights Reserved.
7 *
8 * Permission is hereby granted, free of charge, to any person obtaining a

--- 12 unchanged lines hidden (view full) ---

21 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
22 * VA LINUX SYSTEMS AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
23 * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
24 * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
25 * OTHER DEALINGS IN THE SOFTWARE.
26 *
27 * Authors:
28 * Jeff Hartmann <jhartmann@valinux.com>
29 * Keith Whitwell <keithw@valinux.com>
29 * Keith Whitwell <keith@tungstengraphics.com>
30 *
31 * Rewritten by:
32 * Gareth Hughes <gareth@valinux.com>
33 *
30 *
31 * Rewritten by:
32 * Gareth Hughes <gareth@valinux.com>
33 *
34 * $FreeBSD: head/sys/dev/drm/mga_state.c 97683 2002-05-31 23:19:50Z anholt $
34 * $FreeBSD: head/sys/dev/drm/mga_state.c 112015 2003-03-09 02:08:30Z anholt $
35 */
36
35 */
36
37#define __NO_VERSION__
38#include "dev/drm/mga.h"
39#include "dev/drm/drmP.h"
37#include "dev/drm/mga.h"
38#include "dev/drm/drmP.h"
39#include "dev/drm/drm.h"
40#include "dev/drm/mga_drm.h"
41#include "dev/drm/mga_drv.h"
40#include "dev/drm/mga_drm.h"
41#include "dev/drm/mga_drv.h"
42#include "dev/drm/drm.h"
43
44
45/* ================================================================
46 * DMA hardware state programming functions
47 */
48
49static void mga_emit_clip_rect( drm_mga_private_t *dev_priv,
50 drm_clip_rect_t *box )

--- 110 unchanged lines hidden (view full) ---

161}
162
163static __inline__ void mga_g400_emit_tex0( drm_mga_private_t *dev_priv )
164{
165 drm_mga_sarea_t *sarea_priv = dev_priv->sarea_priv;
166 drm_mga_texture_regs_t *tex = &sarea_priv->tex_state[0];
167 DMA_LOCALS;
168
42
43
44/* ================================================================
45 * DMA hardware state programming functions
46 */
47
48static void mga_emit_clip_rect( drm_mga_private_t *dev_priv,
49 drm_clip_rect_t *box )

--- 110 unchanged lines hidden (view full) ---

160}
161
162static __inline__ void mga_g400_emit_tex0( drm_mga_private_t *dev_priv )
163{
164 drm_mga_sarea_t *sarea_priv = dev_priv->sarea_priv;
165 drm_mga_texture_regs_t *tex = &sarea_priv->tex_state[0];
166 DMA_LOCALS;
167
168/* printk("mga_g400_emit_tex0 %x %x %x\n", tex->texorg, */
169/* tex->texctl, tex->texctl2); */
170
169 BEGIN_DMA( 6 );
170
171 DMA_BLOCK( MGA_TEXCTL2, tex->texctl2 | MGA_G400_TC2_MAGIC,
172 MGA_TEXCTL, tex->texctl,
173 MGA_TEXFILTER, tex->texfilter,
174 MGA_TEXBORDERCOL, tex->texbordercol );
175
176 DMA_BLOCK( MGA_TEXORG, tex->texorg,

--- 25 unchanged lines hidden (view full) ---

202}
203
204static __inline__ void mga_g400_emit_tex1( drm_mga_private_t *dev_priv )
205{
206 drm_mga_sarea_t *sarea_priv = dev_priv->sarea_priv;
207 drm_mga_texture_regs_t *tex = &sarea_priv->tex_state[1];
208 DMA_LOCALS;
209
171 BEGIN_DMA( 6 );
172
173 DMA_BLOCK( MGA_TEXCTL2, tex->texctl2 | MGA_G400_TC2_MAGIC,
174 MGA_TEXCTL, tex->texctl,
175 MGA_TEXFILTER, tex->texfilter,
176 MGA_TEXBORDERCOL, tex->texbordercol );
177
178 DMA_BLOCK( MGA_TEXORG, tex->texorg,

--- 25 unchanged lines hidden (view full) ---

204}
205
206static __inline__ void mga_g400_emit_tex1( drm_mga_private_t *dev_priv )
207{
208 drm_mga_sarea_t *sarea_priv = dev_priv->sarea_priv;
209 drm_mga_texture_regs_t *tex = &sarea_priv->tex_state[1];
210 DMA_LOCALS;
211
212/* printk("mga_g400_emit_tex1 %x %x %x\n", tex->texorg, */
213/* tex->texctl, tex->texctl2); */
214
210 BEGIN_DMA( 5 );
211
212 DMA_BLOCK( MGA_TEXCTL2, (tex->texctl2 |
213 MGA_MAP1_ENABLE |
214 MGA_G400_TC2_MAGIC),
215 MGA_TEXCTL, tex->texctl,
216 MGA_TEXFILTER, tex->texfilter,
217 MGA_TEXBORDERCOL, tex->texbordercol );

--- 52 unchanged lines hidden (view full) ---

270}
271
272static __inline__ void mga_g400_emit_pipe( drm_mga_private_t *dev_priv )
273{
274 drm_mga_sarea_t *sarea_priv = dev_priv->sarea_priv;
275 unsigned int pipe = sarea_priv->warp_pipe;
276 DMA_LOCALS;
277
215 BEGIN_DMA( 5 );
216
217 DMA_BLOCK( MGA_TEXCTL2, (tex->texctl2 |
218 MGA_MAP1_ENABLE |
219 MGA_G400_TC2_MAGIC),
220 MGA_TEXCTL, tex->texctl,
221 MGA_TEXFILTER, tex->texfilter,
222 MGA_TEXBORDERCOL, tex->texbordercol );

--- 52 unchanged lines hidden (view full) ---

275}
276
277static __inline__ void mga_g400_emit_pipe( drm_mga_private_t *dev_priv )
278{
279 drm_mga_sarea_t *sarea_priv = dev_priv->sarea_priv;
280 unsigned int pipe = sarea_priv->warp_pipe;
281 DMA_LOCALS;
282
283/* printk("mga_g400_emit_pipe %x\n", pipe); */
284
278 BEGIN_DMA( 10 );
279
280 DMA_BLOCK( MGA_WIADDR2, MGA_WMODE_SUSPEND,
281 MGA_DMAPAD, 0x00000000,
282 MGA_DMAPAD, 0x00000000,
283 MGA_DMAPAD, 0x00000000 );
284
285 if ( pipe & MGA_T2 ) {

--- 124 unchanged lines hidden (view full) ---

410 drm_mga_context_regs_t *ctx = &sarea_priv->context_state;
411
412 if ( ctx->dstorg != dev_priv->front_offset &&
413 ctx->dstorg != dev_priv->back_offset ) {
414 DRM_ERROR( "*** bad DSTORG: %x (front %x, back %x)\n\n",
415 ctx->dstorg, dev_priv->front_offset,
416 dev_priv->back_offset );
417 ctx->dstorg = 0;
285 BEGIN_DMA( 10 );
286
287 DMA_BLOCK( MGA_WIADDR2, MGA_WMODE_SUSPEND,
288 MGA_DMAPAD, 0x00000000,
289 MGA_DMAPAD, 0x00000000,
290 MGA_DMAPAD, 0x00000000 );
291
292 if ( pipe & MGA_T2 ) {

--- 124 unchanged lines hidden (view full) ---

417 drm_mga_context_regs_t *ctx = &sarea_priv->context_state;
418
419 if ( ctx->dstorg != dev_priv->front_offset &&
420 ctx->dstorg != dev_priv->back_offset ) {
421 DRM_ERROR( "*** bad DSTORG: %x (front %x, back %x)\n\n",
422 ctx->dstorg, dev_priv->front_offset,
423 dev_priv->back_offset );
424 ctx->dstorg = 0;
418 return DRM_OS_ERR(EINVAL);
425 return DRM_ERR(EINVAL);
419 }
420
421 return 0;
422}
423
424/* Disallow texture reads from PCI space.
425 */
426static int mga_verify_tex( drm_mga_private_t *dev_priv, int unit )
427{
428 drm_mga_sarea_t *sarea_priv = dev_priv->sarea_priv;
429 drm_mga_texture_regs_t *tex = &sarea_priv->tex_state[unit];
430 unsigned int org;
431
432 org = tex->texorg & (MGA_TEXORGMAP_MASK | MGA_TEXORGACC_MASK);
433
434 if ( org == (MGA_TEXORGMAP_SYSMEM | MGA_TEXORGACC_PCI) ) {
435 DRM_ERROR( "*** bad TEXORG: 0x%x, unit %d\n",
436 tex->texorg, unit );
437 tex->texorg = 0;
426 }
427
428 return 0;
429}
430
431/* Disallow texture reads from PCI space.
432 */
433static int mga_verify_tex( drm_mga_private_t *dev_priv, int unit )
434{
435 drm_mga_sarea_t *sarea_priv = dev_priv->sarea_priv;
436 drm_mga_texture_regs_t *tex = &sarea_priv->tex_state[unit];
437 unsigned int org;
438
439 org = tex->texorg & (MGA_TEXORGMAP_MASK | MGA_TEXORGACC_MASK);
440
441 if ( org == (MGA_TEXORGMAP_SYSMEM | MGA_TEXORGACC_PCI) ) {
442 DRM_ERROR( "*** bad TEXORG: 0x%x, unit %d\n",
443 tex->texorg, unit );
444 tex->texorg = 0;
438 return DRM_OS_ERR(EINVAL);
445 return DRM_ERR(EINVAL);
439 }
440
441 return 0;
442}
443
444static int mga_verify_state( drm_mga_private_t *dev_priv )
445{
446 drm_mga_sarea_t *sarea_priv = dev_priv->sarea_priv;

--- 25 unchanged lines hidden (view full) ---

472
473static int mga_verify_iload( drm_mga_private_t *dev_priv,
474 unsigned int dstorg, unsigned int length )
475{
476 if ( dstorg < dev_priv->texture_offset ||
477 dstorg + length > (dev_priv->texture_offset +
478 dev_priv->texture_size) ) {
479 DRM_ERROR( "*** bad iload DSTORG: 0x%x\n", dstorg );
446 }
447
448 return 0;
449}
450
451static int mga_verify_state( drm_mga_private_t *dev_priv )
452{
453 drm_mga_sarea_t *sarea_priv = dev_priv->sarea_priv;

--- 25 unchanged lines hidden (view full) ---

479
480static int mga_verify_iload( drm_mga_private_t *dev_priv,
481 unsigned int dstorg, unsigned int length )
482{
483 if ( dstorg < dev_priv->texture_offset ||
484 dstorg + length > (dev_priv->texture_offset +
485 dev_priv->texture_size) ) {
486 DRM_ERROR( "*** bad iload DSTORG: 0x%x\n", dstorg );
480 return DRM_OS_ERR(EINVAL);
487 return DRM_ERR(EINVAL);
481 }
482
483 if ( length & MGA_ILOAD_MASK ) {
484 DRM_ERROR( "*** bad iload length: 0x%x\n",
485 length & MGA_ILOAD_MASK );
488 }
489
490 if ( length & MGA_ILOAD_MASK ) {
491 DRM_ERROR( "*** bad iload length: 0x%x\n",
492 length & MGA_ILOAD_MASK );
486 return DRM_OS_ERR(EINVAL);
493 return DRM_ERR(EINVAL);
487 }
488
489 return 0;
490}
491
492static int mga_verify_blit( drm_mga_private_t *dev_priv,
493 unsigned int srcorg, unsigned int dstorg )
494{
495 if ( (srcorg & 0x3) == (MGA_SRCACC_PCI | MGA_SRCMAP_SYSMEM) ||
496 (dstorg & 0x3) == (MGA_SRCACC_PCI | MGA_SRCMAP_SYSMEM) ) {
497 DRM_ERROR( "*** bad blit: src=0x%x dst=0x%x\n",
498 srcorg, dstorg );
494 }
495
496 return 0;
497}
498
499static int mga_verify_blit( drm_mga_private_t *dev_priv,
500 unsigned int srcorg, unsigned int dstorg )
501{
502 if ( (srcorg & 0x3) == (MGA_SRCACC_PCI | MGA_SRCMAP_SYSMEM) ||
503 (dstorg & 0x3) == (MGA_SRCACC_PCI | MGA_SRCMAP_SYSMEM) ) {
504 DRM_ERROR( "*** bad blit: src=0x%x dst=0x%x\n",
505 srcorg, dstorg );
499 return DRM_OS_ERR(EINVAL);
506 return DRM_ERR(EINVAL);
500 }
501 return 0;
502}
503
504
505/* ================================================================
506 *
507 */
508
509static void mga_dma_dispatch_clear( drm_device_t *dev,
510 drm_mga_clear_t *clear )
511{
512 drm_mga_private_t *dev_priv = dev->dev_private;
513 drm_mga_sarea_t *sarea_priv = dev_priv->sarea_priv;
514 drm_mga_context_regs_t *ctx = &sarea_priv->context_state;
515 drm_clip_rect_t *pbox = sarea_priv->boxes;
516 int nbox = sarea_priv->nbox;
517 int i;
518 DMA_LOCALS;
507 }
508 return 0;
509}
510
511
512/* ================================================================
513 *
514 */
515
516static void mga_dma_dispatch_clear( drm_device_t *dev,
517 drm_mga_clear_t *clear )
518{
519 drm_mga_private_t *dev_priv = dev->dev_private;
520 drm_mga_sarea_t *sarea_priv = dev_priv->sarea_priv;
521 drm_mga_context_regs_t *ctx = &sarea_priv->context_state;
522 drm_clip_rect_t *pbox = sarea_priv->boxes;
523 int nbox = sarea_priv->nbox;
524 int i;
525 DMA_LOCALS;
519 DRM_DEBUG( "%s:\n", __func__ );
526 DRM_DEBUG( "\n" );
520
521 BEGIN_DMA( 1 );
522
523 DMA_BLOCK( MGA_DMAPAD, 0x00000000,
524 MGA_DMAPAD, 0x00000000,
525 MGA_DWGSYNC, 0x00007100,
526 MGA_DWGSYNC, 0x00007000 );
527

--- 77 unchanged lines hidden (view full) ---

605{
606 drm_mga_private_t *dev_priv = dev->dev_private;
607 drm_mga_sarea_t *sarea_priv = dev_priv->sarea_priv;
608 drm_mga_context_regs_t *ctx = &sarea_priv->context_state;
609 drm_clip_rect_t *pbox = sarea_priv->boxes;
610 int nbox = sarea_priv->nbox;
611 int i;
612 DMA_LOCALS;
527
528 BEGIN_DMA( 1 );
529
530 DMA_BLOCK( MGA_DMAPAD, 0x00000000,
531 MGA_DMAPAD, 0x00000000,
532 MGA_DWGSYNC, 0x00007100,
533 MGA_DWGSYNC, 0x00007000 );
534

--- 77 unchanged lines hidden (view full) ---

612{
613 drm_mga_private_t *dev_priv = dev->dev_private;
614 drm_mga_sarea_t *sarea_priv = dev_priv->sarea_priv;
615 drm_mga_context_regs_t *ctx = &sarea_priv->context_state;
616 drm_clip_rect_t *pbox = sarea_priv->boxes;
617 int nbox = sarea_priv->nbox;
618 int i;
619 DMA_LOCALS;
613 DRM_DEBUG( "%s:\n", __func__ );
620 DRM_DEBUG( "\n" );
614
615 sarea_priv->last_frame.head = dev_priv->prim.tail;
616 sarea_priv->last_frame.wrap = dev_priv->prim.last_wrap;
617
618 BEGIN_DMA( 4 + nbox );
619
620 DMA_BLOCK( MGA_DMAPAD, 0x00000000,
621 MGA_DMAPAD, 0x00000000,

--- 29 unchanged lines hidden (view full) ---

651 MGA_PLNWT, ctx->plnwt,
652 MGA_SRCORG, dev_priv->front_offset,
653 MGA_DWGCTL, ctx->dwgctl );
654
655 ADVANCE_DMA();
656
657 FLUSH_DMA();
658
621
622 sarea_priv->last_frame.head = dev_priv->prim.tail;
623 sarea_priv->last_frame.wrap = dev_priv->prim.last_wrap;
624
625 BEGIN_DMA( 4 + nbox );
626
627 DMA_BLOCK( MGA_DMAPAD, 0x00000000,
628 MGA_DMAPAD, 0x00000000,

--- 29 unchanged lines hidden (view full) ---

658 MGA_PLNWT, ctx->plnwt,
659 MGA_SRCORG, dev_priv->front_offset,
660 MGA_DWGCTL, ctx->dwgctl );
661
662 ADVANCE_DMA();
663
664 FLUSH_DMA();
665
659 DRM_DEBUG( "%s... done.\n", __func__ );
666 DRM_DEBUG( "%s... done.\n", __FUNCTION__ );
660}
661
662static void mga_dma_dispatch_vertex( drm_device_t *dev, drm_buf_t *buf )
663{
664 drm_mga_private_t *dev_priv = dev->dev_private;
665 drm_mga_buf_priv_t *buf_priv = buf->dev_private;
666 drm_mga_sarea_t *sarea_priv = dev_priv->sarea_priv;
667 u32 address = (u32) buf->bus_address;

--- 91 unchanged lines hidden (view full) ---

759 unsigned int dstorg, unsigned int length )
760{
761 drm_mga_private_t *dev_priv = dev->dev_private;
762 drm_mga_buf_priv_t *buf_priv = buf->dev_private;
763 drm_mga_context_regs_t *ctx = &dev_priv->sarea_priv->context_state;
764 u32 srcorg = buf->bus_address | MGA_SRCACC_AGP | MGA_SRCMAP_SYSMEM;
765 u32 y2;
766 DMA_LOCALS;
667}
668
669static void mga_dma_dispatch_vertex( drm_device_t *dev, drm_buf_t *buf )
670{
671 drm_mga_private_t *dev_priv = dev->dev_private;
672 drm_mga_buf_priv_t *buf_priv = buf->dev_private;
673 drm_mga_sarea_t *sarea_priv = dev_priv->sarea_priv;
674 u32 address = (u32) buf->bus_address;

--- 91 unchanged lines hidden (view full) ---

766 unsigned int dstorg, unsigned int length )
767{
768 drm_mga_private_t *dev_priv = dev->dev_private;
769 drm_mga_buf_priv_t *buf_priv = buf->dev_private;
770 drm_mga_context_regs_t *ctx = &dev_priv->sarea_priv->context_state;
771 u32 srcorg = buf->bus_address | MGA_SRCACC_AGP | MGA_SRCMAP_SYSMEM;
772 u32 y2;
773 DMA_LOCALS;
767 DRM_DEBUG( "%s: buf=%d used=%d\n",
768 __func__, buf->idx, buf->used );
774 DRM_DEBUG( "buf=%d used=%d\n", buf->idx, buf->used );
769
770 y2 = length / 64;
771
772 BEGIN_DMA( 5 );
773
774 DMA_BLOCK( MGA_DMAPAD, 0x00000000,
775 MGA_DMAPAD, 0x00000000,
776 MGA_DWGSYNC, 0x00007100,

--- 37 unchanged lines hidden (view full) ---

814{
815 drm_mga_private_t *dev_priv = dev->dev_private;
816 drm_mga_sarea_t *sarea_priv = dev_priv->sarea_priv;
817 drm_mga_context_regs_t *ctx = &sarea_priv->context_state;
818 drm_clip_rect_t *pbox = sarea_priv->boxes;
819 int nbox = sarea_priv->nbox;
820 u32 scandir = 0, i;
821 DMA_LOCALS;
775
776 y2 = length / 64;
777
778 BEGIN_DMA( 5 );
779
780 DMA_BLOCK( MGA_DMAPAD, 0x00000000,
781 MGA_DMAPAD, 0x00000000,
782 MGA_DWGSYNC, 0x00007100,

--- 37 unchanged lines hidden (view full) ---

820{
821 drm_mga_private_t *dev_priv = dev->dev_private;
822 drm_mga_sarea_t *sarea_priv = dev_priv->sarea_priv;
823 drm_mga_context_regs_t *ctx = &sarea_priv->context_state;
824 drm_clip_rect_t *pbox = sarea_priv->boxes;
825 int nbox = sarea_priv->nbox;
826 u32 scandir = 0, i;
827 DMA_LOCALS;
822 DRM_DEBUG( "%s:\n", __func__ );
828 DRM_DEBUG( "\n" );
823
824 BEGIN_DMA( 4 + nbox );
825
826 DMA_BLOCK( MGA_DMAPAD, 0x00000000,
827 MGA_DMAPAD, 0x00000000,
828 MGA_DWGSYNC, 0x00007100,
829 MGA_DWGSYNC, 0x00007000 );
830

--- 40 unchanged lines hidden (view full) ---

871 ADVANCE_DMA();
872}
873
874
875/* ================================================================
876 *
877 */
878
829
830 BEGIN_DMA( 4 + nbox );
831
832 DMA_BLOCK( MGA_DMAPAD, 0x00000000,
833 MGA_DMAPAD, 0x00000000,
834 MGA_DWGSYNC, 0x00007100,
835 MGA_DWGSYNC, 0x00007000 );
836

--- 40 unchanged lines hidden (view full) ---

877 ADVANCE_DMA();
878}
879
880
881/* ================================================================
882 *
883 */
884
879int mga_dma_clear( DRM_OS_IOCTL )
885int mga_dma_clear( DRM_IOCTL_ARGS )
880{
886{
881 DRM_OS_DEVICE;
887 DRM_DEVICE;
882 drm_mga_private_t *dev_priv = dev->dev_private;
883 drm_mga_sarea_t *sarea_priv = dev_priv->sarea_priv;
884 drm_mga_clear_t clear;
885
886 LOCK_TEST_WITH_RETURN( dev );
887
888 drm_mga_private_t *dev_priv = dev->dev_private;
889 drm_mga_sarea_t *sarea_priv = dev_priv->sarea_priv;
890 drm_mga_clear_t clear;
891
892 LOCK_TEST_WITH_RETURN( dev );
893
888 DRM_OS_KRNFROMUSR( clear, (drm_mga_clear_t *) data, sizeof(clear) );
894 DRM_COPY_FROM_USER_IOCTL( clear, (drm_mga_clear_t *)data, sizeof(clear) );
889
890 if ( sarea_priv->nbox > MGA_NR_SAREA_CLIPRECTS )
891 sarea_priv->nbox = MGA_NR_SAREA_CLIPRECTS;
892
893 WRAP_TEST_WITH_RETURN( dev_priv );
894
895 mga_dma_dispatch_clear( dev, &clear );
896
897 /* Make sure we restore the 3D state next time.
898 */
899 dev_priv->sarea_priv->dirty |= MGA_UPLOAD_CONTEXT;
900
901 return 0;
902}
903
895
896 if ( sarea_priv->nbox > MGA_NR_SAREA_CLIPRECTS )
897 sarea_priv->nbox = MGA_NR_SAREA_CLIPRECTS;
898
899 WRAP_TEST_WITH_RETURN( dev_priv );
900
901 mga_dma_dispatch_clear( dev, &clear );
902
903 /* Make sure we restore the 3D state next time.
904 */
905 dev_priv->sarea_priv->dirty |= MGA_UPLOAD_CONTEXT;
906
907 return 0;
908}
909
904int mga_dma_swap( DRM_OS_IOCTL )
910int mga_dma_swap( DRM_IOCTL_ARGS )
905{
911{
906 DRM_OS_DEVICE;
912 DRM_DEVICE;
907 drm_mga_private_t *dev_priv = dev->dev_private;
908 drm_mga_sarea_t *sarea_priv = dev_priv->sarea_priv;
909
910 LOCK_TEST_WITH_RETURN( dev );
911
912 if ( sarea_priv->nbox > MGA_NR_SAREA_CLIPRECTS )
913 sarea_priv->nbox = MGA_NR_SAREA_CLIPRECTS;
914
915 WRAP_TEST_WITH_RETURN( dev_priv );
916
917 mga_dma_dispatch_swap( dev );
918
919 /* Make sure we restore the 3D state next time.
920 */
921 dev_priv->sarea_priv->dirty |= MGA_UPLOAD_CONTEXT;
922
923 return 0;
924}
925
913 drm_mga_private_t *dev_priv = dev->dev_private;
914 drm_mga_sarea_t *sarea_priv = dev_priv->sarea_priv;
915
916 LOCK_TEST_WITH_RETURN( dev );
917
918 if ( sarea_priv->nbox > MGA_NR_SAREA_CLIPRECTS )
919 sarea_priv->nbox = MGA_NR_SAREA_CLIPRECTS;
920
921 WRAP_TEST_WITH_RETURN( dev_priv );
922
923 mga_dma_dispatch_swap( dev );
924
925 /* Make sure we restore the 3D state next time.
926 */
927 dev_priv->sarea_priv->dirty |= MGA_UPLOAD_CONTEXT;
928
929 return 0;
930}
931
926int mga_dma_vertex( DRM_OS_IOCTL )
932int mga_dma_vertex( DRM_IOCTL_ARGS )
927{
933{
928 DRM_OS_DEVICE;
934 DRM_DEVICE;
929 drm_mga_private_t *dev_priv = dev->dev_private;
930 drm_device_dma_t *dma = dev->dma;
931 drm_buf_t *buf;
932 drm_mga_buf_priv_t *buf_priv;
933 drm_mga_vertex_t vertex;
934
935 LOCK_TEST_WITH_RETURN( dev );
936
935 drm_mga_private_t *dev_priv = dev->dev_private;
936 drm_device_dma_t *dma = dev->dma;
937 drm_buf_t *buf;
938 drm_mga_buf_priv_t *buf_priv;
939 drm_mga_vertex_t vertex;
940
941 LOCK_TEST_WITH_RETURN( dev );
942
937 DRM_OS_KRNFROMUSR( vertex, (drm_mga_vertex_t *) data, sizeof(vertex) );
943 DRM_COPY_FROM_USER_IOCTL( vertex,
944 (drm_mga_vertex_t *)data,
945 sizeof(vertex) );
938
946
939 if(vertex.idx < 0 || vertex.idx > dma->buf_count) return DRM_OS_ERR(EINVAL);
947 if(vertex.idx < 0 || vertex.idx > dma->buf_count) return DRM_ERR(EINVAL);
940 buf = dma->buflist[vertex.idx];
941 buf_priv = buf->dev_private;
942
943 buf->used = vertex.used;
944 buf_priv->discard = vertex.discard;
945
946 if ( !mga_verify_state( dev_priv ) ) {
947 if ( vertex.discard ) {
948 if ( buf_priv->dispatched == 1 )
949 AGE_BUFFER( buf_priv );
950 buf_priv->dispatched = 0;
951 mga_freelist_put( dev, buf );
952 }
948 buf = dma->buflist[vertex.idx];
949 buf_priv = buf->dev_private;
950
951 buf->used = vertex.used;
952 buf_priv->discard = vertex.discard;
953
954 if ( !mga_verify_state( dev_priv ) ) {
955 if ( vertex.discard ) {
956 if ( buf_priv->dispatched == 1 )
957 AGE_BUFFER( buf_priv );
958 buf_priv->dispatched = 0;
959 mga_freelist_put( dev, buf );
960 }
953 return DRM_OS_ERR(EINVAL);
961 return DRM_ERR(EINVAL);
954 }
955
956 WRAP_TEST_WITH_RETURN( dev_priv );
957
958 mga_dma_dispatch_vertex( dev, buf );
959
960 return 0;
961}
962
962 }
963
964 WRAP_TEST_WITH_RETURN( dev_priv );
965
966 mga_dma_dispatch_vertex( dev, buf );
967
968 return 0;
969}
970
963int mga_dma_indices( DRM_OS_IOCTL )
971int mga_dma_indices( DRM_IOCTL_ARGS )
964{
972{
965 DRM_OS_DEVICE;
973 DRM_DEVICE;
966 drm_mga_private_t *dev_priv = dev->dev_private;
967 drm_device_dma_t *dma = dev->dma;
968 drm_buf_t *buf;
969 drm_mga_buf_priv_t *buf_priv;
970 drm_mga_indices_t indices;
971
972 LOCK_TEST_WITH_RETURN( dev );
973
974 drm_mga_private_t *dev_priv = dev->dev_private;
975 drm_device_dma_t *dma = dev->dma;
976 drm_buf_t *buf;
977 drm_mga_buf_priv_t *buf_priv;
978 drm_mga_indices_t indices;
979
980 LOCK_TEST_WITH_RETURN( dev );
981
974 DRM_OS_KRNFROMUSR( indices, (drm_mga_indices_t *) data, sizeof(indices) );
982 DRM_COPY_FROM_USER_IOCTL( indices,
983 (drm_mga_indices_t *)data,
984 sizeof(indices) );
975
985
976 if(indices.idx < 0 || indices.idx > dma->buf_count) return DRM_OS_ERR(EINVAL);
986 if(indices.idx < 0 || indices.idx > dma->buf_count) return DRM_ERR(EINVAL);
977
978 buf = dma->buflist[indices.idx];
979 buf_priv = buf->dev_private;
980
981 buf_priv->discard = indices.discard;
982
983 if ( !mga_verify_state( dev_priv ) ) {
984 if ( indices.discard ) {
985 if ( buf_priv->dispatched == 1 )
986 AGE_BUFFER( buf_priv );
987 buf_priv->dispatched = 0;
988 mga_freelist_put( dev, buf );
989 }
987
988 buf = dma->buflist[indices.idx];
989 buf_priv = buf->dev_private;
990
991 buf_priv->discard = indices.discard;
992
993 if ( !mga_verify_state( dev_priv ) ) {
994 if ( indices.discard ) {
995 if ( buf_priv->dispatched == 1 )
996 AGE_BUFFER( buf_priv );
997 buf_priv->dispatched = 0;
998 mga_freelist_put( dev, buf );
999 }
990 return DRM_OS_ERR(EINVAL);
1000 return DRM_ERR(EINVAL);
991 }
992
993 WRAP_TEST_WITH_RETURN( dev_priv );
994
995 mga_dma_dispatch_indices( dev, buf, indices.start, indices.end );
996
997 return 0;
998}
999
1001 }
1002
1003 WRAP_TEST_WITH_RETURN( dev_priv );
1004
1005 mga_dma_dispatch_indices( dev, buf, indices.start, indices.end );
1006
1007 return 0;
1008}
1009
1000int mga_dma_iload( DRM_OS_IOCTL )
1010int mga_dma_iload( DRM_IOCTL_ARGS )
1001{
1011{
1002 DRM_OS_DEVICE;
1012 DRM_DEVICE;
1003 drm_device_dma_t *dma = dev->dma;
1004 drm_mga_private_t *dev_priv = dev->dev_private;
1005 drm_buf_t *buf;
1006 drm_mga_buf_priv_t *buf_priv;
1007 drm_mga_iload_t iload;
1013 drm_device_dma_t *dma = dev->dma;
1014 drm_mga_private_t *dev_priv = dev->dev_private;
1015 drm_buf_t *buf;
1016 drm_mga_buf_priv_t *buf_priv;
1017 drm_mga_iload_t iload;
1008 DRM_DEBUG( "%s:\n", __func__ );
1018 DRM_DEBUG( "\n" );
1009
1010 LOCK_TEST_WITH_RETURN( dev );
1011
1019
1020 LOCK_TEST_WITH_RETURN( dev );
1021
1012 DRM_OS_KRNFROMUSR( iload, (drm_mga_iload_t *) data, sizeof(iload) );
1022 DRM_COPY_FROM_USER_IOCTL( iload, (drm_mga_iload_t *)data, sizeof(iload) );
1013
1014#if 0
1023
1024#if 0
1015 if ( mga_do_wait_for_idle( dev_priv ) ) {
1025 if ( mga_do_wait_for_idle( dev_priv ) < 0 ) {
1016 if ( MGA_DMA_DEBUG )
1026 if ( MGA_DMA_DEBUG )
1017 DRM_INFO( "%s: -EBUSY\n", __func__ );
1018 return DRM_OS_ERR(EBUSY);
1027 DRM_INFO( "%s: -EBUSY\n", __FUNCTION__ );
1028 return DRM_ERR(EBUSY);
1019 }
1020#endif
1029 }
1030#endif
1021 if(iload.idx < 0 || iload.idx > dma->buf_count) return DRM_OS_ERR(EINVAL);
1031 if(iload.idx < 0 || iload.idx > dma->buf_count) return DRM_ERR(EINVAL);
1022
1023 buf = dma->buflist[iload.idx];
1024 buf_priv = buf->dev_private;
1025
1026 if ( mga_verify_iload( dev_priv, iload.dstorg, iload.length ) ) {
1027 mga_freelist_put( dev, buf );
1032
1033 buf = dma->buflist[iload.idx];
1034 buf_priv = buf->dev_private;
1035
1036 if ( mga_verify_iload( dev_priv, iload.dstorg, iload.length ) ) {
1037 mga_freelist_put( dev, buf );
1028 return DRM_OS_ERR(EINVAL);
1038 return DRM_ERR(EINVAL);
1029 }
1030
1031 WRAP_TEST_WITH_RETURN( dev_priv );
1032
1033 mga_dma_dispatch_iload( dev, buf, iload.dstorg, iload.length );
1034
1035 /* Make sure we restore the 3D state next time.
1036 */
1037 dev_priv->sarea_priv->dirty |= MGA_UPLOAD_CONTEXT;
1038
1039 return 0;
1040}
1041
1039 }
1040
1041 WRAP_TEST_WITH_RETURN( dev_priv );
1042
1043 mga_dma_dispatch_iload( dev, buf, iload.dstorg, iload.length );
1044
1045 /* Make sure we restore the 3D state next time.
1046 */
1047 dev_priv->sarea_priv->dirty |= MGA_UPLOAD_CONTEXT;
1048
1049 return 0;
1050}
1051
1042int mga_dma_blit( DRM_OS_IOCTL )
1052int mga_dma_blit( DRM_IOCTL_ARGS )
1043{
1053{
1044 DRM_OS_DEVICE;
1054 DRM_DEVICE;
1045 drm_mga_private_t *dev_priv = dev->dev_private;
1046 drm_mga_sarea_t *sarea_priv = dev_priv->sarea_priv;
1047 drm_mga_blit_t blit;
1055 drm_mga_private_t *dev_priv = dev->dev_private;
1056 drm_mga_sarea_t *sarea_priv = dev_priv->sarea_priv;
1057 drm_mga_blit_t blit;
1048 DRM_DEBUG( "%s:\n", __func__ );
1058 DRM_DEBUG( "\n" );
1049
1050 LOCK_TEST_WITH_RETURN( dev );
1051
1059
1060 LOCK_TEST_WITH_RETURN( dev );
1061
1052 DRM_OS_KRNFROMUSR( blit, (drm_mga_blit_t *) data, sizeof(blit) );
1062 DRM_COPY_FROM_USER_IOCTL( blit, (drm_mga_blit_t *)data, sizeof(blit) );
1053
1054 if ( sarea_priv->nbox > MGA_NR_SAREA_CLIPRECTS )
1055 sarea_priv->nbox = MGA_NR_SAREA_CLIPRECTS;
1056
1057 if ( mga_verify_blit( dev_priv, blit.srcorg, blit.dstorg ) )
1063
1064 if ( sarea_priv->nbox > MGA_NR_SAREA_CLIPRECTS )
1065 sarea_priv->nbox = MGA_NR_SAREA_CLIPRECTS;
1066
1067 if ( mga_verify_blit( dev_priv, blit.srcorg, blit.dstorg ) )
1058 return DRM_OS_ERR(EINVAL);
1068 return DRM_ERR(EINVAL);
1059
1060 WRAP_TEST_WITH_RETURN( dev_priv );
1061
1062 mga_dma_dispatch_blit( dev, &blit );
1063
1064 /* Make sure we restore the 3D state next time.
1065 */
1066 dev_priv->sarea_priv->dirty |= MGA_UPLOAD_CONTEXT;
1067
1068 return 0;
1069}
1069
1070 WRAP_TEST_WITH_RETURN( dev_priv );
1071
1072 mga_dma_dispatch_blit( dev, &blit );
1073
1074 /* Make sure we restore the 3D state next time.
1075 */
1076 dev_priv->sarea_priv->dirty |= MGA_UPLOAD_CONTEXT;
1077
1078 return 0;
1079}
1080
1081int mga_getparam( DRM_IOCTL_ARGS )
1082{
1083 DRM_DEVICE;
1084 drm_mga_private_t *dev_priv = dev->dev_private;
1085 drm_mga_getparam_t param;
1086 int value;
1087
1088 if ( !dev_priv ) {
1089 DRM_ERROR( "%s called with no initialization\n", __FUNCTION__ );
1090 return DRM_ERR(EINVAL);
1091 }
1092
1093 DRM_COPY_FROM_USER_IOCTL( param, (drm_mga_getparam_t *)data,
1094 sizeof(param) );
1095
1096 DRM_DEBUG( "pid=%d\n", DRM_CURRENTPID );
1097
1098 switch( param.param ) {
1099 case MGA_PARAM_IRQ_NR:
1100 value = dev->irq;
1101 break;
1102 default:
1103 return DRM_ERR(EINVAL);
1104 }
1105
1106 if ( DRM_COPY_TO_USER( param.value, &value, sizeof(int) ) ) {
1107 DRM_ERROR( "copy_to_user\n" );
1108 return DRM_ERR(EFAULT);
1109 }
1110
1111 return 0;
1112}