summaryrefslogtreecommitdiff
path: root/drivers/net/ethernet/pensando/ionic/ionic_api.h
blob: bd88666836b80785f8db7c57fdf7121b35ac7659 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
/* SPDX-License-Identifier: GPL-2.0 */
/* Copyright (C) 2018-2025, Advanced Micro Devices, Inc. */

#ifndef _IONIC_API_H_
#define _IONIC_API_H_

#include <linux/auxiliary_bus.h>
#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_ */