• Bharat Kumar Gogada's avatar
    PCI: xilinx-nwl: Fix Multi MSI data programming · fc9c15c4
    Bharat Kumar Gogada authored
    [ Upstream commit 181fa434 ]
    
    According to the PCI Local Bus specification Revision 3.0,
    section 6.8.1.3 (Message Control for MSI), endpoints that
    are Multiple Message Capable as defined by bits [3:1] in
    the Message Control for MSI can request a number of vectors
    that is power of two aligned.
    
    As specified in section 6.8.1.6 "Message data for MSI", the Multiple
    Message Enable field (bits [6:4] of the Message Control register)
    defines the number of low order message data bits the function is
    permitted to modify to generate its system software allocated
    vectors.
    
    The MSI controller in the Xilinx NWL PCIe controller supports a number
    of MSI vectors specified through a bitmap and the hwirq number for an
    MSI, that is the value written in the MSI data TLP is determined by
    the bitmap allocation.
    
    For instance, in a situation where two endpoints sitting on
    the PCI bus request the following MSI configuration, with
    the current PCI Xilinx bitmap allocation code (that does not
    align MSI vector allocation on a power of two boundary):
    
    Endpoint #1: Requesting 1 MSI vector - allocated bitmap bits 0
    Endpoint #2: Requesting 2 MSI vectors - allocated bitmap bits [1,2]
    
    The bitmap value(s) corresponds to the hwirq number that is programmed
    into the Message Data for MSI field in the endpoint MSI capability
    and is detected by the root complex to fire the corresponding
    MSI irqs. The value written in Message Data for MSI field corresponds
    to the first bit allocated in the bitmap for Multi MSI vectors.
    
    The current Xilinx NWL MSI allocation code allows a bitmap allocation
    that is not a power of two boundaries, so endpoint #2, is allowed to
    toggle Message Data bit[0] to differentiate between its two vectors
    (meaning that the MSI data will be respectively 0x0 and 0x1 for the two
    vectors allocated to endpoint #2).
    
    This clearly aliases with the Endpoint #1 vector allocation, resulting
    in a broken Multi MSI implementation.
    
    Update the code to allocate MSI bitmap ranges with a power of two
    alignment, fixing the bug.
    
    Fixes: ab597d35 ("PCI: xilinx-nwl: Add support for Xilinx NWL PCIe Host Controller")
    Suggested-by: default avatarMarc Zyngier <marc.zyngier@arm.com>
    Signed-off-by: default avatarBharat Kumar Gogada <bharat.kumar.gogada@xilinx.com>
    [lorenzo.pieralisi@arm.com: updated commit log]
    Signed-off-by: default avatarLorenzo Pieralisi <lorenzo.pieralisi@arm.com>
    Acked-by: default avatarMarc Zyngier <marc.zyngier@arm.com>
    Signed-off-by: default avatarSasha Levin <sashal@kernel.org>
    fc9c15c4
pcie-xilinx-nwl.c 24.1 KB