Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

drm/fb-helper: Propagate errors from initial config failure

Make drm_fb_helper_initial_config() return an int rather than a bool so
that the error can be properly propagated. While at it, update drivers
to propagate errors further rather than just ignore them.

v2:
- cirrus: No cleanup is required, the top-level cirrus_driver_load()
will do it as part of cirrus_driver_unload() in its cleanup path.
Reported-by: Fengguang Wu <fengguang.wu@intel.com>

Cc: David Airlie <airlied@linux.ie>
Cc: Daniel Vetter <daniel.vetter@ffwll.ch>
Cc: Patrik Jakobsson <patrik.r.jakobsson@gmail.com>
Cc: Rob Clark <robdclark@gmail.com>
Cc: Tomi Valkeinen <tomi.valkeinen@ti.com>
Cc: Alex Deucher <alexander.deucher@amd.com>
Cc: Christian König <christian.koenig@amd.com>
Cc: Ben Skeggs <bskeggs@redhat.com>
Signed-off-by: Thierry Reding <treding@nvidia.com>
Reviewed-by: Alex Deucher <alexander.deucher@amd.com>
Reviewed-by: Patrik Jakobsson <patrik.r.jakobsson@gmail.com>
Reviewed-by: Christian König <christian.koenig@amd.com>
[danvet: Squash in simplification patch from kbuild.]
Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch>

authored by

Thierry Reding and committed by
Daniel Vetter
01934c2a 7119ad5f

