blob: 88316100389b114929d2374154bad46b5a10cf6f [file] [log] [blame]
Ben Skeggs6ee73862009-12-11 19:24:15 +10001#include "drmP.h"
2#include "drm.h"
3#include "nouveau_drv.h"
Ben Skeggsfbd28952010-09-01 15:24:34 +10004#include "nouveau_ramht.h"
Ben Skeggs6ee73862009-12-11 19:24:15 +10005
6/* returns the size of fifo context */
7static int
8nouveau_fifo_ctx_size(struct drm_device *dev)
9{
10 struct drm_nouveau_private *dev_priv = dev->dev_private;
11
12 if (dev_priv->chipset >= 0x40)
13 return 128;
14 else
15 if (dev_priv->chipset >= 0x17)
16 return 64;
17
18 return 32;
19}
20
Ben Skeggs6ee73862009-12-11 19:24:15 +100021int nv04_instmem_init(struct drm_device *dev)
22{
23 struct drm_nouveau_private *dev_priv = dev->dev_private;
Ben Skeggsfbd28952010-09-01 15:24:34 +100024 struct nouveau_gpuobj *ramht = NULL;
Ben Skeggse05c5a32010-09-01 15:24:35 +100025 u32 offset, length;
Ben Skeggsb833ac22010-06-01 15:32:24 +100026 int ret;
Ben Skeggs6ee73862009-12-11 19:24:15 +100027
Ben Skeggsfbd28952010-09-01 15:24:34 +100028 /* Setup shared RAMHT */
Ben Skeggse05c5a32010-09-01 15:24:35 +100029 ret = nouveau_gpuobj_new_fake(dev, 0x10000, ~0, 4096,
Ben Skeggsfbd28952010-09-01 15:24:34 +100030 NVOBJ_FLAG_ZERO_ALLOC, &ramht);
31 if (ret)
32 return ret;
33
34 ret = nouveau_ramht_new(dev, ramht, &dev_priv->ramht);
35 nouveau_gpuobj_ref(NULL, &ramht);
36 if (ret)
37 return ret;
38
Ben Skeggse05c5a32010-09-01 15:24:35 +100039 /* And RAMRO */
40 ret = nouveau_gpuobj_new_fake(dev, 0x11200, ~0, 512,
41 NVOBJ_FLAG_ZERO_ALLOC, &dev_priv->ramro);
42 if (ret)
43 return ret;
44
45 /* And RAMFC */
46 length = dev_priv->engine.fifo.channels * nouveau_fifo_ctx_size(dev);
47 switch (dev_priv->card_type) {
48 case NV_40:
49 offset = 0x20000;
50 break;
51 default:
52 offset = 0x11400;
53 break;
54 }
55
56 ret = nouveau_gpuobj_new_fake(dev, offset, ~0, length,
57 NVOBJ_FLAG_ZERO_ALLOC, &dev_priv->ramfc);
58 if (ret)
59 return ret;
60
61 /* Only allow space after RAMFC to be used for object allocation */
62 offset += length;
Ben Skeggs6ee73862009-12-11 19:24:15 +100063
64 /* It appears RAMRO (or something?) is controlled by 0x2220/0x2230
65 * on certain NV4x chipsets as well as RAMFC. When 0x2230 == 0
66 * ("new style" control) the upper 16-bits of 0x2220 points at this
67 * other mysterious table that's clobbering important things.
68 *
69 * We're now pointing this at RAMIN+0x30000 to avoid RAMFC getting
70 * smashed to pieces on us, so reserve 0x30000-0x40000 too..
71 */
72 if (dev_priv->card_type >= NV_40) {
73 if (offset < 0x40000)
74 offset = 0x40000;
75 }
76
Ben Skeggsb833ac22010-06-01 15:32:24 +100077 ret = drm_mm_init(&dev_priv->ramin_heap, offset,
78 dev_priv->ramin_rsvd_vram - offset);
Ben Skeggs6ee73862009-12-11 19:24:15 +100079 if (ret) {
Ben Skeggsb833ac22010-06-01 15:32:24 +100080 NV_ERROR(dev, "Failed to init RAMIN heap: %d\n", ret);
81 return ret;
Ben Skeggs6ee73862009-12-11 19:24:15 +100082 }
83
Ben Skeggs5125bfd2010-09-01 15:24:33 +100084 dev_priv->ramin_available = true;
Ben Skeggsb833ac22010-06-01 15:32:24 +100085 return 0;
Ben Skeggs6ee73862009-12-11 19:24:15 +100086}
87
88void
89nv04_instmem_takedown(struct drm_device *dev)
90{
Ben Skeggse05c5a32010-09-01 15:24:35 +100091 struct drm_nouveau_private *dev_priv = dev->dev_private;
92
93 nouveau_ramht_ref(NULL, &dev_priv->ramht, NULL);
94 nouveau_gpuobj_ref(NULL, &dev_priv->ramro);
95 nouveau_gpuobj_ref(NULL, &dev_priv->ramfc);
Ben Skeggs6ee73862009-12-11 19:24:15 +100096}
97
98int
Ben Skeggs43efc9c2010-09-01 15:24:32 +100099nv04_instmem_populate(struct drm_device *dev, struct nouveau_gpuobj *gpuobj,
100 uint32_t *sz)
Ben Skeggs6ee73862009-12-11 19:24:15 +1000101{
Ben Skeggs6ee73862009-12-11 19:24:15 +1000102 return 0;
103}
104
105void
106nv04_instmem_clear(struct drm_device *dev, struct nouveau_gpuobj *gpuobj)
107{
Ben Skeggs6ee73862009-12-11 19:24:15 +1000108}
109
110int
111nv04_instmem_bind(struct drm_device *dev, struct nouveau_gpuobj *gpuobj)
112{
Ben Skeggs6ee73862009-12-11 19:24:15 +1000113 return 0;
114}
115
116int
117nv04_instmem_unbind(struct drm_device *dev, struct nouveau_gpuobj *gpuobj)
118{
Ben Skeggs6ee73862009-12-11 19:24:15 +1000119 return 0;
120}
121
122void
Ben Skeggsf56cb862010-07-08 11:29:10 +1000123nv04_instmem_flush(struct drm_device *dev)
Ben Skeggs6ee73862009-12-11 19:24:15 +1000124{
125}
126
127int
128nv04_instmem_suspend(struct drm_device *dev)
129{
130 return 0;
131}
132
133void
134nv04_instmem_resume(struct drm_device *dev)
135{
136}
137