Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

Merge tag 'loongarch-6.14' of git://git.kernel.org/pub/scm/linux/kernel/git/chenhuacai/linux-loongson

Pull LoongArch updates from Huacai Chen:

- Migrate to the generic rule for built-in DTB

- Disable FIX_EARLYCON_MEM when ARCH_IOREMAP is enabled

- Derive timer max_delta from PRCFG1's timer_bits

- Correct the cacheinfo sharing information

- Add pgprot_nx() implementation

- Add debugfs entries to switch SFB/TSO state

- Change the maximum number of watchpoints

- Some bug fixes and other small changes

* tag 'loongarch-6.14' of git://git.kernel.org/pub/scm/linux/kernel/git/chenhuacai/linux-loongson:
LoongArch: Extend the maximum number of watchpoints
LoongArch: Change 8 to 14 for LOONGARCH_MAX_{BRP,WRP}
LoongArch: Add debugfs entries to switch SFB/TSO state
LoongArch: Fix warnings during S3 suspend
LoongArch: Adjust SETUP_SLEEP and SETUP_WAKEUP
LoongArch: Refactor bug_handler() implementation
LoongArch: Add pgprot_nx() implementation
LoongArch: Correct the __switch_to() prototype in comments
LoongArch: Correct the cacheinfo sharing information
LoongArch: Derive timer max_delta from PRCFG1's timer_bits
LoongArch: Disable FIX_EARLYCON_MEM when ARCH_IOREMAP is enabled
LoongArch: Migrate to the generic rule for built-in DTB

