• Yanteng Si's avatar
    net: stmmac: dwmac-loongson: Add Loongson Multi-channels GMAC support · 803fc61d
    Yanteng Si authored
    The Loongson DWMAC driver currently supports the Loongson GMAC
    devices (based on the DW GMAC v3.50a/v3.73a IP-core) installed to the
    LS2K1000 SoC and LS7A1000 chipset. But recently a new generation
    LS2K2000 SoC was released with the new version of the Loongson GMAC
    synthesized in. The new controller is based on the DW GMAC v3.73a
    IP-core with the AV-feature enabled, which implies the multi
    DMA-channels support. The multi DMA-channels feature has the next
    vendor-specific peculiarities:
    
    1. Split up Tx and Rx DMA IRQ status/mask bits:
           Name              Tx          Rx
      DMA_INTR_ENA_NIE = 0x00040000 | 0x00020000;
      DMA_INTR_ENA_AIE = 0x00010000 | 0x00008000;
      DMA_STATUS_NIS   = 0x00040000 | 0x00020000;
      DMA_STATUS_AIS   = 0x00010000 | 0x00008000;
      DMA_STATUS_FBI   = 0x00002000 | 0x00001000;
    2. Custom Synopsys ID hardwired into the GMAC_VERSION.SNPSVER register
    field. It's 0x10 while it should have been 0x37 in accordance with
    the actual DW GMAC IP-core version.
    3. There are eight DMA-channels available meanwhile the Synopsys DW
    GMAC IP-core supports up to three DMA-channels.
    4. It's possible to have each DMA-channel IRQ independently delivered.
    The MSI IRQs must be utilized for that.
    
    Thus in order to have the multi-channels Loongson GMAC controllers
    supported let's modify the Loongson DWMAC driver in accordance with
    all the peculiarities described above:
    
    1. Create the multi-channels Loongson GMAC-specific
       stmmac_dma_ops::dma_interrupt()
       stmmac_dma_ops::init_chan()
       callbacks due to the non-standard DMA IRQ CSR flags layout.
    2. Create the Loongson DWMAC-specific platform setup() method
    which gets to initialize the DMA-ops with the dwmac1000_dma_ops
    instance and overrides the callbacks described in 1. The method also
    overrides the custom Synopsys ID with the real one in order to have
    the rest of the HW-specific callbacks correctly detected by the driver
    core.
    3. Make sure the platform setup() method enables the flow control and
    duplex modes supported by the controller.
    Signed-off-by: default avatarFeiyang Chen <chenfeiyang@loongson.cn>
    Signed-off-by: default avatarYinggang Gu <guyinggang@loongson.cn>
    Acked-by: default avatarHuacai Chen <chenhuacai@loongson.cn>
    Signed-off-by: default avatarYanteng Si <siyanteng@loongson.cn>
    Reviewed-by: default avatarSerge Semin <fancer.lancer@gmail.com>
    Tested-by: default avatarSerge Semin <fancer.lancer@gmail.com>
    Signed-off-by: default avatarPaolo Abeni <pabeni@redhat.com>
    803fc61d
common.h 18.3 KB