--- /dev/null
+# SPDX-License-Identifier: GPL-2.0
+config LOONGARCH
+       bool
+       default y
+       select ACPI_SYSTEM_POWER_STATES_SUPPORT if ACPI
+       select ARCH_BINFMT_ELF_STATE
+       select ARCH_ENABLE_MEMORY_HOTPLUG
+       select ARCH_ENABLE_MEMORY_HOTREMOVE
+       select ARCH_HAS_ACPI_TABLE_UPGRADE      if ACPI
+       select ARCH_HAS_PTE_SPECIAL
+       select ARCH_HAS_TICK_BROADCAST if GENERIC_CLOCKEVENTS_BROADCAST
+       select ARCH_INLINE_READ_LOCK if !PREEMPTION
+       select ARCH_INLINE_READ_LOCK_BH if !PREEMPTION
+       select ARCH_INLINE_READ_LOCK_IRQ if !PREEMPTION
+       select ARCH_INLINE_READ_LOCK_IRQSAVE if !PREEMPTION
+       select ARCH_INLINE_READ_UNLOCK if !PREEMPTION
+       select ARCH_INLINE_READ_UNLOCK_BH if !PREEMPTION
+       select ARCH_INLINE_READ_UNLOCK_IRQ if !PREEMPTION
+       select ARCH_INLINE_READ_UNLOCK_IRQRESTORE if !PREEMPTION
+       select ARCH_INLINE_WRITE_LOCK if !PREEMPTION
+       select ARCH_INLINE_WRITE_LOCK_BH if !PREEMPTION
+       select ARCH_INLINE_WRITE_LOCK_IRQ if !PREEMPTION
+       select ARCH_INLINE_WRITE_LOCK_IRQSAVE if !PREEMPTION
+       select ARCH_INLINE_WRITE_UNLOCK if !PREEMPTION
+       select ARCH_INLINE_WRITE_UNLOCK_BH if !PREEMPTION
+       select ARCH_INLINE_WRITE_UNLOCK_IRQ if !PREEMPTION
+       select ARCH_INLINE_WRITE_UNLOCK_IRQRESTORE if !PREEMPTION
+       select ARCH_INLINE_SPIN_TRYLOCK if !PREEMPTION
+       select ARCH_INLINE_SPIN_TRYLOCK_BH if !PREEMPTION
+       select ARCH_INLINE_SPIN_LOCK if !PREEMPTION
+       select ARCH_INLINE_SPIN_LOCK_BH if !PREEMPTION
+       select ARCH_INLINE_SPIN_LOCK_IRQ if !PREEMPTION
+       select ARCH_INLINE_SPIN_LOCK_IRQSAVE if !PREEMPTION
+       select ARCH_INLINE_SPIN_UNLOCK if !PREEMPTION
+       select ARCH_INLINE_SPIN_UNLOCK_BH if !PREEMPTION
+       select ARCH_INLINE_SPIN_UNLOCK_IRQ if !PREEMPTION
+       select ARCH_INLINE_SPIN_UNLOCK_IRQRESTORE if !PREEMPTION
+       select ARCH_MIGHT_HAVE_PC_PARPORT
+       select ARCH_MIGHT_HAVE_PC_SERIO
+       select ARCH_SPARSEMEM_ENABLE
+       select ARCH_SUPPORTS_ACPI
+       select ARCH_SUPPORTS_ATOMIC_RMW
+       select ARCH_SUPPORTS_HUGETLBFS
+       select ARCH_USE_BUILTIN_BSWAP
+       select ARCH_USE_CMPXCHG_LOCKREF
+       select ARCH_USE_QUEUED_RWLOCKS
+       select ARCH_WANT_DEFAULT_TOPDOWN_MMAP_LAYOUT
+       select ARCH_WANTS_NO_INSTR
+       select BUILDTIME_TABLE_SORT
+       select COMMON_CLK
+       select GENERIC_CLOCKEVENTS
+       select GENERIC_CMOS_UPDATE
+       select GENERIC_CPU_AUTOPROBE
+       select GENERIC_ENTRY
+       select GENERIC_FIND_FIRST_BIT
+       select GENERIC_GETTIMEOFDAY
+       select GENERIC_IRQ_MULTI_HANDLER
+       select GENERIC_IRQ_PROBE
+       select GENERIC_IRQ_SHOW
+       select GENERIC_LIB_ASHLDI3
+       select GENERIC_LIB_ASHRDI3
+       select GENERIC_LIB_CMPDI2
+       select GENERIC_LIB_LSHRDI3
+       select GENERIC_LIB_UCMPDI2
+       select GENERIC_PCI_IOMAP
+       select GENERIC_SCHED_CLOCK
+       select GENERIC_TIME_VSYSCALL
+       select GPIOLIB
+       select HAVE_ARCH_AUDITSYSCALL
+       select HAVE_ARCH_COMPILER_H
+       select HAVE_ARCH_MMAP_RND_BITS if MMU
+       select HAVE_ARCH_SECCOMP_FILTER
+       select HAVE_ARCH_TRACEHOOK
+       select HAVE_ARCH_TRANSPARENT_HUGEPAGE
+       select HAVE_ASM_MODVERSIONS
+       select HAVE_CONTEXT_TRACKING
+       select HAVE_COPY_THREAD_TLS
+       select HAVE_DEBUG_STACKOVERFLOW
+       select HAVE_DMA_CONTIGUOUS
+       select HAVE_EXIT_THREAD
+       select HAVE_FAST_GUP
+       select HAVE_GENERIC_VDSO
+       select HAVE_IOREMAP_PROT
+       select HAVE_IRQ_EXIT_ON_IRQ_STACK
+       select HAVE_IRQ_TIME_ACCOUNTING
+       select HAVE_MEMBLOCK
+       select HAVE_MEMBLOCK_NODE_MAP
+       select HAVE_MOD_ARCH_SPECIFIC
+       select HAVE_NMI
+       select HAVE_PERF_EVENTS
+       select HAVE_REGS_AND_STACK_ACCESS_API
+       select HAVE_RSEQ
+       select HAVE_SYSCALL_TRACEPOINTS
+       select HAVE_TIF_NOHZ
+       select HAVE_VIRT_CPU_ACCOUNTING_GEN
+       select IRQ_FORCED_THREADING
+       select IRQ_LOONGARCH_CPU
+       select MODULES_USE_ELF_RELA if MODULES
+       select OF
+       select OF_EARLY_FLATTREE
+       select PERF_USE_VMALLOC
+       select RTC_LIB
+       select SPARSE_IRQ
+       select SYSCTL_EXCEPTION_TRACE
+       select SWIOTLB
+       select TRACE_IRQFLAGS_SUPPORT
+       select ZONE_DMA32
+
+config 32BIT
+       bool
+
+config 64BIT
+       def_bool y
+
+config CPU_HAS_FPU
+       bool
+       default y
+
+config CPU_HAS_PREFETCH
+       bool
+       default y
+
+config GENERIC_CALIBRATE_DELAY
+       def_bool y
+
+config GENERIC_CSUM
+       def_bool y
+
+config GENERIC_HWEIGHT
+       def_bool y
+
+config L1_CACHE_SHIFT
+       int
+       default "6"
+
+config LOCKDEP_SUPPORT
+       bool
+       default y
+
+# MACH_LOONGSON32 and MACH_LOONGSON64 are delibrately carried over from the
+# MIPS Loongson code, to preserve Loongson-specific code paths in drivers that
+# are shared between architectures, and specifically expecting the symbols.
+config MACH_LOONGSON32
+       def_bool 32BIT
+
+config MACH_LOONGSON64
+       def_bool 64BIT
+
+config PAGE_SIZE_4KB
+       bool
+
+config PAGE_SIZE_16KB
+       bool
+
+config PAGE_SIZE_64KB
+       bool
+
+config PGTABLE_2LEVEL
+       bool
+
+config PGTABLE_3LEVEL
+       bool
+
+config PGTABLE_4LEVEL
+       bool
+
+config PGTABLE_LEVELS
+       int
+       default 2 if PGTABLE_2LEVEL
+       default 3 if PGTABLE_3LEVEL
+       default 4 if PGTABLE_4LEVEL
+
+config SCHED_OMIT_FRAME_POINTER
+       bool
+       default y
+
+menu "Kernel type and options"
+
+source "kernel/Kconfig.hz"
+
+choice
+       prompt "Page Table Layout"
+       default 16KB_2LEVEL if 32BIT
+       default 16KB_3LEVEL if 64BIT
+       help
+         Allows choosing the page table layout, which is a combination
+         of page size and page table levels. The size of virtual memory
+         address space are determined by the page table layout.
+
+config 4KB_3LEVEL
+       bool "4KB with 3 levels"
+       select PAGE_SIZE_4KB
+       select PGTABLE_3LEVEL
+       help
+         This option selects 4KB page size with 3 level page tables, which
+         support a maximum of 39 bits of application virtual memory.
+
+config 4KB_4LEVEL
+       bool "4KB with 4 levels"
+       select PAGE_SIZE_4KB
+       select PGTABLE_4LEVEL
+       help
+         This option selects 4KB page size with 4 level page tables, which
+         support a maximum of 48 bits of application virtual memory.
+
+config 16KB_2LEVEL
+       bool "16KB with 2 levels"
+       select PAGE_SIZE_16KB
+       select PGTABLE_2LEVEL
+       help
+         This option selects 16KB page size with 2 level page tables, which
+         support a maximum of 36 bits of application virtual memory.
+
+config 16KB_3LEVEL
+       bool "16KB with 3 levels"
+       select PAGE_SIZE_16KB
+       select PGTABLE_3LEVEL
+       help
+         This option selects 16KB page size with 3 level page tables, which
+         support a maximum of 47 bits of application virtual memory.
+
+config 64KB_2LEVEL
+       bool "64KB with 2 levels"
+       select PAGE_SIZE_64KB
+       select PGTABLE_2LEVEL
+       help
+         This option selects 64KB page size with 2 level page tables, which
+         support a maximum of 42 bits of application virtual memory.
+
+config 64KB_3LEVEL
+       bool "64KB with 3 levels"
+       select PAGE_SIZE_64KB
+       select PGTABLE_3LEVEL
+       help
+         This option selects 64KB page size with 3 level page tables, which
+         support a maximum of 55 bits of application virtual memory.
+
+endchoice
+
+config CMDLINE
+       string "Built-in kernel command line"
+       help
+         For most platforms, the arguments for the kernel's command line
+         are provided at run-time, during boot. However, there are cases
+         where either no arguments are being provided or the provided
+         arguments are insufficient or even invalid.
+
+         When that occurs, it is possible to define a built-in command
+         line here and choose how the kernel should use it later on.
+
+choice
+       prompt "Kernel command line type"
+       default CMDLINE_BOOTLOADER
+       help
+         Choose how the kernel will handle the provided built-in command
+         line.
+
+config CMDLINE_BOOTLOADER
+       bool "Use bootloader kernel arguments if available"
+       help
+         Prefer the command-line passed by the boot loader if available.
+         Use the built-in command line as fallback in case we get nothing
+         during boot. This is the default behaviour.
+
+config CMDLINE_EXTEND
+       bool "Use built-in to extend bootloader kernel arguments"
+       help
+         The command-line arguments provided during boot will be
+         appended to the built-in command line. This is useful in
+         cases where the provided arguments are insufficient and
+         you don't want to or cannot modify them.
+
+config CMDLINE_FORCE
+       bool "Always use the built-in kernel command string"
+       help
+         Always use the built-in command line, even if we get one during
+         boot. This is useful in case you need to override the provided
+         command line on systems where you don't have or want control
+         over it.
+
+endchoice
+
+config DMI
+       bool "Enable DMI scanning"
+       select DMI_SCAN_MACHINE_NON_EFI_FALLBACK
+       default y
+       help
+         This enables SMBIOS/DMI feature for systems, and scanning of
+         DMI to identify machine quirks.
+
+config EFI
+       bool "EFI runtime service support"
+       select UCS2_STRING
+       select EFI_PARAMS_FROM_FDT
+       select EFI_RUNTIME_WRAPPERS
+       help
+         This enables the kernel to use EFI runtime services that are
+         available (such as the EFI variable services).
+
+config FORCE_MAX_ZONEORDER
+       int "Maximum zone order"
+       range 14 64 if PAGE_SIZE_64KB
+       default "14" if PAGE_SIZE_64KB
+       range 12 64 if PAGE_SIZE_16KB
+       default "12" if PAGE_SIZE_16KB
+       range 11 64
+       default "11"
+       help
+         The kernel memory allocator divides physically contiguous memory
+         blocks into "zones", where each zone is a power of two number of
+         pages.  This option selects the largest power of two that the kernel
+         keeps in the memory allocator.  If you need to allocate very large
+         blocks of physically contiguous memory, then you may need to
+         increase this value.
+
+         This config option is actually maximum order plus one. For example,
+         a value of 11 means that the largest free memory block is 2^10 pages.
+
+         The page size is not necessarily 4KB.  Keep this in mind
+         when choosing a value for this option.
+
+config SECCOMP
+       bool "Enable seccomp to safely compute untrusted bytecode"
+       depends on PROC_FS
+       default y
+       help
+         This kernel feature is useful for number crunching applications
+         that may need to compute untrusted bytecode during their
+         execution. By using pipes or other transports made available to
+         the process as file descriptors supporting the read/write
+         syscalls, it's possible to isolate those applications in
+         their own address space using seccomp. Once seccomp is
+         enabled via /proc/<pid>/seccomp, it cannot be disabled
+         and the task is only allowed to execute a few safe syscalls
+         defined by each seccomp mode.
+
+         If unsure, say Y. Only embedded should say N here.
+
+endmenu
+
+config ARCH_SELECT_MEMORY_MODEL
+       def_bool y
+
+config ARCH_FLATMEM_ENABLE
+       def_bool y
+
+config ARCH_SPARSEMEM_ENABLE
+       def_bool y
+       help
+         Say Y to support efficient handling of sparse physical memory,
+         for architectures which are either NUMA (Non-Uniform Memory Access)
+         or have huge holes in the physical address space for other reasons.
+         See <file:Documentation/vm/numa.rst> for more.
+
+config ARCH_ENABLE_THP_MIGRATION
+       def_bool y
+       depends on TRANSPARENT_HUGEPAGE
+
+config ARCH_MEMORY_PROBE
+       def_bool y
+       depends on MEMORY_HOTPLUG
+
+config MMU
+       bool
+       default y
+
+config ARCH_MMAP_RND_BITS_MIN
+       default 12
+
+config ARCH_MMAP_RND_BITS_MAX
+       default 18
+
+menu "Power management options"
+
+source "drivers/acpi/Kconfig"
+
+endmenu
+
+source "drivers/firmware/Kconfig"
 
