[SeaBIOS] [PATCH 1/3] vgasrc: Add skeleton for VBE function 15h (VBE/DDC Standard)

Hiroshi Miura miurahr at linux.com
Sun Sep 16 06:03:06 CEST 2012


posted in Wed Mar 7 03:41:06 CET 2012

Signed-off-by: Julian Pidancet <julian.pidancet at gmail.com>
Signed-off-by: Hiroshi Miura <miurahr at linux.com>
---
 src/vbe.h       |    5 +++++
 vgasrc/stdvga.c |   11 +++++++++++
 vgasrc/stdvga.h |    2 ++
 vgasrc/vbe.c    |   34 ++++++++++++++++++++++++++++++++++
 vgasrc/vgahw.h  |    8 ++++++++
 5 files changed, 60 insertions(+)

diff --git a/src/vbe.h b/src/vbe.h
index 386613c..b5aedc6 100644
--- a/src/vbe.h
+++ b/src/vbe.h
@@ -154,4 +154,9 @@ struct vbe_crtc_info {
 #define VBE_DIRECTCOLOR_COLOR_RAMP_PROGRAMMABLE          0x01
 #define VBE_DIRECTCOLOR_RESERVED_BITS_AVAILABLE          0x02
 
+/* Display Data Channel (DDC) */
+#define VBE_DDC1_PROTOCOL_SUPPORTED                      0x01
+#define VBE_DDC2_PROTOCOL_SUPPORTED                      0x02
+#define VBE_DDC_BLANK_DURING_TRANSFER                    0x04
+
 #endif
diff --git a/vgasrc/stdvga.c b/vgasrc/stdvga.c
index ae6c0be..270cd65 100644
--- a/vgasrc/stdvga.c
+++ b/vgasrc/stdvga.c
@@ -499,3 +499,14 @@ stdvga_init(void)
 
     return 0;
 }
+
+int stdvga_get_ddc_capabilities(u16 unit)
+{
+    return -1;
+}
+
+int stdvga_read_edid(u16 unit, u16 block, u16 seg, void *data)
+{
+    return -1;
+}
+
diff --git a/vgasrc/stdvga.h b/vgasrc/stdvga.h
index c9a9ba1..e3bd447 100644
--- a/vgasrc/stdvga.h
+++ b/vgasrc/stdvga.h
@@ -108,5 +108,7 @@ int stdvga_save_state(u16 seg, void *data, int states);
 int stdvga_restore_state(u16 seg, void *data, int states);
 void stdvga_enable_video_addressing(u8 disable);
 int stdvga_init(void);
+int stdvga_get_ddc_capabilities(u16 unit);
+int stdvga_read_edid(u16 unit, u16 block, u16 seg, void *data);
 
 #endif // stdvga.h
diff --git a/vgasrc/vbe.c b/vgasrc/vbe.c
index 227a244..ed7c6ee 100644
--- a/vgasrc/vbe.c
+++ b/vgasrc/vbe.c
@@ -384,6 +384,39 @@ vbe_104f10(struct bregs *regs)
 }
 
 static void
+vbe_104f15(struct bregs *regs)
+{
+    int ret;
+    u16 seg = regs->es;
+    void *data = (void *)(regs->di+0);
+    u16 unit = regs->cx;
+    u16 block = regs->dx;
+
+    switch (regs->bl) {
+    case 0x00: /* Report VBE/DDC Capabilities */
+        ret = vgahw_get_ddc_capabilities(unit);
+        if (ret < 0)
+            goto fail;
+        regs->bh = ret >> 8; /* Approx. time in seconds, rounded up, to transfer
+                                one EDID block (128 bytes) */
+        regs->bl = ret & 0xff; /* DDC level supported */
+        break;
+    case 0x01: /* Read EDID */
+        ret = vgahw_read_edid(unit, block, seg, data);
+        if (ret < 0)
+            goto fail;
+        break;
+    default:
+        goto fail;
+    }
+    regs->ax = 0x004f;
+    return;
+
+fail:
+    regs->ax = 0x014f;
+}
+
+static void
 vbe_104fXX(struct bregs *regs)
 {
     debug_stub(regs);
@@ -410,6 +443,7 @@ handle_104f(struct bregs *regs)
     case 0x08: vbe_104f08(regs); break;
     case 0x0a: vbe_104f0a(regs); break;
     case 0x10: vbe_104f10(regs); break;
+    case 0x15: vbe_104f15(regs); break;
     default:   vbe_104fXX(regs); break;
     }
 }
diff --git a/vgasrc/vgahw.h b/vgasrc/vgahw.h
index 044cd32..01d2609 100644
--- a/vgasrc/vgahw.h
+++ b/vgasrc/vgahw.h
@@ -129,4 +129,12 @@ static inline int vgahw_restore_state(u16 seg, void *data, int states) {
     return stdvga_restore_state(seg, data, states);
 }
 
+static inline int vgahw_get_ddc_capabilities(u16 unit) {
+    return stdvga_get_ddc_capabilities(unit);
+}
+
+static inline int vgahw_read_edid(u16 unit, u16 block, u16 seg, void *data) {
+    return stdvga_read_edid(unit, block, seg, data);
+}
+
 #endif // vgahw.h
-- 
1.7.9.5





More information about the SeaBIOS mailing list