linux-wireless.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: George Kashperko <george@znau.edu.ua>
To: linux-wireless <linux-wireless@vger.kernel.org>
Subject: Re: [RFC] AI support (14/14 ssb AI on pci host (untested))
Date: Fri, 18 Feb 2011 00:35:24 +0200	[thread overview]
Message-ID: <1297982124.23381.44.camel@dev.znau.edu.ua> (raw)
In-Reply-To: <1297980093.13554.5.camel@maggie>

From: George Kashperko <george@znau.edu.ua>

Add support for AI-style bus on PCI host. This is preliminary
and untested yet.
Signed-off-by: George Kashperko <george@znau.edu.ua>
---
 drivers/ssb/ssb_ai.c |  100 +++++++++++++++++++++++++++++++++++++++++
 1 file changed, 100 insertions(+)
--- linux-wireless-testing.orig/drivers/ssb/ssb_ai.c	2011-02-17 16:01:51.000000000 +0200
+++ linux-wireless-testing/drivers/ssb/ssb_ai.c	2011-02-17 16:04:43.000000000 +0200
@@ -48,6 +48,93 @@ struct ssb_bus_aiops ssb_ssb_aiops = {
 	.write32	= ssb_ssb_aiwrite32,
 };
 
+#ifdef CONFIG_SSB_PCIHOST
+#define SSB_VERBOSE_PCICOREAISWITCH_DEBUG	0
+static int ssb_pci_switch_aicoreidx(struct ssb_bus *bus, u8 coreidx)
+{
+	int err;
+	int attempts = 0;
+	u32 cur_core;
+
+	while (true) {
+		err = pci_write_config_dword(bus->host_pci, SSB_BAR0_WIN2,
+					     (coreidx * SSB_CORE_SIZE) +
+					     SSB_AI_BASE);
+		if (err)
+			goto error;
+		err = pci_read_config_dword(bus->host_pci, SSB_BAR0_WIN2,
+					    &cur_core);
+		if (err)
+			goto error;
+		cur_core = (cur_core - SSB_AI_BASE)
+			   / SSB_CORE_SIZE;
+		if (cur_core == coreidx)
+			break;
+
+		if (attempts++ > SSB_BAR0_MAX_RETRIES)
+			goto error;
+		udelay(10);
+	}
+	return 0;
+error:
+	ssb_printk(KERN_ERR PFX "Failed to switch to AI core %u\n", coreidx);
+	return -ENODEV;
+}
+
+static int ssb_pci_switch_aicore(struct ssb_bus *bus,
+				 struct ssb_device *dev)
+{
+	int err;
+	unsigned long flags;
+
+#if SSB_VERBOSE_PCICOREAISWITCH_DEBUG
+	ssb_printk(KERN_INFO PFX
+		   "Switching to %s AI core, index %d\n",
+		   ssb_core_name(dev->id.coreid),
+		   dev->core_index);
+#endif
+
+	spin_lock_irqsave(&bus->bar_lock, flags);
+	err = ssb_pci_switch_aicoreidx(bus, dev->core_index);
+	if (!err)
+		bus->ai.mapped_device = dev;
+	spin_unlock_irqrestore(&bus->bar_lock, flags);
+
+	return err;
+}
+
+static u32 ssb_pci_airead32(struct ssb_device *dev, u16 offset)
+{
+	struct ssb_bus *bus = dev->bus;
+
+	if (unlikely(!bus->powered_up))
+		return 0xFFFFFFFF;
+	if (unlikely(bus->ai.mapped_device != dev)) {
+		if (unlikely(ssb_pci_switch_aicore(bus, dev)))
+			return 0xFFFFFFFF;
+	}
+	return ioread32(bus->ai.mmio + offset);
+}
+
+static void ssb_pci_aiwrite32(struct ssb_device *dev, u16 offset, u32 value)
+{
+	struct ssb_bus *bus = dev->bus;
+
+	if (unlikely(!bus->powered_up))
+		return;
+	if (unlikely(bus->ai.mapped_device != dev)) {
+		if (unlikely(ssb_pci_switch_aicore(bus, dev)))
+			return;
+	}
+	iowrite32(value, bus->ai.mmio + offset);
+}
+
+struct ssb_bus_aiops ssb_pci_aiops = {
+	.read32		= ssb_pci_airead32,
+	.write32	= ssb_pci_aiwrite32,
+};
+#endif /* CONFIG_SSB_PCIHOST */
+
 /* The 47162a0 hangs when reading its registers */
 static inline bool ssb_bcm47162a0_quirk(struct ssb_device *dev)
 {
@@ -188,6 +275,10 @@ void ssb_iounmap_ai(struct ssb_bus *bus)
 		iounmap(bus->mmio);
 		iounmap(bus->ai.mmio);
 		break;
+#ifdef CONFIG_SSB_PCIHOST
+	case SSB_BUSTYPE_PCI:
+		pci_iounmap(bus->host_pci, bus->mmio);
+#endif
 	default:
 		break;
 	}
