Skip to contentSkip to conversation

OpenRISC patches for 4.11

PATCH In review Stafford Horne 5 participants 46 messages Feb 24, 2017

Subsystems (5)
lore
Share & tools
lore

Stafford Horne

author maintainer
#0 lore raw

v4 cover OpenRISC patches for 4.11

Hi All,

Changes from v3
o Removed spinlock due to
- Peter had some comments on qrwlocks and unlocking that should be pretty easy, but...
- Its only going to be used for SMP so not testable by me now
o incorporate Atomic & Cmpxchg comments from Peter Z and RTH
o incorporate Idle state formatting comments from Joe Perches

Changes from v2
o implemented all atomic ops pointed out by Peter Z
o export ioremap symbols pointed out by allyesconfig
o init r0 to 0 as per openrisc spec, suggested by Jakob Viketoft

Changes from v1
o added change set from Valentin catching CONFIG issues
o added missing test_and_change_bit atomic bitops patch

This is another attempt to get some final comments before I send the pull request for this merge window to Linus. Again, this is coming as I got some nice comments on costmetics and issues with my last series.

Any feedback is appreciated.

The interesting things here are:
- optimized memset and memcpy routines, ~20% boot time saving
- support for cpu idling
- adding support for l.swa and l.lwa atomic operations (in spec from 2014)
- use atomics to implement: bitops, cmpxchg, futex, spinlocks
- the atomics are in preparation for SMP support

Testing:
I have used the kselftests to validate the changes especially the futex operations with the futex test. Other atomic operations are common so no explicit testing. I have mainly done the tests on qemu.

Note for testers:
The l.swa and l.lwa emulation + native instruction support is NOW FIXED in qemu upstream git.

I have send patches for get a recent openrisc toolchain added to the lkp-tests make.cross script. It should be up to date now I believe this is what most build sytems use. Let me know if different.

-Stafford

Jonas Bonn (1):
openrisc: use SPARSE_IRQ

Olof Kindgren (1):
openrisc: Add optimized memset

Sebastian Macke (2):
openrisc: Fix the bitmask for the unit present register
openrisc: Initial support for the idle state

Stafford Horne (9):
openrisc: Add optimized memcpy routine
openrisc: Add .gitignore
MAINTAINERS: Add the openrisc official repository scripts/checkstack.pl: Add openrisc support
openrisc: entry: Whitespace and comment cleanups
openrisc: entry: Fix delay slot detection
openrisc: head: Move init strings to rodata section
openrisc: Export ioremap symbols used by modules
openrisc: head: Init r0 to 0 on start

Stefan Kristiansson (10):
openrisc: add cache way information to cpuinfo
openrisc: tlb miss handler optimizations
openrisc: head: use THREAD_SIZE instead of magic constant
openrisc: head: refactor out tlb flush into it's own function
openrisc: add l.lwa/l.swa emulation
openrisc: add atomic bitops
openrisc: add cmpxchg and xchg implementations
openrisc: add optimized atomic operations
openrisc: add futex_atomic_* implementations
openrisc: remove unnecessary stddef.h include

Valentin Rothberg (1):
arch/openrisc/lib/memcpy.c: use correct OR1200 option

 MAINTAINERS                               |   1 +
 arch/openrisc/Kconfig                     |   1 +
 arch/openrisc/TODO.openrisc               |   1 -
 arch/openrisc/include/asm/Kbuild          |   5 +-
 arch/openrisc/include/asm/atomic.h        | 126 +++++++++++++++++++
 arch/openrisc/include/asm/bitops.h        |   2 +-
 arch/openrisc/include/asm/bitops/atomic.h | 123 ++++++++++++++++++
 arch/openrisc/include/asm/cmpxchg.h       |  83 +++++++++++++
 arch/openrisc/include/asm/cpuinfo.h       |   2 +
 arch/openrisc/include/asm/futex.h         | 135 ++++++++++++++++++++
 arch/openrisc/include/asm/spr_defs.h      |   4 +-
 arch/openrisc/include/asm/string.h        |  10 ++
 arch/openrisc/kernel/.gitignore           |   1 +
 arch/openrisc/kernel/entry.S              |  60 +++++----
 arch/openrisc/kernel/head.S               | 200 ++++++++++++------------------
 arch/openrisc/kernel/or32_ksyms.c         |   1 +
 arch/openrisc/kernel/process.c            |  14 +++
 arch/openrisc/kernel/ptrace.c             |   1 -
 arch/openrisc/kernel/setup.c              |  67 +++++-----
 arch/openrisc/kernel/traps.c              | 183 +++++++++++++++++++++++++++
 arch/openrisc/lib/Makefile                |   2 +-
 arch/openrisc/lib/memcpy.c                | 124 ++++++++++++++++++
 arch/openrisc/lib/memset.S                |  98 +++++++++++++++
 arch/openrisc/mm/ioremap.c                |   2 +
 include/asm-generic/atomic.h              |   2 +
 scripts/checkstack.pl                     |   3 +
 26 files changed, 1064 insertions(+), 187 deletions(-)
 create mode 100644 arch/openrisc/include/asm/atomic.h
 create mode 100644 arch/openrisc/include/asm/bitops/atomic.h
 create mode 100644 arch/openrisc/include/asm/cmpxchg.h
 create mode 100644 arch/openrisc/include/asm/futex.h
 create mode 100644 arch/openrisc/include/asm/string.h
 create mode 100644 arch/openrisc/kernel/.gitignore
 create mode 100644 arch/openrisc/lib/memcpy.c
 create mode 100644 arch/openrisc/lib/memset.S
Signature · 1 line
2.9.3
author maintainer
#1 lore raw

PATCH v4 1/24 openrisc: use SPARSE_IRQ

From: Jonas Bonn <[email protected]>

The sparse IRQ framework is preferred nowadays so switch over to it.

---
 arch/openrisc/Kconfig            | 1 +
 arch/openrisc/include/asm/Kbuild | 1 +
 2 files changed, 2 insertions(+)
arch/openrisc/Kconfig +1 -0
index 8d22015..1e95920 100644
@@ -12,6 +12,7 @@ config OPENRISC
 	select HAVE_MEMBLOCK
 	select GPIOLIB
         select HAVE_ARCH_TRACEHOOK
+	select SPARSE_IRQ
 	select GENERIC_IRQ_CHIP
 	select GENERIC_IRQ_PROBE
 	select GENERIC_IRQ_SHOW
arch/openrisc/include/asm/Kbuild +1 -0
index 2832f03..6dd177d 100644
@@ -29,6 +29,7 @@ generic-y += hw_irq.h
 generic-y += ioctl.h
 generic-y += ioctls.h
 generic-y += ipcbuf.h
+generic-y += irq.h
 generic-y += irq_regs.h
 generic-y += irq_work.h
 generic-y += kdebug.h
Signature · 1 line
2.9.3
author maintainer
#2 lore raw

PATCH v4 2/24 openrisc: add cache way information to cpuinfo

In reply to Stafford Horne

From: Stefan Kristiansson <[email protected]>

Motivation for this is to be able to print the way information properly in print_cpuinfo(), instead of hardcoding it to one.

[shorne at gmail.com fixed conflict with show_cpuinfo change]
---
 arch/openrisc/include/asm/cpuinfo.h |  2 ++
 arch/openrisc/kernel/setup.c        | 67 ++++++++++++++++++++-----------------
 2 files changed, 38 insertions(+), 31 deletions(-)
arch/openrisc/include/asm/cpuinfo.h +2 -0
index 917318b..ec10679 100644
@@ -24,9 +24,11 @@ struct cpuinfo {
 
 	u32 icache_size;
 	u32 icache_block_size;
+	u32 icache_ways;
 
 	u32 dcache_size;
 	u32 dcache_block_size;
+	u32 dcache_ways;
 };
 
 extern struct cpuinfo cpuinfo;
arch/openrisc/kernel/setup.c +36 -31

104 lines not on this page · raw message

Signature · 1 line
2.9.3
author maintainer
#3 lore raw

PATCH v4 3/24 openrisc: tlb miss handler optimizations

In reply to Stafford Horne

From: Stefan Kristiansson <[email protected]>

By slightly reorganizing the code, the number of registers used in the tlb miss handlers can be reduced by two, thus removing the need to save them to memory.

Also, some dead and commented out code is removed.

No functional change.

---
 arch/openrisc/kernel/head.S | 141 +++++++++++++++-----------------------------
 1 file changed, 46 insertions(+), 95 deletions(-)
arch/openrisc/kernel/head.S +46 -95
index f147933..2346c5b 100644
@@ -971,8 +971,6 @@ ENTRY(dtlb_miss_handler)
 	EXCEPTION_STORE_GPR2
 	EXCEPTION_STORE_GPR3
 	EXCEPTION_STORE_GPR4
-	EXCEPTION_STORE_GPR5
-	EXCEPTION_STORE_GPR6
 	/*
 	 * get EA of the miss
 	 */
@@ -980,91 +978,70 @@ ENTRY(dtlb_miss_handler)
 	/*
 	 * pmd = (pmd_t *)(current_pgd + pgd_index(daddr));
 	 */
-	GET_CURRENT_PGD(r3,r5)		// r3 is current_pgd, r5 is temp
+	GET_CURRENT_PGD(r3,r4)		// r3 is current_pgd, r4 is temp
 	l.srli	r4,r2,0x18		// >> PAGE_SHIFT + (PAGE_SHIFT - 2)
 	l.slli	r4,r4,0x2		// to get address << 2
-	l.add	r5,r4,r3		// r4 is pgd_index(daddr)
+	l.add	r3,r4,r3		// r4 is pgd_index(daddr)
 	/*
 	 * if (pmd_none(*pmd))
 	 *   goto pmd_none:
 	 */
-	tophys	(r4,r5)
+	tophys	(r4,r3)
 	l.lwz	r3,0x0(r4)		// get *pmd value
 	l.sfne	r3,r0
 	l.bnf	d_pmd_none
-	 l.andi	r3,r3,~PAGE_MASK //0x1fff		// ~PAGE_MASK
-	/*
-	 * if (pmd_bad(*pmd))
-	 *   pmd_clear(pmd)
-	 *   goto pmd_bad:
-	 */
-//	l.sfeq	r3,r0			// check *pmd value
-//	l.bf	d_pmd_good
-	l.addi	r3,r0,0xffffe000	// PAGE_MASK
-//	l.j	d_pmd_bad
-//	l.sw	0x0(r4),r0		// clear pmd
+	 l.addi	r3,r0,0xffffe000	// PAGE_MASK
+
 d_pmd_good:
 	/*
 	 * pte = *pte_offset(pmd, daddr);
 	 */
 	l.lwz	r4,0x0(r4)		// get **pmd value
 	l.and	r4,r4,r3		// & PAGE_MASK
-	l.srli	r5,r2,0xd		// >> PAGE_SHIFT, r2 == EEAR
-	l.andi	r3,r5,0x7ff		// (1UL << PAGE_SHIFT - 2) - 1
+	l.srli	r2,r2,0xd		// >> PAGE_SHIFT, r2 == EEAR
+	l.andi	r3,r2,0x7ff		// (1UL << PAGE_SHIFT - 2) - 1
 	l.slli	r3,r3,0x2		// to get address << 2
 	l.add	r3,r3,r4
-	l.lwz	r2,0x0(r3)		// this is pte at last
+	l.lwz	r3,0x0(r3)		// this is pte@last
 	/*
 	 * if (!pte_present(pte))
 	 */
