Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

rapidio/tsi721: add PCIe MRRS override parameter

Add PCIe Maximum Read Request Size (MRRS) adjustment parameter to allow
users to override configuration register value set during PCIe bus
initialization.

Performance of Tsi721 device as PCIe bus master can be improved if MRRS
is set to its maximum value (4096 bytes). Some platforms have
limitations for supported MRRS and therefore the default value should be
preserved, unless it is known that given platform supports full set of
MRRS values defined by PCI Express specification.

Link: http://lkml.kernel.org/r/1469125134-16523-6-git-send-email-alexandre.bounine@idt.com
Signed-off-by: Alexandre Bounine <alexandre.bounine@idt.com>
Cc: Matt Porter <mporter@kernel.crashing.org>
Cc: Andre van Herk <andre.van.herk@prodrive-technologies.com>
Cc: Barry Wood <barry.wood@idt.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>

authored by

Alexandre Bounine and committed by
Linus Torvalds
cb782cdd 4498c31a

+22 -1
+7
Documentation/rapidio/tsi721.txt
··· 39 39 DMA channels not selected by this mask will not be used by this device 40 40 driver. Default value is 0x7f (use all channels). 41 41 42 + - 'pcie_mrrs' - override value for PCIe Maximum Read Request Size (MRRS). 43 + This parameter gives an ability to override MRRS value set during PCIe 44 + configuration process. Tsi721 supports read request sizes up to 4096B. 45 + Value for this parameter must be set as defined by PCIe specification: 46 + 0 = 128B, 1 = 256B, 2 = 512B, 3 = 1024B, 4 = 2048B and 5 = 4096B. 47 + Default value is '-1' (= keep platform setting). 48 + 42 49 II. Known problems 43 50 44 51 None.
+15 -1
drivers/rapidio/devices/tsi721.c
··· 37 37 #include "tsi721.h" 38 38 39 39 #ifdef DEBUG 40 - u32 dbg_level = DBG_INIT | DBG_EXIT; 40 + u32 dbg_level; 41 41 module_param(dbg_level, uint, S_IWUSR | S_IRUGO); 42 42 MODULE_PARM_DESC(dbg_level, "Debugging output level (default 0 = none)"); 43 43 #endif 44 + 45 + static int pcie_mrrs = -1; 46 + module_param(pcie_mrrs, int, S_IRUGO); 47 + MODULE_PARM_DESC(pcie_mrrs, "PCIe MRRS override value (0...5)"); 44 48 45 49 static void tsi721_omsg_handler(struct tsi721_device *priv, int ch); 46 50 static void tsi721_imsg_handler(struct tsi721_device *priv, int ch); ··· 2843 2839 /* Clear "no snoop" and "relaxed ordering" bits. */ 2844 2840 pcie_capability_clear_and_set_word(pdev, PCI_EXP_DEVCTL, 2845 2841 PCI_EXP_DEVCTL_RELAX_EN | PCI_EXP_DEVCTL_NOSNOOP_EN, 0); 2842 + 2843 + /* Override PCIe Maximum Read Request Size setting if requested */ 2844 + if (pcie_mrrs >= 0) { 2845 + if (pcie_mrrs <= 5) 2846 + pcie_capability_clear_and_set_word(pdev, PCI_EXP_DEVCTL, 2847 + PCI_EXP_DEVCTL_READRQ, pcie_mrrs << 12); 2848 + else 2849 + tsi_info(&pdev->dev, 2850 + "Invalid MRRS override value %d", pcie_mrrs); 2851 + } 2846 2852 2847 2853 /* Adjust PCIe completion timeout. */ 2848 2854 pcie_capability_clear_and_set_word(pdev, PCI_EXP_DEVCTL2, 0xf, 0x2);