aboutsummaryrefslogtreecommitdiff
path: root/sys
diff options
context:
space:
mode:
authorNavdeep Parhar <np@FreeBSD.org>2021-02-18 09:15:46 +0000
committerNavdeep Parhar <np@FreeBSD.org>2021-02-18 09:22:42 +0000
commitfae028dd97d8fc8f9ba5153408b177481dbefd70 (patch)
tree204eddb739836870039a5f262a49b915f3d242b5 /sys
parent2ed689a674c380e48245933d5326da4dda65f94d (diff)
downloadsrc-fae028dd97d8fc8f9ba5153408b177481dbefd70.tar.gz
src-fae028dd97d8fc8f9ba5153408b177481dbefd70.zip
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. MFC after: 1 week Sponsored by: Chelsio Communications
Diffstat (limited to 'sys')
-rw-r--r--sys/dev/cxgbe/adapter.h3
-rw-r--r--sys/dev/cxgbe/common/common.h2
-rw-r--r--sys/dev/cxgbe/common/t4_hw.c4
-rw-r--r--sys/dev/cxgbe/t4_main.c16
-rw-r--r--sys/dev/cxgbe/t4_sge.c72
-rw-r--r--sys/dev/cxgbe/t4_vf.c9
6 files changed, 62 insertions, 44 deletions
diff --git a/sys/dev/cxgbe/adapter.h b/sys/dev/cxgbe/adapter.h
index 4b2f86d00052..8b8e6bf339e8 100644
--- a/sys/dev/cxgbe/adapter.h
+++ b/sys/dev/cxgbe/adapter.h
@@ -1262,7 +1262,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 b54a71a02ca4..36d8864de960 100644
--- a/sys/dev/cxgbe/common/t4_hw.c
+++ b/sys/dev/cxgbe/common/t4_hw.c
@@ -9677,7 +9677,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;
@@ -9691,7 +9691,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 18a83df763ab..f64d349b46ae 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 d16f17c45614..741b1ec5ac86 100644
--- a/sys/dev/cxgbe/t4_sge.c
+++ b/sys/dev/cxgbe/t4_sge.c
@@ -826,16 +826,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
@@ -846,23 +845,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++) {
@@ -907,6 +889,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);
@@ -915,14 +927,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 |
@@ -931,14 +945,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);
}