Module Name: src Committed By: yamaguchi Date: Wed Feb 12 06:37:21 UTC 2020
Modified Files: src/sys/dev/pci: if_ixl.c if_ixlvar.h Log Message: Use Set RSS key command and Set LUT command to enable RSS on X722 To generate a diff of this commit: cvs rdiff -u -r1.40 -r1.41 src/sys/dev/pci/if_ixl.c cvs rdiff -u -r1.5 -r1.6 src/sys/dev/pci/if_ixlvar.h Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/sys/dev/pci/if_ixl.c diff -u src/sys/dev/pci/if_ixl.c:1.40 src/sys/dev/pci/if_ixl.c:1.41 --- src/sys/dev/pci/if_ixl.c:1.40 Wed Feb 12 06:26:02 2020 +++ src/sys/dev/pci/if_ixl.c Wed Feb 12 06:37:21 2020 @@ -1,4 +1,4 @@ -/* $NetBSD: if_ixl.c,v 1.40 2020/02/12 06:26:02 yamaguchi Exp $ */ +/* $NetBSD: if_ixl.c,v 1.41 2020/02/12 06:37:21 yamaguchi Exp $ */ /* * Copyright (c) 2013-2015, Intel Corporation @@ -656,7 +656,7 @@ struct ixl_softc { uint8_t sc_pf_id; uint16_t sc_uplink_seid; /* le */ uint16_t sc_downlink_seid; /* le */ - uint16_t sc_vsi_number; /* le */ + uint16_t sc_vsi_number; uint16_t sc_vsi_stat_counter_idx; uint16_t sc_seid; unsigned int sc_base_queue; @@ -673,6 +673,7 @@ struct ixl_softc { #define IXL_SC_AQ_FLAG_RXCTL __BIT(0) #define IXL_SC_AQ_FLAG_NVMLOCK __BIT(1) #define IXL_SC_AQ_FLAG_NVMREAD __BIT(2) +#define IXL_SC_AQ_FLAG_RSS __BIT(3) kmutex_t sc_atq_lock; kcondvar_t sc_atq_cv; @@ -3966,6 +3967,7 @@ ixl_get_version(struct ixl_softc *sc) SET(sc->sc_aq_flags, IXL_SC_AQ_FLAG_NVMLOCK | IXL_SC_AQ_FLAG_NVMREAD); SET(sc->sc_aq_flags, IXL_SC_AQ_FLAG_RXCTL); + SET(sc->sc_aq_flags, IXL_SC_AQ_FLAG_RSS); } #define IXL_API_VER(maj, min) (((uint32_t)(maj) << 16) | (min)) @@ -4515,7 +4517,7 @@ ixl_get_vsi(struct ixl_softc *sc) } reply = (struct ixl_aq_vsi_reply *)iaq.iaq_param; - sc->sc_vsi_number = reply->vsi_number; + sc->sc_vsi_number = le16toh(reply->vsi_number); data = IXL_DMA_KVA(vsi); sc->sc_vsi_stat_counter_idx = le16toh(data->stat_counter_idx); @@ -4624,21 +4626,148 @@ ixl_get_default_rss_key(uint32_t *buf, s memcpy(buf, rss_seed, cplen); } -static void -ixl_set_rss_key(struct ixl_softc *sc) +static int +ixl_set_rss_key(struct ixl_softc *sc, uint8_t *key, size_t keylen) +{ + struct ixl_dmamem *idm; + struct ixl_atq iatq; + struct ixl_aq_desc *iaq; + struct ixl_aq_rss_key_param *param; + struct ixl_aq_rss_key_data *data; + size_t len, datalen, stdlen, extlen; + uint16_t vsi_id; + int rv; + + memset(&iatq, 0, sizeof(iatq)); + iaq = &iatq.iatq_desc; + idm = &sc->sc_aqbuf; + + datalen = sizeof(*data); + + /*XXX The buf size has to be less than the size of the register */ + datalen = MIN(IXL_RSS_KEY_SIZE_REG * sizeof(uint32_t), datalen); + + iaq->iaq_flags = htole16(IXL_AQ_BUF | IXL_AQ_RD | + (datalen > I40E_AQ_LARGE_BUF ? IXL_AQ_LB : 0)); + iaq->iaq_opcode = htole16(IXL_AQ_OP_RSS_SET_KEY); + iaq->iaq_datalen = htole16(datalen); + + param = (struct ixl_aq_rss_key_param *)iaq->iaq_param; + vsi_id = (sc->sc_vsi_number << IXL_AQ_RSSKEY_VSI_ID_SHIFT) | + IXL_AQ_RSSKEY_VSI_VALID; + param->vsi_id = htole16(vsi_id); + + memset(IXL_DMA_KVA(idm), 0, IXL_DMA_LEN(idm)); + data = IXL_DMA_KVA(idm); + + len = MIN(keylen, datalen); + stdlen = MIN(sizeof(data->standard_rss_key), len); + memcpy(data->standard_rss_key, key, stdlen); + len = (len > stdlen) ? (len - stdlen) : 0; + + extlen = MIN(sizeof(data->extended_hash_key), len); + extlen = (stdlen < keylen) ? 0 : keylen - stdlen; + memcpy(data->extended_hash_key, key + stdlen, extlen); + + ixl_aq_dva(iaq, IXL_DMA_DVA(idm)); + + bus_dmamap_sync(sc->sc_dmat, IXL_DMA_MAP(idm), 0, + IXL_DMA_LEN(idm), BUS_DMASYNC_PREWRITE); + + rv = ixl_atq_exec(sc, &iatq); + + bus_dmamap_sync(sc->sc_dmat, IXL_DMA_MAP(idm), 0, + IXL_DMA_LEN(idm), BUS_DMASYNC_POSTWRITE); + + if (rv != 0) { + return ETIMEDOUT; + } + + if (iaq->iaq_retval != htole16(IXL_AQ_RC_OK)) { + return EIO; + } + + return 0; +} + +static int +ixl_set_rss_lut(struct ixl_softc *sc, uint8_t *lut, size_t lutlen) +{ + struct ixl_dmamem *idm; + struct ixl_atq iatq; + struct ixl_aq_desc *iaq; + struct ixl_aq_rss_lut_param *param; + uint16_t vsi_id; + uint8_t *data; + size_t dmalen; + int rv; + + memset(&iatq, 0, sizeof(iatq)); + iaq = &iatq.iatq_desc; + idm = &sc->sc_aqbuf; + + dmalen = MIN(lutlen, IXL_DMA_LEN(idm)); + + iaq->iaq_flags = htole16(IXL_AQ_BUF | IXL_AQ_RD | + (dmalen > I40E_AQ_LARGE_BUF ? IXL_AQ_LB : 0)); + iaq->iaq_opcode = htole16(IXL_AQ_OP_RSS_SET_LUT); + iaq->iaq_datalen = htole16(dmalen); + + memset(IXL_DMA_KVA(idm), 0, IXL_DMA_LEN(idm)); + data = IXL_DMA_KVA(idm); + memcpy(data, lut, dmalen); + ixl_aq_dva(iaq, IXL_DMA_DVA(idm)); + + param = (struct ixl_aq_rss_lut_param *)iaq->iaq_param; + vsi_id = (sc->sc_vsi_number << IXL_AQ_RSSLUT_VSI_ID_SHIFT) | + IXL_AQ_RSSLUT_VSI_VALID; + param->vsi_id = htole16(vsi_id); + param->flags = htole16(IXL_AQ_RSSLUT_TABLE_TYPE_PF << + IXL_AQ_RSSLUT_TABLE_TYPE_SHIFT); + + bus_dmamap_sync(sc->sc_dmat, IXL_DMA_MAP(idm), 0, + IXL_DMA_LEN(idm), BUS_DMASYNC_PREWRITE); + + rv = ixl_atq_exec(sc, &iatq); + + bus_dmamap_sync(sc->sc_dmat, IXL_DMA_MAP(idm), 0, + IXL_DMA_LEN(idm), BUS_DMASYNC_POSTWRITE); + + if (rv != 0) { + return ETIMEDOUT; + } + + if (iaq->iaq_retval != htole16(IXL_AQ_RC_OK)) { + return EIO; + } + + return 0; +} + +static int +ixl_register_rss_key(struct ixl_softc *sc) { uint32_t rss_seed[IXL_RSS_KEY_SIZE_REG]; + int rv; size_t i; ixl_get_default_rss_key(rss_seed, sizeof(rss_seed)); - for (i = 0; i < IXL_RSS_KEY_SIZE_REG; i++) { - ixl_wr_rx_csr(sc, I40E_PFQF_HKEY(i), rss_seed[i]); + if (ISSET(sc->sc_aq_flags, IXL_SC_AQ_FLAG_RSS)){ + rv = ixl_set_rss_key(sc, (uint8_t*)rss_seed, + sizeof(rss_seed)); + } else { + rv = 0; + for (i = 0; i < IXL_RSS_KEY_SIZE_REG; i++) { + ixl_wr_rx_csr(sc, I40E_PFQF_HKEY(i), rss_seed[i]); + } } + + return rv; } static void -ixl_set_rss_pctype(struct ixl_softc *sc) +ixl_register_rss_pctype(struct ixl_softc *sc) { uint64_t set_hena = 0; uint32_t hena0, hena1; @@ -4658,13 +4787,14 @@ ixl_set_rss_pctype(struct ixl_softc *sc) ixl_wr_rx_csr(sc, I40E_PFQF_HENA(1), hena1); } -static void -ixl_set_rss_hlut(struct ixl_softc *sc) +static int +ixl_register_rss_hlut(struct ixl_softc *sc) { unsigned int qid; uint8_t hlut_buf[512], lut_mask; uint32_t *hluts; size_t i, hluts_num; + int rv; lut_mask = (0x01 << sc->sc_rss_table_entry_width) - 1; @@ -4673,12 +4803,19 @@ ixl_set_rss_hlut(struct ixl_softc *sc) hlut_buf[i] = qid & lut_mask; } - hluts = (uint32_t *)hlut_buf; - hluts_num = sc->sc_rss_table_size >> 2; - for (i = 0; i < hluts_num; i++) { - ixl_wr(sc, I40E_PFQF_HLUT(i), hluts[i]); + if (ISSET(sc->sc_aq_flags, IXL_SC_AQ_FLAG_RSS)) { + rv = ixl_set_rss_lut(sc, hlut_buf, sizeof(hlut_buf)); + } else { + rv = 0; + hluts = (uint32_t *)hlut_buf; + hluts_num = sc->sc_rss_table_size >> 2; + for (i = 0; i < hluts_num; i++) { + ixl_wr(sc, I40E_PFQF_HLUT(i), hluts[i]); + } + ixl_flush(sc); } - ixl_flush(sc); + + return rv; } static void @@ -4687,9 +4824,9 @@ ixl_config_rss(struct ixl_softc *sc) KASSERT(mutex_owned(&sc->sc_cfg_lock)); - ixl_set_rss_key(sc); - ixl_set_rss_pctype(sc); - ixl_set_rss_hlut(sc); + ixl_register_rss_key(sc); + ixl_register_rss_pctype(sc); + ixl_register_rss_hlut(sc); } static const struct ixl_phy_type * Index: src/sys/dev/pci/if_ixlvar.h diff -u src/sys/dev/pci/if_ixlvar.h:1.5 src/sys/dev/pci/if_ixlvar.h:1.6 --- src/sys/dev/pci/if_ixlvar.h:1.5 Fri Jan 31 02:16:26 2020 +++ src/sys/dev/pci/if_ixlvar.h Wed Feb 12 06:37:21 2020 @@ -1,4 +1,4 @@ -/* $NetBSD: if_ixlvar.h,v 1.5 2020/01/31 02:16:26 yamaguchi Exp $ */ +/* $NetBSD: if_ixlvar.h,v 1.6 2020/02/12 06:37:21 yamaguchi Exp $ */ /* * Copyright (c) 2019 Internet Initiative Japan, Inc. @@ -139,6 +139,10 @@ struct ixl_aq_desc { #define IXL_AQ_OP_LLDP_START_AGENT 0x0a06 #define IXL_AQ_OP_LLDP_GET_CEE_DCBX 0x0a07 #define IXL_AQ_OP_LLDP_SPECIFIC_AGENT 0x0a09 +#define IXL_AQ_OP_RSS_SET_KEY 0x0b02 +#define IXL_AQ_OP_RSS_SET_LUT 0x0b03 +#define IXL_AQ_OP_RSS_GET_KEY 0x0b04 +#define IXL_AQ_OP_RSS_GET_LUT 0x0b05 struct ixl_aq_mac_addresses { uint8_t pf_lan[ETHER_ADDR_LEN]; @@ -711,6 +715,38 @@ struct ixl_aq_nvm_param { uint32_t addr_lo; } __packed __aligned(4); +struct ixl_aq_rss_key_param { + uint16_t vsi_id; +#define IXL_AQ_RSSKEY_VSI_VALID (0x01 << 15) +#define IXL_AQ_RSSKEY_VSI_ID_SHIFT 0 +#define IXL_AQ_RSSKEY_VSI_ID_MASK (0x3FF << IXL_RSSKEY_VSI_ID_SHIFT) + + uint8_t reserved[6]; + uint32_t addr_hi; + uint32_t addr_lo; +} __packed __aligned(8); + +struct ixl_aq_rss_key_data { + uint8_t standard_rss_key[0x28]; + uint8_t extended_hash_key[0xc]; +} __packed __aligned(8); + +struct ixl_aq_rss_lut_param { + uint16_t vsi_id; +#define IXL_AQ_RSSLUT_VSI_VALID (0x01 << 15) +#define IXL_AQ_RSSLUT_VSI_ID_SHIFT 0 +#define IXL_AQ_RSSLUT_VSI_ID_MASK (0x03FF << IXL_AQ_RSSLUT_VSI_ID_SHIFT) + + uint16_t flags; +#define IXL_AQ_RSSLUT_TABLE_TYPE_SHIFT 0 +#define IXL_AQ_RSSLUT_TABLE_TYPE_MASK (0x01 << IXL_AQ_RSSLUT_TABLE_TYPE_SHIFT) +#define IXL_AQ_RSSLUT_TABLE_TYPE_VSI 0 +#define IXL_AQ_RSSLUT_TABLE_TYPE_PF 1 + uint8_t reserved[4]; + uint32_t addr_hi; + uint32_t addr_lo; +} __packed __aligned(8); + /* aq response codes */ #define IXL_AQ_RC_OK 0 /* success */ #define IXL_AQ_RC_EPERM 1 /* Operation not permitted */