Skip to content

Commit 8c84524

Browse files
paniakin-awsshaoyingxu
authored andcommitted
ENA: Update to v2.8.3
Source: https://github.com/amzn/amzn-drivers/ Change Log: ## r2.8.3 release notes **New Features** * PHC module param enablement * PHC devlink param enablement * Add hint for interrupt moderation for the device * Change initial static RX interrupt moderation interval * Enable DIM by default on all CPU Architectures **Buf Fixes** * DMA sync for CPU before accessing buffer * Fix ena_probe destroy order * Validate completion descriptors consistency * Fix TX packets missing completion counter **Minor Changes** * Compilation fixes for RHEL 9.0, 9.1 and SLES 15SP4 * PHC info dynamic allocation * Publish devlink reload for RHEL 9.0 and 9.1 * Add ENA Express documentation ## r2.8.2 release notes **Buf Fixes** * Fix devlink large LLQ config not fully applied Signed-off-by: Andrew Panyakin <apanyaki@amazon.com>
1 parent 7d90dbe commit 8c84524

14 files changed

Lines changed: 335 additions & 111 deletions

drivers/amazon/net/ena/ena_com.c

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1823,8 +1823,8 @@ int ena_com_phc_config(struct ena_com_dev *ena_dev)
18231823
return ret;
18241824
}
18251825

1826-
phc->enabled = true;
1827-
netdev_dbg(ena_dev->net_device, "PHC is enabled\n");
1826+
phc->active = true;
1827+
netdev_dbg(ena_dev->net_device, "PHC is active in the device\n");
18281828

