rapidio: remove global irq spinlocks from the subsystem
Locking of config and doorbell operations should be done only if the underlying hardware requires it. This patch removes the global spinlocks from the rapidio subsystem and moves them to the mport drivers (fsl_rio and tsi721), only to the necessary places. For example, local config space read and write operations (lcread/lcwrite) are atomic in all existing drivers, so there should be no need for locking, while the cread/cwrite operations which generate maintenance transactions need to be synchronized with a lock. Later, each driver could chose to use a per-port lock instead of a global one, or even more granular locking. Link: http://lkml.kernel.org/r/20170824113023.GD50104@nokia.com Signed-off-by: Ioan Nicu <ioan.nicu.ext@nokia.com> Signed-off-by: Frank Kunz <frank.kunz@nokia.com> Acked-by: Alexandre Bounine <alexandre.bounine@idt.com> Cc: Matt Porter <mporter@kernel.crashing.org> Cc: Benjamin Herrenschmidt <benh@kernel.crashing.org> Cc: Paul Mackerras <paulus@samba.org> Cc: Michael Ellerman <mpe@ellerman.id.au> Cc: Nicholas Piggin <npiggin@gmail.com> Cc: Randy Dunlap <rdunlap@infradead.org> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
This commit is contained in:

committed by
Linus Torvalds

parent
57148a64e8
commit
31d1e130f4
@@ -104,6 +104,8 @@
|
||||
|
||||
#define DOORBELL_MESSAGE_SIZE 0x08
|
||||
|
||||
static DEFINE_SPINLOCK(fsl_rio_doorbell_lock);
|
||||
|
||||
struct rio_msg_regs {
|
||||
u32 omr;
|
||||
u32 osr;
|
||||
@@ -626,9 +628,13 @@ err_out:
|
||||
int fsl_rio_doorbell_send(struct rio_mport *mport,
|
||||
int index, u16 destid, u16 data)
|
||||
{
|
||||
unsigned long flags;
|
||||
|
||||
pr_debug("fsl_doorbell_send: index %d destid %4.4x data %4.4x\n",
|
||||
index, destid, data);
|
||||
|
||||
spin_lock_irqsave(&fsl_rio_doorbell_lock, flags);
|
||||
|
||||
/* In the serial version silicons, such as MPC8548, MPC8641,
|
||||
* below operations is must be.
|
||||
*/
|
||||
@@ -638,6 +644,8 @@ int fsl_rio_doorbell_send(struct rio_mport *mport,
|
||||
out_be32(&dbell->dbell_regs->oddatr, (index << 20) | data);
|
||||
out_be32(&dbell->dbell_regs->odmr, 0x00000001);
|
||||
|
||||
spin_unlock_irqrestore(&fsl_rio_doorbell_lock, flags);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user