- 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;
+ }