-	l.andi	r4,r2,0x1
+	l.andi	r4,r3,0x1
 	l.sfne	r4,r0			// is pte present
 	l.bnf	d_pte_not_present
-	l.addi	r3,r0,0xffffe3fa	// PAGE_MASK | DTLB_UP_CONVERT_MASK
+	l.addi	r4,r0,0xffffe3fa	// PAGE_MASK | DTLB_UP_CONVERT_MASK
 	/*
 	 * fill DTLB TR register
 	 */
-	l.and	r4,r2,r3		// apply the mask
+	l.and	r4,r3,r4		// apply the mask
 	// Determine number of DMMU sets
-	l.mfspr r6, r0, SPR_DMMUCFGR
-	l.andi	r6, r6, SPR_DMMUCFGR_NTS
-	l.srli	r6, r6, SPR_DMMUCFGR_NTS_OFF
+	l.mfspr r2, r0, SPR_DMMUCFGR
+	l.andi	r2, r2, SPR_DMMUCFGR_NTS
+	l.srli	r2, r2, SPR_DMMUCFGR_NTS_OFF
 	l.ori	r3, r0, 0x1
-	l.sll	r3, r3, r6 	// r3 = number DMMU sets DMMUCFGR
-	l.addi	r6, r3, -1  	// r6 = nsets mask
-	l.and	r5, r5, r6	// calc offset:	 & (NUM_TLB_ENTRIES-1)
+	l.sll	r3, r3, r2 	// r3 = number DMMU sets DMMUCFGR
+	l.addi	r2, r3, -1  	// r2 = nsets mask
+	l.mfspr	r3, r0, SPR_EEAR_BASE
+	l.srli	r3, r3, 0xd	// >> PAGE_SHIFT
+	l.and	r2, r3, r2	// calc offset:	 & (NUM_TLB_ENTRIES-1)
 	                                                   //NUM_TLB_ENTRIES
-	l.mtspr	r5,r4,SPR_DTLBTR_BASE(0)
+	l.mtspr	r2,r4,SPR_DTLBTR_BASE(0)
 	/*
 	 * fill DTLB MR register
 	 */
-	l.mfspr	r2,r0,SPR_EEAR_BASE
-	l.addi	r3,r0,0xffffe000	// PAGE_MASK
-	l.and	r4,r2,r3		// apply PAGE_MASK to EA (__PHX__ do we really need this?)
-	l.ori	r4,r4,0x1		// set hardware valid bit: DTBL_MR entry
-	l.mtspr	r5,r4,SPR_DTLBMR_BASE(0)
+	l.slli	r3, r3, 0xd		/* << PAGE_SHIFT => EA & PAGE_MASK */
+	l.ori	r4,r3,0x1		// set hardware valid bit: DTBL_MR entry
+	l.mtspr	r2,r4,SPR_DTLBMR_BASE(0)
 
 	EXCEPTION_LOAD_GPR2
 	EXCEPTION_LOAD_GPR3
 	EXCEPTION_LOAD_GPR4
-	EXCEPTION_LOAD_GPR5
-	EXCEPTION_LOAD_GPR6
-	l.rfe
-d_pmd_bad:
-	l.nop	1
-	EXCEPTION_LOAD_GPR2
-	EXCEPTION_LOAD_GPR3
-	EXCEPTION_LOAD_GPR4
-	EXCEPTION_LOAD_GPR5
-	EXCEPTION_LOAD_GPR6
 	l.rfe
 d_pmd_none:
 d_pte_not_present:
 	EXCEPTION_LOAD_GPR2
 	EXCEPTION_LOAD_GPR3
 	EXCEPTION_LOAD_GPR4
-	EXCEPTION_LOAD_GPR5
-	EXCEPTION_LOAD_GPR6
 	EXCEPTION_HANDLE(_dtlb_miss_page_fault_handler)
 
 /* ==============================================[ ITLB miss handler ]=== */
@@ -1072,8 +1049,6 @@ ENTRY(itlb_miss_handler)
 	EXCEPTION_STORE_GPR2
 	EXCEPTION_STORE_GPR3
 	EXCEPTION_STORE_GPR4
-	EXCEPTION_STORE_GPR5
-	EXCEPTION_STORE_GPR6
 	/*
 	 * get EA of the miss
 	 */
@@ -1083,30 +1058,19 @@ ENTRY(itlb_miss_handler)
 	 * pmd = (pmd_t *)(current_pgd + pgd_index(daddr));
 	 *
 	 */
-	GET_CURRENT_PGD(r3,r5)		// r3 is current_pgd, r5 is temp
+	GET_CURRENT_PGD(r3,r4)		// r3 is current_pgd, r5 is temp
 	l.srli	r4,r2,0x18		// >> PAGE_SHIFT + (PAGE_SHIFT - 2)
 	l.slli	r4,r4,0x2		// to get address << 2
-	l.add	r5,r4,r3		// r4 is pgd_index(daddr)
+	l.add	r3,r4,r3		// r4 is pgd_index(daddr)
 	/*
 	 * if (pmd_none(*pmd))
 	 *   goto pmd_none:
 	 */
-	tophys	(r4,r5)
+	tophys	(r4,r3)
 	l.lwz	r3,0x0(r4)		// get *pmd value
 	l.sfne	r3,r0
 	l.bnf	i_pmd_none
-	l.andi	r3,r3,0x1fff		// ~PAGE_MASK
-	/*
-	 * if (pmd_bad(*pmd))
-	 *   pmd_clear(pmd)
-	 *   goto pmd_bad:
-	 */
-
-//	l.sfeq	r3,r0			// check *pmd value
-//	l.bf	i_pmd_good
-	l.addi	r3,r0,0xffffe000	// PAGE_MASK
-//	l.j	i_pmd_bad
-//	l.sw	0x0(r4),r0		// clear pmd
+	 l.addi	r3,r0,0xffffe000	// PAGE_MASK
 
 i_pmd_good:
 	/*
@@ -1115,35 +1079,36 @@ i_pmd_good:
 	 */
 	l.lwz	r4,0x0(r4)		// get **pmd value
 	l.and	r4,r4,r3		// & PAGE_MASK
-	l.srli	r5,r2,0xd		// >> PAGE_SHIFT, r2 == EEAR
-	l.andi	r3,r5,0x7ff		// (1UL << PAGE_SHIFT - 2) - 1
+	l.srli	r2,r2,0xd		// >> PAGE_SHIFT, r2 == EEAR
+	l.andi	r3,r2,0x7ff		// (1UL << PAGE_SHIFT - 2) - 1
 	l.slli	r3,r3,0x2		// to get address << 2
 	l.add	r3,r3,r4
-	l.lwz	r2,0x0(r3)		// this is pte at last
+	l.lwz	r3,0x0(r3)		// this is pte@last
 	/*
 	 * if (!pte_present(pte))
 	 *
 	 */
-	l.andi	r4,r2,0x1
+	l.andi	r4,r3,0x1
 	l.sfne	r4,r0			// is pte present
 	l.bnf	i_pte_not_present
-	l.addi	r3,r0,0xffffe03a	// PAGE_MASK | ITLB_UP_CONVERT_MASK
+	 l.addi	r4,r0,0xffffe03a	// PAGE_MASK | ITLB_UP_CONVERT_MASK
 	/*
 	 * fill ITLB TR register
 	 */
-	l.and	r4,r2,r3		// apply the mask
-	l.andi	r3,r2,0x7c0		// _PAGE_EXEC | _PAGE_SRE | _PAGE_SWE |  _PAGE_URE | _PAGE_UWE
-//	l.andi	r3,r2,0x400		// _PAGE_EXEC
+	l.and	r4,r3,r4		// apply the mask
+	l.andi	r3,r3,0x7c0		// _PAGE_EXEC | _PAGE_SRE | _PAGE_SWE |  _PAGE_URE | _PAGE_UWE
 	l.sfeq	r3,r0
 	l.bf	itlb_tr_fill //_workaround
 	// Determine number of IMMU sets
-	l.mfspr r6, r0, SPR_IMMUCFGR
-	l.andi	r6, r6, SPR_IMMUCFGR_NTS
-	l.srli	r6, r6, SPR_IMMUCFGR_NTS_OFF
+	l.mfspr r2, r0, SPR_IMMUCFGR
+	l.andi	r2, r2, SPR_IMMUCFGR_NTS
+	l.srli	r2, r2, SPR_IMMUCFGR_NTS_OFF
 	l.ori	r3, r0, 0x1
-	l.sll	r3, r3, r6 	// r3 = number IMMU sets IMMUCFGR
-	l.addi	r6, r3, -1  	// r6 = nsets mask
-	l.and	r5, r5, r6	// calc offset:	 & (NUM_TLB_ENTRIES-1)
+	l.sll	r3, r3, r2 	// r3 = number IMMU sets IMMUCFGR
+	l.addi	r2, r3, -1  	// r2 = nsets mask
+	l.mfspr	r3, r0, SPR_EEAR_BASE
+	l.srli	r3, r3, 0xd	// >> PAGE_SHIFT
+	l.and	r2, r3, r2	// calc offset:	 & (NUM_TLB_ENTRIES-1)
 
 /*
  * __PHX__ :: fixme
@@ -1155,38 +1120,24 @@ i_pmd_good:
 itlb_tr_fill_workaround:
 	l.ori	r4,r4,0xc0		// | (SPR_ITLBTR_UXE | ITLBTR_SXE)
 itlb_tr_fill:
-	l.mtspr	r5,r4,SPR_ITLBTR_BASE(0)
+	l.mtspr	r2,r4,SPR_ITLBTR_BASE(0)
 	/*
 	 * fill DTLB MR register
 	 */
-	l.mfspr	r2,r0,SPR_EEAR_BASE
-	l.addi	r3,r0,0xffffe000	// PAGE_MASK
-	l.and	r4,r2,r3		// apply PAGE_MASK to EA (__PHX__ do we really need this?)
-	l.ori	r4,r4,0x1		// set hardware valid bit: DTBL_MR entry
-	l.mtspr	r5,r4,SPR_ITLBMR_BASE(0)
+	l.slli	r3, r3, 0xd		/* << PAGE_SHIFT => EA & PAGE_MASK */
+	l.ori	r4,r3,0x1		// set hardware valid bit: ITBL_MR entry
+	l.mtspr	r2,r4,SPR_ITLBMR_BASE(0)
 
 	EXCEPTION_LOAD_GPR2
 	EXCEPTION_LOAD_GPR3
 	EXCEPTION_LOAD_GPR4
-	EXCEPTION_LOAD_GPR5
-	EXCEPTION_LOAD_GPR6
 	l.rfe
 
-i_pmd_bad:
-	l.nop	1
-	EXCEPTION_LOAD_GPR2
-	EXCEPTION_LOAD_GPR3
-	EXCEPTION_LOAD_GPR4
-	EXCEPTION_LOAD_GPR5
-	EXCEPTION_LOAD_GPR6
-	l.rfe
 i_pmd_none:
 i_pte_not_present:
 	EXCEPTION_LOAD_GPR2
 	EXCEPTION_LOAD_GPR3
 	EXCEPTION_LOAD_GPR4
-	EXCEPTION_LOAD_GPR5
-	EXCEPTION_LOAD_GPR6
 	EXCEPTION_HANDLE(_itlb_miss_page_fault_handler)
 
 /* ==============================================[ boot tlb handlers ]=== */
Signature · 1 line
2.9.3
author maintainer
#4 lore raw

PATCH v4 4/24 openrisc: head: use THREAD_SIZE instead of magic constant

