|
@@ -61,6 +61,7 @@ static struct hvc_opal_priv *hvc_opal_privs[MAX_NR_HVC_CONSOLES];
|
|
/* For early boot console */
|
|
/* For early boot console */
|
|
static struct hvc_opal_priv hvc_opal_boot_priv;
|
|
static struct hvc_opal_priv hvc_opal_boot_priv;
|
|
static u32 hvc_opal_boot_termno;
|
|
static u32 hvc_opal_boot_termno;
|
|
|
|
+static bool hvc_opal_event_registered;
|
|
|
|
|
|
static const struct hv_ops hvc_opal_raw_ops = {
|
|
static const struct hv_ops hvc_opal_raw_ops = {
|
|
.get_chars = opal_get_chars,
|
|
.get_chars = opal_get_chars,
|
|
@@ -161,6 +162,18 @@ static const struct hv_ops hvc_opal_hvsi_ops = {
|
|
.tiocmset = hvc_opal_hvsi_tiocmset,
|
|
.tiocmset = hvc_opal_hvsi_tiocmset,
|
|
};
|
|
};
|
|
|
|
|
|
|
|
+static int hvc_opal_console_event(struct notifier_block *nb,
|
|
|
|
+ unsigned long events, void *change)
|
|
|
|
+{
|
|
|
|
+ if (events & OPAL_EVENT_CONSOLE_INPUT)
|
|
|
|
+ hvc_kick();
|
|
|
|
+ return 0;
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+static struct notifier_block hvc_opal_console_nb = {
|
|
|
|
+ .notifier_call = hvc_opal_console_event,
|
|
|
|
+};
|
|
|
|
+
|
|
static int hvc_opal_probe(struct platform_device *dev)
|
|
static int hvc_opal_probe(struct platform_device *dev)
|
|
{
|
|
{
|
|
const struct hv_ops *ops;
|
|
const struct hv_ops *ops;
|
|
@@ -170,6 +183,7 @@ static int hvc_opal_probe(struct platform_device *dev)
|
|
unsigned int termno, boot = 0;
|
|
unsigned int termno, boot = 0;
|
|
const __be32 *reg;
|
|
const __be32 *reg;
|
|
|
|
|
|
|
|
+
|
|
if (of_device_is_compatible(dev->dev.of_node, "ibm,opal-console-raw")) {
|
|
if (of_device_is_compatible(dev->dev.of_node, "ibm,opal-console-raw")) {
|
|
proto = HV_PROTOCOL_RAW;
|
|
proto = HV_PROTOCOL_RAW;
|
|
ops = &hvc_opal_raw_ops;
|
|
ops = &hvc_opal_raw_ops;
|
|
@@ -213,12 +227,18 @@ static int hvc_opal_probe(struct platform_device *dev)
|
|
dev->dev.of_node->full_name,
|
|
dev->dev.of_node->full_name,
|
|
boot ? " (boot console)" : "");
|
|
boot ? " (boot console)" : "");
|
|
|
|
|
|
- /* We don't do IRQ yet */
|
|
|
|
|
|
+ /* We don't do IRQ ... */
|
|
hp = hvc_alloc(termno, 0, ops, MAX_VIO_PUT_CHARS);
|
|
hp = hvc_alloc(termno, 0, ops, MAX_VIO_PUT_CHARS);
|
|
if (IS_ERR(hp))
|
|
if (IS_ERR(hp))
|
|
return PTR_ERR(hp);
|
|
return PTR_ERR(hp);
|
|
dev_set_drvdata(&dev->dev, hp);
|
|
dev_set_drvdata(&dev->dev, hp);
|
|
|
|
|
|
|
|
+ /* ... but we use OPAL event to kick the console */
|
|
|
|
+ if (!hvc_opal_event_registered) {
|
|
|
|
+ opal_notifier_register(&hvc_opal_console_nb);
|
|
|
|
+ hvc_opal_event_registered = true;
|
|
|
|
+ }
|
|
|
|
+
|
|
return 0;
|
|
return 0;
|
|
}
|
|
}
|
|
|
|
|