+140 -51
+15 -6
drivers/gpu/drm/ast/ast_fb.c
··· 335 335 336 336 ret = drm_fb_helper_init(dev, &afbdev->helper, 337 337 1, 1); 338 - if (ret) { 339 - kfree(afbdev); 340 - return ret; 341 - } 338 + if (ret) 339 + goto free; 342 340 343 - drm_fb_helper_single_add_all_connectors(&afbdev->helper); 341 + ret = drm_fb_helper_single_add_all_connectors(&afbdev->helper); 342 + if (ret) 343 + goto fini; 344 344 345 345 /* disable all the possible outputs/crtcs before entering KMS mode */ 346 346 drm_helper_disable_unused_functions(dev); 347 347 348 - drm_fb_helper_initial_config(&afbdev->helper, 32); 348 + ret = drm_fb_helper_initial_config(&afbdev->helper, 32); 349 + if (ret) 350 + goto fini; 351 + 349 352 return 0; 353 + 354 + fini: 355 + drm_fb_helper_fini(&afbdev->helper); 356 + free: 357 + kfree(afbdev); 358 + return ret; 350 359 } 351 360 352 361 void ast_fbdev_fini(struct drm_device *dev)
+12 -2
drivers/gpu/drm/bochs/bochs_fbdev.c
··· 207 207 if (ret) 208 208 return ret; 209 209 210 - drm_fb_helper_single_add_all_connectors(&bochs->fb.helper); 210 + ret = drm_fb_helper_single_add_all_connectors(&bochs->fb.helper); 211 + if (ret) 212 + goto fini; 213 + 211 214 drm_helper_disable_unused_functions(bochs->dev); 212 - drm_fb_helper_initial_config(&bochs->fb.helper, 32); 215 + 216 + ret = drm_fb_helper_initial_config(&bochs->fb.helper, 32); 217 + if (ret) 218 + goto fini; 213 219 214 220 bochs->fb.initialized = true; 215 221 return 0; 222 + 223 + fini: 224 + drm_fb_helper_fini(&bochs->fb.helper); 225 + return ret; 216 226 } 217 227 218 228 void bochs_fbdev_fini(struct bochs_device *bochs)
+6 -6
drivers/gpu/drm/cirrus/cirrus_fbdev.c
··· 317 317 318 318 ret = drm_fb_helper_init(cdev->dev, &gfbdev->helper, 319 319 cdev->num_crtc, CIRRUSFB_CONN_LIMIT); 320 - if (ret) { 321 - kfree(gfbdev); 320 + if (ret) 322 321 return ret; 323 - } 324 - drm_fb_helper_single_add_all_connectors(&gfbdev->helper); 322 + 323 + ret = drm_fb_helper_single_add_all_connectors(&gfbdev->helper); 324 + if (ret) 325 + return ret; 325 326 326 327 /* disable all the possible outputs/crtcs before entering KMS mode */ 327 328 drm_helper_disable_unused_functions(cdev->dev); 328 - drm_fb_helper_initial_config(&gfbdev->helper, bpp_sel); 329 329 330 - return 0; 330 + return drm_fb_helper_initial_config(&gfbdev->helper, bpp_sel); 331 331 } 332 332 333 333 void cirrus_fbdev_fini(struct cirrus_device *cdev)
+1 -1
drivers/gpu/drm/drm_fb_helper.c
··· 1688 1688 * RETURNS: 1689 1689 * Zero if everything went ok, nonzero otherwise. 1690 1690 */ 1691 - bool drm_fb_helper_initial_config(struct drm_fb_helper *fb_helper, int bpp_sel) 1691 + int drm_fb_helper_initial_config(struct drm_fb_helper *fb_helper, int bpp_sel) 1692 1692 { 1693 1693 struct drm_device *dev = fb_helper->dev; 1694 1694 int count = 0;
+18 -4
drivers/gpu/drm/gma500/framebuffer.c
··· 593 593 { 594 594 struct psb_fbdev *fbdev; 595 595 struct drm_psb_private *dev_priv = dev->dev_private; 596 + int ret; 596 597 597 598 fbdev = kzalloc(sizeof(struct psb_fbdev), GFP_KERNEL); 598 599 if (!fbdev) { ··· 605 604 606 605 drm_fb_helper_prepare(dev, &fbdev->psb_fb_helper, &psb_fb_helper_funcs); 607 606 608 - drm_fb_helper_init(dev, &fbdev->psb_fb_helper, dev_priv->ops->crtcs, 609 - INTELFB_CONN_LIMIT); 607 + ret = drm_fb_helper_init(dev, &fbdev->psb_fb_helper, 608 + dev_priv->ops->crtcs, INTELFB_CONN_LIMIT); 609 + if (ret) 610 + goto free; 610 611 611 - drm_fb_helper_single_add_all_connectors(&fbdev->psb_fb_helper); 612 + ret = drm_fb_helper_single_add_all_connectors(&fbdev->psb_fb_helper); 613 + if (ret) 614 + goto fini; 612 615 613 616 /* disable all the possible outputs/crtcs before entering KMS mode */ 614 617 drm_helper_disable_unused_functions(dev); 615 618 616 - drm_fb_helper_initial_config(&fbdev->psb_fb_helper, 32); 619 + ret = drm_fb_helper_initial_config(&fbdev->psb_fb_helper, 32); 620 + if (ret) 621 + goto fini; 622 + 617 623 return 0; 624 + 625 + fini: 626 + drm_fb_helper_fini(&fbdev->psb_fb_helper); 627 + free: 628 + kfree(fbdev); 629 + return ret; 618 630 } 619 631 620 632 static void psb_fbdev_fini(struct drm_device *dev)
+10 -2
drivers/gpu/drm/mgag200/mgag200_fb.c
··· 303 303 if (ret) 304 304 return ret; 305 305 306 - drm_fb_helper_single_add_all_connectors(&mfbdev->helper); 306 + ret = drm_fb_helper_single_add_all_connectors(&mfbdev->helper); 307 + if (ret) 308 + goto fini; 307 309 308 310 /* disable all the possible outputs/crtcs before entering KMS mode */ 309 311 drm_helper_disable_unused_functions(mdev->dev); 310 312 311 - drm_fb_helper_initial_config(&mfbdev->helper, bpp_sel); 313 + ret = drm_fb_helper_initial_config(&mfbdev->helper, bpp_sel); 314 + if (ret) 315 + goto fini; 312 316 313 317 return 0; 318 + 319 + fini: 320 + drm_fb_helper_fini(&mfbdev->helper); 321 + return ret; 314 322 } 315 323 316 324 void mgag200_fbdev_fini(struct mga_device *mdev)
+8 -2
drivers/gpu/drm/msm/msm_fbdev.c
··· 241 241 goto fail; 242 242 } 243 243 244 - drm_fb_helper_single_add_all_connectors(helper); 244 + ret = drm_fb_helper_single_add_all_connectors(helper); 245 + if (ret) 246 + goto fini; 245 247 246 248 /* disable all the possible outputs/crtcs before entering KMS mode */ 247 249 drm_helper_disable_unused_functions(dev); 248 250 249 - drm_fb_helper_initial_config(helper, 32); 251 + ret = drm_fb_helper_initial_config(helper, 32); 252 + if (ret) 253 + goto fini; 250 254 251 255 priv->fbdev = helper; 252 256 253 257 return helper; 254 258 259 + fini: 260 + drm_fb_helper_fini(helper); 255 261 fail: 256 262 kfree(fbdev); 257 263 return NULL;
+15 -6
drivers/gpu/drm/nouveau/nouveau_fbcon.c
··· 539 539 540 540 ret = drm_fb_helper_init(dev, &fbcon->helper, 541 541 dev->mode_config.num_crtc, 4); 542 - if (ret) { 543 - kfree(fbcon); 544 - return ret; 545 - } 542 + if (ret) 543 + goto free; 546 544 547 - drm_fb_helper_single_add_all_connectors(&fbcon->helper); 545 + ret = drm_fb_helper_single_add_all_connectors(&fbcon->helper); 546 + if (ret) 547 + goto fini; 548 548 549 549 if (drm->device.info.ram_size <= 32 * 1024 * 1024) 550 550 preferred_bpp = 8; ··· 557 557 /* disable all the possible outputs/crtcs before entering KMS mode */ 558 558 drm_helper_disable_unused_functions(dev); 559 559 560 - drm_fb_helper_initial_config(&fbcon->helper, preferred_bpp); 560 + ret = drm_fb_helper_initial_config(&fbcon->helper, preferred_bpp); 561 + if (ret) 562 + goto fini; 563 + 561 564 return 0; 565 + 566 + fini: 567 + drm_fb_helper_fini(&fbcon->helper); 568 + free: 569 + kfree(fbcon); 570 + return ret; 562 571 } 563 572 564 573 void
+8 -2
drivers/gpu/drm/omapdrm/omap_fbdev.c
··· 334 334 goto fail; 335 335 } 336 336 337 - drm_fb_helper_single_add_all_connectors(helper); 337 + ret = drm_fb_helper_single_add_all_connectors(helper); 338 + if (ret) 339 + goto fini; 338 340 339 341 /* disable all the possible outputs/crtcs before entering KMS mode */ 340 342 drm_helper_disable_unused_functions(dev); 341 343 342 - drm_fb_helper_initial_config(helper, 32); 344 + ret = drm_fb_helper_initial_config(helper, 32); 345 + if (ret) 346 + goto fini; 343 347 344 348 priv->fbdev = helper; 345 349 346 350 return helper; 347 351 352 + fini: 353 + drm_fb_helper_fini(helper); 348 354 fail: 349 355 kfree(fbdev); 350 356 return NULL;
+16 -6
drivers/gpu/drm/qxl/qxl_fb.c
··· 686 686 ret = drm_fb_helper_init(qdev->ddev, &qfbdev->helper, 687 687 qxl_num_crtc /* num_crtc - QXL supports just 1 */, 688 688 QXLFB_CONN_LIMIT); 689 - if (ret) { 690 - kfree(qfbdev); 691 - return ret; 692 - } 689 + if (ret) 690 + goto free; 693 691 694 - drm_fb_helper_single_add_all_connectors(&qfbdev->helper); 695 - drm_fb_helper_initial_config(&qfbdev->helper, bpp_sel); 692 + ret = drm_fb_helper_single_add_all_connectors(&qfbdev->helper); 693 + if (ret) 694 + goto fini; 695 + 696 + ret = drm_fb_helper_initial_config(&qfbdev->helper, bpp_sel); 697 + if (ret) 698 + goto fini; 699 + 696 700 return 0; 701 + 702 + fini: 703 + drm_fb_helper_fini(&qfbdev->helper); 704 + free: 705 + kfree(qfbdev); 706 + return ret; 697 707 } 698 708 699 709 void qxl_fbdev_fini(struct qxl_device *qdev)
+15 -6
drivers/gpu/drm/radeon/radeon_fb.c
··· 390 390 ret = drm_fb_helper_init(rdev->ddev, &rfbdev->helper, 391 391 rdev->num_crtc, 392 392 RADEONFB_CONN_LIMIT); 393 - if (ret) { 394 - kfree(rfbdev); 395 - return ret; 396 - } 393 + if (ret) 394 + goto free; 397 395 398 - drm_fb_helper_single_add_all_connectors(&rfbdev->helper); 396 + ret = drm_fb_helper_single_add_all_connectors(&rfbdev->helper); 397 + if (ret) 398 + goto fini; 399 399 400 400 /* disable all the possible outputs/crtcs before entering KMS mode */ 401 401 drm_helper_disable_unused_functions(rdev->ddev); 402 402 403 - drm_fb_helper_initial_config(&rfbdev->helper, bpp_sel); 403 + ret = drm_fb_helper_initial_config(&rfbdev->helper, bpp_sel); 404 + if (ret) 405 + goto fini; 406 + 404 407 return 0; 408 + 409 + fini: 410 + drm_fb_helper_fini(&rfbdev->helper); 411 + free: 412 + kfree(rfbdev); 413 + return ret; 405 414 } 406 415 407 416 void radeon_fbdev_fini(struct radeon_device *rdev)
+15 -7
drivers/gpu/drm/udl/udl_fb.c
··· 589 589 590 590 ret = drm_fb_helper_init(dev, &ufbdev->helper, 591 591 1, 1); 592 - if (ret) { 593 - kfree(ufbdev); 594 - return ret; 592 + if (ret) 593 + goto free; 595 594 596 - } 597 - 598 - drm_fb_helper_single_add_all_connectors(&ufbdev->helper); 595 + ret = drm_fb_helper_single_add_all_connectors(&ufbdev->helper); 596 + if (ret) 597 + goto fini; 599 598 600 599 /* disable all the possible outputs/crtcs before entering KMS mode */ 601 600 drm_helper_disable_unused_functions(dev); 602 601 603 - drm_fb_helper_initial_config(&ufbdev->helper, bpp_sel); 602 + ret = drm_fb_helper_initial_config(&ufbdev->helper, bpp_sel); 603 + if (ret) 604 + goto fini; 605 + 604 606 return 0; 607 + 608 + fini: 609 + drm_fb_helper_fini(&ufbdev->helper); 610 + free: 611 + kfree(ufbdev); 612 + return ret; 605 613 } 606 614 607 615 void udl_fbdev_cleanup(struct drm_device *dev)
+1 -1
include/drm/drm_fb_helper.h
··· 125 125 int drm_fb_helper_setcmap(struct fb_cmap *cmap, struct fb_info *info); 126 126 127 127 int drm_fb_helper_hotplug_event(struct drm_fb_helper *fb_helper); 128 - bool drm_fb_helper_initial_config(struct drm_fb_helper *fb_helper, int bpp_sel); 128 + int drm_fb_helper_initial_config(struct drm_fb_helper *fb_helper, int bpp_sel); 129 129 int drm_fb_helper_single_add_all_connectors(struct drm_fb_helper *fb_helper); 130 130 int drm_fb_helper_debug_enter(struct fb_info *info); 131 131 int drm_fb_helper_debug_leave(struct fb_info *info);