In reply to Stafford Horne

From: Stefan Kristiansson <[email protected]>

The stack size was hard coded to 0x2000, use the standard THREAD_SIZE definition loaded from thread_info.h.

[shorne at gmail.com: Added body to the commit message]
---
 arch/openrisc/kernel/head.S | 4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)
arch/openrisc/kernel/head.S +3 -1
index 2346c5b..63ba2d9 100644
@@ -24,6 +24,7 @@
 #include <asm/page.h>
 #include <asm/mmu.h>
 #include <asm/pgtable.h>
+#include <asm/thread_info.h>
 #include <asm/cache.h>
 #include <asm/spr_defs.h>
 #include <asm/asm-offsets.h>
@@ -486,7 +487,8 @@ _start:
 	/*
 	 * set up initial ksp and current
 	 */
-	LOAD_SYMBOL_2_GPR(r1,init_thread_union+0x2000)	// setup kernel stack
+	/* setup kernel stack */
+	LOAD_SYMBOL_2_GPR(r1,init_thread_union + THREAD_SIZE)
 	LOAD_SYMBOL_2_GPR(r10,init_thread_union)	// setup current
 	tophys	(r31,r10)
 	l.sw	TI_KSP(r31), r1
Signature · 1 line
2.9.3
author maintainer
#5 lore raw

PATCH v4 5/24 openrisc: head: refactor out tlb flush into it's own function

In reply to Stafford Horne

From: Stefan Kristiansson <[email protected]>

This brings it inline with the other setup oprations done like the cache enables _ic_enable and _dc_enable. Also, this is going to make it easier to initialize additional cpu's when smp is introduced.

[shorne at gmail.com: Added commit body]
---
 arch/openrisc/kernel/head.S | 38 ++++++++++++++++++++++----------------
 1 file changed, 22 insertions(+), 16 deletions(-)
arch/openrisc/kernel/head.S +22 -16
index 63ba2d9..a22f1fc 100644
@@ -522,22 +522,8 @@ enable_dc:
 	 l.nop
 
 flush_tlb:
-	/*
-	 *  I N V A L I D A T E   T L B   e n t r i e s
-	 */
-	LOAD_SYMBOL_2_GPR(r5,SPR_DTLBMR_BASE(0))
-	LOAD_SYMBOL_2_GPR(r6,SPR_ITLBMR_BASE(0))
-	l.addi	r7,r0,128 /* Maximum number of sets */
-1:
-	l.mtspr	r5,r0,0x0
-	l.mtspr	r6,r0,0x0
-
-	l.addi	r5,r5,1
-	l.addi	r6,r6,1
-	l.sfeq	r7,r0
-	l.bnf	1b
-	 l.addi	r7,r7,-1
-
+	l.jal	_flush_tlb
+	 l.nop
 
 /* The MMU needs to be enabled before or32_early_setup is called */
 
@@ -629,6 +615,26 @@ jump_start_kernel:
 	l.jr    r30
 	 l.nop
 
+_flush_tlb:
+	/*
+	 *  I N V A L I D A T E   T L B   e n t r i e s
+	 */
+	LOAD_SYMBOL_2_GPR(r5,SPR_DTLBMR_BASE(0))
+	LOAD_SYMBOL_2_GPR(r6,SPR_ITLBMR_BASE(0))
+	l.addi	r7,r0,128 /* Maximum number of sets */
+1:
+	l.mtspr	r5,r0,0x0
+	l.mtspr	r6,r0,0x0
+
+	l.addi	r5,r5,1
+	l.addi	r6,r6,1
+	l.sfeq	r7,r0
+	l.bnf	1b
+	 l.addi	r7,r7,-1
+
+	l.jr	r9
+	 l.nop
+
 /* ========================================[ cache ]=== */
 
 	/* aligment here so we don't change memory offsets with
Signature · 1 line
2.9.3
maintainer
#6 lore raw

Re: [PATCH v4 05/24] openrisc: head: refactor out tlb flush into it's own function

Quoted 5 lines · Stafford Horne

From: Stefan Kristiansson <[email protected]>

This brings it inline with the other setup oprations done like the cache enables _ic_enable and _dc_enable. Also, this is going to make it easier to initialize additional cpu's when smp is introduced.

This patch confuses me. The TLB flush is moved to a point after MMU's are enabled. The TLB flush should happen before enabling the MMU, shouldn't it?

/Jonas

Quoted 64 lines
---
  arch/openrisc/kernel/head.S | 38 ++++++++++++++++++++++----------------
  1 file changed, 22 insertions(+), 16 deletions(-)
arch/openrisc/kernel/head.S +22 -16
index 63ba2d9..a22f1fc 100644
@@ -522,22 +522,8 @@ enable_dc:
  	 l.nop
 
  flush_tlb:
-	/*
-	 *  I N V A L I D A T E   T L B   e n t r i e s
-	 */
-	LOAD_SYMBOL_2_GPR(r5,SPR_DTLBMR_BASE(0))
-	LOAD_SYMBOL_2_GPR(r6,SPR_ITLBMR_BASE(0))
-	l.addi	r7,r0,128 /* Maximum number of sets */
-1:
-	l.mtspr	r5,r0,0x0
-	l.mtspr	r6,r0,0x0
-
-	l.addi	r5,r5,1
-	l.addi	r6,r6,1
-	l.sfeq	r7,r0
-	l.bnf	1b
-	 l.addi	r7,r7,-1
-
+	l.jal	_flush_tlb
+	 l.nop
 
  /* The MMU needs to be enabled before or32_early_setup is called */
 
@@ -629,6 +615,26 @@ jump_start_kernel:
  	l.jr    r30
  	 l.nop
 
+_flush_tlb:
+	/*
+	 *  I N V A L I D A T E   T L B   e n t r i e s
+	 */
+	LOAD_SYMBOL_2_GPR(r5,SPR_DTLBMR_BASE(0))
+	LOAD_SYMBOL_2_GPR(r6,SPR_ITLBMR_BASE(0))
+	l.addi	r7,r0,128 /* Maximum number of sets */
+1:
+	l.mtspr	r5,r0,0x0
+	l.mtspr	r6,r0,0x0
+
+	l.addi	r5,r5,1
+	l.addi	r6,r6,1
+	l.sfeq	r7,r0
+	l.bnf	1b
+	 l.addi	r7,r7,-1
+
+	l.jr	r9
+	 l.nop
+
  /* ========================================[ cache ]=== */
 
  	/* aligment here so we don't change memory offsets with
#7 lore raw

Re: [PATCH v4 05/24] openrisc: head: refactor out tlb flush into it's own function

Quoted 10 lines · Jonas Bonn
Quoted 5 lines · Stafford Horne

From: Stefan Kristiansson <[email protected]>

This brings it inline with the other setup oprations done like the cache enables _ic_enable and _dc_enable. Also, this is going to make it easier to initialize additional cpu's when smp is introduced.

This patch confuses me. The TLB flush is moved to a point after MMU's are enabled. The TLB flush should happen before enabling the MMU, shouldn't it?

It still happens before the MMUs are enabled, the patch only refactors the code out into a function that is called from the place where it was open coded before.

Stefan

maintainer
#8 lore raw

Re: [PATCH v4 05/24] openrisc: head: refactor out tlb flush into it's own function

Quoted 7 lines · Stefan Kristiansson
Quoted 6 lines · Jonas Bonn
Quoted 5 lines · Stafford Horne

From: Stefan Kristiansson <[email protected]>

This brings it inline with the other setup oprations done like the cache enables _ic_enable and _dc_enable. Also, this is going to make it easier to initialize additional cpu's when smp is introduced.

Quoted 6 lines
Quoted 3 lines

This patch confuses me. The TLB flush is moved to a point after MMU's are enabled. The TLB flush should happen before enabling the MMU, shouldn't it?

It still happens before the MMUs are enabled, the patch only refactors the code out into a function that is called from the place where it was open coded before.

Right. What's the point of moving it then?

/Jonas

Quoted 2 lines

Stefan

#9 lore raw

Re: [PATCH v4 05/24] openrisc: head: refactor out tlb flush into it's own function

Quoted 8 lines · Jonas Bonn
Quoted 7 lines · Stefan Kristiansson
Quoted 6 lines · Jonas Bonn
Quoted 5 lines · Stafford Horne

From: Stefan Kristiansson <[email protected]>

This brings it inline with the other setup oprations done like the cache enables _ic_enable and _dc_enable. Also, this is going to make it easier to initialize additional cpu's when smp is introduced.

Quoted 9 lines
Quoted 6 lines
Quoted 3 lines

This patch confuses me. The TLB flush is moved to a point after MMU's are enabled. The TLB flush should happen before enabling the MMU, shouldn't it?

It still happens before the MMUs are enabled, the patch only refactors the code out into a function that is called from the place where it was open coded before.

Right. What's the point of moving it then?

As the commit message mentions, it's a preparation patch for initialisation of secondary cpus, which also will call this function.

Perhaps this patch should be bundled with those patches.

Stefan

author maintainer
#10 lore raw

Re: [PATCH v4 05/24] openrisc: head: refactor out tlb flush into it's own function

Quoted 16 lines · Stefan Kristiansson
Quoted 15 lines · Jonas Bonn
Quoted 13 lines · Stefan Kristiansson
Quoted 9 lines · Jonas Bonn
Quoted 5 lines · Stafford Horne

From: Stefan Kristiansson <[email protected]>

This brings it inline with the other setup oprations done like the cache enables _ic_enable and _dc_enable. Also, this is going to make it easier to initialize additional cpu's when smp is introduced.

This patch confuses me. The TLB flush is moved to a point after MMU's are enabled. The TLB flush should happen before enabling the MMU, shouldn't it?

It still happens before the MMUs are enabled, the patch only refactors the code out into a function that is called from the place where it was open coded before.

Quoted 8 lines
Quoted 2 lines

Right. What's the point of moving it then?

As the commit message mentions, it's a preparation patch for initialisation of secondary cpus, which also will call this function.

Perhaps this patch should be bundled with those patches.

Thanks for replying on this patch, I think keeping this patch here is ok. Since part of the theme of this series is preparing for SMP (which will be another big series) I think its ok have any non SMP specific work into here. Its going to make my life a bit easier going forward.

Also, as this is good refactor to get it structurally in sync with other initializations I think its not completely out of place.

-Stafford

author maintainer
#11 lore raw

PATCH v4 6/24 openrisc: add l.lwa/l.swa emulation

In reply to Stafford Horne

From: Stefan Kristiansson <[email protected]>

This adds an emulation layer for implementations that lack the l.lwa and l.swa instructions. It handles these instructions both in kernel space and user space.

[shorne at gmail.com: Added delay slot pc adjust logic]
---
 arch/openrisc/kernel/entry.S   |  22 ++++-
 arch/openrisc/kernel/process.c |   3 +
 arch/openrisc/kernel/traps.c   | 183 +++++++++++++++++++++++++++++++++++++++++
 3 files changed, 206 insertions(+), 2 deletions(-)
arch/openrisc/kernel/entry.S +20 -2
index aac0bde..ba1a361 100644
@@ -173,6 +173,11 @@ handler:							;\
 	l.j	_ret_from_exception				;\
 	 l.nop
 
+/* clobbers 'reg' */
+#define CLEAR_LWA_FLAG(reg)		\
+	l.movhi	reg,hi(lwa_flag)	;\
+	l.ori	reg,reg,lo(lwa_flag)	;\
+	l.sw	0(reg),r0
 /*
  * NOTE: one should never assume that SPR_EPC, SPR_ESR, SPR_EEAR
  *       contain the same values as when exception we're handling
@@ -193,6 +198,7 @@ EXCEPTION_ENTRY(_tng_kernel_start)
 /* ---[ 0x200: BUS exception ]------------------------------------------- */
 
 EXCEPTION_ENTRY(_bus_fault_handler)
