Skip to content

Commit 999324f

Browse files
committed
Merge tag 'loongarch-5.20' of git://git.kernel.org/pub/scm/linux/kernel/git/chenhuacai/linux-loongson
Pull LoongArch updates from Huacai Chen: - Optimise getcpu() with vDSO - PCI enablement on top of pci & irqchip changes - Stack unwinder and stack trace support - Some bug fixes and build error fixes - Update the default config file * tag 'loongarch-5.20' of git://git.kernel.org/pub/scm/linux/kernel/git/chenhuacai/linux-loongson: docs/zh_CN/LoongArch: Add I14 description docs/LoongArch: Add I14 description LoongArch: Update Loongson-3 default config file LoongArch: Add USER_STACKTRACE support LoongArch: Add STACKTRACE support LoongArch: Add prologue unwinder support LoongArch: Add guess unwinder support LoongArch: Add vDSO syscall __vdso_getcpu() LoongArch: Add PCI controller support LoongArch: Parse MADT to get multi-processor information LoongArch: Jump to the link address before enable PG LoongArch: Requires __force attributes for any casts LoongArch: Fix unsigned comparison with less than zero LoongArch: Adjust arch/loongarch/Kconfig LoongArch: cpuinfo: Fix a warning for CONFIG_CPUMASK_OFFSTACK
2 parents f7cdaee + 7153559 commit 999324f

38 files changed

+1089
-63
lines changed

Documentation/loongarch/introduction.rst

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -221,7 +221,7 @@ I26 Opcode + I26L + I26H
221221
=========== ==========================
222222

223223
Rd is the destination register operand, while Rj, Rk and Ra ("a" stands for
224-
"additional") are the source register operands. I8/I12/I16/I21/I26 are
224+
"additional") are the source register operands. I8/I12/I14/I16/I21/I26 are
225225
immediate operands of respective width. The longer I21 and I26 are stored
226226
in separate higher and lower parts in the instruction word, denoted by the "L"
227227
and "H" suffixes.

Documentation/translations/zh_CN/loongarch/introduction.rst

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -190,8 +190,8 @@ I26 Opcode + I26L + I26H
190190
=========== ==========================
191191

192192
Opcode是指令操作码,Rj和Rk是源操作数(寄存器),Rd是目标操作数(寄存器),Ra是
193-
4R-type格式特有的附加操作数(寄存器)。I8/I12/I16/I21/I26分别是8位/12位/16位/
194-
21位/26位的立即数。其中较长的21位和26位立即数在指令字中被分割为高位部分与低位
193+
4R-type格式特有的附加操作数(寄存器)。I8/I12/I14/I16/I21/I26分别是8位/12位/14位/
194+
16位/21位/26位的立即数。其中较长的21位和26位立即数在指令字中被分割为高位部分与低位
195195
部分,所以你们在这里的格式描述中能够看到I21L/I21H和I26L/I26H这样带后缀的表述。
196196

197197
指令列表

