Commit 03ce34cf authored by Max Filippov's avatar Max Filippov
Browse files

xtensa: add XIP-aware MTD support



Add Kconfig symbol, asm/mtd-xip.h header and define related macros:
xip_cpu_idle, xip_irqpending, xip_currtime and xip_elapsed_since.
Append .xiptext to the vectors when separate vectors are configured
because otherwise they are appended to the data and data may not even be
executable in XIP configuration.

Signed-off-by: default avatarMax Filippov <jcmvbkbc@gmail.com>
parent 687eb3c4
Loading
Loading
Loading
Loading
+3 −0
Original line number Diff line number Diff line
@@ -70,6 +70,9 @@ config ARCH_HAS_ILOG2_U32
config ARCH_HAS_ILOG2_U64
	def_bool n

config ARCH_MTD_XIP
	def_bool y

config NO_IOPORT_MAP
	def_bool n

+14 −0
Original line number Diff line number Diff line
/* SPDX-License-Identifier: GPL-2.0-only */

#ifndef _ASM_MTD_XIP_H
#define _ASM_MTD_XIP_H

#include <asm/processor.h>

#define xip_irqpending()	(xtensa_get_sr(interrupt) & xtensa_get_sr(intenable))
#define xip_currtime()		(xtensa_get_sr(ccount))
#define xip_elapsed_since(x)	((xtensa_get_sr(ccount) - (x)) / 1000) /* should work up to 1GHz */
#define xip_cpu_idle()		do { asm volatile ("waiti 0"); } while (0)

#endif /* _ASM_MTD_XIP_H */
+4 −0
Original line number Diff line number Diff line
@@ -34,6 +34,10 @@ extern char _SecondaryResetVector_text_start[];
extern char _SecondaryResetVector_text_end[];
#endif
#ifdef CONFIG_XIP_KERNEL
#ifdef CONFIG_VECTORS_ADDR
extern char _xip_text_start[];
extern char _xip_text_end[];
#endif
extern char _xip_start[];
extern char _xip_end[];
#endif
+3 −0
Original line number Diff line number Diff line
@@ -311,6 +311,9 @@ void __init setup_arch(char **cmdline_p)

	mem_reserve(__pa(_stext), __pa(_end));
#ifdef CONFIG_XIP_KERNEL
#ifdef CONFIG_VECTORS_ADDR
	mem_reserve(__pa(_xip_text_start), __pa(_xip_text_end));
#endif
	mem_reserve(__pa(_xip_start), __pa(_xip_end));
#endif

+10 −1
Original line number Diff line number Diff line
@@ -118,6 +118,7 @@ SECTIONS
    SECTION_VECTOR2 (.DoubleExceptionVector.text, DOUBLEEXC_VECTOR_VADDR)

    *(.exception.text)
    *(.xiptext)
#endif

    IRQENTRY_TEXT
@@ -201,6 +202,9 @@ SECTIONS
		   .DebugInterruptVector.text);
    RELOCATE_ENTRY(_exception_text,
		   .exception.text);
#ifdef CONFIG_XIP_KERNEL
    RELOCATE_ENTRY(_xip_text, .xiptext);
#endif
#endif
#ifdef CONFIG_XIP_KERNEL
    RELOCATE_ENTRY(_xip_data, .data);
@@ -319,7 +323,12 @@ SECTIONS
		  LAST)
#undef LAST
#define LAST .exception.text

  SECTION_VECTOR4 (_xip_text,
		  .xiptext,
		  ,
		  LAST)
#undef LAST
#define LAST .xiptext
#endif
  . = (LOADADDR(LAST) + SIZEOF(LAST) + 3) & ~ 3;