Commit 3fb725c4 authored by Linus Torvalds's avatar Linus Torvalds

Merge branch 'upstream' of git://git.linux-mips.org/pub/scm/ralf/upstream-linus

Pull MIPS fixes from Ralf Baechle:
 "Another set of five fixes.  The most interesting one is a fix for race
  condition in the local_irq_disable() implementation used by .S code
  for pre-MIPS R2 processors only.  It leaves a race that's hard but not
  impossible to hit; the others fairly obvious"

* 'upstream' of git://git.linux-mips.org/pub/scm/ralf/upstream-linus:
  MIPS: Make local_irq_disable macro safe for non-Mipsr2
  MIPS: Octeon: Fix warning in of_device_alloc on cn3xxx
  MIPS: ftrace: Tweak safe_load()/safe_store() macros
  MIPS: BCM47XX: Check all (32) GPIOs when looking for a pin
  MIPS: Fix possible build error with transparent hugepages enabled
parents 92f99731 71ca7588
...@@ -1776,12 +1776,12 @@ endchoice ...@@ -1776,12 +1776,12 @@ endchoice
config FORCE_MAX_ZONEORDER config FORCE_MAX_ZONEORDER
int "Maximum zone order" int "Maximum zone order"
range 14 64 if HUGETLB_PAGE && PAGE_SIZE_64KB range 14 64 if MIPS_HUGE_TLB_SUPPORT && PAGE_SIZE_64KB
default "14" if HUGETLB_PAGE && PAGE_SIZE_64KB default "14" if MIPS_HUGE_TLB_SUPPORT && PAGE_SIZE_64KB
range 13 64 if HUGETLB_PAGE && PAGE_SIZE_32KB range 13 64 if MIPS_HUGE_TLB_SUPPORT && PAGE_SIZE_32KB
default "13" if HUGETLB_PAGE && PAGE_SIZE_32KB default "13" if MIPS_HUGE_TLB_SUPPORT && PAGE_SIZE_32KB
range 12 64 if HUGETLB_PAGE && PAGE_SIZE_16KB range 12 64 if MIPS_HUGE_TLB_SUPPORT && PAGE_SIZE_16KB
default "12" if HUGETLB_PAGE && PAGE_SIZE_16KB default "12" if MIPS_HUGE_TLB_SUPPORT && PAGE_SIZE_16KB
range 11 64 range 11 64
default "11" default "11"
help help
......
...@@ -196,7 +196,7 @@ int bcm47xx_nvram_gpio_pin(const char *name) ...@@ -196,7 +196,7 @@ int bcm47xx_nvram_gpio_pin(const char *name)
char nvram_var[10]; char nvram_var[10];
char buf[30]; char buf[30];
for (i = 0; i < 16; i++) { for (i = 0; i < 32; i++) {
err = snprintf(nvram_var, sizeof(nvram_var), "gpio%i", i); err = snprintf(nvram_var, sizeof(nvram_var), "gpio%i", i);
if (err <= 0) if (err <= 0)
continue; continue;
......
...@@ -975,10 +975,6 @@ static int octeon_irq_ciu_xlat(struct irq_domain *d, ...@@ -975,10 +975,6 @@ static int octeon_irq_ciu_xlat(struct irq_domain *d,
if (ciu > 1 || bit > 63) if (ciu > 1 || bit > 63)
return -EINVAL; return -EINVAL;
/* These are the GPIO lines */
if (ciu == 0 && bit >= 16 && bit < 32)
return -EINVAL;
*out_hwirq = (ciu << 6) | bit; *out_hwirq = (ciu << 6) | bit;
*out_type = 0; *out_type = 0;
...@@ -1007,6 +1003,10 @@ static int octeon_irq_ciu_map(struct irq_domain *d, ...@@ -1007,6 +1003,10 @@ static int octeon_irq_ciu_map(struct irq_domain *d,
if (!octeon_irq_virq_in_range(virq)) if (!octeon_irq_virq_in_range(virq))
return -EINVAL; return -EINVAL;
/* Don't map irq if it is reserved for GPIO. */
if (line == 0 && bit >= 16 && bit <32)
return 0;
if (line > 1 || octeon_irq_ciu_to_irq[line][bit] != 0) if (line > 1 || octeon_irq_ciu_to_irq[line][bit] != 0)
return -EINVAL; return -EINVAL;
...@@ -1525,10 +1525,6 @@ static int octeon_irq_ciu2_xlat(struct irq_domain *d, ...@@ -1525,10 +1525,6 @@ static int octeon_irq_ciu2_xlat(struct irq_domain *d,
ciu = intspec[0]; ciu = intspec[0];
bit = intspec[1]; bit = intspec[1];
/* Line 7 are the GPIO lines */
if (ciu > 6 || bit > 63)
return -EINVAL;
*out_hwirq = (ciu << 6) | bit; *out_hwirq = (ciu << 6) | bit;
*out_type = 0; *out_type = 0;
...@@ -1570,8 +1566,14 @@ static int octeon_irq_ciu2_map(struct irq_domain *d, ...@@ -1570,8 +1566,14 @@ static int octeon_irq_ciu2_map(struct irq_domain *d,
if (!octeon_irq_virq_in_range(virq)) if (!octeon_irq_virq_in_range(virq))
return -EINVAL; return -EINVAL;
/* Line 7 are the GPIO lines */ /*
if (line > 6 || octeon_irq_ciu_to_irq[line][bit] != 0) * Don't map irq if it is reserved for GPIO.
* (Line 7 are the GPIO lines.)
*/
if (line == 7)
return 0;
if (line > 7 || octeon_irq_ciu_to_irq[line][bit] != 0)
return -EINVAL; return -EINVAL;
if (octeon_irq_ciu2_is_edge(line, bit)) if (octeon_irq_ciu2_is_edge(line, bit))
......
...@@ -9,6 +9,7 @@ ...@@ -9,6 +9,7 @@
#define _ASM_ASMMACRO_H #define _ASM_ASMMACRO_H
#include <asm/hazards.h> #include <asm/hazards.h>
#include <asm/asm-offsets.h>
#ifdef CONFIG_32BIT #ifdef CONFIG_32BIT
#include <asm/asmmacro-32.h> #include <asm/asmmacro-32.h>
...@@ -54,11 +55,21 @@ ...@@ -54,11 +55,21 @@
.endm .endm
.macro local_irq_disable reg=t0 .macro local_irq_disable reg=t0
#ifdef CONFIG_PREEMPT
lw \reg, TI_PRE_COUNT($28)
addi \reg, \reg, 1
sw \reg, TI_PRE_COUNT($28)
#endif
mfc0 \reg, CP0_STATUS mfc0 \reg, CP0_STATUS
ori \reg, \reg, 1 ori \reg, \reg, 1
xori \reg, \reg, 1 xori \reg, \reg, 1
mtc0 \reg, CP0_STATUS mtc0 \reg, CP0_STATUS
irq_disable_hazard irq_disable_hazard
#ifdef CONFIG_PREEMPT
lw \reg, TI_PRE_COUNT($28)
addi \reg, \reg, -1
sw \reg, TI_PRE_COUNT($28)
#endif
.endm .endm
#endif /* CONFIG_MIPS_MT_SMTC */ #endif /* CONFIG_MIPS_MT_SMTC */
......
...@@ -22,12 +22,12 @@ extern void _mcount(void); ...@@ -22,12 +22,12 @@ extern void _mcount(void);
#define safe_load(load, src, dst, error) \ #define safe_load(load, src, dst, error) \
do { \ do { \
asm volatile ( \ asm volatile ( \
"1: " load " %[" STR(dst) "], 0(%[" STR(src) "])\n"\ "1: " load " %[tmp_dst], 0(%[tmp_src])\n" \
" li %[" STR(error) "], 0\n" \ " li %[tmp_err], 0\n" \
"2:\n" \ "2:\n" \
\ \
".section .fixup, \"ax\"\n" \ ".section .fixup, \"ax\"\n" \
"3: li %[" STR(error) "], 1\n" \ "3: li %[tmp_err], 1\n" \
" j 2b\n" \ " j 2b\n" \
".previous\n" \ ".previous\n" \
\ \
...@@ -35,8 +35,8 @@ do { \ ...@@ -35,8 +35,8 @@ do { \
STR(PTR) "\t1b, 3b\n\t" \ STR(PTR) "\t1b, 3b\n\t" \
".previous\n" \ ".previous\n" \
\ \
: [dst] "=&r" (dst), [error] "=r" (error)\ : [tmp_dst] "=&r" (dst), [tmp_err] "=r" (error)\
: [src] "r" (src) \ : [tmp_src] "r" (src) \
: "memory" \ : "memory" \
); \ ); \
} while (0) } while (0)
...@@ -44,12 +44,12 @@ do { \ ...@@ -44,12 +44,12 @@ do { \
#define safe_store(store, src, dst, error) \ #define safe_store(store, src, dst, error) \
do { \ do { \
asm volatile ( \ asm volatile ( \
"1: " store " %[" STR(src) "], 0(%[" STR(dst) "])\n"\ "1: " store " %[tmp_src], 0(%[tmp_dst])\n"\
" li %[" STR(error) "], 0\n" \ " li %[tmp_err], 0\n" \
"2:\n" \ "2:\n" \
\ \
".section .fixup, \"ax\"\n" \ ".section .fixup, \"ax\"\n" \
"3: li %[" STR(error) "], 1\n" \ "3: li %[tmp_err], 1\n" \
" j 2b\n" \ " j 2b\n" \
".previous\n" \ ".previous\n" \
\ \
...@@ -57,8 +57,8 @@ do { \ ...@@ -57,8 +57,8 @@ do { \
STR(PTR) "\t1b, 3b\n\t" \ STR(PTR) "\t1b, 3b\n\t" \
".previous\n" \ ".previous\n" \
\ \
: [error] "=r" (error) \ : [tmp_err] "=r" (error) \
: [dst] "r" (dst), [src] "r" (src)\ : [tmp_dst] "r" (dst), [tmp_src] "r" (src)\
: "memory" \ : "memory" \
); \ ); \
} while (0) } while (0)
......
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