parisc: Use implicit space register selection for loading the coherence index of...
authorJohn David Anglin <dave.anglin@bell.net>
Tue, 28 May 2019 00:15:14 +0000 (20:15 -0400)
committerHelge Deller <deller@gmx.de>
Thu, 6 Jun 2019 12:12:18 +0000 (14:12 +0200)
We only support I/O to kernel space. Using %sr1 to load the coherence
index may be racy unless interrupts are disabled. This patch changes the
code used to load the coherence index to use implicit space register
selection. This saves one instruction and eliminates the race.

Tested on rp3440, c8000 and c3750.

Signed-off-by: John David Anglin <dave.anglin@bell.net>
Cc: stable@vger.kernel.org
Signed-off-by: Helge Deller <deller@gmx.de>
drivers/parisc/ccio-dma.c
drivers/parisc/sba_iommu.c

index 8937ba70d8171b0cc9084900dfa190ab4abf798a..9b434644524c20ca8c597cce0902a2138262ec63 100644 (file)
@@ -565,8 +565,6 @@ ccio_io_pdir_entry(u64 *pdir_ptr, space_t sid, unsigned long vba,
        /* We currently only support kernel addresses */
        BUG_ON(sid != KERNEL_SPACE);
 
-       mtsp(sid,1);
-
        /*
        ** WORD 1 - low order word
        ** "hints" parm includes the VALID bit!
@@ -597,7 +595,7 @@ ccio_io_pdir_entry(u64 *pdir_ptr, space_t sid, unsigned long vba,
        ** Grab virtual index [0:11]
        ** Deposit virt_idx bits into I/O PDIR word
        */
-       asm volatile ("lci %%r0(%%sr1, %1), %0" : "=r" (ci) : "r" (vba));
+       asm volatile ("lci %%r0(%1), %0" : "=r" (ci) : "r" (vba));
        asm volatile ("extru %1,19,12,%0" : "+r" (ci) : "r" (ci));
        asm volatile ("depw  %1,15,12,%0" : "+r" (pa) : "r" (ci));
 
index afaf8e6aefe699940ce1bd55dc1fb334020a109f..78df9260020386b4dd4627af6397e3a1a4078d78 100644 (file)
@@ -575,8 +575,7 @@ sba_io_pdir_entry(u64 *pdir_ptr, space_t sid, unsigned long vba,
        pa = virt_to_phys(vba);
        pa &= IOVP_MASK;
 
-       mtsp(sid,1);
-       asm("lci 0(%%sr1, %1), %0" : "=r" (ci) : "r" (vba));
+       asm("lci 0(%1), %0" : "=r" (ci) : "r" (vba));
        pa |= (ci >> PAGE_SHIFT) & 0xff;  /* move CI (8 bits) into lowest byte */
 
        pa |= SBA_PDIR_VALID_BIT;       /* set "valid" bit */