@@ -263,6 +354,15 @@ int ssb_bus_scan_ai(struct ssb_bus *bus,
 		if (!eromptr)
 			return -ENOMEM;
 		break;
+#ifdef CONFIG_SSB_PCIHOST
+	case SSB_BUSTYPE_PCI:
+		bus->ai.ops = &ssb_pci_aiops;
+		/* point second bar0 window at the EROM */
+		pci_write_config_dword(bus->host_pci, SSB_BAR0_WIN2, erombase);
+		eromptr = bus->mmio;
+		bus->ai.mmio = bus->mmio + 0x1000;
+		break;
+#endif /* CONFIG_SSB_PCIHOST */
 	default:
 		return -ENODEV;
 	}




  parent reply	other threads:[~2011-02-17 22:43 UTC|newest]

Thread overview: 38+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2011-02-17 15:58 [RFC] AI support George Kashperko
2011-02-17 22:01 ` Michael Büsch
2011-02-17 22:06   ` [RFC] AI support (1/14 ssb admatch redefine) George Kashperko
2011-02-17 22:08   ` [RFC] AI support (2/14 ssb helpers) George Kashperko
2011-02-18 22:29     ` Michael Büsch
2011-02-18 23:15       ` George Kashperko
2011-02-18 23:29         ` Michael Büsch
2011-02-18 23:27           ` George Kashperko
2011-02-17 22:10   ` [RFC] AI support (3/14 ssb irqflag mips core op) George Kashperko
2011-02-17 22:12   ` [RFC] AI support (4/14 ssb mips core irqflag treatment) George Kashperko
2011-02-17 22:14   ` [RFC] AI support (5/14 ssb core control and state helpers) George Kashperko
2011-02-17 22:16   ` [RFC] AI support (6/14 ssb propagate core control and state helpers usage) George Kashperko
2011-02-17 22:18   ` [RFC] AI support (7/14 ssb bus_check_core routine) George Kashperko
2011-02-17 22:20   ` [RFC] AI support (8/14 ssb ssb_bus_detect routine) George Kashperko
2011-02-18 22:35     ` Michael Büsch
2011-02-17 22:23   ` [RFC] AI support (9/14 ssb SB-specific bus scan routine) George Kashperko
2011-02-17 22:25   ` [RFC] AI support (10/14 ssb bus implementation-specific io unmap) George Kashperko
2011-02-17 22:27   ` [RFC] AI support (11/14 ssb separate SB-specific code) George Kashperko
2011-02-17 22:29   ` [RFC] AI support (12/14 ssb mips74k core defs) George Kashperko
2011-02-17 22:31   ` [RFC] AI support (13/14 ssb add AI support) George Kashperko
2011-02-18 22:45     ` Michael Büsch
2011-02-18 23:07       ` George Kashperko
2011-02-18 23:27         ` Michael Büsch
2011-02-18 23:42           ` George Kashperko
2011-02-18 23:54             ` Michael Büsch
2011-02-18 23:51               ` George Kashperko
2011-02-18 23:46           ` Larry Finger
2011-02-18 23:47             ` George Kashperko
2011-02-19  0:06               ` Larry Finger
2011-02-19  0:08                 ` George Kashperko
2011-02-19  0:22                   ` Larry Finger
2011-02-17 22:35   ` George Kashperko [this message]
2011-02-18  2:43 ` [RFC] AI support Henry Ptasinski
2011-02-18  7:39   ` George Kashperko
2011-02-18 11:53     ` Michael Büsch
2011-02-18 12:39       ` George Kashperko
2011-02-18 22:21         ` Michael Büsch
2011-02-18 22:52           ` George Kashperko

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=1297982124.23381.44.camel@dev.znau.edu.ua \
    --to=george@znau.edu.ua \
    --cc=linux-wireless@vger.kernel.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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).