Skip to content

Commit 4930fbf

Browse files
plinga1anguy11
authored andcommitted
idpf: add core init and interrupt request
As the mailbox is setup, add the necessary send and receive mailbox message framework to support the virtchnl communication between the driver and device Control Plane (CP). Add the core initialization. To start with, driver confirms the virtchnl version with the CP. Once that is done, it requests and gets the required capabilities and resources needed such as max vectors, queues etc. Based on the vector information received in 'VIRTCHNL2_OP_GET_CAPS', request the stack to allocate the required vectors. Finally add the interrupt handling mechanism for the mailbox queue and enable the interrupt. Note: Checkpatch issues a warning about IDPF_FOREACH_VPORT_VC_STATE and IDPF_GEN_STRING being complex macros and should be enclosed in parentheses but it's not the case. They are never used as a statement and instead only used to define the enum and array. Co-developed-by: Alan Brady <[email protected]> Signed-off-by: Alan Brady <[email protected]> Co-developed-by: Emil Tantilov <[email protected]> Signed-off-by: Emil Tantilov <[email protected]> Co-developed-by: Joshua Hay <[email protected]> Signed-off-by: Joshua Hay <[email protected]> Co-developed-by: Madhu Chittim <[email protected]> Signed-off-by: Madhu Chittim <[email protected]> Co-developed-by: Phani Burra <[email protected]> Signed-off-by: Phani Burra <[email protected]> Co-developed-by: Shailendra Bhatnagar <[email protected]> Signed-off-by: Shailendra Bhatnagar <[email protected]> Reviewed-by: Sridhar Samudrala <[email protected]> Reviewed-by: Willem de Bruijn <[email protected]> Signed-off-by: Pavan Kumar Linga <[email protected]> Signed-off-by: Tony Nguyen <[email protected]>
1 parent 8077c72 commit 4930fbf

File tree

9 files changed

+1471
-3
lines changed

9 files changed

+1471
-3
lines changed

drivers/net/ethernet/intel/idpf/idpf.h

Lines changed: 163 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,23 +11,40 @@ struct idpf_adapter;
1111
#include <linux/etherdevice.h>
1212
#include <linux/pci.h>
1313

14+
#include "virtchnl2.h"
15+
#include "idpf_txrx.h"
1416
#include "idpf_controlq.h"
1517

1618
/* Default Mailbox settings */
1719
#define IDPF_NUM_DFLT_MBX_Q 2 /* includes both TX and RX */
1820
#define IDPF_DFLT_MBX_Q_LEN 64
1921
#define IDPF_DFLT_MBX_ID -1
22+
/* maximum number of times to try before resetting mailbox */
23+
#define IDPF_MB_MAX_ERR 20
24+
#define IDPF_WAIT_FOR_EVENT_TIMEO_MIN 2000
25+
#define IDPF_WAIT_FOR_EVENT_TIMEO 60000
26+
27+
#define IDPF_MAX_WAIT 500
2028

2129
/* available message levels */
2230
#define IDPF_AVAIL_NETIF_M (NETIF_MSG_DRV | NETIF_MSG_PROBE | NETIF_MSG_LINK)
2331

32+
#define IDPF_VIRTCHNL_VERSION_MAJOR VIRTCHNL2_VERSION_MAJOR_2
33+
#define IDPF_VIRTCHNL_VERSION_MINOR VIRTCHNL2_VERSION_MINOR_0
34+
2435
/**
2536
* enum idpf_state - State machine to handle bring up
2637
* @__IDPF_STARTUP: Start the state machine
38+
* @__IDPF_VER_CHECK: Negotiate virtchnl version
39+
* @__IDPF_GET_CAPS: Negotiate capabilities
40+
* @__IDPF_INIT_SW: Init based on given capabilities
2741
* @__IDPF_STATE_LAST: Must be last, used to determine size
2842
*/
2943
enum idpf_state {
3044
__IDPF_STARTUP,
45+
__IDPF_VER_CHECK,
46+
__IDPF_GET_CAPS,
47+
__IDPF_INIT_SW,
3148
__IDPF_STATE_LAST,
3249
};
3350

