vgabios: Add VBE power management (10h) stub function.
[seabios.git] / vgasrc / vbe.c
index 68d20259827cd28aeda174fa69dd75265290624e..c1b03f0aff7d1b9cff37bd5d0b926fe8cba0da47 100644 (file)
@@ -273,8 +273,37 @@ fail:
 static void
 vbe_104f07(struct bregs *regs)
 {
-    debug_stub(regs);
-    regs->ax = 0x0100;
+    struct vgamode_s *vmode_g = get_current_mode();
+    if (! vmode_g)
+        goto fail;
+    int bpp = vga_bpp(vmode_g);
+    int linelength = vgahw_get_linelength(vmode_g);
+    if (linelength < 0)
+        goto fail;
+
+    int ret;
+    switch (regs->bl) {
+    case 0x80:
+    case 0x00:
+        ret = vgahw_set_displaystart(
+            vmode_g, DIV_ROUND_UP(regs->cx * bpp, 8) + linelength * regs->dx);
+        if (ret)
+            goto fail;
+        break;
+    case 0x01:
+        ret = vgahw_get_displaystart(vmode_g);
+        if (ret < 0)
+            goto fail;
+        regs->dx = ret / linelength;
+        regs->cx = (ret % linelength) * 8 / bpp;
+        break;
+    default:
+        goto fail;
+    }
+    regs->ax = 0x004f;
+    return;
+fail:
+    regs->ax = 0x014f;
 }
 
 static void
@@ -291,6 +320,26 @@ vbe_104f0a(struct bregs *regs)
     regs->ax = 0x0100;
 }
 
+static void
+vbe_104f10(struct bregs *regs)
+{
+    switch (regs->bl) {
+    case 0x00:
+        regs->bx = 0x0f30;
+        break;
+    case 0x01:
+        SET_BDA(vbe_flag, regs->bh);
+        break;
+    case 0x02:
+        regs->bh = GET_BDA(vbe_flag);
+        break;
+    default:
+        regs->ax = 0x014f;
+        return;
+    }
+    regs->ax = 0x004f;
+}
+
 static void
 vbe_104fXX(struct bregs *regs)
 {
@@ -317,6 +366,7 @@ handle_104f(struct bregs *regs)
     case 0x07: vbe_104f07(regs); break;
     case 0x08: vbe_104f08(regs); break;
     case 0x0a: vbe_104f0a(regs); break;
+    case 0x10: vbe_104f10(regs); break;
     default:   vbe_104fXX(regs); break;
     }
 }