/* SPDX-License-Identifier: GPL-2.0 */ /* Copyright (C) 2018-2025, Advanced Micro Devices, Inc. */ #ifndef _IONIC_API_H_ #define _IONIC_API_H_ #include #include "ionic_if.h" #include "ionic_regs.h" /** * struct ionic_aux_dev - Auxiliary device information * @lif: Logical interface * @idx: Index identifier * @adev: Auxiliary device */ struct ionic_aux_dev { struct ionic_lif *lif; int idx; struct auxiliary_device adev; }; /** * struct ionic_admin_ctx - Admin command context * @work: Work completion wait queue element * @cmd: Admin command (64B) to be copied to the queue * @comp: Admin completion (16B) copied from the queue */ struct ionic_admin_ctx { struct completion work; union ionic_adminq_cmd cmd; union ionic_adminq_comp comp; }; #define IONIC_INTR_INDEX_NOT_ASSIGNED -1 #define IONIC_INTR_NAME_MAX_SZ 32 /** * struct ionic_intr_info - Interrupt information * @name: Name identifier * @rearm_count: Interrupt rearm count * @index: Interrupt index position * @vector: Interrupt number * @dim_coal_hw: Interrupt coalesce value in hardware units * @affinity_mask: CPU affinity mask * @aff_notify: context for notification of IRQ affinity changes */ struct ionic_intr_info { char name[IONIC_INTR_NAME_MAX_SZ]; u64 rearm_count; unsigned int index; unsigned int vector; u32 dim_coal_hw; cpumask_var_t *affinity_mask; struct irq_affinity_notify aff_notify; }; /** * ionic_adminq_post_wait - Post an admin command and wait for response * @lif: Logical interface * @ctx: API admin command context * * Post the command to an admin queue in the ethernet driver. If this command * succeeds, then the command has been posted, but that does not indicate a * completion. If this command returns success, then the completion callback * will eventually be called. * * Return: zero or negative error status */ int ionic_adminq_post_wait(struct ionic_lif *lif, struct ionic_admin_ctx *ctx); /** * ionic_error_to_errno - Transform ionic_if errors to os errno * @code: Ionic error number * * Return: Negative OS error number or zero */ int ionic_error_to_errno(enum ionic_status_code code); /** * ionic_request_rdma_reset - request reset or disable the device or lif * @lif: Logical interface * * The reset is triggered asynchronously. It will wait until reset request * completes or times out. */ void ionic_request_rdma_reset(struct ionic_lif *lif); /** * ionic_intr_alloc - Reserve a device interrupt * @lif: Logical interface * @intr: Reserved ionic interrupt structure * * Reserve an interrupt index and get irq number for that index. * * Return: zero or negative error status */ int ionic_intr_alloc(struct ionic_lif *lif, struct ionic_intr_info *intr); /** * ionic_intr_free - Release a device interrupt index * @lif: Logical interface * @intr: Interrupt index * * Mark the interrupt index unused so that it can be reserved again. */ void ionic_intr_free(struct ionic_lif *lif, int intr); /** * ionic_get_cmb - Reserve cmb pages * @lif: Logical interface * @pgid: First page index * @pgaddr: First page bus addr (contiguous) * @order: Log base two number of pages (PAGE_SIZE) * @stride_log2: Size of stride to determine CMB pool * @expdb: Will be set to true if this CMB region has expdb enabled * * Return: zero or negative error status */ int ionic_get_cmb(struct ionic_lif *lif, u32 *pgid, phys_addr_t *pgaddr, int order, u8 stride_log2, bool *expdb); /** * ionic_put_cmb - Release cmb pages * @lif: Logical interface * @pgid: First page index * @order: Log base two number of pages (PAGE_SIZE) */ void ionic_put_cmb(struct ionic_lif *lif, u32 pgid, int order); #endif /* _IONIC_API_H_ */