From: benjamin.zores@alcatel-lucent.com (Benjamin Zores)
To: linux-arm-kernel@lists.infradead.org
Subject: [PATCH 4/4 v2] [ARM] Kirkwood: add support for PCIe1
Date: Fri, 04 Jun 2010 09:09:27 +0200 [thread overview]
Message-ID: <4C08A6A7.8010904@alcatel-lucent.com> (raw)
Hi,
Sorry not to be able to reply/quote, wasn't subscribed before.
Anyhow, this is a patch review/comment from
http://lists.infradead.org/pipermail/linux-arm-kernel/2010-June/017106.html
There are a few things missing for proper PCIe #1 support imho:
diff --git a/arch/arm/mach-kirkwood/db88f6281-bp-setup.c b/arch/arm/mach-kirkwood/db88f6281-bp-setup.c
index 39bdf4b..b11b5fe 100644
--- a/arch/arm/mach-kirkwood/db88f6281-bp-setup.c
+++ b/arch/arm/mach-kirkwood/db88f6281-bp-setup.c
@@ -74,9 +74,15 @@ static void __init db88f6281_init(void)
static int __init db88f6281_pci_init(void)
{
- if (machine_is_db88f6281_bp())
- kirkwood_pcie_init();
+ if (machine_is_db88f6281_bp()) {
+ u32 dev, rev;
+ int init_port1 = 0;
+ kirkwood_pcie_id(&dev,&rev);
+ if (dev == MV88F6282_DEV_ID)
+ init_port1 = 1;
+ kirkwood_pcie_init(1, init_port1);
+ }
return 0;
}
subsys_initcall(db88f6281_pci_init);
This is really likely not to be possible, unless the 2 boards
(db-88f6281-bp and db-88f6282-bp have the same ID given by uboot, which
I guess is not the case).
Better would be to define a new board.
diff --git a/arch/arm/mach-kirkwood/include/mach/bridge-regs.h b/arch/arm/mach-kirkwood/include/mach/bridge-regs.h
index 418f501..2026b30 100644
--- a/arch/arm/mach-kirkwood/include/mach/bridge-regs.h
+++ b/arch/arm/mach-kirkwood/include/mach/bridge-regs.h
@@ -59,6 +59,7 @@
#define CGC_SATA1 (1<< 15)
#define CGC_XOR1 (1<< 16)
#define CGC_CRYPTO (1<< 17)
+#define CGC_PEX1 (1<< 18)
#define CGC_GE1 (1<< 19)
#define CGC_TDM (1<< 20)
#define CGC_RESERVED ((1<< 18) | (0x6<< 21))
From datasheet, that's correct but then you need to update the
CGC_RESERVED define to remove the (1 << 18) now that is being used.
@@ -72,6 +81,7 @@
#define PCIE_VIRT_BASE (KIRKWOOD_REGS_VIRT_BASE | 0x40000)
#define PCIE_LINK_CTRL (PCIE_VIRT_BASE | 0x70)
#define PCIE_STATUS (PCIE_VIRT_BASE | 0x1a04)
+#define PCIE1_VIRT_BASE (KIRKWOOD_REGS_VIRT_BASE | 0x44000)
Also correct, but then you also need to define the following ones:
+ #define PCIE1_LINK_CTRL (PCIE1_VIRT_BASE | 0x70)
+ #define PCIE1_STATUS (PCIE1_VIRT_BASE | 0x1a04)
A few other things also need to be done in
arch/arm/mach-kirkwood/common.c for 2nd PCIe to be properly initialized.
Sorry for this not to be in patch format but you'll probably get my
point anyhow.
The I/O Mapping has to be set conditionally. I'd propose the following
approach:
/* I/O Mapping with 1 PEX controller */
static struct map_desc kirkwood_io_desc_1[] __initdata = {
{
.virtual = KIRKWOOD_PCIE_IO_VIRT_BASE,
.pfn = __phys_to_pfn(KIRKWOOD_PCIE_IO_PHYS_BASE),
.length = KIRKWOOD_PCIE_IO_SIZE,
.type = MT_DEVICE,
}, {
.virtual = KIRKWOOD_REGS_VIRT_BASE,
.pfn = __phys_to_pfn(KIRKWOOD_REGS_PHYS_BASE),
.length = KIRKWOOD_REGS_SIZE,
.type = MT_DEVICE,
},
};
/* I/O Mapping with 2 PEX controllers */
static struct map_desc kirkwood_io_desc_2[] __initdata = {
{
.virtual = KIRKWOOD_PCIE_IO_VIRT_BASE,
.pfn = __phys_to_pfn(KIRKWOOD_PCIE_IO_PHYS_BASE),
.length = KIRKWOOD_PCIE_IO_SIZE,
.type = MT_DEVICE,
}, {
{
.virtual = KIRKWOOD_PCIE1_IO_VIRT_BASE,
.pfn = __phys_to_pfn(KIRKWOOD_PCIE1_IO_PHYS_BASE),
.length = KIRKWOOD_PCIE1_IO_SIZE,
.type = MT_DEVICE,
}, {
.virtual = KIRKWOOD_REGS_VIRT_BASE,
.pfn = __phys_to_pfn(KIRKWOOD_REGS_PHYS_BASE),
.length = KIRKWOOD_REGS_SIZE,
.type = MT_DEVICE,
},
};
void __init kirkwood_map_io(void)
{
u32 dev, rev;
kirkwood_pcie_id(&dev, &rev);
if (dev == MV88F6282_DEV_ID && (rev == MV88F6282_REV_A0))
iotable_init(kirkwood_io_desc_2,
ARRAY_SIZE(kirkwood_io_desc_2));
else
iotable_init(kirkwood_io_desc_1,
ARRAY_SIZE(kirkwood_io_desc_1));
}
And also in kirkwood_clock_gate():
/* Make sure those units are accessible */
- writel(curr | CGC_SATA0 | CGC_SATA1 | CGC_PEX0 | CGC_PEX1,
CLOCK_GATING_CTRL);
+ writel(curr | CGC_SATA0 | CGC_SATA1 | CGC_PEX0, CLOCK_GATING_CTRL);
And 2nd PCIe PHY shutdown at init:
+ /* For PCIe #1: first shutdown the phy */
+ if (!(kirkwood_clk_ctrl & CGC_PEX1)) {
+ writel(readl(PCIE1_LINK_CTRL) | 0x10, PCIE1_LINK_CTRL);
+ while (1)
+ if (readl(PCIE1_STATUS) & 0x1)
+ break;
+ writel(readl(PCIE1_LINK_CTRL) & ~0x10, PCIE1_LINK_CTRL);
+ }
Additionally, not sure it is needed for PCIe support but@least for F6282,
you need to refine the MPP matrix in mpp.h. The 6282 MPP _really_ is
different from 6281 one.
I can send a patch for this if needed, I already have done the necessary
changes in my tree.
Ben
next reply other threads:[~2010-06-04 7:09 UTC|newest]
Thread overview: 3+ messages / expand[flat|nested] mbox.gz Atom feed top
2010-06-04 7:09 Benjamin Zores [this message]
2010-06-04 18:08 ` [PATCH 4/4 v2] [ARM] Kirkwood: add support for PCIe1 Nicolas Pitre
-- strict thread matches above, loose matches on Subject: below --
2010-06-03 11:58 [PATCH 3/4] [ARM] PCI: add platform private data to pci_sys_data Saeed Bishara
2010-06-03 11:58 ` [PATCH 4/4 v2] [ARM] Kirkwood: add support for PCIe1 Saeed Bishara
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=4C08A6A7.8010904@alcatel-lucent.com \
--to=benjamin.zores@alcatel-lucent.com \
--cc=linux-arm-kernel@lists.infradead.org \
/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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.