18291829
return ret;
18301830
}
@@ -1833,7 +1833,7 @@ void ena_com_phc_destroy(struct ena_com_dev *ena_dev)
18331833
{
18341834
struct ena_com_phc_info *phc = &ena_dev->phc;
18351835

1836-
phc->enabled = false;
1836+
phc->active = false;
18371837

18381838
/* In case PHC is not supported by the device, silently exiting */
18391839
if (!phc->virt_addr)
@@ -1855,8 +1855,9 @@ int ena_com_phc_get(struct ena_com_dev *ena_dev, u64 *timestamp)
18551855
ktime_t block_time;
18561856
int ret = 0;
18571857

1858-
if (!phc->enabled) {
1859-
netdev_err(ena_dev->net_device, "PHC feature is not enabled\n");
1858+
if (!phc->active) {
1859+
netdev_err(ena_dev->net_device,
1860+
"PHC feature is not active in the device\n");
18601861
return -EOPNOTSUPP;
18611862
}
18621863

drivers/amazon/net/ena/ena_com.h

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,7 @@
4949
/* ENA adaptive interrupt moderation settings */
5050

5151
#define ENA_INTR_INITIAL_TX_INTERVAL_USECS 64
52-
#define ENA_INTR_INITIAL_RX_INTERVAL_USECS 0
52+
#define ENA_INTR_INITIAL_RX_INTERVAL_USECS 20
5353
#define ENA_DEFAULT_INTR_DELAY_RESOLUTION 1
5454

5555
#define ENA_HASH_KEY_SIZE 40
@@ -302,8 +302,8 @@ struct ena_com_phc_info {
302302
/* Request id sent to the device */
303303
u16 req_id;
304304

305-
/* True if PHC is enabled */
306-
bool enabled;
305+
/* True if PHC is active in the device */
306+
bool active;
307307

308308
/* PHC shared memory - memory handle */
309309

@@ -1146,13 +1146,16 @@ static inline int ena_com_get_customer_metric_count(struct ena_com_dev *ena_dev)
11461146
* @rx_delay_interval: Rx interval in usecs
11471147
* @tx_delay_interval: Tx interval in usecs
11481148
* @unmask: unmask enable/disable
1149+
* @no_moderation_update: 0 - Indicates that any of the TX/RX intervals was
1150+
* updated, 1 - otherwise
11491151
*
11501152
* Prepare interrupt update register with the supplied parameters.
11511153
*/
11521154
static inline void ena_com_update_intr_reg(struct ena_eth_io_intr_reg *intr_reg,
11531155
u32 rx_delay_interval,
11541156
u32 tx_delay_interval,
1155-
bool unmask)
1157+
bool unmask,
1158+
bool no_moderation_update)
11561159
{
11571160
intr_reg->intr_control = 0;
11581161
intr_reg->intr_control |= rx_delay_interval &
@@ -1164,6 +1167,10 @@ static inline void ena_com_update_intr_reg(struct ena_eth_io_intr_reg *intr_reg,
11641167

11651168
if (unmask)
11661169
intr_reg->intr_control |= ENA_ETH_IO_INTR_REG_INTR_UNMASK_MASK;
1170+
1171+
intr_reg->intr_control |=
1172+
(((u32)no_moderation_update) << ENA_ETH_IO_INTR_REG_NO_MODERATION_UPDATE_SHIFT) &
1173+
ENA_ETH_IO_INTR_REG_NO_MODERATION_UPDATE_MASK;
11671174
}
11681175

11691176
static inline u8 *ena_com_get_next_bounce_buffer(struct ena_com_io_bounce_buffer_control *bounce_buf_ctrl)

drivers/amazon/net/ena/ena_devlink.c

Lines changed: 77 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,19 @@
11
// SPDX-License-Identifier: GPL-2.0 OR Linux-OpenIB
22
/*
3-
* Copyright 2015-2021 Amazon.com, Inc. or its affiliates. All rights reserved.
3+
* Copyright 2015-2023 Amazon.com, Inc. or its affiliates. All rights reserved.
44
*/
55

66
#include "linux/pci.h"
77

88
#include "ena_devlink.h"
99
#ifdef ENA_DEVLINK_SUPPORT
10+
#ifdef ENA_PHC_SUPPORT
11+
#include "ena_phc.h"
12+
13+
static int ena_devlink_phc_enable_validate(struct devlink *devlink, u32 id,
14+
union devlink_param_value val,
15+
struct netlink_ext_ack *extack);
16+
#endif /* ENA_PHC_SUPPORT */
1017

1118
static int ena_devlink_llq_header_validate(struct devlink *devlink, u32 id,
1219
union devlink_param_value val,
@@ -15,13 +22,22 @@ static int ena_devlink_llq_header_validate(struct devlink *devlink, u32 id,
1522
enum ena_devlink_param_id {
1623
ENA_DEVLINK_PARAM_ID_BASE = DEVLINK_PARAM_GENERIC_ID_MAX,
1724
ENA_DEVLINK_PARAM_ID_LLQ_HEADER_SIZE,
25+
#ifdef ENA_PHC_SUPPORT
26+
ENA_DEVLINK_PARAM_ID_PHC_ENABLE,
27+
#endif /* ENA_PHC_SUPPORT */
1828
};
1929

2030
static const struct devlink_param ena_devlink_params[] = {
2131
DEVLINK_PARAM_DRIVER(ENA_DEVLINK_PARAM_ID_LLQ_HEADER_SIZE,
2232
"large_llq_header", DEVLINK_PARAM_TYPE_BOOL,
2333
BIT(DEVLINK_PARAM_CMODE_DRIVERINIT),
2434
NULL, NULL, ena_devlink_llq_header_validate),
35+
#ifdef ENA_PHC_SUPPORT
36+
DEVLINK_PARAM_DRIVER(ENA_DEVLINK_PARAM_ID_PHC_ENABLE,
37+
"phc_enable", DEVLINK_PARAM_TYPE_BOOL,
38+
BIT(DEVLINK_PARAM_CMODE_DRIVERINIT),
39+
NULL, NULL, ena_devlink_phc_enable_validate),
40+
#endif /* ENA_PHC_SUPPORT */
2541
};
2642

2743
static int ena_devlink_llq_header_validate(struct devlink *devlink, u32 id,
@@ -47,6 +63,25 @@ static int ena_devlink_llq_header_validate(struct devlink *devlink, u32 id,
4763
return 0;
4864
}
4965

66+
#ifdef ENA_PHC_SUPPORT
67+
static int ena_devlink_phc_enable_validate(struct devlink *devlink, u32 id,
68+
union devlink_param_value val,
69+
struct netlink_ext_ack *extack)
70+
{
71+
struct ena_adapter *adapter = ENA_DEVLINK_PRIV(devlink);
72+
73+
if (!val.vbool)
74+
return 0;
75+
76+
if (!ena_com_phc_supported(adapter->ena_dev)) {
77+
NL_SET_ERR_MSG_MOD(extack, "Device doesn't support PHC");
78+
return -EOPNOTSUPP;
79+
}
80+
81+
return 0;
82+
}
83+
84+
#endif /* ENA_PHC_SUPPORT */
5085
#ifdef ENA_DEVLINK_CONFIGURE_AFTER_REGISTER
5186
/* Determines if ena_devlink_register has been called.
5287
* Prefer to check if the driver enabled reloading capabilities, but fallback
@@ -82,6 +117,16 @@ void ena_devlink_params_get(struct devlink *devlink)
82117
}
83118

84119
adapter->large_llq_header_enabled = val.vbool;
120+
#ifdef ENA_PHC_SUPPORT
121+
122+
err = devlink_param_driverinit_value_get(devlink, ENA_DEVLINK_PARAM_ID_PHC_ENABLE, &val);
123+
if (err) {
124+
netdev_err(adapter->netdev, "Failed to query PHC param\n");
125+
return;
126+
}
127+
128+
ena_phc_enable(adapter, val.vbool);
129+
#endif /* ENA_PHC_SUPPORT */
85130
}
86131

87132
void ena_devlink_disable_large_llq_header_param(struct devlink *devlink)
@@ -100,6 +145,22 @@ void ena_devlink_disable_large_llq_header_param(struct devlink *devlink)
100145
value);
101146
}
102147

148+
#ifdef ENA_PHC_SUPPORT
149+
void ena_devlink_disable_phc_param(struct devlink *devlink)
150+
{
151+
union devlink_param_value value;
152+
153+
#ifdef ENA_DEVLINK_CONFIGURE_AFTER_REGISTER
154+
/* If devlink params aren't registered, don't access them */
155+
if (!ena_is_devlink_params_registered(devlink))
156+
return;
157+
158+
#endif
159+
value.vbool = false;
160+
devlink_param_driverinit_value_set(devlink, ENA_DEVLINK_PARAM_ID_PHC_ENABLE, value);
161+
}
162+
163+
#endif /* ENA_PHC_SUPPORT */
103164
static int ena_devlink_reload_down(struct devlink *devlink,
104165
#ifdef ENA_DEVLINK_RELOAD_NS_CHANGE_SUPPORT
105166
bool netns_change,
@@ -164,11 +225,11 @@ static int ena_devlink_reload_up(struct devlink *devlink,
164225
rtnl_lock();
165226
/* Check that no other routine initialized the device (e.g.
166227
* ena_fw_reset_device()). Also we're under devlink_mutex here,
167-
* so devink (and ena_adapter with it) isn't freed under our
168-
* feet.
228+
* so devlink isn't freed under our feet.
169229
*/
170230
if (!test_bit(ENA_FLAG_DEVICE_RUNNING, &adapter->flags))
171231
err = ena_restore_device(adapter);
232+
172233
rtnl_unlock();
173234

174235
#ifdef ENA_DEVLINK_RELOAD_LIMIT_AND_ACTION_SUPPORT
@@ -220,9 +281,18 @@ static int ena_devlink_configure_params(struct devlink *devlink)
220281
ENA_DEVLINK_PARAM_ID_LLQ_HEADER_SIZE,
221282
value);
222283

284+
#ifdef ENA_PHC_SUPPORT
285+
value.vbool = ena_phc_is_enabled(adapter);
286+
devlink_param_driverinit_value_set(devlink, ENA_DEVLINK_PARAM_ID_PHC_ENABLE, value);
287+
288+
#endif /* ENA_PHC_SUPPORT */
223289
#ifdef ENA_DEVLINK_RELOAD_SUPPORT_ADVERTISEMENT_NEEDED
224290
devlink_set_features(devlink, DEVLINK_F_RELOAD);
225291

292+
#endif
293+
#ifdef ENA_DEVLINK_PUBLISH_REQUIRED
294+
devlink_params_publish(devlink);
295+
226296
#endif
227297
#ifdef ENA_DEVLINK_RELOAD_ENABLING_REQUIRED
228298
devlink_reload_enable(devlink);
@@ -270,6 +340,10 @@ static void ena_devlink_configure_params_clean(struct devlink *devlink)
270340
#ifdef ENA_DEVLINK_RELOAD_ENABLING_REQUIRED
271341
devlink_reload_disable(devlink);
272342

343+
#endif
344+
#ifdef ENA_DEVLINK_PUBLISH_REQUIRED
345+
devlink_params_unpublish(devlink);
346+
273347
#endif
274348
devlink_params_unregister(devlink, ena_devlink_params,
275349
ARRAY_SIZE(ena_devlink_params));

drivers/amazon/net/ena/ena_devlink.h

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
1-
// SPDX-License-Identifier: GPL-2.0 OR Linux-OpenIB
1+
/* SPDX-License-Identifier: GPL-2.0 OR Linux-OpenIB */
22
/*
3-
* Copyright 2015-2021 Amazon.com, Inc. or its affiliates. All rights reserved.
3+
* Copyright 2015-2023 Amazon.com, Inc. or its affiliates. All rights reserved.
44
*/
55

66
#ifndef DEVLINK_H
@@ -12,19 +12,18 @@
1212
#endif
1313

1414
#ifdef ENA_DEVLINK_SUPPORT
15-
1615
#define ENA_DEVLINK_PRIV(devlink) \
17-
(*(struct ena_adapter **) devlink_priv(devlink))
16+
(*(struct ena_adapter **)devlink_priv(devlink))
1817

1918
struct devlink *ena_devlink_alloc(struct ena_adapter *adapter);
2019
void ena_devlink_free(struct devlink *devlink);
2120
void ena_devlink_register(struct devlink *devlink, struct device *dev);
2221
void ena_devlink_unregister(struct devlink *devlink);
2322
void ena_devlink_params_get(struct devlink *devlink);
2423
void ena_devlink_disable_large_llq_header_param(struct devlink *devlink);
24+
void ena_devlink_disable_phc_param(struct devlink *devlink);
2525

2626
#else /* ENA_DEVLINK_SUPPORT */
27-
2827
#ifdef ENA_NO_DEVLINK_HEADERS
2928
struct devlink {};
3029
#endif
@@ -39,7 +38,7 @@ static inline void ena_devlink_register(struct devlink *devlink, struct device *
3938
static inline void ena_devlink_unregister(struct devlink *devlink) { }
4039
static inline void ena_devlink_params_get(struct devlink *devlink) { }
4140
static inline void ena_devlink_disable_large_llq_header_param(struct devlink *devlink) { }
41+
static inline void ena_devlink_disable_phc_param(struct devlink *devlink) { }
4242

4343
#endif /* ENA_DEVLINK_SUPPORT */
44-
4544
#endif /* DEVLINK_H */

drivers/amazon/net/ena/ena_eth_com.c

Lines changed: 27 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -233,43 +233,55 @@ static struct ena_eth_io_rx_cdesc_base *
233233
idx * io_cq->cdesc_entry_size_in_bytes);
234234
}
235235

236-
static u16 ena_com_cdesc_rx_pkt_get(struct ena_com_io_cq *io_cq,
237-
u16 *first_cdesc_idx)
236+
static int ena_com_cdesc_rx_pkt_get(struct ena_com_io_cq *io_cq,
237+
u16 *first_cdesc_idx,
238+
u16 *num_descs)
238239
{
240+
u16 count = io_cq->cur_rx_pkt_cdesc_count, head_masked;
239241
struct ena_eth_io_rx_cdesc_base *cdesc;
240-
u16 count = 0, head_masked;
241242
u32 last = 0;
242243

243244
do {
245+
u32 status;
246+
244247
cdesc = ena_com_get_next_rx_cdesc(io_cq);
245248
if (!cdesc)
246249
break;
250+
status = READ_ONCE(cdesc->status);
247251

248252
ena_com_cq_inc_head(io_cq);
253+
if (unlikely((status & ENA_ETH_IO_RX_CDESC_BASE_FIRST_MASK) >>
254+
ENA_ETH_IO_RX_CDESC_BASE_FIRST_SHIFT && count != 0)) {
255+
struct ena_com_dev *dev = ena_com_io_cq_to_ena_dev(io_cq);
256+
257+
netdev_err(dev->net_device,
258+
"First bit is on in descriptor #%d on q_id: %d, req_id: %u\n",
259+
count, io_cq->qid, cdesc->req_id);
260+
return -EFAULT;
261+
}
249262
count++;
250-
last = (READ_ONCE(cdesc->status) &
251-
ENA_ETH_IO_RX_CDESC_BASE_LAST_MASK) >>
252-
ENA_ETH_IO_RX_CDESC_BASE_LAST_SHIFT;
263+
last = (status & ENA_ETH_IO_RX_CDESC_BASE_LAST_MASK) >>
264+
ENA_ETH_IO_RX_CDESC_BASE_LAST_SHIFT;
253265
} while (!last);
254266

255267
if (last) {
256268
*first_cdesc_idx = io_cq->cur_rx_pkt_cdesc_start_idx;
257-
count += io_cq->cur_rx_pkt_cdesc_count;
258269

259270
head_masked = io_cq->head & (io_cq->q_depth - 1);
260271

272+
*num_descs = count;
261273
io_cq->cur_rx_pkt_cdesc_count = 0;
262274
io_cq->cur_rx_pkt_cdesc_start_idx = head_masked;
263275

264276
netdev_dbg(ena_com_io_cq_to_ena_dev(io_cq)->net_device,
265277
"ENA q_id: %d packets were completed. first desc idx %u descs# %d\n",
266278
io_cq->qid, *first_cdesc_idx, count);
267279
} else {
268-
io_cq->cur_rx_pkt_cdesc_count += count;
269-
count = 0;
280+
io_cq->cur_rx_pkt_cdesc_count = count;
281+
*num_descs = 0;
270282
}
271283

272-
return count;
284+
return 0;
273285
}
274286

275287
static int ena_com_create_meta(struct ena_com_io_sq *io_sq,
@@ -546,10 +558,14 @@ int ena_com_rx_pkt(struct ena_com_io_cq *io_cq,
546558
u16 cdesc_idx = 0;
547559
u16 nb_hw_desc;
548560
u16 i = 0;
561+
int rc;
549562

550563
WARN(io_cq->direction != ENA_COM_IO_QUEUE_DIRECTION_RX, "wrong Q type");
551564

552-
nb_hw_desc = ena_com_cdesc_rx_pkt_get(io_cq, &cdesc_idx);
565+
rc = ena_com_cdesc_rx_pkt_get(io_cq, &cdesc_idx, &nb_hw_desc);
566+
if (unlikely(rc != 0))
567+
return -EFAULT;
568+
553569
if (nb_hw_desc == 0) {
554570
ena_rx_ctx->descs = nb_hw_desc;
555571
return 0;

drivers/amazon/net/ena/ena_eth_io_defs.h

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -261,7 +261,8 @@ struct ena_eth_io_intr_reg {
261261
/* 14:0 : rx_intr_delay
262262
* 29:15 : tx_intr_delay
263263
* 30 : intr_unmask
264-
* 31 : reserved
264+
* 31 : no_moderation_update - 0 - moderation
265+
* updated, 1 - moderation not updated
265266
*/
266267
u32 intr_control;
267268
};
@@ -381,6 +382,8 @@ struct ena_eth_io_numa_node_cfg_reg {
381382
#define ENA_ETH_IO_INTR_REG_TX_INTR_DELAY_MASK GENMASK(29, 15)
382383
#define ENA_ETH_IO_INTR_REG_INTR_UNMASK_SHIFT 30
383384
#define ENA_ETH_IO_INTR_REG_INTR_UNMASK_MASK BIT(30)
385+
#define ENA_ETH_IO_INTR_REG_NO_MODERATION_UPDATE_SHIFT 31
386+
#define ENA_ETH_IO_INTR_REG_NO_MODERATION_UPDATE_MASK BIT(31)
384387

385388
/* numa_node_cfg_reg */
386389
#define ENA_ETH_IO_NUMA_NODE_CFG_REG_NUMA_MASK GENMASK(7, 0)

0 commit comments

Comments
 (0)