--- /dev/null
+# SPDX-License-Identifier: GPL-2.0
+#
+# Author: Huacai Chen <chenhuacai@loongson.cn>
+# Copyright (C) 2020-2022 Loongson Technology Corporation Limited
+
+boot   := arch/loongarch/boot
+
+KBUILD_IMAGE   = $(boot)/vmlinux
+
+#
+# Select the object file format to substitute into the linker script.
+#
+64bit-tool-archpref    = loongarch64
+32bit-bfd              = elf32-loongarch
+64bit-bfd              = elf64-loongarch
+32bit-emul             = elf32loongarch
+64bit-emul             = elf64loongarch
+
+ifdef CONFIG_64BIT
+tool-archpref          = $(64bit-tool-archpref)
+UTS_MACHINE            := loongarch64
+endif
+
+ifneq ($(SUBARCH),$(ARCH))
+  ifeq ($(CROSS_COMPILE),)
+    CROSS_COMPILE := $(call cc-cross-prefix, $(tool-archpref)-linux-  $(tool-archpref)-linux-gnu-  $(tool-archpref)-unknown-linux-gnu-)
+  endif
+endif
+
+ifdef CONFIG_64BIT
+ld-emul                        = $(64bit-emul)
+cflags-y               += -mabi=lp64s
+endif
+
+cflags-y                       += -G0 -pipe -msoft-float
+LDFLAGS_vmlinux                        += -G0 -static -n -nostdlib
+KBUILD_AFLAGS_KERNEL           += -Wa,-mla-global-with-pcrel
+KBUILD_CFLAGS_KERNEL           += -Wa,-mla-global-with-pcrel
+KBUILD_AFLAGS_MODULE           += -Wa,-mla-global-with-abs
+KBUILD_CFLAGS_MODULE           += -fplt -Wa,-mla-global-with-abs,-mla-local-with-abs
+
+cflags-y += -ffreestanding
+cflags-y += $(call cc-option, -mno-check-zero-division)
+
+load-y         = 0x9000000000200000
+bootvars-y     = VMLINUX_LOAD_ADDRESS=$(load-y)
+
+KBUILD_AFLAGS  += $(cflags-y)
+KBUILD_CFLAGS  += $(cflags-y)
+KBUILD_CPPFLAGS += -DVMLINUX_LOAD_ADDRESS=$(load-y)
+
+# This is required to get dwarf unwinding tables into .debug_frame
+# instead of .eh_frame so we don't discard them.
+KBUILD_CFLAGS += -fno-asynchronous-unwind-tables
+
+# Don't emit unaligned accesses.
+# Not all LoongArch cores support unaligned access, and as kernel we can't
+# rely on others to provide emulation for these accesses.
+KBUILD_CFLAGS += $(call cc-option,-mstrict-align)
+
+KBUILD_CFLAGS += -isystem $(shell $(CC) -print-file-name=include)
+
+KBUILD_LDFLAGS += -m $(ld-emul)
+
+ifdef CONFIG_LOONGARCH
+CHECKFLAGS += $(shell $(CC) $(KBUILD_CFLAGS) -dM -E -x c /dev/null | \
+       egrep -vw '__GNUC_(MINOR_|PATCHLEVEL_)?_' | \
+       sed -e "s/^\#define /-D'/" -e "s/ /'='/" -e "s/$$/'/" -e 's/\$$/&&/g')
+endif
+
+head-y := arch/loongarch/kernel/head.o
+
+libs-y += arch/loongarch/lib/
+
+ifeq ($(KBUILD_EXTMOD),)
+prepare: vdso_prepare
+vdso_prepare: prepare0
+       $(Q)$(MAKE) $(build)=arch/loongarch/vdso include/generated/vdso-offsets.h
+endif
+
+PHONY += vdso_install
+vdso_install:
+       $(Q)$(MAKE) $(build)=arch/loongarch/vdso $@
+
+all:   $(KBUILD_IMAGE)
+
+$(KBUILD_IMAGE): vmlinux
+       $(Q)$(MAKE) $(build)=$(boot) $(bootvars-y) $@
+
+install:
+       $(Q)install -D -m 755 $(KBUILD_IMAGE) $(INSTALL_PATH)/vmlinux-$(KERNELRELEASE)
+       $(Q)install -D -m 644 .config $(INSTALL_PATH)/config-$(KERNELRELEASE)
+       $(Q)install -D -m 644 System.map $(INSTALL_PATH)/System.map-$(KERNELRELEASE)
+
+define archhelp
+       echo '  install              - install kernel into $(INSTALL_PATH)'
+       echo
+endef