Merge branch 'master' of /pub/scm/linux/kernel/git/torvalds/linux-2.6
This commit is contained in:
commit
7efb35af73
13
MAINTAINERS
13
MAINTAINERS
|
@ -1963,11 +1963,6 @@ M: adaplas@gmail.com
|
|||
L: linux-fbdev-devel@lists.sourceforge.net (subscribers-only)
|
||||
S: Maintained
|
||||
|
||||
INTEL APIC/IOAPIC, LOWLEVEL X86 SMP SUPPORT
|
||||
P: Ingo Molnar
|
||||
M: mingo@redhat.com
|
||||
S: Maintained
|
||||
|
||||
INTEL I8XX RANDOM NUMBER GENERATOR SUPPORT
|
||||
P: Jeff Garzik
|
||||
M: jgarzik@pobox.com
|
||||
|
@ -4269,9 +4264,15 @@ M: jacmet@sunsite.dk
|
|||
L: linux-serial@vger.kernel.org
|
||||
S: Maintained
|
||||
|
||||
X86 3-LEVEL PAGING (PAE) SUPPORT
|
||||
X86 ARCHITECTURE (32-BIT AND 64-BIT)
|
||||
P: Thomas Gleixner
|
||||
M: tglx@linutronix.de
|
||||
P: Ingo Molnar
|
||||
M: mingo@redhat.com
|
||||
P: H. Peter Anvin
|
||||
M: hpa@zytor.com
|
||||
L: linux-kernel@vger.kernel.org
|
||||
T: git://git.kernel.org/pub/scm/linux/kernel/git/x86/linux-2.6-x86.git
|
||||
S: Maintained
|
||||
|
||||
YAM DRIVER FOR AX.25
|
||||
|
|
2
Makefile
2
Makefile
|
@ -1505,7 +1505,7 @@ quiet_cmd_rmfiles = $(if $(wildcard $(rm-files)),CLEAN $(wildcard $(rm-files))
|
|||
# and we build for the host arch
|
||||
quiet_cmd_depmod = DEPMOD $(KERNELRELEASE)
|
||||
cmd_depmod = \
|
||||
if [ -r System.map -a -x $(DEPMOD) -a "$(SUBARCH)" == "$(ARCH)" ]; then \
|
||||
if [ -r System.map -a -x $(DEPMOD) -a "$(SUBARCH)" = "$(ARCH)" ]; then \
|
||||
$(DEPMOD) -ae -F System.map \
|
||||
$(if $(strip $(INSTALL_MOD_PATH)), -b $(INSTALL_MOD_PATH) -r) \
|
||||
$(KERNELRELEASE); \
|
||||
|
|
|
@ -71,7 +71,7 @@ config GENERIC_CALIBRATE_DELAY
|
|||
|
||||
config IRQCHIP_DEMUX_GPIO
|
||||
bool
|
||||
depends on (BF53x || BF561 || BF54x)
|
||||
depends on (BF52x || BF53x || BF561 || BF54x)
|
||||
default y
|
||||
|
||||
source "init/Kconfig"
|
||||
|
@ -85,6 +85,21 @@ choice
|
|||
prompt "CPU"
|
||||
default BF533
|
||||
|
||||
config BF522
|
||||
bool "BF522"
|
||||
help
|
||||
BF522 Processor Support.
|
||||
|
||||
config BF525
|
||||
bool "BF525"
|
||||
help
|
||||
BF525 Processor Support.
|
||||
|
||||
config BF527
|
||||
bool "BF527"
|
||||
help
|
||||
BF527 Processor Support.
|
||||
|
||||
config BF531
|
||||
bool "BF531"
|
||||
help
|
||||
|
@ -144,13 +159,18 @@ endchoice
|
|||
|
||||
choice
|
||||
prompt "Silicon Rev"
|
||||
default BF_REV_0_1 if BF527
|
||||
default BF_REV_0_2 if BF537
|
||||
default BF_REV_0_3 if BF533
|
||||
default BF_REV_0_0 if BF549
|
||||
|
||||
config BF_REV_0_0
|
||||
bool "0.0"
|
||||
depends on (BF549)
|
||||
depends on (BF549 || BF527)
|
||||
|
||||
config BF_REV_0_1
|
||||
bool "0.2"
|
||||
depends on (BF549 || BF527)
|
||||
|
||||
config BF_REV_0_2
|
||||
bool "0.2"
|
||||
|
@ -176,6 +196,11 @@ config BF_REV_NONE
|
|||
|
||||
endchoice
|
||||
|
||||
config BF52x
|
||||
bool
|
||||
depends on (BF522 || BF525 || BF527)
|
||||
default y
|
||||
|
||||
config BF53x
|
||||
bool
|
||||
depends on (BF531 || BF532 || BF533 || BF534 || BF536 || BF537)
|
||||
|
@ -204,6 +229,12 @@ choice
|
|||
configuration to ensure that all the other settings are
|
||||
correct.
|
||||
|
||||
config BFIN527_EZKIT
|
||||
bool "BF527-EZKIT"
|
||||
depends on (BF522 || BF525 || BF527)
|
||||
help
|
||||
BF533-EZKIT-LITE board Support.
|
||||
|
||||
config BFIN533_EZKIT
|
||||
bool "BF533-EZKIT"
|
||||
depends on (BF533 || BF532 || BF531)
|
||||
|
@ -299,11 +330,17 @@ config MEM_MT48LC8M32B2B5_7
|
|||
depends on (BFIN561_BLUETECHNIX_CM)
|
||||
default y
|
||||
|
||||
config MEM_MT48LC32M16A2TG_75
|
||||
bool
|
||||
depends on (BFIN527_EZKIT)
|
||||
default y
|
||||
|
||||
config BFIN_SHARED_FLASH_ENET
|
||||
bool
|
||||
depends on (BFIN533_STAMP)
|
||||
default y
|
||||
|
||||
source "arch/blackfin/mach-bf527/Kconfig"
|
||||
source "arch/blackfin/mach-bf533/Kconfig"
|
||||
source "arch/blackfin/mach-bf561/Kconfig"
|
||||
source "arch/blackfin/mach-bf537/Kconfig"
|
||||
|
@ -329,7 +366,7 @@ config CLKIN_HZ
|
|||
int "Crystal Frequency in Hz"
|
||||
default "11059200" if BFIN533_STAMP
|
||||
default "27000000" if BFIN533_EZKIT
|
||||
default "25000000" if BFIN537_STAMP
|
||||
default "25000000" if (BFIN537_STAMP || BFIN527_EZKIT)
|
||||
default "30000000" if BFIN561_EZKIT
|
||||
default "24576000" if PNAV10
|
||||
help
|
||||
|
@ -362,7 +399,7 @@ config VCO_MULT
|
|||
range 1 64
|
||||
default "22" if BFIN533_EZKIT
|
||||
default "45" if BFIN533_STAMP
|
||||
default "20" if BFIN537_STAMP
|
||||
default "20" if (BFIN537_STAMP || BFIN527_EZKIT)
|
||||
default "22" if BFIN533_BLUETECHNIX_CM
|
||||
default "20" if BFIN537_BLUETECHNIX_CM
|
||||
default "20" if BFIN561_BLUETECHNIX_CM
|
||||
|
@ -398,7 +435,7 @@ config SCLK_DIV
|
|||
range 1 15
|
||||
default 5 if BFIN533_EZKIT
|
||||
default 5 if BFIN533_STAMP
|
||||
default 4 if BFIN537_STAMP
|
||||
default 4 if (BFIN537_STAMP || BFIN527_EZKIT)
|
||||
default 5 if BFIN533_BLUETECHNIX_CM
|
||||
default 4 if BFIN537_BLUETECHNIX_CM
|
||||
default 4 if BFIN561_BLUETECHNIX_CM
|
||||
|
@ -450,6 +487,7 @@ comment "Memory Setup"
|
|||
config MEM_SIZE
|
||||
int "SDRAM Memory Size in MBytes"
|
||||
default 32 if BFIN533_EZKIT
|
||||
default 64 if BFIN527_EZKIT
|
||||
default 64 if BFIN537_STAMP
|
||||
default 64 if BFIN561_EZKIT
|
||||
default 128 if BFIN533_STAMP
|
||||
|
@ -459,6 +497,7 @@ config MEM_ADD_WIDTH
|
|||
int "SDRAM Memory Address Width"
|
||||
default 9 if BFIN533_EZKIT
|
||||
default 9 if BFIN561_EZKIT
|
||||
default 10 if BFIN527_EZKIT
|
||||
default 10 if BFIN537_STAMP
|
||||
default 11 if BFIN533_STAMP
|
||||
default 10 if PNAV10
|
||||
|
@ -749,9 +788,19 @@ config LARGE_ALLOCS
|
|||
a lot of RAM, and you need to able to allocate very large
|
||||
contiguous chunks. If unsure, say N.
|
||||
|
||||
config BFIN_GPTIMERS
|
||||
tristate "Enable Blackfin General Purpose Timers API"
|
||||
default n
|
||||
help
|
||||
Enable support for the General Purpose Timers API. If you
|
||||
are unsure, say N.
|
||||
|
||||
To compile this driver as a module, choose M here: the module
|
||||
will be called gptimers.ko.
|
||||
|
||||
config BFIN_DMA_5XX
|
||||
bool "Enable DMA Support"
|
||||
depends on (BF533 || BF532 || BF531 || BF537 || BF536 || BF534 || BF561 || BF54x)
|
||||
depends on (BF52x || BF53x || BF561 || BF54x)
|
||||
default y
|
||||
help
|
||||
DMA driver for BF5xx.
|
||||
|
|
|
@ -12,12 +12,17 @@ LDFLAGS_vmlinux := -X
|
|||
OBJCOPYFLAGS := -O binary -R .note -R .comment -S
|
||||
GZFLAGS := -9
|
||||
|
||||
CFLAGS += $(call cc-option,-mno-fdpic)
|
||||
AFLAGS += $(call cc-option,-mno-fdpic)
|
||||
CFLAGS_MODULE += -mlong-calls
|
||||
KALLSYMS += --symbol-prefix=_
|
||||
|
||||
KBUILD_DEFCONFIG := BF537-STAMP_defconfig
|
||||
|
||||
# setup the machine name and the machine dependent settings
|
||||
machine-$(CONFIG_BF522) := bf527
|
||||
machine-$(CONFIG_BF525) := bf527
|
||||
machine-$(CONFIG_BF527) := bf527
|
||||
machine-$(CONFIG_BF531) := bf533
|
||||
machine-$(CONFIG_BF532) := bf533
|
||||
machine-$(CONFIG_BF533) := bf533
|
||||
|
@ -32,6 +37,9 @@ machine-$(CONFIG_BF561) := bf561
|
|||
MACHINE := $(machine-y)
|
||||
export MACHINE
|
||||
|
||||
cpu-$(CONFIG_BF522) := bf522
|
||||
cpu-$(CONFIG_BF525) := bf525
|
||||
cpu-$(CONFIG_BF527) := bf527
|
||||
cpu-$(CONFIG_BF531) := bf531
|
||||
cpu-$(CONFIG_BF532) := bf532
|
||||
cpu-$(CONFIG_BF533) := bf533
|
||||
|
@ -97,12 +105,23 @@ archclean:
|
|||
$(Q)$(MAKE) $(clean)=$(boot)
|
||||
|
||||
|
||||
all: vmImage
|
||||
boot := arch/$(ARCH)/boot
|
||||
BOOT_TARGETS = vmImage
|
||||
.PHONY: $(BOOT_TARGETS)
|
||||
PHONY += $(BOOT_TARGETS) install
|
||||
KBUILD_IMAGE := $(boot)/vmImage
|
||||
|
||||
all: vmImage
|
||||
|
||||
$(BOOT_TARGETS): vmlinux
|
||||
$(Q)$(MAKE) $(build)=$(boot) $(boot)/$@
|
||||
|
||||
install:
|
||||
$(Q)$(MAKE) $(build)=$(boot) BOOTIMAGE=$(KBUILD_IMAGE) install
|
||||
|
||||
define archhelp
|
||||
echo '* vmImage - Kernel-only image for U-Boot (arch/$(ARCH)/boot/vmImage)'
|
||||
echo ' install - Install kernel using'
|
||||
echo ' (your) ~/bin/$(CROSS_COMPILE)installkernel or'
|
||||
echo ' (distribution) PATH: $(CROSS_COMPILE)installkernel or'
|
||||
echo ' install to $$(INSTALL_PATH)'
|
||||
endef
|
||||
|
|
|
@ -26,3 +26,6 @@ $(obj)/vmlinux.gz: $(obj)/vmlinux.bin FORCE
|
|||
$(obj)/vmImage: $(obj)/vmlinux.gz
|
||||
$(call if_changed,uimage)
|
||||
@echo 'Kernel: $@ is ready'
|
||||
|
||||
install:
|
||||
sh $(srctree)/$(src)/install.sh $(KERNELRELEASE) $(BOOTIMAGE) System.map "$(INSTALL_PATH)"
|
||||
|
|
|
@ -0,0 +1,57 @@
|
|||
#!/bin/sh
|
||||
#
|
||||
# arch/blackfin/boot/install.sh
|
||||
#
|
||||
# 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) 1995 by Linus Torvalds
|
||||
#
|
||||
# Adapted from code in arch/i386/boot/Makefile by H. Peter Anvin
|
||||
# Adapted from code in arch/i386/boot/install.sh by Mike Frysinger
|
||||
#
|
||||
# "make install" script for Blackfin architecture
|
||||
#
|
||||
# Arguments:
|
||||
# $1 - kernel version
|
||||
# $2 - kernel image file
|
||||
# $3 - kernel map file
|
||||
# $4 - default install path (blank if root directory)
|
||||
#
|
||||
|
||||
verify () {
|
||||
if [ ! -f "$1" ]; then
|
||||
echo "" 1>&2
|
||||
echo " *** Missing file: $1" 1>&2
|
||||
echo ' *** You need to run "make" before "make install".' 1>&2
|
||||
echo "" 1>&2
|
||||
exit 1
|
||||
fi
|
||||
}
|
||||
|
||||
# Make sure the files actually exist
|
||||
verify "$2"
|
||||
verify "$3"
|
||||
|
||||
# User may have a custom install script
|
||||
|
||||
if [ -x ~/bin/${CROSS_COMPILE}installkernel ]; then exec ~/bin/${CROSS_COMPILE}installkernel "$@"; fi
|
||||
if which ${CROSS_COMPILE}installkernel >/dev/null 2>&1; then
|
||||
exec ${CROSS_COMPILE}installkernel "$@"
|
||||
fi
|
||||
|
||||
# Default install - same as make zlilo
|
||||
|
||||
back_it_up() {
|
||||
local file=$1
|
||||
[ -f ${file} ] || return 0
|
||||
local stamp=$(stat -c %Y ${file} 2>/dev/null)
|
||||
mv ${file} ${file}.${stamp:-old}
|
||||
}
|
||||
|
||||
back_it_up $4/uImage
|
||||
back_it_up $4/System.map
|
||||
|
||||
cat $2 > $4/uImage
|
||||
cp $3 $4/System.map
|
File diff suppressed because it is too large
Load Diff
|
@ -809,7 +809,14 @@ CONFIG_UNIX98_PTYS=y
|
|||
# IPMI
|
||||
#
|
||||
# CONFIG_IPMI_HANDLER is not set
|
||||
# CONFIG_WATCHDOG is not set
|
||||
CONFIG_WATCHDOG=y
|
||||
# CONFIG_WATCHDOG_NOWAYOUT is not set
|
||||
|
||||
#
|
||||
# Watchdog Device Drivers
|
||||
#
|
||||
# CONFIG_SOFT_WATCHDOG is not set
|
||||
CONFIG_BFIN_WDT=y
|
||||
CONFIG_HW_RANDOM=y
|
||||
# CONFIG_GEN_RTC is not set
|
||||
# CONFIG_R3964 is not set
|
||||
|
|
|
@ -9,6 +9,7 @@ obj-y := \
|
|||
sys_bfin.o time.o traps.o irqchip.o dma-mapping.o flat.o \
|
||||
fixed_code.o cplbinit.o cacheinit.o reboot.o bfin_gpio.o
|
||||
|
||||
obj-$(CONFIG_BFIN_GPTIMERS) += gptimers.o
|
||||
obj-$(CONFIG_MODULES) += module.o
|
||||
obj-$(CONFIG_BFIN_DMA_5XX) += bfin_dma_5xx.o
|
||||
obj-$(CONFIG_DUAL_CORE_TEST_MODULE) += dualcore_test.o
|
||||
|
|
|
@ -420,6 +420,32 @@ unsigned short get_dma_curr_ycount(unsigned int channel)
|
|||
}
|
||||
EXPORT_SYMBOL(get_dma_curr_ycount);
|
||||
|
||||
unsigned long get_dma_next_desc_ptr(unsigned int channel)
|
||||
{
|
||||
BUG_ON(!(dma_ch[channel].chan_status != DMA_CHANNEL_FREE
|
||||
&& channel < MAX_BLACKFIN_DMA_CHANNEL));
|
||||
|
||||
return dma_ch[channel].regs->next_desc_ptr;
|
||||
}
|
||||
EXPORT_SYMBOL(get_dma_next_desc_ptr);
|
||||
|
||||
unsigned long get_dma_curr_desc_ptr(unsigned int channel)
|
||||
{
|
||||
BUG_ON(!(dma_ch[channel].chan_status != DMA_CHANNEL_FREE
|
||||
&& channel < MAX_BLACKFIN_DMA_CHANNEL));
|
||||
|
||||
return dma_ch[channel].regs->curr_desc_ptr;
|
||||
}
|
||||
|
||||
unsigned long get_dma_curr_addr(unsigned int channel)
|
||||
{
|
||||
BUG_ON(!(dma_ch[channel].chan_status != DMA_CHANNEL_FREE
|
||||
&& channel < MAX_BLACKFIN_DMA_CHANNEL));
|
||||
|
||||
return dma_ch[channel].regs->curr_addr_ptr;
|
||||
}
|
||||
EXPORT_SYMBOL(get_dma_curr_addr);
|
||||
|
||||
static void *__dma_memcpy(void *dest, const void *src, size_t size)
|
||||
{
|
||||
int direction; /* 1 - address decrease, 0 - address increase */
|
||||
|
|
|
@ -124,7 +124,7 @@ static struct gpio_port_t *gpio_bankb[gpio_bank(MAX_BLACKFIN_GPIOS)] = {
|
|||
};
|
||||
#endif
|
||||
|
||||
#ifdef BF537_FAMILY
|
||||
#if defined(BF527_FAMILY) || defined(BF537_FAMILY)
|
||||
static struct gpio_port_t *gpio_bankb[gpio_bank(MAX_BLACKFIN_GPIOS)] = {
|
||||
(struct gpio_port_t *) PORTFIO,
|
||||
(struct gpio_port_t *) PORTGIO,
|
||||
|
@ -139,6 +139,21 @@ static unsigned short *port_fer[gpio_bank(MAX_BLACKFIN_GPIOS)] = {
|
|||
|
||||
#endif
|
||||
|
||||
#ifdef BF527_FAMILY
|
||||
static unsigned short *port_mux[gpio_bank(MAX_BLACKFIN_GPIOS)] = {
|
||||
(unsigned short *) PORTF_MUX,
|
||||
(unsigned short *) PORTG_MUX,
|
||||
(unsigned short *) PORTH_MUX,
|
||||
};
|
||||
|
||||
static const
|
||||
u8 pmux_offset[][16] =
|
||||
{{ 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 4, 6, 8, 8, 10, 10 }, /* PORTF */
|
||||
{ 0, 0, 0, 0, 0, 2, 2, 4, 4, 6, 8, 10, 10, 10, 12, 12 }, /* PORTG */
|
||||
{ 0, 0, 0, 0, 0, 0, 0, 0, 2, 4, 4, 4, 4, 4, 4, 4 }, /* PORTH */
|
||||
};
|
||||
#endif
|
||||
|
||||
#ifdef BF561_FAMILY
|
||||
static struct gpio_port_t *gpio_bankb[gpio_bank(MAX_BLACKFIN_GPIOS)] = {
|
||||
(struct gpio_port_t *) FIO0_FLAG_D,
|
||||
|
@ -186,6 +201,10 @@ static unsigned int sic_iwr_irqs[gpio_bank(MAX_BLACKFIN_GPIOS)] = {IRQ_PROG_INTB
|
|||
static unsigned int sic_iwr_irqs[gpio_bank(MAX_BLACKFIN_GPIOS)] = {IRQ_PROG_INTB, IRQ_PORTG_INTB, IRQ_MAC_TX};
|
||||
#endif
|
||||
|
||||
#ifdef BF527_FAMILY
|
||||
static unsigned int sic_iwr_irqs[gpio_bank(MAX_BLACKFIN_GPIOS)] = {IRQ_PORTF_INTB, IRQ_PORTG_INTB, IRQ_PORTH_INTB};
|
||||
#endif
|
||||
|
||||
#ifdef BF561_FAMILY
|
||||
static unsigned int sic_iwr_irqs[gpio_bank(MAX_BLACKFIN_GPIOS)] = {IRQ_PROG0_INTB, IRQ_PROG1_INTB, IRQ_PROG2_INTB};
|
||||
#endif
|
||||
|
@ -238,7 +257,7 @@ static int cmp_label(unsigned short ident, const char *label)
|
|||
return -EINVAL;
|
||||
}
|
||||
|
||||
#ifdef BF537_FAMILY
|
||||
#if defined(BF527_FAMILY) || defined(BF537_FAMILY)
|
||||
static void port_setup(unsigned short gpio, unsigned short usage)
|
||||
{
|
||||
if (!check_gpio(gpio)) {
|
||||
|
@ -354,6 +373,18 @@ inline u16 get_portmux(unsigned short portno)
|
|||
|
||||
return (pmux >> (2 * gpio_sub_n(portno)) & 0x3);
|
||||
}
|
||||
#elif defined(BF527_FAMILY)
|
||||
inline void portmux_setup(unsigned short portno, unsigned short function)
|
||||
{
|
||||
u16 pmux, ident = P_IDENT(portno);
|
||||
u8 offset = pmux_offset[gpio_bank(ident)][gpio_sub_n(ident)];
|
||||
|
||||
pmux = *port_mux[gpio_bank(ident)];
|
||||
pmux &= ~(3 << offset);
|
||||
pmux |= (function & 3) << offset;
|
||||
*port_mux[gpio_bank(ident)] = pmux;
|
||||
SSYNC();
|
||||
}
|
||||
#else
|
||||
# define portmux_setup(...) do { } while (0)
|
||||
#endif
|
||||
|
|
|
@ -0,0 +1,250 @@
|
|||
/*
|
||||
* bfin_gptimers.c - derived from bf53x_timers.c
|
||||
* Driver for General Purpose Timer functions on the Blackfin processor
|
||||
*
|
||||
* Copyright (C) 2005 John DeHority
|
||||
* Copyright (C) 2006 Hella Aglaia GmbH (awe@aglaia-gmbh.de)
|
||||
*
|
||||
* Licensed under the GPLv2.
|
||||
*/
|
||||
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/module.h>
|
||||
|
||||
#include <asm/io.h>
|
||||
#include <asm/blackfin.h>
|
||||
#include <asm/gptimers.h>
|
||||
|
||||
#ifdef DEBUG
|
||||
# define tassert(expr)
|
||||
#else
|
||||
# define tassert(expr) \
|
||||
if (!(expr)) \
|
||||
printk(KERN_DEBUG "%s:%s:%i: Assertion failed: " #expr "\n", \
|
||||
__FILE__, __func__, __LINE__);
|
||||
#endif
|
||||
|
||||
#define BFIN_TIMER_NUM_GROUP (BFIN_TIMER_OCTET(MAX_BLACKFIN_GPTIMERS - 1) + 1)
|
||||
|
||||
typedef struct {
|
||||
uint16_t config;
|
||||
uint16_t __pad;
|
||||
uint32_t counter;
|
||||
uint32_t period;
|
||||
uint32_t width;
|
||||
} GPTIMER_timer_regs;
|
||||
|
||||
typedef struct {
|
||||
uint16_t enable;
|
||||
uint16_t __pad0;
|
||||
uint16_t disable;
|
||||
uint16_t __pad1;
|
||||
uint32_t status;
|
||||
} GPTIMER_group_regs;
|
||||
|
||||
static volatile GPTIMER_timer_regs *const timer_regs[MAX_BLACKFIN_GPTIMERS] =
|
||||
{
|
||||
(GPTIMER_timer_regs *)TIMER0_CONFIG,
|
||||
(GPTIMER_timer_regs *)TIMER1_CONFIG,
|
||||
(GPTIMER_timer_regs *)TIMER2_CONFIG,
|
||||
#if (MAX_BLACKFIN_GPTIMERS > 3)
|
||||
(GPTIMER_timer_regs *)TIMER3_CONFIG,
|
||||
(GPTIMER_timer_regs *)TIMER4_CONFIG,
|
||||
(GPTIMER_timer_regs *)TIMER5_CONFIG,
|
||||
(GPTIMER_timer_regs *)TIMER6_CONFIG,
|
||||
(GPTIMER_timer_regs *)TIMER7_CONFIG,
|
||||
#endif
|
||||
#if (MAX_BLACKFIN_GPTIMERS > 8)
|
||||
(GPTIMER_timer_regs *)TIMER8_CONFIG,
|
||||
(GPTIMER_timer_regs *)TIMER9_CONFIG,
|
||||
(GPTIMER_timer_regs *)TIMER10_CONFIG,
|
||||
(GPTIMER_timer_regs *)TIMER11_CONFIG,
|
||||
#endif
|
||||
};
|
||||
|
||||
static volatile GPTIMER_group_regs *const group_regs[BFIN_TIMER_NUM_GROUP] =
|
||||
{
|
||||
(GPTIMER_group_regs *)TIMER0_GROUP_REG,
|
||||
#if (MAX_BLACKFIN_GPTIMERS > 8)
|
||||
(GPTIMER_group_regs *)TIMER8_GROUP_REG,
|
||||
#endif
|
||||
};
|
||||
|
||||
static uint32_t const dis_mask[MAX_BLACKFIN_GPTIMERS] =
|
||||
{
|
||||
TIMER_STATUS_TRUN0,
|
||||
TIMER_STATUS_TRUN1,
|
||||
TIMER_STATUS_TRUN2,
|
||||
#if (MAX_BLACKFIN_GPTIMERS > 3)
|
||||
TIMER_STATUS_TRUN3,
|
||||
TIMER_STATUS_TRUN4,
|
||||
TIMER_STATUS_TRUN5,
|
||||
TIMER_STATUS_TRUN6,
|
||||
TIMER_STATUS_TRUN7,
|
||||
#endif
|
||||
#if (MAX_BLACKFIN_GPTIMERS > 8)
|
||||
TIMER_STATUS_TRUN8,
|
||||
TIMER_STATUS_TRUN9,
|
||||
TIMER_STATUS_TRUN10,
|
||||
TIMER_STATUS_TRUN11,
|
||||
#endif
|
||||
};
|
||||
|
||||
static uint32_t const irq_mask[MAX_BLACKFIN_GPTIMERS] =
|
||||
{
|
||||
TIMER_STATUS_TIMIL0,
|
||||
TIMER_STATUS_TIMIL1,
|
||||
TIMER_STATUS_TIMIL2,
|
||||
#if (MAX_BLACKFIN_GPTIMERS > 3)
|
||||
TIMER_STATUS_TIMIL3,
|
||||
TIMER_STATUS_TIMIL4,
|
||||
TIMER_STATUS_TIMIL5,
|
||||
TIMER_STATUS_TIMIL6,
|
||||
TIMER_STATUS_TIMIL7,
|
||||
#endif
|
||||
#if (MAX_BLACKFIN_GPTIMERS > 8)
|
||||
TIMER_STATUS_TIMIL8,
|
||||
TIMER_STATUS_TIMIL9,
|
||||
TIMER_STATUS_TIMIL10,
|
||||
TIMER_STATUS_TIMIL11,
|
||||
#endif
|
||||
};
|
||||
|
||||
void set_gptimer_pwidth(int timer_id, uint32_t value)
|
||||
{
|
||||
tassert(timer_id < MAX_BLACKFIN_GPTIMERS);
|
||||
timer_regs[timer_id]->width = value;
|
||||
SSYNC();
|
||||
}
|
||||
EXPORT_SYMBOL(set_gptimer_pwidth);
|
||||
|
||||
uint32_t get_gptimer_pwidth(int timer_id)
|
||||
{
|
||||
tassert(timer_id < MAX_BLACKFIN_GPTIMERS);
|
||||
return timer_regs[timer_id]->width;
|
||||
}
|
||||
EXPORT_SYMBOL(get_gptimer_pwidth);
|
||||
|
||||
void set_gptimer_period(int timer_id, uint32_t period)
|
||||
{
|
||||
tassert(timer_id < MAX_BLACKFIN_GPTIMERS);
|
||||
timer_regs[timer_id]->period = period;
|
||||
SSYNC();
|
||||
}
|
||||
EXPORT_SYMBOL(set_gptimer_period);
|
||||
|
||||
uint32_t get_gptimer_period(int timer_id)
|
||||
{
|
||||
tassert(timer_id < MAX_BLACKFIN_GPTIMERS);
|
||||
return timer_regs[timer_id]->period;
|
||||
}
|
||||
EXPORT_SYMBOL(get_gptimer_period);
|
||||
|
||||
uint32_t get_gptimer_count(int timer_id)
|
||||
{
|
||||
tassert(timer_id < MAX_BLACKFIN_GPTIMERS);
|
||||
return timer_regs[timer_id]->counter;
|
||||
}
|
||||
EXPORT_SYMBOL(get_gptimer_count);
|
||||
|
||||
uint32_t get_gptimer_status(int group)
|
||||
{
|
||||
tassert(group < BFIN_TIMER_NUM_GROUP);
|
||||
return group_regs[group]->status;
|
||||
}
|
||||
EXPORT_SYMBOL(get_gptimer_status);
|
||||
|
||||
void set_gptimer_status(int group, uint32_t value)
|
||||
{
|
||||
tassert(group < BFIN_TIMER_NUM_GROUP);
|
||||
group_regs[group]->status = value;
|
||||
SSYNC();
|
||||
}
|
||||
EXPORT_SYMBOL(set_gptimer_status);
|
||||
|
||||
uint16_t get_gptimer_intr(int timer_id)
|
||||
{
|
||||
tassert(timer_id < MAX_BLACKFIN_GPTIMERS);
|
||||
return (group_regs[BFIN_TIMER_OCTET(timer_id)]->status & irq_mask[timer_id]) ? 1 : 0;
|
||||
}
|
||||
EXPORT_SYMBOL(get_gptimer_intr);
|
||||
|
||||
void clear_gptimer_intr(int timer_id)
|
||||
{
|
||||
tassert(timer_id < MAX_BLACKFIN_GPTIMERS);
|
||||
group_regs[BFIN_TIMER_OCTET(timer_id)]->status = irq_mask[timer_id];
|
||||
}
|
||||
EXPORT_SYMBOL(clear_gptimer_intr);
|
||||
|
||||
void set_gptimer_config(int timer_id, uint16_t config)
|
||||
{
|
||||
tassert(timer_id < MAX_BLACKFIN_GPTIMERS);
|
||||
timer_regs[timer_id]->config = config;
|
||||
SSYNC();
|
||||
}
|
||||
EXPORT_SYMBOL(set_gptimer_config);
|
||||
|
||||
uint16_t get_gptimer_config(int timer_id)
|
||||
{
|
||||
tassert(timer_id < MAX_BLACKFIN_GPTIMERS);
|
||||
return timer_regs[timer_id]->config;
|
||||
}
|
||||
EXPORT_SYMBOL(get_gptimer_config);
|
||||
|
||||
void enable_gptimers(uint16_t mask)
|
||||
{
|
||||
int i;
|
||||
tassert((mask & ~BLACKFIN_GPTIMER_IDMASK) == 0);
|
||||
for (i = 0; i < BFIN_TIMER_NUM_GROUP; ++i) {
|
||||
group_regs[i]->enable = mask & 0xFF;
|
||||
mask >>= 8;
|
||||
}
|
||||
SSYNC();
|
||||
}
|
||||
EXPORT_SYMBOL(enable_gptimers);
|
||||
|
||||
void disable_gptimers(uint16_t mask)
|
||||
{
|
||||
int i;
|
||||
uint16_t m = mask;
|
||||
tassert((mask & ~BLACKFIN_GPTIMER_IDMASK) == 0);
|
||||
for (i = 0; i < BFIN_TIMER_NUM_GROUP; ++i) {
|
||||
group_regs[i]->disable = m & 0xFF;
|
||||
m >>= 8;
|
||||
}
|
||||
for (i = 0; i < MAX_BLACKFIN_GPTIMERS; ++i)
|
||||
if (mask & (1 << i))
|
||||
group_regs[BFIN_TIMER_OCTET(i)]->status |= dis_mask[i];
|
||||
SSYNC();
|
||||
}
|
||||
EXPORT_SYMBOL(disable_gptimers);
|
||||
|
||||
void set_gptimer_pulse_hi(int timer_id)
|
||||
{
|
||||
tassert(timer_id < MAX_BLACKFIN_GPTIMERS);
|
||||
timer_regs[timer_id]->config |= TIMER_PULSE_HI;
|
||||
SSYNC();
|
||||
}
|
||||
EXPORT_SYMBOL(set_gptimer_pulse_hi);
|
||||
|
||||
void clear_gptimer_pulse_hi(int timer_id)
|
||||
{
|
||||
tassert(timer_id < MAX_BLACKFIN_GPTIMERS);
|
||||
timer_regs[timer_id]->config &= ~TIMER_PULSE_HI;
|
||||
SSYNC();
|
||||
}
|
||||
EXPORT_SYMBOL(clear_gptimer_pulse_hi);
|
||||
|
||||
uint16_t get_enabled_gptimers(void)
|
||||
{
|
||||
int i;
|
||||
uint16_t result = 0;
|
||||
for (i = 0; i < BFIN_TIMER_NUM_GROUP; ++i)
|
||||
result |= (group_regs[i]->enable << (i << 3));
|
||||
return result;
|
||||
}
|
||||
EXPORT_SYMBOL(get_enabled_gptimers);
|
||||
|
||||
MODULE_AUTHOR("Axel Weiss (awe@aglaia-gmbh.de)");
|
||||
MODULE_DESCRIPTION("Blackfin General Purpose Timers API");
|
||||
MODULE_LICENSE("GPL");
|
|
@ -11,7 +11,7 @@
|
|||
#include <asm/reboot.h>
|
||||
#include <asm/system.h>
|
||||
|
||||
#if defined(BF537_FAMILY) || defined(BF533_FAMILY)
|
||||
#if defined(BF537_FAMILY) || defined(BF533_FAMILY) || defined(BF527_FAMILY)
|
||||
#define SYSCR_VAL 0x0
|
||||
#elif defined(BF561_FAMILY)
|
||||
#define SYSCR_VAL 0x20
|
||||
|
|
|
@ -459,7 +459,7 @@ static u_long get_vco(void)
|
|||
return vco;
|
||||
}
|
||||
|
||||
/*Get the Core clock*/
|
||||
/* Get the Core clock */
|
||||
u_long get_cclk(void)
|
||||
{
|
||||
u_long csel, ssel;
|
||||
|
@ -493,12 +493,24 @@ u_long get_sclk(void)
|
|||
}
|
||||
EXPORT_SYMBOL(get_sclk);
|
||||
|
||||
unsigned long sclk_to_usecs(unsigned long sclk)
|
||||
{
|
||||
return (USEC_PER_SEC * (u64)sclk) / get_sclk();
|
||||
}
|
||||
EXPORT_SYMBOL(sclk_to_usecs);
|
||||
|
||||
unsigned long usecs_to_sclk(unsigned long usecs)
|
||||
{
|
||||
return get_sclk() / (USEC_PER_SEC * (u64)usecs);
|
||||
}
|
||||
EXPORT_SYMBOL(usecs_to_sclk);
|
||||
|
||||
/*
|
||||
* Get CPU information for use by the procfs.
|
||||
*/
|
||||
static int show_cpuinfo(struct seq_file *m, void *v)
|
||||
{
|
||||
char *cpu, *mmu, *fpu, *name;
|
||||
char *cpu, *mmu, *fpu, *vendor, *cache;
|
||||
uint32_t revid;
|
||||
|
||||
u_long cclk = 0, sclk = 0;
|
||||
|
@ -508,70 +520,83 @@ static int show_cpuinfo(struct seq_file *m, void *v)
|
|||
mmu = "none";
|
||||
fpu = "none";
|
||||
revid = bfin_revid();
|
||||
name = bfin_board_name;
|
||||
|
||||
cclk = get_cclk();
|
||||
sclk = get_sclk();
|
||||
|
||||
seq_printf(m, "CPU:\t\tADSP-%s Rev. 0.%d\n"
|
||||
"MMU:\t\t%s\n"
|
||||
"FPU:\t\t%s\n"
|
||||
"Core Clock:\t%9lu Hz\n"
|
||||
"System Clock:\t%9lu Hz\n"
|
||||
"BogoMips:\t%lu.%02lu\n"
|
||||
"Calibration:\t%lu loops\n",
|
||||
cpu, revid, mmu, fpu,
|
||||
cclk,
|
||||
sclk,
|
||||
(loops_per_jiffy * HZ) / 500000,
|
||||
((loops_per_jiffy * HZ) / 5000) % 100,
|
||||
(loops_per_jiffy * HZ));
|
||||
seq_printf(m, "Board Name:\t%s\n", name);
|
||||
seq_printf(m, "Board Memory:\t%ld MB\n", physical_mem_end >> 20);
|
||||
seq_printf(m, "Kernel Memory:\t%ld MB\n", (unsigned long)_ramend >> 20);
|
||||
if (bfin_read_IMEM_CONTROL() & (ENICPLB | IMC))
|
||||
seq_printf(m, "I-CACHE:\tON\n");
|
||||
else
|
||||
seq_printf(m, "I-CACHE:\tOFF\n");
|
||||
if ((bfin_read_DMEM_CONTROL()) & (ENDCPLB | DMC_ENABLE))
|
||||
seq_printf(m, "D-CACHE:\tON"
|
||||
#if defined CONFIG_BFIN_WB
|
||||
" (write-back)"
|
||||
#elif defined CONFIG_BFIN_WT
|
||||
" (write-through)"
|
||||
#endif
|
||||
"\n");
|
||||
else
|
||||
seq_printf(m, "D-CACHE:\tOFF\n");
|
||||
switch (bfin_read_CHIPID() & CHIPID_MANUFACTURE) {
|
||||
case 0xca:
|
||||
vendor = "Analog Devices";
|
||||
break;
|
||||
default:
|
||||
vendor = "unknown";
|
||||
break;
|
||||
}
|
||||
|
||||
seq_printf(m, "processor\t: %d\n"
|
||||
"vendor_id\t: %s\n"
|
||||
"cpu family\t: 0x%x\n"
|
||||
"model name\t: ADSP-%s %lu(MHz CCLK) %lu(MHz SCLK)\n"
|
||||
"stepping\t: %d\n",
|
||||
0,
|
||||
vendor,
|
||||
(bfin_read_CHIPID() & CHIPID_FAMILY),
|
||||
cpu, cclk/1000000, sclk/1000000,
|
||||
revid);
|
||||
|
||||
seq_printf(m, "cpu MHz\t\t: %lu.%03lu/%lu.%03lu\n",
|
||||
cclk/1000000, cclk%1000000,
|
||||
sclk/1000000, sclk%1000000);
|
||||
seq_printf(m, "bogomips\t: %lu.%02lu\n"
|
||||
"Calibration\t: %lu loops\n",
|
||||
(loops_per_jiffy * HZ) / 500000,
|
||||
((loops_per_jiffy * HZ) / 5000) % 100,
|
||||
(loops_per_jiffy * HZ));
|
||||
|
||||
/* Check Cache configutation */
|
||||
switch (bfin_read_DMEM_CONTROL() & (1 << DMC0_P | 1 << DMC1_P)) {
|
||||
case ACACHE_BSRAM:
|
||||
seq_printf(m, "DBANK-A:\tCACHE\n" "DBANK-B:\tSRAM\n");
|
||||
cache = "dbank-A/B\t: cache/sram";
|
||||
dcache_size = 16;
|
||||
dsup_banks = 1;
|
||||
break;
|
||||
case ACACHE_BCACHE:
|
||||
seq_printf(m, "DBANK-A:\tCACHE\n" "DBANK-B:\tCACHE\n");
|
||||
cache = "dbank-A/B\t: cache/cache";
|
||||
dcache_size = 32;
|
||||
dsup_banks = 2;
|
||||
break;
|
||||
case ASRAM_BSRAM:
|
||||
seq_printf(m, "DBANK-A:\tSRAM\n" "DBANK-B:\tSRAM\n");
|
||||
cache = "dbank-A/B\t: sram/sram";
|
||||
dcache_size = 0;
|
||||
dsup_banks = 0;
|
||||
break;
|
||||
default:
|
||||
cache = "unknown";
|
||||
dcache_size = 0;
|
||||
dsup_banks = 0;
|
||||
break;
|
||||
}
|
||||
|
||||
/* Is it turned on? */
|
||||
if (!((bfin_read_DMEM_CONTROL()) & (ENDCPLB | DMC_ENABLE)))
|
||||
dcache_size = 0;
|
||||
|
||||
seq_printf(m, "I-CACHE Size:\t%dKB\n", BFIN_ICACHESIZE / 1024);
|
||||
seq_printf(m, "D-CACHE Size:\t%dKB\n", dcache_size);
|
||||
seq_printf(m, "I-CACHE Setup:\t%d Sub-banks/%d Ways, %d Lines/Way\n",
|
||||
seq_printf(m, "cache size\t: %d KB(L1 icache) "
|
||||
"%d KB(L1 dcache-%s) %d KB(L2 cache)\n",
|
||||
BFIN_ICACHESIZE / 1024, dcache_size,
|
||||
#if defined CONFIG_BFIN_WB
|
||||
"wb"
|
||||
#elif defined CONFIG_BFIN_WT
|
||||
"wt"
|
||||
#endif
|
||||
, 0);
|
||||
|
||||
seq_printf(m, "%s\n", cache);
|
||||
|
||||
seq_printf(m, "icache setup\t: %d Sub-banks/%d Ways, %d Lines/Way\n",
|
||||
BFIN_ISUBBANKS, BFIN_IWAYS, BFIN_ILINES);
|
||||
seq_printf(m,
|
||||
"D-CACHE Setup:\t%d Super-banks/%d Sub-banks/%d Ways, %d Lines/Way\n",
|
||||
"dcache setup\t: %d Super-banks/%d Sub-banks/%d Ways, %d Lines/Way\n",
|
||||
dsup_banks, BFIN_DSUBBANKS, BFIN_DWAYS,
|
||||
BFIN_DLINES);
|
||||
#ifdef CONFIG_BFIN_ICACHE_LOCK
|
||||
|
@ -625,6 +650,15 @@ static int show_cpuinfo(struct seq_file *m, void *v)
|
|||
seq_printf(m, "No Ways are locked\n");
|
||||
}
|
||||
#endif
|
||||
|
||||
seq_printf(m, "board name\t: %s\n", bfin_board_name);
|
||||
seq_printf(m, "board memory\t: %ld kB (0x%p -> 0x%p)\n",
|
||||
physical_mem_end >> 10, (void *)0, (void *)physical_mem_end);
|
||||
seq_printf(m, "kernel memory\t: %d kB (0x%p -> 0x%p)\n",
|
||||
((int)memory_end - (int)_stext) >> 10,
|
||||
_stext,
|
||||
(void *)memory_end);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
|
@ -118,12 +118,14 @@ static int printk_address(unsigned long address)
|
|||
offset = (address - vma->vm_start) + (vma->vm_pgoff << PAGE_SHIFT);
|
||||
|
||||
write_unlock_irq(&tasklist_lock);
|
||||
mmput(mm);
|
||||
return printk("<0x%p> [ %s + 0x%lx ]",
|
||||
(void *)address, name, offset);
|
||||
}
|
||||
|
||||
vml = vml->next;
|
||||
}
|
||||
mmput(mm);
|
||||
}
|
||||
write_unlock_irq(&tasklist_lock);
|
||||
|
||||
|
|
|
@ -4,7 +4,7 @@
|
|||
|
||||
lib-y := \
|
||||
ashldi3.o ashrdi3.o lshrdi3.o \
|
||||
muldi3.o divsi3.o udivsi3.o modsi3.o umodsi3.o \
|
||||
muldi3.o divsi3.o udivsi3.o udivdi3.o modsi3.o umodsi3.o \
|
||||
checksum.o memcpy.o memset.o memcmp.o memchr.o memmove.o \
|
||||
strcmp.o strcpy.o strncmp.o strncpy.o \
|
||||
umulsi3_highpart.o smulsi3_highpart.o \
|
||||
|
|
|
@ -0,0 +1,375 @@
|
|||
/*
|
||||
* udivdi3.S - unsigned long long division
|
||||
*
|
||||
* Copyright 2003-2007 Analog Devices Inc.
|
||||
* Enter bugs at http://blackfin.uclinux.org/
|
||||
*
|
||||
* Licensed under the GPLv2 or later.
|
||||
*/
|
||||
|
||||
#include <linux/linkage.h>
|
||||
|
||||
#define CARRY AC0
|
||||
|
||||
#ifdef CONFIG_ARITHMETIC_OPS_L1
|
||||
.section .l1.text
|
||||
#else
|
||||
.text
|
||||
#endif
|
||||
|
||||
|
||||
ENTRY(___udivdi3)
|
||||
R3 = [SP + 12];
|
||||
[--SP] = (R7:4, P5:3);
|
||||
|
||||
/* Attempt to use divide primitive first; these will handle
|
||||
** most cases, and they're quick - avoids stalls incurred by
|
||||
** testing for identities.
|
||||
*/
|
||||
|
||||
R4 = R2 | R3;
|
||||
CC = R4 == 0;
|
||||
IF CC JUMP .LDIV_BY_ZERO;
|
||||
|
||||
R4.H = 0x8000;
|
||||
R4 >>>= 16; // R4 now 0xFFFF8000
|
||||
R5 = R0 | R2; // If either dividend or
|
||||
R4 = R5 & R4; // divisor have bits in
|
||||
CC = R4; // top half or low half's sign
|
||||
IF CC JUMP .LIDENTS; // bit, skip builtins.
|
||||
R4 = R1 | R3; // Also check top halves
|
||||
CC = R4;
|
||||
IF CC JUMP .LIDENTS;
|
||||
|
||||
/* Can use the builtins. */
|
||||
|
||||
AQ = CC; // Clear AQ (CC==0)
|
||||
DIVQ(R0, R2);
|
||||
DIVQ(R0, R2);
|
||||
DIVQ(R0, R2);
|
||||
DIVQ(R0, R2);
|
||||
DIVQ(R0, R2);
|
||||
DIVQ(R0, R2);
|
||||
DIVQ(R0, R2);
|
||||
DIVQ(R0, R2);
|
||||
DIVQ(R0, R2);
|
||||
DIVQ(R0, R2);
|
||||
DIVQ(R0, R2);
|
||||
DIVQ(R0, R2);
|
||||
DIVQ(R0, R2);
|
||||
DIVQ(R0, R2);
|
||||
DIVQ(R0, R2);
|
||||
DIVQ(R0, R2);
|
||||
DIVQ(R0, R2);
|
||||
R0 = R0.L (Z);
|
||||
R1 = 0;
|
||||
(R7:4, P5:3) = [SP++];
|
||||
RTS;
|
||||
|
||||
.LIDENTS:
|
||||
/* Test for common identities. Value to be returned is
|
||||
** placed in R6,R7.
|
||||
*/
|
||||
// Check for 0/y, return 0
|
||||
R4 = R0 | R1;
|
||||
CC = R4 == 0;
|
||||
IF CC JUMP .LRETURN_R0;
|
||||
|
||||
// Check for x/x, return 1
|
||||
R6 = R0 - R2; // If x == y, then both R6 and R7 will be zero
|
||||
R7 = R1 - R3;
|
||||
R4 = R6 | R7; // making R4 zero.
|
||||
R6 += 1; // which would now make R6:R7==1.
|
||||
CC = R4 == 0;
|
||||
IF CC JUMP .LRETURN_IDENT;
|
||||
|
||||
// Check for x/1, return x
|
||||
R6 = R0;
|
||||
R7 = R1;
|
||||
CC = R3 == 0;
|
||||
IF !CC JUMP .Lnexttest;
|
||||
CC = R2 == 1;
|
||||
IF CC JUMP .LRETURN_IDENT;
|
||||
|
||||
.Lnexttest:
|
||||
R4.L = ONES R2; // check for div by power of two which
|
||||
R5.L = ONES R3; // can be done using a shift
|
||||
R6 = PACK (R5.L, R4.L);
|
||||
CC = R6 == 1;
|
||||
IF CC JUMP .Lpower_of_two_upper_zero;
|
||||
R6 = PACK (R4.L, R5.L);
|
||||
CC = R6 == 1;
|
||||
IF CC JUMP .Lpower_of_two_lower_zero;
|
||||
|
||||
// Check for x < y, return 0
|
||||
R6 = 0;
|
||||
R7 = R6;
|
||||
CC = R1 < R3 (IU);
|
||||
IF CC JUMP .LRETURN_IDENT;
|
||||
CC = R1 == R3;
|
||||
IF !CC JUMP .Lno_idents;
|
||||
CC = R0 < R2 (IU);
|
||||
IF CC JUMP .LRETURN_IDENT;
|
||||
|
||||
.Lno_idents: // Idents don't match. Go for the full operation
|
||||
|
||||
|
||||
// If X, or X and Y have high bit set, it'll affect the
|
||||
// results, so shift right one to stop this. Note: we've already
|
||||
// checked that X >= Y, so Y's msb won't be set unless X's
|
||||
// is.
|
||||
|
||||
R4 = 0;
|
||||
CC = R1 < 0;
|
||||
IF !CC JUMP .Lx_msb_clear;
|
||||
CC = !CC; // 1 -> 0;
|
||||
R1 = ROT R1 BY -1; // Shift X >> 1
|
||||
R0 = ROT R0 BY -1; // lsb -> CC
|
||||
BITSET(R4,31); // to record only x msb was set
|
||||
CC = R3 < 0;
|
||||
IF !CC JUMP .Ly_msb_clear;
|
||||
CC = !CC;
|
||||
R3 = ROT R3 BY -1; // Shift Y >> 1
|
||||
R2 = ROT R2 BY -1;
|
||||
BITCLR(R4,31); // clear bit to record only x msb was set
|
||||
|
||||
.Ly_msb_clear:
|
||||
.Lx_msb_clear:
|
||||
// Bit 31 in R4 indicates X msb set, but Y msb wasn't, and no bits
|
||||
// were lost, so we should shift result left by one.
|
||||
|
||||
[--SP] = R4; // save for later
|
||||
|
||||
// In the loop that follows, each iteration we add
|
||||
// either Y' or -Y' to the Remainder. We compute the
|
||||
// negated Y', and store, for convenience. Y' goes
|
||||
// into P0:P1, while -Y' goes into P2:P3.
|
||||
|
||||
P0 = R2;
|
||||
P1 = R3;
|
||||
R2 = -R2;
|
||||
CC = CARRY;
|
||||
CC = !CC;
|
||||
R4 = CC;
|
||||
R3 = -R3;
|
||||
R3 = R3 - R4;
|
||||
|
||||
R6 = 0; // remainder = 0
|
||||
R7 = R6;
|
||||
|
||||
[--SP] = R2; P2 = SP;
|
||||
[--SP] = R3; P3 = SP;
|
||||
[--SP] = R6; P5 = SP; // AQ = 0
|
||||
[--SP] = P1;
|
||||
|
||||
/* In the loop that follows, we use the following
|
||||
** register assignments:
|
||||
** R0,R1 X, workspace
|
||||
** R2,R3 Y, workspace
|
||||
** R4,R5 partial Div
|
||||
** R6,R7 partial remainder
|
||||
** P5 AQ
|
||||
** The remainder and div form a 128-bit number, with
|
||||
** the remainder in the high 64-bits.
|
||||
*/
|
||||
R4 = R0; // Div = X'
|
||||
R5 = R1;
|
||||
R3 = 0;
|
||||
|
||||
P4 = 64; // Iterate once per bit
|
||||
LSETUP(.LULST,.LULEND) LC0 = P4;
|
||||
.LULST:
|
||||
/* Shift Div and remainder up by one. The bit shifted
|
||||
** out of the top of the quotient is shifted into the bottom
|
||||
** of the remainder.
|
||||
*/
|
||||
CC = R3;
|
||||
R4 = ROT R4 BY 1;
|
||||
R5 = ROT R5 BY 1 || // low q to high q
|
||||
R2 = [P5]; // load saved AQ
|
||||
R6 = ROT R6 BY 1 || // high q to low r
|
||||
R0 = [P2]; // load -Y'
|
||||
R7 = ROT R7 BY 1 || // low r to high r
|
||||
R1 = [P3];
|
||||
|
||||
// Assume add -Y'
|
||||
CC = R2 < 0; // But if AQ is set...
|
||||
IF CC R0 = P0; // then add Y' instead
|
||||
IF CC R1 = P1;
|
||||
|
||||
R6 = R6 + R0; // Rem += (Y' or -Y')
|
||||
CC = CARRY;
|
||||
R0 = CC;
|
||||
R7 = R7 + R1;
|
||||
R7 = R7 + R0 (NS) ||
|
||||
R1 = [SP];
|
||||
// Set the next AQ bit
|
||||
R1 = R7 ^ R1; // from Remainder and Y'
|
||||
R1 = R1 >> 31 || // Negate AQ's value, and
|
||||
[P5] = R1; // save next AQ
|
||||
BITTGL(R1, 0); // add neg AQ to the Div
|
||||
.LULEND: R4 = R4 + R1;
|
||||
|
||||
R6 = [SP + 16];
|
||||
|
||||
R0 = R4;
|
||||
R1 = R5;
|
||||
CC = BITTST(R6,30); // Just set CC=0
|
||||
R4 = ROT R0 BY 1; // but if we had to shift X,
|
||||
R5 = ROT R1 BY 1; // and didn't shift any bits out,
|
||||
CC = BITTST(R6,31); // then the result will be half as
|
||||
IF CC R0 = R4; // much as required, so shift left
|
||||
IF CC R1 = R5; // one space.
|
||||
|
||||
SP += 20;
|
||||
(R7:4, P5:3) = [SP++];
|
||||
RTS;
|
||||
|
||||
.Lpower_of_two:
|
||||
/* Y has a single bit set, which means it's a power of two.
|
||||
** That means we can perform the division just by shifting
|
||||
** X to the right the appropriate number of bits
|
||||
*/
|
||||
|
||||
/* signbits returns the number of sign bits, minus one.
|
||||
** 1=>30, 2=>29, ..., 0x40000000=>0. Which means we need
|
||||
** to shift right n-signbits spaces. It also means 0x80000000
|
||||
** is a special case, because that *also* gives a signbits of 0
|
||||
*/
|
||||
.Lpower_of_two_lower_zero:
|
||||
R7 = 0;
|
||||
R6 = R1 >> 31;
|
||||
CC = R3 < 0;
|
||||
IF CC JUMP .LRETURN_IDENT;
|
||||
|
||||
R2.L = SIGNBITS R3;
|
||||
R2 = R2.L (Z);
|
||||
R2 += -62;
|
||||
(R7:4, P5:3) = [SP++];
|
||||
JUMP ___lshftli;
|
||||
|
||||
.Lpower_of_two_upper_zero:
|
||||
CC = R2 < 0;
|
||||
IF CC JUMP .Lmaxint_shift;
|
||||
|
||||
R2.L = SIGNBITS R2;
|
||||
R2 = R2.L (Z);
|
||||
R2 += -30;
|
||||
(R7:4, P5:3) = [SP++];
|
||||
JUMP ___lshftli;
|
||||
|
||||
.Lmaxint_shift:
|
||||
R2 = -31;
|
||||
(R7:4, P5:3) = [SP++];
|
||||
JUMP ___lshftli;
|
||||
|
||||
.LRETURN_IDENT:
|
||||
R0 = R6;
|
||||
R1 = R7;
|
||||
.LRETURN_R0:
|
||||
(R7:4, P5:3) = [SP++];
|
||||
RTS;
|
||||
.LDIV_BY_ZERO:
|
||||
R0 = ~R2;
|
||||
R1 = R0;
|
||||
(R7:4, P5:3) = [SP++];
|
||||
RTS;
|
||||
|
||||
ENDPROC(___udivdi3)
|
||||
|
||||
|
||||
ENTRY(___lshftli)
|
||||
CC = R2 == 0;
|
||||
IF CC JUMP .Lfinished; // nothing to do
|
||||
CC = R2 < 0;
|
||||
IF CC JUMP .Lrshift;
|
||||
R3 = 64;
|
||||
CC = R2 < R3;
|
||||
IF !CC JUMP .Lretzero;
|
||||
|
||||
// We're shifting left, and it's less than 64 bits, so
|
||||
// a valid result will be returned.
|
||||
|
||||
R3 >>= 1; // R3 now 32
|
||||
CC = R2 < R3;
|
||||
|
||||
IF !CC JUMP .Lzerohalf;
|
||||
|
||||
// We're shifting left, between 1 and 31 bits, which means
|
||||
// some of the low half will be shifted into the high half.
|
||||
// Work out how much.
|
||||
|
||||
R3 = R3 - R2;
|
||||
|
||||
// Save that much data from the bottom half.
|
||||
|
||||
P1 = R7;
|
||||
R7 = R0;
|
||||
R7 >>= R3;
|
||||
|
||||
// Adjust both parts of the parameter.
|
||||
|
||||
R0 <<= R2;
|
||||
R1 <<= R2;
|
||||
|
||||
// And include the bits moved across.
|
||||
|
||||
R1 = R1 | R7;
|
||||
R7 = P1;
|
||||
RTS;
|
||||
|
||||
.Lzerohalf:
|
||||
// We're shifting left, between 32 and 63 bits, so the
|
||||
// bottom half will become zero, and the top half will
|
||||
// lose some bits. How many?
|
||||
|
||||
R2 = R2 - R3; // N - 32
|
||||
R1 = LSHIFT R0 BY R2.L;
|
||||
R0 = R0 - R0;
|
||||
RTS;
|
||||
|
||||
.Lretzero:
|
||||
R0 = R0 - R0;
|
||||
R1 = R0;
|
||||
.Lfinished:
|
||||
RTS;
|
||||
|
||||
.Lrshift:
|
||||
// We're shifting right, but by how much?
|
||||
R2 = -R2;
|
||||
R3 = 64;
|
||||
CC = R2 < R3;
|
||||
IF !CC JUMP .Lretzero;
|
||||
|
||||
// Shifting right less than 64 bits, so some result bits will
|
||||
// be retained.
|
||||
|
||||
R3 >>= 1; // R3 now 32
|
||||
CC = R2 < R3;
|
||||
IF !CC JUMP .Lsignhalf;
|
||||
|
||||
// Shifting right between 1 and 31 bits, so need to copy
|
||||
// data across words.
|
||||
|
||||
P1 = R7;
|
||||
R3 = R3 - R2;
|
||||
R7 = R1;
|
||||
R7 <<= R3;
|
||||
R1 >>= R2;
|
||||
R0 >>= R2;
|
||||
R0 = R7 | R0;
|
||||
R7 = P1;
|
||||
RTS;
|
||||
|
||||
.Lsignhalf:
|
||||
// Shifting right between 32 and 63 bits, so the top half
|
||||
// will become all zero-bits, and the bottom half is some
|
||||
// of the top half. But how much?
|
||||
|
||||
R2 = R2 - R3;
|
||||
R0 = R1;
|
||||
R0 >>= R2;
|
||||
R1 = 0;
|
||||
RTS;
|
||||
|
||||
ENDPROC(___lshftli)
|
|
@ -0,0 +1,251 @@
|
|||
if (BF52x)
|
||||
|
||||
menu "BF527 Specific Configuration"
|
||||
|
||||
comment "Alternative Multiplexing Scheme"
|
||||
|
||||
choice
|
||||
prompt "SPORT0"
|
||||
default BF527_SPORT0_PORTG
|
||||
help
|
||||
Select PORT used for SPORT0. See Hardware Reference Manual
|
||||
|
||||
config BF527_SPORT0_PORTF
|
||||
bool "PORT F"
|
||||
help
|
||||
PORT F
|
||||
|
||||
config BF527_SPORT0_PORTG
|
||||
bool "PORT G"
|
||||
help
|
||||
PORT G
|
||||
endchoice
|
||||
|
||||
choice
|
||||
prompt "SPORT0 TSCLK Location"
|
||||
depends on BF527_SPORT0_PORTG
|
||||
default BF527_SPORT0_TSCLK_PG10
|
||||
help
|
||||
Select PIN used for SPORT0_TSCLK. See Hardware Reference Manual
|
||||
|
||||
config BF527_SPORT0_TSCLK_PG10
|
||||
bool "PORT PG10"
|
||||
help
|
||||
PORT PG10
|
||||
|
||||
config BF527_SPORT0_TSCLK_PG14
|
||||
bool "PORT PG14"
|
||||
help
|
||||
PORT PG14
|
||||
endchoice
|
||||
|
||||
choice
|
||||
prompt "UART1"
|
||||
default BF527_UART1_PORTG
|
||||
help
|
||||
Select PORT used for UART1. See Hardware Reference Manual
|
||||
|
||||
config BF527_UART1_PORTF
|
||||
bool "PORT F"
|
||||
help
|
||||
PORT F
|
||||
|
||||
config BF527_UART1_PORTG
|
||||
bool "PORT G"
|
||||
help
|
||||
PORT G
|
||||
endchoice
|
||||
|
||||
choice
|
||||
prompt "NAND (NFC) Data"
|
||||
default BF527_NAND_D_PORTH
|
||||
help
|
||||
Select PORT used for NAND Data Bus. See Hardware Reference Manual
|
||||
|
||||
config BF527_NAND_D_PORTF
|
||||
bool "PORT F"
|
||||
help
|
||||
PORT F
|
||||
|
||||
config BF527_NAND_D_PORTH
|
||||
bool "PORT H"
|
||||
help
|
||||
PORT H
|
||||
endchoice
|
||||
|
||||
comment "Interrupt Priority Assignment"
|
||||
menu "Priority"
|
||||
|
||||
config IRQ_PLL_WAKEUP
|
||||
int "IRQ_PLL_WAKEUP"
|
||||
default 7
|
||||
config IRQ_DMA0_ERROR
|
||||
int "IRQ_DMA0_ERROR"
|
||||
default 7
|
||||
config IRQ_DMAR0_BLK
|
||||
int "IRQ_DMAR0_BLK"
|
||||
default 7
|
||||
config IRQ_DMAR1_BLK
|
||||
int "IRQ_DMAR1_BLK"
|
||||
default 7
|
||||
config IRQ_DMAR0_OVR
|
||||
int "IRQ_DMAR0_OVR"
|
||||
default 7
|
||||
config IRQ_DMAR1_OVR
|
||||
int "IRQ_DMAR1_OVR"
|
||||
default 7
|
||||
config IRQ_PPI_ERROR
|
||||
int "IRQ_PPI_ERROR"
|
||||
default 7
|
||||
config IRQ_MAC_ERROR
|
||||
int "IRQ_MAC_ERROR"
|
||||
default 7
|
||||
config IRQ_SPORT0_ERROR
|
||||
int "IRQ_SPORT0_ERROR"
|
||||
default 7
|
||||
config IRQ_SPORT1_ERROR
|
||||
int "IRQ_SPORT1_ERROR"
|
||||
default 7
|
||||
config IRQ_UART0_ERROR
|
||||
int "IRQ_UART0_ERROR"
|
||||
default 7
|
||||
config IRQ_UART1_ERROR
|
||||
int "IRQ_UART1_ERROR"
|
||||
default 7
|
||||
config IRQ_RTC
|
||||
int "IRQ_RTC"
|
||||
default 8
|
||||
config IRQ_PPI
|
||||
int "IRQ_PPI"
|
||||
default 8
|
||||
config IRQ_SPORT0_RX
|
||||
int "IRQ_SPORT0_RX"
|
||||
default 9
|
||||
config IRQ_SPORT0_TX
|
||||
int "IRQ_SPORT0_TX"
|
||||
default 9
|
||||
config IRQ_SPORT1_RX
|
||||
int "IRQ_SPORT1_RX"
|
||||
default 9
|
||||
config IRQ_SPORT1_TX
|
||||
int "IRQ_SPORT1_TX"
|
||||
default 9
|
||||
config IRQ_TWI
|
||||
int "IRQ_TWI"
|
||||
default 10
|
||||
config IRQ_SPI
|
||||
int "IRQ_SPI"
|
||||
default 10
|
||||
config IRQ_UART0_RX
|
||||
int "IRQ_UART0_RX"
|
||||
default 10
|
||||
config IRQ_UART0_TX
|
||||
int "IRQ_UART0_TX"
|
||||
default 10
|
||||
config IRQ_UART1_RX
|
||||
int "IRQ_UART1_RX"
|
||||
default 10
|
||||
config IRQ_UART1_TX
|
||||
int "IRQ_UART1_TX"
|
||||
default 10
|
||||
config IRQ_OPTSEC
|
||||
int "IRQ_OPTSEC"
|
||||
default 11
|
||||
config IRQ_CNT
|
||||
int "IRQ_CNT"
|
||||
default 11
|
||||
config IRQ_MAC_RX
|
||||
int "IRQ_MAC_RX"
|
||||
default 11
|
||||
config IRQ_PORTH_INTA
|
||||
int "IRQ_PORTH_INTA"
|
||||
default 11
|
||||
config IRQ_MAC_TX
|
||||
int "IRQ_MAC_TX/NFC"
|
||||
default 11
|
||||
config IRQ_PORTH_INTB
|
||||
int "IRQ_PORTH_INTB"
|
||||
default 11
|
||||
config IRQ_TMR0
|
||||
int "IRQ_TMR0"
|
||||
default 12
|
||||
config IRQ_TMR1
|
||||
int "IRQ_TMR1"
|
||||
default 12
|
||||
config IRQ_TMR2
|
||||
int "IRQ_TMR2"
|
||||
default 12
|
||||
config IRQ_TMR3
|
||||
int "IRQ_TMR3"
|
||||
default 12
|
||||
config IRQ_TMR4
|
||||
int "IRQ_TMR4"
|
||||
default 12
|
||||
config IRQ_TMR5
|
||||
int "IRQ_TMR5"
|
||||
default 12
|
||||
config IRQ_TMR6
|
||||
int "IRQ_TMR6"
|
||||
default 12
|
||||
config IRQ_TMR7
|
||||
int "IRQ_TMR7"
|
||||
default 12
|
||||
config IRQ_PORTG_INTA
|
||||
int "IRQ_PORTG_INTA"
|
||||
default 12
|
||||
config IRQ_PORTG_INTB
|
||||
int "IRQ_PORTG_INTB"
|
||||
default 12
|
||||
config IRQ_MEM_DMA0
|
||||
int "IRQ_MEM_DMA0"
|
||||
default 13
|
||||
config IRQ_MEM_DMA1
|
||||
int "IRQ_MEM_DMA1"
|
||||
default 13
|
||||
config IRQ_WATCH
|
||||
int "IRQ_WATCH"
|
||||
default 13
|
||||
config IRQ_PORTF_INTA
|
||||
int "IRQ_PORTF_INTA"
|
||||
default 13
|
||||
config IRQ_PORTF_INTB
|
||||
int "IRQ_PORTF_INTB"
|
||||
default 13
|
||||
config IRQ_SPI_ERROR
|
||||
int "IRQ_SPI_ERROR"
|
||||
default 7
|
||||
config IRQ_NFC_ERROR
|
||||
int "IRQ_NFC_ERROR"
|
||||
default 7
|
||||
config IRQ_HDMA_ERROR
|
||||
int "IRQ_HDMA_ERROR"
|
||||
default 7
|
||||
config IRQ_HDMA
|
||||
int "IRQ_HDMA"
|
||||
default 7
|
||||
config IRQ_USB_EINT
|
||||
int "IRQ_USB_EINT"
|
||||
default 10
|
||||
config IRQ_USB_INT0
|
||||
int "IRQ_USB_INT0"
|
||||
default 10
|
||||
config IRQ_USB_INT1
|
||||
int "IRQ_USB_INT1"
|
||||
default 10
|
||||
config IRQ_USB_INT2
|
||||
int "IRQ_USB_INT2"
|
||||
default 10
|
||||
config IRQ_USB_DMA
|
||||
int "IRQ_USB_DMA"
|
||||
default 10
|
||||
|
||||
help
|
||||
Enter the priority numbers between 7-13 ONLY. Others are Reserved.
|
||||
This applies to all the above. It is not recommended to assign the
|
||||
highest priority number 7 to UART or any other device.
|
||||
|
||||
endmenu
|
||||
|
||||
endmenu
|
||||
|
||||
endif
|
|
@ -0,0 +1,9 @@
|
|||
#
|
||||
# arch/blackfin/mach-bf527/Makefile
|
||||
#
|
||||
|
||||
extra-y := head.o
|
||||
|
||||
obj-y := ints-priority.o dma.o
|
||||
|
||||
obj-$(CONFIG_CPU_FREQ) += cpu.o
|
|
@ -0,0 +1,7 @@
|
|||
#
|
||||
# arch/blackfin/mach-bf532/boards/Makefile
|
||||
#
|
||||
|
||||
obj-y += eth_mac.o
|
||||
obj-$(CONFIG_BFIN527_EZKIT) += ezkit.o
|
||||
|
|
@ -0,0 +1,50 @@
|
|||
/*
|
||||
* arch/blackfin/mach-bf537/board/eth_mac.c
|
||||
*
|
||||
* Copyright (C) 2007 Analog Devices, Inc.
|
||||
*
|
||||
* 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
|
||||
*/
|
||||
#include <linux/module.h>
|
||||
#include <asm/blackfin.h>
|
||||
|
||||
#if defined(CONFIG_GENERIC_BOARD) || defined(CONFIG_BFIN537_STAMP)
|
||||
|
||||
/*
|
||||
* Currently the MAC address is saved in Flash by U-Boot
|
||||
*/
|
||||
#define FLASH_MAC 0x203f0000
|
||||
|
||||
void get_bf537_ether_addr(char *addr)
|
||||
{
|
||||
unsigned int flash_mac = (unsigned int) FLASH_MAC;
|
||||
*(u32 *)(&(addr[0])) = bfin_read32(flash_mac);
|
||||
flash_mac += 4;
|
||||
*(u16 *)(&(addr[4])) = bfin_read16(flash_mac);
|
||||
}
|
||||
|
||||
#else
|
||||
|
||||
/*
|
||||
* Provide MAC address function for other specific board setting
|
||||
*/
|
||||
void get_bf537_ether_addr(char *addr)
|
||||
{
|
||||
printk(KERN_WARNING "%s: No valid Ethernet MAC address found\n", __FILE__);
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
EXPORT_SYMBOL(get_bf537_ether_addr);
|
|
@ -0,0 +1,737 @@
|
|||
/*
|
||||
* File: arch/blackfin/mach-bf527/boards/ezkit.c
|
||||
* Based on: arch/blackfin/mach-bf537/boards/stamp.c
|
||||
* Author: Aidan Williams <aidan@nicta.com.au>
|
||||
*
|
||||
* Created:
|
||||
* Description:
|
||||
*
|
||||
* Modified:
|
||||
* Copyright 2005 National ICT Australia (NICTA)
|
||||
* Copyright 2004-2007 Analog Devices Inc.
|
||||
*
|
||||
* Bugs: Enter bugs at http://blackfin.uclinux.org/
|
||||
*
|
||||
* 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, see the file COPYING, or write
|
||||
* to the Free Software Foundation, Inc.,
|
||||
* 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
*/
|
||||
|
||||
#include <linux/device.h>
|
||||
#include <linux/platform_device.h>
|
||||
#include <linux/mtd/mtd.h>
|
||||
#include <linux/mtd/partitions.h>
|
||||
#include <linux/spi/spi.h>
|
||||
#include <linux/spi/flash.h>
|
||||
#if defined(CONFIG_USB_ISP1362_HCD) || defined(CONFIG_USB_ISP1362_HCD_MODULE)
|
||||
#include <linux/usb_isp1362.h>
|
||||
#endif
|
||||
#include <linux/pata_platform.h>
|
||||
#include <linux/irq.h>
|
||||
#include <linux/interrupt.h>
|
||||
#include <linux/usb_sl811.h>
|
||||
#include <asm/dma.h>
|
||||
#include <asm/bfin5xx_spi.h>
|
||||
#include <asm/reboot.h>
|
||||
#include <linux/spi/ad7877.h>
|
||||
|
||||
/*
|
||||
* Name the Board for the /proc/cpuinfo
|
||||
*/
|
||||
const char bfin_board_name[] = "ADDS-BF527-EZKIT";
|
||||
|
||||
/*
|
||||
* Driver needs to know address, irq and flag pin.
|
||||
*/
|
||||
|
||||
#define ISP1761_BASE 0x203C0000
|
||||
#define ISP1761_IRQ IRQ_PF7
|
||||
|
||||
#if defined(CONFIG_USB_ISP1760_HCD) || defined(CONFIG_USB_ISP1760_HCD_MODULE)
|
||||
static struct resource bfin_isp1761_resources[] = {
|
||||
[0] = {
|
||||
.name = "isp1761-regs",
|
||||
.start = ISP1761_BASE + 0x00000000,
|
||||
.end = ISP1761_BASE + 0x000fffff,
|
||||
.flags = IORESOURCE_MEM,
|
||||
},
|
||||
[1] = {
|
||||
.start = ISP1761_IRQ,
|
||||
.end = ISP1761_IRQ,
|
||||
.flags = IORESOURCE_IRQ,
|
||||
},
|
||||
};
|
||||
|
||||
static struct platform_device bfin_isp1761_device = {
|
||||
.name = "isp1761",
|
||||
.id = 0,
|
||||
.num_resources = ARRAY_SIZE(bfin_isp1761_resources),
|
||||
.resource = bfin_isp1761_resources,
|
||||
};
|
||||
|
||||
static struct platform_device *bfin_isp1761_devices[] = {
|
||||
&bfin_isp1761_device,
|
||||
};
|
||||
|
||||
int __init bfin_isp1761_init(void)
|
||||
{
|
||||
unsigned int num_devices = ARRAY_SIZE(bfin_isp1761_devices);
|
||||
|
||||
printk(KERN_INFO "%s(): registering device resources\n", __FUNCTION__);
|
||||
set_irq_type(ISP1761_IRQ, IRQF_TRIGGER_FALLING);
|
||||
|
||||
return platform_add_devices(bfin_isp1761_devices, num_devices);
|
||||
}
|
||||
|
||||
void __exit bfin_isp1761_exit(void)
|
||||
{
|
||||
platform_device_unregister(&bfin_isp1761_device);
|
||||
}
|
||||
|
||||
arch_initcall(bfin_isp1761_init);
|
||||
#endif
|
||||
|
||||
#if defined(CONFIG_BFIN_CFPCMCIA) || defined(CONFIG_BFIN_CFPCMCIA_MODULE)
|
||||
static struct resource bfin_pcmcia_cf_resources[] = {
|
||||
{
|
||||
.start = 0x20310000, /* IO PORT */
|
||||
.end = 0x20312000,
|
||||
.flags = IORESOURCE_MEM,
|
||||
}, {
|
||||
.start = 0x20311000, /* Attribute Memory */
|
||||
.end = 0x20311FFF,
|
||||
.flags = IORESOURCE_MEM,
|
||||
}, {
|
||||
.start = IRQ_PF4,
|
||||
.end = IRQ_PF4,
|
||||
.flags = IORESOURCE_IRQ | IORESOURCE_IRQ_LOWLEVEL,
|
||||
}, {
|
||||
.start = 6, /* Card Detect PF6 */
|
||||
.end = 6,
|
||||
.flags = IORESOURCE_IRQ,
|
||||
},
|
||||
};
|
||||
|
||||
static struct platform_device bfin_pcmcia_cf_device = {
|
||||
.name = "bfin_cf_pcmcia",
|
||||
.id = -1,
|
||||
.num_resources = ARRAY_SIZE(bfin_pcmcia_cf_resources),
|
||||
.resource = bfin_pcmcia_cf_resources,
|
||||
};
|
||||
#endif
|
||||
|
||||
#if defined(CONFIG_RTC_DRV_BFIN) || defined(CONFIG_RTC_DRV_BFIN_MODULE)
|
||||
static struct platform_device rtc_device = {
|
||||
.name = "rtc-bfin",
|
||||
.id = -1,
|
||||
};
|
||||
#endif
|
||||
|
||||
#if defined(CONFIG_SMC91X) || defined(CONFIG_SMC91X_MODULE)
|
||||
static struct resource smc91x_resources[] = {
|
||||
{
|
||||
.name = "smc91x-regs",
|
||||
.start = 0x20300300,
|
||||
.end = 0x20300300 + 16,
|
||||
.flags = IORESOURCE_MEM,
|
||||
}, {
|
||||
|
||||
.start = IRQ_PF7,
|
||||
.end = IRQ_PF7,
|
||||
.flags = IORESOURCE_IRQ | IORESOURCE_IRQ_HIGHLEVEL,
|
||||
},
|
||||
};
|
||||
static struct platform_device smc91x_device = {
|
||||
.name = "smc91x",
|
||||
.id = 0,
|
||||
.num_resources = ARRAY_SIZE(smc91x_resources),
|
||||
.resource = smc91x_resources,
|
||||
};
|
||||
#endif
|
||||
|
||||
#if defined(CONFIG_DM9000) || defined(CONFIG_DM9000_MODULE)
|
||||
static struct resource dm9000_resources[] = {
|
||||
[0] = {
|
||||
.start = 0x203FB800,
|
||||
.end = 0x203FB800 + 8,
|
||||
.flags = IORESOURCE_MEM,
|
||||
},
|
||||
[1] = {
|
||||
.start = IRQ_PF9,
|
||||
.end = IRQ_PF9,
|
||||
.flags = (IORESOURCE_IRQ | IORESOURCE_IRQ_HIGHEDGE),
|
||||
},
|
||||
};
|
||||
|
||||
static struct platform_device dm9000_device = {
|
||||
.name = "dm9000",
|
||||
.id = -1,
|
||||
.num_resources = ARRAY_SIZE(dm9000_resources),
|
||||
.resource = dm9000_resources,
|
||||
};
|
||||
#endif
|
||||
|
||||
#if defined(CONFIG_USB_SL811_HCD) || defined(CONFIG_USB_SL811_HCD_MODULE)
|
||||
static struct resource sl811_hcd_resources[] = {
|
||||
{
|
||||
.start = 0x20340000,
|
||||
.end = 0x20340000,
|
||||
.flags = IORESOURCE_MEM,
|
||||
}, {
|
||||
.start = 0x20340004,
|
||||
.end = 0x20340004,
|
||||
.flags = IORESOURCE_MEM,
|
||||
}, {
|
||||
.start = CONFIG_USB_SL811_BFIN_IRQ,
|
||||
.end = CONFIG_USB_SL811_BFIN_IRQ,
|
||||
.flags = IORESOURCE_IRQ | IORESOURCE_IRQ_HIGHLEVEL,
|
||||
},
|
||||
};
|
||||
|
||||
#if defined(CONFIG_USB_SL811_BFIN_USE_VBUS)
|
||||
void sl811_port_power(struct device *dev, int is_on)
|
||||
{
|
||||
gpio_request(CONFIG_USB_SL811_BFIN_GPIO_VBUS, "usb:SL811_VBUS");
|
||||
gpio_direction_output(CONFIG_USB_SL811_BFIN_GPIO_VBUS);
|
||||
|
||||
if (is_on)
|
||||
gpio_set_value(CONFIG_USB_SL811_BFIN_GPIO_VBUS, 1);
|
||||
else
|
||||
gpio_set_value(CONFIG_USB_SL811_BFIN_GPIO_VBUS, 0);
|
||||
}
|
||||
#endif
|
||||
|
||||
static struct sl811_platform_data sl811_priv = {
|
||||
.potpg = 10,
|
||||
.power = 250, /* == 500mA */
|
||||
#if defined(CONFIG_USB_SL811_BFIN_USE_VBUS)
|
||||
.port_power = &sl811_port_power,
|
||||
#endif
|
||||
};
|
||||
|
||||
static struct platform_device sl811_hcd_device = {
|
||||
.name = "sl811-hcd",
|
||||
.id = 0,
|
||||
.dev = {
|
||||
.platform_data = &sl811_priv,
|
||||
},
|
||||
.num_resources = ARRAY_SIZE(sl811_hcd_resources),
|
||||
.resource = sl811_hcd_resources,
|
||||
};
|
||||
#endif
|
||||
|
||||
#if defined(CONFIG_USB_ISP1362_HCD) || defined(CONFIG_USB_ISP1362_HCD_MODULE)
|
||||
static struct resource isp1362_hcd_resources[] = {
|
||||
{
|
||||
.start = 0x20360000,
|
||||
.end = 0x20360000,
|
||||
.flags = IORESOURCE_MEM,
|
||||
}, {
|
||||
.start = 0x20360004,
|
||||
.end = 0x20360004,
|
||||
.flags = IORESOURCE_MEM,
|
||||
}, {
|
||||
.start = CONFIG_USB_ISP1362_BFIN_GPIO_IRQ,
|
||||
.end = CONFIG_USB_ISP1362_BFIN_GPIO_IRQ,
|
||||
.flags = IORESOURCE_IRQ | IORESOURCE_IRQ_HIGHLEVEL,
|
||||
},
|
||||
};
|
||||
|
||||
static struct isp1362_platform_data isp1362_priv = {
|
||||
.sel15Kres = 1,
|
||||
.clknotstop = 0,
|
||||
.oc_enable = 0,
|
||||
.int_act_high = 0,
|
||||
.int_edge_triggered = 0,
|
||||
.remote_wakeup_connected = 0,
|
||||
.no_power_switching = 1,
|
||||
.power_switching_mode = 0,
|
||||
};
|
||||
|
||||
static struct platform_device isp1362_hcd_device = {
|
||||
.name = "isp1362-hcd",
|
||||
.id = 0,
|
||||
.dev = {
|
||||
.platform_data = &isp1362_priv,
|
||||
},
|
||||
.num_resources = ARRAY_SIZE(isp1362_hcd_resources),
|
||||
.resource = isp1362_hcd_resources,
|
||||
};
|
||||
#endif
|
||||
|
||||
#if defined(CONFIG_BFIN_MAC) || defined(CONFIG_BFIN_MAC_MODULE)
|
||||
static struct platform_device bfin_mac_device = {
|
||||
.name = "bfin_mac",
|
||||
};
|
||||
#endif
|
||||
|
||||
#if defined(CONFIG_USB_NET2272) || defined(CONFIG_USB_NET2272_MODULE)
|
||||
static struct resource net2272_bfin_resources[] = {
|
||||
{
|
||||
.start = 0x20300000,
|
||||
.end = 0x20300000 + 0x100,
|
||||
.flags = IORESOURCE_MEM,
|
||||
}, {
|
||||
.start = IRQ_PF7,
|
||||
.end = IRQ_PF7,
|
||||
.flags = IORESOURCE_IRQ | IORESOURCE_IRQ_HIGHLEVEL,
|
||||
},
|
||||
};
|
||||
|
||||
static struct platform_device net2272_bfin_device = {
|
||||
.name = "net2272",
|
||||
.id = -1,
|
||||
.num_resources = ARRAY_SIZE(net2272_bfin_resources),
|
||||
.resource = net2272_bfin_resources,
|
||||
};
|
||||
#endif
|
||||
|
||||
#if defined(CONFIG_SPI_BFIN) || defined(CONFIG_SPI_BFIN_MODULE)
|
||||
/* all SPI peripherals info goes here */
|
||||
|
||||
#if defined(CONFIG_MTD_M25P80) \
|
||||
|| defined(CONFIG_MTD_M25P80_MODULE)
|
||||
static struct mtd_partition bfin_spi_flash_partitions[] = {
|
||||
{
|
||||
.name = "bootloader",
|
||||
.size = 0x00020000,
|
||||
.offset = 0,
|
||||
.mask_flags = MTD_CAP_ROM
|
||||
}, {
|
||||
.name = "kernel",
|
||||
.size = 0xe0000,
|
||||
.offset = 0x20000
|
||||
}, {
|
||||
.name = "file system",
|
||||
.size = 0x700000,
|
||||
.offset = 0x00100000,
|
||||
}
|
||||
};
|
||||
|
||||
static struct flash_platform_data bfin_spi_flash_data = {
|
||||
.name = "m25p80",
|
||||
.parts = bfin_spi_flash_partitions,
|
||||
.nr_parts = ARRAY_SIZE(bfin_spi_flash_partitions),
|
||||
.type = "m25p64",
|
||||
};
|
||||
|
||||
/* SPI flash chip (m25p64) */
|
||||
static struct bfin5xx_spi_chip spi_flash_chip_info = {
|
||||
.enable_dma = 0, /* use dma transfer with this chip*/
|
||||
.bits_per_word = 8,
|
||||
};
|
||||
#endif
|
||||
|
||||
#if defined(CONFIG_SPI_ADC_BF533) \
|
||||
|| defined(CONFIG_SPI_ADC_BF533_MODULE)
|
||||
/* SPI ADC chip */
|
||||
static struct bfin5xx_spi_chip spi_adc_chip_info = {
|
||||
.enable_dma = 1, /* use dma transfer with this chip*/
|
||||
.bits_per_word = 16,
|
||||
};
|
||||
#endif
|
||||
|
||||
#if defined(CONFIG_SND_BLACKFIN_AD1836) \
|
||||
|| defined(CONFIG_SND_BLACKFIN_AD1836_MODULE)
|
||||
static struct bfin5xx_spi_chip ad1836_spi_chip_info = {
|
||||
.enable_dma = 0,
|
||||
.bits_per_word = 16,
|
||||
};
|
||||
#endif
|
||||
|
||||
#if defined(CONFIG_AD9960) || defined(CONFIG_AD9960_MODULE)
|
||||
static struct bfin5xx_spi_chip ad9960_spi_chip_info = {
|
||||
.enable_dma = 0,
|
||||
.bits_per_word = 16,
|
||||
};
|
||||
#endif
|
||||
|
||||
#if defined(CONFIG_SPI_MMC) || defined(CONFIG_SPI_MMC_MODULE)
|
||||
static struct bfin5xx_spi_chip spi_mmc_chip_info = {
|
||||
.enable_dma = 1,
|
||||
.bits_per_word = 8,
|
||||
};
|
||||
#endif
|
||||
|
||||
#if defined(CONFIG_PBX)
|
||||
static struct bfin5xx_spi_chip spi_si3xxx_chip_info = {
|
||||
.ctl_reg = 0x4, /* send zero */
|
||||
.enable_dma = 0,
|
||||
.bits_per_word = 8,
|
||||
.cs_change_per_word = 1,
|
||||
};
|
||||
#endif
|
||||
|
||||
#if defined(CONFIG_AD5304) || defined(CONFIG_AD5304_MODULE)
|
||||
static struct bfin5xx_spi_chip ad5304_chip_info = {
|
||||
.enable_dma = 0,
|
||||
.bits_per_word = 16,
|
||||
};
|
||||
#endif
|
||||
|
||||
#if defined(CONFIG_TOUCHSCREEN_AD7877) || defined(CONFIG_TOUCHSCREEN_AD7877_MODULE)
|
||||
static struct bfin5xx_spi_chip spi_ad7877_chip_info = {
|
||||
.enable_dma = 0,
|
||||
.bits_per_word = 16,
|
||||
};
|
||||
|
||||
static const struct ad7877_platform_data bfin_ad7877_ts_info = {
|
||||
.model = 7877,
|
||||
.vref_delay_usecs = 50, /* internal, no capacitor */
|
||||
.x_plate_ohms = 419,
|
||||
.y_plate_ohms = 486,
|
||||
.pressure_max = 1000,
|
||||
.pressure_min = 0,
|
||||
.stopacq_polarity = 1,
|
||||
.first_conversion_delay = 3,
|
||||
.acquisition_time = 1,
|
||||
.averaging = 1,
|
||||
.pen_down_acc_interval = 1,
|
||||
};
|
||||
#endif
|
||||
|
||||
static struct spi_board_info bfin_spi_board_info[] __initdata = {
|
||||
#if defined(CONFIG_MTD_M25P80) \
|
||||
|| defined(CONFIG_MTD_M25P80_MODULE)
|
||||
{
|
||||
/* the modalias must be the same as spi device driver name */
|
||||
.modalias = "m25p80", /* Name of spi_driver for this device */
|
||||
.max_speed_hz = 25000000, /* max spi clock (SCK) speed in HZ */
|
||||
.bus_num = 0, /* Framework bus number */
|
||||
.chip_select = 1, /* Framework chip select. On STAMP537 it is SPISSEL1*/
|
||||
.platform_data = &bfin_spi_flash_data,
|
||||
.controller_data = &spi_flash_chip_info,
|
||||
.mode = SPI_MODE_3,
|
||||
},
|
||||
#endif
|
||||
|
||||
#if defined(CONFIG_SPI_ADC_BF533) \
|
||||
|| defined(CONFIG_SPI_ADC_BF533_MODULE)
|
||||
{
|
||||
.modalias = "bfin_spi_adc", /* Name of spi_driver for this device */
|
||||
.max_speed_hz = 6250000, /* max spi clock (SCK) speed in HZ */
|
||||
.bus_num = 0, /* Framework bus number */
|
||||
.chip_select = 1, /* Framework chip select. */
|
||||
.platform_data = NULL, /* No spi_driver specific config */
|
||||
.controller_data = &spi_adc_chip_info,
|
||||
},
|
||||
#endif
|
||||
|
||||
#if defined(CONFIG_SND_BLACKFIN_AD1836) \
|
||||
|| defined(CONFIG_SND_BLACKFIN_AD1836_MODULE)
|
||||
{
|
||||
.modalias = "ad1836-spi",
|
||||
.max_speed_hz = 3125000, /* max spi clock (SCK) speed in HZ */
|
||||
.bus_num = 0,
|
||||
.chip_select = CONFIG_SND_BLACKFIN_SPI_PFBIT,
|
||||
.controller_data = &ad1836_spi_chip_info,
|
||||
},
|
||||
#endif
|
||||
#if defined(CONFIG_AD9960) || defined(CONFIG_AD9960_MODULE)
|
||||
{
|
||||
.modalias = "ad9960-spi",
|
||||
.max_speed_hz = 10000000, /* max spi clock (SCK) speed in HZ */
|
||||
.bus_num = 0,
|
||||
.chip_select = 1,
|
||||
.controller_data = &ad9960_spi_chip_info,
|
||||
},
|
||||
#endif
|
||||
#if defined(CONFIG_SPI_MMC) || defined(CONFIG_SPI_MMC_MODULE)
|
||||
{
|
||||
.modalias = "spi_mmc_dummy",
|
||||
.max_speed_hz = 25000000, /* max spi clock (SCK) speed in HZ */
|
||||
.bus_num = 0,
|
||||
.chip_select = 0,
|
||||
.platform_data = NULL,
|
||||
.controller_data = &spi_mmc_chip_info,
|
||||
.mode = SPI_MODE_3,
|
||||
},
|
||||
{
|
||||
.modalias = "spi_mmc",
|
||||
.max_speed_hz = 25000000, /* max spi clock (SCK) speed in HZ */
|
||||
.bus_num = 0,
|
||||
.chip_select = CONFIG_SPI_MMC_CS_CHAN,
|
||||
.platform_data = NULL,
|
||||
.controller_data = &spi_mmc_chip_info,
|
||||
.mode = SPI_MODE_3,
|
||||
},
|
||||
#endif
|
||||
#if defined(CONFIG_PBX)
|
||||
{
|
||||
.modalias = "fxs-spi",
|
||||
.max_speed_hz = 12500000, /* max spi clock (SCK) speed in HZ */
|
||||
.bus_num = 0,
|
||||
.chip_select = 8 - CONFIG_J11_JUMPER,
|
||||
.controller_data = &spi_si3xxx_chip_info,
|
||||
.mode = SPI_MODE_3,
|
||||
},
|
||||
{
|
||||
.modalias = "fxo-spi",
|
||||
.max_speed_hz = 12500000, /* max spi clock (SCK) speed in HZ */
|
||||
.bus_num = 0,
|
||||
.chip_select = 8 - CONFIG_J19_JUMPER,
|
||||
.controller_data = &spi_si3xxx_chip_info,
|
||||
.mode = SPI_MODE_3,
|
||||
},
|
||||
#endif
|
||||
#if defined(CONFIG_AD5304) || defined(CONFIG_AD5304_MODULE)
|
||||
{
|
||||
.modalias = "ad5304_spi",
|
||||
.max_speed_hz = 1250000, /* max spi clock (SCK) speed in HZ */
|
||||
.bus_num = 0,
|
||||
.chip_select = 2,
|
||||
.platform_data = NULL,
|
||||
.controller_data = &ad5304_chip_info,
|
||||
.mode = SPI_MODE_2,
|
||||
},
|
||||
#endif
|
||||
#if defined(CONFIG_TOUCHSCREEN_AD7877) || defined(CONFIG_TOUCHSCREEN_AD7877_MODULE)
|
||||
{
|
||||
.modalias = "ad7877",
|
||||
.platform_data = &bfin_ad7877_ts_info,
|
||||
.irq = IRQ_PF6,
|
||||
.max_speed_hz = 12500000, /* max spi clock (SCK) speed in HZ */
|
||||
.bus_num = 1,
|
||||
.chip_select = 1,
|
||||
.controller_data = &spi_ad7877_chip_info,
|
||||
},
|
||||
#endif
|
||||
};
|
||||
|
||||
/* SPI controller data */
|
||||
static struct bfin5xx_spi_master bfin_spi0_info = {
|
||||
.num_chipselect = 8,
|
||||
.enable_dma = 1, /* master has the ability to do dma transfer */
|
||||
};
|
||||
|
||||
/* SPI (0) */
|
||||
static struct resource bfin_spi0_resource[] = {
|
||||
[0] = {
|
||||
.start = SPI0_REGBASE,
|
||||
.end = SPI0_REGBASE + 0xFF,
|
||||
.flags = IORESOURCE_MEM,
|
||||
},
|
||||
[1] = {
|
||||
.start = CH_SPI,
|
||||
.end = CH_SPI,
|
||||
.flags = IORESOURCE_IRQ,
|
||||
},
|
||||
};
|
||||
|
||||
static struct platform_device bfin_spi0_device = {
|
||||
.name = "bfin-spi",
|
||||
.id = 0, /* Bus number */
|
||||
.num_resources = ARRAY_SIZE(bfin_spi0_resource),
|
||||
.resource = bfin_spi0_resource,
|
||||
.dev = {
|
||||
.platform_data = &bfin_spi0_info, /* Passed to driver */
|
||||
},
|
||||
};
|
||||
#endif /* spi master and devices */
|
||||
|
||||
#if defined(CONFIG_FB_BF537_LQ035) || defined(CONFIG_FB_BF537_LQ035_MODULE)
|
||||
static struct platform_device bfin_fb_device = {
|
||||
.name = "bf537-lq035",
|
||||
};
|
||||
#endif
|
||||
|
||||
#if defined(CONFIG_FB_BFIN_7393) || defined(CONFIG_FB_BFIN_7393_MODULE)
|
||||
static struct platform_device bfin_fb_adv7393_device = {
|
||||
.name = "bfin-adv7393",
|
||||
};
|
||||
#endif
|
||||
|
||||
#if defined(CONFIG_SERIAL_BFIN) || defined(CONFIG_SERIAL_BFIN_MODULE)
|
||||
static struct resource bfin_uart_resources[] = {
|
||||
#ifdef CONFIG_SERIAL_BFIN_UART0
|
||||
{
|
||||
.start = 0xFFC00400,
|
||||
.end = 0xFFC004FF,
|
||||
.flags = IORESOURCE_MEM,
|
||||
},
|
||||
#endif
|
||||
#ifdef CONFIG_SERIAL_BFIN_UART1
|
||||
{
|
||||
.start = 0xFFC02000,
|
||||
.end = 0xFFC020FF,
|
||||
.flags = IORESOURCE_MEM,
|
||||
},
|
||||
#endif
|
||||
};
|
||||
|
||||
static struct platform_device bfin_uart_device = {
|
||||
.name = "bfin-uart",
|
||||
.id = 1,
|
||||
.num_resources = ARRAY_SIZE(bfin_uart_resources),
|
||||
.resource = bfin_uart_resources,
|
||||
};
|
||||
#endif
|
||||
|
||||
#if defined(CONFIG_I2C_BLACKFIN_TWI) || defined(CONFIG_I2C_BLACKFIN_TWI_MODULE)
|
||||
static struct resource bfin_twi0_resource[] = {
|
||||
[0] = {
|
||||
.start = TWI0_REGBASE,
|
||||
.end = TWI0_REGBASE,
|
||||
.flags = IORESOURCE_MEM,
|
||||
},
|
||||
[1] = {
|
||||
.start = IRQ_TWI,
|
||||
.end = IRQ_TWI,
|
||||
.flags = IORESOURCE_IRQ,
|
||||
},
|
||||
};
|
||||
|
||||
static struct platform_device i2c_bfin_twi_device = {
|
||||
.name = "i2c-bfin-twi",
|
||||
.id = 0,
|
||||
.num_resources = ARRAY_SIZE(bfin_twi0_resource),
|
||||
.resource = bfin_twi0_resource,
|
||||
};
|
||||
#endif
|
||||
|
||||
#if defined(CONFIG_SERIAL_BFIN_SPORT) || defined(CONFIG_SERIAL_BFIN_SPORT_MODULE)
|
||||
static struct platform_device bfin_sport0_uart_device = {
|
||||
.name = "bfin-sport-uart",
|
||||
.id = 0,
|
||||
};
|
||||
|
||||
static struct platform_device bfin_sport1_uart_device = {
|
||||
.name = "bfin-sport-uart",
|
||||
.id = 1,
|
||||
};
|
||||
#endif
|
||||
|
||||
#if defined(CONFIG_PATA_PLATFORM) || defined(CONFIG_PATA_PLATFORM_MODULE)
|
||||
#define PATA_INT 55
|
||||
|
||||
static struct pata_platform_info bfin_pata_platform_data = {
|
||||
.ioport_shift = 1,
|
||||
.irq_type = IRQF_TRIGGER_HIGH | IRQF_DISABLED,
|
||||
};
|
||||
|
||||
static struct resource bfin_pata_resources[] = {
|
||||
{
|
||||
.start = 0x20314020,
|
||||
.end = 0x2031403F,
|
||||
.flags = IORESOURCE_MEM,
|
||||
},
|
||||
{
|
||||
.start = 0x2031401C,
|
||||
.end = 0x2031401F,
|
||||
.flags = IORESOURCE_MEM,
|
||||
},
|
||||
{
|
||||
.start = PATA_INT,
|
||||
.end = PATA_INT,
|
||||
.flags = IORESOURCE_IRQ,
|
||||
},
|
||||
};
|
||||
|
||||
static struct platform_device bfin_pata_device = {
|
||||
.name = "pata_platform",
|
||||
.id = -1,
|
||||
.num_resources = ARRAY_SIZE(bfin_pata_resources),
|
||||
.resource = bfin_pata_resources,
|
||||
.dev = {
|
||||
.platform_data = &bfin_pata_platform_data,
|
||||
}
|
||||
};
|
||||
#endif
|
||||
|
||||
static struct platform_device *stamp_devices[] __initdata = {
|
||||
#if defined(CONFIG_BFIN_CFPCMCIA) || defined(CONFIG_BFIN_CFPCMCIA_MODULE)
|
||||
&bfin_pcmcia_cf_device,
|
||||
#endif
|
||||
|
||||
#if defined(CONFIG_RTC_DRV_BFIN) || defined(CONFIG_RTC_DRV_BFIN_MODULE)
|
||||
&rtc_device,
|
||||
#endif
|
||||
|
||||
#if defined(CONFIG_USB_SL811_HCD) || defined(CONFIG_USB_SL811_HCD_MODULE)
|
||||
&sl811_hcd_device,
|
||||
#endif
|
||||
|
||||
#if defined(CONFIG_USB_ISP1362_HCD) || defined(CONFIG_USB_ISP1362_HCD_MODULE)
|
||||
&isp1362_hcd_device,
|
||||
#endif
|
||||
|
||||
#if defined(CONFIG_SMC91X) || defined(CONFIG_SMC91X_MODULE)
|
||||
&smc91x_device,
|
||||
#endif
|
||||
|
||||
#if defined(CONFIG_DM9000) || defined(CONFIG_DM9000_MODULE)
|
||||
&dm9000_device,
|
||||
#endif
|
||||
|
||||
#if defined(CONFIG_BFIN_MAC) || defined(CONFIG_BFIN_MAC_MODULE)
|
||||
&bfin_mac_device,
|
||||
#endif
|
||||
|
||||
#if defined(CONFIG_USB_NET2272) || defined(CONFIG_USB_NET2272_MODULE)
|
||||
&net2272_bfin_device,
|
||||
#endif
|
||||
|
||||
#if defined(CONFIG_SPI_BFIN) || defined(CONFIG_SPI_BFIN_MODULE)
|
||||
&bfin_spi0_device,
|
||||
#endif
|
||||
|
||||
#if defined(CONFIG_FB_BF537_LQ035) || defined(CONFIG_FB_BF537_LQ035_MODULE)
|
||||
&bfin_fb_device,
|
||||
#endif
|
||||
|
||||
#if defined(CONFIG_FB_BFIN_7393) || defined(CONFIG_FB_BFIN_7393_MODULE)
|
||||
&bfin_fb_adv7393_device,
|
||||
#endif
|
||||
|
||||
#if defined(CONFIG_SERIAL_BFIN) || defined(CONFIG_SERIAL_BFIN_MODULE)
|
||||
&bfin_uart_device,
|
||||
#endif
|
||||
|
||||
#if defined(CONFIG_I2C_BLACKFIN_TWI) || defined(CONFIG_I2C_BLACKFIN_TWI_MODULE)
|
||||
&i2c_bfin_twi_device,
|
||||
#endif
|
||||
|
||||
#if defined(CONFIG_SERIAL_BFIN_SPORT) || defined(CONFIG_SERIAL_BFIN_SPORT_MODULE)
|
||||
&bfin_sport0_uart_device,
|
||||
&bfin_sport1_uart_device,
|
||||
#endif
|
||||
|
||||
#if defined(CONFIG_PATA_PLATFORM) || defined(CONFIG_PATA_PLATFORM_MODULE)
|
||||
&bfin_pata_device,
|
||||
#endif
|
||||
};
|
||||
|
||||
static int __init stamp_init(void)
|
||||
{
|
||||
printk(KERN_INFO "%s(): registering device resources\n", __FUNCTION__);
|
||||
platform_add_devices(stamp_devices, ARRAY_SIZE(stamp_devices));
|
||||
#if defined(CONFIG_SPI_BFIN) || defined(CONFIG_SPI_BFIN_MODULE)
|
||||
spi_register_board_info(bfin_spi_board_info,
|
||||
ARRAY_SIZE(bfin_spi_board_info));
|
||||
#endif
|
||||
|
||||
#if defined(CONFIG_PATA_PLATFORM) || defined(CONFIG_PATA_PLATFORM_MODULE)
|
||||
irq_desc[PATA_INT].status |= IRQ_NOAUTOEN;
|
||||
#endif
|
||||
return 0;
|
||||
}
|
||||
|
||||
arch_initcall(stamp_init);
|
||||
|
||||
void native_machine_restart(char *cmd)
|
||||
{
|
||||
/* workaround reboot hang when booting from SPI */
|
||||
if ((bfin_read_SYSCR() & 0x7) == 0x3)
|
||||
bfin_gpio_reset_spi0_ssel1();
|
||||
}
|
|
@ -0,0 +1,161 @@
|
|||
/*
|
||||
* File: arch/blackfin/mach-bf527/cpu.c
|
||||
* Based on: arch/blackfin/mach-bf537/cpu.c
|
||||
* Author: michael.kang@analog.com
|
||||
*
|
||||
* Created:
|
||||
* Description: clock scaling for the bf527
|
||||
*
|
||||
* Modified:
|
||||
* Copyright 2004-2007 Analog Devices Inc.
|
||||
*
|
||||
* Bugs: Enter bugs at http://blackfin.uclinux.org/
|
||||
*
|
||||
* 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, see the file COPYING, or write
|
||||
* to the Free Software Foundation, Inc.,
|
||||
* 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
*/
|
||||
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/types.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/cpufreq.h>
|
||||
#include <asm/dpmc.h>
|
||||
#include <linux/fs.h>
|
||||
#include <asm/bfin-global.h>
|
||||
|
||||
/* CONFIG_CLKIN_HZ=11059200 */
|
||||
#define VCO5 (CONFIG_CLKIN_HZ*45) /*497664000 */
|
||||
#define VCO4 (CONFIG_CLKIN_HZ*36) /*398131200 */
|
||||
#define VCO3 (CONFIG_CLKIN_HZ*27) /*298598400 */
|
||||
#define VCO2 (CONFIG_CLKIN_HZ*18) /*199065600 */
|
||||
#define VCO1 (CONFIG_CLKIN_HZ*9) /*99532800 */
|
||||
#define VCO(x) VCO##x
|
||||
|
||||
#define MFREQ(x) {VCO(x), VCO(x)/4}, {VCO(x), VCO(x)/2}, {VCO(x), VCO(x)}
|
||||
/* frequency */
|
||||
static struct cpufreq_frequency_table bf527_freq_table[] = {
|
||||
MFREQ(1),
|
||||
MFREQ(3),
|
||||
{VCO4, VCO4 / 2}, {VCO4, VCO4},
|
||||
MFREQ(5),
|
||||
{0, CPUFREQ_TABLE_END},
|
||||
};
|
||||
|
||||
/*
|
||||
* dpmc_fops->ioctl()
|
||||
* static int dpmc_ioctl(struct inode *inode, struct file *file, unsigned int cmd, unsigned long arg)
|
||||
*/
|
||||
static int bf527_getfreq(unsigned int cpu)
|
||||
{
|
||||
unsigned long cclk_mhz;
|
||||
|
||||
/* The driver only support single cpu */
|
||||
if (cpu == 0)
|
||||
dpmc_fops.ioctl(NULL, NULL, IOCTL_GET_CORECLOCK, &cclk_mhz);
|
||||
else
|
||||
cclk_mhz = -1;
|
||||
|
||||
return cclk_mhz;
|
||||
}
|
||||
|
||||
static int bf527_target(struct cpufreq_policy *policy,
|
||||
unsigned int target_freq, unsigned int relation)
|
||||
{
|
||||
unsigned long cclk_mhz;
|
||||
unsigned long vco_mhz;
|
||||
unsigned long flags;
|
||||
unsigned int index;
|
||||
struct cpufreq_freqs freqs;
|
||||
|
||||
if (cpufreq_frequency_table_target
|
||||
(policy, bf527_freq_table, target_freq, relation, &index))
|
||||
return -EINVAL;
|
||||
|
||||
cclk_mhz = bf527_freq_table[index].frequency;
|
||||
vco_mhz = bf527_freq_table[index].index;
|
||||
|
||||
dpmc_fops.ioctl(NULL, NULL, IOCTL_CHANGE_FREQUENCY, &vco_mhz);
|
||||
freqs.old = bf527_getfreq(0);
|
||||
freqs.new = cclk_mhz;
|
||||
freqs.cpu = 0;
|
||||
|
||||
pr_debug
|
||||
("cclk begin change to cclk %d,vco=%d,index=%d,target=%d,oldfreq=%d\n",
|
||||
cclk_mhz, vco_mhz, index, target_freq, freqs.old);
|
||||
|
||||
cpufreq_notify_transition(&freqs, CPUFREQ_PRECHANGE);
|
||||
local_irq_save(flags);
|
||||
dpmc_fops.ioctl(NULL, NULL, IOCTL_SET_CCLK, &cclk_mhz);
|
||||
local_irq_restore(flags);
|
||||
cpufreq_notify_transition(&freqs, CPUFREQ_POSTCHANGE);
|
||||
|
||||
vco_mhz = get_vco();
|
||||
cclk_mhz = get_cclk();
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* make sure that only the "userspace" governor is run -- anything else wouldn't make sense on
|
||||
* this platform, anyway.
|
||||
*/
|
||||
static int bf527_verify_speed(struct cpufreq_policy *policy)
|
||||
{
|
||||
return cpufreq_frequency_table_verify(policy, &bf527_freq_table);
|
||||
}
|
||||
|
||||
static int __init __bf527_cpu_init(struct cpufreq_policy *policy)
|
||||
{
|
||||
if (policy->cpu != 0)
|
||||
return -EINVAL;
|
||||
|
||||
policy->governor = CPUFREQ_DEFAULT_GOVERNOR;
|
||||
|
||||
policy->cpuinfo.transition_latency = CPUFREQ_ETERNAL;
|
||||
/*Now ,only support one cpu */
|
||||
policy->cur = bf527_getfreq(0);
|
||||
cpufreq_frequency_table_get_attr(bf527_freq_table, policy->cpu);
|
||||
return cpufreq_frequency_table_cpuinfo(policy, bf527_freq_table);
|
||||
}
|
||||
|
||||
static struct freq_attr *bf527_freq_attr[] = {
|
||||
&cpufreq_freq_attr_scaling_available_freqs,
|
||||
NULL,
|
||||
};
|
||||
|
||||
static struct cpufreq_driver bf527_driver = {
|
||||
.verify = bf527_verify_speed,
|
||||
.target = bf527_target,
|
||||
.get = bf527_getfreq,
|
||||
.init = __bf527_cpu_init,
|
||||
.name = "bf527",
|
||||
.owner = THIS_MODULE,
|
||||
.attr = bf527_freq_attr,
|
||||
};
|
||||
|
||||
static int __init bf527_cpu_init(void)
|
||||
{
|
||||
return cpufreq_register_driver(&bf527_driver);
|
||||
}
|
||||
|
||||
static void __exit bf527_cpu_exit(void)
|
||||
{
|
||||
cpufreq_unregister_driver(&bf527_driver);
|
||||
}
|
||||
|
||||
MODULE_AUTHOR("Mickael Kang");
|
||||
MODULE_DESCRIPTION("cpufreq driver for bf527 CPU");
|
||||
MODULE_LICENSE("GPL");
|
||||
|
||||
module_init(bf527_cpu_init);
|
||||
module_exit(bf527_cpu_exit);
|
|
@ -0,0 +1,115 @@
|
|||
/*
|
||||
* File: arch/blackfin/mach-bf527/dma.c
|
||||
* Based on:
|
||||
* Author:
|
||||
*
|
||||
* Created:
|
||||
* Description: This file contains the simple DMA Implementation for Blackfin
|
||||
*
|
||||
* Modified:
|
||||
* Copyright 2004-2007 Analog Devices Inc.
|
||||
*
|
||||
* Bugs: Enter bugs at http://blackfin.uclinux.org/
|
||||
*
|
||||
* 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, see the file COPYING, or write
|
||||
* to the Free Software Foundation, Inc.,
|
||||
* 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
*/
|
||||
#include <asm/blackfin.h>
|
||||
#include <asm/dma.h>
|
||||
|
||||
struct dma_register *base_addr[MAX_BLACKFIN_DMA_CHANNEL] = {
|
||||
(struct dma_register *) DMA0_NEXT_DESC_PTR,
|
||||
(struct dma_register *) DMA1_NEXT_DESC_PTR,
|
||||
(struct dma_register *) DMA2_NEXT_DESC_PTR,
|
||||
(struct dma_register *) DMA3_NEXT_DESC_PTR,
|
||||
(struct dma_register *) DMA4_NEXT_DESC_PTR,
|
||||
(struct dma_register *) DMA5_NEXT_DESC_PTR,
|
||||
(struct dma_register *) DMA6_NEXT_DESC_PTR,
|
||||
(struct dma_register *) DMA7_NEXT_DESC_PTR,
|
||||
(struct dma_register *) DMA8_NEXT_DESC_PTR,
|
||||
(struct dma_register *) DMA9_NEXT_DESC_PTR,
|
||||
(struct dma_register *) DMA10_NEXT_DESC_PTR,
|
||||
(struct dma_register *) DMA11_NEXT_DESC_PTR,
|
||||
(struct dma_register *) MDMA_D0_NEXT_DESC_PTR,
|
||||
(struct dma_register *) MDMA_S0_NEXT_DESC_PTR,
|
||||
(struct dma_register *) MDMA_D1_NEXT_DESC_PTR,
|
||||
(struct dma_register *) MDMA_S1_NEXT_DESC_PTR,
|
||||
};
|
||||
|
||||
int channel2irq(unsigned int channel)
|
||||
{
|
||||
int ret_irq = -1;
|
||||
|
||||
switch (channel) {
|
||||
case CH_PPI:
|
||||
ret_irq = IRQ_PPI;
|
||||
break;
|
||||
|
||||
case CH_EMAC_RX:
|
||||
ret_irq = IRQ_MAC_RX;
|
||||
break;
|
||||
|
||||
case CH_EMAC_TX:
|
||||
ret_irq = IRQ_MAC_TX;
|
||||
break;
|
||||
|
||||
case CH_UART1_RX:
|
||||
ret_irq = IRQ_UART1_RX;
|
||||
break;
|
||||
|
||||
case CH_UART1_TX:
|
||||
ret_irq = IRQ_UART1_TX;
|
||||
break;
|
||||
|
||||
case CH_SPORT0_RX:
|
||||
ret_irq = IRQ_SPORT0_RX;
|
||||
break;
|
||||
|
||||
case CH_SPORT0_TX:
|
||||
ret_irq = IRQ_SPORT0_TX;
|
||||
break;
|
||||
|
||||
case CH_SPORT1_RX:
|
||||
ret_irq = IRQ_SPORT1_RX;
|
||||
break;
|
||||
|
||||
case CH_SPORT1_TX:
|
||||
ret_irq = IRQ_SPORT1_TX;
|
||||
break;
|
||||
|
||||
case CH_SPI:
|
||||
ret_irq = IRQ_SPI;
|
||||
break;
|
||||
|
||||
case CH_UART0_RX:
|
||||
ret_irq = IRQ_UART0_RX;
|
||||
break;
|
||||
|
||||
case CH_UART0_TX:
|
||||
ret_irq = IRQ_UART0_TX;
|
||||
break;
|
||||
|
||||
case CH_MEM_STREAM0_SRC:
|
||||
case CH_MEM_STREAM0_DEST:
|
||||
ret_irq = IRQ_MEM_DMA0;
|
||||
break;
|
||||
|
||||
case CH_MEM_STREAM1_SRC:
|
||||
case CH_MEM_STREAM1_DEST:
|
||||
ret_irq = IRQ_MEM_DMA1;
|
||||
break;
|
||||
}
|
||||
return ret_irq;
|
||||
}
|
|
@ -0,0 +1,456 @@
|
|||
/*
|
||||
* File: arch/blackfin/mach-bf527/head.S
|
||||
* Based on: arch/blackfin/mach-bf533/head.S
|
||||
* Author: Jeff Dionne <jeff@uclinux.org> COPYRIGHT 1998 D. Jeff Dionne
|
||||
*
|
||||
* Created: 1998
|
||||
* Description: Startup code for Blackfin BF537
|
||||
*
|
||||
* Modified:
|
||||
* Copyright 2004-2007 Analog Devices Inc.
|
||||
*
|
||||
* Bugs: Enter bugs at http://blackfin.uclinux.org/
|
||||
*
|
||||
* 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, see the file COPYING, or write
|
||||
* to the Free Software Foundation, Inc.,
|
||||
* 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
*/
|
||||
|
||||
#include <linux/linkage.h>
|
||||
#include <linux/init.h>
|
||||
#include <asm/blackfin.h>
|
||||
#include <asm/trace.h>
|
||||
|
||||
#if CONFIG_BFIN_KERNEL_CLOCK
|
||||
#include <asm/mach-common/clocks.h>
|
||||
#include <asm/mach/mem_init.h>
|
||||
#endif
|
||||
|
||||
.global __rambase
|
||||
.global __ramstart
|
||||
.global __ramend
|
||||
.extern ___bss_stop
|
||||
.extern ___bss_start
|
||||
.extern _bf53x_relocate_l1_mem
|
||||
|
||||
#define INITIAL_STACK 0xFFB01000
|
||||
|
||||
__INIT
|
||||
|
||||
ENTRY(__start)
|
||||
/* R0: argument of command line string, passed from uboot, save it */
|
||||
R7 = R0;
|
||||
/* Enable Cycle Counter and Nesting Of Interrupts */
|
||||
#ifdef CONFIG_BFIN_SCRATCH_REG_CYCLES
|
||||
R0 = SYSCFG_SNEN;
|
||||
#else
|
||||
R0 = SYSCFG_SNEN | SYSCFG_CCEN;
|
||||
#endif
|
||||
SYSCFG = R0;
|
||||
R0 = 0;
|
||||
|
||||
/* Clear Out All the data and pointer Registers */
|
||||
R1 = R0;
|
||||
R2 = R0;
|
||||
R3 = R0;
|
||||
R4 = R0;
|
||||
R5 = R0;
|
||||
R6 = R0;
|
||||
|
||||
P0 = R0;
|
||||
P1 = R0;
|
||||
P2 = R0;
|
||||
P3 = R0;
|
||||
P4 = R0;
|
||||
P5 = R0;
|
||||
|
||||
LC0 = r0;
|
||||
LC1 = r0;
|
||||
L0 = r0;
|
||||
L1 = r0;
|
||||
L2 = r0;
|
||||
L3 = r0;
|
||||
|
||||
/* Clear Out All the DAG Registers */
|
||||
B0 = r0;
|
||||
B1 = r0;
|
||||
B2 = r0;
|
||||
B3 = r0;
|
||||
|
||||
I0 = r0;
|
||||
I1 = r0;
|
||||
I2 = r0;
|
||||
I3 = r0;
|
||||
|
||||
M0 = r0;
|
||||
M1 = r0;
|
||||
M2 = r0;
|
||||
M3 = r0;
|
||||
|
||||
trace_buffer_init(p0,r0);
|
||||
P0 = R1;
|
||||
R0 = R1;
|
||||
|
||||
/* Turn off the icache */
|
||||
p0.l = LO(IMEM_CONTROL);
|
||||
p0.h = HI(IMEM_CONTROL);
|
||||
R1 = [p0];
|
||||
R0 = ~ENICPLB;
|
||||
R0 = R0 & R1;
|
||||
|
||||
/* Anomaly 05000125 */
|
||||
#if ANOMALY_05000125
|
||||
CLI R2;
|
||||
SSYNC;
|
||||
#endif
|
||||
[p0] = R0;
|
||||
SSYNC;
|
||||
#if ANOMALY_05000125
|
||||
STI R2;
|
||||
#endif
|
||||
|
||||
/* Turn off the dcache */
|
||||
p0.l = LO(DMEM_CONTROL);
|
||||
p0.h = HI(DMEM_CONTROL);
|
||||
R1 = [p0];
|
||||
R0 = ~ENDCPLB;
|
||||
R0 = R0 & R1;
|
||||
|
||||
/* Anomaly 05000125 */
|
||||
#if ANOMALY_05000125
|
||||
CLI R2;
|
||||
SSYNC;
|
||||
#endif
|
||||
[p0] = R0;
|
||||
SSYNC;
|
||||
#if ANOMALY_05000125
|
||||
STI R2;
|
||||
#endif
|
||||
|
||||
|
||||
#if defined(CONFIG_BF527)
|
||||
p0.h = hi(EMAC_SYSTAT);
|
||||
p0.l = lo(EMAC_SYSTAT);
|
||||
R0.h = 0xFFFF; /* Clear EMAC Interrupt Status bits */
|
||||
R0.l = 0xFFFF;
|
||||
[P0] = R0;
|
||||
SSYNC;
|
||||
#endif
|
||||
|
||||
/* Initialise UART - when booting from u-boot, the UART is not disabled
|
||||
* so if we dont initalize here, our serial console gets hosed */
|
||||
p0.h = hi(UART1_LCR);
|
||||
p0.l = lo(UART1_LCR);
|
||||
r0 = 0x0(Z);
|
||||
w[p0] = r0.L; /* To enable DLL writes */
|
||||
ssync;
|
||||
|
||||
p0.h = hi(UART1_DLL);
|
||||
p0.l = lo(UART1_DLL);
|
||||
r0 = 0x0(Z);
|
||||
w[p0] = r0.L;
|
||||
ssync;
|
||||
|
||||
p0.h = hi(UART1_DLH);
|
||||
p0.l = lo(UART1_DLH);
|
||||
r0 = 0x00(Z);
|
||||
w[p0] = r0.L;
|
||||
ssync;
|
||||
|
||||
p0.h = hi(UART1_GCTL);
|
||||
p0.l = lo(UART1_GCTL);
|
||||
r0 = 0x0(Z);
|
||||
w[p0] = r0.L; /* To enable UART clock */
|
||||
ssync;
|
||||
|
||||
/* Initialize stack pointer */
|
||||
sp.l = lo(INITIAL_STACK);
|
||||
sp.h = hi(INITIAL_STACK);
|
||||
fp = sp;
|
||||
usp = sp;
|
||||
|
||||
#ifdef CONFIG_EARLY_PRINTK
|
||||
SP += -12;
|
||||
call _init_early_exception_vectors;
|
||||
SP += 12;
|
||||
#endif
|
||||
|
||||
/* Put The Code for PLL Programming and SDRAM Programming in L1 ISRAM */
|
||||
call _bf53x_relocate_l1_mem;
|
||||
#if CONFIG_BFIN_KERNEL_CLOCK
|
||||
call _start_dma_code;
|
||||
#endif
|
||||
|
||||
/* Code for initializing Async memory banks */
|
||||
|
||||
p2.h = hi(EBIU_AMBCTL1);
|
||||
p2.l = lo(EBIU_AMBCTL1);
|
||||
r0.h = hi(AMBCTL1VAL);
|
||||
r0.l = lo(AMBCTL1VAL);
|
||||
[p2] = r0;
|
||||
ssync;
|
||||
|
||||
p2.h = hi(EBIU_AMBCTL0);
|
||||
p2.l = lo(EBIU_AMBCTL0);
|
||||
r0.h = hi(AMBCTL0VAL);
|
||||
r0.l = lo(AMBCTL0VAL);
|
||||
[p2] = r0;
|
||||
ssync;
|
||||
|
||||
p2.h = hi(EBIU_AMGCTL);
|
||||
p2.l = lo(EBIU_AMGCTL);
|
||||
r0 = AMGCTLVAL;
|
||||
w[p2] = r0;
|
||||
ssync;
|
||||
|
||||
/* This section keeps the processor in supervisor mode
|
||||
* during kernel boot. Switches to user mode at end of boot.
|
||||
* See page 3-9 of Hardware Reference manual for documentation.
|
||||
*/
|
||||
|
||||
/* EVT15 = _real_start */
|
||||
|
||||
p0.l = lo(EVT15);
|
||||
p0.h = hi(EVT15);
|
||||
p1.l = _real_start;
|
||||
p1.h = _real_start;
|
||||
[p0] = p1;
|
||||
csync;
|
||||
|
||||
p0.l = lo(IMASK);
|
||||
p0.h = hi(IMASK);
|
||||
p1.l = IMASK_IVG15;
|
||||
p1.h = 0x0;
|
||||
[p0] = p1;
|
||||
csync;
|
||||
|
||||
raise 15;
|
||||
p0.l = .LWAIT_HERE;
|
||||
p0.h = .LWAIT_HERE;
|
||||
reti = p0;
|
||||
#if ANOMALY_05000281
|
||||
nop; nop; nop;
|
||||
#endif
|
||||
rti;
|
||||
|
||||
.LWAIT_HERE:
|
||||
jump .LWAIT_HERE;
|
||||
ENDPROC(__start)
|
||||
|
||||
ENTRY(_real_start)
|
||||
[ -- sp ] = reti;
|
||||
p0.l = lo(WDOG_CTL);
|
||||
p0.h = hi(WDOG_CTL);
|
||||
r0 = 0xAD6(z);
|
||||
w[p0] = r0; /* watchdog off for now */
|
||||
ssync;
|
||||
|
||||
/* Code update for BSS size == 0
|
||||
* Zero out the bss region.
|
||||
*/
|
||||
|
||||
p1.l = ___bss_start;
|
||||
p1.h = ___bss_start;
|
||||
p2.l = ___bss_stop;
|
||||
p2.h = ___bss_stop;
|
||||
r0 = 0;
|
||||
p2 -= p1;
|
||||
lsetup (.L_clear_bss, .L_clear_bss) lc0 = p2;
|
||||
.L_clear_bss:
|
||||
B[p1++] = r0;
|
||||
|
||||
/* In case there is a NULL pointer reference
|
||||
* Zero out region before stext
|
||||
*/
|
||||
|
||||
p1.l = 0x0;
|
||||
p1.h = 0x0;
|
||||
r0.l = __stext;
|
||||
r0.h = __stext;
|
||||
r0 = r0 >> 1;
|
||||
p2 = r0;
|
||||
r0 = 0;
|
||||
lsetup (.L_clear_zero, .L_clear_zero) lc0 = p2;
|
||||
.L_clear_zero:
|
||||
W[p1++] = r0;
|
||||
|
||||
/* pass the uboot arguments to the global value command line */
|
||||
R0 = R7;
|
||||
call _cmdline_init;
|
||||
|
||||
p1.l = __rambase;
|
||||
p1.h = __rambase;
|
||||
r0.l = __sdata;
|
||||
r0.h = __sdata;
|
||||
[p1] = r0;
|
||||
|
||||
p1.l = __ramstart;
|
||||
p1.h = __ramstart;
|
||||
p3.l = ___bss_stop;
|
||||
p3.h = ___bss_stop;
|
||||
|
||||
r1 = p3;
|
||||
[p1] = r1;
|
||||
|
||||
/*
|
||||
* load the current thread pointer and stack
|
||||
*/
|
||||
r1.l = _init_thread_union;
|
||||
r1.h = _init_thread_union;
|
||||
|
||||
r2.l = 0x2000;
|
||||
r2.h = 0x0000;
|
||||
r1 = r1 + r2;
|
||||
sp = r1;
|
||||
usp = sp;
|
||||
fp = sp;
|
||||
jump.l _start_kernel;
|
||||
ENDPROC(_real_start)
|
||||
|
||||
__FINIT
|
||||
|
||||
.section .l1.text
|
||||
#if CONFIG_BFIN_KERNEL_CLOCK
|
||||
ENTRY(_start_dma_code)
|
||||
|
||||
/* Enable PHY CLK buffer output */
|
||||
p0.h = hi(VR_CTL);
|
||||
p0.l = lo(VR_CTL);
|
||||
r0.l = w[p0];
|
||||
bitset(r0, 14);
|
||||
w[p0] = r0.l;
|
||||
ssync;
|
||||
|
||||
p0.h = hi(SIC_IWR0);
|
||||
p0.l = lo(SIC_IWR0);
|
||||
r0.l = 0x1;
|
||||
r0.h = 0x0;
|
||||
[p0] = r0;
|
||||
SSYNC;
|
||||
|
||||
/*
|
||||
* Set PLL_CTL
|
||||
* - [14:09] = MSEL[5:0] : CLKIN / VCO multiplication factors
|
||||
* - [8] = BYPASS : BYPASS the PLL, run CLKIN into CCLK/SCLK
|
||||
* - [7] = output delay (add 200ps of delay to mem signals)
|
||||
* - [6] = input delay (add 200ps of input delay to mem signals)
|
||||
* - [5] = PDWN : 1=All Clocks off
|
||||
* - [3] = STOPCK : 1=Core Clock off
|
||||
* - [1] = PLL_OFF : 1=Disable Power to PLL
|
||||
* - [0] = DF : 1=Pass CLKIN/2 to PLL / 0=Pass CLKIN to PLL
|
||||
* all other bits set to zero
|
||||
*/
|
||||
|
||||
p0.h = hi(PLL_LOCKCNT);
|
||||
p0.l = lo(PLL_LOCKCNT);
|
||||
r0 = 0x300(Z);
|
||||
w[p0] = r0.l;
|
||||
ssync;
|
||||
|
||||
P2.H = hi(EBIU_SDGCTL);
|
||||
P2.L = lo(EBIU_SDGCTL);
|
||||
R0 = [P2];
|
||||
BITSET (R0, 24);
|
||||
[P2] = R0;
|
||||
SSYNC;
|
||||
|
||||
r0 = CONFIG_VCO_MULT & 63; /* Load the VCO multiplier */
|
||||
r0 = r0 << 9; /* Shift it over, */
|
||||
r1 = CLKIN_HALF; /* Do we need to divide CLKIN by 2?*/
|
||||
r0 = r1 | r0;
|
||||
r1 = PLL_BYPASS; /* Bypass the PLL? */
|
||||
r1 = r1 << 8; /* Shift it over */
|
||||
r0 = r1 | r0; /* add them all together */
|
||||
|
||||
p0.h = hi(PLL_CTL);
|
||||
p0.l = lo(PLL_CTL); /* Load the address */
|
||||
cli r2; /* Disable interrupts */
|
||||
ssync;
|
||||
w[p0] = r0.l; /* Set the value */
|
||||
idle; /* Wait for the PLL to stablize */
|
||||
sti r2; /* Enable interrupts */
|
||||
|
||||
.Lcheck_again:
|
||||
p0.h = hi(PLL_STAT);
|
||||
p0.l = lo(PLL_STAT);
|
||||
R0 = W[P0](Z);
|
||||
CC = BITTST(R0,5);
|
||||
if ! CC jump .Lcheck_again;
|
||||
|
||||
/* Configure SCLK & CCLK Dividers */
|
||||
r0 = (CONFIG_CCLK_ACT_DIV | CONFIG_SCLK_DIV);
|
||||
p0.h = hi(PLL_DIV);
|
||||
p0.l = lo(PLL_DIV);
|
||||
w[p0] = r0.l;
|
||||
ssync;
|
||||
|
||||
p0.l = lo(EBIU_SDRRC);
|
||||
p0.h = hi(EBIU_SDRRC);
|
||||
r0 = mem_SDRRC;
|
||||
w[p0] = r0.l;
|
||||
ssync;
|
||||
|
||||
p0.l = LO(EBIU_SDBCTL);
|
||||
p0.h = HI(EBIU_SDBCTL); /* SDRAM Memory Bank Control Register */
|
||||
r0 = mem_SDBCTL;
|
||||
w[p0] = r0.l;
|
||||
ssync;
|
||||
|
||||
P2.H = hi(EBIU_SDGCTL);
|
||||
P2.L = lo(EBIU_SDGCTL);
|
||||
R0 = [P2];
|
||||
BITCLR (R0, 24);
|
||||
p0.h = hi(EBIU_SDSTAT);
|
||||
p0.l = lo(EBIU_SDSTAT);
|
||||
r2.l = w[p0];
|
||||
cc = bittst(r2,3);
|
||||
if !cc jump .Lskip;
|
||||
NOP;
|
||||
BITSET (R0, 23);
|
||||
.Lskip:
|
||||
[P2] = R0;
|
||||
SSYNC;
|
||||
|
||||
R0.L = lo(mem_SDGCTL);
|
||||
R0.H = hi(mem_SDGCTL);
|
||||
R1 = [p2];
|
||||
R1 = R1 | R0;
|
||||
[P2] = R1;
|
||||
SSYNC;
|
||||
|
||||
p0.h = hi(SIC_IWR0);
|
||||
p0.l = lo(SIC_IWR0);
|
||||
r0.l = lo(IWR_ENABLE_ALL);
|
||||
r0.h = hi(IWR_ENABLE_ALL);
|
||||
[p0] = r0;
|
||||
SSYNC;
|
||||
|
||||
RTS;
|
||||
ENDPROC(_start_dma_code)
|
||||
#endif /* CONFIG_BFIN_KERNEL_CLOCK */
|
||||
|
||||
.data
|
||||
|
||||
/*
|
||||
* Set up the usable of RAM stuff. Size of RAM is determined then
|
||||
* an initial stack set up at the end.
|
||||
*/
|
||||
|
||||
.align 4
|
||||
__rambase:
|
||||
.long 0
|
||||
__ramstart:
|
||||
.long 0
|
||||
__ramend:
|
||||
.long 0
|
|
@ -0,0 +1,100 @@
|
|||
/*
|
||||
* File: arch/blackfin/mach-bf537/ints-priority.c
|
||||
* Based on: arch/blackfin/mach-bf533/ints-priority.c
|
||||
* Author: Michael Hennerich (michael.hennerich@analog.com)
|
||||
*
|
||||
* Created:
|
||||
* Description: Set up the interrupt priorities
|
||||
*
|
||||
* Modified:
|
||||
* Copyright 2004-2007 Analog Devices Inc.
|
||||
*
|
||||
* Bugs: Enter bugs at http://blackfin.uclinux.org/
|
||||
*
|
||||
* 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, see the file COPYING, or write
|
||||
* to the Free Software Foundation, Inc.,
|
||||
* 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
*/
|
||||
|
||||
#include <linux/module.h>
|
||||
#include <linux/irq.h>
|
||||
#include <asm/blackfin.h>
|
||||
|
||||
void program_IAR(void)
|
||||
{
|
||||
/* Program the IAR0 Register with the configured priority */
|
||||
bfin_write_SIC_IAR0(((CONFIG_IRQ_PLL_WAKEUP - 7) << IRQ_PLL_WAKEUP_POS) |
|
||||
((CONFIG_IRQ_DMA0_ERROR - 7) << IRQ_DMA0_ERROR_POS) |
|
||||
((CONFIG_IRQ_DMAR0_BLK - 7) << IRQ_DMAR0_BLK_POS) |
|
||||
((CONFIG_IRQ_DMAR1_BLK - 7) << IRQ_DMAR1_BLK_POS) |
|
||||
((CONFIG_IRQ_DMAR0_OVR - 7) << IRQ_DMAR0_OVR_POS) |
|
||||
((CONFIG_IRQ_DMAR1_OVR - 7) << IRQ_DMAR1_OVR_POS) |
|
||||
((CONFIG_IRQ_PPI_ERROR - 7) << IRQ_PPI_ERROR_POS) |
|
||||
((CONFIG_IRQ_MAC_ERROR - 7) << IRQ_MAC_ERROR_POS));
|
||||
|
||||
|
||||
bfin_write_SIC_IAR1(((CONFIG_IRQ_SPORT0_ERROR - 7) << IRQ_SPORT0_ERROR_POS) |
|
||||
((CONFIG_IRQ_SPORT1_ERROR - 7) << IRQ_SPORT1_ERROR_POS) |
|
||||
((CONFIG_IRQ_UART0_ERROR - 7) << IRQ_UART0_ERROR_POS) |
|
||||
((CONFIG_IRQ_UART1_ERROR - 7) << IRQ_UART1_ERROR_POS) |
|
||||
((CONFIG_IRQ_RTC - 7) << IRQ_RTC_POS) |
|
||||
((CONFIG_IRQ_PPI - 7) << IRQ_PPI_POS));
|
||||
|
||||
bfin_write_SIC_IAR2(((CONFIG_IRQ_SPORT0_RX - 7) << IRQ_SPORT0_RX_POS) |
|
||||
((CONFIG_IRQ_SPORT0_TX - 7) << IRQ_SPORT0_TX_POS) |
|
||||
((CONFIG_IRQ_SPORT1_RX - 7) << IRQ_SPORT1_RX_POS) |
|
||||
((CONFIG_IRQ_SPORT1_TX - 7) << IRQ_SPORT1_TX_POS) |
|
||||
((CONFIG_IRQ_TWI - 7) << IRQ_TWI_POS) |
|
||||
((CONFIG_IRQ_SPI - 7) << IRQ_SPI_POS) |
|
||||
((CONFIG_IRQ_UART0_RX - 7) << IRQ_UART0_RX_POS) |
|
||||
((CONFIG_IRQ_UART0_TX - 7) << IRQ_UART0_TX_POS));
|
||||
|
||||
bfin_write_SIC_IAR3(((CONFIG_IRQ_UART1_RX - 7) << IRQ_UART1_RX_POS) |
|
||||
((CONFIG_IRQ_UART1_TX - 7) << IRQ_UART1_TX_POS) |
|
||||
((CONFIG_IRQ_OPTSEC - 7) << IRQ_OPTSEC_POS) |
|
||||
((CONFIG_IRQ_CNT - 7) << IRQ_CNT_POS) |
|
||||
((CONFIG_IRQ_MAC_RX - 7) << IRQ_MAC_RX_POS) |
|
||||
((CONFIG_IRQ_PORTH_INTA - 7) << IRQ_PORTH_INTA_POS) |
|
||||
((CONFIG_IRQ_MAC_TX - 7) << IRQ_MAC_TX_POS) |
|
||||
((CONFIG_IRQ_PORTH_INTB - 7) << IRQ_PORTH_INTB_POS));
|
||||
|
||||
bfin_write_SIC_IAR4(((CONFIG_IRQ_TMR0 - 7) << IRQ_TMR0_POS) |
|
||||
((CONFIG_IRQ_TMR1 - 7) << IRQ_TMR1_POS) |
|
||||
((CONFIG_IRQ_TMR2 - 7) << IRQ_TMR2_POS) |
|
||||
((CONFIG_IRQ_TMR3 - 7) << IRQ_TMR3_POS) |
|
||||
((CONFIG_IRQ_TMR4 - 7) << IRQ_TMR4_POS) |
|
||||
((CONFIG_IRQ_TMR5 - 7) << IRQ_TMR5_POS) |
|
||||
((CONFIG_IRQ_TMR6 - 7) << IRQ_TMR6_POS) |
|
||||
((CONFIG_IRQ_TMR7 - 7) << IRQ_TMR7_POS));
|
||||
|
||||
bfin_write_SIC_IAR5(((CONFIG_IRQ_PORTG_INTA - 7) << IRQ_PORTG_INTA_POS) |
|
||||
((CONFIG_IRQ_PORTG_INTB - 7) << IRQ_PORTG_INTB_POS) |
|
||||
((CONFIG_IRQ_MEM_DMA0 - 7) << IRQ_MEM_DMA0_POS) |
|
||||
((CONFIG_IRQ_MEM_DMA1 - 7) << IRQ_MEM_DMA1_POS) |
|
||||
((CONFIG_IRQ_WATCH - 7) << IRQ_WATCH_POS) |
|
||||
((CONFIG_IRQ_PORTF_INTA - 7) << IRQ_PORTF_INTA_POS) |
|
||||
((CONFIG_IRQ_PORTF_INTB - 7) << IRQ_PORTF_INTB_POS) |
|
||||
((CONFIG_IRQ_SPI_ERROR - 7) << IRQ_SPI_ERROR_POS));
|
||||
|
||||
bfin_write_SIC_IAR6(((CONFIG_IRQ_NFC_ERROR - 7) << IRQ_NFC_ERROR_POS) |
|
||||
((CONFIG_IRQ_HDMA_ERROR - 7) << IRQ_HDMA_ERROR_POS) |
|
||||
((CONFIG_IRQ_HDMA - 7) << IRQ_HDMA_POS) |
|
||||
((CONFIG_IRQ_USB_EINT - 7) << IRQ_USB_EINT_POS) |
|
||||
((CONFIG_IRQ_USB_INT0 - 7) << IRQ_USB_INT0_POS) |
|
||||
((CONFIG_IRQ_USB_INT1 - 7) << IRQ_USB_INT1_POS) |
|
||||
((CONFIG_IRQ_USB_INT2 - 7) << IRQ_USB_INT2_POS) |
|
||||
((CONFIG_IRQ_USB_DMA - 7) << IRQ_USB_DMA_POS));
|
||||
|
||||
SSYNC();
|
||||
}
|
|
@ -42,7 +42,7 @@
|
|||
/*
|
||||
* Name the Board for the /proc/cpuinfo
|
||||
*/
|
||||
char *bfin_board_name = "Bluetechnix CM BF533";
|
||||
const char bfin_board_name[] = "Bluetechnix CM BF533";
|
||||
|
||||
#if defined(CONFIG_SPI_BFIN) || defined(CONFIG_SPI_BFIN_MODULE)
|
||||
/* all SPI peripherals info goes here */
|
||||
|
|
|
@ -43,7 +43,7 @@
|
|||
/*
|
||||
* Name the Board for the /proc/cpuinfo
|
||||
*/
|
||||
char *bfin_board_name = "ADDS-BF533-EZKIT";
|
||||
const char bfin_board_name[] = "ADDS-BF533-EZKIT";
|
||||
|
||||
#if defined(CONFIG_RTC_DRV_BFIN) || defined(CONFIG_RTC_DRV_BFIN_MODULE)
|
||||
static struct platform_device rtc_device = {
|
||||
|
|
|
@ -35,7 +35,7 @@
|
|||
/*
|
||||
* Name the Board for the /proc/cpuinfo
|
||||
*/
|
||||
char *bfin_board_name = "UNKNOWN BOARD";
|
||||
const char bfin_board_name[] = "UNKNOWN BOARD";
|
||||
|
||||
#if defined(CONFIG_RTC_DRV_BFIN) || defined(CONFIG_RTC_DRV_BFIN_MODULE)
|
||||
static struct platform_device rtc_device = {
|
||||
|
|
|
@ -46,7 +46,7 @@
|
|||
/*
|
||||
* Name the Board for the /proc/cpuinfo
|
||||
*/
|
||||
char *bfin_board_name = "ADDS-BF533-STAMP";
|
||||
const char bfin_board_name[] = "ADDS-BF533-STAMP";
|
||||
|
||||
#if defined(CONFIG_RTC_DRV_BFIN) || defined(CONFIG_RTC_DRV_BFIN_MODULE)
|
||||
static struct platform_device rtc_device = {
|
||||
|
|
|
@ -43,7 +43,7 @@
|
|||
/*
|
||||
* Name the Board for the /proc/cpuinfo
|
||||
*/
|
||||
char *bfin_board_name = "Bluetechnix CM BF537";
|
||||
const char bfin_board_name[] = "Bluetechnix CM BF537";
|
||||
|
||||
#if defined(CONFIG_SPI_BFIN) || defined(CONFIG_SPI_BFIN_MODULE)
|
||||
/* all SPI peripherals info goes here */
|
||||
|
|
|
@ -49,7 +49,7 @@
|
|||
/*
|
||||
* Name the Board for the /proc/cpuinfo
|
||||
*/
|
||||
char *bfin_board_name = "GENERIC Board";
|
||||
const char bfin_board_name[] = "GENERIC Board";
|
||||
|
||||
/*
|
||||
* Driver needs to know address, irq and flag pin.
|
||||
|
|
|
@ -47,7 +47,7 @@
|
|||
/*
|
||||
* Name the Board for the /proc/cpuinfo
|
||||
*/
|
||||
char *bfin_board_name = "PNAV-1.0";
|
||||
const char bfin_board_name[] = "PNAV-1.0";
|
||||
|
||||
/*
|
||||
* Driver needs to know address, irq and flag pin.
|
||||
|
|
|
@ -49,7 +49,7 @@
|
|||
/*
|
||||
* Name the Board for the /proc/cpuinfo
|
||||
*/
|
||||
char *bfin_board_name = "ADDS-BF537-STAMP";
|
||||
const char bfin_board_name[] = "ADDS-BF537-STAMP";
|
||||
|
||||
/*
|
||||
* Driver needs to know address, irq and flag pin.
|
||||
|
|
|
@ -49,7 +49,7 @@
|
|||
/*
|
||||
* Name the Board for the /proc/cpuinfo
|
||||
*/
|
||||
char *bfin_board_name = "ADSP-BF548-EZKIT";
|
||||
const char bfin_board_name[] = "ADSP-BF548-EZKIT";
|
||||
|
||||
/*
|
||||
* Driver needs to know address, irq and flag pin.
|
||||
|
@ -560,7 +560,7 @@ static struct platform_device *ezkit_devices[] __initdata = {
|
|||
|
||||
#if defined(CONFIG_SPI_BFIN) || defined(CONFIG_SPI_BFIN_MODULE)
|
||||
&bf54x_spi_master0,
|
||||
/* &bf54x_spi_master1,*/
|
||||
&bf54x_spi_master1,
|
||||
#endif
|
||||
|
||||
#if defined(CONFIG_KEYBOARD_BFIN) || defined(CONFIG_KEYBOARD_BFIN_MODULE)
|
||||
|
|
|
@ -64,6 +64,7 @@
|
|||
(struct dma_register *) MDMA_D3_NEXT_DESC_PTR,
|
||||
(struct dma_register *) MDMA_S3_NEXT_DESC_PTR,
|
||||
};
|
||||
EXPORT_SYMBOL(base_addr);
|
||||
|
||||
int channel2irq(unsigned int channel)
|
||||
{
|
||||
|
|
|
@ -42,7 +42,7 @@
|
|||
/*
|
||||
* Name the Board for the /proc/cpuinfo
|
||||
*/
|
||||
char *bfin_board_name = "Bluetechnix CM BF561";
|
||||
const char bfin_board_name[] = "Bluetechnix CM BF561";
|
||||
|
||||
#if defined(CONFIG_SPI_BFIN) || defined(CONFIG_SPI_BFIN_MODULE)
|
||||
/* all SPI peripherals info goes here */
|
||||
|
|
|
@ -39,7 +39,7 @@
|
|||
/*
|
||||
* Name the Board for the /proc/cpuinfo
|
||||
*/
|
||||
char *bfin_board_name = "ADDS-BF561-EZKIT";
|
||||
const char bfin_board_name[] = "ADDS-BF561-EZKIT";
|
||||
|
||||
#define ISP1761_BASE 0x2C0F0000
|
||||
#define ISP1761_IRQ IRQ_PF10
|
||||
|
|
|
@ -32,7 +32,7 @@
|
|||
#include <linux/platform_device.h>
|
||||
#include <linux/irq.h>
|
||||
|
||||
char *bfin_board_name = "UNKNOWN BOARD";
|
||||
const char bfin_board_name[] = "UNKNOWN BOARD";
|
||||
|
||||
/*
|
||||
* Driver needs to know address, irq and flag pin.
|
||||
|
|
|
@ -16,7 +16,7 @@
|
|||
#include <linux/platform_device.h>
|
||||
#include <linux/irq.h>
|
||||
|
||||
char *bfin_board_name = "Tepla-BF561";
|
||||
const char bfin_board_name[] = "Tepla-BF561";
|
||||
|
||||
/*
|
||||
* Driver needs to know address, irq and flag pin.
|
||||
|
|
|
@ -52,7 +52,13 @@
|
|||
* -
|
||||
*/
|
||||
|
||||
unsigned long irq_flags = 0;
|
||||
/* Initialize this to an actual value to force it into the .data
|
||||
* section so that we know it is properly initialized at entry into
|
||||
* the kernel but before bss is initialized to zero (which is where
|
||||
* it would live otherwise). The 0x1f magic represents the IRQs we
|
||||
* cannot actually mask out in hardware.
|
||||
*/
|
||||
unsigned long irq_flags = 0x1f;
|
||||
|
||||
/* The number of spurious interrupts */
|
||||
atomic_t num_spurious;
|
||||
|
|
|
@ -58,7 +58,13 @@
|
|||
* -
|
||||
*/
|
||||
|
||||
unsigned long irq_flags = 0;
|
||||
/* Initialize this to an actual value to force it into the .data
|
||||
* section so that we know it is properly initialized at entry into
|
||||
* the kernel but before bss is initialized to zero (which is where
|
||||
* it would live otherwise). The 0x1f magic represents the IRQs we
|
||||
* cannot actually mask out in hardware.
|
||||
*/
|
||||
unsigned long irq_flags = 0x1f;
|
||||
|
||||
/* The number of spurious interrupts */
|
||||
atomic_t num_spurious;
|
||||
|
@ -92,10 +98,15 @@ static void __init search_IAR(void)
|
|||
|
||||
for (irqn = 0; irqn < NR_PERI_INTS; irqn++) {
|
||||
int iar_shift = (irqn & 7) * 4;
|
||||
if (ivg ==
|
||||
if (ivg ==
|
||||
(0xf &
|
||||
#ifndef CONFIG_BF52x
|
||||
bfin_read32((unsigned long *)SIC_IAR0 +
|
||||
(irqn >> 3)) >> iar_shift)) {
|
||||
#else
|
||||
bfin_read32((unsigned long *)SIC_IAR0 +
|
||||
((irqn%32) >> 3) + ((irqn / 32) * 16)) >> iar_shift)) {
|
||||
#endif
|
||||
ivg_table[irq_pos].irqno = IVG7 + irqn;
|
||||
ivg_table[irq_pos].isrflag = 1 << (irqn % 32);
|
||||
ivg7_13[ivg].istop++;
|
||||
|
@ -140,7 +151,7 @@ static void bfin_core_unmask_irq(unsigned int irq)
|
|||
|
||||
static void bfin_internal_mask_irq(unsigned int irq)
|
||||
{
|
||||
#ifndef CONFIG_BF54x
|
||||
#ifdef CONFIG_BF53x
|
||||
bfin_write_SIC_IMASK(bfin_read_SIC_IMASK() &
|
||||
~(1 << (irq - (IRQ_CORETMR + 1))));
|
||||
#else
|
||||
|
@ -155,7 +166,7 @@ static void bfin_internal_mask_irq(unsigned int irq)
|
|||
|
||||
static void bfin_internal_unmask_irq(unsigned int irq)
|
||||
{
|
||||
#ifndef CONFIG_BF54x
|
||||
#ifdef CONFIG_BF53x
|
||||
bfin_write_SIC_IMASK(bfin_read_SIC_IMASK() |
|
||||
(1 << (irq - (IRQ_CORETMR + 1))));
|
||||
#else
|
||||
|
@ -750,13 +761,15 @@ int __init init_arch_irq(void)
|
|||
int irq;
|
||||
unsigned long ilat = 0;
|
||||
/* Disable all the peripheral intrs - page 4-29 HW Ref manual */
|
||||
#ifdef CONFIG_BF54x
|
||||
#if defined(CONFIG_BF54x) || defined(CONFIG_BF52x)
|
||||
bfin_write_SIC_IMASK0(SIC_UNMASK_ALL);
|
||||
bfin_write_SIC_IMASK1(SIC_UNMASK_ALL);
|
||||
bfin_write_SIC_IMASK2(SIC_UNMASK_ALL);
|
||||
bfin_write_SIC_IWR0(IWR_ENABLE_ALL);
|
||||
bfin_write_SIC_IWR1(IWR_ENABLE_ALL);
|
||||
#ifdef CONFIG_BF54x
|
||||
bfin_write_SIC_IMASK2(SIC_UNMASK_ALL);
|
||||
bfin_write_SIC_IWR2(IWR_ENABLE_ALL);
|
||||
#endif
|
||||
#else
|
||||
bfin_write_SIC_IMASK(SIC_UNMASK_ALL);
|
||||
bfin_write_SIC_IWR(IWR_ENABLE_ALL);
|
||||
|
@ -787,7 +800,7 @@ int __init init_arch_irq(void)
|
|||
|
||||
switch (irq) {
|
||||
#ifdef CONFIG_IRQCHIP_DEMUX_GPIO
|
||||
#ifndef CONFIG_BF54x
|
||||
#if defined(CONFIG_BF53x)
|
||||
case IRQ_PROG_INTA:
|
||||
set_irq_chained_handler(irq,
|
||||
bfin_demux_gpio_irq);
|
||||
|
@ -798,7 +811,7 @@ int __init init_arch_irq(void)
|
|||
bfin_demux_gpio_irq);
|
||||
break;
|
||||
#endif
|
||||
#else
|
||||
#elif defined(CONFIG_BF54x)
|
||||
case IRQ_PINT0:
|
||||
set_irq_chained_handler(irq,
|
||||
bfin_demux_gpio_irq);
|
||||
|
@ -815,7 +828,20 @@ int __init init_arch_irq(void)
|
|||
set_irq_chained_handler(irq,
|
||||
bfin_demux_gpio_irq);
|
||||
break;
|
||||
#endif /*CONFIG_BF54x */
|
||||
#elif defined(CONFIG_BF52x)
|
||||
case IRQ_PORTF_INTA:
|
||||
set_irq_chained_handler(irq,
|
||||
bfin_demux_gpio_irq);
|
||||
break;
|
||||
case IRQ_PORTG_INTA:
|
||||
set_irq_chained_handler(irq,
|
||||
bfin_demux_gpio_irq);
|
||||
break;
|
||||
case IRQ_PORTH_INTA:
|
||||
set_irq_chained_handler(irq,
|
||||
bfin_demux_gpio_irq);
|
||||
break;
|
||||
#endif
|
||||
#endif
|
||||
default:
|
||||
set_irq_handler(irq, handle_simple_irq);
|
||||
|
@ -880,14 +906,15 @@ void do_irq(int vec, struct pt_regs *fp)
|
|||
} else {
|
||||
struct ivgx *ivg = ivg7_13[vec - IVG7].ifirst;
|
||||
struct ivgx *ivg_stop = ivg7_13[vec - IVG7].istop;
|
||||
#ifdef CONFIG_BF54x
|
||||
#if defined(CONFIG_BF54x) || defined(CONFIG_BF52x)
|
||||
unsigned long sic_status[3];
|
||||
|
||||
SSYNC();
|
||||
sic_status[0] = bfin_read_SIC_ISR(0) & bfin_read_SIC_IMASK(0);
|
||||
sic_status[1] = bfin_read_SIC_ISR(1) & bfin_read_SIC_IMASK(1);
|
||||
sic_status[2] = bfin_read_SIC_ISR(2) & bfin_read_SIC_IMASK(2);
|
||||
|
||||
sic_status[0] = bfin_read_SIC_ISR0() & bfin_read_SIC_IMASK0();
|
||||
sic_status[1] = bfin_read_SIC_ISR1() & bfin_read_SIC_IMASK1();
|
||||
#ifdef CONFIG_BF54x
|
||||
sic_status[2] = bfin_read_SIC_ISR2() & bfin_read_SIC_IMASK2();
|
||||
#endif
|
||||
for (;; ivg++) {
|
||||
if (ivg >= ivg_stop) {
|
||||
atomic_inc(&num_spurious);
|
||||
|
|
|
@ -19,26 +19,27 @@
|
|||
NM = sh $(srctree)/arch/parisc/nm
|
||||
CHECKFLAGS += -D__hppa__=1
|
||||
|
||||
MACHINE := $(shell uname -m)
|
||||
ifeq ($(MACHINE),parisc*)
|
||||
NATIVE := 1
|
||||
endif
|
||||
|
||||
ifdef CONFIG_64BIT
|
||||
CROSS_COMPILE := $(shell if [ -x /usr/bin/hppa64-linux-gnu-gcc ]; then \
|
||||
echo hppa64-linux-gnu-; else echo hppa64-linux-; fi)
|
||||
UTS_MACHINE := parisc64
|
||||
CHECKFLAGS += -D__LP64__=1 -m64
|
||||
else
|
||||
MACHINE := $(subst 64,,$(shell uname -m))
|
||||
ifneq ($(MACHINE),parisc)
|
||||
CROSS_COMPILE := hppa-linux-
|
||||
endif
|
||||
WIDTH := 64
|
||||
CROSS_COMPILE := hppa64-linux-gnu-
|
||||
else # 32-bit
|
||||
WIDTH :=
|
||||
endif
|
||||
|
||||
FINAL_LD=$(CROSS_COMPILE)ld --warn-common --warn-section-align
|
||||
# attempt to help out folks who are cross-compiling
|
||||
ifeq ($(NATIVE),1)
|
||||
CROSS_COMPILE := hppa$(WIDTH)-linux-
|
||||
endif
|
||||
|
||||
OBJCOPY_FLAGS =-O binary -R .note -R .comment -S
|
||||
|
||||
ifneq ($(call cc-ifversion, -lt, 0303, "bad"),)
|
||||
$(error Sorry, GCC v3.3 or above is required.)
|
||||
endif
|
||||
|
||||
cflags-y := -pipe
|
||||
|
||||
# These flags should be implied by an hppa-linux configuration, but they
|
||||
|
@ -69,7 +70,7 @@ kernel-y := mm/ kernel/ math-emu/ kernel/init_task.o
|
|||
kernel-$(CONFIG_HPUX) += hpux/
|
||||
|
||||
core-y += $(addprefix arch/parisc/, $(kernel-y))
|
||||
libs-y += arch/parisc/lib/ `$(CC) -print-libgcc-file-name`
|
||||
libs-y += arch/parisc/lib/
|
||||
|
||||
drivers-$(CONFIG_OPROFILE) += arch/parisc/oprofile/
|
||||
|
||||
|
@ -77,27 +78,27 @@ PALO := $(shell if which palo; then : ; \
|
|||
elif [ -x /sbin/palo ]; then echo /sbin/palo; \
|
||||
fi)
|
||||
|
||||
PALOCONF := $(shell if [ -f $(src)/palo.conf ]; then echo $(src)/palo.conf; \
|
||||
else echo $(obj)/palo.conf; \
|
||||
fi)
|
||||
|
||||
palo: vmlinux
|
||||
@if [ -x $PALO ]; then \
|
||||
@if test ! -x "$(PALO)"; then \
|
||||
echo 'ERROR: Please install palo first (apt-get install palo)';\
|
||||
echo 'or build it from source and install it somewhere in your $$PATH';\
|
||||
false; \
|
||||
fi
|
||||
@if [ ! -f ./palo.conf ]; then \
|
||||
cp arch/parisc/defpalo.conf palo.conf; \
|
||||
echo 'A generic palo config file (./palo.conf) has been created for you.'; \
|
||||
@if test ! -f "$(PALOCONF)"; then \
|
||||
cp $(src)/arch/parisc/defpalo.conf $(obj)/palo.conf; \
|
||||
echo 'A generic palo config file ($(obj)/palo.conf) has been created for you.'; \
|
||||
echo 'You should check it and re-run "make palo".'; \
|
||||
echo 'WARNING: the "lifimage" file is now placed in this directory by default!'; \
|
||||
false; \
|
||||
fi
|
||||
$(PALO) -f ./palo.conf
|
||||
$(PALO) -f $(PALOCONF)
|
||||
|
||||
oldpalo: vmlinux
|
||||
export TOPDIR=`pwd`; \
|
||||
unset STRIP LDFLAGS CPP CPPFLAGS AFLAGS CFLAGS CC LD; cd ../palo && make lifimage
|
||||
|
||||
# Shorthands for known targets not supported by parisc, use palo as default
|
||||
Image zImage bzImage: palo
|
||||
# Shorthands for known targets not supported by parisc, use vmlinux as default
|
||||
Image zImage bzImage: vmlinux
|
||||
|
||||
kernel_install: vmlinux
|
||||
sh $(src)/arch/parisc/install.sh \
|
||||
|
@ -116,3 +117,12 @@ define archhelp
|
|||
@echo ' (distribution) /sbin/installkernel or'
|
||||
@echo ' copy to $$(INSTALL_PATH)'
|
||||
endef
|
||||
|
||||
# we require gcc 3.3 or above to compile the kernel
|
||||
archprepare: checkbin
|
||||
checkbin:
|
||||
@if test "$(call cc-version)" -lt "0303"; then \
|
||||
echo -n "Sorry, GCC v3.3 or above is required to build " ; \
|
||||
echo "the kernel." ; \
|
||||
false ; \
|
||||
fi
|
||||
|
|
|
@ -1,39 +1,51 @@
|
|||
#
|
||||
# Automatically generated make config: don't edit
|
||||
# Linux kernel version: 2.6.16-pa6
|
||||
# Sun Mar 26 19:59:51 2006
|
||||
# Linux kernel version: 2.6.23
|
||||
# Fri Oct 12 21:00:07 2007
|
||||
#
|
||||
CONFIG_PARISC=y
|
||||
CONFIG_MMU=y
|
||||
CONFIG_STACK_GROWSUP=y
|
||||
CONFIG_RWSEM_GENERIC_SPINLOCK=y
|
||||
# CONFIG_ARCH_HAS_ILOG2_U32 is not set
|
||||
# CONFIG_ARCH_HAS_ILOG2_U64 is not set
|
||||
CONFIG_GENERIC_FIND_NEXT_BIT=y
|
||||
CONFIG_GENERIC_BUG=y
|
||||
CONFIG_GENERIC_HWEIGHT=y
|
||||
CONFIG_GENERIC_CALIBRATE_DELAY=y
|
||||
CONFIG_GENERIC_TIME=y
|
||||
CONFIG_GENERIC_HARDIRQS=y
|
||||
CONFIG_GENERIC_IRQ_PROBE=y
|
||||
|
||||
#
|
||||
# Code maturity level options
|
||||
#
|
||||
CONFIG_EXPERIMENTAL=y
|
||||
CONFIG_BROKEN_ON_SMP=y
|
||||
CONFIG_INIT_ENV_ARG_LIMIT=32
|
||||
CONFIG_IRQ_PER_CPU=y
|
||||
CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config"
|
||||
|
||||
#
|
||||
# General setup
|
||||
#
|
||||
CONFIG_EXPERIMENTAL=y
|
||||
CONFIG_BROKEN_ON_SMP=y
|
||||
CONFIG_INIT_ENV_ARG_LIMIT=32
|
||||
CONFIG_LOCALVERSION=""
|
||||
# CONFIG_LOCALVERSION_AUTO is not set
|
||||
CONFIG_SWAP=y
|
||||
CONFIG_SYSVIPC=y
|
||||
CONFIG_SYSVIPC_SYSCTL=y
|
||||
CONFIG_POSIX_MQUEUE=y
|
||||
# CONFIG_BSD_PROCESS_ACCT is not set
|
||||
CONFIG_SYSCTL=y
|
||||
# CONFIG_TASKSTATS is not set
|
||||
# CONFIG_USER_NS is not set
|
||||
# CONFIG_AUDIT is not set
|
||||
CONFIG_IKCONFIG=y
|
||||
CONFIG_IKCONFIG_PROC=y
|
||||
CONFIG_LOG_BUF_SHIFT=16
|
||||
CONFIG_SYSFS_DEPRECATED=y
|
||||
# CONFIG_RELAY is not set
|
||||
CONFIG_BLK_DEV_INITRD=y
|
||||
CONFIG_INITRAMFS_SOURCE=""
|
||||
CONFIG_CC_OPTIMIZE_FOR_SIZE=y
|
||||
CONFIG_SYSCTL=y
|
||||
# CONFIG_EMBEDDED is not set
|
||||
CONFIG_SYSCTL_SYSCALL=y
|
||||
CONFIG_KALLSYMS=y
|
||||
CONFIG_KALLSYMS_ALL=y
|
||||
# CONFIG_KALLSYMS_EXTRA_PASS is not set
|
||||
|
@ -43,31 +55,29 @@ CONFIG_BUG=y
|
|||
CONFIG_ELF_CORE=y
|
||||
CONFIG_BASE_FULL=y
|
||||
CONFIG_FUTEX=y
|
||||
CONFIG_ANON_INODES=y
|
||||
CONFIG_EPOLL=y
|
||||
CONFIG_SIGNALFD=y
|
||||
CONFIG_EVENTFD=y
|
||||
CONFIG_SHMEM=y
|
||||
CONFIG_CC_ALIGN_FUNCTIONS=0
|
||||
CONFIG_CC_ALIGN_LABELS=0
|
||||
CONFIG_CC_ALIGN_LOOPS=0
|
||||
CONFIG_CC_ALIGN_JUMPS=0
|
||||
CONFIG_VM_EVENT_COUNTERS=y
|
||||
CONFIG_SLAB=y
|
||||
# CONFIG_SLUB is not set
|
||||
# CONFIG_SLOB is not set
|
||||
CONFIG_RT_MUTEXES=y
|
||||
# CONFIG_TINY_SHMEM is not set
|
||||
CONFIG_BASE_SMALL=0
|
||||
# CONFIG_SLOB is not set
|
||||
|
||||
#
|
||||
# Loadable module support
|
||||
#
|
||||
CONFIG_MODULES=y
|
||||
CONFIG_MODULE_UNLOAD=y
|
||||
CONFIG_MODULE_FORCE_UNLOAD=y
|
||||
CONFIG_OBSOLETE_MODPARM=y
|
||||
# CONFIG_MODVERSIONS is not set
|
||||
# CONFIG_MODULE_SRCVERSION_ALL is not set
|
||||
CONFIG_KMOD=y
|
||||
|
||||
#
|
||||
# Block layer
|
||||
#
|
||||
CONFIG_BLOCK=y
|
||||
# CONFIG_LBD is not set
|
||||
# CONFIG_BLK_DEV_IO_TRACE is not set
|
||||
# CONFIG_LSF is not set
|
||||
# CONFIG_BLK_DEV_BSG is not set
|
||||
|
||||
#
|
||||
# IO Schedulers
|
||||
|
@ -91,6 +101,9 @@ CONFIG_PA7100LC=y
|
|||
# CONFIG_PA7300LC is not set
|
||||
# CONFIG_PA8X00 is not set
|
||||
CONFIG_PA11=y
|
||||
CONFIG_PARISC_PAGE_SIZE_4KB=y
|
||||
# CONFIG_PARISC_PAGE_SIZE_16KB is not set
|
||||
# CONFIG_PARISC_PAGE_SIZE_64KB is not set
|
||||
# CONFIG_SMP is not set
|
||||
CONFIG_ARCH_FLATMEM_ENABLE=y
|
||||
# CONFIG_PREEMPT_NONE is not set
|
||||
|
@ -98,6 +111,7 @@ CONFIG_PREEMPT_VOLUNTARY=y
|
|||
# CONFIG_PREEMPT is not set
|
||||
# CONFIG_HZ_100 is not set
|
||||
CONFIG_HZ_250=y
|
||||
# CONFIG_HZ_300 is not set
|
||||
# CONFIG_HZ_1000 is not set
|
||||
CONFIG_HZ=250
|
||||
CONFIG_SELECT_MEMORY_MODEL=y
|
||||
|
@ -108,6 +122,9 @@ CONFIG_FLATMEM=y
|
|||
CONFIG_FLAT_NODE_MEM_MAP=y
|
||||
# CONFIG_SPARSEMEM_STATIC is not set
|
||||
CONFIG_SPLIT_PTLOCK_CPUS=4096
|
||||
# CONFIG_RESOURCES_64BIT is not set
|
||||
CONFIG_ZONE_DMA_FLAG=0
|
||||
CONFIG_VIRT_TO_BUS=y
|
||||
# CONFIG_HPUX is not set
|
||||
|
||||
#
|
||||
|
@ -120,21 +137,19 @@ CONFIG_GSC_LASI=y
|
|||
# CONFIG_GSC_WAX is not set
|
||||
# CONFIG_EISA is not set
|
||||
# CONFIG_PCI is not set
|
||||
# CONFIG_ARCH_SUPPORTS_MSI is not set
|
||||
|
||||
#
|
||||
# PCCARD (PCMCIA/CardBus) support
|
||||
#
|
||||
# CONFIG_PCCARD is not set
|
||||
|
||||
#
|
||||
# PCI Hotplug Support
|
||||
#
|
||||
|
||||
#
|
||||
# PA-RISC specific drivers
|
||||
#
|
||||
CONFIG_CHASSIS_LCD_LED=y
|
||||
# CONFIG_PDC_CHASSIS is not set
|
||||
CONFIG_PDC_CHASSIS_WARN=y
|
||||
CONFIG_PDC_STABLE=y
|
||||
|
||||
#
|
||||
|
@ -151,13 +166,15 @@ CONFIG_NET=y
|
|||
#
|
||||
# Networking options
|
||||
#
|
||||
# CONFIG_NETDEBUG is not set
|
||||
CONFIG_PACKET=y
|
||||
CONFIG_PACKET_MMAP=y
|
||||
CONFIG_UNIX=y
|
||||
CONFIG_XFRM=y
|
||||
CONFIG_XFRM_USER=m
|
||||
# CONFIG_XFRM_SUB_POLICY is not set
|
||||
# CONFIG_XFRM_MIGRATE is not set
|
||||
CONFIG_NET_KEY=m
|
||||
# CONFIG_NET_KEY_MIGRATE is not set
|
||||
CONFIG_INET=y
|
||||
CONFIG_IP_MULTICAST=y
|
||||
# CONFIG_IP_ADVANCED_ROUTER is not set
|
||||
|
@ -174,17 +191,23 @@ CONFIG_IP_PNP_BOOTP=y
|
|||
CONFIG_INET_AH=m
|
||||
CONFIG_INET_ESP=m
|
||||
# CONFIG_INET_IPCOMP is not set
|
||||
CONFIG_INET_TUNNEL=m
|
||||
# CONFIG_INET_XFRM_TUNNEL is not set
|
||||
# CONFIG_INET_TUNNEL is not set
|
||||
CONFIG_INET_XFRM_MODE_TRANSPORT=y
|
||||
CONFIG_INET_XFRM_MODE_TUNNEL=y
|
||||
CONFIG_INET_XFRM_MODE_BEET=y
|
||||
# CONFIG_INET_LRO is not set
|
||||
CONFIG_INET_DIAG=m
|
||||
CONFIG_INET_TCP_DIAG=m
|
||||
# CONFIG_TCP_CONG_ADVANCED is not set
|
||||
CONFIG_TCP_CONG_BIC=y
|
||||
|
||||
#
|
||||
# IP: Virtual Server Configuration
|
||||
#
|
||||
CONFIG_TCP_CONG_CUBIC=y
|
||||
CONFIG_DEFAULT_TCP_CONG="cubic"
|
||||
# CONFIG_TCP_MD5SIG is not set
|
||||
# CONFIG_IP_VS is not set
|
||||
# CONFIG_IPV6 is not set
|
||||
# CONFIG_INET6_XFRM_TUNNEL is not set
|
||||
# CONFIG_INET6_TUNNEL is not set
|
||||
# CONFIG_NETWORK_SECMARK is not set
|
||||
CONFIG_NETFILTER=y
|
||||
# CONFIG_NETFILTER_DEBUG is not set
|
||||
|
||||
|
@ -192,37 +215,18 @@ CONFIG_NETFILTER=y
|
|||
# Core Netfilter Configuration
|
||||
#
|
||||
# CONFIG_NETFILTER_NETLINK is not set
|
||||
# CONFIG_NF_CONNTRACK_ENABLED is not set
|
||||
# CONFIG_NF_CONNTRACK is not set
|
||||
# CONFIG_NETFILTER_XTABLES is not set
|
||||
|
||||
#
|
||||
# IP: Netfilter Configuration
|
||||
#
|
||||
CONFIG_IP_NF_CONNTRACK=m
|
||||
# CONFIG_IP_NF_CT_ACCT is not set
|
||||
CONFIG_IP_NF_CONNTRACK_MARK=y
|
||||
# CONFIG_IP_NF_CONNTRACK_EVENTS is not set
|
||||
CONFIG_IP_NF_CT_PROTO_SCTP=m
|
||||
CONFIG_IP_NF_FTP=m
|
||||
CONFIG_IP_NF_IRC=m
|
||||
# CONFIG_IP_NF_NETBIOS_NS is not set
|
||||
CONFIG_IP_NF_TFTP=m
|
||||
CONFIG_IP_NF_AMANDA=m
|
||||
# CONFIG_IP_NF_PPTP is not set
|
||||
CONFIG_IP_NF_QUEUE=m
|
||||
|
||||
#
|
||||
# DCCP Configuration (EXPERIMENTAL)
|
||||
#
|
||||
# CONFIG_IP_NF_IPTABLES is not set
|
||||
# CONFIG_IP_NF_ARPTABLES is not set
|
||||
# CONFIG_IP_DCCP is not set
|
||||
|
||||
#
|
||||
# SCTP Configuration (EXPERIMENTAL)
|
||||
#
|
||||
# CONFIG_IP_SCTP is not set
|
||||
|
||||
#
|
||||
# TIPC Configuration (EXPERIMENTAL)
|
||||
#
|
||||
# CONFIG_TIPC is not set
|
||||
# CONFIG_ATM is not set
|
||||
# CONFIG_BRIDGE is not set
|
||||
|
@ -234,7 +238,6 @@ CONFIG_LLC2=m
|
|||
# CONFIG_ATALK is not set
|
||||
# CONFIG_X25 is not set
|
||||
# CONFIG_LAPB is not set
|
||||
# CONFIG_NET_DIVERT is not set
|
||||
# CONFIG_ECONET is not set
|
||||
# CONFIG_WAN_ROUTER is not set
|
||||
|
||||
|
@ -250,7 +253,17 @@ CONFIG_NET_PKTGEN=m
|
|||
# CONFIG_HAMRADIO is not set
|
||||
# CONFIG_IRDA is not set
|
||||
# CONFIG_BT is not set
|
||||
# CONFIG_AF_RXRPC is not set
|
||||
|
||||
#
|
||||
# Wireless
|
||||
#
|
||||
# CONFIG_CFG80211 is not set
|
||||
# CONFIG_WIRELESS_EXT is not set
|
||||
# CONFIG_MAC80211 is not set
|
||||
# CONFIG_IEEE80211 is not set
|
||||
# CONFIG_RFKILL is not set
|
||||
# CONFIG_NET_9P is not set
|
||||
|
||||
#
|
||||
# Device Drivers
|
||||
|
@ -259,39 +272,24 @@ CONFIG_NET_PKTGEN=m
|
|||
#
|
||||
# Generic Driver Options
|
||||
#
|
||||
CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug"
|
||||
# CONFIG_STANDALONE is not set
|
||||
# CONFIG_PREVENT_FIRMWARE_BUILD is not set
|
||||
CONFIG_FW_LOADER=y
|
||||
# CONFIG_DEBUG_DRIVER is not set
|
||||
|
||||
#
|
||||
# Connector - unified userspace <-> kernelspace linker
|
||||
#
|
||||
# CONFIG_DEBUG_DEVRES is not set
|
||||
# CONFIG_SYS_HYPERVISOR is not set
|
||||
# CONFIG_CONNECTOR is not set
|
||||
|
||||
#
|
||||
# Memory Technology Devices (MTD)
|
||||
#
|
||||
# CONFIG_MTD is not set
|
||||
|
||||
#
|
||||
# Parallel port support
|
||||
#
|
||||
CONFIG_PARPORT=y
|
||||
CONFIG_PARPORT_PC=m
|
||||
# CONFIG_PARPORT_PC_FIFO is not set
|
||||
# CONFIG_PARPORT_PC_SUPERIO is not set
|
||||
CONFIG_PARPORT_NOT_PC=y
|
||||
CONFIG_PARPORT_GSC=y
|
||||
# CONFIG_PARPORT_AX88796 is not set
|
||||
# CONFIG_PARPORT_1284 is not set
|
||||
|
||||
#
|
||||
# Plug and Play support
|
||||
#
|
||||
|
||||
#
|
||||
# Block devices
|
||||
#
|
||||
CONFIG_PARPORT_NOT_PC=y
|
||||
CONFIG_BLK_DEV=y
|
||||
# CONFIG_PARIDE is not set
|
||||
# CONFIG_BLK_DEV_COW_COMMON is not set
|
||||
CONFIG_BLK_DEV_LOOP=y
|
||||
|
@ -300,13 +298,11 @@ CONFIG_BLK_DEV_CRYPTOLOOP=y
|
|||
CONFIG_BLK_DEV_RAM=y
|
||||
CONFIG_BLK_DEV_RAM_COUNT=16
|
||||
CONFIG_BLK_DEV_RAM_SIZE=6144
|
||||
CONFIG_BLK_DEV_INITRD=y
|
||||
CONFIG_BLK_DEV_RAM_BLOCKSIZE=1024
|
||||
# CONFIG_CDROM_PKTCDVD is not set
|
||||
CONFIG_ATA_OVER_ETH=m
|
||||
|
||||
#
|
||||
# ATA/ATAPI/MFM/RLL support
|
||||
#
|
||||
CONFIG_MISC_DEVICES=y
|
||||
# CONFIG_EEPROM_93CX6 is not set
|
||||
# CONFIG_IDE is not set
|
||||
|
||||
#
|
||||
|
@ -314,6 +310,9 @@ CONFIG_ATA_OVER_ETH=m
|
|||
#
|
||||
# CONFIG_RAID_ATTRS is not set
|
||||
CONFIG_SCSI=y
|
||||
CONFIG_SCSI_DMA=y
|
||||
# CONFIG_SCSI_TGT is not set
|
||||
# CONFIG_SCSI_NETLINK is not set
|
||||
CONFIG_SCSI_PROC_FS=y
|
||||
|
||||
#
|
||||
|
@ -333,104 +332,61 @@ CONFIG_CHR_DEV_SG=y
|
|||
# CONFIG_SCSI_MULTI_LUN is not set
|
||||
# CONFIG_SCSI_CONSTANTS is not set
|
||||
# CONFIG_SCSI_LOGGING is not set
|
||||
# CONFIG_SCSI_SCAN_ASYNC is not set
|
||||
CONFIG_SCSI_WAIT_SCAN=m
|
||||
|
||||
#
|
||||
# SCSI Transport Attributes
|
||||
# SCSI Transports
|
||||
#
|
||||
CONFIG_SCSI_SPI_ATTRS=y
|
||||
# CONFIG_SCSI_FC_ATTRS is not set
|
||||
CONFIG_SCSI_ISCSI_ATTRS=m
|
||||
# CONFIG_SCSI_SAS_ATTRS is not set
|
||||
|
||||
#
|
||||
# SCSI low-level drivers
|
||||
#
|
||||
# CONFIG_SCSI_SAS_LIBSAS is not set
|
||||
CONFIG_SCSI_LOWLEVEL=y
|
||||
# CONFIG_ISCSI_TCP is not set
|
||||
# CONFIG_SCSI_SATA is not set
|
||||
# CONFIG_SCSI_PPA is not set
|
||||
# CONFIG_SCSI_IMM is not set
|
||||
CONFIG_SCSI_LASI700=y
|
||||
CONFIG_53C700_LE_ON_BE=y
|
||||
# CONFIG_SCSI_ZALON is not set
|
||||
CONFIG_SCSI_DEBUG=m
|
||||
|
||||
#
|
||||
# Multi-device support (RAID and LVM)
|
||||
#
|
||||
# CONFIG_ATA is not set
|
||||
CONFIG_MD=y
|
||||
CONFIG_BLK_DEV_MD=m
|
||||
CONFIG_MD_LINEAR=m
|
||||
CONFIG_MD_RAID0=m
|
||||
CONFIG_MD_RAID1=m
|
||||
# CONFIG_MD_RAID10 is not set
|
||||
# CONFIG_MD_RAID5 is not set
|
||||
# CONFIG_MD_RAID6 is not set
|
||||
# CONFIG_MD_RAID456 is not set
|
||||
# CONFIG_MD_MULTIPATH is not set
|
||||
# CONFIG_MD_FAULTY is not set
|
||||
# CONFIG_BLK_DEV_DM is not set
|
||||
|
||||
#
|
||||
# Fusion MPT device support
|
||||
#
|
||||
# CONFIG_FUSION is not set
|
||||
|
||||
#
|
||||
# IEEE 1394 (FireWire) support
|
||||
#
|
||||
|
||||
#
|
||||
# I2O device support
|
||||
#
|
||||
|
||||
#
|
||||
# Network device support
|
||||
#
|
||||
CONFIG_NETDEVICES=y
|
||||
# CONFIG_NETDEVICES_MULTIQUEUE is not set
|
||||
CONFIG_DUMMY=m
|
||||
CONFIG_BONDING=m
|
||||
# CONFIG_MACVLAN is not set
|
||||
# CONFIG_EQUALIZER is not set
|
||||
CONFIG_TUN=m
|
||||
|
||||
#
|
||||
# PHY device support
|
||||
#
|
||||
# CONFIG_VETH is not set
|
||||
# CONFIG_PHYLIB is not set
|
||||
|
||||
#
|
||||
# Ethernet (10 or 100Mbit)
|
||||
#
|
||||
CONFIG_NET_ETHERNET=y
|
||||
CONFIG_MII=m
|
||||
CONFIG_LASI_82596=y
|
||||
# CONFIG_IBM_NEW_EMAC_ZMII is not set
|
||||
# CONFIG_IBM_NEW_EMAC_RGMII is not set
|
||||
# CONFIG_IBM_NEW_EMAC_TAH is not set
|
||||
# CONFIG_IBM_NEW_EMAC_EMAC4 is not set
|
||||
# CONFIG_B44 is not set
|
||||
# CONFIG_NET_POCKET is not set
|
||||
CONFIG_NETDEV_1000=y
|
||||
CONFIG_NETDEV_10000=y
|
||||
|
||||
#
|
||||
# Ethernet (1000 Mbit)
|
||||
#
|
||||
|
||||
#
|
||||
# Ethernet (10000 Mbit)
|
||||
#
|
||||
|
||||
#
|
||||
# Token Ring devices
|
||||
#
|
||||
|
||||
#
|
||||
# Wireless LAN (non-hamradio)
|
||||
#
|
||||
CONFIG_NET_RADIO=y
|
||||
|
||||
#
|
||||
# Obsolete Wireless cards support (pre-802.11)
|
||||
#
|
||||
# CONFIG_STRIP is not set
|
||||
# CONFIG_ATMEL is not set
|
||||
# CONFIG_HOSTAP is not set
|
||||
|
||||
#
|
||||
# Wan interfaces
|
||||
# Wireless LAN
|
||||
#
|
||||
# CONFIG_WLAN_PRE80211 is not set
|
||||
# CONFIG_WLAN_80211 is not set
|
||||
# CONFIG_WAN is not set
|
||||
# CONFIG_PLIP is not set
|
||||
CONFIG_PPP=m
|
||||
|
@ -442,26 +398,22 @@ CONFIG_PPP_DEFLATE=m
|
|||
CONFIG_PPP_BSDCOMP=m
|
||||
CONFIG_PPP_MPPE=m
|
||||
CONFIG_PPPOE=m
|
||||
# CONFIG_PPPOL2TP is not set
|
||||
# CONFIG_SLIP is not set
|
||||
CONFIG_SLHC=m
|
||||
# CONFIG_SHAPER is not set
|
||||
# CONFIG_NETCONSOLE is not set
|
||||
# CONFIG_NETPOLL is not set
|
||||
# CONFIG_NET_POLL_CONTROLLER is not set
|
||||
|
||||
#
|
||||
# ISDN subsystem
|
||||
#
|
||||
# CONFIG_ISDN is not set
|
||||
|
||||
#
|
||||
# Telephony Support
|
||||
#
|
||||
# CONFIG_PHONE is not set
|
||||
|
||||
#
|
||||
# Input device support
|
||||
#
|
||||
CONFIG_INPUT=y
|
||||
# CONFIG_INPUT_FF_MEMLESS is not set
|
||||
# CONFIG_INPUT_POLLDEV is not set
|
||||
|
||||
#
|
||||
# Userland interfaces
|
||||
|
@ -486,14 +438,22 @@ CONFIG_KEYBOARD_ATKBD_HP_KEYCODES=y
|
|||
# CONFIG_KEYBOARD_LKKBD is not set
|
||||
# CONFIG_KEYBOARD_XTKBD is not set
|
||||
# CONFIG_KEYBOARD_NEWTON is not set
|
||||
# CONFIG_KEYBOARD_STOWAWAY is not set
|
||||
# CONFIG_KEYBOARD_HIL_OLD is not set
|
||||
CONFIG_KEYBOARD_HIL=y
|
||||
CONFIG_INPUT_MOUSE=y
|
||||
CONFIG_MOUSE_PS2=y
|
||||
CONFIG_MOUSE_PS2_ALPS=y
|
||||
CONFIG_MOUSE_PS2_LOGIPS2PP=y
|
||||
CONFIG_MOUSE_PS2_SYNAPTICS=y
|
||||
CONFIG_MOUSE_PS2_LIFEBOOK=y
|
||||
CONFIG_MOUSE_PS2_TRACKPOINT=y
|
||||
# CONFIG_MOUSE_PS2_TOUCHKIT is not set
|
||||
CONFIG_MOUSE_SERIAL=m
|
||||
# CONFIG_MOUSE_VSXXXAA is not set
|
||||
CONFIG_MOUSE_HIL=m
|
||||
# CONFIG_INPUT_JOYSTICK is not set
|
||||
# CONFIG_INPUT_TABLET is not set
|
||||
# CONFIG_INPUT_TOUCHSCREEN is not set
|
||||
# CONFIG_INPUT_MISC is not set
|
||||
|
||||
|
@ -516,6 +476,7 @@ CONFIG_SERIO_LIBPS2=y
|
|||
CONFIG_VT=y
|
||||
CONFIG_VT_CONSOLE=y
|
||||
CONFIG_HW_CONSOLE=y
|
||||
# CONFIG_VT_HW_CONSOLE_BINDING is not set
|
||||
# CONFIG_SERIAL_NONSTANDARD is not set
|
||||
|
||||
#
|
||||
|
@ -523,6 +484,7 @@ CONFIG_HW_CONSOLE=y
|
|||
#
|
||||
CONFIG_SERIAL_8250=y
|
||||
CONFIG_SERIAL_8250_CONSOLE=y
|
||||
CONFIG_SERIAL_8250_GSC=y
|
||||
CONFIG_SERIAL_8250_NR_UARTS=17
|
||||
CONFIG_SERIAL_8250_RUNTIME_UARTS=4
|
||||
CONFIG_SERIAL_8250_EXTENDED=y
|
||||
|
@ -545,36 +507,15 @@ CONFIG_PRINTER=m
|
|||
# CONFIG_LP_CONSOLE is not set
|
||||
CONFIG_PPDEV=m
|
||||
# CONFIG_TIPAR is not set
|
||||
|
||||
#
|
||||
# IPMI
|
||||
#
|
||||
# CONFIG_IPMI_HANDLER is not set
|
||||
|
||||
#
|
||||
# Watchdog Cards
|
||||
#
|
||||
# CONFIG_WATCHDOG is not set
|
||||
# CONFIG_HW_RANDOM is not set
|
||||
CONFIG_GEN_RTC=y
|
||||
CONFIG_GEN_RTC_X=y
|
||||
# CONFIG_DTLK is not set
|
||||
# CONFIG_R3964 is not set
|
||||
|
||||
#
|
||||
# Ftape, the floppy tape device driver
|
||||
#
|
||||
CONFIG_RAW_DRIVER=y
|
||||
CONFIG_MAX_RAW_DEVS=256
|
||||
|
||||
#
|
||||
# TPM devices
|
||||
#
|
||||
# CONFIG_TCG_TPM is not set
|
||||
# CONFIG_TELCLOCK is not set
|
||||
|
||||
#
|
||||
# I2C support
|
||||
#
|
||||
# CONFIG_I2C is not set
|
||||
|
||||
#
|
||||
|
@ -582,46 +523,59 @@ CONFIG_MAX_RAW_DEVS=256
|
|||
#
|
||||
# CONFIG_SPI is not set
|
||||
# CONFIG_SPI_MASTER is not set
|
||||
|
||||
#
|
||||
# Dallas's 1-wire bus
|
||||
#
|
||||
# CONFIG_W1 is not set
|
||||
|
||||
#
|
||||
# Hardware Monitoring support
|
||||
#
|
||||
# CONFIG_POWER_SUPPLY is not set
|
||||
# CONFIG_HWMON is not set
|
||||
# CONFIG_HWMON_VID is not set
|
||||
|
||||
#
|
||||
# Misc devices
|
||||
# Sonics Silicon Backplane
|
||||
#
|
||||
CONFIG_SSB_POSSIBLE=y
|
||||
# CONFIG_SSB is not set
|
||||
|
||||
#
|
||||
# Multimedia Capabilities Port drivers
|
||||
# Multifunction device drivers
|
||||
#
|
||||
# CONFIG_MFD_SM501 is not set
|
||||
|
||||
#
|
||||
# Multimedia devices
|
||||
#
|
||||
# CONFIG_VIDEO_DEV is not set
|
||||
|
||||
#
|
||||
# Digital Video Broadcasting Devices
|
||||
#
|
||||
# CONFIG_DVB is not set
|
||||
# CONFIG_DVB_CORE is not set
|
||||
# CONFIG_DAB is not set
|
||||
|
||||
#
|
||||
# Graphics support
|
||||
#
|
||||
# CONFIG_BACKLIGHT_LCD_SUPPORT is not set
|
||||
|
||||
#
|
||||
# Display device support
|
||||
#
|
||||
# CONFIG_DISPLAY_SUPPORT is not set
|
||||
# CONFIG_VGASTATE is not set
|
||||
CONFIG_VIDEO_OUTPUT_CONTROL=m
|
||||
CONFIG_FB=y
|
||||
# CONFIG_FIRMWARE_EDID is not set
|
||||
# CONFIG_FB_DDC is not set
|
||||
CONFIG_FB_CFB_FILLRECT=y
|
||||
CONFIG_FB_CFB_COPYAREA=y
|
||||
CONFIG_FB_CFB_IMAGEBLIT=y
|
||||
# CONFIG_FB_SYS_FILLRECT is not set
|
||||
# CONFIG_FB_SYS_COPYAREA is not set
|
||||
# CONFIG_FB_SYS_IMAGEBLIT is not set
|
||||
# CONFIG_FB_SYS_FOPS is not set
|
||||
CONFIG_FB_DEFERRED_IO=y
|
||||
# CONFIG_FB_SVGALIB is not set
|
||||
# CONFIG_FB_MACMODES is not set
|
||||
# CONFIG_FB_BACKLIGHT is not set
|
||||
CONFIG_FB_MODE_HELPERS=y
|
||||
CONFIG_FB_TILEBLITTING=y
|
||||
|
||||
#
|
||||
# Frame buffer hardware drivers
|
||||
#
|
||||
CONFIG_FB_STI=y
|
||||
# CONFIG_FB_S1D13XXX is not set
|
||||
# CONFIG_FB_VIRTUAL is not set
|
||||
|
@ -633,6 +587,7 @@ CONFIG_DUMMY_CONSOLE=y
|
|||
CONFIG_DUMMY_CONSOLE_COLUMNS=128
|
||||
CONFIG_DUMMY_CONSOLE_ROWS=48
|
||||
CONFIG_FRAMEBUFFER_CONSOLE=y
|
||||
# CONFIG_FRAMEBUFFER_CONSOLE_DETECT_PRIMARY is not set
|
||||
# CONFIG_FRAMEBUFFER_CONSOLE_ROTATION is not set
|
||||
CONFIG_STI_CONSOLE=y
|
||||
CONFIG_FONTS=y
|
||||
|
@ -646,16 +601,11 @@ CONFIG_FONT_8x16=y
|
|||
# CONFIG_FONT_SUN8x16 is not set
|
||||
# CONFIG_FONT_SUN12x22 is not set
|
||||
# CONFIG_FONT_10x18 is not set
|
||||
|
||||
#
|
||||
# Logo configuration
|
||||
#
|
||||
CONFIG_LOGO=y
|
||||
# CONFIG_LOGO_LINUX_MONO is not set
|
||||
# CONFIG_LOGO_LINUX_VGA16 is not set
|
||||
# CONFIG_LOGO_LINUX_CLUT224 is not set
|
||||
CONFIG_LOGO_PARISC_CLUT224=y
|
||||
# CONFIG_BACKLIGHT_LCD_SUPPORT is not set
|
||||
|
||||
#
|
||||
# Sound
|
||||
|
@ -673,9 +623,11 @@ CONFIG_SND_SEQUENCER=y
|
|||
CONFIG_SND_OSSEMUL=y
|
||||
CONFIG_SND_MIXER_OSS=y
|
||||
CONFIG_SND_PCM_OSS=y
|
||||
CONFIG_SND_PCM_OSS_PLUGINS=y
|
||||
CONFIG_SND_SEQUENCER_OSS=y
|
||||
# CONFIG_SND_DYNAMIC_MINORS is not set
|
||||
CONFIG_SND_SUPPORT_OLD_API=y
|
||||
CONFIG_SND_VERBOSE_PROCFS=y
|
||||
# CONFIG_SND_VERBOSE_PRINTK is not set
|
||||
# CONFIG_SND_DEBUG is not set
|
||||
|
||||
|
@ -685,24 +637,36 @@ CONFIG_SND_SUPPORT_OLD_API=y
|
|||
# CONFIG_SND_DUMMY is not set
|
||||
# CONFIG_SND_VIRMIDI is not set
|
||||
# CONFIG_SND_MTPAV is not set
|
||||
# CONFIG_SND_MTS64 is not set
|
||||
# CONFIG_SND_SERIAL_U16550 is not set
|
||||
# CONFIG_SND_MPU401 is not set
|
||||
# CONFIG_SND_PORTMAN2X4 is not set
|
||||
|
||||
#
|
||||
# GSC devices
|
||||
#
|
||||
CONFIG_SND_HARMONY=y
|
||||
|
||||
#
|
||||
# System on Chip audio support
|
||||
#
|
||||
# CONFIG_SND_SOC is not set
|
||||
|
||||
#
|
||||
# SoC Audio support for SuperH
|
||||
#
|
||||
|
||||
#
|
||||
# Open Sound System
|
||||
#
|
||||
# CONFIG_SOUND_PRIME is not set
|
||||
|
||||
#
|
||||
# USB support
|
||||
#
|
||||
CONFIG_HID_SUPPORT=y
|
||||
CONFIG_HID=y
|
||||
CONFIG_HID_DEBUG=y
|
||||
CONFIG_USB_SUPPORT=y
|
||||
# CONFIG_USB_ARCH_HAS_HCD is not set
|
||||
# CONFIG_USB_ARCH_HAS_OHCI is not set
|
||||
# CONFIG_USB_ARCH_HAS_EHCI is not set
|
||||
|
||||
#
|
||||
# NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support'
|
||||
|
@ -712,19 +676,28 @@ CONFIG_SND_HARMONY=y
|
|||
# USB Gadget Support
|
||||
#
|
||||
# CONFIG_USB_GADGET is not set
|
||||
|
||||
#
|
||||
# MMC/SD Card support
|
||||
#
|
||||
# CONFIG_MMC is not set
|
||||
# CONFIG_NEW_LEDS is not set
|
||||
# CONFIG_RTC_CLASS is not set
|
||||
|
||||
#
|
||||
# InfiniBand support
|
||||
# DMA Engine support
|
||||
#
|
||||
# CONFIG_DMA_ENGINE is not set
|
||||
|
||||
#
|
||||
# DMA Clients
|
||||
#
|
||||
|
||||
#
|
||||
# EDAC - error detection and reporting (RAS) (EXPERIMENTAL)
|
||||
# DMA Devices
|
||||
#
|
||||
# CONFIG_AUXDISPLAY is not set
|
||||
|
||||
#
|
||||
# Userspace I/O
|
||||
#
|
||||
# CONFIG_UIO is not set
|
||||
|
||||
#
|
||||
# File systems
|
||||
|
@ -734,6 +707,7 @@ CONFIG_EXT2_FS=y
|
|||
# CONFIG_EXT2_FS_XIP is not set
|
||||
CONFIG_EXT3_FS=y
|
||||
# CONFIG_EXT3_FS_XATTR is not set
|
||||
# CONFIG_EXT4DEV_FS is not set
|
||||
CONFIG_JBD=y
|
||||
# CONFIG_JBD_DEBUG is not set
|
||||
# CONFIG_REISERFS_FS is not set
|
||||
|
@ -744,15 +718,16 @@ CONFIG_JFS_FS=m
|
|||
# CONFIG_JFS_STATISTICS is not set
|
||||
CONFIG_FS_POSIX_ACL=y
|
||||
CONFIG_XFS_FS=m
|
||||
CONFIG_XFS_EXPORT=y
|
||||
# CONFIG_XFS_QUOTA is not set
|
||||
# CONFIG_XFS_SECURITY is not set
|
||||
# CONFIG_XFS_POSIX_ACL is not set
|
||||
# CONFIG_XFS_RT is not set
|
||||
# CONFIG_GFS2_FS is not set
|
||||
# CONFIG_OCFS2_FS is not set
|
||||
# CONFIG_MINIX_FS is not set
|
||||
# CONFIG_ROMFS_FS is not set
|
||||
CONFIG_INOTIFY=y
|
||||
CONFIG_INOTIFY_USER=y
|
||||
# CONFIG_QUOTA is not set
|
||||
CONFIG_DNOTIFY=y
|
||||
# CONFIG_AUTOFS_FS is not set
|
||||
|
@ -783,11 +758,12 @@ CONFIG_FAT_DEFAULT_IOCHARSET="iso8859-1"
|
|||
#
|
||||
CONFIG_PROC_FS=y
|
||||
CONFIG_PROC_KCORE=y
|
||||
CONFIG_PROC_SYSCTL=y
|
||||
CONFIG_SYSFS=y
|
||||
CONFIG_TMPFS=y
|
||||
# CONFIG_TMPFS_POSIX_ACL is not set
|
||||
# CONFIG_HUGETLB_PAGE is not set
|
||||
CONFIG_RAMFS=y
|
||||
# CONFIG_RELAYFS_FS is not set
|
||||
# CONFIG_CONFIGFS_FS is not set
|
||||
|
||||
#
|
||||
|
@ -795,6 +771,7 @@ CONFIG_RAMFS=y
|
|||
#
|
||||
# CONFIG_ADFS_FS is not set
|
||||
# CONFIG_AFFS_FS is not set
|
||||
# CONFIG_ECRYPT_FS is not set
|
||||
# CONFIG_HFS_FS is not set
|
||||
# CONFIG_HFSPLUS_FS is not set
|
||||
# CONFIG_BEFS_FS is not set
|
||||
|
@ -806,6 +783,8 @@ CONFIG_RAMFS=y
|
|||
# CONFIG_QNX4FS_FS is not set
|
||||
# CONFIG_SYSV_FS is not set
|
||||
CONFIG_UFS_FS=m
|
||||
# CONFIG_UFS_FS_WRITE is not set
|
||||
# CONFIG_UFS_DEBUG is not set
|
||||
|
||||
#
|
||||
# Network File Systems
|
||||
|
@ -827,6 +806,7 @@ CONFIG_EXPORTFS=m
|
|||
CONFIG_NFS_COMMON=y
|
||||
CONFIG_SUNRPC=y
|
||||
CONFIG_SUNRPC_GSS=y
|
||||
# CONFIG_SUNRPC_BIND34 is not set
|
||||
CONFIG_RPCSEC_GSS_KRB5=y
|
||||
CONFIG_RPCSEC_GSS_SPKM3=m
|
||||
CONFIG_SMB_FS=m
|
||||
|
@ -834,12 +814,13 @@ CONFIG_SMB_NLS_DEFAULT=y
|
|||
CONFIG_SMB_NLS_REMOTE="cp437"
|
||||
CONFIG_CIFS=m
|
||||
# CONFIG_CIFS_STATS is not set
|
||||
# CONFIG_CIFS_WEAK_PW_HASH is not set
|
||||
# CONFIG_CIFS_XATTR is not set
|
||||
# CONFIG_CIFS_DEBUG2 is not set
|
||||
# CONFIG_CIFS_EXPERIMENTAL is not set
|
||||
# CONFIG_NCP_FS is not set
|
||||
# CONFIG_CODA_FS is not set
|
||||
# CONFIG_AFS_FS is not set
|
||||
# CONFIG_9P_FS is not set
|
||||
|
||||
#
|
||||
# Partition Types
|
||||
|
@ -891,6 +872,11 @@ CONFIG_NLS_KOI8_R=m
|
|||
CONFIG_NLS_KOI8_U=m
|
||||
CONFIG_NLS_UTF8=m
|
||||
|
||||
#
|
||||
# Distributed Lock Manager
|
||||
#
|
||||
# CONFIG_DLM is not set
|
||||
|
||||
#
|
||||
# Profiling support
|
||||
#
|
||||
|
@ -901,21 +887,32 @@ CONFIG_OPROFILE=m
|
|||
# Kernel hacking
|
||||
#
|
||||
# CONFIG_PRINTK_TIME is not set
|
||||
CONFIG_ENABLE_MUST_CHECK=y
|
||||
CONFIG_MAGIC_SYSRQ=y
|
||||
CONFIG_DEBUG_KERNEL=y
|
||||
CONFIG_LOG_BUF_SHIFT=16
|
||||
CONFIG_DETECT_SOFTLOCKUP=y
|
||||
# CONFIG_SCHEDSTATS is not set
|
||||
# CONFIG_DEBUG_SLAB is not set
|
||||
CONFIG_DEBUG_MUTEXES=y
|
||||
# CONFIG_DEBUG_SPINLOCK is not set
|
||||
# CONFIG_DEBUG_SPINLOCK_SLEEP is not set
|
||||
# CONFIG_DEBUG_KOBJECT is not set
|
||||
# CONFIG_DEBUG_INFO is not set
|
||||
# CONFIG_UNUSED_SYMBOLS is not set
|
||||
# CONFIG_DEBUG_FS is not set
|
||||
# CONFIG_HEADERS_CHECK is not set
|
||||
CONFIG_DEBUG_KERNEL=y
|
||||
# CONFIG_DEBUG_SHIRQ is not set
|
||||
CONFIG_DETECT_SOFTLOCKUP=y
|
||||
CONFIG_SCHED_DEBUG=y
|
||||
# CONFIG_SCHEDSTATS is not set
|
||||
# CONFIG_TIMER_STATS is not set
|
||||
# CONFIG_DEBUG_SLAB is not set
|
||||
# CONFIG_DEBUG_RT_MUTEXES is not set
|
||||
# CONFIG_RT_MUTEX_TESTER is not set
|
||||
# CONFIG_DEBUG_SPINLOCK is not set
|
||||
CONFIG_DEBUG_MUTEXES=y
|
||||
# CONFIG_DEBUG_SPINLOCK_SLEEP is not set
|
||||
# CONFIG_DEBUG_LOCKING_API_SELFTESTS is not set
|
||||
# CONFIG_DEBUG_KOBJECT is not set
|
||||
CONFIG_DEBUG_BUGVERBOSE=y
|
||||
# CONFIG_DEBUG_INFO is not set
|
||||
# CONFIG_DEBUG_VM is not set
|
||||
# CONFIG_DEBUG_LIST is not set
|
||||
CONFIG_FORCED_INLINING=y
|
||||
# CONFIG_RCU_TORTURE_TEST is not set
|
||||
# CONFIG_FAULT_INJECTION is not set
|
||||
CONFIG_DEBUG_RODATA=y
|
||||
|
||||
#
|
||||
|
@ -924,12 +921,13 @@ CONFIG_DEBUG_RODATA=y
|
|||
CONFIG_KEYS=y
|
||||
CONFIG_KEYS_DEBUG_PROC_KEYS=y
|
||||
# CONFIG_SECURITY is not set
|
||||
|
||||
#
|
||||
# Cryptographic options
|
||||
#
|
||||
CONFIG_CRYPTO=y
|
||||
CONFIG_CRYPTO_ALGAPI=y
|
||||
CONFIG_CRYPTO_BLKCIPHER=y
|
||||
CONFIG_CRYPTO_HASH=y
|
||||
CONFIG_CRYPTO_MANAGER=y
|
||||
CONFIG_CRYPTO_HMAC=y
|
||||
# CONFIG_CRYPTO_XCBC is not set
|
||||
CONFIG_CRYPTO_NULL=m
|
||||
CONFIG_CRYPTO_MD4=m
|
||||
CONFIG_CRYPTO_MD5=y
|
||||
|
@ -938,9 +936,18 @@ CONFIG_CRYPTO_SHA256=m
|
|||
CONFIG_CRYPTO_SHA512=m
|
||||
CONFIG_CRYPTO_WP512=m
|
||||
CONFIG_CRYPTO_TGR192=m
|
||||
# CONFIG_CRYPTO_GF128MUL is not set
|
||||
CONFIG_CRYPTO_ECB=m
|
||||
CONFIG_CRYPTO_CBC=y
|
||||
# CONFIG_CRYPTO_PCBC is not set
|
||||
# CONFIG_CRYPTO_LRW is not set
|
||||
# CONFIG_CRYPTO_XTS is not set
|
||||
# CONFIG_CRYPTO_CRYPTD is not set
|
||||
CONFIG_CRYPTO_DES=y
|
||||
# CONFIG_CRYPTO_FCRYPT is not set
|
||||
CONFIG_CRYPTO_BLOWFISH=m
|
||||
CONFIG_CRYPTO_TWOFISH=m
|
||||
CONFIG_CRYPTO_TWOFISH_COMMON=m
|
||||
CONFIG_CRYPTO_SERPENT=m
|
||||
CONFIG_CRYPTO_AES=m
|
||||
CONFIG_CRYPTO_CAST5=m
|
||||
|
@ -949,21 +956,28 @@ CONFIG_CRYPTO_TEA=m
|
|||
CONFIG_CRYPTO_ARC4=m
|
||||
CONFIG_CRYPTO_KHAZAD=m
|
||||
CONFIG_CRYPTO_ANUBIS=m
|
||||
# CONFIG_CRYPTO_SEED is not set
|
||||
CONFIG_CRYPTO_DEFLATE=m
|
||||
CONFIG_CRYPTO_MICHAEL_MIC=m
|
||||
CONFIG_CRYPTO_CRC32C=m
|
||||
# CONFIG_CRYPTO_CAMELLIA is not set
|
||||
CONFIG_CRYPTO_TEST=m
|
||||
|
||||
#
|
||||
# Hardware crypto devices
|
||||
#
|
||||
# CONFIG_CRYPTO_AUTHENC is not set
|
||||
# CONFIG_CRYPTO_HW is not set
|
||||
|
||||
#
|
||||
# Library routines
|
||||
#
|
||||
CONFIG_BITREVERSE=y
|
||||
CONFIG_CRC_CCITT=m
|
||||
# CONFIG_CRC16 is not set
|
||||
# CONFIG_CRC_ITU_T is not set
|
||||
CONFIG_CRC32=y
|
||||
# CONFIG_CRC7 is not set
|
||||
CONFIG_LIBCRC32C=m
|
||||
CONFIG_ZLIB_INFLATE=m
|
||||
CONFIG_ZLIB_DEFLATE=m
|
||||
CONFIG_PLIST=y
|
||||
CONFIG_HAS_IOMEM=y
|
||||
CONFIG_HAS_IOPORT=y
|
||||
CONFIG_HAS_DMA=y
|
||||
|
|
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
|
@ -20,7 +20,7 @@
|
|||
.import hpux_call_table
|
||||
.import hpux_syscall_exit,code
|
||||
|
||||
.align 4096
|
||||
.align PAGE_SIZE
|
||||
ENTRY(hpux_gateway_page)
|
||||
nop
|
||||
#ifdef CONFIG_64BIT
|
||||
|
@ -103,5 +103,5 @@ syscall_nosys:
|
|||
ldo -ENOSYS(%r0),%r28
|
||||
ENDPROC(hpux_gateway_page)
|
||||
|
||||
.align 4096
|
||||
.align PAGE_SIZE
|
||||
ENTRY(end_hpux_gateway_page)
|
||||
|
|
|
@ -290,9 +290,6 @@ int main(void)
|
|||
DEFINE(ASM_PTE_ENTRY_SIZE, PTE_ENTRY_SIZE);
|
||||
DEFINE(ASM_PFN_PTE_SHIFT, PFN_PTE_SHIFT);
|
||||
DEFINE(ASM_PT_INITIAL, PT_INITIAL);
|
||||
DEFINE(ASM_PAGE_SIZE, PAGE_SIZE);
|
||||
DEFINE(ASM_PAGE_SIZE_DIV64, PAGE_SIZE/64);
|
||||
DEFINE(ASM_PAGE_SIZE_DIV128, PAGE_SIZE/128);
|
||||
BLANK();
|
||||
DEFINE(EXCDATA_IP, offsetof(struct exception_data, fault_ip));
|
||||
DEFINE(EXCDATA_SPACE, offsetof(struct exception_data, fault_space));
|
||||
|
|
|
@ -98,7 +98,6 @@
|
|||
* The "get_stack" macros are responsible for determining the
|
||||
* kernel stack value.
|
||||
*
|
||||
* For Faults:
|
||||
* If sr7 == 0
|
||||
* Already using a kernel stack, so call the
|
||||
* get_stack_use_r30 macro to push a pt_regs structure
|
||||
|
@ -110,26 +109,6 @@
|
|||
* task pointer pointed to by cr30. Set the stack
|
||||
* pointer to point to the end of the task structure.
|
||||
*
|
||||
* For Interrupts:
|
||||
* If sr7 == 0
|
||||
* Already using a kernel stack, check to see if r30
|
||||
* is already pointing to the per processor interrupt
|
||||
* stack. If it is, call the get_stack_use_r30 macro
|
||||
* to push a pt_regs structure on the stack, and store
|
||||
* registers there. Otherwise, call get_stack_use_cr31
|
||||
* to get a pointer to the base of the interrupt stack
|
||||
* and push a pt_regs structure on that stack.
|
||||
* else
|
||||
* Need to set up a kernel stack, so call the
|
||||
* get_stack_use_cr30 macro to set up a pointer
|
||||
* to the pt_regs structure contained within the
|
||||
* task pointer pointed to by cr30. Set the stack
|
||||
* pointer to point to the end of the task structure.
|
||||
* N.B: We don't use the interrupt stack for the
|
||||
* first interrupt from userland, because signals/
|
||||
* resched's are processed when returning to userland,
|
||||
* and we can sleep in those cases.
|
||||
*
|
||||
* Note that we use shadowed registers for temps until
|
||||
* we can save %r26 and %r29. %r26 is used to preserve
|
||||
* %r8 (a shadowed register) which temporarily contained
|
||||
|
@ -652,7 +631,7 @@
|
|||
|
||||
.text
|
||||
|
||||
.align 4096
|
||||
.align PAGE_SIZE
|
||||
|
||||
ENTRY(fault_vector_20)
|
||||
/* First vector is invalid (0) */
|
||||
|
@ -904,7 +883,7 @@ ENDPROC(_switch_to)
|
|||
*
|
||||
*/
|
||||
|
||||
.align 4096
|
||||
.align PAGE_SIZE
|
||||
|
||||
ENTRY(syscall_exit_rfi)
|
||||
mfctl %cr30,%r16
|
||||
|
@ -1086,23 +1065,13 @@ intr_do_preempt:
|
|||
|
||||
intr_extint:
|
||||
CMPIB=,n 0,%r16,1f
|
||||
|
||||
get_stack_use_cr30
|
||||
b,n 3f
|
||||
b,n 2f
|
||||
|
||||
1:
|
||||
#if 0 /* Interrupt Stack support not working yet! */
|
||||
mfctl %cr31,%r1
|
||||
copy %r30,%r17
|
||||
/* FIXME! depi below has hardcoded idea of interrupt stack size (32k)*/
|
||||
DEPI 0,31,15,%r17
|
||||
CMPB=,n %r1,%r17,2f
|
||||
get_stack_use_cr31
|
||||
b,n 3f
|
||||
#endif
|
||||
2:
|
||||
get_stack_use_r30
|
||||
|
||||
3:
|
||||
2:
|
||||
save_specials %r29
|
||||
virt_map
|
||||
save_general %r29
|
||||
|
|
|
@ -95,7 +95,7 @@ $bss_loop:
|
|||
|
||||
1:
|
||||
stw %r3,0(%r4)
|
||||
ldo (ASM_PAGE_SIZE >> PxD_VALUE_SHIFT)(%r3),%r3
|
||||
ldo (PAGE_SIZE >> PxD_VALUE_SHIFT)(%r3),%r3
|
||||
addib,> -1,%r1,1b
|
||||
#if PT_NLEVELS == 3
|
||||
ldo ASM_PMD_ENTRY_SIZE(%r4),%r4
|
||||
|
@ -128,10 +128,6 @@ $pgt_fill_loop:
|
|||
/* And the stack pointer too */
|
||||
ldo THREAD_SZ_ALGN(%r6),%sp
|
||||
|
||||
/* And the interrupt stack */
|
||||
load32 interrupt_stack,%r6
|
||||
mtctl %r6,%cr31
|
||||
|
||||
#ifdef CONFIG_SMP
|
||||
/* Set the smp rendevous address into page zero.
|
||||
** It would be safer to do this in init_smp_config() but
|
||||
|
|
|
@ -55,13 +55,13 @@
|
|||
* IODC requires 7K byte stack. That leaves 1K byte for os_hpmc.
|
||||
*/
|
||||
|
||||
.align 4096
|
||||
.align PAGE_SIZE
|
||||
hpmc_stack:
|
||||
.block 16384
|
||||
|
||||
#define HPMC_IODC_BUF_SIZE 0x8000
|
||||
|
||||
.align 4096
|
||||
.align PAGE_SIZE
|
||||
hpmc_iodc_buf:
|
||||
.block HPMC_IODC_BUF_SIZE
|
||||
|
||||
|
|
|
@ -49,7 +49,6 @@ EXPORT_SYMBOL(init_mm);
|
|||
* way process stacks are handled. This is done by having a special
|
||||
* "init_task" linker map entry..
|
||||
*/
|
||||
unsigned char interrupt_stack[ISTACK_SIZE] __attribute__ ((section("init_istack"), aligned(4096)));
|
||||
union thread_union init_thread_union
|
||||
__attribute__((aligned(128))) __attribute__((__section__(".data.init_task"))) =
|
||||
{ INIT_THREAD_INFO(init_task) };
|
||||
|
|
|
@ -289,7 +289,7 @@ ENTRY(copy_user_page_asm)
|
|||
*/
|
||||
|
||||
ldd 0(%r25), %r19
|
||||
ldi ASM_PAGE_SIZE_DIV128, %r1
|
||||
ldi (PAGE_SIZE / 128), %r1
|
||||
|
||||
ldw 64(%r25), %r0 /* prefetch 1 cacheline ahead */
|
||||
ldw 128(%r25), %r0 /* prefetch 2 */
|
||||
|
@ -355,7 +355,7 @@ ENTRY(copy_user_page_asm)
|
|||
* use ldd/std on a 32 bit kernel.
|
||||
*/
|
||||
ldw 0(%r25), %r19
|
||||
ldi ASM_PAGE_SIZE_DIV64, %r1
|
||||
ldi (PAGE_SIZE / 64), %r1
|
||||
|
||||
1:
|
||||
ldw 4(%r25), %r20
|
||||
|
@ -553,7 +553,7 @@ ENTRY(__clear_user_page_asm)
|
|||
pdtlb 0(%r28)
|
||||
|
||||
#ifdef CONFIG_64BIT
|
||||
ldi ASM_PAGE_SIZE_DIV128, %r1
|
||||
ldi (PAGE_SIZE / 128), %r1
|
||||
|
||||
/* PREFETCH (Write) has not (yet) been proven to help here */
|
||||
/* #define PREFETCHW_OP ldd 256(%0), %r0 */
|
||||
|
@ -578,7 +578,7 @@ ENTRY(__clear_user_page_asm)
|
|||
ldo 128(%r28), %r28
|
||||
|
||||
#else /* ! CONFIG_64BIT */
|
||||
ldi ASM_PAGE_SIZE_DIV64, %r1
|
||||
ldi (PAGE_SIZE / 64), %r1
|
||||
|
||||
1:
|
||||
stw %r0, 0(%r28)
|
||||
|
|
|
@ -122,31 +122,9 @@ EXPORT_SYMBOL($$divI_12);
|
|||
EXPORT_SYMBOL($$divI_14);
|
||||
EXPORT_SYMBOL($$divI_15);
|
||||
|
||||
extern void __ashrdi3(void);
|
||||
extern void __ashldi3(void);
|
||||
extern void __lshrdi3(void);
|
||||
extern void __muldi3(void);
|
||||
|
||||
EXPORT_SYMBOL(__ashrdi3);
|
||||
EXPORT_SYMBOL(__ashldi3);
|
||||
EXPORT_SYMBOL(__lshrdi3);
|
||||
EXPORT_SYMBOL(__muldi3);
|
||||
|
||||
asmlinkage void * __canonicalize_funcptr_for_compare(void *);
|
||||
EXPORT_SYMBOL(__canonicalize_funcptr_for_compare);
|
||||
|
||||
#ifdef CONFIG_64BIT
|
||||
extern void __divdi3(void);
|
||||
extern void __udivdi3(void);
|
||||
extern void __umoddi3(void);
|
||||
extern void __moddi3(void);
|
||||
|
||||
EXPORT_SYMBOL(__divdi3);
|
||||
EXPORT_SYMBOL(__udivdi3);
|
||||
EXPORT_SYMBOL(__umoddi3);
|
||||
EXPORT_SYMBOL(__moddi3);
|
||||
#endif
|
||||
|
||||
#ifndef CONFIG_64BIT
|
||||
extern void $$dyncall(void);
|
||||
EXPORT_SYMBOL($$dyncall);
|
||||
|
|
|
@ -569,11 +569,10 @@ static void *fail_alloc_consistent(struct device *dev, size_t size,
|
|||
static void *pa11_dma_alloc_noncoherent(struct device *dev, size_t size,
|
||||
dma_addr_t *dma_handle, gfp_t flag)
|
||||
{
|
||||
void *addr = NULL;
|
||||
void *addr;
|
||||
|
||||
/* rely on kmalloc to be cacheline aligned */
|
||||
addr = kmalloc(size, flag);
|
||||
if(addr)
|
||||
addr = (void *)__get_free_pages(flag, get_order(size));
|
||||
if (addr)
|
||||
*dma_handle = (dma_addr_t)virt_to_phys(addr);
|
||||
|
||||
return addr;
|
||||
|
@ -582,7 +581,7 @@ static void *pa11_dma_alloc_noncoherent(struct device *dev, size_t size,
|
|||
static void pa11_dma_free_noncoherent(struct device *dev, size_t size,
|
||||
void *vaddr, dma_addr_t iova)
|
||||
{
|
||||
kfree(vaddr);
|
||||
free_pages((unsigned long)vaddr, get_order(size));
|
||||
return;
|
||||
}
|
||||
|
||||
|
|
|
@ -194,37 +194,13 @@ void __init pcibios_init_bus(struct pci_bus *bus)
|
|||
pci_write_config_word(dev, PCI_BRIDGE_CONTROL, bridge_ctl);
|
||||
}
|
||||
|
||||
|
||||
/* KLUGE: Link the child and parent resources - generic PCI didn't */
|
||||
static void
|
||||
pcibios_link_hba_resources( struct resource *hba_res, struct resource *r)
|
||||
{
|
||||
if (!r->parent) {
|
||||
printk(KERN_EMERG "PCI: resource not parented! [%p-%p]\n",
|
||||
(void*) r->start, (void*) r->end);
|
||||
r->parent = hba_res;
|
||||
|
||||
/* reverse link is harder *sigh* */
|
||||
if (r->parent->child) {
|
||||
if (r->parent->sibling) {
|
||||
struct resource *next = r->parent->sibling;
|
||||
while (next->sibling)
|
||||
next = next->sibling;
|
||||
next->sibling = r;
|
||||
} else {
|
||||
r->parent->sibling = r;
|
||||
}
|
||||
} else
|
||||
r->parent->child = r;
|
||||
}
|
||||
}
|
||||
|
||||
/* called by drivers/pci/setup-bus.c:pci_setup_bridge(). */
|
||||
void __devinit pcibios_resource_to_bus(struct pci_dev *dev,
|
||||
struct pci_bus_region *region, struct resource *res)
|
||||
{
|
||||
struct pci_bus *bus = dev->bus;
|
||||
struct pci_hba_data *hba = HBA_DATA(bus->bridge->platform_data);
|
||||
#ifdef CONFIG_64BIT
|
||||
struct pci_hba_data *hba = HBA_DATA(dev->bus->bridge->platform_data);
|
||||
#endif
|
||||
|
||||
if (res->flags & IORESOURCE_IO) {
|
||||
/*
|
||||
|
@ -243,23 +219,15 @@ void __devinit pcibios_resource_to_bus(struct pci_dev *dev,
|
|||
}
|
||||
|
||||
DBG_RES("pcibios_resource_to_bus(%02x %s [%lx,%lx])\n",
|
||||
bus->number, res->flags & IORESOURCE_IO ? "IO" : "MEM",
|
||||
dev->bus->number, res->flags & IORESOURCE_IO ? "IO" : "MEM",
|
||||
region->start, region->end);
|
||||
|
||||
/* KLUGE ALERT
|
||||
** if this resource isn't linked to a "parent", then it seems
|
||||
** to be a child of the HBA - lets link it in.
|
||||
*/
|
||||
pcibios_link_hba_resources(&hba->io_space, bus->resource[0]);
|
||||
pcibios_link_hba_resources(&hba->lmmio_space, bus->resource[1]);
|
||||
}
|
||||
|
||||
void pcibios_bus_to_resource(struct pci_dev *dev, struct resource *res,
|
||||
struct pci_bus_region *region)
|
||||
{
|
||||
#ifdef CONFIG_64BIT
|
||||
struct pci_bus *bus = dev->bus;
|
||||
struct pci_hba_data *hba = HBA_DATA(bus->bridge->platform_data);
|
||||
struct pci_hba_data *hba = HBA_DATA(dev->bus->bridge->platform_data);
|
||||
#endif
|
||||
|
||||
if (res->flags & IORESOURCE_MEM) {
|
||||
|
|
|
@ -82,7 +82,12 @@ static int __cpuinit processor_probe(struct parisc_device *dev)
|
|||
unsigned long cpuid;
|
||||
struct cpuinfo_parisc *p;
|
||||
|
||||
#ifndef CONFIG_SMP
|
||||
#ifdef CONFIG_SMP
|
||||
if (num_online_cpus() >= NR_CPUS) {
|
||||
printk(KERN_INFO "num_online_cpus() >= NR_CPUS\n");
|
||||
return 1;
|
||||
}
|
||||
#else
|
||||
if (boot_cpu_data.cpu_count > 0) {
|
||||
printk(KERN_INFO "CONFIG_SMP=n ignoring additional CPUs\n");
|
||||
return 1;
|
||||
|
|
|
@ -432,22 +432,10 @@ smp_cpu_init(int cpunum)
|
|||
void __init smp_callin(void)
|
||||
{
|
||||
int slave_id = cpu_now_booting;
|
||||
#if 0
|
||||
void *istack;
|
||||
#endif
|
||||
|
||||
smp_cpu_init(slave_id);
|
||||
preempt_disable();
|
||||
|
||||
#if 0 /* NOT WORKING YET - see entry.S */
|
||||
istack = (void *)__get_free_pages(GFP_KERNEL,ISTACK_ORDER);
|
||||
if (istack == NULL) {
|
||||
printk(KERN_CRIT "Failed to allocate interrupt stack for cpu %d\n",slave_id);
|
||||
BUG();
|
||||
}
|
||||
mtctl(istack,31);
|
||||
#endif
|
||||
|
||||
flush_cache_all_local(); /* start with known state */
|
||||
flush_tlb_all_local(NULL);
|
||||
|
||||
|
|
|
@ -473,3 +473,10 @@ long sys32_lookup_dcookie(u32 cookie_high, u32 cookie_low, char __user *buf,
|
|||
return sys_lookup_dcookie((u64)cookie_high << 32 | cookie_low,
|
||||
buf, len);
|
||||
}
|
||||
|
||||
asmlinkage long compat_sys_fallocate(int fd, int mode, u32 offhi, u32 offlo,
|
||||
u32 lenhi, u32 lenlo)
|
||||
{
|
||||
return sys_fallocate(fd, mode, ((loff_t)offhi << 32) | offlo,
|
||||
((loff_t)lenhi << 32) | lenlo);
|
||||
}
|
||||
|
|
|
@ -10,6 +10,7 @@
|
|||
#include <asm/asm-offsets.h>
|
||||
#include <asm/unistd.h>
|
||||
#include <asm/errno.h>
|
||||
#include <asm/page.h>
|
||||
#include <asm/psw.h>
|
||||
#include <asm/thread_info.h>
|
||||
#include <asm/assembly.h>
|
||||
|
@ -38,7 +39,7 @@
|
|||
* pointers.
|
||||
*/
|
||||
|
||||
.align ASM_PAGE_SIZE
|
||||
.align PAGE_SIZE
|
||||
ENTRY(linux_gateway_page)
|
||||
|
||||
/* ADDRESS 0x00 to 0xb0 = 176 bytes / 4 bytes per insn = 44 insns */
|
||||
|
@ -597,7 +598,7 @@ cas_action:
|
|||
|
||||
|
||||
/* Make sure nothing else is placed on this page */
|
||||
.align ASM_PAGE_SIZE
|
||||
.align PAGE_SIZE
|
||||
END(linux_gateway_page)
|
||||
ENTRY(end_linux_gateway_page)
|
||||
|
||||
|
@ -608,7 +609,7 @@ ENTRY(end_linux_gateway_page)
|
|||
|
||||
.section .rodata,"a"
|
||||
|
||||
.align ASM_PAGE_SIZE
|
||||
.align PAGE_SIZE
|
||||
/* Light-weight-syscall table */
|
||||
/* Start of lws table. */
|
||||
ENTRY(lws_table)
|
||||
|
@ -617,13 +618,13 @@ ENTRY(lws_table)
|
|||
END(lws_table)
|
||||
/* End of lws table */
|
||||
|
||||
.align ASM_PAGE_SIZE
|
||||
.align PAGE_SIZE
|
||||
ENTRY(sys_call_table)
|
||||
#include "syscall_table.S"
|
||||
END(sys_call_table)
|
||||
|
||||
#ifdef CONFIG_64BIT
|
||||
.align ASM_PAGE_SIZE
|
||||
.align PAGE_SIZE
|
||||
ENTRY(sys_call_table64)
|
||||
#define SYSCALL_TABLE_64BIT
|
||||
#include "syscall_table.S"
|
||||
|
@ -636,7 +637,7 @@ END(sys_call_table64)
|
|||
will use this set of locks
|
||||
*/
|
||||
.section .data
|
||||
.align 4096
|
||||
.align PAGE_SIZE
|
||||
ENTRY(lws_lock_start)
|
||||
/* lws locks */
|
||||
.align 16
|
||||
|
|
|
@ -403,6 +403,7 @@
|
|||
ENTRY_COMP(signalfd)
|
||||
ENTRY_COMP(timerfd)
|
||||
ENTRY_SAME(eventfd)
|
||||
ENTRY_COMP(fallocate) /* 305 */
|
||||
|
||||
/* Nothing yet */
|
||||
|
||||
|
|
|
@ -189,16 +189,14 @@ static struct clocksource clocksource_cr16 = {
|
|||
#ifdef CONFIG_SMP
|
||||
int update_cr16_clocksource(void)
|
||||
{
|
||||
int change = 0;
|
||||
|
||||
/* since the cr16 cycle counters are not synchronized across CPUs,
|
||||
we'll check if we should switch to a safe clocksource: */
|
||||
if (clocksource_cr16.rating != 0 && num_online_cpus() > 1) {
|
||||
clocksource_change_rating(&clocksource_cr16, 0);
|
||||
change = 1;
|
||||
return 1;
|
||||
}
|
||||
|
||||
return change;
|
||||
return 0;
|
||||
}
|
||||
#else
|
||||
int update_cr16_clocksource(void)
|
||||
|
|
|
@ -209,8 +209,8 @@ static int unwind_init(void)
|
|||
|
||||
static int unwind_special(struct unwind_frame_info *info, unsigned long pc, int frame_size)
|
||||
{
|
||||
void handle_interruption(int, struct pt_regs *);
|
||||
static unsigned long *hi = (unsigned long)&handle_interruption;
|
||||
extern void handle_interruption(int, struct pt_regs *);
|
||||
static unsigned long *hi = (unsigned long *)&handle_interruption;
|
||||
|
||||
if (pc == get_func_addr(hi)) {
|
||||
struct pt_regs *regs = (struct pt_regs *)(info->sp - frame_size - PT_SZ_ALGN);
|
||||
|
|
|
@ -46,168 +46,211 @@ jiffies = jiffies_64;
|
|||
#endif
|
||||
SECTIONS
|
||||
{
|
||||
. = KERNEL_BINARY_TEXT_START;
|
||||
|
||||
. = KERNEL_BINARY_TEXT_START;
|
||||
|
||||
_text = .; /* Text and read-only data */
|
||||
.text ALIGN(16) : {
|
||||
TEXT_TEXT
|
||||
SCHED_TEXT
|
||||
LOCK_TEXT
|
||||
*(.text.do_softirq)
|
||||
*(.text.sys_exit)
|
||||
*(.text.do_sigaltstack)
|
||||
*(.text.do_fork)
|
||||
*(.text.*)
|
||||
*(.fixup)
|
||||
*(.lock.text) /* out-of-line lock text */
|
||||
*(.gnu.warning)
|
||||
_text = .; /* Text and read-only data */
|
||||
.text ALIGN(16) : {
|
||||
TEXT_TEXT
|
||||
SCHED_TEXT
|
||||
LOCK_TEXT
|
||||
*(.text.do_softirq)
|
||||
*(.text.sys_exit)
|
||||
*(.text.do_sigaltstack)
|
||||
*(.text.do_fork)
|
||||
*(.text.*)
|
||||
*(.fixup)
|
||||
*(.lock.text) /* out-of-line lock text */
|
||||
*(.gnu.warning)
|
||||
} = 0
|
||||
/* End of text section */
|
||||
_etext = .;
|
||||
|
||||
_etext = .; /* End of text section */
|
||||
RODATA
|
||||
BUG_TABLE
|
||||
|
||||
RODATA
|
||||
|
||||
BUG_TABLE
|
||||
|
||||
/* writeable */
|
||||
. = ALIGN(ASM_PAGE_SIZE); /* Make sure this is page aligned so
|
||||
that we can properly leave these
|
||||
as writable */
|
||||
data_start = .;
|
||||
|
||||
. = ALIGN(16); /* Exception table */
|
||||
__start___ex_table = .;
|
||||
__ex_table : { *(__ex_table) }
|
||||
__stop___ex_table = .;
|
||||
|
||||
NOTES
|
||||
|
||||
__start___unwind = .; /* unwind info */
|
||||
.PARISC.unwind : { *(.PARISC.unwind) }
|
||||
__stop___unwind = .;
|
||||
|
||||
/* rarely changed data like cpu maps */
|
||||
. = ALIGN(16);
|
||||
.data.read_mostly : { *(.data.read_mostly) }
|
||||
|
||||
. = ALIGN(L1_CACHE_BYTES);
|
||||
.data : { /* Data */
|
||||
DATA_DATA
|
||||
CONSTRUCTORS
|
||||
/* writeable */
|
||||
/* Make sure this is page aligned so
|
||||
* that we can properly leave these
|
||||
* as writable
|
||||
*/
|
||||
. = ALIGN(PAGE_SIZE);
|
||||
data_start = .;
|
||||
. = ALIGN(16);
|
||||
/* Exception table */
|
||||
__ex_table : {
|
||||
__start___ex_table = .;
|
||||
*(__ex_table)
|
||||
__stop___ex_table = .;
|
||||
}
|
||||
|
||||
. = ALIGN(L1_CACHE_BYTES);
|
||||
.data.cacheline_aligned : { *(.data.cacheline_aligned) }
|
||||
NOTES
|
||||
|
||||
/* PA-RISC locks requires 16-byte alignment */
|
||||
. = ALIGN(16);
|
||||
.data.lock_aligned : { *(.data.lock_aligned) }
|
||||
|
||||
. = ALIGN(ASM_PAGE_SIZE);
|
||||
/* nosave data is really only used for software suspend...it's here
|
||||
* just in case we ever implement it */
|
||||
__nosave_begin = .;
|
||||
.data_nosave : { *(.data.nosave) }
|
||||
. = ALIGN(ASM_PAGE_SIZE);
|
||||
__nosave_end = .;
|
||||
|
||||
_edata = .; /* End of data section */
|
||||
|
||||
__bss_start = .; /* BSS */
|
||||
/* page table entries need to be PAGE_SIZE aligned */
|
||||
. = ALIGN(ASM_PAGE_SIZE);
|
||||
.data.vmpages : {
|
||||
*(.data.vm0.pmd)
|
||||
*(.data.vm0.pgd)
|
||||
*(.data.vm0.pte)
|
||||
/* unwind info */
|
||||
.PARISC.unwind : {
|
||||
__start___unwind = .;
|
||||
*(.PARISC.unwind)
|
||||
__stop___unwind = .;
|
||||
}
|
||||
.bss : { *(.bss) *(COMMON) }
|
||||
__bss_stop = .;
|
||||
|
||||
/* rarely changed data like cpu maps */
|
||||
. = ALIGN(16);
|
||||
.data.read_mostly : {
|
||||
*(.data.read_mostly)
|
||||
}
|
||||
|
||||
. = ALIGN(L1_CACHE_BYTES);
|
||||
/* Data */
|
||||
.data : {
|
||||
DATA_DATA
|
||||
CONSTRUCTORS
|
||||
}
|
||||
|
||||
. = ALIGN(L1_CACHE_BYTES);
|
||||
.data.cacheline_aligned : {
|
||||
*(.data.cacheline_aligned)
|
||||
}
|
||||
|
||||
/* PA-RISC locks requires 16-byte alignment */
|
||||
. = ALIGN(16);
|
||||
.data.lock_aligned : {
|
||||
*(.data.lock_aligned)
|
||||
}
|
||||
|
||||
/* nosave data is really only used for software suspend...it's here
|
||||
* just in case we ever implement it
|
||||
*/
|
||||
. = ALIGN(PAGE_SIZE);
|
||||
__nosave_begin = .;
|
||||
.data_nosave : {
|
||||
*(.data.nosave)
|
||||
}
|
||||
. = ALIGN(PAGE_SIZE);
|
||||
__nosave_end = .;
|
||||
|
||||
/* End of data section */
|
||||
_edata = .;
|
||||
|
||||
/* BSS */
|
||||
__bss_start = .;
|
||||
/* page table entries need to be PAGE_SIZE aligned */
|
||||
. = ALIGN(PAGE_SIZE);
|
||||
.data.vmpages : {
|
||||
*(.data.vm0.pmd)
|
||||
*(.data.vm0.pgd)
|
||||
*(.data.vm0.pte)
|
||||
}
|
||||
.bss : {
|
||||
*(.bss)
|
||||
*(COMMON)
|
||||
}
|
||||
__bss_stop = .;
|
||||
|
||||
|
||||
/* assembler code expects init_task to be 16k aligned */
|
||||
. = ALIGN(16384); /* init_task */
|
||||
.data.init_task : { *(.data.init_task) }
|
||||
|
||||
/* The interrupt stack is currently partially coded, but not yet
|
||||
* implemented */
|
||||
. = ALIGN(16384);
|
||||
init_istack : { *(init_istack) }
|
||||
/* assembler code expects init_task to be 16k aligned */
|
||||
. = ALIGN(16384);
|
||||
/* init_task */
|
||||
.data.init_task : {
|
||||
*(.data.init_task)
|
||||
}
|
||||
|
||||
#ifdef CONFIG_64BIT
|
||||
. = ALIGN(16); /* Linkage tables */
|
||||
.opd : { *(.opd) } PROVIDE (__gp = .);
|
||||
.plt : { *(.plt) }
|
||||
.dlt : { *(.dlt) }
|
||||
. = ALIGN(16);
|
||||
/* Linkage tables */
|
||||
.opd : {
|
||||
*(.opd)
|
||||
} PROVIDE (__gp = .);
|
||||
.plt : {
|
||||
*(.plt)
|
||||
}
|
||||
.dlt : {
|
||||
*(.dlt)
|
||||
}
|
||||
#endif
|
||||
|
||||
/* reserve space for interrupt stack by aligning __init* to 16k */
|
||||
. = ALIGN(16384);
|
||||
__init_begin = .;
|
||||
.init.text : {
|
||||
_sinittext = .;
|
||||
*(.init.text)
|
||||
_einittext = .;
|
||||
}
|
||||
.init.data : { *(.init.data) }
|
||||
. = ALIGN(16);
|
||||
__setup_start = .;
|
||||
.init.setup : { *(.init.setup) }
|
||||
__setup_end = .;
|
||||
__initcall_start = .;
|
||||
.initcall.init : {
|
||||
INITCALLS
|
||||
}
|
||||
__initcall_end = .;
|
||||
__con_initcall_start = .;
|
||||
.con_initcall.init : { *(.con_initcall.init) }
|
||||
__con_initcall_end = .;
|
||||
SECURITY_INIT
|
||||
/* alternate instruction replacement. This is a mechanism x86 uses
|
||||
* to detect the CPU type and replace generic instruction sequences
|
||||
* with CPU specific ones. We don't currently do this in PA, but
|
||||
* it seems like a good idea... */
|
||||
. = ALIGN(4);
|
||||
__alt_instructions = .;
|
||||
.altinstructions : { *(.altinstructions) }
|
||||
__alt_instructions_end = .;
|
||||
.altinstr_replacement : { *(.altinstr_replacement) }
|
||||
/* .exit.text is discard at runtime, not link time, to deal with references
|
||||
from .altinstructions and .eh_frame */
|
||||
.exit.text : { *(.exit.text) }
|
||||
.exit.data : { *(.exit.data) }
|
||||
/* reserve space for interrupt stack by aligning __init* to 16k */
|
||||
. = ALIGN(16384);
|
||||
__init_begin = .;
|
||||
.init.text : {
|
||||
_sinittext = .;
|
||||
*(.init.text)
|
||||
_einittext = .;
|
||||
}
|
||||
.init.data : {
|
||||
*(.init.data)
|
||||
}
|
||||
. = ALIGN(16);
|
||||
.init.setup : {
|
||||
__setup_start = .;
|
||||
*(.init.setup)
|
||||
__setup_end = .;
|
||||
}
|
||||
.initcall.init : {
|
||||
__initcall_start = .;
|
||||
INITCALLS
|
||||
__initcall_end = .;
|
||||
}
|
||||
.con_initcall.init : {
|
||||
__con_initcall_start = .;
|
||||
*(.con_initcall.init)
|
||||
__con_initcall_end = .;
|
||||
}
|
||||
SECURITY_INIT
|
||||
|
||||
/* alternate instruction replacement. This is a mechanism x86 uses
|
||||
* to detect the CPU type and replace generic instruction sequences
|
||||
* with CPU specific ones. We don't currently do this in PA, but
|
||||
* it seems like a good idea...
|
||||
*/
|
||||
. = ALIGN(4);
|
||||
.altinstructions : {
|
||||
__alt_instructions = .;
|
||||
*(.altinstructions)
|
||||
__alt_instructions_end = .;
|
||||
}
|
||||
.altinstr_replacement : {
|
||||
*(.altinstr_replacement)
|
||||
}
|
||||
|
||||
/* .exit.text is discard at runtime, not link time, to deal with references
|
||||
* from .altinstructions and .eh_frame
|
||||
*/
|
||||
.exit.text : {
|
||||
*(.exit.text)
|
||||
}
|
||||
.exit.data : {
|
||||
*(.exit.data)
|
||||
}
|
||||
#ifdef CONFIG_BLK_DEV_INITRD
|
||||
. = ALIGN(ASM_PAGE_SIZE);
|
||||
__initramfs_start = .;
|
||||
.init.ramfs : { *(.init.ramfs) }
|
||||
__initramfs_end = .;
|
||||
. = ALIGN(PAGE_SIZE);
|
||||
.init.ramfs : {
|
||||
__initramfs_start = .;
|
||||
*(.init.ramfs)
|
||||
__initramfs_end = .;
|
||||
}
|
||||
#endif
|
||||
|
||||
PERCPU(ASM_PAGE_SIZE)
|
||||
PERCPU(PAGE_SIZE)
|
||||
. = ALIGN(PAGE_SIZE);
|
||||
__init_end = .;
|
||||
/* freed after init ends here */
|
||||
_end = . ;
|
||||
|
||||
. = ALIGN(ASM_PAGE_SIZE);
|
||||
__init_end = .;
|
||||
/* freed after init ends here */
|
||||
|
||||
_end = . ;
|
||||
|
||||
/* Sections to be discarded */
|
||||
/DISCARD/ : {
|
||||
*(.exitcall.exit)
|
||||
/* Sections to be discarded */
|
||||
/DISCARD/ : {
|
||||
*(.exitcall.exit)
|
||||
#ifdef CONFIG_64BIT
|
||||
/* temporary hack until binutils is fixed to not emit these
|
||||
for static binaries */
|
||||
*(.interp)
|
||||
*(.dynsym)
|
||||
*(.dynstr)
|
||||
*(.dynamic)
|
||||
*(.hash)
|
||||
*(.gnu.hash)
|
||||
/* temporary hack until binutils is fixed to not emit these
|
||||
* for static binaries
|
||||
*/
|
||||
*(.interp)
|
||||
*(.dynsym)
|
||||
*(.dynstr)
|
||||
*(.dynamic)
|
||||
*(.hash)
|
||||
*(.gnu.hash)
|
||||
#endif
|
||||
}
|
||||
|
||||
STABS_DEBUG
|
||||
.note 0 : { *(.note) }
|
||||
|
||||
STABS_DEBUG
|
||||
.note 0 : { *(.note) }
|
||||
}
|
||||
|
|
|
@ -4,4 +4,4 @@
|
|||
|
||||
lib-y := lusercopy.o bitops.o checksum.o io.o memset.o fixup.o memcpy.o
|
||||
|
||||
obj-y := iomap.o
|
||||
obj-y := libgcc/ milli/ iomap.o
|
||||
|
|
|
@ -0,0 +1,4 @@
|
|||
obj-y := __ashldi3.o __ashrdi3.o __clzsi2.o __divdi3.o __divsi3.o \
|
||||
__lshrdi3.o __moddi3.o __modsi3.o __udivdi3.o \
|
||||
__udivmoddi4.o __udivmodsi4.o __udivsi3.o \
|
||||
__umoddi3.o __umodsi3.o __muldi3.o __umulsidi3.o
|
|
@ -0,0 +1,19 @@
|
|||
#include "libgcc.h"
|
||||
|
||||
u64 __ashldi3(u64 v, int cnt)
|
||||
{
|
||||
int c = cnt & 31;
|
||||
u32 vl = (u32) v;
|
||||
u32 vh = (u32) (v >> 32);
|
||||
|
||||
if (cnt & 32) {
|
||||
vh = (vl << c);
|
||||
vl = 0;
|
||||
} else {
|
||||
vh = (vh << c) + (vl >> (32 - c));
|
||||
vl = (vl << c);
|
||||
}
|
||||
|
||||
return ((u64) vh << 32) + vl;
|
||||
}
|
||||
EXPORT_SYMBOL(__ashldi3);
|
|
@ -0,0 +1,19 @@
|
|||
#include "libgcc.h"
|
||||
|
||||
u64 __ashrdi3(u64 v, int cnt)
|
||||
{
|
||||
int c = cnt & 31;
|
||||
u32 vl = (u32) v;
|
||||
u32 vh = (u32) (v >> 32);
|
||||
|
||||
if (cnt & 32) {
|
||||
vl = ((s32) vh >> c);
|
||||
vh = (s32) vh >> 31;
|
||||
} else {
|
||||
vl = (vl >> c) + (vh << (32 - c));
|
||||
vh = ((s32) vh >> c);
|
||||
}
|
||||
|
||||
return ((u64) vh << 32) + vl;
|
||||
}
|
||||
EXPORT_SYMBOL(__ashrdi3);
|
|
@ -0,0 +1,30 @@
|
|||
#include "libgcc.h"
|
||||
|
||||
u32 __clzsi2(u32 v)
|
||||
{
|
||||
int p = 31;
|
||||
|
||||
if (v & 0xffff0000) {
|
||||
p -= 16;
|
||||
v >>= 16;
|
||||
}
|
||||
if (v & 0xff00) {
|
||||
p -= 8;
|
||||
v >>= 8;
|
||||
}
|
||||
if (v & 0xf0) {
|
||||
p -= 4;
|
||||
v >>= 4;
|
||||
}
|
||||
if (v & 0xc) {
|
||||
p -= 2;
|
||||
v >>= 2;
|
||||
}
|
||||
if (v & 0x2) {
|
||||
p -= 1;
|
||||
v >>= 1;
|
||||
}
|
||||
|
||||
return p;
|
||||
}
|
||||
EXPORT_SYMBOL(__clzsi2);
|
|
@ -0,0 +1,23 @@
|
|||
#include "libgcc.h"
|
||||
|
||||
s64 __divdi3(s64 num, s64 den)
|
||||
{
|
||||
int minus = 0;
|
||||
s64 v;
|
||||
|
||||
if (num < 0) {
|
||||
num = -num;
|
||||
minus = 1;
|
||||
}
|
||||
if (den < 0) {
|
||||
den = -den;
|
||||
minus ^= 1;
|
||||
}
|
||||
|
||||
v = __udivmoddi4(num, den, NULL);
|
||||
if (minus)
|
||||
v = -v;
|
||||
|
||||
return v;
|
||||
}
|
||||
EXPORT_SYMBOL(__divdi3);
|
|
@ -0,0 +1,23 @@
|
|||
#include "libgcc.h"
|
||||
|
||||
s32 __divsi3(s32 num, s32 den)
|
||||
{
|
||||
int minus = 0;
|
||||
s32 v;
|
||||
|
||||
if (num < 0) {
|
||||
num = -num;
|
||||
minus = 1;
|
||||
}
|
||||
if (den < 0) {
|
||||
den = -den;
|
||||
minus ^= 1;
|
||||
}
|
||||
|
||||
v = __udivmodsi4(num, den, NULL);
|
||||
if (minus)
|
||||
v = -v;
|
||||
|
||||
return v;
|
||||
}
|
||||
EXPORT_SYMBOL(__divsi3);
|
|
@ -0,0 +1,19 @@
|
|||
#include "libgcc.h"
|
||||
|
||||
u64 __lshrdi3(u64 v, int cnt)
|
||||
{
|
||||
int c = cnt & 31;
|
||||
u32 vl = (u32) v;
|
||||
u32 vh = (u32) (v >> 32);
|
||||
|
||||
if (cnt & 32) {
|
||||
vl = (vh >> c);
|
||||
vh = 0;
|
||||
} else {
|
||||
vl = (vl >> c) + (vh << (32 - c));
|
||||
vh = (vh >> c);
|
||||
}
|
||||
|
||||
return ((u64) vh << 32) + vl;
|
||||
}
|
||||
EXPORT_SYMBOL(__lshrdi3);
|
|
@ -0,0 +1,23 @@
|
|||
#include "libgcc.h"
|
||||
|
||||
s64 __moddi3(s64 num, s64 den)
|
||||
{
|
||||
int minus = 0;
|
||||
s64 v;
|
||||
|
||||
if (num < 0) {
|
||||
num = -num;
|
||||
minus = 1;
|
||||
}
|
||||
if (den < 0) {
|
||||
den = -den;
|
||||
minus ^= 1;
|
||||
}
|
||||
|
||||
(void)__udivmoddi4(num, den, (u64 *) & v);
|
||||
if (minus)
|
||||
v = -v;
|
||||
|
||||
return v;
|
||||
}
|
||||
EXPORT_SYMBOL(__moddi3);
|
|
@ -0,0 +1,23 @@
|
|||
#include "libgcc.h"
|
||||
|
||||
s32 __modsi3(s32 num, s32 den)
|
||||
{
|
||||
int minus = 0;
|
||||
s32 v;
|
||||
|
||||
if (num < 0) {
|
||||
num = -num;
|
||||
minus = 1;
|
||||
}
|
||||
if (den < 0) {
|
||||
den = -den;
|
||||
minus ^= 1;
|
||||
}
|
||||
|
||||
(void)__udivmodsi4(num, den, (u32 *) & v);
|
||||
if (minus)
|
||||
v = -v;
|
||||
|
||||
return v;
|
||||
}
|
||||
EXPORT_SYMBOL(__modsi3);
|
|
@ -0,0 +1,22 @@
|
|||
#include "libgcc.h"
|
||||
|
||||
union DWunion {
|
||||
struct {
|
||||
s32 high;
|
||||
s32 low;
|
||||
} s;
|
||||
s64 ll;
|
||||
};
|
||||
|
||||
s64 __muldi3(s64 u, s64 v)
|
||||
{
|
||||
const union DWunion uu = { .ll = u };
|
||||
const union DWunion vv = { .ll = v };
|
||||
union DWunion w = { .ll = __umulsidi3(uu.s.low, vv.s.low) };
|
||||
|
||||
w.s.high += ((u32)uu.s.low * (u32)vv.s.high
|
||||
+ (u32)uu.s.high * (u32)vv.s.low);
|
||||
|
||||
return w.ll;
|
||||
}
|
||||
EXPORT_SYMBOL(__muldi3);
|
|
@ -0,0 +1,7 @@
|
|||
#include "libgcc.h"
|
||||
|
||||
u64 __udivdi3(u64 num, u64 den)
|
||||
{
|
||||
return __udivmoddi4(num, den, NULL);
|
||||
}
|
||||
EXPORT_SYMBOL(__udivdi3);
|
|
@ -0,0 +1,31 @@
|
|||
#include "libgcc.h"
|
||||
|
||||
u64 __udivmoddi4(u64 num, u64 den, u64 * rem_p)
|
||||
{
|
||||
u64 quot = 0, qbit = 1;
|
||||
|
||||
if (den == 0) {
|
||||
BUG();
|
||||
}
|
||||
|
||||
/* Left-justify denominator and count shift */
|
||||
while ((s64) den >= 0) {
|
||||
den <<= 1;
|
||||
qbit <<= 1;
|
||||
}
|
||||
|
||||
while (qbit) {
|
||||
if (den <= num) {
|
||||
num -= den;
|
||||
quot += qbit;
|
||||
}
|
||||
den >>= 1;
|
||||
qbit >>= 1;
|
||||
}
|
||||
|
||||
if (rem_p)
|
||||
*rem_p = num;
|
||||
|
||||
return quot;
|
||||
}
|
||||
EXPORT_SYMBOL(__udivmoddi4);
|
|
@ -0,0 +1,31 @@
|
|||
#include "libgcc.h"
|
||||
|
||||
u32 __udivmodsi4(u32 num, u32 den, u32 * rem_p)
|
||||
{
|
||||
u32 quot = 0, qbit = 1;
|
||||
|
||||
if (den == 0) {
|
||||
BUG();
|
||||
}
|
||||
|
||||
/* Left-justify denominator and count shift */
|
||||
while ((s32) den >= 0) {
|
||||
den <<= 1;
|
||||
qbit <<= 1;
|
||||
}
|
||||
|
||||
while (qbit) {
|
||||
if (den <= num) {
|
||||
num -= den;
|
||||
quot += qbit;
|
||||
}
|
||||
den >>= 1;
|
||||
qbit >>= 1;
|
||||
}
|
||||
|
||||
if (rem_p)
|
||||
*rem_p = num;
|
||||
|
||||
return quot;
|
||||
}
|
||||
EXPORT_SYMBOL(__udivmodsi4);
|
|
@ -0,0 +1,7 @@
|
|||
#include "libgcc.h"
|
||||
|
||||
u32 __udivsi3(u32 num, u32 den)
|
||||
{
|
||||
return __udivmodsi4(num, den, NULL);
|
||||
}
|
||||
EXPORT_SYMBOL(__udivsi3);
|
|
@ -0,0 +1,10 @@
|
|||
#include "libgcc.h"
|
||||
|
||||
u64 __umoddi3(u64 num, u64 den)
|
||||
{
|
||||
u64 v;
|
||||
|
||||
(void)__udivmoddi4(num, den, &v);
|
||||
return v;
|
||||
}
|
||||
EXPORT_SYMBOL(__umoddi3);
|
|
@ -0,0 +1,10 @@
|
|||
#include "libgcc.h"
|
||||
|
||||
u32 __umodsi3(u32 num, u32 den)
|
||||
{
|
||||
u32 v;
|
||||
|
||||
(void)__udivmodsi4(num, den, &v);
|
||||
return v;
|
||||
}
|
||||
EXPORT_SYMBOL(__umodsi3);
|
|
@ -0,0 +1,46 @@
|
|||
#include "libgcc.h"
|
||||
|
||||
#define __ll_B ((u32) 1 << (32 / 2))
|
||||
#define __ll_lowpart(t) ((u32) (t) & (__ll_B - 1))
|
||||
#define __ll_highpart(t) ((u32) (t) >> 16)
|
||||
|
||||
#define umul_ppmm(w1, w0, u, v) \
|
||||
do { \
|
||||
u32 __x0, __x1, __x2, __x3; \
|
||||
u16 __ul, __vl, __uh, __vh; \
|
||||
\
|
||||
__ul = __ll_lowpart (u); \
|
||||
__uh = __ll_highpart (u); \
|
||||
__vl = __ll_lowpart (v); \
|
||||
__vh = __ll_highpart (v); \
|
||||
\
|
||||
__x0 = (u32) __ul * __vl; \
|
||||
__x1 = (u32) __ul * __vh; \
|
||||
__x2 = (u32) __uh * __vl; \
|
||||
__x3 = (u32) __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)
|
||||
|
||||
union DWunion {
|
||||
struct {
|
||||
s32 high;
|
||||
s32 low;
|
||||
} s;
|
||||
s64 ll;
|
||||
};
|
||||
|
||||
u64 __umulsidi3(u32 u, u32 v)
|
||||
{
|
||||
union DWunion __w;
|
||||
|
||||
umul_ppmm(__w.s.high, __w.s.low, u, v);
|
||||
|
||||
return __w.ll;
|
||||
}
|
|
@ -0,0 +1,32 @@
|
|||
#ifndef _PA_LIBGCC_H_
|
||||
#define _PA_LIBGCC_H_
|
||||
|
||||
#include <linux/types.h>
|
||||
#include <linux/module.h>
|
||||
|
||||
/* Cribbed from klibc/libgcc/ */
|
||||
u64 __ashldi3(u64 v, int cnt);
|
||||
u64 __ashrdi3(u64 v, int cnt);
|
||||
|
||||
u32 __clzsi2(u32 v);
|
||||
|
||||
s64 __divdi3(s64 num, s64 den);
|
||||
s32 __divsi3(s32 num, s32 den);
|
||||
|
||||
u64 __lshrdi3(u64 v, int cnt);
|
||||
|
||||
s64 __moddi3(s64 num, s64 den);
|
||||
s32 __modsi3(s32 num, s32 den);
|
||||
|
||||
u64 __udivdi3(u64 num, u64 den);
|
||||
u32 __udivsi3(u32 num, u32 den);
|
||||
|
||||
u64 __udivmoddi4(u64 num, u64 den, u64 * rem_p);
|
||||
u32 __udivmodsi4(u32 num, u32 den, u32 * rem_p);
|
||||
|
||||
u64 __umulsidi3(u32 u, u32 v);
|
||||
|
||||
u64 __umoddi3(u64 num, u64 den);
|
||||
u32 __umodsi3(u32 num, u32 den);
|
||||
|
||||
#endif /*_PA_LIBGCC_H_*/
|
|
@ -139,12 +139,12 @@ DECLARE_PER_CPU(struct exception_data, exception_data);
|
|||
#define stw(_s,_t,_o,_a,_e) def_store_insn(stw,"r",_s,_t,_o,_a,_e)
|
||||
|
||||
#ifdef CONFIG_PREFETCH
|
||||
extern inline void prefetch_src(const void *addr)
|
||||
static inline void prefetch_src(const void *addr)
|
||||
{
|
||||
__asm__("ldw 0(" s_space ",%0), %%r0" : : "r" (addr));
|
||||
}
|
||||
|
||||
extern inline void prefetch_dst(const void *addr)
|
||||
static inline void prefetch_dst(const void *addr)
|
||||
{
|
||||
__asm__("ldd 0(" d_space ",%0), %%r0" : : "r" (addr));
|
||||
}
|
||||
|
|
|
@ -0,0 +1 @@
|
|||
obj-y := dyncall.o divI.o divU.o remI.o remU.o div_const.o mulI.o
|
|
@ -0,0 +1,254 @@
|
|||
/* 32 and 64-bit millicode, original author Hewlett-Packard
|
||||
adapted for gcc by Paul Bame <bame@debian.org>
|
||||
and Alan Modra <alan@linuxcare.com.au>.
|
||||
|
||||
Copyright 2001, 2002, 2003 Free Software Foundation, Inc.
|
||||
|
||||
This file is part of GCC and is released under the terms of
|
||||
of the GNU General Public License as published by the Free Software
|
||||
Foundation; either version 2, or (at your option) any later version.
|
||||
See the file COPYING in the top-level GCC source directory for a copy
|
||||
of the license. */
|
||||
|
||||
#include "milli.h"
|
||||
|
||||
#ifdef L_divI
|
||||
/* ROUTINES: $$divI, $$divoI
|
||||
|
||||
Single precision divide for signed binary integers.
|
||||
|
||||
The quotient is truncated towards zero.
|
||||
The sign of the quotient is the XOR of the signs of the dividend and
|
||||
divisor.
|
||||
Divide by zero is trapped.
|
||||
Divide of -2**31 by -1 is trapped for $$divoI but not for $$divI.
|
||||
|
||||
INPUT REGISTERS:
|
||||
. arg0 == dividend
|
||||
. arg1 == divisor
|
||||
. mrp == return pc
|
||||
. sr0 == return space when called externally
|
||||
|
||||
OUTPUT REGISTERS:
|
||||
. arg0 = undefined
|
||||
. arg1 = undefined
|
||||
. ret1 = quotient
|
||||
|
||||
OTHER REGISTERS AFFECTED:
|
||||
. r1 = undefined
|
||||
|
||||
SIDE EFFECTS:
|
||||
. Causes a trap under the following conditions:
|
||||
. divisor is zero (traps with ADDIT,= 0,25,0)
|
||||
. dividend==-2**31 and divisor==-1 and routine is $$divoI
|
||||
. (traps with ADDO 26,25,0)
|
||||
. Changes memory at the following places:
|
||||
. NONE
|
||||
|
||||
PERMISSIBLE CONTEXT:
|
||||
. Unwindable.
|
||||
. Suitable for internal or external millicode.
|
||||
. Assumes the special millicode register conventions.
|
||||
|
||||
DISCUSSION:
|
||||
. Branchs to other millicode routines using BE
|
||||
. $$div_# for # being 2,3,4,5,6,7,8,9,10,12,14,15
|
||||
.
|
||||
. For selected divisors, calls a divide by constant routine written by
|
||||
. Karl Pettis. Eligible divisors are 1..15 excluding 11 and 13.
|
||||
.
|
||||
. The only overflow case is -2**31 divided by -1.
|
||||
. Both routines return -2**31 but only $$divoI traps. */
|
||||
|
||||
RDEFINE(temp,r1)
|
||||
RDEFINE(retreg,ret1) /* r29 */
|
||||
RDEFINE(temp1,arg0)
|
||||
SUBSPA_MILLI_DIV
|
||||
ATTR_MILLI
|
||||
.import $$divI_2,millicode
|
||||
.import $$divI_3,millicode
|
||||
.import $$divI_4,millicode
|
||||
.import $$divI_5,millicode
|
||||
.import $$divI_6,millicode
|
||||
.import $$divI_7,millicode
|
||||
.import $$divI_8,millicode
|
||||
.import $$divI_9,millicode
|
||||
.import $$divI_10,millicode
|
||||
.import $$divI_12,millicode
|
||||
.import $$divI_14,millicode
|
||||
.import $$divI_15,millicode
|
||||
.export $$divI,millicode
|
||||
.export $$divoI,millicode
|
||||
.proc
|
||||
.callinfo millicode
|
||||
.entry
|
||||
GSYM($$divoI)
|
||||
comib,=,n -1,arg1,LREF(negative1) /* when divisor == -1 */
|
||||
GSYM($$divI)
|
||||
ldo -1(arg1),temp /* is there at most one bit set ? */
|
||||
and,<> arg1,temp,r0 /* if not, don't use power of 2 divide */
|
||||
addi,> 0,arg1,r0 /* if divisor > 0, use power of 2 divide */
|
||||
b,n LREF(neg_denom)
|
||||
LSYM(pow2)
|
||||
addi,>= 0,arg0,retreg /* if numerator is negative, add the */
|
||||
add arg0,temp,retreg /* (denominaotr -1) to correct for shifts */
|
||||
extru,= arg1,15,16,temp /* test denominator with 0xffff0000 */
|
||||
extrs retreg,15,16,retreg /* retreg = retreg >> 16 */
|
||||
or arg1,temp,arg1 /* arg1 = arg1 | (arg1 >> 16) */
|
||||
ldi 0xcc,temp1 /* setup 0xcc in temp1 */
|
||||
extru,= arg1,23,8,temp /* test denominator with 0xff00 */
|
||||
extrs retreg,23,24,retreg /* retreg = retreg >> 8 */
|
||||
or arg1,temp,arg1 /* arg1 = arg1 | (arg1 >> 8) */
|
||||
ldi 0xaa,temp /* setup 0xaa in temp */
|
||||
extru,= arg1,27,4,r0 /* test denominator with 0xf0 */
|
||||
extrs retreg,27,28,retreg /* retreg = retreg >> 4 */
|
||||
and,= arg1,temp1,r0 /* test denominator with 0xcc */
|
||||
extrs retreg,29,30,retreg /* retreg = retreg >> 2 */
|
||||
and,= arg1,temp,r0 /* test denominator with 0xaa */
|
||||
extrs retreg,30,31,retreg /* retreg = retreg >> 1 */
|
||||
MILLIRETN
|
||||
LSYM(neg_denom)
|
||||
addi,< 0,arg1,r0 /* if arg1 >= 0, it's not power of 2 */
|
||||
b,n LREF(regular_seq)
|
||||
sub r0,arg1,temp /* make denominator positive */
|
||||
comb,=,n arg1,temp,LREF(regular_seq) /* test against 0x80000000 and 0 */
|
||||
ldo -1(temp),retreg /* is there at most one bit set ? */
|
||||
and,= temp,retreg,r0 /* if so, the denominator is power of 2 */
|
||||
b,n LREF(regular_seq)
|
||||
sub r0,arg0,retreg /* negate numerator */
|
||||
comb,=,n arg0,retreg,LREF(regular_seq) /* test against 0x80000000 */
|
||||
copy retreg,arg0 /* set up arg0, arg1 and temp */
|
||||
copy temp,arg1 /* before branching to pow2 */
|
||||
b LREF(pow2)
|
||||
ldo -1(arg1),temp
|
||||
LSYM(regular_seq)
|
||||
comib,>>=,n 15,arg1,LREF(small_divisor)
|
||||
add,>= 0,arg0,retreg /* move dividend, if retreg < 0, */
|
||||
LSYM(normal)
|
||||
subi 0,retreg,retreg /* make it positive */
|
||||
sub 0,arg1,temp /* clear carry, */
|
||||
/* negate the divisor */
|
||||
ds 0,temp,0 /* set V-bit to the comple- */
|
||||
/* ment of the divisor sign */
|
||||
add retreg,retreg,retreg /* shift msb bit into carry */
|
||||
ds r0,arg1,temp /* 1st divide step, if no carry */
|
||||
addc retreg,retreg,retreg /* shift retreg with/into carry */
|
||||
ds temp,arg1,temp /* 2nd divide step */
|
||||
addc retreg,retreg,retreg /* shift retreg with/into carry */
|
||||
ds temp,arg1,temp /* 3rd divide step */
|
||||
addc retreg,retreg,retreg /* shift retreg with/into carry */
|
||||
ds temp,arg1,temp /* 4th divide step */
|
||||
addc retreg,retreg,retreg /* shift retreg with/into carry */
|
||||
ds temp,arg1,temp /* 5th divide step */
|
||||
addc retreg,retreg,retreg /* shift retreg with/into carry */
|
||||
ds temp,arg1,temp /* 6th divide step */
|
||||
addc retreg,retreg,retreg /* shift retreg with/into carry */
|
||||
ds temp,arg1,temp /* 7th divide step */
|
||||
addc retreg,retreg,retreg /* shift retreg with/into carry */
|
||||
ds temp,arg1,temp /* 8th divide step */
|
||||
addc retreg,retreg,retreg /* shift retreg with/into carry */
|
||||
ds temp,arg1,temp /* 9th divide step */
|
||||
addc retreg,retreg,retreg /* shift retreg with/into carry */
|
||||
ds temp,arg1,temp /* 10th divide step */
|
||||
addc retreg,retreg,retreg /* shift retreg with/into carry */
|
||||
ds temp,arg1,temp /* 11th divide step */
|
||||
addc retreg,retreg,retreg /* shift retreg with/into carry */
|
||||
ds temp,arg1,temp /* 12th divide step */
|
||||
addc retreg,retreg,retreg /* shift retreg with/into carry */
|
||||
ds temp,arg1,temp /* 13th divide step */
|
||||
addc retreg,retreg,retreg /* shift retreg with/into carry */
|
||||
ds temp,arg1,temp /* 14th divide step */
|
||||
addc retreg,retreg,retreg /* shift retreg with/into carry */
|
||||
ds temp,arg1,temp /* 15th divide step */
|
||||
addc retreg,retreg,retreg /* shift retreg with/into carry */
|
||||
ds temp,arg1,temp /* 16th divide step */
|
||||
addc retreg,retreg,retreg /* shift retreg with/into carry */
|
||||
ds temp,arg1,temp /* 17th divide step */
|
||||
addc retreg,retreg,retreg /* shift retreg with/into carry */
|
||||
ds temp,arg1,temp /* 18th divide step */
|
||||
addc retreg,retreg,retreg /* shift retreg with/into carry */
|
||||
ds temp,arg1,temp /* 19th divide step */
|
||||
addc retreg,retreg,retreg /* shift retreg with/into carry */
|
||||
ds temp,arg1,temp /* 20th divide step */
|
||||
addc retreg,retreg,retreg /* shift retreg with/into carry */
|
||||
ds temp,arg1,temp /* 21st divide step */
|
||||
addc retreg,retreg,retreg /* shift retreg with/into carry */
|
||||
ds temp,arg1,temp /* 22nd divide step */
|
||||
addc retreg,retreg,retreg /* shift retreg with/into carry */
|
||||
ds temp,arg1,temp /* 23rd divide step */
|
||||
addc retreg,retreg,retreg /* shift retreg with/into carry */
|
||||
ds temp,arg1,temp /* 24th divide step */
|
||||
addc retreg,retreg,retreg /* shift retreg with/into carry */
|
||||
ds temp,arg1,temp /* 25th divide step */
|
||||
addc retreg,retreg,retreg /* shift retreg with/into carry */
|
||||
ds temp,arg1,temp /* 26th divide step */
|
||||
addc retreg,retreg,retreg /* shift retreg with/into carry */
|
||||
ds temp,arg1,temp /* 27th divide step */
|
||||
addc retreg,retreg,retreg /* shift retreg with/into carry */
|
||||
ds temp,arg1,temp /* 28th divide step */
|
||||
addc retreg,retreg,retreg /* shift retreg with/into carry */
|
||||
ds temp,arg1,temp /* 29th divide step */
|
||||
addc retreg,retreg,retreg /* shift retreg with/into carry */
|
||||
ds temp,arg1,temp /* 30th divide step */
|
||||
addc retreg,retreg,retreg /* shift retreg with/into carry */
|
||||
ds temp,arg1,temp /* 31st divide step */
|
||||
addc retreg,retreg,retreg /* shift retreg with/into carry */
|
||||
ds temp,arg1,temp /* 32nd divide step, */
|
||||
addc retreg,retreg,retreg /* shift last retreg bit into retreg */
|
||||
xor,>= arg0,arg1,0 /* get correct sign of quotient */
|
||||
sub 0,retreg,retreg /* based on operand signs */
|
||||
MILLIRETN
|
||||
nop
|
||||
|
||||
LSYM(small_divisor)
|
||||
|
||||
#if defined(CONFIG_64BIT)
|
||||
/* Clear the upper 32 bits of the arg1 register. We are working with */
|
||||
/* small divisors (and 32-bit integers) We must not be mislead */
|
||||
/* by "1" bits left in the upper 32 bits. */
|
||||
depd %r0,31,32,%r25
|
||||
#endif
|
||||
blr,n arg1,r0
|
||||
nop
|
||||
/* table for divisor == 0,1, ... ,15 */
|
||||
addit,= 0,arg1,r0 /* trap if divisor == 0 */
|
||||
nop
|
||||
MILLIRET /* divisor == 1 */
|
||||
copy arg0,retreg
|
||||
MILLI_BEN($$divI_2) /* divisor == 2 */
|
||||
nop
|
||||
MILLI_BEN($$divI_3) /* divisor == 3 */
|
||||
nop
|
||||
MILLI_BEN($$divI_4) /* divisor == 4 */
|
||||
nop
|
||||
MILLI_BEN($$divI_5) /* divisor == 5 */
|
||||
nop
|
||||
MILLI_BEN($$divI_6) /* divisor == 6 */
|
||||
nop
|
||||
MILLI_BEN($$divI_7) /* divisor == 7 */
|
||||
nop
|
||||
MILLI_BEN($$divI_8) /* divisor == 8 */
|
||||
nop
|
||||
MILLI_BEN($$divI_9) /* divisor == 9 */
|
||||
nop
|
||||
MILLI_BEN($$divI_10) /* divisor == 10 */
|
||||
nop
|
||||
b LREF(normal) /* divisor == 11 */
|
||||
add,>= 0,arg0,retreg
|
||||
MILLI_BEN($$divI_12) /* divisor == 12 */
|
||||
nop
|
||||
b LREF(normal) /* divisor == 13 */
|
||||
add,>= 0,arg0,retreg
|
||||
MILLI_BEN($$divI_14) /* divisor == 14 */
|
||||
nop
|
||||
MILLI_BEN($$divI_15) /* divisor == 15 */
|
||||
nop
|
||||
|
||||
LSYM(negative1)
|
||||
sub 0,arg0,retreg /* result is negation of dividend */
|
||||
MILLIRET
|
||||
addo arg0,arg1,r0 /* trap iff dividend==0x80000000 && divisor==-1 */
|
||||
.exit
|
||||
.procend
|
||||
.end
|
||||
#endif
|
|
@ -0,0 +1,235 @@
|
|||
/* 32 and 64-bit millicode, original author Hewlett-Packard
|
||||
adapted for gcc by Paul Bame <bame@debian.org>
|
||||
and Alan Modra <alan@linuxcare.com.au>.
|
||||
|
||||
Copyright 2001, 2002, 2003 Free Software Foundation, Inc.
|
||||
|
||||
This file is part of GCC and is released under the terms of
|
||||
of the GNU General Public License as published by the Free Software
|
||||
Foundation; either version 2, or (at your option) any later version.
|
||||
See the file COPYING in the top-level GCC source directory for a copy
|
||||
of the license. */
|
||||
|
||||
#include "milli.h"
|
||||
|
||||
#ifdef L_divU
|
||||
/* ROUTINE: $$divU
|
||||
.
|
||||
. Single precision divide for unsigned integers.
|
||||
.
|
||||
. Quotient is truncated towards zero.
|
||||
. Traps on divide by zero.
|
||||
|
||||
INPUT REGISTERS:
|
||||
. arg0 == dividend
|
||||
. arg1 == divisor
|
||||
. mrp == return pc
|
||||
. sr0 == return space when called externally
|
||||
|
||||
OUTPUT REGISTERS:
|
||||
. arg0 = undefined
|
||||
. arg1 = undefined
|
||||
. ret1 = quotient
|
||||
|
||||
OTHER REGISTERS AFFECTED:
|
||||
. r1 = undefined
|
||||
|
||||
SIDE EFFECTS:
|
||||
. Causes a trap under the following conditions:
|
||||
. divisor is zero
|
||||
. Changes memory at the following places:
|
||||
. NONE
|
||||
|
||||
PERMISSIBLE CONTEXT:
|
||||
. Unwindable.
|
||||
. Does not create a stack frame.
|
||||
. Suitable for internal or external millicode.
|
||||
. Assumes the special millicode register conventions.
|
||||
|
||||
DISCUSSION:
|
||||
. Branchs to other millicode routines using BE:
|
||||
. $$divU_# for 3,5,6,7,9,10,12,14,15
|
||||
.
|
||||
. For selected small divisors calls the special divide by constant
|
||||
. routines written by Karl Pettis. These are: 3,5,6,7,9,10,12,14,15. */
|
||||
|
||||
RDEFINE(temp,r1)
|
||||
RDEFINE(retreg,ret1) /* r29 */
|
||||
RDEFINE(temp1,arg0)
|
||||
SUBSPA_MILLI_DIV
|
||||
ATTR_MILLI
|
||||
.export $$divU,millicode
|
||||
.import $$divU_3,millicode
|
||||
.import $$divU_5,millicode
|
||||
.import $$divU_6,millicode
|
||||
.import $$divU_7,millicode
|
||||
.import $$divU_9,millicode
|
||||
.import $$divU_10,millicode
|
||||
.import $$divU_12,millicode
|
||||
.import $$divU_14,millicode
|
||||
.import $$divU_15,millicode
|
||||
.proc
|
||||
.callinfo millicode
|
||||
.entry
|
||||
GSYM($$divU)
|
||||
/* The subtract is not nullified since it does no harm and can be used
|
||||
by the two cases that branch back to "normal". */
|
||||
ldo -1(arg1),temp /* is there at most one bit set ? */
|
||||
and,= arg1,temp,r0 /* if so, denominator is power of 2 */
|
||||
b LREF(regular_seq)
|
||||
addit,= 0,arg1,0 /* trap for zero dvr */
|
||||
copy arg0,retreg
|
||||
extru,= arg1,15,16,temp /* test denominator with 0xffff0000 */
|
||||
extru retreg,15,16,retreg /* retreg = retreg >> 16 */
|
||||
or arg1,temp,arg1 /* arg1 = arg1 | (arg1 >> 16) */
|
||||
ldi 0xcc,temp1 /* setup 0xcc in temp1 */
|
||||
extru,= arg1,23,8,temp /* test denominator with 0xff00 */
|
||||
extru retreg,23,24,retreg /* retreg = retreg >> 8 */
|
||||
or arg1,temp,arg1 /* arg1 = arg1 | (arg1 >> 8) */
|
||||
ldi 0xaa,temp /* setup 0xaa in temp */
|
||||
extru,= arg1,27,4,r0 /* test denominator with 0xf0 */
|
||||
extru retreg,27,28,retreg /* retreg = retreg >> 4 */
|
||||
and,= arg1,temp1,r0 /* test denominator with 0xcc */
|
||||
extru retreg,29,30,retreg /* retreg = retreg >> 2 */
|
||||
and,= arg1,temp,r0 /* test denominator with 0xaa */
|
||||
extru retreg,30,31,retreg /* retreg = retreg >> 1 */
|
||||
MILLIRETN
|
||||
nop
|
||||
LSYM(regular_seq)
|
||||
comib,>= 15,arg1,LREF(special_divisor)
|
||||
subi 0,arg1,temp /* clear carry, negate the divisor */
|
||||
ds r0,temp,r0 /* set V-bit to 1 */
|
||||
LSYM(normal)
|
||||
add arg0,arg0,retreg /* shift msb bit into carry */
|
||||
ds r0,arg1,temp /* 1st divide step, if no carry */
|
||||
addc retreg,retreg,retreg /* shift retreg with/into carry */
|
||||
ds temp,arg1,temp /* 2nd divide step */
|
||||
addc retreg,retreg,retreg /* shift retreg with/into carry */
|
||||
ds temp,arg1,temp /* 3rd divide step */
|
||||
addc retreg,retreg,retreg /* shift retreg with/into carry */
|
||||
ds temp,arg1,temp /* 4th divide step */
|
||||
addc retreg,retreg,retreg /* shift retreg with/into carry */
|
||||
ds temp,arg1,temp /* 5th divide step */
|
||||
addc retreg,retreg,retreg /* shift retreg with/into carry */
|
||||
ds temp,arg1,temp /* 6th divide step */
|
||||
addc retreg,retreg,retreg /* shift retreg with/into carry */
|
||||
ds temp,arg1,temp /* 7th divide step */
|
||||
addc retreg,retreg,retreg /* shift retreg with/into carry */
|
||||
ds temp,arg1,temp /* 8th divide step */
|
||||
addc retreg,retreg,retreg /* shift retreg with/into carry */
|
||||
ds temp,arg1,temp /* 9th divide step */
|
||||
addc retreg,retreg,retreg /* shift retreg with/into carry */
|
||||
ds temp,arg1,temp /* 10th divide step */
|
||||
addc retreg,retreg,retreg /* shift retreg with/into carry */
|
||||
ds temp,arg1,temp /* 11th divide step */
|
||||
addc retreg,retreg,retreg /* shift retreg with/into carry */
|
||||
ds temp,arg1,temp /* 12th divide step */
|
||||
addc retreg,retreg,retreg /* shift retreg with/into carry */
|
||||
ds temp,arg1,temp /* 13th divide step */
|
||||
addc retreg,retreg,retreg /* shift retreg with/into carry */
|
||||
ds temp,arg1,temp /* 14th divide step */
|
||||
addc retreg,retreg,retreg /* shift retreg with/into carry */
|
||||
ds temp,arg1,temp /* 15th divide step */
|
||||
addc retreg,retreg,retreg /* shift retreg with/into carry */
|
||||
ds temp,arg1,temp /* 16th divide step */
|
||||
addc retreg,retreg,retreg /* shift retreg with/into carry */
|
||||
ds temp,arg1,temp /* 17th divide step */
|
||||
addc retreg,retreg,retreg /* shift retreg with/into carry */
|
||||
ds temp,arg1,temp /* 18th divide step */
|
||||
addc retreg,retreg,retreg /* shift retreg with/into carry */
|
||||
ds temp,arg1,temp /* 19th divide step */
|
||||
addc retreg,retreg,retreg /* shift retreg with/into carry */
|
||||
ds temp,arg1,temp /* 20th divide step */
|
||||
addc retreg,retreg,retreg /* shift retreg with/into carry */
|
||||
ds temp,arg1,temp /* 21st divide step */
|
||||
addc retreg,retreg,retreg /* shift retreg with/into carry */
|
||||
ds temp,arg1,temp /* 22nd divide step */
|
||||
addc retreg,retreg,retreg /* shift retreg with/into carry */
|
||||
ds temp,arg1,temp /* 23rd divide step */
|
||||
addc retreg,retreg,retreg /* shift retreg with/into carry */
|
||||
ds temp,arg1,temp /* 24th divide step */
|
||||
addc retreg,retreg,retreg /* shift retreg with/into carry */
|
||||
ds temp,arg1,temp /* 25th divide step */
|
||||
addc retreg,retreg,retreg /* shift retreg with/into carry */
|
||||
ds temp,arg1,temp /* 26th divide step */
|
||||
addc retreg,retreg,retreg /* shift retreg with/into carry */
|
||||
ds temp,arg1,temp /* 27th divide step */
|
||||
addc retreg,retreg,retreg /* shift retreg with/into carry */
|
||||
ds temp,arg1,temp /* 28th divide step */
|
||||
addc retreg,retreg,retreg /* shift retreg with/into carry */
|
||||
ds temp,arg1,temp /* 29th divide step */
|
||||
addc retreg,retreg,retreg /* shift retreg with/into carry */
|
||||
ds temp,arg1,temp /* 30th divide step */
|
||||
addc retreg,retreg,retreg /* shift retreg with/into carry */
|
||||
ds temp,arg1,temp /* 31st divide step */
|
||||
addc retreg,retreg,retreg /* shift retreg with/into carry */
|
||||
ds temp,arg1,temp /* 32nd divide step, */
|
||||
MILLIRET
|
||||
addc retreg,retreg,retreg /* shift last retreg bit into retreg */
|
||||
|
||||
/* Handle the cases where divisor is a small constant or has high bit on. */
|
||||
LSYM(special_divisor)
|
||||
/* blr arg1,r0 */
|
||||
/* comib,>,n 0,arg1,LREF(big_divisor) ; nullify previous instruction */
|
||||
|
||||
/* Pratap 8/13/90. The 815 Stirling chip set has a bug that prevents us from
|
||||
generating such a blr, comib sequence. A problem in nullification. So I
|
||||
rewrote this code. */
|
||||
|
||||
#if defined(CONFIG_64BIT)
|
||||
/* Clear the upper 32 bits of the arg1 register. We are working with
|
||||
small divisors (and 32-bit unsigned integers) We must not be mislead
|
||||
by "1" bits left in the upper 32 bits. */
|
||||
depd %r0,31,32,%r25
|
||||
#endif
|
||||
comib,> 0,arg1,LREF(big_divisor)
|
||||
nop
|
||||
blr arg1,r0
|
||||
nop
|
||||
|
||||
LSYM(zero_divisor) /* this label is here to provide external visibility */
|
||||
addit,= 0,arg1,0 /* trap for zero dvr */
|
||||
nop
|
||||
MILLIRET /* divisor == 1 */
|
||||
copy arg0,retreg
|
||||
MILLIRET /* divisor == 2 */
|
||||
extru arg0,30,31,retreg
|
||||
MILLI_BEN($$divU_3) /* divisor == 3 */
|
||||
nop
|
||||
MILLIRET /* divisor == 4 */
|
||||
extru arg0,29,30,retreg
|
||||
MILLI_BEN($$divU_5) /* divisor == 5 */
|
||||
nop
|
||||
MILLI_BEN($$divU_6) /* divisor == 6 */
|
||||
nop
|
||||
MILLI_BEN($$divU_7) /* divisor == 7 */
|
||||
nop
|
||||
MILLIRET /* divisor == 8 */
|
||||
extru arg0,28,29,retreg
|
||||
MILLI_BEN($$divU_9) /* divisor == 9 */
|
||||
nop
|
||||
MILLI_BEN($$divU_10) /* divisor == 10 */
|
||||
nop
|
||||
b LREF(normal) /* divisor == 11 */
|
||||
ds r0,temp,r0 /* set V-bit to 1 */
|
||||
MILLI_BEN($$divU_12) /* divisor == 12 */
|
||||
nop
|
||||
b LREF(normal) /* divisor == 13 */
|
||||
ds r0,temp,r0 /* set V-bit to 1 */
|
||||
MILLI_BEN($$divU_14) /* divisor == 14 */
|
||||
nop
|
||||
MILLI_BEN($$divU_15) /* divisor == 15 */
|
||||
nop
|
||||
|
||||
/* Handle the case where the high bit is on in the divisor.
|
||||
Compute: if( dividend>=divisor) quotient=1; else quotient=0;
|
||||
Note: dividend>==divisor iff dividend-divisor does not borrow
|
||||
and not borrow iff carry. */
|
||||
LSYM(big_divisor)
|
||||
sub arg0,arg1,r0
|
||||
MILLIRET
|
||||
addc r0,r0,retreg
|
||||
.exit
|
||||
.procend
|
||||
.end
|
||||
#endif
|
|
@ -0,0 +1,682 @@
|
|||
/* 32 and 64-bit millicode, original author Hewlett-Packard
|
||||
adapted for gcc by Paul Bame <bame@debian.org>
|
||||
and Alan Modra <alan@linuxcare.com.au>.
|
||||
|
||||
Copyright 2001, 2002, 2003 Free Software Foundation, Inc.
|
||||
|
||||
This file is part of GCC and is released under the terms of
|
||||
of the GNU General Public License as published by the Free Software
|
||||
Foundation; either version 2, or (at your option) any later version.
|
||||
See the file COPYING in the top-level GCC source directory for a copy
|
||||
of the license. */
|
||||
|
||||
#include "milli.h"
|
||||
|
||||
#ifdef L_div_const
|
||||
/* ROUTINE: $$divI_2
|
||||
. $$divI_3 $$divU_3
|
||||
. $$divI_4
|
||||
. $$divI_5 $$divU_5
|
||||
. $$divI_6 $$divU_6
|
||||
. $$divI_7 $$divU_7
|
||||
. $$divI_8
|
||||
. $$divI_9 $$divU_9
|
||||
. $$divI_10 $$divU_10
|
||||
.
|
||||
. $$divI_12 $$divU_12
|
||||
.
|
||||
. $$divI_14 $$divU_14
|
||||
. $$divI_15 $$divU_15
|
||||
. $$divI_16
|
||||
. $$divI_17 $$divU_17
|
||||
.
|
||||
. Divide by selected constants for single precision binary integers.
|
||||
|
||||
INPUT REGISTERS:
|
||||
. arg0 == dividend
|
||||
. mrp == return pc
|
||||
. sr0 == return space when called externally
|
||||
|
||||
OUTPUT REGISTERS:
|
||||
. arg0 = undefined
|
||||
. arg1 = undefined
|
||||
. ret1 = quotient
|
||||
|
||||
OTHER REGISTERS AFFECTED:
|
||||
. r1 = undefined
|
||||
|
||||
SIDE EFFECTS:
|
||||
. Causes a trap under the following conditions: NONE
|
||||
. Changes memory at the following places: NONE
|
||||
|
||||
PERMISSIBLE CONTEXT:
|
||||
. Unwindable.
|
||||
. Does not create a stack frame.
|
||||
. Suitable for internal or external millicode.
|
||||
. Assumes the special millicode register conventions.
|
||||
|
||||
DISCUSSION:
|
||||
. Calls other millicode routines using mrp: NONE
|
||||
. Calls other millicode routines: NONE */
|
||||
|
||||
|
||||
/* TRUNCATED DIVISION BY SMALL INTEGERS
|
||||
|
||||
We are interested in q(x) = floor(x/y), where x >= 0 and y > 0
|
||||
(with y fixed).
|
||||
|
||||
Let a = floor(z/y), for some choice of z. Note that z will be
|
||||
chosen so that division by z is cheap.
|
||||
|
||||
Let r be the remainder(z/y). In other words, r = z - ay.
|
||||
|
||||
Now, our method is to choose a value for b such that
|
||||
|
||||
q'(x) = floor((ax+b)/z)
|
||||
|
||||
is equal to q(x) over as large a range of x as possible. If the
|
||||
two are equal over a sufficiently large range, and if it is easy to
|
||||
form the product (ax), and it is easy to divide by z, then we can
|
||||
perform the division much faster than the general division algorithm.
|
||||
|
||||
So, we want the following to be true:
|
||||
|
||||
. For x in the following range:
|
||||
.
|
||||
. ky <= x < (k+1)y
|
||||
.
|
||||
. implies that
|
||||
.
|
||||
. k <= (ax+b)/z < (k+1)
|
||||
|
||||
We want to determine b such that this is true for all k in the
|
||||
range {0..K} for some maximum K.
|
||||
|
||||
Since (ax+b) is an increasing function of x, we can take each
|
||||
bound separately to determine the "best" value for b.
|
||||
|
||||
(ax+b)/z < (k+1) implies
|
||||
|
||||
(a((k+1)y-1)+b < (k+1)z implies
|
||||
|
||||
b < a + (k+1)(z-ay) implies
|
||||
|
||||
b < a + (k+1)r
|
||||
|
||||
This needs to be true for all k in the range {0..K}. In
|
||||
particular, it is true for k = 0 and this leads to a maximum
|
||||
acceptable value for b.
|
||||
|
||||
b < a+r or b <= a+r-1
|
||||
|
||||
Taking the other bound, we have
|
||||
|
||||
k <= (ax+b)/z implies
|
||||
|
||||
k <= (aky+b)/z implies
|
||||
|
||||
k(z-ay) <= b implies
|
||||
|
||||
kr <= b
|
||||
|
||||
Clearly, the largest range for k will be achieved by maximizing b,
|
||||
when r is not zero. When r is zero, then the simplest choice for b
|
||||
is 0. When r is not 0, set
|
||||
|
||||
. b = a+r-1
|
||||
|
||||
Now, by construction, q'(x) = floor((ax+b)/z) = q(x) = floor(x/y)
|
||||
for all x in the range:
|
||||
|
||||
. 0 <= x < (K+1)y
|
||||
|
||||
We need to determine what K is. Of our two bounds,
|
||||
|
||||
. b < a+(k+1)r is satisfied for all k >= 0, by construction.
|
||||
|
||||
The other bound is
|
||||
|
||||
. kr <= b
|
||||
|
||||
This is always true if r = 0. If r is not 0 (the usual case), then
|
||||
K = floor((a+r-1)/r), is the maximum value for k.
|
||||
|
||||
Therefore, the formula q'(x) = floor((ax+b)/z) yields the correct
|
||||
answer for q(x) = floor(x/y) when x is in the range
|
||||
|
||||
(0,(K+1)y-1) K = floor((a+r-1)/r)
|
||||
|
||||
To be most useful, we want (K+1)y-1 = (max x) >= 2**32-1 so that
|
||||
the formula for q'(x) yields the correct value of q(x) for all x
|
||||
representable by a single word in HPPA.
|
||||
|
||||
We are also constrained in that computing the product (ax), adding
|
||||
b, and dividing by z must all be done quickly, otherwise we will be
|
||||
better off going through the general algorithm using the DS
|
||||
instruction, which uses approximately 70 cycles.
|
||||
|
||||
For each y, there is a choice of z which satisfies the constraints
|
||||
for (K+1)y >= 2**32. We may not, however, be able to satisfy the
|
||||
timing constraints for arbitrary y. It seems that z being equal to
|
||||
a power of 2 or a power of 2 minus 1 is as good as we can do, since
|
||||
it minimizes the time to do division by z. We want the choice of z
|
||||
to also result in a value for (a) that minimizes the computation of
|
||||
the product (ax). This is best achieved if (a) has a regular bit
|
||||
pattern (so the multiplication can be done with shifts and adds).
|
||||
The value of (a) also needs to be less than 2**32 so the product is
|
||||
always guaranteed to fit in 2 words.
|
||||
|
||||
In actual practice, the following should be done:
|
||||
|
||||
1) For negative x, you should take the absolute value and remember
|
||||
. the fact so that the result can be negated. This obviously does
|
||||
. not apply in the unsigned case.
|
||||
2) For even y, you should factor out the power of 2 that divides y
|
||||
. and divide x by it. You can then proceed by dividing by the
|
||||
. odd factor of y.
|
||||
|
||||
Here is a table of some odd values of y, and corresponding choices
|
||||
for z which are "good".
|
||||
|
||||
y z r a (hex) max x (hex)
|
||||
|
||||
3 2**32 1 55555555 100000001
|
||||
5 2**32 1 33333333 100000003
|
||||
7 2**24-1 0 249249 (infinite)
|
||||
9 2**24-1 0 1c71c7 (infinite)
|
||||
11 2**20-1 0 1745d (infinite)
|
||||
13 2**24-1 0 13b13b (infinite)
|
||||
15 2**32 1 11111111 10000000d
|
||||
17 2**32 1 f0f0f0f 10000000f
|
||||
|
||||
If r is 1, then b = a+r-1 = a. This simplifies the computation
|
||||
of (ax+b), since you can compute (x+1)(a) instead. If r is 0,
|
||||
then b = 0 is ok to use which simplifies (ax+b).
|
||||
|
||||
The bit patterns for 55555555, 33333333, and 11111111 are obviously
|
||||
very regular. The bit patterns for the other values of a above are:
|
||||
|
||||
y (hex) (binary)
|
||||
|
||||
7 249249 001001001001001001001001 << regular >>
|
||||
9 1c71c7 000111000111000111000111 << regular >>
|
||||
11 1745d 000000010111010001011101 << irregular >>
|
||||
13 13b13b 000100111011000100111011 << irregular >>
|
||||
|
||||
The bit patterns for (a) corresponding to (y) of 11 and 13 may be
|
||||
too irregular to warrant using this method.
|
||||
|
||||
When z is a power of 2 minus 1, then the division by z is slightly
|
||||
more complicated, involving an iterative solution.
|
||||
|
||||
The code presented here solves division by 1 through 17, except for
|
||||
11 and 13. There are algorithms for both signed and unsigned
|
||||
quantities given.
|
||||
|
||||
TIMINGS (cycles)
|
||||
|
||||
divisor positive negative unsigned
|
||||
|
||||
. 1 2 2 2
|
||||
. 2 4 4 2
|
||||
. 3 19 21 19
|
||||
. 4 4 4 2
|
||||
. 5 18 22 19
|
||||
. 6 19 22 19
|
||||
. 8 4 4 2
|
||||
. 10 18 19 17
|
||||
. 12 18 20 18
|
||||
. 15 16 18 16
|
||||
. 16 4 4 2
|
||||
. 17 16 18 16
|
||||
|
||||
Now, the algorithm for 7, 9, and 14 is an iterative one. That is,
|
||||
a loop body is executed until the tentative quotient is 0. The
|
||||
number of times the loop body is executed varies depending on the
|
||||
dividend, but is never more than two times. If the dividend is
|
||||
less than the divisor, then the loop body is not executed at all.
|
||||
Each iteration adds 4 cycles to the timings.
|
||||
|
||||
divisor positive negative unsigned
|
||||
|
||||
. 7 19+4n 20+4n 20+4n n = number of iterations
|
||||
. 9 21+4n 22+4n 21+4n
|
||||
. 14 21+4n 22+4n 20+4n
|
||||
|
||||
To give an idea of how the number of iterations varies, here is a
|
||||
table of dividend versus number of iterations when dividing by 7.
|
||||
|
||||
smallest largest required
|
||||
dividend dividend iterations
|
||||
|
||||
. 0 6 0
|
||||
. 7 0x6ffffff 1
|
||||
0x1000006 0xffffffff 2
|
||||
|
||||
There is some overlap in the range of numbers requiring 1 and 2
|
||||
iterations. */
|
||||
|
||||
RDEFINE(t2,r1)
|
||||
RDEFINE(x2,arg0) /* r26 */
|
||||
RDEFINE(t1,arg1) /* r25 */
|
||||
RDEFINE(x1,ret1) /* r29 */
|
||||
|
||||
SUBSPA_MILLI_DIV
|
||||
ATTR_MILLI
|
||||
|
||||
.proc
|
||||
.callinfo millicode
|
||||
.entry
|
||||
/* NONE of these routines require a stack frame
|
||||
ALL of these routines are unwindable from millicode */
|
||||
|
||||
GSYM($$divide_by_constant)
|
||||
.export $$divide_by_constant,millicode
|
||||
/* Provides a "nice" label for the code covered by the unwind descriptor
|
||||
for things like gprof. */
|
||||
|
||||
/* DIVISION BY 2 (shift by 1) */
|
||||
GSYM($$divI_2)
|
||||
.export $$divI_2,millicode
|
||||
comclr,>= arg0,0,0
|
||||
addi 1,arg0,arg0
|
||||
MILLIRET
|
||||
extrs arg0,30,31,ret1
|
||||
|
||||
|
||||
/* DIVISION BY 4 (shift by 2) */
|
||||
GSYM($$divI_4)
|
||||
.export $$divI_4,millicode
|
||||
comclr,>= arg0,0,0
|
||||
addi 3,arg0,arg0
|
||||
MILLIRET
|
||||
extrs arg0,29,30,ret1
|
||||
|
||||
|
||||
/* DIVISION BY 8 (shift by 3) */
|
||||
GSYM($$divI_8)
|
||||
.export $$divI_8,millicode
|
||||
comclr,>= arg0,0,0
|
||||
addi 7,arg0,arg0
|
||||
MILLIRET
|
||||
extrs arg0,28,29,ret1
|
||||
|
||||
/* DIVISION BY 16 (shift by 4) */
|
||||
GSYM($$divI_16)
|
||||
.export $$divI_16,millicode
|
||||
comclr,>= arg0,0,0
|
||||
addi 15,arg0,arg0
|
||||
MILLIRET
|
||||
extrs arg0,27,28,ret1
|
||||
|
||||
/****************************************************************************
|
||||
*
|
||||
* DIVISION BY DIVISORS OF FFFFFFFF, and powers of 2 times these
|
||||
*
|
||||
* includes 3,5,15,17 and also 6,10,12
|
||||
*
|
||||
****************************************************************************/
|
||||
|
||||
/* DIVISION BY 3 (use z = 2**32; a = 55555555) */
|
||||
|
||||
GSYM($$divI_3)
|
||||
.export $$divI_3,millicode
|
||||
comb,<,N x2,0,LREF(neg3)
|
||||
|
||||
addi 1,x2,x2 /* this cannot overflow */
|
||||
extru x2,1,2,x1 /* multiply by 5 to get started */
|
||||
sh2add x2,x2,x2
|
||||
b LREF(pos)
|
||||
addc x1,0,x1
|
||||
|
||||
LSYM(neg3)
|
||||
subi 1,x2,x2 /* this cannot overflow */
|
||||
extru x2,1,2,x1 /* multiply by 5 to get started */
|
||||
sh2add x2,x2,x2
|
||||
b LREF(neg)
|
||||
addc x1,0,x1
|
||||
|
||||
GSYM($$divU_3)
|
||||
.export $$divU_3,millicode
|
||||
addi 1,x2,x2 /* this CAN overflow */
|
||||
addc 0,0,x1
|
||||
shd x1,x2,30,t1 /* multiply by 5 to get started */
|
||||
sh2add x2,x2,x2
|
||||
b LREF(pos)
|
||||
addc x1,t1,x1
|
||||
|
||||
/* DIVISION BY 5 (use z = 2**32; a = 33333333) */
|
||||
|
||||
GSYM($$divI_5)
|
||||
.export $$divI_5,millicode
|
||||
comb,<,N x2,0,LREF(neg5)
|
||||
|
||||
addi 3,x2,t1 /* this cannot overflow */
|
||||
sh1add x2,t1,x2 /* multiply by 3 to get started */
|
||||
b LREF(pos)
|
||||
addc 0,0,x1
|
||||
|
||||
LSYM(neg5)
|
||||
sub 0,x2,x2 /* negate x2 */
|
||||
addi 1,x2,x2 /* this cannot overflow */
|
||||
shd 0,x2,31,x1 /* get top bit (can be 1) */
|
||||
sh1add x2,x2,x2 /* multiply by 3 to get started */
|
||||
b LREF(neg)
|
||||
addc x1,0,x1
|
||||
|
||||
GSYM($$divU_5)
|
||||
.export $$divU_5,millicode
|
||||
addi 1,x2,x2 /* this CAN overflow */
|
||||
addc 0,0,x1
|
||||
shd x1,x2,31,t1 /* multiply by 3 to get started */
|
||||
sh1add x2,x2,x2
|
||||
b LREF(pos)
|
||||
addc t1,x1,x1
|
||||
|
||||
/* DIVISION BY 6 (shift to divide by 2 then divide by 3) */
|
||||
GSYM($$divI_6)
|
||||
.export $$divI_6,millicode
|
||||
comb,<,N x2,0,LREF(neg6)
|
||||
extru x2,30,31,x2 /* divide by 2 */
|
||||
addi 5,x2,t1 /* compute 5*(x2+1) = 5*x2+5 */
|
||||
sh2add x2,t1,x2 /* multiply by 5 to get started */
|
||||
b LREF(pos)
|
||||
addc 0,0,x1
|
||||
|
||||
LSYM(neg6)
|
||||
subi 2,x2,x2 /* negate, divide by 2, and add 1 */
|
||||
/* negation and adding 1 are done */
|
||||
/* at the same time by the SUBI */
|
||||
extru x2,30,31,x2
|
||||
shd 0,x2,30,x1
|
||||
sh2add x2,x2,x2 /* multiply by 5 to get started */
|
||||
b LREF(neg)
|
||||
addc x1,0,x1
|
||||
|
||||
GSYM($$divU_6)
|
||||
.export $$divU_6,millicode
|
||||
extru x2,30,31,x2 /* divide by 2 */
|
||||
addi 1,x2,x2 /* cannot carry */
|
||||
shd 0,x2,30,x1 /* multiply by 5 to get started */
|
||||
sh2add x2,x2,x2
|
||||
b LREF(pos)
|
||||
addc x1,0,x1
|
||||
|
||||
/* DIVISION BY 10 (shift to divide by 2 then divide by 5) */
|
||||
GSYM($$divU_10)
|
||||
.export $$divU_10,millicode
|
||||
extru x2,30,31,x2 /* divide by 2 */
|
||||
addi 3,x2,t1 /* compute 3*(x2+1) = (3*x2)+3 */
|
||||
sh1add x2,t1,x2 /* multiply by 3 to get started */
|
||||
addc 0,0,x1
|
||||
LSYM(pos)
|
||||
shd x1,x2,28,t1 /* multiply by 0x11 */
|
||||
shd x2,0,28,t2
|
||||
add x2,t2,x2
|
||||
addc x1,t1,x1
|
||||
LSYM(pos_for_17)
|
||||
shd x1,x2,24,t1 /* multiply by 0x101 */
|
||||
shd x2,0,24,t2
|
||||
add x2,t2,x2
|
||||
addc x1,t1,x1
|
||||
|
||||
shd x1,x2,16,t1 /* multiply by 0x10001 */
|
||||
shd x2,0,16,t2
|
||||
add x2,t2,x2
|
||||
MILLIRET
|
||||
addc x1,t1,x1
|
||||
|
||||
GSYM($$divI_10)
|
||||
.export $$divI_10,millicode
|
||||
comb,< x2,0,LREF(neg10)
|
||||
copy 0,x1
|
||||
extru x2,30,31,x2 /* divide by 2 */
|
||||
addib,TR 1,x2,LREF(pos) /* add 1 (cannot overflow) */
|
||||
sh1add x2,x2,x2 /* multiply by 3 to get started */
|
||||
|
||||
LSYM(neg10)
|
||||
subi 2,x2,x2 /* negate, divide by 2, and add 1 */
|
||||
/* negation and adding 1 are done */
|
||||
/* at the same time by the SUBI */
|
||||
extru x2,30,31,x2
|
||||
sh1add x2,x2,x2 /* multiply by 3 to get started */
|
||||
LSYM(neg)
|
||||
shd x1,x2,28,t1 /* multiply by 0x11 */
|
||||
shd x2,0,28,t2
|
||||
add x2,t2,x2
|
||||
addc x1,t1,x1
|
||||
LSYM(neg_for_17)
|
||||
shd x1,x2,24,t1 /* multiply by 0x101 */
|
||||
shd x2,0,24,t2
|
||||
add x2,t2,x2
|
||||
addc x1,t1,x1
|
||||
|
||||
shd x1,x2,16,t1 /* multiply by 0x10001 */
|
||||
shd x2,0,16,t2
|
||||
add x2,t2,x2
|
||||
addc x1,t1,x1
|
||||
MILLIRET
|
||||
sub 0,x1,x1
|
||||
|
||||
/* DIVISION BY 12 (shift to divide by 4 then divide by 3) */
|
||||
GSYM($$divI_12)
|
||||
.export $$divI_12,millicode
|
||||
comb,< x2,0,LREF(neg12)
|
||||
copy 0,x1
|
||||
extru x2,29,30,x2 /* divide by 4 */
|
||||
addib,tr 1,x2,LREF(pos) /* compute 5*(x2+1) = 5*x2+5 */
|
||||
sh2add x2,x2,x2 /* multiply by 5 to get started */
|
||||
|
||||
LSYM(neg12)
|
||||
subi 4,x2,x2 /* negate, divide by 4, and add 1 */
|
||||
/* negation and adding 1 are done */
|
||||
/* at the same time by the SUBI */
|
||||
extru x2,29,30,x2
|
||||
b LREF(neg)
|
||||
sh2add x2,x2,x2 /* multiply by 5 to get started */
|
||||
|
||||
GSYM($$divU_12)
|
||||
.export $$divU_12,millicode
|
||||
extru x2,29,30,x2 /* divide by 4 */
|
||||
addi 5,x2,t1 /* cannot carry */
|
||||
sh2add x2,t1,x2 /* multiply by 5 to get started */
|
||||
b LREF(pos)
|
||||
addc 0,0,x1
|
||||
|
||||
/* DIVISION BY 15 (use z = 2**32; a = 11111111) */
|
||||
GSYM($$divI_15)
|
||||
.export $$divI_15,millicode
|
||||
comb,< x2,0,LREF(neg15)
|
||||
copy 0,x1
|
||||
addib,tr 1,x2,LREF(pos)+4
|
||||
shd x1,x2,28,t1
|
||||
|
||||
LSYM(neg15)
|
||||
b LREF(neg)
|
||||
subi 1,x2,x2
|
||||
|
||||
GSYM($$divU_15)
|
||||
.export $$divU_15,millicode
|
||||
addi 1,x2,x2 /* this CAN overflow */
|
||||
b LREF(pos)
|
||||
addc 0,0,x1
|
||||
|
||||
/* DIVISION BY 17 (use z = 2**32; a = f0f0f0f) */
|
||||
GSYM($$divI_17)
|
||||
.export $$divI_17,millicode
|
||||
comb,<,n x2,0,LREF(neg17)
|
||||
addi 1,x2,x2 /* this cannot overflow */
|
||||
shd 0,x2,28,t1 /* multiply by 0xf to get started */
|
||||
shd x2,0,28,t2
|
||||
sub t2,x2,x2
|
||||
b LREF(pos_for_17)
|
||||
subb t1,0,x1
|
||||
|
||||
LSYM(neg17)
|
||||
subi 1,x2,x2 /* this cannot overflow */
|
||||
shd 0,x2,28,t1 /* multiply by 0xf to get started */
|
||||
shd x2,0,28,t2
|
||||
sub t2,x2,x2
|
||||
b LREF(neg_for_17)
|
||||
subb t1,0,x1
|
||||
|
||||
GSYM($$divU_17)
|
||||
.export $$divU_17,millicode
|
||||
addi 1,x2,x2 /* this CAN overflow */
|
||||
addc 0,0,x1
|
||||
shd x1,x2,28,t1 /* multiply by 0xf to get started */
|
||||
LSYM(u17)
|
||||
shd x2,0,28,t2
|
||||
sub t2,x2,x2
|
||||
b LREF(pos_for_17)
|
||||
subb t1,x1,x1
|
||||
|
||||
|
||||
/* DIVISION BY DIVISORS OF FFFFFF, and powers of 2 times these
|
||||
includes 7,9 and also 14
|
||||
|
||||
|
||||
z = 2**24-1
|
||||
r = z mod x = 0
|
||||
|
||||
so choose b = 0
|
||||
|
||||
Also, in order to divide by z = 2**24-1, we approximate by dividing
|
||||
by (z+1) = 2**24 (which is easy), and then correcting.
|
||||
|
||||
(ax) = (z+1)q' + r
|
||||
. = zq' + (q'+r)
|
||||
|
||||
So to compute (ax)/z, compute q' = (ax)/(z+1) and r = (ax) mod (z+1)
|
||||
Then the true remainder of (ax)/z is (q'+r). Repeat the process
|
||||
with this new remainder, adding the tentative quotients together,
|
||||
until a tentative quotient is 0 (and then we are done). There is
|
||||
one last correction to be done. It is possible that (q'+r) = z.
|
||||
If so, then (q'+r)/(z+1) = 0 and it looks like we are done. But,
|
||||
in fact, we need to add 1 more to the quotient. Now, it turns
|
||||
out that this happens if and only if the original value x is
|
||||
an exact multiple of y. So, to avoid a three instruction test at
|
||||
the end, instead use 1 instruction to add 1 to x at the beginning. */
|
||||
|
||||
/* DIVISION BY 7 (use z = 2**24-1; a = 249249) */
|
||||
GSYM($$divI_7)
|
||||
.export $$divI_7,millicode
|
||||
comb,<,n x2,0,LREF(neg7)
|
||||
LSYM(7)
|
||||
addi 1,x2,x2 /* cannot overflow */
|
||||
shd 0,x2,29,x1
|
||||
sh3add x2,x2,x2
|
||||
addc x1,0,x1
|
||||
LSYM(pos7)
|
||||
shd x1,x2,26,t1
|
||||
shd x2,0,26,t2
|
||||
add x2,t2,x2
|
||||
addc x1,t1,x1
|
||||
|
||||
shd x1,x2,20,t1
|
||||
shd x2,0,20,t2
|
||||
add x2,t2,x2
|
||||
addc x1,t1,t1
|
||||
|
||||
/* computed <t1,x2>. Now divide it by (2**24 - 1) */
|
||||
|
||||
copy 0,x1
|
||||
shd,= t1,x2,24,t1 /* tentative quotient */
|
||||
LSYM(1)
|
||||
addb,tr t1,x1,LREF(2) /* add to previous quotient */
|
||||
extru x2,31,24,x2 /* new remainder (unadjusted) */
|
||||
|
||||
MILLIRETN
|
||||
|
||||
LSYM(2)
|
||||
addb,tr t1,x2,LREF(1) /* adjust remainder */
|
||||
extru,= x2,7,8,t1 /* new quotient */
|
||||
|
||||
LSYM(neg7)
|
||||
subi 1,x2,x2 /* negate x2 and add 1 */
|
||||
LSYM(8)
|
||||
shd 0,x2,29,x1
|
||||
sh3add x2,x2,x2
|
||||
addc x1,0,x1
|
||||
|
||||
LSYM(neg7_shift)
|
||||
shd x1,x2,26,t1
|
||||
shd x2,0,26,t2
|
||||
add x2,t2,x2
|
||||
addc x1,t1,x1
|
||||
|
||||
shd x1,x2,20,t1
|
||||
shd x2,0,20,t2
|
||||
add x2,t2,x2
|
||||
addc x1,t1,t1
|
||||
|
||||
/* computed <t1,x2>. Now divide it by (2**24 - 1) */
|
||||
|
||||
copy 0,x1
|
||||
shd,= t1,x2,24,t1 /* tentative quotient */
|
||||
LSYM(3)
|
||||
addb,tr t1,x1,LREF(4) /* add to previous quotient */
|
||||
extru x2,31,24,x2 /* new remainder (unadjusted) */
|
||||
|
||||
MILLIRET
|
||||
sub 0,x1,x1 /* negate result */
|
||||
|
||||
LSYM(4)
|
||||
addb,tr t1,x2,LREF(3) /* adjust remainder */
|
||||
extru,= x2,7,8,t1 /* new quotient */
|
||||
|
||||
GSYM($$divU_7)
|
||||
.export $$divU_7,millicode
|
||||
addi 1,x2,x2 /* can carry */
|
||||
addc 0,0,x1
|
||||
shd x1,x2,29,t1
|
||||
sh3add x2,x2,x2
|
||||
b LREF(pos7)
|
||||
addc t1,x1,x1
|
||||
|
||||
/* DIVISION BY 9 (use z = 2**24-1; a = 1c71c7) */
|
||||
GSYM($$divI_9)
|
||||
.export $$divI_9,millicode
|
||||
comb,<,n x2,0,LREF(neg9)
|
||||
addi 1,x2,x2 /* cannot overflow */
|
||||
shd 0,x2,29,t1
|
||||
shd x2,0,29,t2
|
||||
sub t2,x2,x2
|
||||
b LREF(pos7)
|
||||
subb t1,0,x1
|
||||
|
||||
LSYM(neg9)
|
||||
subi 1,x2,x2 /* negate and add 1 */
|
||||
shd 0,x2,29,t1
|
||||
shd x2,0,29,t2
|
||||
sub t2,x2,x2
|
||||
b LREF(neg7_shift)
|
||||
subb t1,0,x1
|
||||
|
||||
GSYM($$divU_9)
|
||||
.export $$divU_9,millicode
|
||||
addi 1,x2,x2 /* can carry */
|
||||
addc 0,0,x1
|
||||
shd x1,x2,29,t1
|
||||
shd x2,0,29,t2
|
||||
sub t2,x2,x2
|
||||
b LREF(pos7)
|
||||
subb t1,x1,x1
|
||||
|
||||
/* DIVISION BY 14 (shift to divide by 2 then divide by 7) */
|
||||
GSYM($$divI_14)
|
||||
.export $$divI_14,millicode
|
||||
comb,<,n x2,0,LREF(neg14)
|
||||
GSYM($$divU_14)
|
||||
.export $$divU_14,millicode
|
||||
b LREF(7) /* go to 7 case */
|
||||
extru x2,30,31,x2 /* divide by 2 */
|
||||
|
||||
LSYM(neg14)
|
||||
subi 2,x2,x2 /* negate (and add 2) */
|
||||
b LREF(8)
|
||||
extru x2,30,31,x2 /* divide by 2 */
|
||||
.exit
|
||||
.procend
|
||||
.end
|
||||
#endif
|
|
@ -0,0 +1,32 @@
|
|||
/* 32 and 64-bit millicode, original author Hewlett-Packard
|
||||
adapted for gcc by Paul Bame <bame@debian.org>
|
||||
and Alan Modra <alan@linuxcare.com.au>.
|
||||
|
||||
Copyright 2001, 2002, 2003 Free Software Foundation, Inc.
|
||||
|
||||
This file is part of GCC and is released under the terms of
|
||||
of the GNU General Public License as published by the Free Software
|
||||
Foundation; either version 2, or (at your option) any later version.
|
||||
See the file COPYING in the top-level GCC source directory for a copy
|
||||
of the license. */
|
||||
|
||||
#include "milli.h"
|
||||
|
||||
#ifdef L_dyncall
|
||||
SUBSPA_MILLI
|
||||
ATTR_DATA
|
||||
GSYM($$dyncall)
|
||||
.export $$dyncall,millicode
|
||||
.proc
|
||||
.callinfo millicode
|
||||
.entry
|
||||
bb,>=,n %r22,30,LREF(1) ; branch if not plabel address
|
||||
depi 0,31,2,%r22 ; clear the two least significant bits
|
||||
ldw 4(%r22),%r19 ; load new LTP value
|
||||
ldw 0(%r22),%r22 ; load address of target
|
||||
LSYM(1)
|
||||
bv %r0(%r22) ; branch to the real target
|
||||
stw %r2,-24(%r30) ; save return address into frame marker
|
||||
.exit
|
||||
.procend
|
||||
#endif
|
File diff suppressed because it is too large
Load Diff
|
@ -0,0 +1,165 @@
|
|||
/* 32 and 64-bit millicode, original author Hewlett-Packard
|
||||
adapted for gcc by Paul Bame <bame@debian.org>
|
||||
and Alan Modra <alan@linuxcare.com.au>.
|
||||
|
||||
Copyright 2001, 2002, 2003 Free Software Foundation, Inc.
|
||||
|
||||
This file is part of GCC and is released under the terms of
|
||||
of the GNU General Public License as published by the Free Software
|
||||
Foundation; either version 2, or (at your option) any later version.
|
||||
See the file COPYING in the top-level GCC source directory for a copy
|
||||
of the license. */
|
||||
|
||||
#ifndef _PA_MILLI_H_
|
||||
#define _PA_MILLI_H_
|
||||
|
||||
#define L_dyncall
|
||||
#define L_divI
|
||||
#define L_divU
|
||||
#define L_remI
|
||||
#define L_remU
|
||||
#define L_div_const
|
||||
#define L_mulI
|
||||
|
||||
#ifdef CONFIG_64BIT
|
||||
.level 2.0w
|
||||
#endif
|
||||
|
||||
/* Hardware General Registers. */
|
||||
r0: .reg %r0
|
||||
r1: .reg %r1
|
||||
r2: .reg %r2
|
||||
r3: .reg %r3
|
||||
r4: .reg %r4
|
||||
r5: .reg %r5
|
||||
r6: .reg %r6
|
||||
r7: .reg %r7
|
||||
r8: .reg %r8
|
||||
r9: .reg %r9
|
||||
r10: .reg %r10
|
||||
r11: .reg %r11
|
||||
r12: .reg %r12
|
||||
r13: .reg %r13
|
||||
r14: .reg %r14
|
||||
r15: .reg %r15
|
||||
r16: .reg %r16
|
||||
r17: .reg %r17
|
||||
r18: .reg %r18
|
||||
r19: .reg %r19
|
||||
r20: .reg %r20
|
||||
r21: .reg %r21
|
||||
r22: .reg %r22
|
||||
r23: .reg %r23
|
||||
r24: .reg %r24
|
||||
r25: .reg %r25
|
||||
r26: .reg %r26
|
||||
r27: .reg %r27
|
||||
r28: .reg %r28
|
||||
r29: .reg %r29
|
||||
r30: .reg %r30
|
||||
r31: .reg %r31
|
||||
|
||||
/* Hardware Space Registers. */
|
||||
sr0: .reg %sr0
|
||||
sr1: .reg %sr1
|
||||
sr2: .reg %sr2
|
||||
sr3: .reg %sr3
|
||||
sr4: .reg %sr4
|
||||
sr5: .reg %sr5
|
||||
sr6: .reg %sr6
|
||||
sr7: .reg %sr7
|
||||
|
||||
/* Hardware Floating Point Registers. */
|
||||
fr0: .reg %fr0
|
||||
fr1: .reg %fr1
|
||||
fr2: .reg %fr2
|
||||
fr3: .reg %fr3
|
||||
fr4: .reg %fr4
|
||||
fr5: .reg %fr5
|
||||
fr6: .reg %fr6
|
||||
fr7: .reg %fr7
|
||||
fr8: .reg %fr8
|
||||
fr9: .reg %fr9
|
||||
fr10: .reg %fr10
|
||||
fr11: .reg %fr11
|
||||
fr12: .reg %fr12
|
||||
fr13: .reg %fr13
|
||||
fr14: .reg %fr14
|
||||
fr15: .reg %fr15
|
||||
|
||||
/* Hardware Control Registers. */
|
||||
cr11: .reg %cr11
|
||||
sar: .reg %cr11 /* Shift Amount Register */
|
||||
|
||||
/* Software Architecture General Registers. */
|
||||
rp: .reg r2 /* return pointer */
|
||||
#ifdef CONFIG_64BIT
|
||||
mrp: .reg r2 /* millicode return pointer */
|
||||
#else
|
||||
mrp: .reg r31 /* millicode return pointer */
|
||||
#endif
|
||||
ret0: .reg r28 /* return value */
|
||||
ret1: .reg r29 /* return value (high part of double) */
|
||||
sp: .reg r30 /* stack pointer */
|
||||
dp: .reg r27 /* data pointer */
|
||||
arg0: .reg r26 /* argument */
|
||||
arg1: .reg r25 /* argument or high part of double argument */
|
||||
arg2: .reg r24 /* argument */
|
||||
arg3: .reg r23 /* argument or high part of double argument */
|
||||
|
||||
/* Software Architecture Space Registers. */
|
||||
/* sr0 ; return link from BLE */
|
||||
sret: .reg sr1 /* return value */
|
||||
sarg: .reg sr1 /* argument */
|
||||
/* sr4 ; PC SPACE tracker */
|
||||
/* sr5 ; process private data */
|
||||
|
||||
/* Frame Offsets (millicode convention!) Used when calling other
|
||||
millicode routines. Stack unwinding is dependent upon these
|
||||
definitions. */
|
||||
r31_slot: .equ -20 /* "current RP" slot */
|
||||
sr0_slot: .equ -16 /* "static link" slot */
|
||||
#if defined(CONFIG_64BIT)
|
||||
mrp_slot: .equ -16 /* "current RP" slot */
|
||||
psp_slot: .equ -8 /* "previous SP" slot */
|
||||
#else
|
||||
mrp_slot: .equ -20 /* "current RP" slot (replacing "r31_slot") */
|
||||
#endif
|
||||
|
||||
|
||||
#define DEFINE(name,value)name: .EQU value
|
||||
#define RDEFINE(name,value)name: .REG value
|
||||
#ifdef milliext
|
||||
#define MILLI_BE(lbl) BE lbl(sr7,r0)
|
||||
#define MILLI_BEN(lbl) BE,n lbl(sr7,r0)
|
||||
#define MILLI_BLE(lbl) BLE lbl(sr7,r0)
|
||||
#define MILLI_BLEN(lbl) BLE,n lbl(sr7,r0)
|
||||
#define MILLIRETN BE,n 0(sr0,mrp)
|
||||
#define MILLIRET BE 0(sr0,mrp)
|
||||
#define MILLI_RETN BE,n 0(sr0,mrp)
|
||||
#define MILLI_RET BE 0(sr0,mrp)
|
||||
#else
|
||||
#define MILLI_BE(lbl) B lbl
|
||||
#define MILLI_BEN(lbl) B,n lbl
|
||||
#define MILLI_BLE(lbl) BL lbl,mrp
|
||||
#define MILLI_BLEN(lbl) BL,n lbl,mrp
|
||||
#define MILLIRETN BV,n 0(mrp)
|
||||
#define MILLIRET BV 0(mrp)
|
||||
#define MILLI_RETN BV,n 0(mrp)
|
||||
#define MILLI_RET BV 0(mrp)
|
||||
#endif
|
||||
|
||||
#define CAT(a,b) a##b
|
||||
|
||||
#define SUBSPA_MILLI .section .text
|
||||
#define SUBSPA_MILLI_DIV .section .text.div,"ax",@progbits! .align 16
|
||||
#define SUBSPA_MILLI_MUL .section .text.mul,"ax",@progbits! .align 16
|
||||
#define ATTR_MILLI
|
||||
#define SUBSPA_DATA .section .data
|
||||
#define ATTR_DATA
|
||||
#define GLOBAL $global$
|
||||
#define GSYM(sym) !sym:
|
||||
#define LSYM(sym) !CAT(.L,sym:)
|
||||
#define LREF(sym) CAT(.L,sym)
|
||||
|
||||
#endif /*_PA_MILLI_H_*/
|
|
@ -0,0 +1,474 @@
|
|||
/* 32 and 64-bit millicode, original author Hewlett-Packard
|
||||
adapted for gcc by Paul Bame <bame@debian.org>
|
||||
and Alan Modra <alan@linuxcare.com.au>.
|
||||
|
||||
Copyright 2001, 2002, 2003 Free Software Foundation, Inc.
|
||||
|
||||
This file is part of GCC and is released under the terms of
|
||||
of the GNU General Public License as published by the Free Software
|
||||
Foundation; either version 2, or (at your option) any later version.
|
||||
See the file COPYING in the top-level GCC source directory for a copy
|
||||
of the license. */
|
||||
|
||||
#include "milli.h"
|
||||
|
||||
#ifdef L_mulI
|
||||
/* VERSION "@(#)$$mulI $ Revision: 12.4 $ $ Date: 94/03/17 17:18:51 $" */
|
||||
/******************************************************************************
|
||||
This routine is used on PA2.0 processors when gcc -mno-fpregs is used
|
||||
|
||||
ROUTINE: $$mulI
|
||||
|
||||
|
||||
DESCRIPTION:
|
||||
|
||||
$$mulI multiplies two single word integers, giving a single
|
||||
word result.
|
||||
|
||||
|
||||
INPUT REGISTERS:
|
||||
|
||||
arg0 = Operand 1
|
||||
arg1 = Operand 2
|
||||
r31 == return pc
|
||||
sr0 == return space when called externally
|
||||
|
||||
|
||||
OUTPUT REGISTERS:
|
||||
|
||||
arg0 = undefined
|
||||
arg1 = undefined
|
||||
ret1 = result
|
||||
|
||||
OTHER REGISTERS AFFECTED:
|
||||
|
||||
r1 = undefined
|
||||
|
||||
SIDE EFFECTS:
|
||||
|
||||
Causes a trap under the following conditions: NONE
|
||||
Changes memory at the following places: NONE
|
||||
|
||||
PERMISSIBLE CONTEXT:
|
||||
|
||||
Unwindable
|
||||
Does not create a stack frame
|
||||
Is usable for internal or external microcode
|
||||
|
||||
DISCUSSION:
|
||||
|
||||
Calls other millicode routines via mrp: NONE
|
||||
Calls other millicode routines: NONE
|
||||
|
||||
***************************************************************************/
|
||||
|
||||
|
||||
#define a0 %arg0
|
||||
#define a1 %arg1
|
||||
#define t0 %r1
|
||||
#define r %ret1
|
||||
|
||||
#define a0__128a0 zdep a0,24,25,a0
|
||||
#define a0__256a0 zdep a0,23,24,a0
|
||||
#define a1_ne_0_b_l0 comb,<> a1,0,LREF(l0)
|
||||
#define a1_ne_0_b_l1 comb,<> a1,0,LREF(l1)
|
||||
#define a1_ne_0_b_l2 comb,<> a1,0,LREF(l2)
|
||||
#define b_n_ret_t0 b,n LREF(ret_t0)
|
||||
#define b_e_shift b LREF(e_shift)
|
||||
#define b_e_t0ma0 b LREF(e_t0ma0)
|
||||
#define b_e_t0 b LREF(e_t0)
|
||||
#define b_e_t0a0 b LREF(e_t0a0)
|
||||
#define b_e_t02a0 b LREF(e_t02a0)
|
||||
#define b_e_t04a0 b LREF(e_t04a0)
|
||||
#define b_e_2t0 b LREF(e_2t0)
|
||||
#define b_e_2t0a0 b LREF(e_2t0a0)
|
||||
#define b_e_2t04a0 b LREF(e2t04a0)
|
||||
#define b_e_3t0 b LREF(e_3t0)
|
||||
#define b_e_4t0 b LREF(e_4t0)
|
||||
#define b_e_4t0a0 b LREF(e_4t0a0)
|
||||
#define b_e_4t08a0 b LREF(e4t08a0)
|
||||
#define b_e_5t0 b LREF(e_5t0)
|
||||
#define b_e_8t0 b LREF(e_8t0)
|
||||
#define b_e_8t0a0 b LREF(e_8t0a0)
|
||||
#define r__r_a0 add r,a0,r
|
||||
#define r__r_2a0 sh1add a0,r,r
|
||||
#define r__r_4a0 sh2add a0,r,r
|
||||
#define r__r_8a0 sh3add a0,r,r
|
||||
#define r__r_t0 add r,t0,r
|
||||
#define r__r_2t0 sh1add t0,r,r
|
||||
#define r__r_4t0 sh2add t0,r,r
|
||||
#define r__r_8t0 sh3add t0,r,r
|
||||
#define t0__3a0 sh1add a0,a0,t0
|
||||
#define t0__4a0 sh2add a0,0,t0
|
||||
#define t0__5a0 sh2add a0,a0,t0
|
||||
#define t0__8a0 sh3add a0,0,t0
|
||||
#define t0__9a0 sh3add a0,a0,t0
|
||||
#define t0__16a0 zdep a0,27,28,t0
|
||||
#define t0__32a0 zdep a0,26,27,t0
|
||||
#define t0__64a0 zdep a0,25,26,t0
|
||||
#define t0__128a0 zdep a0,24,25,t0
|
||||
#define t0__t0ma0 sub t0,a0,t0
|
||||
#define t0__t0_a0 add t0,a0,t0
|
||||
#define t0__t0_2a0 sh1add a0,t0,t0
|
||||
#define t0__t0_4a0 sh2add a0,t0,t0
|
||||
#define t0__t0_8a0 sh3add a0,t0,t0
|
||||
#define t0__2t0_a0 sh1add t0,a0,t0
|
||||
#define t0__3t0 sh1add t0,t0,t0
|
||||
#define t0__4t0 sh2add t0,0,t0
|
||||
#define t0__4t0_a0 sh2add t0,a0,t0
|
||||
#define t0__5t0 sh2add t0,t0,t0
|
||||
#define t0__8t0 sh3add t0,0,t0
|
||||
#define t0__8t0_a0 sh3add t0,a0,t0
|
||||
#define t0__9t0 sh3add t0,t0,t0
|
||||
#define t0__16t0 zdep t0,27,28,t0
|
||||
#define t0__32t0 zdep t0,26,27,t0
|
||||
#define t0__256a0 zdep a0,23,24,t0
|
||||
|
||||
|
||||
SUBSPA_MILLI
|
||||
ATTR_MILLI
|
||||
.align 16
|
||||
.proc
|
||||
.callinfo millicode
|
||||
.export $$mulI,millicode
|
||||
GSYM($$mulI)
|
||||
combt,<<= a1,a0,LREF(l4) /* swap args if unsigned a1>a0 */
|
||||
copy 0,r /* zero out the result */
|
||||
xor a0,a1,a0 /* swap a0 & a1 using the */
|
||||
xor a0,a1,a1 /* old xor trick */
|
||||
xor a0,a1,a0
|
||||
LSYM(l4)
|
||||
combt,<= 0,a0,LREF(l3) /* if a0>=0 then proceed like unsigned */
|
||||
zdep a1,30,8,t0 /* t0 = (a1&0xff)<<1 ********* */
|
||||
sub,> 0,a1,t0 /* otherwise negate both and */
|
||||
combt,<=,n a0,t0,LREF(l2) /* swap back if |a0|<|a1| */
|
||||
sub 0,a0,a1
|
||||
movb,tr,n t0,a0,LREF(l2) /* 10th inst. */
|
||||
|
||||
LSYM(l0) r__r_t0 /* add in this partial product */
|
||||
LSYM(l1) a0__256a0 /* a0 <<= 8 ****************** */
|
||||
LSYM(l2) zdep a1,30,8,t0 /* t0 = (a1&0xff)<<1 ********* */
|
||||
LSYM(l3) blr t0,0 /* case on these 8 bits ****** */
|
||||
extru a1,23,24,a1 /* a1 >>= 8 ****************** */
|
||||
|
||||
/*16 insts before this. */
|
||||
/* a0 <<= 8 ************************** */
|
||||
LSYM(x0) a1_ne_0_b_l2 ! a0__256a0 ! MILLIRETN ! nop
|
||||
LSYM(x1) a1_ne_0_b_l1 ! r__r_a0 ! MILLIRETN ! nop
|
||||
LSYM(x2) a1_ne_0_b_l1 ! r__r_2a0 ! MILLIRETN ! nop
|
||||
LSYM(x3) a1_ne_0_b_l0 ! t0__3a0 ! MILLIRET ! r__r_t0
|
||||
LSYM(x4) a1_ne_0_b_l1 ! r__r_4a0 ! MILLIRETN ! nop
|
||||
LSYM(x5) a1_ne_0_b_l0 ! t0__5a0 ! MILLIRET ! r__r_t0
|
||||
LSYM(x6) t0__3a0 ! a1_ne_0_b_l1 ! r__r_2t0 ! MILLIRETN
|
||||
LSYM(x7) t0__3a0 ! a1_ne_0_b_l0 ! r__r_4a0 ! b_n_ret_t0
|
||||
LSYM(x8) a1_ne_0_b_l1 ! r__r_8a0 ! MILLIRETN ! nop
|
||||
LSYM(x9) a1_ne_0_b_l0 ! t0__9a0 ! MILLIRET ! r__r_t0
|
||||
LSYM(x10) t0__5a0 ! a1_ne_0_b_l1 ! r__r_2t0 ! MILLIRETN
|
||||
LSYM(x11) t0__3a0 ! a1_ne_0_b_l0 ! r__r_8a0 ! b_n_ret_t0
|
||||
LSYM(x12) t0__3a0 ! a1_ne_0_b_l1 ! r__r_4t0 ! MILLIRETN
|
||||
LSYM(x13) t0__5a0 ! a1_ne_0_b_l0 ! r__r_8a0 ! b_n_ret_t0
|
||||
LSYM(x14) t0__3a0 ! t0__2t0_a0 ! b_e_shift ! r__r_2t0
|
||||
LSYM(x15) t0__5a0 ! a1_ne_0_b_l0 ! t0__3t0 ! b_n_ret_t0
|
||||
LSYM(x16) t0__16a0 ! a1_ne_0_b_l1 ! r__r_t0 ! MILLIRETN
|
||||
LSYM(x17) t0__9a0 ! a1_ne_0_b_l0 ! t0__t0_8a0 ! b_n_ret_t0
|
||||
LSYM(x18) t0__9a0 ! a1_ne_0_b_l1 ! r__r_2t0 ! MILLIRETN
|
||||
LSYM(x19) t0__9a0 ! a1_ne_0_b_l0 ! t0__2t0_a0 ! b_n_ret_t0
|
||||
LSYM(x20) t0__5a0 ! a1_ne_0_b_l1 ! r__r_4t0 ! MILLIRETN
|
||||
LSYM(x21) t0__5a0 ! a1_ne_0_b_l0 ! t0__4t0_a0 ! b_n_ret_t0
|
||||
LSYM(x22) t0__5a0 ! t0__2t0_a0 ! b_e_shift ! r__r_2t0
|
||||
LSYM(x23) t0__5a0 ! t0__2t0_a0 ! b_e_t0 ! t0__2t0_a0
|
||||
LSYM(x24) t0__3a0 ! a1_ne_0_b_l1 ! r__r_8t0 ! MILLIRETN
|
||||
LSYM(x25) t0__5a0 ! a1_ne_0_b_l0 ! t0__5t0 ! b_n_ret_t0
|
||||
LSYM(x26) t0__3a0 ! t0__4t0_a0 ! b_e_shift ! r__r_2t0
|
||||
LSYM(x27) t0__3a0 ! a1_ne_0_b_l0 ! t0__9t0 ! b_n_ret_t0
|
||||
LSYM(x28) t0__3a0 ! t0__2t0_a0 ! b_e_shift ! r__r_4t0
|
||||
LSYM(x29) t0__3a0 ! t0__2t0_a0 ! b_e_t0 ! t0__4t0_a0
|
||||
LSYM(x30) t0__5a0 ! t0__3t0 ! b_e_shift ! r__r_2t0
|
||||
LSYM(x31) t0__32a0 ! a1_ne_0_b_l0 ! t0__t0ma0 ! b_n_ret_t0
|
||||
LSYM(x32) t0__32a0 ! a1_ne_0_b_l1 ! r__r_t0 ! MILLIRETN
|
||||
LSYM(x33) t0__8a0 ! a1_ne_0_b_l0 ! t0__4t0_a0 ! b_n_ret_t0
|
||||
LSYM(x34) t0__16a0 ! t0__t0_a0 ! b_e_shift ! r__r_2t0
|
||||
LSYM(x35) t0__9a0 ! t0__3t0 ! b_e_t0 ! t0__t0_8a0
|
||||
LSYM(x36) t0__9a0 ! a1_ne_0_b_l1 ! r__r_4t0 ! MILLIRETN
|
||||
LSYM(x37) t0__9a0 ! a1_ne_0_b_l0 ! t0__4t0_a0 ! b_n_ret_t0
|
||||
LSYM(x38) t0__9a0 ! t0__2t0_a0 ! b_e_shift ! r__r_2t0
|
||||
LSYM(x39) t0__9a0 ! t0__2t0_a0 ! b_e_t0 ! t0__2t0_a0
|
||||
LSYM(x40) t0__5a0 ! a1_ne_0_b_l1 ! r__r_8t0 ! MILLIRETN
|
||||
LSYM(x41) t0__5a0 ! a1_ne_0_b_l0 ! t0__8t0_a0 ! b_n_ret_t0
|
||||
LSYM(x42) t0__5a0 ! t0__4t0_a0 ! b_e_shift ! r__r_2t0
|
||||
LSYM(x43) t0__5a0 ! t0__4t0_a0 ! b_e_t0 ! t0__2t0_a0
|
||||
LSYM(x44) t0__5a0 ! t0__2t0_a0 ! b_e_shift ! r__r_4t0
|
||||
LSYM(x45) t0__9a0 ! a1_ne_0_b_l0 ! t0__5t0 ! b_n_ret_t0
|
||||
LSYM(x46) t0__9a0 ! t0__5t0 ! b_e_t0 ! t0__t0_a0
|
||||
LSYM(x47) t0__9a0 ! t0__5t0 ! b_e_t0 ! t0__t0_2a0
|
||||
LSYM(x48) t0__3a0 ! a1_ne_0_b_l0 ! t0__16t0 ! b_n_ret_t0
|
||||
LSYM(x49) t0__9a0 ! t0__5t0 ! b_e_t0 ! t0__t0_4a0
|
||||
LSYM(x50) t0__5a0 ! t0__5t0 ! b_e_shift ! r__r_2t0
|
||||
LSYM(x51) t0__9a0 ! t0__t0_8a0 ! b_e_t0 ! t0__3t0
|
||||
LSYM(x52) t0__3a0 ! t0__4t0_a0 ! b_e_shift ! r__r_4t0
|
||||
LSYM(x53) t0__3a0 ! t0__4t0_a0 ! b_e_t0 ! t0__4t0_a0
|
||||
LSYM(x54) t0__9a0 ! t0__3t0 ! b_e_shift ! r__r_2t0
|
||||
LSYM(x55) t0__9a0 ! t0__3t0 ! b_e_t0 ! t0__2t0_a0
|
||||
LSYM(x56) t0__3a0 ! t0__2t0_a0 ! b_e_shift ! r__r_8t0
|
||||
LSYM(x57) t0__9a0 ! t0__2t0_a0 ! b_e_t0 ! t0__3t0
|
||||
LSYM(x58) t0__3a0 ! t0__2t0_a0 ! b_e_2t0 ! t0__4t0_a0
|
||||
LSYM(x59) t0__9a0 ! t0__2t0_a0 ! b_e_t02a0 ! t0__3t0
|
||||
LSYM(x60) t0__5a0 ! t0__3t0 ! b_e_shift ! r__r_4t0
|
||||
LSYM(x61) t0__5a0 ! t0__3t0 ! b_e_t0 ! t0__4t0_a0
|
||||
LSYM(x62) t0__32a0 ! t0__t0ma0 ! b_e_shift ! r__r_2t0
|
||||
LSYM(x63) t0__64a0 ! a1_ne_0_b_l0 ! t0__t0ma0 ! b_n_ret_t0
|
||||
LSYM(x64) t0__64a0 ! a1_ne_0_b_l1 ! r__r_t0 ! MILLIRETN
|
||||
LSYM(x65) t0__8a0 ! a1_ne_0_b_l0 ! t0__8t0_a0 ! b_n_ret_t0
|
||||
LSYM(x66) t0__32a0 ! t0__t0_a0 ! b_e_shift ! r__r_2t0
|
||||
LSYM(x67) t0__8a0 ! t0__4t0_a0 ! b_e_t0 ! t0__2t0_a0
|
||||
LSYM(x68) t0__8a0 ! t0__2t0_a0 ! b_e_shift ! r__r_4t0
|
||||
LSYM(x69) t0__8a0 ! t0__2t0_a0 ! b_e_t0 ! t0__4t0_a0
|
||||
LSYM(x70) t0__64a0 ! t0__t0_4a0 ! b_e_t0 ! t0__t0_2a0
|
||||
LSYM(x71) t0__9a0 ! t0__8t0 ! b_e_t0 ! t0__t0ma0
|
||||
LSYM(x72) t0__9a0 ! a1_ne_0_b_l1 ! r__r_8t0 ! MILLIRETN
|
||||
LSYM(x73) t0__9a0 ! t0__8t0_a0 ! b_e_shift ! r__r_t0
|
||||
LSYM(x74) t0__9a0 ! t0__4t0_a0 ! b_e_shift ! r__r_2t0
|
||||
LSYM(x75) t0__9a0 ! t0__4t0_a0 ! b_e_t0 ! t0__2t0_a0
|
||||
LSYM(x76) t0__9a0 ! t0__2t0_a0 ! b_e_shift ! r__r_4t0
|
||||
LSYM(x77) t0__9a0 ! t0__2t0_a0 ! b_e_t0 ! t0__4t0_a0
|
||||
LSYM(x78) t0__9a0 ! t0__2t0_a0 ! b_e_2t0 ! t0__2t0_a0
|
||||
LSYM(x79) t0__16a0 ! t0__5t0 ! b_e_t0 ! t0__t0ma0
|
||||
LSYM(x80) t0__16a0 ! t0__5t0 ! b_e_shift ! r__r_t0
|
||||
LSYM(x81) t0__9a0 ! t0__9t0 ! b_e_shift ! r__r_t0
|
||||
LSYM(x82) t0__5a0 ! t0__8t0_a0 ! b_e_shift ! r__r_2t0
|
||||
LSYM(x83) t0__5a0 ! t0__8t0_a0 ! b_e_t0 ! t0__2t0_a0
|
||||
LSYM(x84) t0__5a0 ! t0__4t0_a0 ! b_e_shift ! r__r_4t0
|
||||
LSYM(x85) t0__8a0 ! t0__2t0_a0 ! b_e_t0 ! t0__5t0
|
||||
LSYM(x86) t0__5a0 ! t0__4t0_a0 ! b_e_2t0 ! t0__2t0_a0
|
||||
LSYM(x87) t0__9a0 ! t0__9t0 ! b_e_t02a0 ! t0__t0_4a0
|
||||
LSYM(x88) t0__5a0 ! t0__2t0_a0 ! b_e_shift ! r__r_8t0
|
||||
LSYM(x89) t0__5a0 ! t0__2t0_a0 ! b_e_t0 ! t0__8t0_a0
|
||||
LSYM(x90) t0__9a0 ! t0__5t0 ! b_e_shift ! r__r_2t0
|
||||
LSYM(x91) t0__9a0 ! t0__5t0 ! b_e_t0 ! t0__2t0_a0
|
||||
LSYM(x92) t0__5a0 ! t0__2t0_a0 ! b_e_4t0 ! t0__2t0_a0
|
||||
LSYM(x93) t0__32a0 ! t0__t0ma0 ! b_e_t0 ! t0__3t0
|
||||
LSYM(x94) t0__9a0 ! t0__5t0 ! b_e_2t0 ! t0__t0_2a0
|
||||
LSYM(x95) t0__9a0 ! t0__2t0_a0 ! b_e_t0 ! t0__5t0
|
||||
LSYM(x96) t0__8a0 ! t0__3t0 ! b_e_shift ! r__r_4t0
|
||||
LSYM(x97) t0__8a0 ! t0__3t0 ! b_e_t0 ! t0__4t0_a0
|
||||
LSYM(x98) t0__32a0 ! t0__3t0 ! b_e_t0 ! t0__t0_2a0
|
||||
LSYM(x99) t0__8a0 ! t0__4t0_a0 ! b_e_t0 ! t0__3t0
|
||||
LSYM(x100) t0__5a0 ! t0__5t0 ! b_e_shift ! r__r_4t0
|
||||
LSYM(x101) t0__5a0 ! t0__5t0 ! b_e_t0 ! t0__4t0_a0
|
||||
LSYM(x102) t0__32a0 ! t0__t0_2a0 ! b_e_t0 ! t0__3t0
|
||||
LSYM(x103) t0__5a0 ! t0__5t0 ! b_e_t02a0 ! t0__4t0_a0
|
||||
LSYM(x104) t0__3a0 ! t0__4t0_a0 ! b_e_shift ! r__r_8t0
|
||||
LSYM(x105) t0__5a0 ! t0__4t0_a0 ! b_e_t0 ! t0__5t0
|
||||
LSYM(x106) t0__3a0 ! t0__4t0_a0 ! b_e_2t0 ! t0__4t0_a0
|
||||
LSYM(x107) t0__9a0 ! t0__t0_4a0 ! b_e_t02a0 ! t0__8t0_a0
|
||||
LSYM(x108) t0__9a0 ! t0__3t0 ! b_e_shift ! r__r_4t0
|
||||
LSYM(x109) t0__9a0 ! t0__3t0 ! b_e_t0 ! t0__4t0_a0
|
||||
LSYM(x110) t0__9a0 ! t0__3t0 ! b_e_2t0 ! t0__2t0_a0
|
||||
LSYM(x111) t0__9a0 ! t0__4t0_a0 ! b_e_t0 ! t0__3t0
|
||||
LSYM(x112) t0__3a0 ! t0__2t0_a0 ! b_e_t0 ! t0__16t0
|
||||
LSYM(x113) t0__9a0 ! t0__4t0_a0 ! b_e_t02a0 ! t0__3t0
|
||||
LSYM(x114) t0__9a0 ! t0__2t0_a0 ! b_e_2t0 ! t0__3t0
|
||||
LSYM(x115) t0__9a0 ! t0__2t0_a0 ! b_e_2t0a0 ! t0__3t0
|
||||
LSYM(x116) t0__3a0 ! t0__2t0_a0 ! b_e_4t0 ! t0__4t0_a0
|
||||
LSYM(x117) t0__3a0 ! t0__4t0_a0 ! b_e_t0 ! t0__9t0
|
||||
LSYM(x118) t0__3a0 ! t0__4t0_a0 ! b_e_t0a0 ! t0__9t0
|
||||
LSYM(x119) t0__3a0 ! t0__4t0_a0 ! b_e_t02a0 ! t0__9t0
|
||||
LSYM(x120) t0__5a0 ! t0__3t0 ! b_e_shift ! r__r_8t0
|
||||
LSYM(x121) t0__5a0 ! t0__3t0 ! b_e_t0 ! t0__8t0_a0
|
||||
LSYM(x122) t0__5a0 ! t0__3t0 ! b_e_2t0 ! t0__4t0_a0
|
||||
LSYM(x123) t0__5a0 ! t0__8t0_a0 ! b_e_t0 ! t0__3t0
|
||||
LSYM(x124) t0__32a0 ! t0__t0ma0 ! b_e_shift ! r__r_4t0
|
||||
LSYM(x125) t0__5a0 ! t0__5t0 ! b_e_t0 ! t0__5t0
|
||||
LSYM(x126) t0__64a0 ! t0__t0ma0 ! b_e_shift ! r__r_2t0
|
||||
LSYM(x127) t0__128a0 ! a1_ne_0_b_l0 ! t0__t0ma0 ! b_n_ret_t0
|
||||
LSYM(x128) t0__128a0 ! a1_ne_0_b_l1 ! r__r_t0 ! MILLIRETN
|
||||
LSYM(x129) t0__128a0 ! a1_ne_0_b_l0 ! t0__t0_a0 ! b_n_ret_t0
|
||||
LSYM(x130) t0__64a0 ! t0__t0_a0 ! b_e_shift ! r__r_2t0
|
||||
LSYM(x131) t0__8a0 ! t0__8t0_a0 ! b_e_t0 ! t0__2t0_a0
|
||||
LSYM(x132) t0__8a0 ! t0__4t0_a0 ! b_e_shift ! r__r_4t0
|
||||
LSYM(x133) t0__8a0 ! t0__4t0_a0 ! b_e_t0 ! t0__4t0_a0
|
||||
LSYM(x134) t0__8a0 ! t0__4t0_a0 ! b_e_2t0 ! t0__2t0_a0
|
||||
LSYM(x135) t0__9a0 ! t0__5t0 ! b_e_t0 ! t0__3t0
|
||||
LSYM(x136) t0__8a0 ! t0__2t0_a0 ! b_e_shift ! r__r_8t0
|
||||
LSYM(x137) t0__8a0 ! t0__2t0_a0 ! b_e_t0 ! t0__8t0_a0
|
||||
LSYM(x138) t0__8a0 ! t0__2t0_a0 ! b_e_2t0 ! t0__4t0_a0
|
||||
LSYM(x139) t0__8a0 ! t0__2t0_a0 ! b_e_2t0a0 ! t0__4t0_a0
|
||||
LSYM(x140) t0__3a0 ! t0__2t0_a0 ! b_e_4t0 ! t0__5t0
|
||||
LSYM(x141) t0__8a0 ! t0__2t0_a0 ! b_e_4t0a0 ! t0__2t0_a0
|
||||
LSYM(x142) t0__9a0 ! t0__8t0 ! b_e_2t0 ! t0__t0ma0
|
||||
LSYM(x143) t0__16a0 ! t0__9t0 ! b_e_t0 ! t0__t0ma0
|
||||
LSYM(x144) t0__9a0 ! t0__8t0 ! b_e_shift ! r__r_2t0
|
||||
LSYM(x145) t0__9a0 ! t0__8t0 ! b_e_t0 ! t0__2t0_a0
|
||||
LSYM(x146) t0__9a0 ! t0__8t0_a0 ! b_e_shift ! r__r_2t0
|
||||
LSYM(x147) t0__9a0 ! t0__8t0_a0 ! b_e_t0 ! t0__2t0_a0
|
||||
LSYM(x148) t0__9a0 ! t0__4t0_a0 ! b_e_shift ! r__r_4t0
|
||||
LSYM(x149) t0__9a0 ! t0__4t0_a0 ! b_e_t0 ! t0__4t0_a0
|
||||
LSYM(x150) t0__9a0 ! t0__4t0_a0 ! b_e_2t0 ! t0__2t0_a0
|
||||
LSYM(x151) t0__9a0 ! t0__4t0_a0 ! b_e_2t0a0 ! t0__2t0_a0
|
||||
LSYM(x152) t0__9a0 ! t0__2t0_a0 ! b_e_shift ! r__r_8t0
|
||||
LSYM(x153) t0__9a0 ! t0__2t0_a0 ! b_e_t0 ! t0__8t0_a0
|
||||
LSYM(x154) t0__9a0 ! t0__2t0_a0 ! b_e_2t0 ! t0__4t0_a0
|
||||
LSYM(x155) t0__32a0 ! t0__t0ma0 ! b_e_t0 ! t0__5t0
|
||||
LSYM(x156) t0__9a0 ! t0__2t0_a0 ! b_e_4t0 ! t0__2t0_a0
|
||||
LSYM(x157) t0__32a0 ! t0__t0ma0 ! b_e_t02a0 ! t0__5t0
|
||||
LSYM(x158) t0__16a0 ! t0__5t0 ! b_e_2t0 ! t0__t0ma0
|
||||
LSYM(x159) t0__32a0 ! t0__5t0 ! b_e_t0 ! t0__t0ma0
|
||||
LSYM(x160) t0__5a0 ! t0__4t0 ! b_e_shift ! r__r_8t0
|
||||
LSYM(x161) t0__8a0 ! t0__5t0 ! b_e_t0 ! t0__4t0_a0
|
||||
LSYM(x162) t0__9a0 ! t0__9t0 ! b_e_shift ! r__r_2t0
|
||||
LSYM(x163) t0__9a0 ! t0__9t0 ! b_e_t0 ! t0__2t0_a0
|
||||
LSYM(x164) t0__5a0 ! t0__8t0_a0 ! b_e_shift ! r__r_4t0
|
||||
LSYM(x165) t0__8a0 ! t0__4t0_a0 ! b_e_t0 ! t0__5t0
|
||||
LSYM(x166) t0__5a0 ! t0__8t0_a0 ! b_e_2t0 ! t0__2t0_a0
|
||||
LSYM(x167) t0__5a0 ! t0__8t0_a0 ! b_e_2t0a0 ! t0__2t0_a0
|
||||
LSYM(x168) t0__5a0 ! t0__4t0_a0 ! b_e_shift ! r__r_8t0
|
||||
LSYM(x169) t0__5a0 ! t0__4t0_a0 ! b_e_t0 ! t0__8t0_a0
|
||||
LSYM(x170) t0__32a0 ! t0__t0_2a0 ! b_e_t0 ! t0__5t0
|
||||
LSYM(x171) t0__9a0 ! t0__2t0_a0 ! b_e_t0 ! t0__9t0
|
||||
LSYM(x172) t0__5a0 ! t0__4t0_a0 ! b_e_4t0 ! t0__2t0_a0
|
||||
LSYM(x173) t0__9a0 ! t0__2t0_a0 ! b_e_t02a0 ! t0__9t0
|
||||
LSYM(x174) t0__32a0 ! t0__t0_2a0 ! b_e_t04a0 ! t0__5t0
|
||||
LSYM(x175) t0__8a0 ! t0__2t0_a0 ! b_e_5t0 ! t0__2t0_a0
|
||||
LSYM(x176) t0__5a0 ! t0__4t0_a0 ! b_e_8t0 ! t0__t0_a0
|
||||
LSYM(x177) t0__5a0 ! t0__4t0_a0 ! b_e_8t0a0 ! t0__t0_a0
|
||||
LSYM(x178) t0__5a0 ! t0__2t0_a0 ! b_e_2t0 ! t0__8t0_a0
|
||||
LSYM(x179) t0__5a0 ! t0__2t0_a0 ! b_e_2t0a0 ! t0__8t0_a0
|
||||
LSYM(x180) t0__9a0 ! t0__5t0 ! b_e_shift ! r__r_4t0
|
||||
LSYM(x181) t0__9a0 ! t0__5t0 ! b_e_t0 ! t0__4t0_a0
|
||||
LSYM(x182) t0__9a0 ! t0__5t0 ! b_e_2t0 ! t0__2t0_a0
|
||||
LSYM(x183) t0__9a0 ! t0__5t0 ! b_e_2t0a0 ! t0__2t0_a0
|
||||
LSYM(x184) t0__5a0 ! t0__9t0 ! b_e_4t0 ! t0__t0_a0
|
||||
LSYM(x185) t0__9a0 ! t0__4t0_a0 ! b_e_t0 ! t0__5t0
|
||||
LSYM(x186) t0__32a0 ! t0__t0ma0 ! b_e_2t0 ! t0__3t0
|
||||
LSYM(x187) t0__9a0 ! t0__4t0_a0 ! b_e_t02a0 ! t0__5t0
|
||||
LSYM(x188) t0__9a0 ! t0__5t0 ! b_e_4t0 ! t0__t0_2a0
|
||||
LSYM(x189) t0__5a0 ! t0__4t0_a0 ! b_e_t0 ! t0__9t0
|
||||
LSYM(x190) t0__9a0 ! t0__2t0_a0 ! b_e_2t0 ! t0__5t0
|
||||
LSYM(x191) t0__64a0 ! t0__3t0 ! b_e_t0 ! t0__t0ma0
|
||||
LSYM(x192) t0__8a0 ! t0__3t0 ! b_e_shift ! r__r_8t0
|
||||
LSYM(x193) t0__8a0 ! t0__3t0 ! b_e_t0 ! t0__8t0_a0
|
||||
LSYM(x194) t0__8a0 ! t0__3t0 ! b_e_2t0 ! t0__4t0_a0
|
||||
LSYM(x195) t0__8a0 ! t0__8t0_a0 ! b_e_t0 ! t0__3t0
|
||||
LSYM(x196) t0__8a0 ! t0__3t0 ! b_e_4t0 ! t0__2t0_a0
|
||||
LSYM(x197) t0__8a0 ! t0__3t0 ! b_e_4t0a0 ! t0__2t0_a0
|
||||
LSYM(x198) t0__64a0 ! t0__t0_2a0 ! b_e_t0 ! t0__3t0
|
||||
LSYM(x199) t0__8a0 ! t0__4t0_a0 ! b_e_2t0a0 ! t0__3t0
|
||||
LSYM(x200) t0__5a0 ! t0__5t0 ! b_e_shift ! r__r_8t0
|
||||
LSYM(x201) t0__5a0 ! t0__5t0 ! b_e_t0 ! t0__8t0_a0
|
||||
LSYM(x202) t0__5a0 ! t0__5t0 ! b_e_2t0 ! t0__4t0_a0
|
||||
LSYM(x203) t0__5a0 ! t0__5t0 ! b_e_2t0a0 ! t0__4t0_a0
|
||||
LSYM(x204) t0__8a0 ! t0__2t0_a0 ! b_e_4t0 ! t0__3t0
|
||||
LSYM(x205) t0__5a0 ! t0__8t0_a0 ! b_e_t0 ! t0__5t0
|
||||
LSYM(x206) t0__64a0 ! t0__t0_4a0 ! b_e_t02a0 ! t0__3t0
|
||||
LSYM(x207) t0__8a0 ! t0__2t0_a0 ! b_e_3t0 ! t0__4t0_a0
|
||||
LSYM(x208) t0__5a0 ! t0__5t0 ! b_e_8t0 ! t0__t0_a0
|
||||
LSYM(x209) t0__5a0 ! t0__5t0 ! b_e_8t0a0 ! t0__t0_a0
|
||||
LSYM(x210) t0__5a0 ! t0__4t0_a0 ! b_e_2t0 ! t0__5t0
|
||||
LSYM(x211) t0__5a0 ! t0__4t0_a0 ! b_e_2t0a0 ! t0__5t0
|
||||
LSYM(x212) t0__3a0 ! t0__4t0_a0 ! b_e_4t0 ! t0__4t0_a0
|
||||
LSYM(x213) t0__3a0 ! t0__4t0_a0 ! b_e_4t0a0 ! t0__4t0_a0
|
||||
LSYM(x214) t0__9a0 ! t0__t0_4a0 ! b_e_2t04a0 ! t0__8t0_a0
|
||||
LSYM(x215) t0__5a0 ! t0__4t0_a0 ! b_e_5t0 ! t0__2t0_a0
|
||||
LSYM(x216) t0__9a0 ! t0__3t0 ! b_e_shift ! r__r_8t0
|
||||
LSYM(x217) t0__9a0 ! t0__3t0 ! b_e_t0 ! t0__8t0_a0
|
||||
LSYM(x218) t0__9a0 ! t0__3t0 ! b_e_2t0 ! t0__4t0_a0
|
||||
LSYM(x219) t0__9a0 ! t0__8t0_a0 ! b_e_t0 ! t0__3t0
|
||||
LSYM(x220) t0__3a0 ! t0__9t0 ! b_e_4t0 ! t0__2t0_a0
|
||||
LSYM(x221) t0__3a0 ! t0__9t0 ! b_e_4t0a0 ! t0__2t0_a0
|
||||
LSYM(x222) t0__9a0 ! t0__4t0_a0 ! b_e_2t0 ! t0__3t0
|
||||
LSYM(x223) t0__9a0 ! t0__4t0_a0 ! b_e_2t0a0 ! t0__3t0
|
||||
LSYM(x224) t0__9a0 ! t0__3t0 ! b_e_8t0 ! t0__t0_a0
|
||||
LSYM(x225) t0__9a0 ! t0__5t0 ! b_e_t0 ! t0__5t0
|
||||
LSYM(x226) t0__3a0 ! t0__2t0_a0 ! b_e_t02a0 ! t0__32t0
|
||||
LSYM(x227) t0__9a0 ! t0__5t0 ! b_e_t02a0 ! t0__5t0
|
||||
LSYM(x228) t0__9a0 ! t0__2t0_a0 ! b_e_4t0 ! t0__3t0
|
||||
LSYM(x229) t0__9a0 ! t0__2t0_a0 ! b_e_4t0a0 ! t0__3t0
|
||||
LSYM(x230) t0__9a0 ! t0__5t0 ! b_e_5t0 ! t0__t0_a0
|
||||
LSYM(x231) t0__9a0 ! t0__2t0_a0 ! b_e_3t0 ! t0__4t0_a0
|
||||
LSYM(x232) t0__3a0 ! t0__2t0_a0 ! b_e_8t0 ! t0__4t0_a0
|
||||
LSYM(x233) t0__3a0 ! t0__2t0_a0 ! b_e_8t0a0 ! t0__4t0_a0
|
||||
LSYM(x234) t0__3a0 ! t0__4t0_a0 ! b_e_2t0 ! t0__9t0
|
||||
LSYM(x235) t0__3a0 ! t0__4t0_a0 ! b_e_2t0a0 ! t0__9t0
|
||||
LSYM(x236) t0__9a0 ! t0__2t0_a0 ! b_e_4t08a0 ! t0__3t0
|
||||
LSYM(x237) t0__16a0 ! t0__5t0 ! b_e_3t0 ! t0__t0ma0
|
||||
LSYM(x238) t0__3a0 ! t0__4t0_a0 ! b_e_2t04a0 ! t0__9t0
|
||||
LSYM(x239) t0__16a0 ! t0__5t0 ! b_e_t0ma0 ! t0__3t0
|
||||
LSYM(x240) t0__9a0 ! t0__t0_a0 ! b_e_8t0 ! t0__3t0
|
||||
LSYM(x241) t0__9a0 ! t0__t0_a0 ! b_e_8t0a0 ! t0__3t0
|
||||
LSYM(x242) t0__5a0 ! t0__3t0 ! b_e_2t0 ! t0__8t0_a0
|
||||
LSYM(x243) t0__9a0 ! t0__9t0 ! b_e_t0 ! t0__3t0
|
||||
LSYM(x244) t0__5a0 ! t0__3t0 ! b_e_4t0 ! t0__4t0_a0
|
||||
LSYM(x245) t0__8a0 ! t0__3t0 ! b_e_5t0 ! t0__2t0_a0
|
||||
LSYM(x246) t0__5a0 ! t0__8t0_a0 ! b_e_2t0 ! t0__3t0
|
||||
LSYM(x247) t0__5a0 ! t0__8t0_a0 ! b_e_2t0a0 ! t0__3t0
|
||||
LSYM(x248) t0__32a0 ! t0__t0ma0 ! b_e_shift ! r__r_8t0
|
||||
LSYM(x249) t0__32a0 ! t0__t0ma0 ! b_e_t0 ! t0__8t0_a0
|
||||
LSYM(x250) t0__5a0 ! t0__5t0 ! b_e_2t0 ! t0__5t0
|
||||
LSYM(x251) t0__5a0 ! t0__5t0 ! b_e_2t0a0 ! t0__5t0
|
||||
LSYM(x252) t0__64a0 ! t0__t0ma0 ! b_e_shift ! r__r_4t0
|
||||
LSYM(x253) t0__64a0 ! t0__t0ma0 ! b_e_t0 ! t0__4t0_a0
|
||||
LSYM(x254) t0__128a0 ! t0__t0ma0 ! b_e_shift ! r__r_2t0
|
||||
LSYM(x255) t0__256a0 ! a1_ne_0_b_l0 ! t0__t0ma0 ! b_n_ret_t0
|
||||
/*1040 insts before this. */
|
||||
LSYM(ret_t0) MILLIRET
|
||||
LSYM(e_t0) r__r_t0
|
||||
LSYM(e_shift) a1_ne_0_b_l2
|
||||
a0__256a0 /* a0 <<= 8 *********** */
|
||||
MILLIRETN
|
||||
LSYM(e_t0ma0) a1_ne_0_b_l0
|
||||
t0__t0ma0
|
||||
MILLIRET
|
||||
r__r_t0
|
||||
LSYM(e_t0a0) a1_ne_0_b_l0
|
||||
t0__t0_a0
|
||||
MILLIRET
|
||||
r__r_t0
|
||||
LSYM(e_t02a0) a1_ne_0_b_l0
|
||||
t0__t0_2a0
|
||||
MILLIRET
|
||||
r__r_t0
|
||||
LSYM(e_t04a0) a1_ne_0_b_l0
|
||||
t0__t0_4a0
|
||||
MILLIRET
|
||||
r__r_t0
|
||||
LSYM(e_2t0) a1_ne_0_b_l1
|
||||
r__r_2t0
|
||||
MILLIRETN
|
||||
LSYM(e_2t0a0) a1_ne_0_b_l0
|
||||
t0__2t0_a0
|
||||
MILLIRET
|
||||
r__r_t0
|
||||
LSYM(e2t04a0) t0__t0_2a0
|
||||
a1_ne_0_b_l1
|
||||
r__r_2t0
|
||||
MILLIRETN
|
||||
LSYM(e_3t0) a1_ne_0_b_l0
|
||||
t0__3t0
|
||||
MILLIRET
|
||||
r__r_t0
|
||||
LSYM(e_4t0) a1_ne_0_b_l1
|
||||
r__r_4t0
|
||||
MILLIRETN
|
||||
LSYM(e_4t0a0) a1_ne_0_b_l0
|
||||
t0__4t0_a0
|
||||
MILLIRET
|
||||
r__r_t0
|
||||
LSYM(e4t08a0) t0__t0_2a0
|
||||
a1_ne_0_b_l1
|
||||
r__r_4t0
|
||||
MILLIRETN
|
||||
LSYM(e_5t0) a1_ne_0_b_l0
|
||||
t0__5t0
|
||||
MILLIRET
|
||||
r__r_t0
|
||||
LSYM(e_8t0) a1_ne_0_b_l1
|
||||
r__r_8t0
|
||||
MILLIRETN
|
||||
LSYM(e_8t0a0) a1_ne_0_b_l0
|
||||
t0__8t0_a0
|
||||
MILLIRET
|
||||
r__r_t0
|
||||
|
||||
.procend
|
||||
.end
|
||||
#endif
|
|
@ -0,0 +1,185 @@
|
|||
/* 32 and 64-bit millicode, original author Hewlett-Packard
|
||||
adapted for gcc by Paul Bame <bame@debian.org>
|
||||
and Alan Modra <alan@linuxcare.com.au>.
|
||||
|
||||
Copyright 2001, 2002, 2003 Free Software Foundation, Inc.
|
||||
|
||||
This file is part of GCC and is released under the terms of
|
||||
of the GNU General Public License as published by the Free Software
|
||||
Foundation; either version 2, or (at your option) any later version.
|
||||
See the file COPYING in the top-level GCC source directory for a copy
|
||||
of the license. */
|
||||
|
||||
#include "milli.h"
|
||||
|
||||
#ifdef L_remI
|
||||
/* ROUTINE: $$remI
|
||||
|
||||
DESCRIPTION:
|
||||
. $$remI returns the remainder of the division of two signed 32-bit
|
||||
. integers. The sign of the remainder is the same as the sign of
|
||||
. the dividend.
|
||||
|
||||
|
||||
INPUT REGISTERS:
|
||||
. arg0 == dividend
|
||||
. arg1 == divisor
|
||||
. mrp == return pc
|
||||
. sr0 == return space when called externally
|
||||
|
||||
OUTPUT REGISTERS:
|
||||
. arg0 = destroyed
|
||||
. arg1 = destroyed
|
||||
. ret1 = remainder
|
||||
|
||||
OTHER REGISTERS AFFECTED:
|
||||
. r1 = undefined
|
||||
|
||||
SIDE EFFECTS:
|
||||
. Causes a trap under the following conditions: DIVIDE BY ZERO
|
||||
. Changes memory at the following places: NONE
|
||||
|
||||
PERMISSIBLE CONTEXT:
|
||||
. Unwindable
|
||||
. Does not create a stack frame
|
||||
. Is usable for internal or external microcode
|
||||
|
||||
DISCUSSION:
|
||||
. Calls other millicode routines via mrp: NONE
|
||||
. Calls other millicode routines: NONE */
|
||||
|
||||
RDEFINE(tmp,r1)
|
||||
RDEFINE(retreg,ret1)
|
||||
|
||||
SUBSPA_MILLI
|
||||
ATTR_MILLI
|
||||
.proc
|
||||
.callinfo millicode
|
||||
.entry
|
||||
GSYM($$remI)
|
||||
GSYM($$remoI)
|
||||
.export $$remI,MILLICODE
|
||||
.export $$remoI,MILLICODE
|
||||
ldo -1(arg1),tmp /* is there at most one bit set ? */
|
||||
and,<> arg1,tmp,r0 /* if not, don't use power of 2 */
|
||||
addi,> 0,arg1,r0 /* if denominator > 0, use power */
|
||||
/* of 2 */
|
||||
b,n LREF(neg_denom)
|
||||
LSYM(pow2)
|
||||
comb,>,n 0,arg0,LREF(neg_num) /* is numerator < 0 ? */
|
||||
and arg0,tmp,retreg /* get the result */
|
||||
MILLIRETN
|
||||
LSYM(neg_num)
|
||||
subi 0,arg0,arg0 /* negate numerator */
|
||||
and arg0,tmp,retreg /* get the result */
|
||||
subi 0,retreg,retreg /* negate result */
|
||||
MILLIRETN
|
||||
LSYM(neg_denom)
|
||||
addi,< 0,arg1,r0 /* if arg1 >= 0, it's not power */
|
||||
/* of 2 */
|
||||
b,n LREF(regular_seq)
|
||||
sub r0,arg1,tmp /* make denominator positive */
|
||||
comb,=,n arg1,tmp,LREF(regular_seq) /* test against 0x80000000 and 0 */
|
||||
ldo -1(tmp),retreg /* is there at most one bit set ? */
|
||||
and,= tmp,retreg,r0 /* if not, go to regular_seq */
|
||||
b,n LREF(regular_seq)
|
||||
comb,>,n 0,arg0,LREF(neg_num_2) /* if arg0 < 0, negate it */
|
||||
and arg0,retreg,retreg
|
||||
MILLIRETN
|
||||
LSYM(neg_num_2)
|
||||
subi 0,arg0,tmp /* test against 0x80000000 */
|
||||
and tmp,retreg,retreg
|
||||
subi 0,retreg,retreg
|
||||
MILLIRETN
|
||||
LSYM(regular_seq)
|
||||
addit,= 0,arg1,0 /* trap if div by zero */
|
||||
add,>= 0,arg0,retreg /* move dividend, if retreg < 0, */
|
||||
sub 0,retreg,retreg /* make it positive */
|
||||
sub 0,arg1, tmp /* clear carry, */
|
||||
/* negate the divisor */
|
||||
ds 0, tmp,0 /* set V-bit to the comple- */
|
||||
/* ment of the divisor sign */
|
||||
or 0,0, tmp /* clear tmp */
|
||||
add retreg,retreg,retreg /* shift msb bit into carry */
|
||||
ds tmp,arg1, tmp /* 1st divide step, if no carry */
|
||||
/* out, msb of quotient = 0 */
|
||||
addc retreg,retreg,retreg /* shift retreg with/into carry */
|
||||
LSYM(t1)
|
||||
ds tmp,arg1, tmp /* 2nd divide step */
|
||||
addc retreg,retreg,retreg /* shift retreg with/into carry */
|
||||
ds tmp,arg1, tmp /* 3rd divide step */
|
||||
addc retreg,retreg,retreg /* shift retreg with/into carry */
|
||||
ds tmp,arg1, tmp /* 4th divide step */
|
||||
addc retreg,retreg,retreg /* shift retreg with/into carry */
|
||||
ds tmp,arg1, tmp /* 5th divide step */
|
||||
addc retreg,retreg,retreg /* shift retreg with/into carry */
|
||||
ds tmp,arg1, tmp /* 6th divide step */
|
||||
addc retreg,retreg,retreg /* shift retreg with/into carry */
|
||||
ds tmp,arg1, tmp /* 7th divide step */
|
||||
addc retreg,retreg,retreg /* shift retreg with/into carry */
|
||||
ds tmp,arg1, tmp /* 8th divide step */
|
||||
addc retreg,retreg,retreg /* shift retreg with/into carry */
|
||||
ds tmp,arg1, tmp /* 9th divide step */
|
||||
addc retreg,retreg,retreg /* shift retreg with/into carry */
|
||||
ds tmp,arg1, tmp /* 10th divide step */
|
||||
addc retreg,retreg,retreg /* shift retreg with/into carry */
|
||||
ds tmp,arg1, tmp /* 11th divide step */
|
||||
addc retreg,retreg,retreg /* shift retreg with/into carry */
|
||||
ds tmp,arg1, tmp /* 12th divide step */
|
||||
addc retreg,retreg,retreg /* shift retreg with/into carry */
|
||||
ds tmp,arg1, tmp /* 13th divide step */
|
||||
addc retreg,retreg,retreg /* shift retreg with/into carry */
|
||||
ds tmp,arg1, tmp /* 14th divide step */
|
||||
addc retreg,retreg,retreg /* shift retreg with/into carry */
|
||||
ds tmp,arg1, tmp /* 15th divide step */
|
||||
addc retreg,retreg,retreg /* shift retreg with/into carry */
|
||||
ds tmp,arg1, tmp /* 16th divide step */
|
||||
addc retreg,retreg,retreg /* shift retreg with/into carry */
|
||||
ds tmp,arg1, tmp /* 17th divide step */
|
||||
addc retreg,retreg,retreg /* shift retreg with/into carry */
|
||||
ds tmp,arg1, tmp /* 18th divide step */
|
||||
addc retreg,retreg,retreg /* shift retreg with/into carry */
|
||||
ds tmp,arg1, tmp /* 19th divide step */
|
||||
addc retreg,retreg,retreg /* shift retreg with/into carry */
|
||||
ds tmp,arg1, tmp /* 20th divide step */
|
||||
addc retreg,retreg,retreg /* shift retreg with/into carry */
|
||||
ds tmp,arg1, tmp /* 21st divide step */
|
||||
addc retreg,retreg,retreg /* shift retreg with/into carry */
|
||||
ds tmp,arg1, tmp /* 22nd divide step */
|
||||
addc retreg,retreg,retreg /* shift retreg with/into carry */
|
||||
ds tmp,arg1, tmp /* 23rd divide step */
|
||||
addc retreg,retreg,retreg /* shift retreg with/into carry */
|
||||
ds tmp,arg1, tmp /* 24th divide step */
|
||||
addc retreg,retreg,retreg /* shift retreg with/into carry */
|
||||
ds tmp,arg1, tmp /* 25th divide step */
|
||||
addc retreg,retreg,retreg /* shift retreg with/into carry */
|
||||
ds tmp,arg1, tmp /* 26th divide step */
|
||||
addc retreg,retreg,retreg /* shift retreg with/into carry */
|
||||
ds tmp,arg1, tmp /* 27th divide step */
|
||||
addc retreg,retreg,retreg /* shift retreg with/into carry */
|
||||
ds tmp,arg1, tmp /* 28th divide step */
|
||||
addc retreg,retreg,retreg /* shift retreg with/into carry */
|
||||
ds tmp,arg1, tmp /* 29th divide step */
|
||||
addc retreg,retreg,retreg /* shift retreg with/into carry */
|
||||
ds tmp,arg1, tmp /* 30th divide step */
|
||||
addc retreg,retreg,retreg /* shift retreg with/into carry */
|
||||
ds tmp,arg1, tmp /* 31st divide step */
|
||||
addc retreg,retreg,retreg /* shift retreg with/into carry */
|
||||
ds tmp,arg1, tmp /* 32nd divide step, */
|
||||
addc retreg,retreg,retreg /* shift last bit into retreg */
|
||||
movb,>=,n tmp,retreg,LREF(finish) /* branch if pos. tmp */
|
||||
add,< arg1,0,0 /* if arg1 > 0, add arg1 */
|
||||
add,tr tmp,arg1,retreg /* for correcting remainder tmp */
|
||||
sub tmp,arg1,retreg /* else add absolute value arg1 */
|
||||
LSYM(finish)
|
||||
add,>= arg0,0,0 /* set sign of remainder */
|
||||
sub 0,retreg,retreg /* to sign of dividend */
|
||||
MILLIRET
|
||||
nop
|
||||
.exit
|
||||
.procend
|
||||
#ifdef milliext
|
||||
.origin 0x00000200
|
||||
#endif
|
||||
.end
|
||||
#endif
|
|
@ -0,0 +1,148 @@
|
|||
/* 32 and 64-bit millicode, original author Hewlett-Packard
|
||||
adapted for gcc by Paul Bame <bame@debian.org>
|
||||
and Alan Modra <alan@linuxcare.com.au>.
|
||||
|
||||
Copyright 2001, 2002, 2003 Free Software Foundation, Inc.
|
||||
|
||||
This file is part of GCC and is released under the terms of
|
||||
of the GNU General Public License as published by the Free Software
|
||||
Foundation; either version 2, or (at your option) any later version.
|
||||
See the file COPYING in the top-level GCC source directory for a copy
|
||||
of the license. */
|
||||
|
||||
#include "milli.h"
|
||||
|
||||
#ifdef L_remU
|
||||
/* ROUTINE: $$remU
|
||||
. Single precision divide for remainder with unsigned binary integers.
|
||||
.
|
||||
. The remainder must be dividend-(dividend/divisor)*divisor.
|
||||
. Divide by zero is trapped.
|
||||
|
||||
INPUT REGISTERS:
|
||||
. arg0 == dividend
|
||||
. arg1 == divisor
|
||||
. mrp == return pc
|
||||
. sr0 == return space when called externally
|
||||
|
||||
OUTPUT REGISTERS:
|
||||
. arg0 = undefined
|
||||
. arg1 = undefined
|
||||
. ret1 = remainder
|
||||
|
||||
OTHER REGISTERS AFFECTED:
|
||||
. r1 = undefined
|
||||
|
||||
SIDE EFFECTS:
|
||||
. Causes a trap under the following conditions: DIVIDE BY ZERO
|
||||
. Changes memory at the following places: NONE
|
||||
|
||||
PERMISSIBLE CONTEXT:
|
||||
. Unwindable.
|
||||
. Does not create a stack frame.
|
||||
. Suitable for internal or external millicode.
|
||||
. Assumes the special millicode register conventions.
|
||||
|
||||
DISCUSSION:
|
||||
. Calls other millicode routines using mrp: NONE
|
||||
. Calls other millicode routines: NONE */
|
||||
|
||||
|
||||
RDEFINE(temp,r1)
|
||||
RDEFINE(rmndr,ret1) /* r29 */
|
||||
SUBSPA_MILLI
|
||||
ATTR_MILLI
|
||||
.export $$remU,millicode
|
||||
.proc
|
||||
.callinfo millicode
|
||||
.entry
|
||||
GSYM($$remU)
|
||||
ldo -1(arg1),temp /* is there at most one bit set ? */
|
||||
and,= arg1,temp,r0 /* if not, don't use power of 2 */
|
||||
b LREF(regular_seq)
|
||||
addit,= 0,arg1,r0 /* trap on div by zero */
|
||||
and arg0,temp,rmndr /* get the result for power of 2 */
|
||||
MILLIRETN
|
||||
LSYM(regular_seq)
|
||||
comib,>=,n 0,arg1,LREF(special_case)
|
||||
subi 0,arg1,rmndr /* clear carry, negate the divisor */
|
||||
ds r0,rmndr,r0 /* set V-bit to 1 */
|
||||
add arg0,arg0,temp /* shift msb bit into carry */
|
||||
ds r0,arg1,rmndr /* 1st divide step, if no carry */
|
||||
addc temp,temp,temp /* shift temp with/into carry */
|
||||
ds rmndr,arg1,rmndr /* 2nd divide step */
|
||||
addc temp,temp,temp /* shift temp with/into carry */
|
||||
ds rmndr,arg1,rmndr /* 3rd divide step */
|
||||
addc temp,temp,temp /* shift temp with/into carry */
|
||||
ds rmndr,arg1,rmndr /* 4th divide step */
|
||||
addc temp,temp,temp /* shift temp with/into carry */
|
||||
ds rmndr,arg1,rmndr /* 5th divide step */
|
||||
addc temp,temp,temp /* shift temp with/into carry */
|
||||
ds rmndr,arg1,rmndr /* 6th divide step */
|
||||
addc temp,temp,temp /* shift temp with/into carry */
|
||||
ds rmndr,arg1,rmndr /* 7th divide step */
|
||||
addc temp,temp,temp /* shift temp with/into carry */
|
||||
ds rmndr,arg1,rmndr /* 8th divide step */
|
||||
addc temp,temp,temp /* shift temp with/into carry */
|
||||
ds rmndr,arg1,rmndr /* 9th divide step */
|
||||
addc temp,temp,temp /* shift temp with/into carry */
|
||||
ds rmndr,arg1,rmndr /* 10th divide step */
|
||||
addc temp,temp,temp /* shift temp with/into carry */
|
||||
ds rmndr,arg1,rmndr /* 11th divide step */
|
||||
addc temp,temp,temp /* shift temp with/into carry */
|
||||
ds rmndr,arg1,rmndr /* 12th divide step */
|
||||
addc temp,temp,temp /* shift temp with/into carry */
|
||||
ds rmndr,arg1,rmndr /* 13th divide step */
|
||||
addc temp,temp,temp /* shift temp with/into carry */
|
||||
ds rmndr,arg1,rmndr /* 14th divide step */
|
||||
addc temp,temp,temp /* shift temp with/into carry */
|
||||
ds rmndr,arg1,rmndr /* 15th divide step */
|
||||
addc temp,temp,temp /* shift temp with/into carry */
|
||||
ds rmndr,arg1,rmndr /* 16th divide step */
|
||||
addc temp,temp,temp /* shift temp with/into carry */
|
||||
ds rmndr,arg1,rmndr /* 17th divide step */
|
||||
addc temp,temp,temp /* shift temp with/into carry */
|
||||
ds rmndr,arg1,rmndr /* 18th divide step */
|
||||
addc temp,temp,temp /* shift temp with/into carry */
|
||||
ds rmndr,arg1,rmndr /* 19th divide step */
|
||||
addc temp,temp,temp /* shift temp with/into carry */
|
||||
ds rmndr,arg1,rmndr /* 20th divide step */
|
||||
addc temp,temp,temp /* shift temp with/into carry */
|
||||
ds rmndr,arg1,rmndr /* 21st divide step */
|
||||
addc temp,temp,temp /* shift temp with/into carry */
|
||||
ds rmndr,arg1,rmndr /* 22nd divide step */
|
||||
addc temp,temp,temp /* shift temp with/into carry */
|
||||
ds rmndr,arg1,rmndr /* 23rd divide step */
|
||||
addc temp,temp,temp /* shift temp with/into carry */
|
||||
ds rmndr,arg1,rmndr /* 24th divide step */
|
||||
addc temp,temp,temp /* shift temp with/into carry */
|
||||
ds rmndr,arg1,rmndr /* 25th divide step */
|
||||
addc temp,temp,temp /* shift temp with/into carry */
|
||||
ds rmndr,arg1,rmndr /* 26th divide step */
|
||||
addc temp,temp,temp /* shift temp with/into carry */
|
||||
ds rmndr,arg1,rmndr /* 27th divide step */
|
||||
addc temp,temp,temp /* shift temp with/into carry */
|
||||
ds rmndr,arg1,rmndr /* 28th divide step */
|
||||
addc temp,temp,temp /* shift temp with/into carry */
|
||||
ds rmndr,arg1,rmndr /* 29th divide step */
|
||||
addc temp,temp,temp /* shift temp with/into carry */
|
||||
ds rmndr,arg1,rmndr /* 30th divide step */
|
||||
addc temp,temp,temp /* shift temp with/into carry */
|
||||
ds rmndr,arg1,rmndr /* 31st divide step */
|
||||
addc temp,temp,temp /* shift temp with/into carry */
|
||||
ds rmndr,arg1,rmndr /* 32nd divide step, */
|
||||
comiclr,<= 0,rmndr,r0
|
||||
add rmndr,arg1,rmndr /* correction */
|
||||
MILLIRETN
|
||||
nop
|
||||
|
||||
/* Putting >= on the last DS and deleting COMICLR does not work! */
|
||||
LSYM(special_case)
|
||||
sub,>>= arg0,arg1,rmndr
|
||||
copy arg0,rmndr
|
||||
MILLIRETN
|
||||
nop
|
||||
.exit
|
||||
.procend
|
||||
.end
|
||||
#endif
|
|
@ -607,7 +607,7 @@ void show_mem(void)
|
|||
|
||||
printk("Zone list for zone %d on node %d: ", j, i);
|
||||
for (k = 0; zl->zones[k] != NULL; k++)
|
||||
printk("[%ld/%s] ", zone_to_nid(zl->zones[k]), zl->zones[k]->name);
|
||||
printk("[%d/%s] ", zone_to_nid(zl->zones[k]), zl->zones[k]->name);
|
||||
printk("\n");
|
||||
}
|
||||
}
|
||||
|
|
|
@ -13,6 +13,8 @@
|
|||
# modified by Cort (cort@cs.nmt.edu)
|
||||
#
|
||||
|
||||
# KBUILD_CFLAGS used when building rest of boot (takes effect recursively)
|
||||
KBUILD_CFLAGS += -fno-builtin -D__BOOTER__ -Iarch/$(ARCH)/boot/include
|
||||
HOSTCFLAGS += -Iarch/$(ARCH)/boot/include
|
||||
|
||||
BOOT_TARGETS = zImage zImage.initrd znetboot znetboot.initrd
|
||||
|
|
|
@ -8,7 +8,8 @@
|
|||
#
|
||||
|
||||
|
||||
EXTRA_CFLAGS += -fno-builtin -Iarch/$(ARCH)/boot/include
|
||||
# KBUILD_CFLAGS used when building rest of boot (takes effect recursively)
|
||||
KBUILD_CFLAGS += -fno-builtin -Iarch/$(ARCH)/boot/include
|
||||
HOSTFLAGS += -Iarch/$(ARCH)/boot/include
|
||||
|
||||
BIG_ENDIAN := $(shell echo -e __XTENSA_EB__ | $(CC) -E - | grep -v "\#")
|
||||
|
|
|
@ -556,44 +556,6 @@ lba_bios_init(void)
|
|||
|
||||
#ifdef CONFIG_64BIT
|
||||
|
||||
/*
|
||||
** Determine if a device is already configured.
|
||||
** If so, reserve it resources.
|
||||
**
|
||||
** Read PCI cfg command register and see if I/O or MMIO is enabled.
|
||||
** PAT has to enable the devices it's using.
|
||||
**
|
||||
** Note: resources are fixed up before we try to claim them.
|
||||
*/
|
||||
static void
|
||||
lba_claim_dev_resources(struct pci_dev *dev)
|
||||
{
|
||||
u16 cmd;
|
||||
int i, srch_flags;
|
||||
|
||||
(void) pci_read_config_word(dev, PCI_COMMAND, &cmd);
|
||||
|
||||
srch_flags = (cmd & PCI_COMMAND_IO) ? IORESOURCE_IO : 0;
|
||||
if (cmd & PCI_COMMAND_MEMORY)
|
||||
srch_flags |= IORESOURCE_MEM;
|
||||
|
||||
if (!srch_flags)
|
||||
return;
|
||||
|
||||
for (i = 0; i <= PCI_ROM_RESOURCE; i++) {
|
||||
if (dev->resource[i].flags & srch_flags) {
|
||||
pci_claim_resource(dev, i);
|
||||
DBG(" claimed %s %d [%lx,%lx]/%lx\n",
|
||||
pci_name(dev), i,
|
||||
dev->resource[i].start,
|
||||
dev->resource[i].end,
|
||||
dev->resource[i].flags
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* truncate_pat_collision: Deal with overlaps or outright collisions
|
||||
* between PAT PDC reported ranges.
|
||||
|
@ -653,7 +615,6 @@ truncate_pat_collision(struct resource *root, struct resource *new)
|
|||
}
|
||||
|
||||
#else
|
||||
#define lba_claim_dev_resources(dev) do { } while (0)
|
||||
#define truncate_pat_collision(r,n) (0)
|
||||
#endif
|
||||
|
||||
|
@ -684,8 +645,12 @@ lba_fixup_bus(struct pci_bus *bus)
|
|||
** pci_alloc_primary_bus() mangles this.
|
||||
*/
|
||||
if (bus->self) {
|
||||
int i;
|
||||
/* PCI-PCI Bridge */
|
||||
pci_read_bridge_bases(bus);
|
||||
for (i = PCI_BRIDGE_RESOURCES; i < PCI_NUM_RESOURCES; i++) {
|
||||
pci_claim_resource(bus->self, i);
|
||||
}
|
||||
} else {
|
||||
/* Host-PCI Bridge */
|
||||
int err, i;
|
||||
|
@ -803,6 +768,9 @@ lba_fixup_bus(struct pci_bus *bus)
|
|||
DBG("lba_fixup_bus() WTF? 0x%lx [%lx/%lx] XXX",
|
||||
res->flags, res->start, res->end);
|
||||
}
|
||||
if ((i != PCI_ROM_RESOURCE) ||
|
||||
(res->flags & IORESOURCE_ROM_ENABLE))
|
||||
pci_claim_resource(dev, i);
|
||||
}
|
||||
|
||||
#ifdef FBB_SUPPORT
|
||||
|
@ -814,11 +782,6 @@ lba_fixup_bus(struct pci_bus *bus)
|
|||
bus->bridge_ctl &= ~(status & PCI_STATUS_FAST_BACK);
|
||||
#endif
|
||||
|
||||
if (is_pdc_pat()) {
|
||||
/* Claim resources for PDC's devices */
|
||||
lba_claim_dev_resources(dev);
|
||||
}
|
||||
|
||||
/*
|
||||
** P2PB's have no IRQs. ignore them.
|
||||
*/
|
||||
|
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue