/** *Convertainterfacemodeintoahumanreadablestring * *@mode:Modetoconvert * *ReturnsString
*/ constchar *cvmx_helper_interface_mode_to_string(cvmx_helper_interface_mode_t
mode)
{ switch (mode) { case CVMX_HELPER_INTERFACE_MODE_DISABLED: return"DISABLED"; case CVMX_HELPER_INTERFACE_MODE_RGMII: return"RGMII"; case CVMX_HELPER_INTERFACE_MODE_GMII: return"GMII"; case CVMX_HELPER_INTERFACE_MODE_SPI: return"SPI"; case CVMX_HELPER_INTERFACE_MODE_PCIE: return"PCIE"; case CVMX_HELPER_INTERFACE_MODE_XAUI: return"XAUI"; case CVMX_HELPER_INTERFACE_MODE_SGMII: return"SGMII"; case CVMX_HELPER_INTERFACE_MODE_PICMG: return"PICMG"; case CVMX_HELPER_INTERFACE_MODE_NPI: return"NPI"; case CVMX_HELPER_INTERFACE_MODE_LOOP: return"LOOP";
} return"UNKNOWN";
}
/** *SetupRandomEarlyDroponaspecificinputqueue * *@queue:InputqueuetosetupREDon(0-7) *@pass_thresh: *Packetswillbeginslowlydroppingwhentherearelessthan *thismanypacketbuffersfreeinFPA0. *@drop_thresh: *Allincomingpacketswillbedroppedwhenthereareless *thanthismanyfreepacketbuffersinFPA0. *ReturnsZeroonsuccess.Negativeonfailure
*/ staticint cvmx_helper_setup_red_queue(int queue, int pass_thresh, int drop_thresh)
{ union cvmx_ipd_qosx_red_marks red_marks; union cvmx_ipd_red_quex_param red_param;
/* Set RED to begin dropping packets when there are pass_thresh buffers left.Itwilllinearlydropmorepacketsuntilreachingdrop_thresh
buffers */
red_marks.u64 = 0;
red_marks.s.drop = drop_thresh;
red_marks.s.pass = pass_thresh;
cvmx_write_csr(CVMX_IPD_QOSX_RED_MARKS(queue), red_marks.u64);
/* Use the actual queue 0 counter, not the average */
red_param.u64 = 0;
red_param.s.prb_con =
(255ul << 24) / (red_marks.s.pass - red_marks.s.drop);
red_param.s.avg_con = 1;
red_param.s.new_con = 255;
red_param.s.use_pcnt = 1;
cvmx_write_csr(CVMX_IPD_RED_QUEX_PARAM(queue), red_param.u64); return0;
}
/** *SetupRandomEarlyDroptoautomaticallybegindroppingpackets. * *@pass_thresh: *Packetswillbeginslowlydroppingwhentherearelessthan *thismanypacketbuffersfreeinFPA0. *@drop_thresh: *Allincomingpacketswillbedroppedwhenthereareless *thanthismanyfreepacketbuffersinFPA0. *ReturnsZeroonsuccess.Negativeonfailure
*/ int cvmx_helper_setup_red(int pass_thresh, int drop_thresh)
{ union cvmx_ipd_portx_bp_page_cnt page_cnt; union cvmx_ipd_bp_prt_red_end ipd_bp_prt_red_end; union cvmx_ipd_red_port_enable red_port_enable; int queue; int interface; int port;
/* Disable backpressure based on queued buffers. It needs SW support */
page_cnt.u64 = 0;
page_cnt.s.bp_enb = 0;
page_cnt.s.page_cnt = 100; for (interface = 0; interface < 2; interface++) { for (port = cvmx_helper_get_first_ipd_port(interface);
port < cvmx_helper_get_last_ipd_port(interface); port++)
cvmx_write_csr(CVMX_IPD_PORTX_BP_PAGE_CNT(port),
page_cnt.u64);
}
/* Shutoff the dropping based on the per port page count. SW isn't
decrementing it right now */
ipd_bp_prt_red_end.u64 = 0;
ipd_bp_prt_red_end.s.prt_enb = 0;
cvmx_write_csr(CVMX_IPD_BP_PRT_RED_END, ipd_bp_prt_red_end.u64);
/** *SetupthecommonGMXsettingsthatdeterminethenumberof *ports.Thesesettingapplytoalmostallconfigurationsofall *chips. * *@interface:Interfacetoconfigure *@num_ports:Numberofportsontheinterface * *ReturnsZeroonsuccess,negativeonfailure
*/ int __cvmx_helper_setup_gmx(int interface, int num_ports)
{ union cvmx_gmxx_tx_prts gmx_tx_prts; union cvmx_gmxx_rx_prts gmx_rx_prts; union cvmx_pko_reg_gmx_port_mode pko_mode; union cvmx_gmxx_txx_thresh gmx_tx_thresh; int index;
/* Tell GMX the number of TX ports on this interface */
gmx_tx_prts.u64 = cvmx_read_csr(CVMX_GMXX_TX_PRTS(interface));
gmx_tx_prts.s.prts = num_ports;
cvmx_write_csr(CVMX_GMXX_TX_PRTS(interface), gmx_tx_prts.u64);
/* Tell GMX the number of RX ports on this interface. This only
** applies to *GMII and XAUI ports */ if (cvmx_helper_interface_get_mode(interface) ==
CVMX_HELPER_INTERFACE_MODE_RGMII
|| cvmx_helper_interface_get_mode(interface) ==
CVMX_HELPER_INTERFACE_MODE_SGMII
|| cvmx_helper_interface_get_mode(interface) ==
CVMX_HELPER_INTERFACE_MODE_GMII
|| cvmx_helper_interface_get_mode(interface) ==
CVMX_HELPER_INTERFACE_MODE_XAUI) { if (num_ports > 4) {
cvmx_dprintf("__cvmx_helper_setup_gmx: Illegal " "num_ports\n"); return -1;
}
¤ Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.0.11Bemerkung:
(vorverarbeitet am 2026-09-28)
¤
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.