Assorted arm64 fixes and clean-ups, the most important:
- Restore terminal stack frame records. Their previous removal caused traces which cross secondary_start_kernel to terminate one entry too late, with a spurious "0" entry. - Fix boot warning with pseudo-NMI due to the way we manipulate the PMR register. - ACPI fixes: avoid corruption of interrupt mappings on watchdog probe failure (GTDT), prevent unregistering of GIC SGIs. - Force SPARSEMEM_VMEMMAP as the only memory model, it saves with having to test all the other combinations. - Documentation fixes and updates: tagged address ABI exceptions on brk/mmap/mremap(), event stream frequency, update booting requirements on the configuration of traps. -----BEGIN PGP SIGNATURE----- iQIzBAABCgAdFiEE5RElWfyWxS+3PLO2a9axLQDIXvEFAmCVba0ACgkQa9axLQDI XvEClxAAsqigp+Mnotdr8YUOuXLjHWU41EMShV6WbFcmlViEyZxxtZ5qavw19T3L rPxb8hq9QqI8kCd+j4MAU7cdc0ry+047njJmQ3Va0WeiDsbgEfPvLWPguDbeDFXW EjKKib+F/u58IffDkn6rVA7ZVPgYHRH+8yw6EdApp0BN4JuxEFzGBzG4EWKXnNHH IOu4IIXlbLX+U1kTtUFR4u6i4uBs2pZdEYzo1NF/Joacg14F01CBRuh8U04eeWFD HF4pWd4eCl/bLYPurF1rOi1dIUyrPuaPgNInGEdSaocD0hIvQH0r0wyIt+aMmqvK 9Jm+dDEGeLxQn2nDrXfyldYG5EbFa3OplkUt2MVDDMWwN2Gpsjlnf/ucff/SBT/N 7D6AL2OH6KDDCsNgU1JH9H6rAlh4nWJcsMBrWmP7aQtBMRyccQLywrt4HXB8cy7E +MyhTit05P3lpsrK2uZSFujK35Ts8hxywA7lAlU7YP4ADKu3Noc6qXSaxZRe+1Gb O5k3Qdcih0VLE843PjJj8f8fW1ysJW5J60cK9BaZxpB77gNufKkh/hS6YAiA8qkt PT3J0jk/cgGvwKK54rW52dG7qvDImgUMGkXGKQnEimgb62DatCZ4ZOPC+UoiDiqO SEd1DSW0Lt1VxVIulAjatVgzIJGM0jGCm9L7/vBguR0+Lahakbg= =vYok -----END PGP SIGNATURE----- Merge tag 'arm64-fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/arm64/linux Pull more arm64 updates from Catalin Marinas: "A mix of fixes and clean-ups that turned up too late for the first pull request: - Restore terminal stack frame records. Their previous removal caused traces which cross secondary_start_kernel to terminate one entry too late, with a spurious "0" entry. - Fix boot warning with pseudo-NMI due to the way we manipulate the PMR register. - ACPI fixes: avoid corruption of interrupt mappings on watchdog probe failure (GTDT), prevent unregistering of GIC SGIs. - Force SPARSEMEM_VMEMMAP as the only memory model, it saves with having to test all the other combinations. - Documentation fixes and updates: tagged address ABI exceptions on brk/mmap/mremap(), event stream frequency, update booting requirements on the configuration of traps" * tag 'arm64-fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/arm64/linux: arm64: kernel: Update the stale comment arm64: Fix the documented event stream frequency arm64: entry: always set GIC_PRIO_PSR_I_SET during entry arm64: Explicitly document boot requirements for SVE arm64: Explicitly require that FPSIMD instructions do not trap arm64: Relax booting requirements for configuration of traps arm64: cpufeatures: use min and max arm64: stacktrace: restore terminal records arm64/vdso: Discard .note.gnu.property sections in vDSO arm64: doc: Add brk/mmap/mremap() to the Tagged Address ABI Exceptions psci: Remove unneeded semicolon ACPI: irq: Prevent unregistering of GIC SGIs ACPI: GTDT: Don't corrupt interrupt mappings on watchdow probe failure arm64: Show three registers per line arm64: remove HAVE_DEBUG_BUGVERBOSE arm64: alternative: simplify passing alt_region arm64: Force SPARSEMEM_VMEMMAP as the only memory management model arm64: vdso32: drop -no-integrated-as flag
This commit is contained in:
commit
51595e3b49
|
@ -277,9 +277,40 @@ Before jumping into the kernel, the following conditions must be met:
|
|||
|
||||
- SCR_EL3.FGTEn (bit 27) must be initialised to 0b1.
|
||||
|
||||
For CPUs with Advanced SIMD and floating point support:
|
||||
|
||||
- If EL3 is present:
|
||||
|
||||
- CPTR_EL3.TFP (bit 10) must be initialised to 0b0.
|
||||
|
||||
- If EL2 is present and the kernel is entered at EL1:
|
||||
|
||||
- CPTR_EL2.TFP (bit 10) must be initialised to 0b0.
|
||||
|
||||
For CPUs with the Scalable Vector Extension (FEAT_SVE) present:
|
||||
|
||||
- if EL3 is present:
|
||||
|
||||
- CPTR_EL3.EZ (bit 8) must be initialised to 0b1.
|
||||
|
||||
- ZCR_EL3.LEN must be initialised to the same value for all CPUs the
|
||||
kernel is executed on.
|
||||
|
||||
- If the kernel is entered at EL1 and EL2 is present:
|
||||
|
||||
- CPTR_EL2.TZ (bit 8) must be initialised to 0b0.
|
||||
|
||||
- CPTR_EL2.ZEN (bits 17:16) must be initialised to 0b11.
|
||||
|
||||
- ZCR_EL2.LEN must be initialised to the same value for all CPUs the
|
||||
kernel will execute on.
|
||||
|
||||
The requirements described above for CPU mode, caches, MMUs, architected
|
||||
timers, coherency and system registers apply to all CPUs. All CPUs must
|
||||
enter the kernel in the same exception level.
|
||||
enter the kernel in the same exception level. Where the values documented
|
||||
disable traps it is permissible for these traps to be enabled so long as
|
||||
those traps are handled transparently by higher exception levels as though
|
||||
the values documented were set.
|
||||
|
||||
The boot loader is expected to enter the kernel on each CPU in the
|
||||
following manner:
|
||||
|
|
|
@ -74,7 +74,7 @@ HWCAP_ASIMD
|
|||
|
||||
HWCAP_EVTSTRM
|
||||
The generic timer is configured to generate events at a frequency of
|
||||
approximately 100KHz.
|
||||
approximately 10KHz.
|
||||
|
||||
HWCAP_AES
|
||||
Functionality implied by ID_AA64ISAR0_EL1.AES == 0b0001.
|
||||
|
|
|
@ -113,6 +113,12 @@ ABI relaxation:
|
|||
|
||||
- ``shmat()`` and ``shmdt()``.
|
||||
|
||||
- ``brk()`` (since kernel v5.6).
|
||||
|
||||
- ``mmap()`` (since kernel v5.6).
|
||||
|
||||
- ``mremap()``, the ``new_address`` argument (since kernel v5.6).
|
||||
|
||||
Any attempt to use non-zero tagged pointers may result in an error code
|
||||
being returned, a (fatal) signal being raised, or other modes of
|
||||
failure.
|
||||
|
|
|
@ -170,7 +170,6 @@ config ARM64
|
|||
select HAVE_CMPXCHG_DOUBLE
|
||||
select HAVE_CMPXCHG_LOCAL
|
||||
select HAVE_CONTEXT_TRACKING
|
||||
select HAVE_DEBUG_BUGVERBOSE
|
||||
select HAVE_DEBUG_KMEMLEAK
|
||||
select HAVE_DMA_CONTIGUOUS
|
||||
select HAVE_DYNAMIC_FTRACE
|
||||
|
@ -1061,15 +1060,7 @@ source "kernel/Kconfig.hz"
|
|||
config ARCH_SPARSEMEM_ENABLE
|
||||
def_bool y
|
||||
select SPARSEMEM_VMEMMAP_ENABLE
|
||||
|
||||
config ARCH_SPARSEMEM_DEFAULT
|
||||
def_bool ARCH_SPARSEMEM_ENABLE
|
||||
|
||||
config ARCH_SELECT_MEMORY_MODEL
|
||||
def_bool ARCH_SPARSEMEM_ENABLE
|
||||
|
||||
config ARCH_FLATMEM_ENABLE
|
||||
def_bool !NUMA
|
||||
select SPARSEMEM_VMEMMAP
|
||||
|
||||
config HW_PERF_EVENTS
|
||||
def_bool y
|
||||
|
|
|
@ -131,6 +131,9 @@ static inline void local_daif_inherit(struct pt_regs *regs)
|
|||
if (interrupts_enabled(regs))
|
||||
trace_hardirqs_on();
|
||||
|
||||
if (system_uses_irq_prio_masking())
|
||||
gic_write_pmr(regs->pmr_save);
|
||||
|
||||
/*
|
||||
* We can't use local_daif_restore(regs->pstate) here as
|
||||
* system_has_prio_mask_debugging() won't restore the I bit if it can
|
||||
|
|
|
@ -136,7 +136,7 @@
|
|||
* has a direct correspondence, and needs to appear sufficiently aligned
|
||||
* in the virtual address space.
|
||||
*/
|
||||
#if defined(CONFIG_SPARSEMEM_VMEMMAP) && ARM64_MEMSTART_SHIFT < SECTION_SIZE_BITS
|
||||
#if ARM64_MEMSTART_SHIFT < SECTION_SIZE_BITS
|
||||
#define ARM64_MEMSTART_ALIGN (1UL << SECTION_SIZE_BITS)
|
||||
#else
|
||||
#define ARM64_MEMSTART_ALIGN (1UL << ARM64_MEMSTART_SHIFT)
|
||||
|
|
|
@ -345,7 +345,7 @@ static inline void *phys_to_virt(phys_addr_t x)
|
|||
*/
|
||||
#define ARCH_PFN_OFFSET ((unsigned long)PHYS_PFN_OFFSET)
|
||||
|
||||
#if !defined(CONFIG_SPARSEMEM_VMEMMAP) || defined(CONFIG_DEBUG_VIRTUAL)
|
||||
#if defined(CONFIG_DEBUG_VIRTUAL)
|
||||
#define page_to_virt(x) ({ \
|
||||
__typeof__(x) __page = x; \
|
||||
void *__addr = __va(page_to_phys(__page)); \
|
||||
|
@ -365,7 +365,7 @@ static inline void *phys_to_virt(phys_addr_t x)
|
|||
u64 __addr = VMEMMAP_START + (__idx * sizeof(struct page)); \
|
||||
(struct page *)__addr; \
|
||||
})
|
||||
#endif /* !CONFIG_SPARSEMEM_VMEMMAP || CONFIG_DEBUG_VIRTUAL */
|
||||
#endif /* CONFIG_DEBUG_VIRTUAL */
|
||||
|
||||
#define virt_addr_valid(addr) ({ \
|
||||
__typeof__(addr) __addr = __tag_reset(addr); \
|
||||
|
|
|
@ -5,7 +5,6 @@
|
|||
#ifndef __ASM_SPARSEMEM_H
|
||||
#define __ASM_SPARSEMEM_H
|
||||
|
||||
#ifdef CONFIG_SPARSEMEM
|
||||
#define MAX_PHYSMEM_BITS CONFIG_ARM64_PA_BITS
|
||||
|
||||
/*
|
||||
|
@ -27,6 +26,4 @@
|
|||
#define SECTION_SIZE_BITS 27
|
||||
#endif /* CONFIG_ARM64_64K_PAGES */
|
||||
|
||||
#endif /* CONFIG_SPARSEMEM*/
|
||||
|
||||
#endif
|
||||
|
|
|
@ -133,11 +133,10 @@ static void clean_dcache_range_nopatch(u64 start, u64 end)
|
|||
} while (cur += d_size, cur < end);
|
||||
}
|
||||
|
||||
static void __nocfi __apply_alternatives(void *alt_region, bool is_module,
|
||||
unsigned long *feature_mask)
|
||||
static void __nocfi __apply_alternatives(struct alt_region *region, bool is_module,
|
||||
unsigned long *feature_mask)
|
||||
{
|
||||
struct alt_instr *alt;
|
||||
struct alt_region *region = alt_region;
|
||||
__le32 *origptr, *updptr;
|
||||
alternative_cb_t alt_cb;
|
||||
|
||||
|
|
|
@ -68,6 +68,7 @@
|
|||
#include <linux/sort.h>
|
||||
#include <linux/stop_machine.h>
|
||||
#include <linux/types.h>
|
||||
#include <linux/minmax.h>
|
||||
#include <linux/mm.h>
|
||||
#include <linux/cpu.h>
|
||||
#include <linux/kasan.h>
|
||||
|
@ -694,14 +695,14 @@ static s64 arm64_ftr_safe_value(const struct arm64_ftr_bits *ftrp, s64 new,
|
|||
ret = ftrp->safe_val;
|
||||
break;
|
||||
case FTR_LOWER_SAFE:
|
||||
ret = new < cur ? new : cur;
|
||||
ret = min(new, cur);
|
||||
break;
|
||||
case FTR_HIGHER_OR_ZERO_SAFE:
|
||||
if (!cur || !new)
|
||||
break;
|
||||
fallthrough;
|
||||
case FTR_HIGHER_SAFE:
|
||||
ret = new > cur ? new : cur;
|
||||
ret = max(new, cur);
|
||||
break;
|
||||
default:
|
||||
BUG();
|
||||
|
|
|
@ -29,7 +29,7 @@ int arm_cpuidle_init(unsigned int cpu)
|
|||
|
||||
/**
|
||||
* arm_cpuidle_suspend() - function to enter a low-power idle state
|
||||
* @arg: argument to pass to CPU suspend operations
|
||||
* @index: argument to pass to CPU suspend operations
|
||||
*
|
||||
* Return: 0 on success, -EOPNOTSUPP if CPU suspend hook not initialized, CPU
|
||||
* operations back-end error code otherwise.
|
||||
|
|
|
@ -230,14 +230,6 @@ static void noinstr el1_dbg(struct pt_regs *regs, unsigned long esr)
|
|||
{
|
||||
unsigned long far = read_sysreg(far_el1);
|
||||
|
||||
/*
|
||||
* The CPU masked interrupts, and we are leaving them masked during
|
||||
* do_debug_exception(). Update PMR as if we had called
|
||||
* local_daif_mask().
|
||||
*/
|
||||
if (system_uses_irq_prio_masking())
|
||||
gic_write_pmr(GIC_PRIO_IRQON | GIC_PRIO_PSR_I_SET);
|
||||
|
||||
arm64_enter_el1_dbg(regs);
|
||||
if (!cortex_a76_erratum_1463225_debug_handler(regs))
|
||||
do_debug_exception(far, esr, regs);
|
||||
|
@ -404,9 +396,6 @@ static void noinstr el0_dbg(struct pt_regs *regs, unsigned long esr)
|
|||
/* Only watchpoints write FAR_EL1, otherwise its UNKNOWN */
|
||||
unsigned long far = read_sysreg(far_el1);
|
||||
|
||||
if (system_uses_irq_prio_masking())
|
||||
gic_write_pmr(GIC_PRIO_IRQON | GIC_PRIO_PSR_I_SET);
|
||||
|
||||
enter_from_user_mode();
|
||||
do_debug_exception(far, esr, regs);
|
||||
local_daif_restore(DAIF_PROCCTX_NOIRQ);
|
||||
|
@ -414,9 +403,6 @@ static void noinstr el0_dbg(struct pt_regs *regs, unsigned long esr)
|
|||
|
||||
static void noinstr el0_svc(struct pt_regs *regs)
|
||||
{
|
||||
if (system_uses_irq_prio_masking())
|
||||
gic_write_pmr(GIC_PRIO_IRQON | GIC_PRIO_PSR_I_SET);
|
||||
|
||||
enter_from_user_mode();
|
||||
cortex_a76_erratum_1463225_svc_handler();
|
||||
do_el0_svc(regs);
|
||||
|
@ -492,9 +478,6 @@ static void noinstr el0_cp15(struct pt_regs *regs, unsigned long esr)
|
|||
|
||||
static void noinstr el0_svc_compat(struct pt_regs *regs)
|
||||
{
|
||||
if (system_uses_irq_prio_masking())
|
||||
gic_write_pmr(GIC_PRIO_IRQON | GIC_PRIO_PSR_I_SET);
|
||||
|
||||
enter_from_user_mode();
|
||||
cortex_a76_erratum_1463225_svc_handler();
|
||||
do_el0_svc_compat(regs);
|
||||
|
|
|
@ -285,16 +285,16 @@ alternative_else_nop_endif
|
|||
stp lr, x21, [sp, #S_LR]
|
||||
|
||||
/*
|
||||
* For exceptions from EL0, terminate the callchain here.
|
||||
* For exceptions from EL0, create a terminal frame record.
|
||||
* For exceptions from EL1, create a synthetic frame record so the
|
||||
* interrupted code shows up in the backtrace.
|
||||
*/
|
||||
.if \el == 0
|
||||
mov x29, xzr
|
||||
stp xzr, xzr, [sp, #S_STACKFRAME]
|
||||
.else
|
||||
stp x29, x22, [sp, #S_STACKFRAME]
|
||||
add x29, sp, #S_STACKFRAME
|
||||
.endif
|
||||
add x29, sp, #S_STACKFRAME
|
||||
|
||||
#ifdef CONFIG_ARM64_SW_TTBR0_PAN
|
||||
alternative_if_not ARM64_HAS_PAN
|
||||
|
@ -314,6 +314,8 @@ alternative_else_nop_endif
|
|||
alternative_if ARM64_HAS_IRQ_PRIO_MASKING
|
||||
mrs_s x20, SYS_ICC_PMR_EL1
|
||||
str x20, [sp, #S_PMR_SAVE]
|
||||
mov x20, #GIC_PRIO_IRQON | GIC_PRIO_PSR_I_SET
|
||||
msr_s SYS_ICC_PMR_EL1, x20
|
||||
alternative_else_nop_endif
|
||||
|
||||
/* Re-enable tag checking (TCO set on exception entry) */
|
||||
|
@ -550,17 +552,7 @@ tsk .req x28 // current thread_info
|
|||
#endif
|
||||
.endm
|
||||
|
||||
.macro gic_prio_irq_setup, pmr:req, tmp:req
|
||||
#ifdef CONFIG_ARM64_PSEUDO_NMI
|
||||
alternative_if ARM64_HAS_IRQ_PRIO_MASKING
|
||||
orr \tmp, \pmr, #GIC_PRIO_PSR_I_SET
|
||||
msr_s SYS_ICC_PMR_EL1, \tmp
|
||||
alternative_else_nop_endif
|
||||
#endif
|
||||
.endm
|
||||
|
||||
.macro el1_interrupt_handler, handler:req
|
||||
gic_prio_irq_setup pmr=x20, tmp=x1
|
||||
enable_da
|
||||
|
||||
mov x0, sp
|
||||
|
@ -590,7 +582,6 @@ alternative_else_nop_endif
|
|||
.endm
|
||||
|
||||
.macro el0_interrupt_handler, handler:req
|
||||
gic_prio_irq_setup pmr=x20, tmp=x0
|
||||
user_exit_irqoff
|
||||
enable_da
|
||||
|
||||
|
@ -788,7 +779,6 @@ SYM_CODE_END(el0_fiq)
|
|||
SYM_CODE_START_LOCAL(el1_error)
|
||||
kernel_entry 1
|
||||
mrs x1, esr_el1
|
||||
gic_prio_kentry_setup tmp=x2
|
||||
enable_dbg
|
||||
mov x0, sp
|
||||
bl do_serror
|
||||
|
@ -799,7 +789,6 @@ SYM_CODE_START_LOCAL(el0_error)
|
|||
kernel_entry 0
|
||||
el0_error_naked:
|
||||
mrs x25, esr_el1
|
||||
gic_prio_kentry_setup tmp=x2
|
||||
user_exit_irqoff
|
||||
enable_dbg
|
||||
mov x0, sp
|
||||
|
|
|
@ -294,13 +294,10 @@ void __show_regs(struct pt_regs *regs)
|
|||
i = top_reg;
|
||||
|
||||
while (i >= 0) {
|
||||
printk("x%-2d: %016llx ", i, regs->regs[i]);
|
||||
i--;
|
||||
printk("x%-2d: %016llx", i, regs->regs[i]);
|
||||
|
||||
if (i % 2 == 0) {
|
||||
pr_cont("x%-2d: %016llx ", i, regs->regs[i]);
|
||||
i--;
|
||||
}
|
||||
while (i-- % 3)
|
||||
pr_cont(" x%-2d: %016llx", i, regs->regs[i]);
|
||||
|
||||
pr_cont("\n");
|
||||
}
|
||||
|
|
|
@ -68,10 +68,6 @@ int notrace unwind_frame(struct task_struct *tsk, struct stackframe *frame)
|
|||
unsigned long fp = frame->fp;
|
||||
struct stack_info info;
|
||||
|
||||
/* Terminal record; nothing to unwind */
|
||||
if (!fp)
|
||||
return -ENOENT;
|
||||
|
||||
if (fp & 0xf)
|
||||
return -EINVAL;
|
||||
|
||||
|
@ -132,6 +128,12 @@ int notrace unwind_frame(struct task_struct *tsk, struct stackframe *frame)
|
|||
|
||||
frame->pc = ptrauth_strip_insn_pac(frame->pc);
|
||||
|
||||
/*
|
||||
* This is a terminal record, so we have finished unwinding.
|
||||
*/
|
||||
if (!frame->fp && !frame->pc)
|
||||
return -ENOENT;
|
||||
|
||||
return 0;
|
||||
}
|
||||
NOKPROBE_SYMBOL(unwind_frame);
|
||||
|
|
|
@ -31,6 +31,13 @@ SECTIONS
|
|||
.gnu.version_d : { *(.gnu.version_d) }
|
||||
.gnu.version_r : { *(.gnu.version_r) }
|
||||
|
||||
/*
|
||||
* Discard .note.gnu.property sections which are unused and have
|
||||
* different alignment requirement from vDSO note sections.
|
||||
*/
|
||||
/DISCARD/ : {
|
||||
*(.note.GNU-stack .note.gnu.property)
|
||||
}
|
||||
.note : { *(.note.*) } :text :note
|
||||
|
||||
. = ALIGN(16);
|
||||
|
@ -48,7 +55,6 @@ SECTIONS
|
|||
PROVIDE(end = .);
|
||||
|
||||
/DISCARD/ : {
|
||||
*(.note.GNU-stack)
|
||||
*(.data .data.* .gnu.linkonce.d.* .sdata*)
|
||||
*(.bss .sbss .dynbss .dynsbss)
|
||||
*(.eh_frame .eh_frame_hdr)
|
||||
|
|
|
@ -10,15 +10,7 @@ include $(srctree)/lib/vdso/Makefile
|
|||
|
||||
# Same as cc-*option, but using CC_COMPAT instead of CC
|
||||
ifeq ($(CONFIG_CC_IS_CLANG), y)
|
||||
COMPAT_GCC_TOOLCHAIN_DIR := $(dir $(shell which $(CROSS_COMPILE_COMPAT)elfedit))
|
||||
COMPAT_GCC_TOOLCHAIN := $(realpath $(COMPAT_GCC_TOOLCHAIN_DIR)/..)
|
||||
|
||||
CC_COMPAT_CLANG_FLAGS := --target=$(notdir $(CROSS_COMPILE_COMPAT:%-=%))
|
||||
CC_COMPAT_CLANG_FLAGS += --prefix=$(COMPAT_GCC_TOOLCHAIN_DIR)$(notdir $(CROSS_COMPILE_COMPAT))
|
||||
CC_COMPAT_CLANG_FLAGS += -no-integrated-as -Qunused-arguments
|
||||
ifneq ($(COMPAT_GCC_TOOLCHAIN),)
|
||||
CC_COMPAT_CLANG_FLAGS += --gcc-toolchain=$(COMPAT_GCC_TOOLCHAIN)
|
||||
endif
|
||||
|
||||
CC_COMPAT ?= $(CC)
|
||||
CC_COMPAT += $(CC_COMPAT_CLANG_FLAGS)
|
||||
|
|
|
@ -221,6 +221,7 @@ static void __init zone_sizes_init(unsigned long min, unsigned long max)
|
|||
int pfn_valid(unsigned long pfn)
|
||||
{
|
||||
phys_addr_t addr = PFN_PHYS(pfn);
|
||||
struct mem_section *ms;
|
||||
|
||||
/*
|
||||
* Ensure the upper PAGE_SHIFT bits are clear in the
|
||||
|
@ -231,10 +232,6 @@ int pfn_valid(unsigned long pfn)
|
|||
if (PHYS_PFN(addr) != pfn)
|
||||
return 0;
|
||||
|
||||
#ifdef CONFIG_SPARSEMEM
|
||||
{
|
||||
struct mem_section *ms;
|
||||
|
||||
if (pfn_to_section_nr(pfn) >= NR_MEM_SECTIONS)
|
||||
return 0;
|
||||
|
||||
|
@ -253,8 +250,7 @@ int pfn_valid(unsigned long pfn)
|
|||
*/
|
||||
if (!early_section(ms))
|
||||
return pfn_section_valid(ms, pfn);
|
||||
}
|
||||
#endif
|
||||
|
||||
return memblock_is_map_memory(addr);
|
||||
}
|
||||
EXPORT_SYMBOL(pfn_valid);
|
||||
|
|
|
@ -1113,7 +1113,6 @@ static void free_empty_tables(unsigned long addr, unsigned long end,
|
|||
}
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_SPARSEMEM_VMEMMAP
|
||||
#if !ARM64_SWAPPER_USES_SECTION_MAPS
|
||||
int __meminit vmemmap_populate(unsigned long start, unsigned long end, int node,
|
||||
struct vmem_altmap *altmap)
|
||||
|
@ -1177,7 +1176,6 @@ void vmemmap_free(unsigned long start, unsigned long end,
|
|||
free_empty_tables(start, end, VMEMMAP_START, VMEMMAP_END);
|
||||
#endif
|
||||
}
|
||||
#endif /* CONFIG_SPARSEMEM_VMEMMAP */
|
||||
|
||||
static inline pud_t *fixmap_pud(unsigned long addr)
|
||||
{
|
||||
|
|
|
@ -51,10 +51,8 @@ static struct addr_marker address_markers[] = {
|
|||
{ FIXADDR_TOP, "Fixmap end" },
|
||||
{ PCI_IO_START, "PCI I/O start" },
|
||||
{ PCI_IO_END, "PCI I/O end" },
|
||||
#ifdef CONFIG_SPARSEMEM_VMEMMAP
|
||||
{ VMEMMAP_START, "vmemmap start" },
|
||||
{ VMEMMAP_START + VMEMMAP_SIZE, "vmemmap end" },
|
||||
#endif
|
||||
{ -1, NULL },
|
||||
};
|
||||
|
||||
|
|
|
@ -329,7 +329,7 @@ static int __init gtdt_import_sbsa_gwdt(struct acpi_gtdt_watchdog *wd,
|
|||
int index)
|
||||
{
|
||||
struct platform_device *pdev;
|
||||
int irq = map_gt_gsi(wd->timer_interrupt, wd->timer_flags);
|
||||
int irq;
|
||||
|
||||
/*
|
||||
* According to SBSA specification the size of refresh and control
|
||||
|
@ -338,7 +338,7 @@ static int __init gtdt_import_sbsa_gwdt(struct acpi_gtdt_watchdog *wd,
|
|||
struct resource res[] = {
|
||||
DEFINE_RES_MEM(wd->control_frame_address, SZ_4K),
|
||||
DEFINE_RES_MEM(wd->refresh_frame_address, SZ_4K),
|
||||
DEFINE_RES_IRQ(irq),
|
||||
{},
|
||||
};
|
||||
int nr_res = ARRAY_SIZE(res);
|
||||
|
||||
|
@ -348,10 +348,11 @@ static int __init gtdt_import_sbsa_gwdt(struct acpi_gtdt_watchdog *wd,
|
|||
|
||||
if (!(wd->refresh_frame_address && wd->control_frame_address)) {
|
||||
pr_err(FW_BUG "failed to get the Watchdog base address.\n");
|
||||
acpi_unregister_gsi(wd->timer_interrupt);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
irq = map_gt_gsi(wd->timer_interrupt, wd->timer_flags);
|
||||
res[2] = (struct resource)DEFINE_RES_IRQ(irq);
|
||||
if (irq <= 0) {
|
||||
pr_warn("failed to map the Watchdog interrupt.\n");
|
||||
nr_res--;
|
||||
|
@ -364,7 +365,8 @@ static int __init gtdt_import_sbsa_gwdt(struct acpi_gtdt_watchdog *wd,
|
|||
*/
|
||||
pdev = platform_device_register_simple("sbsa-gwdt", index, res, nr_res);
|
||||
if (IS_ERR(pdev)) {
|
||||
acpi_unregister_gsi(wd->timer_interrupt);
|
||||
if (irq > 0)
|
||||
acpi_unregister_gsi(wd->timer_interrupt);
|
||||
return PTR_ERR(pdev);
|
||||
}
|
||||
|
||||
|
|
|
@ -75,8 +75,12 @@ void acpi_unregister_gsi(u32 gsi)
|
|||
{
|
||||
struct irq_domain *d = irq_find_matching_fwnode(acpi_gsi_domain_id,
|
||||
DOMAIN_BUS_ANY);
|
||||
int irq = irq_find_mapping(d, gsi);
|
||||
int irq;
|
||||
|
||||
if (WARN_ON(acpi_irq_model == ACPI_IRQ_MODEL_GIC && gsi < 16))
|
||||
return;
|
||||
|
||||
irq = irq_find_mapping(d, gsi);
|
||||
irq_dispose_mapping(irq);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(acpi_unregister_gsi);
|
||||
|
|
|
@ -139,7 +139,7 @@ static int psci_to_linux_errno(int errno)
|
|||
return -EINVAL;
|
||||
case PSCI_RET_DENIED:
|
||||
return -EPERM;
|
||||
};
|
||||
}
|
||||
|
||||
return -EINVAL;
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue