git: e99210ab632b - stable/13 - cxgbe(4): Break up t4_read_chip_settings.
Navdeep Parhar
np at FreeBSD.org
Sun May 16 02:48:25 UTC 2021
The branch stable/13 has been updated by np:
URL: https://cgit.FreeBSD.org/src/commit/?id=e99210ab632b3d74b322d4f6770315a0afe5a683
commit e99210ab632b3d74b322d4f6770315a0afe5a683
Author: Navdeep Parhar <np at FreeBSD.org>
AuthorDate: 2021-02-18 09:15:46 +0000
Commit: Navdeep Parhar <np at FreeBSD.org>
CommitDate: 2021-05-16 02:45:16 +0000
cxgbe(4): Break up t4_read_chip_settings.
Read the PF-only hardware settings directly in get_params__post_init.
Split the rest into two routines used by both the PF and VF drivers: one
that reads the SGE rx buffer configuration and another that verifies
miscellaneous hardware configuration.
Sponsored by: Chelsio Communications
(cherry picked from commit fae028dd97d8fc8f9ba5153408b177481dbefd70)
---
sys/dev/cxgbe/adapter.h | 3 +-
sys/dev/cxgbe/common/common.h | 2 +-
sys/dev/cxgbe/common/t4_hw.c | 4 +--
sys/dev/cxgbe/t4_main.c | 16 +++++++---
sys/dev/cxgbe/t4_sge.c | 72 ++++++++++++++++++++++++-------------------
sys/dev/cxgbe/t4_vf.c | 9 +++---
6 files changed, 62 insertions(+), 44 deletions(-)
diff --git a/sys/dev/cxgbe/adapter.h b/sys/dev/cxgbe/adapter.h
index 7bf4efae09c0..12641cb2e628 100644
--- a/sys/dev/cxgbe/adapter.h
+++ b/sys/dev/cxgbe/adapter.h
@@ -1270,7 +1270,8 @@ void t4_sge_modload(void);
void t4_sge_modunload(void);
uint64_t t4_sge_extfree_refs(void);
void t4_tweak_chip_settings(struct adapter *);
-int t4_read_chip_settings(struct adapter *);
+int t4_verify_chip_settings(struct adapter *);
+void t4_init_rx_buf_info(struct adapter *);
int t4_create_dma_tag(struct adapter *);
void t4_sge_sysctls(struct adapter *, struct sysctl_ctx_list *,
struct sysctl_oid_list *);
diff --git a/sys/dev/cxgbe/common/common.h b/sys/dev/cxgbe/common/common.h
index 4c387d563365..9cc923eaf2f6 100644
--- a/sys/dev/cxgbe/common/common.h
+++ b/sys/dev/cxgbe/common/common.h
@@ -643,7 +643,7 @@ int t4_prep_adapter(struct adapter *adapter, u32 *buf);
int t4_shutdown_adapter(struct adapter *adapter);
int t4_init_devlog_params(struct adapter *adapter, int fw_attach);
int t4_init_sge_params(struct adapter *adapter);
-int t4_init_tp_params(struct adapter *adap, bool sleep_ok);
+int t4_init_tp_params(struct adapter *adap);
int t4_filter_field_shift(const struct adapter *adap, int filter_sel);
int t4_port_init(struct adapter *adap, int mbox, int pf, int vf, int port_id);
void t4_fatal_err(struct adapter *adapter, bool fw_error);
diff --git a/sys/dev/cxgbe/common/t4_hw.c b/sys/dev/cxgbe/common/t4_hw.c
index 734ab7f33acb..bbf58cae97f2 100644
--- a/sys/dev/cxgbe/common/t4_hw.c
+++ b/sys/dev/cxgbe/common/t4_hw.c
@@ -9694,7 +9694,7 @@ static void read_filter_mode_and_ingress_config(struct adapter *adap,
*
* Initialize various fields of the adapter's TP Parameters structure.
*/
-int t4_init_tp_params(struct adapter *adap, bool sleep_ok)
+int t4_init_tp_params(struct adapter *adap)
{
int chan;
u32 tx_len, rx_len, r, v;
@@ -9708,7 +9708,7 @@ int t4_init_tp_params(struct adapter *adap, bool sleep_ok)
for (chan = 0; chan < MAX_NCHAN; chan++)
tpp->tx_modq[chan] = chan;
- read_filter_mode_and_ingress_config(adap, sleep_ok);
+ read_filter_mode_and_ingress_config(adap, true);
if (chip_id(adap) > CHELSIO_T5) {
v = t4_read_reg(adap, A_TP_OUT_CONFIG);
diff --git a/sys/dev/cxgbe/t4_main.c b/sys/dev/cxgbe/t4_main.c
index 3fde57786d13..d25e83922d54 100644
--- a/sys/dev/cxgbe/t4_main.c
+++ b/sys/dev/cxgbe/t4_main.c
@@ -4754,13 +4754,19 @@ get_params__post_init(struct adapter *sc)
sc->vres.key.size = val[1] - val[0] + 1;
}
- t4_init_sge_params(sc);
-
/*
- * We've got the params we wanted to query via the firmware. Now grab
- * some others directly from the chip.
+ * We've got the params we wanted to query directly from the firmware.
+ * Grab some others via other means.
*/
- rc = t4_read_chip_settings(sc);
+ t4_init_sge_params(sc);
+ t4_init_tp_params(sc);
+ t4_read_mtu_tbl(sc, sc->params.mtus, NULL);
+ t4_load_mtus(sc, sc->params.mtus, sc->params.a_wnd, sc->params.b_wnd);
+
+ rc = t4_verify_chip_settings(sc);
+ if (rc != 0)
+ return (rc);
+ t4_init_rx_buf_info(sc);
return (rc);
}
diff --git a/sys/dev/cxgbe/t4_sge.c b/sys/dev/cxgbe/t4_sge.c
index a8d16352268e..42bc0c6cc7a7 100644
--- a/sys/dev/cxgbe/t4_sge.c
+++ b/sys/dev/cxgbe/t4_sge.c
@@ -831,16 +831,15 @@ hwsz_ok(struct adapter *sc, int hwsz)
}
/*
- * XXX: driver really should be able to deal with unexpected settings.
+ * Initialize the rx buffer sizes and figure out which zones the buffers will
+ * be allocated from.
*/
-int
-t4_read_chip_settings(struct adapter *sc)
+void
+t4_init_rx_buf_info(struct adapter *sc)
{
struct sge *s = &sc->sge;
struct sge_params *sp = &sc->params.sge;
- int i, j, n, rc = 0;
- uint32_t m, v, r;
- uint16_t indsz = min(RX_COPY_THRESHOLD - 1, M_INDICATESIZE);
+ int i, j, n;
static int sw_buf_sizes[] = { /* Sorted by size */
MCLBYTES,
#if MJUMPAGESIZE != MCLBYTES
@@ -851,23 +850,6 @@ t4_read_chip_settings(struct adapter *sc)
};
struct rx_buf_info *rxb;
- m = F_RXPKTCPLMODE;
- v = F_RXPKTCPLMODE;
- r = sc->params.sge.sge_control;
- if ((r & m) != v) {
- device_printf(sc->dev, "invalid SGE_CONTROL(0x%x)\n", r);
- rc = EINVAL;
- }
-
- /*
- * If this changes then every single use of PAGE_SHIFT in the driver
- * needs to be carefully reviewed for PAGE_SHIFT vs sp->page_shift.
- */
- if (sp->page_shift != PAGE_SHIFT) {
- device_printf(sc->dev, "invalid SGE_HOST_PAGE_SIZE(0x%x)\n", r);
- rc = EINVAL;
- }
-
s->safe_zidx = -1;
rxb = &s->rx_buf_info[0];
for (i = 0; i < SW_ZONE_SIZES; i++, rxb++) {
@@ -912,6 +894,36 @@ t4_read_chip_settings(struct adapter *sc)
if (s->safe_zidx == -1 && rxb->size1 == safest_rx_cluster)
s->safe_zidx = i;
}
+}
+
+/*
+ * Verify some basic SGE settings for the PF and VF driver, and other
+ * miscellaneous settings for the PF driver.
+ */
+int
+t4_verify_chip_settings(struct adapter *sc)
+{
+ struct sge_params *sp = &sc->params.sge;
+ uint32_t m, v, r;
+ int rc = 0;
+ const uint16_t indsz = min(RX_COPY_THRESHOLD - 1, M_INDICATESIZE);
+
+ m = F_RXPKTCPLMODE;
+ v = F_RXPKTCPLMODE;
+ r = sp->sge_control;
+ if ((r & m) != v) {
+ device_printf(sc->dev, "invalid SGE_CONTROL(0x%x)\n", r);
+ rc = EINVAL;
+ }
+
+ /*
+ * If this changes then every single use of PAGE_SHIFT in the driver
+ * needs to be carefully reviewed for PAGE_SHIFT vs sp->page_shift.
+ */
+ if (sp->page_shift != PAGE_SHIFT) {
+ device_printf(sc->dev, "invalid SGE_HOST_PAGE_SIZE(0x%x)\n", r);
+ rc = EINVAL;
+ }
if (sc->flags & IS_VF)
return (0);
@@ -920,14 +932,16 @@ t4_read_chip_settings(struct adapter *sc)
r = t4_read_reg(sc, A_ULP_RX_TDDP_PSZ);
if (r != v) {
device_printf(sc->dev, "invalid ULP_RX_TDDP_PSZ(0x%x)\n", r);
- rc = EINVAL;
+ if (sc->vres.ddp.size != 0)
+ rc = EINVAL;
}
m = v = F_TDDPTAGTCB;
r = t4_read_reg(sc, A_ULP_RX_CTL);
if ((r & m) != v) {
device_printf(sc->dev, "invalid ULP_RX_CTL(0x%x)\n", r);
- rc = EINVAL;
+ if (sc->vres.ddp.size != 0)
+ rc = EINVAL;
}
m = V_INDICATESIZE(M_INDICATESIZE) | F_REARMDDPOFFSET |
@@ -936,14 +950,10 @@ t4_read_chip_settings(struct adapter *sc)
r = t4_read_reg(sc, A_TP_PARA_REG5);
if ((r & m) != v) {
device_printf(sc->dev, "invalid TP_PARA_REG5(0x%x)\n", r);
- rc = EINVAL;
+ if (sc->vres.ddp.size != 0)
+ rc = EINVAL;
}
- t4_init_tp_params(sc, 1);
-
- t4_read_mtu_tbl(sc, sc->params.mtus, NULL);
- t4_load_mtus(sc, sc->params.mtus, sc->params.a_wnd, sc->params.b_wnd);
-
return (rc);
}
diff --git a/sys/dev/cxgbe/t4_vf.c b/sys/dev/cxgbe/t4_vf.c
index 6c736e37faac..4ad5e9d7839d 100644
--- a/sys/dev/cxgbe/t4_vf.c
+++ b/sys/dev/cxgbe/t4_vf.c
@@ -253,10 +253,6 @@ get_params__post_init(struct adapter *sc)
return (EINVAL);
}
- rc = t4_read_chip_settings(sc);
- if (rc != 0)
- return (rc);
-
/*
* Grab our Virtual Interface resource allocation, extract the
* features that we're interested in and do a bit of sanity testing on
@@ -290,6 +286,11 @@ get_params__post_init(struct adapter *sc)
else
sc->params.max_pkts_per_eth_tx_pkts_wr = 14;
+ rc = t4_verify_chip_settings(sc);
+ if (rc != 0)
+ return (rc);
+ t4_init_rx_buf_info(sc);
+
return (0);
}
More information about the dev-commits-src-branches
mailing list