Commit 9b6de136 authored by Linus Torvalds's avatar Linus Torvalds

Merge tag 'loongarch-fixes-6.7-1' of...

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

Pull LoongArch fixes from Huacai Chen:
 "Fix several build errors, a potential kernel panic, a cpu hotplug
  issue and update links in documentations"

* tag 'loongarch-fixes-6.7-1' of git://git.kernel.org/pub/scm/linux/kernel/git/chenhuacai/linux-loongson:
  Docs/zh_CN/LoongArch: Update links in LoongArch introduction.rst
  Docs/LoongArch: Update links in LoongArch introduction.rst
  LoongArch: Implement constant timer shutdown interface
  LoongArch: Mark {dmw,tlb}_virt_to_page() exports as non-GPL
  LoongArch: Silence the boot warning about 'nokaslr'
  LoongArch: Add __percpu annotation for __percpu_read()/__percpu_write()
  LoongArch: Record pc instead of offset in la_abs relocation
  LoongArch: Explicitly set -fdirect-access-external-data for vmlinux
  LoongArch: Add dependency between vmlinuz.efi and vmlinux.efi
parents 05c8c94e c517fd27
...@@ -375,9 +375,9 @@ Developer web site of Loongson and LoongArch (Software and Documentation): ...@@ -375,9 +375,9 @@ Developer web site of Loongson and LoongArch (Software and Documentation):
Documentation of LoongArch ISA: Documentation of LoongArch ISA:
https://github.com/loongson/LoongArch-Documentation/releases/latest/download/LoongArch-Vol1-v1.02-CN.pdf (in Chinese) https://github.com/loongson/LoongArch-Documentation/releases/latest/download/LoongArch-Vol1-v1.10-CN.pdf (in Chinese)
https://github.com/loongson/LoongArch-Documentation/releases/latest/download/LoongArch-Vol1-v1.02-EN.pdf (in English) https://github.com/loongson/LoongArch-Documentation/releases/latest/download/LoongArch-Vol1-v1.10-EN.pdf (in English)
Documentation of LoongArch ELF psABI: Documentation of LoongArch ELF psABI:
......
...@@ -338,9 +338,9 @@ Loongson与LoongArch的开发者网站(软件与文档资源): ...@@ -338,9 +338,9 @@ Loongson与LoongArch的开发者网站(软件与文档资源):
LoongArch指令集架构的文档: LoongArch指令集架构的文档:
https://github.com/loongson/LoongArch-Documentation/releases/latest/download/LoongArch-Vol1-v1.02-CN.pdf (中文版) https://github.com/loongson/LoongArch-Documentation/releases/latest/download/LoongArch-Vol1-v1.10-CN.pdf (中文版)
https://github.com/loongson/LoongArch-Documentation/releases/latest/download/LoongArch-Vol1-v1.02-EN.pdf (英文版) https://github.com/loongson/LoongArch-Documentation/releases/latest/download/LoongArch-Vol1-v1.10-EN.pdf (英文版)
LoongArch的ELF psABI文档: LoongArch的ELF psABI文档:
......
...@@ -68,6 +68,7 @@ LDFLAGS_vmlinux += -static -n -nostdlib ...@@ -68,6 +68,7 @@ LDFLAGS_vmlinux += -static -n -nostdlib
ifdef CONFIG_AS_HAS_EXPLICIT_RELOCS ifdef CONFIG_AS_HAS_EXPLICIT_RELOCS
cflags-y += $(call cc-option,-mexplicit-relocs) cflags-y += $(call cc-option,-mexplicit-relocs)
KBUILD_CFLAGS_KERNEL += $(call cc-option,-mdirect-extern-access) KBUILD_CFLAGS_KERNEL += $(call cc-option,-mdirect-extern-access)
KBUILD_CFLAGS_KERNEL += $(call cc-option,-fdirect-access-external-data)
KBUILD_AFLAGS_MODULE += $(call cc-option,-fno-direct-access-external-data) KBUILD_AFLAGS_MODULE += $(call cc-option,-fno-direct-access-external-data)
KBUILD_CFLAGS_MODULE += $(call cc-option,-fno-direct-access-external-data) KBUILD_CFLAGS_MODULE += $(call cc-option,-fno-direct-access-external-data)
KBUILD_AFLAGS_MODULE += $(call cc-option,-mno-relax) $(call cc-option,-Wa$(comma)-mno-relax) KBUILD_AFLAGS_MODULE += $(call cc-option,-mno-relax) $(call cc-option,-Wa$(comma)-mno-relax)
...@@ -142,6 +143,8 @@ vdso-install-y += arch/loongarch/vdso/vdso.so.dbg ...@@ -142,6 +143,8 @@ vdso-install-y += arch/loongarch/vdso/vdso.so.dbg
all: $(notdir $(KBUILD_IMAGE)) all: $(notdir $(KBUILD_IMAGE))
vmlinuz.efi: vmlinux.efi
vmlinux.elf vmlinux.efi vmlinuz.efi: vmlinux vmlinux.elf vmlinux.efi vmlinuz.efi: vmlinux
$(Q)$(MAKE) $(build)=$(boot) $(bootvars-y) $(boot)/$@ $(Q)$(MAKE) $(build)=$(boot) $(bootvars-y) $(boot)/$@
......
...@@ -609,8 +609,7 @@ ...@@ -609,8 +609,7 @@
lu32i.d \reg, 0 lu32i.d \reg, 0
lu52i.d \reg, \reg, 0 lu52i.d \reg, \reg, 0
.pushsection ".la_abs", "aw", %progbits .pushsection ".la_abs", "aw", %progbits
768: .dword 766b
.dword 768b-766b
.dword \sym .dword \sym
.popsection .popsection
#endif #endif
......
...@@ -63,7 +63,7 @@ PERCPU_OP(and, and, &) ...@@ -63,7 +63,7 @@ PERCPU_OP(and, and, &)
PERCPU_OP(or, or, |) PERCPU_OP(or, or, |)
#undef PERCPU_OP #undef PERCPU_OP
static __always_inline unsigned long __percpu_read(void *ptr, int size) static __always_inline unsigned long __percpu_read(void __percpu *ptr, int size)
{ {
unsigned long ret; unsigned long ret;
...@@ -100,7 +100,7 @@ static __always_inline unsigned long __percpu_read(void *ptr, int size) ...@@ -100,7 +100,7 @@ static __always_inline unsigned long __percpu_read(void *ptr, int size)
return ret; return ret;
} }
static __always_inline void __percpu_write(void *ptr, unsigned long val, int size) static __always_inline void __percpu_write(void __percpu *ptr, unsigned long val, int size)
{ {
switch (size) { switch (size) {
case 1: case 1:
...@@ -132,8 +132,7 @@ static __always_inline void __percpu_write(void *ptr, unsigned long val, int siz ...@@ -132,8 +132,7 @@ static __always_inline void __percpu_write(void *ptr, unsigned long val, int siz
} }
} }
static __always_inline unsigned long __percpu_xchg(void *ptr, unsigned long val, static __always_inline unsigned long __percpu_xchg(void *ptr, unsigned long val, int size)
int size)
{ {
switch (size) { switch (size) {
case 1: case 1:
......
...@@ -25,7 +25,7 @@ extern void set_merr_handler(unsigned long offset, void *addr, unsigned long len ...@@ -25,7 +25,7 @@ extern void set_merr_handler(unsigned long offset, void *addr, unsigned long len
#ifdef CONFIG_RELOCATABLE #ifdef CONFIG_RELOCATABLE
struct rela_la_abs { struct rela_la_abs {
long offset; long pc;
long symvalue; long symvalue;
}; };
......
...@@ -52,7 +52,7 @@ static inline void __init relocate_absolute(long random_offset) ...@@ -52,7 +52,7 @@ static inline void __init relocate_absolute(long random_offset)
for (p = begin; (void *)p < end; p++) { for (p = begin; (void *)p < end; p++) {
long v = p->symvalue; long v = p->symvalue;
uint32_t lu12iw, ori, lu32id, lu52id; uint32_t lu12iw, ori, lu32id, lu52id;
union loongarch_instruction *insn = (void *)p - p->offset; union loongarch_instruction *insn = (void *)p->pc;
lu12iw = (v >> 12) & 0xfffff; lu12iw = (v >> 12) & 0xfffff;
ori = v & 0xfff; ori = v & 0xfff;
...@@ -102,6 +102,14 @@ static inline __init unsigned long get_random_boot(void) ...@@ -102,6 +102,14 @@ static inline __init unsigned long get_random_boot(void)
return hash; return hash;
} }
static int __init nokaslr(char *p)
{
pr_info("KASLR is disabled.\n");
return 0; /* Print a notice and silence the boot warning */
}
early_param("nokaslr", nokaslr);
static inline __init bool kaslr_disabled(void) static inline __init bool kaslr_disabled(void)
{ {
char *str; char *str;
......
...@@ -58,14 +58,16 @@ static int constant_set_state_oneshot(struct clock_event_device *evt) ...@@ -58,14 +58,16 @@ static int constant_set_state_oneshot(struct clock_event_device *evt)
return 0; return 0;
} }
static int constant_set_state_oneshot_stopped(struct clock_event_device *evt) static int constant_set_state_periodic(struct clock_event_device *evt)
{ {
unsigned long period;
unsigned long timer_config; unsigned long timer_config;
raw_spin_lock(&state_lock); raw_spin_lock(&state_lock);
timer_config = csr_read64(LOONGARCH_CSR_TCFG); period = const_clock_freq / HZ;
timer_config &= ~CSR_TCFG_EN; timer_config = period & CSR_TCFG_VAL;
timer_config |= (CSR_TCFG_PERIOD | CSR_TCFG_EN);
csr_write64(timer_config, LOONGARCH_CSR_TCFG); csr_write64(timer_config, LOONGARCH_CSR_TCFG);
raw_spin_unlock(&state_lock); raw_spin_unlock(&state_lock);
...@@ -73,16 +75,14 @@ static int constant_set_state_oneshot_stopped(struct clock_event_device *evt) ...@@ -73,16 +75,14 @@ static int constant_set_state_oneshot_stopped(struct clock_event_device *evt)
return 0; return 0;
} }
static int constant_set_state_periodic(struct clock_event_device *evt) static int constant_set_state_shutdown(struct clock_event_device *evt)
{ {
unsigned long period;
unsigned long timer_config; unsigned long timer_config;
raw_spin_lock(&state_lock); raw_spin_lock(&state_lock);
period = const_clock_freq / HZ; timer_config = csr_read64(LOONGARCH_CSR_TCFG);
timer_config = period & CSR_TCFG_VAL; timer_config &= ~CSR_TCFG_EN;
timer_config |= (CSR_TCFG_PERIOD | CSR_TCFG_EN);
csr_write64(timer_config, LOONGARCH_CSR_TCFG); csr_write64(timer_config, LOONGARCH_CSR_TCFG);
raw_spin_unlock(&state_lock); raw_spin_unlock(&state_lock);
...@@ -90,11 +90,6 @@ static int constant_set_state_periodic(struct clock_event_device *evt) ...@@ -90,11 +90,6 @@ static int constant_set_state_periodic(struct clock_event_device *evt)
return 0; return 0;
} }
static int constant_set_state_shutdown(struct clock_event_device *evt)
{
return 0;
}
static int constant_timer_next_event(unsigned long delta, struct clock_event_device *evt) static int constant_timer_next_event(unsigned long delta, struct clock_event_device *evt)
{ {
unsigned long timer_config; unsigned long timer_config;
...@@ -161,7 +156,7 @@ int constant_clockevent_init(void) ...@@ -161,7 +156,7 @@ int constant_clockevent_init(void)
cd->rating = 320; cd->rating = 320;
cd->cpumask = cpumask_of(cpu); cd->cpumask = cpumask_of(cpu);
cd->set_state_oneshot = constant_set_state_oneshot; cd->set_state_oneshot = constant_set_state_oneshot;
cd->set_state_oneshot_stopped = constant_set_state_oneshot_stopped; cd->set_state_oneshot_stopped = constant_set_state_shutdown;
cd->set_state_periodic = constant_set_state_periodic; cd->set_state_periodic = constant_set_state_periodic;
cd->set_state_shutdown = constant_set_state_shutdown; cd->set_state_shutdown = constant_set_state_shutdown;
cd->set_next_event = constant_timer_next_event; cd->set_next_event = constant_timer_next_event;
......
...@@ -13,13 +13,13 @@ struct page *dmw_virt_to_page(unsigned long kaddr) ...@@ -13,13 +13,13 @@ struct page *dmw_virt_to_page(unsigned long kaddr)
{ {
return pfn_to_page(virt_to_pfn(kaddr)); return pfn_to_page(virt_to_pfn(kaddr));
} }
EXPORT_SYMBOL_GPL(dmw_virt_to_page); EXPORT_SYMBOL(dmw_virt_to_page);
struct page *tlb_virt_to_page(unsigned long kaddr) struct page *tlb_virt_to_page(unsigned long kaddr)
{ {
return pfn_to_page(pte_pfn(*virt_to_kpte(kaddr))); return pfn_to_page(pte_pfn(*virt_to_kpte(kaddr)));
} }
EXPORT_SYMBOL_GPL(tlb_virt_to_page); EXPORT_SYMBOL(tlb_virt_to_page);
pgd_t *pgd_alloc(struct mm_struct *mm) pgd_t *pgd_alloc(struct mm_struct *mm)
{ {
......
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