From 4a8b56a4746dc628ce44eaaead5df460bbbf8f86 Mon Sep 17 00:00:00 2001
From: Able <abl3theabove@gmail.com>
Date: Mon, 8 May 2023 03:53:15 -0500
Subject: [PATCH] dynamically support display discovery

---
 kernel/src/arch/x86_64/graphics.rs | 23 +++++++++++++++--------
 kernel/src/arch/x86_64/mod.rs      | 10 +++++-----
 kernel/src/device_tree.rs          |  1 +
 3 files changed, 21 insertions(+), 13 deletions(-)

diff --git a/kernel/src/arch/x86_64/graphics.rs b/kernel/src/arch/x86_64/graphics.rs
index 3a4fccf..998f354 100644
--- a/kernel/src/arch/x86_64/graphics.rs
+++ b/kernel/src/arch/x86_64/graphics.rs
@@ -1,20 +1,27 @@
-use virtio_drivers::transport::Transport;
-
-use crate::arch::virtio::AbleosHal;
-
-use {embedded_graphics::pixelcolor::Rgb888, virtio_drivers::device::gpu::VirtIOGpu};
+use {limine::NonNullPtr, virtio_drivers::transport::Transport};
 
 use {
+    crate::{arch::virtio::AbleosHal, kmain::DEVICE_TREE},
     able_graphics_library::raw_pixel::Display,
-    embedded_graphics::prelude::*,
-    limine::FramebufferRequest,
+    embedded_graphics::{pixelcolor::Rgb888, prelude::*},
+    limine::{Framebuffer, FramebufferRequest},
     spin::{Lazy, Mutex},
+    virtio_drivers::device::gpu::VirtIOGpu,
 };
 
 pub static DISPLAY: Lazy<Mutex<Display>> = Lazy::new(|| {
     static FB_REQ: FramebufferRequest = FramebufferRequest::new(0);
-    let fb1 = &FB_REQ.get_response().get().unwrap().framebuffers()[0];
+    let fb1: &NonNullPtr<Framebuffer> = &FB_REQ.get_response().get().unwrap().framebuffers()[0];
+    {
+        use crate::alloc::string::ToString;
+        let mut dt = DEVICE_TREE.lock();
+        let mut disp = xml::XMLElement::new("display_0");
 
+        disp.set_attribute("width", fb1.width);
+        disp.set_attribute("height", fb1.height);
+        disp.set_attribute("bits per pixel", fb1.bpp);
+        dt.devices.insert("Displays".to_string(), alloc::vec![disp]);
+    }
     let m = Mutex::new(Display {
         fb:    fb1.address.as_ptr().unwrap().cast(),
         size:  Size::new(fb1.width as u32, fb1.height as u32),
diff --git a/kernel/src/arch/x86_64/mod.rs b/kernel/src/arch/x86_64/mod.rs
index b0549f1..f944793 100644
--- a/kernel/src/arch/x86_64/mod.rs
+++ b/kernel/src/arch/x86_64/mod.rs
@@ -114,12 +114,10 @@ unsafe extern "C" fn _kernel_start() -> ! {
         graphics::init();
         let mut dis = DISPLAY.lock();
         use {able_graphics_library::raw_pixel, embedded_graphics::prelude::RgbColor};
-
         dis.set_color(Rgb888::GREEN);
-
-        dis.line(1, 1, 10, 10, 4);
-        // dis.line(1, 200, 100, 10, 1);
-        // dis.line(1, 1, 200, 10, 1);
+        dis.line(1, 1, 700, 1000, 1);
+        // dis.line(10, 10, 100, 10, 10);
+        // dis.line(100, 10, 1, 1, 10);
     }
 
     crate::kmain::kmain(
@@ -162,3 +160,5 @@ pub fn hardware_random_u64() -> u64 {
 
     ret
 }
+
+pub fn get_edid() {}
diff --git a/kernel/src/device_tree.rs b/kernel/src/device_tree.rs
index 62c01f8..c0c286f 100644
--- a/kernel/src/device_tree.rs
+++ b/kernel/src/device_tree.rs
@@ -45,6 +45,7 @@ use crate::utils::TAB;
 
 impl fmt::Display for DeviceTree {
     fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
+        writeln!(f);
         for (device_type, devices) in &self.devices {
             writeln!(f, "\r{TAB}{}/\r", device_type)?;
             for device in devices {