SBI_EXT_RFENCE = 0x52464E43,
        SBI_EXT_HSM = 0x48534D,
        SBI_EXT_SRST = 0x53525354,
+       SBI_EXT_SUSP = 0x53555350,
        SBI_EXT_PMU = 0x504D55,
        SBI_EXT_DBCN = 0x4442434E,
 +      SBI_EXT_STA = 0x535441,
  
        /* Experimentals extensions must lie within this range */
        SBI_EXT_EXPERIMENTAL_START = 0x08000000,
 
        .put_chars = hvc_sbi_tty_put,
  };
  
- static int __init hvc_sbi_init(void)
 -static int hvc_sbi_dbcn_tty_put(uint32_t vtermno, const char *buf, int count)
++static ssize_t hvc_sbi_dbcn_tty_put(uint32_t vtermno, const u8 *buf, size_t count)
  {
-       return PTR_ERR_OR_ZERO(hvc_alloc(0, 0, &hvc_sbi_ops, 16));
+       return sbi_debug_console_write(buf, count);
  }
- device_initcall(hvc_sbi_init);
  
- static int __init hvc_sbi_console_init(void)
 -static int hvc_sbi_dbcn_tty_get(uint32_t vtermno, char *buf, int count)
++static ssize_t hvc_sbi_dbcn_tty_get(uint32_t vtermno, u8 *buf, size_t count)
  {
-       hvc_instantiate(0, 0, &hvc_sbi_ops);
+       return sbi_debug_console_read(buf, count);
+ }
+ 
+ static const struct hv_ops hvc_sbi_dbcn_ops = {
+       .put_chars = hvc_sbi_dbcn_tty_put,
+       .get_chars = hvc_sbi_dbcn_tty_get,
+ };
+ 
+ static int __init hvc_sbi_init(void)
+ {
+       int err;
+ 
+       if (sbi_debug_console_available) {
+               err = PTR_ERR_OR_ZERO(hvc_alloc(0, 0, &hvc_sbi_dbcn_ops, 256));
+               if (err)
+                       return err;
+               hvc_instantiate(0, 0, &hvc_sbi_dbcn_ops);
+       } else if (IS_ENABLED(CONFIG_RISCV_SBI_V01)) {
+               err = PTR_ERR_OR_ZERO(hvc_alloc(0, 0, &hvc_sbi_v01_ops, 256));
+               if (err)
+                       return err;
+               hvc_instantiate(0, 0, &hvc_sbi_v01_ops);
+       } else {
+               return -ENODEV;
+       }
  
        return 0;
  }