All of lore.kernel.org
 help / color / mirror / Atom feed
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

             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.