/* Make sure all global variables propagate to other cores */
CVMX_SYNCWS;
return0;
}
/** *Thisfunctionprobesaninterfacetodeterminetheactual *numberofhardwareportsconnectedtoit.Itdoesn'tsetupthe *portsorenablethem.Themaingoalhereistosettheglobal *interface_port_count[interface]correctly.Hardwaresetupofthe *portswillbeperformedlater. * *@interface:Interfacetoprobe * *ReturnsZeroonsuccess,negativeonfailure
*/ int cvmx_helper_interface_probe(int interface)
{
cvmx_helper_interface_enumerate(interface); /* At this stage in the game we don't want packets to be moving yet. Thefollowingprobecallsshouldperformhardwaresetup
needed to determine port counts. Receive must still be disabled */ switch (cvmx_helper_interface_get_mode(interface)) { /* These types don't support ports to IPD/PKO */ case CVMX_HELPER_INTERFACE_MODE_DISABLED: case CVMX_HELPER_INTERFACE_MODE_PCIE: break; /* XAUI is a single high speed port */ case CVMX_HELPER_INTERFACE_MODE_XAUI:
__cvmx_helper_xaui_probe(interface); break; /* *RGMII/GMII/MIIarealltreatedaboutthesame.Most *functionsrefertotheseportsasRGMII.
*/ case CVMX_HELPER_INTERFACE_MODE_RGMII: case CVMX_HELPER_INTERFACE_MODE_GMII:
__cvmx_helper_rgmii_probe(interface); break; /* *SPI4canhave1-16portsdependingonthedeviceat *theotherend.
*/ case CVMX_HELPER_INTERFACE_MODE_SPI:
__cvmx_helper_spi_probe(interface); break; /* *SGMIIcanhave1-4portsdependingonhowmanyare *hookedup.
*/ case CVMX_HELPER_INTERFACE_MODE_SGMII: case CVMX_HELPER_INTERFACE_MODE_PICMG:
__cvmx_helper_sgmii_probe(interface); break; /* PCI target Network Packet Interface */ case CVMX_HELPER_INTERFACE_MODE_NPI:
__cvmx_helper_npi_probe(interface); break; /* *Specialloopbackonlyports.Thesearenotthesame *asotherportsinloopbackmode.
*/ case CVMX_HELPER_INTERFACE_MODE_LOOP:
__cvmx_helper_loop_probe(interface); break;
}
/* Make sure all global variables propagate to other cores */
CVMX_SYNCWS;
while (num_ports--) {
__cvmx_helper_port_setup_ipd(ipd_port);
ipd_port++;
} return0;
}
/** *SetupglobalsettingforIPD/PIPnotrelatedtoaspecific *interfaceorport.ThismustbecalledbeforeIPDisenabled. * *ReturnsZeroonsuccess,negativeonfailure.
*/ staticint __cvmx_helper_global_setup_ipd(void)
{ /* Setup the global packet input options */
cvmx_ipd_config(CVMX_FPA_PACKET_POOL_SIZE / 8,
CVMX_HELPER_FIRST_MBUFF_SKIP / 8,
CVMX_HELPER_NOT_FIRST_MBUFF_SKIP / 8, /* The +8 is to account for the next ptr */
(CVMX_HELPER_FIRST_MBUFF_SKIP + 8) / 128, /* The +8 is to account for the next ptr */
(CVMX_HELPER_NOT_FIRST_MBUFF_SKIP + 8) / 128,
CVMX_FPA_WQE_POOL,
CVMX_IPD_OPC_MODE_STT,
CVMX_HELPER_ENABLE_BACK_PRESSURE); return0;
}
/** *Setupglobalbackpressuresetting. * *ReturnsZeroonsuccess,negativeonfailure
*/ staticint __cvmx_helper_global_setup_backpressure(void)
{ #if CVMX_HELPER_DISABLE_RGMII_BACKPRESSURE /* Disable backpressure if configured to do so */ /* Disable backpressure (pause frame) generation */ int num_interfaces = cvmx_helper_get_number_of_interfaces(); int interface; for (interface = 0; interface < num_interfaces; interface++) { switch (cvmx_helper_interface_get_mode(interface)) { case CVMX_HELPER_INTERFACE_MODE_DISABLED: case CVMX_HELPER_INTERFACE_MODE_PCIE: case CVMX_HELPER_INTERFACE_MODE_NPI: case CVMX_HELPER_INTERFACE_MODE_LOOP: case CVMX_HELPER_INTERFACE_MODE_XAUI: break; case CVMX_HELPER_INTERFACE_MODE_RGMII: case CVMX_HELPER_INTERFACE_MODE_GMII: case CVMX_HELPER_INTERFACE_MODE_SPI: case CVMX_HELPER_INTERFACE_MODE_SGMII: case CVMX_HELPER_INTERFACE_MODE_PICMG:
cvmx_gmx_set_backpressure_override(interface, 0xf); break;
}
} #endif
return0;
}
/** *Enablepacketinput/outputfromthehardware.Thisfunctionis *calledafterallinternalsetupiscompleteandIPDisenabled. *Afterthisfunctioncompletes,packetswillbeacceptedfromthe *hardwareports.PKOshouldstillbedisabledtomakesurepackets *aren'tsentoutpartiallysetuphardware. * *@interface:Interfacetoenable * *ReturnsZeroonsuccess,negativeonfailure
*/ staticint __cvmx_helper_packet_hardware_enable(int interface)
{ int result = 0; switch (cvmx_helper_interface_get_mode(interface)) { /* These types don't support ports to IPD/PKO */ case CVMX_HELPER_INTERFACE_MODE_DISABLED: case CVMX_HELPER_INTERFACE_MODE_PCIE: /* Nothing to do */ break; /* XAUI is a single high speed port */ case CVMX_HELPER_INTERFACE_MODE_XAUI:
result = __cvmx_helper_xaui_enable(interface); break; /* *RGMII/GMII/MIIarealltreatedaboutthesame.Most *functionsrefertotheseportsasRGMII
*/ case CVMX_HELPER_INTERFACE_MODE_RGMII: case CVMX_HELPER_INTERFACE_MODE_GMII:
result = __cvmx_helper_rgmii_enable(interface); break; /* *SPI4canhave1-16portsdependingonthedeviceat *theotherend
*/ case CVMX_HELPER_INTERFACE_MODE_SPI:
result = __cvmx_helper_spi_enable(interface); break; /* *SGMIIcanhave1-4portsdependingonhowmanyare *hookedup
*/ case CVMX_HELPER_INTERFACE_MODE_SGMII: case CVMX_HELPER_INTERFACE_MODE_PICMG:
result = __cvmx_helper_sgmii_enable(interface); break; /* PCI target Network Packet Interface */ case CVMX_HELPER_INTERFACE_MODE_NPI:
result = __cvmx_helper_npi_enable(interface); break; /* *Specialloopbackonlyports.Thesearenotthesame *asotherportsinloopbackmode
*/ case CVMX_HELPER_INTERFACE_MODE_LOOP:
result = __cvmx_helper_loop_enable(interface); break;
} return result;
}
/** *FunctiontoadjustinternalIPDpointeralignments * *Returns0onsuccess *!0onfailure
*/ staticint __cvmx_helper_errata_fix_ipd_ptr_alignment(void)
{ #define FIX_IPD_FIRST_BUFF_PAYLOAD_BYTES \
(CVMX_FPA_PACKET_POOL_SIZE-8-CVMX_HELPER_FIRST_MBUFF_SKIP) #define FIX_IPD_NON_FIRST_BUFF_PAYLOAD_BYTES \
(CVMX_FPA_PACKET_POOL_SIZE-8-CVMX_HELPER_NOT_FIRST_MBUFF_SKIP) #define FIX_IPD_OUTPORT 0 /* Ports 0-15 are interface 0, 16-31 are interface 1 */ #define INTERFACE(port) (port >> 4) #define INDEX(port) (port & 0xf)
uint64_t *p64; union cvmx_pko_command_word0 pko_command; union cvmx_buf_ptr g_buffer, pkt_buffer; struct cvmx_wqe *work; int size, num_segs = 0, wqe_pcnt, pkt_pcnt; union cvmx_gmxx_prtx_cfg gmx_cfg; int retry_cnt; int retry_loop_cnt; int i;
/* Save values for restore at end */
uint64_t prtx_cfg =
cvmx_read_csr(CVMX_GMXX_PRTX_CFG
(INDEX(FIX_IPD_OUTPORT), INTERFACE(FIX_IPD_OUTPORT)));
uint64_t tx_ptr_en =
cvmx_read_csr(CVMX_ASXX_TX_PRT_EN(INTERFACE(FIX_IPD_OUTPORT)));
uint64_t rx_ptr_en =
cvmx_read_csr(CVMX_ASXX_RX_PRT_EN(INTERFACE(FIX_IPD_OUTPORT)));
uint64_t rxx_jabber =
cvmx_read_csr(CVMX_GMXX_RXX_JABBER
(INDEX(FIX_IPD_OUTPORT), INTERFACE(FIX_IPD_OUTPORT)));
uint64_t frame_max =
cvmx_read_csr(CVMX_GMXX_RXX_FRM_MAX
(INDEX(FIX_IPD_OUTPORT), INTERFACE(FIX_IPD_OUTPORT)));
/* Configure port to gig FDX as required for loopback mode */
cvmx_helper_rgmii_internal_loopback(FIX_IPD_OUTPORT);
CVMX_SYNC; if (num_segs)
cvmx_dprintf("WARNING: FIX_IPD_PTR_ALIGNMENT failed.\n");
return !!num_segs;
}
/** *CalledafterallinternalpacketIOpathsaresetup.This *functionenablesIPD/PIPandbeginspacketinputandoutput. * *ReturnsZeroonsuccess,negativeonfailure
*/ int cvmx_helper_ipd_and_packet_input_enable(void)
{ int num_interfaces; int interface;
/** *InitializethePIP,IPD,andPKOhardwaretosupport *simpleprioritybasedqueuesfortheethernetports.Each *portisconfiguredwithanumberofpriorityqueuesbased *onCVMX_PKO_QUEUES_PER_PORT_*whereeachqueueislower *prioritythantheprevious. * *ReturnsZeroonsuccess,non-zeroonfailure
*/ int cvmx_helper_initialize_packet_io_global(void)
{ int result = 0; int interface; union cvmx_l2c_cfg l2c_cfg; constint num_interfaces = cvmx_helper_get_number_of_interfaces();
/* *CN52XXpass1:Duetoabugin2ndorderCDR,itneedsto *bedisabled.
*/ if (OCTEON_IS_MODEL(OCTEON_CN52XX_PASS1_0))
__cvmx_helper_errata_qlm_disable_2nd_order_cdr(1);
cvmx_pko_initialize_global(); for (interface = 0; interface < num_interfaces; interface++) {
result |= cvmx_helper_interface_probe(interface); if (cvmx_helper_ports_on_interface(interface) > 0)
cvmx_dprintf("Interface %d has %d ports (%s)\n",
interface,
cvmx_helper_ports_on_interface(interface),
cvmx_helper_interface_mode_to_string
(cvmx_helper_interface_get_mode
(interface)));
result |= __cvmx_helper_interface_setup_ipd(interface);
result |= __cvmx_helper_interface_setup_pko(interface);
}
result |= __cvmx_helper_global_setup_ipd();
result |= __cvmx_helper_global_setup_pko();
/* Enable any flow control and backpressure */
result |= __cvmx_helper_global_setup_backpressure();
#if CVMX_HELPER_ENABLE_IPD
result |= cvmx_helper_ipd_and_packet_input_enable(); #endif return result;
}
EXPORT_SYMBOL_GPL(cvmx_helper_initialize_packet_io_global);
/** *ReturnthelinkstateofanIPD/PKOportasreturnedby *autonegotiation.Theresultofthisfunctionmaynotmatch *Octeon'slinkconfigifautonegotiationhaschangedsince *thelastcalltocvmx_helper_link_set(). * *@ipd_port:IPD/PKOporttoquery * *ReturnsLinkstate
*/ union cvmx_helper_link_info cvmx_helper_link_get(int ipd_port)
{ union cvmx_helper_link_info result; int interface = cvmx_helper_get_interface_num(ipd_port); int index = cvmx_helper_get_interface_index_num(ipd_port);
/* The default result will be a down link unless the code below
changes it */
result.u64 = 0;
if (index >= cvmx_helper_ports_on_interface(interface)) return result;
switch (cvmx_helper_interface_get_mode(interface)) { case CVMX_HELPER_INTERFACE_MODE_DISABLED: case CVMX_HELPER_INTERFACE_MODE_PCIE: /* Network links are not supported */ break; case CVMX_HELPER_INTERFACE_MODE_XAUI:
result = __cvmx_helper_xaui_link_get(ipd_port); break; case CVMX_HELPER_INTERFACE_MODE_GMII: if (index == 0)
result = __cvmx_helper_rgmii_link_get(ipd_port); else {
WARN_ONCE(1, "Using deprecated link status - please update your DT");
result.s.full_duplex = 1;
result.s.link_up = 1;
result.s.speed = 1000;
} break; case CVMX_HELPER_INTERFACE_MODE_RGMII:
result = __cvmx_helper_rgmii_link_get(ipd_port); break; case CVMX_HELPER_INTERFACE_MODE_SPI:
result = __cvmx_helper_spi_link_get(ipd_port); break; case CVMX_HELPER_INTERFACE_MODE_SGMII: case CVMX_HELPER_INTERFACE_MODE_PICMG:
result = __cvmx_helper_sgmii_link_get(ipd_port); break; case CVMX_HELPER_INTERFACE_MODE_NPI: case CVMX_HELPER_INTERFACE_MODE_LOOP: /* Network links are not supported */ break;
} return result;
}
EXPORT_SYMBOL_GPL(cvmx_helper_link_get);
/** *ConfigureanIPD/PKOportforthespecifiedlinkstate.This *functiondoesnotinfluenceautonegotiationatthePHYlevel. *Thepassedlinkstatemustalwaysmatchthelinkstatereturned *bycvmx_helper_link_get(). * *@ipd_port:IPD/PKOporttoconfigure *@link_info:Thenewlinkstate * *ReturnsZeroonsuccess,negativeonfailure
*/ int cvmx_helper_link_set(int ipd_port, union cvmx_helper_link_info link_info)
{ int result = -1; int interface = cvmx_helper_get_interface_num(ipd_port); int index = cvmx_helper_get_interface_index_num(ipd_port);
if (index >= cvmx_helper_ports_on_interface(interface)) return -1;
switch (cvmx_helper_interface_get_mode(interface)) { case CVMX_HELPER_INTERFACE_MODE_DISABLED: case CVMX_HELPER_INTERFACE_MODE_PCIE: break; case CVMX_HELPER_INTERFACE_MODE_XAUI:
result = __cvmx_helper_xaui_link_set(ipd_port, link_info); break; /* *RGMII/GMII/MIIarealltreatedaboutthesame.Most *functionsrefertotheseportsasRGMII.
*/ case CVMX_HELPER_INTERFACE_MODE_RGMII: case CVMX_HELPER_INTERFACE_MODE_GMII:
result = __cvmx_helper_rgmii_link_set(ipd_port, link_info); break; case CVMX_HELPER_INTERFACE_MODE_SPI:
result = __cvmx_helper_spi_link_set(ipd_port, link_info); break; case CVMX_HELPER_INTERFACE_MODE_SGMII: case CVMX_HELPER_INTERFACE_MODE_PICMG:
result = __cvmx_helper_sgmii_link_set(ipd_port, link_info); break; case CVMX_HELPER_INTERFACE_MODE_NPI: case CVMX_HELPER_INTERFACE_MODE_LOOP: break;
} return result;
}
EXPORT_SYMBOL_GPL(cvmx_helper_link_set);
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.