interrupt_controller: gicv3_its: add get_msi_addr API
Add get_msi_addr() callback to ITS API to retrieve the GITS_TRANSLATER
physical address to be set in the MSI message address field.
Signed-off-by: Neil Armstrong <narmstrong@baylibre.com>
diff --git a/drivers/interrupt_controller/intc_gicv3_its.c b/drivers/interrupt_controller/intc_gicv3_its.c
index 491305b..e9ab069 100644
--- a/drivers/interrupt_controller/intc_gicv3_its.c
+++ b/drivers/interrupt_controller/intc_gicv3_its.c
@@ -561,6 +561,13 @@
return atomic_inc(&nlpi_intid);
}
+static uint32_t gicv3_its_get_msi_addr(const struct device *dev)
+{
+ const struct gicv3_its_config *cfg = (const struct gicv3_its_config *)dev->config;
+
+ return cfg->base_addr + GITS_TRANSLATER;
+}
+
#define ITS_RDIST_MAP(n) \
{ \
const struct device *dev = DEVICE_DT_INST_GET(n); \
@@ -651,6 +658,7 @@
.setup_deviceid = gicv3_its_init_device_id,
.map_intid = gicv3_its_map_intid,
.send_int = gicv3_its_send_int,
+ .get_msi_addr = gicv3_its_get_msi_addr,
};
#define GICV3_ITS_INIT(n) \
diff --git a/include/drivers/interrupt_controller/gicv3_its.h b/include/drivers/interrupt_controller/gicv3_its.h
index fc4971c..dfc3659 100644
--- a/include/drivers/interrupt_controller/gicv3_its.h
+++ b/include/drivers/interrupt_controller/gicv3_its.h
@@ -22,12 +22,14 @@
typedef int (*its_api_map_intid_t)(const struct device *dev, uint32_t device_id,
uint32_t event_id, unsigned int intid);
typedef int (*its_api_send_int_t)(const struct device *dev, uint32_t device_id, uint32_t event_id);
+typedef uint32_t (*its_api_get_msi_addr_t)(const struct device *dev);
__subsystem struct its_driver_api {
its_api_alloc_intid_t alloc_intid;
its_api_setup_deviceid_t setup_deviceid;
its_api_map_intid_t map_intid;
its_api_send_int_t send_int;
+ its_api_get_msi_addr_t get_msi_addr;
};
static inline int its_alloc_intid(const struct device *dev)
@@ -64,4 +66,12 @@
return api->send_int(dev, device_id, event_id);
}
+static inline uint32_t its_get_msi_addr(const struct device *dev)
+{
+ const struct its_driver_api *api =
+ (const struct its_driver_api *)dev->api;
+
+ return api->get_msi_addr(dev);
+}
+
#endif /* ZEPHYR_INCLUDE_DRIVERS_GICV3_ITS_H_ */