From: Michal Swiatkowski <michal.swiatkowski@linux.intel.com>
To: intel-wired-lan@lists.osuosl.org
Cc: netdev@vger.kernel.org,
Michal Swiatkowski <michal.swiatkowski@linux.intel.com>,
Aleksandr Loktionov <aleksandr.loktionov@intel.com>
Subject: [PATCH iwl-next v2 07/10] libie, idpf: move parsing alloc vectors command to libie
Date: Fri, 11 Sep 2026 14:49:18 +0200 [thread overview]
Message-ID: <20260911124921.2881348-8-michal.swiatkowski@linux.intel.com> (raw)
In-Reply-To: <20260911124921.2881348-1-michal.swiatkowski@linux.intel.com>
No functional changes. Just moving to make it available from other
ipu drivers.
Reviewed-by: Aleksandr Loktionov <aleksandr.loktionov@intel.com>
Signed-off-by: Michal Swiatkowski <michal.swiatkowski@linux.intel.com>
---
.../net/ethernet/intel/idpf/idpf_virtchnl.c | 85 +----------------
drivers/net/ethernet/intel/libie/irq.c | 92 +++++++++++++++++++
include/linux/net/intel/libie/irq.h | 9 ++
3 files changed, 104 insertions(+), 82 deletions(-)
diff --git a/drivers/net/ethernet/intel/idpf/idpf_virtchnl.c b/drivers/net/ethernet/intel/idpf/idpf_virtchnl.c
index 20e471def235..3df6ad291e64 100644
--- a/drivers/net/ethernet/intel/idpf/idpf_virtchnl.c
+++ b/drivers/net/ethernet/intel/idpf/idpf_virtchnl.c
@@ -2229,83 +2229,6 @@ int idpf_send_add_queues_msg(struct idpf_adapter *adapter,
return err;
}
-/**
- * idpf_create_vectors_info - Save vectors information from firmware
- * @info: parsed information is stored here
- * @caps: virtchannel capabilities
- * @vectors: vector information from firmware to be parsed
- * @num_vectors: number of vectors
- *
- * Returns 0 on success, negative on failure.
- */
-static int idpf_create_vectors_info(struct libie_irq_info *info,
- const struct virtchnl2_get_capabilities *caps,
- const struct virtchnl2_alloc_vectors *vectors,
- const u16 num_vectors)
-{
- const struct virtchnl2_vector_chunks *chunks = &vectors->vchunks;
- int all_vectors = num_vectors + IDPF_MBX_Q_VEC;
- struct libie_hw_vector *vector;
- int reg_cnt;
-
- if (le16_to_cpu(vectors->num_vectors) < num_vectors)
- return -EINVAL;
-
- info->vectors = kzalloc_objs(*info->vectors, all_vectors);
- if (!info->vectors)
- return -ENOMEM;
- /* Mailbox irq information are stored in different places. Fill index 0
- * of our vectors info with capabilities and rest with information
- * from vector chunks.
- */
- vector = &info->vectors[0];
- vector->idx = le16_to_cpu(caps->mailbox_vector_id);
- vector->regs.dyn_ctl = le32_to_cpu(caps->mailbox_dyn_ctl);
- reg_cnt = IDPF_MBX_Q_VEC;
-
- for (int i = 0; i < le16_to_cpu(chunks->num_vchunks); i++) {
- const struct virtchnl2_vector_chunk *chunk = &chunks->vchunks[i];
- u32 dyn_spacing, itrn_spacing;
- struct libie_vec_regs reg_val;
- u16 vec_id;
-
- reg_val.dyn_ctl = le32_to_cpu(chunk->dynctl_reg_start);
- reg_val.itrn = le32_to_cpu(chunk->itrn_reg_start);
- reg_val.itrn_index_spacing =
- le32_to_cpu(chunk->itrn_index_spacing);
-
- dyn_spacing = le32_to_cpu(chunk->dynctl_reg_spacing);
- itrn_spacing = le32_to_cpu(chunk->itrn_reg_spacing);
- vec_id = le16_to_cpu(chunk->start_vector_id);
-
- for (int j = 0; j < le16_to_cpu(chunk->num_vectors); j++) {
- if (reg_cnt >= all_vectors)
- break;
-
- vector = &info->vectors[reg_cnt];
-
- vector->regs = reg_val;
- vector->idx = vec_id;
-
- reg_val.dyn_ctl += dyn_spacing;
- reg_val.itrn += itrn_spacing;
-
- vec_id += 1;
- reg_cnt += 1;
- }
- }
-
- if (reg_cnt != all_vectors) {
- kfree(info->vectors);
- info->vectors = NULL;
- return -EINVAL;
- }
-
- info->num = num_vectors + IDPF_MBX_Q_VEC;
-
- return 0;
-}
-
/**
* idpf_send_alloc_vectors_msg - Send virtchnl alloc vectors message
* @adapter: Driver specific private structure
@@ -2350,8 +2273,8 @@ int idpf_send_alloc_vectors_msg(struct idpf_adapter *adapter, u16 num_vectors)
goto free_rx_buf;
}
- err = idpf_create_vectors_info(&adapter->irq_info, &adapter->caps,
- rcvd_vec, num_vectors);
+ err = libie_irq_create_info(&adapter->irq_info, &adapter->caps,
+ rcvd_vec, num_vectors);
if (err)
idpf_send_dealloc_vectors_msg(adapter);
@@ -2378,9 +2301,7 @@ int idpf_send_dealloc_vectors_msg(struct idpf_adapter *adapter)
int buf_size, err;
/* dealloc vectors can fail, but irq_info still needs to be cleaned */
- kfree(adapter->irq_info.vectors);
- adapter->irq_info.vectors = NULL;
- adapter->irq_info.num = 0;
+ libie_irq_destroy_info(&adapter->irq_info);
buf_size = struct_size(&ac->vchunks, vchunks,
le16_to_cpu(ac->vchunks.num_vchunks));
diff --git a/drivers/net/ethernet/intel/libie/irq.c b/drivers/net/ethernet/intel/libie/irq.c
index 0f73f8becefb..d26ffeffdcb2 100644
--- a/drivers/net/ethernet/intel/libie/irq.c
+++ b/drivers/net/ethernet/intel/libie/irq.c
@@ -2,6 +2,7 @@
/* Copyright (C) 2025 Intel Corporation */
#include <linux/net/intel/libie/irq.h>
+#include <linux/net/intel/virtchnl2.h>
/**
* libie_irq_init - init irq for whole device
@@ -250,6 +251,97 @@ int libie_irq_reserve(struct libie_irq *irq)
}
EXPORT_SYMBOL_NS_GPL(libie_irq_reserve, "LIBIE_IRQ");
+/**
+ * libie_irq_create_info - Save vectors information from firmware
+ * @info: parsed information is stored here
+ * @caps: virtchannel capabilities
+ * @vectors: vector information from firmware to be parsed
+ * @num_vectors: number of vectors
+ *
+ * Return: 0 on success, negative on failure.
+ */
+int libie_irq_create_info(struct libie_irq_info *info,
+ const struct virtchnl2_get_capabilities *caps,
+ const struct virtchnl2_alloc_vectors *vectors,
+ const u16 num_vectors)
+{
+ const struct virtchnl2_vector_chunks *chunks = &vectors->vchunks;
+ struct libie_hw_vector *vector;
+ const int mb_vectors = 1;
+ int reg_cnt, all_vectors;
+
+ if (le16_to_cpu(vectors->num_vectors) < num_vectors)
+ return -EINVAL;
+
+ all_vectors = num_vectors + mb_vectors;
+ info->vectors = kzalloc_objs(*info->vectors, all_vectors);
+ if (!info->vectors)
+ return -ENOMEM;
+ /* Mailbox irq information are stored in different places. Fill index 0
+ * of our vectors info with capabilities and rest with information
+ * from vector chunks.
+ */
+ vector = &info->vectors[0];
+ vector->idx = le16_to_cpu(caps->mailbox_vector_id);
+ vector->regs.dyn_ctl = le32_to_cpu(caps->mailbox_dyn_ctl);
+ reg_cnt = mb_vectors;
+
+ for (int i = 0; i < le16_to_cpu(chunks->num_vchunks); i++) {
+ const struct virtchnl2_vector_chunk *chunk = &chunks->vchunks[i];
+ u32 dyn_spacing, itrn_spacing;
+ struct libie_vec_regs reg_val;
+ u16 vec_id;
+
+ reg_val.dyn_ctl = le32_to_cpu(chunk->dynctl_reg_start);
+ reg_val.itrn = le32_to_cpu(chunk->itrn_reg_start);
+ reg_val.itrn_index_spacing =
+ le32_to_cpu(chunk->itrn_index_spacing);
+
+ dyn_spacing = le32_to_cpu(chunk->dynctl_reg_spacing);
+ itrn_spacing = le32_to_cpu(chunk->itrn_reg_spacing);
+ vec_id = le16_to_cpu(chunk->start_vector_id);
+
+ for (int j = 0; j < le16_to_cpu(chunk->num_vectors); j++) {
+ if (reg_cnt >= all_vectors)
+ break;
+
+ vector = &info->vectors[reg_cnt];
+
+ vector->regs = reg_val;
+ vector->idx = vec_id;
+
+ reg_val.dyn_ctl += dyn_spacing;
+ reg_val.itrn += itrn_spacing;
+
+ vec_id += 1;
+ reg_cnt += 1;
+ }
+ }
+
+ if (reg_cnt != all_vectors) {
+ kfree(info->vectors);
+ info->vectors = NULL;
+ return -EINVAL;
+ }
+
+ info->num = all_vectors;
+
+ return 0;
+}
+EXPORT_SYMBOL_NS_GPL(libie_irq_create_info, "LIBIE_IRQ");
+
+/**
+ * libie_irq_destroy_info - free memory allocated during building irq_info
+ * @info: libie_irq_info struct to be freed
+ */
+void libie_irq_destroy_info(struct libie_irq_info *info)
+{
+ kfree(info->vectors);
+ info->vectors = NULL;
+ info->num = 0;
+}
+EXPORT_SYMBOL_NS_GPL(libie_irq_destroy_info, "LIBIE_IRQ");
+
/* Module */
MODULE_DESCRIPTION("Helper functions for managing MSI-X in driver");
diff --git a/include/linux/net/intel/libie/irq.h b/include/linux/net/intel/libie/irq.h
index e219fde575d8..8d5873f13871 100644
--- a/include/linux/net/intel/libie/irq.h
+++ b/include/linux/net/intel/libie/irq.h
@@ -105,5 +105,14 @@ struct msi_map libie_irq_alloc(struct libie_irq *irq, enum libie_irq_type type);
void libie_irq_free(struct libie_irq *irq, struct msi_map map);
int libie_irq_reserve(struct libie_irq *irq);
void libie_put_irq(struct libie_irq *irq, unsigned int index);
+/* IPU specific functions. */
+struct virtchnl2_get_capabilities;
+struct virtchnl2_alloc_vectors;
+
+void libie_irq_destroy_info(struct libie_irq_info *info);
+int libie_irq_create_info(struct libie_irq_info *info,
+ const struct virtchnl2_get_capabilities *caps,
+ const struct virtchnl2_alloc_vectors *vectors,
+ const u16 num_vectors);
#endif /* __LIBIE_IRQ_H */
--
2.49.0
next prev parent reply other threads:[~2026-09-11 13:30 UTC|newest]
Thread overview: 13+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-09-11 12:49 [PATCH iwl-next v2 00/10] Interrupts helper in libie Michal Swiatkowski
2026-09-11 12:49 ` [PATCH iwl-next v2 01/10] idpf: store HW vectors information Michal Swiatkowski
2026-09-11 12:49 ` [PATCH iwl-next v2 02/10] idpf: fill q_vector interrupt registers one by one Michal Swiatkowski
2026-09-11 12:49 ` [PATCH iwl-next v2 03/10] idpf: get rid of msix_entries array Michal Swiatkowski
2026-09-11 12:49 ` [PATCH iwl-next v2 04/10] idpf: drop v_idx from q_vector structure Michal Swiatkowski
2026-09-11 12:49 ` [PATCH iwl-next v2 05/10] libie, idpf: move irq code to libie Michal Swiatkowski
2026-09-11 12:49 ` [PATCH iwl-next v2 06/10] libie, idpf: move hardware irq info struct " Michal Swiatkowski
2026-09-11 12:49 ` Michal Swiatkowski [this message]
2026-09-11 12:49 ` [PATCH iwl-next v2 08/10] ice: use libie_irq for interrupts managing Michal Swiatkowski
2026-09-11 12:49 ` [PATCH iwl-next v2 09/10] ixd: support for getting lan memory regions Michal Swiatkowski
2026-10-08 15:32 ` R, Bharath
2026-09-11 12:49 ` [PATCH iwl-next v2 10/10] ixd: use interrupt for mailbox communication Michal Swiatkowski
2026-10-08 15:35 ` R, Bharath
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20260911124921.2881348-8-michal.swiatkowski@linux.intel.com \
--to=michal.swiatkowski@linux.intel.com \
--cc=aleksandr.loktionov@intel.com \
--cc=intel-wired-lan@lists.osuosl.org \
--cc=netdev@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.