Commit 0a23ea65 authored by Linus Torvalds's avatar Linus Torvalds

Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/sparc

Pull sparc fixes from David Miller:

 - block interrupts properly across the entire MMU context change (both
   the hw MMU context change and the TSB table change) so that we don't
   get a perf event interrupt in the middle. From Rob Gardner.

 - be sure to register hugepages early enough, from Nitin Gupta.

 - UltraSPARC-III user copy exception handling would return garbage for
   the copied length in some circumstances.

* git://git.kernel.org/pub/scm/linux/kernel/git/davem/sparc:
  sparc64: Fix exception handling in UltraSPARC-III memcpy.
  sbus: Convert to using %pOF instead of full_name
  sparc: defconfig: Cleanup from old Kconfig options
  sparc64: Register hugepages during arch init
  sparc64: Prevent perf from running during super critical sections
parents c63716ab 0ede1c40
CONFIG_EXPERIMENTAL=y
CONFIG_SYSVIPC=y CONFIG_SYSVIPC=y
CONFIG_POSIX_MQUEUE=y CONFIG_POSIX_MQUEUE=y
CONFIG_LOG_BUF_SHIFT=14 CONFIG_LOG_BUF_SHIFT=14
...@@ -23,7 +22,6 @@ CONFIG_IP_PNP_DHCP=y ...@@ -23,7 +22,6 @@ CONFIG_IP_PNP_DHCP=y
CONFIG_INET_AH=y CONFIG_INET_AH=y
CONFIG_INET_ESP=y CONFIG_INET_ESP=y
CONFIG_INET_IPCOMP=y CONFIG_INET_IPCOMP=y
# CONFIG_INET_LRO is not set
CONFIG_INET6_AH=m CONFIG_INET6_AH=m
CONFIG_INET6_ESP=m CONFIG_INET6_ESP=m
CONFIG_INET6_IPCOMP=m CONFIG_INET6_IPCOMP=m
...@@ -69,7 +67,6 @@ CONFIG_EXT2_FS=y ...@@ -69,7 +67,6 @@ CONFIG_EXT2_FS=y
CONFIG_EXT2_FS_XATTR=y CONFIG_EXT2_FS_XATTR=y
CONFIG_EXT2_FS_POSIX_ACL=y CONFIG_EXT2_FS_POSIX_ACL=y
CONFIG_EXT2_FS_SECURITY=y CONFIG_EXT2_FS_SECURITY=y
CONFIG_AUTOFS_FS=m
CONFIG_AUTOFS4_FS=m CONFIG_AUTOFS4_FS=m
CONFIG_ISO9660_FS=m CONFIG_ISO9660_FS=m
CONFIG_PROC_KCORE=y CONFIG_PROC_KCORE=y
...@@ -82,7 +79,6 @@ CONFIG_NLS=y ...@@ -82,7 +79,6 @@ CONFIG_NLS=y
CONFIG_DEBUG_KERNEL=y CONFIG_DEBUG_KERNEL=y
CONFIG_DETECT_HUNG_TASK=y CONFIG_DETECT_HUNG_TASK=y
# CONFIG_SCHED_DEBUG is not set # CONFIG_SCHED_DEBUG is not set
# CONFIG_RCU_CPU_STALL_DETECTOR is not set
CONFIG_KGDB=y CONFIG_KGDB=y
CONFIG_KGDB_TESTS=y CONFIG_KGDB_TESTS=y
CONFIG_CRYPTO_NULL=m CONFIG_CRYPTO_NULL=m
......
CONFIG_64BIT=y CONFIG_64BIT=y
CONFIG_EXPERIMENTAL=y
# CONFIG_LOCALVERSION_AUTO is not set # CONFIG_LOCALVERSION_AUTO is not set
CONFIG_SYSVIPC=y CONFIG_SYSVIPC=y
CONFIG_POSIX_MQUEUE=y CONFIG_POSIX_MQUEUE=y
...@@ -184,7 +183,6 @@ CONFIG_HID_TOPSEED=y ...@@ -184,7 +183,6 @@ CONFIG_HID_TOPSEED=y
CONFIG_HID_THRUSTMASTER=y CONFIG_HID_THRUSTMASTER=y
CONFIG_HID_ZEROPLUS=y CONFIG_HID_ZEROPLUS=y
CONFIG_USB=y CONFIG_USB=y
# CONFIG_USB_DEVICE_CLASS is not set
CONFIG_USB_EHCI_HCD=m CONFIG_USB_EHCI_HCD=m
# CONFIG_USB_EHCI_TT_NEWSCHED is not set # CONFIG_USB_EHCI_TT_NEWSCHED is not set
CONFIG_USB_OHCI_HCD=y CONFIG_USB_OHCI_HCD=y
...@@ -210,8 +208,6 @@ CONFIG_LOCKUP_DETECTOR=y ...@@ -210,8 +208,6 @@ CONFIG_LOCKUP_DETECTOR=y
CONFIG_DETECT_HUNG_TASK=y CONFIG_DETECT_HUNG_TASK=y
# CONFIG_SCHED_DEBUG is not set # CONFIG_SCHED_DEBUG is not set
CONFIG_SCHEDSTATS=y CONFIG_SCHEDSTATS=y
# CONFIG_RCU_CPU_STALL_DETECTOR is not set
CONFIG_SYSCTL_SYSCALL_CHECK=y
CONFIG_BLK_DEV_IO_TRACE=y CONFIG_BLK_DEV_IO_TRACE=y
CONFIG_UPROBE_EVENTS=y CONFIG_UPROBE_EVENTS=y
CONFIG_KEYS=y CONFIG_KEYS=y
......
...@@ -27,9 +27,11 @@ void destroy_context(struct mm_struct *mm); ...@@ -27,9 +27,11 @@ void destroy_context(struct mm_struct *mm);
void __tsb_context_switch(unsigned long pgd_pa, void __tsb_context_switch(unsigned long pgd_pa,
struct tsb_config *tsb_base, struct tsb_config *tsb_base,
struct tsb_config *tsb_huge, struct tsb_config *tsb_huge,
unsigned long tsb_descr_pa); unsigned long tsb_descr_pa,
unsigned long secondary_ctx);
static inline void tsb_context_switch(struct mm_struct *mm) static inline void tsb_context_switch_ctx(struct mm_struct *mm,
unsigned long ctx)
{ {
__tsb_context_switch(__pa(mm->pgd), __tsb_context_switch(__pa(mm->pgd),
&mm->context.tsb_block[MM_TSB_BASE], &mm->context.tsb_block[MM_TSB_BASE],
...@@ -40,9 +42,12 @@ static inline void tsb_context_switch(struct mm_struct *mm) ...@@ -40,9 +42,12 @@ static inline void tsb_context_switch(struct mm_struct *mm)
#else #else
NULL NULL
#endif #endif
, __pa(&mm->context.tsb_descr[MM_TSB_BASE])); , __pa(&mm->context.tsb_descr[MM_TSB_BASE]),
ctx);
} }
#define tsb_context_switch(X) tsb_context_switch_ctx(X, 0)
void tsb_grow(struct mm_struct *mm, void tsb_grow(struct mm_struct *mm,
unsigned long tsb_index, unsigned long tsb_index,
unsigned long mm_rss); unsigned long mm_rss);
...@@ -112,8 +117,7 @@ static inline void switch_mm(struct mm_struct *old_mm, struct mm_struct *mm, str ...@@ -112,8 +117,7 @@ static inline void switch_mm(struct mm_struct *old_mm, struct mm_struct *mm, str
* cpu0 to update it's TSB because at that point the cpu_vm_mask * cpu0 to update it's TSB because at that point the cpu_vm_mask
* only had cpu1 set in it. * only had cpu1 set in it.
*/ */
load_secondary_context(mm); tsb_context_switch_ctx(mm, CTX_HWBITS(mm->context));
tsb_context_switch(mm);
/* Any time a processor runs a context on an address space /* Any time a processor runs a context on an address space
* for the first time, we must flush that context out of the * for the first time, we must flush that context out of the
......
...@@ -360,6 +360,7 @@ tsb_flush: ...@@ -360,6 +360,7 @@ tsb_flush:
* %o1: TSB base config pointer * %o1: TSB base config pointer
* %o2: TSB huge config pointer, or NULL if none * %o2: TSB huge config pointer, or NULL if none
* %o3: Hypervisor TSB descriptor physical address * %o3: Hypervisor TSB descriptor physical address
* %o4: Secondary context to load, if non-zero
* *
* We have to run this whole thing with interrupts * We have to run this whole thing with interrupts
* disabled so that the current cpu doesn't change * disabled so that the current cpu doesn't change
...@@ -372,6 +373,17 @@ __tsb_context_switch: ...@@ -372,6 +373,17 @@ __tsb_context_switch:
rdpr %pstate, %g1 rdpr %pstate, %g1
wrpr %g1, PSTATE_IE, %pstate wrpr %g1, PSTATE_IE, %pstate
brz,pn %o4, 1f
mov SECONDARY_CONTEXT, %o5
661: stxa %o4, [%o5] ASI_DMMU
.section .sun4v_1insn_patch, "ax"
.word 661b
stxa %o4, [%o5] ASI_MMU
.previous
flush %g6
1:
TRAP_LOAD_TRAP_BLOCK(%g2, %g3) TRAP_LOAD_TRAP_BLOCK(%g2, %g3)
stx %o0, [%g2 + TRAP_PER_CPU_PGD_PADDR] stx %o0, [%g2 + TRAP_PER_CPU_PGD_PADDR]
......
...@@ -145,13 +145,13 @@ ENDPROC(U3_retl_o2_plus_GS_plus_0x08) ...@@ -145,13 +145,13 @@ ENDPROC(U3_retl_o2_plus_GS_plus_0x08)
ENTRY(U3_retl_o2_and_7_plus_GS) ENTRY(U3_retl_o2_and_7_plus_GS)
and %o2, 7, %o2 and %o2, 7, %o2
retl retl
add %o2, GLOBAL_SPARE, %o2 add %o2, GLOBAL_SPARE, %o0
ENDPROC(U3_retl_o2_and_7_plus_GS) ENDPROC(U3_retl_o2_and_7_plus_GS)
ENTRY(U3_retl_o2_and_7_plus_GS_plus_8) ENTRY(U3_retl_o2_and_7_plus_GS_plus_8)
add GLOBAL_SPARE, 8, GLOBAL_SPARE add GLOBAL_SPARE, 8, GLOBAL_SPARE
and %o2, 7, %o2 and %o2, 7, %o2
retl retl
add %o2, GLOBAL_SPARE, %o2 add %o2, GLOBAL_SPARE, %o0
ENDPROC(U3_retl_o2_and_7_plus_GS_plus_8) ENDPROC(U3_retl_o2_and_7_plus_GS_plus_8)
#endif #endif
......
...@@ -325,6 +325,29 @@ static void __update_mmu_tsb_insert(struct mm_struct *mm, unsigned long tsb_inde ...@@ -325,6 +325,29 @@ static void __update_mmu_tsb_insert(struct mm_struct *mm, unsigned long tsb_inde
} }
#ifdef CONFIG_HUGETLB_PAGE #ifdef CONFIG_HUGETLB_PAGE
static void __init add_huge_page_size(unsigned long size)
{
unsigned int order;
if (size_to_hstate(size))
return;
order = ilog2(size) - PAGE_SHIFT;
hugetlb_add_hstate(order);
}
static int __init hugetlbpage_init(void)
{
add_huge_page_size(1UL << HPAGE_64K_SHIFT);
add_huge_page_size(1UL << HPAGE_SHIFT);
add_huge_page_size(1UL << HPAGE_256MB_SHIFT);
add_huge_page_size(1UL << HPAGE_2GB_SHIFT);
return 0;
}
arch_initcall(hugetlbpage_init);
static int __init setup_hugepagesz(char *string) static int __init setup_hugepagesz(char *string)
{ {
unsigned long long hugepage_size; unsigned long long hugepage_size;
...@@ -364,7 +387,7 @@ static int __init setup_hugepagesz(char *string) ...@@ -364,7 +387,7 @@ static int __init setup_hugepagesz(char *string)
goto out; goto out;
} }
hugetlb_add_hstate(hugepage_shift - PAGE_SHIFT); add_huge_page_size(hugepage_size);
rc = 1; rc = 1;
out: out:
......
...@@ -35,6 +35,5 @@ void restore_processor_state(void) ...@@ -35,6 +35,5 @@ void restore_processor_state(void)
{ {
struct mm_struct *mm = current->active_mm; struct mm_struct *mm = current->active_mm;
load_secondary_context(mm); tsb_context_switch_ctx(mm, CTX_HWBITS(mm->context));
tsb_context_switch(mm);
} }
...@@ -212,8 +212,8 @@ static int d7s_probe(struct platform_device *op) ...@@ -212,8 +212,8 @@ static int d7s_probe(struct platform_device *op)
writeb(regs, p->regs); writeb(regs, p->regs);
printk(KERN_INFO PFX "7-Segment Display%s at [%s:0x%llx] %s\n", printk(KERN_INFO PFX "7-Segment Display%pOF at [%s:0x%llx] %s\n",
op->dev.of_node->full_name, op->dev.of_node,
(regs & D7S_FLIP) ? " (FLIPPED)" : "", (regs & D7S_FLIP) ? " (FLIPPED)" : "",
op->resource[0].start, op->resource[0].start,
sol_compat ? "in sol_compat mode" : ""); sol_compat ? "in sol_compat mode" : "");
......
...@@ -181,8 +181,8 @@ static int flash_probe(struct platform_device *op) ...@@ -181,8 +181,8 @@ static int flash_probe(struct platform_device *op)
} }
flash.busy = 0; flash.busy = 0;
printk(KERN_INFO "%s: OBP Flash, RD %lx[%lx] WR %lx[%lx]\n", printk(KERN_INFO "%pOF: OBP Flash, RD %lx[%lx] WR %lx[%lx]\n",
op->dev.of_node->full_name, op->dev.of_node,
flash.read_base, flash.read_size, flash.read_base, flash.read_size,
flash.write_base, flash.write_size); flash.write_base, flash.write_size);
......
...@@ -379,8 +379,8 @@ static int uctrl_probe(struct platform_device *op) ...@@ -379,8 +379,8 @@ static int uctrl_probe(struct platform_device *op)
} }
sbus_writel(UCTRL_INTR_RXNE_REQ|UCTRL_INTR_RXNE_MSK, &p->regs->uctrl_intr); sbus_writel(UCTRL_INTR_RXNE_REQ|UCTRL_INTR_RXNE_MSK, &p->regs->uctrl_intr);
printk(KERN_INFO "%s: uctrl regs[0x%p] (irq %d)\n", printk(KERN_INFO "%pOF: uctrl regs[0x%p] (irq %d)\n",
op->dev.of_node->full_name, p->regs, p->irq); op->dev.of_node, p->regs, p->irq);
uctrl_get_event_status(p); uctrl_get_event_status(p);
uctrl_get_external_status(p); uctrl_get_external_status(p);
......
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