+	CLEAR_LWA_FLAG(r3)
 	/* r4: EA of fault (set by EXCEPTION_HANDLE) */
 	l.jal   do_bus_fault
 	 l.addi  r3,r1,0 /* pt_regs */
@@ -202,11 +208,13 @@ EXCEPTION_ENTRY(_bus_fault_handler)
 
 /* ---[ 0x300: Data Page Fault exception ]------------------------------- */
 EXCEPTION_ENTRY(_dtlb_miss_page_fault_handler)
+	CLEAR_LWA_FLAG(r3)
 	l.and	r5,r5,r0
 	l.j	1f
 	 l.nop
 
 EXCEPTION_ENTRY(_data_page_fault_handler)
+	CLEAR_LWA_FLAG(r3)
 	/* set up parameters for do_page_fault */
 	l.ori	r5,r0,0x300		   // exception vector
 1:
@@ -282,11 +290,13 @@ EXCEPTION_ENTRY(_data_page_fault_handler)
 
 /* ---[ 0x400: Insn Page Fault exception ]------------------------------- */
 EXCEPTION_ENTRY(_itlb_miss_page_fault_handler)
+	CLEAR_LWA_FLAG(r3)
 	l.and	r5,r5,r0
 	l.j	1f
 	 l.nop
 
 EXCEPTION_ENTRY(_insn_page_fault_handler)
+	CLEAR_LWA_FLAG(r3)
 	/* set up parameters for do_page_fault */
 	l.ori	r5,r0,0x400		   // exception vector
 1:
@@ -304,6 +314,7 @@ EXCEPTION_ENTRY(_insn_page_fault_handler)
 /* ---[ 0x500: Timer exception ]----------------------------------------- */
 
 EXCEPTION_ENTRY(_timer_handler)
+	CLEAR_LWA_FLAG(r3)
 	l.jal	timer_interrupt
 	 l.addi r3,r1,0 /* pt_regs */
 
@@ -313,6 +324,7 @@ EXCEPTION_ENTRY(_timer_handler)
 /* ---[ 0x600: Aligment exception ]-------------------------------------- */
 
 EXCEPTION_ENTRY(_alignment_handler)
+	CLEAR_LWA_FLAG(r3)
 	/* r4: EA of fault (set by EXCEPTION_HANDLE) */
 	l.jal   do_unaligned_access
 	 l.addi  r3,r1,0 /* pt_regs */
@@ -509,6 +521,7 @@ EXCEPTION_ENTRY(_external_irq_handler)
 //	l.sw	PT_SR(r1),r4
 1:
 #endif
+	CLEAR_LWA_FLAG(r3)
 	l.addi	r3,r1,0
 	l.movhi	r8,hi(do_IRQ)
 	l.ori	r8,r8,lo(do_IRQ)
@@ -556,8 +569,12 @@ ENTRY(_sys_call_handler)
 	 * they should be clobbered, otherwise
 	 */
 	l.sw    PT_GPR3(r1),r3
-	/* r4 already saved */
-	/* r4 holds the EEAR address of the fault, load the original r4 */
+	/*
+	 * r4 already saved
+	 * r4 holds the EEAR address of the fault, use it as screatch reg and
+	 * then load the original r4
+	 */
+	CLEAR_LWA_FLAG(r4)
 	l.lwz	r4,PT_GPR4(r1)
 	l.sw    PT_GPR5(r1),r5
 	l.sw    PT_GPR6(r1),r6
@@ -776,6 +793,7 @@ UNHANDLED_EXCEPTION(_vector_0xd00,0xd00)
 /* ---[ 0xe00: Trap exception ]------------------------------------------ */
 
 EXCEPTION_ENTRY(_trap_handler)
+	CLEAR_LWA_FLAG(r3)
 	/* r4: EA of fault (set by EXCEPTION_HANDLE) */
 	l.jal   do_trap
 	 l.addi  r3,r1,0 /* pt_regs */
arch/openrisc/kernel/process.c +3 -0
index d7990df..c49350b 100644
@@ -226,6 +226,7 @@ int dump_fpu(struct pt_regs *regs, elf_fpregset_t * fpu)
 
 extern struct thread_info *_switch(struct thread_info *old_ti,
 				   struct thread_info *new_ti);
+extern int lwa_flag;
 
 struct task_struct *__switch_to(struct task_struct *old,
 				struct task_struct *new)
