Merge remote-tracking branch 'origin/master' into isa/arm64
[lunaix-os.git] / lunaix-os / arch / generic / includes / asm-generic / isrm.h
index 88c1db03b9b655b948bf1efe54e03eca7209f678..b766afbb866b98f25a47f2140f2f311ddde99413 100644 (file)
@@ -13,6 +13,7 @@
 
 #include <lunaix/types.h>
 #include <lunaix/hart_state.h>
+#include <lunaix/device.h>
 
 #include <hal/devtree.h>
 
@@ -29,6 +30,8 @@ typedef struct {
 #define check_msiv_invalid(msiv)  (msi_vect(msiv) == -1)
 #define invalid_msi_vector  ((msi_vector_t) { (ptr_t)-1, (reg_t)-1, -1 });
 
+typedef void* msienv_t;
+
 void
 isrm_init();
 
@@ -41,28 +44,51 @@ void
 isrm_ivfree(int iv);
 
 /**
- * @brief Allocate an iv resource for os services
+ * @brief Begin MSI allocation for given device
  *
  * @param iv
  */
-int
-isrm_ivosalloc(isr_cb handler);
+msienv_t
+isrm_msi_start(struct device* dev);
 
 /**
- * @brief Allocate an iv resource for external events
- *
- * @param iv
+ * @brief Query number of msi avaliable for the device
  */
 int
-isrm_ivexalloc(isr_cb handler);
+isrm_msi_avaliable(msienv_t msienv);
 
 /**
- * @brief Allocate an iv resource for MSI use
- *
- * @param iv
+ * @brief Allocate a msi resource within defined msi resource list
+ *        for the device, indexed by `index`
  */
 msi_vector_t
-isrm_msialloc(isr_cb handler);
+isrm_msi_alloc(msienv_t msienv, cpu_t cpu, int index, isr_cb handler);
+
+/**
+ * @brief Set the sideband information will be used for upcoming
+ *        allocations
+ */
+void
+isrm_msi_set_sideband(msienv_t msienv, ptr_t sideband);
+
+/**
+ * @brief Done MSI allocation
+ */
+void
+isrm_msi_done(msienv_t msienv);
+
+static inline must_inline msi_vector_t
+isrm_msi_alloc_simple(struct device* dev, cpu_t cpu, isr_cb handler)
+{   
+    msi_vector_t v;
+    msienv_t env;
+
+    env = isrm_msi_start(dev);
+    v = isrm_msi_alloc(env, cpu, 0, handler);
+    isrm_msi_done(env);
+
+    return v;
+}
 
 /**
  * @brief Bind the iv according to given device tree node
@@ -70,7 +96,7 @@ isrm_msialloc(isr_cb handler);
  * @param node
  */
 int
-isrm_bind_dtnode(struct dt_intr_node* node, isr_cb handler);
+isrm_bind_dtn(struct dt_intr_node* node);
 
 /**
  * @brief Get the handler associated with the given iv