| From 61081a309812aa936bb87276046b1717cd618867 Mon Sep 17 00:00:00 2001 |
| From: Sasha Levin <sashal@kernel.org> |
| Date: Tue, 16 Mar 2021 12:09:38 +1100 |
| Subject: powerpc/pseries: Only register vio drivers if vio bus exists |
| |
| From: Michael Ellerman <mpe@ellerman.id.au> |
| |
| [ Upstream commit 11d92156f7a862091009d7655d19c1e7de37fc7a ] |
| |
| The vio bus is a fake bus, which we use on pseries LPARs (guests) to |
| discover devices provided by the hypervisor. There's no need or sense |
| in creating the vio bus on bare metal systems. |
| |
| Which is why commit 4336b9337824 ("powerpc/pseries: Make vio and |
| ibmebus initcalls pseries specific") made the initialisation of the |
| vio bus only happen in LPARs. |
| |
| However as a result of that commit we now see errors at boot on bare |
| metal systems: |
| |
| Driver 'hvc_console' was unable to register with bus_type 'vio' because the bus was not initialized. |
| Driver 'tpm_ibmvtpm' was unable to register with bus_type 'vio' because the bus was not initialized. |
| |
| This happens because those drivers are built-in, and are calling |
| vio_register_driver(). It in turn calls driver_register() with a |
| reference to vio_bus_type, but we haven't registered vio_bus_type with |
| the driver core. |
| |
| Fix it by also guarding vio_register_driver() with a check to see if |
| we are on pseries. |
| |
| Fixes: 4336b9337824 ("powerpc/pseries: Make vio and ibmebus initcalls pseries specific") |
| Reported-by: Paul Menzel <pmenzel@molgen.mpg.de> |
| Signed-off-by: Michael Ellerman <mpe@ellerman.id.au> |
| Tested-by: Paul Menzel <pmenzel@molgen.mpg.de> |
| Reviewed-by: Tyrel Datwyler <tyreld@linux.ibm.com> |
| Link: https://lore.kernel.org/r/20210316010938.525657-1-mpe@ellerman.id.au |
| Signed-off-by: Sasha Levin <sashal@kernel.org> |
| --- |
| arch/powerpc/platforms/pseries/vio.c | 4 ++++ |
| 1 file changed, 4 insertions(+) |
| |
| diff --git a/arch/powerpc/platforms/pseries/vio.c b/arch/powerpc/platforms/pseries/vio.c |
| index b2797cfe4e2b..68276e05502b 100644 |
| --- a/arch/powerpc/platforms/pseries/vio.c |
| +++ b/arch/powerpc/platforms/pseries/vio.c |
| @@ -1286,6 +1286,10 @@ static int vio_bus_remove(struct device *dev) |
| int __vio_register_driver(struct vio_driver *viodrv, struct module *owner, |
| const char *mod_name) |
| { |
| + // vio_bus_type is only initialised for pseries |
| + if (!machine_is(pseries)) |
| + return -ENODEV; |
| + |
| pr_debug("%s: driver %s registering\n", __func__, viodrv->name); |
| |
| /* fill in 'struct driver' fields */ |
| -- |
| 2.30.2 |
| |