summaryrefslogtreecommitdiff
path: root/gxp-firmware-data.c
diff options
context:
space:
mode:
Diffstat (limited to 'gxp-firmware-data.c')
-rw-r--r--gxp-firmware-data.c37
1 files changed, 32 insertions, 5 deletions
diff --git a/gxp-firmware-data.c b/gxp-firmware-data.c
index f782fcd..2f0c84c 100644
--- a/gxp-firmware-data.c
+++ b/gxp-firmware-data.c
@@ -710,13 +710,14 @@ void gxp_fw_data_destroy(struct gxp_dev *gxp)
}
int gxp_fw_data_set_telemetry_descriptors(struct gxp_dev *gxp, u8 type,
- u32 *buffer_addrs,
+ u32 host_status,
+ dma_addr_t *buffer_addrs,
u32 per_buffer_size)
{
struct gxp_telemetry_descriptor *descriptor =
gxp->data_mgr->telemetry_mem.host_addr;
struct telemetry_descriptor *core_descriptors;
- int i;
+ uint core;
if (type == GXP_TELEMETRY_TYPE_LOGGING)
core_descriptors = descriptor->per_core_loggers;
@@ -725,10 +726,36 @@ int gxp_fw_data_set_telemetry_descriptors(struct gxp_dev *gxp, u8 type,
else
return -EINVAL;
- for (i = 0; i < NUM_CORES; i++) {
- core_descriptors[i].buffer_addr = buffer_addrs[i];
- core_descriptors[i].buffer_size = per_buffer_size;
+ /* Validate that the provided IOVAs are addressable (i.e. 32-bit) */
+ for (core = 0; core < NUM_CORES; core++) {
+ if (buffer_addrs[core] > U32_MAX)
+ return -EINVAL;
+ }
+
+ for (core = 0; core < NUM_CORES; core++) {
+ core_descriptors[core].host_status = host_status;
+ core_descriptors[core].buffer_addr = (u32)buffer_addrs[core];
+ core_descriptors[core].buffer_size = per_buffer_size;
}
return 0;
}
+
+u32 gxp_fw_data_get_telemetry_device_status(struct gxp_dev *gxp, uint core,
+ u8 type)
+{
+ struct gxp_telemetry_descriptor *descriptor =
+ gxp->data_mgr->telemetry_mem.host_addr;
+
+ if (core >= GXP_NUM_CORES)
+ return 0;
+
+ switch (type) {
+ case GXP_TELEMETRY_TYPE_LOGGING:
+ return descriptor->per_core_loggers[core].device_status;
+ case GXP_TELEMETRY_TYPE_TRACING:
+ return descriptor->per_core_tracers[core].device_status;
+ default:
+ return 0;
+ }
+}