aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBen Skeggs <bskeggs@redhat.com>2011-01-31 19:59:07 -0500
committerBen Skeggs <bskeggs@redhat.com>2011-02-24 15:44:51 -0500
commit33f409df1ef4b1eba580a3c3f78a28aa4cd2ed0c (patch)
tree1922f81f1f45c52776fca0264fa34c3a7665e118
parent961b6e686ec73cfd2721c4e13745a8fe43e04350 (diff)
drm/nv50-nvc0: tidy evo init failure paths
Signed-off-by: Ben Skeggs <bskeggs@redhat.com>
-rw-r--r--drivers/gpu/drm/nouveau/nv50_evo.c75
1 files changed, 33 insertions, 42 deletions
diff --git a/drivers/gpu/drm/nouveau/nv50_evo.c b/drivers/gpu/drm/nouveau/nv50_evo.c
index d9c77d84f0fe..9703f759b717 100644
--- a/drivers/gpu/drm/nouveau/nv50_evo.c
+++ b/drivers/gpu/drm/nouveau/nv50_evo.c
@@ -198,6 +198,14 @@ nv50_evo_channel_fini(struct nouveau_channel *evo)
198 } 198 }
199} 199}
200 200
201static void
202nv50_evo_destroy(struct drm_device *dev)
203{
204 struct nv50_display *disp = nv50_display(dev);
205
206 nv50_evo_channel_del(&disp->master);
207}
208
201static int 209static int
202nv50_evo_create(struct drm_device *dev) 210nv50_evo_create(struct drm_device *dev)
203{ 211{
@@ -223,85 +231,69 @@ nv50_evo_create(struct drm_device *dev)
223 NVOBJ_FLAG_ZERO_ALLOC, &evo->ramin); 231 NVOBJ_FLAG_ZERO_ALLOC, &evo->ramin);
224 if (ret) { 232 if (ret) {
225 NV_ERROR(dev, "Error allocating EVO channel memory: %d\n", ret); 233 NV_ERROR(dev, "Error allocating EVO channel memory: %d\n", ret);
226 nv50_evo_channel_del(&disp->master); 234 goto err;
227 return ret;
228 } 235 }
229 236
230 ret = drm_mm_init(&evo->ramin_heap, 0, 32768); 237 ret = drm_mm_init(&evo->ramin_heap, 0, 32768);
231 if (ret) { 238 if (ret) {
232 NV_ERROR(dev, "Error initialising EVO PRAMIN heap: %d\n", ret); 239 NV_ERROR(dev, "Error initialising EVO PRAMIN heap: %d\n", ret);
233 nv50_evo_channel_del(&disp->master); 240 goto err;
234 return ret;
235 } 241 }
236 242
237 ret = nouveau_gpuobj_new(dev, evo, 4096, 16, 0, &ramht); 243 ret = nouveau_gpuobj_new(dev, evo, 4096, 16, 0, &ramht);
238 if (ret) { 244 if (ret) {
239 NV_ERROR(dev, "Unable to allocate EVO RAMHT: %d\n", ret); 245 NV_ERROR(dev, "Unable to allocate EVO RAMHT: %d\n", ret);
240 nv50_evo_channel_del(&disp->master); 246 goto err;
241 return ret;
242 } 247 }
243 248
244 ret = nouveau_ramht_new(dev, ramht, &evo->ramht); 249 ret = nouveau_ramht_new(dev, ramht, &evo->ramht);
245 nouveau_gpuobj_ref(NULL, &ramht); 250 nouveau_gpuobj_ref(NULL, &ramht);
246 if (ret) { 251 if (ret)
247 nv50_evo_channel_del(&disp->master); 252 goto err;
248 return ret;
249 }
250 253
251 /* create some default objects for the scanout memtypes we support */ 254 /* create some default objects for the scanout memtypes we support */
252 if (dev_priv->card_type >= NV_C0) { 255 if (dev_priv->card_type >= NV_C0) {
253 ret = nv50_evo_dmaobj_new(evo, 0x3d, NvEvoFB32, 0xfe, 0x19, 256 ret = nv50_evo_dmaobj_new(evo, 0x3d, NvEvoFB32, 0xfe, 0x19,
254 0, 0xffffffff, 0x00000000); 257 0, 0xffffffff, 0x00000000);
255 if (ret) { 258 if (ret)
256 nv50_evo_channel_del(&disp->master); 259 goto err;
257 return ret;
258 }
259 260
260 ret = nv50_evo_dmaobj_new(evo, 0x3d, NvEvoVRAM, 0, 0x19, 261 ret = nv50_evo_dmaobj_new(evo, 0x3d, NvEvoVRAM, 0, 0x19,
261 0, dev_priv->vram_size, 0x00020000); 262 0, dev_priv->vram_size, 0x00020000);
262 if (ret) { 263 if (ret)
263 nv50_evo_channel_del(&disp->master); 264 goto err;
264 return ret;
265 }
266 265
267 ret = nv50_evo_dmaobj_new(evo, 0x3d, NvEvoVRAM_LP, 0, 0x19, 266 ret = nv50_evo_dmaobj_new(evo, 0x3d, NvEvoVRAM_LP, 0, 0x19,
268 0, dev_priv->vram_size, 0x00000000); 267 0, dev_priv->vram_size, 0x00000000);
269 if (ret) { 268 if (ret)
270 nv50_evo_channel_del(&disp->master); 269 goto err;
271 return ret;
272 }
273 } else { 270 } else {
274 ret = nv50_evo_dmaobj_new(evo, 0x3d, NvEvoFB16, 0x70, 0x19, 271 ret = nv50_evo_dmaobj_new(evo, 0x3d, NvEvoFB16, 0x70, 0x19,
275 0, 0xffffffff, 0x00010000); 272 0, 0xffffffff, 0x00010000);
276 if (ret) { 273 if (ret)
277 nv50_evo_channel_del(&disp->master); 274 goto err;
278 return ret;
279 }
280
281 275
282 ret = nv50_evo_dmaobj_new(evo, 0x3d, NvEvoFB32, 0x7a, 0x19, 276 ret = nv50_evo_dmaobj_new(evo, 0x3d, NvEvoFB32, 0x7a, 0x19,
283 0, 0xffffffff, 0x00010000); 277 0, 0xffffffff, 0x00010000);
284 if (ret) { 278 if (ret)
285 nv50_evo_channel_del(&disp->master); 279 goto err;
286 return ret;
287 }
288 280
289 ret = nv50_evo_dmaobj_new(evo, 0x3d, NvEvoVRAM, 0, 0x19, 281 ret = nv50_evo_dmaobj_new(evo, 0x3d, NvEvoVRAM, 0, 0x19,
290 0, dev_priv->vram_size, 0x00010000); 282 0, dev_priv->vram_size, 0x00010000);
291 if (ret) { 283 if (ret)
292 nv50_evo_channel_del(&disp->master); 284 goto err;
293 return ret;
294 }
295 285
296 ret = nv50_evo_dmaobj_new(evo, 0x3d, NvEvoVRAM_LP, 0, 0x19, 286 ret = nv50_evo_dmaobj_new(evo, 0x3d, NvEvoVRAM_LP, 0, 0x19,
297 0, dev_priv->vram_size, 0x00010000); 287 0, dev_priv->vram_size, 0x00010000);
298 if (ret) { 288 if (ret)
299 nv50_evo_channel_del(&disp->master); 289 goto err;
300 return ret;
301 }
302 } 290 }
303 291
304 return 0; 292 return 0;
293
294err:
295 nv50_evo_destroy(dev);
296 return ret;
305} 297}
306 298
307int 299int
@@ -324,8 +316,7 @@ nv50_evo_fini(struct drm_device *dev)
324{ 316{
325 struct nv50_display *disp = nv50_display(dev); 317 struct nv50_display *disp = nv50_display(dev);
326 318
327 if (disp->master) { 319 if (disp->master)
328 nv50_evo_channel_fini(disp->master); 320 nv50_evo_channel_fini(disp->master);
329 nv50_evo_channel_del(&disp->master); 321 nv50_evo_destroy(dev);
330 }
331} 322}