diff options
author | Linus Torvalds <torvalds@linux-foundation.org> | 2018-01-05 19:06:35 -0500 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2018-01-05 19:06:35 -0500 |
commit | f84d595a5b6e11620a56db6c1cf0988834e6eb5b (patch) | |
tree | 7668f826cdc1359e599b0ad31c8771e1197f22b6 | |
parent | 89876f275e8d562912d9c238cd888b52065cf25c (diff) | |
parent | af1be2e21203867cb958aaceed5366e2e24b88e8 (diff) |
Merge tag 'arc-4.15-rc7' of git://git.kernel.org/pub/scm/linux/kernel/git/vgupta/arc
Pull ARC fixes from Vineet Gupta:
- platform updates for setting up clock correctly
- fixes to accomodate newer gcc (__builtin_trap, removed inline asm
modifier)
- other fixes
* tag 'arc-4.15-rc7' of git://git.kernel.org/pub/scm/linux/kernel/git/vgupta/arc:
ARC: handle gcc generated __builtin_trap for older compiler
ARC: handle gcc generated __builtin_trap()
ARC: uaccess: dont use "l" gcc inline asm constraint modifier
ARC: [plat-axs103] refactor the quad core DT quirk code
ARC: [plat-axs103]: Set initial core pll output frequency
ARC: [plat-hsdk]: Get rid of core pll frequency set in platform code
ARC: [plat-hsdk]: Set initial core pll output frequency
ARC: [plat-hsdk] Switch DisplayLink driver from fbdev to DRM
arc: do not use __print_symbol()
ARC: Fix detection of dual-issue enabled
-rw-r--r-- | arch/arc/boot/dts/axc003.dtsi | 8 | ||||
-rw-r--r-- | arch/arc/boot/dts/axc003_idu.dtsi | 8 | ||||
-rw-r--r-- | arch/arc/boot/dts/hsdk.dts | 8 | ||||
-rw-r--r-- | arch/arc/configs/hsdk_defconfig | 5 | ||||
-rw-r--r-- | arch/arc/include/asm/uaccess.h | 5 | ||||
-rw-r--r-- | arch/arc/kernel/setup.c | 2 | ||||
-rw-r--r-- | arch/arc/kernel/stacktrace.c | 2 | ||||
-rw-r--r-- | arch/arc/kernel/traps.c | 14 | ||||
-rw-r--r-- | arch/arc/kernel/troubleshoot.c | 3 | ||||
-rw-r--r-- | arch/arc/plat-axs10x/axs10x.c | 18 | ||||
-rw-r--r-- | arch/arc/plat-hsdk/platform.c | 42 |
11 files changed, 57 insertions, 58 deletions
diff --git a/arch/arc/boot/dts/axc003.dtsi b/arch/arc/boot/dts/axc003.dtsi index 4e6e9f57e790..dc91c663bcc0 100644 --- a/arch/arc/boot/dts/axc003.dtsi +++ b/arch/arc/boot/dts/axc003.dtsi | |||
@@ -35,6 +35,14 @@ | |||
35 | reg = <0x80 0x10>, <0x100 0x10>; | 35 | reg = <0x80 0x10>, <0x100 0x10>; |
36 | #clock-cells = <0>; | 36 | #clock-cells = <0>; |
37 | clocks = <&input_clk>; | 37 | clocks = <&input_clk>; |
38 | |||
39 | /* | ||
40 | * Set initial core pll output frequency to 90MHz. | ||
41 | * It will be applied at the core pll driver probing | ||
42 | * on early boot. | ||
43 | */ | ||
44 | assigned-clocks = <&core_clk>; | ||
45 | assigned-clock-rates = <90000000>; | ||
38 | }; | 46 | }; |
39 | 47 | ||
40 | core_intc: archs-intc@cpu { | 48 | core_intc: archs-intc@cpu { |
diff --git a/arch/arc/boot/dts/axc003_idu.dtsi b/arch/arc/boot/dts/axc003_idu.dtsi index 63954a8b0100..69ff4895f2ba 100644 --- a/arch/arc/boot/dts/axc003_idu.dtsi +++ b/arch/arc/boot/dts/axc003_idu.dtsi | |||
@@ -35,6 +35,14 @@ | |||
35 | reg = <0x80 0x10>, <0x100 0x10>; | 35 | reg = <0x80 0x10>, <0x100 0x10>; |
36 | #clock-cells = <0>; | 36 | #clock-cells = <0>; |
37 | clocks = <&input_clk>; | 37 | clocks = <&input_clk>; |
38 | |||
39 | /* | ||
40 | * Set initial core pll output frequency to 100MHz. | ||
41 | * It will be applied at the core pll driver probing | ||
42 | * on early boot. | ||
43 | */ | ||
44 | assigned-clocks = <&core_clk>; | ||
45 | assigned-clock-rates = <100000000>; | ||
38 | }; | 46 | }; |
39 | 47 | ||
40 | core_intc: archs-intc@cpu { | 48 | core_intc: archs-intc@cpu { |
diff --git a/arch/arc/boot/dts/hsdk.dts b/arch/arc/boot/dts/hsdk.dts index 8f627c200d60..006aa3de5348 100644 --- a/arch/arc/boot/dts/hsdk.dts +++ b/arch/arc/boot/dts/hsdk.dts | |||
@@ -114,6 +114,14 @@ | |||
114 | reg = <0x00 0x10>, <0x14B8 0x4>; | 114 | reg = <0x00 0x10>, <0x14B8 0x4>; |
115 | #clock-cells = <0>; | 115 | #clock-cells = <0>; |
116 | clocks = <&input_clk>; | 116 | clocks = <&input_clk>; |
117 | |||
118 | /* | ||
119 | * Set initial core pll output frequency to 1GHz. | ||
120 | * It will be applied at the core pll driver probing | ||
121 | * on early boot. | ||
122 | */ | ||
123 | assigned-clocks = <&core_clk>; | ||
124 | assigned-clock-rates = <1000000000>; | ||
117 | }; | 125 | }; |
118 | 126 | ||
119 | serial: serial@5000 { | 127 | serial: serial@5000 { |
diff --git a/arch/arc/configs/hsdk_defconfig b/arch/arc/configs/hsdk_defconfig index 7b8f8faf8a24..ac6b0ed8341e 100644 --- a/arch/arc/configs/hsdk_defconfig +++ b/arch/arc/configs/hsdk_defconfig | |||
@@ -49,10 +49,11 @@ CONFIG_SERIAL_8250_DW=y | |||
49 | CONFIG_SERIAL_OF_PLATFORM=y | 49 | CONFIG_SERIAL_OF_PLATFORM=y |
50 | # CONFIG_HW_RANDOM is not set | 50 | # CONFIG_HW_RANDOM is not set |
51 | # CONFIG_HWMON is not set | 51 | # CONFIG_HWMON is not set |
52 | CONFIG_DRM=y | ||
53 | # CONFIG_DRM_FBDEV_EMULATION is not set | ||
54 | CONFIG_DRM_UDL=y | ||
52 | CONFIG_FB=y | 55 | CONFIG_FB=y |
53 | CONFIG_FB_UDL=y | ||
54 | CONFIG_FRAMEBUFFER_CONSOLE=y | 56 | CONFIG_FRAMEBUFFER_CONSOLE=y |
55 | CONFIG_USB=y | ||
56 | CONFIG_USB_EHCI_HCD=y | 57 | CONFIG_USB_EHCI_HCD=y |
57 | CONFIG_USB_EHCI_HCD_PLATFORM=y | 58 | CONFIG_USB_EHCI_HCD_PLATFORM=y |
58 | CONFIG_USB_OHCI_HCD=y | 59 | CONFIG_USB_OHCI_HCD=y |
diff --git a/arch/arc/include/asm/uaccess.h b/arch/arc/include/asm/uaccess.h index f35974ee7264..c9173c02081c 100644 --- a/arch/arc/include/asm/uaccess.h +++ b/arch/arc/include/asm/uaccess.h | |||
@@ -668,6 +668,7 @@ __arc_strncpy_from_user(char *dst, const char __user *src, long count) | |||
668 | return 0; | 668 | return 0; |
669 | 669 | ||
670 | __asm__ __volatile__( | 670 | __asm__ __volatile__( |
671 | " mov lp_count, %5 \n" | ||
671 | " lp 3f \n" | 672 | " lp 3f \n" |
672 | "1: ldb.ab %3, [%2, 1] \n" | 673 | "1: ldb.ab %3, [%2, 1] \n" |
673 | " breq.d %3, 0, 3f \n" | 674 | " breq.d %3, 0, 3f \n" |
@@ -684,8 +685,8 @@ __arc_strncpy_from_user(char *dst, const char __user *src, long count) | |||
684 | " .word 1b, 4b \n" | 685 | " .word 1b, 4b \n" |
685 | " .previous \n" | 686 | " .previous \n" |
686 | : "+r"(res), "+r"(dst), "+r"(src), "=r"(val) | 687 | : "+r"(res), "+r"(dst), "+r"(src), "=r"(val) |
687 | : "g"(-EFAULT), "l"(count) | 688 | : "g"(-EFAULT), "r"(count) |
688 | : "memory"); | 689 | : "lp_count", "lp_start", "lp_end", "memory"); |
689 | 690 | ||
690 | return res; | 691 | return res; |
691 | } | 692 | } |
diff --git a/arch/arc/kernel/setup.c b/arch/arc/kernel/setup.c index 7ef7d9a8ff89..9d27331fe69a 100644 --- a/arch/arc/kernel/setup.c +++ b/arch/arc/kernel/setup.c | |||
@@ -199,7 +199,7 @@ static void read_arc_build_cfg_regs(void) | |||
199 | unsigned int exec_ctrl; | 199 | unsigned int exec_ctrl; |
200 | 200 | ||
201 | READ_BCR(AUX_EXEC_CTRL, exec_ctrl); | 201 | READ_BCR(AUX_EXEC_CTRL, exec_ctrl); |
202 | cpu->extn.dual_enb = exec_ctrl & 1; | 202 | cpu->extn.dual_enb = !(exec_ctrl & 1); |
203 | 203 | ||
204 | /* dual issue always present for this core */ | 204 | /* dual issue always present for this core */ |
205 | cpu->extn.dual = 1; | 205 | cpu->extn.dual = 1; |
diff --git a/arch/arc/kernel/stacktrace.c b/arch/arc/kernel/stacktrace.c index 74315f302971..bf40e06f3fb8 100644 --- a/arch/arc/kernel/stacktrace.c +++ b/arch/arc/kernel/stacktrace.c | |||
@@ -163,7 +163,7 @@ arc_unwind_core(struct task_struct *tsk, struct pt_regs *regs, | |||
163 | */ | 163 | */ |
164 | static int __print_sym(unsigned int address, void *unused) | 164 | static int __print_sym(unsigned int address, void *unused) |
165 | { | 165 | { |
166 | __print_symbol(" %s\n", address); | 166 | printk(" %pS\n", (void *)address); |
167 | return 0; | 167 | return 0; |
168 | } | 168 | } |
169 | 169 | ||
diff --git a/arch/arc/kernel/traps.c b/arch/arc/kernel/traps.c index bcd7c9fc5d0f..133a4dae41fe 100644 --- a/arch/arc/kernel/traps.c +++ b/arch/arc/kernel/traps.c | |||
@@ -83,6 +83,7 @@ DO_ERROR_INFO(SIGILL, "Illegal Insn (or Seq)", insterror_is_error, ILL_ILLOPC) | |||
83 | DO_ERROR_INFO(SIGBUS, "Invalid Mem Access", __weak do_memory_error, BUS_ADRERR) | 83 | DO_ERROR_INFO(SIGBUS, "Invalid Mem Access", __weak do_memory_error, BUS_ADRERR) |
84 | DO_ERROR_INFO(SIGTRAP, "Breakpoint Set", trap_is_brkpt, TRAP_BRKPT) | 84 | DO_ERROR_INFO(SIGTRAP, "Breakpoint Set", trap_is_brkpt, TRAP_BRKPT) |
85 | DO_ERROR_INFO(SIGBUS, "Misaligned Access", do_misaligned_error, BUS_ADRALN) | 85 | DO_ERROR_INFO(SIGBUS, "Misaligned Access", do_misaligned_error, BUS_ADRALN) |
86 | DO_ERROR_INFO(SIGSEGV, "gcc generated __builtin_trap", do_trap5_error, 0) | ||
86 | 87 | ||
87 | /* | 88 | /* |
88 | * Entry Point for Misaligned Data access Exception, for emulating in software | 89 | * Entry Point for Misaligned Data access Exception, for emulating in software |
@@ -115,6 +116,8 @@ void do_machine_check_fault(unsigned long address, struct pt_regs *regs) | |||
115 | * Thus TRAP_S <n> can be used for specific purpose | 116 | * Thus TRAP_S <n> can be used for specific purpose |
116 | * -1 used for software breakpointing (gdb) | 117 | * -1 used for software breakpointing (gdb) |
117 | * -2 used by kprobes | 118 | * -2 used by kprobes |
119 | * -5 __builtin_trap() generated by gcc (2018.03 onwards) for toggle such as | ||
120 | * -fno-isolate-erroneous-paths-dereference | ||
118 | */ | 121 | */ |
119 | void do_non_swi_trap(unsigned long address, struct pt_regs *regs) | 122 | void do_non_swi_trap(unsigned long address, struct pt_regs *regs) |
120 | { | 123 | { |
@@ -134,6 +137,9 @@ void do_non_swi_trap(unsigned long address, struct pt_regs *regs) | |||
134 | kgdb_trap(regs); | 137 | kgdb_trap(regs); |
135 | break; | 138 | break; |
136 | 139 | ||
140 | case 5: | ||
141 | do_trap5_error(address, regs); | ||
142 | break; | ||
137 | default: | 143 | default: |
138 | break; | 144 | break; |
139 | } | 145 | } |
@@ -155,3 +161,11 @@ void do_insterror_or_kprobe(unsigned long address, struct pt_regs *regs) | |||
155 | 161 | ||
156 | insterror_is_error(address, regs); | 162 | insterror_is_error(address, regs); |
157 | } | 163 | } |
164 | |||
165 | /* | ||
166 | * abort() call generated by older gcc for __builtin_trap() | ||
167 | */ | ||
168 | void abort(void) | ||
169 | { | ||
170 | __asm__ __volatile__("trap_s 5\n"); | ||
171 | } | ||
diff --git a/arch/arc/kernel/troubleshoot.c b/arch/arc/kernel/troubleshoot.c index 7d8c1d6c2f60..6e9a0a9a6a04 100644 --- a/arch/arc/kernel/troubleshoot.c +++ b/arch/arc/kernel/troubleshoot.c | |||
@@ -163,6 +163,9 @@ static void show_ecr_verbose(struct pt_regs *regs) | |||
163 | else | 163 | else |
164 | pr_cont("Bus Error, check PRM\n"); | 164 | pr_cont("Bus Error, check PRM\n"); |
165 | #endif | 165 | #endif |
166 | } else if (vec == ECR_V_TRAP) { | ||
167 | if (regs->ecr_param == 5) | ||
168 | pr_cont("gcc generated __builtin_trap\n"); | ||
166 | } else { | 169 | } else { |
167 | pr_cont("Check Programmer's Manual\n"); | 170 | pr_cont("Check Programmer's Manual\n"); |
168 | } | 171 | } |
diff --git a/arch/arc/plat-axs10x/axs10x.c b/arch/arc/plat-axs10x/axs10x.c index f1ac6790da5f..46544e88492d 100644 --- a/arch/arc/plat-axs10x/axs10x.c +++ b/arch/arc/plat-axs10x/axs10x.c | |||
@@ -317,25 +317,23 @@ static void __init axs103_early_init(void) | |||
317 | * Instead of duplicating defconfig/DT for SMP/QUAD, add a small hack | 317 | * Instead of duplicating defconfig/DT for SMP/QUAD, add a small hack |
318 | * of fudging the freq in DT | 318 | * of fudging the freq in DT |
319 | */ | 319 | */ |
320 | #define AXS103_QUAD_CORE_CPU_FREQ_HZ 50000000 | ||
321 | |||
320 | unsigned int num_cores = (read_aux_reg(ARC_REG_MCIP_BCR) >> 16) & 0x3F; | 322 | unsigned int num_cores = (read_aux_reg(ARC_REG_MCIP_BCR) >> 16) & 0x3F; |
321 | if (num_cores > 2) { | 323 | if (num_cores > 2) { |
322 | u32 freq = 50, orig; | 324 | u32 freq; |
323 | /* | ||
324 | * TODO: use cpu node "cpu-freq" param instead of platform-specific | ||
325 | * "/cpu_card/core_clk" as it works only if we use fixed-clock for cpu. | ||
326 | */ | ||
327 | int off = fdt_path_offset(initial_boot_params, "/cpu_card/core_clk"); | 325 | int off = fdt_path_offset(initial_boot_params, "/cpu_card/core_clk"); |
328 | const struct fdt_property *prop; | 326 | const struct fdt_property *prop; |
329 | 327 | ||
330 | prop = fdt_get_property(initial_boot_params, off, | 328 | prop = fdt_get_property(initial_boot_params, off, |
331 | "clock-frequency", NULL); | 329 | "assigned-clock-rates", NULL); |
332 | orig = be32_to_cpu(*(u32*)(prop->data)) / 1000000; | 330 | freq = be32_to_cpu(*(u32 *)(prop->data)); |
333 | 331 | ||
334 | /* Patching .dtb in-place with new core clock value */ | 332 | /* Patching .dtb in-place with new core clock value */ |
335 | if (freq != orig ) { | 333 | if (freq != AXS103_QUAD_CORE_CPU_FREQ_HZ) { |
336 | freq = cpu_to_be32(freq * 1000000); | 334 | freq = cpu_to_be32(AXS103_QUAD_CORE_CPU_FREQ_HZ); |
337 | fdt_setprop_inplace(initial_boot_params, off, | 335 | fdt_setprop_inplace(initial_boot_params, off, |
338 | "clock-frequency", &freq, sizeof(freq)); | 336 | "assigned-clock-rates", &freq, sizeof(freq)); |
339 | } | 337 | } |
340 | } | 338 | } |
341 | #endif | 339 | #endif |
diff --git a/arch/arc/plat-hsdk/platform.c b/arch/arc/plat-hsdk/platform.c index fd0ae5e38639..2958aedb649a 100644 --- a/arch/arc/plat-hsdk/platform.c +++ b/arch/arc/plat-hsdk/platform.c | |||
@@ -38,42 +38,6 @@ static void __init hsdk_init_per_cpu(unsigned int cpu) | |||
38 | #define CREG_PAE (CREG_BASE + 0x180) | 38 | #define CREG_PAE (CREG_BASE + 0x180) |
39 | #define CREG_PAE_UPDATE (CREG_BASE + 0x194) | 39 | #define CREG_PAE_UPDATE (CREG_BASE + 0x194) |
40 | 40 | ||
41 | #define CREG_CORE_IF_CLK_DIV (CREG_BASE + 0x4B8) | ||
42 | #define CREG_CORE_IF_CLK_DIV_2 0x1 | ||
43 | #define CGU_BASE ARC_PERIPHERAL_BASE | ||
44 | #define CGU_PLL_STATUS (ARC_PERIPHERAL_BASE + 0x4) | ||
45 | #define CGU_PLL_CTRL (ARC_PERIPHERAL_BASE + 0x0) | ||
46 | #define CGU_PLL_STATUS_LOCK BIT(0) | ||
47 | #define CGU_PLL_STATUS_ERR BIT(1) | ||
48 | #define CGU_PLL_CTRL_1GHZ 0x3A10 | ||
49 | #define HSDK_PLL_LOCK_TIMEOUT 500 | ||
50 | |||
51 | #define HSDK_PLL_LOCKED() \ | ||
52 | !!(ioread32((void __iomem *) CGU_PLL_STATUS) & CGU_PLL_STATUS_LOCK) | ||
53 | |||
54 | #define HSDK_PLL_ERR() \ | ||
55 | !!(ioread32((void __iomem *) CGU_PLL_STATUS) & CGU_PLL_STATUS_ERR) | ||
56 | |||
57 | static void __init hsdk_set_cpu_freq_1ghz(void) | ||
58 | { | ||
59 | u32 timeout = HSDK_PLL_LOCK_TIMEOUT; | ||
60 | |||
61 | /* | ||
62 | * As we set cpu clock which exceeds 500MHz, the divider for the interface | ||
63 | * clock must be programmed to div-by-2. | ||
64 | */ | ||
65 | iowrite32(CREG_CORE_IF_CLK_DIV_2, (void __iomem *) CREG_CORE_IF_CLK_DIV); | ||
66 | |||
67 | /* Set cpu clock to 1GHz */ | ||
68 | iowrite32(CGU_PLL_CTRL_1GHZ, (void __iomem *) CGU_PLL_CTRL); | ||
69 | |||
70 | while (!HSDK_PLL_LOCKED() && timeout--) | ||
71 | cpu_relax(); | ||
72 | |||
73 | if (!HSDK_PLL_LOCKED() || HSDK_PLL_ERR()) | ||
74 | pr_err("Failed to setup CPU frequency to 1GHz!"); | ||
75 | } | ||
76 | |||
77 | #define SDIO_BASE (ARC_PERIPHERAL_BASE + 0xA000) | 41 | #define SDIO_BASE (ARC_PERIPHERAL_BASE + 0xA000) |
78 | #define SDIO_UHS_REG_EXT (SDIO_BASE + 0x108) | 42 | #define SDIO_UHS_REG_EXT (SDIO_BASE + 0x108) |
79 | #define SDIO_UHS_REG_EXT_DIV_2 (2 << 30) | 43 | #define SDIO_UHS_REG_EXT_DIV_2 (2 << 30) |
@@ -98,12 +62,6 @@ static void __init hsdk_init_early(void) | |||
98 | * minimum possible div-by-2. | 62 | * minimum possible div-by-2. |
99 | */ | 63 | */ |
100 | iowrite32(SDIO_UHS_REG_EXT_DIV_2, (void __iomem *) SDIO_UHS_REG_EXT); | 64 | iowrite32(SDIO_UHS_REG_EXT_DIV_2, (void __iomem *) SDIO_UHS_REG_EXT); |
101 | |||
102 | /* | ||
103 | * Setup CPU frequency to 1GHz. | ||
104 | * TODO: remove it after smart hsdk pll driver will be introduced. | ||
105 | */ | ||
106 | hsdk_set_cpu_freq_1ghz(); | ||
107 | } | 65 | } |
108 | 66 | ||
109 | static const char *hsdk_compat[] __initconst = { | 67 | static const char *hsdk_compat[] __initconst = { |