mirror of
https://github.com/AuxXxilium/linux_dsm_epyc7002.git
synced 2024-11-24 21:30:53 +07:00
hvc_xen: introduce HVC_XEN_FRONTEND
Introduce a new config option HVC_XEN_FRONTEND to enable/disable the xenbus based pv console frontend. Signed-off-by: Stefano Stabellini <stefano.stabellini@eu.citrix.com> Signed-off-by: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
This commit is contained in:
parent
02e19f9c7c
commit
cf8e019b52
@ -76,6 +76,14 @@ config HVC_XEN
|
||||
help
|
||||
Xen virtual console device driver
|
||||
|
||||
config HVC_XEN_FRONTEND
|
||||
bool "Xen Hypervisor Multiple Consoles support"
|
||||
depends on HVC_XEN
|
||||
select XEN_XENBUS_FRONTEND
|
||||
default y
|
||||
help
|
||||
Xen driver for secondary virtual consoles
|
||||
|
||||
config HVC_UDBG
|
||||
bool "udbg based fake hypervisor console"
|
||||
depends on PPC && EXPERIMENTAL
|
||||
|
@ -55,7 +55,6 @@ struct xencons_info {
|
||||
|
||||
static LIST_HEAD(xenconsoles);
|
||||
static DEFINE_SPINLOCK(xencons_lock);
|
||||
static struct xenbus_driver xencons_driver;
|
||||
|
||||
/* ------------------------------------------------------------------ */
|
||||
|
||||
@ -298,53 +297,6 @@ static int xen_initial_domain_console_init(void)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int __init xen_hvc_init(void)
|
||||
{
|
||||
int r;
|
||||
struct xencons_info *info;
|
||||
const struct hv_ops *ops;
|
||||
|
||||
if (!xen_domain())
|
||||
return -ENODEV;
|
||||
|
||||
if (xen_initial_domain()) {
|
||||
ops = &dom0_hvc_ops;
|
||||
r = xen_initial_domain_console_init();
|
||||
if (r < 0)
|
||||
return r;
|
||||
info = vtermno_to_xencons(HVC_COOKIE);
|
||||
} else {
|
||||
ops = &domU_hvc_ops;
|
||||
if (xen_hvm_domain())
|
||||
r = xen_hvm_console_init();
|
||||
else
|
||||
r = xen_pv_console_init();
|
||||
if (r < 0)
|
||||
return r;
|
||||
|
||||
info = vtermno_to_xencons(HVC_COOKIE);
|
||||
info->irq = bind_evtchn_to_irq(info->evtchn);
|
||||
}
|
||||
if (info->irq < 0)
|
||||
info->irq = 0; /* NO_IRQ */
|
||||
else
|
||||
irq_set_noprobe(info->irq);
|
||||
|
||||
info->hvc = hvc_alloc(HVC_COOKIE, info->irq, ops, 256);
|
||||
if (IS_ERR(info->hvc)) {
|
||||
r = PTR_ERR(info->hvc);
|
||||
spin_lock(&xencons_lock);
|
||||
list_del(&info->list);
|
||||
spin_unlock(&xencons_lock);
|
||||
if (info->irq)
|
||||
unbind_from_irqhandler(info->irq, NULL);
|
||||
kfree(info);
|
||||
return r;
|
||||
}
|
||||
|
||||
return xenbus_register_frontend(&xencons_driver);
|
||||
}
|
||||
|
||||
void xen_console_resume(void)
|
||||
{
|
||||
struct xencons_info *info = vtermno_to_xencons(HVC_COOKIE);
|
||||
@ -392,6 +344,9 @@ static int xen_console_remove(struct xencons_info *info)
|
||||
return 0;
|
||||
}
|
||||
|
||||
#ifdef CONFIG_HVC_XEN_FRONTEND
|
||||
static struct xenbus_driver xencons_driver;
|
||||
|
||||
static int xencons_remove(struct xenbus_device *dev)
|
||||
{
|
||||
return xen_console_remove(dev_get_drvdata(&dev->dev));
|
||||
@ -543,6 +498,65 @@ static const struct xenbus_device_id xencons_ids[] = {
|
||||
};
|
||||
|
||||
|
||||
static DEFINE_XENBUS_DRIVER(xencons, "xenconsole",
|
||||
.probe = xencons_probe,
|
||||
.remove = xencons_remove,
|
||||
.resume = xencons_resume,
|
||||
.otherend_changed = xencons_backend_changed,
|
||||
);
|
||||
#endif /* CONFIG_HVC_XEN_FRONTEND */
|
||||
|
||||
static int __init xen_hvc_init(void)
|
||||
{
|
||||
int r;
|
||||
struct xencons_info *info;
|
||||
const struct hv_ops *ops;
|
||||
|
||||
if (!xen_domain())
|
||||
return -ENODEV;
|
||||
|
||||
if (xen_initial_domain()) {
|
||||
ops = &dom0_hvc_ops;
|
||||
r = xen_initial_domain_console_init();
|
||||
if (r < 0)
|
||||
return r;
|
||||
info = vtermno_to_xencons(HVC_COOKIE);
|
||||
} else {
|
||||
ops = &domU_hvc_ops;
|
||||
if (xen_hvm_domain())
|
||||
r = xen_hvm_console_init();
|
||||
else
|
||||
r = xen_pv_console_init();
|
||||
if (r < 0)
|
||||
return r;
|
||||
|
||||
info = vtermno_to_xencons(HVC_COOKIE);
|
||||
info->irq = bind_evtchn_to_irq(info->evtchn);
|
||||
}
|
||||
if (info->irq < 0)
|
||||
info->irq = 0; /* NO_IRQ */
|
||||
else
|
||||
irq_set_noprobe(info->irq);
|
||||
|
||||
info->hvc = hvc_alloc(HVC_COOKIE, info->irq, ops, 256);
|
||||
if (IS_ERR(info->hvc)) {
|
||||
r = PTR_ERR(info->hvc);
|
||||
spin_lock(&xencons_lock);
|
||||
list_del(&info->list);
|
||||
spin_unlock(&xencons_lock);
|
||||
if (info->irq)
|
||||
unbind_from_irqhandler(info->irq, NULL);
|
||||
kfree(info);
|
||||
return r;
|
||||
}
|
||||
|
||||
r = 0;
|
||||
#ifdef CONFIG_HVC_XEN_FRONTEND
|
||||
r = xenbus_register_frontend(&xencons_driver);
|
||||
#endif
|
||||
return r;
|
||||
}
|
||||
|
||||
static void __exit xen_hvc_fini(void)
|
||||
{
|
||||
struct xencons_info *entry, *next;
|
||||
@ -580,12 +594,6 @@ static int xen_cons_init(void)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static DEFINE_XENBUS_DRIVER(xencons, "xenconsole",
|
||||
.probe = xencons_probe,
|
||||
.remove = xencons_remove,
|
||||
.resume = xencons_resume,
|
||||
.otherend_changed = xencons_backend_changed,
|
||||
);
|
||||
|
||||
module_init(xen_hvc_init);
|
||||
module_exit(xen_hvc_fini);
|
||||
|
Loading…
Reference in New Issue
Block a user