arch/loongarch/Kconfig

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,9 @@
22
config LOONGARCH
33
bool
44
default y
5+
select ACPI
56
select ACPI_GENERIC_GSI if ACPI
7+
select ACPI_MCFG if ACPI
68
select ACPI_SYSTEM_POWER_STATES_SUPPORT if ACPI
79
select ARCH_BINFMT_ELF_STATE
810
select ARCH_ENABLE_MEMORY_HOTPLUG
@@ -40,6 +42,7 @@ config LOONGARCH
4042
select ARCH_MIGHT_HAVE_PC_PARPORT
4143
select ARCH_MIGHT_HAVE_PC_SERIO
4244
select ARCH_SPARSEMEM_ENABLE
45+
select ARCH_STACKWALK
4346
select ARCH_SUPPORTS_ACPI
4447
select ARCH_SUPPORTS_ATOMIC_RMW
4548
select ARCH_SUPPORTS_HUGETLBFS
@@ -51,6 +54,7 @@ config LOONGARCH
5154
select ARCH_WANTS_NO_INSTR
5255
select BUILDTIME_TABLE_SORT
5356
select COMMON_CLK
57+
select EFI
5458
select GENERIC_CLOCKEVENTS
5559
select GENERIC_CMOS_UPDATE
5660
select GENERIC_CPU_AUTOPROBE
@@ -86,6 +90,7 @@ config LOONGARCH
8690
select HAVE_IRQ_TIME_ACCOUNTING
8791
select HAVE_MOD_ARCH_SPECIFIC
8892
select HAVE_NMI
93+
select HAVE_PCI
8994
select HAVE_PERF_EVENTS
9095
select HAVE_REGS_AND_STACK_ACCESS_API
9196
select HAVE_RSEQ
@@ -95,20 +100,27 @@ config LOONGARCH
95100
select HAVE_VIRT_CPU_ACCOUNTING_GEN if !SMP
96101
select IRQ_FORCED_THREADING
97102
select IRQ_LOONGARCH_CPU
103+
select MMU_GATHER_MERGE_VMAS if MMU
98104
select MODULES_USE_ELF_RELA if MODULES
99105
select NEED_PER_CPU_EMBED_FIRST_CHUNK
100106
select NEED_PER_CPU_PAGE_FIRST_CHUNK
101107
select OF
102108
select OF_EARLY_FLATTREE
109+
select PCI
110+
select PCI_DOMAINS_GENERIC
111+
select PCI_ECAM if ACPI
112+
select PCI_LOONGSON
113+
select PCI_MSI_ARCH_FALLBACKS
103114
select PERF_USE_VMALLOC
104115
select RTC_LIB
116+
select SMP
105117
select SPARSE_IRQ
106118
select SYSCTL_EXCEPTION_TRACE
107119
select SWIOTLB
108120
select TRACE_IRQFLAGS_SUPPORT
109121
select USE_PERCPU_NUMA_NODE_ID
122+
select USER_STACKTRACE_SUPPORT
110123
select ZONE_DMA32
111-
select MMU_GATHER_MERGE_VMAS if MMU
112124

113125
config 32BIT
114126
bool
@@ -141,6 +153,10 @@ config LOCKDEP_SUPPORT
141153
bool
142154
default y
143155

156+
config STACKTRACE_SUPPORT
157+
bool
158+
default y
159+
144160
# MACH_LOONGSON32 and MACH_LOONGSON64 are delibrately carried over from the
145161
# MIPS Loongson code, to preserve Loongson-specific code paths in drivers that
146162
# are shared between architectures, and specifically expecting the symbols.

arch/loongarch/Kconfig.debug

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
choice
2+
prompt "Choose kernel unwinder"
3+
default UNWINDER_PROLOGUE if KALLSYMS
4+
help
5+
This determines which method will be used for unwinding kernel stack
6+
traces for panics, oopses, bugs, warnings, perf, /proc/<pid>/stack,
7+
lockdep, and more.
8+
9+
config UNWINDER_GUESS
10+
bool "Guess unwinder"
11+
help
12+
This option enables the "guess" unwinder for unwinding kernel stack
13+
traces. It scans the stack and reports every kernel text address it
14+
finds. Some of the addresses it reports may be incorrect.
15+
16+
While this option often produces false positives, it can still be
17+
useful in many cases.
18+
19+
config UNWINDER_PROLOGUE
20+
bool "Prologue unwinder"
21+
depends on KALLSYMS
22+
help
23+
This option enables the "prologue" unwinder for unwinding kernel stack
24+
traces. It unwind the stack frame based on prologue code analyze. Symbol
25+
information is needed, at least the address and length of each function.
26+
Some of the addresses it reports may be incorrect (but better than the
27+
Guess unwinder).
28+
29+
endchoice

arch/loongarch/Makefile

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,8 @@ cflags-y += $(call cc-option, -mno-check-zero-division)
4747
load-y = 0x9000000000200000
4848
bootvars-y = VMLINUX_LOAD_ADDRESS=$(load-y)
4949

50+
drivers-$(CONFIG_PCI) += arch/loongarch/pci/
51+
5052
KBUILD_AFLAGS += $(cflags-y)
5153
KBUILD_CFLAGS += $(cflags-y)
5254
KBUILD_CPPFLAGS += -DVMLINUX_LOAD_ADDRESS=$(load-y)

