The LS1043-S has two SFP slots:

The 10G SFP slot is connected to the LS1043A SoC via a retimer (TI DS110/DS125), which performs the clock recovery functions required for SFP+ modules.

The 1G slot is connected to an AR8035 on the LS1043-S, which is connected to the CPU on the RGMII/EC2 port.

PLL and SerDes protocols for 10G

The board has a clock mux (U16) which switches the input to SerDes PLL#1, the select line is connected to the on-board microcontroller, which stores the setting in the EEPROM. User code can change the setting by communicating with the on-board microcontroller over I2C.

Note that some multi-bit rate SFP's (such as Mikrotik's S+RJ10 10GBase-T) will always present a 10G bitstream, so there is no need to change the SerDes protocol for them.

SFP GPIO's

By default, TX_DISABLE is pulled up on the SFP, so userspace will need to control the GPIO to activate the module. Note that direct connect SFP's may ignore any TX_DISABLE.

Under OpenWrt this is acheived by a gpio_switch setting:

# cat /etc/config/system

config gpio_switch 'tensfp_txdisable'
        option name 'SFP+ TX Disable'
        option gpio_pin '378'
        option value '0'

config gpio_switch 'gigsfp_txdisable'
        option name 'SFP TX Disable'
        option gpio_pin '381'
        option value '0'

These settings are added on first boot by /etc/board.d/03_gpio_switches

SFP I2C

The I2C bus for SFP's are connected through a PCA9540BD I2C multiplexer, the 1G SFP is channel 0 and 10G SFP is channel 1. Our device tree has the required setup for this.