diff options
Diffstat (limited to 'arch/microblaze')
163 files changed, 4198 insertions, 5145 deletions
diff --git a/arch/microblaze/Kconfig b/arch/microblaze/Kconfig index 387d5ffdfd3..9ae08541e30 100644 --- a/arch/microblaze/Kconfig +++ b/arch/microblaze/Kconfig @@ -1,20 +1,38 @@  config MICROBLAZE  	def_bool y -	select HAVE_MEMBLOCK -	select HAVE_FUNCTION_TRACER -	select HAVE_FUNCTION_TRACE_MCOUNT_TEST -	select HAVE_FUNCTION_GRAPH_TRACER -	select HAVE_DYNAMIC_FTRACE -	select HAVE_FTRACE_MCOUNT_RECORD -	select USB_ARCH_HAS_EHCI +	select ARCH_MIGHT_HAVE_PC_PARPORT +	select ARCH_WANT_IPC_PARSE_VERSION  	select ARCH_WANT_OPTIONAL_GPIOLIB -	select HAVE_OPROFILE +	select BUILDTIME_EXTABLE_SORT +	select CLKSRC_OF +	select CLONE_BACKWARDS3 +	select COMMON_CLK +	select GENERIC_ATOMIC64 +	select GENERIC_CLOCKEVENTS +	select GENERIC_CPU_DEVICES +	select GENERIC_IDLE_POLL_SETUP +	select GENERIC_IRQ_PROBE +	select GENERIC_IRQ_SHOW +	select GENERIC_PCI_IOMAP +	select GENERIC_SCHED_CLOCK  	select HAVE_ARCH_KGDB -	select HAVE_DMA_ATTRS +	select HAVE_DEBUG_KMEMLEAK  	select HAVE_DMA_API_DEBUG -	select TRACING_SUPPORT +	select HAVE_DMA_ATTRS +	select HAVE_DYNAMIC_FTRACE +	select HAVE_FTRACE_MCOUNT_RECORD +	select HAVE_FUNCTION_GRAPH_TRACER +	select HAVE_FUNCTION_TRACE_MCOUNT_TEST +	select HAVE_FUNCTION_TRACER +	select HAVE_MEMBLOCK +	select HAVE_MEMBLOCK_NODE_MAP +	select HAVE_OPROFILE +	select IRQ_DOMAIN +	select MODULES_USE_ELF_RELA  	select OF -	select OF_FLATTREE +	select OF_EARLY_FLATTREE +	select TRACING_SUPPORT +	select VIRT_TO_BUS  config SWAP  	def_bool n @@ -22,6 +40,9 @@ config SWAP  config RWSEM_GENERIC_SPINLOCK  	def_bool y +config ZONE_DMA +	def_bool y +  config RWSEM_XCHGADD_ALGORITHM  	bool @@ -31,33 +52,12 @@ config ARCH_HAS_ILOG2_U32  config ARCH_HAS_ILOG2_U64  	def_bool n -config GENERIC_FIND_NEXT_BIT -	def_bool y -  config GENERIC_HWEIGHT  	def_bool y -config GENERIC_HARDIRQS -	def_bool y - -config GENERIC_IRQ_PROBE -	def_bool y -  config GENERIC_CALIBRATE_DELAY  	def_bool y -config GENERIC_TIME_VSYSCALL -	def_bool n - -config GENERIC_CLOCKEVENTS -	def_bool y - -config GENERIC_HARDIRQS_NO__DO_IRQ -	def_bool y - -config GENERIC_GPIO -	def_bool y -  config GENERIC_CSUM  	def_bool y @@ -74,12 +74,10 @@ source "init/Kconfig"  source "kernel/Kconfig.freezer" -source "arch/microblaze/platform/Kconfig.platform" +source "arch/microblaze/Kconfig.platform"  menu "Processor type and features" -source "kernel/time/Kconfig" -  source "kernel/Kconfig.preempt"  source "kernel/Kconfig.hz" @@ -88,11 +86,6 @@ config MMU  	bool "MMU support"  	default n -config NO_MMU -	bool -	depends on !MMU -	default y -  comment "Boot options"  config CMDLINE_BOOL @@ -159,20 +152,18 @@ config XILINX_UNCACHED_SHADOW  	  The feature requires the design to define the RAM memory controller  	  window to be twice as large as the actual physical memory. -config HIGHMEM_START_BOOL -	bool "Set high memory pool address" -	depends on ADVANCED_OPTIONS && HIGHMEM +config HIGHMEM +	bool "High memory support" +	depends on MMU  	help -	  This option allows you to set the base address of the kernel virtual -	  area used to map high memory pages.  This can be useful in -	  optimizing the layout of kernel virtual memory. +	  The address space of Microblaze processors is only 4 Gigabytes large +	  and it has to accommodate user address space, kernel address +	  space as well as some memory mapped IO. That means that, if you +	  have a large amount of physical memory and/or IO, not all of the +	  memory can be "permanently mapped" by the kernel. The physical +	  memory that is not permanently mapped is called "high memory". -	  Say N here unless you know what you are doing. - -config HIGHMEM_START -	hex "Virtual start address of high memory pool" if HIGHMEM_START_BOOL -	depends on MMU -	default "0xfe000000" +	  If unsure, say n.  config LOWMEM_SIZE_BOOL  	bool "Set maximum low memory" @@ -190,6 +181,17 @@ config LOWMEM_SIZE  	hex "Maximum low memory size (in bytes)" if LOWMEM_SIZE_BOOL  	default "0x30000000" +config MANUAL_RESET_VECTOR +	hex "Microblaze reset vector address setup" +	default "0x0" +	help +	  Set this option to have the kernel override the CPU Reset vector. +	  If zero, no change will be made to the MicroBlaze reset vector at +	  address 0x0. +	  If non-zero, a jump instruction to this address, will be written +	  to the reset vector at address 0x0. +	  If you are unsure, set it to default value 0x0. +  config KERNEL_START_BOOL  	bool "Set custom kernel base address"  	depends on ADVANCED_OPTIONS @@ -239,14 +241,11 @@ choice  config MICROBLAZE_4K_PAGES  	bool "4k page size" -config MICROBLAZE_8K_PAGES -	bool "8k page size" -  config MICROBLAZE_16K_PAGES  	bool "16k page size" -config MICROBLAZE_32K_PAGES -	bool "32k page size" +config MICROBLAZE_64K_PAGES +	bool "64k page size"  endchoice @@ -254,7 +253,7 @@ endmenu  source "mm/Kconfig" -menu "Exectuable file formats" +menu "Executable file formats"  source "fs/Kconfig.binfmt" diff --git a/arch/microblaze/Kconfig.debug b/arch/microblaze/Kconfig.debug index e66e25c4b0b..012e377330c 100644 --- a/arch/microblaze/Kconfig.debug +++ b/arch/microblaze/Kconfig.debug @@ -23,8 +23,4 @@ config HEART_BEAT  	  This option turns on/off heart beat kernel functionality.  	  First GPIO node is taken. -config DEBUG_BOOTMEM -	depends on DEBUG_KERNEL -	bool "Debug BOOTMEM initialization" -  endmenu diff --git a/arch/microblaze/platform/Kconfig.platform b/arch/microblaze/Kconfig.platform index 669c7eec293..1b3d8c84910 100644 --- a/arch/microblaze/platform/Kconfig.platform +++ b/arch/microblaze/Kconfig.platform @@ -5,40 +5,6 @@  #  menu "Platform options" -choice -	prompt "Platform" -	default PLATFORM_MICROBLAZE_AUTO -	help -	  Choose which hardware board/platform you are targeting. - -config PLATFORM_GENERIC -	bool "Generic" -	help -	  Choose this option for the Generic platform. - -endchoice - -config SELFMOD -	bool "Use self modified code for intc/timer" -	depends on EXPERIMENTAL && NO_MMU -	default n -	help -	  This choice enables self-modified code for interrupt controller -	  and timer. - -config SELFMOD_INTC -	bool "Use self modified code for intc" -	depends on SELFMOD -	default y -	help -	  This choice enables self-modified code for interrupt controller. - -config SELFMOD_TIMER -	bool "Use self modified code for timer" -	depends on SELFMOD -	default y -	help -	  This choice enables self-modified code for timer.  config OPT_LIB_FUNCTION  	bool "Optimalized lib function" @@ -59,8 +25,45 @@ config OPT_LIB_ASM  	  Allows turn on optimalized library function (memcpy and memmove).  	  Function are written in asm code. -if PLATFORM_GENERIC=y -	source "arch/microblaze/platform/generic/Kconfig.auto" -endif +# Definitions for MICROBLAZE0 +comment "Definitions for MICROBLAZE0" + +config KERNEL_BASE_ADDR +	hex "Physical address where Linux Kernel is" +	default "0x90000000" +	help +	  BASE Address for kernel + +config XILINX_MICROBLAZE0_FAMILY +	string "Targeted FPGA family" +	default "virtex5" + +config XILINX_MICROBLAZE0_USE_MSR_INSTR +	int "USE_MSR_INSTR range (0:1)" +	default 0 + +config XILINX_MICROBLAZE0_USE_PCMP_INSTR +	int "USE_PCMP_INSTR range (0:1)" +	default 0 + +config XILINX_MICROBLAZE0_USE_BARREL +	int "USE_BARREL range (0:1)" +	default 0 + +config XILINX_MICROBLAZE0_USE_DIV +	int "USE_DIV range (0:1)" +	default 0 + +config XILINX_MICROBLAZE0_USE_HW_MUL +	int "USE_HW_MUL values (0=NONE, 1=MUL32, 2=MUL64)" +	default 0 + +config XILINX_MICROBLAZE0_USE_FPU +	int "USE_FPU values (0=NONE, 1=BASIC, 2=EXTENDED)" +	default 0 + +config XILINX_MICROBLAZE0_HW_VER +	string "Core version number" +	default 7.10.d  endmenu diff --git a/arch/microblaze/Makefile b/arch/microblaze/Makefile index 15f1f1d1840..740f2b82a18 100644 --- a/arch/microblaze/Makefile +++ b/arch/microblaze/Makefile @@ -1,3 +1,5 @@ +KBUILD_DEFCONFIG := mmu_defconfig +  ifeq ($(CONFIG_MMU),y)  UTS_SYSNAME = -DUTS_SYSNAME=\"Linux\"  else @@ -17,8 +19,8 @@ export CPU_VER CPU_MAJOR CPU_MINOR CPU_REV  # The various CONFIG_XILINX cpu features options are integers 0/1/2...  # rather than bools y/n -# Work out HW multipler support.  This is icky. -# 1. Spartan2 has no HW multiplers. +# Work out HW multipler support. This is tricky. +# 1. Spartan2 has no HW multipliers.  # 2. MicroBlaze v3.x always uses them, except in Spartan 2  # 3. All other FPGa/CPU ver combos, we can trust the CONFIG_ settings  ifeq (,$(findstring spartan2,$(CONFIG_XILINX_MICROBLAZE0_FAMILY))) @@ -46,7 +48,6 @@ head-y := arch/microblaze/kernel/head.o  libs-y += arch/microblaze/lib/  core-y += arch/microblaze/kernel/  core-y += arch/microblaze/mm/ -core-y += arch/microblaze/platform/  core-$(CONFIG_PCI) += arch/microblaze/pci/  drivers-$(CONFIG_OPROFILE) += arch/microblaze/oprofile/ @@ -57,7 +58,7 @@ boot := arch/microblaze/boot  DTB:=$(subst simpleImage.,,$(filter simpleImage.%, $(MAKECMDGOALS)))  ifneq ($(DTB),) -	core-y	+= $(boot)/ +	core-y	+= $(boot)/dts/  endif  # defines filename extension depending memory management type @@ -69,21 +70,19 @@ export MMU DTB  all: linux.bin -# With make 3.82 we cannot mix normal and wildcard targets -BOOT_TARGETS1 = linux.bin linux.bin.gz -BOOT_TARGETS2 = simpleImage.% -  archclean:  	$(Q)$(MAKE) $(clean)=$(boot) -$(BOOT_TARGETS1): vmlinux +linux.bin linux.bin.gz linux.bin.ub: vmlinux  	$(Q)$(MAKE) $(build)=$(boot) $(boot)/$@ -$(BOOT_TARGETS2): vmlinux + +simpleImage.%: vmlinux  	$(Q)$(MAKE) $(build)=$(boot) $(boot)/$@  define archhelp    echo '* linux.bin    - Create raw binary'    echo '  linux.bin.gz - Create compressed raw binary' +  echo '  linux.bin.ub - Create U-Boot wrapped raw binary'    echo '  simpleImage.<dt> - ELF image with $(arch)/boot/dts/<dt>.dts linked in'    echo '                   - stripped elf with fdt blob'    echo '  simpleImage.<dt>.unstrip - full ELF image with fdt blob' diff --git a/arch/microblaze/boot/.gitignore b/arch/microblaze/boot/.gitignore new file mode 100644 index 00000000000..bf045918602 --- /dev/null +++ b/arch/microblaze/boot/.gitignore @@ -0,0 +1,3 @@ +*.dtb +linux.bin* +simpleImage.* diff --git a/arch/microblaze/boot/Makefile b/arch/microblaze/boot/Makefile index be01d78750d..8e211cc28da 100644 --- a/arch/microblaze/boot/Makefile +++ b/arch/microblaze/boot/Makefile @@ -2,28 +2,15 @@  # arch/microblaze/boot/Makefile  # -MKIMAGE := $(srctree)/scripts/mkuboot.sh +targets := linux.bin linux.bin.gz linux.bin.ub simpleImage.% -obj-y += linked_dtb.o - -targets := linux.bin linux.bin.gz simpleImage.% - -OBJCOPYFLAGS := -O binary - -# Where the DTS files live -dtstree         := $(srctree)/$(src)/dts - -# Ensure system.dtb exists -$(obj)/linked_dtb.o: $(obj)/system.dtb - -# Generate system.dtb from $(DTB).dtb -ifneq ($(DTB),system) -$(obj)/system.dtb: $(obj)/$(DTB).dtb -	$(call if_changed,cp) -endif +OBJCOPYFLAGS := -R .note -R .comment -R .note.gnu.build-id -O binary  $(obj)/linux.bin: vmlinux FORCE  	$(call if_changed,objcopy) +	@echo 'Kernel: $@ is ready' ' (#'`cat .version`')' + +$(obj)/linux.bin.ub: $(obj)/linux.bin FORCE  	$(call if_changed,uimage)  	@echo 'Kernel: $@ is ready' ' (#'`cat .version`')' @@ -38,11 +25,7 @@ quiet_cmd_strip = STRIP   $@  	cmd_strip = $(STRIP) -K microblaze_start -K _end -K __log_buf \  				-K _fdt_start vmlinux -o $@ -quiet_cmd_uimage = UIMAGE  $@.ub -	cmd_uimage = $(CONFIG_SHELL) $(MKIMAGE) -A microblaze -O linux -T kernel \ -		-C none -n 'Linux-$(KERNELRELEASE)' \ -		-a $(CONFIG_KERNEL_BASE_ADDR) -e $(CONFIG_KERNEL_BASE_ADDR) \ -		-d $@ $@.ub +UIMAGE_LOADADDR = $(CONFIG_KERNEL_BASE_ADDR)  $(obj)/simpleImage.%: vmlinux FORCE  	$(call if_changed,cp,.unstrip) @@ -51,14 +34,5 @@ $(obj)/simpleImage.%: vmlinux FORCE  	$(call if_changed,strip)  	@echo 'Kernel: $@ is ready' ' (#'`cat .version`')' -# Rule to build device tree blobs -DTC = $(objtree)/scripts/dtc/dtc - -# Rule to build device tree blobs -quiet_cmd_dtc = DTC     $@ -	cmd_dtc = $(DTC) -O dtb -o $(obj)/$*.dtb -b 0 -p 1024 $(dtstree)/$*.dts - -$(obj)/%.dtb: $(dtstree)/%.dts FORCE -	$(call if_changed,dtc) -clean-files += *.dtb simpleImage.*.unstrip linux.bin.ub +clean-files += simpleImage.*.unstrip linux.bin.ub diff --git a/arch/microblaze/boot/dts/Makefile b/arch/microblaze/boot/dts/Makefile new file mode 100644 index 00000000000..c4982d16e55 --- /dev/null +++ b/arch/microblaze/boot/dts/Makefile @@ -0,0 +1,20 @@ +# + +obj-y += linked_dtb.o + +# Ensure system.dtb exists +$(obj)/linked_dtb.o: $(obj)/system.dtb + +# Generate system.dtb from $(DTB).dtb +ifneq ($(DTB),system) +$(obj)/system.dtb: $(obj)/$(DTB).dtb +	$(call if_changed,cp) +endif + +quiet_cmd_cp = CP      $< $@$2 +	cmd_cp = cat $< >$@$2 || (rm -f $@ && echo false) + +# Rule to build device tree blobs +DTC_FLAGS := -p 1024 + +clean-files += *.dtb diff --git a/arch/microblaze/boot/dts/linked_dtb.S b/arch/microblaze/boot/dts/linked_dtb.S new file mode 100644 index 00000000000..23345af3721 --- /dev/null +++ b/arch/microblaze/boot/dts/linked_dtb.S @@ -0,0 +1,2 @@ +.section __fdt_blob,"a" +.incbin "arch/microblaze/boot/dts/system.dtb" diff --git a/arch/microblaze/boot/dts/system.dts b/arch/microblaze/boot/dts/system.dts index 7cb657892f2..b620da23feb 120000..100644 --- a/arch/microblaze/boot/dts/system.dts +++ b/arch/microblaze/boot/dts/system.dts @@ -1 +1,366 @@ -../../platform/generic/system.dts
\ No newline at end of file +/* + * Device Tree Generator version: 1.1 + * + * (C) Copyright 2007-2008 Xilinx, Inc. + * (C) Copyright 2007-2009 Michal Simek + * + * Michal SIMEK <monstr@monstr.eu> + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License as + * published by the Free Software Foundation; either version 2 of + * the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, + * MA 02111-1307 USA + * + * CAUTION: This file is automatically generated by libgen. + * Version: Xilinx EDK 10.1.03 EDK_K_SP3.6 + * + * XPS project directory: Xilinx-ML505-ll_temac-sgdma-MMU-FDT-edk101 + */ + +/dts-v1/; +/ { +	#address-cells = <1>; +	#size-cells = <1>; +	compatible = "xlnx,microblaze"; +	hard-reset-gpios = <&LEDs_8Bit 2 1>; +	model = "testing"; +	DDR2_SDRAM: memory@90000000 { +		device_type = "memory"; +		reg = < 0x90000000 0x10000000 >; +	} ; +	aliases { +		ethernet0 = &Hard_Ethernet_MAC; +		serial0 = &RS232_Uart_1; +	} ; +	chosen { +		bootargs = "console=ttyUL0,115200 highres=on"; +		linux,stdout-path = "/plb@0/serial@84000000"; +	} ; +	cpus { +		#address-cells = <1>; +		#cpus = <0x1>; +		#size-cells = <0>; +		microblaze_0: cpu@0 { +			clock-frequency = <125000000>; +			compatible = "xlnx,microblaze-7.10.d"; +			d-cache-baseaddr = <0x90000000>; +			d-cache-highaddr = <0x9fffffff>; +			d-cache-line-size = <0x10>; +			d-cache-size = <0x2000>; +			device_type = "cpu"; +			i-cache-baseaddr = <0x90000000>; +			i-cache-highaddr = <0x9fffffff>; +			i-cache-line-size = <0x10>; +			i-cache-size = <0x2000>; +			model = "microblaze,7.10.d"; +			reg = <0>; +			timebase-frequency = <125000000>; +			xlnx,addr-tag-bits = <0xf>; +			xlnx,allow-dcache-wr = <0x1>; +			xlnx,allow-icache-wr = <0x1>; +			xlnx,area-optimized = <0x0>; +			xlnx,cache-byte-size = <0x2000>; +			xlnx,d-lmb = <0x1>; +			xlnx,d-opb = <0x0>; +			xlnx,d-plb = <0x1>; +			xlnx,data-size = <0x20>; +			xlnx,dcache-addr-tag = <0xf>; +			xlnx,dcache-always-used = <0x1>; +			xlnx,dcache-byte-size = <0x2000>; +			xlnx,dcache-line-len = <0x4>; +			xlnx,dcache-use-fsl = <0x1>; +			xlnx,debug-enabled = <0x1>; +			xlnx,div-zero-exception = <0x1>; +			xlnx,dopb-bus-exception = <0x0>; +			xlnx,dynamic-bus-sizing = <0x1>; +			xlnx,edge-is-positive = <0x1>; +			xlnx,family = "virtex5"; +			xlnx,endianness = <0x1>; +			xlnx,fpu-exception = <0x1>; +			xlnx,fsl-data-size = <0x20>; +			xlnx,fsl-exception = <0x0>; +			xlnx,fsl-links = <0x0>; +			xlnx,i-lmb = <0x1>; +			xlnx,i-opb = <0x0>; +			xlnx,i-plb = <0x1>; +			xlnx,icache-always-used = <0x1>; +			xlnx,icache-line-len = <0x4>; +			xlnx,icache-use-fsl = <0x1>; +			xlnx,ill-opcode-exception = <0x1>; +			xlnx,instance = "microblaze_0"; +			xlnx,interconnect = <0x1>; +			xlnx,interrupt-is-edge = <0x0>; +			xlnx,iopb-bus-exception = <0x0>; +			xlnx,mmu-dtlb-size = <0x4>; +			xlnx,mmu-itlb-size = <0x2>; +			xlnx,mmu-tlb-access = <0x3>; +			xlnx,mmu-zones = <0x10>; +			xlnx,number-of-pc-brk = <0x1>; +			xlnx,number-of-rd-addr-brk = <0x0>; +			xlnx,number-of-wr-addr-brk = <0x0>; +			xlnx,opcode-0x0-illegal = <0x1>; +			xlnx,pvr = <0x2>; +			xlnx,pvr-user1 = <0x0>; +			xlnx,pvr-user2 = <0x0>; +			xlnx,reset-msr = <0x0>; +			xlnx,sco = <0x0>; +			xlnx,unaligned-exceptions = <0x1>; +			xlnx,use-barrel = <0x1>; +			xlnx,use-dcache = <0x1>; +			xlnx,use-div = <0x1>; +			xlnx,use-ext-brk = <0x1>; +			xlnx,use-ext-nm-brk = <0x1>; +			xlnx,use-extended-fsl-instr = <0x0>; +			xlnx,use-fpu = <0x2>; +			xlnx,use-hw-mul = <0x2>; +			xlnx,use-icache = <0x1>; +			xlnx,use-interrupt = <0x1>; +			xlnx,use-mmu = <0x3>; +			xlnx,use-msr-instr = <0x1>; +			xlnx,use-pcmp-instr = <0x1>; +		} ; +	} ; +	mb_plb: plb@0 { +		#address-cells = <1>; +		#size-cells = <1>; +		compatible = "xlnx,plb-v46-1.03.a", "xlnx,plb-v46-1.00.a", "simple-bus"; +		ranges ; +		FLASH: flash@a0000000 { +			bank-width = <2>; +			compatible = "xlnx,xps-mch-emc-2.00.a", "cfi-flash"; +			reg = < 0xa0000000 0x2000000 >; +			xlnx,family = "virtex5"; +			xlnx,include-datawidth-matching-0 = <0x1>; +			xlnx,include-datawidth-matching-1 = <0x0>; +			xlnx,include-datawidth-matching-2 = <0x0>; +			xlnx,include-datawidth-matching-3 = <0x0>; +			xlnx,include-negedge-ioregs = <0x0>; +			xlnx,include-plb-ipif = <0x1>; +			xlnx,include-wrbuf = <0x1>; +			xlnx,max-mem-width = <0x10>; +			xlnx,mch-native-dwidth = <0x20>; +			xlnx,mch-plb-clk-period-ps = <0x1f40>; +			xlnx,mch-splb-awidth = <0x20>; +			xlnx,mch0-accessbuf-depth = <0x10>; +			xlnx,mch0-protocol = <0x0>; +			xlnx,mch0-rddatabuf-depth = <0x10>; +			xlnx,mch1-accessbuf-depth = <0x10>; +			xlnx,mch1-protocol = <0x0>; +			xlnx,mch1-rddatabuf-depth = <0x10>; +			xlnx,mch2-accessbuf-depth = <0x10>; +			xlnx,mch2-protocol = <0x0>; +			xlnx,mch2-rddatabuf-depth = <0x10>; +			xlnx,mch3-accessbuf-depth = <0x10>; +			xlnx,mch3-protocol = <0x0>; +			xlnx,mch3-rddatabuf-depth = <0x10>; +			xlnx,mem0-width = <0x10>; +			xlnx,mem1-width = <0x20>; +			xlnx,mem2-width = <0x20>; +			xlnx,mem3-width = <0x20>; +			xlnx,num-banks-mem = <0x1>; +			xlnx,num-channels = <0x0>; +			xlnx,priority-mode = <0x0>; +			xlnx,synch-mem-0 = <0x0>; +			xlnx,synch-mem-1 = <0x0>; +			xlnx,synch-mem-2 = <0x0>; +			xlnx,synch-mem-3 = <0x0>; +			xlnx,synch-pipedelay-0 = <0x2>; +			xlnx,synch-pipedelay-1 = <0x2>; +			xlnx,synch-pipedelay-2 = <0x2>; +			xlnx,synch-pipedelay-3 = <0x2>; +			xlnx,tavdv-ps-mem-0 = <0x1adb0>; +			xlnx,tavdv-ps-mem-1 = <0x3a98>; +			xlnx,tavdv-ps-mem-2 = <0x3a98>; +			xlnx,tavdv-ps-mem-3 = <0x3a98>; +			xlnx,tcedv-ps-mem-0 = <0x1adb0>; +			xlnx,tcedv-ps-mem-1 = <0x3a98>; +			xlnx,tcedv-ps-mem-2 = <0x3a98>; +			xlnx,tcedv-ps-mem-3 = <0x3a98>; +			xlnx,thzce-ps-mem-0 = <0x88b8>; +			xlnx,thzce-ps-mem-1 = <0x1b58>; +			xlnx,thzce-ps-mem-2 = <0x1b58>; +			xlnx,thzce-ps-mem-3 = <0x1b58>; +			xlnx,thzoe-ps-mem-0 = <0x1b58>; +			xlnx,thzoe-ps-mem-1 = <0x1b58>; +			xlnx,thzoe-ps-mem-2 = <0x1b58>; +			xlnx,thzoe-ps-mem-3 = <0x1b58>; +			xlnx,tlzwe-ps-mem-0 = <0x88b8>; +			xlnx,tlzwe-ps-mem-1 = <0x0>; +			xlnx,tlzwe-ps-mem-2 = <0x0>; +			xlnx,tlzwe-ps-mem-3 = <0x0>; +			xlnx,twc-ps-mem-0 = <0x2af8>; +			xlnx,twc-ps-mem-1 = <0x3a98>; +			xlnx,twc-ps-mem-2 = <0x3a98>; +			xlnx,twc-ps-mem-3 = <0x3a98>; +			xlnx,twp-ps-mem-0 = <0x11170>; +			xlnx,twp-ps-mem-1 = <0x2ee0>; +			xlnx,twp-ps-mem-2 = <0x2ee0>; +			xlnx,twp-ps-mem-3 = <0x2ee0>; +			xlnx,xcl0-linesize = <0x4>; +			xlnx,xcl0-writexfer = <0x1>; +			xlnx,xcl1-linesize = <0x4>; +			xlnx,xcl1-writexfer = <0x1>; +			xlnx,xcl2-linesize = <0x4>; +			xlnx,xcl2-writexfer = <0x1>; +			xlnx,xcl3-linesize = <0x4>; +			xlnx,xcl3-writexfer = <0x1>; +		} ; +		Hard_Ethernet_MAC: xps-ll-temac@81c00000 { +			#address-cells = <1>; +			#size-cells = <1>; +			compatible = "xlnx,compound"; +			ranges ; +			ethernet@81c00000 { +				compatible = "xlnx,xps-ll-temac-1.01.b", "xlnx,xps-ll-temac-1.00.a"; +				interrupt-parent = <&xps_intc_0>; +				interrupts = < 5 2 >; +				llink-connected = <&PIM3>; +				local-mac-address = [ 00 0a 35 00 00 00 ]; +				reg = < 0x81c00000 0x40 >; +				xlnx,bus2core-clk-ratio = <0x1>; +				xlnx,phy-type = <0x1>; +				xlnx,phyaddr = <0x1>; +				xlnx,rxcsum = <0x0>; +				xlnx,rxfifo = <0x1000>; +				xlnx,temac-type = <0x0>; +				xlnx,txcsum = <0x0>; +				xlnx,txfifo = <0x1000>; +			} ; +		} ; +		IIC_EEPROM: i2c@81600000 { +			compatible = "xlnx,xps-iic-2.00.a"; +			interrupt-parent = <&xps_intc_0>; +			interrupts = < 6 2 >; +			reg = < 0x81600000 0x10000 >; +			xlnx,clk-freq = <0x7735940>; +			xlnx,family = "virtex5"; +			xlnx,gpo-width = <0x1>; +			xlnx,iic-freq = <0x186a0>; +			xlnx,scl-inertial-delay = <0x0>; +			xlnx,sda-inertial-delay = <0x0>; +			xlnx,ten-bit-adr = <0x0>; +		} ; +		LEDs_8Bit: gpio@81400000 { +			compatible = "xlnx,xps-gpio-1.00.a"; +			interrupt-parent = <&xps_intc_0>; +			interrupts = < 7 2 >; +			reg = < 0x81400000 0x10000 >; +			xlnx,all-inputs = <0x0>; +			xlnx,all-inputs-2 = <0x0>; +			xlnx,dout-default = <0x0>; +			xlnx,dout-default-2 = <0x0>; +			xlnx,family = "virtex5"; +			xlnx,gpio-width = <0x8>; +			xlnx,interrupt-present = <0x1>; +			xlnx,is-bidir = <0x1>; +			xlnx,is-bidir-2 = <0x1>; +			xlnx,is-dual = <0x0>; +			xlnx,tri-default = <0xffffffff>; +			xlnx,tri-default-2 = <0xffffffff>; +			#gpio-cells = <2>; +			gpio-controller; +		} ; + +		gpio-leds { +			compatible = "gpio-leds"; + +			heartbeat { +				label = "Heartbeat"; +				gpios = <&LEDs_8Bit 4 1>; +				linux,default-trigger = "heartbeat"; +			}; + +			yellow { +				label = "Yellow"; +				gpios = <&LEDs_8Bit 5 1>; +			}; + +			red { +				label = "Red"; +				gpios = <&LEDs_8Bit 6 1>; +			}; + +			green { +				label = "Green"; +				gpios = <&LEDs_8Bit 7 1>; +			}; +		} ; +		RS232_Uart_1: serial@84000000 { +			clock-frequency = <125000000>; +			compatible = "xlnx,xps-uartlite-1.00.a"; +			current-speed = <115200>; +			device_type = "serial"; +			interrupt-parent = <&xps_intc_0>; +			interrupts = < 8 0 >; +			port-number = <0>; +			reg = < 0x84000000 0x10000 >; +			xlnx,baudrate = <0x1c200>; +			xlnx,data-bits = <0x8>; +			xlnx,family = "virtex5"; +			xlnx,odd-parity = <0x0>; +			xlnx,use-parity = <0x0>; +		} ; +		SysACE_CompactFlash: sysace@83600000 { +			compatible = "xlnx,xps-sysace-1.00.a"; +			interrupt-parent = <&xps_intc_0>; +			interrupts = < 4 2 >; +			reg = < 0x83600000 0x10000 >; +			xlnx,family = "virtex5"; +			xlnx,mem-width = <0x10>; +		} ; +		debug_module: debug@84400000 { +			compatible = "xlnx,mdm-1.00.d"; +			reg = < 0x84400000 0x10000 >; +			xlnx,family = "virtex5"; +			xlnx,interconnect = <0x1>; +			xlnx,jtag-chain = <0x2>; +			xlnx,mb-dbg-ports = <0x1>; +			xlnx,uart-width = <0x8>; +			xlnx,use-uart = <0x1>; +			xlnx,write-fsl-ports = <0x0>; +		} ; +		mpmc@90000000 { +			#address-cells = <1>; +			#size-cells = <1>; +			compatible = "xlnx,mpmc-4.02.a"; +			ranges ; +			PIM3: sdma@84600180 { +				compatible = "xlnx,ll-dma-1.00.a"; +				interrupt-parent = <&xps_intc_0>; +				interrupts = < 2 2 1 2 >; +				reg = < 0x84600180 0x80 >; +			} ; +		} ; +		xps_intc_0: interrupt-controller@81800000 { +			#interrupt-cells = <0x2>; +			compatible = "xlnx,xps-intc-1.00.a"; +			interrupt-controller ; +			reg = < 0x81800000 0x10000 >; +			xlnx,kind-of-intr = <0x100>; +			xlnx,num-intr-inputs = <0x9>; +		} ; +		xps_timer_1: timer@83c00000 { +			compatible = "xlnx,xps-timer-1.00.a"; +			interrupt-parent = <&xps_intc_0>; +			interrupts = < 3 2 >; +			reg = < 0x83c00000 0x10000 >; +			xlnx,count-width = <0x20>; +			xlnx,family = "virtex5"; +			xlnx,gen0-assert = <0x1>; +			xlnx,gen1-assert = <0x1>; +			xlnx,one-timer-only = <0x0>; +			xlnx,trig0-assert = <0x1>; +			xlnx,trig1-assert = <0x1>; +		} ; +	} ; +}  ; diff --git a/arch/microblaze/boot/linked_dtb.S b/arch/microblaze/boot/linked_dtb.S deleted file mode 100644 index cb2b537aebe..00000000000 --- a/arch/microblaze/boot/linked_dtb.S +++ /dev/null @@ -1,3 +0,0 @@ -.section __fdt_blob,"a" -.incbin "arch/microblaze/boot/system.dtb" - diff --git a/arch/microblaze/configs/mmu_defconfig b/arch/microblaze/configs/mmu_defconfig index 8b422b12ef7..e2f6543b91e 100644 --- a/arch/microblaze/configs/mmu_defconfig +++ b/arch/microblaze/configs/mmu_defconfig @@ -1,26 +1,21 @@ -CONFIG_EXPERIMENTAL=y  CONFIG_SYSVIPC=y +CONFIG_POSIX_MQUEUE=y +CONFIG_FHANDLE=y +CONFIG_AUDIT=y +CONFIG_AUDIT_LOGINUID_IMMUTABLE=y  CONFIG_IKCONFIG=y  CONFIG_IKCONFIG_PROC=y +CONFIG_SYSFS_DEPRECATED=y  CONFIG_SYSFS_DEPRECATED_V2=y -CONFIG_BLK_DEV_INITRD=y -CONFIG_INITRAMFS_SOURCE="rootfs.cpio" -CONFIG_INITRAMFS_COMPRESSION_GZIP=y -# CONFIG_CC_OPTIMIZE_FOR_SIZE is not set -CONFIG_EMBEDDED=y  CONFIG_KALLSYMS_ALL=y -CONFIG_KALLSYMS_EXTRA_PASS=y -# CONFIG_HOTPLUG is not set  # CONFIG_BASE_FULL is not set -# CONFIG_FUTEX is not set -# CONFIG_EPOLL is not set -# CONFIG_SIGNALFD is not set -# CONFIG_SHMEM is not set +CONFIG_EMBEDDED=y  CONFIG_SLAB=y  CONFIG_MODULES=y  CONFIG_MODULE_UNLOAD=y  # CONFIG_BLK_DEV_BSG is not set -CONFIG_OPT_LIB_ASM=y +CONFIG_PARTITION_ADVANCED=y +# CONFIG_EFI_PARTITION is not set  CONFIG_XILINX_MICROBLAZE0_USE_MSR_INSTR=1  CONFIG_XILINX_MICROBLAZE0_USE_PCMP_INSTR=1  CONFIG_XILINX_MICROBLAZE0_USE_BARREL=1 @@ -31,40 +26,66 @@ CONFIG_HZ_100=y  CONFIG_MMU=y  CONFIG_CMDLINE_BOOL=y  CONFIG_CMDLINE_FORCE=y +CONFIG_HIGHMEM=y +CONFIG_PCI=y +CONFIG_PCI_XILINX=y  CONFIG_NET=y  CONFIG_PACKET=y  CONFIG_UNIX=y  CONFIG_INET=y  # CONFIG_INET_LRO is not set  # CONFIG_IPV6 is not set +CONFIG_MTD=y  CONFIG_PROC_DEVICETREE=y  CONFIG_BLK_DEV_RAM=y  CONFIG_BLK_DEV_RAM_SIZE=8192  CONFIG_NETDEVICES=y -CONFIG_NET_ETHERNET=y  CONFIG_XILINX_EMACLITE=y +CONFIG_XILINX_LL_TEMAC=y  # CONFIG_INPUT is not set  # CONFIG_SERIO is not set  # CONFIG_VT is not set +CONFIG_SERIAL_8250=y +CONFIG_SERIAL_8250_CONSOLE=y  CONFIG_SERIAL_UARTLITE=y  CONFIG_SERIAL_UARTLITE_CONSOLE=y +CONFIG_SERIAL_OF_PLATFORM=y  # CONFIG_HW_RANDOM is not set +CONFIG_XILINX_HWICAP=y +CONFIG_I2C=y +CONFIG_I2C_XILINX=y +CONFIG_SPI=y +CONFIG_SPI_XILINX=y +CONFIG_GPIOLIB=y +CONFIG_GPIO_SYSFS=y +CONFIG_GPIO_XILINX=y  # CONFIG_HWMON is not set +CONFIG_WATCHDOG=y +CONFIG_XILINX_WATCHDOG=y +CONFIG_FB=y +CONFIG_FB_XILINX=y  # CONFIG_USB_SUPPORT is not set +CONFIG_UIO=y +CONFIG_UIO_PDRV=y +CONFIG_UIO_PDRV_GENIRQ=y +CONFIG_UIO_DMEM_GENIRQ=y  CONFIG_EXT2_FS=y  # CONFIG_DNOTIFY is not set +CONFIG_CRAMFS=y +CONFIG_ROMFS_FS=y  CONFIG_NFS_FS=y -CONFIG_NFS_V3=y  CONFIG_CIFS=y  CONFIG_CIFS_STATS=y  CONFIG_CIFS_STATS2=y -CONFIG_PARTITION_ADVANCED=y -CONFIG_DEBUG_KERNEL=y  CONFIG_DETECT_HUNG_TASK=y  CONFIG_DEBUG_SLAB=y  CONFIG_DEBUG_SPINLOCK=y  CONFIG_DEBUG_INFO=y -# CONFIG_RCU_CPU_STALL_DETECTOR is not set +CONFIG_KGDB=y +CONFIG_KGDB_TESTS=y +CONFIG_KGDB_KDB=y  CONFIG_EARLY_PRINTK=y -CONFIG_DEBUG_BOOTMEM=y +CONFIG_KEYS=y +CONFIG_ENCRYPTED_KEYS=y +CONFIG_KEYS_DEBUG_PROC_KEYS=y  # CONFIG_CRYPTO_ANSI_CPRNG is not set diff --git a/arch/microblaze/configs/nommu_defconfig b/arch/microblaze/configs/nommu_defconfig index ebc143c5368..a29ebd4a9fc 100644 --- a/arch/microblaze/configs/nommu_defconfig +++ b/arch/microblaze/configs/nommu_defconfig @@ -1,41 +1,42 @@  CONFIG_EXPERIMENTAL=y  CONFIG_SYSVIPC=y  CONFIG_POSIX_MQUEUE=y +CONFIG_FHANDLE=y +CONFIG_AUDIT=y +CONFIG_AUDIT_LOGINUID_IMMUTABLE=y  CONFIG_BSD_PROCESS_ACCT=y  CONFIG_BSD_PROCESS_ACCT_V3=y  CONFIG_IKCONFIG=y  CONFIG_IKCONFIG_PROC=y +CONFIG_SYSFS_DEPRECATED=y  CONFIG_SYSFS_DEPRECATED_V2=y -CONFIG_EMBEDDED=y  CONFIG_KALLSYMS_ALL=y -CONFIG_KALLSYMS_EXTRA_PASS=y -# CONFIG_HOTPLUG is not set  # CONFIG_BASE_FULL is not set +CONFIG_EMBEDDED=y  CONFIG_SLAB=y  CONFIG_MODULES=y  CONFIG_MODULE_UNLOAD=y  # CONFIG_BLK_DEV_BSG is not set -# CONFIG_OPT_LIB_FUNCTION is not set +CONFIG_PARTITION_ADVANCED=y +# CONFIG_EFI_PARTITION is not set  CONFIG_XILINX_MICROBLAZE0_USE_MSR_INSTR=1  CONFIG_XILINX_MICROBLAZE0_USE_PCMP_INSTR=1  CONFIG_XILINX_MICROBLAZE0_USE_BARREL=1  CONFIG_XILINX_MICROBLAZE0_USE_DIV=1  CONFIG_XILINX_MICROBLAZE0_USE_HW_MUL=2  CONFIG_XILINX_MICROBLAZE0_USE_FPU=2 -CONFIG_HIGH_RES_TIMERS=y  CONFIG_HZ_100=y  CONFIG_CMDLINE_BOOL=y -CONFIG_BINFMT_FLAT=y +CONFIG_CMDLINE_FORCE=y +CONFIG_PCI=y +CONFIG_PCI_XILINX=y  CONFIG_NET=y  CONFIG_PACKET=y  CONFIG_UNIX=y  CONFIG_INET=y  # CONFIG_INET_LRO is not set  # CONFIG_IPV6 is not set -# CONFIG_PREVENT_FIRMWARE_BUILD is not set  CONFIG_MTD=y -CONFIG_MTD_CONCAT=y -CONFIG_MTD_PARTITIONS=y  CONFIG_MTD_CMDLINE_PARTS=y  CONFIG_MTD_CHAR=y  CONFIG_MTD_BLOCK=y @@ -45,41 +46,56 @@ CONFIG_MTD_CFI_AMDSTD=y  CONFIG_MTD_RAM=y  CONFIG_MTD_UCLINUX=y  CONFIG_PROC_DEVICETREE=y -CONFIG_BLK_DEV_NBD=y  CONFIG_BLK_DEV_RAM=y +CONFIG_BLK_DEV_RAM_SIZE=8192  CONFIG_NETDEVICES=y -CONFIG_NET_ETHERNET=y +CONFIG_XILINX_EMACLITE=y +CONFIG_XILINX_LL_TEMAC=y  # CONFIG_INPUT is not set  # CONFIG_SERIO is not set  # CONFIG_VT is not set +CONFIG_SERIAL_8250=y +CONFIG_SERIAL_8250_CONSOLE=y  CONFIG_SERIAL_UARTLITE=y  CONFIG_SERIAL_UARTLITE_CONSOLE=y -CONFIG_HW_RANDOM=y +CONFIG_SERIAL_OF_PLATFORM=y +# CONFIG_HW_RANDOM is not set +CONFIG_XILINX_HWICAP=y +CONFIG_I2C=y +CONFIG_I2C_XILINX=y +CONFIG_SPI=y +CONFIG_SPI_XILINX=y +CONFIG_GPIOLIB=y +CONFIG_GPIO_SYSFS=y +CONFIG_GPIO_XILINX=y  # CONFIG_HWMON is not set -CONFIG_VIDEO_OUTPUT_CONTROL=y +CONFIG_WATCHDOG=y +CONFIG_XILINX_WATCHDOG=y +CONFIG_FB=y +CONFIG_FB_XILINX=y +# CONFIG_USB_SUPPORT is not set +CONFIG_UIO=y +CONFIG_UIO_PDRV=y +CONFIG_UIO_PDRV_GENIRQ=y +CONFIG_UIO_DMEM_GENIRQ=y  CONFIG_EXT2_FS=y  # CONFIG_DNOTIFY is not set  CONFIG_CRAMFS=y  CONFIG_ROMFS_FS=y  CONFIG_NFS_FS=y -CONFIG_NFS_V3=y  CONFIG_NFS_V3_ACL=y -CONFIG_UNUSED_SYMBOLS=y -CONFIG_DEBUG_FS=y -CONFIG_DEBUG_KERNEL=y -CONFIG_DEBUG_SHIRQ=y +CONFIG_NLS=y  CONFIG_DETECT_HUNG_TASK=y -CONFIG_SCHEDSTATS=y -CONFIG_TIMER_STATS=y -CONFIG_DEBUG_OBJECTS=y -CONFIG_DEBUG_OBJECTS_SELFTEST=y -CONFIG_DEBUG_OBJECTS_FREE=y -CONFIG_DEBUG_OBJECTS_TIMERS=y +CONFIG_DEBUG_SLAB=y +CONFIG_DEBUG_SPINLOCK=y  CONFIG_DEBUG_INFO=y -CONFIG_DEBUG_LIST=y -CONFIG_DEBUG_SG=y -# CONFIG_RCU_CPU_STALL_DETECTOR is not set -CONFIG_SYSCTL_SYSCALL_CHECK=y  CONFIG_EARLY_PRINTK=y +CONFIG_KEYS=y +CONFIG_ENCRYPTED_KEYS=y +CONFIG_KEYS_DEBUG_PROC_KEYS=y +CONFIG_CRYPTO_ECB=y +CONFIG_CRYPTO_MD4=y +CONFIG_CRYPTO_MD5=y +CONFIG_CRYPTO_ARC4=y +CONFIG_CRYPTO_DES=y  # CONFIG_CRYPTO_ANSI_CPRNG is not set -# CONFIG_CRC32 is not set diff --git a/arch/microblaze/include/asm/Kbuild b/arch/microblaze/include/asm/Kbuild index db5294c30ca..35b3ecaf25d 100644 --- a/arch/microblaze/include/asm/Kbuild +++ b/arch/microblaze/include/asm/Kbuild @@ -1,3 +1,11 @@ -include include/asm-generic/Kbuild.asm -header-y  += elf.h +generic-y += barrier.h +generic-y += clkdev.h +generic-y += cputime.h +generic-y += device.h +generic-y += exec.h +generic-y += hash.h +generic-y += mcs_spinlock.h +generic-y += preempt.h +generic-y += syscalls.h +generic-y += trace_clock.h diff --git a/arch/microblaze/include/asm/atomic.h b/arch/microblaze/include/asm/atomic.h index 6d2e1d418be..42ac382a09d 100644 --- a/arch/microblaze/include/asm/atomic.h +++ b/arch/microblaze/include/asm/atomic.h @@ -1,7 +1,9 @@  #ifndef _ASM_MICROBLAZE_ATOMIC_H  #define _ASM_MICROBLAZE_ATOMIC_H +#include <asm/cmpxchg.h>  #include <asm-generic/atomic.h> +#include <asm-generic/atomic64.h>  /*   * Atomically test *v and decrement if it is greater than 0. @@ -20,5 +22,6 @@ static inline int atomic_dec_if_positive(atomic_t *v)  	return res;  } +#define atomic_dec_if_positive atomic_dec_if_positive  #endif /* _ASM_MICROBLAZE_ATOMIC_H */ diff --git a/arch/microblaze/include/asm/cacheflush.h b/arch/microblaze/include/asm/cacheflush.h index 7ebd955460d..ffea82a16d2 100644 --- a/arch/microblaze/include/asm/cacheflush.h +++ b/arch/microblaze/include/asm/cacheflush.h @@ -84,12 +84,13 @@ do { \  #define flush_dcache_mmap_lock(mapping)		do { } while (0)  #define flush_dcache_mmap_unlock(mapping)	do { } while (0) -  #define flush_cache_dup_mm(mm)				do { } while (0)  #define flush_cache_vmap(start, end)			do { } while (0)  #define flush_cache_vunmap(start, end)			do { } while (0)  #define flush_cache_mm(mm)			do { } while (0) -#define flush_cache_page(vma, vmaddr, pfn)	do { } while (0) + +#define flush_cache_page(vma, vmaddr, pfn) \ +	flush_dcache_range(pfn << PAGE_SHIFT, (pfn << PAGE_SHIFT) + PAGE_SIZE);  /* MS: kgdb code use this macro, wrong len with FLASH */  #if 0 @@ -101,17 +102,23 @@ do { \  #define flush_cache_range(vma, start, len) do { } while (0) -#define copy_to_user_page(vma, page, vaddr, dst, src, len)		\ -do {									\ -	u32 addr = virt_to_phys(dst);					\ -	invalidate_icache_range((unsigned) (addr), (unsigned) (addr) + (len));\ -	memcpy((dst), (src), (len));					\ -	flush_dcache_range((unsigned) (addr), (unsigned) (addr) + (len));\ -} while (0) - -#define copy_from_user_page(vma, page, vaddr, dst, src, len)		\ -do {									\ -	memcpy((dst), (src), (len));					\ -} while (0) +static inline void copy_to_user_page(struct vm_area_struct *vma, +				     struct page *page, unsigned long vaddr, +				     void *dst, void *src, int len) +{ +	u32 addr = virt_to_phys(dst); +	memcpy(dst, src, len); +	if (vma->vm_flags & VM_EXEC) { +		invalidate_icache_range(addr, addr + PAGE_SIZE); +		flush_dcache_range(addr, addr + PAGE_SIZE); +	} +} + +static inline void copy_from_user_page(struct vm_area_struct *vma, +				       struct page *page, unsigned long vaddr, +				       void *dst, void *src, int len) +{ +	memcpy(dst, src, len); +}  #endif /* _ASM_MICROBLAZE_CACHEFLUSH_H */ diff --git a/arch/microblaze/include/asm/clinkage.h b/arch/microblaze/include/asm/clinkage.h deleted file mode 100644 index 9e218435a55..00000000000 --- a/arch/microblaze/include/asm/clinkage.h +++ /dev/null @@ -1 +0,0 @@ -#include <linux/linkage.h> diff --git a/arch/microblaze/include/asm/cmpxchg.h b/arch/microblaze/include/asm/cmpxchg.h new file mode 100644 index 00000000000..538afc0ab9f --- /dev/null +++ b/arch/microblaze/include/asm/cmpxchg.h @@ -0,0 +1,42 @@ +#ifndef _ASM_MICROBLAZE_CMPXCHG_H +#define _ASM_MICROBLAZE_CMPXCHG_H + +#include <linux/irqflags.h> + +void __bad_xchg(volatile void *ptr, int size); + +static inline unsigned long __xchg(unsigned long x, volatile void *ptr, +								int size) +{ +	unsigned long ret; +	unsigned long flags; + +	switch (size) { +	case 1: +		local_irq_save(flags); +		ret = *(volatile unsigned char *)ptr; +		*(volatile unsigned char *)ptr = x; +		local_irq_restore(flags); +		break; + +	case 4: +		local_irq_save(flags); +		ret = *(volatile unsigned long *)ptr; +		*(volatile unsigned long *)ptr = x; +		local_irq_restore(flags); +		break; +	default: +		__bad_xchg(ptr, size), ret = 0; +		break; +	} + +	return ret; +} + +#define xchg(ptr, x) \ +	((__typeof__(*(ptr))) __xchg((unsigned long)(x), (ptr), sizeof(*(ptr)))) + +#include <asm-generic/cmpxchg.h> +#include <asm-generic/cmpxchg-local.h> + +#endif /* _ASM_MICROBLAZE_CMPXCHG_H */ diff --git a/arch/microblaze/include/asm/cpuinfo.h b/arch/microblaze/include/asm/cpuinfo.h index cd257537ae5..3337417fcdc 100644 --- a/arch/microblaze/include/asm/cpuinfo.h +++ b/arch/microblaze/include/asm/cpuinfo.h @@ -38,6 +38,7 @@ struct cpuinfo {  	u32 use_exc;  	u32 ver_code;  	u32 mmu; +	u32 mmu_privins;  	u32 endian;  	/* CPU caches */ @@ -90,15 +91,18 @@ extern struct cpuinfo cpuinfo;  /* fwd declarations of the various CPUinfo populators */  void setup_cpuinfo(void); +void setup_cpuinfo_clk(void);  void set_cpuinfo_static(struct cpuinfo *ci, struct device_node *cpu);  void set_cpuinfo_pvr_full(struct cpuinfo *ci, struct device_node *cpu);  static inline unsigned int fcpu(struct device_node *cpu, char *n)  { -	int *val; -	return (val = (int *) of_get_property(cpu, n, NULL)) ? -							be32_to_cpup(val) : 0; +	u32 val = 0; + +	of_property_read_u32(cpu, n, &val); + +	return val;  }  #endif /* _ASM_MICROBLAZE_CPUINFO_H */ diff --git a/arch/microblaze/include/asm/cputime.h b/arch/microblaze/include/asm/cputime.h deleted file mode 100644 index 6d68ad7e0ea..00000000000 --- a/arch/microblaze/include/asm/cputime.h +++ /dev/null @@ -1 +0,0 @@ -#include <asm-generic/cputime.h> diff --git a/arch/microblaze/include/asm/delay.h b/arch/microblaze/include/asm/delay.h index 05b7d39e439..66fc24c2423 100644 --- a/arch/microblaze/include/asm/delay.h +++ b/arch/microblaze/include/asm/delay.h @@ -13,6 +13,8 @@  #ifndef _ASM_MICROBLAZE_DELAY_H  #define _ASM_MICROBLAZE_DELAY_H +#include <linux/param.h> +  extern inline void __delay(unsigned long loops)  {  	asm volatile ("# __delay		\n\t"		\ diff --git a/arch/microblaze/include/asm/device.h b/arch/microblaze/include/asm/device.h deleted file mode 100644 index 123b2fe72d0..00000000000 --- a/arch/microblaze/include/asm/device.h +++ /dev/null @@ -1,26 +0,0 @@ -/* - * Arch specific extensions to struct device - * - * This file is subject to the terms and conditions of the GNU General Public - * License v2. See the file "COPYING" in the main directory of this archive - * for more details. - */ - -#ifndef _ASM_MICROBLAZE_DEVICE_H -#define _ASM_MICROBLAZE_DEVICE_H - -struct device_node; - -struct dev_archdata { -	/* DMA operations on that device */ -	struct dma_map_ops	*dma_ops; -	void                    *dma_data; -}; - -struct pdev_archdata { -	u64 dma_mask; -}; - -#endif /* _ASM_MICROBLAZE_DEVICE_H */ - - diff --git a/arch/microblaze/include/asm/dma-mapping.h b/arch/microblaze/include/asm/dma-mapping.h index 8fbb0ec1023..ab353723076 100644 --- a/arch/microblaze/include/asm/dma-mapping.h +++ b/arch/microblaze/include/asm/dma-mapping.h @@ -16,7 +16,7 @@  #define _ASM_MICROBLAZE_DMA_MAPPING_H  /* - * See Documentation/PCI/PCI-DMA-mapping.txt and + * See Documentation/DMA-API-HOWTO.txt and   * Documentation/DMA-API.txt for documentation.   */ @@ -28,22 +28,12 @@  #include <linux/dma-attrs.h>  #include <asm/io.h>  #include <asm-generic/dma-coherent.h> +#include <asm/cacheflush.h>  #define DMA_ERROR_CODE		(~(dma_addr_t)0x0)  #define __dma_alloc_coherent(dev, gfp, size, handle)	NULL  #define __dma_free_coherent(size, addr)		((void)0) -#define __dma_sync(addr, size, rw)		((void)0) - -static inline unsigned long device_to_mask(struct device *dev) -{ -	if (dev->dma_mask && *dev->dma_mask) -		return *dev->dma_mask; -	/* Assume devices without mask can take 32 bit addresses */ -	return 0xfffffffful; -} - -extern struct dma_map_ops *dma_ops;  /*   * Available generic sets of operations @@ -52,20 +42,7 @@ extern struct dma_map_ops dma_direct_ops;  static inline struct dma_map_ops *get_dma_ops(struct device *dev)  { -	/* We don't handle the NULL dev case for ISA for now. We could -	 * do it via an out of line call but it is not needed for now. The -	 * only ISA DMA device we support is the floppy and we have a hack -	 * in the floppy driver directly to get a device for us. -	 */ -	if (unlikely(!dev) || !dev->archdata.dma_ops) -		return NULL; - -	return dev->archdata.dma_ops; -} - -static inline void set_dma_ops(struct device *dev, struct dma_map_ops *ops) -{ -	dev->archdata.dma_ops = ops; +	return &dma_direct_ops;  }  static inline int dma_supported(struct device *dev, u64 mask) @@ -95,9 +72,27 @@ static inline int dma_set_mask(struct device *dev, u64 dma_mask)  #include <asm-generic/dma-mapping-common.h> +static inline void __dma_sync(unsigned long paddr, +			      size_t size, enum dma_data_direction direction) +{ +	switch (direction) { +	case DMA_TO_DEVICE: +	case DMA_BIDIRECTIONAL: +		flush_dcache_range(paddr, paddr + size); +		break; +	case DMA_FROM_DEVICE: +		invalidate_dcache_range(paddr, paddr + size); +		break; +	default: +		BUG(); +	} +} +  static inline int dma_mapping_error(struct device *dev, dma_addr_t dma_addr)  {  	struct dma_map_ops *ops = get_dma_ops(dev); + +	debug_dma_mapping_error(dev, dma_addr);  	if (ops->mapping_error)  		return ops->mapping_error(dev, dma_addr); @@ -107,35 +102,41 @@ static inline int dma_mapping_error(struct device *dev, dma_addr_t dma_addr)  #define dma_alloc_noncoherent(d, s, h, f) dma_alloc_coherent(d, s, h, f)  #define dma_free_noncoherent(d, s, v, h) dma_free_coherent(d, s, v, h) -static inline void *dma_alloc_coherent(struct device *dev, size_t size, -					dma_addr_t *dma_handle, gfp_t flag) +#define dma_alloc_coherent(d, s, h, f) dma_alloc_attrs(d, s, h, f, NULL) + +static inline void *dma_alloc_attrs(struct device *dev, size_t size, +				    dma_addr_t *dma_handle, gfp_t flag, +				    struct dma_attrs *attrs)  {  	struct dma_map_ops *ops = get_dma_ops(dev);  	void *memory;  	BUG_ON(!ops); -	memory = ops->alloc_coherent(dev, size, dma_handle, flag); +	memory = ops->alloc(dev, size, dma_handle, flag, attrs);  	debug_dma_alloc_coherent(dev, size, *dma_handle, memory);  	return memory;  } -static inline void dma_free_coherent(struct device *dev, size_t size, -				     void *cpu_addr, dma_addr_t dma_handle) +#define dma_free_coherent(d,s,c,h) dma_free_attrs(d, s, c, h, NULL) + +static inline void dma_free_attrs(struct device *dev, size_t size, +				  void *cpu_addr, dma_addr_t dma_handle, +				  struct dma_attrs *attrs)  {  	struct dma_map_ops *ops = get_dma_ops(dev);  	BUG_ON(!ops);  	debug_dma_free_coherent(dev, size, cpu_addr, dma_handle); -	ops->free_coherent(dev, size, cpu_addr, dma_handle); +	ops->free(dev, size, cpu_addr, dma_handle, attrs);  }  static inline void dma_cache_sync(struct device *dev, void *vaddr, size_t size,  		enum dma_data_direction direction)  {  	BUG_ON(direction == DMA_NONE); -	__dma_sync(vaddr, size, (int)direction); +	__dma_sync(virt_to_phys(vaddr), size, (int)direction);  }  #endif	/* _ASM_MICROBLAZE_DMA_MAPPING_H */ diff --git a/arch/microblaze/include/asm/elf.h b/arch/microblaze/include/asm/elf.h index 098dfdde4b0..65902444906 100644 --- a/arch/microblaze/include/asm/elf.h +++ b/arch/microblaze/include/asm/elf.h @@ -7,116 +7,24 @@   * License. See the file "COPYING" in the main directory of this archive   * for more details.   */ -  #ifndef _ASM_MICROBLAZE_ELF_H  #define _ASM_MICROBLAZE_ELF_H -/* - * Note there is no "official" ELF designation for Microblaze. - * I've snaffled the value from the microblaze binutils source code - * /binutils/microblaze/include/elf/microblaze.h - */ -#define EM_XILINX_MICROBLAZE	0xbaab -#define ELF_ARCH		EM_XILINX_MICROBLAZE - -/* - * This is used to ensure we don't load something for the wrong architecture. - */ -#define elf_check_arch(x)	((x)->e_machine == EM_XILINX_MICROBLAZE) - -/* - * These are used to set parameters in the core dumps. - */ -#define ELF_CLASS	ELFCLASS32 +#include <uapi/asm/elf.h>  #ifndef __uClinux__ - -/* - * ELF register definitions.. - */ - -#include <asm/ptrace.h> -#include <asm/byteorder.h> -  #ifndef ELF_GREG_T -#define ELF_GREG_T -typedef unsigned long elf_greg_t;  #endif -  #ifndef ELF_NGREG -#define ELF_NGREG (sizeof(struct pt_regs) / sizeof(elf_greg_t))  #endif -  #ifndef ELF_GREGSET_T -#define ELF_GREGSET_T -typedef elf_greg_t elf_gregset_t[ELF_NGREG];  #endif -  #ifndef ELF_FPREGSET_T -#define ELF_FPREGSET_T - -/* TBD */ -#define ELF_NFPREG	33	/* includes fsr */ -typedef unsigned long elf_fpreg_t; -typedef elf_fpreg_t elf_fpregset_t[ELF_NFPREG]; - -/* typedef struct user_fpu_struct elf_fpregset_t; */  #endif - -/* This is the location that an ET_DYN program is loaded if exec'ed.  Typical - * use of this is to invoke "./ld.so someprog" to test out a new version of - * the loader.  We need to make sure that it is out of the way of the program - * that it will "exec", and that there is sufficient room for the brk. - */ - -#define ELF_ET_DYN_BASE         (0x08000000) -  #ifdef __MICROBLAZEEL__ -#define ELF_DATA	ELFDATA2LSB  #else -#define ELF_DATA	ELFDATA2MSB -#endif - -#define ELF_EXEC_PAGESIZE	PAGE_SIZE - - -#define ELF_CORE_COPY_REGS(_dest, _regs)			\ -	memcpy((char *) &_dest, (char *) _regs,		\ -	sizeof(struct pt_regs)); - -/* This yields a mask that user programs can use to figure out what - * instruction set this CPU supports.  This could be done in user space, - * but it's not easy, and we've already done it here. - */ -#define ELF_HWCAP	(0) - -/* This yields a string that ld.so will use to load implementation - * specific libraries for optimization.  This is more specific in - * intent than poking at uname or /proc/cpuinfo. - - * For the moment, we have only optimizations for the Intel generations, - * but that could change... - */ -#define ELF_PLATFORM  (NULL) - -/* Added _f parameter. Is this definition correct: TBD */ -#define ELF_PLAT_INIT(_r, _f)				\ -do {							\ -	_r->r1 =  _r->r1 =  _r->r2 =  _r->r3 =		\ -	_r->r4 =  _r->r5 =  _r->r6 =  _r->r7 =		\ -	_r->r8 =  _r->r9 =  _r->r10 = _r->r11 =		\ -	_r->r12 = _r->r13 = _r->r14 = _r->r15 =		\ -	_r->r16 = _r->r17 = _r->r18 = _r->r19 =		\ -	_r->r20 = _r->r21 = _r->r22 = _r->r23 =		\ -	_r->r24 = _r->r25 = _r->r26 = _r->r27 =		\ -	_r->r28 = _r->r29 = _r->r30 = _r->r31 =		\ -	0;						\ -} while (0) - -#ifdef __KERNEL__ -#define SET_PERSONALITY(ex) set_personality(PER_LINUX_32BIT)  #endif - +#define SET_PERSONALITY(ex) \ +	set_personality(PER_LINUX_32BIT | (current->personality & (~PER_MASK)))  #endif /* __uClinux__ */ -  #endif /* _ASM_MICROBLAZE_ELF_H */ diff --git a/arch/microblaze/include/asm/entry.h b/arch/microblaze/include/asm/entry.h index ec89f2ad0fe..b4a4cb150aa 100644 --- a/arch/microblaze/include/asm/entry.h +++ b/arch/microblaze/include/asm/entry.h @@ -29,42 +29,8 @@ DECLARE_PER_CPU(unsigned int, KM); /* Kernel/user mode */  DECLARE_PER_CPU(unsigned int, ENTRY_SP); /* Saved SP on kernel entry */  DECLARE_PER_CPU(unsigned int, R11_SAVE); /* Temp variable for entry */  DECLARE_PER_CPU(unsigned int, CURRENT_SAVE); /* Saved current pointer */ -# endif /* __ASSEMBLY__ */ - -#ifndef CONFIG_MMU - -/* noMMU hasn't any space for args */ -# define STATE_SAVE_ARG_SPACE	(0) -#else /* CONFIG_MMU */ - -/* If true, system calls save and restore all registers (except result - * registers, of course).  If false, then `call clobbered' registers - * will not be preserved, on the theory that system calls are basically - * function calls anyway, and the caller should be able to deal with it. - * This is a security risk, of course, as `internal' values may leak out - * after a system call, but that certainly doesn't matter very much for - * a processor with no MMU protection!  For a protected-mode kernel, it - * would be faster to just zero those registers before returning. - * - * I can not rely on the glibc implementation. If you turn it off make - * sure that r11/r12 is saved in user-space. --KAA - * - * These are special variables using by the kernel trap/interrupt code - * to save registers in, at a time when there are no spare registers we - * can use to do so, and we can't depend on the value of the stack - * pointer.  This means that they must be within a signed 16-bit - * displacement of 0x00000000. - */ - -/* A `state save frame' is a struct pt_regs preceded by some extra space - * suitable for a function call stack frame. */ - -/* Amount of room on the stack reserved for arguments and to satisfy the - * C calling conventions, in addition to the space used by the struct - * pt_regs that actually holds saved values. */ -#define STATE_SAVE_ARG_SPACE	(6*4) /* Up to six arguments */ - -#endif /* CONFIG_MMU */ +extern asmlinkage void do_notify_resume(struct pt_regs *regs, int in_syscall); +# endif /* __ASSEMBLY__ */  #endif /* _ASM_MICROBLAZE_ENTRY_H */ diff --git a/arch/microblaze/include/asm/exceptions.h b/arch/microblaze/include/asm/exceptions.h index 6479097b802..e6a8ddea1dc 100644 --- a/arch/microblaze/include/asm/exceptions.h +++ b/arch/microblaze/include/asm/exceptions.h @@ -66,6 +66,9 @@  asmlinkage void full_exception(struct pt_regs *regs, unsigned int type,  							int fsr, int addr); +asmlinkage void sw_exception(struct pt_regs *regs); +void bad_page_fault(struct pt_regs *regs, unsigned long address, int sig); +  void die(const char *str, struct pt_regs *fp, long err);  void _exception(int signr, struct pt_regs *regs, int code, unsigned long addr); diff --git a/arch/microblaze/include/asm/fixmap.h b/arch/microblaze/include/asm/fixmap.h new file mode 100644 index 00000000000..06c0e2b1883 --- /dev/null +++ b/arch/microblaze/include/asm/fixmap.h @@ -0,0 +1,69 @@ +/* + * fixmap.h: compile-time virtual memory allocation + * + * This file is subject to the terms and conditions of the GNU General Public + * License.  See the file "COPYING" in the main directory of this archive + * for more details. + * + * Copyright (C) 1998 Ingo Molnar + * + * Copyright 2008 Freescale Semiconductor Inc. + *   Port to powerpc added by Kumar Gala + * + * Copyright 2011 Michal Simek <monstr@monstr.eu> + * Copyright 2011 PetaLogix Qld Pty Ltd + *   Port to Microblaze + */ + +#ifndef _ASM_FIXMAP_H +#define _ASM_FIXMAP_H + +#ifndef __ASSEMBLY__ +#include <linux/kernel.h> +#include <asm/page.h> +#ifdef CONFIG_HIGHMEM +#include <linux/threads.h> +#include <asm/kmap_types.h> +#endif + +#define FIXADDR_TOP	((unsigned long)(-PAGE_SIZE)) + +/* + * Here we define all the compile-time 'special' virtual + * addresses. The point is to have a constant address at + * compile time, but to set the physical address only + * in the boot process. We allocate these special addresses + * from the end of virtual memory (0xfffff000) backwards. + * Also this lets us do fail-safe vmalloc(), we + * can guarantee that these special addresses and + * vmalloc()-ed addresses never overlap. + * + * these 'compile-time allocated' memory buffers are + * fixed-size 4k pages. (or larger if used with an increment + * highger than 1) use fixmap_set(idx,phys) to associate + * physical memory with fixmap indices. + * + * TLB entries of such buffers will not be flushed across + * task switches. + */ +enum fixed_addresses { +	FIX_HOLE, +#ifdef CONFIG_HIGHMEM +	FIX_KMAP_BEGIN,	/* reserved pte's for temporary kernel mappings */ +	FIX_KMAP_END = FIX_KMAP_BEGIN + (KM_TYPE_NR * num_possible_cpus()) - 1, +#endif +	__end_of_fixed_addresses +}; + +extern void __set_fixmap(enum fixed_addresses idx, +					phys_addr_t phys, pgprot_t flags); + +#define __FIXADDR_SIZE	(__end_of_fixed_addresses << PAGE_SHIFT) +#define FIXADDR_START		(FIXADDR_TOP - __FIXADDR_SIZE) + +#define FIXMAP_PAGE_NOCACHE PAGE_KERNEL_CI + +#include <asm-generic/fixmap.h> + +#endif /* !__ASSEMBLY__ */ +#endif diff --git a/arch/microblaze/include/asm/futex.h b/arch/microblaze/include/asm/futex.h index ad3fd61b2fe..01848f056f4 100644 --- a/arch/microblaze/include/asm/futex.h +++ b/arch/microblaze/include/asm/futex.h @@ -24,12 +24,12 @@  			.word	1b,4b,2b,4b;				\  			.previous;"					\  	: "=&r" (oldval), "=&r" (ret)					\ -	: "b" (uaddr), "i" (-EFAULT), "r" (oparg)			\ +	: "r" (uaddr), "i" (-EFAULT), "r" (oparg)			\  	);								\  })  static inline int -futex_atomic_op_inuser(int encoded_op, int __user *uaddr) +futex_atomic_op_inuser(int encoded_op, u32 __user *uaddr)  {  	int op = (encoded_op >> 28) & 7;  	int cmp = (encoded_op >> 24) & 15; @@ -39,7 +39,7 @@ futex_atomic_op_inuser(int encoded_op, int __user *uaddr)  	if (encoded_op & (FUTEX_OP_OPARG_SHIFT << 28))  		oparg = 1 << oparg; -	if (!access_ok(VERIFY_WRITE, uaddr, sizeof(int))) +	if (!access_ok(VERIFY_WRITE, uaddr, sizeof(u32)))  		return -EFAULT;  	pagefault_disable(); @@ -94,31 +94,34 @@ futex_atomic_op_inuser(int encoded_op, int __user *uaddr)  }  static inline int -futex_atomic_cmpxchg_inatomic(int __user *uaddr, int oldval, int newval) +futex_atomic_cmpxchg_inatomic(u32 *uval, u32 __user *uaddr, +			      u32 oldval, u32 newval)  { -	int prev, cmp; +	int ret = 0, cmp; +	u32 prev; -	if (!access_ok(VERIFY_WRITE, uaddr, sizeof(int))) +	if (!access_ok(VERIFY_WRITE, uaddr, sizeof(u32)))  		return -EFAULT; -	__asm__ __volatile__ ("1:	lwx	%0, %2, r0;		\ -					cmp	%1, %0, %3;		\ -					beqi	%1, 3f;			\ -				2:	swx	%4, %2, r0;		\ -					addic	%1, r0, 0;		\ -					bnei	%1, 1b;			\ +	__asm__ __volatile__ ("1:	lwx	%1, %3, r0;		\ +					cmp	%2, %1, %4;		\ +					bnei	%2, 3f;			\ +				2:	swx	%5, %3, r0;		\ +					addic	%2, r0, 0;		\ +					bnei	%2, 1b;			\  				3:					\  				.section .fixup,\"ax\";			\  				4:	brid	3b;			\ -					addik	%0, r0, %5;		\ +					addik	%0, r0, %6;		\  				.previous;				\  				.section __ex_table,\"a\";		\  				.word	1b,4b,2b,4b;			\  				.previous;"				\ -		: "=&r" (prev), "=&r"(cmp)				\ +		: "+r" (ret), "=&r" (prev), "=&r"(cmp)	\  		: "r" (uaddr), "r" (oldval), "r" (newval), "i" (-EFAULT)); -	return prev; +	*uval = prev; +	return ret;  }  #endif /* __KERNEL__ */ diff --git a/arch/microblaze/include/asm/gpio.h b/arch/microblaze/include/asm/gpio.h index 2b2c18be71c..b3799d88ffc 100644 --- a/arch/microblaze/include/asm/gpio.h +++ b/arch/microblaze/include/asm/gpio.h @@ -1,53 +1,4 @@ -/* - * Generic GPIO API implementation for PowerPC. - * - * Copyright (c) 2007-2008  MontaVista Software, Inc. - * - * Author: Anton Vorontsov <avorontsov@ru.mvista.com> - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - */ - -#ifndef _ASM_MICROBLAZE_GPIO_H -#define _ASM_MICROBLAZE_GPIO_H - -#include <linux/errno.h> -#include <asm-generic/gpio.h> - -#ifdef CONFIG_GPIOLIB - -/* - * We don't (yet) implement inlined/rapid versions for on-chip gpios. - * Just call gpiolib. - */ -static inline int gpio_get_value(unsigned int gpio) -{ -	return __gpio_get_value(gpio); -} - -static inline void gpio_set_value(unsigned int gpio, int value) -{ -	__gpio_set_value(gpio, value); -} - -static inline int gpio_cansleep(unsigned int gpio) -{ -	return __gpio_cansleep(gpio); -} - -static inline int gpio_to_irq(unsigned int gpio) -{ -	return __gpio_to_irq(gpio); -} - -static inline int irq_to_gpio(unsigned int irq) -{ -	return -EINVAL; -} - -#endif /* CONFIG_GPIOLIB */ - -#endif /* _ASM_MICROBLAZE_GPIO_H */ +#ifndef __LINUX_GPIO_H +#warning Include linux/gpio.h instead of asm/gpio.h +#include <linux/gpio.h> +#endif diff --git a/arch/microblaze/include/asm/hardirq.h b/arch/microblaze/include/asm/hardirq.h index cd1ac9aad56..fb3c05a0cbb 100644 --- a/arch/microblaze/include/asm/hardirq.h +++ b/arch/microblaze/include/asm/hardirq.h @@ -1,17 +1 @@ -/* - * Copyright (C) 2006 Atmark Techno, Inc. - * - * This file is subject to the terms and conditions of the GNU General Public - * License. See the file "COPYING" in the main directory of this archive - * for more details. - */ - -#ifndef _ASM_MICROBLAZE_HARDIRQ_H -#define _ASM_MICROBLAZE_HARDIRQ_H - -/* should be defined in each interrupt controller driver */ -extern unsigned int get_irq(struct pt_regs *regs); -  #include <asm-generic/hardirq.h> - -#endif /* _ASM_MICROBLAZE_HARDIRQ_H */ diff --git a/arch/microblaze/include/asm/highmem.h b/arch/microblaze/include/asm/highmem.h new file mode 100644 index 00000000000..d0463893243 --- /dev/null +++ b/arch/microblaze/include/asm/highmem.h @@ -0,0 +1,96 @@ +/* + * highmem.h: virtual kernel memory mappings for high memory + * + * Used in CONFIG_HIGHMEM systems for memory pages which + * are not addressable by direct kernel virtual addresses. + * + * Copyright (C) 1999 Gerhard Wichert, Siemens AG + *		      Gerhard.Wichert@pdb.siemens.de + * + * + * Redesigned the x86 32-bit VM architecture to deal with + * up to 16 Terabyte physical memory. With current x86 CPUs + * we now support up to 64 Gigabytes physical RAM. + * + * Copyright (C) 1999 Ingo Molnar <mingo@redhat.com> + */ +#ifndef _ASM_HIGHMEM_H +#define _ASM_HIGHMEM_H + +#ifdef __KERNEL__ + +#include <linux/init.h> +#include <linux/interrupt.h> +#include <linux/uaccess.h> +#include <asm/fixmap.h> + +extern pte_t *kmap_pte; +extern pgprot_t kmap_prot; +extern pte_t *pkmap_page_table; + +/* + * Right now we initialize only a single pte table. It can be extended + * easily, subsequent pte tables have to be allocated in one physical + * chunk of RAM. + */ +/* + * We use one full pte table with 4K pages. And with 16K/64K/256K pages pte + * table covers enough memory (32MB/512MB/2GB resp.), so that both FIXMAP + * and PKMAP can be placed in a single pte table. We use 512 pages for PKMAP + * in case of 16K/64K/256K page sizes. + */ + +#define PKMAP_ORDER	PTE_SHIFT +#define LAST_PKMAP	(1 << PKMAP_ORDER) + +#define PKMAP_BASE	((FIXADDR_START - PAGE_SIZE * (LAST_PKMAP + 1)) \ +								& PMD_MASK) + +#define LAST_PKMAP_MASK	(LAST_PKMAP - 1) +#define PKMAP_NR(virt)  ((virt - PKMAP_BASE) >> PAGE_SHIFT) +#define PKMAP_ADDR(nr)  (PKMAP_BASE + ((nr) << PAGE_SHIFT)) + +extern void *kmap_high(struct page *page); +extern void kunmap_high(struct page *page); +extern void *kmap_atomic_prot(struct page *page, pgprot_t prot); +extern void __kunmap_atomic(void *kvaddr); + +static inline void *kmap(struct page *page) +{ +	might_sleep(); +	if (!PageHighMem(page)) +		return page_address(page); +	return kmap_high(page); +} + +static inline void kunmap(struct page *page) +{ +	BUG_ON(in_interrupt()); +	if (!PageHighMem(page)) +		return; +	kunmap_high(page); +} + +static inline void *kmap_atomic(struct page *page) +{ +	return kmap_atomic_prot(page, kmap_prot); +} + +static inline struct page *kmap_atomic_to_page(void *ptr) +{ +	unsigned long idx, vaddr = (unsigned long) ptr; +	pte_t *pte; + +	if (vaddr < FIXADDR_START) +		return virt_to_page(ptr); + +	idx = virt_to_fix(vaddr); +	pte = kmap_pte - (idx - FIX_KMAP_BEGIN); +	return pte_page(*pte); +} + +#define flush_cache_kmaps()	{ flush_icache(); flush_dcache(); } + +#endif /* __KERNEL__ */ + +#endif /* _ASM_HIGHMEM_H */ diff --git a/arch/microblaze/include/asm/io.h b/arch/microblaze/include/asm/io.h index eae32220f44..433751b2a00 100644 --- a/arch/microblaze/include/asm/io.h +++ b/arch/microblaze/include/asm/io.h @@ -15,211 +15,38 @@  #include <asm/page.h>  #include <linux/types.h>  #include <linux/mm.h>          /* Get struct page {...} */ -#include <asm-generic/iomap.h>  #ifndef CONFIG_PCI  #define _IO_BASE	0  #define _ISA_MEM_BASE	0 -#define PCI_DRAM_OFFSET	0  #else  #define _IO_BASE	isa_io_base  #define _ISA_MEM_BASE	isa_mem_base -#define PCI_DRAM_OFFSET	pci_dram_offset -#endif +struct pci_dev; +extern void pci_iounmap(struct pci_dev *dev, void __iomem *); +#define pci_iounmap pci_iounmap  extern unsigned long isa_io_base; -extern unsigned long pci_io_base; -extern unsigned long pci_dram_offset; -  extern resource_size_t isa_mem_base; +#endif +#define PCI_IOBASE	((void __iomem *)_IO_BASE)  #define IO_SPACE_LIMIT (0xFFFFFFFF) -static inline unsigned char __raw_readb(const volatile void __iomem *addr) -{ -	return *(volatile unsigned char __force *)addr; -} -static inline unsigned short __raw_readw(const volatile void __iomem *addr) -{ -	return *(volatile unsigned short __force *)addr; -} -static inline unsigned int __raw_readl(const volatile void __iomem *addr) -{ -	return *(volatile unsigned int __force *)addr; -} -static inline unsigned long __raw_readq(const volatile void __iomem *addr) -{ -	return *(volatile unsigned long __force *)addr; -} -static inline void __raw_writeb(unsigned char v, volatile void __iomem *addr) -{ -	*(volatile unsigned char __force *)addr = v; -} -static inline void __raw_writew(unsigned short v, volatile void __iomem *addr) -{ -	*(volatile unsigned short __force *)addr = v; -} -static inline void __raw_writel(unsigned int v, volatile void __iomem *addr) -{ -	*(volatile unsigned int __force *)addr = v; -} -static inline void __raw_writeq(unsigned long v, volatile void __iomem *addr) -{ -	*(volatile unsigned long __force *)addr = v; -} - -/* - * read (readb, readw, readl, readq) and write (writeb, writew, - * writel, writeq) accessors are for PCI and thus littel endian. - * Linux 2.4 for Microblaze had this wrong. - */ -static inline unsigned char readb(const volatile void __iomem *addr) -{ -	return *(volatile unsigned char __force *)addr; -} -static inline unsigned short readw(const volatile void __iomem *addr) -{ -	return le16_to_cpu(*(volatile unsigned short __force *)addr); -} -static inline unsigned int readl(const volatile void __iomem *addr) -{ -	return le32_to_cpu(*(volatile unsigned int __force *)addr); -} -static inline void writeb(unsigned char v, volatile void __iomem *addr) -{ -	*(volatile unsigned char __force *)addr = v; -} -static inline void writew(unsigned short v, volatile void __iomem *addr) -{ -	*(volatile unsigned short __force *)addr = cpu_to_le16(v); -} -static inline void writel(unsigned int v, volatile void __iomem *addr) -{ -	*(volatile unsigned int __force *)addr = cpu_to_le32(v); -} - -/* ioread and iowrite variants. thease are for now same as __raw_ - * variants of accessors. we might check for endianess in the feature - */ -#define ioread8(addr)		__raw_readb((u8 *)(addr)) -#define ioread16(addr)		__raw_readw((u16 *)(addr)) -#define ioread32(addr)		__raw_readl((u32 *)(addr)) -#define iowrite8(v, addr)	__raw_writeb((u8)(v), (u8 *)(addr)) -#define iowrite16(v, addr)	__raw_writew((u16)(v), (u16 *)(addr)) -#define iowrite32(v, addr)	__raw_writel((u32)(v), (u32 *)(addr)) - -#define ioread16be(addr)	__raw_readw((u16 *)(addr)) -#define ioread32be(addr)	__raw_readl((u32 *)(addr)) -#define iowrite16be(v, addr)	__raw_writew((u16)(v), (u16 *)(addr)) -#define iowrite32be(v, addr)	__raw_writel((u32)(v), (u32 *)(addr)) - -/* These are the definitions for the x86 IO instructions - * inb/inw/inl/outb/outw/outl, the "string" versions - * insb/insw/insl/outsb/outsw/outsl, and the "pausing" versions - * inb_p/inw_p/... - * The macros don't do byte-swapping. - */ -#define inb(port)		readb((u8 *)((port))) -#define outb(val, port)		writeb((val), (u8 *)((unsigned long)(port))) -#define inw(port)		readw((u16 *)((port))) -#define outw(val, port)		writew((val), (u16 *)((unsigned long)(port))) -#define inl(port)		readl((u32 *)((port))) -#define outl(val, port)		writel((val), (u32 *)((unsigned long)(port))) - -#define inb_p(port)		inb((port)) -#define outb_p(val, port)	outb((val), (port)) -#define inw_p(port)		inw((port)) -#define outw_p(val, port)	outw((val), (port)) -#define inl_p(port)		inl((port)) -#define outl_p(val, port)	outl((val), (port)) - -#define memset_io(a, b, c)	memset((void *)(a), (b), (c)) -#define memcpy_fromio(a, b, c)	memcpy((a), (void *)(b), (c)) -#define memcpy_toio(a, b, c)	memcpy((void *)(a), (b), (c)) -  #ifdef CONFIG_MMU - -#define phys_to_virt(addr)	((void *)__phys_to_virt(addr)) -#define virt_to_phys(addr)	((unsigned long)__virt_to_phys(addr)) -#define virt_to_bus(addr)	((unsigned long)__virt_to_phys(addr)) -  #define page_to_bus(page)	(page_to_phys(page)) -#define bus_to_virt(addr)	(phys_to_virt(addr)) - -extern void iounmap(void *addr); -/*extern void *__ioremap(phys_addr_t address, unsigned long size, -		unsigned long flags);*/ -extern void __iomem *ioremap(phys_addr_t address, unsigned long size); -#define ioremap_writethrough(addr, size) ioremap((addr), (size)) -#define ioremap_nocache(addr, size)      ioremap((addr), (size)) -#define ioremap_fullcache(addr, size)    ioremap((addr), (size)) -#else /* CONFIG_MMU */ +extern void iounmap(void __iomem *addr); -/** - *	virt_to_phys - map virtual addresses to physical - *	@address: address to remap - * - *	The returned physical address is the physical (CPU) mapping for - *	the memory address given. It is only valid to use this function on - *	addresses directly mapped or allocated via kmalloc. - * - *	This function does not give bus mappings for DMA transfers. In - *	almost all conceivable cases a device driver should not be using - *	this function - */ -static inline unsigned long __iomem virt_to_phys(volatile void *address) -{ -	return __pa((unsigned long)address); -} - -#define virt_to_bus virt_to_phys - -/** - *	phys_to_virt - map physical address to virtual - *	@address: address to remap - * - *	The returned virtual address is a current CPU mapping for - *	the memory address given. It is only valid to use this function on - *	addresses that have a kernel mapping - * - *	This function does not handle bus mappings for DMA transfers. In - *	almost all conceivable cases a device driver should not be using - *	this function - */ -static inline void *phys_to_virt(unsigned long address) -{ -	return (void *)__va(address); -} - -#define bus_to_virt(a) phys_to_virt(a) - -static inline void __iomem *__ioremap(phys_addr_t address, unsigned long size, -			unsigned long flags) -{ -	return (void *)address; -} - -#define ioremap(physaddr, size)	((void __iomem *)(unsigned long)(physaddr)) -#define iounmap(addr)		((void)0) -#define ioremap_nocache(physaddr, size)	ioremap(physaddr, size) +extern void __iomem *ioremap(phys_addr_t address, unsigned long size); +#define ioremap_writethrough(addr, size)	ioremap((addr), (size)) +#define ioremap_nocache(addr, size)		ioremap((addr), (size)) +#define ioremap_fullcache(addr, size)		ioremap((addr), (size)) +#define ioremap_wc(addr, size)			ioremap((addr), (size))  #endif /* CONFIG_MMU */ -/* - * Convert a physical pointer to a virtual kernel pointer for /dev/mem - * access - */ -#define xlate_dev_mem_ptr(p)	__va(p) - -/* - * Convert a virtual cached pointer to an uncached pointer - */ -#define xlate_dev_kmem_ptr(p)	p - -/* - * Big Endian - */ +/* Big Endian */  #define out_be32(a, v) __raw_writel((v), (void __iomem __force *)(a))  #define out_be16(a, v) __raw_writew((v), (a)) @@ -229,10 +56,7 @@ static inline void __iomem *__ioremap(phys_addr_t address, unsigned long size,  #define writel_be(v, a)	out_be32((__force unsigned *)a, v)  #define readl_be(a)	in_be32((__force unsigned *)a) -/* - * Little endian - */ - +/* Little endian */  #define out_le32(a, v) __raw_writel(__cpu_to_le32(v), (a))  #define out_le16(a, v) __raw_writew(__cpu_to_le16(v), (a)) @@ -243,9 +67,14 @@ static inline void __iomem *__ioremap(phys_addr_t address, unsigned long size,  #define out_8(a, v) __raw_writeb((v), (a))  #define in_8(a) __raw_readb(a) -#define mmiowb() +#include <asm-generic/io.h> + +#define readb_relaxed	readb +#define readw_relaxed	readw +#define readl_relaxed	readl -#define ioport_map(port, nr)	((void __iomem *)(port)) -#define ioport_unmap(addr) +#define writeb_relaxed	writeb +#define writew_relaxed	writew +#define writel_relaxed	writel  #endif /* _ASM_MICROBLAZE_IO_H */ diff --git a/arch/microblaze/include/asm/irq.h b/arch/microblaze/include/asm/irq.h index ec5583d6111..bab3b1393ad 100644 --- a/arch/microblaze/include/asm/irq.h +++ b/arch/microblaze/include/asm/irq.h @@ -9,46 +9,13 @@  #ifndef _ASM_MICROBLAZE_IRQ_H  #define _ASM_MICROBLAZE_IRQ_H -#define NR_IRQS 32 +#define NR_IRQS		(32 + 1)  #include <asm-generic/irq.h> -#include <linux/interrupt.h> - -/* This type is the placeholder for a hardware interrupt number. It has to - * be big enough to enclose whatever representation is used by a given - * platform. - */ -typedef unsigned long irq_hw_number_t; - -extern unsigned int nr_irq; - -#define NO_IRQ (-1) -  struct pt_regs;  extern void do_IRQ(struct pt_regs *regs); -/** FIXME - not implement - * irq_dispose_mapping - Unmap an interrupt - * @virq: linux virq number of the interrupt to unmap - */ -static inline void irq_dispose_mapping(unsigned int virq) -{ -	return; -} - -struct irq_host; - -/** - * irq_create_mapping - Map a hardware interrupt into linux virq space - * @host: host owning this hardware interrupt or NULL for default host - * @hwirq: hardware irq number in that host space - * - * Only one mapping per hardware interrupt is permitted. Returns a linux - * virq number. - * If the sense/trigger is to be specified, set_irq_type() should be called - * on the number returned from that call. - */ -extern unsigned int irq_create_mapping(struct irq_host *host, -					irq_hw_number_t hwirq); +/* should be defined in each interrupt controller driver */ +extern unsigned int get_irq(void);  #endif /* _ASM_MICROBLAZE_IRQ_H */ diff --git a/arch/microblaze/include/asm/irqflags.h b/arch/microblaze/include/asm/irqflags.h index 5fd31905775..c9a6262832c 100644 --- a/arch/microblaze/include/asm/irqflags.h +++ b/arch/microblaze/include/asm/irqflags.h @@ -12,9 +12,9 @@  #include <linux/types.h>  #include <asm/registers.h> -#ifdef CONFIG_XILINX_MICROBLAZE0_USE_MSR_INSTR +#if CONFIG_XILINX_MICROBLAZE0_USE_MSR_INSTR -static inline unsigned long arch_local_irq_save(void) +static inline notrace unsigned long arch_local_irq_save(void)  {  	unsigned long flags;  	asm volatile("	msrclr %0, %1	\n" @@ -25,7 +25,7 @@ static inline unsigned long arch_local_irq_save(void)  	return flags;  } -static inline void arch_local_irq_disable(void) +static inline notrace void arch_local_irq_disable(void)  {  	/* this uses r0 without declaring it - is that correct? */  	asm volatile("	msrclr r0, %0	\n" @@ -35,7 +35,7 @@ static inline void arch_local_irq_disable(void)  		     : "memory");  } -static inline void arch_local_irq_enable(void) +static inline notrace void arch_local_irq_enable(void)  {  	/* this uses r0 without declaring it - is that correct? */  	asm volatile("	msrset	r0, %0	\n" @@ -47,7 +47,7 @@ static inline void arch_local_irq_enable(void)  #else /* !CONFIG_XILINX_MICROBLAZE0_USE_MSR_INSTR */ -static inline unsigned long arch_local_irq_save(void) +static inline notrace unsigned long arch_local_irq_save(void)  {  	unsigned long flags, tmp;  	asm volatile ("	mfs	%0, rmsr	\n" @@ -61,7 +61,7 @@ static inline unsigned long arch_local_irq_save(void)  	return flags;  } -static inline void arch_local_irq_disable(void) +static inline notrace void arch_local_irq_disable(void)  {  	unsigned long tmp;  	asm volatile("	mfs	%0, rmsr	\n" @@ -74,7 +74,7 @@ static inline void arch_local_irq_disable(void)  		     : "memory");  } -static inline void arch_local_irq_enable(void) +static inline notrace void arch_local_irq_enable(void)  {  	unsigned long tmp;  	asm volatile("	mfs	%0, rmsr	\n" @@ -89,7 +89,7 @@ static inline void arch_local_irq_enable(void)  #endif /* CONFIG_XILINX_MICROBLAZE0_USE_MSR_INSTR */ -static inline unsigned long arch_local_save_flags(void) +static inline notrace unsigned long arch_local_save_flags(void)  {  	unsigned long flags;  	asm volatile("	mfs	%0, rmsr	\n" @@ -100,7 +100,7 @@ static inline unsigned long arch_local_save_flags(void)  	return flags;  } -static inline void arch_local_irq_restore(unsigned long flags) +static inline notrace void arch_local_irq_restore(unsigned long flags)  {  	asm volatile("	mts	rmsr, %0	\n"  		     "	nop			\n" @@ -109,12 +109,12 @@ static inline void arch_local_irq_restore(unsigned long flags)  		     : "memory");  } -static inline bool arch_irqs_disabled_flags(unsigned long flags) +static inline notrace bool arch_irqs_disabled_flags(unsigned long flags)  {  	return (flags & MSR_IE) == 0;  } -static inline bool arch_irqs_disabled(void) +static inline notrace bool arch_irqs_disabled(void)  {  	return arch_irqs_disabled_flags(arch_local_save_flags());  } diff --git a/arch/microblaze/include/asm/memblock.h b/arch/microblaze/include/asm/memblock.h deleted file mode 100644 index 20a8e257c77..00000000000 --- a/arch/microblaze/include/asm/memblock.h +++ /dev/null @@ -1,14 +0,0 @@ -/* - * Copyright (C) 2008 Michal Simek <monstr@monstr.eu> - * - * This file is subject to the terms and conditions of the GNU General Public - * License. See the file "COPYING" in the main directory of this archive - * for more details. - */ - -#ifndef _ASM_MICROBLAZE_MEMBLOCK_H -#define _ASM_MICROBLAZE_MEMBLOCK_H - -#endif /* _ASM_MICROBLAZE_MEMBLOCK_H */ - - diff --git a/arch/microblaze/include/asm/mmu.h b/arch/microblaze/include/asm/mmu.h index 8d6a654ceff..1f9edddf7f4 100644 --- a/arch/microblaze/include/asm/mmu.h +++ b/arch/microblaze/include/asm/mmu.h @@ -56,6 +56,12 @@ typedef struct _SEGREG {  extern void _tlbie(unsigned long va);	/* invalidate a TLB entry */  extern void _tlbia(void);		/* invalidate all TLB entries */ + +/* + * tlb_skip size stores actual number skipped TLBs from TLB0 - every directy TLB + * mapping has to increase tlb_skip size. + */ +extern u32 tlb_skip;  #   endif /* __ASSEMBLY__ */  /* @@ -69,6 +75,12 @@ extern void _tlbia(void);		/* invalidate all TLB entries */  #  define MICROBLAZE_TLB_SIZE 64 +/* For cases when you want to skip some TLB entries */ +#  define MICROBLAZE_TLB_SKIP 0 + +/* Use the last TLB for temporary access to LMB */ +#  define MICROBLAZE_LMB_TLB_ID 63 +  /*   * TLB entries are defined by a "high" tag portion and a "low" data   * portion. The data portion is 32-bits. diff --git a/arch/microblaze/include/asm/mmu_context.h b/arch/microblaze/include/asm/mmu_context.h index 24eab1674d3..0ccd8c402cd 100644 --- a/arch/microblaze/include/asm/mmu_context.h +++ b/arch/microblaze/include/asm/mmu_context.h @@ -1,5 +1,5 @@  #ifdef CONFIG_MMU -# include "mmu_context_mm.h" +# include <asm/mmu_context_mm.h>  #else  # include <asm-generic/mmu_context.h>  #endif diff --git a/arch/microblaze/include/asm/mmu_context_mm.h b/arch/microblaze/include/asm/mmu_context_mm.h index 3e5c254e8d1..d6864774644 100644 --- a/arch/microblaze/include/asm/mmu_context_mm.h +++ b/arch/microblaze/include/asm/mmu_context_mm.h @@ -11,7 +11,7 @@  #ifndef _ASM_MICROBLAZE_MMU_CONTEXT_H  #define _ASM_MICROBLAZE_MMU_CONTEXT_H -#include <asm/atomic.h> +#include <linux/atomic.h>  #include <asm/bitops.h>  #include <asm/mmu.h>  #include <asm-generic/mm_hooks.h> diff --git a/arch/microblaze/include/asm/namei.h b/arch/microblaze/include/asm/namei.h deleted file mode 100644 index 61d60b8a07d..00000000000 --- a/arch/microblaze/include/asm/namei.h +++ /dev/null @@ -1,22 +0,0 @@ -/* - * Copyright (C) 2006 Atmark Techno, Inc. - * - * This file is subject to the terms and conditions of the GNU General Public - * License. See the file "COPYING" in the main directory of this archive - * for more details. - */ - -#ifndef _ASM_MICROBLAZE_NAMEI_H -#define _ASM_MICROBLAZE_NAMEI_H - -#ifdef __KERNEL__ - -/* This dummy routine maybe changed to something useful - * for /usr/gnemul/ emulation stuff. - * Look at asm-sparc/namei.h for details. - */ -#define __emul_prefix() NULL - -#endif /* __KERNEL__ */ - -#endif /* _ASM_MICROBLAZE_NAMEI_H */ diff --git a/arch/microblaze/include/asm/page.h b/arch/microblaze/include/asm/page.h index ed9d0f6e2cd..fd850879854 100644 --- a/arch/microblaze/include/asm/page.h +++ b/arch/microblaze/include/asm/page.h @@ -23,12 +23,10 @@  #ifdef __KERNEL__  /* PAGE_SHIFT determines the page size */ -#if defined(CONFIG_MICROBLAZE_32K_PAGES) -#define PAGE_SHIFT		15 +#if defined(CONFIG_MICROBLAZE_64K_PAGES) +#define PAGE_SHIFT		16  #elif defined(CONFIG_MICROBLAZE_16K_PAGES)  #define PAGE_SHIFT		14 -#elif defined(CONFIG_MICROBLAZE_8K_PAGES) -#define PAGE_SHIFT		13  #else  #define PAGE_SHIFT		12  #endif @@ -37,6 +35,8 @@  #define LOAD_OFFSET	ASM_CONST((CONFIG_KERNEL_START-CONFIG_KERNEL_BASE_ADDR)) +#define PTE_SHIFT	(PAGE_SHIFT - 2)	/* 1024 ptes per page */ +  #ifndef __ASSEMBLY__  /* MS be sure that SLAB allocates aligned objects */ @@ -71,7 +71,6 @@ extern unsigned int __page_offset;   * The basic type of a PTE - 32 bit physical addressing.   */  typedef unsigned long pte_basic_t; -#define PTE_SHIFT	(PAGE_SHIFT - 2)	/* 1024 ptes per page */  #define PTE_FMT		"%.8lx"  #endif /* CONFIG_MMU */ @@ -135,8 +134,10 @@ extern unsigned long min_low_pfn;  extern unsigned long max_pfn;  extern unsigned long memory_start; -extern unsigned long memory_end;  extern unsigned long memory_size; +extern unsigned long lowmem_size; + +extern unsigned long kernel_tlb;  extern int page_is_ram(unsigned long pfn); @@ -167,22 +168,14 @@ extern int page_is_ram(unsigned long pfn);  #  else /* CONFIG_MMU */  #  define ARCH_PFN_OFFSET	(memory_start >> PAGE_SHIFT)  #  define pfn_valid(pfn)	((pfn) < (max_mapnr + ARCH_PFN_OFFSET)) -#  define VALID_PAGE(page) 	((page - mem_map) < max_mapnr)  #  endif /* CONFIG_MMU */  # endif /* __ASSEMBLY__ */  #define	virt_addr_valid(vaddr)	(pfn_valid(virt_to_pfn(vaddr))) - -#  ifndef CONFIG_MMU -#  define __pa(vaddr)	((unsigned long) (vaddr)) -#  define __va(paddr)	((void *) (paddr)) -#  else /* CONFIG_MMU */ -#  define __pa(x)	__virt_to_phys((unsigned long)(x)) -#  define __va(x)	((void *)__phys_to_virt((unsigned long)(x))) -#  endif /* CONFIG_MMU */ - +# define __pa(x)	__virt_to_phys((unsigned long)(x)) +# define __va(x)	((void *)__phys_to_virt((unsigned long)(x)))  /* Convert between virtual and physical address for MMU. */  /* Handle MicroBlaze processor with virtual memory. */ diff --git a/arch/microblaze/include/asm/pci-bridge.h b/arch/microblaze/include/asm/pci-bridge.h index 0c68764ab54..cb5d3979480 100644 --- a/arch/microblaze/include/asm/pci-bridge.h +++ b/arch/microblaze/include/asm/pci-bridge.h @@ -13,28 +13,15 @@  struct device_node; -enum { -	/* Force re-assigning all resources (ignore firmware -	 * setup completely) -	 */ -	PCI_REASSIGN_ALL_RSRC	= 0x00000001, - -	/* Re-assign all bus numbers */ -	PCI_REASSIGN_ALL_BUS	= 0x00000002, - -	/* Do not try to assign, just use existing setup */ -	PCI_PROBE_ONLY		= 0x00000004, - -	/* Don't bother with ISA alignment unless the bridge has -	 * ISA forwarding enabled -	 */ -	PCI_CAN_SKIP_ISA_ALIGN	= 0x00000008, - -	/* Enable domain numbers in /proc */ -	PCI_ENABLE_PROC_DOMAINS	= 0x00000010, -	/* ... except for domain 0 */ -	PCI_COMPAT_DOMAIN_0		= 0x00000020, -}; +#ifdef CONFIG_PCI +extern struct list_head hose_list; +extern int pcibios_vaddr_is_ioport(void __iomem *address); +#else +static inline int pcibios_vaddr_is_ioport(void __iomem *address) +{ +	return 0; +} +#endif  /*   * Structure of a PCI controller (host bridge) @@ -76,7 +63,7 @@ struct pci_controller {  	 * Used for variants of PCI indirect handling and possible quirks:  	 *  SET_CFG_TYPE - used on 4xx or any PHB that does explicit type0/1  	 *  EXT_REG - provides access to PCI-e extended registers -	 *  SURPRESS_PRIMARY_BUS - we surpress the setting of PCI_PRIMARY_BUS +	 *  SURPRESS_PRIMARY_BUS - we suppress the setting of PCI_PRIMARY_BUS  	 *   on Freescale PCI-e controllers since they used the PCI_PRIMARY_BUS  	 *   to determine which bus number to match on when generating type0  	 *   config cycles @@ -104,6 +91,7 @@ struct pci_controller {  	int global_number;	/* PCI domain number */  }; +#ifdef CONFIG_PCI  static inline struct pci_controller *pci_bus_to_host(const struct pci_bus *bus)  {  	return bus->sysdata; @@ -116,6 +104,7 @@ static inline int isa_vaddr_is_ioport(void __iomem *address)  	 */  	return 0;  } +#endif /* CONFIG_PCI */  /* These are used for config access before all the PCI probing     has been done. */ @@ -150,42 +139,6 @@ extern void pci_process_bridge_OF_ranges(struct pci_controller *hose,  /* Allocate & free a PCI host bridge structure */  extern struct pci_controller *pcibios_alloc_controller(struct device_node *dev);  extern void pcibios_free_controller(struct pci_controller *phb); -extern void pcibios_setup_phb_resources(struct pci_controller *hose); - -#ifdef CONFIG_PCI -extern unsigned int pci_flags; - -static inline void pci_set_flags(int flags) -{ -	pci_flags = flags; -} - -static inline void pci_add_flags(int flags) -{ -	pci_flags |= flags; -} - -static inline int pci_has_flag(int flag) -{ -	return pci_flags & flag; -} - -extern struct list_head hose_list; - -extern int pcibios_vaddr_is_ioport(void __iomem *address); -#else -static inline int pcibios_vaddr_is_ioport(void __iomem *address) -{ -	return 0; -} - -static inline void pci_set_flags(int flags) { } -static inline void pci_add_flags(int flags) { } -static inline int pci_has_flag(int flag) -{ -	return 0; -} -#endif	/* CONFIG_PCI */  #endif	/* __KERNEL__ */  #endif	/* _ASM_MICROBLAZE_PCI_BRIDGE_H */ diff --git a/arch/microblaze/include/asm/pci.h b/arch/microblaze/include/asm/pci.h index 2232ff942ba..468aca8cec0 100644 --- a/arch/microblaze/include/asm/pci.h +++ b/arch/microblaze/include/asm/pci.h @@ -22,6 +22,8 @@  #include <asm/prom.h>  #include <asm/pci-bridge.h> +#include <asm-generic/pci-dma-compat.h> +  #define PCIBIOS_MIN_IO		0x1000  #define PCIBIOS_MIN_MEM		0x10000000 @@ -40,26 +42,7 @@ struct pci_dev;   * Set this to 1 if you want the kernel to re-assign all PCI   * bus numbers (don't do that on ppc64 yet !)   */ -#define pcibios_assign_all_busses() \ -	(pci_has_flag(PCI_REASSIGN_ALL_BUS)) - -static inline void pcibios_set_master(struct pci_dev *dev) -{ -	/* No special bus mastering setup handling */ -} - -static inline void pcibios_penalize_isa_irq(int irq, int active) -{ -	/* We don't do dynamic PCI IRQ allocation */ -} - -#ifdef CONFIG_PCI -extern void set_pci_dma_ops(struct dma_map_ops *dma_ops); -extern struct dma_map_ops *get_pci_dma_ops(void); -#else	/* CONFIG_PCI */ -#define set_pci_dma_ops(d) -#define get_pci_dma_ops()	NULL -#endif +#define pcibios_assign_all_busses()	0  #ifdef CONFIG_PCI  static inline void pci_dma_burst_advice(struct pci_dev *pdev, @@ -100,14 +83,6 @@ extern int pci_mmap_legacy_page_range(struct pci_bus *bus,   */  #define PCI_DMA_BUS_IS_PHYS     (1) -extern void pcibios_resource_to_bus(struct pci_dev *dev, -			struct pci_bus_region *region, -			struct resource *res); - -extern void pcibios_bus_to_resource(struct pci_dev *dev, -			struct resource *res, -			struct pci_bus_region *region); -  static inline struct resource *pcibios_select_root(struct pci_dev *pdev,  			struct resource *res)  { @@ -139,8 +114,6 @@ extern void of_scan_pci_bridge(struct device_node *node,  extern void of_scan_bus(struct device_node *node, struct pci_bus *bus);  extern void of_rescan_bus(struct device_node *node, struct pci_bus *bus); -extern int pci_read_irq_line(struct pci_dev *dev); -  extern int pci_bus_find_capability(struct pci_bus *bus,  						unsigned int devfn, int cap); @@ -158,14 +131,12 @@ extern void pci_resource_to_user(const struct pci_dev *dev, int bar,  extern void pcibios_setup_bus_devices(struct pci_bus *bus);  extern void pcibios_setup_bus_self(struct pci_bus *bus); -/* This part of code was originaly in xilinx-pci.h */ +/* This part of code was originally in xilinx-pci.h */  #ifdef CONFIG_PCI_XILINX  extern void __init xilinx_pci_init(void);  #else  static inline void __init xilinx_pci_init(void) { return; }  #endif -#include <asm-generic/pci-dma-compat.h> -  #endif	/* __KERNEL__ */  #endif /* __ASM_MICROBLAZE_PCI_H */ diff --git a/arch/microblaze/include/asm/pgalloc.h b/arch/microblaze/include/asm/pgalloc.h index ebd35792482..7fdf7fabc7d 100644 --- a/arch/microblaze/include/asm/pgalloc.h +++ b/arch/microblaze/include/asm/pgalloc.h @@ -122,8 +122,13 @@ static inline struct page *pte_alloc_one(struct mm_struct *mm,  #endif  	ptepage = alloc_pages(flags, 0); -	if (ptepage) -		clear_highpage(ptepage); +	if (!ptepage) +		return NULL; +	clear_highpage(ptepage); +	if (!pgtable_page_ctor(ptepage)) { +		__free_page(ptepage); +		return NULL; +	}  	return ptepage;  } @@ -158,8 +163,9 @@ extern inline void pte_free_slow(struct page *ptepage)  	__free_page(ptepage);  } -extern inline void pte_free(struct mm_struct *mm, struct page *ptepage) +static inline void pte_free(struct mm_struct *mm, struct page *ptepage)  { +	pgtable_page_dtor(ptepage);  	__free_page(ptepage);  } diff --git a/arch/microblaze/include/asm/pgtable.h b/arch/microblaze/include/asm/pgtable.h index cae268c22ba..95cef0b5f83 100644 --- a/arch/microblaze/include/asm/pgtable.h +++ b/arch/microblaze/include/asm/pgtable.h @@ -13,9 +13,6 @@  #include <asm/setup.h> -#define io_remap_pfn_range(vma, vaddr, pfn, size, prot)		\ -		remap_pfn_range(vma, vaddr, pfn, size, prot) -  #ifndef __ASSEMBLY__  extern int mem_init_done;  #endif @@ -94,8 +91,7 @@ static inline pte_t pte_mkspecial(pte_t pte)	{ return pte; }  /* Start and end of the vmalloc area. */  /* Make sure to map the vmalloc area above the pinned kernel memory area     of 32Mb.  */ -#define VMALLOC_START	(CONFIG_KERNEL_START + \ -				max(32 * 1024 * 1024UL, memory_size)) +#define VMALLOC_START	(CONFIG_KERNEL_START + CONFIG_LOWMEM_SIZE)  #define VMALLOC_END	ioremap_bot  #endif /* __ASSEMBLY__ */ @@ -235,12 +231,6 @@ static inline pte_t pte_mkspecial(pte_t pte)	{ return pte; }  #ifndef _PAGE_SHARED  #define _PAGE_SHARED	0  #endif -#ifndef _PAGE_HWWRITE -#define _PAGE_HWWRITE	0 -#endif -#ifndef _PAGE_HWEXEC -#define _PAGE_HWEXEC	0 -#endif  #ifndef _PAGE_EXEC  #define _PAGE_EXEC	0  #endif @@ -411,20 +401,19 @@ static inline pte_t pte_modify(pte_t pte, pgprot_t newprot)  static inline unsigned long pte_update(pte_t *p, unsigned long clr,  				unsigned long set)  { -	unsigned long old, tmp, msr; - -	__asm__ __volatile__("\ -	msrclr	%2, 0x2\n\ -	nop\n\ -	lw	%0, %4, r0\n\ -	andn	%1, %0, %5\n\ -	or	%1, %1, %6\n\ -	sw	%1, %4, r0\n\ -	mts     rmsr, %2\n\ -	nop" -	: "=&r" (old), "=&r" (tmp), "=&r" (msr), "=m" (*p) -	: "r" ((unsigned long)(p + 1) - 4), "r" (clr), "r" (set), "m" (*p) -	: "cc"); +	unsigned long flags, old, tmp; + +	raw_local_irq_save(flags); + +	__asm__ __volatile__(	"lw	%0, %2, r0	\n" +				"andn	%1, %0, %3	\n" +				"or	%1, %1, %4	\n" +				"sw	%1, %2, r0	\n" +			: "=&r" (old), "=&r" (tmp) +			: "r" ((unsigned long)(p + 1) - 4), "r" (clr), "r" (set) +			: "cc"); + +	raw_local_irq_restore(flags);  	return old;  } @@ -444,8 +433,9 @@ static inline void set_pte_at(struct mm_struct *mm, unsigned long addr,  	*ptep = pte;  } -static inline int ptep_test_and_clear_young(struct mm_struct *mm, -		unsigned long addr, pte_t *ptep) +#define __HAVE_ARCH_PTEP_TEST_AND_CLEAR_YOUNG +static inline int ptep_test_and_clear_young(struct vm_area_struct *vma, +		unsigned long address, pte_t *ptep)  {  	return (pte_update(ptep, _PAGE_ACCESSED, 0) & _PAGE_ACCESSED) != 0;  } @@ -457,6 +447,7 @@ static inline int ptep_test_and_clear_dirty(struct mm_struct *mm,  		(_PAGE_DIRTY | _PAGE_HWWRITE), 0) & _PAGE_DIRTY) != 0;  } +#define __HAVE_ARCH_PTEP_GET_AND_CLEAR  static inline pte_t ptep_get_and_clear(struct mm_struct *mm,  		unsigned long addr, pte_t *ptep)  { @@ -542,8 +533,6 @@ extern unsigned long iopa(unsigned long addr);  /* Needs to be defined here and not in linux/mm.h, as it is arch dependent */  #define kern_addr_valid(addr)	(1) -#define io_remap_page_range remap_page_range -  /*   * No page table caches to initialise   */ @@ -571,7 +560,7 @@ void __init *early_get_page(void);  extern unsigned long ioremap_bot, ioremap_base; -void *consistent_alloc(int gfp, size_t size, dma_addr_t *dma_handle); +void *consistent_alloc(gfp_t gfp, size_t size, dma_addr_t *dma_handle);  void consistent_free(size_t size, void *vaddr);  void consistent_sync(void *vaddr, size_t size, int direction);  void consistent_sync_page(struct page *page, unsigned long offset, diff --git a/arch/microblaze/include/asm/processor.h b/arch/microblaze/include/asm/processor.h index 8eeb09211ec..9d31b057c35 100644 --- a/arch/microblaze/include/asm/processor.h +++ b/arch/microblaze/include/asm/processor.h @@ -22,8 +22,6 @@  extern const struct seq_operations cpuinfo_op;  # define cpu_relax()		barrier() -# define cpu_sleep()		do {} while (0) -# define prepare_to_copy(tsk)	do {} while (0)  #define task_pt_regs(tsk) \  		(((struct pt_regs *)(THREAD_SIZE + task_stack_page(tsk))) - 1) @@ -31,6 +29,9 @@ extern const struct seq_operations cpuinfo_op;  /* Do necessary setup to start up a newly executed thread. */  void start_thread(struct pt_regs *regs, unsigned long pc, unsigned long usp); +extern void ret_from_fork(void); +extern void ret_from_kernel_thread(void); +  # endif /* __ASSEMBLY__ */  # ifndef CONFIG_MMU @@ -77,11 +78,6 @@ extern unsigned long thread_saved_pc(struct task_struct *t);  extern unsigned long get_wchan(struct task_struct *p); -/* - * create a kernel thread without removing it from tasklists - */ -extern int kernel_thread(int (*fn)(void *), void *arg, unsigned long flags); -  # define KSTK_EIP(tsk)	(0)  # define KSTK_ESP(tsk)	(0) @@ -125,17 +121,11 @@ struct thread_struct {  	.pgdir = swapper_pg_dir, \  } -/* Do necessary setup to start up a newly executed thread.  */ -void start_thread(struct pt_regs *regs, -		unsigned long pc, unsigned long usp); -  /* Free all resources held by a thread. */ -extern inline void release_thread(struct task_struct *dead_task) +static inline void release_thread(struct task_struct *dead_task)  {  } -extern int kernel_thread(int (*fn)(void *), void *arg, unsigned long flags); -  /* Free current thread data structures etc.  */  static inline void exit_thread(void)  { @@ -155,7 +145,7 @@ unsigned long get_wchan(struct task_struct *p);  #  define task_regs(task) ((struct pt_regs *)task_tos(task) - 1)  #  define task_pt_regs_plus_args(tsk) \ -	(((void *)task_pt_regs(tsk)) - STATE_SAVE_ARG_SPACE) +	((void *)task_pt_regs(tsk))  #  define task_sp(task)	(task_regs(task)->r1)  #  define task_pc(task)	(task_regs(task)->pc) @@ -169,6 +159,10 @@ unsigned long get_wchan(struct task_struct *p);  #  define STACK_TOP	TASK_SIZE  #  define STACK_TOP_MAX	STACK_TOP +#ifdef CONFIG_DEBUG_FS +extern struct dentry *of_debugfs_root; +#endif +  #  endif /* __ASSEMBLY__ */  # endif /* CONFIG_MMU */  #endif /* _ASM_MICROBLAZE_PROCESSOR_H */ diff --git a/arch/microblaze/include/asm/prom.h b/arch/microblaze/include/asm/prom.h index bdc38312ae4..2f03ac81585 100644 --- a/arch/microblaze/include/asm/prom.h +++ b/arch/microblaze/include/asm/prom.h @@ -11,86 +11,17 @@   * as published by the Free Software Foundation; either version   * 2 of the License, or (at your option) any later version.   */ - -#include <linux/of.h>	/* linux/of.h gets to determine #include ordering */ -  #ifndef _ASM_MICROBLAZE_PROM_H  #define _ASM_MICROBLAZE_PROM_H -#ifdef __KERNEL__ -#ifndef __ASSEMBLY__ - -#include <linux/types.h> -#include <asm/irq.h> -#include <asm/atomic.h> -#define HAVE_ARCH_DEVTREE_FIXUPS +#include <linux/of.h>  /* Other Prototypes */ -extern int early_uartlite_console(void); -extern int early_uart16550_console(void); - -#ifdef CONFIG_PCI -/* - * PCI <-> OF matching functions - * (XXX should these be here?) - */ -struct pci_bus; -struct pci_dev; -extern int pci_device_from_OF_node(struct device_node *node, -					u8 *bus, u8 *devfn); -extern struct device_node *pci_busdev_to_OF_node(struct pci_bus *bus, -							int devfn); -extern struct device_node *pci_device_to_OF_node(struct pci_dev *dev); -extern void pci_create_OF_bus_map(void); -#endif - -/* - * OF address retreival & translation - */ - -#ifdef CONFIG_PCI -extern unsigned long pci_address_to_pio(phys_addr_t address); -#define pci_address_to_pio pci_address_to_pio -#endif	/* CONFIG_PCI */ - -/* Parse the ibm,dma-window property of an OF node into the busno, phys and - * size parameters. - */ -void of_parse_dma_window(struct device_node *dn, const void *dma_window_prop, -		unsigned long *busno, unsigned long *phys, unsigned long *size); - -extern void kdump_move_device_tree(void); - -/* CPU OF node matching */ -struct device_node *of_get_cpu_node(int cpu, unsigned int *thread); - -/* Get the MAC address */ -extern const void *of_get_mac_address(struct device_node *np); - -/** - * of_irq_map_pci - Resolve the interrupt for a PCI device - * @pdev:	the device whose interrupt is to be resolved - * @out_irq:	structure of_irq filled by this function - * - * This function resolves the PCI interrupt for a given PCI device. If a - * device-node exists for a given pci_dev, it will use normal OF tree - * walking. If not, it will implement standard swizzling and walk up the - * PCI tree until an device-node is found, at which point it will finish - * resolving using the OF tree walking. - */ -struct pci_dev; -struct of_irq; -extern int of_irq_map_pci(struct pci_dev *pdev, struct of_irq *out_irq); - -#endif /* __ASSEMBLY__ */ -#endif /* __KERNEL__ */ +enum early_consoles { +	UARTLITE = 1, +	UART16550 = 2, +}; -/* These includes are put at the bottom because they may contain things - * that are overridden by this file.  Ideally they shouldn't be included - * by this file, but there are a bunch of .c files that currently depend - * on it.  Eventually they will be cleaned up. */ -#include <linux/of_fdt.h> -#include <linux/of_irq.h> -#include <linux/platform_device.h> +extern int of_early_console(void *version);  #endif /* _ASM_MICROBLAZE_PROM_H */ diff --git a/arch/microblaze/include/asm/ptrace.h b/arch/microblaze/include/asm/ptrace.h index d74dbfb92c0..5b18ec124e5 100644 --- a/arch/microblaze/include/asm/ptrace.h +++ b/arch/microblaze/include/asm/ptrace.h @@ -5,77 +5,23 @@   * License. See the file "COPYING" in the main directory of this archive   * for more details.   */ -  #ifndef _ASM_MICROBLAZE_PTRACE_H  #define _ASM_MICROBLAZE_PTRACE_H -#ifndef __ASSEMBLY__ - -typedef unsigned long microblaze_reg_t; +#include <uapi/asm/ptrace.h> -struct pt_regs { -	microblaze_reg_t r0; -	microblaze_reg_t r1; -	microblaze_reg_t r2; -	microblaze_reg_t r3; -	microblaze_reg_t r4; -	microblaze_reg_t r5; -	microblaze_reg_t r6; -	microblaze_reg_t r7; -	microblaze_reg_t r8; -	microblaze_reg_t r9; -	microblaze_reg_t r10; -	microblaze_reg_t r11; -	microblaze_reg_t r12; -	microblaze_reg_t r13; -	microblaze_reg_t r14; -	microblaze_reg_t r15; -	microblaze_reg_t r16; -	microblaze_reg_t r17; -	microblaze_reg_t r18; -	microblaze_reg_t r19; -	microblaze_reg_t r20; -	microblaze_reg_t r21; -	microblaze_reg_t r22; -	microblaze_reg_t r23; -	microblaze_reg_t r24; -	microblaze_reg_t r25; -	microblaze_reg_t r26; -	microblaze_reg_t r27; -	microblaze_reg_t r28; -	microblaze_reg_t r29; -	microblaze_reg_t r30; -	microblaze_reg_t r31; -	microblaze_reg_t pc; -	microblaze_reg_t msr; -	microblaze_reg_t ear; -	microblaze_reg_t esr; -	microblaze_reg_t fsr; -	int pt_mode; -}; - -#ifdef __KERNEL__ +#ifndef __ASSEMBLY__  #define kernel_mode(regs)		((regs)->pt_mode)  #define user_mode(regs)			(!kernel_mode(regs))  #define instruction_pointer(regs)	((regs)->pc)  #define profile_pc(regs)		instruction_pointer(regs) +#define user_stack_pointer(regs)	((regs)->r1) -void show_regs(struct pt_regs *); - -#else /* __KERNEL__ */ - -/* pt_regs offsets used by gdbserver etc in ptrace syscalls */ -#define PT_GPR(n)       ((n) * sizeof(microblaze_reg_t)) -#define PT_PC           (32 * sizeof(microblaze_reg_t)) -#define PT_MSR          (33 * sizeof(microblaze_reg_t)) -#define PT_EAR          (34 * sizeof(microblaze_reg_t)) -#define PT_ESR          (35 * sizeof(microblaze_reg_t)) -#define PT_FSR          (36 * sizeof(microblaze_reg_t)) -#define PT_KERNEL_MODE  (37 * sizeof(microblaze_reg_t)) - -#endif /* __KERNEL */ +static inline long regs_return_value(struct pt_regs *regs) +{ +	return regs->r3; +}  #endif /* __ASSEMBLY__ */ -  #endif /* _ASM_MICROBLAZE_PTRACE_H */ diff --git a/arch/microblaze/include/asm/pvr.h b/arch/microblaze/include/asm/pvr.h index 37db96a15b4..4bbdb4c03b5 100644 --- a/arch/microblaze/include/asm/pvr.h +++ b/arch/microblaze/include/asm/pvr.h @@ -1,9 +1,9 @@  /*   * Support for the MicroBlaze PVR (Processor Version Register)   * - * Copyright (C) 2009 Michal Simek <monstr@monstr.eu> + * Copyright (C) 2009 - 2011 Michal Simek <monstr@monstr.eu>   * Copyright (C) 2007 John Williams <john.williams@petalogix.com> - * Copyright (C) 2007 - 2009 PetaLogix + * Copyright (C) 2007 - 2011 PetaLogix   *   * This file is subject to the terms and conditions of the GNU General   * Public License. See the file COPYING in the main directory of this @@ -46,11 +46,11 @@ struct pvr_s {  #define PVR2_I_LMB_MASK			0x10000000  #define PVR2_INTERRUPT_IS_EDGE_MASK	0x08000000  #define PVR2_EDGE_IS_POSITIVE_MASK	0x04000000 -#define PVR2_D_PLB_MASK			0x02000000	/* new */ -#define PVR2_I_PLB_MASK			0x01000000	/* new */ -#define PVR2_INTERCONNECT		0x00800000	/* new */ -#define PVR2_USE_EXTEND_FSL		0x00080000	/* new */ -#define PVR2_USE_FSL_EXC		0x00040000	/* new */ +#define PVR2_D_PLB_MASK			0x02000000 /* new */ +#define PVR2_I_PLB_MASK			0x01000000 /* new */ +#define PVR2_INTERCONNECT		0x00800000 /* new */ +#define PVR2_USE_EXTEND_FSL		0x00080000 /* new */ +#define PVR2_USE_FSL_EXC		0x00040000 /* new */  #define PVR2_USE_MSR_INSTR		0x00020000  #define PVR2_USE_PCMP_INSTR		0x00010000  #define PVR2_AREA_OPTIMISED		0x00008000 @@ -59,7 +59,7 @@ struct pvr_s {  #define PVR2_USE_HW_MUL_MASK		0x00001000  #define PVR2_USE_FPU_MASK		0x00000800  #define PVR2_USE_MUL64_MASK		0x00000400 -#define PVR2_USE_FPU2_MASK		0x00000200	/* new */ +#define PVR2_USE_FPU2_MASK		0x00000200 /* new */  #define PVR2_USE_IPLBEXC 		0x00000100  #define PVR2_USE_DPLBEXC		0x00000080  #define PVR2_OPCODE_0x0_ILL_MASK	0x00000040 @@ -111,107 +111,115 @@ struct pvr_s {  /* Target family PVR mask */  #define PVR10_TARGET_FAMILY_MASK	0xFF000000 -/* MMU descrtiption */ +/* MMU description */  #define PVR11_USE_MMU			0xC0000000  #define PVR11_MMU_ITLB_SIZE		0x38000000  #define PVR11_MMU_DTLB_SIZE		0x07000000  #define PVR11_MMU_TLB_ACCESS		0x00C00000  #define PVR11_MMU_ZONES			0x003C0000 +#define PVR11_MMU_PRIVINS		0x00010000  /* MSR Reset value PVR mask */  #define PVR11_MSR_RESET_VALUE_MASK	0x000007FF -  /* PVR access macros */ -#define PVR_IS_FULL(pvr)		(pvr.pvr[0] & PVR0_PVR_FULL_MASK) -#define PVR_USE_BARREL(pvr)		(pvr.pvr[0] & PVR0_USE_BARREL_MASK) -#define PVR_USE_DIV(pvr)		(pvr.pvr[0] & PVR0_USE_DIV_MASK) -#define PVR_USE_HW_MUL(pvr)		(pvr.pvr[0] & PVR0_USE_HW_MUL_MASK) -#define PVR_USE_FPU(pvr)		(pvr.pvr[0] & PVR0_USE_FPU_MASK) -#define PVR_USE_FPU2(pvr)		(pvr.pvr[2] & PVR2_USE_FPU2_MASK) -#define PVR_USE_ICACHE(pvr)		(pvr.pvr[0] & PVR0_USE_ICACHE_MASK) -#define PVR_USE_DCACHE(pvr)		(pvr.pvr[0] & PVR0_USE_DCACHE_MASK) -#define PVR_VERSION(pvr)	((pvr.pvr[0] & PVR0_VERSION_MASK) >> 8) -#define PVR_USER1(pvr)			(pvr.pvr[0] & PVR0_USER1_MASK) -#define PVR_USER2(pvr)			(pvr.pvr[1] & PVR1_USER2_MASK) - -#define PVR_D_OPB(pvr)			(pvr.pvr[2] & PVR2_D_OPB_MASK) -#define PVR_D_LMB(pvr)			(pvr.pvr[2] & PVR2_D_LMB_MASK) -#define PVR_I_OPB(pvr)			(pvr.pvr[2] & PVR2_I_OPB_MASK) -#define PVR_I_LMB(pvr)			(pvr.pvr[2] & PVR2_I_LMB_MASK) -#define PVR_INTERRUPT_IS_EDGE(pvr) \ -			(pvr.pvr[2] & PVR2_INTERRUPT_IS_EDGE_MASK) -#define PVR_EDGE_IS_POSITIVE(pvr) \ -			(pvr.pvr[2] & PVR2_EDGE_IS_POSITIVE_MASK) -#define PVR_USE_MSR_INSTR(pvr)		(pvr.pvr[2] & PVR2_USE_MSR_INSTR) -#define PVR_USE_PCMP_INSTR(pvr)		(pvr.pvr[2] & PVR2_USE_PCMP_INSTR) -#define PVR_AREA_OPTIMISED(pvr)		(pvr.pvr[2] & PVR2_AREA_OPTIMISED) -#define PVR_USE_MUL64(pvr)		(pvr.pvr[2] & PVR2_USE_MUL64_MASK) -#define PVR_OPCODE_0x0_ILLEGAL(pvr) \ -			(pvr.pvr[2] & PVR2_OPCODE_0x0_ILL_MASK) -#define PVR_UNALIGNED_EXCEPTION(pvr) \ -			(pvr.pvr[2] & PVR2_UNALIGNED_EXC_MASK) -#define PVR_ILL_OPCODE_EXCEPTION(pvr) \ -			(pvr.pvr[2] & PVR2_ILL_OPCODE_EXC_MASK) -#define PVR_IOPB_BUS_EXCEPTION(pvr) \ -			(pvr.pvr[2] & PVR2_IOPB_BUS_EXC_MASK) -#define PVR_DOPB_BUS_EXCEPTION(pvr) \ -			(pvr.pvr[2] & PVR2_DOPB_BUS_EXC_MASK) -#define PVR_DIV_ZERO_EXCEPTION(pvr) \ -			(pvr.pvr[2] & PVR2_DIV_ZERO_EXC_MASK) -#define PVR_FPU_EXCEPTION(pvr)		(pvr.pvr[2] & PVR2_FPU_EXC_MASK) -#define PVR_FSL_EXCEPTION(pvr)		(pvr.pvr[2] & PVR2_USE_EXTEND_FSL) - -#define PVR_DEBUG_ENABLED(pvr)		(pvr.pvr[3] & PVR3_DEBUG_ENABLED_MASK) -#define PVR_NUMBER_OF_PC_BRK(pvr) \ -			((pvr.pvr[3] & PVR3_NUMBER_OF_PC_BRK_MASK) >> 25) -#define PVR_NUMBER_OF_RD_ADDR_BRK(pvr) \ -			((pvr.pvr[3] & PVR3_NUMBER_OF_RD_ADDR_BRK_MASK) >> 19) -#define PVR_NUMBER_OF_WR_ADDR_BRK(pvr) \ -			((pvr.pvr[3] & PVR3_NUMBER_OF_WR_ADDR_BRK_MASK) >> 13) -#define PVR_FSL_LINKS(pvr)	((pvr.pvr[3] & PVR3_FSL_LINKS_MASK) >> 7) - -#define PVR_ICACHE_ADDR_TAG_BITS(pvr) \ -			((pvr.pvr[4] & PVR4_ICACHE_ADDR_TAG_BITS_MASK) >> 26) -#define PVR_ICACHE_USE_FSL(pvr)		(pvr.pvr[4] & PVR4_ICACHE_USE_FSL_MASK) -#define PVR_ICACHE_ALLOW_WR(pvr)	(pvr.pvr[4] & PVR4_ICACHE_ALLOW_WR_MASK) -#define PVR_ICACHE_LINE_LEN(pvr) \ -			(1 << ((pvr.pvr[4] & PVR4_ICACHE_LINE_LEN_MASK) >> 21)) -#define PVR_ICACHE_BYTE_SIZE(pvr) \ -			(1 << ((pvr.pvr[4] & PVR4_ICACHE_BYTE_SIZE_MASK) >> 16)) - -#define PVR_DCACHE_ADDR_TAG_BITS(pvr) \ -			((pvr.pvr[5] & PVR5_DCACHE_ADDR_TAG_BITS_MASK) >> 26) -#define PVR_DCACHE_USE_FSL(pvr)		(pvr.pvr[5] & PVR5_DCACHE_USE_FSL_MASK) -#define PVR_DCACHE_ALLOW_WR(pvr)	(pvr.pvr[5] & PVR5_DCACHE_ALLOW_WR_MASK) +#define PVR_IS_FULL(_pvr)	(_pvr.pvr[0] & PVR0_PVR_FULL_MASK) +#define PVR_USE_BARREL(_pvr)	(_pvr.pvr[0] & PVR0_USE_BARREL_MASK) +#define PVR_USE_DIV(_pvr)	(_pvr.pvr[0] & PVR0_USE_DIV_MASK) +#define PVR_USE_HW_MUL(_pvr)	(_pvr.pvr[0] & PVR0_USE_HW_MUL_MASK) +#define PVR_USE_FPU(_pvr)	(_pvr.pvr[0] & PVR0_USE_FPU_MASK) +#define PVR_USE_FPU2(_pvr)	(_pvr.pvr[2] & PVR2_USE_FPU2_MASK) +#define PVR_USE_ICACHE(_pvr)	(_pvr.pvr[0] & PVR0_USE_ICACHE_MASK) +#define PVR_USE_DCACHE(_pvr)	(_pvr.pvr[0] & PVR0_USE_DCACHE_MASK) +#define PVR_VERSION(_pvr)	((_pvr.pvr[0] & PVR0_VERSION_MASK) >> 8) +#define PVR_USER1(_pvr)		(_pvr.pvr[0] & PVR0_USER1_MASK) +#define PVR_USER2(_pvr)		(_pvr.pvr[1] & PVR1_USER2_MASK) + +#define PVR_D_OPB(_pvr)		(_pvr.pvr[2] & PVR2_D_OPB_MASK) +#define PVR_D_LMB(_pvr)		(_pvr.pvr[2] & PVR2_D_LMB_MASK) +#define PVR_I_OPB(_pvr)		(_pvr.pvr[2] & PVR2_I_OPB_MASK) +#define PVR_I_LMB(_pvr)		(_pvr.pvr[2] & PVR2_I_LMB_MASK) +#define PVR_INTERRUPT_IS_EDGE(_pvr) \ +			(_pvr.pvr[2] & PVR2_INTERRUPT_IS_EDGE_MASK) +#define PVR_EDGE_IS_POSITIVE(_pvr) \ +			(_pvr.pvr[2] & PVR2_EDGE_IS_POSITIVE_MASK) +#define PVR_USE_MSR_INSTR(_pvr)		(_pvr.pvr[2] & PVR2_USE_MSR_INSTR) +#define PVR_USE_PCMP_INSTR(_pvr)	(_pvr.pvr[2] & PVR2_USE_PCMP_INSTR) +#define PVR_AREA_OPTIMISED(_pvr)	(_pvr.pvr[2] & PVR2_AREA_OPTIMISED) +#define PVR_USE_MUL64(_pvr)		(_pvr.pvr[2] & PVR2_USE_MUL64_MASK) +#define PVR_OPCODE_0x0_ILLEGAL(_pvr) \ +			(_pvr.pvr[2] & PVR2_OPCODE_0x0_ILL_MASK) +#define PVR_UNALIGNED_EXCEPTION(_pvr) \ +			(_pvr.pvr[2] & PVR2_UNALIGNED_EXC_MASK) +#define PVR_ILL_OPCODE_EXCEPTION(_pvr) \ +			(_pvr.pvr[2] & PVR2_ILL_OPCODE_EXC_MASK) +#define PVR_IOPB_BUS_EXCEPTION(_pvr) \ +			(_pvr.pvr[2] & PVR2_IOPB_BUS_EXC_MASK) +#define PVR_DOPB_BUS_EXCEPTION(_pvr) \ +			(_pvr.pvr[2] & PVR2_DOPB_BUS_EXC_MASK) +#define PVR_DIV_ZERO_EXCEPTION(_pvr) \ +			(_pvr.pvr[2] & PVR2_DIV_ZERO_EXC_MASK) +#define PVR_FPU_EXCEPTION(_pvr)		(_pvr.pvr[2] & PVR2_FPU_EXC_MASK) +#define PVR_FSL_EXCEPTION(_pvr)		(_pvr.pvr[2] & PVR2_USE_EXTEND_FSL) + +#define PVR_DEBUG_ENABLED(_pvr)		(_pvr.pvr[3] & PVR3_DEBUG_ENABLED_MASK) +#define PVR_NUMBER_OF_PC_BRK(_pvr) \ +			((_pvr.pvr[3] & PVR3_NUMBER_OF_PC_BRK_MASK) >> 25) +#define PVR_NUMBER_OF_RD_ADDR_BRK(_pvr) \ +			((_pvr.pvr[3] & PVR3_NUMBER_OF_RD_ADDR_BRK_MASK) >> 19) +#define PVR_NUMBER_OF_WR_ADDR_BRK(_pvr) \ +			((_pvr.pvr[3] & PVR3_NUMBER_OF_WR_ADDR_BRK_MASK) >> 13) +#define PVR_FSL_LINKS(_pvr)	((_pvr.pvr[3] & PVR3_FSL_LINKS_MASK) >> 7) + +#define PVR_ICACHE_ADDR_TAG_BITS(_pvr) \ +		((_pvr.pvr[4] & PVR4_ICACHE_ADDR_TAG_BITS_MASK) >> 26) +#define PVR_ICACHE_USE_FSL(_pvr) \ +		(_pvr.pvr[4] & PVR4_ICACHE_USE_FSL_MASK) +#define PVR_ICACHE_ALLOW_WR(_pvr) \ +		(_pvr.pvr[4] & PVR4_ICACHE_ALLOW_WR_MASK) +#define PVR_ICACHE_LINE_LEN(_pvr) \ +		(1 << ((_pvr.pvr[4] & PVR4_ICACHE_LINE_LEN_MASK) >> 21)) +#define PVR_ICACHE_BYTE_SIZE(_pvr) \ +		(1 << ((_pvr.pvr[4] & PVR4_ICACHE_BYTE_SIZE_MASK) >> 16)) + +#define PVR_DCACHE_ADDR_TAG_BITS(_pvr) \ +			((_pvr.pvr[5] & PVR5_DCACHE_ADDR_TAG_BITS_MASK) >> 26) +#define PVR_DCACHE_USE_FSL(_pvr)	(_pvr.pvr[5] & PVR5_DCACHE_USE_FSL_MASK) +#define PVR_DCACHE_ALLOW_WR(_pvr) \ +			(_pvr.pvr[5] & PVR5_DCACHE_ALLOW_WR_MASK)  /* FIXME two shifts on one line needs any comment */ -#define PVR_DCACHE_LINE_LEN(pvr) \ -			(1 << ((pvr.pvr[5] & PVR5_DCACHE_LINE_LEN_MASK) >> 21)) -#define PVR_DCACHE_BYTE_SIZE(pvr) \ -			(1 << ((pvr.pvr[5] & PVR5_DCACHE_BYTE_SIZE_MASK) >> 16)) - -#define PVR_DCACHE_USE_WRITEBACK(pvr) \ -			((pvr.pvr[5] & PVR5_DCACHE_USE_WRITEBACK) >> 14) +#define PVR_DCACHE_LINE_LEN(_pvr) \ +		(1 << ((_pvr.pvr[5] & PVR5_DCACHE_LINE_LEN_MASK) >> 21)) +#define PVR_DCACHE_BYTE_SIZE(_pvr) \ +		(1 << ((_pvr.pvr[5] & PVR5_DCACHE_BYTE_SIZE_MASK) >> 16)) -#define PVR_ICACHE_BASEADDR(pvr)	(pvr.pvr[6] & PVR6_ICACHE_BASEADDR_MASK) -#define PVR_ICACHE_HIGHADDR(pvr)	(pvr.pvr[7] & PVR7_ICACHE_HIGHADDR_MASK) +#define PVR_DCACHE_USE_WRITEBACK(_pvr) \ +			((_pvr.pvr[5] & PVR5_DCACHE_USE_WRITEBACK) >> 14) -#define PVR_DCACHE_BASEADDR(pvr)	(pvr.pvr[8] & PVR8_DCACHE_BASEADDR_MASK) -#define PVR_DCACHE_HIGHADDR(pvr)	(pvr.pvr[9] & PVR9_DCACHE_HIGHADDR_MASK) +#define PVR_ICACHE_BASEADDR(_pvr) \ +			(_pvr.pvr[6] & PVR6_ICACHE_BASEADDR_MASK) +#define PVR_ICACHE_HIGHADDR(_pvr) \ +			(_pvr.pvr[7] & PVR7_ICACHE_HIGHADDR_MASK) +#define PVR_DCACHE_BASEADDR(_pvr) \ +			(_pvr.pvr[8] & PVR8_DCACHE_BASEADDR_MASK) +#define PVR_DCACHE_HIGHADDR(_pvr) \ +			(_pvr.pvr[9] & PVR9_DCACHE_HIGHADDR_MASK) -#define PVR_TARGET_FAMILY(pvr)	((pvr.pvr[10] & PVR10_TARGET_FAMILY_MASK) >> 24) +#define PVR_TARGET_FAMILY(_pvr) \ +			((_pvr.pvr[10] & PVR10_TARGET_FAMILY_MASK) >> 24) -#define PVR_MSR_RESET_VALUE(pvr) \ -				(pvr.pvr[11] & PVR11_MSR_RESET_VALUE_MASK) +#define PVR_MSR_RESET_VALUE(_pvr) \ +			(_pvr.pvr[11] & PVR11_MSR_RESET_VALUE_MASK)  /* mmu */ -#define PVR_USE_MMU(pvr)	((pvr.pvr[11] & PVR11_USE_MMU) >> 30) -#define PVR_MMU_ITLB_SIZE(pvr)	(pvr.pvr[11] & PVR11_MMU_ITLB_SIZE) -#define PVR_MMU_DTLB_SIZE(pvr)	(pvr.pvr[11] & PVR11_MMU_DTLB_SIZE) -#define PVR_MMU_TLB_ACCESS(pvr)	(pvr.pvr[11] & PVR11_MMU_TLB_ACCESS) -#define PVR_MMU_ZONES(pvr)	(pvr.pvr[11] & PVR11_MMU_ZONES) +#define PVR_USE_MMU(_pvr)		((_pvr.pvr[11] & PVR11_USE_MMU) >> 30) +#define PVR_MMU_ITLB_SIZE(_pvr)		(_pvr.pvr[11] & PVR11_MMU_ITLB_SIZE) +#define PVR_MMU_DTLB_SIZE(_pvr)		(_pvr.pvr[11] & PVR11_MMU_DTLB_SIZE) +#define PVR_MMU_TLB_ACCESS(_pvr)	(_pvr.pvr[11] & PVR11_MMU_TLB_ACCESS) +#define PVR_MMU_ZONES(_pvr)		(_pvr.pvr[11] & PVR11_MMU_ZONES) +#define PVR_MMU_PRIVINS(pvr)		(pvr.pvr[11] & PVR11_MMU_PRIVINS)  /* endian */ -#define PVR_ENDIAN(pvr)	(pvr.pvr[0] & PVR0_ENDI) +#define PVR_ENDIAN(_pvr)	(_pvr.pvr[0] & PVR0_ENDI)  int cpu_has_pvr(void);  void get_pvr(struct pvr_s *pvr); diff --git a/arch/microblaze/include/asm/sections.h b/arch/microblaze/include/asm/sections.h index 4487e150b45..1b281d3ea73 100644 --- a/arch/microblaze/include/asm/sections.h +++ b/arch/microblaze/include/asm/sections.h @@ -16,11 +16,6 @@  # ifndef __ASSEMBLY__  extern char _ssbss[], _esbss[];  extern unsigned long __ivt_start[], __ivt_end[]; -extern char _etext[], _stext[]; - -#  ifdef CONFIG_MTD_UCLINUX -extern char *_ebss; -#  endif  extern u32 _fdt_start[], _fdt_end[]; diff --git a/arch/microblaze/include/asm/selfmod.h b/arch/microblaze/include/asm/selfmod.h deleted file mode 100644 index c42aff2e6cd..00000000000 --- a/arch/microblaze/include/asm/selfmod.h +++ /dev/null @@ -1,24 +0,0 @@ -/* - * Copyright (C) 2007-2008 Michal Simek <monstr@monstr.eu> - * - * This file is subject to the terms and conditions of the GNU General Public - * License. See the file "COPYING" in the main directory of this archive - * for more details. - */ - -#ifndef _ASM_MICROBLAZE_SELFMOD_H -#define _ASM_MICROBLAZE_SELFMOD_H - -/* - * BARRIER_BASE_ADDR is constant address for selfmod function. - * do not change this value - selfmod function is in - * arch/microblaze/kernel/selfmod.c: selfmod_function() - * - * last 16 bits is used for storing register offset - */ - -#define BARRIER_BASE_ADDR	0x1234ff00 - -void selfmod_function(const int *arr_fce, const unsigned int base); - -#endif /* _ASM_MICROBLAZE_SELFMOD_H */ diff --git a/arch/microblaze/include/asm/setup.h b/arch/microblaze/include/asm/setup.h index 8f3968971e4..be84a4d3917 100644 --- a/arch/microblaze/include/asm/setup.h +++ b/arch/microblaze/include/asm/setup.h @@ -7,32 +7,24 @@   * License. See the file "COPYING" in the main directory of this archive   * for more details.   */ -  #ifndef _ASM_MICROBLAZE_SETUP_H  #define _ASM_MICROBLAZE_SETUP_H -#define COMMAND_LINE_SIZE	256 +#include <uapi/asm/setup.h>  # ifndef __ASSEMBLY__ - -#  ifdef __KERNEL__  extern unsigned int boot_cpuid; /* move to smp.h */  extern char cmd_line[COMMAND_LINE_SIZE]; -void early_printk(const char *fmt, ...); +extern char *klimit;  int setup_early_printk(char *opt); +void remap_early_printk(void);  void disable_early_printk(void); -#if defined(CONFIG_EARLY_PRINTK) -#define eprintk early_printk -#else -#define eprintk printk -#endif - -void heartbeat(void); -void setup_heartbeat(void); +void microblaze_heartbeat(void); +void microblaze_setup_heartbeat(void);  #   ifdef CONFIG_MMU  extern void mmu_reset(void); @@ -44,13 +36,16 @@ extern void of_platform_reset_gpio_probe(void);  void time_init(void);  void init_IRQ(void);  void machine_early_init(const char *cmdline, unsigned int ram, -			unsigned int fdt, unsigned int msr); +		unsigned int fdt, unsigned int msr, unsigned int tlb0, +		unsigned int tlb1);  void machine_restart(char *cmd);  void machine_shutdown(void);  void machine_halt(void);  void machine_power_off(void); -#  endif/* __KERNEL__ */ +extern void *alloc_maybe_bootmem(size_t size, gfp_t mask); +extern void *zalloc_maybe_bootmem(size_t size, gfp_t mask); +  # endif /* __ASSEMBLY__ */  #endif /* _ASM_MICROBLAZE_SETUP_H */ diff --git a/arch/microblaze/include/asm/switch_to.h b/arch/microblaze/include/asm/switch_to.h new file mode 100644 index 00000000000..f45baa2c5e0 --- /dev/null +++ b/arch/microblaze/include/asm/switch_to.h @@ -0,0 +1,24 @@ +/* + * Copyright (C) 2006 Atmark Techno, Inc. + * + * This file is subject to the terms and conditions of the GNU General Public + * License. See the file "COPYING" in the main directory of this archive + * for more details. + */ + +#ifndef _ASM_MICROBLAZE_SWITCH_TO_H +#define _ASM_MICROBLAZE_SWITCH_TO_H + +struct task_struct; +struct thread_info; + +extern struct task_struct *_switch_to(struct thread_info *prev, +					struct thread_info *next); + +#define switch_to(prev, next, last)					\ +	do {								\ +		(last) = _switch_to(task_thread_info(prev),		\ +					task_thread_info(next));	\ +	} while (0) + +#endif /* _ASM_MICROBLAZE_SWITCH_TO_H */ diff --git a/arch/microblaze/include/asm/syscall.h b/arch/microblaze/include/asm/syscall.h index 048dfcd8d89..9bc43178310 100644 --- a/arch/microblaze/include/asm/syscall.h +++ b/arch/microblaze/include/asm/syscall.h @@ -96,4 +96,7 @@ static inline void syscall_set_arguments(struct task_struct *task,  		microblaze_set_syscall_arg(regs, i++, *args++);  } +asmlinkage long do_syscall_trace_enter(struct pt_regs *regs); +asmlinkage void do_syscall_trace_leave(struct pt_regs *regs); +  #endif /* __ASM_MICROBLAZE_SYSCALL_H */ diff --git a/arch/microblaze/include/asm/syscalls.h b/arch/microblaze/include/asm/syscalls.h deleted file mode 100644 index 720761cc741..00000000000 --- a/arch/microblaze/include/asm/syscalls.h +++ /dev/null @@ -1,8 +0,0 @@ -#ifndef __ASM_MICROBLAZE_SYSCALLS_H - -asmlinkage long sys_clone(int flags, unsigned long stack, struct pt_regs *regs); -#define sys_clone sys_clone - -#include <asm-generic/syscalls.h> - -#endif /* __ASM_MICROBLAZE_SYSCALLS_H */ diff --git a/arch/microblaze/include/asm/system.h b/arch/microblaze/include/asm/system.h deleted file mode 100644 index e6a2284571d..00000000000 --- a/arch/microblaze/include/asm/system.h +++ /dev/null @@ -1,106 +0,0 @@ -/* - * Copyright (C) 2006 Atmark Techno, Inc. - * - * This file is subject to the terms and conditions of the GNU General Public - * License. See the file "COPYING" in the main directory of this archive - * for more details. - */ - -#ifndef _ASM_MICROBLAZE_SYSTEM_H -#define _ASM_MICROBLAZE_SYSTEM_H - -#include <asm/registers.h> -#include <asm/setup.h> -#include <asm/irqflags.h> -#include <asm/cache.h> - -#include <asm-generic/cmpxchg.h> -#include <asm-generic/cmpxchg-local.h> - -#define __ARCH_WANT_INTERRUPTS_ON_CTXSW - -struct task_struct; -struct thread_info; - -extern struct task_struct *_switch_to(struct thread_info *prev, -					struct thread_info *next); - -#define switch_to(prev, next, last)					\ -	do {								\ -		(last) = _switch_to(task_thread_info(prev),		\ -					task_thread_info(next));	\ -	} while (0) - -#define smp_read_barrier_depends()	do {} while (0) -#define read_barrier_depends()		do {} while (0) - -#define nop()			asm volatile ("nop") -#define mb()			barrier() -#define rmb()			mb() -#define wmb()			mb() -#define set_mb(var, value)	do { var = value; mb(); } while (0) -#define set_wmb(var, value)	do { var = value; wmb(); } while (0) - -#define smp_mb()		mb() -#define smp_rmb()		rmb() -#define smp_wmb()		wmb() - -void __bad_xchg(volatile void *ptr, int size); - -static inline unsigned long __xchg(unsigned long x, volatile void *ptr, -								int size) -{ -	unsigned long ret; -	unsigned long flags; - -	switch (size) { -	case 1: -		local_irq_save(flags); -		ret = *(volatile unsigned char *)ptr; -		*(volatile unsigned char *)ptr = x; -		local_irq_restore(flags); -		break; - -	case 4: -		local_irq_save(flags); -		ret = *(volatile unsigned long *)ptr; -		*(volatile unsigned long *)ptr = x; -		local_irq_restore(flags); -		break; -	default: -		__bad_xchg(ptr, size), ret = 0; -		break; -	} - -	return ret; -} - -void disable_hlt(void); -void enable_hlt(void); -void default_idle(void); - -#define xchg(ptr, x) \ -	((__typeof__(*(ptr))) __xchg((unsigned long)(x), (ptr), sizeof(*(ptr)))) - -void free_init_pages(char *what, unsigned long begin, unsigned long end); -void free_initmem(void); -extern char *klimit; -extern void ret_from_fork(void); - -extern void *alloc_maybe_bootmem(size_t size, gfp_t mask); -extern void *zalloc_maybe_bootmem(size_t size, gfp_t mask); - -#ifdef CONFIG_DEBUG_FS -extern struct dentry *of_debugfs_root; -#endif - -#define arch_align_stack(x) (x) - -/* - * MicroBlaze doesn't handle unaligned accesses in hardware. - * - * Based on this we force the IP header alignment in network drivers. - */ -#define NET_IP_ALIGN	2 - -#endif /* _ASM_MICROBLAZE_SYSTEM_H */ diff --git a/arch/microblaze/include/asm/thread_info.h b/arch/microblaze/include/asm/thread_info.h index b73da2ac21b..8c9d36591a0 100644 --- a/arch/microblaze/include/asm/thread_info.h +++ b/arch/microblaze/include/asm/thread_info.h @@ -106,8 +106,6 @@ static inline struct thread_info *current_thread_info(void)  /* thread information allocation */  #endif /* __ASSEMBLY__ */ -#define PREEMPT_ACTIVE		0x10000000 -  /*   * thread information flags   * - these are process state flags that various assembly files may @@ -121,11 +119,9 @@ static inline struct thread_info *current_thread_info(void)  #define TIF_NEED_RESCHED	3 /* rescheduling necessary */  /* restore singlestep on return to user mode */  #define TIF_SINGLESTEP		4 -#define TIF_IRET		5 /* return with iret */  #define TIF_MEMDIE		6	/* is terminating due to OOM killer */  #define TIF_SYSCALL_AUDIT	9       /* syscall auditing active */  #define TIF_SECCOMP		10      /* secure computing */ -#define TIF_FREEZE		14	/* Freezing for suspend */  /* true if poll_idle() is polling TIF_NEED_RESCHED */  #define TIF_POLLING_NRFLAG	16 @@ -135,9 +131,7 @@ static inline struct thread_info *current_thread_info(void)  #define _TIF_SIGPENDING		(1 << TIF_SIGPENDING)  #define _TIF_NEED_RESCHED	(1 << TIF_NEED_RESCHED)  #define _TIF_SINGLESTEP		(1 << TIF_SINGLESTEP) -#define _TIF_IRET		(1 << TIF_IRET)  #define _TIF_POLLING_NRFLAG	(1 << TIF_POLLING_NRFLAG) -#define _TIF_FREEZE		(1 << TIF_FREEZE)  #define _TIF_SYSCALL_AUDIT	(1 << TIF_SYSCALL_AUDIT)  #define _TIF_SECCOMP		(1 << TIF_SECCOMP) @@ -168,7 +162,23 @@ static inline void set_restore_sigmask(void)  {  	struct thread_info *ti = current_thread_info();  	ti->status |= TS_RESTORE_SIGMASK; -	set_bit(TIF_SIGPENDING, (unsigned long *)&ti->flags); +	WARN_ON(!test_bit(TIF_SIGPENDING, (unsigned long *)&ti->flags)); +} +static inline void clear_restore_sigmask(void) +{ +	current_thread_info()->status &= ~TS_RESTORE_SIGMASK; +} +static inline bool test_restore_sigmask(void) +{ +	return current_thread_info()->status & TS_RESTORE_SIGMASK; +} +static inline bool test_and_clear_restore_sigmask(void) +{ +	struct thread_info *ti = current_thread_info(); +	if (!(ti->status & TS_RESTORE_SIGMASK)) +		return false; +	ti->status &= ~TS_RESTORE_SIGMASK; +	return true;  }  #endif diff --git a/arch/microblaze/include/asm/tlb.h b/arch/microblaze/include/asm/tlb.h index e8abd4a0349..8aa97817cc8 100644 --- a/arch/microblaze/include/asm/tlb.h +++ b/arch/microblaze/include/asm/tlb.h @@ -13,6 +13,7 @@  #define tlb_flush(tlb)	flush_tlb_mm((tlb)->mm) +#include <linux/pagemap.h>  #include <asm-generic/tlb.h>  #ifdef CONFIG_MMU diff --git a/arch/microblaze/include/asm/types.h b/arch/microblaze/include/asm/types.h deleted file mode 100644 index b9e79bc580d..00000000000 --- a/arch/microblaze/include/asm/types.h +++ /dev/null @@ -1 +0,0 @@ -#include <asm-generic/types.h> diff --git a/arch/microblaze/include/asm/uaccess.h b/arch/microblaze/include/asm/uaccess.h index d840f4a2d3c..0aa005703a0 100644 --- a/arch/microblaze/include/asm/uaccess.h +++ b/arch/microblaze/include/asm/uaccess.h @@ -80,7 +80,7 @@ extern unsigned long search_exception_table(unsigned long);  static inline int ___range_ok(unsigned long addr, unsigned long size)  {  	return ((addr < memory_start) || -		((addr + size) > memory_end)); +		((addr + size - 1) > (memory_start + memory_size - 1)));  }  #define __range_ok(addr, size) \ @@ -90,17 +90,25 @@ static inline int ___range_ok(unsigned long addr, unsigned long size)  #else -/* - * Address is valid if: - *  - "addr", "addr + size" and "size" are all below the limit - */ -#define access_ok(type, addr, size) \ -	(get_fs().seg > (((unsigned long)(addr)) | \ -		(size) | ((unsigned long)(addr) + (size)))) - -/* || printk("access_ok failed for %s at 0x%08lx (size %d), seg 0x%08x\n", - type?"WRITE":"READ",addr,size,get_fs().seg)) */ - +static inline int access_ok(int type, const void __user *addr, +							unsigned long size) +{ +	if (!size) +		goto ok; + +	if ((get_fs().seg < ((unsigned long)addr)) || +			(get_fs().seg < ((unsigned long)addr + size - 1))) { +		pr_debug("ACCESS fail: %s at 0x%08x (size 0x%x), seg 0x%08x\n", +			type ? "WRITE" : "READ ", (__force u32)addr, (u32)size, +			(u32)get_fs().seg); +		return 0; +	} +ok: +	pr_debug("ACCESS OK: %s at 0x%08x (size 0x%x), seg 0x%08x\n", +			type ? "WRITE" : "READ ", (__force u32)addr, (u32)size, +			(u32)get_fs().seg); +	return 1; +}  #endif  #ifdef CONFIG_MMU @@ -108,7 +116,7 @@ static inline int ___range_ok(unsigned long addr, unsigned long size)  # define __EX_TABLE_SECTION	".section __ex_table,\"a\"\n"  #else  # define __FIXUP_SECTION	".section .discard,\"ax\"\n" -# define __EX_TABLE_SECTION	".section .discard,\"a\"\n" +# define __EX_TABLE_SECTION	".section .discard,\"ax\"\n"  #endif  extern unsigned long __copy_tofrom_user(void __user *to, @@ -120,16 +128,16 @@ static inline unsigned long __must_check __clear_user(void __user *to,  {  	/* normal memset with two words to __ex_table */  	__asm__ __volatile__ (				\ -			"1:	sb	r0, %2, r0;"	\ +			"1:	sb	r0, %1, r0;"	\  			"	addik	%0, %0, -1;"	\  			"	bneid	%0, 1b;"	\ -			"	addik	%2, %2, 1;"	\ +			"	addik	%1, %1, 1;"	\  			"2:			"	\  			__EX_TABLE_SECTION		\  			".word	1b,2b;"			\  			".previous;"			\ -		: "=r"(n)				\ -		: "0"(n), "r"(to) +		: "=r"(n), "=r"(to)			\ +		: "0"(n), "1"(to)  	);  	return n;  } @@ -137,7 +145,7 @@ static inline unsigned long __must_check __clear_user(void __user *to,  static inline unsigned long __must_check clear_user(void __user *to,  							unsigned long n)  { -	might_sleep(); +	might_fault();  	if (unlikely(!access_ok(VERIFY_WRITE, to, n)))  		return n; @@ -298,11 +306,10 @@ extern long __user_bad(void);  #define __put_user_check(x, ptr, size)					\  ({									\ -	typeof(*(ptr)) __pu_val;					\ +	typeof(*(ptr)) volatile __pu_val = x;					\  	typeof(*(ptr)) __user *__pu_addr = (ptr);			\  	int __pu_err = 0;						\  									\ -	__pu_val = (x);							\  	if (access_ok(VERIFY_WRITE, __pu_addr, size)) {			\  		switch (size) {						\  		case 1:							\ @@ -364,7 +371,7 @@ extern long __user_bad(void);  static inline long copy_from_user(void *to,  		const void __user *from, unsigned long n)  { -	might_sleep(); +	might_fault();  	if (access_ok(VERIFY_READ, from, n))  		return __copy_from_user(to, from, n);  	return n; @@ -378,7 +385,7 @@ static inline long copy_from_user(void *to,  static inline long copy_to_user(void __user *to,  		const void *from, unsigned long n)  { -	might_sleep(); +	might_fault();  	if (access_ok(VERIFY_WRITE, to, n))  		return __copy_to_user(to, from, n);  	return n; diff --git a/arch/microblaze/include/asm/unaligned.h b/arch/microblaze/include/asm/unaligned.h index 2b97cbe500e..b162ed88049 100644 --- a/arch/microblaze/include/asm/unaligned.h +++ b/arch/microblaze/include/asm/unaligned.h @@ -12,18 +12,19 @@  # ifdef __KERNEL__ -# include <linux/unaligned/be_byteshift.h> -# include <linux/unaligned/le_byteshift.h> -# include <linux/unaligned/generic.h> - -  #  ifdef __MICROBLAZEEL__ +#   include <linux/unaligned/le_struct.h> +#   include <linux/unaligned/be_byteshift.h>  #   define get_unaligned	__get_unaligned_le  #   define put_unaligned	__put_unaligned_le  #  else +#   include <linux/unaligned/be_struct.h> +#   include <linux/unaligned/le_byteshift.h>  #   define get_unaligned	__get_unaligned_be  #   define put_unaligned	__put_unaligned_be  #  endif +# include <linux/unaligned/generic.h> +  # endif	/* __KERNEL__ */  #endif /* _ASM_MICROBLAZE_UNALIGNED_H */ diff --git a/arch/microblaze/include/asm/unistd.h b/arch/microblaze/include/asm/unistd.h index d770b00ec6b..fd56a8f6648 100644 --- a/arch/microblaze/include/asm/unistd.h +++ b/arch/microblaze/include/asm/unistd.h @@ -6,400 +6,19 @@   * License. See the file "COPYING" in the main directory of this archive   * for more details.   */ -  #ifndef _ASM_MICROBLAZE_UNISTD_H  #define _ASM_MICROBLAZE_UNISTD_H -#define __NR_restart_syscall	0 /* ok */ -#define __NR_exit		1 /* ok */ -#define __NR_fork		2 /* not for no MMU - weird */ -#define __NR_read		3 /* ok */ -#define __NR_write		4 /* ok */ -#define __NR_open		5 /* openat */ -#define __NR_close		6 /* ok */ -#define __NR_waitpid		7 /* waitid */ -#define __NR_creat		8 /* openat */ -#define __NR_link		9 /* linkat */ -#define __NR_unlink		10 /* unlinkat */ -#define __NR_execve		11 /* ok */ -#define __NR_chdir		12 /* ok */ -#define __NR_time		13 /* obsolete -> sys_gettimeofday */ -#define __NR_mknod		14 /* mknodat */ -#define __NR_chmod		15 /* fchmodat */ -#define __NR_lchown		16 /* ok */ -#define __NR_break		17 /* don't know */ -#define __NR_oldstat		18 /* remove */ -#define __NR_lseek		19 /* ok */ -#define __NR_getpid		20 /* ok */ -#define __NR_mount		21 /* ok */ -#define __NR_umount		22 /* ok */  /* use only umount2 */ -#define __NR_setuid		23 /* ok */ -#define __NR_getuid		24 /* ok */ -#define __NR_stime		25 /* obsolete -> sys_settimeofday */ -#define __NR_ptrace		26 /* ok */ -#define __NR_alarm		27 /* obsolete -> sys_setitimer */ -#define __NR_oldfstat		28 /* remove */ -#define __NR_pause		29 /* obsolete -> sys_rt_sigtimedwait */ -#define __NR_utime		30 /* obsolete -> sys_utimesat */ -#define __NR_stty		31 /* remove */ -#define __NR_gtty		32 /* remove */ -#define __NR_access		33 /* faccessat */ -/* can be implemented by sys_setpriority */ -#define __NR_nice		34 -#define __NR_ftime		35 /* remove */ -#define __NR_sync		36 /* ok */ -#define __NR_kill		37 /* ok */ -#define __NR_rename		38 /* renameat */ -#define __NR_mkdir		39 /* mkdirat */ -#define __NR_rmdir		40 /* unlinkat */ -#define __NR_dup		41 /* ok */ -#define __NR_pipe		42 /* ok */ -#define __NR_times		43 /* ok */ -#define __NR_prof		44 /* remove */ -#define __NR_brk		45 /* ok -mmu, nommu specific */ -#define __NR_setgid		46 /* ok */ -#define __NR_getgid		47 /* ok */ -#define __NR_signal		48 /* obsolete -> sys_rt_sigaction */ -#define __NR_geteuid		49 /* ok */ -#define __NR_getegid		50 /* ok */ -#define __NR_acct		51 /* add it and then I can disable it */ -#define __NR_umount2		52 /* remove */ -#define __NR_lock		53 /* remove */ -#define __NR_ioctl		54 /* ok */ -#define __NR_fcntl		55 /* ok -> 64bit version*/ -#define __NR_mpx		56 /* remove */ -#define __NR_setpgid		57 /* ok */ -#define __NR_ulimit		58 /* remove */ -#define __NR_oldolduname	59 /* remove */ -#define __NR_umask		60 /* ok */ -#define __NR_chroot		61 /* ok */ -#define __NR_ustat		62 /* obsolete -> statfs64 */ -#define __NR_dup2		63 /* ok */ -#define __NR_getppid		64 /* ok */ -#define __NR_getpgrp		65 /* obsolete -> sys_getpgid */ -#define __NR_setsid		66 /* ok */ -#define __NR_sigaction		67 /* obsolete -> rt_sigaction */ -#define __NR_sgetmask		68 /* obsolete -> sys_rt_sigprocmask */ -#define __NR_ssetmask		69 /* obsolete ->sys_rt_sigprocmask */ -#define __NR_setreuid		70 /* ok */ -#define __NR_setregid		71 /* ok */ -#define __NR_sigsuspend		72 /* obsolete -> rt_sigsuspend */ -#define __NR_sigpending		73 /* obsolete -> sys_rt_sigpending */ -#define __NR_sethostname	74 /* ok */ -#define __NR_setrlimit		75 /* ok */ -#define __NR_getrlimit		76 /* ok Back compatible 2G limited rlimit */ -#define __NR_getrusage		77 /* ok */ -#define __NR_gettimeofday	78 /* ok */ -#define __NR_settimeofday	79 /* ok */ -#define __NR_getgroups		80 /* ok */ -#define __NR_setgroups		81 /* ok */ -#define __NR_select		82 /* obsolete -> sys_pselect7 */ -#define __NR_symlink		83 /* symlinkat */ -#define __NR_oldlstat		84 /* remove */ -#define __NR_readlink		85 /* obsolete -> sys_readlinkat */ -#define __NR_uselib		86 /* remove */ -#define __NR_swapon		87 /* ok */ -#define __NR_reboot		88 /* ok */ -#define __NR_readdir		89 /* remove ? */ -#define __NR_mmap		90 /* obsolete -> sys_mmap2 */ -#define __NR_munmap		91 /* ok - mmu and nommu */ -#define __NR_truncate		92 /* ok or truncate64 */ -#define __NR_ftruncate		93 /* ok or ftruncate64 */ -#define __NR_fchmod		94 /* ok */ -#define __NR_fchown		95 /* ok */ -#define __NR_getpriority	96 /* ok */ -#define __NR_setpriority	97 /* ok */ -#define __NR_profil		98 /* remove */ -#define __NR_statfs		99 /* ok or statfs64 */ -#define __NR_fstatfs		100  /* ok or fstatfs64 */ -#define __NR_ioperm		101 /* remove */ -#define __NR_socketcall		102 /* remove */ -#define __NR_syslog		103 /* ok */ -#define __NR_setitimer		104 /* ok */ -#define __NR_getitimer		105 /* ok */ -#define __NR_stat		106 /* remove */ -#define __NR_lstat		107 /* remove */ -#define __NR_fstat		108 /* remove */ -#define __NR_olduname		109 /* remove */ -#define __NR_iopl		110 /* remove */ -#define __NR_vhangup		111 /* ok */ -#define __NR_idle		112 /* remove */ -#define __NR_vm86old		113 /* remove */ -#define __NR_wait4		114 /* obsolete -> waitid */ -#define __NR_swapoff		115 /* ok */ -#define __NR_sysinfo		116 /* ok */ -#define __NR_ipc		117 /* remove - direct call */ -#define __NR_fsync		118 /* ok */ -#define __NR_sigreturn		119 /* obsolete -> sys_rt_sigreturn */ -#define __NR_clone		120 /* ok */ -#define __NR_setdomainname	121 /* ok */ -#define __NR_uname		122 /* remove */ -#define __NR_modify_ldt		123 /* remove */ -#define __NR_adjtimex		124 /* ok */ -#define __NR_mprotect		125 /* remove */ -#define __NR_sigprocmask	126 /* obsolete -> sys_rt_sigprocmask */ -#define __NR_create_module	127 /* remove */ -#define __NR_init_module	128 /* ok */ -#define __NR_delete_module	129 /* ok */ -#define __NR_get_kernel_syms	130 /* remove */ -#define __NR_quotactl		131 /* ok */ -#define __NR_getpgid		132 /* ok */ -#define __NR_fchdir		133 /* ok */ -#define __NR_bdflush		134 /* remove */ -#define __NR_sysfs		135 /* needed for busybox */ -#define __NR_personality	136 /* ok */ -#define __NR_afs_syscall	137 /* Syscall for Andrew File System */ -#define __NR_setfsuid		138 /* ok */ -#define __NR_setfsgid		139 /* ok */ -#define __NR__llseek		140 /* remove only lseek */ -#define __NR_getdents		141 /* ok or getdents64 */ -#define __NR__newselect		142 /* remove */ -#define __NR_flock		143 /* ok */ -#define __NR_msync		144 /* remove */ -#define __NR_readv		145 /* ok */ -#define __NR_writev		146 /* ok */ -#define __NR_getsid		147 /* ok */ -#define __NR_fdatasync		148 /* ok */ -#define __NR__sysctl		149 /* remove */ -#define __NR_mlock		150 /* ok - nommu or mmu */ -#define __NR_munlock		151 /* ok - nommu or mmu */ -#define __NR_mlockall		152 /* ok - nommu or mmu */ -#define __NR_munlockall		153 /* ok - nommu or mmu */ -#define __NR_sched_setparam		154 /* ok */ -#define __NR_sched_getparam		155 /* ok */ -#define __NR_sched_setscheduler		156 /* ok */ -#define __NR_sched_getscheduler		157 /* ok */ -#define __NR_sched_yield		158 /* ok */ -#define __NR_sched_get_priority_max	159 /* ok */ -#define __NR_sched_get_priority_min	160 /* ok */ -#define __NR_sched_rr_get_interval	161 /* ok */ -#define __NR_nanosleep		162 /* ok */ -#define __NR_mremap		163 /* ok - nommu or mmu */ -#define __NR_setresuid		164 /* ok */ -#define __NR_getresuid		165 /* ok */ -#define __NR_vm86		166 /* remove */ -#define __NR_query_module	167 /* ok */ -#define __NR_poll		168 /* obsolete -> sys_ppoll */ -#define __NR_nfsservctl		169 /* ok */ -#define __NR_setresgid		170 /* ok */ -#define __NR_getresgid		171 /* ok */ -#define __NR_prctl		172 /* ok */ -#define __NR_rt_sigreturn	173 /* ok */ -#define __NR_rt_sigaction	174 /* ok */ -#define __NR_rt_sigprocmask	175 /* ok */ -#define __NR_rt_sigpending	176 /* ok */ -#define __NR_rt_sigtimedwait	177 /* ok */ -#define __NR_rt_sigqueueinfo	178 /* ok */ -#define __NR_rt_sigsuspend	179 /* ok */ -#define __NR_pread64		180 /* ok */ -#define __NR_pwrite64		181 /* ok */ -#define __NR_chown		182 /* obsolete -> fchownat */ -#define __NR_getcwd		183 /* ok */ -#define __NR_capget		184 /* ok */ -#define __NR_capset		185 /* ok */ -#define __NR_sigaltstack	186 /* remove */ -#define __NR_sendfile		187 /* ok -> exist 64bit version*/ -#define __NR_getpmsg		188 /* remove */ -/* remove - some people actually want streams */ -#define __NR_putpmsg		189 -/* for noMMU - group with clone -> maybe remove */ -#define __NR_vfork		190 -#define __NR_ugetrlimit		191 /* remove - SuS compliant getrlimit */ -#define __NR_mmap2		192 /* ok */ -#define __NR_truncate64		193 /* ok */ -#define __NR_ftruncate64	194 /* ok */ -#define __NR_stat64		195 /* remove _ARCH_WANT_STAT64 */ -#define __NR_lstat64		196 /* remove _ARCH_WANT_STAT64 */ -#define __NR_fstat64		197 /* remove _ARCH_WANT_STAT64 */ -#define __NR_lchown32		198 /* ok - without 32 */ -#define __NR_getuid32		199 /* ok - without 32 */ -#define __NR_getgid32		200 /* ok - without 32 */ -#define __NR_geteuid32		201 /* ok - without 32 */ -#define __NR_getegid32		202 /* ok - without 32 */ -#define __NR_setreuid32		203 /* ok - without 32 */ -#define __NR_setregid32		204 /* ok - without 32 */ -#define __NR_getgroups32	205 /* ok - without 32 */ -#define __NR_setgroups32	206 /* ok - without 32 */ -#define __NR_fchown32		207 /* ok - without 32 */ -#define __NR_setresuid32	208 /* ok - without 32 */ -#define __NR_getresuid32	209 /* ok - without 32 */ -#define __NR_setresgid32	210 /* ok - without 32 */ -#define __NR_getresgid32	211 /* ok - without 32 */ -#define __NR_chown32		212 /* ok - without 32 -obsolete -> fchownat */ -#define __NR_setuid32		213 /* ok - without 32 */ -#define __NR_setgid32		214 /* ok - without 32 */ -#define __NR_setfsuid32		215 /* ok - without 32 */ -#define __NR_setfsgid32		216 /* ok - without 32 */ -#define __NR_pivot_root		217 /* ok */ -#define __NR_mincore		218 /* ok */ -#define __NR_madvise		219 /* ok */ -#define __NR_getdents64		220 /* ok */ -#define __NR_fcntl64		221 /* ok */ -/* 223 is unused */ -#define __NR_gettid		224 /* ok */ -#define __NR_readahead		225 /* ok */ -#define __NR_setxattr		226 /* ok */ -#define __NR_lsetxattr		227 /* ok */ -#define __NR_fsetxattr		228 /* ok */ -#define __NR_getxattr		229 /* ok */ -#define __NR_lgetxattr		230 /* ok */ -#define __NR_fgetxattr		231 /* ok */ -#define __NR_listxattr		232 /* ok */ -#define __NR_llistxattr		233 /* ok */ -#define __NR_flistxattr		234 /* ok */ -#define __NR_removexattr	235 /* ok */ -#define __NR_lremovexattr	236 /* ok */ -#define __NR_fremovexattr	237 /* ok */ -#define __NR_tkill		238 /* ok */ -#define __NR_sendfile64		239 /* ok */ -#define __NR_futex		240 /* ok */ -#define __NR_sched_setaffinity	241 /* ok */ -#define __NR_sched_getaffinity	242 /* ok */ -#define __NR_set_thread_area	243 /* remove */ -#define __NR_get_thread_area	244 /* remove */ -#define __NR_io_setup		245 /* ok */ -#define __NR_io_destroy		246 /* ok */ -#define __NR_io_getevents	247 /* ok */ -#define __NR_io_submit		248 /* ok */ -#define __NR_io_cancel		249 /* ok */ -#define __NR_fadvise64		250 /* remove -> sys_fadvise64_64 */ -/* 251 is available for reuse (was briefly sys_set_zone_reclaim) */ -#define __NR_exit_group		252 /* ok */ -#define __NR_lookup_dcookie	253 /* ok */ -#define __NR_epoll_create	254 /* ok */ -#define __NR_epoll_ctl		255 /* ok */ -#define __NR_epoll_wait		256 /* obsolete -> sys_epoll_pwait */ -#define __NR_remap_file_pages	257 /* only for mmu */ -#define __NR_set_tid_address	258 /* ok */ -#define __NR_timer_create	259 /* ok */ -#define __NR_timer_settime	(__NR_timer_create+1) /* 260 */ /* ok */ -#define __NR_timer_gettime	(__NR_timer_create+2) /* 261 */ /* ok */ -#define __NR_timer_getoverrun	(__NR_timer_create+3) /* 262 */ /* ok */ -#define __NR_timer_delete	(__NR_timer_create+4) /* 263 */ /* ok */ -#define __NR_clock_settime	(__NR_timer_create+5) /* 264 */ /* ok */ -#define __NR_clock_gettime	(__NR_timer_create+6) /* 265 */ /* ok */ -#define __NR_clock_getres	(__NR_timer_create+7) /* 266 */ /* ok */ -#define __NR_clock_nanosleep	(__NR_timer_create+8) /* 267 */ /* ok */ -#define __NR_statfs64		268 /* ok */ -#define __NR_fstatfs64		269 /* ok */ -#define __NR_tgkill		270 /* ok */ -#define __NR_utimes		271 /* obsolete -> sys_futimesat */ -#define __NR_fadvise64_64	272 /* ok */ -#define __NR_vserver		273 /* ok */ -#define __NR_mbind		274 /* only for mmu */ -#define __NR_get_mempolicy	275 /* only for mmu */ -#define __NR_set_mempolicy	276 /* only for mmu */ -#define __NR_mq_open		277 /* ok */ -#define __NR_mq_unlink		(__NR_mq_open+1) /* 278 */ /* ok */ -#define __NR_mq_timedsend	(__NR_mq_open+2) /* 279 */ /* ok */ -#define __NR_mq_timedreceive	(__NR_mq_open+3) /* 280 */ /* ok */ -#define __NR_mq_notify		(__NR_mq_open+4) /* 281 */ /* ok */ -#define __NR_mq_getsetattr	(__NR_mq_open+5) /* 282 */ /* ok */ -#define __NR_kexec_load		283 /* ok */ -#define __NR_waitid		284 /* ok */ -/* #define __NR_sys_setaltroot	285 */ -#define __NR_add_key		286 /* ok */ -#define __NR_request_key	287 /* ok */ -#define __NR_keyctl		288 /* ok */ -#define __NR_ioprio_set		289 /* ok */ -#define __NR_ioprio_get		290 /* ok */ -#define __NR_inotify_init	291 /* ok */ -#define __NR_inotify_add_watch	292 /* ok */ -#define __NR_inotify_rm_watch	293 /* ok */ -#define __NR_migrate_pages	294 /* mmu */ -#define __NR_openat		295 /* ok */ -#define __NR_mkdirat		296 /* ok */ -#define __NR_mknodat		297 /* ok */ -#define __NR_fchownat		298 /* ok */ -#define __NR_futimesat		299 /* obsolete -> sys_utimesat */ -#define __NR_fstatat64		300 /* stat64 */ -#define __NR_unlinkat		301 /* ok */ -#define __NR_renameat		302 /* ok */ -#define __NR_linkat		303 /* ok */ -#define __NR_symlinkat		304 /* ok */ -#define __NR_readlinkat		305 /* ok */ -#define __NR_fchmodat		306 /* ok */ -#define __NR_faccessat		307 /* ok */ -#define __NR_pselect6		308 /* obsolete -> sys_pselect7 */ -#define __NR_ppoll		309 /* ok */ -#define __NR_unshare		310 /* ok */ -#define __NR_set_robust_list	311 /* ok */ -#define __NR_get_robust_list	312 /* ok */ -#define __NR_splice		313 /* ok */ -#define __NR_sync_file_range	314 /* ok */ -#define __NR_tee		315 /* ok */ -#define __NR_vmsplice		316 /* ok */ -#define __NR_move_pages		317 /* mmu */ -#define __NR_getcpu		318 /* ok */ -#define __NR_epoll_pwait	319 /* ok */ -#define __NR_utimensat		320 /* ok */ -#define __NR_signalfd		321 /* ok */ -#define __NR_timerfd_create	322 /* ok */ -#define __NR_eventfd		323 /* ok */ -#define __NR_fallocate		324 /* ok */ -#define __NR_semtimedop		325 /* ok - semaphore group */ -#define __NR_timerfd_settime	326 /* ok */ -#define __NR_timerfd_gettime	327 /* ok */ -/* sysv ipc syscalls */ -#define __NR_semctl		328 /* ok */ -#define __NR_semget		329 /* ok */ -#define __NR_semop		330 /* ok */ -#define __NR_msgctl		331 /* ok */ -#define __NR_msgget		332 /* ok */ -#define __NR_msgrcv		333 /* ok */ -#define __NR_msgsnd		334 /* ok */ -#define __NR_shmat		335 /* ok */ -#define __NR_shmctl		336 /* ok */ -#define __NR_shmdt		337 /* ok */ -#define __NR_shmget		338 /* ok */ - - -#define __NR_signalfd4		339 /* new */ -#define __NR_eventfd2		340 /* new */ -#define __NR_epoll_create1	341 /* new */ -#define __NR_dup3		342 /* new */ -#define __NR_pipe2		343 /* new */ -#define __NR_inotify_init1	344 /* new */ -#define __NR_socket		345 /* new */ -#define __NR_socketpair		346 /* new */ -#define __NR_bind		347 /* new */ -#define __NR_listen		348 /* new */ -#define __NR_accept		349 /* new */ -#define __NR_connect		350 /* new */ -#define __NR_getsockname	351 /* new */ -#define __NR_getpeername	352 /* new */ -#define __NR_sendto		353 /* new */ -#define __NR_send		354 /* new */ -#define __NR_recvfrom		355 /* new */ -#define __NR_recv		356 /* new */ -#define __NR_setsockopt		357 /* new */ -#define __NR_getsockopt		358 /* new */ -#define __NR_shutdown		359 /* new */ -#define __NR_sendmsg		360 /* new */ -#define __NR_recvmsg		361 /* new */ -#define __NR_accept4		362 /* new */ -#define __NR_preadv		363 /* new */ -#define __NR_pwritev		364 /* new */ -#define __NR_rt_tgsigqueueinfo	365 /* new */ -#define __NR_perf_event_open	366 /* new */ -#define __NR_recvmmsg		367 /* new */ -#define __NR_fanotify_init	368 -#define __NR_fanotify_mark	369 -#define __NR_prlimit64		370 +#include <uapi/asm/unistd.h> -#define __NR_syscalls		371 - -#ifdef __KERNEL__  #ifndef __ASSEMBLY__ -#define __ARCH_WANT_IPC_PARSE_VERSION  /* #define __ARCH_WANT_OLD_READDIR */  /* #define __ARCH_WANT_OLD_STAT */  #define __ARCH_WANT_STAT64  #define __ARCH_WANT_SYS_ALARM  #define __ARCH_WANT_SYS_GETHOSTNAME  #define __ARCH_WANT_SYS_PAUSE -#define __ARCH_WANT_SYS_SGETMASK  #define __ARCH_WANT_SYS_SIGNAL  #define __ARCH_WANT_SYS_TIME  #define __ARCH_WANT_SYS_UTIME @@ -413,17 +32,12 @@  #define __ARCH_WANT_SYS_OLDUMOUNT  #define __ARCH_WANT_SYS_SIGPENDING  #define __ARCH_WANT_SYS_SIGPROCMASK -#define __ARCH_WANT_SYS_RT_SIGACTION -#define __ARCH_WANT_SYS_RT_SIGSUSPEND - -/* - * "Conditional" syscalls - * - * What we want is __attribute__((weak,alias("sys_ni_syscall"))), - * but it doesn't work on all toolchains, so we just do it by hand - */ -#define cond_syscall(x) asm(".weak\t" #x "\n\t.set\t" #x ",sys_ni_syscall"); +#define __ARCH_WANT_SYS_CLONE +#define __ARCH_WANT_SYS_VFORK +#define __ARCH_WANT_SYS_FORK  #endif /* __ASSEMBLY__ */ -#endif /* __KERNEL__ */ + +#define __NR_syscalls         381 +  #endif /* _ASM_MICROBLAZE_UNISTD_H */ diff --git a/arch/microblaze/include/uapi/asm/Kbuild b/arch/microblaze/include/uapi/asm/Kbuild new file mode 100644 index 00000000000..1aac99f87df --- /dev/null +++ b/arch/microblaze/include/uapi/asm/Kbuild @@ -0,0 +1,36 @@ +# UAPI Header export list +include include/uapi/asm-generic/Kbuild.asm + +generic-y += types.h + +header-y += auxvec.h +header-y += bitsperlong.h +header-y += byteorder.h +header-y += elf.h +header-y += errno.h +header-y += fcntl.h +header-y += ioctl.h +header-y += ioctls.h +header-y += ipcbuf.h +header-y += kvm_para.h +header-y += mman.h +header-y += msgbuf.h +header-y += param.h +header-y += poll.h +header-y += posix_types.h +header-y += ptrace.h +header-y += resource.h +header-y += sembuf.h +header-y += setup.h +header-y += shmbuf.h +header-y += sigcontext.h +header-y += siginfo.h +header-y += signal.h +header-y += socket.h +header-y += sockios.h +header-y += stat.h +header-y += statfs.h +header-y += swab.h +header-y += termbits.h +header-y += termios.h +header-y += unistd.h diff --git a/arch/microblaze/include/asm/auxvec.h b/arch/microblaze/include/uapi/asm/auxvec.h index 8b137891791..8b137891791 100644 --- a/arch/microblaze/include/asm/auxvec.h +++ b/arch/microblaze/include/uapi/asm/auxvec.h diff --git a/arch/microblaze/include/asm/bitsperlong.h b/arch/microblaze/include/uapi/asm/bitsperlong.h index 6dc0bb0c13b..6dc0bb0c13b 100644 --- a/arch/microblaze/include/asm/bitsperlong.h +++ b/arch/microblaze/include/uapi/asm/bitsperlong.h diff --git a/arch/microblaze/include/asm/byteorder.h b/arch/microblaze/include/uapi/asm/byteorder.h index 31902762a42..31902762a42 100644 --- a/arch/microblaze/include/asm/byteorder.h +++ b/arch/microblaze/include/uapi/asm/byteorder.h diff --git a/arch/microblaze/include/uapi/asm/elf.h b/arch/microblaze/include/uapi/asm/elf.h new file mode 100644 index 00000000000..be1731d5e2f --- /dev/null +++ b/arch/microblaze/include/uapi/asm/elf.h @@ -0,0 +1,121 @@ +/* + * Copyright (C) 2008-2009 Michal Simek <monstr@monstr.eu> + * Copyright (C) 2008-2009 PetaLogix + * Copyright (C) 2006 Atmark Techno, Inc. + * + * This file is subject to the terms and conditions of the GNU General Public + * License. See the file "COPYING" in the main directory of this archive + * for more details. + */ + +#ifndef _UAPI_ASM_MICROBLAZE_ELF_H +#define _UAPI_ASM_MICROBLAZE_ELF_H + +/* + * Note there is no "official" ELF designation for Microblaze. + * I've snaffled the value from the microblaze binutils source code + * /binutils/microblaze/include/elf/microblaze.h + */ +#define EM_MICROBLAZE		189 +#define EM_MICROBLAZE_OLD	0xbaab +#define ELF_ARCH		EM_MICROBLAZE + +/* + * This is used to ensure we don't load something for the wrong architecture. + */ +#define elf_check_arch(x)	((x)->e_machine == EM_MICROBLAZE \ +				 || (x)->e_machine == EM_MICROBLAZE_OLD) + +/* + * These are used to set parameters in the core dumps. + */ +#define ELF_CLASS	ELFCLASS32 + +#ifndef __uClinux__ + +/* + * ELF register definitions.. + */ + +#include <asm/ptrace.h> +#include <asm/byteorder.h> + +#ifndef ELF_GREG_T +#define ELF_GREG_T +typedef unsigned long elf_greg_t; +#endif + +#ifndef ELF_NGREG +#define ELF_NGREG (sizeof(struct pt_regs) / sizeof(elf_greg_t)) +#endif + +#ifndef ELF_GREGSET_T +#define ELF_GREGSET_T +typedef elf_greg_t elf_gregset_t[ELF_NGREG]; +#endif + +#ifndef ELF_FPREGSET_T +#define ELF_FPREGSET_T + +/* TBD */ +#define ELF_NFPREG	33	/* includes fsr */ +typedef unsigned long elf_fpreg_t; +typedef elf_fpreg_t elf_fpregset_t[ELF_NFPREG]; + +/* typedef struct user_fpu_struct elf_fpregset_t; */ +#endif + +/* This is the location that an ET_DYN program is loaded if exec'ed.  Typical + * use of this is to invoke "./ld.so someprog" to test out a new version of + * the loader.  We need to make sure that it is out of the way of the program + * that it will "exec", and that there is sufficient room for the brk. + */ + +#define ELF_ET_DYN_BASE         (0x08000000) + +#ifdef __MICROBLAZEEL__ +#define ELF_DATA	ELFDATA2LSB +#else +#define ELF_DATA	ELFDATA2MSB +#endif + +#define ELF_EXEC_PAGESIZE	PAGE_SIZE + + +#define ELF_CORE_COPY_REGS(_dest, _regs)			\ +	memcpy((char *) &_dest, (char *) _regs,		\ +	sizeof(struct pt_regs)); + +/* This yields a mask that user programs can use to figure out what + * instruction set this CPU supports.  This could be done in user space, + * but it's not easy, and we've already done it here. + */ +#define ELF_HWCAP	(0) + +/* This yields a string that ld.so will use to load implementation + * specific libraries for optimization.  This is more specific in + * intent than poking at uname or /proc/cpuinfo. + + * For the moment, we have only optimizations for the Intel generations, + * but that could change... + */ +#define ELF_PLATFORM  (NULL) + +/* Added _f parameter. Is this definition correct: TBD */ +#define ELF_PLAT_INIT(_r, _f)				\ +do {							\ +	_r->r0 =  _r->r1 =  _r->r2 =  _r->r3 =		\ +	_r->r4 =  _r->r5 =  _r->r6 =  _r->r7 =		\ +	_r->r8 =  _r->r9 =  _r->r10 = _r->r11 =		\ +	_r->r12 = _r->r13 = _r->r14 = _r->r15 =		\ +	_r->r16 = _r->r17 = _r->r18 = _r->r19 =		\ +	_r->r20 = _r->r21 = _r->r22 = _r->r23 =		\ +	_r->r24 = _r->r25 = _r->r26 = _r->r27 =		\ +	_r->r28 = _r->r29 = _r->r30 = _r->r31 =		\ +	0;						\ +} while (0) + + +#endif /* __uClinux__ */ + +#endif /* _UAPI_ASM_MICROBLAZE_ELF_H */ diff --git a/arch/microblaze/include/asm/errno.h b/arch/microblaze/include/uapi/asm/errno.h index 4c82b503d92..4c82b503d92 100644 --- a/arch/microblaze/include/asm/errno.h +++ b/arch/microblaze/include/uapi/asm/errno.h diff --git a/arch/microblaze/include/asm/fcntl.h b/arch/microblaze/include/uapi/asm/fcntl.h index 46ab12db573..46ab12db573 100644 --- a/arch/microblaze/include/asm/fcntl.h +++ b/arch/microblaze/include/uapi/asm/fcntl.h diff --git a/arch/microblaze/include/asm/ioctl.h b/arch/microblaze/include/uapi/asm/ioctl.h index b279fe06dfe..b279fe06dfe 100644 --- a/arch/microblaze/include/asm/ioctl.h +++ b/arch/microblaze/include/uapi/asm/ioctl.h diff --git a/arch/microblaze/include/asm/ioctls.h b/arch/microblaze/include/uapi/asm/ioctls.h index ec34c760665..ec34c760665 100644 --- a/arch/microblaze/include/asm/ioctls.h +++ b/arch/microblaze/include/uapi/asm/ioctls.h diff --git a/arch/microblaze/include/asm/ipcbuf.h b/arch/microblaze/include/uapi/asm/ipcbuf.h index 84c7e51cb6d..84c7e51cb6d 100644 --- a/arch/microblaze/include/asm/ipcbuf.h +++ b/arch/microblaze/include/uapi/asm/ipcbuf.h diff --git a/arch/microblaze/include/uapi/asm/kvm_para.h b/arch/microblaze/include/uapi/asm/kvm_para.h new file mode 100644 index 00000000000..14fab8f0b95 --- /dev/null +++ b/arch/microblaze/include/uapi/asm/kvm_para.h @@ -0,0 +1 @@ +#include <asm-generic/kvm_para.h> diff --git a/arch/microblaze/include/asm/mman.h b/arch/microblaze/include/uapi/asm/mman.h index 8eebf89f5ab..8eebf89f5ab 100644 --- a/arch/microblaze/include/asm/mman.h +++ b/arch/microblaze/include/uapi/asm/mman.h diff --git a/arch/microblaze/include/asm/msgbuf.h b/arch/microblaze/include/uapi/asm/msgbuf.h index 809134c644a..809134c644a 100644 --- a/arch/microblaze/include/asm/msgbuf.h +++ b/arch/microblaze/include/uapi/asm/msgbuf.h diff --git a/arch/microblaze/include/asm/param.h b/arch/microblaze/include/uapi/asm/param.h index 965d4542797..965d4542797 100644 --- a/arch/microblaze/include/asm/param.h +++ b/arch/microblaze/include/uapi/asm/param.h diff --git a/arch/microblaze/include/asm/poll.h b/arch/microblaze/include/uapi/asm/poll.h index c98509d3149..c98509d3149 100644 --- a/arch/microblaze/include/asm/poll.h +++ b/arch/microblaze/include/uapi/asm/poll.h diff --git a/arch/microblaze/include/asm/posix_types.h b/arch/microblaze/include/uapi/asm/posix_types.h index 0e15039673e..0e15039673e 100644 --- a/arch/microblaze/include/asm/posix_types.h +++ b/arch/microblaze/include/uapi/asm/posix_types.h diff --git a/arch/microblaze/include/uapi/asm/ptrace.h b/arch/microblaze/include/uapi/asm/ptrace.h new file mode 100644 index 00000000000..d31238a5f94 --- /dev/null +++ b/arch/microblaze/include/uapi/asm/ptrace.h @@ -0,0 +1,72 @@ +/* + * Copyright (C) 2006 Atmark Techno, Inc. + * + * This file is subject to the terms and conditions of the GNU General Public + * License. See the file "COPYING" in the main directory of this archive + * for more details. + */ + +#ifndef _UAPI_ASM_MICROBLAZE_PTRACE_H +#define _UAPI_ASM_MICROBLAZE_PTRACE_H + +#ifndef __ASSEMBLY__ + +typedef unsigned long microblaze_reg_t; + +struct pt_regs { +	microblaze_reg_t r0; +	microblaze_reg_t r1; +	microblaze_reg_t r2; +	microblaze_reg_t r3; +	microblaze_reg_t r4; +	microblaze_reg_t r5; +	microblaze_reg_t r6; +	microblaze_reg_t r7; +	microblaze_reg_t r8; +	microblaze_reg_t r9; +	microblaze_reg_t r10; +	microblaze_reg_t r11; +	microblaze_reg_t r12; +	microblaze_reg_t r13; +	microblaze_reg_t r14; +	microblaze_reg_t r15; +	microblaze_reg_t r16; +	microblaze_reg_t r17; +	microblaze_reg_t r18; +	microblaze_reg_t r19; +	microblaze_reg_t r20; +	microblaze_reg_t r21; +	microblaze_reg_t r22; +	microblaze_reg_t r23; +	microblaze_reg_t r24; +	microblaze_reg_t r25; +	microblaze_reg_t r26; +	microblaze_reg_t r27; +	microblaze_reg_t r28; +	microblaze_reg_t r29; +	microblaze_reg_t r30; +	microblaze_reg_t r31; +	microblaze_reg_t pc; +	microblaze_reg_t msr; +	microblaze_reg_t ear; +	microblaze_reg_t esr; +	microblaze_reg_t fsr; +	int pt_mode; +}; + +#ifndef __KERNEL__ + +/* pt_regs offsets used by gdbserver etc in ptrace syscalls */ +#define PT_GPR(n)	((n) * sizeof(microblaze_reg_t)) +#define PT_PC		(32 * sizeof(microblaze_reg_t)) +#define PT_MSR		(33 * sizeof(microblaze_reg_t)) +#define PT_EAR		(34 * sizeof(microblaze_reg_t)) +#define PT_ESR		(35 * sizeof(microblaze_reg_t)) +#define PT_FSR		(36 * sizeof(microblaze_reg_t)) +#define PT_KERNEL_MODE	(37 * sizeof(microblaze_reg_t)) + +#endif /* __KERNEL */ + +#endif /* __ASSEMBLY__ */ + +#endif /* _UAPI_ASM_MICROBLAZE_PTRACE_H */ diff --git a/arch/microblaze/include/asm/resource.h b/arch/microblaze/include/uapi/asm/resource.h index 04bc4db8921..04bc4db8921 100644 --- a/arch/microblaze/include/asm/resource.h +++ b/arch/microblaze/include/uapi/asm/resource.h diff --git a/arch/microblaze/include/asm/sembuf.h b/arch/microblaze/include/uapi/asm/sembuf.h index 7673b83cfef..7673b83cfef 100644 --- a/arch/microblaze/include/asm/sembuf.h +++ b/arch/microblaze/include/uapi/asm/sembuf.h diff --git a/arch/microblaze/include/uapi/asm/setup.h b/arch/microblaze/include/uapi/asm/setup.h new file mode 100644 index 00000000000..76bc2acee6a --- /dev/null +++ b/arch/microblaze/include/uapi/asm/setup.h @@ -0,0 +1,19 @@ +/* + * Copyright (C) 2007-2009 Michal Simek <monstr@monstr.eu> + * Copyright (C) 2007-2009 PetaLogix + * Copyright (C) 2006 Atmark Techno, Inc. + * + * This file is subject to the terms and conditions of the GNU General Public + * License. See the file "COPYING" in the main directory of this archive + * for more details. + */ + +#ifndef _UAPI_ASM_MICROBLAZE_SETUP_H +#define _UAPI_ASM_MICROBLAZE_SETUP_H + +#define COMMAND_LINE_SIZE	256 + +# ifndef __ASSEMBLY__ + +# endif /* __ASSEMBLY__ */ +#endif /* _UAPI_ASM_MICROBLAZE_SETUP_H */ diff --git a/arch/microblaze/include/asm/shmbuf.h b/arch/microblaze/include/uapi/asm/shmbuf.h index 83c05fc2de3..83c05fc2de3 100644 --- a/arch/microblaze/include/asm/shmbuf.h +++ b/arch/microblaze/include/uapi/asm/shmbuf.h diff --git a/arch/microblaze/include/asm/sigcontext.h b/arch/microblaze/include/uapi/asm/sigcontext.h index 55873c80c91..55873c80c91 100644 --- a/arch/microblaze/include/asm/sigcontext.h +++ b/arch/microblaze/include/uapi/asm/sigcontext.h diff --git a/arch/microblaze/include/asm/siginfo.h b/arch/microblaze/include/uapi/asm/siginfo.h index 0815d29d82e..0815d29d82e 100644 --- a/arch/microblaze/include/asm/siginfo.h +++ b/arch/microblaze/include/uapi/asm/siginfo.h diff --git a/arch/microblaze/include/asm/signal.h b/arch/microblaze/include/uapi/asm/signal.h index 7b1573ce19d..7b1573ce19d 100644 --- a/arch/microblaze/include/asm/signal.h +++ b/arch/microblaze/include/uapi/asm/signal.h diff --git a/arch/microblaze/include/asm/socket.h b/arch/microblaze/include/uapi/asm/socket.h index 6b71384b9d8..6b71384b9d8 100644 --- a/arch/microblaze/include/asm/socket.h +++ b/arch/microblaze/include/uapi/asm/socket.h diff --git a/arch/microblaze/include/asm/sockios.h b/arch/microblaze/include/uapi/asm/sockios.h index def6d4746ee..def6d4746ee 100644 --- a/arch/microblaze/include/asm/sockios.h +++ b/arch/microblaze/include/uapi/asm/sockios.h diff --git a/arch/microblaze/include/asm/stat.h b/arch/microblaze/include/uapi/asm/stat.h index 3dc90fa92c7..3dc90fa92c7 100644 --- a/arch/microblaze/include/asm/stat.h +++ b/arch/microblaze/include/uapi/asm/stat.h diff --git a/arch/microblaze/include/asm/statfs.h b/arch/microblaze/include/uapi/asm/statfs.h index 0b91fe198c2..0b91fe198c2 100644 --- a/arch/microblaze/include/asm/statfs.h +++ b/arch/microblaze/include/uapi/asm/statfs.h diff --git a/arch/microblaze/include/asm/swab.h b/arch/microblaze/include/uapi/asm/swab.h index 7847e563ab6..7847e563ab6 100644 --- a/arch/microblaze/include/asm/swab.h +++ b/arch/microblaze/include/uapi/asm/swab.h diff --git a/arch/microblaze/include/asm/termbits.h b/arch/microblaze/include/uapi/asm/termbits.h index 3935b106de7..3935b106de7 100644 --- a/arch/microblaze/include/asm/termbits.h +++ b/arch/microblaze/include/uapi/asm/termbits.h diff --git a/arch/microblaze/include/asm/termios.h b/arch/microblaze/include/uapi/asm/termios.h index 280d78a9d96..280d78a9d96 100644 --- a/arch/microblaze/include/asm/termios.h +++ b/arch/microblaze/include/uapi/asm/termios.h diff --git a/arch/microblaze/include/uapi/asm/unistd.h b/arch/microblaze/include/uapi/asm/unistd.h new file mode 100644 index 00000000000..8d0791b49b3 --- /dev/null +++ b/arch/microblaze/include/uapi/asm/unistd.h @@ -0,0 +1,402 @@ +/* + * Copyright (C) 2007-2008 Michal Simek <monstr@monstr.eu> + * Copyright (C) 2006 Atmark Techno, Inc. + * + * This file is subject to the terms and conditions of the GNU General Public + * License. See the file "COPYING" in the main directory of this archive + * for more details. + */ + +#ifndef _UAPI_ASM_MICROBLAZE_UNISTD_H +#define _UAPI_ASM_MICROBLAZE_UNISTD_H + +#define __NR_restart_syscall	0 /* ok */ +#define __NR_exit		1 /* ok */ +#define __NR_fork		2 /* not for no MMU - weird */ +#define __NR_read		3 /* ok */ +#define __NR_write		4 /* ok */ +#define __NR_open		5 /* openat */ +#define __NR_close		6 /* ok */ +#define __NR_waitpid		7 /* waitid */ +#define __NR_creat		8 /* openat */ +#define __NR_link		9 /* linkat */ +#define __NR_unlink		10 /* unlinkat */ +#define __NR_execve		11 /* ok */ +#define __NR_chdir		12 /* ok */ +#define __NR_time		13 /* obsolete -> sys_gettimeofday */ +#define __NR_mknod		14 /* mknodat */ +#define __NR_chmod		15 /* fchmodat */ +#define __NR_lchown		16 /* ok */ +#define __NR_break		17 /* don't know */ +#define __NR_oldstat		18 /* remove */ +#define __NR_lseek		19 /* ok */ +#define __NR_getpid		20 /* ok */ +#define __NR_mount		21 /* ok */ +#define __NR_umount		22 /* ok */  /* use only umount2 */ +#define __NR_setuid		23 /* ok */ +#define __NR_getuid		24 /* ok */ +#define __NR_stime		25 /* obsolete -> sys_settimeofday */ +#define __NR_ptrace		26 /* ok */ +#define __NR_alarm		27 /* obsolete -> sys_setitimer */ +#define __NR_oldfstat		28 /* remove */ +#define __NR_pause		29 /* obsolete -> sys_rt_sigtimedwait */ +#define __NR_utime		30 /* obsolete -> sys_utimesat */ +#define __NR_stty		31 /* remove */ +#define __NR_gtty		32 /* remove */ +#define __NR_access		33 /* faccessat */ +/* can be implemented by sys_setpriority */ +#define __NR_nice		34 +#define __NR_ftime		35 /* remove */ +#define __NR_sync		36 /* ok */ +#define __NR_kill		37 /* ok */ +#define __NR_rename		38 /* renameat */ +#define __NR_mkdir		39 /* mkdirat */ +#define __NR_rmdir		40 /* unlinkat */ +#define __NR_dup		41 /* ok */ +#define __NR_pipe		42 /* ok */ +#define __NR_times		43 /* ok */ +#define __NR_prof		44 /* remove */ +#define __NR_brk		45 /* ok -mmu, nommu specific */ +#define __NR_setgid		46 /* ok */ +#define __NR_getgid		47 /* ok */ +#define __NR_signal		48 /* obsolete -> sys_rt_sigaction */ +#define __NR_geteuid		49 /* ok */ +#define __NR_getegid		50 /* ok */ +#define __NR_acct		51 /* add it and then I can disable it */ +#define __NR_umount2		52 /* remove */ +#define __NR_lock		53 /* remove */ +#define __NR_ioctl		54 /* ok */ +#define __NR_fcntl		55 /* ok -> 64bit version*/ +#define __NR_mpx		56 /* remove */ +#define __NR_setpgid		57 /* ok */ +#define __NR_ulimit		58 /* remove */ +#define __NR_oldolduname	59 /* remove */ +#define __NR_umask		60 /* ok */ +#define __NR_chroot		61 /* ok */ +#define __NR_ustat		62 /* obsolete -> statfs64 */ +#define __NR_dup2		63 /* ok */ +#define __NR_getppid		64 /* ok */ +#define __NR_getpgrp		65 /* obsolete -> sys_getpgid */ +#define __NR_setsid		66 /* ok */ +#define __NR_sigaction		67 /* obsolete -> rt_sigaction */ +#define __NR_sgetmask		68 /* obsolete -> sys_rt_sigprocmask */ +#define __NR_ssetmask		69 /* obsolete ->sys_rt_sigprocmask */ +#define __NR_setreuid		70 /* ok */ +#define __NR_setregid		71 /* ok */ +#define __NR_sigsuspend		72 /* obsolete -> rt_sigsuspend */ +#define __NR_sigpending		73 /* obsolete -> sys_rt_sigpending */ +#define __NR_sethostname	74 /* ok */ +#define __NR_setrlimit		75 /* ok */ +#define __NR_getrlimit		76 /* ok Back compatible 2G limited rlimit */ +#define __NR_getrusage		77 /* ok */ +#define __NR_gettimeofday	78 /* ok */ +#define __NR_settimeofday	79 /* ok */ +#define __NR_getgroups		80 /* ok */ +#define __NR_setgroups		81 /* ok */ +#define __NR_select		82 /* obsolete -> sys_pselect6 */ +#define __NR_symlink		83 /* symlinkat */ +#define __NR_oldlstat		84 /* remove */ +#define __NR_readlink		85 /* obsolete -> sys_readlinkat */ +#define __NR_uselib		86 /* remove */ +#define __NR_swapon		87 /* ok */ +#define __NR_reboot		88 /* ok */ +#define __NR_readdir		89 /* remove ? */ +#define __NR_mmap		90 /* obsolete -> sys_mmap2 */ +#define __NR_munmap		91 /* ok - mmu and nommu */ +#define __NR_truncate		92 /* ok or truncate64 */ +#define __NR_ftruncate		93 /* ok or ftruncate64 */ +#define __NR_fchmod		94 /* ok */ +#define __NR_fchown		95 /* ok */ +#define __NR_getpriority	96 /* ok */ +#define __NR_setpriority	97 /* ok */ +#define __NR_profil		98 /* remove */ +#define __NR_statfs		99 /* ok or statfs64 */ +#define __NR_fstatfs		100  /* ok or fstatfs64 */ +#define __NR_ioperm		101 /* remove */ +#define __NR_socketcall		102 /* remove */ +#define __NR_syslog		103 /* ok */ +#define __NR_setitimer		104 /* ok */ +#define __NR_getitimer		105 /* ok */ +#define __NR_stat		106 /* remove */ +#define __NR_lstat		107 /* remove */ +#define __NR_fstat		108 /* remove */ +#define __NR_olduname		109 /* remove */ +#define __NR_iopl		110 /* remove */ +#define __NR_vhangup		111 /* ok */ +#define __NR_idle		112 /* remove */ +#define __NR_vm86old		113 /* remove */ +#define __NR_wait4		114 /* obsolete -> waitid */ +#define __NR_swapoff		115 /* ok */ +#define __NR_sysinfo		116 /* ok */ +#define __NR_ipc		117 /* remove - direct call */ +#define __NR_fsync		118 /* ok */ +#define __NR_sigreturn		119 /* obsolete -> sys_rt_sigreturn */ +#define __NR_clone		120 /* ok */ +#define __NR_setdomainname	121 /* ok */ +#define __NR_uname		122 /* remove */ +#define __NR_modify_ldt		123 /* remove */ +#define __NR_adjtimex		124 /* ok */ +#define __NR_mprotect		125 /* remove */ +#define __NR_sigprocmask	126 /* obsolete -> sys_rt_sigprocmask */ +#define __NR_create_module	127 /* remove */ +#define __NR_init_module	128 /* ok */ +#define __NR_delete_module	129 /* ok */ +#define __NR_get_kernel_syms	130 /* remove */ +#define __NR_quotactl		131 /* ok */ +#define __NR_getpgid		132 /* ok */ +#define __NR_fchdir		133 /* ok */ +#define __NR_bdflush		134 /* remove */ +#define __NR_sysfs		135 /* needed for busybox */ +#define __NR_personality	136 /* ok */ +#define __NR_afs_syscall	137 /* Syscall for Andrew File System */ +#define __NR_setfsuid		138 /* ok */ +#define __NR_setfsgid		139 /* ok */ +#define __NR__llseek		140 /* remove only lseek */ +#define __NR_getdents		141 /* ok or getdents64 */ +#define __NR__newselect		142 /* remove */ +#define __NR_flock		143 /* ok */ +#define __NR_msync		144 /* remove */ +#define __NR_readv		145 /* ok */ +#define __NR_writev		146 /* ok */ +#define __NR_getsid		147 /* ok */ +#define __NR_fdatasync		148 /* ok */ +#define __NR__sysctl		149 /* remove */ +#define __NR_mlock		150 /* ok - nommu or mmu */ +#define __NR_munlock		151 /* ok - nommu or mmu */ +#define __NR_mlockall		152 /* ok - nommu or mmu */ +#define __NR_munlockall		153 /* ok - nommu or mmu */ +#define __NR_sched_setparam		154 /* ok */ +#define __NR_sched_getparam		155 /* ok */ +#define __NR_sched_setscheduler		156 /* ok */ +#define __NR_sched_getscheduler		157 /* ok */ +#define __NR_sched_yield		158 /* ok */ +#define __NR_sched_get_priority_max	159 /* ok */ +#define __NR_sched_get_priority_min	160 /* ok */ +#define __NR_sched_rr_get_interval	161 /* ok */ +#define __NR_nanosleep		162 /* ok */ +#define __NR_mremap		163 /* ok - nommu or mmu */ +#define __NR_setresuid		164 /* ok */ +#define __NR_getresuid		165 /* ok */ +#define __NR_vm86		166 /* remove */ +#define __NR_query_module	167 /* ok */ +#define __NR_poll		168 /* obsolete -> sys_ppoll */ +#define __NR_nfsservctl		169 /* ok */ +#define __NR_setresgid		170 /* ok */ +#define __NR_getresgid		171 /* ok */ +#define __NR_prctl		172 /* ok */ +#define __NR_rt_sigreturn	173 /* ok */ +#define __NR_rt_sigaction	174 /* ok */ +#define __NR_rt_sigprocmask	175 /* ok */ +#define __NR_rt_sigpending	176 /* ok */ +#define __NR_rt_sigtimedwait	177 /* ok */ +#define __NR_rt_sigqueueinfo	178 /* ok */ +#define __NR_rt_sigsuspend	179 /* ok */ +#define __NR_pread64		180 /* ok */ +#define __NR_pwrite64		181 /* ok */ +#define __NR_chown		182 /* obsolete -> fchownat */ +#define __NR_getcwd		183 /* ok */ +#define __NR_capget		184 /* ok */ +#define __NR_capset		185 /* ok */ +#define __NR_sigaltstack	186 /* remove */ +#define __NR_sendfile		187 /* ok -> exist 64bit version*/ +#define __NR_getpmsg		188 /* remove */ +/* remove - some people actually want streams */ +#define __NR_putpmsg		189 +/* for noMMU - group with clone -> maybe remove */ +#define __NR_vfork		190 +#define __NR_ugetrlimit		191 /* remove - SuS compliant getrlimit */ +#define __NR_mmap2		192 /* ok */ +#define __NR_truncate64		193 /* ok */ +#define __NR_ftruncate64	194 /* ok */ +#define __NR_stat64		195 /* remove _ARCH_WANT_STAT64 */ +#define __NR_lstat64		196 /* remove _ARCH_WANT_STAT64 */ +#define __NR_fstat64		197 /* remove _ARCH_WANT_STAT64 */ +#define __NR_lchown32		198 /* ok - without 32 */ +#define __NR_getuid32		199 /* ok - without 32 */ +#define __NR_getgid32		200 /* ok - without 32 */ +#define __NR_geteuid32		201 /* ok - without 32 */ +#define __NR_getegid32		202 /* ok - without 32 */ +#define __NR_setreuid32		203 /* ok - without 32 */ +#define __NR_setregid32		204 /* ok - without 32 */ +#define __NR_getgroups32	205 /* ok - without 32 */ +#define __NR_setgroups32	206 /* ok - without 32 */ +#define __NR_fchown32		207 /* ok - without 32 */ +#define __NR_setresuid32	208 /* ok - without 32 */ +#define __NR_getresuid32	209 /* ok - without 32 */ +#define __NR_setresgid32	210 /* ok - without 32 */ +#define __NR_getresgid32	211 /* ok - without 32 */ +#define __NR_chown32		212 /* ok - without 32 -obsolete -> fchownat */ +#define __NR_setuid32		213 /* ok - without 32 */ +#define __NR_setgid32		214 /* ok - without 32 */ +#define __NR_setfsuid32		215 /* ok - without 32 */ +#define __NR_setfsgid32		216 /* ok - without 32 */ +#define __NR_pivot_root		217 /* ok */ +#define __NR_mincore		218 /* ok */ +#define __NR_madvise		219 /* ok */ +#define __NR_getdents64		220 /* ok */ +#define __NR_fcntl64		221 /* ok */ +/* 223 is unused */ +#define __NR_gettid		224 /* ok */ +#define __NR_readahead		225 /* ok */ +#define __NR_setxattr		226 /* ok */ +#define __NR_lsetxattr		227 /* ok */ +#define __NR_fsetxattr		228 /* ok */ +#define __NR_getxattr		229 /* ok */ +#define __NR_lgetxattr		230 /* ok */ +#define __NR_fgetxattr		231 /* ok */ +#define __NR_listxattr		232 /* ok */ +#define __NR_llistxattr		233 /* ok */ +#define __NR_flistxattr		234 /* ok */ +#define __NR_removexattr	235 /* ok */ +#define __NR_lremovexattr	236 /* ok */ +#define __NR_fremovexattr	237 /* ok */ +#define __NR_tkill		238 /* ok */ +#define __NR_sendfile64		239 /* ok */ +#define __NR_futex		240 /* ok */ +#define __NR_sched_setaffinity	241 /* ok */ +#define __NR_sched_getaffinity	242 /* ok */ +#define __NR_set_thread_area	243 /* remove */ +#define __NR_get_thread_area	244 /* remove */ +#define __NR_io_setup		245 /* ok */ +#define __NR_io_destroy		246 /* ok */ +#define __NR_io_getevents	247 /* ok */ +#define __NR_io_submit		248 /* ok */ +#define __NR_io_cancel		249 /* ok */ +#define __NR_fadvise64		250 /* remove -> sys_fadvise64_64 */ +/* 251 is available for reuse (was briefly sys_set_zone_reclaim) */ +#define __NR_exit_group		252 /* ok */ +#define __NR_lookup_dcookie	253 /* ok */ +#define __NR_epoll_create	254 /* ok */ +#define __NR_epoll_ctl		255 /* ok */ +#define __NR_epoll_wait		256 /* obsolete -> sys_epoll_pwait */ +#define __NR_remap_file_pages	257 /* only for mmu */ +#define __NR_set_tid_address	258 /* ok */ +#define __NR_timer_create	259 /* ok */ +#define __NR_timer_settime	(__NR_timer_create+1) /* 260 */ /* ok */ +#define __NR_timer_gettime	(__NR_timer_create+2) /* 261 */ /* ok */ +#define __NR_timer_getoverrun	(__NR_timer_create+3) /* 262 */ /* ok */ +#define __NR_timer_delete	(__NR_timer_create+4) /* 263 */ /* ok */ +#define __NR_clock_settime	(__NR_timer_create+5) /* 264 */ /* ok */ +#define __NR_clock_gettime	(__NR_timer_create+6) /* 265 */ /* ok */ +#define __NR_clock_getres	(__NR_timer_create+7) /* 266 */ /* ok */ +#define __NR_clock_nanosleep	(__NR_timer_create+8) /* 267 */ /* ok */ +#define __NR_statfs64		268 /* ok */ +#define __NR_fstatfs64		269 /* ok */ +#define __NR_tgkill		270 /* ok */ +#define __NR_utimes		271 /* obsolete -> sys_futimesat */ +#define __NR_fadvise64_64	272 /* ok */ +#define __NR_vserver		273 /* ok */ +#define __NR_mbind		274 /* only for mmu */ +#define __NR_get_mempolicy	275 /* only for mmu */ +#define __NR_set_mempolicy	276 /* only for mmu */ +#define __NR_mq_open		277 /* ok */ +#define __NR_mq_unlink		(__NR_mq_open+1) /* 278 */ /* ok */ +#define __NR_mq_timedsend	(__NR_mq_open+2) /* 279 */ /* ok */ +#define __NR_mq_timedreceive	(__NR_mq_open+3) /* 280 */ /* ok */ +#define __NR_mq_notify		(__NR_mq_open+4) /* 281 */ /* ok */ +#define __NR_mq_getsetattr	(__NR_mq_open+5) /* 282 */ /* ok */ +#define __NR_kexec_load		283 /* ok */ +#define __NR_waitid		284 /* ok */ +/* #define __NR_sys_setaltroot	285 */ +#define __NR_add_key		286 /* ok */ +#define __NR_request_key	287 /* ok */ +#define __NR_keyctl		288 /* ok */ +#define __NR_ioprio_set		289 /* ok */ +#define __NR_ioprio_get		290 /* ok */ +#define __NR_inotify_init	291 /* ok */ +#define __NR_inotify_add_watch	292 /* ok */ +#define __NR_inotify_rm_watch	293 /* ok */ +#define __NR_migrate_pages	294 /* mmu */ +#define __NR_openat		295 /* ok */ +#define __NR_mkdirat		296 /* ok */ +#define __NR_mknodat		297 /* ok */ +#define __NR_fchownat		298 /* ok */ +#define __NR_futimesat		299 /* obsolete -> sys_utimesat */ +#define __NR_fstatat64		300 /* stat64 */ +#define __NR_unlinkat		301 /* ok */ +#define __NR_renameat		302 /* ok */ +#define __NR_linkat		303 /* ok */ +#define __NR_symlinkat		304 /* ok */ +#define __NR_readlinkat		305 /* ok */ +#define __NR_fchmodat		306 /* ok */ +#define __NR_faccessat		307 /* ok */ +#define __NR_pselect6		308 /* ok */ +#define __NR_ppoll		309 /* ok */ +#define __NR_unshare		310 /* ok */ +#define __NR_set_robust_list	311 /* ok */ +#define __NR_get_robust_list	312 /* ok */ +#define __NR_splice		313 /* ok */ +#define __NR_sync_file_range	314 /* ok */ +#define __NR_tee		315 /* ok */ +#define __NR_vmsplice		316 /* ok */ +#define __NR_move_pages		317 /* mmu */ +#define __NR_getcpu		318 /* ok */ +#define __NR_epoll_pwait	319 /* ok */ +#define __NR_utimensat		320 /* ok */ +#define __NR_signalfd		321 /* ok */ +#define __NR_timerfd_create	322 /* ok */ +#define __NR_eventfd		323 /* ok */ +#define __NR_fallocate		324 /* ok */ +#define __NR_semtimedop		325 /* ok - semaphore group */ +#define __NR_timerfd_settime	326 /* ok */ +#define __NR_timerfd_gettime	327 /* ok */ +/* sysv ipc syscalls */ +#define __NR_semctl		328 /* ok */ +#define __NR_semget		329 /* ok */ +#define __NR_semop		330 /* ok */ +#define __NR_msgctl		331 /* ok */ +#define __NR_msgget		332 /* ok */ +#define __NR_msgrcv		333 /* ok */ +#define __NR_msgsnd		334 /* ok */ +#define __NR_shmat		335 /* ok */ +#define __NR_shmctl		336 /* ok */ +#define __NR_shmdt		337 /* ok */ +#define __NR_shmget		338 /* ok */ + + +#define __NR_signalfd4		339 /* new */ +#define __NR_eventfd2		340 /* new */ +#define __NR_epoll_create1	341 /* new */ +#define __NR_dup3		342 /* new */ +#define __NR_pipe2		343 /* new */ +#define __NR_inotify_init1	344 /* new */ +#define __NR_socket		345 /* new */ +#define __NR_socketpair		346 /* new */ +#define __NR_bind		347 /* new */ +#define __NR_listen		348 /* new */ +#define __NR_accept		349 /* new */ +#define __NR_connect		350 /* new */ +#define __NR_getsockname	351 /* new */ +#define __NR_getpeername	352 /* new */ +#define __NR_sendto		353 /* new */ +#define __NR_send		354 /* new */ +#define __NR_recvfrom		355 /* new */ +#define __NR_recv		356 /* new */ +#define __NR_setsockopt		357 /* new */ +#define __NR_getsockopt		358 /* new */ +#define __NR_shutdown		359 /* new */ +#define __NR_sendmsg		360 /* new */ +#define __NR_recvmsg		361 /* new */ +#define __NR_accept4		362 /* new */ +#define __NR_preadv		363 /* new */ +#define __NR_pwritev		364 /* new */ +#define __NR_rt_tgsigqueueinfo	365 /* new */ +#define __NR_perf_event_open	366 /* new */ +#define __NR_recvmmsg		367 /* new */ +#define __NR_fanotify_init	368 +#define __NR_fanotify_mark	369 +#define __NR_prlimit64		370 +#define __NR_name_to_handle_at	371 +#define __NR_open_by_handle_at	372 +#define __NR_clock_adjtime	373 +#define __NR_syncfs		374 +#define __NR_setns		375 +#define __NR_sendmmsg		376 +#define __NR_process_vm_readv	377 +#define __NR_process_vm_writev	378 +#define __NR_kcmp		379 +#define __NR_finit_module	380 +#define __NR_sched_setattr	381 +#define __NR_sched_getattr	382 + +#endif /* _UAPI_ASM_MICROBLAZE_UNISTD_H */ diff --git a/arch/microblaze/kernel/.gitignore b/arch/microblaze/kernel/.gitignore new file mode 100644 index 00000000000..c5f676c3c22 --- /dev/null +++ b/arch/microblaze/kernel/.gitignore @@ -0,0 +1 @@ +vmlinux.lds diff --git a/arch/microblaze/kernel/Makefile b/arch/microblaze/kernel/Makefile index f0cb5c26c81..08d50cc55e7 100644 --- a/arch/microblaze/kernel/Makefile +++ b/arch/microblaze/kernel/Makefile @@ -7,22 +7,21 @@ ifdef CONFIG_FUNCTION_TRACER  CFLAGS_REMOVE_timer.o = -pg  CFLAGS_REMOVE_intc.o = -pg  CFLAGS_REMOVE_early_printk.o = -pg -CFLAGS_REMOVE_selfmod.o = -pg  CFLAGS_REMOVE_heartbeat.o = -pg  CFLAGS_REMOVE_ftrace.o = -pg +CFLAGS_REMOVE_process.o = -pg  endif  extra-y := head.o vmlinux.lds  obj-y += dma.o exceptions.o \ -	hw_exception_handler.o init_task.o intc.o irq.o \ -	process.o prom.o prom_parse.o ptrace.o \ +	hw_exception_handler.o intc.o irq.o \ +	platform.o process.o prom.o prom_parse.o ptrace.o \  	reset.o setup.o signal.o sys_microblaze.o timer.o traps.o unwind.o  obj-y += cpu/  obj-$(CONFIG_EARLY_PRINTK)	+= early_printk.o -obj-$(CONFIG_SELFMOD)		+= selfmod.o  obj-$(CONFIG_HEART_BEAT)	+= heartbeat.o  obj-$(CONFIG_MODULES)		+= microblaze_ksyms.o module.o  obj-$(CONFIG_MMU)		+= misc.o diff --git a/arch/microblaze/kernel/cpu/Makefile b/arch/microblaze/kernel/cpu/Makefile index 59cc7bceaf8..fceed4edea4 100644 --- a/arch/microblaze/kernel/cpu/Makefile +++ b/arch/microblaze/kernel/cpu/Makefile @@ -6,7 +6,7 @@ ifdef CONFIG_FUNCTION_TRACER  CFLAGS_REMOVE_cache.o = -pg  endif -EXTRA_CFLAGS += -DCPU_MAJOR=$(CPU_MAJOR) -DCPU_MINOR=$(CPU_MINOR) \ +ccflags-y := -DCPU_MAJOR=$(CPU_MAJOR) -DCPU_MINOR=$(CPU_MINOR) \  		-DCPU_REV=$(CPU_REV)  obj-y += cache.o cpuinfo.o cpuinfo-pvr-full.o cpuinfo-static.o mb.o pvr.o diff --git a/arch/microblaze/kernel/cpu/cache.c b/arch/microblaze/kernel/cpu/cache.c index 109876e8d64..a6e44410672 100644 --- a/arch/microblaze/kernel/cpu/cache.c +++ b/arch/microblaze/kernel/cpu/cache.c @@ -17,82 +17,70 @@  static inline void __enable_icache_msr(void)  { -	__asm__ __volatile__ ("	msrset	r0, %0;		\ -				nop; "			\ +	__asm__ __volatile__ ("	 msrset	r0, %0;"	\ +				"nop;"			\  			: : "i" (MSR_ICE) : "memory");  }  static inline void __disable_icache_msr(void)  { -	__asm__ __volatile__ ("	msrclr	r0, %0;		\ -				nop; "			\ +	__asm__ __volatile__ ("	 msrclr	r0, %0;"	\ +				"nop;"			\  			: : "i" (MSR_ICE) : "memory");  }  static inline void __enable_dcache_msr(void)  { -	__asm__ __volatile__ ("	msrset	r0, %0;		\ -				nop; "			\ -				:			\ -				: "i" (MSR_DCE)		\ -				: "memory"); +	__asm__ __volatile__ ("	 msrset	r0, %0;"	\ +				"nop;"			\ +			: : "i" (MSR_DCE) : "memory");  }  static inline void __disable_dcache_msr(void)  { -	__asm__ __volatile__ ("	msrclr	r0, %0;		\ -				nop; "			\ -				:			\ -				: "i" (MSR_DCE)		\ -				: "memory"); +	__asm__ __volatile__ ("	 msrclr	r0, %0;"	\ +				"nop; "			\ +			: : "i" (MSR_DCE) : "memory");  }  static inline void __enable_icache_nomsr(void)  { -	__asm__ __volatile__ ("	mfs	r12, rmsr;	\ -				nop;			\ -				ori	r12, r12, %0;	\ -				mts	rmsr, r12;	\ -				nop; "			\ -				:			\ -				: "i" (MSR_ICE)		\ -				: "memory", "r12"); +	__asm__ __volatile__ ("	 mfs	r12, rmsr;"	\ +				"nop;"			\ +				"ori	r12, r12, %0;"	\ +				"mts	rmsr, r12;"	\ +				"nop;"			\ +			: : "i" (MSR_ICE) : "memory", "r12");  }  static inline void __disable_icache_nomsr(void)  { -	__asm__ __volatile__ ("	mfs	r12, rmsr;	\ -				nop;			\ -				andi	r12, r12, ~%0;	\ -				mts	rmsr, r12;	\ -				nop; "			\ -				:			\ -				: "i" (MSR_ICE)		\ -				: "memory", "r12"); +	__asm__ __volatile__ ("	 mfs	r12, rmsr;"	\ +				"nop;"			\ +				"andi	r12, r12, ~%0;"	\ +				"mts	rmsr, r12;"	\ +				"nop;"			\ +			: : "i" (MSR_ICE) : "memory", "r12");  }  static inline void __enable_dcache_nomsr(void)  { -	__asm__ __volatile__ ("	mfs	r12, rmsr;	\ -				nop;			\ -				ori	r12, r12, %0;	\ -				mts	rmsr, r12;	\ -				nop; "			\ -				:			\ -				: "i" (MSR_DCE)		\ -				: "memory", "r12"); +	__asm__ __volatile__ ("	 mfs	r12, rmsr;"	\ +				"nop;"			\ +				"ori	r12, r12, %0;"	\ +				"mts	rmsr, r12;"	\ +				"nop;"			\ +			: : "i" (MSR_DCE) : "memory", "r12");  }  static inline void __disable_dcache_nomsr(void)  { -	__asm__ __volatile__ ("	mfs	r12, rmsr;	\ -				nop;			\ -				andi	r12, r12, ~%0;	\ -				mts	rmsr, r12;	\ -				nop; "			\ -				:			\ -				: "i" (MSR_DCE)		\ -				: "memory", "r12"); +	__asm__ __volatile__ ("	 mfs	r12, rmsr;"	\ +				"nop;"			\ +				"andi	r12, r12, ~%0;"	\ +				"mts	rmsr, r12;"	\ +				"nop;"			\ +			: : "i" (MSR_DCE) : "memory", "r12");  } @@ -106,7 +94,7 @@ do {									\  	int align = ~(cache_line_length - 1);				\  	end = min(start + cache_size, end);				\  	start &= align;							\ -} while (0); +} while (0)  /*   * Helper macro to loop over the specified cache_size/line_length and @@ -118,18 +106,18 @@ do {									\  	int step = -line_length;					\  	WARN_ON(step >= 0);						\  									\ -	__asm__ __volatile__ (" 1:      " #op " %0, r0;			\ -					bgtid   %0, 1b;			\ -					addk    %0, %0, %1;		\ -					" : : "r" (len), "r" (step)	\ +	__asm__ __volatile__ (" 1:      " #op " %0, r0;"		\ +					"bgtid   %0, 1b;"		\ +					"addk    %0, %0, %1;"		\ +					: : "r" (len), "r" (step)	\  					: "memory");			\ -} while (0); +} while (0)  /* Used for wdc.flush/clear which can use rB for offset which is not possible   * to use for simple wdc or wic.   *   * start address is cache aligned - * end address is not aligned, if end is aligned then I have to substract + * end address is not aligned, if end is aligned then I have to subtract   * cacheline length because I can't flush/invalidate the next cacheline.   * If is not, I align it because I will flush/invalidate whole line.   */ @@ -142,28 +130,28 @@ do {									\  	count = end - start;						\  	WARN_ON(count < 0);						\  									\ -	__asm__ __volatile__ (" 1:	" #op "	%0, %1;			\ -					bgtid	%1, 1b;			\ -					addk	%1, %1, %2;		\ -					" : : "r" (start), "r" (count),	\ +	__asm__ __volatile__ (" 1:	" #op "	%0, %1;"		\ +					"bgtid	%1, 1b;"		\ +					"addk	%1, %1, %2;"		\ +					: : "r" (start), "r" (count),	\  					"r" (step) : "memory");		\ -} while (0); +} while (0)  /* It is used only first parameter for OP - for wic, wdc */  #define CACHE_RANGE_LOOP_1(start, end, line_length, op)			\  do {									\ -	int volatile temp;						\ +	int volatile temp = 0;						\  	int align = ~(line_length - 1);					\  	end = ((end & align) == end) ? end - line_length : end & align;	\  	WARN_ON(end - start < 0);					\  									\ -	__asm__ __volatile__ (" 1:	" #op "	%1, r0;			\ -					cmpu	%0, %1, %2;		\ -					bgtid	%0, 1b;			\ -					addk	%1, %1, %3;		\ -				" : : "r" (temp), "r" (start), "r" (end),\ +	__asm__ __volatile__ (" 1:	" #op "	%1, r0;"		\ +					"cmpu	%0, %1, %2;"		\ +					"bgtid	%0, 1b;"		\ +					"addk	%1, %1, %3;"		\ +				: : "r" (temp), "r" (start), "r" (end),	\  					"r" (line_length) : "memory");	\ -} while (0); +} while (0)  #define ASM_LOOP @@ -352,7 +340,7 @@ static void __invalidate_dcache_all_noirq_wt(void)  #endif  	pr_debug("%s\n", __func__);  #ifdef ASM_LOOP -	CACHE_ALL_LOOP(cpuinfo.dcache_size, cpuinfo.dcache_line_length, wdc) +	CACHE_ALL_LOOP(cpuinfo.dcache_size, cpuinfo.dcache_line_length, wdc);  #else  	for (i = 0; i < cpuinfo.dcache_size;  		 i += cpuinfo.dcache_line_length) @@ -361,7 +349,8 @@ static void __invalidate_dcache_all_noirq_wt(void)  #endif  } -/* FIXME It is blindly invalidation as is expected +/* + * FIXME It is blindly invalidation as is expected   * but can't be called on noMMU in microblaze_cache_init below   *   * MS: noMMU kernel won't boot if simple wdc is used @@ -375,7 +364,7 @@ static void __invalidate_dcache_all_wb(void)  	pr_debug("%s\n", __func__);  #ifdef ASM_LOOP  	CACHE_ALL_LOOP(cpuinfo.dcache_size, cpuinfo.dcache_line_length, -					wdc) +					wdc);  #else  	for (i = 0; i < cpuinfo.dcache_size;  		 i += cpuinfo.dcache_line_length) @@ -519,7 +508,7 @@ static void __flush_dcache_range_wb(unsigned long start, unsigned long end)  struct scache *mbc;  /* new wb cache model */ -const struct scache wb_msr = { +static const struct scache wb_msr = {  	.ie = __enable_icache_msr,  	.id = __disable_icache_msr,  	.ifl = __flush_icache_all_noirq, @@ -535,7 +524,7 @@ const struct scache wb_msr = {  };  /* There is only difference in ie, id, de, dd functions */ -const struct scache wb_nomsr = { +static const struct scache wb_nomsr = {  	.ie = __enable_icache_nomsr,  	.id = __disable_icache_nomsr,  	.ifl = __flush_icache_all_noirq, @@ -551,7 +540,7 @@ const struct scache wb_nomsr = {  };  /* Old wt cache model with disabling irq and turn off cache */ -const struct scache wt_msr = { +static const struct scache wt_msr = {  	.ie = __enable_icache_msr,  	.id = __disable_icache_msr,  	.ifl = __flush_icache_all_msr_irq, @@ -566,7 +555,7 @@ const struct scache wt_msr = {  	.dinr = __invalidate_dcache_range_msr_irq_wt,  }; -const struct scache wt_nomsr = { +static const struct scache wt_nomsr = {  	.ie = __enable_icache_nomsr,  	.id = __disable_icache_nomsr,  	.ifl = __flush_icache_all_nomsr_irq, @@ -582,7 +571,7 @@ const struct scache wt_nomsr = {  };  /* New wt cache model for newer Microblaze versions */ -const struct scache wt_msr_noirq = { +static const struct scache wt_msr_noirq = {  	.ie = __enable_icache_msr,  	.id = __disable_icache_msr,  	.ifl = __flush_icache_all_noirq, @@ -597,7 +586,7 @@ const struct scache wt_msr_noirq = {  	.dinr = __invalidate_dcache_range_nomsr_wt,  }; -const struct scache wt_nomsr_noirq = { +static const struct scache wt_nomsr_noirq = {  	.ie = __enable_icache_nomsr,  	.id = __disable_icache_nomsr,  	.ifl = __flush_icache_all_noirq, @@ -616,49 +605,48 @@ const struct scache wt_nomsr_noirq = {  #define CPUVER_7_20_A	0x0c  #define CPUVER_7_20_D	0x0f -#define INFO(s)	printk(KERN_INFO "cache: " s "\n"); -  void microblaze_cache_init(void)  {  	if (cpuinfo.use_instr & PVR2_USE_MSR_INSTR) {  		if (cpuinfo.dcache_wb) { -			INFO("wb_msr"); +			pr_info("wb_msr\n");  			mbc = (struct scache *)&wb_msr; -			if (cpuinfo.ver_code < CPUVER_7_20_D) { +			if (cpuinfo.ver_code <= CPUVER_7_20_D) {  				/* MS: problem with signal handling - hw bug */ -				INFO("WB won't work properly"); +				pr_info("WB won't work properly\n");  			}  		} else {  			if (cpuinfo.ver_code >= CPUVER_7_20_A) { -				INFO("wt_msr_noirq"); +				pr_info("wt_msr_noirq\n");  				mbc = (struct scache *)&wt_msr_noirq;  			} else { -				INFO("wt_msr"); +				pr_info("wt_msr\n");  				mbc = (struct scache *)&wt_msr;  			}  		}  	} else {  		if (cpuinfo.dcache_wb) { -			INFO("wb_nomsr"); +			pr_info("wb_nomsr\n");  			mbc = (struct scache *)&wb_nomsr; -			if (cpuinfo.ver_code < CPUVER_7_20_D) { +			if (cpuinfo.ver_code <= CPUVER_7_20_D) {  				/* MS: problem with signal handling - hw bug */ -				INFO("WB won't work properly"); +				pr_info("WB won't work properly\n");  			}  		} else {  			if (cpuinfo.ver_code >= CPUVER_7_20_A) { -				INFO("wt_nomsr_noirq"); +				pr_info("wt_nomsr_noirq\n");  				mbc = (struct scache *)&wt_nomsr_noirq;  			} else { -				INFO("wt_nomsr"); +				pr_info("wt_nomsr\n");  				mbc = (struct scache *)&wt_nomsr;  			}  		}  	} -/* FIXME Invalidation is done in U-BOOT - * WT cache: Data is already written to main memory - * WB cache: Discard data on noMMU which caused that kernel doesn't boot - */ +	/* +	 * FIXME Invalidation is done in U-BOOT +	 * WT cache: Data is already written to main memory +	 * WB cache: Discard data on noMMU which caused that kernel doesn't boot +	 */  	/* invalidate_dcache(); */  	enable_dcache(); diff --git a/arch/microblaze/kernel/cpu/cpuinfo-pvr-full.c b/arch/microblaze/kernel/cpu/cpuinfo-pvr-full.c index f70a6047f08..93c26cf50de 100644 --- a/arch/microblaze/kernel/cpu/cpuinfo-pvr-full.c +++ b/arch/microblaze/kernel/cpu/cpuinfo-pvr-full.c @@ -27,7 +27,7 @@  	early_printk("ERROR: Microblaze " x "-different for PVR and DTS\n");  #else  #define err_printk(x) \ -	printk(KERN_INFO "ERROR: Microblaze " x "-different for PVR and DTS\n"); +	pr_info("ERROR: Microblaze " x "-different for PVR and DTS\n");  #endif  void set_cpuinfo_pvr_full(struct cpuinfo *ci, struct device_node *cpu) @@ -38,12 +38,11 @@ void set_cpuinfo_pvr_full(struct cpuinfo *ci, struct device_node *cpu)  	CI(ver_code, VERSION);  	if (!ci->ver_code) { -		printk(KERN_ERR "ERROR: MB has broken PVR regs " -						"-> use DTS setting\n"); +		pr_err("ERROR: MB has broken PVR regs -> use DTS setting\n");  		return;  	} -	temp = PVR_USE_BARREL(pvr) | PVR_USE_MSR_INSTR(pvr) |\ +	temp = PVR_USE_BARREL(pvr) | PVR_USE_MSR_INSTR(pvr) |  		PVR_USE_PCMP_INSTR(pvr) | PVR_USE_DIV(pvr);  	if (ci->use_instr != temp)  		err_printk("BARREL, MSR, PCMP or DIV"); @@ -59,19 +58,20 @@ void set_cpuinfo_pvr_full(struct cpuinfo *ci, struct device_node *cpu)  		err_printk("HW_FPU");  	ci->use_fpu = temp; -	ci->use_exc = PVR_OPCODE_0x0_ILLEGAL(pvr) |\ -			PVR_UNALIGNED_EXCEPTION(pvr) |\ -			PVR_ILL_OPCODE_EXCEPTION(pvr) |\ -			PVR_IOPB_BUS_EXCEPTION(pvr) |\ -			PVR_DOPB_BUS_EXCEPTION(pvr) |\ -			PVR_DIV_ZERO_EXCEPTION(pvr) |\ -			PVR_FPU_EXCEPTION(pvr) |\ +	ci->use_exc = PVR_OPCODE_0x0_ILLEGAL(pvr) | +			PVR_UNALIGNED_EXCEPTION(pvr) | +			PVR_ILL_OPCODE_EXCEPTION(pvr) | +			PVR_IOPB_BUS_EXCEPTION(pvr) | +			PVR_DOPB_BUS_EXCEPTION(pvr) | +			PVR_DIV_ZERO_EXCEPTION(pvr) | +			PVR_FPU_EXCEPTION(pvr) |  			PVR_FSL_EXCEPTION(pvr);  	CI(pvr_user1, USER1);  	CI(pvr_user2, USER2);  	CI(mmu, USE_MMU); +	CI(mmu_privins, MMU_PRIVINS);  	CI(endian, ENDIAN);  	CI(use_icache, USE_ICACHE); @@ -112,7 +112,4 @@ void set_cpuinfo_pvr_full(struct cpuinfo *ci, struct device_node *cpu)  	CI(num_wr_brk, NUMBER_OF_WR_ADDR_BRK);  	CI(fpga_family_code, TARGET_FAMILY); - -	/* take timebase-frequency from DTS */ -	ci->cpu_clock_freq = fcpu(cpu, "timebase-frequency");  } diff --git a/arch/microblaze/kernel/cpu/cpuinfo-static.c b/arch/microblaze/kernel/cpu/cpuinfo-static.c index b16b994ca3d..4854285b26e 100644 --- a/arch/microblaze/kernel/cpu/cpuinfo-static.c +++ b/arch/microblaze/kernel/cpu/cpuinfo-static.c @@ -113,12 +113,11 @@ void __init set_cpuinfo_static(struct cpuinfo *ci, struct device_node *cpu)  	ci->num_rd_brk = fcpu(cpu, "xlnx,number-of-rd-addr-brk");  	ci->num_wr_brk = fcpu(cpu, "xlnx,number-of-wr-addr-brk"); -	ci->cpu_clock_freq = fcpu(cpu, "timebase-frequency"); -  	ci->pvr_user1 = fcpu(cpu, "xlnx,pvr-user1");  	ci->pvr_user2 = fcpu(cpu, "xlnx,pvr-user2");  	ci->mmu = fcpu(cpu, "xlnx,use-mmu"); +	ci->mmu_privins = fcpu(cpu, "xlnx,mmu-privileged-instr");  	ci->endian = fcpu(cpu, "xlnx,endianness");  	ci->ver_code = 0; diff --git a/arch/microblaze/kernel/cpu/cpuinfo.c b/arch/microblaze/kernel/cpu/cpuinfo.c index 87c79fa275c..234acad79b9 100644 --- a/arch/microblaze/kernel/cpu/cpuinfo.c +++ b/arch/microblaze/kernel/cpu/cpuinfo.c @@ -8,6 +8,7 @@   * for more details.   */ +#include <linux/clk.h>  #include <linux/init.h>  #include <asm/cpuinfo.h>  #include <asm/pvr.h> @@ -32,6 +33,16 @@ const struct cpu_ver_key cpu_ver_lookup[] = {  	{"7.30.a", 0x10},  	{"7.30.b", 0x11},  	{"8.00.a", 0x12}, +	{"8.00.b", 0x13}, +	{"8.10.a", 0x14}, +	{"8.20.a", 0x15}, +	{"8.20.b", 0x16}, +	{"8.30.a", 0x17}, +	{"8.40.a", 0x18}, +	{"8.40.b", 0x19}, +	{"8.50.a", 0x1a}, +	{"9.0", 0x1b}, +	{"9.1", 0x1d},  	{NULL, 0},  }; @@ -52,38 +63,62 @@ const struct family_string_key family_string_lookup[] = {  	{"virtex6", 0xe},  	/* FIXME There is no key code defined for spartan2 */  	{"spartan2", 0xf0}, +	{"kintex7", 0x10}, +	{"artix7", 0x11}, +	{"zynq7000", 0x12},  	{NULL, 0},  };  struct cpuinfo cpuinfo; +static struct device_node *cpu;  void __init setup_cpuinfo(void)  { -	struct device_node *cpu = NULL; -  	cpu = (struct device_node *) of_find_node_by_type(NULL, "cpu");  	if (!cpu) -		printk(KERN_ERR "You don't have cpu!!!\n"); +		pr_err("You don't have cpu!!!\n"); -	printk(KERN_INFO "%s: initialising\n", __func__); +	pr_info("%s: initialising\n", __func__);  	switch (cpu_has_pvr()) {  	case 0: -		printk(KERN_WARNING -			"%s: No PVR support. Using static CPU info from FDT\n", +		pr_warn("%s: No PVR support. Using static CPU info from FDT\n",  			__func__);  		set_cpuinfo_static(&cpuinfo, cpu);  		break;  /* FIXME I found weird behavior with MB 7.00.a/b 7.10.a   * please do not use FULL PVR with MMU */  	case 1: -		printk(KERN_INFO "%s: Using full CPU PVR support\n", +		pr_info("%s: Using full CPU PVR support\n",  			__func__);  		set_cpuinfo_static(&cpuinfo, cpu);  		set_cpuinfo_pvr_full(&cpuinfo, cpu);  		break;  	default: -		printk(KERN_WARNING "%s: Unsupported PVR setting\n", __func__); +		pr_warn("%s: Unsupported PVR setting\n", __func__);  		set_cpuinfo_static(&cpuinfo, cpu);  	} + +	if (cpuinfo.mmu_privins) +		pr_warn("%s: Stream instructions enabled" +			" - USERSPACE CAN LOCK THIS KERNEL!\n", __func__); +} + +void __init setup_cpuinfo_clk(void) +{ +	struct clk *clk; + +	clk = of_clk_get(cpu, 0); +	if (IS_ERR(clk)) { +		pr_err("ERROR: CPU CCF input clock not found\n"); +		/* take timebase-frequency from DTS */ +		cpuinfo.cpu_clock_freq = fcpu(cpu, "timebase-frequency"); +	} else { +		cpuinfo.cpu_clock_freq = clk_get_rate(clk); +	} + +	if (!cpuinfo.cpu_clock_freq) { +		pr_err("ERROR: CPU clock frequency not setup\n"); +		BUG(); +	}  } diff --git a/arch/microblaze/kernel/cpu/mb.c b/arch/microblaze/kernel/cpu/mb.c index b4048af0261..7b5dca7ed39 100644 --- a/arch/microblaze/kernel/cpu/mb.c +++ b/arch/microblaze/kernel/cpu/mb.c @@ -97,6 +97,10 @@ static int show_cpuinfo(struct seq_file *m, void *v)  		(cpuinfo.use_exc & PVR2_FPU_EXC_MASK) ? "fpu " : "",  		(cpuinfo.use_exc & PVR2_USE_FSL_EXC) ? "fsl " : ""); +	count += seq_printf(m, +			"Stream-insns:\t%sprivileged\n", +			cpuinfo.mmu_privins ? "un" : ""); +  	if (cpuinfo.use_icache)  		count += seq_printf(m,  				"Icache:\t\t%ukB\tline length:\t%dB\n", @@ -110,10 +114,11 @@ static int show_cpuinfo(struct seq_file *m, void *v)  				"Dcache:\t\t%ukB\tline length:\t%dB\n",  				cpuinfo.dcache_size >> 10,  				cpuinfo.dcache_line_length); +		seq_printf(m, "Dcache-Policy:\t");  		if (cpuinfo.dcache_wb) -			count += seq_printf(m, "\t\twrite-back\n"); +			count += seq_printf(m, "write-back\n");  		else -			count += seq_printf(m, "\t\twrite-through\n"); +			count += seq_printf(m, "write-through\n");  	} else  		count += seq_printf(m, "Dcache:\t\tno\n"); diff --git a/arch/microblaze/kernel/cpu/pvr.c b/arch/microblaze/kernel/cpu/pvr.c index e01afa68273..8d0dc6db48c 100644 --- a/arch/microblaze/kernel/cpu/pvr.c +++ b/arch/microblaze/kernel/cpu/pvr.c @@ -12,7 +12,6 @@  #include <linux/kernel.h>  #include <linux/compiler.h> -#include <asm/system.h>  #include <asm/exceptions.h>  #include <asm/pvr.h> @@ -27,8 +26,8 @@  	register unsigned tmp __asm__("r3");			\  	tmp = 0x0;	/* Prevent warning about unused */	\  	__asm__ __volatile__ (					\ -			"mfs	%0, rpvr" #pvrid ";"	\ -			: "=r" (tmp) : : "memory"); 		\ +			"mfs	%0, rpvr" #pvrid ";"		\ +			: "=r" (tmp) : : "memory");		\  	val = tmp;						\  } @@ -54,7 +53,7 @@ int cpu_has_pvr(void)  	if (!(flags & PVR_MSR_BIT))  		return 0; -	get_single_pvr(0x00, pvr0); +	get_single_pvr(0, pvr0);  	pr_debug("%s: pvr0 is 0x%08x\n", __func__, pvr0);  	if (pvr0 & PVR0_PVR_FULL_MASK) diff --git a/arch/microblaze/kernel/dma.c b/arch/microblaze/kernel/dma.c index 79c74659f20..4633c36c1b3 100644 --- a/arch/microblaze/kernel/dma.c +++ b/arch/microblaze/kernel/dma.c @@ -10,44 +10,14 @@  #include <linux/dma-mapping.h>  #include <linux/gfp.h>  #include <linux/dma-debug.h> -#include <asm/bug.h> -#include <asm/cacheflush.h> - -/* - * Generic direct DMA implementation - * - * This implementation supports a per-device offset that can be applied if - * the address at which memory is visible to devices is not 0. Platform code - * can set archdata.dma_data to an unsigned long holding the offset. By - * default the offset is PCI_DRAM_OFFSET. - */ -static inline void __dma_sync_page(unsigned long paddr, unsigned long offset, -				size_t size, enum dma_data_direction direction) -{ -	switch (direction) { -	case DMA_TO_DEVICE: -		flush_dcache_range(paddr + offset, paddr + offset + size); -		break; -	case DMA_FROM_DEVICE: -		invalidate_dcache_range(paddr + offset, paddr + offset + size); -		break; -	default: -		BUG(); -	} -} - -static unsigned long get_dma_direct_offset(struct device *dev) -{ -	if (likely(dev)) -		return (unsigned long)dev->archdata.dma_data; - -	return PCI_DRAM_OFFSET; /* FIXME Not sure if is correct */ -} +#include <linux/export.h> +#include <linux/bug.h>  #define NOT_COHERENT_CACHE  static void *dma_direct_alloc_coherent(struct device *dev, size_t size, -				dma_addr_t *dma_handle, gfp_t flag) +				       dma_addr_t *dma_handle, gfp_t flag, +				       struct dma_attrs *attrs)  {  #ifdef NOT_COHERENT_CACHE  	return consistent_alloc(flag, size, dma_handle); @@ -64,14 +34,15 @@ static void *dma_direct_alloc_coherent(struct device *dev, size_t size,  		return NULL;  	ret = page_address(page);  	memset(ret, 0, size); -	*dma_handle = virt_to_phys(ret) + get_dma_direct_offset(dev); +	*dma_handle = virt_to_phys(ret);  	return ret;  #endif  }  static void dma_direct_free_coherent(struct device *dev, size_t size, -			      void *vaddr, dma_addr_t dma_handle) +				     void *vaddr, dma_addr_t dma_handle, +				     struct dma_attrs *attrs)  {  #ifdef NOT_COHERENT_CACHE  	consistent_free(size, vaddr); @@ -89,20 +60,14 @@ static int dma_direct_map_sg(struct device *dev, struct scatterlist *sgl,  	/* FIXME this part of code is untested */  	for_each_sg(sgl, sg, nents, i) { -		sg->dma_address = sg_phys(sg) + get_dma_direct_offset(dev); -		__dma_sync_page(page_to_phys(sg_page(sg)), sg->offset, +		sg->dma_address = sg_phys(sg); +		__dma_sync(page_to_phys(sg_page(sg)) + sg->offset,  							sg->length, direction);  	}  	return nents;  } -static void dma_direct_unmap_sg(struct device *dev, struct scatterlist *sg, -				int nents, enum dma_data_direction direction, -				struct dma_attrs *attrs) -{ -} -  static int dma_direct_dma_supported(struct device *dev, u64 mask)  {  	return 1; @@ -115,8 +80,8 @@ static inline dma_addr_t dma_direct_map_page(struct device *dev,  					     enum dma_data_direction direction,  					     struct dma_attrs *attrs)  { -	__dma_sync_page(page_to_phys(page), offset, size, direction); -	return page_to_phys(page) + offset + get_dma_direct_offset(dev); +	__dma_sync(page_to_phys(page) + offset, size, direction); +	return page_to_phys(page) + offset;  }  static inline void dma_direct_unmap_page(struct device *dev, @@ -130,17 +95,76 @@ static inline void dma_direct_unmap_page(struct device *dev,   * phys_to_virt is here because in __dma_sync_page is __virt_to_phys and   * dma_address is physical address   */ -	__dma_sync_page(dma_address, 0 , size, direction); +	__dma_sync(dma_address, size, direction); +} + +static inline void +dma_direct_sync_single_for_cpu(struct device *dev, +			       dma_addr_t dma_handle, size_t size, +			       enum dma_data_direction direction) +{ +	/* +	 * It's pointless to flush the cache as the memory segment +	 * is given to the CPU +	 */ + +	if (direction == DMA_FROM_DEVICE) +		__dma_sync(dma_handle, size, direction); +} + +static inline void +dma_direct_sync_single_for_device(struct device *dev, +				  dma_addr_t dma_handle, size_t size, +				  enum dma_data_direction direction) +{ +	/* +	 * It's pointless to invalidate the cache if the device isn't +	 * supposed to write to the relevant region +	 */ + +	if (direction == DMA_TO_DEVICE) +		__dma_sync(dma_handle, size, direction); +} + +static inline void +dma_direct_sync_sg_for_cpu(struct device *dev, +			   struct scatterlist *sgl, int nents, +			   enum dma_data_direction direction) +{ +	struct scatterlist *sg; +	int i; + +	/* FIXME this part of code is untested */ +	if (direction == DMA_FROM_DEVICE) +		for_each_sg(sgl, sg, nents, i) +			__dma_sync(sg->dma_address, sg->length, direction); +} + +static inline void +dma_direct_sync_sg_for_device(struct device *dev, +			      struct scatterlist *sgl, int nents, +			      enum dma_data_direction direction) +{ +	struct scatterlist *sg; +	int i; + +	/* FIXME this part of code is untested */ +	if (direction == DMA_TO_DEVICE) +		for_each_sg(sgl, sg, nents, i) +			__dma_sync(sg->dma_address, sg->length, direction);  }  struct dma_map_ops dma_direct_ops = { -	.alloc_coherent	= dma_direct_alloc_coherent, -	.free_coherent	= dma_direct_free_coherent, +	.alloc		= dma_direct_alloc_coherent, +	.free		= dma_direct_free_coherent,  	.map_sg		= dma_direct_map_sg, -	.unmap_sg	= dma_direct_unmap_sg,  	.dma_supported	= dma_direct_dma_supported,  	.map_page	= dma_direct_map_page,  	.unmap_page	= dma_direct_unmap_page, +	.sync_single_for_cpu		= dma_direct_sync_single_for_cpu, +	.sync_single_for_device		= dma_direct_sync_single_for_device, +	.sync_sg_for_cpu		= dma_direct_sync_sg_for_cpu, +	.sync_sg_for_device		= dma_direct_sync_sg_for_device,  };  EXPORT_SYMBOL(dma_direct_ops); @@ -149,8 +173,8 @@ EXPORT_SYMBOL(dma_direct_ops);  static int __init dma_init(void)  { -       dma_debug_init(PREALLOC_DMA_DEBUG_ENTRIES); +	dma_debug_init(PREALLOC_DMA_DEBUG_ENTRIES); -       return 0; +	return 0;  }  fs_initcall(dma_init); diff --git a/arch/microblaze/kernel/early_printk.c b/arch/microblaze/kernel/early_printk.c index c3616a080eb..365f2d53f1b 100644 --- a/arch/microblaze/kernel/early_printk.c +++ b/arch/microblaze/kernel/early_printk.c @@ -21,7 +21,6 @@  #include <asm/setup.h>  #include <asm/prom.h> -static u32 early_console_initialized;  static u32 base_addr;  #ifdef CONFIG_SERIAL_UARTLITE_CONSOLE @@ -35,7 +34,7 @@ static void early_printk_uartlite_putc(char c)  	 * we'll never timeout on a working UART.  	 */ -	unsigned retries = 10000; +	unsigned retries = 1000000;  	/* read status bit - 0x8 offset */  	while (--retries && (in_be32(base_addr + 8) & (1 << 3)))  		; @@ -50,9 +49,9 @@ static void early_printk_uartlite_write(struct console *unused,  					const char *s, unsigned n)  {  	while (*s && n-- > 0) { -		early_printk_uartlite_putc(*s);  		if (*s == '\n')  			early_printk_uartlite_putc('\r'); +		early_printk_uartlite_putc(*s);  		s++;  	}  } @@ -60,7 +59,7 @@ static void early_printk_uartlite_write(struct console *unused,  static struct console early_serial_uartlite_console = {  	.name = "earlyser",  	.write = early_printk_uartlite_write, -	.flags = CON_PRINTBUFFER, +	.flags = CON_PRINTBUFFER | CON_BOOT,  	.index = -1,  };  #endif /* CONFIG_SERIAL_UARTLITE_CONSOLE */ @@ -94,9 +93,9 @@ static void early_printk_uart16550_write(struct console *unused,  					const char *s, unsigned n)  {  	while (*s && n-- > 0) { -		early_printk_uart16550_putc(*s);  		if (*s == '\n')  			early_printk_uart16550_putc('\r'); +		early_printk_uart16550_putc(*s);  		s++;  	}  } @@ -104,76 +103,82 @@ static void early_printk_uart16550_write(struct console *unused,  static struct console early_serial_uart16550_console = {  	.name = "earlyser",  	.write = early_printk_uart16550_write, -	.flags = CON_PRINTBUFFER, +	.flags = CON_PRINTBUFFER | CON_BOOT,  	.index = -1,  };  #endif /* CONFIG_SERIAL_8250_CONSOLE */ -static struct console *early_console; - -void early_printk(const char *fmt, ...) -{ -	char buf[512]; -	int n; -	va_list ap; - -	if (early_console_initialized) { -		va_start(ap, fmt); -		n = vscnprintf(buf, 512, fmt, ap); -		early_console->write(early_console, buf, n); -		va_end(ap); -	} -} -  int __init setup_early_printk(char *opt)  { -	if (early_console_initialized) +	int version = 0; + +	if (early_console)  		return 1; -#ifdef CONFIG_SERIAL_UARTLITE_CONSOLE -	base_addr = early_uartlite_console(); +	base_addr = of_early_console(&version);  	if (base_addr) { -		early_console_initialized = 1;  #ifdef CONFIG_MMU  		early_console_reg_tlb_alloc(base_addr);  #endif -		early_console = &early_serial_uartlite_console; -		early_printk("early_printk_console is enabled at 0x%08x\n", -							base_addr); - -		/* register_console(early_console); */ - -		return 0; -	} -#endif /* CONFIG_SERIAL_UARTLITE_CONSOLE */ - +		switch (version) { +#ifdef CONFIG_SERIAL_UARTLITE_CONSOLE +		case UARTLITE: +			pr_info("Early console on uartlite at 0x%08x\n", +								base_addr); +			early_console = &early_serial_uartlite_console; +			break; +#endif  #ifdef CONFIG_SERIAL_8250_CONSOLE -	base_addr = early_uart16550_console(); -	base_addr &= ~3; /* clear register offset */ -	if (base_addr) { -		early_console_initialized = 1; -#ifdef CONFIG_MMU -		early_console_reg_tlb_alloc(base_addr); +		case UART16550: +			pr_info("Early console on uart16650 at 0x%08x\n", +								base_addr); +			early_console = &early_serial_uart16550_console; +			break;  #endif -		early_console = &early_serial_uart16550_console; - -		early_printk("early_printk_console is enabled at 0x%08x\n", -							base_addr); - -		/* register_console(early_console); */ +		default: +			pr_info("Unsupported early console %d\n", +								version); +			return 1; +		} +		register_console(early_console);  		return 0;  	} -#endif /* CONFIG_SERIAL_8250_CONSOLE */ -  	return 1;  } +/* Remap early console to virtual address and do not allocate one TLB + * only for early console because of performance degression */ +void __init remap_early_printk(void) +{ +	if (!early_console) +		return; +	pr_info("early_printk_console remapping from 0x%x to ", base_addr); +	base_addr = (u32) ioremap(base_addr, PAGE_SIZE); +	pr_cont("0x%x\n", base_addr); + +#ifdef CONFIG_MMU +	/* +	 * Early console is on the top of skipped TLB entries +	 * decrease tlb_skip size ensure that hardcoded TLB entry will be +	 * used by generic algorithm +	 * FIXME check if early console mapping is on the top by rereading +	 * TLB entry and compare baseaddr +	 *  mts  rtlbx, (tlb_skip - 1) +	 *  nop +	 *  mfs  rX, rtlblo +	 *  nop +	 *  cmp rX, orig_base_addr +	 */ +	tlb_skip -= 1; +#endif +} +  void __init disable_early_printk(void)  { -	if (!early_console_initialized || !early_console) +	if (!early_console)  		return; -	printk(KERN_WARNING "disabling early console\n"); +	pr_warn("disabling early console\n");  	unregister_console(early_console); -	early_console_initialized = 0; +	early_console = NULL;  } diff --git a/arch/microblaze/kernel/entry-nommu.S b/arch/microblaze/kernel/entry-nommu.S index ca84368570b..7e394fc2c43 100644 --- a/arch/microblaze/kernel/entry-nommu.S +++ b/arch/microblaze/kernel/entry-nommu.S @@ -115,7 +115,7 @@ ENTRY(_interrupt)  	/* restore r31 */  	lwi	r31, r0, PER_CPU(CURRENT_SAVE)  	/* prepare the link register, the argument and jump */ -	la	r15, r0, ret_from_intr - 8 +	addik	r15, r0, ret_from_intr - 8  	addk	r6, r0, r15  	braid	do_IRQ  	add	r5, r0, r1 @@ -124,6 +124,7 @@ ret_from_intr:  	lwi	r11, r1, PT_MODE  	bneid	r11, no_intr_resched +3:  	lwi	r6, r31, TS_THREAD_INFO	/* get thread info */  	lwi	r19, r6, TI_FLAGS	/* get flags in thread info */  				/* do an extra work if any bits are set */ @@ -132,12 +133,13 @@ ret_from_intr:  	beqi	r11, 1f  	bralid	r15, schedule  	nop -1:	andi	r11, r19, _TIF_SIGPENDING +	bri	3b +1:	andi	r11, r19, _TIF_SIGPENDING | _TIF_NOTIFY_RESUME  	beqid	r11, no_intr_resched  	addk	r5, r1, r0 -	addk	r7, r0, r0 -	bralid	r15, do_signal +	bralid	r15, do_notify_resume  	addk	r6, r0, r0 +	bri	3b  no_intr_resched:  	/* Disable interrupts, we are now committed to the state restore */ @@ -281,9 +283,10 @@ ENTRY(_user_exception)  	/* Figure out which function to use for this system call. */  	/* Note Microblaze barrel shift is optional, so don't rely on it */  	add	r12, r12, r12			/* convert num -> ptr */ +	addik	r30, r0, 1			/* restarts allowed */  	add	r12, r12, r12  	lwi	r12, r12, sys_call_table	/* Get function pointer */ -	la	r15, r0, ret_to_user-8		/* set return address */ +	addik	r15, r0, ret_to_user-8		/* set return address */  	bra	r12				/* Make the system call. */  	bri	0				/* won't reach here */  1: @@ -292,8 +295,8 @@ ENTRY(_user_exception)  /*   * Debug traps are like a system call, but entered via brki r14, 0x60 - * All we need to do is send the SIGTRAP signal to current, ptrace and do_signal - * will handle the rest + * All we need to do is send the SIGTRAP signal to current, ptrace and + * do_notify_resume will handle the rest   */  ENTRY(_debug_exception)  	swi	r1, r0, PER_CPU(ENTRY_SP)	/* save the current sp */ @@ -370,6 +373,7 @@ ENTRY(_debug_exception)  	bralid	r15, send_sig  	add	r7, r0, r0			/* 3rd param zero */ +	addik	r30, r0, 1			/* restarts allowed ??? */  	/* Restore r3/r4 to work around how ret_to_user works */  	lwi	r3, r1, PT_R3  	lwi	r4, r1, PT_R4 @@ -466,7 +470,6 @@ ENTRY(_switch_to)  ENTRY(ret_from_fork)  	addk	r5, r0, r3 -	addk	r6, r0, r1  	brlid	r15, schedule_tail  	nop  	swi	r31, r1, PT_R31		/* save r31 in user context. */ @@ -475,20 +478,35 @@ ENTRY(ret_from_fork)  	brid	ret_to_user  	nop +ENTRY(ret_from_kernel_thread) +	brlid	r15, schedule_tail +	addk	r5, r0, r3 +	brald	r15, r20 +	addk	r5, r0, r19 +	brid	ret_to_user +	addk	r3, r0, r0 +  work_pending: +	lwi	r11, r1, PT_MODE +	bneid	r11, 2f +3:  	enable_irq -  	andi	r11, r19, _TIF_NEED_RESCHED  	beqi	r11, 1f  	bralid	r15, schedule  	nop -1:	andi	r11, r19, _TIF_SIGPENDING +	bri	4f +1:	andi	r11, r19, _TIF_SIGPENDING | _TIF_NOTIFY_RESUME  	beqi	r11, no_work_pending -	addk	r5, r1, r0 -	addik	r7, r0, 1 -	bralid	r15, do_signal -	addk	r6, r0, r0 -	bri	no_work_pending +	addk	r5, r30, r0 +	bralid	r15, do_notify_resume +	addik	r6, r0, 1 +	addk	r30, r0, r0	/* no restarts from now on */ +4: +	disable_irq +	lwi	r6, r31, TS_THREAD_INFO /* get thread info */ +	lwi	r19, r6, TI_FLAGS /* get flags in thread info */ +	bri	3b  ENTRY(ret_to_user)  	disable_irq @@ -502,6 +520,7 @@ ENTRY(ret_to_user)  no_work_pending:  	disable_irq +2:  	/* save r31 */  	swi	r31, r0, PER_CPU(CURRENT_SAVE)  	/* save mode indicator */ @@ -553,26 +572,11 @@ no_work_pending:  	rtid	r14, 0  	nop -sys_vfork: -	brid	microblaze_vfork -	addk	r5, r1, r0 - -sys_clone: -	brid	microblaze_clone -	addk	r7, r1, r0 - -sys_execve: -	brid	microblaze_execve -	addk	r8, r1, r0 -  sys_rt_sigreturn_wrapper: +	addk	r30, r0, r0		/* no restarts for this one */  	brid	sys_rt_sigreturn  	addk	r5, r1, r0 -sys_rt_sigsuspend_wrapper: -	brid	sys_rt_sigsuspend -	addk	r7, r1, r0 -  	/* Interrupt vector table */  	.section	.init.ivt, "ax"  	.org 0x0 diff --git a/arch/microblaze/kernel/entry.S b/arch/microblaze/kernel/entry.S index 819238b8a42..0536bc021cc 100644 --- a/arch/microblaze/kernel/entry.S +++ b/arch/microblaze/kernel/entry.S @@ -33,11 +33,14 @@  #undef DEBUG -/* The size of a state save frame. */ -#define STATE_SAVE_SIZE		(PT_SIZE + STATE_SAVE_ARG_SPACE) - -/* The offset of the struct pt_regs in a `state save frame' on the stack. */ -#define PTO	STATE_SAVE_ARG_SPACE /* 24 the space for args */ +#ifdef DEBUG +/* Create space for syscalls counting. */ +.section .data +.global syscall_debug_table +.align 4 +syscall_debug_table: +	.space	(__NR_syscalls * 4) +#endif /* DEBUG */  #define C_ENTRY(name)	.globl name; .align 4; name @@ -172,72 +175,72 @@  1:  #define SAVE_REGS \ -	swi	r2, r1, PTO+PT_R2;	/* Save SDA */			\ -	swi	r3, r1, PTO+PT_R3;					\ -	swi	r4, r1, PTO+PT_R4;					\ -	swi	r5, r1, PTO+PT_R5;					\ -	swi	r6, r1, PTO+PT_R6;					\ -	swi	r7, r1, PTO+PT_R7;					\ -	swi	r8, r1, PTO+PT_R8;					\ -	swi	r9, r1, PTO+PT_R9;					\ -	swi	r10, r1, PTO+PT_R10;					\ -	swi	r11, r1, PTO+PT_R11;	/* save clobbered regs after rval */\ -	swi	r12, r1, PTO+PT_R12;					\ -	swi	r13, r1, PTO+PT_R13;	/* Save SDA2 */			\ -	swi	r14, r1, PTO+PT_PC;	/* PC, before IRQ/trap */	\ -	swi	r15, r1, PTO+PT_R15;	/* Save LP */			\ -	swi	r16, r1, PTO+PT_R16;					\ -	swi	r17, r1, PTO+PT_R17;					\ -	swi	r18, r1, PTO+PT_R18;	/* Save asm scratch reg */	\ -	swi	r19, r1, PTO+PT_R19;					\ -	swi	r20, r1, PTO+PT_R20;					\ -	swi	r21, r1, PTO+PT_R21;					\ -	swi	r22, r1, PTO+PT_R22;					\ -	swi	r23, r1, PTO+PT_R23;					\ -	swi	r24, r1, PTO+PT_R24;					\ -	swi	r25, r1, PTO+PT_R25;					\ -	swi	r26, r1, PTO+PT_R26;					\ -	swi	r27, r1, PTO+PT_R27;					\ -	swi	r28, r1, PTO+PT_R28;					\ -	swi	r29, r1, PTO+PT_R29;					\ -	swi	r30, r1, PTO+PT_R30;					\ -	swi	r31, r1, PTO+PT_R31;	/* Save current task reg */	\ +	swi	r2, r1, PT_R2;	/* Save SDA */			\ +	swi	r3, r1, PT_R3;					\ +	swi	r4, r1, PT_R4;					\ +	swi	r5, r1, PT_R5;					\ +	swi	r6, r1, PT_R6;					\ +	swi	r7, r1, PT_R7;					\ +	swi	r8, r1, PT_R8;					\ +	swi	r9, r1, PT_R9;					\ +	swi	r10, r1, PT_R10;					\ +	swi	r11, r1, PT_R11;	/* save clobbered regs after rval */\ +	swi	r12, r1, PT_R12;					\ +	swi	r13, r1, PT_R13;	/* Save SDA2 */			\ +	swi	r14, r1, PT_PC;	/* PC, before IRQ/trap */	\ +	swi	r15, r1, PT_R15;	/* Save LP */			\ +	swi	r16, r1, PT_R16;					\ +	swi	r17, r1, PT_R17;					\ +	swi	r18, r1, PT_R18;	/* Save asm scratch reg */	\ +	swi	r19, r1, PT_R19;					\ +	swi	r20, r1, PT_R20;					\ +	swi	r21, r1, PT_R21;					\ +	swi	r22, r1, PT_R22;					\ +	swi	r23, r1, PT_R23;					\ +	swi	r24, r1, PT_R24;					\ +	swi	r25, r1, PT_R25;					\ +	swi	r26, r1, PT_R26;					\ +	swi	r27, r1, PT_R27;					\ +	swi	r28, r1, PT_R28;					\ +	swi	r29, r1, PT_R29;					\ +	swi	r30, r1, PT_R30;					\ +	swi	r31, r1, PT_R31;	/* Save current task reg */	\  	mfs	r11, rmsr;		/* save MSR */			\ -	swi	r11, r1, PTO+PT_MSR; +	swi	r11, r1, PT_MSR;  #define RESTORE_REGS \ -	lwi	r11, r1, PTO+PT_MSR;					\ +	lwi	r11, r1, PT_MSR;					\  	mts	rmsr , r11;						\ -	lwi	r2, r1, PTO+PT_R2;	/* restore SDA */		\ -	lwi	r3, r1, PTO+PT_R3;					\ -	lwi	r4, r1, PTO+PT_R4;					\ -	lwi	r5, r1, PTO+PT_R5;					\ -	lwi	r6, r1, PTO+PT_R6;					\ -	lwi	r7, r1, PTO+PT_R7;					\ -	lwi	r8, r1, PTO+PT_R8;					\ -	lwi	r9, r1, PTO+PT_R9;					\ -	lwi	r10, r1, PTO+PT_R10;					\ -	lwi	r11, r1, PTO+PT_R11;	/* restore clobbered regs after rval */\ -	lwi	r12, r1, PTO+PT_R12;					\ -	lwi	r13, r1, PTO+PT_R13;	/* restore SDA2 */		\ -	lwi	r14, r1, PTO+PT_PC;	/* RESTORE_LINK PC, before IRQ/trap */\ -	lwi	r15, r1, PTO+PT_R15;	/* restore LP */		\ -	lwi	r16, r1, PTO+PT_R16;					\ -	lwi	r17, r1, PTO+PT_R17;					\ -	lwi	r18, r1, PTO+PT_R18;	/* restore asm scratch reg */	\ -	lwi	r19, r1, PTO+PT_R19;					\ -	lwi	r20, r1, PTO+PT_R20;					\ -	lwi	r21, r1, PTO+PT_R21;					\ -	lwi	r22, r1, PTO+PT_R22;					\ -	lwi	r23, r1, PTO+PT_R23;					\ -	lwi	r24, r1, PTO+PT_R24;					\ -	lwi	r25, r1, PTO+PT_R25;					\ -	lwi	r26, r1, PTO+PT_R26;					\ -	lwi	r27, r1, PTO+PT_R27;					\ -	lwi	r28, r1, PTO+PT_R28;					\ -	lwi	r29, r1, PTO+PT_R29;					\ -	lwi	r30, r1, PTO+PT_R30;					\ -	lwi	r31, r1, PTO+PT_R31;	/* Restore cur task reg */ +	lwi	r2, r1, PT_R2;	/* restore SDA */		\ +	lwi	r3, r1, PT_R3;					\ +	lwi	r4, r1, PT_R4;					\ +	lwi	r5, r1, PT_R5;					\ +	lwi	r6, r1, PT_R6;					\ +	lwi	r7, r1, PT_R7;					\ +	lwi	r8, r1, PT_R8;					\ +	lwi	r9, r1, PT_R9;					\ +	lwi	r10, r1, PT_R10;					\ +	lwi	r11, r1, PT_R11;	/* restore clobbered regs after rval */\ +	lwi	r12, r1, PT_R12;					\ +	lwi	r13, r1, PT_R13;	/* restore SDA2 */		\ +	lwi	r14, r1, PT_PC;	/* RESTORE_LINK PC, before IRQ/trap */\ +	lwi	r15, r1, PT_R15;	/* restore LP */		\ +	lwi	r16, r1, PT_R16;					\ +	lwi	r17, r1, PT_R17;					\ +	lwi	r18, r1, PT_R18;	/* restore asm scratch reg */	\ +	lwi	r19, r1, PT_R19;					\ +	lwi	r20, r1, PT_R20;					\ +	lwi	r21, r1, PT_R21;					\ +	lwi	r22, r1, PT_R22;					\ +	lwi	r23, r1, PT_R23;					\ +	lwi	r24, r1, PT_R24;					\ +	lwi	r25, r1, PT_R25;					\ +	lwi	r26, r1, PT_R26;					\ +	lwi	r27, r1, PT_R27;					\ +	lwi	r28, r1, PT_R28;					\ +	lwi	r29, r1, PT_R29;					\ +	lwi	r30, r1, PT_R30;					\ +	lwi	r31, r1, PT_R31;	/* Restore cur task reg */  #define SAVE_STATE	\  	swi	r1, r0, TOPHYS(PER_CPU(ENTRY_SP)); /* save stack */	\ @@ -250,11 +253,11 @@  	lwi	r1, r0, TOPHYS(PER_CPU(ENTRY_SP));			\  	/* FIXME: I can add these two lines to one */			\  	/* tophys(r1,r1); */						\ -	/* addik	r1, r1, -STATE_SAVE_SIZE; */			\ -	addik	r1, r1, CONFIG_KERNEL_BASE_ADDR - CONFIG_KERNEL_START - STATE_SAVE_SIZE; \ +	/* addik	r1, r1, -PT_SIZE; */				\ +	addik	r1, r1, CONFIG_KERNEL_BASE_ADDR - CONFIG_KERNEL_START - PT_SIZE; \  	SAVE_REGS							\  	brid	2f;							\ -	swi	r1, r1, PTO+PT_MODE; 	 				\ +	swi	r1, r1, PT_MODE; 	 				\  1:	/* User-mode state save.  */					\  	lwi	r1, r0, TOPHYS(PER_CPU(CURRENT_SAVE)); /* get saved current */\  	tophys(r1,r1);							\ @@ -262,12 +265,12 @@  	/* MS these three instructions can be added to one */		\  	/* addik	r1, r1, THREAD_SIZE; */				\  	/* tophys(r1,r1); */						\ -	/* addik	r1, r1, -STATE_SAVE_SIZE; */			\ -	addik r1, r1, THREAD_SIZE + CONFIG_KERNEL_BASE_ADDR - CONFIG_KERNEL_START - STATE_SAVE_SIZE; \ +	/* addik	r1, r1, -PT_SIZE; */			\ +	addik r1, r1, THREAD_SIZE + CONFIG_KERNEL_BASE_ADDR - CONFIG_KERNEL_START - PT_SIZE; \  	SAVE_REGS							\  	lwi	r11, r0, TOPHYS(PER_CPU(ENTRY_SP));			\ -	swi	r11, r1, PTO+PT_R1; /* Store user SP.  */		\ -	swi	r0, r1, PTO + PT_MODE; /* Was in user-mode.  */		\ +	swi	r11, r1, PT_R1; /* Store user SP.  */		\ +	swi	r0, r1, PT_MODE; /* Was in user-mode.  */		\  	/* MS: I am clearing UMS even in case when I come from kernel space */ \  	clear_ums; 							\  2:	lwi	CURRENT_TASK, r0, TOPHYS(PER_CPU(CURRENT_SAVE)); @@ -287,27 +290,28 @@   * are masked. This is nice, means we don't have to CLI before state save   */  C_ENTRY(_user_exception): -	addi	r14, r14, 4	/* return address is 4 byte after call */  	swi	r1, r0, TOPHYS(PER_CPU(ENTRY_SP)) /* save stack */ +	addi	r14, r14, 4	/* return address is 4 byte after call */  	lwi	r1, r0, TOPHYS(PER_CPU(CURRENT_SAVE)); /* get saved current */  	tophys(r1,r1);  	lwi	r1, r1, TS_THREAD_INFO;	/* get stack from task_struct */ -	/* MS these three instructions can be added to one */ -	/* addik	r1, r1, THREAD_SIZE; */ -	/* tophys(r1,r1); */ -	/* addik	r1, r1, -STATE_SAVE_SIZE; */ -	addik r1, r1, THREAD_SIZE + CONFIG_KERNEL_BASE_ADDR - CONFIG_KERNEL_START - STATE_SAVE_SIZE; +/* calculate kernel stack pointer from task struct 8k */ +	addik	r1, r1, THREAD_SIZE; +	tophys(r1,r1); + +	addik	r1, r1, -PT_SIZE; /* Make room on the stack.  */  	SAVE_REGS -	swi	r0, r1, PTO + PT_R3 -	swi	r0, r1, PTO + PT_R4 +	swi	r0, r1, PT_R3 +	swi	r0, r1, PT_R4 +	swi	r0, r1, PT_MODE;			/* Was in user-mode. */  	lwi	r11, r0, TOPHYS(PER_CPU(ENTRY_SP)); -	swi	r11, r1, PTO+PT_R1;		/* Store user SP.  */ +	swi	r11, r1, PT_R1;		/* Store user SP.  */  	clear_ums; -	lwi	CURRENT_TASK, r0, TOPHYS(PER_CPU(CURRENT_SAVE)); +2:	lwi	CURRENT_TASK, r0, TOPHYS(PER_CPU(CURRENT_SAVE));  	/* Save away the syscall number.  */ -	swi	r12, r1, PTO+PT_R0; +	swi	r12, r1, PT_R0;  	tovirt(r1,r1)  /* where the trap should return need -8 to adjust for rtsd r15, 8*/ @@ -326,18 +330,18 @@ C_ENTRY(_user_exception):  	beqi	r11, 4f  	addik	r3, r0, -ENOSYS -	swi	r3, r1, PTO + PT_R3 +	swi	r3, r1, PT_R3  	brlid	r15, do_syscall_trace_enter -	addik	r5, r1, PTO + PT_R0 +	addik	r5, r1, PT_R0  	# do_syscall_trace_enter returns the new syscall nr.  	addk	r12, r0, r3 -	lwi	r5, r1, PTO+PT_R5; -	lwi	r6, r1, PTO+PT_R6; -	lwi	r7, r1, PTO+PT_R7; -	lwi	r8, r1, PTO+PT_R8; -	lwi	r9, r1, PTO+PT_R9; -	lwi	r10, r1, PTO+PT_R10; +	lwi	r5, r1, PT_R5; +	lwi	r6, r1, PT_R6; +	lwi	r7, r1, PT_R7; +	lwi	r8, r1, PT_R8; +	lwi	r9, r1, PT_R9; +	lwi	r10, r1, PT_R10;  4:  /* Jump to the appropriate function for the system call number in r12   * (r12 is not preserved), or return an error if r12 is not valid. @@ -350,12 +354,17 @@ C_ENTRY(_user_exception):  	/* Note Microblaze barrel shift is optional, so don't rely on it */  	add	r12, r12, r12;			/* convert num -> ptr */  	add	r12, r12, r12; +	addi	r30, r0, 1			/* restarts allowed */  #ifdef DEBUG -	/* Trac syscalls and stored them to r0_ram */ -	lwi	r3, r12, 0x400 + r0_ram +	/* Trac syscalls and stored them to syscall_debug_table */ +	/* The first syscall location stores total syscall number */ +	lwi	r3, r0, syscall_debug_table +	addi	r3, r3, 1 +	swi	r3, r0, syscall_debug_table +	lwi	r3, r12, syscall_debug_table  	addi	r3, r3, 1 -	swi	r3, r12, 0x400 + r0_ram +	swi	r3, r12, syscall_debug_table  #endif  	# Find and jump into the syscall handler. @@ -372,9 +381,12 @@ C_ENTRY(_user_exception):  /* Entry point used to return from a syscall/trap */  /* We re-enable BIP bit before state restore */  C_ENTRY(ret_from_trap): -	swi	r3, r1, PTO + PT_R3 -	swi	r4, r1, PTO + PT_R4 +	swi	r3, r1, PT_R3 +	swi	r4, r1, PT_R4 +	lwi	r11, r1, PT_MODE; +/* See if returning to kernel mode, if so, skip resched &c.  */ +	bnei	r11, 2f;  	/* We're returning to user mode, so check for various conditions that  	 * trigger rescheduling. */  	/* FIXME: Restructure all these flag checks. */ @@ -384,56 +396,54 @@ C_ENTRY(ret_from_trap):  	beqi	r11, 1f  	brlid	r15, do_syscall_trace_leave -	addik	r5, r1, PTO + PT_R0 +	addik	r5, r1, PT_R0  1:  	/* We're returning to user mode, so check for various conditions that  	 * trigger rescheduling. */  	/* get thread info from current task */  	lwi	r11, CURRENT_TASK, TS_THREAD_INFO; -	lwi	r11, r11, TI_FLAGS;		/* get flags in thread info */ -	andi	r11, r11, _TIF_NEED_RESCHED; +	lwi	r19, r11, TI_FLAGS;		/* get flags in thread info */ +	andi	r11, r19, _TIF_NEED_RESCHED;  	beqi	r11, 5f;  	bralid	r15, schedule;	/* Call scheduler */  	nop;				/* delay slot */ +	bri	1b  	/* Maybe handle a signal */ -5:	/* get thread info from current task*/ -	lwi	r11, CURRENT_TASK, TS_THREAD_INFO; -	lwi	r11, r11, TI_FLAGS;	/* get flags in thread info */ -	andi	r11, r11, _TIF_SIGPENDING; -	beqi	r11, 1f;		/* Signals to handle, handle them */ +5:	 +	andi	r11, r19, _TIF_SIGPENDING | _TIF_NOTIFY_RESUME; +	beqi	r11, 4f;		/* Signals to handle, handle them */ -	addik	r5, r1, PTO;		/* Arg 1: struct pt_regs *regs */ -	addi	r7, r0, 1;		/* Arg 3: int in_syscall */ -	bralid	r15, do_signal;	/* Handle any signals */ -	add	r6, r0, r0;		/* Arg 2: sigset_t *oldset */ +	addik	r5, r1, 0;		/* Arg 1: struct pt_regs *regs */ +	bralid	r15, do_notify_resume;	/* Handle any signals */ +	add	r6, r30, r0;		/* Arg 2: int in_syscall */ +	add	r30, r0, r0		/* no more restarts */ +	bri	1b  /* Finally, return to user state.  */ -1:	set_bip;			/*  Ints masked for state restore */ +4:	set_bip;			/*  Ints masked for state restore */  	swi	CURRENT_TASK, r0, PER_CPU(CURRENT_SAVE); /* save current */  	VM_OFF;  	tophys(r1,r1);  	RESTORE_REGS; -	addik	r1, r1, STATE_SAVE_SIZE		/* Clean up stack space.  */ +	addik	r1, r1, PT_SIZE		/* Clean up stack space.  */  	lwi	r1, r1, PT_R1 - PT_SIZE;/* Restore user stack pointer. */ +	bri	6f; + +/* Return to kernel state.  */ +2:	set_bip;			/*  Ints masked for state restore */ +	VM_OFF; +	tophys(r1,r1); +	RESTORE_REGS; +	addik	r1, r1, PT_SIZE		/* Clean up stack space.  */ +	tovirt(r1,r1); +6:  TRAP_return:		/* Make global symbol for debugging */  	rtbd	r14, 0;	/* Instructions to return from an IRQ */  	nop; -/* These syscalls need access to the struct pt_regs on the stack, so we -   implement them in assembly (they're basically all wrappers anyway).  */ - -C_ENTRY(sys_fork_wrapper): -	addi	r5, r0, SIGCHLD			/* Arg 0: flags */ -	lwi	r6, r1, PTO+PT_R1	/* Arg 1: child SP (use parent's) */ -	addik	r7, r1, PTO			/* Arg 2: parent context */ -	add	r8. r0, r0			/* Arg 3: (unused) */ -	add	r9, r0, r0;			/* Arg 4: (unused) */ -	brid	do_fork		/* Do real work (tail-call) */ -	add	r10, r0, r0;			/* Arg 5: (unused) */ -  /* This the initial entry point for a new child thread, with an appropriate     stack in place that makes it look the the child is in the middle of an     syscall.  This function is actually `returned to' from switch_thread @@ -441,31 +451,24 @@ C_ENTRY(sys_fork_wrapper):     saved context).  */  C_ENTRY(ret_from_fork):  	bralid	r15, schedule_tail; /* ...which is schedule_tail's arg */ -	add	r3, r5, r0;	/* switch_thread returns the prev task */ +	add	r5, r3, r0;	/* switch_thread returns the prev task */  				/* ( in the delay slot ) */  	brid	ret_from_trap;	/* Do normal trap return */  	add	r3, r0, r0;	/* Child's fork call should return 0. */ -C_ENTRY(sys_vfork): -	brid	microblaze_vfork	/* Do real work (tail-call) */ -	addik	r5, r1, PTO - -C_ENTRY(sys_clone): -	bnei	r6, 1f;			/* See if child SP arg (arg 1) is 0. */ -	lwi	r6, r1, PTO + PT_R1;	/* If so, use paret's stack ptr */ -1:	addik	r7, r1, PTO;			/* Arg 2: parent context */ -	add	r8, r0, r0;			/* Arg 3: (unused) */ -	add	r9, r0, r0;			/* Arg 4: (unused) */ -	brid	do_fork		/* Do real work (tail-call) */ -	add	r10, r0, r0;			/* Arg 5: (unused) */ - -C_ENTRY(sys_execve): -	brid	microblaze_execve;	/* Do real work (tail-call).*/ -	addik	r8, r1, PTO;		/* add user context as 4th arg */ +C_ENTRY(ret_from_kernel_thread): +	bralid	r15, schedule_tail; /* ...which is schedule_tail's arg */ +	add	r5, r3, r0;	/* switch_thread returns the prev task */ +				/* ( in the delay slot ) */ +	brald	r15, r20	/* fn was left in r20 */ +	addk	r5, r0, r19	/* ... and argument - in r19 */ +	brid	ret_from_trap +	add	r3, r0, r0  C_ENTRY(sys_rt_sigreturn_wrapper): +	addik	r30, r0, 0		/* no restarts */  	brid	sys_rt_sigreturn	/* Do real work */ -	addik	r5, r1, PTO;		/* add user context as 1st arg */ +	addik	r5, r1, 0;		/* add user context as 1st arg */  /*   * HW EXCEPTION rutine start @@ -476,7 +479,7 @@ C_ENTRY(full_exception_trap):  	addik	r17, r17, -4  	SAVE_STATE /* Save registers */  	/* PC, before IRQ/trap - this is one instruction above */ -	swi	r17, r1, PTO+PT_PC; +	swi	r17, r1, PT_PC;  	tovirt(r1,r1)  	/* FIXME this can be store directly in PT_ESR reg.  	 * I tested it but there is a fault */ @@ -486,7 +489,7 @@ C_ENTRY(full_exception_trap):  	mfs	r7, rfsr;		/* save FSR */  	mts	rfsr, r0;	/* Clear sticky fsr */  	rted	r0, full_exception -	addik	r5, r1, PTO		 /* parameter struct pt_regs * regs */ +	addik	r5, r1, 0		 /* parameter struct pt_regs * regs */  /*   * Unaligned data trap. @@ -512,14 +515,14 @@ C_ENTRY(unaligned_data_trap):  	lwi	r11, r0, TOPHYS(PER_CPU(ENTRY_SP));  	SAVE_STATE		/* Save registers.*/  	/* PC, before IRQ/trap - this is one instruction above */ -	swi	r17, r1, PTO+PT_PC; +	swi	r17, r1, PT_PC;  	tovirt(r1,r1)  	/* where the trap should return need -8 to adjust for rtsd r15, 8 */  	addik	r15, r0, ret_from_exc-8  	mfs	r3, resr		/* ESR */  	mfs	r4, rear		/* EAR */  	rtbd	r0, _unaligned_data_exception -	addik	r7, r1, PTO		/* parameter struct pt_regs * regs */ +	addik	r7, r1, 0		/* parameter struct pt_regs * regs */  /*   * Page fault traps. @@ -542,49 +545,49 @@ C_ENTRY(unaligned_data_trap):  C_ENTRY(page_fault_data_trap):  	SAVE_STATE		/* Save registers.*/  	/* PC, before IRQ/trap - this is one instruction above */ -	swi	r17, r1, PTO+PT_PC; +	swi	r17, r1, PT_PC;  	tovirt(r1,r1)  	/* where the trap should return need -8 to adjust for rtsd r15, 8 */  	addik	r15, r0, ret_from_exc-8  	mfs	r6, rear		/* parameter unsigned long address */  	mfs	r7, resr		/* parameter unsigned long error_code */  	rted	r0, do_page_fault -	addik	r5, r1, PTO		/* parameter struct pt_regs * regs */ +	addik	r5, r1, 0		/* parameter struct pt_regs * regs */  C_ENTRY(page_fault_instr_trap):  	SAVE_STATE		/* Save registers.*/  	/* PC, before IRQ/trap - this is one instruction above */ -	swi	r17, r1, PTO+PT_PC; +	swi	r17, r1, PT_PC;  	tovirt(r1,r1)  	/* where the trap should return need -8 to adjust for rtsd r15, 8 */  	addik	r15, r0, ret_from_exc-8  	mfs	r6, rear		/* parameter unsigned long address */  	ori	r7, r0, 0		/* parameter unsigned long error_code */  	rted	r0, do_page_fault -	addik	r5, r1, PTO		/* parameter struct pt_regs * regs */ +	addik	r5, r1, 0		/* parameter struct pt_regs * regs */  /* Entry point used to return from an exception.  */  C_ENTRY(ret_from_exc): -	lwi	r11, r1, PTO + PT_MODE; +	lwi	r11, r1, PT_MODE;  	bnei	r11, 2f;		/* See if returning to kernel mode, */  					/* ... if so, skip resched &c.  */  	/* We're returning to user mode, so check for various conditions that  	   trigger rescheduling. */ +1:  	lwi	r11, CURRENT_TASK, TS_THREAD_INFO;	/* get thread info */ -	lwi	r11, r11, TI_FLAGS;	/* get flags in thread info */ -	andi	r11, r11, _TIF_NEED_RESCHED; +	lwi	r19, r11, TI_FLAGS;	/* get flags in thread info */ +	andi	r11, r19, _TIF_NEED_RESCHED;  	beqi	r11, 5f;  /* Call the scheduler before returning from a syscall/trap. */  	bralid	r15, schedule;	/* Call scheduler */  	nop;				/* delay slot */ +	bri	1b  	/* Maybe handle a signal */ -5:	lwi	r11, CURRENT_TASK, TS_THREAD_INFO;	/* get thread info */ -	lwi	r11, r11, TI_FLAGS;	/* get flags in thread info */ -	andi	r11, r11, _TIF_SIGPENDING; -	beqi	r11, 1f;		/* Signals to handle, handle them */ +5:	andi	r11, r19, _TIF_SIGPENDING | _TIF_NOTIFY_RESUME; +	beqi	r11, 4f;		/* Signals to handle, handle them */  	/*  	 * Handle a signal return; Pending signals should be in r18. @@ -596,20 +599,20 @@ C_ENTRY(ret_from_exc):  	 * traps), but signal handlers may want to examine or change the  	 * complete register state.  Here we save anything not saved by  	 * the normal entry sequence, so that it may be safely restored -	 * (in a possibly modified form) after do_signal returns. */ -	addik	r5, r1, PTO;		/* Arg 1: struct pt_regs *regs */ -	addi	r7, r0, 0;		/* Arg 3: int in_syscall */ -	bralid	r15, do_signal;	/* Handle any signals */ -	add	r6, r0, r0;		/* Arg 2: sigset_t *oldset */ +	 * (in a possibly modified form) after do_notify_resume returns. */ +	addik	r5, r1, 0;		/* Arg 1: struct pt_regs *regs */ +	bralid	r15, do_notify_resume;	/* Handle any signals */ +	addi	r6, r0, 0;		/* Arg 2: int in_syscall */ +	bri	1b  /* Finally, return to user state.  */ -1:	set_bip;			/* Ints masked for state restore */ +4:	set_bip;			/* Ints masked for state restore */  	swi	CURRENT_TASK, r0, PER_CPU(CURRENT_SAVE); /* save current */  	VM_OFF;  	tophys(r1,r1);  	RESTORE_REGS; -	addik	r1, r1, STATE_SAVE_SIZE		/* Clean up stack space.  */ +	addik	r1, r1, PT_SIZE		/* Clean up stack space.  */  	lwi	r1, r1, PT_R1 - PT_SIZE; /* Restore user stack pointer. */  	bri	6f; @@ -618,7 +621,7 @@ C_ENTRY(ret_from_exc):  	VM_OFF;  	tophys(r1,r1);  	RESTORE_REGS; -	addik	r1, r1, STATE_SAVE_SIZE		/* Clean up stack space.  */ +	addik	r1, r1, PT_SIZE		/* Clean up stack space.  */  	tovirt(r1,r1);  6: @@ -651,10 +654,10 @@ C_ENTRY(_interrupt):  	tophys(r1,r1); /* MS: I have in r1 physical address where stack is */  	/* save registers */  /* MS: Make room on the stack -> activation record */ -	addik	r1, r1, -STATE_SAVE_SIZE; +	addik	r1, r1, -PT_SIZE;  	SAVE_REGS  	brid	2f; -	swi	r1, r1, PTO + PT_MODE; /* 0 - user mode, 1 - kernel mode */ +	swi	r1, r1, PT_MODE; /* 0 - user mode, 1 - kernel mode */  1:  /* User-mode state save. */   /* MS: get the saved current */ @@ -664,42 +667,42 @@ C_ENTRY(_interrupt):  	addik	r1, r1, THREAD_SIZE;  	tophys(r1,r1);  	/* save registers */ -	addik	r1, r1, -STATE_SAVE_SIZE; +	addik	r1, r1, -PT_SIZE;  	SAVE_REGS  	/* calculate mode */ -	swi	r0, r1, PTO + PT_MODE; +	swi	r0, r1, PT_MODE;  	lwi	r11, r0, TOPHYS(PER_CPU(ENTRY_SP)); -	swi	r11, r1, PTO+PT_R1; +	swi	r11, r1, PT_R1;  	clear_ums;  2:  	lwi	CURRENT_TASK, r0, TOPHYS(PER_CPU(CURRENT_SAVE));  	tovirt(r1,r1)  	addik	r15, r0, irq_call;  irq_call:rtbd	r0, do_IRQ; -	addik	r5, r1, PTO; +	addik	r5, r1, 0;  /* MS: we are in virtual mode */  ret_from_irq: -	lwi	r11, r1, PTO + PT_MODE; +	lwi	r11, r1, PT_MODE;  	bnei	r11, 2f; +1:  	lwi	r11, CURRENT_TASK, TS_THREAD_INFO; -	lwi	r11, r11, TI_FLAGS; /* MS: get flags from thread info */ -	andi	r11, r11, _TIF_NEED_RESCHED; +	lwi	r19, r11, TI_FLAGS; /* MS: get flags from thread info */ +	andi	r11, r19, _TIF_NEED_RESCHED;  	beqi	r11, 5f  	bralid	r15, schedule;  	nop; /* delay slot */ +	bri	1b      /* Maybe handle a signal */ -5:	lwi	r11, CURRENT_TASK, TS_THREAD_INFO; /* MS: get thread info */ -	lwi	r11, r11, TI_FLAGS; /* get flags in thread info */ -	andi	r11, r11, _TIF_SIGPENDING; +5:	andi	r11, r19, _TIF_SIGPENDING | _TIF_NOTIFY_RESUME;  	beqid	r11, no_intr_resched  /* Handle a signal return; Pending signals should be in r18. */ -	addi	r7, r0, 0; /* Arg 3: int in_syscall */ -	addik	r5, r1, PTO; /* Arg 1: struct pt_regs *regs */ -	bralid	r15, do_signal;	/* Handle any signals */ -	add	r6, r0, r0; /* Arg 2: sigset_t *oldset */ +	addik	r5, r1, 0; /* Arg 1: struct pt_regs *regs */ +	bralid	r15, do_notify_resume;	/* Handle any signals */ +	addi	r6, r0, 0; /* Arg 2: int in_syscall */ +	bri	1b  /* Finally, return to user state. */  no_intr_resched: @@ -709,7 +712,7 @@ no_intr_resched:  	VM_OFF;  	tophys(r1,r1);  	RESTORE_REGS -	addik	r1, r1, STATE_SAVE_SIZE /* MS: Clean up stack space. */ +	addik	r1, r1, PT_SIZE /* MS: Clean up stack space. */  	lwi	r1, r1, PT_R1 - PT_SIZE;  	bri	6f;  /* MS: Return to kernel state. */ @@ -737,7 +740,7 @@ restore:  	VM_OFF /* MS: turn off MMU */  	tophys(r1,r1)  	RESTORE_REGS -	addik	r1, r1, STATE_SAVE_SIZE	/* MS: Clean up stack space. */ +	addik	r1, r1, PT_SIZE	/* MS: Clean up stack space. */  	tovirt(r1,r1);  6:  IRQ_return: /* MS: Make global symbol for debugging */ @@ -760,29 +763,29 @@ C_ENTRY(_debug_exception):  	lwi	r1, r0, TOPHYS(PER_CPU(ENTRY_SP)); /* Reload kernel stack-ptr*/  	/* BIP bit is set on entry, no interrupts can occur */ -	addik   r1, r1, CONFIG_KERNEL_BASE_ADDR - CONFIG_KERNEL_START - STATE_SAVE_SIZE; +	addik   r1, r1, CONFIG_KERNEL_BASE_ADDR - CONFIG_KERNEL_START - PT_SIZE;  	SAVE_REGS;  	/* save all regs to pt_reg structure */ -	swi	r0, r1, PTO+PT_R0;	/* R0 must be saved too */ -	swi	r14, r1, PTO+PT_R14	/* rewrite saved R14 value */ -	swi	r16, r1, PTO+PT_PC; /* PC and r16 are the same */ +	swi	r0, r1, PT_R0;	/* R0 must be saved too */ +	swi	r14, r1, PT_R14	/* rewrite saved R14 value */ +	swi	r16, r1, PT_PC; /* PC and r16 are the same */  	/* save special purpose registers to pt_regs */  	mfs	r11, rear; -	swi	r11, r1, PTO+PT_EAR; +	swi	r11, r1, PT_EAR;  	mfs	r11, resr; -	swi	r11, r1, PTO+PT_ESR; +	swi	r11, r1, PT_ESR;  	mfs	r11, rfsr; -	swi	r11, r1, PTO+PT_FSR; +	swi	r11, r1, PT_FSR;  	/* stack pointer is in physical address at it is decrease -	 * by STATE_SAVE_SIZE but we need to get correct R1 value */ -	addik   r11, r1, CONFIG_KERNEL_START - CONFIG_KERNEL_BASE_ADDR + STATE_SAVE_SIZE; -	swi	r11, r1, PTO+PT_R1 +	 * by PT_SIZE but we need to get correct R1 value */ +	addik   r11, r1, CONFIG_KERNEL_START - CONFIG_KERNEL_BASE_ADDR + PT_SIZE; +	swi	r11, r1, PT_R1  	/* MS: r31 - current pointer isn't changed */  	tovirt(r1,r1)  #ifdef CONFIG_KGDB -	addi	r5, r1, PTO /* pass pt_reg address as the first arg */ -	la	r15, r0, dbtrap_call; /* return address */ +	addi	r5, r1, 0 /* pass pt_reg address as the first arg */ +	addik	r15, r0, dbtrap_call; /* return address */  	rtbd	r0, microblaze_kgdb_break  	nop;  #endif @@ -797,16 +800,16 @@ C_ENTRY(_debug_exception):  	addik	r1, r1, THREAD_SIZE;	/* calculate kernel stack pointer */  	tophys(r1,r1); -	addik	r1, r1, -STATE_SAVE_SIZE; /* Make room on the stack.  */ +	addik	r1, r1, -PT_SIZE; /* Make room on the stack.  */  	SAVE_REGS; -	swi	r16, r1, PTO+PT_PC;	/* Save LP */ -	swi	r0, r1, PTO + PT_MODE; /* Was in user-mode.  */ +	swi	r16, r1, PT_PC;	/* Save LP */ +	swi	r0, r1, PT_MODE; /* Was in user-mode.  */  	lwi	r11, r0, TOPHYS(PER_CPU(ENTRY_SP)); -	swi	r11, r1, PTO+PT_R1; /* Store user SP.  */ +	swi	r11, r1, PT_R1; /* Store user SP.  */  	lwi	CURRENT_TASK, r0, TOPHYS(PER_CPU(CURRENT_SAVE));  	tovirt(r1,r1)  	set_vms; -	addik	r5, r1, PTO; +	addik	r5, r1, 0;  	addik	r15, r0, dbtrap_call;  dbtrap_call: /* Return point for kernel/user entry + 8 because of rtsd r15, 8 */  	rtbd	r0, sw_exception @@ -814,37 +817,37 @@ dbtrap_call: /* Return point for kernel/user entry + 8 because of rtsd r15, 8 */  	/* MS: The first instruction for the second part of the gdb/kgdb */  	set_bip; /* Ints masked for state restore */ -	lwi	r11, r1, PTO + PT_MODE; +	lwi	r11, r1, PT_MODE;  	bnei	r11, 2f;  /* MS: Return to user space - gdb */ +1:  	/* Get current task ptr into r11 */  	lwi	r11, CURRENT_TASK, TS_THREAD_INFO;	/* get thread info */ -	lwi	r11, r11, TI_FLAGS;	/* get flags in thread info */ -	andi	r11, r11, _TIF_NEED_RESCHED; +	lwi	r19, r11, TI_FLAGS;	/* get flags in thread info */ +	andi	r11, r19, _TIF_NEED_RESCHED;  	beqi	r11, 5f;  	/* Call the scheduler before returning from a syscall/trap. */  	bralid	r15, schedule;	/* Call scheduler */  	nop;				/* delay slot */ +	bri	1b  	/* Maybe handle a signal */ -5:	lwi	r11, CURRENT_TASK, TS_THREAD_INFO;	/* get thread info */ -	lwi	r11, r11, TI_FLAGS;	/* get flags in thread info */ -	andi	r11, r11, _TIF_SIGPENDING; -	beqi	r11, 1f;		/* Signals to handle, handle them */ +5:	andi	r11, r19, _TIF_SIGPENDING | _TIF_NOTIFY_RESUME; +	beqi	r11, 4f;		/* Signals to handle, handle them */ -	addik	r5, r1, PTO;		/* Arg 1: struct pt_regs *regs */ -	addi  r7, r0, 0;	/* Arg 3: int in_syscall */ -	bralid	r15, do_signal;	/* Handle any signals */ -	add	r6, r0, r0;		/* Arg 2: sigset_t *oldset */ +	addik	r5, r1, 0;		/* Arg 1: struct pt_regs *regs */ +	bralid	r15, do_notify_resume;	/* Handle any signals */ +	addi  r6, r0, 0;	/* Arg 2: int in_syscall */ +	bri	1b  /* Finally, return to user state.  */ -1:	swi	CURRENT_TASK, r0, PER_CPU(CURRENT_SAVE); /* save current */ +4:	swi	CURRENT_TASK, r0, PER_CPU(CURRENT_SAVE); /* save current */  	VM_OFF;  	tophys(r1,r1);  	/* MS: Restore all regs */  	RESTORE_REGS -	addik	r1, r1, STATE_SAVE_SIZE	 /* Clean up stack space */ +	addik	r1, r1, PT_SIZE	 /* Clean up stack space */  	lwi	r1, r1, PT_R1 - PT_SIZE; /* Restore user stack pointer */  DBTRAP_return_user: /* MS: Make global symbol for debugging */  	rtbd	r16, 0; /* MS: Instructions to return from a debug trap */ @@ -855,9 +858,9 @@ DBTRAP_return_user: /* MS: Make global symbol for debugging */  	tophys(r1,r1);  	/* MS: Restore all regs */  	RESTORE_REGS -	lwi	r14, r1, PTO+PT_R14; -	lwi	r16, r1, PTO+PT_PC; -	addik	r1, r1, STATE_SAVE_SIZE; /* MS: Clean up stack space */ +	lwi	r14, r1, PT_R14; +	lwi	r16, r1, PT_PC; +	addik	r1, r1, PT_SIZE; /* MS: Clean up stack space */  	tovirt(r1,r1);  DBTRAP_return_kernel: /* MS: Make global symbol for debugging */  	rtbd	r16, 0; /* MS: Instructions to return from a debug trap */ @@ -949,20 +952,22 @@ ENTRY(_switch_to)  	nop  ENTRY(_reset) -	brai	0x70; /* Jump back to FS-boot */ +	brai	0; /* Jump to reset vector */  	/* These are compiled and loaded into high memory, then  	 * copied into place in mach_early_setup */  	.section	.init.ivt, "ax" +#if CONFIG_MANUAL_RESET_VECTOR  	.org	0x0 -	/* this is very important - here is the reset vector */ -	/* in current MMU branch you don't care what is here - it is -	 * used from bootloader site - but this is correct for FS-BOOT */ -	brai	0x70 -	nop +	brai	CONFIG_MANUAL_RESET_VECTOR +#endif +	.org	0x8  	brai	TOPHYS(_user_exception); /* syscall handler */ +	.org	0x10  	brai	TOPHYS(_interrupt);	/* Interrupt handler */ +	.org	0x18  	brai	TOPHYS(_debug_exception);	/* debug trap handler */ +	.org	0x20  	brai	TOPHYS(_hw_exception_handler);	/* HW exception handler */  .section .rodata,"a" diff --git a/arch/microblaze/kernel/exceptions.c b/arch/microblaze/kernel/exceptions.c index 478f2943ede..42dd12a62ff 100644 --- a/arch/microblaze/kernel/exceptions.c +++ b/arch/microblaze/kernel/exceptions.c @@ -13,11 +13,11 @@   * This file handles the architecture-dependent parts of hardware exceptions   */ +#include <linux/export.h>  #include <linux/kernel.h>  #include <linux/signal.h>  #include <linux/sched.h>  #include <linux/kallsyms.h> -#include <linux/module.h>  #include <asm/exceptions.h>  #include <asm/entry.h>		/* For KM CPU var */ @@ -25,6 +25,7 @@  #include <linux/errno.h>  #include <linux/ptrace.h>  #include <asm/current.h> +#include <asm/cacheflush.h>  #define MICROBLAZE_ILL_OPCODE_EXCEPTION	0x02  #define MICROBLAZE_IBUS_EXCEPTION	0x03 @@ -39,7 +40,7 @@ void die(const char *str, struct pt_regs *fp, long err)  {  	console_verbose();  	spin_lock_irq(&die_lock); -	printk(KERN_WARNING "Oops: %s, sig: %ld\n", str, err); +	pr_warn("Oops: %s, sig: %ld\n", str, err);  	show_regs(fp);  	spin_unlock_irq(&die_lock);  	/* do_exit() should take care of panic'ing from an interrupt @@ -49,18 +50,20 @@ void die(const char *str, struct pt_regs *fp, long err)  }  /* for user application debugging */ -void sw_exception(struct pt_regs *regs) +asmlinkage void sw_exception(struct pt_regs *regs)  {  	_exception(SIGTRAP, regs, TRAP_BRKPT, regs->r16); +	flush_dcache_range(regs->r16, regs->r16 + 0x4); +	flush_icache_range(regs->r16, regs->r16 + 0x4);  }  void _exception(int signr, struct pt_regs *regs, int code, unsigned long addr)  {  	siginfo_t info; -	if (kernel_mode(regs)) { +	if (kernel_mode(regs))  		die("Exception in kernel mode", regs, signr); -	} +  	info.si_signo = signr;  	info.si_errno = 0;  	info.si_code = code; @@ -76,8 +79,7 @@ asmlinkage void full_exception(struct pt_regs *regs, unsigned int type,  #endif  #if 0 -	printk(KERN_WARNING "Exception %02x in %s mode, FSR=%08x PC=%08x " \ -							"ESR=%08x\n", +	pr_warn("Exception %02x in %s mode, FSR=%08x PC=%08x ESR=%08x\n",  			type, user_mode(regs) ? "user" : "kernel", fsr,  			(unsigned int) regs->pc, (unsigned int) regs->esr);  #endif @@ -89,8 +91,7 @@ asmlinkage void full_exception(struct pt_regs *regs, unsigned int type,  			_exception(SIGILL, regs, ILL_ILLOPC, addr);  			return;  		} -		printk(KERN_WARNING "Illegal opcode exception " \ -							"in kernel mode.\n"); +		pr_warn("Illegal opcode exception in kernel mode.\n");  		die("opcode exception", regs, SIGBUS);  		break;  	case MICROBLAZE_IBUS_EXCEPTION: @@ -99,8 +100,7 @@ asmlinkage void full_exception(struct pt_regs *regs, unsigned int type,  			_exception(SIGBUS, regs, BUS_ADRERR, addr);  			return;  		} -		printk(KERN_WARNING "Instruction bus error exception " \ -							"in kernel mode.\n"); +		pr_warn("Instruction bus error exception in kernel mode.\n");  		die("bus exception", regs, SIGBUS);  		break;  	case MICROBLAZE_DBUS_EXCEPTION: @@ -109,18 +109,16 @@ asmlinkage void full_exception(struct pt_regs *regs, unsigned int type,  			_exception(SIGBUS, regs, BUS_ADRERR, addr);  			return;  		} -		printk(KERN_WARNING "Data bus error exception " \ -							"in kernel mode.\n"); +		pr_warn("Data bus error exception in kernel mode.\n");  		die("bus exception", regs, SIGBUS);  		break;  	case MICROBLAZE_DIV_ZERO_EXCEPTION:  		if (user_mode(regs)) {  			pr_debug("Divide by zero exception in user mode\n"); -			_exception(SIGILL, regs, FPE_INTDIV, addr); +			_exception(SIGFPE, regs, FPE_INTDIV, addr);  			return;  		} -		printk(KERN_WARNING "Divide by zero exception " \ -							"in kernel mode.\n"); +		pr_warn("Divide by zero exception in kernel mode.\n");  		die("Divide by zero exception", regs, SIGBUS);  		break;  	case MICROBLAZE_FPU_EXCEPTION: @@ -148,8 +146,8 @@ asmlinkage void full_exception(struct pt_regs *regs, unsigned int type,  #endif  	default:  	/* FIXME what to do in unexpected exception */ -		printk(KERN_WARNING "Unexpected exception %02x " -			"PC=%08x in %s mode\n", type, (unsigned int) addr, +		pr_warn("Unexpected exception %02x PC=%08x in %s mode\n", +			type, (unsigned int) addr,  			kernel_mode(regs) ? "kernel" : "user");  	}  	return; diff --git a/arch/microblaze/kernel/ftrace.c b/arch/microblaze/kernel/ftrace.c index 515feb40455..bbcd2533766 100644 --- a/arch/microblaze/kernel/ftrace.c +++ b/arch/microblaze/kernel/ftrace.c @@ -35,22 +35,25 @@ void prepare_ftrace_return(unsigned long *parent, unsigned long self_addr)  	 * happen. This tool is too much intrusive to  	 * ignore such a protection.  	 */ -	asm volatile("	1:	lwi	%0, %2, 0;		\ -			2:	swi	%3, %2, 0;		\ -				addik	%1, r0, 0;		\ -			3:					\ -				.section .fixup, \"ax\";	\ -			4:	brid	3b;			\ -				addik	%1, r0, 1;		\ -				.previous;			\ -				.section __ex_table,\"a\";	\ -				.word	1b,4b;			\ -				.word	2b,4b;			\ -				.previous;"			\ +	asm volatile("	1:	lwi	%0, %2, 0;"		\ +			"2:	swi	%3, %2, 0;"		\ +			"	addik	%1, r0, 0;"		\ +			"3:"					\ +			"	.section .fixup, \"ax\";"	\ +			"4:	brid	3b;"			\ +			"	addik	%1, r0, 1;"		\ +			"	.previous;"			\ +			"	.section __ex_table,\"a\";"	\ +			"	.word	1b,4b;"			\ +			"	.word	2b,4b;"			\ +			"	.previous;"			\  			: "=&r" (old), "=r" (faulted)  			: "r" (parent), "r" (return_hooker)  	); +	flush_dcache_range((u32)parent, (u32)parent + 4); +	flush_icache_range((u32)parent, (u32)parent + 4); +  	if (unlikely(faulted)) {  		ftrace_graph_stop();  		WARN_ON(1); @@ -78,16 +81,16 @@ static int ftrace_modify_code(unsigned long addr, unsigned int value)  {  	int faulted = 0; -	__asm__ __volatile__("	1:	swi	%2, %1, 0;		\ -					addik	%0, r0, 0;		\ -				2:					\ -					.section .fixup, \"ax\";	\ -				3:	brid	2b;			\ -					addik	%0, r0, 1;		\ -					.previous;			\ -					.section __ex_table,\"a\";	\ -					.word	1b,3b;			\ -					.previous;"			\ +	__asm__ __volatile__("	1:	swi	%2, %1, 0;"		\ +				"	addik	%0, r0, 0;"		\ +				"2:"					\ +				"	.section .fixup, \"ax\";"	\ +				"3:	brid	2b;"			\ +				"	addik	%0, r0, 1;"		\ +				"	.previous;"			\ +				"	.section __ex_table,\"a\";"	\ +				"	.word	1b,3b;"			\ +				"	.previous;"			\  				: "=r" (faulted)  				: "r" (addr), "r" (value)  	); @@ -95,6 +98,9 @@ static int ftrace_modify_code(unsigned long addr, unsigned int value)  	if (unlikely(faulted))  		return -EFAULT; +	flush_dcache_range(addr, addr + 4); +	flush_icache_range(addr, addr + 4); +  	return 0;  } @@ -165,11 +171,8 @@ int ftrace_make_call(struct dyn_ftrace *rec, unsigned long addr)  	return ret;  } -int __init ftrace_dyn_arch_init(void *data) +int __init ftrace_dyn_arch_init(void)  { -	/* The return code is retured via data */ -	*(unsigned long *)data = 0; -  	return 0;  } @@ -195,8 +198,6 @@ int ftrace_update_ftrace_func(ftrace_func_t func)  	ret += ftrace_modify_code((unsigned long)&ftrace_caller,  				  MICROBLAZE_NOP); -	/* All changes are done - lets do caches consistent */ -	flush_icache();  	return ret;  } @@ -210,7 +211,6 @@ int ftrace_enable_ftrace_graph_caller(void)  	old_jump = *(unsigned int *)ip; /* save jump over instruction */  	ret = ftrace_modify_code(ip, MICROBLAZE_NOP); -	flush_icache();  	pr_debug("%s: Replace instruction: 0x%x\n", __func__, old_jump);  	return ret; @@ -222,7 +222,6 @@ int ftrace_disable_ftrace_graph_caller(void)  	unsigned long ip = (unsigned long)(&ftrace_call_graph);  	ret = ftrace_modify_code(ip, old_jump); -	flush_icache();  	pr_debug("%s\n", __func__);  	return ret; diff --git a/arch/microblaze/kernel/head.S b/arch/microblaze/kernel/head.S index 42434008209..4655ff342c6 100644 --- a/arch/microblaze/kernel/head.S +++ b/arch/microblaze/kernel/head.S @@ -39,7 +39,7 @@  #include <asm/mmu.h>  #include <asm/processor.h> -.data +.section .data  .global empty_zero_page  .align 12  empty_zero_page: @@ -50,6 +50,11 @@ swapper_pg_dir:  #endif /* CONFIG_MMU */ +.section .rodata +.align 4 +endian_check: +	.word	1 +  	__HEAD  ENTRY(_start)  #if CONFIG_KERNEL_BASE_ADDR == 0 @@ -58,34 +63,43 @@ ENTRY(_start)  real_start:  #endif -	mfs	r1, rmsr -	andi	r1, r1, ~2 -	mts	rmsr, r1 +	mts	rmsr, r0 +/* Disable stack protection from bootloader */ +	mts	rslr, r0 +	addi	r8, r0, 0xFFFFFFFF +	mts	rshr, r8  /* - * Here is checking mechanism which check if Microblaze has msr instructions - * We load msr and compare it with previous r1 value - if is the same, - * msr instructions works if not - cpu don't have them. + * According to Xilinx, msrclr instruction behaves like 'mfs rX,rpc' + * if the msrclr instruction is not enabled. We use this to detect + * if the opcode is available, by issuing msrclr and then testing the result. + * r8 == 0 - msr instructions are implemented + * r8 != 0 - msr instructions are not implemented   */ -	/* r8=0 - I have msr instr, 1 - I don't have them */ -	rsubi	r0, r0, 1	/* set the carry bit */ -	msrclr	r0, 0x4		/* try to clear it */ -	/* read the carry bit, r8 will be '0' if msrclr exists */ -	addik	r8, r0, 0 +	mfs	r1, rmsr +	msrclr	r8, 0 /* clear nothing - just read msr for test */ +	cmpu	r8, r8, r1 /* r1 must contain msr reg content */  /* r7 may point to an FDT, or there may be one linked in.     if it's in r7, we've got to save it away ASAP.     We ensure r7 points to a valid FDT, just in case the bootloader     is broken or non-existent */  	beqi	r7, no_fdt_arg			/* NULL pointer?  don't copy */ -	lw	r11, r0, r7			/* Does r7 point to a */ -	rsubi	r11, r11, OF_DT_HEADER		/* valid FDT? */ +/* Does r7 point to a valid FDT? Load HEADER magic number */ +	/* Run time Big/Little endian platform */ +	/* Save 1 as word and load byte - 0 - BIG, 1 - LITTLE */ +	lbui	r11, r0, TOPHYS(endian_check) +	beqid	r11, big_endian /* DO NOT break delay stop dependency */ +	lw	r11, r0, r7 /* Big endian load in delay slot */ +	lwr	r11, r0, r7 /* Little endian load */ +big_endian: +	rsubi	r11, r11, OF_DT_HEADER	/* Check FDT header */  	beqi	r11, _prepare_copy_fdt  	or	r7, r0, r0		/* clear R7 when not valid DTB */  	bnei	r11, no_fdt_arg			/* No - get out of here */  _prepare_copy_fdt:  	or	r11, r0, r0 /* incremment */  	ori	r4, r0, TOPHYS(_fdt_start) -	ori	r3, r0, (0x4000 - 4) +	ori	r3, r0, (0x8000 - 4)  _copy_fdt:  	lw	r12, r7, r11 /* r12 = r7 + r11 */  	sw	r12, r4, r11 /* addr[r4 + r11] = r12 */ @@ -99,31 +113,35 @@ no_fdt_arg:  #ifndef CONFIG_CMDLINE_BOOL  /*   * handling command line - * copy command line to __init_end. There is space for storing command line. + * copy command line directly to cmd_line placed in data section.   */ -	or	r6, r0, r0		/* incremment */ -	ori	r4, r0, __init_end	/* load address of command line */ +	beqid	r5, skip	/* Skip if NULL pointer */ +	or	r11, r0, r0		/* incremment */ +	ori	r4, r0, cmd_line	/* load address of command line */  	tophys(r4,r4)			/* convert to phys address */  	ori	r3, r0, COMMAND_LINE_SIZE - 1 /* number of loops */  _copy_command_line: -	lbu	r2, r5, r6 /* r2=r5+r6 - r5 contain pointer to command line */ -	sb	r2, r4, r6		/* addr[r4+r6]= r2*/ -	addik	r6, r6, 1		/* increment counting */ +	/* r2=r5+r6 - r5 contain pointer to command line */ +	lbu	r2, r5, r11 +	beqid	r2, skip		/* Skip if no data */ +	sb	r2, r4, r11		/* addr[r4+r6]= r2 */ +	addik	r11, r11, 1		/* increment counting */  	bgtid	r3, _copy_command_line	/* loop for all entries       */ -	addik	r3, r3, -1		/* descrement loop */ +	addik	r3, r3, -1		/* decrement loop */  	addik	r5, r4, 0		/* add new space for command line */  	tovirt(r5,r5) +skip:  #endif /* CONFIG_CMDLINE_BOOL */  #ifdef NOT_COMPILE  /* save bram context */ -	or	r6, r0, r0				/* incremment */ +	or	r11, r0, r0				/* incremment */  	ori	r4, r0, TOPHYS(_bram_load_start)	/* save bram context */  	ori	r3, r0, (LMB_SIZE - 4)  _copy_bram: -	lw	r7, r0, r6		/* r7 = r0 + r6 */ -	sw	r7, r4, r6		/* addr[r4 + r6] = r7*/ -	addik	r6, r6, 4		/* increment counting */ +	lw	r7, r0, r11		/* r7 = r0 + r6 */ +	sw	r7, r4, r11		/* addr[r4 + r6] = r7 */ +	addik	r11, r11, 4		/* increment counting */  	bgtid	r3, _copy_bram		/* loop for all entries */  	addik	r3, r3, -4		/* descrement loop */  #endif @@ -139,6 +157,7 @@ _copy_bram:  _invalidate:  	mts	rtlbx, r3  	mts	rtlbhi, r0			/* flush: ensure V is clear   */ +	mts	rtlblo, r0  	bgtid	r3, _invalidate		/* loop for all entries       */  	addik	r3, r3, -1  	/* sync */ @@ -158,6 +177,53 @@ _invalidate:  	addik	r3,r0, CONFIG_KERNEL_START /* Load the kernel virtual address */  	tophys(r4,r3)			/* Load the kernel physical address */ +	/* start to do TLB calculation */ +	addik	r12, r0, _end +	rsub	r12, r3, r12 +	addik	r12, r12, CONFIG_LOWMEM_SIZE >> PTE_SHIFT /* that's the pad */ + +	or r9, r0, r0 /* TLB0 = 0 */ +	or r10, r0, r0 /* TLB1 = 0 */ + +	addik	r11, r12, -0x1000000 +	bgei	r11, GT16 /* size is greater than 16MB */ +	addik	r11, r12, -0x0800000 +	bgei	r11, GT8 /* size is greater than 8MB */ +	addik	r11, r12, -0x0400000 +	bgei	r11, GT4 /* size is greater than 4MB */ +	/* size is less than 4MB */ +	addik	r11, r12, -0x0200000 +	bgei	r11, GT2 /* size is greater than 2MB */ +	addik	r9, r0, 0x0100000 /* TLB0 must be 1MB */ +	addik	r11, r12, -0x0100000 +	bgei	r11, GT1 /* size is greater than 1MB */ +	/* TLB1 is 0 which is setup above */ +	bri tlb_end +GT4: /* r11 contains the rest - will be either 1 or 4 */ +	ori r9, r0, 0x400000 /* TLB0 is 4MB */ +	bri TLB1 +GT16: /* TLB0 is 16MB */ +	addik	r9, r0, 0x1000000 /* means TLB0 is 16MB */ +TLB1: +	/* must be used r2 because of subtract if failed */ +	addik	r2, r11, -0x0400000 +	bgei	r2, GT20 /* size is greater than 16MB */ +	/* size is >16MB and <20MB */ +	addik	r11, r11, -0x0100000 +	bgei	r11, GT17 /* size is greater than 17MB */ +	/* kernel is >16MB and < 17MB */ +GT1: +	addik	r10, r0, 0x0100000 /* means TLB1 is 1MB */ +	bri tlb_end +GT2: /* TLB0 is 0 and TLB1 will be 4MB */ +GT17: /* TLB1 is 4MB - kernel size <20MB */ +	addik	r10, r0, 0x0400000 /* means TLB1 is 4MB */ +	bri tlb_end +GT8: /* TLB0 is still zero that's why I can use only TLB1 */ +GT20: /* TLB1 is 16MB - kernel size >20MB */ +	addik	r10, r0, 0x1000000 /* means TLB1 is 16MB */ +tlb_end: +  	/*  	 * Configure and load two entries into TLB slots 0 and 1.  	 * In case we are pinning TLBs, these are reserved in by the @@ -167,29 +233,82 @@ _invalidate:  	andi	r4,r4,0xfffffc00	/* Mask off the real page number */  	ori	r4,r4,(TLB_WR | TLB_EX)	/* Set the write and execute bits */ +	/* +	 * TLB0 is always used - check if is not zero (r9 stores TLB0 value) +	 * if is use TLB1 value and clear it (r10 stores TLB1 value) +	 */ +	bnei	r9, tlb0_not_zero +	add	r9, r10, r0 +	add	r10, r0, r0 +tlb0_not_zero: + +	/* look at the code below */ +	ori	r30, r0, 0x200 +	andi	r29, r9, 0x100000 +	bneid	r29, 1f +	addik	r30, r30, 0x80 +	andi	r29, r9, 0x400000 +	bneid	r29, 1f +	addik	r30, r30, 0x80 +	andi	r29, r9, 0x1000000 +	bneid	r29, 1f +	addik	r30, r30, 0x80 +1:  	andi	r3,r3,0xfffffc00	/* Mask off the effective page number */ -	ori	r3,r3,(TLB_VALID | TLB_PAGESZ(PAGESZ_16M)) +	ori	r3,r3,(TLB_VALID) +	or	r3, r3, r30 -	mts     rtlbx,r0		/* TLB slow 0 */ +	/* Load tlb_skip size value which is index to first unused TLB entry */ +	lwi	r11, r0, TOPHYS(tlb_skip) +	mts     rtlbx,r11		/* TLB slow 0 */  	mts	rtlblo,r4		/* Load the data portion of the entry */  	mts	rtlbhi,r3		/* Load the tag portion of the entry */ -	addik	r4, r4, 0x01000000	/* Map next 16 M entries */ -	addik	r3, r3, 0x01000000 +	/* Increase tlb_skip size */ +	addik	r11, r11, 1 +	swi	r11, r0, TOPHYS(tlb_skip) + +	/* TLB1 can be zeroes that's why we not setup it */ +	beqi	r10, jump_over2 + +	/* look at the code below */ +	ori	r30, r0, 0x200 +	andi	r29, r10, 0x100000 +	bneid	r29, 1f +	addik	r30, r30, 0x80 +	andi	r29, r10, 0x400000 +	bneid	r29, 1f +	addik	r30, r30, 0x80 +	andi	r29, r10, 0x1000000 +	bneid	r29, 1f +	addik	r30, r30, 0x80 +1: +	addk	r4, r4, r9	/* previous addr + TLB0 size */ +	addk	r3, r3, r9 + +	andi	r3,r3,0xfffffc00	/* Mask off the effective page number */ +	ori	r3,r3,(TLB_VALID) +	or	r3, r3, r30 -	ori	r6,r0,1			/* TLB slot 1 */ -	mts     rtlbx,r6 +	lwi	r11, r0, TOPHYS(tlb_skip) +	mts     rtlbx, r11		/* r11 is used from TLB0 */  	mts	rtlblo,r4		/* Load the data portion of the entry */  	mts	rtlbhi,r3		/* Load the tag portion of the entry */ +	/* Increase tlb_skip size */ +	addik	r11, r11, 1 +	swi	r11, r0, TOPHYS(tlb_skip) + +jump_over2:  	/*  	 * Load a TLB entry for LMB, since we need access to  	 * the exception vectors, using a 4k real==virtual mapping.  	 */ -	ori	r6,r0,3			/* TLB slot 3 */ -	mts     rtlbx,r6 +	/* Use temporary TLB_ID for LMB - clear this temporary mapping later */ +	ori	r11, r0, MICROBLAZE_LMB_TLB_ID +	mts     rtlbx,r11  	ori	r4,r0,(TLB_WR | TLB_EX)  	ori	r3,r0,(TLB_VALID | TLB_PAGESZ(PAGESZ_4K)) @@ -213,26 +332,26 @@ start_here:  #endif /* CONFIG_MMU */  	/* Initialize small data anchors */ -	la	r13, r0, _KERNEL_SDA_BASE_ -	la	r2, r0, _KERNEL_SDA2_BASE_ +	addik	r13, r0, _KERNEL_SDA_BASE_ +	addik	r2, r0, _KERNEL_SDA2_BASE_  	/* Initialize stack pointer */ -	la	r1, r0, init_thread_union + THREAD_SIZE - 4 +	addik	r1, r0, init_thread_union + THREAD_SIZE - 4  	/* Initialize r31 with current task address */ -	la	r31, r0, init_task +	addik	r31, r0, init_task  	/*  	 * Call platform dependent initialize function.  	 * Please see $(ARCH)/mach-$(SUBARCH)/setup.c for  	 * the function.  	 */ -	la	r9, r0, machine_early_init -	brald	r15, r9 +	addik	r11, r0, machine_early_init +	brald	r15, r11  	nop  #ifndef CONFIG_MMU -	la	r15, r0, machine_halt +	addik	r15, r0, machine_halt  	braid	start_kernel  	nop  #else @@ -257,8 +376,7 @@ start_here:  	/* Load up the kernel context */  kernel_load_context: -	# Keep entry 0 and 1 valid. Entry 3 mapped to LMB can go away. -	ori	r5,r0,3 +	ori	r5, r0, MICROBLAZE_LMB_TLB_ID  	mts     rtlbx,r5  	nop  	mts	rtlbhi,r0 diff --git a/arch/microblaze/kernel/heartbeat.c b/arch/microblaze/kernel/heartbeat.c index 154756f3c69..4643e3ab941 100644 --- a/arch/microblaze/kernel/heartbeat.c +++ b/arch/microblaze/kernel/heartbeat.c @@ -17,7 +17,7 @@  static unsigned int base_addr; -void heartbeat(void) +void microblaze_heartbeat(void)  {  	static unsigned int cnt, period, dist; @@ -42,7 +42,7 @@ void heartbeat(void)  	}  } -void setup_heartbeat(void) +void microblaze_setup_heartbeat(void)  {  	struct device_node *gpio = NULL;  	int *prop; @@ -61,7 +61,7 @@ void setup_heartbeat(void)  	if (gpio) {  		base_addr = be32_to_cpup(of_get_property(gpio, "reg", NULL));  		base_addr = (unsigned long) ioremap(base_addr, PAGE_SIZE); -		printk(KERN_NOTICE "Heartbeat GPIO at 0x%x\n", base_addr); +		pr_notice("Heartbeat GPIO at 0x%x\n", base_addr);  		/* GPIO is configured as output */  		prop = (int *) of_get_property(gpio, "xlnx,is-bidir", NULL); diff --git a/arch/microblaze/kernel/hw_exception_handler.S b/arch/microblaze/kernel/hw_exception_handler.S index 781195438ee..0b11a4469de 100644 --- a/arch/microblaze/kernel/hw_exception_handler.S +++ b/arch/microblaze/kernel/hw_exception_handler.S @@ -75,8 +75,11 @@  #include <asm/mmu.h>  #include <asm/pgtable.h>  #include <asm/signal.h> +#include <asm/registers.h>  #include <asm/asm-offsets.h> +#undef DEBUG +  /* Helpful Macros */  #define NUM_TO_REG(num)		r ## num @@ -91,7 +94,7 @@  		lwi	r6, r1, PT_R6;		\  		lwi	r11, r1, PT_R11;	\  		lwi	r31, r1, PT_R31;	\ -		lwi	r1, r0, TOPHYS(r0_ram + 0); +		lwi	r1, r1, PT_R1;  #endif /* CONFIG_MMU */  #define LWREG_NOP			\ @@ -144,19 +147,14 @@  		or	r3, r0, NUM_TO_REG (regnum);  	/* Shift right instruction depending on available configuration */ -	#if CONFIG_XILINX_MICROBLAZE0_USE_BARREL > 0 -	#define BSRLI(rD, rA, imm)	\ -		bsrli rD, rA, imm -	#elif CONFIG_XILINX_MICROBLAZE0_USE_DIV > 0 -	#define BSRLI(rD, rA, imm)	\ -		ori rD, r0, (1 << imm);	\ -		idivu rD, rD, rA -	#else -	#define BSRLI(rD, rA, imm) BSRLI ## imm (rD, rA) +	#if CONFIG_XILINX_MICROBLAZE0_USE_BARREL == 0  	/* Only the used shift constants defined here - add more if needed */  	#define BSRLI2(rD, rA)				\  		srl rD, rA;		/* << 1 */	\  		srl rD, rD;		/* << 2 */ +	#define BSRLI4(rD, rA)		\ +		BSRLI2(rD, rA);		\ +		BSRLI2(rD, rD)  	#define BSRLI10(rD, rA)				\  		srl rD, rA;		/* << 1 */	\  		srl rD, rD;		/* << 2 */	\ @@ -171,7 +169,33 @@  	#define BSRLI20(rD, rA)		\  		BSRLI10(rD, rA);	\  		BSRLI10(rD, rD) + +	.macro	bsrli, rD, rA, IMM +	.if (\IMM) == 2 +		BSRLI2(\rD, \rA) +	.elseif (\IMM) == 10 +		BSRLI10(\rD, \rA) +	.elseif (\IMM) == 12 +		BSRLI2(\rD, \rA) +		BSRLI10(\rD, \rD) +	.elseif (\IMM) == 14 +		BSRLI4(\rD, \rA) +		BSRLI10(\rD, \rD) +	.elseif (\IMM) == 20 +		BSRLI20(\rD, \rA) +	.elseif (\IMM) == 24 +		BSRLI4(\rD, \rA) +		BSRLI20(\rD, \rD) +	.elseif (\IMM) == 28 +		BSRLI4(\rD, \rA) +		BSRLI4(\rD, \rD) +		BSRLI20(\rD, \rD) +	.else +	.error "BSRLI shift macros \IMM" +	.endif +	.endm  	#endif +  #endif /* CONFIG_MMU */  .extern other_exception_handler /* Defined in exception.c */ @@ -194,8 +218,8 @@   *      -                            W   S   REG   EXC   *   * - * STACK FRAME STRUCTURE (for NO_MMU) - * --------------------------------- + * STACK FRAME STRUCTURE (for CONFIG_MMU=n) + * ----------------------------------------   *   *      +-------------+         + 0   *      |     MSR     | @@ -210,8 +234,8 @@   *      |      .      |   *      |      .      |   * - * NO_MMU kernel use the same r0_ram pointed space - look to vmlinux.lds.S - * which is used for storing register values - old style was, that value were + * MMU kernel uses the same 'pt_pool_space' pointed space + * which is used for storing register values - noMMu style was, that values were   * stored in stack but in case of failure you lost information about register.   * Currently you can see register value in memory in specific place.   * In compare to with previous solution the speed should be the same. @@ -230,8 +254,22 @@   */  /* wrappers to restore state before coming to entry.S */ -  #ifdef CONFIG_MMU +.section .data +.align 4 +pt_pool_space: +	.space	PT_SIZE + +#ifdef DEBUG +/* Create space for exception counting. */ +.section .data +.global exception_debug_table +.align 4 +exception_debug_table: +	/* Look at exception vector table. There is 32 exceptions * word size */ +	.space	(32 * 4) +#endif /* DEBUG */ +  .section .rodata  .align 4  _MB_HW_ExceptionVectorTable: @@ -291,10 +329,10 @@ _hw_exception_handler:  #ifndef CONFIG_MMU  	addik	r1, r1, -(EX_HANDLER_STACK_SIZ); /* Create stack frame */  #else -	swi	r1, r0, TOPHYS(r0_ram + 0); /* GET_SP */ +	swi	r1, r0, TOPHYS(pt_pool_space + PT_R1); /* GET_SP */  	/* Save date to kernel memory. Here is the problem  	 * when you came from user space */ -	ori	r1, r0, TOPHYS(r0_ram + 28); +	ori	r1, r0, TOPHYS(pt_pool_space);  #endif  	swi	r3, r1, PT_R3  	swi	r4, r1, PT_R4 @@ -333,12 +371,12 @@ not_in_delay_slot:  #ifdef DEBUG  /* counting which exception happen */ -	lwi	r5, r0, 0x200 + TOPHYS(r0_ram) +	lwi	r5, r0, TOPHYS(exception_debug_table)  	addi	r5, r5, 1 -	swi	r5, r0, 0x200 + TOPHYS(r0_ram) -	lwi	r5, r6, 0x200 + TOPHYS(r0_ram) +	swi	r5, r0, TOPHYS(exception_debug_table) +	lwi	r5, r6, TOPHYS(exception_debug_table)  	addi	r5, r5, 1 -	swi	r5, r6, 0x200 + TOPHYS(r0_ram) +	swi	r5, r6, TOPHYS(exception_debug_table)  #endif  /* end */  	/* Load the HW Exception vector */ @@ -478,7 +516,7 @@ ex_lw_tail:  	/* Get the destination register number into r5 */  	lbui	r5, r0, TOPHYS(ex_reg_op);  	/* Form load_word jump table offset (lw_table + (8 * regnum)) */ -	la	r6, r0, TOPHYS(lw_table); +	addik	r6, r0, TOPHYS(lw_table);  	addk	r5, r5, r5;  	addk	r5, r5, r5;  	addk	r5, r5, r5; @@ -489,7 +527,7 @@ ex_sw:  	/* Get the destination register number into r5 */  	lbui	r5, r0, TOPHYS(ex_reg_op);  	/* Form store_word jump table offset (sw_table + (8 * regnum)) */ -	la	r6, r0, TOPHYS(sw_table); +	addik	r6, r0, TOPHYS(sw_table);  	add	r5, r5, r5;  	add	r5, r5, r5;  	add	r5, r5, r5; @@ -569,7 +607,7 @@ ex_handler_done:  		 * tried to access a kernel or read-protected page - always  		 * a SEGV). All other faults here must be stores, so no  		 * need to check ESR_S as well. */ -		andi	r4, r4, 0x800		/* ESR_Z - zone protection */ +		andi	r4, r4, ESR_DIZ		/* ESR_Z - zone protection */  		bnei	r4, ex2  		ori	r4, r0, swapper_pg_dir @@ -583,25 +621,25 @@ ex_handler_done:  		 * tried to access a kernel or read-protected page - always  		 * a SEGV). All other faults here must be stores, so no  		 * need to check ESR_S as well. */ -		andi	r4, r4, 0x800		/* ESR_Z */ +		andi	r4, r4, ESR_DIZ		/* ESR_Z */  		bnei	r4, ex2  		/* get current task address */  		addi	r4 ,CURRENT_TASK, TOPHYS(0);  		lwi	r4, r4, TASK_THREAD+PGDIR  	ex4:  		tophys(r4,r4) -		BSRLI(r5,r3,20)		/* Create L1 (pgdir/pmd) address */ -		andi	r5, r5, 0xffc +		/* Create L1 (pgdir/pmd) address */ +		bsrli	r5, r3, PGDIR_SHIFT - 2 +		andi	r5, r5, PAGE_SIZE - 4  /* Assume pgdir aligned on 4K boundary, no need for "andi r4,r4,0xfffff003" */  		or	r4, r4, r5  		lwi	r4, r4, 0		/* Get L1 entry */ -		andi	r5, r4, 0xfffff000 /* Extract L2 (pte) base address */ +		andi	r5, r4, PAGE_MASK /* Extract L2 (pte) base address */  		beqi	r5, ex2			/* Bail if no table */  		tophys(r5,r5) -		BSRLI(r6,r3,10)			/* Compute PTE address */ -		andi	r6, r6, 0xffc -		andi	r5, r5, 0xfffff003 +		bsrli	r6, r3, PTE_SHIFT /* Compute PTE address */ +		andi	r6, r6, PAGE_SIZE - 4  		or	r5, r5, r6  		lwi	r4, r5, 0		/* Get Linux PTE */ @@ -620,7 +658,9 @@ ex_handler_done:  		 * Many of these bits are software only. Bits we don't set  		 * here we (properly should) assume have the appropriate value.  		 */ -		andni	r4, r4, 0x0ce2		/* Make sure 20, 21 are zero */ +/* Ignore memory coherent, just LSB on ZSEL is used + EX/WR */ +		andi	r4, r4, PAGE_MASK | TLB_EX | TLB_WR | \ +						TLB_ZSEL(1) | TLB_ATTR_MASK  		ori	r4, r4, _PAGE_HWEXEC	/* make it executable */  		/* find the TLB index that caused the fault. It has to be here*/ @@ -689,18 +729,18 @@ ex_handler_done:  		lwi	r4, r4, TASK_THREAD+PGDIR  	ex6:  		tophys(r4,r4) -		BSRLI(r5,r3,20)		/* Create L1 (pgdir/pmd) address */ -		andi	r5, r5, 0xffc +		/* Create L1 (pgdir/pmd) address */ +		bsrli	r5, r3, PGDIR_SHIFT - 2 +		andi	r5, r5, PAGE_SIZE - 4  /* Assume pgdir aligned on 4K boundary, no need for "andi r4,r4,0xfffff003" */  		or	r4, r4, r5  		lwi	r4, r4, 0		/* Get L1 entry */ -		andi	r5, r4, 0xfffff000 /* Extract L2 (pte) base address */ +		andi	r5, r4, PAGE_MASK /* Extract L2 (pte) base address */  		beqi	r5, ex7			/* Bail if no table */  		tophys(r5,r5) -		BSRLI(r6,r3,10)			/* Compute PTE address */ -		andi	r6, r6, 0xffc -		andi	r5, r5, 0xfffff003 +		bsrli	r6, r3, PTE_SHIFT /* Compute PTE address */ +		andi	r6, r6, PAGE_SIZE - 4  		or	r5, r5, r6  		lwi	r4, r5, 0		/* Get Linux PTE */ @@ -719,7 +759,8 @@ ex_handler_done:  		 * here we (properly should) assume have the appropriate value.  		 */  		brid	finish_tlb_load -		andni	r4, r4, 0x0ce2		/* Make sure 20, 21 are zero */ +		andi	r4, r4, PAGE_MASK | TLB_EX | TLB_WR | \ +						TLB_ZSEL(1) | TLB_ATTR_MASK  	ex7:  		/* The bailout. Restore registers to pre-exception conditions  		 * and call the heavyweights to help us out. @@ -759,18 +800,18 @@ ex_handler_done:  		lwi	r4, r4, TASK_THREAD+PGDIR  	ex9:  		tophys(r4,r4) -		BSRLI(r5,r3,20)		/* Create L1 (pgdir/pmd) address */ -		andi	r5, r5, 0xffc +		/* Create L1 (pgdir/pmd) address */ +		bsrli	r5, r3, PGDIR_SHIFT - 2 +		andi	r5, r5, PAGE_SIZE - 4  /* Assume pgdir aligned on 4K boundary, no need for "andi r4,r4,0xfffff003" */  		or	r4, r4, r5  		lwi	r4, r4, 0		/* Get L1 entry */ -		andi	r5, r4, 0xfffff000 /* Extract L2 (pte) base address */ +		andi	r5, r4, PAGE_MASK /* Extract L2 (pte) base address */  		beqi	r5, ex10		/* Bail if no table */  		tophys(r5,r5) -		BSRLI(r6,r3,10)			/* Compute PTE address */ -		andi	r6, r6, 0xffc -		andi	r5, r5, 0xfffff003 +		bsrli	r6, r3, PTE_SHIFT /* Compute PTE address */ +		andi	r6, r6, PAGE_SIZE - 4  		or	r5, r5, r6  		lwi	r4, r5, 0		/* Get Linux PTE */ @@ -789,7 +830,8 @@ ex_handler_done:  		 * here we (properly should) assume have the appropriate value.  		 */  		brid	finish_tlb_load -		andni	r4, r4, 0x0ce2		/* Make sure 20, 21 are zero */ +		andi	r4, r4, PAGE_MASK | TLB_EX | TLB_WR | \ +						TLB_ZSEL(1) | TLB_ATTR_MASK  	ex10:  		/* The bailout. Restore registers to pre-exception conditions  		 * and call the heavyweights to help us out. @@ -808,19 +850,26 @@ ex_handler_done:   *	Upon exit, we reload everything and RFI.   * A common place to load the TLB.   */ +.section .data +.align 4 +.global tlb_skip +	tlb_skip: +		.long	MICROBLAZE_TLB_SKIP  	tlb_index: -		.long	1 /* MS: storing last used tlb index */ +		/* MS: storing last used tlb index */ +		.long	MICROBLAZE_TLB_SIZE/2 +.previous  	finish_tlb_load:  		/* MS: load the last used TLB index. */  		lwi	r5, r0, TOPHYS(tlb_index)  		addik	r5, r5, 1 /* MS: inc tlb_index -> use next one */  /* MS: FIXME this is potential fault, because this is mask not count */ -		andi	r5, r5, (MICROBLAZE_TLB_SIZE-1) +		andi	r5, r5, MICROBLAZE_TLB_SIZE - 1  		ori	r6, r0, 1  		cmp	r31, r5, r6  		blti	r31, ex12 -		addik	r5, r6, 1 +		lwi	r5, r0, TOPHYS(tlb_skip)  	ex12:  		/* MS: save back current TLB index */  		swi	r5, r0, TOPHYS(tlb_index) @@ -835,8 +884,14 @@ ex_handler_done:  		 * set of bits. These are size, valid, E, U0, and ensure  		 * bits 20 and 21 are zero.  		 */ -		andi	r3, r3, 0xfffff000 -		ori	r3, r3, 0x0c0 +		andi	r3, r3, PAGE_MASK +#ifdef CONFIG_MICROBLAZE_64K_PAGES +		ori	r3, r3, TLB_VALID | TLB_PAGESZ(PAGESZ_64K) +#elif CONFIG_MICROBLAZE_16K_PAGES +		ori	r3, r3, TLB_VALID | TLB_PAGESZ(PAGESZ_16K) +#else +		ori	r3, r3, TLB_VALID | TLB_PAGESZ(PAGESZ_4K) +#endif  		mts	rtlbhi,	r3		/* Load TLB HI */  		nop @@ -892,7 +947,7 @@ ex_handler_done:  .ent _unaligned_data_exception  _unaligned_data_exception:  	andi	r8, r3, 0x3E0;	/* Mask and extract the register operand */ -	BSRLI(r8,r8,2);		/* r8 >> 2 = register operand * 8 */ +	bsrli   r8, r8, 2;		/* r8 >> 2 = register operand * 8 */  	andi	r6, r3, 0x400;	/* Extract ESR[S] */  	bneid	r6, ex_sw_vm;  	andi	r6, r3, 0x800;	/* Extract ESR[W] - delay slot */ @@ -900,7 +955,7 @@ ex_lw_vm:  	beqid	r6, ex_lhw_vm;  load1:	lbui	r5, r4, 0;	/* Exception address in r4 - delay slot */  /* Load a word, byte-by-byte from destination address and save it in tmp space*/ -	la	r6, r0, ex_tmp_data_loc_0; +	addik	r6, r0, ex_tmp_data_loc_0;  	sbi	r5, r6, 0;  load2:	lbui	r5, r4, 1;  	sbi	r5, r6, 1; @@ -914,7 +969,7 @@ load4:	lbui	r5, r4, 3;  ex_lhw_vm:  	/* Load a half-word, byte-by-byte from destination address and  	 * save it in tmp space */ -	la	r6, r0, ex_tmp_data_loc_0; +	addik	r6, r0, ex_tmp_data_loc_0;  	sbi	r5, r6, 0;  load5:	lbui	r5, r4, 1;  	sbi	r5, r6, 1; @@ -930,7 +985,7 @@ ex_sw_vm:  	addik	r5, r8, sw_table_vm;  	bra	r5;  ex_sw_tail_vm: -	la	r5, r0, ex_tmp_data_loc_0; +	addik	r5, r0, ex_tmp_data_loc_0;  	beqid	r6, ex_shw_vm;  	swi	r3, r5, 0;	/* Get the word - delay slot */  	/* Store the word, byte-by-byte into destination address */ @@ -945,11 +1000,20 @@ store3:	sbi	r3, r4, 2;  store4:	sbi	r3, r4, 3;	/* Delay slot */  ex_shw_vm:  	/* Store the lower half-word, byte-by-byte into destination address */ +#ifdef __MICROBLAZEEL__ +	lbui	r3, r5, 0; +store5:	sbi	r3, r4, 0; +	lbui	r3, r5, 1; +	brid	ret_from_exc; +store6:	sbi	r3, r4, 1;	/* Delay slot */ +#else  	lbui	r3, r5, 2;  store5:	sbi	r3, r4, 0;  	lbui	r3, r5, 3;  	brid	ret_from_exc;  store6:	sbi	r3, r4, 1;	/* Delay slot */ +#endif +  ex_sw_end_vm:			/* Exception handling of store word, ends. */  /* We have to prevent cases that get/put_user macros get unaligned pointer @@ -964,7 +1028,7 @@ ex_unaligned_fixup:  	addik	r7, r0, SIGSEGV  	/* call bad_page_fault for finding aligned fixup, fixup address is saved  	 * in PT_PC which is used as return address from exception */ -	la	r15, r0, ret_from_exc-8 /* setup return address */ +	addik	r15, r0, ret_from_exc-8 /* setup return address */  	brid	bad_page_fault  	nop @@ -1092,23 +1156,23 @@ lw_r10_vm:	R3_TO_LWREG_VM_V	(10);  lw_r11_vm:	R3_TO_LWREG_VM_V	(11);  lw_r12_vm:	R3_TO_LWREG_VM_V	(12);  lw_r13_vm:	R3_TO_LWREG_VM_V	(13); -lw_r14_vm:	R3_TO_LWREG_VM		(14); +lw_r14_vm:	R3_TO_LWREG_VM_V	(14);  lw_r15_vm:	R3_TO_LWREG_VM_V	(15); -lw_r16_vm:	R3_TO_LWREG_VM		(16); +lw_r16_vm:	R3_TO_LWREG_VM_V	(16);  lw_r17_vm:	R3_TO_LWREG_VM_V	(17);  lw_r18_vm:	R3_TO_LWREG_VM_V	(18); -lw_r19_vm:	R3_TO_LWREG_VM		(19); -lw_r20_vm:	R3_TO_LWREG_VM		(20); -lw_r21_vm:	R3_TO_LWREG_VM		(21); -lw_r22_vm:	R3_TO_LWREG_VM		(22); -lw_r23_vm:	R3_TO_LWREG_VM		(23); -lw_r24_vm:	R3_TO_LWREG_VM		(24); -lw_r25_vm:	R3_TO_LWREG_VM		(25); -lw_r26_vm:	R3_TO_LWREG_VM		(26); -lw_r27_vm:	R3_TO_LWREG_VM		(27); -lw_r28_vm:	R3_TO_LWREG_VM		(28); -lw_r29_vm:	R3_TO_LWREG_VM		(29); -lw_r30_vm:	R3_TO_LWREG_VM		(30); +lw_r19_vm:	R3_TO_LWREG_VM_V	(19); +lw_r20_vm:	R3_TO_LWREG_VM_V	(20); +lw_r21_vm:	R3_TO_LWREG_VM_V	(21); +lw_r22_vm:	R3_TO_LWREG_VM_V	(22); +lw_r23_vm:	R3_TO_LWREG_VM_V	(23); +lw_r24_vm:	R3_TO_LWREG_VM_V	(24); +lw_r25_vm:	R3_TO_LWREG_VM_V	(25); +lw_r26_vm:	R3_TO_LWREG_VM_V	(26); +lw_r27_vm:	R3_TO_LWREG_VM_V	(27); +lw_r28_vm:	R3_TO_LWREG_VM_V	(28); +lw_r29_vm:	R3_TO_LWREG_VM_V	(29); +lw_r30_vm:	R3_TO_LWREG_VM_V	(30);  lw_r31_vm:	R3_TO_LWREG_VM_V	(31);  sw_table_vm: @@ -1126,23 +1190,23 @@ sw_r10_vm:	SWREG_TO_R3_VM_V	(10);  sw_r11_vm:	SWREG_TO_R3_VM_V	(11);  sw_r12_vm:	SWREG_TO_R3_VM_V	(12);  sw_r13_vm:	SWREG_TO_R3_VM_V	(13); -sw_r14_vm:	SWREG_TO_R3_VM		(14); +sw_r14_vm:	SWREG_TO_R3_VM_V	(14);  sw_r15_vm:	SWREG_TO_R3_VM_V	(15); -sw_r16_vm:	SWREG_TO_R3_VM		(16); +sw_r16_vm:	SWREG_TO_R3_VM_V	(16);  sw_r17_vm:	SWREG_TO_R3_VM_V	(17);  sw_r18_vm:	SWREG_TO_R3_VM_V	(18); -sw_r19_vm:	SWREG_TO_R3_VM		(19); -sw_r20_vm:	SWREG_TO_R3_VM		(20); -sw_r21_vm:	SWREG_TO_R3_VM		(21); -sw_r22_vm:	SWREG_TO_R3_VM		(22); -sw_r23_vm:	SWREG_TO_R3_VM		(23); -sw_r24_vm:	SWREG_TO_R3_VM		(24); -sw_r25_vm:	SWREG_TO_R3_VM		(25); -sw_r26_vm:	SWREG_TO_R3_VM		(26); -sw_r27_vm:	SWREG_TO_R3_VM		(27); -sw_r28_vm:	SWREG_TO_R3_VM		(28); -sw_r29_vm:	SWREG_TO_R3_VM		(29); -sw_r30_vm:	SWREG_TO_R3_VM		(30); +sw_r19_vm:	SWREG_TO_R3_VM_V	(19); +sw_r20_vm:	SWREG_TO_R3_VM_V	(20); +sw_r21_vm:	SWREG_TO_R3_VM_V	(21); +sw_r22_vm:	SWREG_TO_R3_VM_V	(22); +sw_r23_vm:	SWREG_TO_R3_VM_V	(23); +sw_r24_vm:	SWREG_TO_R3_VM_V	(24); +sw_r25_vm:	SWREG_TO_R3_VM_V	(25); +sw_r26_vm:	SWREG_TO_R3_VM_V	(26); +sw_r27_vm:	SWREG_TO_R3_VM_V	(27); +sw_r28_vm:	SWREG_TO_R3_VM_V	(28); +sw_r29_vm:	SWREG_TO_R3_VM_V	(29); +sw_r30_vm:	SWREG_TO_R3_VM_V	(30);  sw_r31_vm:	SWREG_TO_R3_VM_V	(31);  #endif /* CONFIG_MMU */ diff --git a/arch/microblaze/kernel/init_task.c b/arch/microblaze/kernel/init_task.c deleted file mode 100644 index b5d711f94ff..00000000000 --- a/arch/microblaze/kernel/init_task.c +++ /dev/null @@ -1,26 +0,0 @@ -/* - * Copyright (C) 2009 Michal Simek <monstr@monstr.eu> - * Copyright (C) 2009 PetaLogix - * Copyright (C) 2006 Atmark Techno, Inc. - * - * This file is subject to the terms and conditions of the GNU General Public - * License. See the file "COPYING" in the main directory of this archive - * for more details. - */ - -#include <linux/module.h> -#include <linux/sched.h> -#include <linux/init_task.h> -#include <linux/fs.h> -#include <linux/mqueue.h> - -#include <asm/pgtable.h> - -static struct signal_struct init_signals = INIT_SIGNALS(init_signals); -static struct sighand_struct init_sighand = INIT_SIGHAND(init_sighand); - -union thread_union init_thread_union __init_task_data = -	{ INIT_THREAD_INFO(init_task) }; - -struct task_struct init_task = INIT_TASK(init_task); -EXPORT_SYMBOL(init_task); diff --git a/arch/microblaze/kernel/intc.c b/arch/microblaze/kernel/intc.c index d61ea33aff7..15c7c12ea0e 100644 --- a/arch/microblaze/kernel/intc.c +++ b/arch/microblaze/kernel/intc.c @@ -1,5 +1,6 @@  /* - * Copyright (C) 2007-2009 Michal Simek <monstr@monstr.eu> + * Copyright (C) 2007-2013 Michal Simek <monstr@monstr.eu> + * Copyright (C) 2012-2013 Xilinx, Inc.   * Copyright (C) 2007-2009 PetaLogix   * Copyright (C) 2006 Atmark Techno, Inc.   * @@ -8,24 +9,15 @@   * for more details.   */ -#include <linux/init.h> +#include <linux/irqdomain.h>  #include <linux/irq.h> -#include <asm/page.h> +#include <linux/of_address.h>  #include <linux/io.h>  #include <linux/bug.h> -#include <asm/prom.h> -#include <asm/irq.h> +#include "../../drivers/irqchip/irqchip.h" -#ifdef CONFIG_SELFMOD_INTC -#include <asm/selfmod.h> -#define INTC_BASE	BARRIER_BASE_ADDR -#else -static unsigned int intc_baseaddr; -#define INTC_BASE	intc_baseaddr -#endif - -unsigned int nr_irq; +static void __iomem *intc_baseaddr;  /* No one else should require these constants, so define them locally here. */  #define ISR 0x00			/* Interrupt Status Register */ @@ -40,143 +32,166 @@ unsigned int nr_irq;  #define MER_ME (1<<0)  #define MER_HIE (1<<1) -static void intc_enable_or_unmask(unsigned int irq) +static unsigned int (*read_fn)(void __iomem *); +static void (*write_fn)(u32, void __iomem *); + +static void intc_write32(u32 val, void __iomem *addr) +{ +	iowrite32(val, addr); +} + +static unsigned int intc_read32(void __iomem *addr) +{ +	return ioread32(addr); +} + +static void intc_write32_be(u32 val, void __iomem *addr) +{ +	iowrite32be(val, addr); +} + +static unsigned int intc_read32_be(void __iomem *addr)  { -	unsigned long mask = 1 << irq; -	pr_debug("enable_or_unmask: %d\n", irq); -	out_be32(INTC_BASE + SIE, mask); +	return ioread32be(addr); +} + +static void intc_enable_or_unmask(struct irq_data *d) +{ +	unsigned long mask = 1 << d->hwirq; + +	pr_debug("enable_or_unmask: %ld\n", d->hwirq);  	/* ack level irqs because they can't be acked during  	 * ack function since the handle_level_irq function  	 * acks the irq before calling the interrupt handler  	 */ -	if (irq_desc[irq].status & IRQ_LEVEL) -		out_be32(INTC_BASE + IAR, mask); -} +	if (irqd_is_level_type(d)) +		write_fn(mask, intc_baseaddr + IAR); -static void intc_disable_or_mask(unsigned int irq) -{ -	pr_debug("disable: %d\n", irq); -	out_be32(INTC_BASE + CIE, 1 << irq); +	write_fn(mask, intc_baseaddr + SIE);  } -static void intc_ack(unsigned int irq) +static void intc_disable_or_mask(struct irq_data *d)  { -	pr_debug("ack: %d\n", irq); -	out_be32(INTC_BASE + IAR, 1 << irq); +	pr_debug("disable: %ld\n", d->hwirq); +	write_fn(1 << d->hwirq, intc_baseaddr + CIE);  } -static void intc_mask_ack(unsigned int irq) +static void intc_ack(struct irq_data *d)  { -	unsigned long mask = 1 << irq; -	pr_debug("disable_and_ack: %d\n", irq); -	out_be32(INTC_BASE + CIE, mask); -	out_be32(INTC_BASE + IAR, mask); +	pr_debug("ack: %ld\n", d->hwirq); +	write_fn(1 << d->hwirq, intc_baseaddr + IAR);  } -static void intc_end(unsigned int irq) +static void intc_mask_ack(struct irq_data *d)  { -	unsigned long mask = 1 << irq; -	pr_debug("end: %d\n", irq); -	if (!(irq_desc[irq].status & (IRQ_DISABLED | IRQ_INPROGRESS))) { -		out_be32(INTC_BASE + SIE, mask); -		/* ack level sensitive intr */ -		if (irq_desc[irq].status & IRQ_LEVEL) -			out_be32(INTC_BASE + IAR, mask); -	} +	unsigned long mask = 1 << d->hwirq; + +	pr_debug("disable_and_ack: %ld\n", d->hwirq); +	write_fn(mask, intc_baseaddr + CIE); +	write_fn(mask, intc_baseaddr + IAR);  }  static struct irq_chip intc_dev = {  	.name = "Xilinx INTC", -	.unmask = intc_enable_or_unmask, -	.mask = intc_disable_or_mask, -	.ack = intc_ack, -	.mask_ack = intc_mask_ack, -	.end = intc_end, +	.irq_unmask = intc_enable_or_unmask, +	.irq_mask = intc_disable_or_mask, +	.irq_ack = intc_ack, +	.irq_mask_ack = intc_mask_ack,  }; -unsigned int get_irq(struct pt_regs *regs) +static struct irq_domain *root_domain; + +unsigned int get_irq(void)  { -	int irq; +	unsigned int hwirq, irq = -1; -	/* -	 * NOTE: This function is the one that needs to be improved in -	 * order to handle multiple interrupt controllers. It currently -	 * is hardcoded to check for interrupts only on the first INTC. -	 */ -	irq = in_be32(INTC_BASE + IVR); -	pr_debug("get_irq: %d\n", irq); +	hwirq = read_fn(intc_baseaddr + IVR); +	if (hwirq != -1U) +		irq = irq_find_mapping(root_domain, hwirq); + +	pr_debug("get_irq: hwirq=%d, irq=%d\n", hwirq, irq);  	return irq;  } -void __init init_IRQ(void) +static int xintc_map(struct irq_domain *d, unsigned int irq, irq_hw_number_t hw) +{ +	u32 intr_mask = (u32)d->host_data; + +	if (intr_mask & (1 << hw)) { +		irq_set_chip_and_handler_name(irq, &intc_dev, +						handle_edge_irq, "edge"); +		irq_clear_status_flags(irq, IRQ_LEVEL); +	} else { +		irq_set_chip_and_handler_name(irq, &intc_dev, +						handle_level_irq, "level"); +		irq_set_status_flags(irq, IRQ_LEVEL); +	} +	return 0; +} + +static const struct irq_domain_ops xintc_irq_domain_ops = { +	.xlate = irq_domain_xlate_onetwocell, +	.map = xintc_map, +}; + +static int __init xilinx_intc_of_init(struct device_node *intc, +					     struct device_node *parent)  { -	u32 i, j, intr_type; -	struct device_node *intc = NULL; -#ifdef CONFIG_SELFMOD_INTC -	unsigned int intc_baseaddr = 0; -	static int arr_func[] = { -				(int)&get_irq, -				(int)&intc_enable_or_unmask, -				(int)&intc_disable_or_mask, -				(int)&intc_mask_ack, -				(int)&intc_ack, -				(int)&intc_end, -				0 -			}; -#endif -	const char * const intc_list[] = { -				"xlnx,xps-intc-1.00.a", -				NULL -			}; - -	for (j = 0; intc_list[j] != NULL; j++) { -		intc = of_find_compatible_node(NULL, NULL, intc_list[j]); -		if (intc) -			break; +	u32 nr_irq, intr_mask; +	int ret; + +	intc_baseaddr = of_iomap(intc, 0); +	BUG_ON(!intc_baseaddr); + +	ret = of_property_read_u32(intc, "xlnx,num-intr-inputs", &nr_irq); +	if (ret < 0) { +		pr_err("%s: unable to read xlnx,num-intr-inputs\n", __func__); +		return -EINVAL; +	} + +	ret = of_property_read_u32(intc, "xlnx,kind-of-intr", &intr_mask); +	if (ret < 0) { +		pr_err("%s: unable to read xlnx,kind-of-intr\n", __func__); +		return -EINVAL;  	} -	BUG_ON(!intc); - -	intc_baseaddr = be32_to_cpup(of_get_property(intc, -								"reg", NULL)); -	intc_baseaddr = (unsigned long) ioremap(intc_baseaddr, PAGE_SIZE); -	nr_irq = be32_to_cpup(of_get_property(intc, -						"xlnx,num-intr-inputs", NULL)); - -	intr_type = -		be32_to_cpup(of_get_property(intc, -						"xlnx,kind-of-intr", NULL)); -	if (intr_type >= (1 << (nr_irq + 1))) -		printk(KERN_INFO " ERROR: Mismatch in kind-of-intr param\n"); - -#ifdef CONFIG_SELFMOD_INTC -	selfmod_function((int *) arr_func, intc_baseaddr); -#endif -	printk(KERN_INFO "%s #0 at 0x%08x, num_irq=%d, edge=0x%x\n", -		intc_list[j], intc_baseaddr, nr_irq, intr_type); + +	if (intr_mask > (u32)((1ULL << nr_irq) - 1)) +		pr_info(" ERROR: Mismatch in kind-of-intr param\n"); + +	pr_info("%s: num_irq=%d, edge=0x%x\n", +		intc->full_name, nr_irq, intr_mask); + +	write_fn = intc_write32; +	read_fn = intc_read32;  	/*  	 * Disable all external interrupts until they are  	 * explicity requested.  	 */ -	out_be32(intc_baseaddr + IER, 0); +	write_fn(0, intc_baseaddr + IER);  	/* Acknowledge any pending interrupts just in case. */ -	out_be32(intc_baseaddr + IAR, 0xffffffff); +	write_fn(0xffffffff, intc_baseaddr + IAR);  	/* Turn on the Master Enable. */ -	out_be32(intc_baseaddr + MER, MER_HIE | MER_ME); - -	for (i = 0; i < nr_irq; ++i) { -		if (intr_type & (0x00000001 << i)) { -			set_irq_chip_and_handler_name(i, &intc_dev, -				handle_edge_irq, intc_dev.name); -			irq_desc[i].status &= ~IRQ_LEVEL; -		} else { -			set_irq_chip_and_handler_name(i, &intc_dev, -				handle_level_irq, intc_dev.name); -			irq_desc[i].status |= IRQ_LEVEL; -		} +	write_fn(MER_HIE | MER_ME, intc_baseaddr + MER); +	if (!(read_fn(intc_baseaddr + MER) & (MER_HIE | MER_ME))) { +		write_fn = intc_write32_be; +		read_fn = intc_read32_be; +		write_fn(MER_HIE | MER_ME, intc_baseaddr + MER);  	} + +	/* Yeah, okay, casting the intr_mask to a void* is butt-ugly, but I'm +	 * lazy and Michal can clean it up to something nicer when he tests +	 * and commits this patch.  ~~gcl */ +	root_domain = irq_domain_add_linear(intc, nr_irq, &xintc_irq_domain_ops, +							(void *)intr_mask); + +	irq_set_default_host(root_domain); + +	return 0;  } + +IRQCHIP_DECLARE(xilinx_intc, "xlnx,xps-intc-1.00.a", xilinx_intc_of_init); diff --git a/arch/microblaze/kernel/irq.c b/arch/microblaze/kernel/irq.c index a9345fb4906..11e24de91aa 100644 --- a/arch/microblaze/kernel/irq.c +++ b/arch/microblaze/kernel/irq.c @@ -17,10 +17,9 @@  #include <linux/seq_file.h>  #include <linux/kernel_stat.h>  #include <linux/irq.h> +#include <linux/irqchip.h>  #include <linux/of_irq.h> -#include <asm/prom.h> -  static u32 concurrent_irq;  void __irq_entry do_IRQ(struct pt_regs *regs) @@ -30,12 +29,12 @@ void __irq_entry do_IRQ(struct pt_regs *regs)  	trace_hardirqs_off();  	irq_enter(); -	irq = get_irq(regs); +	irq = get_irq();  next_irq: -	BUG_ON(irq == -1U); +	BUG_ON(!irq);  	generic_handle_irq(irq); -	irq = get_irq(regs); +	irq = get_irq();  	if (irq != -1U) {  		pr_debug("next irq: %d\n", irq);  		++concurrent_irq; @@ -47,57 +46,8 @@ next_irq:  	trace_hardirqs_on();  } -int show_interrupts(struct seq_file *p, void *v) -{ -	int i = *(loff_t *) v, j; -	struct irqaction *action; -	unsigned long flags; - -	if (i == 0) { -		seq_printf(p, "		"); -		for_each_online_cpu(j) -			seq_printf(p, "CPU%-8d", j); -		seq_putc(p, '\n'); -	} - -	if (i < nr_irq) { -		raw_spin_lock_irqsave(&irq_desc[i].lock, flags); -		action = irq_desc[i].action; -		if (!action) -			goto skip; -		seq_printf(p, "%3d: ", i); -#ifndef CONFIG_SMP -		seq_printf(p, "%10u ", kstat_irqs(i)); -#else -		for_each_online_cpu(j) -			seq_printf(p, "%10u ", kstat_cpu(j).irqs[i]); -#endif -		seq_printf(p, " %8s", irq_desc[i].status & -					IRQ_LEVEL ? "level" : "edge"); -		seq_printf(p, " %8s", irq_desc[i].chip->name); -		seq_printf(p, "  %s", action->name); - -		for (action = action->next; action; action = action->next) -			seq_printf(p, ", %s", action->name); - -		seq_putc(p, '\n'); -skip: -		raw_spin_unlock_irqrestore(&irq_desc[i].lock, flags); -	} -	return 0; -} - -/* MS: There is no any advance mapping mechanism. We are using simple 32bit -  intc without any cascades or any connection that's why mapping is 1:1 */ -unsigned int irq_create_mapping(struct irq_host *host, irq_hw_number_t hwirq) -{ -	return hwirq; -} -EXPORT_SYMBOL_GPL(irq_create_mapping); - -unsigned int irq_create_of_mapping(struct device_node *controller, -				   const u32 *intspec, unsigned int intsize) +void __init init_IRQ(void)  { -	return intspec[0]; +	/* process the entire interrupt tree in one go */ +	irqchip_init();  } -EXPORT_SYMBOL_GPL(irq_create_of_mapping); diff --git a/arch/microblaze/kernel/mcount.S b/arch/microblaze/kernel/mcount.S index e7eaa7a8cbd..fc1e1322ce4 100644 --- a/arch/microblaze/kernel/mcount.S +++ b/arch/microblaze/kernel/mcount.S @@ -138,7 +138,7 @@ NOALIGN_ENTRY(ftrace_call)  #endif /* CONFIG_DYNAMIC_FTRACE */  /* static normal trace */  	lwi	r6, r1, 120; /* MS: load parent addr */ -	addik	r5, r15, 0; /* MS: load current function addr */ +	addik	r5, r15, -4; /* MS: load current function addr */  	/* MS: here is dependency on previous code */  	brald	r15, r20; /* MS: jump to ftrace handler */  	nop; diff --git a/arch/microblaze/kernel/microblaze_ksyms.c b/arch/microblaze/kernel/microblaze_ksyms.c index 5cb03417400..9f1d02c4c5c 100644 --- a/arch/microblaze/kernel/microblaze_ksyms.c +++ b/arch/microblaze/kernel/microblaze_ksyms.c @@ -7,7 +7,7 @@   * published by the Free Software Foundation.   */ -#include <linux/module.h> +#include <linux/export.h>  #include <linux/string.h>  #include <linux/cryptohash.h>  #include <linux/delay.h> @@ -18,12 +18,9 @@  #include <asm/cacheflush.h>  #include <linux/io.h>  #include <asm/page.h> -#include <asm/system.h>  #include <linux/ftrace.h>  #include <linux/uaccess.h> -extern char *_ebss; -EXPORT_SYMBOL_GPL(_ebss);  #ifdef CONFIG_FUNCTION_TRACER  extern void _mcount(void);  EXPORT_SYMBOL(_mcount); @@ -45,3 +42,14 @@ EXPORT_SYMBOL(empty_zero_page);  #endif  EXPORT_SYMBOL(mbc); + +extern void __divsi3(void); +EXPORT_SYMBOL(__divsi3); +extern void __modsi3(void); +EXPORT_SYMBOL(__modsi3); +extern void __mulsi3(void); +EXPORT_SYMBOL(__mulsi3); +extern void __udivsi3(void); +EXPORT_SYMBOL(__udivsi3); +extern void __umodsi3(void); +EXPORT_SYMBOL(__umodsi3); diff --git a/arch/microblaze/kernel/misc.S b/arch/microblaze/kernel/misc.S index 206da3da361..1dafddeb8a0 100644 --- a/arch/microblaze/kernel/misc.S +++ b/arch/microblaze/kernel/misc.S @@ -29,16 +29,16 @@  .type  _tlbia, @function  .align 4;  _tlbia: -	addik	r12, r0, MICROBLAZE_TLB_SIZE - 1 /* flush all entries (63 - 3) */ +	lwi	r12, r0, tlb_skip;  	/* isync */  _tlbia_1:  	mts	rtlbx, r12  	nop  	mts	rtlbhi, r0 /* flush: ensure V is clear */  	nop -	addik	r11, r12, -2 +	rsubi	r11, r12, MICROBLAZE_TLB_SIZE - 1  	bneid	r11, _tlbia_1 /* loop for all entries */ -	addik	r12, r12, -1 +	addik	r12, r12, 1  	/* sync */  	rtsd	r15, 8  	nop @@ -75,7 +75,7 @@ early_console_reg_tlb_alloc:  	 * Load a TLB entry for the UART, so that microblaze_progress() can use  	 * the UARTs nice and early.  We use a 4k real==virtual mapping.  	 */ -	ori	r4, r0, MICROBLAZE_TLB_SIZE - 1 +	lwi	r4, r0, tlb_skip  	mts	rtlbx, r4 /* TLB slot 63 */  	or	r4,r5,r0 @@ -89,6 +89,11 @@ early_console_reg_tlb_alloc:  	nop  	mts	rtlbhi,r5 /* Load the tag portion of the entry */  	nop + +	lwi	r5, r0, tlb_skip +	addik	r5, r5, 1 +	swi	r5, r0, tlb_skip +  	rtsd	r15, 8  	nop diff --git a/arch/microblaze/kernel/module.c b/arch/microblaze/kernel/module.c index 0e73f660654..182e6be856c 100644 --- a/arch/microblaze/kernel/module.c +++ b/arch/microblaze/kernel/module.c @@ -7,7 +7,7 @@   * published by the Free Software Foundation.   */ -#include <linux/module.h> +#include <linux/export.h>  #include <linux/moduleloader.h>  #include <linux/kernel.h>  #include <linux/elf.h> @@ -18,37 +18,6 @@  #include <asm/pgtable.h>  #include <asm/cacheflush.h> -void *module_alloc(unsigned long size) -{ -	void *ret; -	ret = (size == 0) ? NULL : vmalloc(size); -	pr_debug("module_alloc (%08lx@%08lx)\n", size, (unsigned long int)ret); -	return ret; -} - -void module_free(struct module *module, void *region) -{ -	pr_debug("module_free(%s,%08lx)\n", module->name, -					(unsigned long)region); -	vfree(region); -} - -int module_frob_arch_sections(Elf_Ehdr *hdr, -				Elf_Shdr *sechdrs, -				char *secstrings, -				struct module *mod) -{ -	return 0; -} - -int apply_relocate(Elf32_Shdr *sechdrs, const char *strtab, -	unsigned int symindex, unsigned int relsec, struct module *module) -{ -	printk(KERN_ERR "module %s: ADD RELOCATION unsupported\n", -		module->name); -	return -ENOEXEC; -} -  int apply_relocate_add(Elf32_Shdr *sechdrs, const char *strtab,  	unsigned int symindex, unsigned int relsec, struct module *module)  { @@ -131,7 +100,7 @@ int apply_relocate_add(Elf32_Shdr *sechdrs, const char *strtab,  			break;  		case R_MICROBLAZE_64_NONE: -			pr_debug("R_MICROBLAZE_NONE\n"); +			pr_debug("R_MICROBLAZE_64_NONE\n");  			break;  		case R_MICROBLAZE_NONE: @@ -139,8 +108,7 @@ int apply_relocate_add(Elf32_Shdr *sechdrs, const char *strtab,  			break;  		default: -			printk(KERN_ERR "module %s: " -				"Unknown relocation: %u\n", +			pr_err("module %s: Unknown relocation: %u\n",  				module->name,  				ELF32_R_TYPE(rela[i].r_info));  			return -ENOEXEC; @@ -155,7 +123,3 @@ int module_finalize(const Elf32_Ehdr *hdr, const Elf_Shdr *sechdrs,  	flush_dcache();  	return 0;  } - -void module_arch_cleanup(struct module *mod) -{ -} diff --git a/arch/microblaze/platform/platform.c b/arch/microblaze/kernel/platform.c index b9529caa507..b9529caa507 100644 --- a/arch/microblaze/platform/platform.c +++ b/arch/microblaze/kernel/platform.c diff --git a/arch/microblaze/kernel/process.c b/arch/microblaze/kernel/process.c index ba7c4b16ed3..b2dd37196b3 100644 --- a/arch/microblaze/kernel/process.c +++ b/arch/microblaze/kernel/process.c @@ -8,158 +8,82 @@   * for more details.   */ -#include <linux/module.h> +#include <linux/cpu.h> +#include <linux/export.h>  #include <linux/sched.h>  #include <linux/pm.h>  #include <linux/tick.h>  #include <linux/bitops.h> -#include <asm/system.h> +#include <linux/ptrace.h>  #include <asm/pgalloc.h> -#include <asm/uaccess.h> /* for USER_DS macros */ +#include <linux/uaccess.h> /* for USER_DS macros */  #include <asm/cacheflush.h>  void show_regs(struct pt_regs *regs)  { -	printk(KERN_INFO " Registers dump: mode=%X\r\n", regs->pt_mode); -	printk(KERN_INFO " r1=%08lX, r2=%08lX, r3=%08lX, r4=%08lX\n", +	show_regs_print_info(KERN_INFO); + +	pr_info(" Registers dump: mode=%X\r\n", regs->pt_mode); +	pr_info(" r1=%08lX, r2=%08lX, r3=%08lX, r4=%08lX\n",  				regs->r1, regs->r2, regs->r3, regs->r4); -	printk(KERN_INFO " r5=%08lX, r6=%08lX, r7=%08lX, r8=%08lX\n", +	pr_info(" r5=%08lX, r6=%08lX, r7=%08lX, r8=%08lX\n",  				regs->r5, regs->r6, regs->r7, regs->r8); -	printk(KERN_INFO " r9=%08lX, r10=%08lX, r11=%08lX, r12=%08lX\n", +	pr_info(" r9=%08lX, r10=%08lX, r11=%08lX, r12=%08lX\n",  				regs->r9, regs->r10, regs->r11, regs->r12); -	printk(KERN_INFO " r13=%08lX, r14=%08lX, r15=%08lX, r16=%08lX\n", +	pr_info(" r13=%08lX, r14=%08lX, r15=%08lX, r16=%08lX\n",  				regs->r13, regs->r14, regs->r15, regs->r16); -	printk(KERN_INFO " r17=%08lX, r18=%08lX, r19=%08lX, r20=%08lX\n", +	pr_info(" r17=%08lX, r18=%08lX, r19=%08lX, r20=%08lX\n",  				regs->r17, regs->r18, regs->r19, regs->r20); -	printk(KERN_INFO " r21=%08lX, r22=%08lX, r23=%08lX, r24=%08lX\n", +	pr_info(" r21=%08lX, r22=%08lX, r23=%08lX, r24=%08lX\n",  				regs->r21, regs->r22, regs->r23, regs->r24); -	printk(KERN_INFO " r25=%08lX, r26=%08lX, r27=%08lX, r28=%08lX\n", +	pr_info(" r25=%08lX, r26=%08lX, r27=%08lX, r28=%08lX\n",  				regs->r25, regs->r26, regs->r27, regs->r28); -	printk(KERN_INFO " r29=%08lX, r30=%08lX, r31=%08lX, rPC=%08lX\n", +	pr_info(" r29=%08lX, r30=%08lX, r31=%08lX, rPC=%08lX\n",  				regs->r29, regs->r30, regs->r31, regs->pc); -	printk(KERN_INFO " msr=%08lX, ear=%08lX, esr=%08lX, fsr=%08lX\n", +	pr_info(" msr=%08lX, ear=%08lX, esr=%08lX, fsr=%08lX\n",  				regs->msr, regs->ear, regs->esr, regs->fsr);  } -void (*pm_idle)(void);  void (*pm_power_off)(void) = NULL;  EXPORT_SYMBOL(pm_power_off); -static int hlt_counter = 1; - -void disable_hlt(void) -{ -	hlt_counter++; -} -EXPORT_SYMBOL(disable_hlt); - -void enable_hlt(void) -{ -	hlt_counter--; -} -EXPORT_SYMBOL(enable_hlt); - -static int __init nohlt_setup(char *__unused) -{ -	hlt_counter = 1; -	return 1; -} -__setup("nohlt", nohlt_setup); - -static int __init hlt_setup(char *__unused) -{ -	hlt_counter = 0; -	return 1; -} -__setup("hlt", hlt_setup); - -void default_idle(void) -{ -	if (likely(hlt_counter)) { -		local_irq_disable(); -		stop_critical_timings(); -		cpu_relax(); -		start_critical_timings(); -		local_irq_enable(); -	} else { -		clear_thread_flag(TIF_POLLING_NRFLAG); -		smp_mb__after_clear_bit(); -		local_irq_disable(); -		while (!need_resched()) -			cpu_sleep(); -		local_irq_enable(); -		set_thread_flag(TIF_POLLING_NRFLAG); -	} -} - -void cpu_idle(void) -{ -	set_thread_flag(TIF_POLLING_NRFLAG); - -	/* endless idle loop with no priority at all */ -	while (1) { -		void (*idle)(void) = pm_idle; - -		if (!idle) -			idle = default_idle; - -		tick_nohz_stop_sched_tick(1); -		while (!need_resched()) -			idle(); -		tick_nohz_restart_sched_tick(); - -		preempt_enable_no_resched(); -		schedule(); -		preempt_disable(); -		check_pgt_cache(); -	} -} -  void flush_thread(void)  {  }  int copy_thread(unsigned long clone_flags, unsigned long usp, -		unsigned long unused, -		struct task_struct *p, struct pt_regs *regs) +		unsigned long arg, struct task_struct *p)  {  	struct pt_regs *childregs = task_pt_regs(p);  	struct thread_info *ti = task_thread_info(p); -	*childregs = *regs; -	if (user_mode(regs)) +	if (unlikely(p->flags & PF_KTHREAD)) { +		/* if we're creating a new kernel thread then just zeroing all +		 * the registers. That's OK for a brand new thread.*/ +		memset(childregs, 0, sizeof(struct pt_regs)); +		memset(&ti->cpu_context, 0, sizeof(struct cpu_context)); +		ti->cpu_context.r1  = (unsigned long)childregs; +		ti->cpu_context.r20 = (unsigned long)usp; /* fn */ +		ti->cpu_context.r19 = (unsigned long)arg; +		childregs->pt_mode = 1; +		local_save_flags(childregs->msr); +#ifdef CONFIG_MMU +		ti->cpu_context.msr = childregs->msr & ~MSR_IE; +#endif +		ti->cpu_context.r15 = (unsigned long)ret_from_kernel_thread - 8; +		return 0; +	} +	*childregs = *current_pt_regs(); +	if (usp)  		childregs->r1 = usp; -	else -		childregs->r1 = ((unsigned long) ti) + THREAD_SIZE; -#ifndef CONFIG_MMU  	memset(&ti->cpu_context, 0, sizeof(struct cpu_context));  	ti->cpu_context.r1 = (unsigned long)childregs; +#ifndef CONFIG_MMU  	ti->cpu_context.msr = (unsigned long)childregs->msr;  #else +	childregs->msr |= MSR_UMS; -	/* if creating a kernel thread then update the current reg (we don't -	 * want to use the parent's value when restoring by POP_STATE) */ -	if (kernel_mode(regs)) -		/* save new current on stack to use POP_STATE */ -		childregs->CURRENT_TASK = (unsigned long)p; -	/* if returning to user then use the parent's value of this register */ - -	/* if we're creating a new kernel thread then just zeroing all -	 * the registers. That's OK for a brand new thread.*/ -	/* Pls. note that some of them will be restored in POP_STATE */ -	if (kernel_mode(regs)) -		memset(&ti->cpu_context, 0, sizeof(struct cpu_context)); -	/* if this thread is created for fork/vfork/clone, then we want to -	 * restore all the parent's context */ -	/* in addition to the registers which will be restored by POP_STATE */ -	else { -		ti->cpu_context = *(struct cpu_context *)regs; -		childregs->msr |= MSR_UMS; -	} - -	/* FIXME STATE_SAVE_PT_OFFSET; */ -	ti->cpu_context.r1  = (unsigned long)childregs - STATE_SAVE_ARG_SPACE;  	/* we should consider the fact that childregs is a copy of the parent  	 * regs which were saved immediately after entering the kernel state  	 * before enabling VM. This MSR will be restored in switch_to and @@ -170,7 +94,6 @@ int copy_thread(unsigned long clone_flags, unsigned long usp,  	 * excepting for VM and UMS  	 * don't touch UMS , CARRY and cache bits  	 * right now MSR is a copy of parent one */ -	childregs->msr |= MSR_BIP;  	childregs->msr &= ~MSR_EIP;  	childregs->msr |= MSR_IE;  	childregs->msr &= ~MSR_VM; @@ -179,11 +102,16 @@ int copy_thread(unsigned long clone_flags, unsigned long usp,  	ti->cpu_context.msr = (childregs->msr|MSR_VM);  	ti->cpu_context.msr &= ~MSR_UMS; /* switch_to to kernel mode */ +	ti->cpu_context.msr &= ~MSR_IE;  #endif  	ti->cpu_context.r15 = (unsigned long)ret_from_fork - 8; +	/* +	 *  r21 is the thread reg, r10 is 6th arg to clone +	 *  which contains TLS area +	 */  	if (clone_flags & CLONE_SETTLS) -		; +		childregs->r21 = childregs->r10;  	return 0;  } @@ -205,29 +133,6 @@ unsigned long thread_saved_pc(struct task_struct *tsk)  }  #endif -static void kernel_thread_helper(int (*fn)(void *), void *arg) -{ -	fn(arg); -	do_exit(-1); -} - -int kernel_thread(int (*fn)(void *), void *arg, unsigned long flags) -{ -	struct pt_regs regs; - -	memset(®s, 0, sizeof(regs)); -	/* store them in non-volatile registers */ -	regs.r5 = (unsigned long)fn; -	regs.r6 = (unsigned long)arg; -	local_save_flags(regs.msr); -	regs.pc = (unsigned long)kernel_thread_helper; -	regs.pt_mode = 1; - -	return do_fork(flags | CLONE_VM | CLONE_UNTRACED, 0, -			®s, 0, NULL, NULL); -} -EXPORT_SYMBOL_GPL(kernel_thread); -  unsigned long get_wchan(struct task_struct *p)  {  /* TBD (used by procfs) */ @@ -237,12 +142,12 @@ unsigned long get_wchan(struct task_struct *p)  /* Set up a thread for executing a new program */  void start_thread(struct pt_regs *regs, unsigned long pc, unsigned long usp)  { -	set_fs(USER_DS);  	regs->pc = pc;  	regs->r1 = usp;  	regs->pt_mode = 0;  #ifdef CONFIG_MMU  	regs->msr |= MSR_UMS; +	regs->msr &= ~MSR_VM;  #endif  } @@ -256,3 +161,8 @@ int dump_fpu(struct pt_regs *regs, elf_fpregset_t *fpregs)  	return 0; /* MicroBlaze has no separate FPU registers */  }  #endif /* CONFIG_MMU */ + +void arch_cpu_idle(void) +{ +       local_irq_enable(); +} diff --git a/arch/microblaze/kernel/prom.c b/arch/microblaze/kernel/prom.c index a105301e2b7..68f099960eb 100644 --- a/arch/microblaze/kernel/prom.c +++ b/arch/microblaze/kernel/prom.c @@ -14,6 +14,7 @@   */  #include <stdarg.h> +#include <linux/export.h>  #include <linux/kernel.h>  #include <linux/string.h>  #include <linux/init.h> @@ -25,99 +26,75 @@  #include <linux/delay.h>  #include <linux/initrd.h>  #include <linux/bitops.h> -#include <linux/module.h>  #include <linux/kexec.h>  #include <linux/debugfs.h>  #include <linux/irq.h>  #include <linux/memblock.h> +#include <linux/of_fdt.h>  #include <asm/prom.h>  #include <asm/page.h>  #include <asm/processor.h>  #include <asm/irq.h>  #include <linux/io.h> -#include <asm/system.h>  #include <asm/mmu.h>  #include <asm/pgtable.h>  #include <asm/sections.h>  #include <asm/pci-bridge.h> -void __init early_init_dt_add_memory_arch(u64 base, u64 size) -{ -	memblock_add(base, size); -} - -u64 __init early_init_dt_alloc_memory_arch(u64 size, u64 align) -{ -	return memblock_alloc(size, align); -} -  #ifdef CONFIG_EARLY_PRINTK -/* MS this is Microblaze specifig function */ -static int __init early_init_dt_scan_serial(unsigned long node, -				const char *uname, int depth, void *data) -{ -	unsigned long l; -	char *p; -	int *addr; - -	pr_debug("search \"chosen\", depth: %d, uname: %s\n", depth, uname); - -/* find all serial nodes */ -	if (strncmp(uname, "serial", 6) != 0) -		return 0; - -	early_init_dt_check_for_initrd(node); +static const char *stdout; -/* find compatible node with uartlite */ -	p = of_get_flat_dt_prop(node, "compatible", &l); -	if ((strncmp(p, "xlnx,xps-uartlite", 17) != 0) && -			(strncmp(p, "xlnx,opb-uartlite", 17) != 0) && -			(strncmp(p, "xlnx,axi-uartlite", 17) != 0)) -		return 0; - -	addr = of_get_flat_dt_prop(node, "reg", &l); -	return be32_to_cpup(addr); /* return address */ -} - -/* this function is looking for early uartlite console - Microblaze specific */ -int __init early_uartlite_console(void) -{ -	return of_scan_flat_dt(early_init_dt_scan_serial, NULL); -} - -/* MS this is Microblaze specifig function */ -static int __init early_init_dt_scan_serial_full(unsigned long node, +static int __init early_init_dt_scan_chosen_serial(unsigned long node,  				const char *uname, int depth, void *data)  { -	unsigned long l; -	char *p; -	unsigned int addr; - -	pr_debug("search \"chosen\", depth: %d, uname: %s\n", depth, uname); - -/* find all serial nodes */ -	if (strncmp(uname, "serial", 6) != 0) -		return 0; - -	early_init_dt_check_for_initrd(node); - -/* find compatible node with uartlite */ -	p = of_get_flat_dt_prop(node, "compatible", &l); - -	if ((strncmp(p, "xlnx,xps-uart16550", 18) != 0) && -		(strncmp(p, "xlnx,axi-uart16550", 18) != 0)) -		return 0; - -	addr = *(u32 *)of_get_flat_dt_prop(node, "reg", &l); -	addr += *(u32 *)of_get_flat_dt_prop(node, "reg-offset", &l); -	return be32_to_cpu(addr); /* return address */ +	int l; +	const char *p; + +	pr_debug("%s: depth: %d, uname: %s\n", __func__, depth, uname); + +	if (depth == 1 && (strcmp(uname, "chosen") == 0 || +				strcmp(uname, "chosen@0") == 0)) { +		p = of_get_flat_dt_prop(node, "linux,stdout-path", &l); +		if (p != NULL && l > 0) +			stdout = p; /* store pointer to stdout-path */ +	} + +	if (stdout && strstr(stdout, uname)) { +		p = of_get_flat_dt_prop(node, "compatible", &l); +		pr_debug("Compatible string: %s\n", p); + +		if ((strncmp(p, "xlnx,xps-uart16550", 18) == 0) || +			(strncmp(p, "xlnx,axi-uart16550", 18) == 0)) { +			unsigned int addr; + +			*(u32 *)data = UART16550; + +			addr = *(u32 *)of_get_flat_dt_prop(node, "reg", &l); +			addr += *(u32 *)of_get_flat_dt_prop(node, +							"reg-offset", &l); +			/* clear register offset */ +			return be32_to_cpu(addr) & ~3; +		} +		if ((strncmp(p, "xlnx,xps-uartlite", 17) == 0) || +				(strncmp(p, "xlnx,opb-uartlite", 17) == 0) || +				(strncmp(p, "xlnx,axi-uartlite", 17) == 0) || +				(strncmp(p, "xlnx,mdm", 8) == 0)) { +			const unsigned int *addrp; + +			*(u32 *)data = UARTLITE; + +			addrp = of_get_flat_dt_prop(node, "reg", &l); +			return be32_to_cpup(addrp); /* return address */ +		} +	} +	return 0;  } -/* this function is looking for early uartlite console - Microblaze specific */ -int __init early_uart16550_console(void) +/* this function is looking for early console - Microblaze specific */ +int __init of_early_console(void *version)  { -	return of_scan_flat_dt(early_init_dt_scan_serial_full, NULL); +	return of_scan_flat_dt(early_init_dt_scan_chosen_serial, version);  }  #endif @@ -125,68 +102,15 @@ void __init early_init_devtree(void *params)  {  	pr_debug(" -> early_init_devtree(%p)\n", params); -	/* Setup flat device-tree pointer */ -	initial_boot_params = params; - -	/* Retrieve various informations from the /chosen node of the -	 * device-tree, including the platform type, initrd location and -	 * size, TCE reserve, and more ... -	 */ -	of_scan_flat_dt(early_init_dt_scan_chosen, NULL); +	early_init_dt_scan(params); +	if (!strlen(boot_command_line)) +		strlcpy(boot_command_line, cmd_line, COMMAND_LINE_SIZE); -	/* Scan memory nodes and rebuild MEMBLOCKs */ -	memblock_init(); -	of_scan_flat_dt(early_init_dt_scan_root, NULL); -	of_scan_flat_dt(early_init_dt_scan_memory, NULL); - -	/* Save command line for /proc/cmdline and then parse parameters */ -	strlcpy(boot_command_line, cmd_line, COMMAND_LINE_SIZE);  	parse_early_param(); -	memblock_analyze(); +	memblock_allow_resize();  	pr_debug("Phys. mem: %lx\n", (unsigned long) memblock_phys_mem_size());  	pr_debug(" <- early_init_devtree()\n");  } - -#ifdef CONFIG_BLK_DEV_INITRD -void __init early_init_dt_setup_initrd_arch(unsigned long start, -		unsigned long end) -{ -	initrd_start = (unsigned long)__va(start); -	initrd_end = (unsigned long)__va(end); -	initrd_below_start_ok = 1; -} -#endif - -/******* - * - * New implementation of the OF "find" APIs, return a refcounted - * object, call of_node_put() when done.  The device tree and list - * are protected by a rw_lock. - * - * Note that property management will need some locking as well, - * this isn't dealt with yet. - * - *******/ - -#if defined(CONFIG_DEBUG_FS) && defined(DEBUG) -static struct debugfs_blob_wrapper flat_dt_blob; - -static int __init export_flat_device_tree(void) -{ -	struct dentry *d; - -	flat_dt_blob.data = initial_boot_params; -	flat_dt_blob.size = initial_boot_params->totalsize; - -	d = debugfs_create_blob("flat-device-tree", S_IFREG | S_IRUSR, -				of_debugfs_root, &flat_dt_blob); -	if (!d) -		return 1; - -	return 0; -} -device_initcall(export_flat_device_tree); -#endif diff --git a/arch/microblaze/kernel/prom_parse.c b/arch/microblaze/kernel/prom_parse.c index 99d9b61cccb..068762f55fd 100644 --- a/arch/microblaze/kernel/prom_parse.c +++ b/arch/microblaze/kernel/prom_parse.c @@ -1,89 +1,12 @@  #undef DEBUG +#include <linux/export.h>  #include <linux/kernel.h>  #include <linux/string.h> -#include <linux/pci_regs.h> -#include <linux/module.h>  #include <linux/ioport.h>  #include <linux/etherdevice.h>  #include <linux/of_address.h>  #include <asm/prom.h> -#include <asm/pci-bridge.h> - -#ifdef CONFIG_PCI -int of_irq_map_pci(struct pci_dev *pdev, struct of_irq *out_irq) -{ -	struct device_node *dn, *ppnode; -	struct pci_dev *ppdev; -	u32 lspec; -	u32 laddr[3]; -	u8 pin; -	int rc; - -	/* Check if we have a device node, if yes, fallback to standard OF -	 * parsing -	 */ -	dn = pci_device_to_OF_node(pdev); -	if (dn) -		return of_irq_map_one(dn, 0, out_irq); - -	/* Ok, we don't, time to have fun. Let's start by building up an -	 * interrupt spec.  we assume #interrupt-cells is 1, which is standard -	 * for PCI. If you do different, then don't use that routine. -	 */ -	rc = pci_read_config_byte(pdev, PCI_INTERRUPT_PIN, &pin); -	if (rc != 0) -		return rc; -	/* No pin, exit */ -	if (pin == 0) -		return -ENODEV; - -	/* Now we walk up the PCI tree */ -	lspec = pin; -	for (;;) { -		/* Get the pci_dev of our parent */ -		ppdev = pdev->bus->self; - -		/* Ouch, it's a host bridge... */ -		if (ppdev == NULL) { -			struct pci_controller *host; -			host = pci_bus_to_host(pdev->bus); -			ppnode = host ? host->dn : NULL; -			/* No node for host bridge ? give up */ -			if (ppnode == NULL) -				return -EINVAL; -		} else -			/* We found a P2P bridge, check if it has a node */ -			ppnode = pci_device_to_OF_node(ppdev); - -		/* Ok, we have found a parent with a device-node, hand over to -		 * the OF parsing code. -		 * We build a unit address from the linux device to be used for -		 * resolution. Note that we use the linux bus number which may -		 * not match your firmware bus numbering. -		 * Fortunately, in most cases, interrupt-map-mask doesn't -		 * include the bus number as part of the matching. -		 * You should still be careful about that though if you intend -		 * to rely on this function (you ship  a firmware that doesn't -		 * create device nodes for all PCI devices). -		 */ -		if (ppnode) -			break; - -		/* We can only get here if we hit a P2P bridge with no node, -		 * let's do standard swizzling and try again -		 */ -		lspec = pci_swizzle_interrupt_pin(pdev, lspec); -		pdev = ppdev; -	} - -	laddr[0] = (pdev->bus->number << 16) -		| (pdev->devfn << 8); -	laddr[1]  = laddr[2] = 0; -	return of_irq_map_raw(ppnode, &lspec, 1, laddr, out_irq); -} -EXPORT_SYMBOL_GPL(of_irq_map_pci); -#endif /* CONFIG_PCI */  void of_parse_dma_window(struct device_node *dn, const void *dma_window_prop,  		unsigned long *busno, unsigned long *phys, unsigned long *size) @@ -110,41 +33,3 @@ void of_parse_dma_window(struct device_node *dn, const void *dma_window_prop,  	cells = prop ? *(u32 *)prop : of_n_size_cells(dn);  	*size = of_read_number(dma_window, cells);  } - -/** - * Search the device tree for the best MAC address to use.  'mac-address' is - * checked first, because that is supposed to contain to "most recent" MAC - * address. If that isn't set, then 'local-mac-address' is checked next, - * because that is the default address.  If that isn't set, then the obsolete - * 'address' is checked, just in case we're using an old device tree. - * - * Note that the 'address' property is supposed to contain a virtual address of - * the register set, but some DTS files have redefined that property to be the - * MAC address. - * - * All-zero MAC addresses are rejected, because those could be properties that - * exist in the device tree, but were not set by U-Boot.  For example, the - * DTS could define 'mac-address' and 'local-mac-address', with zero MAC - * addresses.  Some older U-Boots only initialized 'local-mac-address'.  In - * this case, the real MAC is in 'local-mac-address', and 'mac-address' exists - * but is all zeros. -*/ -const void *of_get_mac_address(struct device_node *np) -{ -	struct property *pp; - -	pp = of_find_property(np, "mac-address", NULL); -	if (pp && (pp->length == 6) && is_valid_ether_addr(pp->value)) -		return pp->value; - -	pp = of_find_property(np, "local-mac-address", NULL); -	if (pp && (pp->length == 6) && is_valid_ether_addr(pp->value)) -		return pp->value; - -	pp = of_find_property(np, "address", NULL); -	if (pp && (pp->length == 6) && is_valid_ether_addr(pp->value)) -		return pp->value; - -	return NULL; -} -EXPORT_SYMBOL(of_get_mac_address); diff --git a/arch/microblaze/kernel/ptrace.c b/arch/microblaze/kernel/ptrace.c index 05ac8cc975d..39cf50841f6 100644 --- a/arch/microblaze/kernel/ptrace.c +++ b/arch/microblaze/kernel/ptrace.c @@ -39,7 +39,8 @@  #include <linux/uaccess.h>  #include <asm/asm-offsets.h>  #include <asm/cacheflush.h> -#include <asm/io.h> +#include <asm/syscall.h> +#include <linux/io.h>  /* Returns the address where the register at REG_OFFS in P is stashed away. */  static microblaze_reg_t *reg_save_addr(unsigned reg_offs, @@ -123,7 +124,7 @@ long arch_ptrace(struct task_struct *child, long request,  			rval = -EIO;  		if (rval == 0 && request == PTRACE_PEEKUSR) -			rval = put_user(val, (unsigned long *)data); +			rval = put_user(val, (unsigned long __user *)data);  		break;  	default:  		rval = ptrace_request(child, request, addr, data); @@ -135,7 +136,7 @@ asmlinkage long do_syscall_trace_enter(struct pt_regs *regs)  {  	long ret = 0; -	secure_computing(regs->r12); +	secure_computing_strict(regs->r12);  	if (test_thread_flag(TIF_SYSCALL_TRACE) &&  	    tracehook_report_syscall_entry(regs)) @@ -146,10 +147,8 @@ asmlinkage long do_syscall_trace_enter(struct pt_regs *regs)  		 */  		ret = -1L; -	if (unlikely(current->audit_context)) -		audit_syscall_entry(EM_XILINX_MICROBLAZE, regs->r12, -				    regs->r5, regs->r6, -				    regs->r7, regs->r8); +	audit_syscall_entry(EM_MICROBLAZE, regs->r12, regs->r5, regs->r6, +			    regs->r7, regs->r8);  	return ret ?: regs->r12;  } @@ -158,37 +157,13 @@ asmlinkage void do_syscall_trace_leave(struct pt_regs *regs)  {  	int step; -	if (unlikely(current->audit_context)) -		audit_syscall_exit(AUDITSC_RESULT(regs->r3), regs->r3); +	audit_syscall_exit(regs);  	step = test_thread_flag(TIF_SINGLESTEP);  	if (step || test_thread_flag(TIF_SYSCALL_TRACE))  		tracehook_report_syscall_exit(regs, step);  } -#if 0 -static asmlinkage void syscall_trace(void) -{ -	if (!test_thread_flag(TIF_SYSCALL_TRACE)) -		return; -	if (!(current->ptrace & PT_PTRACED)) -		return; -	/* The 0x80 provides a way for the tracing parent to distinguish -	 between a syscall stop and SIGTRAP delivery */ -	ptrace_notify(SIGTRAP | ((current->ptrace & PT_TRACESYSGOOD) -				? 0x80 : 0)); -	/* -	 * this isn't the same as continuing with a signal, but it will do -	 * for normal use. strace only continues with a signal if the -	 * stopping signal is not SIGTRAP. -brl -	 */ -	if (current->exit_code) { -		send_sig(current->exit_code, current, 1); -		current->exit_code = 0; -	} -} -#endif -  void ptrace_disable(struct task_struct *child)  {  	/* nothing to do */ diff --git a/arch/microblaze/kernel/reset.c b/arch/microblaze/kernel/reset.c index bd8ccab5cef..fbe58c6554a 100644 --- a/arch/microblaze/kernel/reset.c +++ b/arch/microblaze/kernel/reset.c @@ -19,59 +19,21 @@  static int handle; /* reset pin handle */  static unsigned int reset_val; -static int of_reset_gpio_handle(void) -{ -	int ret; /* variable which stored handle reset gpio pin */ -	struct device_node *root; /* root node */ -	struct device_node *gpio; /* gpio node */ -	struct gpio_chip *gc; -	u32 flags; -	const void *gpio_spec; - -	/* find out root node */ -	root = of_find_node_by_path("/"); - -	/* give me handle for gpio node to be possible allocate pin */ -	ret = of_parse_phandles_with_args(root, "hard-reset-gpios", -				"#gpio-cells", 0, &gpio, &gpio_spec); -	if (ret) { -		pr_debug("%s: can't parse gpios property\n", __func__); -		goto err0; -	} - -	gc = of_node_to_gpiochip(gpio); -	if (!gc) { -		pr_debug("%s: gpio controller %s isn't registered\n", -			 root->full_name, gpio->full_name); -		ret = -ENODEV; -		goto err1; -	} - -	ret = gc->of_xlate(gc, root, gpio_spec, &flags); -	if (ret < 0) -		goto err1; - -	ret += gc->base; -err1: -	of_node_put(gpio); -err0: -	pr_debug("%s exited with status %d\n", __func__, ret); -	return ret; -} -  void of_platform_reset_gpio_probe(void)  {  	int ret; -	handle = of_reset_gpio_handle(); +	handle = of_get_named_gpio(of_find_node_by_path("/"), +				   "hard-reset-gpios", 0);  	if (!gpio_is_valid(handle)) { -		printk(KERN_INFO "Skipping unavailable RESET gpio %d (%s)\n", +		pr_info("Skipping unavailable RESET gpio %d (%s)\n",  				handle, "reset"); +		return;  	}  	ret = gpio_request(handle, "reset");  	if (ret < 0) { -		printk(KERN_INFO "GPIO pin is already allocated\n"); +		pr_info("GPIO pin is already allocated\n");  		return;  	} @@ -88,7 +50,7 @@ void of_platform_reset_gpio_probe(void)  	/* Setup output direction */  	gpio_set_value(handle, 0); -	printk(KERN_INFO "RESET: Registered gpio device: %d, current val: %d\n", +	pr_info("RESET: Registered gpio device: %d, current val: %d\n",  							handle, reset_val);  	return;  err: @@ -99,10 +61,17 @@ err:  static void gpio_system_reset(void)  { -	gpio_set_value(handle, 1 - reset_val); +	if (gpio_is_valid(handle)) +		gpio_set_value(handle, 1 - reset_val); +	else +		pr_notice("Reset GPIO unavailable - halting!\n");  }  #else -#define gpio_system_reset() do {} while (0) +static void gpio_system_reset(void) +{ +	pr_notice("No reset GPIO present - halting!\n"); +} +  void of_platform_reset_gpio_probe(void)  {  	return; @@ -111,30 +80,29 @@ void of_platform_reset_gpio_probe(void)  void machine_restart(char *cmd)  { -	printk(KERN_NOTICE "Machine restart...\n"); +	pr_notice("Machine restart...\n");  	gpio_system_reset(); -	dump_stack();  	while (1)  		;  }  void machine_shutdown(void)  { -	printk(KERN_NOTICE "Machine shutdown...\n"); +	pr_notice("Machine shutdown...\n");  	while (1)  		;  }  void machine_halt(void)  { -	printk(KERN_NOTICE "Machine halt...\n"); +	pr_notice("Machine halt...\n");  	while (1)  		;  }  void machine_power_off(void)  { -	printk(KERN_NOTICE "Machine power off...\n"); +	pr_notice("Machine power off...\n");  	while (1)  		;  } diff --git a/arch/microblaze/kernel/selfmod.c b/arch/microblaze/kernel/selfmod.c deleted file mode 100644 index 89508bdc9f3..00000000000 --- a/arch/microblaze/kernel/selfmod.c +++ /dev/null @@ -1,81 +0,0 @@ -/* - * Copyright (C) 2007-2009 Michal Simek <monstr@monstr.eu> - * Copyright (C) 2009 PetaLogix - * - * This file is subject to the terms and conditions of the GNU General Public - * License. See the file "COPYING" in the main directory of this archive - * for more details. - */ - -#include <linux/interrupt.h> -#include <asm/selfmod.h> - -#undef DEBUG - -#if __GNUC__ > 3 -#error GCC 4 unsupported SELFMOD. Please disable SELFMOD from menuconfig. -#endif - -#define OPCODE_IMM		0xB0000000 -#define OPCODE_LWI		0xE8000000 -#define OPCODE_LWI_MASK		0xEC000000 -#define OPCODE_RTSD		0xB60F0008 /* return from func: rtsd r15, 8 */ -#define OPCODE_ADDIK		0x30000000 -#define OPCODE_ADDIK_MASK	0xFC000000 - -#define IMM_BASE	(OPCODE_IMM | (BARRIER_BASE_ADDR >> 16)) -#define LWI_BASE	(OPCODE_LWI | (BARRIER_BASE_ADDR & 0x0000ff00)) -#define LWI_BASE_MASK	(OPCODE_LWI_MASK | (BARRIER_BASE_ADDR & 0x0000ff00)) -#define ADDIK_BASE	(OPCODE_ADDIK | (BARRIER_BASE_ADDR & 0x0000ff00)) -#define ADDIK_BASE_MASK	(OPCODE_ADDIK_MASK | (BARRIER_BASE_ADDR & 0x0000ff00)) - -#define MODIFY_INSTR {						\ -	pr_debug("%s: curr instr, (%d):0x%x, next(%d):0x%x\n",		\ -		__func__, i, addr[i], i + 1, addr[i + 1]);		\ -	addr[i] = OPCODE_IMM + (base >> 16);				\ -	/* keep instruction opcode and add only last 16bits */		\ -	addr[i + 1] = (addr[i + 1] & 0xffff00ff) + (base & 0xffff);	\ -	__invalidate_icache(addr[i]);					\ -	__invalidate_icache(addr[i + 1]);				\ -	pr_debug("%s: hack instr, (%d):0x%x, next(%d):0x%x\n",		\ -		__func__, i, addr[i], i + 1, addr[i + 1]); } - -/* NOTE - * self-modified part of code for improvement of interrupt controller - * save instruction in interrupt rutine - */ -void selfmod_function(const int *arr_fce, const unsigned int base) -{ -	unsigned int flags, i, j, *addr = NULL; - -	local_irq_save(flags); -	__disable_icache(); - -	/* zero terminated array */ -	for (j = 0; arr_fce[j] != 0; j++) { -		/* get start address of function */ -		addr = (unsigned int *) arr_fce[j]; -		pr_debug("%s: func(%d) at 0x%x\n", -					__func__, j, (unsigned int) addr); -		for (i = 0; ; i++) { -			pr_debug("%s: instruction code at %d: 0x%x\n", -						__func__, i, addr[i]); -			if (addr[i] == IMM_BASE) { -				/* detecting of lwi (0xE8) or swi (0xF8) instr -				 * I can detect both opcode with one mask */ -				if ((addr[i + 1] & LWI_BASE_MASK) == LWI_BASE) { -					MODIFY_INSTR; -				} else /* detection addik for ack */ -				if ((addr[i + 1] & ADDIK_BASE_MASK) == -								ADDIK_BASE) { -					MODIFY_INSTR; -				} -			} else if (addr[i] == OPCODE_RTSD) { -				/* return from function means end of function */ -				pr_debug("%s: end of array %d\n", __func__, i); -				break; -			} -		} -	} -	local_irq_restore(flags); -} /* end of self-modified code */ diff --git a/arch/microblaze/kernel/setup.c b/arch/microblaze/kernel/setup.c index bb1558e4b28..ab5b488e1fd 100644 --- a/arch/microblaze/kernel/setup.c +++ b/arch/microblaze/kernel/setup.c @@ -9,12 +9,15 @@   */  #include <linux/init.h> +#include <linux/clk-provider.h> +#include <linux/clocksource.h>  #include <linux/string.h>  #include <linux/seq_file.h>  #include <linux/cpu.h>  #include <linux/initrd.h>  #include <linux/console.h>  #include <linux/debugfs.h> +#include <linux/of_fdt.h>  #include <asm/setup.h>  #include <asm/sections.h> @@ -30,7 +33,6 @@  #include <asm/entry.h>  #include <asm/cpuinfo.h> -#include <asm/system.h>  #include <asm/prom.h>  #include <asm/pgtable.h> @@ -41,37 +43,37 @@ DEFINE_PER_CPU(unsigned int, R11_SAVE);	/* Temp variable for entry */  DEFINE_PER_CPU(unsigned int, CURRENT_SAVE);	/* Saved current pointer */  unsigned int boot_cpuid; -char cmd_line[COMMAND_LINE_SIZE]; +/* + * Placed cmd_line to .data section because can be initialized from + * ASM code. Default position is BSS section which is cleared + * in machine_early_init(). + */ +char cmd_line[COMMAND_LINE_SIZE] __attribute__ ((section(".data")));  void __init setup_arch(char **cmdline_p)  { -	*cmdline_p = cmd_line; +	*cmdline_p = boot_command_line;  	console_verbose();  	unflatten_device_tree(); -	/* NOTE I think that this function is not necessary to call */ -	/* irq_early_init(); */  	setup_cpuinfo();  	microblaze_cache_init();  	setup_memory(); -	xilinx_pci_init(); - -#if defined(CONFIG_SELFMOD_INTC) || defined(CONFIG_SELFMOD_TIMER) -	printk(KERN_NOTICE "Self modified code enable\n"); +#ifdef CONFIG_EARLY_PRINTK +	/* remap early console to virtual address */ +	remap_early_printk();  #endif -#ifdef CONFIG_VT -#if defined(CONFIG_XILINX_CONSOLE) -	conswitchp = &xil_con; -#elif defined(CONFIG_DUMMY_CONSOLE) +	xilinx_pci_init(); + +#if defined(CONFIG_DUMMY_CONSOLE)  	conswitchp = &dummy_con;  #endif -#endif  }  #ifdef CONFIG_MTD_UCLINUX @@ -92,10 +94,14 @@ inline unsigned get_romfs_len(unsigned *addr)  }  #endif	/* CONFIG_MTD_UCLINUX_EBSS */ +unsigned long kernel_tlb; +  void __init machine_early_init(const char *cmdline, unsigned int ram, -		unsigned int fdt, unsigned int msr) +		unsigned int fdt, unsigned int msr, unsigned int tlb0, +		unsigned int tlb1)  { -	unsigned long *src, *dst = (unsigned long *)0x0; +	unsigned long *src, *dst; +	unsigned int offset = 0;  	/* If CONFIG_MTD_UCLINUX is defined, assume ROMFS is at the  	 * end of kernel. There are two position which we want to check. @@ -115,7 +121,7 @@ void __init machine_early_init(const char *cmdline, unsigned int ram,  	/* Move ROMFS out of BSS before clearing it */  	if (romfs_size > 0) { -		memmove(&_ebss, (int *)romfs_base, romfs_size); +		memmove(&__bss_stop, (int *)romfs_base, romfs_size);  		klimit += romfs_size;  	}  #endif @@ -124,51 +130,59 @@ void __init machine_early_init(const char *cmdline, unsigned int ram,  	memset(__bss_start, 0, __bss_stop-__bss_start);  	memset(_ssbss, 0, _esbss-_ssbss); -	/* Copy command line passed from bootloader */ -#ifndef CONFIG_CMDLINE_BOOL -	if (cmdline && cmdline[0] != '\0') -		strlcpy(cmd_line, cmdline, COMMAND_LINE_SIZE); -#endif -  	lockdep_init();  /* initialize device tree for usage in early_printk */ -	early_init_devtree((void *)_fdt_start); +	early_init_devtree(_fdt_start);  #ifdef CONFIG_EARLY_PRINTK  	setup_early_printk(NULL);  #endif -	eprintk("Ramdisk addr 0x%08x, ", ram); +	/* setup kernel_tlb after BSS cleaning +	 * Maybe worth to move to asm code */ +	kernel_tlb = tlb0 + tlb1; +	/* printk("TLB1 0x%08x, TLB0 0x%08x, tlb 0x%x\n", tlb0, +							tlb1, kernel_tlb); */ + +	pr_info("Ramdisk addr 0x%08x, ", ram);  	if (fdt) -		eprintk("FDT at 0x%08x\n", fdt); +		pr_info("FDT at 0x%08x\n", fdt);  	else -		eprintk("Compiled-in FDT at 0x%08x\n", -					(unsigned int)_fdt_start); +		pr_info("Compiled-in FDT at %p\n", _fdt_start);  #ifdef CONFIG_MTD_UCLINUX -	eprintk("Found romfs @ 0x%08x (0x%08x)\n", +	pr_info("Found romfs @ 0x%08x (0x%08x)\n",  			romfs_base, romfs_size); -	eprintk("#### klimit %p ####\n", old_klimit); +	pr_info("#### klimit %p ####\n", old_klimit);  	BUG_ON(romfs_size < 0); /* What else can we do? */ -	eprintk("Moved 0x%08x bytes from 0x%08x to 0x%08x\n", -			romfs_size, romfs_base, (unsigned)&_ebss); +	pr_info("Moved 0x%08x bytes from 0x%08x to 0x%08x\n", +			romfs_size, romfs_base, (unsigned)&__bss_stop); -	eprintk("New klimit: 0x%08x\n", (unsigned)klimit); +	pr_info("New klimit: 0x%08x\n", (unsigned)klimit);  #endif  #if CONFIG_XILINX_MICROBLAZE0_USE_MSR_INSTR -	if (msr) -		eprintk("!!!Your kernel has setup MSR instruction but " -				"CPU don't have it %d\n", msr); +	if (msr) { +		pr_info("!!!Your kernel has setup MSR instruction but "); +		pr_cont("CPU don't have it %x\n", msr); +	}  #else -	if (!msr) -		eprintk("!!!Your kernel not setup MSR instruction but " -				"CPU have it %d\n", msr); +	if (!msr) { +		pr_info("!!!Your kernel not setup MSR instruction but "); +		pr_cont("CPU have it %x\n", msr); +	}  #endif -	for (src = __ivt_start; src < __ivt_end; src++, dst++) +	/* Do not copy reset vectors. offset = 0x2 means skip the first +	 * two instructions. dst is pointer to MB vectors which are placed +	 * in block ram. If you want to copy reset vector setup offset to 0x0 */ +#if !CONFIG_MANUAL_RESET_VECTOR +	offset = 0x2; +#endif +	dst = (unsigned long *) (offset * sizeof(u32)); +	for (src = __ivt_start + offset; src < __ivt_end; src++, dst++)  		*dst = *src;  	/* Initialize global data */ @@ -176,6 +190,13 @@ void __init machine_early_init(const char *cmdline, unsigned int ram,  	per_cpu(CURRENT_SAVE, 0) = (unsigned long)current;  } +void __init time_init(void) +{ +	of_clk_init(NULL); +	setup_cpuinfo_clk(); +	clocksource_of_init(); +} +  #ifdef CONFIG_DEBUG_FS  struct dentry *of_debugfs_root; @@ -186,32 +207,21 @@ static int microblaze_debugfs_init(void)  	return of_debugfs_root == NULL;  }  arch_initcall(microblaze_debugfs_init); -#endif -static int dflt_bus_notify(struct notifier_block *nb, -				unsigned long action, void *data) +# ifdef CONFIG_MMU +static int __init debugfs_tlb(void)  { -	struct device *dev = data; +	struct dentry *d; -	/* We are only intereted in device addition */ -	if (action != BUS_NOTIFY_ADD_DEVICE) -		return 0; +	if (!of_debugfs_root) +		return -ENODEV; -	set_dma_ops(dev, &dma_direct_ops); - -	return NOTIFY_DONE; -} - -static struct notifier_block dflt_plat_bus_notifier = { -	.notifier_call = dflt_bus_notify, -	.priority = INT_MAX, -}; - -static int __init setup_bus_notifier(void) -{ -	bus_register_notifier(&platform_bus_type, &dflt_plat_bus_notifier); +	d = debugfs_create_u32("tlb_skip", S_IRUGO, of_debugfs_root, &tlb_skip); +	if (!d) +		return -ENOMEM;  	return 0;  } - -arch_initcall(setup_bus_notifier); +device_initcall(debugfs_tlb); +# endif +#endif diff --git a/arch/microblaze/kernel/signal.c b/arch/microblaze/kernel/signal.c index d8d3bb396cd..49a07a4d76d 100644 --- a/arch/microblaze/kernel/signal.c +++ b/arch/microblaze/kernel/signal.c @@ -31,6 +31,7 @@  #include <linux/personality.h>  #include <linux/percpu.h>  #include <linux/linkage.h> +#include <linux/tracehook.h>  #include <asm/entry.h>  #include <asm/ucontext.h>  #include <linux/uaccess.h> @@ -40,17 +41,6 @@  #include <asm/cacheflush.h>  #include <asm/syscalls.h> -#define _BLOCKABLE (~(sigmask(SIGKILL) | sigmask(SIGSTOP))) - -asmlinkage int do_signal(struct pt_regs *regs, sigset_t *oldset, int in_sycall); - -asmlinkage long -sys_sigaltstack(const stack_t __user *uss, stack_t __user *uoss, -		struct pt_regs *regs) -{ -	return do_sigaltstack(uss, uoss, regs->r1); -} -  /*   * Do a signal return; undo the signal stack.   */ @@ -93,29 +83,26 @@ static int restore_sigcontext(struct pt_regs *regs,  asmlinkage long sys_rt_sigreturn(struct pt_regs *regs)  {  	struct rt_sigframe __user *frame = -		(struct rt_sigframe __user *)(regs->r1 + STATE_SAVE_ARG_SPACE); +		(struct rt_sigframe __user *)(regs->r1);  	sigset_t set;  	int rval; +	/* Always make any pending restarted system calls return -EINTR */ +	current_thread_info()->restart_block.fn = do_no_restart_syscall; +  	if (!access_ok(VERIFY_READ, frame, sizeof(*frame)))  		goto badframe;  	if (__copy_from_user(&set, &frame->uc.uc_sigmask, sizeof(set)))  		goto badframe; -	sigdelsetmask(&set, ~_BLOCKABLE); -	spin_lock_irq(¤t->sighand->siglock); -	current->blocked = set; -	recalc_sigpending(); -	spin_unlock_irq(¤t->sighand->siglock); +	set_current_blocked(&set);  	if (restore_sigcontext(regs, &frame->uc.uc_mcontext, &rval))  		goto badframe; -	/* It is more difficult to avoid calling this function than to -	 call it and ignore errors. */ -	if (do_sigaltstack(&frame->uc.uc_stack, NULL, regs->r1)) +	if (restore_altstack(&frame->uc.uc_stack))  		goto badframe;  	return rval; @@ -169,7 +156,7 @@ get_sigframe(struct k_sigaction *ka, struct pt_regs *regs, size_t frame_size)  	return (void __user *)((sp - frame_size) & -8UL);  } -static void setup_rt_frame(int sig, struct k_sigaction *ka, siginfo_t *info, +static int setup_rt_frame(int sig, struct k_sigaction *ka, siginfo_t *info,  			sigset_t *set, struct pt_regs *regs)  {  	struct rt_sigframe __user *frame; @@ -197,12 +184,8 @@ static void setup_rt_frame(int sig, struct k_sigaction *ka, siginfo_t *info,  	/* Create the ucontext. */  	err |= __put_user(0, &frame->uc.uc_flags); -	err |= __put_user(0, &frame->uc.uc_link); -	err |= __put_user((void *)current->sas_ss_sp, -			&frame->uc.uc_stack.ss_sp); -	err |= __put_user(sas_ss_flags(regs->r1), -			&frame->uc.uc_stack.ss_flags); -	err |= __put_user(current->sas_ss_size, &frame->uc.uc_stack.ss_size); +	err |= __put_user(NULL, &frame->uc.uc_link); +	err |= __save_altstack(&frame->uc.uc_stack, regs->r1);  	err |= setup_sigcontext(&frame->uc.uc_mcontext,  			regs, set->sig[0]);  	err |= __copy_to_user(&frame->uc.uc_sigmask, set, sizeof(*set)); @@ -233,7 +216,7 @@ static void setup_rt_frame(int sig, struct k_sigaction *ka, siginfo_t *info,  		/* MS: I need add offset in page */  		address += ((unsigned long)frame->tramp) & ~PAGE_MASK;  		/* MS address is virtual */ -		address = virt_to_phys(address); +		address = __virt_to_phys(address);  		invalidate_icache_range(address, address + 8);  		flush_dcache_range(address, address + 8);  	} @@ -247,7 +230,7 @@ static void setup_rt_frame(int sig, struct k_sigaction *ka, siginfo_t *info,  		goto give_sigsegv;  	/* Set up registers for signal handler */ -	regs->r1 = (unsigned long) frame - STATE_SAVE_ARG_SPACE; +	regs->r1 = (unsigned long) frame;  	/* Signal handler args: */  	regs->r5 = signal; /* arg 0: signum */ @@ -258,21 +241,16 @@ static void setup_rt_frame(int sig, struct k_sigaction *ka, siginfo_t *info,  	set_fs(USER_DS); -	/* the tracer may want to single-step inside the handler */ -	if (test_thread_flag(TIF_SINGLESTEP)) -		ptrace_notify(SIGTRAP); -  #ifdef DEBUG_SIG -	printk(KERN_INFO "SIG deliver (%s:%d): sp=%p pc=%08lx\n", +	pr_info("SIG deliver (%s:%d): sp=%p pc=%08lx\n",  		current->comm, current->pid, frame, regs->pc);  #endif -	return; +	return 0;  give_sigsegv: -	if (sig == SIGSEGV) -		ka->sa.sa_handler = SIG_DFL; -	force_sig(SIGSEGV, current); +	force_sigsegv(sig, current); +	return -EFAULT;  }  /* Handle restarting system calls */ @@ -295,15 +273,7 @@ handle_restart(struct pt_regs *regs, struct k_sigaction *ka, int has_handler)  	case -ERESTARTNOINTR:  do_restart:  		/* offset of 4 bytes to re-execute trap (brki) instruction */ -#ifndef CONFIG_MMU  		regs->pc -= 4; -#else -		/* offset of 8 bytes required = 4 for rtbd -		   offset, plus 4 for size of -			"brki r14,8" -		   instruction. */ -		regs->pc -= 8; -#endif  		break;  	}  } @@ -312,28 +282,24 @@ do_restart:   * OK, we're invoking a handler   */ -static int +static void  handle_signal(unsigned long sig, struct k_sigaction *ka, -		siginfo_t *info, sigset_t *oldset, struct pt_regs *regs) +		siginfo_t *info, struct pt_regs *regs)  { +	sigset_t *oldset = sigmask_to_save(); +	int ret; +  	/* Set up the stack frame */  	if (ka->sa.sa_flags & SA_SIGINFO) -		setup_rt_frame(sig, ka, info, oldset, regs); +		ret = setup_rt_frame(sig, ka, info, oldset, regs);  	else -		setup_rt_frame(sig, ka, NULL, oldset, regs); - -	if (ka->sa.sa_flags & SA_ONESHOT) -		ka->sa.sa_handler = SIG_DFL; - -	if (!(ka->sa.sa_flags & SA_NODEFER)) { -		spin_lock_irq(¤t->sighand->siglock); -		sigorsets(¤t->blocked, -				¤t->blocked, &ka->sa.sa_mask); -		sigaddset(¤t->blocked, sig); -		recalc_sigpending(); -		spin_unlock_irq(¤t->sighand->siglock); -	} -	return 1; +		ret = setup_rt_frame(sig, ka, NULL, oldset, regs); + +	if (ret) +		return; + +	signal_delivered(sig, info, ka, regs, +			test_thread_flag(TIF_SINGLESTEP));  }  /* @@ -345,46 +311,24 @@ handle_signal(unsigned long sig, struct k_sigaction *ka,   * the kernel can handle, and then we build all the user-level signal handling   * stack-frames in one go after that.   */ -int do_signal(struct pt_regs *regs, sigset_t *oldset, int in_syscall) +static void do_signal(struct pt_regs *regs, int in_syscall)  {  	siginfo_t info;  	int signr;  	struct k_sigaction ka;  #ifdef DEBUG_SIG -	printk(KERN_INFO "do signal: %p %p %d\n", regs, oldset, in_syscall); -	printk(KERN_INFO "do signal2: %lx %lx %ld [%lx]\n", regs->pc, regs->r1, +	pr_info("do signal: %p %d\n", regs, in_syscall); +	pr_info("do signal2: %lx %lx %ld [%lx]\n", regs->pc, regs->r1,  			regs->r12, current_thread_info()->flags);  #endif -	/* -	 * We want the common case to go fast, which -	 * is why we may in certain cases get here from -	 * kernel mode. Just return without doing anything -	 * if so. -	 */ -	if (kernel_mode(regs)) -		return 1; - -	if (current_thread_info()->status & TS_RESTORE_SIGMASK) -		oldset = ¤t->saved_sigmask; -	else -		oldset = ¤t->blocked;  	signr = get_signal_to_deliver(&info, &ka, regs, NULL);  	if (signr > 0) {  		/* Whee! Actually deliver the signal. */  		if (in_syscall)  			handle_restart(regs, &ka, 1); -		if (handle_signal(signr, &ka, &info, oldset, regs)) { -			/* -			 * A signal was successfully delivered; the saved -			 * sigmask will have been stored in the signal frame, -			 * and will be restored by sigreturn, so we can simply -			 * clear the TS_RESTORE_SIGMASK flag. -			 */ -			current_thread_info()->status &= -			    ~TS_RESTORE_SIGMASK; -		} -		return 1; +		handle_signal(signr, &ka, &info, regs); +		return;  	}  	if (in_syscall) @@ -394,11 +338,14 @@ int do_signal(struct pt_regs *regs, sigset_t *oldset, int in_syscall)  	 * If there's no signal to deliver, we just put the saved sigmask  	 * back.  	 */ -	if (current_thread_info()->status & TS_RESTORE_SIGMASK) { -		current_thread_info()->status &= ~TS_RESTORE_SIGMASK; -		sigprocmask(SIG_SETMASK, ¤t->saved_sigmask, NULL); -	} +	restore_saved_sigmask(); +} -	/* Did we come from a system call? */ -	return 0; +asmlinkage void do_notify_resume(struct pt_regs *regs, int in_syscall) +{ +	if (test_thread_flag(TIF_SIGPENDING)) +		do_signal(regs, in_syscall); + +	if (test_and_clear_thread_flag(TIF_NOTIFY_RESUME)) +		tracehook_notify_resume(regs);  } diff --git a/arch/microblaze/kernel/stacktrace.c b/arch/microblaze/kernel/stacktrace.c index 84bc6686102..b4debe283a7 100644 --- a/arch/microblaze/kernel/stacktrace.c +++ b/arch/microblaze/kernel/stacktrace.c @@ -9,11 +9,11 @@   * for more details.   */ +#include <linux/export.h>  #include <linux/sched.h>  #include <linux/stacktrace.h>  #include <linux/thread_info.h>  #include <linux/ptrace.h> -#include <linux/module.h>  #include <asm/unwind.h>  void save_stack_trace(struct stack_trace *trace) diff --git a/arch/microblaze/kernel/sys_microblaze.c b/arch/microblaze/kernel/sys_microblaze.c index 2250fe9d269..f1e1f666ddd 100644 --- a/arch/microblaze/kernel/sys_microblaze.c +++ b/arch/microblaze/kernel/sys_microblaze.c @@ -13,6 +13,7 @@   */  #include <linux/errno.h> +#include <linux/export.h>  #include <linux/mm.h>  #include <linux/smp.h>  #include <linux/syscalls.h> @@ -24,50 +25,17 @@  #include <linux/sys.h>  #include <linux/ipc.h>  #include <linux/file.h> -#include <linux/module.h>  #include <linux/err.h>  #include <linux/fs.h>  #include <linux/semaphore.h>  #include <linux/uaccess.h>  #include <linux/unistd.h>  #include <linux/slab.h> -  #include <asm/syscalls.h> -asmlinkage long microblaze_vfork(struct pt_regs *regs) -{ -	return do_fork(CLONE_VFORK | CLONE_VM | SIGCHLD, regs->r1, -						regs, 0, NULL, NULL); -} - -asmlinkage long microblaze_clone(int flags, unsigned long stack, struct pt_regs *regs) -{ -	if (!stack) -		stack = regs->r1; -	return do_fork(flags, stack, regs, 0, NULL, NULL); -} - -asmlinkage long microblaze_execve(const char __user *filenamei, -				  const char __user *const __user *argv, -				  const char __user *const __user *envp, -				  struct pt_regs *regs) -{ -	int error; -	char *filename; - -	filename = getname(filenamei); -	error = PTR_ERR(filename); -	if (IS_ERR(filename)) -		goto out; -	error = do_execve(filename, argv, envp, regs); -	putname(filename); -out: -	return error; -} - -asmlinkage long sys_mmap(unsigned long addr, unsigned long len, -			unsigned long prot, unsigned long flags, -			unsigned long fd, off_t pgoff) +SYSCALL_DEFINE6(mmap, unsigned long, addr, unsigned long, len, +		unsigned long, prot, unsigned long, flags, unsigned long, fd, +		off_t, pgoff)  {  	if (pgoff & ~PAGE_MASK)  		return -EINVAL; @@ -75,23 +43,13 @@ asmlinkage long sys_mmap(unsigned long addr, unsigned long len,  	return sys_mmap_pgoff(addr, len, prot, flags, fd, pgoff >> PAGE_SHIFT);  } -/* - * Do a system call from kernel instead of calling sys_execve so we - * end up with proper pt_regs. - */ -int kernel_execve(const char *filename, -		  const char *const argv[], -		  const char *const envp[]) +SYSCALL_DEFINE6(mmap2, unsigned long, addr, unsigned long, len, +		unsigned long, prot, unsigned long, flags, unsigned long, fd, +		unsigned long, pgoff)  { -	register const char *__a __asm__("r5") = filename; -	register const void *__b __asm__("r6") = argv; -	register const void *__c __asm__("r7") = envp; -	register unsigned long __syscall __asm__("r12") = __NR_execve; -	register unsigned long __ret __asm__("r3"); -	__asm__ __volatile__ ("brki r14, 0x8" -			: "=r" (__ret), "=r" (__syscall) -			: "1" (__syscall), "r" (__a), "r" (__b), "r" (__c) -			: "r4", "r8", "r9", -			"r10", "r11", "r14", "cc", "memory"); -	return __ret; +	if (pgoff & (~PAGE_MASK >> 12)) +		return -EINVAL; + +	return sys_mmap_pgoff(addr, len, prot, flags, fd, +			      pgoff >> (PAGE_SHIFT - 12));  } diff --git a/arch/microblaze/kernel/syscall_table.S b/arch/microblaze/kernel/syscall_table.S index e88a930fd1e..329dfbad810 100644 --- a/arch/microblaze/kernel/syscall_table.S +++ b/arch/microblaze/kernel/syscall_table.S @@ -2,11 +2,7 @@ ENTRY(sys_call_table)  	.long sys_restart_syscall	/* 0 - old "setup()" system call,  					 * used for restarting */  	.long sys_exit -#ifdef CONFIG_MMU -	.long sys_fork_wrapper -#else -	.long sys_ni_syscall -#endif +	.long sys_fork  	.long sys_read  	.long sys_write  	.long sys_open			/* 5 */ @@ -173,7 +169,7 @@ ENTRY(sys_call_table)  	.long sys_ni_syscall		/* sys_vm86 */  	.long sys_ni_syscall		/* Old sys_query_module */  	.long sys_poll -	.long sys_nfsservctl +	.long sys_ni_syscall		/* old nfsservctl */  	.long sys_setresgid		/* 170 */  	.long sys_getresgid  	.long sys_prctl @@ -196,7 +192,7 @@ ENTRY(sys_call_table)  	.long sys_ni_syscall		/* reserved for streams2 */  	.long sys_vfork		/* 190 */  	.long sys_getrlimit -	.long sys_mmap_pgoff		/* mmap2 */ +	.long sys_mmap2  	.long sys_truncate64  	.long sys_ftruncate64  	.long sys_stat64		/* 195 */ @@ -312,7 +308,7 @@ ENTRY(sys_call_table)  	.long sys_readlinkat		/* 305 */  	.long sys_fchmodat  	.long sys_faccessat -	.long sys_ni_syscall /* pselect6 */ +	.long sys_pselect6  	.long sys_ppoll  	.long sys_unshare		/* 310 */  	.long sys_set_robust_list @@ -367,11 +363,23 @@ ENTRY(sys_call_table)  	.long sys_sendmsg		/* 360 */  	.long sys_recvmsg  	.long sys_accept4 -	.long sys_ni_syscall -	.long sys_ni_syscall +	.long sys_preadv +	.long sys_pwritev  	.long sys_rt_tgsigqueueinfo	/* 365 */  	.long sys_perf_event_open  	.long sys_recvmmsg  	.long sys_fanotify_init  	.long sys_fanotify_mark  	.long sys_prlimit64	/* 370 */ +	.long sys_name_to_handle_at +	.long sys_open_by_handle_at +	.long sys_clock_adjtime +	.long sys_syncfs +	.long sys_setns			/* 375 */ +	.long sys_sendmmsg +	.long sys_process_vm_readv +	.long sys_process_vm_writev +	.long sys_kcmp +	.long sys_finit_module +	.long sys_sched_setattr +	.long sys_sched_getattr diff --git a/arch/microblaze/kernel/timer.c b/arch/microblaze/kernel/timer.c index a5aa33db1df..dd96f0e4bfa 100644 --- a/arch/microblaze/kernel/timer.c +++ b/arch/microblaze/kernel/timer.c @@ -1,5 +1,6 @@  /* - * Copyright (C) 2007-2009 Michal Simek <monstr@monstr.eu> + * Copyright (C) 2007-2013 Michal Simek <monstr@monstr.eu> + * Copyright (C) 2012-2013 Xilinx, Inc.   * Copyright (C) 2007-2009 PetaLogix   * Copyright (C) 2006 Atmark Techno, Inc.   * @@ -8,38 +9,20 @@   * for more details.   */ -#include <linux/init.h> -#include <linux/kernel.h> -#include <linux/param.h>  #include <linux/interrupt.h> -#include <linux/profile.h> -#include <linux/irq.h>  #include <linux/delay.h>  #include <linux/sched.h> -#include <linux/spinlock.h> -#include <linux/err.h> +#include <linux/sched_clock.h>  #include <linux/clk.h> -#include <linux/clocksource.h>  #include <linux/clockchips.h> -#include <linux/io.h> -#include <linux/bug.h> +#include <linux/of_address.h> +#include <linux/of_irq.h>  #include <asm/cpuinfo.h> -#include <asm/setup.h> -#include <asm/prom.h> -#include <asm/irq.h> -#include <asm/system.h> -#include <linux/cnt32_to_63.h> - -#ifdef CONFIG_SELFMOD_TIMER -#include <asm/selfmod.h> -#define TIMER_BASE	BARRIER_BASE_ADDR -#else -static unsigned int timer_baseaddr; -#define TIMER_BASE	timer_baseaddr -#endif -unsigned int freq_div_hz; -unsigned int timer_clock_freq; +static void __iomem *timer_baseaddr; + +static unsigned int freq_div_hz; +static unsigned int timer_clock_freq;  #define TCSR0	(0x00)  #define TLR0	(0x04) @@ -60,26 +43,51 @@ unsigned int timer_clock_freq;  #define TCSR_PWMA	(1<<9)  #define TCSR_ENALL	(1<<10) -static inline void microblaze_timer0_stop(void) +static unsigned int (*read_fn)(void __iomem *); +static void (*write_fn)(u32, void __iomem *); + +static void timer_write32(u32 val, void __iomem *addr) +{ +	iowrite32(val, addr); +} + +static unsigned int timer_read32(void __iomem *addr) +{ +	return ioread32(addr); +} + +static void timer_write32_be(u32 val, void __iomem *addr) +{ +	iowrite32be(val, addr); +} + +static unsigned int timer_read32_be(void __iomem *addr) +{ +	return ioread32be(addr); +} + +static inline void xilinx_timer0_stop(void)  { -	out_be32(TIMER_BASE + TCSR0, in_be32(TIMER_BASE + TCSR0) & ~TCSR_ENT); +	write_fn(read_fn(timer_baseaddr + TCSR0) & ~TCSR_ENT, +		 timer_baseaddr + TCSR0);  } -static inline void microblaze_timer0_start_periodic(unsigned long load_val) +static inline void xilinx_timer0_start_periodic(unsigned long load_val)  {  	if (!load_val)  		load_val = 1; -	out_be32(TIMER_BASE + TLR0, load_val); /* loading value to timer reg */ +	/* loading value to timer reg */ +	write_fn(load_val, timer_baseaddr + TLR0);  	/* load the initial value */ -	out_be32(TIMER_BASE + TCSR0, TCSR_LOAD); +	write_fn(TCSR_LOAD, timer_baseaddr + TCSR0);  	/* see timer data sheet for detail  	 * !ENALL - don't enable 'em all  	 * !PWMA - disable pwm  	 * TINT - clear interrupt status  	 * ENT- enable timer itself -	 * EINT - enable interrupt +	 * ENIT - enable interrupt  	 * !LOAD - clear the bit to let go  	 * ARHT - auto reload  	 * !CAPT - no external trigger @@ -87,74 +95,75 @@ static inline void microblaze_timer0_start_periodic(unsigned long load_val)  	 * UDT - set the timer as down counter  	 * !MDT0 - generate mode  	 */ -	out_be32(TIMER_BASE + TCSR0, -			TCSR_TINT|TCSR_ENIT|TCSR_ENT|TCSR_ARHT|TCSR_UDT); +	write_fn(TCSR_TINT|TCSR_ENIT|TCSR_ENT|TCSR_ARHT|TCSR_UDT, +		 timer_baseaddr + TCSR0);  } -static inline void microblaze_timer0_start_oneshot(unsigned long load_val) +static inline void xilinx_timer0_start_oneshot(unsigned long load_val)  {  	if (!load_val)  		load_val = 1; -	out_be32(TIMER_BASE + TLR0, load_val); /* loading value to timer reg */ +	/* loading value to timer reg */ +	write_fn(load_val, timer_baseaddr + TLR0);  	/* load the initial value */ -	out_be32(TIMER_BASE + TCSR0, TCSR_LOAD); +	write_fn(TCSR_LOAD, timer_baseaddr + TCSR0); -	out_be32(TIMER_BASE + TCSR0, -			TCSR_TINT|TCSR_ENIT|TCSR_ENT|TCSR_ARHT|TCSR_UDT); +	write_fn(TCSR_TINT|TCSR_ENIT|TCSR_ENT|TCSR_ARHT|TCSR_UDT, +		 timer_baseaddr + TCSR0);  } -static int microblaze_timer_set_next_event(unsigned long delta, +static int xilinx_timer_set_next_event(unsigned long delta,  					struct clock_event_device *dev)  {  	pr_debug("%s: next event, delta %x\n", __func__, (u32)delta); -	microblaze_timer0_start_oneshot(delta); +	xilinx_timer0_start_oneshot(delta);  	return 0;  } -static void microblaze_timer_set_mode(enum clock_event_mode mode, +static void xilinx_timer_set_mode(enum clock_event_mode mode,  				struct clock_event_device *evt)  {  	switch (mode) {  	case CLOCK_EVT_MODE_PERIODIC: -		printk(KERN_INFO "%s: periodic\n", __func__); -		microblaze_timer0_start_periodic(freq_div_hz); +		pr_info("%s: periodic\n", __func__); +		xilinx_timer0_start_periodic(freq_div_hz);  		break;  	case CLOCK_EVT_MODE_ONESHOT: -		printk(KERN_INFO "%s: oneshot\n", __func__); +		pr_info("%s: oneshot\n", __func__);  		break;  	case CLOCK_EVT_MODE_UNUSED: -		printk(KERN_INFO "%s: unused\n", __func__); +		pr_info("%s: unused\n", __func__);  		break;  	case CLOCK_EVT_MODE_SHUTDOWN: -		printk(KERN_INFO "%s: shutdown\n", __func__); -		microblaze_timer0_stop(); +		pr_info("%s: shutdown\n", __func__); +		xilinx_timer0_stop();  		break;  	case CLOCK_EVT_MODE_RESUME: -		printk(KERN_INFO "%s: resume\n", __func__); +		pr_info("%s: resume\n", __func__);  		break;  	}  } -static struct clock_event_device clockevent_microblaze_timer = { -	.name		= "microblaze_clockevent", +static struct clock_event_device clockevent_xilinx_timer = { +	.name		= "xilinx_clockevent",  	.features       = CLOCK_EVT_FEAT_ONESHOT | CLOCK_EVT_FEAT_PERIODIC,  	.shift		= 8,  	.rating		= 300, -	.set_next_event	= microblaze_timer_set_next_event, -	.set_mode	= microblaze_timer_set_mode, +	.set_next_event	= xilinx_timer_set_next_event, +	.set_mode	= xilinx_timer_set_mode,  };  static inline void timer_ack(void)  { -	out_be32(TIMER_BASE + TCSR0, in_be32(TIMER_BASE + TCSR0)); +	write_fn(read_fn(timer_baseaddr + TCSR0), timer_baseaddr + TCSR0);  }  static irqreturn_t timer_interrupt(int irq, void *dev_id)  { -	struct clock_event_device *evt = &clockevent_microblaze_timer; +	struct clock_event_device *evt = &clockevent_xilinx_timer;  #ifdef CONFIG_HEART_BEAT -	heartbeat(); +	microblaze_heartbeat();  #endif  	timer_ack();  	evt->event_handler(evt); @@ -163,157 +172,147 @@ static irqreturn_t timer_interrupt(int irq, void *dev_id)  static struct irqaction timer_irqaction = {  	.handler = timer_interrupt, -	.flags = IRQF_DISABLED | IRQF_TIMER, +	.flags = IRQF_TIMER,  	.name = "timer", -	.dev_id = &clockevent_microblaze_timer, +	.dev_id = &clockevent_xilinx_timer,  }; -static __init void microblaze_clockevent_init(void) +static __init void xilinx_clockevent_init(void)  { -	clockevent_microblaze_timer.mult = +	clockevent_xilinx_timer.mult =  		div_sc(timer_clock_freq, NSEC_PER_SEC, -				clockevent_microblaze_timer.shift); -	clockevent_microblaze_timer.max_delta_ns = -		clockevent_delta2ns((u32)~0, &clockevent_microblaze_timer); -	clockevent_microblaze_timer.min_delta_ns = -		clockevent_delta2ns(1, &clockevent_microblaze_timer); -	clockevent_microblaze_timer.cpumask = cpumask_of(0); -	clockevents_register_device(&clockevent_microblaze_timer); +				clockevent_xilinx_timer.shift); +	clockevent_xilinx_timer.max_delta_ns = +		clockevent_delta2ns((u32)~0, &clockevent_xilinx_timer); +	clockevent_xilinx_timer.min_delta_ns = +		clockevent_delta2ns(1, &clockevent_xilinx_timer); +	clockevent_xilinx_timer.cpumask = cpumask_of(0); +	clockevents_register_device(&clockevent_xilinx_timer);  } -static cycle_t microblaze_read(struct clocksource *cs) +static u64 xilinx_clock_read(void) +{ +	return read_fn(timer_baseaddr + TCR1); +} + +static cycle_t xilinx_read(struct clocksource *cs)  {  	/* reading actual value of timer 1 */ -	return (cycle_t) (in_be32(TIMER_BASE + TCR1)); +	return (cycle_t)xilinx_clock_read();  } -static struct timecounter microblaze_tc = { +static struct timecounter xilinx_tc = {  	.cc = NULL,  }; -static cycle_t microblaze_cc_read(const struct cyclecounter *cc) +static cycle_t xilinx_cc_read(const struct cyclecounter *cc)  { -	return microblaze_read(NULL); +	return xilinx_read(NULL);  } -static struct cyclecounter microblaze_cc = { -	.read = microblaze_cc_read, +static struct cyclecounter xilinx_cc = { +	.read = xilinx_cc_read,  	.mask = CLOCKSOURCE_MASK(32),  	.shift = 8,  }; -int __init init_microblaze_timecounter(void) +static int __init init_xilinx_timecounter(void)  { -	microblaze_cc.mult = div_sc(timer_clock_freq, NSEC_PER_SEC, -				microblaze_cc.shift); +	xilinx_cc.mult = div_sc(timer_clock_freq, NSEC_PER_SEC, +				xilinx_cc.shift); -	timecounter_init(µblaze_tc, µblaze_cc, sched_clock()); +	timecounter_init(&xilinx_tc, &xilinx_cc, sched_clock());  	return 0;  }  static struct clocksource clocksource_microblaze = { -	.name		= "microblaze_clocksource", +	.name		= "xilinx_clocksource",  	.rating		= 300, -	.read		= microblaze_read, +	.read		= xilinx_read,  	.mask		= CLOCKSOURCE_MASK(32), -	.shift		= 8, /* I can shift it */  	.flags		= CLOCK_SOURCE_IS_CONTINUOUS,  }; -static int __init microblaze_clocksource_init(void) +static int __init xilinx_clocksource_init(void)  { -	clocksource_microblaze.mult = -			clocksource_hz2mult(timer_clock_freq, -						clocksource_microblaze.shift); -	if (clocksource_register(&clocksource_microblaze)) +	if (clocksource_register_hz(&clocksource_microblaze, timer_clock_freq))  		panic("failed to register clocksource");  	/* stop timer1 */ -	out_be32(TIMER_BASE + TCSR1, in_be32(TIMER_BASE + TCSR1) & ~TCSR_ENT); +	write_fn(read_fn(timer_baseaddr + TCSR1) & ~TCSR_ENT, +		 timer_baseaddr + TCSR1);  	/* start timer1 - up counting without interrupt */ -	out_be32(TIMER_BASE + TCSR1, TCSR_TINT|TCSR_ENT|TCSR_ARHT); +	write_fn(TCSR_TINT|TCSR_ENT|TCSR_ARHT, timer_baseaddr + TCSR1);  	/* register timecounter - for ftrace support */ -	init_microblaze_timecounter(); +	init_xilinx_timecounter();  	return 0;  } -/* - * We have to protect accesses before timer initialization - * and return 0 for sched_clock function below. - */ -static int timer_initialized; - -void __init time_init(void) +static void __init xilinx_timer_init(struct device_node *timer)  { -	u32 irq, i = 0; +	struct clk *clk; +	static int initialized; +	u32 irq;  	u32 timer_num = 1; -	struct device_node *timer = NULL; -	const void *prop; -#ifdef CONFIG_SELFMOD_TIMER -	unsigned int timer_baseaddr = 0; -	int arr_func[] = { -				(int)µblaze_read, -				(int)&timer_interrupt, -				(int)µblaze_clocksource_init, -				(int)µblaze_timer_set_mode, -				(int)µblaze_timer_set_next_event, -				0 -			}; -#endif -	const char * const timer_list[] = { -		"xlnx,xps-timer-1.00.a", -		NULL -	}; - -	for (i = 0; timer_list[i] != NULL; i++) { -		timer = of_find_compatible_node(NULL, NULL, timer_list[i]); -		if (timer) -			break; + +	if (initialized) +		return; + +	initialized = 1; + +	timer_baseaddr = of_iomap(timer, 0); +	if (!timer_baseaddr) { +		pr_err("ERROR: invalid timer base address\n"); +		BUG();  	} -	BUG_ON(!timer); -	timer_baseaddr = be32_to_cpup(of_get_property(timer, "reg", NULL)); -	timer_baseaddr = (unsigned long) ioremap(timer_baseaddr, PAGE_SIZE); -	irq = be32_to_cpup(of_get_property(timer, "interrupts", NULL)); -	timer_num = be32_to_cpup(of_get_property(timer, -						"xlnx,one-timer-only", NULL)); +	write_fn = timer_write32; +	read_fn = timer_read32; + +	write_fn(TCSR_MDT, timer_baseaddr + TCSR0); +	if (!(read_fn(timer_baseaddr + TCSR0) & TCSR_MDT)) { +		write_fn = timer_write32_be; +		read_fn = timer_read32_be; +	} + +	irq = irq_of_parse_and_map(timer, 0); + +	of_property_read_u32(timer, "xlnx,one-timer-only", &timer_num);  	if (timer_num) { -		eprintk(KERN_EMERG "Please enable two timers in HW\n"); +		pr_emerg("Please enable two timers in HW\n");  		BUG();  	} -#ifdef CONFIG_SELFMOD_TIMER -	selfmod_function((int *) arr_func, timer_baseaddr); -#endif -	printk(KERN_INFO "%s #0 at 0x%08x, irq=%d\n", -		timer_list[i], timer_baseaddr, irq); - -	/* If there is clock-frequency property than use it */ -	prop = of_get_property(timer, "clock-frequency", NULL); -	if (prop) -		timer_clock_freq = be32_to_cpup(prop); -	else +	pr_info("%s: irq=%d\n", timer->full_name, irq); + +	clk = of_clk_get(timer, 0); +	if (IS_ERR(clk)) { +		pr_err("ERROR: timer CCF input clock not found\n"); +		/* If there is clock-frequency property than use it */ +		of_property_read_u32(timer, "clock-frequency", +				    &timer_clock_freq); +	} else { +		timer_clock_freq = clk_get_rate(clk); +	} + +	if (!timer_clock_freq) { +		pr_err("ERROR: Using CPU clock frequency\n");  		timer_clock_freq = cpuinfo.cpu_clock_freq; +	}  	freq_div_hz = timer_clock_freq / HZ;  	setup_irq(irq, &timer_irqaction);  #ifdef CONFIG_HEART_BEAT -	setup_heartbeat(); +	microblaze_setup_heartbeat();  #endif -	microblaze_clocksource_init(); -	microblaze_clockevent_init(); -	timer_initialized = 1; -} +	xilinx_clocksource_init(); +	xilinx_clockevent_init(); -unsigned long long notrace sched_clock(void) -{ -	if (timer_initialized) { -		struct clocksource *cs = &clocksource_microblaze; -		cycle_t cyc = cnt32_to_63(cs->read(NULL)); -		return clocksource_cyc2ns(cyc, cs->mult, cs->shift); -	} -	return 0; +	sched_clock_register(xilinx_clock_read, 32, timer_clock_freq);  } + +CLOCKSOURCE_OF_DECLARE(xilinx_timer, "xlnx,xps-timer-1.00.a", +		       xilinx_timer_init); diff --git a/arch/microblaze/kernel/traps.c b/arch/microblaze/kernel/traps.c index ba034d421ec..cb619533a19 100644 --- a/arch/microblaze/kernel/traps.c +++ b/arch/microblaze/kernel/traps.c @@ -8,14 +8,13 @@   * for more details.   */ +#include <linux/export.h>  #include <linux/kernel.h>  #include <linux/kallsyms.h> -#include <linux/module.h>  #include <linux/sched.h>  #include <linux/debug_locks.h>  #include <asm/exceptions.h> -#include <asm/system.h>  #include <asm/unwind.h>  void trap_init(void) @@ -27,7 +26,7 @@ static unsigned long kstack_depth_to_print;	/* 0 == entire stack */  static int __init kstack_setup(char *s)  { -	return !strict_strtoul(s, 0, &kstack_depth_to_print); +	return !kstrtoul(s, 0, &kstack_depth_to_print);  }  __setup("kstack=", kstack_setup); @@ -67,9 +66,7 @@ void show_stack(struct task_struct *task, unsigned long *sp)  	}  	print_hex_dump(KERN_INFO, "", DUMP_PREFIX_ADDRESS, 32, 4, (void *)fp,  		       words_to_show << 2, 0); -	printk(KERN_INFO "\n\n"); - -	pr_info("Call Trace:\n"); +	pr_info("\n\nCall Trace:\n");  	microblaze_unwind(task, NULL);  	pr_info("\n"); @@ -78,9 +75,3 @@ void show_stack(struct task_struct *task, unsigned long *sp)  	debug_show_held_locks(task);  } - -void dump_stack(void) -{ -	show_stack(NULL, NULL); -} -EXPORT_SYMBOL(dump_stack); diff --git a/arch/microblaze/kernel/unwind.c b/arch/microblaze/kernel/unwind.c index fefac5c3358..1f7b8d44966 100644 --- a/arch/microblaze/kernel/unwind.c +++ b/arch/microblaze/kernel/unwind.c @@ -13,17 +13,18 @@   */  /* #define DEBUG 1 */ +#include <linux/export.h>  #include <linux/kallsyms.h>  #include <linux/kernel.h>  #include <linux/sched.h>  #include <linux/stacktrace.h>  #include <linux/types.h>  #include <linux/errno.h> -#include <linux/module.h>  #include <linux/io.h>  #include <asm/sections.h>  #include <asm/exceptions.h>  #include <asm/unwind.h> +#include <asm/switch_to.h>  struct stack_trace; @@ -183,7 +184,7 @@ static inline void unwind_trap(struct task_struct *task, unsigned long pc,   * @trace : Where to store stack backtrace (PC values).   *	    NULL == print backtrace to kernel log   */ -void microblaze_unwind_inner(struct task_struct *task, +static void microblaze_unwind_inner(struct task_struct *task,  			     unsigned long pc, unsigned long fp,  			     unsigned long leaf_return,  			     struct stack_trace *trace) diff --git a/arch/microblaze/kernel/vmlinux.lds.S b/arch/microblaze/kernel/vmlinux.lds.S index 96a88c31fe4..be9488d6973 100644 --- a/arch/microblaze/kernel/vmlinux.lds.S +++ b/arch/microblaze/kernel/vmlinux.lds.S @@ -44,13 +44,14 @@ SECTIONS {  	__fdt_blob : AT(ADDR(__fdt_blob) - LOAD_OFFSET) {  		_fdt_start = . ;		/* place for fdt blob */  		*(__fdt_blob) ;			/* Any link-placed DTB */ -	        . = _fdt_start + 0x4000;	/* Pad up to 16kbyte */ +	        . = _fdt_start + 0x8000;	/* Pad up to 32kbyte */  		_fdt_end = . ;  	}  	. = ALIGN(16);  	RODATA  	EXCEPTION_TABLE(16) +	NOTES  	/*  	 * sdata2 section can go anywhere, but must be word aligned @@ -70,11 +71,6 @@ SECTIONS {  	RW_DATA_SECTION(32, PAGE_SIZE, THREAD_SIZE)  	_edata = . ; -	/* Reserve some low RAM for r0 based memory references */ -	. = ALIGN(0x4) ; -	r0_ram = . ; -	. = . +  PAGE_SIZE;	/* a page should be enough */ -  	/* Under the microblaze ABI, .sdata and .sbss must be contiguous */  	. = ALIGN(8);  	.sdata : AT(ADDR(.sdata) - LOAD_OFFSET) { @@ -123,20 +119,10 @@ SECTIONS {  	__init_end_before_initramfs = .; -	.init.ramfs ALIGN(PAGE_SIZE) : AT(ADDR(.init.ramfs) - LOAD_OFFSET) { -		__initramfs_start = .; -		*(.init.ramfs) -		__initramfs_end = .; -		. = ALIGN(4); -		LONG(0); -/* - * FIXME this can break initramfs for MMU. - * Pad init.ramfs up to page boundary, - * so that __init_end == __bss_start. This will make image.elf - * consistent with the image.bin - */ -		/* . = ALIGN(PAGE_SIZE); */ +	.init.ramfs : AT(ADDR(.init.ramfs) - LOAD_OFFSET) { +		INIT_RAM_FS  	} +  	__init_end = .;  	.bss ALIGN (PAGE_SIZE) : AT(ADDR(.bss) - LOAD_OFFSET) { @@ -146,7 +132,6 @@ SECTIONS {  			*(COMMON)  		. = ALIGN (4) ;  		__bss_stop = . ; -		_ebss = . ;  	}  	. = ALIGN(PAGE_SIZE);  	_end = .; diff --git a/arch/microblaze/lib/Makefile b/arch/microblaze/lib/Makefile index f1fcbff3da2..844960e8ae1 100644 --- a/arch/microblaze/lib/Makefile +++ b/arch/microblaze/lib/Makefile @@ -2,6 +2,12 @@  # Makefile  # +ifdef CONFIG_FUNCTION_TRACER +CFLAGS_REMOVE_ashldi3.o = -pg +CFLAGS_REMOVE_ashrdi3.o = -pg +CFLAGS_REMOVE_lshrdi3.o = -pg +endif +  lib-y :=  memset.o  ifeq ($(CONFIG_OPT_LIB_ASM),y) @@ -14,10 +20,12 @@ lib-y += uaccess_old.o  lib-y += ashldi3.o  lib-y += ashrdi3.o +lib-y += cmpdi2.o  lib-y += divsi3.o  lib-y += lshrdi3.o  lib-y += modsi3.o  lib-y += muldi3.o  lib-y += mulsi3.o +lib-y += ucmpdi2.o  lib-y += udivsi3.o  lib-y += umodsi3.o diff --git a/arch/microblaze/lib/ashldi3.c b/arch/microblaze/lib/ashldi3.c index beb80f31609..1af904cd972 100644 --- a/arch/microblaze/lib/ashldi3.c +++ b/arch/microblaze/lib/ashldi3.c @@ -1,4 +1,4 @@ -#include <linux/module.h> +#include <linux/export.h>  #include "libgcc.h" @@ -25,5 +25,4 @@ long long __ashldi3(long long u, word_type b)  	return w.ll;  } -  EXPORT_SYMBOL(__ashldi3); diff --git a/arch/microblaze/lib/ashrdi3.c b/arch/microblaze/lib/ashrdi3.c index c884a912b66..32c334c05d0 100644 --- a/arch/microblaze/lib/ashrdi3.c +++ b/arch/microblaze/lib/ashrdi3.c @@ -1,4 +1,4 @@ -#include <linux/module.h> +#include <linux/export.h>  #include "libgcc.h" @@ -27,5 +27,4 @@ long long __ashrdi3(long long u, word_type b)  	return w.ll;  } -  EXPORT_SYMBOL(__ashrdi3); diff --git a/arch/microblaze/lib/cmpdi2.c b/arch/microblaze/lib/cmpdi2.c new file mode 100644 index 00000000000..67abc9ac1bd --- /dev/null +++ b/arch/microblaze/lib/cmpdi2.c @@ -0,0 +1,26 @@ +#include <linux/export.h> + +#include "libgcc.h" + +word_type __cmpdi2(long long a, long long b) +{ +	const DWunion au = { +		.ll = a +	}; +	const DWunion bu = { +		.ll = b +	}; + +	if (au.s.high < bu.s.high) +		return 0; +	else if (au.s.high > bu.s.high) +		return 2; + +	if ((unsigned int) au.s.low < (unsigned int) bu.s.low) +		return 0; +	else if ((unsigned int) au.s.low > (unsigned int) bu.s.low) +		return 2; + +	return 1; +} +EXPORT_SYMBOL(__cmpdi2); diff --git a/arch/microblaze/lib/fastcopy.S b/arch/microblaze/lib/fastcopy.S index fdc48bb065d..62021d7e249 100644 --- a/arch/microblaze/lib/fastcopy.S +++ b/arch/microblaze/lib/fastcopy.S @@ -29,6 +29,10 @@   *	between mem locations with size of xfer spec'd in bytes   */ +#ifdef __MICROBLAZEEL__ +#error Microblaze LE not support ASM optimized lib func. Disable OPT_LIB_ASM. +#endif +  #include <linux/linkage.h>  	.text  	.globl	memcpy diff --git a/arch/microblaze/lib/libgcc.h b/arch/microblaze/lib/libgcc.h index 05909d58e2f..ab077ef7e14 100644 --- a/arch/microblaze/lib/libgcc.h +++ b/arch/microblaze/lib/libgcc.h @@ -22,4 +22,11 @@ typedef union {  	long long ll;  } DWunion; +extern long long __ashldi3(long long u, word_type b); +extern long long __ashrdi3(long long u, word_type b); +extern word_type __cmpdi2(long long a, long long b); +extern long long __lshrdi3(long long u, word_type b); +extern long long __muldi3(long long u, long long v); +extern word_type __ucmpdi2(unsigned long long a, unsigned long long b); +  #endif /* __ASM_LIBGCC_H */ diff --git a/arch/microblaze/lib/lshrdi3.c b/arch/microblaze/lib/lshrdi3.c index dcf8d6810b7..adcb253f11c 100644 --- a/arch/microblaze/lib/lshrdi3.c +++ b/arch/microblaze/lib/lshrdi3.c @@ -1,4 +1,4 @@ -#include <linux/module.h> +#include <linux/export.h>  #include "libgcc.h" @@ -25,5 +25,4 @@ long long __lshrdi3(long long u, word_type b)  	return w.ll;  } -  EXPORT_SYMBOL(__lshrdi3); diff --git a/arch/microblaze/lib/memcpy.c b/arch/microblaze/lib/memcpy.c index cc495d7d99c..f536e81b816 100644 --- a/arch/microblaze/lib/memcpy.c +++ b/arch/microblaze/lib/memcpy.c @@ -24,13 +24,12 @@   * not any responsibility to update it.   */ +#include <linux/export.h>  #include <linux/types.h>  #include <linux/stddef.h>  #include <linux/compiler.h> -#include <linux/module.h>  #include <linux/string.h> -#include <asm/system.h>  #ifdef __HAVE_ARCH_MEMCPY  #ifndef CONFIG_OPT_LIB_FUNCTION @@ -63,8 +62,8 @@ void *memcpy(void *v_dst, const void *v_src, __kernel_size_t c)  	if (likely(c >= 4)) {  		unsigned  value, buf_hold; -		/* Align the dstination to a word boundry. */ -		/* This is done in an endian independant manner. */ +		/* Align the destination to a word boundary. */ +		/* This is done in an endian independent manner. */  		switch ((unsigned long)dst & 3) {  		case 1:  			*dst++ = *src++; @@ -80,7 +79,7 @@ void *memcpy(void *v_dst, const void *v_src, __kernel_size_t c)  		i_dst = (void *)dst;  		/* Choose a copy scheme based on the source */ -		/* alignment relative to dstination. */ +		/* alignment relative to destination. */  		switch ((unsigned long)src & 3) {  		case 0x0:	/* Both byte offsets are aligned */  			i_src  = (const void *)src; @@ -104,12 +103,12 @@ void *memcpy(void *v_dst, const void *v_src, __kernel_size_t c)  			}  #else  			/* Load the holding buffer */ -			buf_hold = (*i_src++ & 0xFFFFFF00) >>8; +			buf_hold = (*i_src++ & 0xFFFFFF00) >> 8;  			for (; c >= 4; c -= 4) {  				value = *i_src++;  				*i_dst++ = buf_hold | ((value & 0xFF) << 24); -				buf_hold = (value & 0xFFFFFF00) >>8; +				buf_hold = (value & 0xFFFFFF00) >> 8;  			}  #endif  			/* Realign the source */ @@ -130,12 +129,12 @@ void *memcpy(void *v_dst, const void *v_src, __kernel_size_t c)  			}  #else  			/* Load the holding buffer */ -			buf_hold = (*i_src++ & 0xFFFF0000 )>>16; +			buf_hold = (*i_src++ & 0xFFFF0000) >> 16;  			for (; c >= 4; c -= 4) {  				value = *i_src++; -				*i_dst++ = buf_hold | ((value & 0xFFFF)<<16); -				buf_hold = (value & 0xFFFF0000) >>16; +				*i_dst++ = buf_hold | ((value & 0xFFFF) << 16); +				buf_hold = (value & 0xFFFF0000) >> 16;  			}  #endif  			/* Realign the source */ @@ -173,7 +172,7 @@ void *memcpy(void *v_dst, const void *v_src, __kernel_size_t c)  	}  	/* Finish off any remaining bytes */ -	/* simple fast copy, ... unless a cache boundry is crossed */ +	/* simple fast copy, ... unless a cache boundary is crossed */  	switch (c) {  	case 3:  		*dst++ = *src++; diff --git a/arch/microblaze/lib/memmove.c b/arch/microblaze/lib/memmove.c index 123e3616f2d..3611ce70415 100644 --- a/arch/microblaze/lib/memmove.c +++ b/arch/microblaze/lib/memmove.c @@ -24,10 +24,10 @@   * not any responsibility to update it.   */ +#include <linux/export.h>  #include <linux/types.h>  #include <linux/stddef.h>  #include <linux/compiler.h> -#include <linux/module.h>  #include <linux/string.h>  #ifdef __HAVE_ARCH_MEMMOVE @@ -83,8 +83,8 @@ void *memmove(void *v_dst, const void *v_src, __kernel_size_t c)  	if (c >= 4) {  		unsigned  value, buf_hold; -		/* Align the destination to a word boundry. */ -		/* This is done in an endian independant manner. */ +		/* Align the destination to a word boundary. */ +		/* This is done in an endian independent manner. */  		switch ((unsigned long)dst & 3) {  		case 3: @@ -129,7 +129,8 @@ void *memmove(void *v_dst, const void *v_src, __kernel_size_t c)  			for (; c >= 4; c -= 4) {  				value = *--i_src; -				*--i_dst = buf_hold | ((value & 0xFFFFFF00)>>8); +				*--i_dst = buf_hold | +						((value & 0xFFFFFF00) >> 8);  				buf_hold = (value  & 0xFF) << 24;  			}  #endif @@ -155,7 +156,8 @@ void *memmove(void *v_dst, const void *v_src, __kernel_size_t c)  			for (; c >= 4; c -= 4) {  				value = *--i_src; -				*--i_dst = buf_hold | ((value & 0xFFFF0000)>>16); +				*--i_dst = buf_hold | +						((value & 0xFFFF0000) >> 16);  				buf_hold = (value & 0xFFFF) << 16;  			}  #endif @@ -181,8 +183,9 @@ void *memmove(void *v_dst, const void *v_src, __kernel_size_t c)  			for (; c >= 4; c -= 4) {  				value = *--i_src; -				*--i_dst = buf_hold | ((value & 0xFF000000)>> 24); -				buf_hold = (value & 0xFFFFFF) << 8;; +				*--i_dst = buf_hold | +						((value & 0xFF000000) >> 24); +				buf_hold = (value & 0xFFFFFF) << 8;  			}  #endif  			/* Realign the source */ @@ -193,7 +196,7 @@ void *memmove(void *v_dst, const void *v_src, __kernel_size_t c)  		dst = (void *)i_dst;  	} -	/* simple fast copy, ... unless a cache boundry is crossed */ +	/* simple fast copy, ... unless a cache boundary is crossed */  	/* Finish off any remaining bytes */  	switch (c) {  	case 4: diff --git a/arch/microblaze/lib/memset.c b/arch/microblaze/lib/memset.c index 834565d1607..04ea72c8a81 100644 --- a/arch/microblaze/lib/memset.c +++ b/arch/microblaze/lib/memset.c @@ -24,10 +24,10 @@   * not any responsibility to update it.   */ +#include <linux/export.h>  #include <linux/types.h>  #include <linux/stddef.h>  #include <linux/compiler.h> -#include <linux/module.h>  #include <linux/string.h>  #ifdef __HAVE_ARCH_MEMSET @@ -64,7 +64,7 @@ void *memset(void *v_src, int c, __kernel_size_t n)  	if (likely(n >= 4)) {  		/* Align the destination to a word boundary */ -		/* This is done in an endian independant manner */ +		/* This is done in an endian independent manner */  		switch ((unsigned) src & 3) {  		case 1:  			*src++ = c; diff --git a/arch/microblaze/lib/muldi3.S b/arch/microblaze/lib/muldi3.S deleted file mode 100644 index ceeaa8c407f..00000000000 --- a/arch/microblaze/lib/muldi3.S +++ /dev/null @@ -1,121 +0,0 @@ -#include <linux/linkage.h> - -/* - * Multiply operation for 64 bit integers, for devices with hard multiply - *	Input :	Operand1[H] in Reg r5 - *		Operand1[L] in Reg r6 - *		Operand2[H] in Reg r7 - *		Operand2[L] in Reg r8 - *	Output: Result[H] in Reg r3 - *		Result[L] in Reg r4 - * - * Explaination: - * - *	Both the input numbers are divided into 16 bit number as follows - *		op1 = A B C D - *		op2 = E F G H - *	result = D * H - *		 + (C * H + D * G) << 16 - *		 + (B * H + C * G + D * F) << 32 - *		 + (A * H + B * G + C * F + D * E) << 48 - * - *	Only 64 bits of the output are considered - */ - -	.text -	.globl	__muldi3 -	.type __muldi3, @function -	.ent __muldi3 - -__muldi3: -	addi	r1, r1, -40 - -/* Save the input operands on the caller's stack */ -	swi	r5, r1, 44 -	swi	r6, r1, 48 -	swi	r7, r1, 52 -	swi	r8, r1, 56 - -/* Store all the callee saved registers */ -	sw	r20, r1, r0 -	swi	r21, r1, 4 -	swi	r22, r1, 8 -	swi	r23, r1, 12 -	swi	r24, r1, 16 -	swi	r25, r1, 20 -	swi	r26, r1, 24 -	swi	r27, r1, 28 - -/* Load all the 16 bit values for A thru H */ -	lhui	r20, r1, 44 /* A */ -	lhui	r21, r1, 46 /* B */ -	lhui	r22, r1, 48 /* C */ -	lhui	r23, r1, 50 /* D */ -	lhui	r24, r1, 52 /* E */ -	lhui	r25, r1, 54 /* F */ -	lhui	r26, r1, 56 /* G */ -	lhui	r27, r1, 58 /* H */ - -/* D * H ==> LSB of the result on stack ==> Store1 */ -	mul	r9, r23, r27 -	swi	r9, r1, 36 /* Pos2 and Pos3 */ - -/* Hi (Store1) + C * H + D * G ==> Store2 ==> Pos1 and Pos2 */ -/* Store the carry generated in position 2 for Pos 3 */ -	lhui	r11, r1, 36 /* Pos2 */ -	mul	r9, r22, r27 /* C * H */ -	mul	r10, r23, r26 /* D * G */ -	add	r9, r9, r10 -	addc	r12, r0, r0 -	add	r9, r9, r11 -	addc	r12, r12, r0 /* Store the Carry */ -	shi	r9, r1, 36 /* Store Pos2 */ -	swi	r9, r1, 32 -	lhui	r11, r1, 32 -	shi	r11, r1, 34 /* Store Pos1 */ - -/* Hi (Store2) + B * H + C * G + D * F ==> Store3 ==> Pos0 and Pos1 */ -	mul	r9, r21, r27 /* B * H */ -	mul	r10, r22, r26 /* C * G */ -	mul	r7, r23, r25 /* D * F */ -	add	r9, r9, r11 -	add	r9, r9, r10 -	add	r9, r9, r7 -	swi	r9, r1, 32 /* Pos0 and Pos1 */ - -/* Hi (Store3) + A * H + B * G + C * F + D * E ==> Store3 ==> Pos0 */ -	lhui	r11, r1, 32 /* Pos0 */ -	mul	r9, r20, r27 /* A * H */ -	mul	r10, r21, r26 /* B * G */ -	mul	r7, r22, r25 /* C * F */ -	mul	r8, r23, r24 /* D * E */ -	add	r9, r9, r11 -	add 	r9, r9, r10 -	add	r9, r9, r7 -	add	r9, r9, r8 -	sext16	r9, r9 /* Sign extend the MSB */ -	shi	r9, r1, 32 - -/* Move results to r3 and r4 */ -	lhui	r3, r1, 32 -	add	r3, r3, r12 -	shi	r3, r1, 32 -	lwi	r3, r1, 32 /* Hi Part */ -	lwi	r4, r1, 36 /* Lo Part */ - -/* Restore Callee saved registers */ -	lw	r20, r1, r0 -	lwi	r21, r1, 4 -	lwi	r22, r1, 8 -	lwi	r23, r1, 12 -	lwi	r24, r1, 16 -	lwi	r25, r1, 20 -	lwi	r26, r1, 24 -	lwi	r27, r1, 28 - -/* Restore Frame and return */ -	rtsd	r15, 8 -	addi	r1, r1, 40 - -.size __muldi3, . - __muldi3 -.end __muldi3 diff --git a/arch/microblaze/lib/muldi3.c b/arch/microblaze/lib/muldi3.c new file mode 100644 index 00000000000..a3f9a03acdc --- /dev/null +++ b/arch/microblaze/lib/muldi3.c @@ -0,0 +1,57 @@ +#include <linux/export.h> + +#include "libgcc.h" + +#define W_TYPE_SIZE 32 + +#define __ll_B ((unsigned long) 1 << (W_TYPE_SIZE / 2)) +#define __ll_lowpart(t) ((unsigned long) (t) & (__ll_B - 1)) +#define __ll_highpart(t) ((unsigned long) (t) >> (W_TYPE_SIZE / 2)) + +/* If we still don't have umul_ppmm, define it using plain C.  */ +#if !defined(umul_ppmm) +#define umul_ppmm(w1, w0, u, v)						\ +	do {								\ +		unsigned long __x0, __x1, __x2, __x3;			\ +		unsigned short __ul, __vl, __uh, __vh;			\ +									\ +		__ul = __ll_lowpart(u);					\ +		__uh = __ll_highpart(u);				\ +		__vl = __ll_lowpart(v);					\ +		__vh = __ll_highpart(v);				\ +									\ +		__x0 = (unsigned long) __ul * __vl;			\ +		__x1 = (unsigned long) __ul * __vh;			\ +		__x2 = (unsigned long) __uh * __vl;			\ +		__x3 = (unsigned long) __uh * __vh;			\ +									\ +		__x1 += __ll_highpart(__x0); /* this can't give carry */\ +		__x1 += __x2; /* but this indeed can */			\ +		if (__x1 < __x2) /* did we get it? */			\ +		__x3 += __ll_B; /* yes, add it in the proper pos */	\ +									\ +		(w1) = __x3 + __ll_highpart(__x1);			\ +		(w0) = __ll_lowpart(__x1) * __ll_B + __ll_lowpart(__x0);\ +	} while (0) +#endif + +#if !defined(__umulsidi3) +#define __umulsidi3(u, v) ({				\ +	DWunion __w;					\ +	umul_ppmm(__w.s.high, __w.s.low, u, v);		\ +	__w.ll;						\ +	}) +#endif + +long long __muldi3(long long u, long long v) +{ +	const DWunion uu = {.ll = u}; +	const DWunion vv = {.ll = v}; +	DWunion w = {.ll = __umulsidi3(uu.s.low, vv.s.low)}; + +	w.s.high += ((unsigned long) uu.s.low * (unsigned long) vv.s.high +		+ (unsigned long) uu.s.high * (unsigned long) vv.s.low); + +	return w.ll; +} +EXPORT_SYMBOL(__muldi3); diff --git a/arch/microblaze/lib/uaccess_old.S b/arch/microblaze/lib/uaccess_old.S index 5810cec54a7..0e8cc2710c2 100644 --- a/arch/microblaze/lib/uaccess_old.S +++ b/arch/microblaze/lib/uaccess_old.S @@ -10,6 +10,7 @@  #include <linux/errno.h>  #include <linux/linkage.h> +#include <asm/page.h>  /*   * int __strncpy_user(char *to, char *from, int len); @@ -33,19 +34,18 @@ __strncpy_user:  	 * r3 - temp count  	 * r4 - temp val  	 */ +	beqid	r7,3f  	addik	r3,r7,0		/* temp_count = len */ -	beqi	r3,3f  1:  	lbu	r4,r6,r0 +	beqid	r4,2f  	sb	r4,r5,r0 -	addik	r3,r3,-1 -	beqi	r3,2f		/* break on len */ -  	addik	r5,r5,1 -	bneid	r4,1b  	addik	r6,r6,1		/* delay slot */ -	addik	r3,r3,1		/* undo "temp_count--" */ + +	addik	r3,r3,-1 +	bnei	r3,1b		/* break on len */  2:  	rsubk	r3,r3,r7	/* temp_count = len - temp_count */  3: @@ -76,8 +76,8 @@ __strncpy_user:  .type  __strnlen_user, @function  .align 4;  __strnlen_user: +	beqid	r6,3f  	addik	r3,r6,0 -	beqi	r3,3f  1:  	lbu	r4,r5,r0  	beqid	r4,2f		/* break on NUL */ @@ -102,6 +102,49 @@ __strnlen_user:  	.section	__ex_table,"a"  	.word	1b,4b +/* Loop unrolling for __copy_tofrom_user */ +#define COPY(offset)	\ +1:	lwi	r4 , r6, 0x0000 + offset;	\ +2:	lwi	r19, r6, 0x0004 + offset;	\ +3:	lwi	r20, r6, 0x0008 + offset;	\ +4:	lwi	r21, r6, 0x000C + offset;	\ +5:	lwi	r22, r6, 0x0010 + offset;	\ +6:	lwi	r23, r6, 0x0014 + offset;	\ +7:	lwi	r24, r6, 0x0018 + offset;	\ +8:	lwi	r25, r6, 0x001C + offset;	\ +9:	swi	r4 , r5, 0x0000 + offset;	\ +10:	swi	r19, r5, 0x0004 + offset;	\ +11:	swi	r20, r5, 0x0008 + offset;	\ +12:	swi	r21, r5, 0x000C + offset;	\ +13:	swi	r22, r5, 0x0010 + offset;	\ +14:	swi	r23, r5, 0x0014 + offset;	\ +15:	swi	r24, r5, 0x0018 + offset;	\ +16:	swi	r25, r5, 0x001C + offset;	\ +	.section __ex_table,"a";		\ +	.word	1b, 33f;			\ +	.word	2b, 33f;			\ +	.word	3b, 33f;			\ +	.word	4b, 33f;			\ +	.word	5b, 33f;			\ +	.word	6b, 33f;			\ +	.word	7b, 33f;			\ +	.word	8b, 33f;			\ +	.word	9b, 33f;			\ +	.word	10b, 33f;			\ +	.word	11b, 33f;			\ +	.word	12b, 33f;			\ +	.word	13b, 33f;			\ +	.word	14b, 33f;			\ +	.word	15b, 33f;			\ +	.word	16b, 33f;			\ +	.text + +#define COPY_80(offset)	\ +	COPY(0x00 + offset);\ +	COPY(0x20 + offset);\ +	COPY(0x40 + offset);\ +	COPY(0x60 + offset); +  /*   * int __copy_tofrom_user(char *to, char *from, int len)   * Return: @@ -119,34 +162,105 @@ __copy_tofrom_user:  	 * r7, r3 - count  	 * r4 - tempval  	 */ -	beqid	r7, 3f /* zero size is not likely */ -	andi	r3, r7, 0x3 /* filter add count */ -	bneid	r3, 4f /* if is odd value then byte copying */ +	beqid	r7, 0f /* zero size is not likely */  	or	r3, r5, r6 /* find if is any to/from unaligned */ -	andi	r3, r3, 0x3 /* mask unaligned */ -	bneid	r3, 1f /* it is unaligned -> then jump */ +	or	r3, r3, r7 /* find if count is unaligned */ +	andi	r3, r3, 0x3 /* mask last 3 bits */ +	bneid	r3, bu1 /* if r3 is not zero then byte copying */ +	or	r3, r0, r0 + +	rsubi	r3, r7, PAGE_SIZE /* detect PAGE_SIZE */ +	beqid	r3, page;  	or	r3, r0, r0 -/* at least one 4 byte copy */ -5:	lw	r4, r6, r3 -6:	sw	r4, r5, r3 +w1:	lw	r4, r6, r3 /* at least one 4 byte copy */ +w2:	sw	r4, r5, r3  	addik	r7, r7, -4 -	bneid	r7, 5b +	bneid	r7, w1  	addik	r3, r3, 4  	addik	r3, r7, 0  	rtsd	r15, 8  	nop -4:	or	r3, r0, r0 -1:	lbu	r4,r6,r3 -2:	sb	r4,r5,r3 + +	.section	__ex_table,"a" +	.word	w1, 0f; +	.word	w2, 0f; +	.text + +.align 4 /* Alignment is important to keep icache happy */ +page:	/* Create room on stack and save registers for storign values */ +	addik   r1, r1, -40 +	swi	r5, r1, 0 +	swi	r6, r1, 4 +	swi	r7, r1, 8 +	swi	r19, r1, 12 +	swi	r20, r1, 16 +	swi	r21, r1, 20 +	swi	r22, r1, 24 +	swi	r23, r1, 28 +	swi	r24, r1, 32 +	swi	r25, r1, 36 +loop:	/* r4, r19, r20, r21, r22, r23, r24, r25 are used for storing values */ +	/* Loop unrolling to get performance boost */ +	COPY_80(0x000); +	COPY_80(0x080); +	COPY_80(0x100); +	COPY_80(0x180); +	/* copy loop */ +	addik   r6, r6, 0x200 +	addik   r7, r7, -0x200 +	bneid   r7, loop +	addik   r5, r5, 0x200 + +	/* Restore register content */ +	lwi	r5, r1, 0 +	lwi	r6, r1, 4 +	lwi	r7, r1, 8 +	lwi	r19, r1, 12 +	lwi	r20, r1, 16 +	lwi	r21, r1, 20 +	lwi	r22, r1, 24 +	lwi	r23, r1, 28 +	lwi	r24, r1, 32 +	lwi	r25, r1, 36 +	addik   r1, r1, 40 +	/* return back */ +	addik	r3, r0, 0 +	rtsd	r15, 8 +	nop + +/* Fault case - return temp count */ +33: +	addik	r3, r7, 0 +	/* Restore register content */ +	lwi	r5, r1, 0 +	lwi	r6, r1, 4 +	lwi	r7, r1, 8 +	lwi	r19, r1, 12 +	lwi	r20, r1, 16 +	lwi	r21, r1, 20 +	lwi	r22, r1, 24 +	lwi	r23, r1, 28 +	lwi	r24, r1, 32 +	lwi	r25, r1, 36 +	addik   r1, r1, 40 +	/* return back */ +	rtsd	r15, 8 +	nop + +.align 4 /* Alignment is important to keep icache happy */ +bu1:	lbu	r4,r6,r3 +bu2:	sb	r4,r5,r3  	addik	r7,r7,-1 -	bneid	r7,1b +	bneid	r7,bu1  	addik	r3,r3,1		/* delay slot */ -3: +0:  	addik	r3,r7,0  	rtsd	r15,8  	nop  	.size   __copy_tofrom_user, . - __copy_tofrom_user  	.section	__ex_table,"a" -	.word	1b,3b,2b,3b,5b,3b,6b,3b +	.word	bu1, 0b; +	.word	bu2, 0b; +	.text diff --git a/arch/microblaze/lib/ucmpdi2.c b/arch/microblaze/lib/ucmpdi2.c new file mode 100644 index 00000000000..d05f1585121 --- /dev/null +++ b/arch/microblaze/lib/ucmpdi2.c @@ -0,0 +1,20 @@ +#include <linux/export.h> + +#include "libgcc.h" + +word_type __ucmpdi2(unsigned long long a, unsigned long long b) +{ +	const DWunion au = {.ll = a}; +	const DWunion bu = {.ll = b}; + +	if ((unsigned int) au.s.high < (unsigned int) bu.s.high) +		return 0; +	else if ((unsigned int) au.s.high > (unsigned int) bu.s.high) +		return 2; +	if ((unsigned int) au.s.low < (unsigned int) bu.s.low) +		return 0; +	else if ((unsigned int) au.s.low > (unsigned int) bu.s.low) +		return 2; +	return 1; +} +EXPORT_SYMBOL(__ucmpdi2); diff --git a/arch/microblaze/mm/Makefile b/arch/microblaze/mm/Makefile index 09c49ed8723..7313bd8acbb 100644 --- a/arch/microblaze/mm/Makefile +++ b/arch/microblaze/mm/Makefile @@ -5,3 +5,4 @@  obj-y := consistent.o init.o  obj-$(CONFIG_MMU) += pgtable.o mmu_context.o fault.o +obj-$(CONFIG_HIGHMEM) += highmem.o diff --git a/arch/microblaze/mm/consistent.c b/arch/microblaze/mm/consistent.c index 5a59dad62bd..e10ad930895 100644 --- a/arch/microblaze/mm/consistent.c +++ b/arch/microblaze/mm/consistent.c @@ -13,7 +13,7 @@   * published by the Free Software Foundation.   */ -#include <linux/module.h> +#include <linux/export.h>  #include <linux/signal.h>  #include <linux/sched.h>  #include <linux/kernel.h> @@ -37,7 +37,7 @@  #include <asm/pgalloc.h>  #include <linux/io.h>  #include <linux/hardirq.h> -#include <asm/mmu_context.h> +#include <linux/mmu_context.h>  #include <asm/mmu.h>  #include <linux/uaccess.h>  #include <asm/pgtable.h> @@ -59,7 +59,7 @@   * uncached region.  This will no doubt cause big problems if memory allocated   * here is not also freed properly. -- JW   */ -void *consistent_alloc(int gfp, size_t size, dma_addr_t *dma_handle) +void *consistent_alloc(gfp_t gfp, size_t size, dma_addr_t *dma_handle)  {  	unsigned long order, vaddr;  	void *ret; @@ -102,8 +102,7 @@ void *consistent_alloc(int gfp, size_t size, dma_addr_t *dma_handle)  # endif  	if ((unsigned int)ret > cpuinfo.dcache_base &&  				(unsigned int)ret < cpuinfo.dcache_high) -		printk(KERN_WARNING -			"ERROR: Your cache coherent area is CACHED!!!\n"); +		pr_warn("ERROR: Your cache coherent area is CACHED!!!\n");  	/* dma_handle is same as physical (shadowed) address */  	*dma_handle = (dma_addr_t)ret; @@ -118,7 +117,7 @@ void *consistent_alloc(int gfp, size_t size, dma_addr_t *dma_handle)  	ret = (void *)va;  	/* This gives us the real physical address of the first page. */ -	*dma_handle = pa = virt_to_bus((void *)vaddr); +	*dma_handle = pa = __virt_to_phys(vaddr);  #endif  	/* @@ -177,8 +176,7 @@ void consistent_free(size_t size, void *vaddr)  	page = virt_to_page(vaddr);  	do { -		ClearPageReserved(page); -		__free_page(page); +		__free_reserved_page(page);  		page++;  	} while (size -= PAGE_SIZE);  #else @@ -195,9 +193,7 @@ void consistent_free(size_t size, void *vaddr)  			pte_clear(&init_mm, (unsigned int)vaddr, ptep);  			if (pfn_valid(pfn)) {  				page = pfn_to_page(pfn); - -				ClearPageReserved(page); -				__free_page(page); +				__free_reserved_page(page);  			}  		}  		vaddr += PAGE_SIZE; diff --git a/arch/microblaze/mm/fault.c b/arch/microblaze/mm/fault.c index 57bd2a09610..fa4cf52aa7a 100644 --- a/arch/microblaze/mm/fault.c +++ b/arch/microblaze/mm/fault.c @@ -32,8 +32,7 @@  #include <asm/page.h>  #include <asm/pgtable.h>  #include <asm/mmu.h> -#include <asm/mmu_context.h> -#include <asm/system.h> +#include <linux/mmu_context.h>  #include <linux/uaccess.h>  #include <asm/exceptions.h> @@ -48,7 +47,7 @@ static int store_updates_sp(struct pt_regs *regs)  {  	unsigned int inst; -	if (get_user(inst, (unsigned int *)regs->pc)) +	if (get_user(inst, (unsigned int __user *)regs->pc))  		return 0;  	/* check for 1 in the rD field */  	if (((inst >> 21) & 0x1f) != 1) @@ -93,13 +92,14 @@ void do_page_fault(struct pt_regs *regs, unsigned long address,  	int code = SEGV_MAPERR;  	int is_write = error_code & ESR_S;  	int fault; +	unsigned int flags = FAULT_FLAG_ALLOW_RETRY | FAULT_FLAG_KILLABLE;  	regs->ear = address;  	regs->esr = error_code;  	/* On a kernel SLB miss we can only check for a valid exception entry */  	if (unlikely(kernel_mode(regs) && (address >= TASK_SIZE))) { -		printk(KERN_WARNING "kernel task_size exceed"); +		pr_warn("kernel task_size exceed");  		_exception(SIGSEGV, regs, code, address);  	} @@ -113,13 +113,16 @@ void do_page_fault(struct pt_regs *regs, unsigned long address,  		/* in_atomic() in user mode is really bad,  		   as is current->mm == NULL. */ -		printk(KERN_EMERG "Page fault in user mode with " -		       "in_atomic(), mm = %p\n", mm); -		printk(KERN_EMERG "r15 = %lx  MSR = %lx\n", +		pr_emerg("Page fault in user mode with in_atomic(), mm = %p\n", +									mm); +		pr_emerg("r15 = %lx  MSR = %lx\n",  		       regs->r15, regs->msr);  		die("Weird page fault", regs, SIGSEGV);  	} +	if (user_mode(regs)) +		flags |= FAULT_FLAG_USER; +  	/* When running in the kernel we expect faults to occur only to  	 * addresses in user space.  All other faults represent errors in the  	 * kernel and should generate an OOPS.  Unfortunately, in the case of an @@ -139,6 +142,7 @@ void do_page_fault(struct pt_regs *regs, unsigned long address,  		if (kernel_mode(regs) && !search_exception_tables(regs->pc))  			goto bad_area_nosemaphore; +retry:  		down_read(&mm->mmap_sem);  	} @@ -197,6 +201,7 @@ good_area:  	if (unlikely(is_write)) {  		if (unlikely(!(vma->vm_flags & VM_WRITE)))  			goto bad_area; +		flags |= FAULT_FLAG_WRITE;  	/* a read */  	} else {  		/* protection fault */ @@ -211,7 +216,11 @@ good_area:  	 * make sure we exit gracefully rather than endlessly redo  	 * the fault.  	 */ -	fault = handle_mm_fault(mm, vma, address, is_write ? FAULT_FLAG_WRITE : 0); +	fault = handle_mm_fault(mm, vma, address, flags); + +	if ((fault & VM_FAULT_RETRY) && fatal_signal_pending(current)) +		return; +  	if (unlikely(fault & VM_FAULT_ERROR)) {  		if (fault & VM_FAULT_OOM)  			goto out_of_memory; @@ -219,11 +228,28 @@ good_area:  			goto do_sigbus;  		BUG();  	} -	if (unlikely(fault & VM_FAULT_MAJOR)) -		current->maj_flt++; -	else -		current->min_flt++; + +	if (flags & FAULT_FLAG_ALLOW_RETRY) { +		if (unlikely(fault & VM_FAULT_MAJOR)) +			current->maj_flt++; +		else +			current->min_flt++; +		if (fault & VM_FAULT_RETRY) { +			flags &= ~FAULT_FLAG_ALLOW_RETRY; +			flags |= FAULT_FLAG_TRIED; + +			/* +			 * No need to up_read(&mm->mmap_sem) as we would +			 * have already released it in __lock_page_or_retry +			 * in mm/filemap.c. +			 */ + +			goto retry; +		} +	} +  	up_read(&mm->mmap_sem); +  	/*  	 * keep track of tlb+htab misses that are good addrs but  	 * just need pte's created via handle_mm_fault() diff --git a/arch/microblaze/mm/highmem.c b/arch/microblaze/mm/highmem.c new file mode 100644 index 00000000000..5a92576fad9 --- /dev/null +++ b/arch/microblaze/mm/highmem.c @@ -0,0 +1,88 @@ +/* + * highmem.c: virtual kernel memory mappings for high memory + * + * PowerPC version, stolen from the i386 version. + * + * Used in CONFIG_HIGHMEM systems for memory pages which + * are not addressable by direct kernel virtual addresses. + * + * Copyright (C) 1999 Gerhard Wichert, Siemens AG + *		      Gerhard.Wichert@pdb.siemens.de + * + * + * Redesigned the x86 32-bit VM architecture to deal with + * up to 16 Terrabyte physical memory. With current x86 CPUs + * we now support up to 64 Gigabytes physical RAM. + * + * Copyright (C) 1999 Ingo Molnar <mingo@redhat.com> + * + * Reworked for PowerPC by various contributors. Moved from + * highmem.h by Benjamin Herrenschmidt (c) 2009 IBM Corp. + */ + +#include <linux/export.h> +#include <linux/highmem.h> + +/* + * The use of kmap_atomic/kunmap_atomic is discouraged - kmap/kunmap + * gives a more generic (and caching) interface. But kmap_atomic can + * be used in IRQ contexts, so in some (very limited) cases we need + * it. + */ +#include <asm/tlbflush.h> + +void *kmap_atomic_prot(struct page *page, pgprot_t prot) +{ + +	unsigned long vaddr; +	int idx, type; + +	/* even !CONFIG_PREEMPT needs this, for in_atomic in do_page_fault */ +	pagefault_disable(); +	if (!PageHighMem(page)) +		return page_address(page); + + +	type = kmap_atomic_idx_push(); +	idx = type + KM_TYPE_NR*smp_processor_id(); +	vaddr = __fix_to_virt(FIX_KMAP_BEGIN + idx); +#ifdef CONFIG_DEBUG_HIGHMEM +	BUG_ON(!pte_none(*(kmap_pte-idx))); +#endif +	set_pte_at(&init_mm, vaddr, kmap_pte-idx, mk_pte(page, prot)); +	local_flush_tlb_page(NULL, vaddr); + +	return (void *) vaddr; +} +EXPORT_SYMBOL(kmap_atomic_prot); + +void __kunmap_atomic(void *kvaddr) +{ +	unsigned long vaddr = (unsigned long) kvaddr & PAGE_MASK; +	int type; + +	if (vaddr < __fix_to_virt(FIX_KMAP_END)) { +		pagefault_enable(); +		return; +	} + +	type = kmap_atomic_idx(); +#ifdef CONFIG_DEBUG_HIGHMEM +	{ +		unsigned int idx; + +		idx = type + KM_TYPE_NR * smp_processor_id(); +		BUG_ON(vaddr != __fix_to_virt(FIX_KMAP_BEGIN + idx)); + +		/* +		 * force other mappings to Oops if they'll try to access +		 * this pte without first remap it +		 */ +		pte_clear(&init_mm, vaddr, kmap_pte-idx); +		local_flush_tlb_page(NULL, vaddr); +	} +#endif +	kmap_atomic_idx_pop(); +	pagefault_enable(); +} +EXPORT_SYMBOL(__kunmap_atomic); diff --git a/arch/microblaze/mm/init.c b/arch/microblaze/mm/init.c index c8437866d3b..77bc7c7e652 100644 --- a/arch/microblaze/mm/init.c +++ b/arch/microblaze/mm/init.c @@ -17,12 +17,14 @@  #include <linux/pfn.h>  #include <linux/slab.h>  #include <linux/swap.h> +#include <linux/export.h>  #include <asm/page.h>  #include <asm/mmu_context.h>  #include <asm/pgalloc.h>  #include <asm/sections.h>  #include <asm/tlb.h> +#include <asm/fixmap.h>  /* Use for MMU and noMMU because of PCI generic code */  int mem_init_done; @@ -32,8 +34,6 @@ unsigned int __page_offset;  EXPORT_SYMBOL(__page_offset);  #else -DEFINE_PER_CPU(struct mmu_gather, mmu_gathers); -  static int init_bootmem_done;  #endif /* CONFIG_MMU */ @@ -45,9 +45,45 @@ char *klimit = _end;   */  unsigned long memory_start;  EXPORT_SYMBOL(memory_start); -unsigned long memory_end; /* due to mm/nommu.c */  unsigned long memory_size;  EXPORT_SYMBOL(memory_size); +unsigned long lowmem_size; + +#ifdef CONFIG_HIGHMEM +pte_t *kmap_pte; +EXPORT_SYMBOL(kmap_pte); +pgprot_t kmap_prot; +EXPORT_SYMBOL(kmap_prot); + +static inline pte_t *virt_to_kpte(unsigned long vaddr) +{ +	return pte_offset_kernel(pmd_offset(pgd_offset_k(vaddr), +			vaddr), vaddr); +} + +static void __init highmem_init(void) +{ +	pr_debug("%x\n", (u32)PKMAP_BASE); +	map_page(PKMAP_BASE, 0, 0);	/* XXX gross */ +	pkmap_page_table = virt_to_kpte(PKMAP_BASE); + +	kmap_pte = virt_to_kpte(__fix_to_virt(FIX_KMAP_BEGIN)); +	kmap_prot = PAGE_KERNEL; +} + +static void highmem_setup(void) +{ +	unsigned long pfn; + +	for (pfn = max_low_pfn; pfn < max_pfn; ++pfn) { +		struct page *page = pfn_to_page(pfn); + +		/* FIXME not sure about */ +		if (!memblock_is_reserved(pfn << PAGE_SHIFT)) +			free_highmem_page(page); +	} +} +#endif /* CONFIG_HIGHMEM */  /*   * paging_init() sets up the page tables - in fact we've already done this. @@ -55,17 +91,28 @@ EXPORT_SYMBOL(memory_size);  static void __init paging_init(void)  {  	unsigned long zones_size[MAX_NR_ZONES]; +#ifdef CONFIG_MMU +	int idx; + +	/* Setup fixmaps */ +	for (idx = 0; idx < __end_of_fixed_addresses; idx++) +		clear_fixmap(idx); +#endif  	/* Clean every zones */  	memset(zones_size, 0, sizeof(zones_size)); -	/* -	 * old: we can DMA to/from any address.put all page into ZONE_DMA -	 * We use only ZONE_NORMAL -	 */ -	zones_size[ZONE_NORMAL] = max_mapnr; +#ifdef CONFIG_HIGHMEM +	highmem_init(); -	free_area_init(zones_size); +	zones_size[ZONE_DMA] = max_low_pfn; +	zones_size[ZONE_HIGHMEM] = max_pfn; +#else +	zones_size[ZONE_DMA] = max_pfn; +#endif + +	/* We don't have holes in memory map */ +	free_area_init_nodes(zones_size);  }  void __init setup_memory(void) @@ -79,32 +126,31 @@ void __init setup_memory(void)  	/* Find main memory where is the kernel */  	for_each_memblock(memory, reg) {  		memory_start = (u32)reg->base; -		memory_end = (u32) reg->base + reg->size; +		lowmem_size = reg->size;  		if ((memory_start <= (u32)_text) && -					((u32)_text <= memory_end)) { -			memory_size = memory_end - memory_start; +			((u32)_text <= (memory_start + lowmem_size - 1))) { +			memory_size = lowmem_size;  			PAGE_OFFSET = memory_start; -			printk(KERN_INFO "%s: Main mem: 0x%x-0x%x, " -				"size 0x%08x\n", __func__, (u32) memory_start, -					(u32) memory_end, (u32) memory_size); +			pr_info("%s: Main mem: 0x%x, size 0x%08x\n", +				__func__, (u32) memory_start, +					(u32) memory_size);  			break;  		}  	} -	if (!memory_start || !memory_end) { -		panic("%s: Missing memory setting 0x%08x-0x%08x\n", -			__func__, (u32) memory_start, (u32) memory_end); +	if (!memory_start || !memory_size) { +		panic("%s: Missing memory setting 0x%08x, size=0x%08x\n", +			__func__, (u32) memory_start, (u32) memory_size);  	}  	/* reservation of region where is the kernel */  	kernel_align_start = PAGE_DOWN((u32)_text);  	/* ALIGN can be remove because _end in vmlinux.lds.S is align */  	kernel_align_size = PAGE_UP((u32)klimit) - kernel_align_start; -	memblock_reserve(kernel_align_start, kernel_align_size); -	printk(KERN_INFO "%s: kernel addr=0x%08x-0x%08x size=0x%08x\n", +	pr_info("%s: kernel addr:0x%08x-0x%08x size=0x%08x\n",  		__func__, kernel_align_start, kernel_align_start  			+ kernel_align_size, kernel_align_size); - +	memblock_reserve(kernel_align_start, kernel_align_size);  #endif  	/*  	 * Kernel: @@ -114,18 +160,19 @@ void __init setup_memory(void)  	 * min_low_pfn - the first page (mm/bootmem.c - node_boot_start)  	 * max_low_pfn  	 * max_mapnr - the first unused page (mm/bootmem.c - node_low_pfn) -	 * num_physpages - number of all pages  	 */  	/* memory start is from the kernel end (aligned) to higher addr */  	min_low_pfn = memory_start >> PAGE_SHIFT; /* minimum for allocation */  	/* RAM is assumed contiguous */ -	num_physpages = max_mapnr = memory_size >> PAGE_SHIFT; -	max_pfn = max_low_pfn = memory_end >> PAGE_SHIFT; +	max_mapnr = memory_size >> PAGE_SHIFT; +	max_low_pfn = ((u64)memory_start + (u64)lowmem_size) >> PAGE_SHIFT; +	max_pfn = ((u64)memory_start + (u64)memory_size) >> PAGE_SHIFT; -	printk(KERN_INFO "%s: max_mapnr: %#lx\n", __func__, max_mapnr); -	printk(KERN_INFO "%s: min_low_pfn: %#lx\n", __func__, min_low_pfn); -	printk(KERN_INFO "%s: max_low_pfn: %#lx\n", __func__, max_low_pfn); +	pr_info("%s: max_mapnr: %#lx\n", __func__, max_mapnr); +	pr_info("%s: min_low_pfn: %#lx\n", __func__, min_low_pfn); +	pr_info("%s: max_low_pfn: %#lx\n", __func__, max_low_pfn); +	pr_info("%s: max_pfn: %#lx\n", __func__, max_pfn);  	/*  	 * Find an area to use for the bootmem bitmap. @@ -138,66 +185,81 @@ void __init setup_memory(void)  		PFN_UP(TOPHYS((u32)klimit)), min_low_pfn, max_low_pfn);  	memblock_reserve(PFN_UP(TOPHYS((u32)klimit)) << PAGE_SHIFT, map_size); +	/* Add active regions with valid PFNs */ +	for_each_memblock(memory, reg) { +		unsigned long start_pfn, end_pfn; + +		start_pfn = memblock_region_memory_base_pfn(reg); +		end_pfn = memblock_region_memory_end_pfn(reg); +		memblock_set_node(start_pfn << PAGE_SHIFT, +				  (end_pfn - start_pfn) << PAGE_SHIFT, +				  &memblock.memory, 0); +	} +  	/* free bootmem is whole main memory */ -	free_bootmem(memory_start, memory_size); +	free_bootmem_with_active_regions(0, max_low_pfn);  	/* reserve allocate blocks */  	for_each_memblock(reserved, reg) { -		pr_debug("reserved - 0x%08x-0x%08x\n", -			 (u32) reg->base, (u32) reg->size); -		reserve_bootmem(reg->base, reg->size, BOOTMEM_DEFAULT); +		unsigned long top = reg->base + reg->size - 1; + +		pr_debug("reserved - 0x%08x-0x%08x, %lx, %lx\n", +			 (u32) reg->base, (u32) reg->size, top, +						memory_start + lowmem_size - 1); + +		if (top <= (memory_start + lowmem_size - 1)) { +			reserve_bootmem(reg->base, reg->size, BOOTMEM_DEFAULT); +		} else if (reg->base < (memory_start + lowmem_size - 1)) { +			unsigned long trunc_size = memory_start + lowmem_size - +								reg->base; +			reserve_bootmem(reg->base, trunc_size, BOOTMEM_DEFAULT); +		}  	} + +	/* XXX need to clip this if using highmem? */ +	sparse_memory_present_with_active_regions(0); +  #ifdef CONFIG_MMU  	init_bootmem_done = 1;  #endif  	paging_init();  } -void free_init_pages(char *what, unsigned long begin, unsigned long end) -{ -	unsigned long addr; - -	for (addr = begin; addr < end; addr += PAGE_SIZE) { -		ClearPageReserved(virt_to_page(addr)); -		init_page_count(virt_to_page(addr)); -		free_page(addr); -		totalram_pages++; -	} -	printk(KERN_INFO "Freeing %s: %ldk freed\n", what, (end - begin) >> 10); -} -  #ifdef CONFIG_BLK_DEV_INITRD  void free_initrd_mem(unsigned long start, unsigned long end)  { -	int pages = 0; -	for (; start < end; start += PAGE_SIZE) { -		ClearPageReserved(virt_to_page(start)); -		init_page_count(virt_to_page(start)); -		free_page(start); -		totalram_pages++; -		pages++; -	} -	printk(KERN_NOTICE "Freeing initrd memory: %dk freed\n", -					(int)(pages * (PAGE_SIZE / 1024))); +	free_reserved_area((void *)start, (void *)end, -1, "initrd");  }  #endif  void free_initmem(void)  { -	free_init_pages("unused kernel memory", -			(unsigned long)(&__init_begin), -			(unsigned long)(&__init_end)); +	free_initmem_default(-1);  }  void __init mem_init(void)  { -	high_memory = (void *)__va(memory_end); +	high_memory = (void *)__va(memory_start + lowmem_size - 1); +  	/* this will put all memory onto the freelists */ -	totalram_pages += free_all_bootmem(); +	free_all_bootmem(); +#ifdef CONFIG_HIGHMEM +	highmem_setup(); +#endif -	printk(KERN_INFO "Memory: %luk/%luk available\n", -	       nr_free_pages() << (PAGE_SHIFT-10), -	       num_physpages << (PAGE_SHIFT-10)); +	mem_init_print_info(NULL); +#ifdef CONFIG_MMU +	pr_info("Kernel virtual memory layout:\n"); +	pr_info("  * 0x%08lx..0x%08lx  : fixmap\n", FIXADDR_START, FIXADDR_TOP); +#ifdef CONFIG_HIGHMEM +	pr_info("  * 0x%08lx..0x%08lx  : highmem PTEs\n", +		PKMAP_BASE, PKMAP_ADDR(LAST_PKMAP)); +#endif /* CONFIG_HIGHMEM */ +	pr_info("  * 0x%08lx..0x%08lx  : early ioremap\n", +		ioremap_bot, ioremap_base); +	pr_info("  * 0x%08lx..0x%08lx  : vmalloc & ioremap\n", +		(unsigned long)VMALLOC_START, VMALLOC_END); +#endif  	mem_init_done = 1;  } @@ -227,7 +289,6 @@ static void mm_cmdline_setup(void)  		maxmem = memparse(p, &p);  		if (maxmem && memory_size > maxmem) {  			memory_size = maxmem; -			memory_end = memory_start + memory_size;  			memblock.memory.regions[0].size = memory_size;  		}  	} @@ -267,19 +328,30 @@ asmlinkage void __init mmu_init(void)  	unsigned int kstart, ksize;  	if (!memblock.reserved.cnt) { -		printk(KERN_EMERG "Error memory count\n"); +		pr_emerg("Error memory count\n");  		machine_restart(NULL);  	} -	if ((u32) memblock.memory.regions[0].size < 0x1000000) { -		printk(KERN_EMERG "Memory must be greater than 16MB\n"); +	if ((u32) memblock.memory.regions[0].size < 0x400000) { +		pr_emerg("Memory must be greater than 4MB\n");  		machine_restart(NULL);  	} + +	if ((u32) memblock.memory.regions[0].size < kernel_tlb) { +		pr_emerg("Kernel size is greater than memory node\n"); +		machine_restart(NULL); +	} +  	/* Find main memory where the kernel is */  	memory_start = (u32) memblock.memory.regions[0].base; -	memory_end = (u32) memblock.memory.regions[0].base + -				(u32) memblock.memory.regions[0].size; -	memory_size = memory_end - memory_start; +	lowmem_size = memory_size = (u32) memblock.memory.regions[0].size; + +	if (lowmem_size > CONFIG_LOWMEM_SIZE) { +		lowmem_size = CONFIG_LOWMEM_SIZE; +#ifndef CONFIG_HIGHMEM +		memory_size = lowmem_size; +#endif +	}  	mm_cmdline_setup(); /* FIXME parse args from command line - not used */ @@ -294,10 +366,11 @@ asmlinkage void __init mmu_init(void)  #if defined(CONFIG_BLK_DEV_INITRD)  	/* Remove the init RAM disk from the available memory. */ -/*	if (initrd_start) { -		mem_pieces_remove(&phys_avail, __pa(initrd_start), -				  initrd_end - initrd_start, 1); -	}*/ +	if (initrd_start) { +		unsigned long size; +		size = initrd_end - initrd_start; +		memblock_reserve(__virt_to_phys(initrd_start), size); +	}  #endif /* CONFIG_BLK_DEV_INITRD */  	/* Initialize the MMU hardware */ @@ -306,15 +379,20 @@ asmlinkage void __init mmu_init(void)  	/* Map in all of RAM starting at CONFIG_KERNEL_START */  	mapin_ram(); -#ifdef HIGHMEM_START_BOOL -	ioremap_base = HIGHMEM_START; +	/* Extend vmalloc and ioremap area as big as possible */ +#ifdef CONFIG_HIGHMEM +	ioremap_base = ioremap_bot = PKMAP_BASE;  #else -	ioremap_base = 0xfe000000UL;	/* for now, could be 0xfffff000 */ -#endif /* CONFIG_HIGHMEM */ -	ioremap_bot = ioremap_base; +	ioremap_base = ioremap_bot = FIXADDR_START; +#endif  	/* Initialize the context management stuff */  	mmu_context_init(); + +	/* Shortly after that, the entire linear mapping will be available */ +	/* This will also cause that unflatten device tree will be allocated +	 * inside 768MB limit */ +	memblock_set_current_limit(memory_start + lowmem_size - 1);  }  /* This is only called until mem_init is done. */ @@ -325,11 +403,11 @@ void __init *early_get_page(void)  		p = alloc_bootmem_pages(PAGE_SIZE);  	} else {  		/* -		 * Mem start + 32MB -> here is limit +		 * Mem start + kernel_tlb -> here is limit  		 * because of mem mapping from head.S  		 */  		p = __va(memblock_alloc_base(PAGE_SIZE, PAGE_SIZE, -					memory_start + 0x2000000)); +					memory_start + kernel_tlb));  	}  	return p;  } diff --git a/arch/microblaze/mm/pgtable.c b/arch/microblaze/mm/pgtable.c index 59bf2335a4c..4f4520e779a 100644 --- a/arch/microblaze/mm/pgtable.c +++ b/arch/microblaze/mm/pgtable.c @@ -26,8 +26,8 @@   *   */ +#include <linux/export.h>  #include <linux/kernel.h> -#include <linux/module.h>  #include <linux/types.h>  #include <linux/vmalloc.h>  #include <linux/init.h> @@ -37,18 +37,12 @@  #include <linux/io.h>  #include <asm/mmu.h>  #include <asm/sections.h> - -#define flush_HPTE(X, va, pg)	_tlbie(va) +#include <asm/fixmap.h>  unsigned long ioremap_base;  unsigned long ioremap_bot;  EXPORT_SYMBOL(ioremap_bot); -/* The maximum lowmem defaults to 768Mb, but this can be configured to - * another value. - */ -#define MAX_LOW_MEM	CONFIG_LOWMEM_SIZE -  #ifndef CONFIG_SMP  struct pgtable_cache_struct quicklists;  #endif @@ -75,13 +69,13 @@ static void __iomem *__ioremap(phys_addr_t addr, unsigned long size,  	 *  	 * However, allow remap of rootfs: TBD  	 */ +  	if (mem_init_done &&  		p >= memory_start && p < virt_to_phys(high_memory) && -		!(p >= virt_to_phys((unsigned long)&__bss_stop) && -		p < virt_to_phys((unsigned long)__bss_stop))) { -		printk(KERN_WARNING "__ioremap(): phys addr "PTE_FMT -			" is RAM lr %p\n", (unsigned long)p, -			__builtin_return_address(0)); +		!(p >= __virt_to_phys((phys_addr_t)__bss_stop) && +		p < __virt_to_phys((phys_addr_t)__bss_stop))) { +		pr_warn("__ioremap(): phys addr "PTE_FMT" is RAM lr %pf\n", +			(unsigned long)p, __builtin_return_address(0));  		return NULL;  	} @@ -132,9 +126,10 @@ void __iomem *ioremap(phys_addr_t addr, unsigned long size)  }  EXPORT_SYMBOL(ioremap); -void iounmap(void *addr) +void iounmap(void __iomem *addr)  { -	if (addr > high_memory && (unsigned long) addr < ioremap_bot) +	if ((__force void *)addr > high_memory && +					(unsigned long) addr < ioremap_bot)  		vfree((void *) (PAGE_MASK & (unsigned long) addr));  }  EXPORT_SYMBOL(iounmap); @@ -156,8 +151,7 @@ int map_page(unsigned long va, phys_addr_t pa, int flags)  		set_pte_at(&init_mm, va, pg, pfn_pte(pa >> PAGE_SHIFT,  				__pgprot(flags)));  		if (unlikely(mem_init_done)) -			flush_HPTE(0, va, pmd_val(*pd)); -			/* flush_HPTE(0, va, pg); */ +			_tlbie(va);  	}  	return err;  } @@ -171,7 +165,7 @@ void __init mapin_ram(void)  	v = CONFIG_KERNEL_START;  	p = memory_start; -	for (s = 0; s < memory_size; s += PAGE_SIZE) { +	for (s = 0; s < lowmem_size; s += PAGE_SIZE) {  		f = _PAGE_PRESENT | _PAGE_ACCESSED |  				_PAGE_SHARED | _PAGE_HWEXEC;  		if ((char *) v < _stext || (char *) v >= _etext) @@ -254,3 +248,13 @@ __init_refok pte_t *pte_alloc_one_kernel(struct mm_struct *mm,  	}  	return pte;  } + +void __set_fixmap(enum fixed_addresses idx, phys_addr_t phys, pgprot_t flags) +{ +	unsigned long address = __fix_to_virt(idx); + +	if (idx >= __end_of_fixed_addresses) +		BUG(); + +	map_page(address, phys, pgprot_val(flags)); +} diff --git a/arch/microblaze/pci/Makefile b/arch/microblaze/pci/Makefile index 9889cc2e129..d1114fbd478 100644 --- a/arch/microblaze/pci/Makefile +++ b/arch/microblaze/pci/Makefile @@ -2,5 +2,5 @@  # Makefile  # -obj-$(CONFIG_PCI)		+= pci_32.o pci-common.o indirect_pci.o iomap.o +obj-$(CONFIG_PCI)		+= pci-common.o indirect_pci.o iomap.o  obj-$(CONFIG_PCI_XILINX)	+= xilinx_pci.o diff --git a/arch/microblaze/pci/indirect_pci.c b/arch/microblaze/pci/indirect_pci.c index 25f18f017f2..ae4fca46c9f 100644 --- a/arch/microblaze/pci/indirect_pci.c +++ b/arch/microblaze/pci/indirect_pci.c @@ -15,7 +15,7 @@  #include <linux/string.h>  #include <linux/init.h> -#include <asm/io.h> +#include <linux/io.h>  #include <asm/prom.h>  #include <asm/pci-bridge.h> @@ -108,7 +108,7 @@ indirect_write_config(struct pci_bus *bus, unsigned int devfn, int offset,  		out_le32(hose->cfg_addr, (0x80000000 | (bus_no << 16) |  			 (devfn << 8) | reg | cfg_type)); -	/* surpress setting of PCI_PRIMARY_BUS */ +	/* suppress setting of PCI_PRIMARY_BUS */  	if (hose->indirect_type & INDIRECT_TYPE_SURPRESS_PRIMARY_BUS)  		if ((offset == PCI_PRIMARY_BUS) &&  			(bus->number == hose->first_busno)) diff --git a/arch/microblaze/pci/iomap.c b/arch/microblaze/pci/iomap.c index 3fbf16f4e16..94149f5e6eb 100644 --- a/arch/microblaze/pci/iomap.c +++ b/arch/microblaze/pci/iomap.c @@ -6,28 +6,10 @@  #include <linux/init.h>  #include <linux/pci.h>  #include <linux/mm.h> -#include <asm/io.h> +#include <linux/export.h> +#include <linux/io.h>  #include <asm/pci-bridge.h> -void __iomem *pci_iomap(struct pci_dev *dev, int bar, unsigned long max) -{ -	resource_size_t start = pci_resource_start(dev, bar); -	resource_size_t len = pci_resource_len(dev, bar); -	unsigned long flags = pci_resource_flags(dev, bar); - -	if (!len) -		return NULL; -	if (max && len > max) -		len = max; -	if (flags & IORESOURCE_IO) -		return ioport_map(start, len); -	if (flags & IORESOURCE_MEM) -		return ioremap(start, len); -	/* What? */ -	return NULL; -} -EXPORT_SYMBOL(pci_iomap); -  void pci_iounmap(struct pci_dev *dev, void __iomem *addr)  {  	if (isa_vaddr_is_ioport(addr)) diff --git a/arch/microblaze/pci/pci-common.c b/arch/microblaze/pci/pci-common.c index e363615d679..9037914f698 100644 --- a/arch/microblaze/pci/pci-common.c +++ b/arch/microblaze/pci/pci-common.c @@ -29,9 +29,12 @@  #include <linux/slab.h>  #include <linux/of.h>  #include <linux/of_address.h> +#include <linux/of_irq.h> +#include <linux/of_pci.h> +#include <linux/export.h>  #include <asm/processor.h> -#include <asm/io.h> +#include <linux/io.h>  #include <asm/pci-bridge.h>  #include <asm/byteorder.h> @@ -44,21 +47,8 @@ static int global_phb_number;		/* Global phb counter */  /* ISA Memory physical address */  resource_size_t isa_mem_base; -/* Default PCI flags is 0 on ppc32, modified at boot on ppc64 */ -unsigned int pci_flags; - -static struct dma_map_ops *pci_dma_ops = &dma_direct_ops; - -void set_pci_dma_ops(struct dma_map_ops *dma_ops) -{ -	pci_dma_ops = dma_ops; -} - -struct dma_map_ops *get_pci_dma_ops(void) -{ -	return pci_dma_ops; -} -EXPORT_SYMBOL(get_pci_dma_ops); +unsigned long isa_io_base; +static int pci_bus_count;  struct pci_controller *pcibios_alloc_controller(struct device_node *dev)  { @@ -88,7 +78,7 @@ void pcibios_free_controller(struct pci_controller *phb)  static resource_size_t pcibios_io_size(const struct pci_controller *hose)  { -	return hose->io_resource.end - hose->io_resource.start + 1; +	return resource_size(&hose->io_resource);  }  int pcibios_vaddr_is_ioport(void __iomem *address) @@ -163,103 +153,12 @@ struct pci_controller *pci_find_hose_for_OF_device(struct device_node *node)  	return NULL;  } -static ssize_t pci_show_devspec(struct device *dev, -		struct device_attribute *attr, char *buf) -{ -	struct pci_dev *pdev; -	struct device_node *np; - -	pdev = to_pci_dev(dev); -	np = pci_device_to_OF_node(pdev); -	if (np == NULL || np->full_name == NULL) -		return 0; -	return sprintf(buf, "%s", np->full_name); -} -static DEVICE_ATTR(devspec, S_IRUGO, pci_show_devspec, NULL); - -/* Add sysfs properties */ -int pcibios_add_platform_entries(struct pci_dev *pdev) +void pcibios_set_master(struct pci_dev *dev)  { -	return device_create_file(&pdev->dev, &dev_attr_devspec); -} - -char __devinit *pcibios_setup(char *str) -{ -	return str; +	/* No special bus mastering setup handling */  }  /* - * Reads the interrupt pin to determine if interrupt is use by card. - * If the interrupt is used, then gets the interrupt line from the - * openfirmware and sets it in the pci_dev and pci_config line. - */ -int pci_read_irq_line(struct pci_dev *pci_dev) -{ -	struct of_irq oirq; -	unsigned int virq; - -	/* The current device-tree that iSeries generates from the HV -	 * PCI informations doesn't contain proper interrupt routing, -	 * and all the fallback would do is print out crap, so we -	 * don't attempt to resolve the interrupts here at all, some -	 * iSeries specific fixup does it. -	 * -	 * In the long run, we will hopefully fix the generated device-tree -	 * instead. -	 */ -	pr_debug("PCI: Try to map irq for %s...\n", pci_name(pci_dev)); - -#ifdef DEBUG -	memset(&oirq, 0xff, sizeof(oirq)); -#endif -	/* Try to get a mapping from the device-tree */ -	if (of_irq_map_pci(pci_dev, &oirq)) { -		u8 line, pin; - -		/* If that fails, lets fallback to what is in the config -		 * space and map that through the default controller. We -		 * also set the type to level low since that's what PCI -		 * interrupts are. If your platform does differently, then -		 * either provide a proper interrupt tree or don't use this -		 * function. -		 */ -		if (pci_read_config_byte(pci_dev, PCI_INTERRUPT_PIN, &pin)) -			return -1; -		if (pin == 0) -			return -1; -		if (pci_read_config_byte(pci_dev, PCI_INTERRUPT_LINE, &line) || -		    line == 0xff || line == 0) { -			return -1; -		} -		pr_debug(" No map ! Using line %d (pin %d) from PCI config\n", -			 line, pin); - -		virq = irq_create_mapping(NULL, line); -		if (virq != NO_IRQ) -			set_irq_type(virq, IRQ_TYPE_LEVEL_LOW); -	} else { -		pr_debug(" Got one, spec %d cells (0x%08x 0x%08x...) on %s\n", -			 oirq.size, oirq.specifier[0], oirq.specifier[1], -			 oirq.controller ? oirq.controller->full_name : -			 "<default>"); - -		virq = irq_create_of_mapping(oirq.controller, oirq.specifier, -					     oirq.size); -	} -	if (virq == NO_IRQ) { -		pr_debug(" Failed to map !\n"); -		return -1; -	} - -	pr_debug(" Mapped to linux irq %d\n", virq); - -	pci_dev->irq = virq; - -	return 0; -} -EXPORT_SYMBOL(pci_read_irq_line); - -/*   * Platform support for /proc/bus/pci/X/Y mmap()s,   * modelled on the sparc64 implementation by Dave Miller.   *  -- paulus. @@ -284,7 +183,7 @@ static struct resource *__pci_mmap_make_offset(struct pci_dev *dev,  	unsigned long io_offset = 0;  	int i, res_bit; -	if (hose == 0) +	if (!hose)  		return NULL;		/* should never happen */  	/* If memory, add on the PCI bridge address offset */ @@ -549,11 +448,10 @@ int pci_mmap_legacy_page_range(struct pci_bus *bus,  		 */  		if ((offset + size) > hose->isa_mem_size) {  #ifdef CONFIG_MMU -			printk(KERN_DEBUG -				"Process %s (pid:%d) mapped non-existing PCI" -				"legacy memory for 0%04x:%02x\n", -				current->comm, current->pid, pci_domain_nr(bus), -								bus->number); +			pr_debug("Process %s (pid:%d) mapped non-existing PCI", +				current->comm, current->pid); +			pr_debug("legacy memory for 0%04x:%02x\n", +				pci_domain_nr(bus), bus->number);  #endif  			if (vma->vm_flags & VM_SHARED)  				return shmem_zero_setup(vma); @@ -561,7 +459,7 @@ int pci_mmap_legacy_page_range(struct pci_bus *bus,  		}  		offset += hose->isa_mem_phys;  	} else { -		unsigned long io_offset = (unsigned long)hose->io_base_virt - \ +		unsigned long io_offset = (unsigned long)hose->io_base_virt -  								_IO_BASE;  		unsigned long roffset = offset + io_offset;  		rp = &hose->io_resource; @@ -652,84 +550,58 @@ void pci_resource_to_user(const struct pci_dev *dev, int bar,   *   - Some 32 bits platforms such as 4xx can have physical space larger than   *     32 bits so we need to use 64 bits values for the parsing   */ -void __devinit pci_process_bridge_OF_ranges(struct pci_controller *hose, -					    struct device_node *dev, -					    int primary) +void pci_process_bridge_OF_ranges(struct pci_controller *hose, +				  struct device_node *dev, int primary)  { -	const u32 *ranges; -	int rlen; -	int pna = of_n_addr_cells(dev); -	int np = pna + 5;  	int memno = 0, isa_hole = -1; -	u32 pci_space; -	unsigned long long pci_addr, cpu_addr, pci_next, cpu_next, size;  	unsigned long long isa_mb = 0;  	struct resource *res; +	struct of_pci_range range; +	struct of_pci_range_parser parser; -	printk(KERN_INFO "PCI host bridge %s %s ranges:\n", +	pr_info("PCI host bridge %s %s ranges:\n",  	       dev->full_name, primary ? "(primary)" : ""); -	/* Get ranges property */ -	ranges = of_get_property(dev, "ranges", &rlen); -	if (ranges == NULL) +	/* Check for ranges property */ +	if (of_pci_range_parser_init(&parser, dev))  		return; -	/* Parse it */  	pr_debug("Parsing ranges property...\n"); -	while ((rlen -= np * 4) >= 0) { +	for_each_of_pci_range(&parser, &range) {  		/* Read next ranges element */ -		pci_space = ranges[0]; -		pci_addr = of_read_number(ranges + 1, 2); -		cpu_addr = of_translate_address(dev, ranges + 3); -		size = of_read_number(ranges + pna + 3, 2); - -		pr_debug("pci_space: 0x%08x pci_addr:0x%016llx " -				"cpu_addr:0x%016llx size:0x%016llx\n", -					pci_space, pci_addr, cpu_addr, size); - -		ranges += np; +		pr_debug("pci_space: 0x%08x pci_addr:0x%016llx ", +				range.pci_space, range.pci_addr); +		pr_debug("cpu_addr:0x%016llx size:0x%016llx\n", +					range.cpu_addr, range.size);  		/* If we failed translation or got a zero-sized region  		 * (some FW try to feed us with non sensical zero sized regions  		 * such as power3 which look like some kind of attempt  		 * at exposing the VGA memory hole)  		 */ -		if (cpu_addr == OF_BAD_ADDR || size == 0) +		if (range.cpu_addr == OF_BAD_ADDR || range.size == 0)  			continue; -		/* Now consume following elements while they are contiguous */ -		for (; rlen >= np * sizeof(u32); -		     ranges += np, rlen -= np * 4) { -			if (ranges[0] != pci_space) -				break; -			pci_next = of_read_number(ranges + 1, 2); -			cpu_next = of_translate_address(dev, ranges + 3); -			if (pci_next != pci_addr + size || -			    cpu_next != cpu_addr + size) -				break; -			size += of_read_number(ranges + pna + 3, 2); -		} -  		/* Act based on address space type */  		res = NULL; -		switch ((pci_space >> 24) & 0x3) { -		case 1:		/* PCI IO space */ -			printk(KERN_INFO -			       "  IO 0x%016llx..0x%016llx -> 0x%016llx\n", -			       cpu_addr, cpu_addr + size - 1, pci_addr); +		switch (range.flags & IORESOURCE_TYPE_BITS) { +		case IORESOURCE_IO: +			pr_info("  IO 0x%016llx..0x%016llx -> 0x%016llx\n", +				range.cpu_addr, range.cpu_addr + range.size - 1, +				range.pci_addr);  			/* We support only one IO range */  			if (hose->pci_io_size) { -				printk(KERN_INFO -				       " \\--> Skipped (too many) !\n"); +				pr_info(" \\--> Skipped (too many) !\n");  				continue;  			}  			/* On 32 bits, limit I/O space to 16MB */ -			if (size > 0x01000000) -				size = 0x01000000; +			if (range.size > 0x01000000) +				range.size = 0x01000000;  			/* 32 bits needs to map IOs here */ -			hose->io_base_virt = ioremap(cpu_addr, size); +			hose->io_base_virt = ioremap(range.cpu_addr, +						range.size);  			/* Expect trouble if pci_addr is not 0 */  			if (primary) @@ -738,35 +610,34 @@ void __devinit pci_process_bridge_OF_ranges(struct pci_controller *hose,  			/* pci_io_size and io_base_phys always represent IO  			 * space starting at 0 so we factor in pci_addr  			 */ -			hose->pci_io_size = pci_addr + size; -			hose->io_base_phys = cpu_addr - pci_addr; +			hose->pci_io_size = range.pci_addr + range.size; +			hose->io_base_phys = range.cpu_addr - range.pci_addr;  			/* Build resource */  			res = &hose->io_resource; -			res->flags = IORESOURCE_IO; -			res->start = pci_addr; +			range.cpu_addr = range.pci_addr; +  			break; -		case 2:		/* PCI Memory space */ -		case 3:		/* PCI 64 bits Memory space */ -			printk(KERN_INFO -			       " MEM 0x%016llx..0x%016llx -> 0x%016llx %s\n", -			       cpu_addr, cpu_addr + size - 1, pci_addr, -			       (pci_space & 0x40000000) ? "Prefetch" : ""); +		case IORESOURCE_MEM: +			pr_info(" MEM 0x%016llx..0x%016llx -> 0x%016llx %s\n", +				range.cpu_addr, range.cpu_addr + range.size - 1, +				range.pci_addr, +				(range.pci_space & 0x40000000) ? +				"Prefetch" : "");  			/* We support only 3 memory ranges */  			if (memno >= 3) { -				printk(KERN_INFO -				       " \\--> Skipped (too many) !\n"); +				pr_info(" \\--> Skipped (too many) !\n");  				continue;  			}  			/* Handles ISA memory hole space here */ -			if (pci_addr == 0) { -				isa_mb = cpu_addr; +			if (range.pci_addr == 0) { +				isa_mb = range.cpu_addr;  				isa_hole = memno;  				if (primary || isa_mem_base == 0) -					isa_mem_base = cpu_addr; -				hose->isa_mem_phys = cpu_addr; -				hose->isa_mem_size = size; +					isa_mem_base = range.cpu_addr; +				hose->isa_mem_phys = range.cpu_addr; +				hose->isa_mem_size = range.size;  			}  			/* We get the PCI/Mem offset from the first range or @@ -774,31 +645,23 @@ void __devinit pci_process_bridge_OF_ranges(struct pci_controller *hose,  			 * hole. If they don't match, bugger.  			 */  			if (memno == 0 || -			    (isa_hole >= 0 && pci_addr != 0 && +			    (isa_hole >= 0 && range.pci_addr != 0 &&  			     hose->pci_mem_offset == isa_mb)) -				hose->pci_mem_offset = cpu_addr - pci_addr; -			else if (pci_addr != 0 && -				 hose->pci_mem_offset != cpu_addr - pci_addr) { -				printk(KERN_INFO -				       " \\--> Skipped (offset mismatch) !\n"); +				hose->pci_mem_offset = range.cpu_addr - +							range.pci_addr; +			else if (range.pci_addr != 0 && +				 hose->pci_mem_offset != range.cpu_addr - +							range.pci_addr) { +				pr_info(" \\--> Skipped (offset mismatch) !\n");  				continue;  			}  			/* Build resource */  			res = &hose->mem_resources[memno++]; -			res->flags = IORESOURCE_MEM; -			if (pci_space & 0x40000000) -				res->flags |= IORESOURCE_PREFETCH; -			res->start = cpu_addr;  			break;  		} -		if (res != NULL) { -			res->name = dev->full_name; -			res->end = res->start + size - 1; -			res->parent = NULL; -			res->sibling = NULL; -			res->child = NULL; -		} +		if (res != NULL) +			of_pci_range_to_resource(&range, dev, res);  	}  	/* If there's an ISA hole and the pci_mem_offset is -not- matching @@ -807,7 +670,7 @@ void __devinit pci_process_bridge_OF_ranges(struct pci_controller *hose,  	 */  	if (isa_hole >= 0 && hose->pci_mem_offset != isa_mb) {  		unsigned int next = isa_hole + 1; -		printk(KERN_INFO " Removing ISA hole at 0x%016llx\n", isa_mb); +		pr_info(" Removing ISA hole at 0x%016llx\n", isa_mb);  		if (next < memno)  			memmove(&hose->mem_resources[isa_hole],  				&hose->mem_resources[next], @@ -819,78 +682,19 @@ void __devinit pci_process_bridge_OF_ranges(struct pci_controller *hose,  /* Decide whether to display the domain number in /proc */  int pci_proc_domain(struct pci_bus *bus)  { -	struct pci_controller *hose = pci_bus_to_host(bus); - -	if (!(pci_flags & PCI_ENABLE_PROC_DOMAINS)) -		return 0; -	if (pci_flags & PCI_COMPAT_DOMAIN_0) -		return hose->global_number != 0; -	return 1; -} - -void pcibios_resource_to_bus(struct pci_dev *dev, struct pci_bus_region *region, -			     struct resource *res) -{ -	resource_size_t offset = 0, mask = (resource_size_t)-1; -	struct pci_controller *hose = pci_bus_to_host(dev->bus); - -	if (!hose) -		return; -	if (res->flags & IORESOURCE_IO) { -		offset = (unsigned long)hose->io_base_virt - _IO_BASE; -		mask = 0xffffffffu; -	} else if (res->flags & IORESOURCE_MEM) -		offset = hose->pci_mem_offset; - -	region->start = (res->start - offset) & mask; -	region->end = (res->end - offset) & mask; -} -EXPORT_SYMBOL(pcibios_resource_to_bus); - -void pcibios_bus_to_resource(struct pci_dev *dev, struct resource *res, -			     struct pci_bus_region *region) -{ -	resource_size_t offset = 0, mask = (resource_size_t)-1; -	struct pci_controller *hose = pci_bus_to_host(dev->bus); - -	if (!hose) -		return; -	if (res->flags & IORESOURCE_IO) { -		offset = (unsigned long)hose->io_base_virt - _IO_BASE; -		mask = 0xffffffffu; -	} else if (res->flags & IORESOURCE_MEM) -		offset = hose->pci_mem_offset; -	res->start = (region->start + offset) & mask; -	res->end = (region->end + offset) & mask; -} -EXPORT_SYMBOL(pcibios_bus_to_resource); - -/* Fixup a bus resource into a linux resource */ -static void __devinit fixup_resource(struct resource *res, struct pci_dev *dev) -{ -	struct pci_controller *hose = pci_bus_to_host(dev->bus); -	resource_size_t offset = 0, mask = (resource_size_t)-1; - -	if (res->flags & IORESOURCE_IO) { -		offset = (unsigned long)hose->io_base_virt - _IO_BASE; -		mask = 0xffffffffu; -	} else if (res->flags & IORESOURCE_MEM) -		offset = hose->pci_mem_offset; - -	res->start = (res->start + offset) & mask; -	res->end = (res->end + offset) & mask; +	return 0;  }  /* This header fixup will do the resource fixup for all devices as they are   * probed, but not for bridge ranges   */ -static void __devinit pcibios_fixup_resources(struct pci_dev *dev) +static void pcibios_fixup_resources(struct pci_dev *dev)  {  	struct pci_controller *hose = pci_bus_to_host(dev->bus);  	int i;  	if (!hose) { -		printk(KERN_ERR "No host bridge for PCI dev %s !\n", +		pr_err("No host bridge for PCI dev %s !\n",  		       pci_name(dev));  		return;  	} @@ -898,37 +702,24 @@ static void __devinit pcibios_fixup_resources(struct pci_dev *dev)  		struct resource *res = dev->resource + i;  		if (!res->flags)  			continue; -		/* On platforms that have PCI_PROBE_ONLY set, we don't -		 * consider 0 as an unassigned BAR value. It's technically -		 * a valid value, but linux doesn't like it... so when we can -		 * re-assign things, we do so, but if we can't, we keep it -		 * around and hope for the best... -		 */ -		if (res->start == 0 && !(pci_flags & PCI_PROBE_ONLY)) { -			pr_debug("PCI:%s Resource %d %016llx-%016llx [%x]" \ -							"is unassigned\n", +		if (res->start == 0) { +			pr_debug("PCI:%s Resource %d %016llx-%016llx [%x]",  				 pci_name(dev), i,  				 (unsigned long long)res->start,  				 (unsigned long long)res->end,  				 (unsigned int)res->flags); +			pr_debug("is unassigned\n");  			res->end -= res->start;  			res->start = 0;  			res->flags |= IORESOURCE_UNSET;  			continue;  		} -		pr_debug("PCI:%s Resource %d %016llx-%016llx [%x] fixup...\n", +		pr_debug("PCI:%s Resource %d %016llx-%016llx [%x]\n",  			 pci_name(dev), i, -			 (unsigned long long)res->start,\ +			 (unsigned long long)res->start,  			 (unsigned long long)res->end,  			 (unsigned int)res->flags); - -		fixup_resource(res, dev); - -		pr_debug("PCI:%s            %016llx-%016llx\n", -			 pci_name(dev), -			 (unsigned long long)res->start, -			 (unsigned long long)res->end);  	}  }  DECLARE_PCI_FIXUP_HEADER(PCI_ANY_ID, PCI_ANY_ID, pcibios_fixup_resources); @@ -938,8 +729,8 @@ DECLARE_PCI_FIXUP_HEADER(PCI_ANY_ID, PCI_ANY_ID, pcibios_fixup_resources);   * things go more smoothly when it gets it right. It should covers cases such   * as Apple "closed" bridge resources and bare-metal pSeries unassigned bridges   */ -static int __devinit pcibios_uninitialized_bridge_resource(struct pci_bus *bus, -							   struct resource *res) +static int pcibios_uninitialized_bridge_resource(struct pci_bus *bus, +						 struct resource *res)  {  	struct pci_controller *hose = pci_bus_to_host(bus);  	struct pci_dev *dev = bus->self; @@ -947,10 +738,6 @@ static int __devinit pcibios_uninitialized_bridge_resource(struct pci_bus *bus,  	u16 command;  	int i; -	/* We don't do anything if PCI_PROBE_ONLY is set */ -	if (pci_flags & PCI_PROBE_ONLY) -		return 0; -  	/* Job is a bit different between memory and IO */  	if (res->flags & IORESOURCE_MEM) {  		/* If the BAR is non-0 (res != pci_mem_offset) then it's @@ -1004,7 +791,7 @@ static int __devinit pcibios_uninitialized_bridge_resource(struct pci_bus *bus,  }  /* Fixup resources of a PCI<->PCI bridge */ -static void __devinit pcibios_fixup_bridge(struct pci_bus *bus) +static void pcibios_fixup_bridge(struct pci_bus *bus)  {  	struct resource *res;  	int i; @@ -1012,7 +799,6 @@ static void __devinit pcibios_fixup_bridge(struct pci_bus *bus)  	struct pci_dev *dev = bus->self;  	pci_bus_for_each_resource(bus, res, i) { -		res = bus->resource[i];  		if (!res)  			continue;  		if (!res->flags) @@ -1022,13 +808,10 @@ static void __devinit pcibios_fixup_bridge(struct pci_bus *bus)  		pr_debug("PCI:%s Bus rsrc %d %016llx-%016llx [%x] fixup...\n",  			 pci_name(dev), i, -			 (unsigned long long)res->start,\ +			 (unsigned long long)res->start,  			 (unsigned long long)res->end,  			 (unsigned int)res->flags); -		/* Perform fixup */ -		fixup_resource(res, dev); -  		/* Try to detect uninitialized P2P bridge resources,  		 * and clear them out so they get re-assigned later  		 */ @@ -1045,14 +828,14 @@ static void __devinit pcibios_fixup_bridge(struct pci_bus *bus)  	}  } -void __devinit pcibios_setup_bus_self(struct pci_bus *bus) +void pcibios_setup_bus_self(struct pci_bus *bus)  {  	/* Fix up the bus resources for P2P bridges */  	if (bus->self != NULL)  		pcibios_fixup_bridge(bus);  } -void __devinit pcibios_setup_bus_devices(struct pci_bus *bus) +void pcibios_setup_bus_devices(struct pci_bus *bus)  {  	struct pci_dev *dev; @@ -1068,16 +851,12 @@ void __devinit pcibios_setup_bus_devices(struct pci_bus *bus)  		 */  		set_dev_node(&dev->dev, pcibus_to_node(dev->bus)); -		/* Hook up default DMA ops */ -		set_dma_ops(&dev->dev, pci_dma_ops); -		dev->dev.archdata.dma_data = (void *)PCI_DRAM_OFFSET; -  		/* Read default IRQs and fixup if necessary */ -		pci_read_irq_line(dev); +		dev->irq = of_irq_parse_and_map_pci(dev, 0, 0);  	}  } -void __devinit pcibios_fixup_bus(struct pci_bus *bus) +void pcibios_fixup_bus(struct pci_bus *bus)  {  	/* When called from the generic PCI probe, read PCI<->PCI bridge  	 * bases. This is -not- called when generating the PCI tree from @@ -1096,9 +875,6 @@ EXPORT_SYMBOL(pcibios_fixup_bus);  static int skip_isa_ioresource_align(struct pci_dev *dev)  { -	if ((pci_flags & PCI_CAN_SKIP_ISA_ALIGN) && -	    !(dev->bus->bridge_ctl & PCI_BRIDGE_CTL_ISA)) -		return 1;  	return 0;  } @@ -1202,7 +978,7 @@ static int __init reparent_resources(struct resource *parent,   *	    as well.   */ -void pcibios_allocate_bus_resources(struct pci_bus *bus) +static void pcibios_allocate_bus_resources(struct pci_bus *bus)  {  	struct pci_bus *b;  	int i; @@ -1212,7 +988,6 @@ void pcibios_allocate_bus_resources(struct pci_bus *bus)  		 pci_domain_nr(bus), bus->number);  	pci_bus_for_each_resource(bus, res, i) { -		res = bus->resource[i];  		if (!res || !res->flags  		    || res->start > res->end || res->parent)  			continue; @@ -1226,8 +1001,6 @@ void pcibios_allocate_bus_resources(struct pci_bus *bus)  			 * and as such ensure proper re-allocation  			 * later.  			 */ -			if (pci_flags & PCI_REASSIGN_ALL_RSRC) -				goto clear_resource;  			pr = pci_find_parent_resource(bus->self, res);  			if (pr == res) {  				/* this happens when the generic PCI @@ -1238,12 +1011,12 @@ void pcibios_allocate_bus_resources(struct pci_bus *bus)  			}  		} -		pr_debug("PCI: %s (bus %d) bridge rsrc %d: %016llx-%016llx " -			 "[0x%x], parent %p (%s)\n", +		pr_debug("PCI: %s (bus %d) bridge rsrc %d: %016llx-%016llx ",  			 bus->self ? pci_name(bus->self) : "PHB",  			 bus->number, i,  			 (unsigned long long)res->start, -			 (unsigned long long)res->end, +			 (unsigned long long)res->end); +		pr_debug("[0x%x], parent %p (%s)\n",  			 (unsigned int)res->flags,  			 pr, (pr && pr->name) ? pr->name : "nil"); @@ -1258,9 +1031,8 @@ void pcibios_allocate_bus_resources(struct pci_bus *bus)  			if (reparent_resources(pr, res) == 0)  				continue;  		} -		printk(KERN_WARNING "PCI: Cannot allocate resource region " -		       "%d of PCI bridge %d, will remap\n", i, bus->number); -clear_resource: +		pr_warn("PCI: Cannot allocate resource region "); +		pr_cont("%d of PCI bridge %d, will remap\n", i, bus->number);  		res->start = res->end = 0;  		res->flags = 0;  	} @@ -1269,7 +1041,7 @@ clear_resource:  		pcibios_allocate_bus_resources(b);  } -static inline void __devinit alloc_resource(struct pci_dev *dev, int idx) +static inline void alloc_resource(struct pci_dev *dev, int idx)  {  	struct resource *pr, *r = &dev->resource[idx]; @@ -1282,8 +1054,8 @@ static inline void __devinit alloc_resource(struct pci_dev *dev, int idx)  	pr = pci_find_parent_resource(dev, r);  	if (!pr || (pr->flags & IORESOURCE_UNSET) ||  	    request_resource(pr, r) < 0) { -		printk(KERN_WARNING "PCI: Cannot allocate resource region %d" -		       " of device %s, will remap\n", idx, pci_name(dev)); +		pr_warn("PCI: Cannot allocate resource region %d ", idx); +		pr_cont("of device %s, will remap\n", pci_name(dev));  		if (pr)  			pr_debug("PCI:  parent is %p: %016llx-%016llx [%x]\n",  				 pr, @@ -1366,8 +1138,7 @@ static void __init pcibios_reserve_legacy_regions(struct pci_bus *bus)  	res->end = (offset + 0xfff) & 0xfffffffful;  	pr_debug("Candidate legacy IO: %pR\n", res);  	if (request_resource(&hose->io_resource, res)) { -		printk(KERN_DEBUG -		       "PCI %04x:%02x Cannot reserve Legacy IO %pR\n", +		pr_debug("PCI %04x:%02x Cannot reserve Legacy IO %pR\n",  		       pci_domain_nr(bus), bus->number, res);  		kfree(res);  	} @@ -1395,8 +1166,7 @@ static void __init pcibios_reserve_legacy_regions(struct pci_bus *bus)  	res->end = 0xbffff + offset;  	pr_debug("Candidate VGA memory: %pR\n", res);  	if (request_resource(pres, res)) { -		printk(KERN_DEBUG -		       "PCI %04x:%02x Cannot reserve VGA memory %pR\n", +		pr_debug("PCI %04x:%02x Cannot reserve VGA memory %pR\n",  		       pci_domain_nr(bus), bus->number, res);  		kfree(res);  	} @@ -1412,37 +1182,27 @@ void __init pcibios_resource_survey(void)  	list_for_each_entry(b, &pci_root_buses, node)  		pcibios_allocate_bus_resources(b); -	if (!(pci_flags & PCI_REASSIGN_ALL_RSRC)) { -		pcibios_allocate_resources(0); -		pcibios_allocate_resources(1); -	} +	pcibios_allocate_resources(0); +	pcibios_allocate_resources(1);  	/* Before we start assigning unassigned resource, we try to reserve  	 * the low IO area and the VGA memory area if they intersect the  	 * bus available resources to avoid allocating things on top of them  	 */ -	if (!(pci_flags & PCI_PROBE_ONLY)) { -		list_for_each_entry(b, &pci_root_buses, node) -			pcibios_reserve_legacy_regions(b); -	} +	list_for_each_entry(b, &pci_root_buses, node) +		pcibios_reserve_legacy_regions(b); -	/* Now, if the platform didn't decide to blindly trust the firmware, -	 * we proceed to assigning things that were left unassigned -	 */ -	if (!(pci_flags & PCI_PROBE_ONLY)) { -		pr_debug("PCI: Assigning unassigned resources...\n"); -		pci_assign_unassigned_resources(); -	} +	/* Now proceed to assigning things that were left unassigned */ +	pr_debug("PCI: Assigning unassigned resources...\n"); +	pci_assign_unassigned_resources();  } -#ifdef CONFIG_HOTPLUG -  /* This is used by the PCI hotplug driver to allocate resource   * of newly plugged busses. We can try to consolidate with the   * rest of the code later, for now, keep it as-is as our main   * resource allocation function doesn't deal with sub-trees yet.   */ -void __devinit pcibios_claim_one_bus(struct pci_bus *bus) +void pcibios_claim_one_bus(struct pci_bus *bus)  {  	struct pci_dev *dev;  	struct pci_bus *child_bus; @@ -1456,10 +1216,9 @@ void __devinit pcibios_claim_one_bus(struct pci_bus *bus)  			if (r->parent || !r->start || !r->flags)  				continue; -			pr_debug("PCI: Claiming %s: " -				 "Resource %d: %016llx..%016llx [%x]\n", -				 pci_name(dev), i, -				 (unsigned long long)r->start, +			pr_debug("PCI: Claiming %s: ", pci_name(dev)); +			pr_debug("Resource %d: %016llx..%016llx [%x]\n", +				 i, (unsigned long long)r->start,  				 (unsigned long long)r->end,  				 (unsigned int)r->flags); @@ -1496,31 +1255,32 @@ void pcibios_finish_adding_to_bus(struct pci_bus *bus)  }  EXPORT_SYMBOL_GPL(pcibios_finish_adding_to_bus); -#endif /* CONFIG_HOTPLUG */ - -int pcibios_enable_device(struct pci_dev *dev, int mask) +static void pcibios_setup_phb_resources(struct pci_controller *hose, +					struct list_head *resources)  { -	return pci_enable_resources(dev, mask); -} - -void __devinit pcibios_setup_phb_resources(struct pci_controller *hose) -{ -	struct pci_bus *bus = hose->bus; +	unsigned long io_offset;  	struct resource *res;  	int i;  	/* Hookup PHB IO resource */ -	bus->resource[0] = res = &hose->io_resource; +	res = &hose->io_resource; + +	/* Fixup IO space offset */ +	io_offset = (unsigned long)hose->io_base_virt - isa_io_base; +	res->start = (res->start + io_offset) & 0xffffffffu; +	res->end = (res->end + io_offset) & 0xffffffffu;  	if (!res->flags) { -		printk(KERN_WARNING "PCI: I/O resource not set for host" -		       " bridge %s (domain %d)\n", -		       hose->dn->full_name, hose->global_number); +		pr_warn("PCI: I/O resource not set for host "); +		pr_cont("bridge %s (domain %d)\n", +			hose->dn->full_name, hose->global_number);  		/* Workaround for lack of IO resource only on 32-bit */  		res->start = (unsigned long)hose->io_base_virt - isa_io_base;  		res->end = res->start + IO_SPACE_LIMIT;  		res->flags = IORESOURCE_IO;  	} +	pci_add_resource_offset(resources, res, +		(__force resource_size_t)(hose->io_base_virt - _IO_BASE));  	pr_debug("PCI: PHB IO resource    = %016llx-%016llx [%lx]\n",  		 (unsigned long long)res->start, @@ -1533,9 +1293,9 @@ void __devinit pcibios_setup_phb_resources(struct pci_controller *hose)  		if (!res->flags) {  			if (i > 0)  				continue; -			printk(KERN_ERR "PCI: Memory resource 0 not set for " -			       "host bridge %s (domain %d)\n", -			       hose->dn->full_name, hose->global_number); +			pr_err("PCI: Memory resource 0 not set for "); +			pr_cont("host bridge %s (domain %d)\n", +				hose->dn->full_name, hose->global_number);  			/* Workaround for lack of MEM resource only on 32-bit */  			res->start = hose->pci_mem_offset; @@ -1543,7 +1303,7 @@ void __devinit pcibios_setup_phb_resources(struct pci_controller *hose)  			res->flags = IORESOURCE_MEM;  		} -		bus->resource[i+1] = res; +		pci_add_resource_offset(resources, res, hose->pci_mem_offset);  		pr_debug("PCI: PHB MEM resource %d = %016llx-%016llx [%lx]\n",  			i, (unsigned long long)res->start, @@ -1557,6 +1317,102 @@ void __devinit pcibios_setup_phb_resources(struct pci_controller *hose)  		 (unsigned long)hose->io_base_virt - _IO_BASE);  } +struct device_node *pcibios_get_phb_of_node(struct pci_bus *bus) +{ +	struct pci_controller *hose = bus->sysdata; + +	return of_node_get(hose->dn); +} + +static void pcibios_scan_phb(struct pci_controller *hose) +{ +	LIST_HEAD(resources); +	struct pci_bus *bus; +	struct device_node *node = hose->dn; + +	pr_debug("PCI: Scanning PHB %s\n", of_node_full_name(node)); + +	pcibios_setup_phb_resources(hose, &resources); + +	bus = pci_scan_root_bus(hose->parent, hose->first_busno, +				hose->ops, hose, &resources); +	if (bus == NULL) { +		pr_err("Failed to create bus for PCI domain %04x\n", +		       hose->global_number); +		pci_free_resource_list(&resources); +		return; +	} +	bus->busn_res.start = hose->first_busno; +	hose->bus = bus; + +	hose->last_busno = bus->busn_res.end; +} + +static int __init pcibios_init(void) +{ +	struct pci_controller *hose, *tmp; +	int next_busno = 0; + +	pr_info("PCI: Probing PCI hardware\n"); + +	/* Scan all of the recorded PCI controllers.  */ +	list_for_each_entry_safe(hose, tmp, &hose_list, list_node) { +		hose->last_busno = 0xff; +		pcibios_scan_phb(hose); +		if (next_busno <= hose->last_busno) +			next_busno = hose->last_busno + 1; +	} +	pci_bus_count = next_busno; + +	/* Call common code to handle resource allocation */ +	pcibios_resource_survey(); + +	return 0; +} + +subsys_initcall(pcibios_init); + +static struct pci_controller *pci_bus_to_hose(int bus) +{ +	struct pci_controller *hose, *tmp; + +	list_for_each_entry_safe(hose, tmp, &hose_list, list_node) +		if (bus >= hose->first_busno && bus <= hose->last_busno) +			return hose; +	return NULL; +} + +/* Provide information on locations of various I/O regions in physical + * memory.  Do this on a per-card basis so that we choose the right + * root bridge. + * Note that the returned IO or memory base is a physical address + */ + +long sys_pciconfig_iobase(long which, unsigned long bus, unsigned long devfn) +{ +	struct pci_controller *hose; +	long result = -EOPNOTSUPP; + +	hose = pci_bus_to_hose(bus); +	if (!hose) +		return -ENODEV; + +	switch (which) { +	case IOBASE_BRIDGE_NUMBER: +		return (long)hose->first_busno; +	case IOBASE_MEMORY: +		return (long)hose->pci_mem_offset; +	case IOBASE_IO: +		return (long)hose->io_base_phys; +	case IOBASE_ISA_IO: +		return (long)isa_io_base; +	case IOBASE_ISA_MEM: +		return (long)isa_mem_base; +	} + +	return result; +} +  /*   * Null PCI config access functions, for the case when we can't   * find a hose. @@ -1597,7 +1453,7 @@ fake_pci_bus(struct pci_controller *hose, int busnr)  	static struct pci_bus bus;  	if (!hose) -		printk(KERN_ERR "Can't find hose for PCI bus %d!\n", busnr); +		pr_err("Can't find hose for PCI bus %d!\n", busnr);  	bus.number = busnr;  	bus.sysdata = hose; @@ -1625,3 +1481,4 @@ int early_find_capability(struct pci_controller *hose, int bus, int devfn,  {  	return pci_bus_find_capability(fake_pci_bus(hose, bus), devfn, cap);  } + diff --git a/arch/microblaze/pci/pci_32.c b/arch/microblaze/pci/pci_32.c deleted file mode 100644 index 3c3d808d7ce..00000000000 --- a/arch/microblaze/pci/pci_32.c +++ /dev/null @@ -1,431 +0,0 @@ -/* - * Common pmac/prep/chrp pci routines. -- Cort - */ - -#include <linux/kernel.h> -#include <linux/pci.h> -#include <linux/delay.h> -#include <linux/string.h> -#include <linux/init.h> -#include <linux/capability.h> -#include <linux/sched.h> -#include <linux/errno.h> -#include <linux/bootmem.h> -#include <linux/irq.h> -#include <linux/list.h> -#include <linux/of.h> -#include <linux/slab.h> - -#include <asm/processor.h> -#include <asm/io.h> -#include <asm/prom.h> -#include <asm/sections.h> -#include <asm/pci-bridge.h> -#include <asm/byteorder.h> -#include <asm/uaccess.h> - -#undef DEBUG - -unsigned long isa_io_base; -unsigned long pci_dram_offset; -int pcibios_assign_bus_offset = 1; - -static u8 *pci_to_OF_bus_map; - -/* By default, we don't re-assign bus numbers. We do this only on - * some pmacs - */ -static int pci_assign_all_buses; - -static int pci_bus_count; - -/* - * Functions below are used on OpenFirmware machines. - */ -static void -make_one_node_map(struct device_node *node, u8 pci_bus) -{ -	const int *bus_range; -	int len; - -	if (pci_bus >= pci_bus_count) -		return; -	bus_range = of_get_property(node, "bus-range", &len); -	if (bus_range == NULL || len < 2 * sizeof(int)) { -		printk(KERN_WARNING "Can't get bus-range for %s, " -		       "assuming it starts at 0\n", node->full_name); -		pci_to_OF_bus_map[pci_bus] = 0; -	} else -		pci_to_OF_bus_map[pci_bus] = bus_range[0]; - -	for_each_child_of_node(node, node) { -		struct pci_dev *dev; -		const unsigned int *class_code, *reg; - -		class_code = of_get_property(node, "class-code", NULL); -		if (!class_code || -			((*class_code >> 8) != PCI_CLASS_BRIDGE_PCI && -			(*class_code >> 8) != PCI_CLASS_BRIDGE_CARDBUS)) -			continue; -		reg = of_get_property(node, "reg", NULL); -		if (!reg) -			continue; -		dev = pci_get_bus_and_slot(pci_bus, ((reg[0] >> 8) & 0xff)); -		if (!dev || !dev->subordinate) { -			pci_dev_put(dev); -			continue; -		} -		make_one_node_map(node, dev->subordinate->number); -		pci_dev_put(dev); -	} -} - -void -pcibios_make_OF_bus_map(void) -{ -	int i; -	struct pci_controller *hose, *tmp; -	struct property *map_prop; -	struct device_node *dn; - -	pci_to_OF_bus_map = kmalloc(pci_bus_count, GFP_KERNEL); -	if (!pci_to_OF_bus_map) { -		printk(KERN_ERR "Can't allocate OF bus map !\n"); -		return; -	} - -	/* We fill the bus map with invalid values, that helps -	 * debugging. -	 */ -	for (i = 0; i < pci_bus_count; i++) -		pci_to_OF_bus_map[i] = 0xff; - -	/* For each hose, we begin searching bridges */ -	list_for_each_entry_safe(hose, tmp, &hose_list, list_node) { -		struct device_node *node = hose->dn; - -		if (!node) -			continue; -		make_one_node_map(node, hose->first_busno); -	} -	dn = of_find_node_by_path("/"); -	map_prop = of_find_property(dn, "pci-OF-bus-map", NULL); -	if (map_prop) { -		BUG_ON(pci_bus_count > map_prop->length); -		memcpy(map_prop->value, pci_to_OF_bus_map, pci_bus_count); -	} -	of_node_put(dn); -#ifdef DEBUG -	printk(KERN_INFO "PCI->OF bus map:\n"); -	for (i = 0; i < pci_bus_count; i++) { -		if (pci_to_OF_bus_map[i] == 0xff) -			continue; -		printk(KERN_INFO "%d -> %d\n", i, pci_to_OF_bus_map[i]); -	} -#endif -} - -typedef int (*pci_OF_scan_iterator)(struct device_node *node, void *data); - -static struct device_node *scan_OF_pci_childs(struct device_node *parent, -					pci_OF_scan_iterator filter, void *data) -{ -	struct device_node *node; -	struct device_node *sub_node; - -	for_each_child_of_node(parent, node) { -		const unsigned int *class_code; - -		if (filter(node, data)) { -			of_node_put(node); -			return node; -		} - -		/* For PCI<->PCI bridges or CardBus bridges, we go down -		 * Note: some OFs create a parent node "multifunc-device" as -		 * a fake root for all functions of a multi-function device, -		 * we go down them as well. -		 */ -		class_code = of_get_property(node, "class-code", NULL); -		if ((!class_code || -			((*class_code >> 8) != PCI_CLASS_BRIDGE_PCI && -			(*class_code >> 8) != PCI_CLASS_BRIDGE_CARDBUS)) && -			strcmp(node->name, "multifunc-device")) -			continue; -		sub_node = scan_OF_pci_childs(node, filter, data); -		if (sub_node) { -			of_node_put(node); -			return sub_node; -		} -	} -	return NULL; -} - -static struct device_node *scan_OF_for_pci_dev(struct device_node *parent, -					       unsigned int devfn) -{ -	struct device_node *np, *cnp; -	const u32 *reg; -	unsigned int psize; - -	for_each_child_of_node(parent, np) { -		reg = of_get_property(np, "reg", &psize); -		if (reg && psize >= 4 && ((reg[0] >> 8) & 0xff) == devfn) -			return np; - -		/* Note: some OFs create a parent node "multifunc-device" as -		 * a fake root for all functions of a multi-function device, -		 * we go down them as well. */ -		if (!strcmp(np->name, "multifunc-device")) { -			cnp = scan_OF_for_pci_dev(np, devfn); -			if (cnp) -				return cnp; -		} -	} -	return NULL; -} - - -static struct device_node *scan_OF_for_pci_bus(struct pci_bus *bus) -{ -	struct device_node *parent, *np; - -	/* Are we a root bus ? */ -	if (bus->self == NULL || bus->parent == NULL) { -		struct pci_controller *hose = pci_bus_to_host(bus); -		if (hose == NULL) -			return NULL; -		return of_node_get(hose->dn); -	} - -	/* not a root bus, we need to get our parent */ -	parent = scan_OF_for_pci_bus(bus->parent); -	if (parent == NULL) -		return NULL; - -	/* now iterate for children for a match */ -	np = scan_OF_for_pci_dev(parent, bus->self->devfn); -	of_node_put(parent); - -	return np; -} - -/* - * Scans the OF tree for a device node matching a PCI device - */ -struct device_node * -pci_busdev_to_OF_node(struct pci_bus *bus, int devfn) -{ -	struct device_node *parent, *np; - -	pr_debug("pci_busdev_to_OF_node(%d,0x%x)\n", bus->number, devfn); -	parent = scan_OF_for_pci_bus(bus); -	if (parent == NULL) -		return NULL; -	pr_debug(" parent is %s\n", parent ? parent->full_name : "<NULL>"); -	np = scan_OF_for_pci_dev(parent, devfn); -	of_node_put(parent); -	pr_debug(" result is %s\n", np ? np->full_name : "<NULL>"); - -	/* XXX most callers don't release the returned node -	 * mostly because ppc64 doesn't increase the refcount, -	 * we need to fix that. -	 */ -	return np; -} -EXPORT_SYMBOL(pci_busdev_to_OF_node); - -struct device_node* -pci_device_to_OF_node(struct pci_dev *dev) -{ -	return pci_busdev_to_OF_node(dev->bus, dev->devfn); -} -EXPORT_SYMBOL(pci_device_to_OF_node); - -static int -find_OF_pci_device_filter(struct device_node *node, void *data) -{ -	return ((void *)node == data); -} - -/* - * Returns the PCI device matching a given OF node - */ -int -pci_device_from_OF_node(struct device_node *node, u8 *bus, u8 *devfn) -{ -	const unsigned int *reg; -	struct pci_controller *hose; -	struct pci_dev *dev = NULL; - -	/* Make sure it's really a PCI device */ -	hose = pci_find_hose_for_OF_device(node); -	if (!hose || !hose->dn) -		return -ENODEV; -	if (!scan_OF_pci_childs(hose->dn, -			find_OF_pci_device_filter, (void *)node)) -		return -ENODEV; -	reg = of_get_property(node, "reg", NULL); -	if (!reg) -		return -ENODEV; -	*bus = (reg[0] >> 16) & 0xff; -	*devfn = ((reg[0] >> 8) & 0xff); - -	/* Ok, here we need some tweak. If we have already renumbered -	 * all busses, we can't rely on the OF bus number any more. -	 * the pci_to_OF_bus_map is not enough as several PCI busses -	 * may match the same OF bus number. -	 */ -	if (!pci_to_OF_bus_map) -		return 0; - -	for_each_pci_dev(dev) -		if (pci_to_OF_bus_map[dev->bus->number] == *bus && -				dev->devfn == *devfn) { -			*bus = dev->bus->number; -			pci_dev_put(dev); -			return 0; -		} - -	return -ENODEV; -} -EXPORT_SYMBOL(pci_device_from_OF_node); - -/* We create the "pci-OF-bus-map" property now so it appears in the - * /proc device tree - */ -void __init -pci_create_OF_bus_map(void) -{ -	struct property *of_prop; -	struct device_node *dn; - -	of_prop = (struct property *) alloc_bootmem(sizeof(struct property) + \ -									 256); -	if (!of_prop) -		return; -	dn = of_find_node_by_path("/"); -	if (dn) { -		memset(of_prop, -1, sizeof(struct property) + 256); -		of_prop->name = "pci-OF-bus-map"; -		of_prop->length = 256; -		of_prop->value = &of_prop[1]; -		prom_add_property(dn, of_prop); -		of_node_put(dn); -	} -} - -static void __devinit pcibios_scan_phb(struct pci_controller *hose) -{ -	struct pci_bus *bus; -	struct device_node *node = hose->dn; -	unsigned long io_offset; -	struct resource *res = &hose->io_resource; - -	pr_debug("PCI: Scanning PHB %s\n", -		 node ? node->full_name : "<NO NAME>"); - -	/* Create an empty bus for the toplevel */ -	bus = pci_create_bus(hose->parent, hose->first_busno, hose->ops, hose); -	if (bus == NULL) { -		printk(KERN_ERR "Failed to create bus for PCI domain %04x\n", -		       hose->global_number); -		return; -	} -	bus->secondary = hose->first_busno; -	hose->bus = bus; - -	/* Fixup IO space offset */ -	io_offset = (unsigned long)hose->io_base_virt - isa_io_base; -	res->start = (res->start + io_offset) & 0xffffffffu; -	res->end = (res->end + io_offset) & 0xffffffffu; - -	/* Wire up PHB bus resources */ -	pcibios_setup_phb_resources(hose); - -	/* Scan children */ -	hose->last_busno = bus->subordinate = pci_scan_child_bus(bus); -} - -static int __init pcibios_init(void) -{ -	struct pci_controller *hose, *tmp; -	int next_busno = 0; - -	printk(KERN_INFO "PCI: Probing PCI hardware\n"); - -	if (pci_flags & PCI_REASSIGN_ALL_BUS) { -		printk(KERN_INFO "setting pci_asign_all_busses\n"); -		pci_assign_all_buses = 1; -	} - -	/* Scan all of the recorded PCI controllers.  */ -	list_for_each_entry_safe(hose, tmp, &hose_list, list_node) { -		if (pci_assign_all_buses) -			hose->first_busno = next_busno; -		hose->last_busno = 0xff; -		pcibios_scan_phb(hose); -		printk(KERN_INFO "calling pci_bus_add_devices()\n"); -		pci_bus_add_devices(hose->bus); -		if (pci_assign_all_buses || next_busno <= hose->last_busno) -			next_busno = hose->last_busno + \ -					pcibios_assign_bus_offset; -	} -	pci_bus_count = next_busno; - -	/* OpenFirmware based machines need a map of OF bus -	 * numbers vs. kernel bus numbers since we may have to -	 * remap them. -	 */ -	if (pci_assign_all_buses) -		pcibios_make_OF_bus_map(); - -	/* Call common code to handle resource allocation */ -	pcibios_resource_survey(); - -	return 0; -} - -subsys_initcall(pcibios_init); - -static struct pci_controller* -pci_bus_to_hose(int bus) -{ -	struct pci_controller *hose, *tmp; - -	list_for_each_entry_safe(hose, tmp, &hose_list, list_node) -		if (bus >= hose->first_busno && bus <= hose->last_busno) -			return hose; -	return NULL; -} - -/* Provide information on locations of various I/O regions in physical - * memory.  Do this on a per-card basis so that we choose the right - * root bridge. - * Note that the returned IO or memory base is a physical address - */ - -long sys_pciconfig_iobase(long which, unsigned long bus, unsigned long devfn) -{ -	struct pci_controller *hose; -	long result = -EOPNOTSUPP; - -	hose = pci_bus_to_hose(bus); -	if (!hose) -		return -ENODEV; - -	switch (which) { -	case IOBASE_BRIDGE_NUMBER: -		return (long)hose->first_busno; -	case IOBASE_MEMORY: -		return (long)hose->pci_mem_offset; -	case IOBASE_IO: -		return (long)hose->io_base_phys; -	case IOBASE_ISA_IO: -		return (long)isa_io_base; -	case IOBASE_ISA_MEM: -		return (long)isa_mem_base; -	} - -	return result; -} diff --git a/arch/microblaze/pci/xilinx_pci.c b/arch/microblaze/pci/xilinx_pci.c index 0687a42a5bd..14c7da5fd03 100644 --- a/arch/microblaze/pci/xilinx_pci.c +++ b/arch/microblaze/pci/xilinx_pci.c @@ -18,7 +18,7 @@  #include <linux/of.h>  #include <linux/of_address.h>  #include <linux/pci.h> -#include <asm/io.h> +#include <linux/io.h>  #define XPLB_PCI_ADDR 0x10c  #define XPLB_PCI_DATA 0x110 @@ -82,7 +82,7 @@ xilinx_pci_exclude_device(struct pci_controller *hose, u_char bus, u8 devfn)   *   * List pci devices in very early phase.   */ -void __init xilinx_early_pci_scan(struct pci_controller *hose) +static void __init xilinx_early_pci_scan(struct pci_controller *hose)  {  	u32 bus = 0;  	u32 val, dev, func, offset; @@ -91,27 +91,27 @@ void __init xilinx_early_pci_scan(struct pci_controller *hose)  	for (dev = 0; dev < 2; dev++) {  		/* List only first function number - up-to 8 functions */  		for (func = 0; func < 1; func++) { -			printk(KERN_INFO "%02x:%02x:%02x", bus, dev, func); +			pr_info("%02x:%02x:%02x", bus, dev, func);  			/* read the first 64 standardized bytes */  			/* Up-to 192 bytes can be list of capabilities */  			for (offset = 0; offset < 64; offset += 4) {  				early_read_config_dword(hose, bus,  					PCI_DEVFN(dev, func), offset, &val);  				if (offset == 0 && val == 0xFFFFFFFF) { -					printk(KERN_CONT "\nABSENT"); +					pr_cont("\nABSENT");  					break;  				}  				if (!(offset % 0x10)) -					printk(KERN_CONT "\n%04x:    ", offset); +					pr_cont("\n%04x:    ", offset); -				printk(KERN_CONT "%08x  ", val); +				pr_cont("%08x  ", val);  			} -			printk(KERN_INFO "\n"); +			pr_info("\n");  		}  	}  }  #else -void __init xilinx_early_pci_scan(struct pci_controller *hose) +static void __init xilinx_early_pci_scan(struct pci_controller *hose)  {  }  #endif diff --git a/arch/microblaze/platform/Makefile b/arch/microblaze/platform/Makefile deleted file mode 100644 index ea1b75cc577..00000000000 --- a/arch/microblaze/platform/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -# -# Makefile for arch/microblaze/platform directory -# -#obj-$(CONFIG_PLATFORM_GENERIC) += generic/ - -obj-y	+= platform.o diff --git a/arch/microblaze/platform/generic/Kconfig.auto b/arch/microblaze/platform/generic/Kconfig.auto deleted file mode 100644 index 5d86fc19029..00000000000 --- a/arch/microblaze/platform/generic/Kconfig.auto +++ /dev/null @@ -1,61 +0,0 @@ -# -# (C) Copyright 2007 Michal Simek -# -# Michal SIMEK <monstr@monstr.eu> -# -# This program is free software; you can redistribute it and/or -# modify it under the terms of the GNU General Public License as -# published by the Free Software Foundation; either version 2 of -# the License, or (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 59 Temple Place, Suite 330, Boston, -# MA 02111-1307 USA -# - -# Definitions for MICROBLAZE0 -comment "Definitions for MICROBLAZE0" - -config KERNEL_BASE_ADDR -	hex "Physical address where Linux Kernel is" -	default "0x90000000" -	help -	  BASE Address for kernel - -config XILINX_MICROBLAZE0_FAMILY -	string "Targetted FPGA family" -	default "virtex5" - -config XILINX_MICROBLAZE0_USE_MSR_INSTR -	int "USE_MSR_INSTR range (0:1)" -	default 0 - -config XILINX_MICROBLAZE0_USE_PCMP_INSTR -	int "USE_PCMP_INSTR range (0:1)" -	default 0 - -config XILINX_MICROBLAZE0_USE_BARREL -	int "USE_BARREL range (0:1)" -	default 0 - -config XILINX_MICROBLAZE0_USE_DIV -	int "USE_DIV range (0:1)" -	default 0 - -config XILINX_MICROBLAZE0_USE_HW_MUL -	int "USE_HW_MUL values (0=NONE, 1=MUL32, 2=MUL64)" -	default 0 - -config XILINX_MICROBLAZE0_USE_FPU -	int "USE_FPU values (0=NONE, 1=BASIC, 2=EXTENDED)" -	default 0 - -config XILINX_MICROBLAZE0_HW_VER -	string "Core version number" -	default 7.10.d diff --git a/arch/microblaze/platform/generic/Makefile b/arch/microblaze/platform/generic/Makefile deleted file mode 100644 index 9a8b1bd3fa6..00000000000 --- a/arch/microblaze/platform/generic/Makefile +++ /dev/null @@ -1,3 +0,0 @@ -# -# Empty Makefile to keep make clean happy -# diff --git a/arch/microblaze/platform/generic/system.dts b/arch/microblaze/platform/generic/system.dts deleted file mode 100644 index 3f85df2b73b..00000000000 --- a/arch/microblaze/platform/generic/system.dts +++ /dev/null @@ -1,367 +0,0 @@ -/* - * Device Tree Generator version: 1.1 - * - * (C) Copyright 2007-2008 Xilinx, Inc. - * (C) Copyright 2007-2009 Michal Simek - * - * Michal SIMEK <monstr@monstr.eu> - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License as - * published by the Free Software Foundation; either version 2 of - * the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, - * MA 02111-1307 USA - * - * CAUTION: This file is automatically generated by libgen. - * Version: Xilinx EDK 10.1.03 EDK_K_SP3.6 - * - * XPS project directory: Xilinx-ML505-ll_temac-sgdma-MMU-FDT-edk101 - */ - -/dts-v1/; -/ { -	#address-cells = <1>; -	#size-cells = <1>; -	compatible = "xlnx,microblaze"; -	hard-reset-gpios = <&LEDs_8Bit 2 1>; -	model = "testing"; -	DDR2_SDRAM: memory@90000000 { -		device_type = "memory"; -		reg = < 0x90000000 0x10000000 >; -	} ; -	aliases { -		ethernet0 = &Hard_Ethernet_MAC; -		serial0 = &RS232_Uart_1; -	} ; -	chosen { -		bootargs = "console=ttyUL0,115200 highres=on"; -		linux,stdout-path = "/plb@0/serial@84000000"; -	} ; -	cpus { -		#address-cells = <1>; -		#cpus = <0x1>; -		#size-cells = <0>; -		microblaze_0: cpu@0 { -			clock-frequency = <125000000>; -			compatible = "xlnx,microblaze-7.10.d"; -			d-cache-baseaddr = <0x90000000>; -			d-cache-highaddr = <0x9fffffff>; -			d-cache-line-size = <0x10>; -			d-cache-size = <0x2000>; -			device_type = "cpu"; -			i-cache-baseaddr = <0x90000000>; -			i-cache-highaddr = <0x9fffffff>; -			i-cache-line-size = <0x10>; -			i-cache-size = <0x2000>; -			model = "microblaze,7.10.d"; -			reg = <0>; -			timebase-frequency = <125000000>; -			xlnx,addr-tag-bits = <0xf>; -			xlnx,allow-dcache-wr = <0x1>; -			xlnx,allow-icache-wr = <0x1>; -			xlnx,area-optimized = <0x0>; -			xlnx,cache-byte-size = <0x2000>; -			xlnx,d-lmb = <0x1>; -			xlnx,d-opb = <0x0>; -			xlnx,d-plb = <0x1>; -			xlnx,data-size = <0x20>; -			xlnx,dcache-addr-tag = <0xf>; -			xlnx,dcache-always-used = <0x1>; -			xlnx,dcache-byte-size = <0x2000>; -			xlnx,dcache-line-len = <0x4>; -			xlnx,dcache-use-fsl = <0x1>; -			xlnx,debug-enabled = <0x1>; -			xlnx,div-zero-exception = <0x1>; -			xlnx,dopb-bus-exception = <0x0>; -			xlnx,dynamic-bus-sizing = <0x1>; -			xlnx,edge-is-positive = <0x1>; -			xlnx,family = "virtex5"; -			xlnx,endianness = <0x1>; -			xlnx,fpu-exception = <0x1>; -			xlnx,fsl-data-size = <0x20>; -			xlnx,fsl-exception = <0x0>; -			xlnx,fsl-links = <0x0>; -			xlnx,i-lmb = <0x1>; -			xlnx,i-opb = <0x0>; -			xlnx,i-plb = <0x1>; -			xlnx,icache-always-used = <0x1>; -			xlnx,icache-line-len = <0x4>; -			xlnx,icache-use-fsl = <0x1>; -			xlnx,ill-opcode-exception = <0x1>; -			xlnx,instance = "microblaze_0"; -			xlnx,interconnect = <0x1>; -			xlnx,interrupt-is-edge = <0x0>; -			xlnx,iopb-bus-exception = <0x0>; -			xlnx,mmu-dtlb-size = <0x4>; -			xlnx,mmu-itlb-size = <0x2>; -			xlnx,mmu-tlb-access = <0x3>; -			xlnx,mmu-zones = <0x10>; -			xlnx,number-of-pc-brk = <0x1>; -			xlnx,number-of-rd-addr-brk = <0x0>; -			xlnx,number-of-wr-addr-brk = <0x0>; -			xlnx,opcode-0x0-illegal = <0x1>; -			xlnx,pvr = <0x2>; -			xlnx,pvr-user1 = <0x0>; -			xlnx,pvr-user2 = <0x0>; -			xlnx,reset-msr = <0x0>; -			xlnx,sco = <0x0>; -			xlnx,unaligned-exceptions = <0x1>; -			xlnx,use-barrel = <0x1>; -			xlnx,use-dcache = <0x1>; -			xlnx,use-div = <0x1>; -			xlnx,use-ext-brk = <0x1>; -			xlnx,use-ext-nm-brk = <0x1>; -			xlnx,use-extended-fsl-instr = <0x0>; -			xlnx,use-fpu = <0x2>; -			xlnx,use-hw-mul = <0x2>; -			xlnx,use-icache = <0x1>; -			xlnx,use-interrupt = <0x1>; -			xlnx,use-mmu = <0x3>; -			xlnx,use-msr-instr = <0x1>; -			xlnx,use-pcmp-instr = <0x1>; -		} ; -	} ; -	mb_plb: plb@0 { -		#address-cells = <1>; -		#size-cells = <1>; -		compatible = "xlnx,plb-v46-1.03.a", "xlnx,plb-v46-1.00.a", "simple-bus"; -		ranges ; -		FLASH: flash@a0000000 { -			bank-width = <2>; -			compatible = "xlnx,xps-mch-emc-2.00.a", "cfi-flash"; -			reg = < 0xa0000000 0x2000000 >; -			xlnx,family = "virtex5"; -			xlnx,include-datawidth-matching-0 = <0x1>; -			xlnx,include-datawidth-matching-1 = <0x0>; -			xlnx,include-datawidth-matching-2 = <0x0>; -			xlnx,include-datawidth-matching-3 = <0x0>; -			xlnx,include-negedge-ioregs = <0x0>; -			xlnx,include-plb-ipif = <0x1>; -			xlnx,include-wrbuf = <0x1>; -			xlnx,max-mem-width = <0x10>; -			xlnx,mch-native-dwidth = <0x20>; -			xlnx,mch-plb-clk-period-ps = <0x1f40>; -			xlnx,mch-splb-awidth = <0x20>; -			xlnx,mch0-accessbuf-depth = <0x10>; -			xlnx,mch0-protocol = <0x0>; -			xlnx,mch0-rddatabuf-depth = <0x10>; -			xlnx,mch1-accessbuf-depth = <0x10>; -			xlnx,mch1-protocol = <0x0>; -			xlnx,mch1-rddatabuf-depth = <0x10>; -			xlnx,mch2-accessbuf-depth = <0x10>; -			xlnx,mch2-protocol = <0x0>; -			xlnx,mch2-rddatabuf-depth = <0x10>; -			xlnx,mch3-accessbuf-depth = <0x10>; -			xlnx,mch3-protocol = <0x0>; -			xlnx,mch3-rddatabuf-depth = <0x10>; -			xlnx,mem0-width = <0x10>; -			xlnx,mem1-width = <0x20>; -			xlnx,mem2-width = <0x20>; -			xlnx,mem3-width = <0x20>; -			xlnx,num-banks-mem = <0x1>; -			xlnx,num-channels = <0x0>; -			xlnx,priority-mode = <0x0>; -			xlnx,synch-mem-0 = <0x0>; -			xlnx,synch-mem-1 = <0x0>; -			xlnx,synch-mem-2 = <0x0>; -			xlnx,synch-mem-3 = <0x0>; -			xlnx,synch-pipedelay-0 = <0x2>; -			xlnx,synch-pipedelay-1 = <0x2>; -			xlnx,synch-pipedelay-2 = <0x2>; -			xlnx,synch-pipedelay-3 = <0x2>; -			xlnx,tavdv-ps-mem-0 = <0x1adb0>; -			xlnx,tavdv-ps-mem-1 = <0x3a98>; -			xlnx,tavdv-ps-mem-2 = <0x3a98>; -			xlnx,tavdv-ps-mem-3 = <0x3a98>; -			xlnx,tcedv-ps-mem-0 = <0x1adb0>; -			xlnx,tcedv-ps-mem-1 = <0x3a98>; -			xlnx,tcedv-ps-mem-2 = <0x3a98>; -			xlnx,tcedv-ps-mem-3 = <0x3a98>; -			xlnx,thzce-ps-mem-0 = <0x88b8>; -			xlnx,thzce-ps-mem-1 = <0x1b58>; -			xlnx,thzce-ps-mem-2 = <0x1b58>; -			xlnx,thzce-ps-mem-3 = <0x1b58>; -			xlnx,thzoe-ps-mem-0 = <0x1b58>; -			xlnx,thzoe-ps-mem-1 = <0x1b58>; -			xlnx,thzoe-ps-mem-2 = <0x1b58>; -			xlnx,thzoe-ps-mem-3 = <0x1b58>; -			xlnx,tlzwe-ps-mem-0 = <0x88b8>; -			xlnx,tlzwe-ps-mem-1 = <0x0>; -			xlnx,tlzwe-ps-mem-2 = <0x0>; -			xlnx,tlzwe-ps-mem-3 = <0x0>; -			xlnx,twc-ps-mem-0 = <0x2af8>; -			xlnx,twc-ps-mem-1 = <0x3a98>; -			xlnx,twc-ps-mem-2 = <0x3a98>; -			xlnx,twc-ps-mem-3 = <0x3a98>; -			xlnx,twp-ps-mem-0 = <0x11170>; -			xlnx,twp-ps-mem-1 = <0x2ee0>; -			xlnx,twp-ps-mem-2 = <0x2ee0>; -			xlnx,twp-ps-mem-3 = <0x2ee0>; -			xlnx,xcl0-linesize = <0x4>; -			xlnx,xcl0-writexfer = <0x1>; -			xlnx,xcl1-linesize = <0x4>; -			xlnx,xcl1-writexfer = <0x1>; -			xlnx,xcl2-linesize = <0x4>; -			xlnx,xcl2-writexfer = <0x1>; -			xlnx,xcl3-linesize = <0x4>; -			xlnx,xcl3-writexfer = <0x1>; -		} ; -		Hard_Ethernet_MAC: xps-ll-temac@81c00000 { -			#address-cells = <1>; -			#size-cells = <1>; -			compatible = "xlnx,compound"; -			ranges ; -			ethernet@81c00000 { -				compatible = "xlnx,xps-ll-temac-1.01.b", "xlnx,xps-ll-temac-1.00.a"; -				device_type = "network"; -				interrupt-parent = <&xps_intc_0>; -				interrupts = < 5 2 >; -				llink-connected = <&PIM3>; -				local-mac-address = [ 00 0a 35 00 00 00 ]; -				reg = < 0x81c00000 0x40 >; -				xlnx,bus2core-clk-ratio = <0x1>; -				xlnx,phy-type = <0x1>; -				xlnx,phyaddr = <0x1>; -				xlnx,rxcsum = <0x0>; -				xlnx,rxfifo = <0x1000>; -				xlnx,temac-type = <0x0>; -				xlnx,txcsum = <0x0>; -				xlnx,txfifo = <0x1000>; -			} ; -		} ; -		IIC_EEPROM: i2c@81600000 { -			compatible = "xlnx,xps-iic-2.00.a"; -			interrupt-parent = <&xps_intc_0>; -			interrupts = < 6 2 >; -			reg = < 0x81600000 0x10000 >; -			xlnx,clk-freq = <0x7735940>; -			xlnx,family = "virtex5"; -			xlnx,gpo-width = <0x1>; -			xlnx,iic-freq = <0x186a0>; -			xlnx,scl-inertial-delay = <0x0>; -			xlnx,sda-inertial-delay = <0x0>; -			xlnx,ten-bit-adr = <0x0>; -		} ; -		LEDs_8Bit: gpio@81400000 { -			compatible = "xlnx,xps-gpio-1.00.a"; -			interrupt-parent = <&xps_intc_0>; -			interrupts = < 7 2 >; -			reg = < 0x81400000 0x10000 >; -			xlnx,all-inputs = <0x0>; -			xlnx,all-inputs-2 = <0x0>; -			xlnx,dout-default = <0x0>; -			xlnx,dout-default-2 = <0x0>; -			xlnx,family = "virtex5"; -			xlnx,gpio-width = <0x8>; -			xlnx,interrupt-present = <0x1>; -			xlnx,is-bidir = <0x1>; -			xlnx,is-bidir-2 = <0x1>; -			xlnx,is-dual = <0x0>; -			xlnx,tri-default = <0xffffffff>; -			xlnx,tri-default-2 = <0xffffffff>; -			#gpio-cells = <2>; -			gpio-controller; -		} ; - -		gpio-leds { -			compatible = "gpio-leds"; - -			heartbeat { -				label = "Heartbeat"; -				gpios = <&LEDs_8Bit 4 1>; -				linux,default-trigger = "heartbeat"; -			}; - -			yellow { -				label = "Yellow"; -				gpios = <&LEDs_8Bit 5 1>; -			}; - -			red { -				label = "Red"; -				gpios = <&LEDs_8Bit 6 1>; -			}; - -			green { -				label = "Green"; -				gpios = <&LEDs_8Bit 7 1>; -			}; -		} ; -		RS232_Uart_1: serial@84000000 { -			clock-frequency = <125000000>; -			compatible = "xlnx,xps-uartlite-1.00.a"; -			current-speed = <115200>; -			device_type = "serial"; -			interrupt-parent = <&xps_intc_0>; -			interrupts = < 8 0 >; -			port-number = <0>; -			reg = < 0x84000000 0x10000 >; -			xlnx,baudrate = <0x1c200>; -			xlnx,data-bits = <0x8>; -			xlnx,family = "virtex5"; -			xlnx,odd-parity = <0x0>; -			xlnx,use-parity = <0x0>; -		} ; -		SysACE_CompactFlash: sysace@83600000 { -			compatible = "xlnx,xps-sysace-1.00.a"; -			interrupt-parent = <&xps_intc_0>; -			interrupts = < 4 2 >; -			reg = < 0x83600000 0x10000 >; -			xlnx,family = "virtex5"; -			xlnx,mem-width = <0x10>; -		} ; -		debug_module: debug@84400000 { -			compatible = "xlnx,mdm-1.00.d"; -			reg = < 0x84400000 0x10000 >; -			xlnx,family = "virtex5"; -			xlnx,interconnect = <0x1>; -			xlnx,jtag-chain = <0x2>; -			xlnx,mb-dbg-ports = <0x1>; -			xlnx,uart-width = <0x8>; -			xlnx,use-uart = <0x1>; -			xlnx,write-fsl-ports = <0x0>; -		} ; -		mpmc@90000000 { -			#address-cells = <1>; -			#size-cells = <1>; -			compatible = "xlnx,mpmc-4.02.a"; -			ranges ; -			PIM3: sdma@84600180 { -				compatible = "xlnx,ll-dma-1.00.a"; -				interrupt-parent = <&xps_intc_0>; -				interrupts = < 2 2 1 2 >; -				reg = < 0x84600180 0x80 >; -			} ; -		} ; -		xps_intc_0: interrupt-controller@81800000 { -			#interrupt-cells = <0x2>; -			compatible = "xlnx,xps-intc-1.00.a"; -			interrupt-controller ; -			reg = < 0x81800000 0x10000 >; -			xlnx,kind-of-intr = <0x100>; -			xlnx,num-intr-inputs = <0x9>; -		} ; -		xps_timer_1: timer@83c00000 { -			compatible = "xlnx,xps-timer-1.00.a"; -			interrupt-parent = <&xps_intc_0>; -			interrupts = < 3 2 >; -			reg = < 0x83c00000 0x10000 >; -			xlnx,count-width = <0x20>; -			xlnx,family = "virtex5"; -			xlnx,gen0-assert = <0x1>; -			xlnx,gen1-assert = <0x1>; -			xlnx,one-timer-only = <0x0>; -			xlnx,trig0-assert = <0x1>; -			xlnx,trig1-assert = <0x1>; -		} ; -	} ; -}  ;  | 
