提交 746de36c 编写于 作者: M Michael Ellerman 提交者: Zheng Zengkai

powerpc/pseries: Only register vio drivers if vio bus exists

stable inclusion
from stable-5.10.37
commit fd26f3a07e7397bf2cb23a7792874c8767a18db3
bugzilla: 51868
CVE: NA

--------------------------------

[ Upstream commit 11d92156 ]

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 4336b933 ("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: 4336b933 ("powerpc/pseries: Make vio and ibmebus initcalls pseries specific")
Reported-by: NPaul Menzel <pmenzel@molgen.mpg.de>
Signed-off-by: NMichael Ellerman <mpe@ellerman.id.au>
Tested-by: NPaul Menzel <pmenzel@molgen.mpg.de>
Reviewed-by: NTyrel Datwyler <tyreld@linux.ibm.com>
Link: https://lore.kernel.org/r/20210316010938.525657-1-mpe@ellerman.id.auSigned-off-by: NSasha Levin <sashal@kernel.org>
Signed-off-by: NChen Jun <chenjun102@huawei.com>
Acked-by: NWeilong Chen <chenweilong@huawei.com>
Signed-off-by: NZheng Zengkai <zhengzengkai@huawei.com>
上级 1d6c154e
...@@ -1286,6 +1286,10 @@ static int vio_bus_remove(struct device *dev) ...@@ -1286,6 +1286,10 @@ static int vio_bus_remove(struct device *dev)
int __vio_register_driver(struct vio_driver *viodrv, struct module *owner, int __vio_register_driver(struct vio_driver *viodrv, struct module *owner,
const char *mod_name) 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); pr_debug("%s: driver %s registering\n", __func__, viodrv->name);
/* fill in 'struct driver' fields */ /* fill in 'struct driver' fields */
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册