diff options
| author | Alexandre Bounine <alexandre.bounine@idt.com> | 2010-10-27 15:34:34 -0700 | 
|---|---|---|
| committer | Linus Torvalds <torvalds@linux-foundation.org> | 2010-10-27 18:03:16 -0700 | 
| commit | af84ca38aff94061dd0711edbb99b0900a9c28fd (patch) | |
| tree | 31f51e9106c0a0944ec168dc25399f12ab2fa527 /arch/powerpc/sysdev/fsl_rio.c | |
| parent | a3725c45c114bd06e091802f90533332d1e93819 (diff) | |
| download | olio-linux-3.10-af84ca38aff94061dd0711edbb99b0900a9c28fd.tar.xz olio-linux-3.10-af84ca38aff94061dd0711edbb99b0900a9c28fd.zip  | |
rapidio: add handling of redundant routes
Detects RIO link to the already enumerated device and properly sets links
between device objects.  Changes to the enumeration/discovery logic:
1. Use Master Enable bit to signal end of the enumeration - agents may
   start their discovery process as soon as they see this bit set
   (Component Tag register was used before for this purpose).
2. Enumerator sets Component Tag (!= 0) immediately during device
   setup.  This allows to identify the device if the redundant route
   exists in a RIO system.
Signed-off-by: Alexandre Bounine <alexandre.bounine@idt.com>
Cc: Thomas Moll <thomas.moll@sysgo.com>
Cc: Matt Porter <mporter@kernel.crashing.org>
Cc: Li Yang <leoli@freescale.com>
Cc: Kumar Gala <galak@kernel.crashing.org>
Cc: Micha Nelissen <micha@neli.hopto.org>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Diffstat (limited to 'arch/powerpc/sysdev/fsl_rio.c')
| -rw-r--r-- | arch/powerpc/sysdev/fsl_rio.c | 8 | 
1 files changed, 8 insertions, 0 deletions
diff --git a/arch/powerpc/sysdev/fsl_rio.c b/arch/powerpc/sysdev/fsl_rio.c index ed2ec715491..9725369d432 100644 --- a/arch/powerpc/sysdev/fsl_rio.c +++ b/arch/powerpc/sysdev/fsl_rio.c @@ -50,6 +50,7 @@  #define RIO_ATMU_REGS_OFFSET	0x10c00  #define RIO_P_MSG_REGS_OFFSET	0x11000  #define RIO_S_MSG_REGS_OFFSET	0x13000 +#define RIO_GCCSR		0x13c  #define RIO_ESCSR		0x158  #define RIO_CCSR		0x15c  #define RIO_LTLEDCSR		0x0608 @@ -1471,6 +1472,7 @@ int fsl_rio_setup(struct platform_device *dev)  	port->host_deviceid = fsl_rio_get_hdid(port->id);  	port->priv = priv; +	port->phys_efptr = 0x100;  	rio_register_mport(port);  	priv->regs_win = ioremap(regs.start, regs.end - regs.start + 1); @@ -1518,6 +1520,12 @@ int fsl_rio_setup(struct platform_device *dev)  	dev_info(&dev->dev, "RapidIO Common Transport System size: %d\n",  			port->sys_size ? 65536 : 256); +	if (port->host_deviceid >= 0) +		out_be32(priv->regs_win + RIO_GCCSR, RIO_PORT_GEN_HOST | +			RIO_PORT_GEN_MASTER | RIO_PORT_GEN_DISCOVERED); +	else +		out_be32(priv->regs_win + RIO_GCCSR, 0x00000000); +  	priv->atmu_regs = (struct rio_atmu_regs *)(priv->regs_win  					+ RIO_ATMU_REGS_OFFSET);  	priv->maint_atmu_regs = priv->atmu_regs + 1;  |