+312 -31
-1
arch/loongarch/Kbuild
··· 4 4 obj-y += vdso/ 5 5 6 6 obj-$(CONFIG_KVM) += kvm/ 7 - obj-$(CONFIG_BUILTIN_DTB) += boot/dts/ 8 7 9 8 # for cleaning 10 9 subdir- += boot
+2 -1
arch/loongarch/Kconfig
··· 249 249 def_bool 64BIT 250 250 251 251 config FIX_EARLYCON_MEM 252 - def_bool y 252 + def_bool !ARCH_IOREMAP 253 253 254 254 config PGTABLE_2LEVEL 255 255 bool ··· 400 400 config BUILTIN_DTB 401 401 bool "Enable built-in dtb in kernel" 402 402 depends on OF 403 + select GENERIC_BUILTIN_DTB 403 404 help 404 405 Some existing systems do not provide a canonical device tree to 405 406 the kernel at boot time. Let's provide a device tree table in the
-2
arch/loongarch/boot/dts/Makefile
··· 1 1 # SPDX-License-Identifier: GPL-2.0-only 2 2 3 3 dtb-y = loongson-2k0500-ref.dtb loongson-2k1000-ref.dtb loongson-2k2000-ref.dtb 4 - 5 - obj-$(CONFIG_BUILTIN_DTB) += $(addsuffix .dtb.o, $(CONFIG_BUILTIN_DTB_NAME))
+1
arch/loongarch/include/asm/cpu-info.h
··· 57 57 int global_id; /* physical global thread number */ 58 58 int vabits; /* Virtual Address size in bits */ 59 59 int pabits; /* Physical Address size in bits */ 60 + int timerbits; /* Width of arch timer in bits */ 60 61 unsigned int ksave_mask; /* Usable KSave mask. */ 61 62 unsigned int watch_dreg_count; /* Number data breakpoints */ 62 63 unsigned int watch_ireg_count; /* Number instruction breakpoints */
+2 -2
arch/loongarch/include/asm/hw_breakpoint.h
··· 38 38 * Limits. 39 39 * Changing these will require modifications to the register accessors. 40 40 */ 41 - #define LOONGARCH_MAX_BRP 8 42 - #define LOONGARCH_MAX_WRP 8 41 + #define LOONGARCH_MAX_BRP 14 42 + #define LOONGARCH_MAX_WRP 14 43 43 44 44 /* Virtual debug register bases. */ 45 45 #define CSR_CFG_ADDR 0
+75 -1
arch/loongarch/include/asm/loongarch.h
··· 108 108 #define CPUCFG3_SPW_HG_HF BIT(11) 109 109 #define CPUCFG3_RVA BIT(12) 110 110 #define CPUCFG3_RVAMAX GENMASK(16, 13) 111 + #define CPUCFG3_ALDORDER_CAP BIT(18) /* All address load ordered, capability */ 112 + #define CPUCFG3_ASTORDER_CAP BIT(19) /* All address store ordered, capability */ 113 + #define CPUCFG3_ALDORDER_STA BIT(20) /* All address load ordered, status */ 114 + #define CPUCFG3_ASTORDER_STA BIT(21) /* All address store ordered, status */ 115 + #define CPUCFG3_SLDORDER_CAP BIT(22) /* Same address load ordered, capability */ 116 + #define CPUCFG3_SLDORDER_STA BIT(23) /* Same address load ordered, status */ 111 117 112 118 #define LOONGARCH_CPUCFG4 0x4 113 119 #define CPUCFG4_CCFREQ GENMASK(31, 0) ··· 472 466 473 467 #define LOONGARCH_CSR_TCFG 0x41 /* Timer config */ 474 468 #define CSR_TCFG_VAL_SHIFT 2 475 - #define CSR_TCFG_VAL_WIDTH 48 476 469 #define CSR_TCFG_VAL (_ULCAST_(0x3fffffffffff) << CSR_TCFG_VAL_SHIFT) 477 470 #define CSR_TCFG_PERIOD_SHIFT 1 478 471 #define CSR_TCFG_PERIOD (_ULCAST_(0x1) << CSR_TCFG_PERIOD_SHIFT) ··· 571 566 572 567 /* Implement dependent */ 573 568 #define LOONGARCH_CSR_IMPCTL1 0x80 /* Loongson config1 */ 569 + #define CSR_LDSTORDER_SHIFT 28 570 + #define CSR_LDSTORDER_WIDTH 3 571 + #define CSR_LDSTORDER_MASK (_ULCAST_(0x7) << CSR_LDSTORDER_SHIFT) 572 + #define CSR_LDSTORDER_NLD_NST (_ULCAST_(0x0) << CSR_LDSTORDER_SHIFT) /* 000 = No Load No Store */ 573 + #define CSR_LDSTORDER_ALD_NST (_ULCAST_(0x1) << CSR_LDSTORDER_SHIFT) /* 001 = All Load No Store */ 574 + #define CSR_LDSTORDER_SLD_NST (_ULCAST_(0x3) << CSR_LDSTORDER_SHIFT) /* 011 = Same Load No Store */ 575 + #define CSR_LDSTORDER_NLD_AST (_ULCAST_(0x4) << CSR_LDSTORDER_SHIFT) /* 100 = No Load All Store */ 576 + #define CSR_LDSTORDER_ALD_AST (_ULCAST_(0x5) << CSR_LDSTORDER_SHIFT) /* 101 = All Load All Store */ 577 + #define CSR_LDSTORDER_SLD_AST (_ULCAST_(0x7) << CSR_LDSTORDER_SHIFT) /* 111 = Same Load All Store */ 574 578 #define CSR_MISPEC_SHIFT 20 575 579 #define CSR_MISPEC_WIDTH 8 576 580 #define CSR_MISPEC (_ULCAST_(0xff) << CSR_MISPEC_SHIFT) ··· 973 959 #define LOONGARCH_CSR_DB7CTRL 0x34a /* data breakpoint 7 control */ 974 960 #define LOONGARCH_CSR_DB7ASID 0x34b /* data breakpoint 7 asid */ 975 961 962 + #define LOONGARCH_CSR_DB8ADDR 0x350 /* data breakpoint 8 address */ 963 + #define LOONGARCH_CSR_DB8MASK 0x351 /* data breakpoint 8 mask */ 964 + #define LOONGARCH_CSR_DB8CTRL 0x352 /* data breakpoint 8 control */ 965 + #define LOONGARCH_CSR_DB8ASID 0x353 /* data breakpoint 8 asid */ 966 + 967 + #define LOONGARCH_CSR_DB9ADDR 0x358 /* data breakpoint 9 address */ 968 + #define LOONGARCH_CSR_DB9MASK 0x359 /* data breakpoint 9 mask */ 969 + #define LOONGARCH_CSR_DB9CTRL 0x35a /* data breakpoint 9 control */ 970 + #define LOONGARCH_CSR_DB9ASID 0x35b /* data breakpoint 9 asid */ 971 + 972 + #define LOONGARCH_CSR_DB10ADDR 0x360 /* data breakpoint 10 address */ 973 + #define LOONGARCH_CSR_DB10MASK 0x361 /* data breakpoint 10 mask */ 974 + #define LOONGARCH_CSR_DB10CTRL 0x362 /* data breakpoint 10 control */ 975 + #define LOONGARCH_CSR_DB10ASID 0x363 /* data breakpoint 10 asid */ 976 + 977 + #define LOONGARCH_CSR_DB11ADDR 0x368 /* data breakpoint 11 address */ 978 + #define LOONGARCH_CSR_DB11MASK 0x369 /* data breakpoint 11 mask */ 979 + #define LOONGARCH_CSR_DB11CTRL 0x36a /* data breakpoint 11 control */ 980 + #define LOONGARCH_CSR_DB11ASID 0x36b /* data breakpoint 11 asid */ 981 + 982 + #define LOONGARCH_CSR_DB12ADDR 0x370 /* data breakpoint 12 address */ 983 + #define LOONGARCH_CSR_DB12MASK 0x371 /* data breakpoint 12 mask */ 984 + #define LOONGARCH_CSR_DB12CTRL 0x372 /* data breakpoint 12 control */ 985 + #define LOONGARCH_CSR_DB12ASID 0x373 /* data breakpoint 12 asid */ 986 + 987 + #define LOONGARCH_CSR_DB13ADDR 0x378 /* data breakpoint 13 address */ 988 + #define LOONGARCH_CSR_DB13MASK 0x379 /* data breakpoint 13 mask */ 989 + #define LOONGARCH_CSR_DB13CTRL 0x37a /* data breakpoint 13 control */ 990 + #define LOONGARCH_CSR_DB13ASID 0x37b /* data breakpoint 13 asid */ 991 + 976 992 #define LOONGARCH_CSR_FWPC 0x380 /* instruction breakpoint config */ 977 993 #define LOONGARCH_CSR_FWPS 0x381 /* instruction breakpoint status */ 978 994 ··· 1045 1001 #define LOONGARCH_CSR_IB7MASK 0x3c9 /* inst breakpoint 7 mask */ 1046 1002 #define LOONGARCH_CSR_IB7CTRL 0x3ca /* inst breakpoint 7 control */ 1047 1003 #define LOONGARCH_CSR_IB7ASID 0x3cb /* inst breakpoint 7 asid */ 1004 + 1005 + #define LOONGARCH_CSR_IB8ADDR 0x3d0 /* inst breakpoint 8 address */ 1006 + #define LOONGARCH_CSR_IB8MASK 0x3d1 /* inst breakpoint 8 mask */ 1007 + #define LOONGARCH_CSR_IB8CTRL 0x3d2 /* inst breakpoint 8 control */ 1008 + #define LOONGARCH_CSR_IB8ASID 0x3d3 /* inst breakpoint 8 asid */ 1009 + 1010 + #define LOONGARCH_CSR_IB9ADDR 0x3d8 /* inst breakpoint 9 address */ 1011 + #define LOONGARCH_CSR_IB9MASK 0x3d9 /* inst breakpoint 9 mask */ 1012 + #define LOONGARCH_CSR_IB9CTRL 0x3da /* inst breakpoint 9 control */ 1013 + #define LOONGARCH_CSR_IB9ASID 0x3db /* inst breakpoint 9 asid */ 1014 + 1015 + #define LOONGARCH_CSR_IB10ADDR 0x3e0 /* inst breakpoint 10 address */ 1016 + #define LOONGARCH_CSR_IB10MASK 0x3e1 /* inst breakpoint 10 mask */ 1017 + #define LOONGARCH_CSR_IB10CTRL 0x3e2 /* inst breakpoint 10 control */ 1018 + #define LOONGARCH_CSR_IB10ASID 0x3e3 /* inst breakpoint 10 asid */ 1019 + 1020 + #define LOONGARCH_CSR_IB11ADDR 0x3e8 /* inst breakpoint 11 address */ 1021 + #define LOONGARCH_CSR_IB11MASK 0x3e9 /* inst breakpoint 11 mask */ 1022 + #define LOONGARCH_CSR_IB11CTRL 0x3ea /* inst breakpoint 11 control */ 1023 + #define LOONGARCH_CSR_IB11ASID 0x3eb /* inst breakpoint 11 asid */ 1024 + 1025 + #define LOONGARCH_CSR_IB12ADDR 0x3f0 /* inst breakpoint 12 address */ 1026 + #define LOONGARCH_CSR_IB12MASK 0x3f1 /* inst breakpoint 12 mask */ 1027 + #define LOONGARCH_CSR_IB12CTRL 0x3f2 /* inst breakpoint 12 control */ 1028 + #define LOONGARCH_CSR_IB12ASID 0x3f3 /* inst breakpoint 12 asid */ 1029 + 1030 + #define LOONGARCH_CSR_IB13ADDR 0x3f8 /* inst breakpoint 13 address */ 1031 + #define LOONGARCH_CSR_IB13MASK 0x3f9 /* inst breakpoint 13 mask */ 1032 + #define LOONGARCH_CSR_IB13CTRL 0x3fa /* inst breakpoint 13 control */ 1033 + #define LOONGARCH_CSR_IB13ASID 0x3fb /* inst breakpoint 13 asid */ 1048 1034 1049 1035 #define LOONGARCH_CSR_DEBUG 0x500 /* debug config */ 1050 1036 #define LOONGARCH_CSR_DERA 0x501 /* debug era */
+7
arch/loongarch/include/asm/pgtable-bits.h
··· 96 96 97 97 #define _PAGE_IOREMAP pgprot_val(PAGE_KERNEL_SUC) 98 98 99 + #define pgprot_nx pgprot_nx 100 + 101 + static inline pgprot_t pgprot_nx(pgprot_t _prot) 102 + { 103 + return __pgprot(pgprot_val(_prot) | _PAGE_NO_EXEC); 104 + } 105 + 99 106 #define pgprot_noncached pgprot_noncached 100 107 101 108 static inline pgprot_t pgprot_noncached(pgprot_t _prot)
+10
arch/loongarch/include/uapi/asm/ptrace.h
··· 72 72 } dbg_regs[8]; 73 73 }; 74 74 75 + struct user_watch_state_v2 { 76 + uint64_t dbg_info; 77 + struct { 78 + uint64_t addr; 79 + uint64_t mask; 80 + uint32_t ctrl; 81 + uint32_t pad; 82 + } dbg_regs[14]; 83 + }; 84 + 75 85 #define PTRACE_SYSEMU 0x1f 76 86 #define PTRACE_SYSEMU_SINGLESTEP 0x20 77 87
+1 -1
arch/loongarch/kernel/Makefile
··· 10 10 obj-y += head.o cpu-probe.o cacheinfo.o env.o setup.o entry.o genex.o \ 11 11 traps.o irq.o idle.o process.o dma.o mem.o reset.o switch.o \ 12 12 elf.o syscall.o signal.o time.o topology.o inst.o ptrace.o vdso.o \ 13 - alternative.o unwind.o 13 + alternative.o kdebugfs.o unwind.o 14 14 15 15 obj-$(CONFIG_ACPI) += acpi.o 16 16 obj-$(CONFIG_EFI) += efi.o
+6
arch/loongarch/kernel/cacheinfo.c
··· 51 51 continue; 52 52 53 53 sib_leaf = sib_cpu_ci->info_list + index; 54 + /* SMT cores share all caches */ 55 + if (cpus_are_siblings(i, cpu)) { 56 + cpumask_set_cpu(cpu, &sib_leaf->shared_cpu_map); 57 + cpumask_set_cpu(i, &this_leaf->shared_cpu_map); 58 + } 59 + /* Node's cores share shared caches */ 54 60 if (cache_leaves_are_shared(this_leaf, sib_leaf)) { 55 61 cpumask_set_cpu(cpu, &sib_leaf->shared_cpu_map); 56 62 cpumask_set_cpu(i, &this_leaf->shared_cpu_map);
+1
arch/loongarch/kernel/cpu-probe.c
··· 190 190 set_cpu_asid_mask(c, asid_mask); 191 191 192 192 config = read_csr_prcfg1(); 193 + c->timerbits = (config & CSR_CONF1_TMRBITS) >> CSR_CONF1_TMRBITS_SHIFT; 193 194 c->ksave_mask = GENMASK((config & CSR_CONF1_KSNUM) - 1, 0); 194 195 c->ksave_mask &= ~(EXC_KSAVE_MASK | PERCPU_KSAVE_MASK | KVM_KSAVE_MASK); 195 196
+14 -2
arch/loongarch/kernel/hw_breakpoint.c
··· 51 51 READ_WB_REG_CASE(OFF, 4, REG, T, VAL); \ 52 52 READ_WB_REG_CASE(OFF, 5, REG, T, VAL); \ 53 53 READ_WB_REG_CASE(OFF, 6, REG, T, VAL); \ 54 - READ_WB_REG_CASE(OFF, 7, REG, T, VAL); 54 + READ_WB_REG_CASE(OFF, 7, REG, T, VAL); \ 55 + READ_WB_REG_CASE(OFF, 8, REG, T, VAL); \ 56 + READ_WB_REG_CASE(OFF, 9, REG, T, VAL); \ 57 + READ_WB_REG_CASE(OFF, 10, REG, T, VAL); \ 58 + READ_WB_REG_CASE(OFF, 11, REG, T, VAL); \ 59 + READ_WB_REG_CASE(OFF, 12, REG, T, VAL); \ 60 + READ_WB_REG_CASE(OFF, 13, REG, T, VAL); 55 61 56 62 #define GEN_WRITE_WB_REG_CASES(OFF, REG, T, VAL) \ 57 63 WRITE_WB_REG_CASE(OFF, 0, REG, T, VAL); \ ··· 67 61 WRITE_WB_REG_CASE(OFF, 4, REG, T, VAL); \ 68 62 WRITE_WB_REG_CASE(OFF, 5, REG, T, VAL); \ 69 63 WRITE_WB_REG_CASE(OFF, 6, REG, T, VAL); \ 70 - WRITE_WB_REG_CASE(OFF, 7, REG, T, VAL); 64 + WRITE_WB_REG_CASE(OFF, 7, REG, T, VAL); \ 65 + WRITE_WB_REG_CASE(OFF, 8, REG, T, VAL); \ 66 + WRITE_WB_REG_CASE(OFF, 9, REG, T, VAL); \ 67 + WRITE_WB_REG_CASE(OFF, 10, REG, T, VAL); \ 68 + WRITE_WB_REG_CASE(OFF, 11, REG, T, VAL); \ 69 + WRITE_WB_REG_CASE(OFF, 12, REG, T, VAL); \ 70 + WRITE_WB_REG_CASE(OFF, 13, REG, T, VAL); 71 71 72 72 static u64 read_wb_reg(int reg, int n, int t) 73 73 {
+168
arch/loongarch/kernel/kdebugfs.c
··· 1 + // SPDX-License-Identifier: GPL-2.0 2 + #include <linux/init.h> 3 + #include <linux/export.h> 4 + #include <linux/debugfs.h> 5 + #include <linux/kstrtox.h> 6 + #include <asm/loongarch.h> 7 + 8 + struct dentry *arch_debugfs_dir; 9 + EXPORT_SYMBOL(arch_debugfs_dir); 10 + 11 + static int sfb_state, tso_state; 12 + 13 + static void set_sfb_state(void *info) 14 + { 15 + int val = *(int *)info << CSR_STFILL_SHIFT; 16 + 17 + csr_xchg32(val, CSR_STFILL, LOONGARCH_CSR_IMPCTL1); 18 + } 19 + 20 + static ssize_t sfb_read(struct file *file, char __user *buf, size_t count, loff_t *ppos) 21 + { 22 + int s, state; 23 + char str[32]; 24 + 25 + state = (csr_read32(LOONGARCH_CSR_IMPCTL1) & CSR_STFILL) >> CSR_STFILL_SHIFT; 26 + 27 + s = snprintf(str, sizeof(str), "Boot State: %x\nCurrent State: %x\n", sfb_state, state); 28 + 29 + if (*ppos >= s) 30 + return 0; 31 + 32 + s -= *ppos; 33 + s = min_t(u32, s, count); 34 + 35 + if (copy_to_user(buf, &str[*ppos], s)) 36 + return -EFAULT; 37 + 38 + *ppos += s; 39 + 40 + return s; 41 + } 42 + 43 + static ssize_t sfb_write(struct file *file, const char __user *buf, size_t count, loff_t *ppos) 44 + { 45 + int state; 46 + 47 + if (kstrtoint_from_user(buf, count, 10, &state)) 48 + return -EFAULT; 49 + 50 + switch (state) { 51 + case 0: case 1: 52 + on_each_cpu(set_sfb_state, &state, 1); 53 + break; 54 + default: 55 + return -EINVAL; 56 + } 57 + 58 + return count; 59 + } 60 + 61 + static const struct file_operations sfb_fops = { 62 + .read = sfb_read, 63 + .write = sfb_write, 64 + .open = simple_open, 65 + .llseek = default_llseek 66 + }; 67 + 68 + #define LDSTORDER_NLD_NST 0x0 /* 000 = No Load No Store */ 69 + #define LDSTORDER_ALD_NST 0x1 /* 001 = All Load No Store */ 70 + #define LDSTORDER_SLD_NST 0x3 /* 011 = Same Load No Store */ 71 + #define LDSTORDER_NLD_AST 0x4 /* 100 = No Load All Store */ 72 + #define LDSTORDER_ALD_AST 0x5 /* 101 = All Load All Store */ 73 + #define LDSTORDER_SLD_AST 0x7 /* 111 = Same Load All Store */ 74 + 75 + static char *tso_hints[] = { 76 + "No Load No Store", 77 + "All Load No Store", 78 + "Invalid Config", 79 + "Same Load No Store", 80 + "No Load All Store", 81 + "All Load All Store", 82 + "Invalid Config", 83 + "Same Load All Store" 84 + }; 85 + 86 + static void set_tso_state(void *info) 87 + { 88 + int val = *(int *)info << CSR_LDSTORDER_SHIFT; 89 + 90 + csr_xchg32(val, CSR_LDSTORDER_MASK, LOONGARCH_CSR_IMPCTL1); 91 + } 92 + 93 + static ssize_t tso_read(struct file *file, char __user *buf, size_t count, loff_t *ppos) 94 + { 95 + int s, state; 96 + char str[240]; 97 + 98 + state = (csr_read32(LOONGARCH_CSR_IMPCTL1) & CSR_LDSTORDER_MASK) >> CSR_LDSTORDER_SHIFT; 99 + 100 + s = snprintf(str, sizeof(str), "Boot State: %d (%s)\n" 101 + "Current State: %d (%s)\n\n" 102 + "Available States:\n" 103 + "0 (%s)\t" "1 (%s)\t" "3 (%s)\n" 104 + "4 (%s)\t" "5 (%s)\t" "7 (%s)\n", 105 + tso_state, tso_hints[tso_state], state, tso_hints[state], 106 + tso_hints[0], tso_hints[1], tso_hints[3], tso_hints[4], tso_hints[5], tso_hints[7]); 107 + 108 + if (*ppos >= s) 109 + return 0; 110 + 111 + s -= *ppos; 112 + s = min_t(u32, s, count); 113 + 114 + if (copy_to_user(buf, &str[*ppos], s)) 115 + return -EFAULT; 116 + 117 + *ppos += s; 118 + 119 + return s; 120 + } 121 + 122 + static ssize_t tso_write(struct file *file, const char __user *buf, size_t count, loff_t *ppos) 123 + { 124 + int state; 125 + 126 + if (kstrtoint_from_user(buf, count, 10, &state)) 127 + return -EFAULT; 128 + 129 + switch (state) { 130 + case 0: case 1: case 3: 131 + case 4: case 5: case 7: 132 + on_each_cpu(set_tso_state, &state, 1); 133 + break; 134 + default: 135 + return -EINVAL; 136 + } 137 + 138 + return count; 139 + } 140 + 141 + static const struct file_operations tso_fops = { 142 + .read = tso_read, 143 + .write = tso_write, 144 + .open = simple_open, 145 + .llseek = default_llseek 146 + }; 147 + 148 + static int __init arch_kdebugfs_init(void) 149 + { 150 + unsigned int config = read_cpucfg(LOONGARCH_CPUCFG3); 151 + 152 + arch_debugfs_dir = debugfs_create_dir("loongarch", NULL); 153 + 154 + if (config & CPUCFG3_SFB) { 155 + debugfs_create_file("sfb_state", S_IRUGO | S_IWUSR, 156 + arch_debugfs_dir, &sfb_state, &sfb_fops); 157 + sfb_state = (csr_read32(LOONGARCH_CSR_IMPCTL1) & CSR_STFILL) >> CSR_STFILL_SHIFT; 158 + } 159 + 160 + if (config & (CPUCFG3_ALDORDER_CAP | CPUCFG3_ASTORDER_CAP)) { 161 + debugfs_create_file("tso_state", S_IRUGO | S_IWUSR, 162 + arch_debugfs_dir, &tso_state, &tso_fops); 163 + tso_state = (csr_read32(LOONGARCH_CSR_IMPCTL1) & CSR_LDSTORDER_MASK) >> CSR_LDSTORDER_SHIFT; 164 + } 165 + 166 + return 0; 167 + } 168 + postcore_initcall(arch_kdebugfs_init);
+3 -3
arch/loongarch/kernel/ptrace.c
··· 720 720 unsigned int note_type = regset->core_note_type; 721 721 722 722 /* Resource info */ 723 - offset = offsetof(struct user_watch_state, dbg_regs); 723 + offset = offsetof(struct user_watch_state_v2, dbg_regs); 724 724 user_regset_copyin_ignore(&pos, &count, &kbuf, &ubuf, 0, offset); 725 725 726 726 /* (address, mask, ctrl) registers */ ··· 920 920 #ifdef CONFIG_HAVE_HW_BREAKPOINT 921 921 [REGSET_HW_BREAK] = { 922 922 .core_note_type = NT_LOONGARCH_HW_BREAK, 923 - .n = sizeof(struct user_watch_state) / sizeof(u32), 923 + .n = sizeof(struct user_watch_state_v2) / sizeof(u32), 924 924 .size = sizeof(u32), 925 925 .align = sizeof(u32), 926 926 .regset_get = hw_break_get, ··· 928 928 }, 929 929 [REGSET_HW_WATCH] = { 930 930 .core_note_type = NT_LOONGARCH_HW_WATCH, 931 - .n = sizeof(struct user_watch_state) / sizeof(u32), 931 + .n = sizeof(struct user_watch_state_v2) / sizeof(u32), 932 932 .size = sizeof(u32), 933 933 .align = sizeof(u32), 934 934 .regset_get = hw_break_get,
+1 -1
arch/loongarch/kernel/switch.S
··· 12 12 13 13 /* 14 14 * task_struct *__switch_to(task_struct *prev, task_struct *next, 15 - * struct thread_info *next_ti) 15 + * struct thread_info *next_ti, void *sched_ra, void *sched_cfa) 16 16 */ 17 17 .align 5 18 18 SYM_FUNC_START(__switch_to)
+1 -1
arch/loongarch/kernel/time.c
··· 132 132 #else 133 133 unsigned long min_delta = 1000; 134 134 #endif 135 - unsigned long max_delta = (1UL << 48) - 1; 135 + unsigned long max_delta = GENMASK_ULL(boot_cpu_data.timerbits, 0); 136 136 struct clock_event_device *cd; 137 137 static int irq = 0, timer_irq_installed = 0; 138 138
+10 -3
arch/loongarch/kernel/traps.c
··· 597 597 598 598 static void bug_handler(struct pt_regs *regs) 599 599 { 600 + if (user_mode(regs)) { 601 + force_sig(SIGTRAP); 602 + return; 603 + } 604 + 600 605 switch (report_bug(regs->csr_era, regs)) { 601 606 case BUG_TRAP_TYPE_BUG: 602 - case BUG_TRAP_TYPE_NONE: 603 - die_if_kernel("Oops - BUG", regs); 604 - force_sig(SIGTRAP); 607 + die("Oops - BUG", regs); 605 608 break; 606 609 607 610 case BUG_TRAP_TYPE_WARN: 608 611 /* Skip the BUG instruction and continue */ 609 612 regs->csr_era += LOONGARCH_INSN_SIZE; 610 613 break; 614 + 615 + default: 616 + if (!fixup_exception(regs)) 617 + die("Oops - BUG", regs); 611 618 } 612 619 } 613 620
+2 -6
arch/loongarch/kernel/unaligned.c
··· 482 482 #ifdef CONFIG_DEBUG_FS 483 483 static int __init debugfs_unaligned(void) 484 484 { 485 - struct dentry *d; 486 - 487 - d = debugfs_create_dir("loongarch", NULL); 488 - 489 485 debugfs_create_u32("unaligned_instructions_user", 490 - S_IRUGO, d, &unaligned_instructions_user); 486 + S_IRUGO, arch_debugfs_dir, &unaligned_instructions_user); 491 487 debugfs_create_u32("unaligned_instructions_kernel", 492 - S_IRUGO, d, &unaligned_instructions_kernel); 488 + S_IRUGO, arch_debugfs_dir, &unaligned_instructions_kernel); 493 489 494 490 return 0; 495 491 }
+1 -1
arch/loongarch/power/platform.c
··· 17 17 if (acpi_gbl_reduced_hardware) 18 18 return; 19 19 20 - acpi_enable_all_wakeup_gpes(); 20 + acpi_hw_enable_all_wakeup_gpes(); 21 21 } 22 22 23 23 void enable_pci_wakeup(void)
+6 -4
arch/loongarch/power/suspend_asm.S
··· 30 30 st.d $r29, sp, PT_R29 31 31 st.d $r30, sp, PT_R30 32 32 st.d $r31, sp, PT_R31 33 - 34 - la.pcrel t0, acpi_saved_sp 35 - st.d sp, t0, 0 36 33 .endm 37 34 38 35 .macro SETUP_WAKEUP ··· 48 51 ld.d $r29, sp, PT_R29 49 52 ld.d $r30, sp, PT_R30 50 53 ld.d $r31, sp, PT_R31 54 + addi.d sp, sp, PT_SIZE 51 55 .endm 52 56 53 57 .text ··· 57 59 /* Sleep/wakeup code for Loongson-3 */ 58 60 SYM_FUNC_START(loongarch_suspend_enter) 59 61 SETUP_SLEEP 62 + 63 + la.pcrel t0, acpi_saved_sp 64 + st.d sp, t0, 0 65 + 60 66 bl __flush_cache_all 61 67 62 68 /* Pass RA and SP to BIOS */ ··· 84 82 85 83 la.pcrel t0, acpi_saved_sp 86 84 ld.d sp, t0, 0 85 + 87 86 SETUP_WAKEUP 88 - addi.d sp, sp, PT_SIZE 89 87 jr ra 90 88 SYM_FUNC_END(loongarch_suspend_enter)
-2
drivers/acpi/acpica/achware.h
··· 103 103 104 104 acpi_status acpi_hw_enable_all_runtime_gpes(void); 105 105 106 - acpi_status acpi_hw_enable_all_wakeup_gpes(void); 107 - 108 106 u8 acpi_hw_check_all_gpes(acpi_handle gpe_skip_device, u32 gpe_skip_number); 109 107 110 108 acpi_status
+1
include/acpi/acpixf.h
··· 763 763 *event_status)) 764 764 ACPI_HW_DEPENDENT_RETURN_UINT32(u32 acpi_dispatch_gpe(acpi_handle gpe_device, u32 gpe_number)) 765 765 ACPI_HW_DEPENDENT_RETURN_STATUS(acpi_status acpi_hw_disable_all_gpes(void)) 766 + ACPI_HW_DEPENDENT_RETURN_STATUS(acpi_status acpi_hw_enable_all_wakeup_gpes(void)) 766 767 ACPI_HW_DEPENDENT_RETURN_STATUS(acpi_status acpi_disable_all_gpes(void)) 767 768 ACPI_HW_DEPENDENT_RETURN_STATUS(acpi_status acpi_enable_all_runtime_gpes(void)) 768 769 ACPI_HW_DEPENDENT_RETURN_STATUS(acpi_status acpi_enable_all_wakeup_gpes(void))