]> rtime.felk.cvut.cz Git - l4.git/blobdiff - l4/pkg/io/server/src/vbus.cc
update
[l4.git] / l4 / pkg / io / server / src / vbus.cc
index d8185d67470d70a32bd4086f1aae7d867edd3813..45a75149eca82f61b8009ed5e4495e4da92ee2b8 100644 (file)
 
 #include <cstdio>
 
+#include "debug.h"
+#include "hw_msi.h"
 #include "vbus.h"
+#include "vmsi.h"
 #include "vicu.h"
 #include "server.h"
 #include "res.h"
@@ -56,14 +59,53 @@ public:
        _bus->add_child(_icu);
       }
 
+    d_printf(DBG_DEBUG2, "Add IRQ resources to vbus: ");
+    if (dlevel(DBG_DEBUG2))
+      child->dump();
+
     _icu->add_irqs(r);
     _bus->resource_set()->insert(r);
 
     return true;
   };
 
-  bool alloc(Resource *, Device *, Resource *, Device *, bool)
-  { return false; }
+  bool alloc(Resource *parent, Device *, Resource *child, Device *, bool)
+  {
+    d_printf(DBG_DEBUG2, "Allocate virtual IRQ resource ...\n");
+    if (dlevel(DBG_DEBUG2))
+      child->dump();
+
+    Vi::Msi_resource *msi = dynamic_cast<Vi::Msi_resource*>(child);
+    if (!msi || !parent)
+      return false;
+
+    d_printf(DBG_DEBUG2, "  Allocate Virtual MSI...\n");
+
+    if (!_icu)
+      {
+       _icu = new Vi::Sw_icu();
+       _bus->add_child(_icu);
+      }
+
+    int nr = _icu->alloc_irq(msi->flags(), msi->hw_msi());
+    if (nr < 0)
+      {
+       d_printf(DBG_ERR, "ERROR: cannot allocate MSI resource\n");
+       return false;
+      }
+
+    msi->start_end(nr, nr);
+    msi->del_flags(Resource::F_disabled);
+
+    if (dlevel(DBG_DEBUG2))
+      {
+       msi->dump(4);
+       msi->hw_msi()->dump(4);
+      }
+
+    _bus->resource_set()->insert(msi);
+    return true;
+  }
 
   ~Root_irq_rs() {}
 };
@@ -150,7 +192,7 @@ System_bus::request_resource(L4::Ipc_iostream &ios)
   ios.get(res);
 
   ::Adr_resource ires(res.type, res.start, res.end);
-  if (Io_config::cfg->verbose() > 1)
+  if (dlevel(DBG_DEBUG2))
     {
       printf("request resource: ");
       Adr_resource(ires).dump();