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]

Reply via email to