Blame view

drivers/gpu/drm/nouveau/nouveau_dma.h 3.54 KB
6ee738610   Ben Skeggs   drm/nouveau: Add ...
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
  /*
   * Copyright (C) 2007 Ben Skeggs.
   * All Rights Reserved.
   *
   * Permission is hereby granted, free of charge, to any person obtaining
   * a copy of this software and associated documentation files (the
   * "Software"), to deal in the Software without restriction, including
   * without limitation the rights to use, copy, modify, merge, publish,
   * distribute, sublicense, and/or sell copies of the Software, and to
   * permit persons to whom the Software is furnished to do so, subject to
   * the following conditions:
   *
   * The above copyright notice and this permission notice (including the
   * next paragraph) shall be included in all copies or substantial
   * portions of the Software.
   *
   * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
   * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
   * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
   * IN NO EVENT SHALL THE COPYRIGHT OWNER(S) AND/OR ITS SUPPLIERS BE
   * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
   * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
   * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
   *
   */
  
  #ifndef __NOUVEAU_DMA_H__
  #define __NOUVEAU_DMA_H__
ebb945a94   Ben Skeggs   drm/nouveau: port...
29
30
  #include "nouveau_bo.h"
  #include "nouveau_chan.h"
6ee738610   Ben Skeggs   drm/nouveau: Add ...
31

ebb945a94   Ben Skeggs   drm/nouveau: port...
32
  int nouveau_dma_wait(struct nouveau_channel *, int slots, int size);
19ca10d82   Ben Skeggs   drm/nouveau/gem: ...
33
  void nv50_dma_push(struct nouveau_channel *, u64 addr, int length);
9a391ad8a   Ben Skeggs   drm/nv50: switch ...
34

6ee738610   Ben Skeggs   drm/nouveau: Add ...
35
36
37
38
39
40
41
42
43
44
45
  /*
   * There's a hw race condition where you can't jump to your PUT offset,
   * to avoid this we jump to offset + SKIPS and fill the difference with
   * NOPs.
   *
   * xf86-video-nv configures the DMA fetch size to 32 bytes, and uses
   * a SKIPS value of 8.  Lets assume that the race condition is to do
   * with writing into the fetch area, we configure a fetch size of 128
   * bytes so we need a larger SKIPS value.
   */
  #define NOUVEAU_DMA_SKIPS (128 / 4)
f45f55c4b   Ben Skeggs   drm/nouveau: remo...
46
  /* Object handles - for stuff that's doesn't use handle == oclass. */
6ee738610   Ben Skeggs   drm/nouveau: Add ...
47
  enum {
6ee738610   Ben Skeggs   drm/nouveau: Add ...
48
49
  	NvDmaFB		= 0x80000002,
  	NvDmaTT		= 0x80000003,
6ee738610   Ben Skeggs   drm/nouveau: Add ...
50
  	NvNotify0       = 0x80000006,
0c6c1c2fb   Francisco Jerez   drm/nouveau: Use ...
51
  	NvSema		= 0x8000000f,
cdccc70ef   Ben Skeggs   drm/nv50-nvc0: in...
52
53
  	NvEvoSema0	= 0x80000010,
  	NvEvoSema1	= 0x80000011,
6ee738610   Ben Skeggs   drm/nouveau: Add ...
54
  };
6ee738610   Ben Skeggs   drm/nouveau: Add ...
55
56
57
  static __must_check inline int
  RING_SPACE(struct nouveau_channel *chan, int size)
  {
9a391ad8a   Ben Skeggs   drm/nv50: switch ...
58
  	int ret;
6ee738610   Ben Skeggs   drm/nouveau: Add ...
59

9a391ad8a   Ben Skeggs   drm/nv50: switch ...
60
61
62
  	ret = nouveau_dma_wait(chan, 1, size);
  	if (ret)
  		return ret;
6ee738610   Ben Skeggs   drm/nouveau: Add ...
63
64
65
66
67
68
69
70
  
  	chan->dma.free -= size;
  	return 0;
  }
  
  static inline void
  OUT_RING(struct nouveau_channel *chan, int data)
  {
ebb945a94   Ben Skeggs   drm/nouveau: port...
71
  	nouveau_bo_wr32(chan->push.buffer, chan->dma.cur++, data);
6ee738610   Ben Skeggs   drm/nouveau: Add ...
72
  }
6ee738610   Ben Skeggs   drm/nouveau: Add ...
73
  #define WRITE_PUT(val) do {                                                    \
85b2331b3   Daniel Vetter   drm: Kill DRM_*ME...
74
  	mb();                                                   \
ebb945a94   Ben Skeggs   drm/nouveau: port...
75
  	nouveau_bo_rd32(chan->push.buffer, 0);                                 \
24e8375b1   Ben Skeggs   drm/nouveau: sepa...
76
  	nvif_wr32(&chan->user, chan->user_put, ((val) << 2) + chan->push.addr);\
6ee738610   Ben Skeggs   drm/nouveau: Add ...
77
78
79
80
81
  } while (0)
  
  static inline void
  FIRE_RING(struct nouveau_channel *chan)
  {
6ee738610   Ben Skeggs   drm/nouveau: Add ...
82
83
84
  	if (chan->dma.cur == chan->dma.put)
  		return;
  	chan->accel_done = true;
9a391ad8a   Ben Skeggs   drm/nv50: switch ...
85
  	if (chan->dma.ib_max) {
19ca10d82   Ben Skeggs   drm/nouveau/gem: ...
86
  		nv50_dma_push(chan, chan->push.addr + (chan->dma.put << 2),
a1606a959   Ben Skeggs   drm/nouveau: new ...
87
  			      (chan->dma.cur - chan->dma.put) << 2);
9a391ad8a   Ben Skeggs   drm/nv50: switch ...
88
89
90
  	} else {
  		WRITE_PUT(chan->dma.cur);
  	}
6ee738610   Ben Skeggs   drm/nouveau: Add ...
91
92
93
94
95
96
97
98
  	chan->dma.put = chan->dma.cur;
  }
  
  static inline void
  WIND_RING(struct nouveau_channel *chan)
  {
  	chan->dma.cur = chan->dma.put;
  }
ebb945a94   Ben Skeggs   drm/nouveau: port...
99
100
101
102
103
104
  /* NV_SW object class */
  #define NV_SW_DMA_VBLSEM                                             0x0000018c
  #define NV_SW_VBLSEM_OFFSET                                          0x00000400
  #define NV_SW_VBLSEM_RELEASE_VALUE                                   0x00000404
  #define NV_SW_VBLSEM_RELEASE                                         0x00000408
  #define NV_SW_PAGE_FLIP                                              0x00000500
6ee738610   Ben Skeggs   drm/nouveau: Add ...
105
  #endif