gpu: host1x: Ignore clients initialization failure
PATCH v2 1/1 gpu: host1x: Ignore clients initialization failure
Quoted 1 line
From time to time new bugs are popping up, causing some host1x client to
fail its initialization. Currently a single clients initialization failure causes whole host1x device registration to fail, as a result a single DRM sub-device initialization failure makes whole DRM initialization to fail. Let's ignore clients initialization failure, as a result display panel lights up even if some DRM clients (say GR2D or VIC) fail to initialize. Actually VIC fails if initramfs misses the firmware file, so with this change a serial console isn't needed anymore to figure out why display isn't working.
---
Changelog:
v2: Added WARN_ON() that should get more attention than just a error message.
Made clients_lock to lock around the lists modification, that is in line with the rest of the code.
drivers/gpu/host1x/bus.c | 20 ++++++++------------ 1 file changed, 8 insertions(+), 12 deletions(-)
drivers/gpu/host1x/bus.c +8 -12
@@ -199,19 +199,23 @@ static void host1x_subdev_unregister(struct host1x_device *device,*/ int host1x_device_init (struct host1x_device *device) { -struct host1x_client *client; +struct host1x_client *client, *cl;int err;mutex_lock (&device->clients_lock); -list_for_each_entry (client, &device->clients, list) { +list_for_each_entry_safe (client, cl, &device->clients, list) {if (client->ops && client->ops->init) { err = client->ops->init (client); -if (err <0 ) { +if (WARN_ON (err <0 )) {dev_err (&device->dev,"failed to initialize %s: %d\n" ,dev_name (client->dev), err); - goto teardown; + +/* add the client to the list of idle clients */ +mutex_lock (&clients_lock); +list_add_tail (&client->list, &clients); +mutex_unlock (&clients_lock); } } }
@@ -219,14 +223,6 @@ int host1x_device_init(struct host1x_device *device)mutex_unlock (&device->clients_lock);return 0 ; - -teardown: -list_for_each_entry_continue_reverse (client, &device->clients, list) -if (client->ops->exit) - client->ops->exit (client); - -mutex_unlock (&device->clients_lock); -return err; }EXPORT_SYMBOL (host1x_device_init);
Signature · 1 line
2.18.0
Quoted 40 lines · On Friday, 10 August 2018 02:12:11 MSK Dmitry Osipenko wrote:
From time to time new bugs are popping up, causing some host1x client to fail its initialization. Currently a single clients initialization failure causes whole host1x device registration to fail, as a result a single DRM sub-device initialization failure makes whole DRM initialization to fail. Let's ignore clients initialization failure, as a result display panel lights up even if some DRM clients (say GR2D or VIC) fail to initialize. Actually VIC fails if initramfs misses the firmware file, so with this change a serial console isn't needed anymore to figure out why display isn't working.
Signed-off-by Dmitry Osipenko <[email protected]>---
Changelog:
v2: Added
WARN_ON()that should get more attention than just a error message. Madeclients_lockto lock around the lists modification, that is in line with the rest of the code.drivers/gpu/host1x/bus.c | 20 ++++++++------------ 1 file changed, 8 insertions(+), 12 deletions(-)drivers/gpu/host1x/bus.c +0
-0@@ -199,19 +199,23 @@ static void host1x_subdev_unregister(struct
host1x_device*device, */
inthost1x_device_init(struct host1x_device *device){drivers/gpu/host1x/bus.c +2
-2-struct host1x_client *client; +struct host1x_client *client, *cl;int err;mutex_lock (&device->clients_lock); -list_for_each_entry (client, &device->clients, list) { +list_for_each_entry_safe (client, cl, &device->clients, list) {if (client->ops && client->ops->init) { err = client->ops->init (client);
drivers/gpu/host1x/bus.c static void host1x_subdev_unregister(struct host1x_device *device, · line 217
Quoted 10 lines
drivers/gpu/host1x/bus.c +5
-2-if (err <0 ) { +if (WARN_ON (err <0 )) {dev_err (&device->dev,"failed to initialize %s: %d\n" ,dev_name (client->dev), err); - goto teardown; + +/* add the client to the list of idle clients */ +mutex_lock (&clients_lock); +list_add_tail (&client->list, &clients);
This shall be list_move_tail(), v3 is coming.
Quoted 1 line
drivers/gpu/host1x/bus.c +1
-0+mutex_unlock (&clients_lock);
Quoted 63 lines · On Monday, 13 August 2018 20:48:25 MSK Dmitry Osipenko wrote:
Quoted 49 lines · On Friday, 10 August 2018 02:12:11 MSK Dmitry Osipenko wrote:
From time to time new bugs are popping up, causing some host1x client to fail its initialization. Currently a single clients initialization failure causes whole host1x device registration to fail, as a result a single DRM sub-device initialization failure makes whole DRM initialization to fail. Let's ignore clients initialization failure, as a result display panel lights up even if some DRM clients (say GR2D or VIC) fail to initialize. Actually VIC fails if initramfs misses the firmware file, so with this change a serial console isn't needed anymore to figure out why display isn't working.
Signed-off-by Dmitry Osipenko <[email protected]>---
Changelog:
v2: Added
WARN_ON()that should get more attention than just a error message. Madeclients_lockto lock around the lists modification, that is in line with the rest of the code.drivers/gpu/host1x/bus.c | 20 ++++++++------------ 1 file changed, 8 insertions(+), 12 deletions(-)drivers/gpu/host1x/bus.c +0
-0@@ -199,19 +199,23 @@ static void host1x_subdev_unregister(struct
host1x_device*device, */int
host1x_device_init(struct host1x_device *device){drivers/gpu/host1x/bus.c +3
-3-struct host1x_client *client; +struct host1x_client *client, *cl;int err;mutex_lock (&device->clients_lock); -list_for_each_entry (client, &device->clients, list) { +list_for_each_entry_safe (client, cl, &device->clients, list) {if (client->ops && client->ops->init) { err = client->ops->init (client); -if (err <0 ) { +if (WARN_ON (err <0 )) {drivers/gpu/host1x/bus.c static void host1x_subdev_unregister(struct host1x_device *device, · line 217
Quoted 10 lines
drivers/gpu/host1x/bus.c +4
-1dev_err (&device->dev,"failed to initialize %s: %d\n" ,dev_name (client->dev), err); - goto teardown; + +/* add the client to the list of idle clients */ +mutex_lock (&clients_lock); +list_add_tail (&client->list, &clients);This shall be
list_move_tail(), v3 is coming.
Quoted 1 line
drivers/gpu/host1x/bus.c static void host1x_subdev_unregister(struct host1x_device *device, · line 218
Quoted 1 line
drivers/gpu/host1x/bus.c +1
-0+mutex_unlock (&clients_lock);
I just realized that DRM won't load if any of host1x drivers fail to probe. I think the behaviour should be consistent in a case of driver-probe and client- init failures. It looks like changing drivers probe error handling will be a much bigger change, hence let's keep the old behaviour at least for now.