@@ -37,13 +54,15 @@ enum idpf_state {
3754
* @IDPF_HR_DRV_LOAD: Set on driver load for a clean HW
3855
* @IDPF_HR_RESET_IN_PROG: Reset in progress
3956
* @IDPF_REMOVE_IN_PROG: Driver remove in progress
57+
* @IDPF_MB_INTR_MODE: Mailbox in interrupt mode
4058
* @IDPF_FLAGS_NBITS: Must be last
4159
*/
4260
enum idpf_flags {
4361
IDPF_HR_FUNC_RESET,
4462
IDPF_HR_DRV_LOAD,
4563
IDPF_HR_RESET_IN_PROG,
4664
IDPF_REMOVE_IN_PROG,
65+
IDPF_MB_INTR_MODE,
4766
IDPF_FLAGS_NBITS,
4867
};
4968

@@ -60,11 +79,13 @@ struct idpf_reset_reg {
6079
/**
6180
* struct idpf_reg_ops - Device specific register operation function pointers
6281
* @ctlq_reg_init: Mailbox control queue register initialization
82+
* @mb_intr_reg_init: Mailbox interrupt register initialization
6383
* @reset_reg_init: Reset register initialization
6484
* @trigger_reset: Trigger a reset to occur
6585
*/
6686
struct idpf_reg_ops {
6787
void (*ctlq_reg_init)(struct idpf_ctlq_create_info *cq);
88+
void (*mb_intr_reg_init)(struct idpf_adapter *adapter);
6889
void (*reset_reg_init)(struct idpf_adapter *adapter);
6990
void (*trigger_reset)(struct idpf_adapter *adapter,
7091
enum idpf_flags trig_cause);
@@ -78,35 +99,149 @@ struct idpf_dev_ops {
7899
struct idpf_reg_ops reg_ops;
79100
};
80101

102+
/* These macros allow us to generate an enum and a matching char * array of
103+
* stringified enums that are always in sync. Checkpatch issues a bogus warning
104+
* about this being a complex macro; but it's wrong, these are never used as a
105+
* statement and instead only used to define the enum and array.
106+
*/
107+
#define IDPF_FOREACH_VPORT_VC_STATE(STATE) \
108+
STATE(IDPF_VC_ALLOC_VECTORS) \
109+
STATE(IDPF_VC_ALLOC_VECTORS_ERR) \
110+
STATE(IDPF_VC_DEALLOC_VECTORS) \
111+
STATE(IDPF_VC_DEALLOC_VECTORS_ERR) \
112+
STATE(IDPF_VC_NBITS)
113+
114+
#define IDPF_GEN_ENUM(ENUM) ENUM,
115+
#define IDPF_GEN_STRING(STRING) #STRING,
116+
117+
enum idpf_vport_vc_state {
118+
IDPF_FOREACH_VPORT_VC_STATE(IDPF_GEN_ENUM)
119+
};
120+
121+
extern const char * const idpf_vport_vc_state_str[];
122+
123+
/**
124+
* struct idpf_vport - Handle for netdevices and queue resources
125+
* @vport_id: Device given vport identifier
126+
*/
127+
struct idpf_vport {
128+
u32 vport_id;
129+
};
130+
131+
/**
132+
* struct idpf_vector_lifo - Stack to maintain vector indexes used for vector
133+
* distribution algorithm
134+
* @top: Points to stack top i.e. next available vector index
135+
* @base: Always points to start of the free pool
136+
* @size: Total size of the vector stack
137+
* @vec_idx: Array to store all the vector indexes
138+
*
139+
* Vector stack maintains all the relative vector indexes at the *adapter*
140+
* level. This stack is divided into 2 parts, first one is called as 'default
141+
* pool' and other one is called 'free pool'. Vector distribution algorithm
142+
* gives priority to default vports in a way that at least IDPF_MIN_Q_VEC
143+
* vectors are allocated per default vport and the relative vector indexes for
144+
* those are maintained in default pool. Free pool contains all the unallocated
145+
* vector indexes which can be allocated on-demand basis. Mailbox vector index
146+
* is maintained in the default pool of the stack.
147+
*/
148+
struct idpf_vector_lifo {
149+
u16 top;
150+
u16 base;
151+
u16 size;
152+
u16 *vec_idx;
153+
};
154+
81155
/**
82156
* struct idpf_adapter - Device data struct generated on probe
83157
* @pdev: PCI device struct given on probe
158+
* @virt_ver_maj: Virtchnl version major
159+
* @virt_ver_min: Virtchnl version minor
84160
* @msg_enable: Debug message level enabled
161+
* @mb_wait_count: Number of times mailbox was attempted initialization
85162
* @state: Init state machine
86163
* @flags: See enum idpf_flags
87164
* @reset_reg: See struct idpf_reset_reg
88165
* @hw: Device access data
166+
* @num_req_msix: Requested number of MSIX vectors
167+
* @num_avail_msix: Available number of MSIX vectors
168+
* @num_msix_entries: Number of entries in MSIX table
169+
* @msix_entries: MSIX table
170+
* @req_vec_chunks: Requested vector chunk data
171+
* @mb_vector: Mailbox vector data
172+
* @vector_stack: Stack to store the msix vector indexes
173+
* @irq_mb_handler: Handler for hard interrupt for mailbox
174+
* @serv_task: Periodically recurring maintenance task
175+
* @serv_wq: Workqueue for service task
176+
* @mbx_task: Task to handle mailbox interrupts
177+
* @mbx_wq: Workqueue for mailbox responses
89178
* @vc_event_task: Task to handle out of band virtchnl event notifications
90179
* @vc_event_wq: Workqueue for virtchnl events
180+
* @caps: Negotiated capabilities with device
181+
* @vchnl_wq: Wait queue for virtchnl messages
182+
* @vc_state: Virtchnl message state
183+
* @vc_msg: Virtchnl message buffer
91184
* @dev_ops: See idpf_dev_ops
92185
* @vport_ctrl_lock: Lock to protect the vport control flow
186+
* @vector_lock: Lock to protect vector distribution
187+
* @vc_buf_lock: Lock to protect virtchnl buffer
93188
*/
94189
struct idpf_adapter {
95190
struct pci_dev *pdev;
191+
u32 virt_ver_maj;
192+
u32 virt_ver_min;
193+
96194
u32 msg_enable;
195+
u32 mb_wait_count;
97196
enum idpf_state state;
98197
DECLARE_BITMAP(flags, IDPF_FLAGS_NBITS);
99198
struct idpf_reset_reg reset_reg;
100199
struct idpf_hw hw;
200+
u16 num_req_msix;
201+
u16 num_avail_msix;
202+
u16 num_msix_entries;
203+
struct msix_entry *msix_entries;
204+
struct virtchnl2_alloc_vectors *req_vec_chunks;
205+
struct idpf_q_vector mb_vector;
206+
struct idpf_vector_lifo vector_stack;
207+
irqreturn_t (*irq_mb_handler)(int irq, void *data);
101208

209+
struct delayed_work serv_task;
210+
struct workqueue_struct *serv_wq;
211+
struct delayed_work mbx_task;
212+
struct workqueue_struct *mbx_wq;
102213
struct delayed_work vc_event_task;
103214
struct workqueue_struct *vc_event_wq;
215+
struct virtchnl2_get_capabilities caps;
104216

217+
wait_queue_head_t vchnl_wq;
218+
DECLARE_BITMAP(vc_state, IDPF_VC_NBITS);
219+
char vc_msg[IDPF_CTLQ_MAX_BUF_LEN];
105220
struct idpf_dev_ops dev_ops;
106221

107222
struct mutex vport_ctrl_lock;
223+
struct mutex vector_lock;
224+
struct mutex vc_buf_lock;
108225
};
109226

227+
/**
228+
* idpf_get_reserved_vecs - Get reserved vectors
229+
* @adapter: private data struct
230+
*/
231+
static inline u16 idpf_get_reserved_vecs(struct idpf_adapter *adapter)
232+
{
233+
return le16_to_cpu(adapter->caps.num_allocated_vectors);
234+
}
235+
236+
/**
237+
* idpf_get_default_vports - Get default number of vports
238+
* @adapter: private data struct
239+
*/
240+
static inline u16 idpf_get_default_vports(struct idpf_adapter *adapter)
241+
{
242+
return le16_to_cpu(adapter->caps.default_num_vports);
243+
}
244+
110245
/**
111246
* idpf_get_reg_addr - Get BAR0 register address
112247
* @adapter: private data struct
@@ -135,10 +270,38 @@ static inline bool idpf_is_reset_detected(struct idpf_adapter *adapter)
135270
adapter->hw.arq->reg.len_mask);
136271
}
137272

273+
/**
274+
* idpf_is_reset_in_prog - check if reset is in progress
275+
* @adapter: driver specific private structure
276+
*
277+
* Returns true if hard reset is in progress, false otherwise
278+
*/
279+
static inline bool idpf_is_reset_in_prog(struct idpf_adapter *adapter)
280+
{
281+
return (test_bit(IDPF_HR_RESET_IN_PROG, adapter->flags) ||
282+
test_bit(IDPF_HR_FUNC_RESET, adapter->flags) ||
283+
test_bit(IDPF_HR_DRV_LOAD, adapter->flags));
284+
}
285+
286+
void idpf_service_task(struct work_struct *work);
287+
void idpf_mbx_task(struct work_struct *work);
138288
void idpf_vc_event_task(struct work_struct *work);
139289
void idpf_dev_ops_init(struct idpf_adapter *adapter);
140290
void idpf_vf_dev_ops_init(struct idpf_adapter *adapter);
141291
int idpf_init_dflt_mbx(struct idpf_adapter *adapter);
142292
void idpf_deinit_dflt_mbx(struct idpf_adapter *adapter);
293+
int idpf_vc_core_init(struct idpf_adapter *adapter);
294+
void idpf_vc_core_deinit(struct idpf_adapter *adapter);
295+
int idpf_intr_req(struct idpf_adapter *adapter);
296+
void idpf_intr_rel(struct idpf_adapter *adapter);
297+
int idpf_send_dealloc_vectors_msg(struct idpf_adapter *adapter);
298+
int idpf_send_alloc_vectors_msg(struct idpf_adapter *adapter, u16 num_vectors);
299+
int idpf_get_vec_ids(struct idpf_adapter *adapter,
300+
u16 *vecids, int num_vecids,
301+
struct virtchnl2_vector_chunks *chunks);
302+
int idpf_recv_mb_msg(struct idpf_adapter *adapter, u32 op,
303+
void *msg, int msg_size);
304+
int idpf_send_mb_msg(struct idpf_adapter *adapter, u32 op,
305+
u16 msg_size, u8 *msg);
143306

144307
#endif /* !_IDPF_H_ */

drivers/net/ethernet/intel/idpf/idpf_dev.c

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,22 @@ static void idpf_ctlq_reg_init(struct idpf_ctlq_create_info *cq)
4444
}
4545
}
4646

47+
/**
48+
* idpf_mb_intr_reg_init - Initialize mailbox interrupt register
49+
* @adapter: adapter structure
50+
*/
51+
static void idpf_mb_intr_reg_init(struct idpf_adapter *adapter)
52+
{
53+
struct idpf_intr_reg *intr = &adapter->mb_vector.intr_reg;
54+
u32 dyn_ctl = le32_to_cpu(adapter->caps.mailbox_dyn_ctl);
55+
56+
intr->dyn_ctl = idpf_get_reg_addr(adapter, dyn_ctl);
57+
intr->dyn_ctl_intena_m = PF_GLINT_DYN_CTL_INTENA_M;
58+
intr->dyn_ctl_itridx_m = PF_GLINT_DYN_CTL_ITR_INDX_M;
59+
intr->icr_ena = idpf_get_reg_addr(adapter, PF_INT_DIR_OICR_ENA);
60+
intr->icr_ena_ctlq_m = PF_INT_DIR_OICR_ENA_M;
61+
}
62+
4763
/**
4864
* idpf_reset_reg_init - Initialize reset registers
4965
* @adapter: Driver specific private structure
@@ -76,6 +92,7 @@ static void idpf_trigger_reset(struct idpf_adapter *adapter,
7692
static void idpf_reg_ops_init(struct idpf_adapter *adapter)
7793
{
7894
adapter->dev_ops.reg_ops.ctlq_reg_init = idpf_ctlq_reg_init;
95+
adapter->dev_ops.reg_ops.mb_intr_reg_init = idpf_mb_intr_reg_init;
7996
adapter->dev_ops.reg_ops.reset_reg_init = idpf_reset_reg_init;
8097
adapter->dev_ops.reg_ops.trigger_reset = idpf_trigger_reset;
8198
}

drivers/net/ethernet/intel/idpf/idpf_lan_pf_regs.h

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,49 @@
5353
#define PF_FW_ATQH_ATQH_M GENMASK(9, 0)
5454
#define PF_FW_ATQT (PF_FW_BASE + 0x24)
5555

56+
/* Interrupts */
57+
#define PF_GLINT_BASE 0x08900000
58+
#define PF_GLINT_DYN_CTL(_INT) (PF_GLINT_BASE + ((_INT) * 0x1000))
59+
#define PF_GLINT_DYN_CTL_INTENA_S 0
60+
#define PF_GLINT_DYN_CTL_INTENA_M BIT(PF_GLINT_DYN_CTL_INTENA_S)
61+
#define PF_GLINT_DYN_CTL_CLEARPBA_S 1
62+
#define PF_GLINT_DYN_CTL_CLEARPBA_M BIT(PF_GLINT_DYN_CTL_CLEARPBA_S)
63+
#define PF_GLINT_DYN_CTL_SWINT_TRIG_S 2
64+
#define PF_GLINT_DYN_CTL_SWINT_TRIG_M BIT(PF_GLINT_DYN_CTL_SWINT_TRIG_S)
65+
#define PF_GLINT_DYN_CTL_ITR_INDX_S 3
66+
#define PF_GLINT_DYN_CTL_ITR_INDX_M GENMASK(4, 3)
67+
#define PF_GLINT_DYN_CTL_INTERVAL_S 5
68+
#define PF_GLINT_DYN_CTL_INTERVAL_M BIT(PF_GLINT_DYN_CTL_INTERVAL_S)
69+
#define PF_GLINT_DYN_CTL_SW_ITR_INDX_ENA_S 24
70+
#define PF_GLINT_DYN_CTL_SW_ITR_INDX_ENA_M BIT(PF_GLINT_DYN_CTL_SW_ITR_INDX_ENA_S)
71+
#define PF_GLINT_DYN_CTL_SW_ITR_INDX_S 25
72+
#define PF_GLINT_DYN_CTL_SW_ITR_INDX_M BIT(PF_GLINT_DYN_CTL_SW_ITR_INDX_S)
73+
#define PF_GLINT_DYN_CTL_WB_ON_ITR_S 30
74+
#define PF_GLINT_DYN_CTL_WB_ON_ITR_M BIT(PF_GLINT_DYN_CTL_WB_ON_ITR_S)
75+
#define PF_GLINT_DYN_CTL_INTENA_MSK_S 31
76+
#define PF_GLINT_DYN_CTL_INTENA_MSK_M BIT(PF_GLINT_DYN_CTL_INTENA_MSK_S)
77+
78+
/* Generic registers */
79+
#define PF_INT_DIR_OICR_ENA 0x08406000
80+
#define PF_INT_DIR_OICR_ENA_S 0
81+
#define PF_INT_DIR_OICR_ENA_M GENMASK(31, 0)
82+
#define PF_INT_DIR_OICR 0x08406004
83+
#define PF_INT_DIR_OICR_TSYN_EVNT 0
84+
#define PF_INT_DIR_OICR_PHY_TS_0 BIT(1)
85+
#define PF_INT_DIR_OICR_PHY_TS_1 BIT(2)
86+
#define PF_INT_DIR_OICR_CAUSE 0x08406008
87+
#define PF_INT_DIR_OICR_CAUSE_CAUSE_S 0
88+
#define PF_INT_DIR_OICR_CAUSE_CAUSE_M GENMASK(31, 0)
89+
#define PF_INT_PBA_CLEAR 0x0840600C
90+
91+
#define PF_FUNC_RID 0x08406010
92+
#define PF_FUNC_RID_FUNCTION_NUMBER_S 0
93+
#define PF_FUNC_RID_FUNCTION_NUMBER_M GENMASK(2, 0)
94+
#define PF_FUNC_RID_DEVICE_NUMBER_S 3
95+
#define PF_FUNC_RID_DEVICE_NUMBER_M GENMASK(7, 3)
96+
#define PF_FUNC_RID_BUS_NUMBER_S 8
97+
#define PF_FUNC_RID_BUS_NUMBER_M GENMASK(15, 8)
98+
5699
/* Reset registers */
57100
#define PFGEN_RTRIG 0x08407000
58101
#define PFGEN_RTRIG_CORER_S 0

drivers/net/ethernet/intel/idpf/idpf_lan_vf_regs.h

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -62,4 +62,42 @@
6262
#define VF_QRXB_TAIL_BASE 0x00060000
6363
#define VF_QRXB_TAIL(_QRX) (VF_QRXB_TAIL_BASE + ((_QRX) * 4))
6464

65+
/* Interrupts */
66+
#define VF_INT_DYN_CTL0 0x00005C00
67+
#define VF_INT_DYN_CTL0_INTENA_S 0
68+
#define VF_INT_DYN_CTL0_INTENA_M BIT(VF_INT_DYN_CTL0_INTENA_S)
69+
#define VF_INT_DYN_CTL0_ITR_INDX_S 3
70+
#define VF_INT_DYN_CTL0_ITR_INDX_M GENMASK(4, 3)
71+
#define VF_INT_DYN_CTLN(_INT) (0x00003800 + ((_INT) * 4))
72+
#define VF_INT_DYN_CTLN_EXT(_INT) (0x00070000 + ((_INT) * 4))
73+
#define VF_INT_DYN_CTLN_INTENA_S 0
74+
#define VF_INT_DYN_CTLN_INTENA_M BIT(VF_INT_DYN_CTLN_INTENA_S)
75+
#define VF_INT_DYN_CTLN_CLEARPBA_S 1
76+
#define VF_INT_DYN_CTLN_CLEARPBA_M BIT(VF_INT_DYN_CTLN_CLEARPBA_S)
77+
#define VF_INT_DYN_CTLN_SWINT_TRIG_S 2
78+
#define VF_INT_DYN_CTLN_SWINT_TRIG_M BIT(VF_INT_DYN_CTLN_SWINT_TRIG_S)
79+
#define VF_INT_DYN_CTLN_ITR_INDX_S 3
80+
#define VF_INT_DYN_CTLN_ITR_INDX_M GENMASK(4, 3)
81+
#define VF_INT_DYN_CTLN_INTERVAL_S 5
82+
#define VF_INT_DYN_CTLN_INTERVAL_M BIT(VF_INT_DYN_CTLN_INTERVAL_S)
83+
#define VF_INT_DYN_CTLN_SW_ITR_INDX_ENA_S 24
84+
#define VF_INT_DYN_CTLN_SW_ITR_INDX_ENA_M BIT(VF_INT_DYN_CTLN_SW_ITR_INDX_ENA_S)
85+
#define VF_INT_DYN_CTLN_SW_ITR_INDX_S 25
86+
#define VF_INT_DYN_CTLN_SW_ITR_INDX_M BIT(VF_INT_DYN_CTLN_SW_ITR_INDX_S)
87+
#define VF_INT_DYN_CTLN_WB_ON_ITR_S 30
88+
#define VF_INT_DYN_CTLN_WB_ON_ITR_M BIT(VF_INT_DYN_CTLN_WB_ON_ITR_S)
89+
#define VF_INT_DYN_CTLN_INTENA_MSK_S 31
90+
#define VF_INT_DYN_CTLN_INTENA_MSK_M BIT(VF_INT_DYN_CTLN_INTENA_MSK_S)
91+
92+
#define VF_INT_ICR0_ENA1 0x00005000
93+
#define VF_INT_ICR0_ENA1_ADMINQ_S 30
94+
#define VF_INT_ICR0_ENA1_ADMINQ_M BIT(VF_INT_ICR0_ENA1_ADMINQ_S)
95+
#define VF_INT_ICR0_ENA1_RSVD_S 31
96+
#define VF_INT_ICR01 0x00004800
97+
#define VF_QF_HENA(_i) (0x0000C400 + ((_i) * 4))
98+
#define VF_QF_HENA_MAX_INDX 1
99+
#define VF_QF_HKEY(_i) (0x0000CC00 + ((_i) * 4))
100+
#define VF_QF_HKEY_MAX_INDX 12
101+
#define VF_QF_HLUT(_i) (0x0000D000 + ((_i) * 4))
102+
#define VF_QF_HLUT_MAX_INDX 15
65103
#endif

0 commit comments

Comments
 (0)