• Thomas Petazzoni's avatar
    net: mvpp2: handle register mapping and access for PPv2.2 · a786841d
    Thomas Petazzoni authored
    This commit adjusts the mvpp2 driver register mapping and access logic
    to support PPv2.2, to handle a number of differences.
    
    Due to how the registers are laid out in memory, the Device Tree binding
    for the "reg" property is different:
    
     - On PPv2.1, we had a first area for the packet processor
       registers (common to all ports), and then one area per port.
    
     - On PPv2.2, we have a first area for the packet processor
       registers (common to all ports), and a second area for numerous other
       registers, including a large number of per-port registers
    
    In addition, on PPv2.2, the area for the common registers is split into
    so-called "address spaces" of 64 KB each. They allow to access per-CPU
    registers, where each CPU has its own copy of some registers. A few
    other registers, which have a single copy, also need to be accessed from
    those per-CPU windows if they are related to a per-CPU register. For
    example:
    
      - Writing to MVPP2_TXQ_NUM_REG selects a TX queue. This register is a
        per-CPU register, it must be accessed from the current CPU register
        window.
    
      - Then a write to MVPP2_TXQ_PENDING_REG, MVPP2_TXQ_DESC_ADDR_REG (and
        a few others) will affect the TX queue that was selected by the
        write to MVPP2_TXQ_NUM_REG. It must be accessed from the same CPU
        window as the write to the TXQ_NUM_REG.
    
    Therefore, the ->base member of 'struct mvpp2' is replaced with a
    ->cpu_base[] array, each entry pointing to a mapping of the per-CPU
    area. Since PPv2.1 doesn't have this concept of per-CPU windows, all
    entries in ->cpu_base[] point to the same io-remapped area.
    
    The existing mvpp2_read() and mvpp2_write() accessors use cpu_base[0],
    they are used for registers for which the CPU window doesn't matter.
    
    mvpp2_percpu_read() and mvpp2_percpu_write() are new accessors added to
    access the registers for which the CPU window does matter, which is why
    they take a "cpu" as argument.
    
    The driver is then changed to use mvpp2_percpu_read() and
    mvpp2_percpu_write() where it matters.
    Signed-off-by: default avatarThomas Petazzoni <thomas.petazzoni@free-electrons.com>
    Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
    a786841d
mvpp2.c 188 KB