From: Vladimir Kondratiev <vladimir.kondratiev@intel.com>
To: "Durairaj, Sundarapandian" <sundarapandian.durairaj@intel.com>
Cc: linux-kernel@vger.kernel.org, Grege@kroah.com, "Seshadri,
Harinarayanan" <harinarayanan.seshadri@intel.com>
Subject: Re: [patch] PCI Express Enhanced Config Patch - 2.6.0-test11
Date: Wed, 07 Jan 2004 19:34:28 +0200 [thread overview]
Message-ID: <3FFC4324.8050201@intel.com> (raw)
In-Reply-To: <6B09584CC3D2124DB45C3B592414FA8308C8B6@bgsmsx402.gar.corp.intel.com>
Durairaj, Sundarapandian wrote:
>Hi All,
>
>Thanks for your review comments. I am reposting the updated patch after
>incorporating the review comments.
>Please review this and send your comments.
>
>Thanks,
>Sundar
>
>------------------------------------------------
>
>
>
<skip>
>diff -Naur linux-2.6.0/arch/i386/pci/direct.c
>linux_pciexpress/arch/i386/pci/direct.c
>--- linux-2.6.0/arch/i386/pci/direct.c 2003-12-18 08:28:28.000000000
>+0530
>+++ linux_pciexpress/arch/i386/pci/direct.c 2004-01-07
>18:16:57.000000000 +0530
>@@ -168,6 +168,124 @@
>
>
> /*
>+ *We map full Page size on each request. Incidently that's the size we
>+ *have for config space too.
>+ */
>+#ifdef CONFIG_PCI_EXP_ENHANCED
>+/*
>+ *On PCI Express capable platform, at the time of kernel initialization
>+ *the os would have scanned for mcfg table and set this variable to
>+ *appropriate value.
>+ *If PCI Express not supported the variable will have 0 value
>+ */
>+u64 mmcfg_base_address;
>
>
I'd made this variable 'unsigned long'. Later, you compare/assign to and
from u32 value.
Actually, it is bus address, which is unsigned long.
>+
>+/*
>+ *Variable used to store the base address of the last pciexpress device
>
>+ *accessed.
>+ */
>+u32 pcie_last_accessed_device;
>+
>+unsigned long pci_exp_set_dev_base (int bus, int dev, int fn)
>+{
>+ u32 dev_base =
>+ mmcfg_base_address | (bus << 20) | ((PCI_DEVFN (dev,fn))
><<12);
>+ if (dev_base != pcie_last_accessed_device){
>+ pcie_last_accessed_device = dev_base;
>+ set_fixmap (FIX_PCIE_MCFG, dev_base);
>+ }
>+ return 0;
>+}
>
>
I suggest to use single 'devfn' argument instead of separate 'dev' and
'fn', like this:
unsigned long pci_exp_set_dev_base (int bus, int devfn)
and, correspondingly,
u32 dev_base = mmcfg_base_address | (bus << 20) | (devfn <<12);
>+
>+static int pci_express_conf_read(int seg, int bus,
>+ int devfn, int reg, int len, u32 *value)
>+{
>+ unsigned long flags;
>+ char * virt_addr;
>
>
Taking into account change above, you save some computation here:
... delete 'dev' and 'fn' calculations
>+ int dev = PCI_SLOT (devfn);
>+ int fn = PCI_FUNC (devfn);
>+
>
>
in this if() change
((u32)dev > 31) || ((u32)fn > 7)
to
((u32)devfn > 255)
>+ if (!value || ((u32)bus > 255) || ((u32)dev > 31)
>+ || ((u32)fn > 7) || ((u32)reg > 4095)){
>+ printk(KERN_ERR "pci_express_conf_read: Invalid
>Parameter\n");
>+ return -EINVAL;
>+ }
>+
>+ /* Shoot misalligned transaction now */
>+ if (reg & (len-1)){
>+ printk(KERN_ERR "pci_express_conf_read: \
>+ misalligned transaction\n");
>+ return -EINVAL;
>+ }
>+
>+ spin_lock_irqsave(&pci_config_lock, flags);
>
>
and call
pci_exp_set_dev_base(bus, devfn);
>+ pci_exp_set_dev_base(bus, dev, fn);
>+ virt_addr = (char *) (fix_to_virt(FIX_PCIE_MCFG));
>
>
virt_addr is constant, convert it to static variable and assign in
pci_direct_init().
No need to recalculate.
>+ switch (len) {
>+ case 1:
>+ *value = (u8)readb((unsigned long) virt_addr+reg);
>+ break;
>+ case 2:
>+ *value = (u16)readw((unsigned long) virt_addr+reg);
>+ break;
>+ case 4:
>+ *value = (u32)readl((unsigned long) virt_addr+reg);
>+ break;
>+ }
>+ spin_unlock_irqrestore(&pci_config_lock, flags);
>+ return 0;
>+}
>+
>
>
the same changes dev,fn -> devfn for _write
>+static int pci_express_conf_write(int seg, int bus,
>+ int devfn, int reg, int len, u32 value)
>+{
>+ unsigned long flags;
>+ unsigned char * virt_addr;
>+ int dev = PCI_SLOT (devfn);
>+ int fn = PCI_FUNC (devfn);
>+
>+ if (!value || ((u32)bus > 255) || ((u32)dev > 31) ||
>+ ((u32)fn > 7) || ((u32)reg > 4095)){
>+ printk(KERN_ERR "pci_express_conf_write: \
>+ Invalid Parameter\n");
>+ return -EINVAL;
>+ }
>+
>+ /* Shoot misalligned transaction now */
>+ if (reg & (len-1)){
>+ printk(KERN_ERR "pci_express_conf_write: \
>+ misalligned transaction\n");
>+ return -EINVAL;
>+ }
>+
>+ spin_lock_irqsave(&pci_config_lock, flags);
>+ pci_exp_set_dev_base(bus, dev, fn);
>+ virt_addr = (char *) (fix_to_virt(FIX_PCIE_MCFG));
>
>
See above - no need to recalculate virt_addr.
>+
>+ switch (len) {
>+ case 1:
>+ writeb(value,(unsigned long)virt_addr+reg);
>+ break;
>+ case 2:
>+ writew(value,(unsigned long)virt_addr+reg);
>+ break;
>+ case 4:
>+ writel(value,(unsigned long)virt_addr+reg);
>+ break;
>+ }
>+ /* Dummy read to flush PCI write */
>+ readl (virt_addr);
>+ spin_unlock_irqrestore(&pci_config_lock, flags);
>+ return 0;
>+}
>+
>
>
next prev parent reply other threads:[~2004-01-07 17:34 UTC|newest]
Thread overview: 43+ messages / expand[flat|nested] mbox.gz Atom feed top
2004-01-07 12:59 [patch] PCI Express Enhanced Config Patch - 2.6.0-test11 Durairaj, Sundarapandian
2004-01-07 14:08 ` Meelis Roos
2004-01-07 17:34 ` Vladimir Kondratiev [this message]
-- strict thread matches above, loose matches on Subject: below --
2004-01-30 16:58 Nakajima, Jun
2004-01-29 11:32 Durairaj, Sundarapandian
2004-01-29 15:09 ` Matthew Wilcox
2004-01-29 15:59 ` Matthew Wilcox
2004-01-29 16:05 ` Linus Torvalds
2004-01-29 16:42 ` Matthew Wilcox
2004-01-29 16:52 ` Linus Torvalds
2004-01-31 21:57 ` Eric W. Biederman
2004-02-01 4:41 ` Grant Grundler
2004-02-01 5:10 ` Matthew Wilcox
2004-02-01 11:00 ` Eric W. Biederman
2004-02-01 15:18 ` Matthew Wilcox
2004-02-01 18:28 ` Eric W. Biederman
2004-02-01 20:11 ` Matthew Wilcox
2004-02-01 21:35 ` Eric W. Biederman
2004-02-01 11:10 ` Eric W. Biederman
2004-01-29 18:09 ` Greg KH
2004-01-30 16:33 ` Greg KH
2004-01-28 9:38 Durairaj, Sundarapandian
2004-01-28 14:42 ` Vladimir Kondratiev
2004-01-28 14:54 ` Christoph Hellwig
2004-01-28 15:00 ` Martin Mares
2004-01-28 15:18 ` Matthew Wilcox
2004-01-22 10:21 Durairaj, Sundarapandian
2004-01-22 10:44 ` Andrew Morton
2004-01-22 11:09 ` Martin Mares
2004-01-22 13:12 ` Andi Kleen
2004-01-22 18:21 ` Alan Cox
2004-01-22 19:40 ` Randy.Dunlap
2004-01-23 19:19 ` Pavel Machek
2004-01-23 19:31 ` Martin Mares
2004-01-23 20:08 ` Stefan Smietanowski
2004-01-22 16:40 ` Grant Grundler
2004-01-22 17:00 ` Greg KH
2004-01-07 16:44 Nakajima, Jun
[not found] <183UK-2Re-11@gated-at.bofh.it>
2003-12-29 19:12 ` Andi Kleen
2003-12-29 11:32 Durairaj, Sundarapandian
2003-12-29 11:53 ` Arjan van de Ven
2003-12-29 11:55 ` Christoph Hellwig
2003-12-29 12:51 ` Johan Sjoholm
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=3FFC4324.8050201@intel.com \
--to=vladimir.kondratiev@intel.com \
--cc=Grege@kroah.com \
--cc=harinarayanan.seshadri@intel.com \
--cc=linux-kernel@vger.kernel.org \
--cc=sundarapandian.durairaj@intel.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox