On Thu Aug 27 15:33:15 2026 +0300, Antti Laakso wrote:
> The get/put token methods read/write to ipu7 firmware message queues.
>
> Signed-off-by: Antti Laakso <[email protected]>
> Signed-off-by: Sakari Ailus <[email protected]>
Patch committed.
Thanks,
Sakari Ailus
drivers/media/pci/intel/ipu6/Makefile | 4 +-
drivers/media/pci/intel/ipu6/ipu7-fw-com.c | 74 ++++++++++++++++++++++++++++++
drivers/media/pci/intel/ipu6/ipu7-fw-com.h | 51 ++++++++++++++++++++
3 files changed, 128 insertions(+), 1 deletion(-)
---
diff --git a/drivers/media/pci/intel/ipu6/Makefile
b/drivers/media/pci/intel/ipu6/Makefile
index c0daf0995b22..406e2e19df17 100644
--- a/drivers/media/pci/intel/ipu6/Makefile
+++ b/drivers/media/pci/intel/ipu6/Makefile
@@ -8,7 +8,9 @@ intel-ipu6-y := ipu6.o \
ipu7-mmu-hw.o \
ipu6-buttress.o \
ipu6-cpd.o \
- ipu6-fw-com.o
+ ipu6-fw-com.o \
+ ipu7-fw-com.o \
+ ipu7-boot.o
obj-$(CONFIG_VIDEO_INTEL_IPU6) += intel-ipu6.o
diff --git a/drivers/media/pci/intel/ipu6/ipu7-fw-com.c
b/drivers/media/pci/intel/ipu6/ipu7-fw-com.c
new file mode 100644
index 000000000000..7dd1e683aa92
--- /dev/null
+++ b/drivers/media/pci/intel/ipu6/ipu7-fw-com.c
@@ -0,0 +1,74 @@
+// SPDX-License-Identifier: GPL-2.0-only
+/*
+ * Copyright (C) 2026 Intel Corporation
+ */
+
+#include <linux/io.h>
+
+#include "ipu7-fw-com.h"
+
+static void __iomem *ipu7_fw_com_get_indices(struct ipu7_fw_com_context *ctx,
+ u32 q)
+{
+ return ctx->queue_indices + (q * sizeof(struct
ipu7_fw_com_queue_indices));
+}
+
+void *ipu7_fw_com_get_token(struct ipu7_fw_com_context *ctx, int q)
+{
+ struct ipu7_fw_com_queue_config *queue_params = &ctx->queue_configs[q];
+ void __iomem *queue_indices = ipu7_fw_com_get_indices(ctx, q);
+ u32 write_index = readl(queue_indices +
+ offsetof(struct ipu7_fw_com_queue_indices,
+ write_index));
+ u32 read_index = readl(queue_indices +
+ offsetof(struct ipu7_fw_com_queue_indices,
+ read_index));
+ void *token = NULL;
+
+ if (q < ctx->num_output_queues) {
+ /* Output queue */
+ bool empty = (write_index == read_index);
+
+ if (!empty)
+ token = queue_params->token_array_mem +
+ read_index *
+ queue_params->token_size_in_bytes;
+ } else {
+ /* Input queue */
+ bool full = (read_index == ((write_index + 1U) %
+ (u32)queue_params->max_capacity));
+
+ if (!full)
+ token = queue_params->token_array_mem +
+ write_index * queue_params->token_size_in_bytes;
+ }
+ return token;
+}
+EXPORT_SYMBOL_NS_GPL(ipu7_fw_com_get_token, "INTEL_IPU6");
+
+void ipu7_fw_com_put_token(struct ipu7_fw_com_context *ctx, int q)
+{
+ struct ipu7_fw_com_queue_config *queue_params = &ctx->queue_configs[q];
+ void __iomem *queue_indices = ipu7_fw_com_get_indices(ctx, q);
+ u32 offset, index;
+
+ if (q < ctx->num_output_queues)
+ /* Output queue */
+ offset = offsetof(struct ipu7_fw_com_queue_indices, read_index);
+
+ else
+ /* Input queue */
+ offset = offsetof(struct ipu7_fw_com_queue_indices,
write_index);
+
+ index = readl(queue_indices + offset);
+ writel((index + 1U) % queue_params->max_capacity,
+ queue_indices + offset);
+}
+EXPORT_SYMBOL_NS_GPL(ipu7_fw_com_put_token, "INTEL_IPU6");
+
+struct ipu7_fw_com_queue_params_config *
+ipu7_fw_com_get_queue_config(struct ipu7_fw_com_config *config)
+{
+ return (struct ipu7_fw_com_queue_params_config *)(&config[1]);
+}
+EXPORT_SYMBOL_NS_GPL(ipu7_fw_com_get_queue_config, "INTEL_IPU6");
diff --git a/drivers/media/pci/intel/ipu6/ipu7-fw-com.h
b/drivers/media/pci/intel/ipu6/ipu7-fw-com.h
new file mode 100644
index 000000000000..10c09e759bed
--- /dev/null
+++ b/drivers/media/pci/intel/ipu6/ipu7-fw-com.h
@@ -0,0 +1,51 @@
+/* SPDX-License-Identifier: GPL-2.0-only */
+/* Copyright (C) 2026 Intel Corporation */
+
+#ifndef IPU7_FW_COM_H
+#define IPU7_FW_COM_H
+
+#include <linux/types.h>
+
+struct ipu7_fw_com_queue_config {
+ void *token_array_mem;
+ u32 queue_size;
+ u16 token_size_in_bytes;
+ u16 max_capacity;
+};
+
+struct ipu7_fw_com_context {
+ u16 num_input_queues;
+ u16 num_output_queues;
+ struct ipu7_fw_com_queue_config *queue_configs;
+ void __iomem *queue_indices;
+ dma_addr_t queue_mem_dma_addr;
+ void *queue_mem;
+ u32 queue_mem_size;
+ struct ipu7_boot_abi_cfg *boot_config;
+ dma_addr_t boot_config_dma_addr;
+ u32 boot_config_size;
+ u32 fw_entry;
+};
+
+struct ipu7_fw_com_queue_params_config {
+ u32 token_array_mem;
+ u16 token_size_in_bytes;
+ u16 max_capacity;
+};
+
+struct ipu7_fw_com_config {
+ u16 max_output_queues;
+ u16 max_input_queues;
+};
+
+struct ipu7_fw_com_queue_indices {
+ u32 read_index;
+ u32 write_index;
+};
+
+void ipu7_fw_com_put_token(struct ipu7_fw_com_context *ctx, int q);
+void *ipu7_fw_com_get_token(struct ipu7_fw_com_context *ctx, int q);
+struct ipu7_fw_com_queue_params_config *
+ipu7_fw_com_get_queue_config(struct ipu7_fw_com_config *config);
+
+#endif /* IPU7_FW_COM_H */
_______________________________________________
linuxtv-commits mailing list -- [email protected]
To unsubscribe send an email to [email protected]