All of lore.kernel.org
 help / color / mirror / Atom feed
From: Larry Finger <Larry.Finger@lwfinger.net>
To: George Kashperko <george@znau.edu.ua>
Cc: linux-wireless <linux-wireless@vger.kernel.org>
Subject: Re: SSB AI support code ([RFC11/11] SSB add AI-bus support)
Date: Wed, 09 Feb 2011 10:25:35 -0600	[thread overview]
Message-ID: <4D52BFFF.3040205@lwfinger.net> (raw)
In-Reply-To: <1297262780.18053.44.camel@dev.znau.edu.ua>

On 02/09/2011 08:46 AM, George Kashperko wrote:
> From: Bernhard Loos <bernhardloos@googlemail.com>
> Add support for AI-style ssb bus.
> Signed-off-by: George Kashperko <george@znau.edu.ua>
> ---
>  drivers/ssb/Kconfig                       |   13 
>  drivers/ssb/Makefile                      |    1 
>  drivers/ssb/main.c                        |    2 
>  drivers/ssb/scan.c                        |   42 +-
>  drivers/ssb/ssb_ai.c                      |  381 ++++++++++++++++++++
>  drivers/ssb/ssb_ai.h                      |   61 +++
>  drivers/ssb/ssb_private.h                 |    9 
>  include/linux/ssb/ssb.h                   |   12 
>  include/linux/ssb/ssb_driver_chipcommon.h |    3 
>  9 files changed, 516 insertions(+), 8 deletions(-)
> --- linux-next-20110203.orig/drivers/ssb/Kconfig	2011-02-08 16:14:57.000000000 +0200
> +++ linux-next-20110203/drivers/ssb/Kconfig	2011-02-08 21:01:34.000000000 +0200
> @@ -9,7 +9,7 @@ menu "Sonics Silicon Backplane"
>  config SSB
>  	tristate "Sonics Silicon Backplane support"
>  	depends on SSB_POSSIBLE
> -	select SSB_BUS_SB
> +	select SSB_BUS_SB if !SSB_BUS_AI
>  	help
>  	  Support for the Sonics Silicon Backplane bus.
>  	  You only need to enable this option, if you are
> @@ -32,6 +32,17 @@ config SSB_BUS_SB
>  	help
>  	  Sonics Silicon Backplane SB-style bus
>  
> +config SSB_BUS_AI_POSSIBLE
> +	bool
> +	default y if SSB && EXPERIMENTAL
> +
> +config SSB_BUS_AI
> +	bool "AI style bus"
> +	depends on SSB_BUS_AI_POSSIBLE
> +	default n
> +	help
> +	  Sonics Silicon Backplane AI-style bus
> +
>  # Common SPROM support routines
>  config SSB_SPROM
>  	bool
> --- linux-next-20110203.orig/drivers/ssb/main.c	2011-02-08 18:55:26.000000000 +0200
> +++ linux-next-20110203/drivers/ssb/main.c	2011-02-08 21:01:34.000000000 +0200
> @@ -842,6 +842,8 @@ static const char *ssb_chipco_chiptype_n
>  	switch (bus->chipco.chiptype) {
>  	case SSB_CHIPCO_SB:
>  		return "SB";
> +	case SSB_CHIPCO_AI:
> +		return "AI";
>  	default:
>  		return "UNKNOWN";
>  	}
> --- linux-next-20110203.orig/drivers/ssb/Makefile	2011-02-08 16:14:57.000000000 +0200
> +++ linux-next-20110203/drivers/ssb/Makefile	2011-02-08 21:01:34.000000000 +0200
> @@ -1,6 +1,7 @@
>  # core
>  ssb-y					+= main.o scan.o
>  ssb-$(CONFIG_SSB_BUS_SB)		+= ssb_sb.o
> +ssb-$(CONFIG_SSB_BUS_AI)		+= ssb_ai.o
>  ssb-$(CONFIG_SSB_EMBEDDED)		+= embedded.o
>  ssb-$(CONFIG_SSB_SPROM)			+= sprom.o
>  
> --- linux-next-20110203.orig/drivers/ssb/scan.c	2011-02-08 18:33:58.000000000 +0200
> +++ linux-next-20110203/drivers/ssb/scan.c	2011-02-08 21:01:34.000000000 +0200
> @@ -212,6 +212,10 @@ void ssb_iounmap(struct ssb_bus *bus)
>  	case SSB_BUSTYPE_SSB:
>  	case SSB_BUSTYPE_PCMCIA:
>  		iounmap(bus->mmio);
> +#ifdef CONFIG_SSB_BUS_AI
> +		if (bus->ai_mmio)
> +			iounmap(bus->ai_mmio);
> +#endif
>  		break;
>  	case SSB_BUSTYPE_PCI:
>  #ifdef CONFIG_SSB_PCIHOST
> @@ -364,18 +368,39 @@ int ssb_bus_check_core(struct ssb_device
>  /* Detect bus type and major bus information */
>  static int ssb_bus_detect(struct ssb_bus *bus)
>  {
> -	u32 idhi, cc, rev, tmp;
> +	u32 idhi, rev, tmp;
> +	bool have_chipcommon = true;
>  	enum ssb_chipco_chiptype chiptype = SSB_CHIPCO_SB;
>  
> -	idhi = scan_read32(bus, 0, SSB_IDHIGH);
> -	cc = (idhi & SSB_IDHIGH_CC) >> SSB_IDHIGH_CC_SHIFT;
> -	rev = (idhi & SSB_IDHIGH_RCLO);
> -	rev |= (idhi & SSB_IDHIGH_RCHI) >> SSB_IDHIGH_RCHI_SHIFT;
> +	/* the problem goes like this:
> +	 *  if we access the normal core id backplane registers on an AI soc,
> +	 *   the thing hangs.
> +	 *  To figure out, if we have an AI soc, we have to look in a
> +	 *   chipcommon register.
> +	 *  The 4710 doesn't have a chipcommon but we can't figure this out
> +	 *   without scanning the cores, and we don't know, if we have to use
> +	 *   the AI or normal method.
> +	 *  All known AI socs have a 74k cpu, so let's take this as an
> +	 *   indicator that we have a chipcommon core and hope for the best.
> +	 */
> +	rev = 0;
> +	if (cpu_data[0].cputype != CPU_74K) {
> +		idhi = scan_read32(bus, 0, SSB_IDHIGH);
> +		if (((idhi & SSB_IDHIGH_CC) >> SSB_IDHIGH_CC_SHIFT) !=
> +		    SSB_DEV_CHIPCOMMON) {
> +			have_chipcommon = false;
> +		} else {
> +			rev = (idhi & SSB_IDHIGH_RCLO);
> +			rev |= (idhi & SSB_IDHIGH_RCHI) >>
> +			       SSB_IDHIGH_RCHI_SHIFT;
> +		}
> +	}
>  
>  	bus->nr_devices = 0;
> -	if (cc == SSB_DEV_CHIPCOMMON) {
> +	if (have_chipcommon) {
>  		tmp = scan_read32(bus, 0, SSB_CHIPCO_CHIPID);
>  
> +		chiptype = SSB_CHIPCO_TYPE(tmp);
>  		bus->chip_id = (tmp & SSB_CHIPCO_IDMASK);
>  		bus->chip_rev = (tmp & SSB_CHIPCO_REVMASK) >>
>  				SSB_CHIPCO_REVSHIFT;
> @@ -409,7 +434,7 @@ static int ssb_bus_detect(struct ssb_bus
>  	}
>  
>  	bus->chipco.chiptype = chiptype;
> -	return chiptype != SSB_CHIPCO_SB;
> +	return (chiptype != SSB_CHIPCO_SB && chiptype != SSB_CHIPCO_AI);
>  }
>  
>  int ssb_bus_scan(struct ssb_bus *bus,
> @@ -451,6 +476,9 @@ int ssb_bus_scan(struct ssb_bus *bus,
>  	case SSB_CHIPCO_SB:
>  		err = ssb_bus_scan_sb(bus, baseaddr);
>  		break;
> +	case SSB_CHIPCO_AI:
> +		err = ssb_bus_scan_ai(bus);
> +		break;
>  	default:
>  		SSB_WARN_ON(1);
>  		err = -ENODEV;
> --- linux-next-20110203.orig/drivers/ssb/ssb_ai.c	1970-01-01 03:00:00.000000000 +0300
> +++ linux-next-20110203/drivers/ssb/ssb_ai.c	2011-02-08 21:01:58.000000000 +0200
> @@ -0,0 +1,381 @@
> +/*
> + * Sonics Silicon Backplane
> + * AI Specific Subsystem core
> + *
> + * Copyright 2010, Bernhard Loos <bernhardloos@googlemail.com>
> + * Copyright (C) 2006 Broadcom Corporation.
> + *
> + * Licensed under the GNU/GPL. See COPYING for details.
> + */
> +
> +#include <linux/delay.h>
> +#include <linux/ssb/ssb.h>
> +#include <linux/ssb/ssb_regs.h>
> +
> +#include "ssb_private.h"
> +#include "ssb_ai.h"
> +
> +
> +static void ssb_ai_write32(struct ssb_device *dev, u16 offset, u32 value)
> +{
> +	struct ssb_bus *bus = dev->bus;
> +
> +	offset += dev->core_index * SSB_CORE_SIZE;
> +	return writel(value, bus->ai_mmio + offset);
> +}
> +
> +static u32 ssb_ai_read32(struct ssb_device *dev, u16 offset)
> +{
> +	struct ssb_bus *bus = dev->bus;
> +
> +	offset += dev->core_index * SSB_CORE_SIZE;
> +	return readl(bus->ai_mmio + offset);
> +}
> +
> +/* The 47162a0 hangs when reading its registers */
> +static inline bool ssb_bcm47162a0_quirk(struct ssb_device *dev)
> +{
> +	return dev->bus->chip_id == 47162 && dev->bus->chip_rev == 0 &&
> +	       dev->id.coreid == SSB_DEV_MIPS_74K;
> +}
> +
> +static void ssb_core_ctl_flags_ai(struct ssb_device *dev, u32 mask,
> +				  u32 val, u32 *res)
> +{
> +	if (ssb_bcm47162a0_quirk(dev)) {
> +		printk("%s: Accessing MIPS DMP register (IOCTL) on 47162a0",
> +		       __FUNCTION__);
> +		if (res)
> +			*res = 0;
> +		return;
> +	}
> +
> +	if (mask || val) {
> +		u32 tmp = (ssb_ai_read32(dev, SSB_AI_IOCTL) & ~mask) | val;
> +		ssb_ai_write32(dev, SSB_AI_IOCTL, tmp);
> +	}
> +
> +	if (res)
> +		*res = ssb_ai_read32(dev, SSB_AI_IOCTL);
> +}
> +
> +static u32 ssb_core_state_flags_ai(struct ssb_device *dev, u32 mask, u32 val)
> +{
> +	if (ssb_bcm47162a0_quirk(dev)) {
> +		printk("%s: Accessing MIPS DMP register (IOSTAT) on 47162a0",
> +		       __FUNCTION__);
> +		return 0;
> +	}
> +
> +	if (mask || val) {
> +		u32 tmp = (ssb_ai_read32(dev, SSB_AI_IOSTAT) & ~mask) | val;
> +		ssb_ai_write32(dev, SSB_AI_IOSTAT, tmp);
> +	}
> +
> +	return ssb_ai_read32(dev, SSB_AI_IOSTAT);
> +}
> +
> +/* return -1 if no irq is supported */
> +static u32 ssb_irqflag_ai(struct ssb_device *dev)
> +{
> +	u32 flag;
> +
> +	/* The 47162a0 hangs when reading its registers */
> +	if (ssb_bcm47162a0_quirk(dev))
> +		return dev->core_index;
> +
> +	flag = ssb_ai_read32(dev, SSB_AI_oobselouta30);
> +
> +	if (flag)
> +		return flag & 0x1F;
> +	else
> +		/* not irq supported */
> +		return -1;
> +}
> +
> +static int ssb_device_is_enabled_ai(struct ssb_device *dev)
> +{
> +	return (ssb_ai_read32(dev, SSB_AI_RESETCTL) &
> +		SSB_AI_RESETCTL_RESET) == 0;
> +}
> +
> +static void ssb_ai_ioctl_write(struct ssb_device *dev, u32 flags)
> +{
> +	u32 dummy;
> +	ssb_ai_write32(dev, SSB_AI_IOCTL, flags);
> +	dummy = ssb_ai_read32(dev, SSB_AI_IOCTL);
> +	udelay(1);
> +}
> +
> +static void ssb_device_disable_ai(struct ssb_device *dev,
> +				  u32 core_specific_flags)
> +{
> +	SSB_WARN_ON(core_specific_flags & 0xFFFF0000);
> +	if (ssb_ai_read32(dev, SSB_AI_RESETCTL) & SSB_AI_RESETCTL_RESET)
> +		return;
> +	ssb_ai_ioctl_write(dev, core_specific_flags);
> +	udelay(9);
> +	ssb_ai_write32(dev, SSB_AI_RESETCTL, SSB_AI_RESETCTL_RESET);
> +	udelay(1);
> +}
> +
> +static void ssb_device_enable_ai(struct ssb_device *dev,
> +				 u32 core_specific_flags)
> +{
> +	ssb_device_disable_ai(dev, core_specific_flags);
> +
> +	ssb_ai_ioctl_write(dev, core_specific_flags | SSB_CORECTL_FGC |
> +				SSB_CORECTL_CLOCK);
> +	ssb_ai_write32(dev, SSB_AI_RESETCTL, 0);
> +	udelay(1);
> +
> +	ssb_ai_ioctl_write(dev, core_specific_flags | SSB_CORECTL_CLOCK);
> +}
> +
> +static u32 ssb_admatch_base_ai(struct ssb_device *dev, u32 adm)
> +{
> +	switch (adm) {
> +	case SSB_ADMATCH0:
> +		return dev->coresba;
> +	case SSB_ADMATCH1:
> +		return dev->coresba2;
> +	default:
> +		printk(KERN_ERR PFX "Need to parse the erom again "
> +				    "to find addr space %d\n",
> +				    adm & SSB_ADM_TYPE);
> +		return 0;
> +	}
> +}
> +
> +static u32 ssb_admatch_size_ai(struct ssb_device *dev, u32 adm)
> +{
> +	switch (adm) {
> +	case SSB_ADMATCH0:
> +		return dev->coresba_size;
> +	case SSB_ADMATCH1:
> +		return dev->coresba2_size;
> +	default:
> +		printk(KERN_ERR PFX "Need to parse the erom again "
> +				    "to find addr space %d size\n",
> +				    adm & SSB_ADM_TYPE);
> +		return 0;
> +	}
> +}
> +
> +/* Ops for the plain SSB bus without a host-device (no PCI or PCMCIA). */
> +static struct ssb_bus_ops ssb_ops_ai = {
> +	.read8			= ssb_ssb_read8,
> +	.read16			= ssb_ssb_read16,
> +	.read32			= ssb_ssb_read32,
> +	.write8			= ssb_ssb_write8,
> +	.write16		= ssb_ssb_write16,
> +	.write32		= ssb_ssb_write32,
> +#ifdef CONFIG_SSB_BLOCKIO
> +	.block_read		= ssb_ssb_block_read,
> +	.block_write		= ssb_ssb_block_write,
> +#endif
> +	.device_is_enabled	= ssb_device_is_enabled_ai,
> +	.device_enable		= ssb_device_enable_ai,
> +	.device_disable		= ssb_device_disable_ai,
> +	.admatch_base		= ssb_admatch_base_ai,
> +	.admatch_size		= ssb_admatch_size_ai,
> +	.irqflag		= ssb_irqflag_ai,
> +	.core_ctl_flags		= ssb_core_ctl_flags_ai,
> +	.core_state_flags	= ssb_core_state_flags_ai,
> +};
> +
> +static u32 get_erom_ent(struct ssb_bus *bus, u32 **eromptr, u32 mask, u32 match)
> +{
> +	u32 ent;
> +
> +	while (1) {
> +		ent = readl(*eromptr);
> +		(*eromptr)++;
> +
> +		if (mask == 0)
> +			break;
> +
> +		if ((ent & SSB_EROM_VALID) == 0)
> +			continue;
> +
> +		if (ent == (SSB_EROM_END | SSB_EROM_VALID))
> +			break;
> +
> +		if ((ent & mask) == match)
> +			break;
> +	}
> +	return ent;
> +}
> +
> +static u32 get_adress_space_descriptor(struct ssb_bus *bus, u32 **eromptr,
> +				       uint st, u32 *addrl, u32 *sizel)
> +{
> +	u32 asd, sz, szd, expect;
> +
> +	expect = SSB_EROM_ASD | st;
> +	if (st == SSB_EROM_ASD_ST_SWRAP)
> +		expect |= 1 << SSB_EROM_ASD_SP_SHIFT;
> +
> +	asd = get_erom_ent(bus, eromptr, SSB_EROM_ASD_SP_MASK | SSB_EROM_TAG |
> +			   SSB_EROM_ASD_ST_MASK, expect);
> +
> +	*addrl = asd & SSB_EROM_ASD_ADDR_MASK;
> +
> +	/* 64bit addresses are not supported */
> +	BUG_ON(asd & SSB_EROM_ASD_AG32);
> +
> +	sz = asd & SSB_EROM_ASD_SZ_MASK;
> +	if (sz == SSB_EROM_ASD_SZ_SZD) {
> +		szd = get_erom_ent(bus, eromptr, 0, 0);
> +		*sizel = szd & SSB_EROM_ASD_SZ_MASK;
> +	} else
> +		*sizel = SSB_EROM_ASD_SZ_BASE << (sz >> SSB_EROM_ASD_SZ_SHIFT);
> +
> +	return asd;
> +}
> +
> +int ssb_bus_scan_ai(struct ssb_bus *bus)
> +{
> +	int dev_i = 0;
> +	struct ssb_device *dev;
> +	int nr_80211_cores = 0;
> +	void __iomem *mmio;
> +	u32 __iomem *eromptr;
> +	u32 __iomem *eromend;
> +
> +	bus->ops = &ssb_ops_ai;
> +
> +	mmio = ioremap(SSB_AI_BASE, SSB_CORE_SIZE * bus->nr_devices);
> +	if (!mmio)
> +		return -ENOMEM;
> +	bus->ai_mmio = mmio;
> +
> +	eromptr = ioremap(scan_read32(bus, 0, SSB_CHIPCO_EROM), SSB_CORE_SIZE);
> +	if (!eromptr)
> +		return -ENOMEM;
> +
> +	eromend = eromptr + SSB_CORE_SIZE / sizeof(u32);
> +
> +	while (eromptr < eromend) {
> +		u32 cia, cib, asd, sizel, addrl, nmw, nsp;
> +
> +		dev = &(bus->devices[dev_i]);
> +
> +		cia = get_erom_ent(bus, &eromptr, SSB_EROM_TAG, SSB_EROM_CI);
> +		if (cia == (SSB_EROM_END | SSB_EROM_VALID)) {
> +			ssb_dprintk(KERN_INFO PFX
> +				    "Found END of erom after %d cores\n",
> +				    dev_i);
> +			if (dev_i != bus->nr_devices)
> +				ssb_printk(KERN_WARNING PFX
> +					   "Expected %d cores but got %d\n",
> +					   bus->nr_devices, dev_i);
> +			break;
> +		}
> +		cib = get_erom_ent(bus, &eromptr, 0, 0);
> +		if ((cib & SSB_EROM_TAG) != SSB_EROM_CI) {
> +			ssb_printk(KERN_ERR PFX "CIA not followed by CIB\n");
> +			return -EIO;
> +		}
> +
> +		dev->id.coreid = SSB_EROM_CIA_CID(cia);
> +		dev->id.vendor = SSB_EROM_CIA_MFG(cia);
> +		dev->id.revision = SSB_EROM_CIB_REV(cib);
> +		dev->core_index = dev_i;
> +		dev->bus = bus;
> +		dev->ops = bus->ops;
> +
> +		nmw = SSB_EROM_CIB_NMW(cib);
> +		nsp = SSB_EROM_CIB_NSP(cib);
> +
> +		if (((dev->id.coreid == SSB_DEV_DEFAULT) &&
> +		     (dev->id.vendor == SSB_VENDOR_ARM)) ||
> +			(nmw == 0 && SSB_EROM_CIB_NSW(cib) == 0) || (nsp == 0))
> +			continue;
> +
> +		/* see if it is a bridge */
> +		if ((SSB_EROM_ASD_ST_MASK &
> +		    get_erom_ent(bus, &eromptr, SSB_EROM_TAG, SSB_EROM_ASD)) ==
> +		    SSB_EROM_ASD_ST_BRIDGE)
> +			/* don't record bridges */
> +			continue;
> +		else
> +			eromptr--;
> +
> +		/* First Slave Address Descriptor should be port 0:
> +		 * the main register space for the core
> +		 */
> +		asd = get_adress_space_descriptor(bus, &eromptr,
> +						  SSB_EROM_ASD_ST_SLAVE,
> +						  &addrl, &sizel);
> +		if (sizel != SSB_CORE_SIZE ||
> +		    addrl != SSB_ENUM_BASE + SSB_CORE_SIZE * dev_i) {
> +			ssb_printk(KERN_ERR PFX
> +				   "Malformed or unsupported register address "
> +				   "space descriptor for core %d:\n"
> +				   "\texpected 0x%x, got 0x%x, size 0x%x\n",
> +				   dev_i, SSB_ENUM_BASE + SSB_CORE_SIZE * dev_i,
> +				   addrl, sizel);
> +			return -EIO;
> +		}
> +
> +		dev->coresba = addrl;
> +		dev->coresba_size = sizel;
> +
> +		/* Try to get one more Slave Address Descriptor in port 0 */
> +		asd = get_erom_ent(bus, &eromptr, SSB_EROM_VALID,
> +				   SSB_EROM_VALID) & (SSB_EROM_ASD_SP_MASK |
> +						      SSB_EROM_ASD_ST_MASK |
> +						      SSB_EROM_TAG);
> +		eromptr--;
> +		if (asd == SSB_EROM_ASD) {
> +			asd = get_adress_space_descriptor(bus, &eromptr,
> +							  SSB_EROM_ASD_ST_SLAVE,
> +							  &addrl, &sizel);
> +			if (sizel != SSB_CORE_SIZE) {
> +				ssb_printk(KERN_ERR PFX
> +					   "Malformed or unsupported ai "
> +					   "address space descriptor for "
> +					   "core %d:\n\texpected 0x%x size, "
> +					   "got 0x%x size\n",
> +					   dev_i, SSB_CORE_SIZE, sizel);
> +				return -EIO;
> +			}
> +			dev->coresba2 = addrl;
> +			dev->coresba2_size = sizel;
> +		}
> +
> +		if (nmw)
> +			asd = get_adress_space_descriptor(bus, &eromptr,
> +							  SSB_EROM_ASD_ST_MWRAP,
> +							  &addrl, &sizel);
> +		else
> +			asd = get_adress_space_descriptor(bus, &eromptr,
> +							  SSB_EROM_ASD_ST_SWRAP,
> +							  &addrl, &sizel);
> +
> +		if (sizel != SSB_CORE_SIZE ||
> +		    addrl != SSB_AI_BASE + SSB_CORE_SIZE * dev_i) {
> +			ssb_printk(KERN_ERR PFX
> +				   "Malformed or unsupported ai "
> +				   "address space descriptor for "
> +				   "core %d:\n\texpected 0x%x, "
> +				   "got 0x%x, size 0x%x\n",
> +				   dev_i, SSB_AI_BASE + SSB_CORE_SIZE * dev_i,
> +				   addrl, sizel);
> +			return -EIO;
> +		}
> +
> +		if (ssb_bus_check_core(dev, &nr_80211_cores, dev_i) < 0)
> +			continue;
> +
> +		dev_i++;
> +	}
> +	bus->nr_devices = dev_i;
> +
> +	if (eromptr >= eromend)
> +		ssb_printk(KERN_WARNING PFX
> +			   "Reached end of erom without finding END");
> +
> +	return 0;
> +}
> --- linux-next-20110203.orig/drivers/ssb/ssb_ai.h	1970-01-01 03:00:00.000000000 +0300
> +++ linux-next-20110203/drivers/ssb/ssb_ai.h	2011-02-08 21:01:34.000000000 +0200
> @@ -0,0 +1,61 @@
> +#ifndef LINUX_SSB_AI_H_
> +#define LINUX_SSB_AI_H_
> +
> +#define SSB_AI_BASE			0x18100000 /* base for AI registers */
> +
> +/* EROM parsing defines */
> +#define SSB_EROM_VALID			1
> +#define SSB_EROM_END			0x0E
> +#define SSB_EROM_TAG			0x0E
> +
> +/* Adress Space Descriptor */
> +#define SSB_EROM_ASD			0x4
> +#define  SSB_EROM_ASD_SP_MASK		0x00000F00
> +#define  SSB_EROM_ASD_SP_SHIFT		8
> +#define  SSB_EROM_ASD_ST_MASK		0x000000c0
> +#define  SSB_EROM_ASD_ST_SLAVE		0x00000000
> +#define  SSB_EROM_ASD_ST_BRIDGE		0x00000040
> +#define  SSB_EROM_ASD_ST_MWRAP		0x000000C0
> +#define  SSB_EROM_ASD_ST_SWRAP		0x00000080
> +#define  SSB_EROM_ASD_ADDR_MASK		0xFFFFF000
> +#define  SSB_EROM_ASD_AG32		0x00000008
> +#define  SSB_EROM_ASD_SZ_MASK		0x00000030
> +#define  SSB_EROM_ASD_SZ_SZD		0x00000030
> +#define  SSB_EROM_ASD_SZ_SHIFT		4
> +#define  SSB_EROM_ASD_SZ_BASE		0x00001000
> +#define SSB_EROM_CI			0
> +#define  SSB_EROM_CIA_CID_MASK		0x000FFF00
> +#define  SSB_EROM_CIA_CID_SHIFT		8
> +#define  SSB_EROM_CIA_MFG_MASK		0xFFF00000
> +#define  SSB_EROM_CIA_MFG_SHIFT		20
> +#define  SSB_EROM_CIB_REV_MASK		0xFF000000
> +#define  SSB_EROM_CIB_REV_SHIFT		24
> +#define  SSB_EROM_CIB_NMW_MASK		0x0007C000
> +#define  SSB_EROM_CIB_NMW_SHIFT		14
> +#define  SSB_EROM_CIB_NSW_MASK		0x00F80000
> +#define  SSB_EROM_CIB_NSW_SHIFT		19
> +#define  SSB_EROM_CIB_NSP_MASK		0x00003E00
> +#define SSB_EROM_CIB_NSP_SHIFT		9
> +
> +/* Adress Space Descriptor macro defs */
> +#define SSB_EROM_CIA_CID(cia) (((cia) & SSB_EROM_CIA_CID_MASK) >> \
> +			       SSB_EROM_CIA_CID_SHIFT)
> +#define SSB_EROM_CIA_MFG(cia) (((cia) & SSB_EROM_CIA_MFG_MASK) >> \
> +			       SSB_EROM_CIA_MFG_SHIFT)
> +#define SSB_EROM_CIB_REV(cib) (((cib) & SSB_EROM_CIB_REV_MASK) >> \
> +			       SSB_EROM_CIB_REV_SHIFT)
> +#define SSB_EROM_CIB_NMW(cib) (((cib) & SSB_EROM_CIB_NMW_MASK) >> \
> +			       SSB_EROM_CIB_NMW_SHIFT)
> +#define SSB_EROM_CIB_NSW(cib) (((cib) & SSB_EROM_CIB_NSW_MASK) >> \
> +			       SSB_EROM_CIB_NSW_SHIFT)
> +#define SSB_EROM_CIB_NSP(cib) (((cib) & SSB_EROM_CIB_NSP_MASK) >> \
> +			       SSB_EROM_CIB_NSP_SHIFT)
> +
> +/* AI config space registers */
> +#define SSB_AI_oobselouta30		0x100
> +#define SSB_AI_IOCTL			0x408 /* maybe 0x40C for big endian */
> +#define SSB_AI_IOSTAT			0x500
> +#define SSB_AI_RESETCTL			0x800 /* maybe 0x804 for big endian */
> +#define  SSB_AI_RESETCTL_RESET		1
> +
> +#endif /* LINUX_SSB_AI_H_ */
> --- linux-next-20110203.orig/drivers/ssb/ssb_private.h	2011-02-08 16:14:57.000000000 +0200
> +++ linux-next-20110203/drivers/ssb/ssb_private.h	2011-02-08 21:01:34.000000000 +0200
> @@ -236,4 +236,13 @@ static inline int ssb_bus_scan_sb(struct
>  }
>  #endif /* CONFIG_SSB_BUS_SB */
>  
> +#ifdef CONFIG_SSB_BUS_AI
> +extern int ssb_bus_scan_ai(struct ssb_bus *bus);
> +#else /* CONFIG_SSB_BUS_AI */
> +static inline int ssb_bus_scan_ai(struct ssb_bus *bus)
> +{
> +	return -ENODEV;
> +}
> +#endif /* CONFIG_SSB_BUS_AI */
> +
>  #endif /* LINUX_SSB_PRIVATE_H_ */
> --- linux-next-20110203.orig/include/linux/ssb/ssb_driver_chipcommon.h	2011-02-08 13:49:32.000000000 +0200
> +++ linux-next-20110203/include/linux/ssb/ssb_driver_chipcommon.h	2011-02-08 21:01:34.000000000 +0200
> @@ -19,6 +19,7 @@
>  #define  SSB_CHIPCO_TYPE_MASK		0xF0000000
>  #define  SSB_CHIPCO_TYPE_SHIFT		28
>  #define   SSB_CHIPCO_TYPE_SB		0
> +#define   SSB_CHIPCO_TYPE_AI		0x10000000
>  #define  SSB_CHIPCO_IDMASK		0x0000FFFF
>  #define  SSB_CHIPCO_REVMASK		0x000F0000
>  #define  SSB_CHIPCO_REVSHIFT		16
> @@ -173,6 +174,7 @@
>  #define  SSB_CHIPCO_SYSCLKCTL_CLKDIV	0xFFFF0000	/* ClkDiv  (ILP = 1/(4+divisor)) */
>  #define  SSB_CHIPCO_SYSCLKCTL_CLKDIV_SHIFT	16
>  #define SSB_CHIPCO_CLKSTSTR		0x00C4		/* Rev >= 3 only */
> +#define SSB_CHIPCO_EROM			0x00FC		/* erom for AI socs */
>  #define SSB_CHIPCO_PCMCIA_CFG		0x0100
>  #define SSB_CHIPCO_PCMCIA_MEMWAIT	0x0104
>  #define SSB_CHIPCO_PCMCIA_ATTRWAIT	0x0108
> @@ -584,6 +586,7 @@ struct ssb_chipcommon_pmu {
>  /* Chipcommon implementation type */
>  enum ssb_chipco_chiptype {
>  	SSB_CHIPCO_SB = SSB_CHIPCO_TYPE(SSB_CHIPCO_TYPE_SB), /* SB-style bus */
> +	SSB_CHIPCO_AI = SSB_CHIPCO_TYPE(SSB_CHIPCO_TYPE_AI), /* AI-style bus */
>  };
>  
>  struct ssb_chipcommon {
> --- linux-next-20110203.orig/include/linux/ssb/ssb.h	2011-02-08 18:33:58.000000000 +0200
> +++ linux-next-20110203/include/linux/ssb/ssb.h	2011-02-08 21:01:34.000000000 +0200
> @@ -168,9 +168,11 @@ struct ssb_bus_ops {
>  #define SSB_DEV_MIPS_74K	0x82C
>  #define SSB_DEV_DDR_CTRLR	0x82E
>  #define SSB_DEV_I2S		0x834
> +#define SSB_DEV_DEFAULT		0xFFF
>  
>  /* Vendor-ID values */
>  #define SSB_VENDOR_BROADCOM	0x4243
> +#define SSB_VENDOR_ARM		0x043B
>  
>  /* Some kernel subsystems poke with dev->drvdata, so we must use the
>   * following ugly workaround to get from struct device to struct ssb_device */
> @@ -192,6 +194,13 @@ struct ssb_device {
>  	u8 core_index;
>  	unsigned int irq;
>  
> +#ifdef CONFIG_SSB_BUS_AI
> +	/* backplane address and size for core */
> +	u32 coresba, coresba_size;
> +	/* address and size of core second register set (usbh20) */
> +	u32 coresba2, coresba2_size;
> +#endif
> +
>  	/* Internal-only stuff follows. */
>  	void *drvdata;		/* Per-device data */
>  	void *devtypedata;	/* Per-devicetype (eg 802.11) data */
> @@ -283,6 +292,9 @@ enum ssb_bustype {
>  struct ssb_bus {
>  	/* The MMIO area. */
>  	void __iomem *mmio;
> +#ifdef CONFIG_SSB_BUS_AI
> +	void __iomem *ai_mmio;
> +#endif
>  
>  	const struct ssb_bus_ops *ops;
>  
> 
> 

This one also fails to apply:

finger@larrylap:~/wireless-testing> quilt import ssb_AI_12
Importing patch ssb_AI_12 (stored as patches/ssb_AI_12)
finger@larrylap:~/wireless-testing> quilt push
Applying patch patches/ssb_AI_12
patching file drivers/ssb/Kconfig
patching file drivers/ssb/main.c
Hunk #1 succeeded at 841 (offset -1 lines).
patching file drivers/ssb/Makefile
patching file drivers/ssb/scan.c
Hunk #1 succeeded at 204 (offset -8 lines).
Hunk #2 succeeded at 360 (offset -8 lines).
Hunk #3 succeeded at 426 (offset -8 lines).
Hunk #4 succeeded at 468 (offset -8 lines).
patching file drivers/ssb/ssb_ai.c
patching file drivers/ssb/ssb_ai.h
patching file drivers/ssb/ssb_private.h
patching file include/linux/ssb/ssb_driver_chipcommon.h
patching file include/linux/ssb/ssb.h
Hunk #1 FAILED at 168.
Hunk #2 succeeded at 188 (offset -4 lines).
Hunk #3 succeeded at 286 (offset -4 lines).
1 out of 3 hunks FAILED -- rejects in file include/linux/ssb/ssb.h
Patch patches/ssb_AI_12 does not apply (enforce with -f)

Larry

  reply	other threads:[~2011-02-09 16:24 UTC|newest]

Thread overview: 60+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2011-02-09 13:36 SSB AI support code George Kashperko
2011-02-09 14:29 ` SSB AI support code ([RFC1/11] SSB admatch redefine) George Kashperko
2011-02-09 14:31 ` SSB AI support code ([RFC2/11] SSB reintroduce handlers as device ops) George Kashperko
2011-02-09 14:32 ` SSB AI support code ([RFC3/11] SSB irqflag device op) George Kashperko
2011-02-09 16:19   ` Larry Finger
2011-02-09 17:10     ` George Kashperko
2011-02-09 17:48       ` Larry Finger
2011-02-09 18:23         ` George Kashperko
2011-02-09 19:19           ` Larry Finger
2011-02-09 19:26             ` George Kashperko
2011-02-09 19:42               ` Larry Finger
2011-02-09 14:34 ` SSB AI support code ([RFC4/11] SSB core control and state device ops) George Kashperko
2011-02-09 20:35   ` Rafał Miłecki
2011-02-09 21:01     ` Rafał Miłecki
2011-02-09 21:21       ` George Kashperko
2011-02-09 21:03     ` George Kashperko
2011-02-09 21:14       ` Michael Büsch
2011-02-09 21:55       ` Rafał Miłecki
2011-02-09 21:58         ` George Kashperko
2011-02-09 22:00         ` George Kashperko
2011-02-09 22:02         ` Michael Büsch
2011-02-09 22:22           ` George Kashperko
2011-02-09 14:36 ` SSB AI support code ([RFC5/11] SSB propagate core control and state ops usage) George Kashperko
2011-02-09 20:58   ` Rafał Miłecki
2011-02-09 21:12     ` Michael Büsch
2011-02-09 21:26     ` George Kashperko
2011-02-09 21:50       ` Rafał Miłecki
2011-02-09 21:55         ` George Kashperko
2011-02-09 14:37 ` SSB AI support code ([RFC6/11] SSB introduce bus_check_core routine) George Kashperko
2011-02-09 14:39 ` SSB AI support code ([RFC7/11] SSB introduce ssb_bus_detect routine) George Kashperko
2011-02-09 14:40 ` SSB AI support code ([RFC8/11] SSB separate SB-specific scanning) George Kashperko
2011-02-09 14:41 ` SSB AI support code ([RFC9/11] SSB modify irqflag treatment) George Kashperko
2011-02-09 16:23   ` Larry Finger
2011-02-09 16:53     ` George Kashperko
2011-02-09 14:44 ` SSB AI support code ([RFC9/11] SSB separate SB-specific code) George Kashperko
2011-02-09 14:45 ` SSB AI support code ([RFC10/11] SSB modify irqflag treatment) George Kashperko
2011-02-09 14:46 ` SSB AI support code ([RFC11/11] SSB add AI-bus support) George Kashperko
2011-02-09 16:25   ` Larry Finger [this message]
2011-02-09 18:33     ` George Kashperko
2011-02-09 16:49   ` Larry Finger
2011-02-09 21:35 ` SSB AI support code Rafał Miłecki
2011-02-09 21:41   ` George Kashperko
2011-02-09 21:51   ` Michael Büsch
2011-02-09 22:53     ` Rafał Miłecki
2011-02-09 23:10       ` Michael Büsch
2011-02-09 23:18       ` Larry Finger
2011-02-10  5:24         ` SSB AI support code ([RFC] v2) George Kashperko
2011-02-10 10:20           ` Michael Büsch
2011-02-10 17:40             ` George Kashperko
2011-02-10 18:11               ` Michael Büsch
     [not found]                 ` <1297362251.15805.51.camel@dev.znau.edu.ua>
     [not found]                   ` <1297363781.30218.37.camel@maggie>
2011-02-10 19:52                     ` George Kashperko
2011-02-10 20:07                       ` Michael Büsch
2011-02-15 14:50                 ` Rafał Miłecki
2011-02-15 15:05                   ` George Kashperko
2011-02-09 23:30       ` SSB AI support code George Kashperko
2011-02-15 14:48         ` Rafał Miłecki
2011-02-15 14:53           ` George Kashperko
2011-02-12 13:03 ` Hauke Mehrtens
2011-02-12 14:15   ` George Kashperko
2011-02-17  9:28   ` Roland Vossen

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=4D52BFFF.3040205@lwfinger.net \
    --to=larry.finger@lwfinger.net \
    --cc=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 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.