arch/loongarch/configs/loongson3_defconfig

Lines changed: 33 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -278,6 +278,8 @@ CONFIG_NET_ACT_IPT=m
278278
CONFIG_NET_ACT_NAT=m
279279
CONFIG_NET_ACT_BPF=m
280280
CONFIG_OPENVSWITCH=m
281+
CONFIG_VSOCKETS=m
282+
CONFIG_VIRTIO_VSOCKETS=m
281283
CONFIG_NETLINK_DIAG=y
282284
CONFIG_CGROUP_NET_PRIO=y
283285
CONFIG_BT=m
@@ -289,6 +291,7 @@ CONFIG_MAC80211=m
289291
CONFIG_RFKILL=m
290292
CONFIG_RFKILL_INPUT=y
291293
CONFIG_NET_9P=y
294+
CONFIG_NET_9P_VIRTIO=y
292295
CONFIG_CEPH_LIB=m
293296
CONFIG_PCIEPORTBUS=y
294297
CONFIG_HOTPLUG_PCI_PCIE=y
@@ -308,6 +311,8 @@ CONFIG_RAPIDIO_MPORT_CDEV=m
308311
CONFIG_UEVENT_HELPER=y
309312
CONFIG_DEVTMPFS=y
310313
CONFIG_DEVTMPFS_MOUNT=y
314+
CONFIG_FW_LOADER_COMPRESS=y
315+
CONFIG_FW_LOADER_COMPRESS_ZSTD=y
311316
CONFIG_MTD=m
312317
CONFIG_MTD_BLOCK=m
313318
CONFIG_MTD_CFI=m
@@ -328,8 +333,19 @@ CONFIG_BLK_DEV_CRYPTOLOOP=y
328333
CONFIG_BLK_DEV_NBD=m
329334
CONFIG_BLK_DEV_RAM=y
330335
CONFIG_BLK_DEV_RAM_SIZE=8192
336+
CONFIG_VIRTIO_BLK=y
331337
CONFIG_BLK_DEV_RBD=m
332338
CONFIG_BLK_DEV_NVME=y
339+
CONFIG_NVME_MULTIPATH=y
340+
CONFIG_NVME_RDMA=m
341+
CONFIG_NVME_FC=m
342+
CONFIG_NVME_TCP=m
343+
CONFIG_NVME_TARGET=m
344+
CONFIG_NVME_TARGET_PASSTHRU=y
345+
CONFIG_NVME_TARGET_LOOP=m
346+
CONFIG_NVME_TARGET_RDMA=m
347+
CONFIG_NVME_TARGET_FC=m
348+
CONFIG_NVME_TARGET_TCP=m
333349
CONFIG_EEPROM_AT24=m
334350
CONFIG_BLK_DEV_SD=y
335351
CONFIG_BLK_DEV_SR=y
@@ -359,6 +375,7 @@ CONFIG_SCSI_QLA_FC=m
359375
CONFIG_TCM_QLA2XXX=m
360376
CONFIG_SCSI_QLA_ISCSI=m
361377
CONFIG_SCSI_LPFC=m
378+
CONFIG_SCSI_VIRTIO=m
362379
CONFIG_ATA=y
363380
CONFIG_SATA_AHCI=y
364381
CONFIG_SATA_AHCI_PLATFORM=y
@@ -403,6 +420,7 @@ CONFIG_VXLAN=y
403420
CONFIG_RIONET=m
404421
CONFIG_TUN=m
405422
CONFIG_VETH=m
423+
CONFIG_VIRTIO_NET=m
406424
# CONFIG_NET_VENDOR_3COM is not set
407425
# CONFIG_NET_VENDOR_ADAPTEC is not set
408426
# CONFIG_NET_VENDOR_AGERE is not set
@@ -527,10 +545,12 @@ CONFIG_SERIAL_8250_SHARE_IRQ=y
527545
CONFIG_SERIAL_8250_RSA=y
528546
CONFIG_SERIAL_NONSTANDARD=y
529547
CONFIG_PRINTER=m
548+
CONFIG_VIRTIO_CONSOLE=y
530549
CONFIG_IPMI_HANDLER=m
531550
CONFIG_IPMI_DEVICE_INTERFACE=m
532551
CONFIG_IPMI_SI=m
533552
CONFIG_HW_RANDOM=y
553+
CONFIG_HW_RANDOM_VIRTIO=m
534554
CONFIG_I2C_CHARDEV=y
535555
CONFIG_I2C_PIIX4=y
536556
CONFIG_I2C_GPIO=y
@@ -568,6 +588,8 @@ CONFIG_DRM_AMDGPU_SI=y
568588
CONFIG_DRM_AMDGPU_CIK=y
569589
CONFIG_DRM_AMDGPU_USERPTR=y
570590
CONFIG_DRM_AST=y
591+
CONFIG_DRM_QXL=m
592+
CONFIG_DRM_VIRTIO_GPU=m
571593
CONFIG_FB=y
572594
CONFIG_FB_EFI=y
573595
CONFIG_FB_RADEON=y
@@ -637,7 +659,16 @@ CONFIG_UIO=m
637659
CONFIG_UIO_PDRV_GENIRQ=m
638660
CONFIG_UIO_DMEM_GENIRQ=m
639661
CONFIG_UIO_PCI_GENERIC=m
640-
# CONFIG_VIRTIO_MENU is not set
662+
CONFIG_VFIO=m
663+
CONFIG_VFIO_PCI=m
664+
CONFIG_VIRTIO_PCI=y
665+
CONFIG_VIRTIO_BALLOON=m
666+
CONFIG_VIRTIO_INPUT=m
667+
CONFIG_VIRTIO_MMIO=m
668+
CONFIG_VIRTIO_MMIO_CMDLINE_DEVICES=y
669+
CONFIG_VHOST_NET=m
670+
CONFIG_VHOST_SCSI=m
671+
CONFIG_VHOST_VSOCK=m
641672
CONFIG_COMEDI=m
642673
CONFIG_COMEDI_PCI_DRIVERS=m
643674
CONFIG_COMEDI_8255_PCI=m
@@ -762,6 +793,7 @@ CONFIG_CRYPTO_USER_API_HASH=m
762793
CONFIG_CRYPTO_USER_API_SKCIPHER=m
763794
CONFIG_CRYPTO_USER_API_RNG=m
764795
CONFIG_CRYPTO_USER_API_AEAD=m
796+
CONFIG_CRYPTO_DEV_VIRTIO=m
765797
CONFIG_PRINTK_TIME=y
766798
CONFIG_STRIP_ASM_SYMS=y
767799
CONFIG_MAGIC_SYSRQ=y

