diff options
| author | Linus Torvalds <torvalds@linux-foundation.org> | 2018-04-10 14:39:22 -0400 |
|---|---|---|
| committer | Linus Torvalds <torvalds@linux-foundation.org> | 2018-04-10 14:39:22 -0400 |
| commit | 948869fa9f391664cfe008fa9968a1110bfd14fd (patch) | |
| tree | 8cab813f6064d9bfa03fdfe6524277ca41e65305 /arch/mips/kernel | |
| parent | 2a56bb596b2c1fb612f9988afda9655c8c872a6e (diff) | |
| parent | a5075e6226c42a8e64ea1b862eec7747dc46cb32 (diff) | |
Merge tag 'mips_4.17' of git://git.kernel.org/pub/scm/linux/kernel/git/jhogan/mips
Pull MIPS updates from James Hogan:
"These are the main MIPS changes for 4.17. Rough overview:
(1) generic platform: Add support for Microsemi Ocelot SoCs
(2) crypto: Add CRC32 and CRC32C HW acceleration module
(3) Various cleanups and misc improvements
More detailed summary:
Miscellaneous:
- hang more efficiently on halt/powerdown/restart
- pm-cps: Block system suspend when a JTAG probe is present
- expand make help text for generic defconfigs
- refactor handling of legacy defconfigs
- determine the entry point from the ELF file header to fix microMIPS
for certain toolchains
- introduce isa-rev.h for MIPS_ISA_REV and use to simplify other code
Minor cleanups:
- DTS: boston/ci20: Unit name cleanups and correction
- kdump: Make the default for PHYSICAL_START always 64-bit
- constify gpio_led in Alchemy, AR7, and TXX9
- silence a couple of W=1 warnings
- remove duplicate includes
Platform support:
Generic platform:
- add support for Microsemi Ocelot
- dt-bindings: Add vendor prefix for Microsemi Corporation
- dt-bindings: Add bindings for Microsemi SoCs
- add ocelot SoC & PCB123 board DTS files
- MAINTAINERS: Add entry for Microsemi MIPS SoCs
- enable crc32-mips on r6 configs
ath79:
- fix AR724X_PLL_REG_PCIE_CONFIG offset
BCM47xx:
- firmware: Use mac_pton() for MAC address parsing
- add Luxul XAP1500/XWR1750 WiFi LEDs
- use standard reset button for Luxul XWR-1750
BMIPS:
- enable CONFIG_BRCMSTB_PM in bmips_stb_defconfig for build coverage
- add STB PM, wake-up timer, watchdog DT nodes
Octeon:
- drop '.' after newlines in printk calls
ralink:
- pci-mt7621: Enable PCIe on MT7688"
* tag 'mips_4.17' of git://git.kernel.org/pub/scm/linux/kernel/git/jhogan/mips: (37 commits)
MIPS: BCM47XX: Use standard reset button for Luxul XWR-1750
MIPS: BCM47XX: Add Luxul XAP1500/XWR1750 WiFi LEDs
MIPS: Make the default for PHYSICAL_START always 64-bit
MIPS: Use the entry point from the ELF file header
MAINTAINERS: Add entry for Microsemi MIPS SoCs
MIPS: generic: Add support for Microsemi Ocelot
MIPS: mscc: Add ocelot PCB123 device tree
MIPS: mscc: Add ocelot dtsi
dt-bindings: mips: Add bindings for Microsemi SoCs
dt-bindings: Add vendor prefix for Microsemi Corporation
MIPS: ath79: Fix AR724X_PLL_REG_PCIE_CONFIG offset
MIPS: pci-mt7620: Enable PCIe on MT7688
MIPS: pm-cps: Block system suspend when a JTAG probe is present
MIPS: VDSO: Replace __mips_isa_rev with MIPS_ISA_REV
MIPS: BPF: Replace __mips_isa_rev with MIPS_ISA_REV
MIPS: cpu-features.h: Replace __mips_isa_rev with MIPS_ISA_REV
MIPS: Introduce isa-rev.h to define MIPS_ISA_REV
MIPS: Hang more efficiently on halt/powerdown/restart
FIRMWARE: bcm47xx_nvram: Replace mac address parsing
MIPS: BMIPS: Add Broadcom STB watchdog nodes
...
Diffstat (limited to 'arch/mips/kernel')
| -rw-r--r-- | arch/mips/kernel/cpu-probe.c | 3 | ||||
| -rw-r--r-- | arch/mips/kernel/pm-cps.c | 31 | ||||
| -rw-r--r-- | arch/mips/kernel/reset.c | 68 | ||||
| -rw-r--r-- | arch/mips/kernel/setup.c | 5 |
4 files changed, 99 insertions, 8 deletions
diff --git a/arch/mips/kernel/cpu-probe.c b/arch/mips/kernel/cpu-probe.c index cf3fd549e16d..6b07b739f914 100644 --- a/arch/mips/kernel/cpu-probe.c +++ b/arch/mips/kernel/cpu-probe.c | |||
| @@ -848,6 +848,9 @@ static inline unsigned int decode_config5(struct cpuinfo_mips *c) | |||
| 848 | if (config5 & MIPS_CONF5_CA2) | 848 | if (config5 & MIPS_CONF5_CA2) |
| 849 | c->ases |= MIPS_ASE_MIPS16E2; | 849 | c->ases |= MIPS_ASE_MIPS16E2; |
| 850 | 850 | ||
| 851 | if (config5 & MIPS_CONF5_CRCP) | ||
| 852 | elf_hwcap |= HWCAP_MIPS_CRC32; | ||
| 853 | |||
| 851 | return config5 & MIPS_CONF_M; | 854 | return config5 & MIPS_CONF_M; |
| 852 | } | 855 | } |
| 853 | 856 | ||
diff --git a/arch/mips/kernel/pm-cps.c b/arch/mips/kernel/pm-cps.c index 421e06dfee72..55c3fbeb2df6 100644 --- a/arch/mips/kernel/pm-cps.c +++ b/arch/mips/kernel/pm-cps.c | |||
| @@ -12,6 +12,7 @@ | |||
| 12 | #include <linux/init.h> | 12 | #include <linux/init.h> |
| 13 | #include <linux/percpu.h> | 13 | #include <linux/percpu.h> |
| 14 | #include <linux/slab.h> | 14 | #include <linux/slab.h> |
| 15 | #include <linux/suspend.h> | ||
| 15 | 16 | ||
| 16 | #include <asm/asm-offsets.h> | 17 | #include <asm/asm-offsets.h> |
| 17 | #include <asm/cacheflush.h> | 18 | #include <asm/cacheflush.h> |
| @@ -670,6 +671,34 @@ static int cps_pm_online_cpu(unsigned int cpu) | |||
| 670 | return 0; | 671 | return 0; |
| 671 | } | 672 | } |
| 672 | 673 | ||
| 674 | static int cps_pm_power_notifier(struct notifier_block *this, | ||
| 675 | unsigned long event, void *ptr) | ||
| 676 | { | ||
| 677 | unsigned int stat; | ||
| 678 | |||
| 679 | switch (event) { | ||
| 680 | case PM_SUSPEND_PREPARE: | ||
| 681 | stat = read_cpc_cl_stat_conf(); | ||
| 682 | /* | ||
| 683 | * If we're attempting to suspend the system and power down all | ||
| 684 | * of the cores, the JTAG detect bit indicates that the CPC will | ||
| 685 | * instead put the cores into clock-off state. In this state | ||
| 686 | * a connected debugger can cause the CPU to attempt | ||
| 687 | * interactions with the powered down system. At best this will | ||
| 688 | * fail. At worst, it can hang the NoC, requiring a hard reset. | ||
| 689 | * To avoid this, just block system suspend if a JTAG probe | ||
| 690 | * is detected. | ||
| 691 | */ | ||
| 692 | if (stat & CPC_Cx_STAT_CONF_EJTAG_PROBE) { | ||
| 693 | pr_warn("JTAG probe is connected - abort suspend\n"); | ||
| 694 | return NOTIFY_BAD; | ||
| 695 | } | ||
| 696 | return NOTIFY_DONE; | ||
| 697 | default: | ||
| 698 | return NOTIFY_DONE; | ||
| 699 | } | ||
| 700 | } | ||
| 701 | |||
| 673 | static int __init cps_pm_init(void) | 702 | static int __init cps_pm_init(void) |
| 674 | { | 703 | { |
| 675 | /* A CM is required for all non-coherent states */ | 704 | /* A CM is required for all non-coherent states */ |
| @@ -705,6 +734,8 @@ static int __init cps_pm_init(void) | |||
| 705 | pr_warn("pm-cps: no CPC, clock & power gating unavailable\n"); | 734 | pr_warn("pm-cps: no CPC, clock & power gating unavailable\n"); |
| 706 | } | 735 | } |
| 707 | 736 | ||
| 737 | pm_notifier(cps_pm_power_notifier, 0); | ||
| 738 | |||
| 708 | return cpuhp_setup_state(CPUHP_AP_ONLINE_DYN, "mips/cps_pm:online", | 739 | return cpuhp_setup_state(CPUHP_AP_ONLINE_DYN, "mips/cps_pm:online", |
| 709 | cps_pm_online_cpu, NULL); | 740 | cps_pm_online_cpu, NULL); |
| 710 | } | 741 | } |
diff --git a/arch/mips/kernel/reset.c b/arch/mips/kernel/reset.c index 7c746d3458e7..6288780b779e 100644 --- a/arch/mips/kernel/reset.c +++ b/arch/mips/kernel/reset.c | |||
| @@ -13,6 +13,9 @@ | |||
| 13 | #include <linux/reboot.h> | 13 | #include <linux/reboot.h> |
| 14 | #include <linux/delay.h> | 14 | #include <linux/delay.h> |
| 15 | 15 | ||
| 16 | #include <asm/compiler.h> | ||
| 17 | #include <asm/idle.h> | ||
| 18 | #include <asm/mipsregs.h> | ||
| 16 | #include <asm/reboot.h> | 19 | #include <asm/reboot.h> |
| 17 | 20 | ||
| 18 | /* | 21 | /* |
| @@ -26,6 +29,62 @@ void (*pm_power_off)(void); | |||
| 26 | 29 | ||
| 27 | EXPORT_SYMBOL(pm_power_off); | 30 | EXPORT_SYMBOL(pm_power_off); |
| 28 | 31 | ||
| 32 | static void machine_hang(void) | ||
| 33 | { | ||
| 34 | /* | ||
| 35 | * We're hanging the system so we don't want to be interrupted anymore. | ||
| 36 | * Any interrupt handlers that ran would at best be useless & at worst | ||
| 37 | * go awry because the system isn't in a functional state. | ||
| 38 | */ | ||
| 39 | local_irq_disable(); | ||
| 40 | |||
| 41 | /* | ||
| 42 | * Mask all interrupts, giving us a better chance of remaining in the | ||
| 43 | * low power wait state. | ||
| 44 | */ | ||
| 45 | clear_c0_status(ST0_IM); | ||
| 46 | |||
| 47 | while (true) { | ||
| 48 | if (cpu_has_mips_r) { | ||
| 49 | /* | ||
| 50 | * We know that the wait instruction is supported so | ||
| 51 | * make use of it directly, leaving interrupts | ||
| 52 | * disabled. | ||
| 53 | */ | ||
| 54 | asm volatile( | ||
| 55 | ".set push\n\t" | ||
| 56 | ".set " MIPS_ISA_ARCH_LEVEL "\n\t" | ||
| 57 | "wait\n\t" | ||
| 58 | ".set pop"); | ||
| 59 | } else if (cpu_wait) { | ||
| 60 | /* | ||
| 61 | * Try the cpu_wait() callback. This isn't ideal since | ||
| 62 | * it'll re-enable interrupts, but that ought to be | ||
| 63 | * harmless given that they're all masked. | ||
| 64 | */ | ||
| 65 | cpu_wait(); | ||
| 66 | local_irq_disable(); | ||
| 67 | } else { | ||
| 68 | /* | ||
| 69 | * We're going to burn some power running round the | ||
| 70 | * loop, but we don't really have a choice. This isn't | ||
| 71 | * a path we should expect to run for long during | ||
| 72 | * typical use anyway. | ||
| 73 | */ | ||
| 74 | } | ||
| 75 | |||
| 76 | /* | ||
| 77 | * In most modern MIPS CPUs interrupts will cause the wait | ||
| 78 | * instruction to graduate even when disabled, and in some | ||
| 79 | * cases even when masked. In order to prevent a timer | ||
| 80 | * interrupt from continuously taking us out of the low power | ||
| 81 | * wait state, we clear any pending timer interrupt here. | ||
| 82 | */ | ||
| 83 | if (cpu_has_counter) | ||
| 84 | write_c0_compare(0); | ||
| 85 | } | ||
| 86 | } | ||
| 87 | |||
| 29 | void machine_restart(char *command) | 88 | void machine_restart(char *command) |
| 30 | { | 89 | { |
| 31 | if (_machine_restart) | 90 | if (_machine_restart) |
| @@ -38,8 +97,7 @@ void machine_restart(char *command) | |||
| 38 | do_kernel_restart(command); | 97 | do_kernel_restart(command); |
| 39 | mdelay(1000); | 98 | mdelay(1000); |
| 40 | pr_emerg("Reboot failed -- System halted\n"); | 99 | pr_emerg("Reboot failed -- System halted\n"); |
| 41 | local_irq_disable(); | 100 | machine_hang(); |
| 42 | while (1); | ||
| 43 | } | 101 | } |
| 44 | 102 | ||
| 45 | void machine_halt(void) | 103 | void machine_halt(void) |
| @@ -51,8 +109,7 @@ void machine_halt(void) | |||
| 51 | preempt_disable(); | 109 | preempt_disable(); |
| 52 | smp_send_stop(); | 110 | smp_send_stop(); |
| 53 | #endif | 111 | #endif |
| 54 | local_irq_disable(); | 112 | machine_hang(); |
| 55 | while (1); | ||
| 56 | } | 113 | } |
| 57 | 114 | ||
| 58 | void machine_power_off(void) | 115 | void machine_power_off(void) |
| @@ -64,6 +121,5 @@ void machine_power_off(void) | |||
| 64 | preempt_disable(); | 121 | preempt_disable(); |
| 65 | smp_send_stop(); | 122 | smp_send_stop(); |
| 66 | #endif | 123 | #endif |
| 67 | local_irq_disable(); | 124 | machine_hang(); |
| 68 | while (1); | ||
| 69 | } | 125 | } |
diff --git a/arch/mips/kernel/setup.c b/arch/mips/kernel/setup.c index 5f8b0a9e30b3..563188ac6fa2 100644 --- a/arch/mips/kernel/setup.c +++ b/arch/mips/kernel/setup.c | |||
| @@ -155,7 +155,8 @@ void __init detect_memory_region(phys_addr_t start, phys_addr_t sz_min, phys_add | |||
| 155 | add_memory_region(start, size, BOOT_MEM_RAM); | 155 | add_memory_region(start, size, BOOT_MEM_RAM); |
| 156 | } | 156 | } |
| 157 | 157 | ||
| 158 | bool __init memory_region_available(phys_addr_t start, phys_addr_t size) | 158 | static bool __init __maybe_unused memory_region_available(phys_addr_t start, |
| 159 | phys_addr_t size) | ||
| 159 | { | 160 | { |
| 160 | int i; | 161 | int i; |
| 161 | bool in_ram = false, free = true; | 162 | bool in_ram = false, free = true; |
| @@ -453,7 +454,7 @@ static void __init bootmem_init(void) | |||
| 453 | pr_info("Wasting %lu bytes for tracking %lu unused pages\n", | 454 | pr_info("Wasting %lu bytes for tracking %lu unused pages\n", |
| 454 | (min_low_pfn - ARCH_PFN_OFFSET) * sizeof(struct page), | 455 | (min_low_pfn - ARCH_PFN_OFFSET) * sizeof(struct page), |
| 455 | min_low_pfn - ARCH_PFN_OFFSET); | 456 | min_low_pfn - ARCH_PFN_OFFSET); |
| 456 | } else if (min_low_pfn < ARCH_PFN_OFFSET) { | 457 | } else if (ARCH_PFN_OFFSET - min_low_pfn > 0UL) { |
| 457 | pr_info("%lu free pages won't be used\n", | 458 | pr_info("%lu free pages won't be used\n", |
| 458 | ARCH_PFN_OFFSET - min_low_pfn); | 459 | ARCH_PFN_OFFSET - min_low_pfn); |
| 459 | } | 460 | } |
