diff options
author | Ben Skeggs <bskeggs@redhat.com> | 2011-01-31 19:59:07 -0500 |
---|---|---|
committer | Ben Skeggs <bskeggs@redhat.com> | 2011-02-24 15:44:51 -0500 |
commit | 33f409df1ef4b1eba580a3c3f78a28aa4cd2ed0c (patch) | |
tree | 1922f81f1f45c52776fca0264fa34c3a7665e118 | |
parent | 961b6e686ec73cfd2721c4e13745a8fe43e04350 (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.c | 75 |
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 | ||
201 | static void | ||
202 | nv50_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 | |||
201 | static int | 209 | static int |
202 | nv50_evo_create(struct drm_device *dev) | 210 | nv50_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 | |||
294 | err: | ||
295 | nv50_evo_destroy(dev); | ||
296 | return ret; | ||
305 | } | 297 | } |
306 | 298 | ||
307 | int | 299 | int |
@@ -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 | } |