arch/loongarch/include/asm/bootinfo.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,10 +28,10 @@ struct loongson_board_info {
2828
struct loongson_system_configuration {
2929
int nr_cpus;
3030
int nr_nodes;
31-
int nr_io_pics;
3231
int boot_cpu_id;
3332
int cores_per_node;
3433
int cores_per_package;
34+
unsigned long cores_io_master;
3535
const char *cpuname;
3636
};
3737

arch/loongarch/include/asm/dma.h

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
/* SPDX-License-Identifier: GPL-2.0 */
2+
/*
3+
* Copyright (C) 2020-2022 Loongson Technology Corporation Limited
4+
*/
5+
#ifndef __ASM_DMA_H
6+
#define __ASM_DMA_H
7+
8+
#define MAX_DMA_ADDRESS PAGE_OFFSET
9+
#define MAX_DMA32_PFN (1UL << (32 - PAGE_SHIFT))
10+
11+
#endif

arch/loongarch/include/asm/inst.h

Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,12 +23,33 @@ enum reg1i20_op {
2323
lu32id_op = 0x0b,
2424
};
2525

26+
enum reg1i21_op {
27+
beqz_op = 0x10,
28+
bnez_op = 0x11,
29+
};
30+
2631
enum reg2i12_op {
32+
addiw_op = 0x0a,
33+
addid_op = 0x0b,
2734
lu52id_op = 0x0c,
35+
ldb_op = 0xa0,
36+
ldh_op = 0xa1,
37+
ldw_op = 0xa2,
38+
ldd_op = 0xa3,
39+
stb_op = 0xa4,
40+
sth_op = 0xa5,
41+
stw_op = 0xa6,
42+
std_op = 0xa7,
2843
};
2944

3045
enum reg2i16_op {
3146
jirl_op = 0x13,
47+
beq_op = 0x16,
48+
bne_op = 0x17,
49+
blt_op = 0x18,
50+
bge_op = 0x19,
51+
bltu_op = 0x1a,
52+
bgeu_op = 0x1b,
3253
};
3354

3455
struct reg0i26_format {
@@ -110,6 +131,37 @@ enum loongarch_gpr {
110131
LOONGARCH_GPR_MAX
111132
};
112133

134+
#define is_imm12_negative(val) is_imm_negative(val, 12)
135+
136+
static inline bool is_imm_negative(unsigned long val, unsigned int bit)
137+
{
138+
return val & (1UL << (bit - 1));
139+
}
140+
141+
static inline bool is_branch_ins(union loongarch_instruction *ip)
142+
{
143+
return ip->reg1i21_format.opcode >= beqz_op &&
144+
ip->reg1i21_format.opcode <= bgeu_op;
145+
}
146+
147+
static inline bool is_ra_save_ins(union loongarch_instruction *ip)
148+
{
149+
/* st.d $ra, $sp, offset */
150+
return ip->reg2i12_format.opcode == std_op &&
151+
ip->reg2i12_format.rj == LOONGARCH_GPR_SP &&
152+
ip->reg2i12_format.rd == LOONGARCH_GPR_RA &&
153+
!is_imm12_negative(ip->reg2i12_format.immediate);
154+
}
155+
156+
static inline bool is_stack_alloc_ins(union loongarch_instruction *ip)
157+
{
158+
/* addi.d $sp, $sp, -imm */
159+
return ip->reg2i12_format.opcode == addid_op &&
160+
ip->reg2i12_format.rj == LOONGARCH_GPR_SP &&
161+
ip->reg2i12_format.rd == LOONGARCH_GPR_SP &&
162+
is_imm12_negative(ip->reg2i12_format.immediate);
163+
}
164+
113165
u32 larch_insn_gen_lu32id(enum loongarch_gpr rd, int imm);
114166
u32 larch_insn_gen_lu52id(enum loongarch_gpr rd, enum loongarch_gpr rj, int imm);
115167
u32 larch_insn_gen_jirl(enum loongarch_gpr rd, enum loongarch_gpr rj, unsigned long pc, unsigned long dest);

arch/loongarch/include/asm/irq.h

Lines changed: 0 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -82,8 +82,6 @@ extern struct acpi_vector_group msi_group[MAX_IO_PICS];
8282
#define GSI_MAX_PCH_IRQ (LOONGSON_PCH_IRQ_BASE + 256 - 1)
8383

8484
extern int find_pch_pic(u32 gsi);
85-
extern int eiointc_get_node(int id);
86-
8785
struct acpi_madt_lio_pic;
8886
struct acpi_madt_eio_pic;
8987
struct acpi_madt_ht_pic;
@@ -100,16 +98,8 @@ struct irq_domain *htvec_acpi_init(struct irq_domain *parent,
10098
struct acpi_madt_ht_pic *acpi_htvec);
10199
int pch_lpc_acpi_init(struct irq_domain *parent,
102100
struct acpi_madt_lpc_pic *acpi_pchlpc);
103-
#if IS_ENABLED(CONFIG_LOONGSON_PCH_MSI)
104101
int pch_msi_acpi_init(struct irq_domain *parent,
105102
struct acpi_madt_msi_pic *acpi_pchmsi);
106-
#else
107-
static inline int pch_msi_acpi_init(struct irq_domain *parent,
108-
struct acpi_madt_msi_pic *acpi_pchmsi)
109-
{
110-
return 0;
111-
}
112-
#endif
113103
int pch_pic_acpi_init(struct irq_domain *parent,
114104
struct acpi_madt_bio_pic *acpi_pchpic);
115105
int find_pch_pic(u32 gsi);

0 commit comments

Comments
 (0)