@@ -243,6 +244,8 @@ struct task_struct *__switch_to(struct task_struct *old,
 	new_ti = new->stack;
 	old_ti = old->stack;
 
+	lwa_flag = 0;
+
 	current_thread_info_set[smp_processor_id()] = new_ti;
 	last = (_switch(old_ti, new_ti))->task;
 
arch/openrisc/kernel/traps.c +183 -0

199 lines not on this page · raw message

Signature · 1 line
2.9.3
maintainer
#12 lore raw

Re: [PATCH v4 06/24] openrisc: add l.lwa/l.swa emulation

Quoted 10 lines · Stafford Horne

From: Stefan Kristiansson <[email protected]>

This adds an emulation layer for implementations that lack the l.lwa and l.swa instructions. It handles these instructions both in kernel space and user space.

[shorne at gmail.com: Added delay slot pc adjust logic]

What happened here? A bit of junk has slunk in among your Sign-offs!

/Jonas

author maintainer
#13 lore raw

Re: [PATCH v4 06/24] openrisc: add l.lwa/l.swa emulation

Quoted 8 lines · Jonas Bonn
Quoted 7 lines · Stafford Horne

From: Stefan Kristiansson <[email protected]>

This adds an emulation layer for implementations that lack the l.lwa and l.swa instructions. It handles these instructions both in kernel space and user space.

Quoted 4 lines
Quoted 3 lines
[shorne at gmail.com: Added delay slot pc adjust logic]

What happened here? A bit of junk has slunk in among your Sign-offs!

Hi Jonas,

I think this is standard notation for noting that the maintainer updated the original patch.

In Documentions/process/submitting-patches.rst around line 480. Maybe this is not a slight modification, but I didn't want split or take full credit.

-Stafford

author maintainer
#14 lore raw

PATCH v4 7/24 openrisc: add atomic bitops

In reply to Stafford Horne

From: Stefan Kristiansson <[email protected]>

This utilize the load-link/store-conditional l.lwa and l.swa instructions to implement the atomic bitops.
When those instructions are not available emulation is provided.

[shorne at gmail.com: remove OPENRISC_HAVE_INST_LWA_SWA config suggesed by Alan Cox https://lkml.org/lkml/2014/7/23/666, implement test_and_change_bit]

---
 arch/openrisc/include/asm/bitops.h        |   2 +-
 arch/openrisc/include/asm/bitops/atomic.h | 123 ++++++++++++++++++++++++++++++
 2 files changed, 124 insertions(+), 1 deletion(-)
 create mode 100644 arch/openrisc/include/asm/bitops/atomic.h
arch/openrisc/include/asm/bitops.h +1 -1
index 3003cda..689f568 100644
@@ -45,7 +45,7 @@
 #include <asm-generic/bitops/hweight.h>
 #include <asm-generic/bitops/lock.h>
 
-#include <asm-generic/bitops/atomic.h>
+#include <asm/bitops/atomic.h>
 #include <asm-generic/bitops/non-atomic.h>
 #include <asm-generic/bitops/le.h>
 #include <asm-generic/bitops/ext2-atomic.h>
arch/openrisc/include/asm/bitops/atomic.h new file +123 -0

123 lines not on this page · raw message

Signature · 1 line
2.9.3
author maintainer
#17 lore raw

PATCH v4 8/24 openrisc: add cmpxchg and xchg implementations

In reply to Stafford Horne

From: Stefan Kristiansson <[email protected]>

Optimized version that make use of the l.lwa and l.swa atomic instruction pair.
Most openrisc cores provide these instructions now, if not available emulation is provided.

[shorne at gmail.com: remove OPENRISC_HAVE_INST_LWA_SWA config suggesed by Alan Cox https://lkml.org/lkml/2014/7/23/666]
[shorne at gmail.com: fixed unused calculated value compiler warning in define cmpxchg]

---
 arch/openrisc/include/asm/Kbuild    |  2 -
 arch/openrisc/include/asm/cmpxchg.h | 83 +++++++++++++++++++++++++++++++++++++
 2 files changed, 83 insertions(+), 2 deletions(-)
 create mode 100644 arch/openrisc/include/asm/cmpxchg.h
arch/openrisc/include/asm/Kbuild +0 -2
index 6dd177d..15e6ed5 100644
@@ -10,8 +10,6 @@ generic-y += bugs.h
 generic-y += cacheflush.h
 generic-y += checksum.h
 generic-y += clkdev.h
-generic-y += cmpxchg-local.h
-generic-y += cmpxchg.h
 generic-y += cputime.h
 generic-y += current.h
 generic-y += device.h
arch/openrisc/include/asm/cmpxchg.h new file +83 -0

83 lines not on this page · raw message

Signature · 1 line
2.9.3
author maintainer
#18 lore raw

PATCH v4 9/24 openrisc: add optimized atomic operations

In reply to Stafford Horne

From: Stefan Kristiansson <[email protected]>

Using the l.lwa and l.swa atomic instruction pair.
Most openrisc processor cores provide these instructions now. If the instructions are not available emulation is provided.

[[email protected]: remove OPENRISC_HAVE_INST_LWA_SWA config suggesed by Alan Cox https://lkml.org/lkml/2014/7/23/666]
[[email protected]: expand to implement all ops suggested by Peter Zijlstra https://lkml.org/lkml/2017/2/20/317]

---
 arch/openrisc/include/asm/Kbuild   |   1 -
 arch/openrisc/include/asm/atomic.h | 126 +++++++++++++++++++++++++++++++++++++
 include/asm-generic/atomic.h       |   2 +
 3 files changed, 128 insertions(+), 1 deletion(-)
 create mode 100644 arch/openrisc/include/asm/atomic.h
arch/openrisc/include/asm/Kbuild +0 -1
index 15e6ed5..1cedd63 100644
@@ -1,7 +1,6 @@
 
 header-y += ucontext.h
 
-generic-y += atomic.h
 generic-y += auxvec.h
 generic-y += barrier.h
 generic-y += bitsperlong.h
arch/openrisc/include/asm/atomic.h new file +126 -0

126 lines not on this page · raw message

include/asm-generic/atomic.h +2 -0
index 9ed8b98..3f38eb0 100644
@@ -223,6 +223,7 @@ static inline void atomic_dec(atomic_t *v)
 #define atomic_xchg(ptr, v)		(xchg(&(ptr)->counter, (v)))
 #define atomic_cmpxchg(v, old, new)	(cmpxchg(&((v)->counter), (old), (new)))
 
+#ifndef __atomic_add_unless
 static inline int __atomic_add_unless(atomic_t *v, int a, int u)
 {
 	int c, old;
@@ -231,5 +232,6 @@ static inline int __atomic_add_unless(atomic_t *v, int a, int u)
 		c = old;
 	return c;
 }
+#endif
 
 #endif /* __ASM_GENERIC_ATOMIC_H */
Signature · 1 line
2.9.3
author maintainer
#19 lore raw

PATCH v4 10/24 openrisc: add futex_atomic_* implementations

In reply to Stafford Horne

From: Stefan Kristiansson <[email protected]>

Support for the futex_atomic_* operations by using the load-link/store-conditional l.lwa/l.swa instructions. Most openrisc cores provide these instructions now if not available, emulation is provided.

[shorne at gmail.com: remove OPENRISC_HAVE_INST_LWA_SWA config suggesed by Alan Cox https://lkml.org/lkml/2014/7/23/666]

---
 arch/openrisc/include/asm/Kbuild  |   1 -
 arch/openrisc/include/asm/futex.h | 135 ++++++++++++++++++++++++++++++++++++++
 2 files changed, 135 insertions(+), 1 deletion(-)
 create mode 100644 arch/openrisc/include/asm/futex.h
arch/openrisc/include/asm/Kbuild +0 -1
index 1cedd63..a669c14 100644
@@ -20,7 +20,6 @@ generic-y += exec.h
 generic-y += fb.h
 generic-y += fcntl.h
 generic-y += ftrace.h
-generic-y += futex.h
 generic-y += hardirq.h
 generic-y += hw_irq.h
 generic-y += ioctl.h
arch/openrisc/include/asm/futex.h new file +135 -0

135 lines not on this page · raw message

Signature · 1 line
2.9.3
author maintainer
#20 lore raw

PATCH v4 11/24 openrisc: remove unnecessary stddef.h include

In reply to Stafford Horne

From: Stefan Kristiansson <[email protected]>

This causes the build to fail when building with the or1k-musl-linux- toolchain and it is not needed.

---
 arch/openrisc/kernel/ptrace.c | 1 -
 1 file changed, 1 deletion(-)
arch/openrisc/kernel/ptrace.c +0 -1
index 4f59fa4..2282888 100644
@@ -16,7 +16,6 @@
  *      2 of the License, or (at your option) any later version.
  */
 
-#include <stddef.h>
 #include <linux/kernel.h>
 #include <linux/sched.h>
 #include <linux/string.h>
Signature · 1 line
2.9.3
author maintainer
#21 lore raw

PATCH v4 12/24 openrisc: Fix the bitmask for the unit present register

In reply to Stafford Horne

From: Sebastian Macke <[email protected]>

The bits were swapped, as per spec and processor implementation the power management present bit is 9 and PIC bit is 8. This patch brings the definitions into spec.

[shorne at gmail.com: Added commit body]
---
 arch/openrisc/include/asm/spr_defs.h | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)
arch/openrisc/include/asm/spr_defs.h +2 -2
index 5dbc668..367dac7 100644
@@ -152,8 +152,8 @@
 #define SPR_UPR_MP	   0x00000020  /* MAC present */
 #define SPR_UPR_DUP	   0x00000040  /* Debug unit present */
 #define SPR_UPR_PCUP	   0x00000080  /* Performance counters unit present */
-#define SPR_UPR_PMP	   0x00000100  /* Power management present */
-#define SPR_UPR_PICP	   0x00000200  /* PIC present */
+#define SPR_UPR_PICP	   0x00000100  /* PIC present */
+#define SPR_UPR_PMP	   0x00000200  /* Power management present */
 #define SPR_UPR_TTP	   0x00000400  /* Tick timer present */
 #define SPR_UPR_RES	   0x00fe0000  /* Reserved */
 #define SPR_UPR_CUP	   0xff000000  /* Context units present */
Signature · 1 line
2.9.3
author maintainer
#22 lore raw

PATCH v4 13/24 openrisc: Initial support for the idle state

In reply to Stafford Horne

From: Sebastian Macke <[email protected]>

This patch adds basic support for the idle state of the cpu. The patch overrides the regular idle function, enables the interupts, checks for the power management unit and enables the cpu doze mode if available.

[shorne at gmail.com: Fixed checkpatch, blankline after declarations]
---
 arch/openrisc/kernel/process.c | 11 +++++++++++
 1 file changed, 11 insertions(+)
arch/openrisc/kernel/process.c +11 -0
index c49350b..6e9d1cb 100644
@@ -75,6 +75,17 @@ void machine_power_off(void)
 	__asm__("l.nop 1");
 }
 
+/*
+ * Send the doze signal to the cpu if available.
+ * Make sure, that all interrupts are enabled
+ */
+void arch_cpu_idle(void)
+{
+	local_irq_enable();
+	if (mfspr(SPR_UPR) & SPR_UPR_PMP)
+		mtspr(SPR_PMR, mfspr(SPR_PMR) | SPR_PMR_DME);
+}
+
 void (*pm_power_off) (void) = machine_power_off;
 
 /*
Signature · 1 line
2.9.3
author maintainer
#23 lore raw

PATCH v4 14/24 openrisc: Add optimized memset

In reply to Stafford Horne

From: Olof Kindgren <[email protected]>

This adds a hand-optimized assembler version of memset and sets __HAVE_ARCH_MEMSET to use this version instead of the generic C routine

---
 arch/openrisc/include/asm/string.h |  7 +++
 arch/openrisc/kernel/or32_ksyms.c  |  1 +
 arch/openrisc/lib/Makefile         |  2 +-
 arch/openrisc/lib/memset.S         | 98 ++++++++++++++++++++++++++++++++++++++
 4 files changed, 107 insertions(+), 1 deletion(-)
 create mode 100644 arch/openrisc/include/asm/string.h
 create mode 100644 arch/openrisc/lib/memset.S
arch/openrisc/include/asm/string.h new file +7 -0
new file mode 100644
index 0000000..33470d4
@@ -0,0 +1,7 @@
+#ifndef __ASM_OPENRISC_STRING_H
+#define __ASM_OPENRISC_STRING_H
+
+#define __HAVE_ARCH_MEMSET
+extern void *memset(void *s, int c, __kernel_size_t n);
+
+#endif /* __ASM_OPENRISC_STRING_H */
arch/openrisc/kernel/or32_ksyms.c +1 -0
index 86e31cf..5c4695d 100644
@@ -44,3 +44,4 @@ DECLARE_EXPORT(__ashldi3);
 DECLARE_EXPORT(__lshrdi3);
 
 EXPORT_SYMBOL(__copy_tofrom_user);
+EXPORT_SYMBOL(memset);
arch/openrisc/lib/Makefile +1 -1
index 966f65d..67c583e 100644
@@ -2,4 +2,4 @@
 # Makefile for or32 specific library files..
 #
 
-obj-y  = string.o delay.o
+obj-y  = memset.o string.o delay.o
arch/openrisc/lib/memset.S new file +98 -0

98 lines not on this page · raw message

Signature · 1 line
2.9.3
author maintainer
#24 lore raw

PATCH v4 15/24 openrisc: Add optimized memcpy routine

In reply to Stafford Horne

The generic memcpy routine provided in kernel does only byte copies. Using word copies we can lower boot time and cycles spend in memcpy quite significantly.

Booting on my de0 nano I see boot times go from 7.2 to 5.6 seconds. The avg cycles in memcpy during boot go from 6467 to 1887.

I tested several algorithms (see code in previous patch mails)

The implementations I tested and avg cycles:

  - Word Copies + Loop Unrolls + Non Aligned    1882
  - Word Copies + Loop Unrolls                  1887
  - Word Copies                                 2441
  - Byte Copies + Loop Unrolls                  6467
  - Byte Copies                                 7600

In the end I ended up going with Word Copies + Loop Unrolls as it provides best tradeoff between simplicity and boot speedups.

---
 arch/openrisc/TODO.openrisc        |   1 -
 arch/openrisc/include/asm/string.h |   3 +
 arch/openrisc/lib/Makefile         |   2 +-
 arch/openrisc/lib/memcpy.c         | 124 +++++++++++++++++++++++++++++++++++++
 4 files changed, 128 insertions(+), 2 deletions(-)
 create mode 100644 arch/openrisc/lib/memcpy.c
arch/openrisc/TODO.openrisc +0 -1
index 0eb04c8..c43d4e1 100644
@@ -10,4 +10,3 @@ that are due for investigation shortly, i.e. our TODO list:
    or1k and this change is slowly trickling through the stack.  For the time
    being, or32 is equivalent to or1k.
 
--- Implement optimized version of memcpy and memset
arch/openrisc/include/asm/string.h +3 -0
index 33470d4..64939cc 100644
@@ -4,4 +4,7 @@
 #define __HAVE_ARCH_MEMSET
 extern void *memset(void *s, int c, __kernel_size_t n);
 
+#define __HAVE_ARCH_MEMCPY
+extern void *memcpy(void *dest, __const void *src, __kernel_size_t n);
+
 #endif /* __ASM_OPENRISC_STRING_H */
arch/openrisc/lib/Makefile +1 -1
index 67c583e..17d9d37 100644
@@ -2,4 +2,4 @@
 # Makefile for or32 specific library files..
 #
 
-obj-y  = memset.o string.o delay.o
+obj-y	:= delay.o string.o memset.o memcpy.o
arch/openrisc/lib/memcpy.c new file +124 -0

124 lines not on this page · raw message

Signature · 1 line
2.9.3
author maintainer
#25 lore raw

PATCH v4 16/24 openrisc: Add .gitignore

In reply to Stafford Horne

This helps to suppress the vmlinux.lds file.

---
 arch/openrisc/kernel/.gitignore | 1 +
 1 file changed, 1 insertion(+)
 create mode 100644 arch/openrisc/kernel/.gitignore
arch/openrisc/kernel/.gitignore new file +1 -0
new file mode 100644
index 0000000..c5f676c
@@ -0,0 +1 @@
+vmlinux.lds
Signature · 1 line
2.9.3
author maintainer
#26 lore raw

PATCH v4 17/24 MAINTAINERS: Add the openrisc official repository

In reply to Stafford Horne

The openrisc official repository and patch work happens currently on github. Add the repo for reference.

---
 MAINTAINERS | 1 +
 1 file changed, 1 insertion(+)
MAINTAINERS +1 -0
index 187b961..57809d6 100644
@@ -9187,6 +9187,7 @@ OPENRISC ARCHITECTURE
 M:	Jonas Bonn <[email protected]>
 M:	Stefan Kristiansson <[email protected]>
 M:	Stafford Horne <[email protected]>
+T:	git git://github.com/openrisc/linux.git
 L:	openrisc at lists.librecores.org
 W:	http://openrisc.io
 S:	Maintained
Signature · 1 line
2.9.3
author maintainer
#27 lore raw

PATCH v4 18/24 scripts/checkstack.pl: Add openrisc support

In reply to Stafford Horne

Openrisc stack pointer is managed by decrementing r1. Add regexes to recognize this.

---
 scripts/checkstack.pl | 3 +++
 1 file changed, 3 insertions(+)
scripts/checkstack.pl +3 -0
index dd83978..eea5b78 100755
@@ -106,6 +106,9 @@ my (@stack, $re, $dre, $x, $xs, $funcre);
 	} elsif ($arch eq 'sparc' || $arch eq 'sparc64') {
 		# f0019d10:       9d e3 bf 90     save  %sp, -112, %sp
 		$re = qr/.*save.*%sp, -(([0-9]{2}|[3-9])[0-9]{2}), %sp/o;
+	} elsif ($arch eq 'openrisc') {
+		# c000043c:       9c 21 fe f0     l.addi r1,r1,-272
+		$re = qr/.*l\.addi.*r1,r1,-(([0-9]{2}|[3-9])[0-9]{2})/o;
 	} else {
 		print("wrong or unknown architecture \"$arch\"\n");
 		exit
Signature · 1 line
2.9.3
#28 lore raw

Re: [PATCH v4 18/24] scripts/checkstack.pl: Add openrisc support

Quoted 13 lines · Stafford Horne

Openrisc stack pointer is managed by decrementing r1. Add regexes to recognize this.

---
 scripts/checkstack.pl | 3 +++
 1 file changed, 3 insertions(+)
scripts/checkstack.pl +0 -0
index dd83978..eea5b78 100755

scripts/checkstack.pl my (@stack, $re, $dre, $x, $xs, $funcre); · line 111

Quoted 6 lines
scripts/checkstack.pl +3 -0
@@ -106,6 +106,9 @@ my (@stack, $re, $dre, $x, $xs, $funcre);
 	} elsif ($arch eq 'sparc' || $arch eq 'sparc64') {
 		# f0019d10:       9d e3 bf 90     save  %sp, -112, %sp
 		$re = qr/.*save.*%sp, -(([0-9]{2}|[3-9])[0-9]{2}), %sp/o;
+	} elsif ($arch eq 'openrisc') {
+		# c000043c:       9c 21 fe f0     l.addi r1,r1,-272
+		$re = qr/.*l\.addi.*r1,r1,-(([0-9]{2}|[3-9])[0-9]{2})/o;

The if/elsif clauses are currently ordered alphabetically (except for blackfin :-/), so this should rather be inserted above after nios2.

author maintainer
#29 lore raw

Re: [PATCH v4 18/24] scripts/checkstack.pl: Add openrisc support

Quoted 9 lines · Tobias Klauser
Quoted 8 lines · Stafford Horne

Openrisc stack pointer is managed by decrementing r1. Add regexes to recognize this.

---
 scripts/checkstack.pl | 3 +++
 1 file changed, 3 insertions(+)
Quoted 14 lines

scripts/checkstack.pl my (@stack, $re, $dre, $x, $xs, $funcre); · line 111

Quoted 11 lines
scripts/checkstack.pl +3 -0
index dd83978..eea5b78 100755
@@ -106,6 +106,9 @@ my (@stack, $re, $dre, $x, $xs, $funcre);
 	} elsif ($arch eq 'sparc' || $arch eq 'sparc64') {
 		# f0019d10:       9d e3 bf 90     save  %sp, -112, %sp
 		$re = qr/.*save.*%sp, -(([0-9]{2}|[3-9])[0-9]{2}), %sp/o;
+	} elsif ($arch eq 'openrisc') {
+		# c000043c:       9c 21 fe f0     l.addi r1,r1,-272
+		$re = qr/.*l\.addi.*r1,r1,-(([0-9]{2}|[3-9])[0-9]{2})/o;

The if/elsif clauses are currently ordered alphabetically (except for blackfin :-/), so this should rather be inserted above after nios2.

Right, I didnt notice the order. Also, nios is new, this might cause a
bit of a conflict during merge. (just a note)

Thanks for the comment.

-Stafford

author maintainer
#30 lore raw

PATCH v4 19/24 openrisc: entry: Whitespace and comment cleanups

In reply to Stafford Horne

Cleanups to whitespace and add some comments. Reading through the delay slot logic I noticed some things:
- Delay slot instructions were not indented
- Some comments are not lined up
- Use tabs and spaces consistent with other code

No functional change

---
 arch/openrisc/kernel/entry.S | 38 ++++++++++++++++++--------------------
 1 file changed, 18 insertions(+), 20 deletions(-)
arch/openrisc/kernel/entry.S +18 -20
index ba1a361..daae2a4 100644
@@ -228,7 +228,7 @@ EXCEPTION_ENTRY(_data_page_fault_handler)
 	 * DTLB miss handler in the CONFIG_GUARD_PROTECTED_CORE part
 	 */
 #ifdef CONFIG_OPENRISC_NO_SPR_SR_DSX
-	l.lwz   r6,PT_PC(r3)                  // address of an offending insn
+	l.lwz   r6,PT_PC(r3)               // address of an offending insn
 	l.lwz   r6,0(r6)                   // instruction that caused pf
 
 	l.srli  r6,r6,26                   // check opcode for jump insn
@@ -244,49 +244,47 @@ EXCEPTION_ENTRY(_data_page_fault_handler)
 	l.bf    8f
 	l.sfeqi r6,0x12                    // l.jalr
 	l.bf    8f
-
-	l.nop
+	 l.nop
 
 	l.j     9f
-	l.nop
-8:
+	 l.nop
 
-	l.lwz   r6,PT_PC(r3)                  // address of an offending insn
+8: // offending insn is in delay slot
+	l.lwz   r6,PT_PC(r3)               // address of an offending insn
 	l.addi  r6,r6,4
 	l.lwz   r6,0(r6)                   // instruction that caused pf
 	l.srli  r6,r6,26                   // get opcode
-9:
+9: // offending instruction opcode loaded in r6
 
 #else
 
-	l.mfspr r6,r0,SPR_SR		   // SR
-//	l.lwz	r6,PT_SR(r3)		   // ESR
-	l.andi	r6,r6,SPR_SR_DSX	   // check for delay slot exception
-	l.sfeqi	r6,0x1			   // exception happened in delay slot
-	l.bnf	7f
-	l.lwz	r6,PT_PC(r3)		   // address of an offending insn
+	l.mfspr r6,r0,SPR_SR               // SR
+	l.andi  r6,r6,SPR_SR_DSX           // check for delay slot exception
+	l.sfeqi r6,0x1                     // exception happened in delay slot
+	l.bnf   7f
+	 l.lwz  r6,PT_PC(r3)               // address of an offending insn
 
-	l.addi	r6,r6,4			   // offending insn is in delay slot
+	l.addi	r6,r6,4                    // offending insn is in delay slot
 7:
 	l.lwz   r6,0(r6)                   // instruction that caused pf
 	l.srli  r6,r6,26                   // check opcode for write access
 #endif
 
-	l.sfgeui r6,0x33		   // check opcode for write access
+	l.sfgeui r6,0x33                   // check opcode for write access
 	l.bnf   1f
 	l.sfleui r6,0x37
 	l.bnf   1f
 	l.ori   r6,r0,0x1                  // write access
 	l.j     2f
-	l.nop
+	 l.nop
 1:	l.ori   r6,r0,0x0                  // !write access
 2:
 
 	/* call fault.c handler in or32/mm/fault.c */
 	l.jal   do_page_fault
-	l.nop
+	 l.nop
 	l.j     _ret_from_exception
-	l.nop
+	 l.nop
 
 /* ---[ 0x400: Insn Page Fault exception ]------------------------------- */
 EXCEPTION_ENTRY(_itlb_miss_page_fault_handler)
@@ -306,9 +304,9 @@ EXCEPTION_ENTRY(_insn_page_fault_handler)
 
 	/* call fault.c handler in or32/mm/fault.c */
 	l.jal   do_page_fault
-	l.nop
+	 l.nop
 	l.j     _ret_from_exception
-	l.nop
+	 l.nop
 
 
 /* ---[ 0x500: Timer exception ]----------------------------------------- */
Signature · 1 line
2.9.3
maintainer
#31 lore raw

Re: [PATCH v4 19/24] openrisc: entry: Whitespace and comment cleanups

Quoted 7 lines · Stafford Horne

Cleanups to whitespace and add some comments. Reading through the delay slot logic I noticed some things:
- Delay slot instructions were not indented
- Some comments are not lined up
- Use tabs and spaces consistent with other code

No functional change

No, don't do this. Whitespace cleanups like this make life difficult for people rebasing on your tree, as well as blunting useful tools like git blame.

I'm not against the indentation of the delay slot instructions; that seems sane and should be pretty transparent in a merge conflict.

The whitespace cleanup and tab-space toggling needs to go, though. These sorts of things are better fixed up when the code lines they apply to are changed for other, functional reasons.

I suggest you pull out the delay slot fixups into a separate patch and then just sit on the rest until you've discovered the pain of whitespace cleanup-inflicted merge conflicts and decide to just ditch them altogether.

/Jonas

Quoted 96 lines
---
  arch/openrisc/kernel/entry.S | 38 ++++++++++++++++++--------------------
  1 file changed, 18 insertions(+), 20 deletions(-)
arch/openrisc/kernel/entry.S +18 -20
index ba1a361..daae2a4 100644
@@ -228,7 +228,7 @@ EXCEPTION_ENTRY(_data_page_fault_handler)
  	 * DTLB miss handler in the CONFIG_GUARD_PROTECTED_CORE part
  	 */
  #ifdef CONFIG_OPENRISC_NO_SPR_SR_DSX
-	l.lwz   r6,PT_PC(r3)                  // address of an offending insn
+	l.lwz   r6,PT_PC(r3)               // address of an offending insn
  	l.lwz   r6,0(r6)                   // instruction that caused pf
 
  	l.srli  r6,r6,26                   // check opcode for jump insn
@@ -244,49 +244,47 @@ EXCEPTION_ENTRY(_data_page_fault_handler)
  	l.bf    8f
  	l.sfeqi r6,0x12                    // l.jalr
  	l.bf    8f
-
-	l.nop
+	 l.nop
 
  	l.j     9f
-	l.nop
-8:
+	 l.nop
 
-	l.lwz   r6,PT_PC(r3)                  // address of an offending insn
+8: // offending insn is in delay slot
+	l.lwz   r6,PT_PC(r3)               // address of an offending insn
  	l.addi  r6,r6,4
  	l.lwz   r6,0(r6)                   // instruction that caused pf
  	l.srli  r6,r6,26                   // get opcode
-9:
+9: // offending instruction opcode loaded in r6
 
  #else
 
-	l.mfspr r6,r0,SPR_SR		   // SR
-//	l.lwz	r6,PT_SR(r3)		   // ESR
-	l.andi	r6,r6,SPR_SR_DSX	   // check for delay slot exception
-	l.sfeqi	r6,0x1			   // exception happened in delay slot
-	l.bnf	7f
-	l.lwz	r6,PT_PC(r3)		   // address of an offending insn
+	l.mfspr r6,r0,SPR_SR               // SR
+	l.andi  r6,r6,SPR_SR_DSX           // check for delay slot exception
+	l.sfeqi r6,0x1                     // exception happened in delay slot
+	l.bnf   7f
+	 l.lwz  r6,PT_PC(r3)               // address of an offending insn
 
-	l.addi	r6,r6,4			   // offending insn is in delay slot
+	l.addi	r6,r6,4                    // offending insn is in delay slot
  7:
  	l.lwz   r6,0(r6)                   // instruction that caused pf
  	l.srli  r6,r6,26                   // check opcode for write access
  #endif
 
-	l.sfgeui r6,0x33		   // check opcode for write access
+	l.sfgeui r6,0x33                   // check opcode for write access
  	l.bnf   1f
  	l.sfleui r6,0x37
  	l.bnf   1f
  	l.ori   r6,r0,0x1                  // write access
  	l.j     2f
-	l.nop
+	 l.nop
  1:	l.ori   r6,r0,0x0                  // !write access
  2:
 
  	/* call fault.c handler in or32/mm/fault.c */
  	l.jal   do_page_fault
-	l.nop
+	 l.nop
  	l.j     _ret_from_exception
-	l.nop
+	 l.nop
 
  /* ---[ 0x400: Insn Page Fault exception ]------------------------------- */
  EXCEPTION_ENTRY(_itlb_miss_page_fault_handler)
@@ -306,9 +304,9 @@ EXCEPTION_ENTRY(_insn_page_fault_handler)
 
  	/* call fault.c handler in or32/mm/fault.c */
  	l.jal   do_page_fault
-	l.nop
+	 l.nop
  	l.j     _ret_from_exception
-	l.nop
+	 l.nop
 
 
  /* ---[ 0x500: Timer exception ]----------------------------------------- */
author maintainer
#32 lore raw

Re: [PATCH v4 19/24] openrisc: entry: Whitespace and comment cleanups

Quoted 16 lines · Jonas Bonn
Quoted 7 lines · Stafford Horne

Cleanups to whitespace and add some comments. Reading through the delay slot logic I noticed some things:
- Delay slot instructions were not indented
- Some comments are not lined up
- Use tabs and spaces consistent with other code

No functional change

No, don't do this. Whitespace cleanups like this make life difficult for people rebasing on your tree, as well as blunting useful tools like git blame.

I'm not against the indentation of the delay slot instructions; that seems sane and should be pretty transparent in a merge conflict.

Quoted 7 lines

The whitespace cleanup and tab-space toggling needs to go, though. These sorts of things are better fixed up when the code lines they apply to are changed for other, functional reasons.

I suggest you pull out the delay slot fixups into a separate patch and then just sit on the rest until you've discovered the pain of whitespace cleanup-inflicted merge conflicts and decide to just ditch them altogether.

Hi Jonas,

I agree here and definitely if I knew others were actively working on this code I would be a bit more careful. But the truth is I think its only me right now. If you have patches that will get a conflict due to this let me know.

Also, all of our out of tree patches for this file are actually upstream (as of this series now).

Also, for me, this was needed in order for me to read the code (i.e. comments in the right place, and removing commented out lines) and fix the bug in the next patch.

Nevertheless, if someone else thinks this should be left out Ill revert.

-Stafford

Quoted 86 lines
Quoted 84 lines
---
  arch/openrisc/kernel/entry.S | 38 ++++++++++++++++++--------------------
  1 file changed, 18 insertions(+), 20 deletions(-)
arch/openrisc/kernel/entry.S +18 -20
index ba1a361..daae2a4 100644
@@ -228,7 +228,7 @@ EXCEPTION_ENTRY(_data_page_fault_handler)
  	 * DTLB miss handler in the CONFIG_GUARD_PROTECTED_CORE part
  	 */
  #ifdef CONFIG_OPENRISC_NO_SPR_SR_DSX
-	l.lwz   r6,PT_PC(r3)                  // address of an offending insn
+	l.lwz   r6,PT_PC(r3)               // address of an offending insn
  	l.lwz   r6,0(r6)                   // instruction that caused pf
  	l.srli  r6,r6,26                   // check opcode for jump insn
@@ -244,49 +244,47 @@ EXCEPTION_ENTRY(_data_page_fault_handler)
  	l.bf    8f
  	l.sfeqi r6,0x12                    // l.jalr
  	l.bf    8f
-
-	l.nop
+	 l.nop
  	l.j     9f
-	l.nop
-8:
+	 l.nop
-	l.lwz   r6,PT_PC(r3)                  // address of an offending insn
+8: // offending insn is in delay slot
+	l.lwz   r6,PT_PC(r3)               // address of an offending insn
  	l.addi  r6,r6,4
  	l.lwz   r6,0(r6)                   // instruction that caused pf
  	l.srli  r6,r6,26                   // get opcode
-9:
+9: // offending instruction opcode loaded in r6
  #else
-	l.mfspr r6,r0,SPR_SR		   // SR
-//	l.lwz	r6,PT_SR(r3)		   // ESR
-	l.andi	r6,r6,SPR_SR_DSX	   // check for delay slot exception
-	l.sfeqi	r6,0x1			   // exception happened in delay slot
-	l.bnf	7f
-	l.lwz	r6,PT_PC(r3)		   // address of an offending insn
+	l.mfspr r6,r0,SPR_SR               // SR
+	l.andi  r6,r6,SPR_SR_DSX           // check for delay slot exception
+	l.sfeqi r6,0x1                     // exception happened in delay slot
+	l.bnf   7f
+	 l.lwz  r6,PT_PC(r3)               // address of an offending insn
-	l.addi	r6,r6,4			   // offending insn is in delay slot
+	l.addi	r6,r6,4                    // offending insn is in delay slot
  7:
  	l.lwz   r6,0(r6)                   // instruction that caused pf
  	l.srli  r6,r6,26                   // check opcode for write access
  #endif
-	l.sfgeui r6,0x33		   // check opcode for write access
+	l.sfgeui r6,0x33                   // check opcode for write access
  	l.bnf   1f
  	l.sfleui r6,0x37
  	l.bnf   1f
  	l.ori   r6,r0,0x1                  // write access
  	l.j     2f
-	l.nop
+	 l.nop
  1:	l.ori   r6,r0,0x0                  // !write access
  2:
  	/* call fault.c handler in or32/mm/fault.c */
  	l.jal   do_page_fault
-	l.nop
+	 l.nop
  	l.j     _ret_from_exception
-	l.nop
+	 l.nop
  /* ---[ 0x400: Insn Page Fault exception ]------------------------------- */
  EXCEPTION_ENTRY(_itlb_miss_page_fault_handler)
@@ -306,9 +304,9 @@ EXCEPTION_ENTRY(_insn_page_fault_handler)
  	/* call fault.c handler in or32/mm/fault.c */
  	l.jal   do_page_fault
-	l.nop
+	 l.nop
  	l.j     _ret_from_exception
-	l.nop
+	 l.nop
  /* ---[ 0x500: Timer exception ]----------------------------------------- */
author maintainer
#33 lore raw

PATCH v4 20/24 openrisc: entry: Fix delay slot detection

In reply to Stafford Horne

Use execption SR stored in pt_regs for detection, the current SR is not correct as the handler is running after return from exception.

Also, The code that checks for a delay slot uses a flag bitmask and then wants to check if the result is not zero. The test it implemented was wrong.

Correct it by changing the test to check result against non zero.

---
 arch/openrisc/kernel/entry.S | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)
arch/openrisc/kernel/entry.S +2 -2
index daae2a4..bc65008 100644
@@ -258,9 +258,9 @@ EXCEPTION_ENTRY(_data_page_fault_handler)
 
 #else
 
-	l.mfspr r6,r0,SPR_SR               // SR
+	l.lwz   r6,PT_SR(r3)               // SR
 	l.andi  r6,r6,SPR_SR_DSX           // check for delay slot exception
-	l.sfeqi r6,0x1                     // exception happened in delay slot
+	l.sfne  r6,r0                      // exception happened in delay slot
 	l.bnf   7f
 	 l.lwz  r6,PT_PC(r3)               // address of an offending insn
 
Signature · 1 line
2.9.3
maintainer
#34 lore raw

Re: [PATCH v4 20/24] openrisc: entry: Fix delay slot detection

Quoted 8 lines · Stafford Horne

Use execption SR stored in pt_regs for detection, the current SR is not correct as the handler is running after return from exception.

Also, The code that checks for a delay slot uses a flag bitmask and then wants to check if the result is not zero. The test it implemented was wrong.

Correct it by changing the test to check result against non zero.

This wants to be two patches as you are changing two different things.

/Joans

Quoted 22 lines
---
  arch/openrisc/kernel/entry.S | 4 ++--
  1 file changed, 2 insertions(+), 2 deletions(-)
arch/openrisc/kernel/entry.S +2 -2
index daae2a4..bc65008 100644
@@ -258,9 +258,9 @@ EXCEPTION_ENTRY(_data_page_fault_handler)
 
  #else
 
-	l.mfspr r6,r0,SPR_SR               // SR
+	l.lwz   r6,PT_SR(r3)               // SR
  	l.andi  r6,r6,SPR_SR_DSX           // check for delay slot exception
-	l.sfeqi r6,0x1                     // exception happened in delay slot
+	l.sfne  r6,r0                      // exception happened in delay slot
  	l.bnf   7f
  	 l.lwz  r6,PT_PC(r3)               // address of an offending insn
 
author maintainer
#35 lore raw

Re: [PATCH v4 20/24] openrisc: entry: Fix delay slot detection

Quoted 11 lines · Jonas Bonn
Quoted 8 lines · Stafford Horne

Use execption SR stored in pt_regs for detection, the current SR is not correct as the handler is running after return from exception.

Also, The code that checks for a delay slot uses a flag bitmask and then wants to check if the result is not zero. The test it implemented was wrong.

Correct it by changing the test to check result against non zero.

This wants to be two patches as you are changing two different things.

Hi Jonas,

Technically yes, two things, but...

The logic is broken without both fixes. It would be a nightmare for someone to review these one-liners as two patches.

I would like to keep as one.

-Stafford

Quoted 21 lines
Quoted 19 lines
---
  arch/openrisc/kernel/entry.S | 4 ++--
  1 file changed, 2 insertions(+), 2 deletions(-)
arch/openrisc/kernel/entry.S +2 -2
index daae2a4..bc65008 100644
@@ -258,9 +258,9 @@ EXCEPTION_ENTRY(_data_page_fault_handler)
  #else
-	l.mfspr r6,r0,SPR_SR               // SR
+	l.lwz   r6,PT_SR(r3)               // SR
  	l.andi  r6,r6,SPR_SR_DSX           // check for delay slot exception
-	l.sfeqi r6,0x1                     // exception happened in delay slot
+	l.sfne  r6,r0                      // exception happened in delay slot
  	l.bnf   7f
  	 l.lwz  r6,PT_PC(r3)               // address of an offending insn
author maintainer
#36 lore raw

PATCH v4 21/24 openrisc: head: Move init strings to rodata section

In reply to Stafford Horne

The strings used during the head/init phase of openrisc bootup were stored in the executable section of the binary.

This causes compilation to fail when using CONFIG_DEBUG_INFO with error:
Error: unaligned opcodes detected in executable segment

Also, this patch removes unused strings.

---
 arch/openrisc/kernel/head.S | 12 +-----------
 1 file changed, 1 insertion(+), 11 deletions(-)
arch/openrisc/kernel/head.S +1 -11
index a22f1fc..573e131 100644
@@ -1530,11 +1530,7 @@ ENTRY(_early_uart_init)
 	l.jr	r9
 	l.nop
 
-_string_copying_linux:
-	.string "\n\n\n\n\n\rCopying Linux... \0"
-
-_string_ok_booting:
-	.string "Ok, booting the kernel.\n\r\0"
+	.section .rodata
 
 _string_unhandled_exception:
 	.string "\n\rRunarunaround: Unhandled exception 0x\0"
@@ -1545,12 +1541,6 @@ _string_epc_prefix:
 _string_nl:
 	.string "\n\r\0"
 
-	.global	_string_esr_irq_bug
-_string_esr_irq_bug:
-	.string "\n\rESR external interrupt bug, for details look into entry.S\n\r\0"
-
-
-
 /* ========================================[ page aligned structures ]=== */
 
 /*
Signature · 1 line
2.9.3
maintainer
#37 lore raw

Re: [PATCH v4 21/24] openrisc: head: Move init strings to rodata section

Quoted 8 lines · Stafford Horne

The strings used during the head/init phase of openrisc bootup were stored in the executable section of the binary.

This causes compilation to fail when using CONFIG_DEBUG_INFO with error:
Error: unaligned opcodes detected in executable segment

Also, this patch removes unused strings.

This should be two patches: one that removes unused strings and one that switches the data section.

Works like "Also" usually indicate that you are doing too much in your patch and you need to split it up.

/Jonas

Quoted 36 lines
---
  arch/openrisc/kernel/head.S | 12 +-----------
  1 file changed, 1 insertion(+), 11 deletions(-)
arch/openrisc/kernel/head.S +1 -11
index a22f1fc..573e131 100644
@@ -1530,11 +1530,7 @@ ENTRY(_early_uart_init)
  	l.jr	r9
  	l.nop
 
-_string_copying_linux:
-	.string "\n\n\n\n\n\rCopying Linux... \0"
-
-_string_ok_booting:
-	.string "Ok, booting the kernel.\n\r\0"
+	.section .rodata
 
  _string_unhandled_exception:
  	.string "\n\rRunarunaround: Unhandled exception 0x\0"
@@ -1545,12 +1541,6 @@ _string_epc_prefix:
  _string_nl:
  	.string "\n\r\0"
 
-	.global	_string_esr_irq_bug
-_string_esr_irq_bug:
-	.string "\n\rESR external interrupt bug, for details look into entry.S\n\r\0"
-
-
-
  /* ========================================[ page aligned structures ]=== */
 
  /*
author maintainer
#38 lore raw

Re: [PATCH v4 21/24] openrisc: head: Move init strings to rodata section

Quoted 8 lines · Jonas Bonn
Quoted 7 lines · Stafford Horne

The strings used during the head/init phase of openrisc bootup were stored in the executable section of the binary.

This causes compilation to fail when using CONFIG_DEBUG_INFO with error:
Error: unaligned opcodes detected in executable segment

Quoted 6 lines
Quoted 1 line

Also, this patch removes unused strings.

This should be two patches: one that removes unused strings and one that switches the data section.

Works like "Also" usually indicate that you are doing too much in your patch and you need to split it up.

Hi Jonas,

Right, I'll split this one. I was debating that due to the size. But it would be right in this case.

Also, I use the word also a lot :)

-Stafford

Quoted 34 lines
Quoted 32 lines
---
  arch/openrisc/kernel/head.S | 12 +-----------
  1 file changed, 1 insertion(+), 11 deletions(-)
arch/openrisc/kernel/head.S +1 -11
index a22f1fc..573e131 100644
@@ -1530,11 +1530,7 @@ ENTRY(_early_uart_init)
  	l.jr	r9
  	l.nop
-_string_copying_linux:
-	.string "\n\n\n\n\n\rCopying Linux... \0"
-
-_string_ok_booting:
-	.string "Ok, booting the kernel.\n\r\0"
+	.section .rodata
  _string_unhandled_exception:
  	.string "\n\rRunarunaround: Unhandled exception 0x\0"
@@ -1545,12 +1541,6 @@ _string_epc_prefix:
  _string_nl:
  	.string "\n\r\0"
-	.global	_string_esr_irq_bug
-_string_esr_irq_bug:
-	.string "\n\rESR external interrupt bug, for details look into entry.S\n\r\0"
-
-
-
  /* ========================================[ page aligned structures ]=== */
  /*
author maintainer
#39 lore raw

PATCH v4 22/24 arch/openrisc/lib/memcpy.c: use correct OR1200 option

In reply to Stafford Horne

From: Valentin Rothberg <[email protected]>

The Kconfig option for OR12000 is OR1K_1200.

---
 arch/openrisc/lib/memcpy.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)
arch/openrisc/lib/memcpy.c +1 -1
index 4706f01..669887a 100644
@@ -17,7 +17,7 @@
 
 #include <linux/string.h>
 
-#ifdef CONFIG_OR1200
+#ifdef CONFIG_OR1K_1200
 /*
  * Do memcpy with word copies and loop unrolling. This gives the
  * best performance on the OR1200 and MOR1KX archirectures
Signature · 1 line
2.9.3
maintainer
#40 lore raw

Re: [PATCH v4 22/24] arch/openrisc/lib/memcpy.c: use correct OR1200 option

Hi Stafford,

Squash this patch into the memcpy patch in order to prevent surprises for anyone doing a git bisection through here.

/Jonas

Quoted 23 lines · Stafford Horne

From: Valentin Rothberg <[email protected]>

The Kconfig option for OR12000 is OR1K_1200.

---
  arch/openrisc/lib/memcpy.c | 2 +-
  1 file changed, 1 insertion(+), 1 deletion(-)
arch/openrisc/lib/memcpy.c +1 -1
index 4706f01..669887a 100644
@@ -17,7 +17,7 @@
 
  #include <linux/string.h>
 
-#ifdef CONFIG_OR1200
+#ifdef CONFIG_OR1K_1200
  /*
   * Do memcpy with word copies and loop unrolling. This gives the
   * best performance on the OR1200 and MOR1KX archirectures
author maintainer
#41 lore raw

Re: [PATCH v4 22/24] arch/openrisc/lib/memcpy.c: use correct OR1200 option

Quoted 4 lines · Jonas Bonn

Hi Stafford,

Squash this patch into the memcpy patch in order to prevent surprises for anyone doing a git bisection through here.

Hi Jonas,

Thanks for reviewing. Good spot.

I intentionally didn't squash this one just to give Valentin credit on the fix. Also, since it wouldnt really be broken (build or boot issues) in the initial patch I didnt think it would be a bisect issue.

Also, I noticed a lot of Valintin's patches pushed by people are separated out not squashed.

-Stafford

Quoted 26 lines

/Jonas

Quoted 21 lines · Stafford Horne

From: Valentin Rothberg <[email protected]>

The Kconfig option for OR12000 is OR1K_1200.

---
  arch/openrisc/lib/memcpy.c | 2 +-
  1 file changed, 1 insertion(+), 1 deletion(-)
arch/openrisc/lib/memcpy.c +1 -1
index 4706f01..669887a 100644
@@ -17,7 +17,7 @@
  #include <linux/string.h>
-#ifdef CONFIG_OR1200
+#ifdef CONFIG_OR1K_1200
  /*
   * Do memcpy with word copies and loop unrolling. This gives the
   * best performance on the OR1200 and MOR1KX archirectures
author maintainer
#42 lore raw

PATCH v4 23/24 openrisc: Export ioremap symbols used by modules

In reply to Stafford Horne

Noticed this when building with allyesconfig. Got build failures due to iounmap and __ioremap symbols missing. This patch exports them so modules can use them. This is inline with other architectures.

---
 arch/openrisc/mm/ioremap.c | 2 ++
 1 file changed, 2 insertions(+)
arch/openrisc/mm/ioremap.c +2 -0
index 8705a46..2175e4b 100644
@@ -80,6 +80,7 @@ __ioremap(phys_addr_t addr, unsigned long size, pgprot_t prot)
 
 	return (void __iomem *)(offset + (char *)v);
 }
+EXPORT_SYMBOL(__ioremap);
 
 void iounmap(void *addr)
 {
@@ -106,6 +107,7 @@ void iounmap(void *addr)
 
 	return vfree((void *)(PAGE_MASK & (unsigned long)addr));
 }
+EXPORT_SYMBOL(iounmap);
 
 /**
  * OK, this one's a bit tricky... ioremap can get called before memory is
Signature · 1 line
2.9.3
author maintainer
#43 lore raw

PATCH v4 24/24 openrisc: head: Init r0 to 0 on start

In reply to Stafford Horne

Originally openrisc spec 0 specified that r0 would be wired to ground. This is no longer the case. r0 is not guaranteed to be 0 at init, so we need to initialize it to 0 before using it.

Also, if we are clearing r0 we cant use r0 to clear itself. Change the the CLEAR_GPR macro to use movhi for clearing.

---
 arch/openrisc/kernel/head.S | 5 ++++-
 1 file changed, 4 insertions(+), 1 deletion(-)
arch/openrisc/kernel/head.S +4 -1
index 573e131..e8a1784 100644
@@ -35,7 +35,7 @@
 	l.add	rd,rd,rs
 
 #define CLEAR_GPR(gpr)				\
-	l.or    gpr,r0,r0
+	l.movhi	gpr,0x0
 
 #define LOAD_SYMBOL_2_GPR(gpr,symbol)		\
 	l.movhi gpr,hi(symbol)			;\
@@ -443,6 +443,9 @@ _dispatch_do_ipage_fault:
 	__HEAD
 	.global _start
 _start:
+	/* Init r0 to zero as per spec */
+	CLEAR_GPR(r0)
+
 	/* save kernel parameters */
 	l.or	r25,r0,r3	/* pointer to fdt */
 
Signature · 1 line
2.9.3
maintainer
#44 lore raw

Re: [PATCH v4 24/24] openrisc: head: Init r0 to 0 on start

Quoted 6 lines · Stafford Horne

Originally openrisc spec 0 specified that r0 would be wired to ground. This is no longer the case. r0 is not guaranteed to be 0 at init, so we need to initialize it to 0 before using it.

Also, if we are clearing r0 we cant use r0 to clear itself. Change the the CLEAR_GPR macro to use movhi for clearing.

Use the Reported-by: tag here since you are taking the time to mention him in the summary mail.

Reported-by Jakob...
Quoted 28 lines
---
  arch/openrisc/kernel/head.S | 5 ++++-
  1 file changed, 4 insertions(+), 1 deletion(-)
arch/openrisc/kernel/head.S +4 -1
index 573e131..e8a1784 100644
@@ -35,7 +35,7 @@
  	l.add	rd,rd,rs
 
  #define CLEAR_GPR(gpr)				\
-	l.or    gpr,r0,r0
+	l.movhi	gpr,0x0
 
  #define LOAD_SYMBOL_2_GPR(gpr,symbol)		\
  	l.movhi gpr,hi(symbol)			;\
@@ -443,6 +443,9 @@ _dispatch_do_ipage_fault:
  	__HEAD
  	.global _start
  _start:
+	/* Init r0 to zero as per spec */
+	CLEAR_GPR(r0)
+
  	/* save kernel parameters */
  	l.or	r25,r0,r3	/* pointer to fdt */
 
author maintainer
#45 lore raw

Re: [PATCH v4 24/24] openrisc: head: Init r0 to 0 on start

Quoted 10 lines · Jonas Bonn
Quoted 6 lines · Stafford Horne

Originally openrisc spec 0 specified that r0 would be wired to ground. This is no longer the case. r0 is not guaranteed to be 0 at init, so we need to initialize it to 0 before using it.

Also, if we are clearing r0 we cant use r0 to clear itself. Change the the CLEAR_GPR macro to use movhi for clearing.

Use the Reported-by: tag here since you are taking the time to mention him in the summary mail.

Right, added.

Thanks.

Quoted 28 lines
Reported-by Jakob...
Quoted 25 lines
---
  arch/openrisc/kernel/head.S | 5 ++++-
  1 file changed, 4 insertions(+), 1 deletion(-)
arch/openrisc/kernel/head.S +4 -1
index 573e131..e8a1784 100644
@@ -35,7 +35,7 @@
  	l.add	rd,rd,rs
  #define CLEAR_GPR(gpr)				\
-	l.or    gpr,r0,r0
+	l.movhi	gpr,0x0
  #define LOAD_SYMBOL_2_GPR(gpr,symbol)		\
  	l.movhi gpr,hi(symbol)			;\
@@ -443,6 +443,9 @@ _dispatch_do_ipage_fault:
  	__HEAD
  	.global _start
  _start:
+	/* Init r0 to zero as per spec */
+	CLEAR_GPR(r0)
+
  	/* save kernel parameters */
  	l.or	r25,r0,r3	/* pointer to fdt */