Commit ad1e9380 authored by Zhang Wei's avatar Zhang Wei Committed by Paul Mackerras

[RAPIDIO] Add RapidIO multi mport support

The original RapidIO driver suppose there is only one mpc85xx RIO controller
in system.  So, some data structures are defined as mpc85xx_rio global, such
as 'regs_win', 'dbell_ring', 'msg_tx_ring'.  Now, I changed them to mport's
private members.  And you can define multi RIO OF-nodes in dts file for multi
RapidIO controller in one processor, such as PCI/PCI-Ex host controllers in
Freescale's silicon.  And the mport operation function declaration should be
changed to know which RapidIO controller is target.
Signed-off-by: default avatarZhang Wei <wei.zhang@freescale.com>
Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
Signed-off-by: default avatarPaul Mackerras <paulus@samba.org>
parent 5a7b60ed
This diff is collapsed.
...@@ -48,7 +48,7 @@ int __rio_local_read_config_##size \ ...@@ -48,7 +48,7 @@ int __rio_local_read_config_##size \
u32 data = 0; \ u32 data = 0; \
if (RIO_##size##_BAD) return RIO_BAD_SIZE; \ if (RIO_##size##_BAD) return RIO_BAD_SIZE; \
spin_lock_irqsave(&rio_config_lock, flags); \ spin_lock_irqsave(&rio_config_lock, flags); \
res = mport->ops->lcread(mport->id, offset, len, &data); \ res = mport->ops->lcread(mport, mport->id, offset, len, &data); \
*value = (type)data; \ *value = (type)data; \
spin_unlock_irqrestore(&rio_config_lock, flags); \ spin_unlock_irqrestore(&rio_config_lock, flags); \
return res; \ return res; \
...@@ -71,7 +71,7 @@ int __rio_local_write_config_##size \ ...@@ -71,7 +71,7 @@ int __rio_local_write_config_##size \
unsigned long flags; \ unsigned long flags; \
if (RIO_##size##_BAD) return RIO_BAD_SIZE; \ if (RIO_##size##_BAD) return RIO_BAD_SIZE; \
spin_lock_irqsave(&rio_config_lock, flags); \ spin_lock_irqsave(&rio_config_lock, flags); \
res = mport->ops->lcwrite(mport->id, offset, len, value); \ res = mport->ops->lcwrite(mport, mport->id, offset, len, value);\
spin_unlock_irqrestore(&rio_config_lock, flags); \ spin_unlock_irqrestore(&rio_config_lock, flags); \
return res; \ return res; \
} }
...@@ -108,7 +108,7 @@ int rio_mport_read_config_##size \ ...@@ -108,7 +108,7 @@ int rio_mport_read_config_##size \
u32 data = 0; \ u32 data = 0; \
if (RIO_##size##_BAD) return RIO_BAD_SIZE; \ if (RIO_##size##_BAD) return RIO_BAD_SIZE; \
spin_lock_irqsave(&rio_config_lock, flags); \ spin_lock_irqsave(&rio_config_lock, flags); \
res = mport->ops->cread(mport->id, destid, hopcount, offset, len, &data); \ res = mport->ops->cread(mport, mport->id, destid, hopcount, offset, len, &data); \
*value = (type)data; \ *value = (type)data; \
spin_unlock_irqrestore(&rio_config_lock, flags); \ spin_unlock_irqrestore(&rio_config_lock, flags); \
return res; \ return res; \
...@@ -131,7 +131,7 @@ int rio_mport_write_config_##size \ ...@@ -131,7 +131,7 @@ int rio_mport_write_config_##size \
unsigned long flags; \ unsigned long flags; \
if (RIO_##size##_BAD) return RIO_BAD_SIZE; \ if (RIO_##size##_BAD) return RIO_BAD_SIZE; \
spin_lock_irqsave(&rio_config_lock, flags); \ spin_lock_irqsave(&rio_config_lock, flags); \
res = mport->ops->cwrite(mport->id, destid, hopcount, offset, len, value); \ res = mport->ops->cwrite(mport, mport->id, destid, hopcount, offset, len, value); \
spin_unlock_irqrestore(&rio_config_lock, flags); \ spin_unlock_irqrestore(&rio_config_lock, flags); \
return res; \ return res; \
} }
...@@ -166,7 +166,7 @@ int rio_mport_send_doorbell(struct rio_mport *mport, u16 destid, u16 data) ...@@ -166,7 +166,7 @@ int rio_mport_send_doorbell(struct rio_mport *mport, u16 destid, u16 data)
unsigned long flags; unsigned long flags;
spin_lock_irqsave(&rio_doorbell_lock, flags); spin_lock_irqsave(&rio_doorbell_lock, flags);
res = mport->ops->dsend(mport->id, destid, data); res = mport->ops->dsend(mport, mport->id, destid, data);
spin_unlock_irqrestore(&rio_doorbell_lock, flags); spin_unlock_irqrestore(&rio_doorbell_lock, flags);
return res; return res;
......
...@@ -163,6 +163,7 @@ struct rio_dbell { ...@@ -163,6 +163,7 @@ struct rio_dbell {
* @id: Port ID, unique among all ports * @id: Port ID, unique among all ports
* @index: Port index, unique among all port interfaces of the same type * @index: Port index, unique among all port interfaces of the same type
* @name: Port name string * @name: Port name string
* @priv: Master port private data
*/ */
struct rio_mport { struct rio_mport {
struct list_head dbells; /* list of doorbell events */ struct list_head dbells; /* list of doorbell events */
...@@ -178,6 +179,7 @@ struct rio_mport { ...@@ -178,6 +179,7 @@ struct rio_mport {
unsigned char index; /* port index, unique among all port unsigned char index; /* port index, unique among all port
interfaces of the same type */ interfaces of the same type */
unsigned char name[40]; unsigned char name[40];
void *priv; /* Master port private data */
}; };
/** /**
...@@ -229,13 +231,15 @@ struct rio_switch { ...@@ -229,13 +231,15 @@ struct rio_switch {
* @dsend: Callback to send a doorbell message. * @dsend: Callback to send a doorbell message.
*/ */
struct rio_ops { struct rio_ops {
int (*lcread) (int index, u32 offset, int len, u32 * data); int (*lcread) (struct rio_mport *mport, int index, u32 offset, int len,
int (*lcwrite) (int index, u32 offset, int len, u32 data); u32 *data);
int (*cread) (int index, u16 destid, u8 hopcount, u32 offset, int len, int (*lcwrite) (struct rio_mport *mport, int index, u32 offset, int len,
u32 * data); u32 data);
int (*cwrite) (int index, u16 destid, u8 hopcount, u32 offset, int len, int (*cread) (struct rio_mport *mport, int index, u16 destid,
u32 data); u8 hopcount, u32 offset, int len, u32 *data);
int (*dsend) (int index, u16 destid, u16 data); int (*cwrite) (struct rio_mport *mport, int index, u16 destid,
u8 hopcount, u32 offset, int len, u32 data);
int (*dsend) (struct rio_mport *mport, int index, u16 destid, u16 data);
}; };
#define RIO_RESOURCE_MEM 0x00000100 #define RIO_RESOURCE_MEM 0x00000100
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment