Commit 923215ae authored by Linus Torvalds's avatar Linus Torvalds

v2.4.4.3 -> v2.4.4.4

  - Russell King: ARM updates
  - Al Viro: more init cleanups
  - Cort Dougan: more PPC updates
  - David Miller: cleanups, pci mmap updates
  - Neil Brown: raid resync by sector
  - Alan Cox: more merging with -ac
  - Johannes Erdfelt: USB updates
  - Kai Germaschewski: ISDN updates
  - Tobias Ringstrom: dmfe.c network driver update
  - Trond Myklebust: NFS client updates and cleanups
parent 02947070
......@@ -221,6 +221,14 @@ S: ul. Koscielna 12a
S: 62-300 Wrzesnia
S: Poland
N: Fred Barnes
E: frmb2@ukc.ac.uk
D: Various parport/ppdev hacks and fixes
S: Computing Lab, The University
S: Canterbury, KENT
S: CT2 7NF
S: England
N: Paul Barton-Davis
E: pbd@op.net
D: Driver for WaveFront soundcards (Turtle Beach Maui, Tropez, Tropez+)
......@@ -1663,6 +1671,7 @@ S: Ecole Nationale Superieure des Telecommunications, Paris
N: Jamie Lokier
E: jamie@imbolc.ucc.ie
D: Reboot-through-BIOS for broken 486 motherboards
D: Some parport fixes
S: 11 Goodson Walk
S: Marston
S: Oxford
......@@ -2883,7 +2892,7 @@ S: Carrollton, TX 75010
S: USA
N: Tim Waugh
E: tim@cyberelk.demon.co.uk
E: tim@cyberelk.net
D: Co-architect of the parallel-port sharing system
S: 17 Curling Vale
S: GUILDFORD
......
......@@ -31,7 +31,7 @@ al espa
Eine deutsche Version dieser Datei finden Sie unter
<http://www.stefan-winter.de/Changes-2.4.0.txt>.
Last updated: April 6, 2001
Last updated: May 9, 2001
Chris Ricker (kaboom@gatech.edu or chris.ricker@genetics.utah.edu).
......@@ -71,7 +71,7 @@ necessarily to users of other CPUs. Users of other CPUs should obtain
information about their gcc version requirements from another source.
The recommended compiler for the kernel is egcs 1.1.2 (gcc 2.91.66), and it
should be used when you need absolute stability. You may use gcc 2.95.2
should be used when you need absolute stability. You may use gcc 2.95.x
instead if you wish, although it may cause problems. Later versions of gcc
have not received much testing for Linux kernel compilation, and there are
almost certainly bugs (mainly, but not exclusively, in the kernel) that
......@@ -83,9 +83,9 @@ no longer works around bugs in gcc 2.7.2.3 and, in fact, will refuse to
be compiled with it.
In addition, please pay attention to compiler optimization. Anything
greater than -O2 may not be wise. Similarly, if you choose to use gcc-2.95
greater than -O2 may not be wise. Similarly, if you choose to use gcc-2.95.x
or derivatives, be sure not to use -fstrict-aliasing (which, depending on
your version of gcc 2.95, may necessitate using -fno-strict-aliasing).
your version of gcc 2.95.x, may necessitate using -fno-strict-aliasing).
Make
----
......@@ -268,15 +268,15 @@ egcs 1.1.2 (gcc 2.91.66)
------------------------
o <ftp://sourceware.cygnus.com/pub/gcc/releases/egcs-1.1.2/egcs-1.1.2.tar.bz2>
gcc 2.95.2
gcc 2.95.3
----------
o <ftp://ftp.gnu.org/pub/gnu/gcc/gcc-2.95.2.tar.gz>
o <ftp://ftp.gnu.org/pub/gnu/gcc/gcc-2.95.3.tar.gz>
Gnu Make
********
Make 3.77
--------
---------
o <ftp://ftp.gnu.org/gnu/make/make-3.77.tar.gz>
Binutils
......
......@@ -240,6 +240,7 @@ To unmap and free such a DMA region, you call:
where dev, size are the same as in the above call and cpu_addr and
dma_handle are the values pci_alloc_consistent returned to you.
This function may not be called in interrupt context.
If your driver needs lots of smaller memory regions, you can write
custom code to subdivide pages returned by pci_alloc_consistent,
......@@ -262,7 +263,8 @@ SLAB_POISON may help you find driver bugs. If you call this in a non-
sleeping context (f.e. in_interrupt is true or while holding SMP
locks), pass SLAB_ATOMIC. If your device has no boundary crossing
restrictions, pass 0 for alloc; passing 4096 says memory allocated
from this pool must not cross 4KByte boundaries.
from this pool must not cross 4KByte boundaries (but at that time it
may be better to go for pci_alloc_consistent directly instead).
Allocate memory from a pci pool like this:
......@@ -270,21 +272,23 @@ Allocate memory from a pci pool like this:
flags are SLAB_KERNEL if blocking is permitted (not in_interrupt nor
holding SMP locks), SLAB_ATOMIC otherwise. Like pci_alloc_consistent,
this returns two values, cpu_addr and dma_handle,
this returns two values, cpu_addr and dma_handle.
Free memory that was allocated from a pci_pool like this:
pci_pool_free(pool, cpu_addr, dma_handle);
where pool is what you passed to pci_pool_alloc, and cpu_addr and
dma_handle are the values pci_pool_alloc returned.
dma_handle are the values pci_pool_alloc returned. This function
may be called in interrupt context.
Destroy a pci_pool by calling:
pci_pool_destroy(pool);
Make sure you've called pci_pool_free for all memory allocated
from a pool before you destroy the pool.
from a pool before you destroy the pool. This function may not
be called in interrupt context.
DMA Direction
......
......@@ -713,7 +713,8 @@ printk(KERN_INFO "my ip: %d.%d.%d.%d\n", NIPQUAD(ipaddress));
</para>
<para>
Static data structures marked as <type>__initdata</type> must be initialised
(as opposed to ordinary static data which is zeroed BSS).
(as opposed to ordinary static data which is zeroed BSS) and cannot be
<type>const</type>.
</para>
</sect1>
......
......@@ -760,8 +760,11 @@
</para>
<para>
Any atomic operation is defined to act as a memory barrier
(ie. as per the <function>mb()</function> macro). Also,
Some atomic operations are defined to act as a memory barrier
(ie. as per the <function>mb()</function> macro, but if in
doubt, be explicit.
<!-- Rusty Russell 2 May 2001, 2.4.4 -->
Also,
spinlock operations act as partial barriers: operations after
gaining a spinlock will never be moved to precede the
<function>spin_lock()</function> call, and operations before
......
......@@ -660,6 +660,12 @@ Your cooperation is appreciated.
29 char Universal frame buffer
0 = /dev/fb0 First frame buffer
1 = /dev/fb1 Second frame buffer
...
31 = /dev/fb31 32nd frame buffer
Backward compatibility aliases {2.6}
32 = /dev/fb1 Second frame buffer
...
224 = /dev/fb7 Eighth frame buffer
......
......@@ -139,7 +139,7 @@ Code Seq# Include File Comments
'p' 00-3F linux/mc146818rtc.h
'p' 40-7F linux/nvram.h
'p' 80-9F user-space parport
<mailto:tim@cyberelk.demon.co.uk>
<mailto:tim@cyberelk.net>
'q' 00-1F linux/videotext.h conflict!
'q' 80-FF Internet PhoneJACK, Internet LineJACK
<http://www.quicknet.net>
......
......@@ -261,4 +261,4 @@ the DMA channel, and try with:
io=0x378 irq=7 dma=3 (for DMA)
--
Philip.Blundell@pobox.com
tim@cyberelk.demon.co.uk
tim@cyberelk.net
......@@ -60,8 +60,8 @@ contains:
remove Pointer to a function which gets called whenever a device
being handled by this driver is removed (either during
deregistration of the driver or when it's manually pulled
out of a hot-pluggable slot). This function can be called
from interrupt context.
out of a hot-pluggable slot). This function always gets
called from process context, so it can sleep.
suspend, Power management hooks -- called when the device goes to
resume sleep or is resumed.
......
......@@ -89,7 +89,7 @@ that will be using this driver.
#include <unistd.h>
#include <errno.h>
void main(void) {
int main(void) {
int i, fd, retval, irqcount = 0;
unsigned long tmp, data;
......@@ -277,5 +277,6 @@ fprintf(stderr, "\nTyping \"cat /proc/interrupts\" will show %d more events on I
irqcount);
close(fd);
return 0;
} /* end main */
Documentation for the Cirrus Logic/Crystal SoundFusion cs46xx/cs4280 audio
controller chips (2001/05/11)
The cs46xx audio driver supports the DSP line of Cirrus controllers.
Specifically, the cs4610, cs4612, cs4614, cs4622, cs4624, cs4630 and the cs4280
products. This driver uses the generic ac97_codec driver for AC97 codec
support.
Features:
Full Duplex Playback/Capture supported from 8k-48k.
16Bit Signed LE & 8Bit Unsigned, with Mono or Stereo supported.
APM/PM - 2.2.x PM is enabled and functional. APM can also
be enabled for 2.4.x by modifying the CS46XX_ACPI_SUPPORT macro
definition.
DMA playback buffer size is configurable from 16k (defaultorder=2) up to 2Meg
(defaultorder=11). DMA capture buffer size is fixed at a single 4k page as
two 2k fragments.
MMAP seems to work well with QuakeIII, and test XMMS plugin.
Myth2 works, but the polling logic is not fully correct, but is functional.
The 2.4.4-ac6 gameport code in the cs461x joystick driver has been tested
with a Microsoft Sidewinder joystick (cs461x.o and sidewinder.o). This
audio driver must be loaded prior to the joystick driver to enable the
DSP task image supporting the joystick device.
Limitations:
SPDIF is currently not supported.
Primary codec support only. No secondary codec support is implemented.
NOTES:
Hercules Game Theatre XP - the EGPIO2 pin controls the external Amp,
and has been tested.
Module parameter hercules_egpio_disable set to 1, will force a 0 to EGPIODR
to disable the external amplifier.
VTB Santa Cruz - the GPIO7/GPIO8 on the Secondary Codec control
the external amplifier for the "back" speakers, since we do not
support the secondary codec then this external amp is not
turned on. The primary codec external amplifier is supported but
note that the AC97 EAPD bit is inverted logic (amp_voyetra()).
DMA buffer size - there are issues with many of the Linux applications
concerning the optimal buffer size. Several applications request a
certain fragment size and number and then do not verify that the driver
has the ability to support the requested configuration.
SNDCTL_DSP_SETFRAGMENT ioctl is used to request a fragment size and
number of fragments. Some applications exit if an error is returned
on this particular ioctl. Therefore, in alignment with the other OSS audio
drivers, no error is returned when a SETFRAGs IOCTL is received, but the
values passed from the app are not used in any buffer calculation
(ossfragshift/ossmaxfrags are not used).
Use the "defaultorder=N" module parameter to change the buffer size if
you have an application that requires a specific number of fragments
or a specific buffer size (see below).
Debug Interface
---------------
There is an ioctl debug interface to allow runtime modification of the
debug print levels. This debug interface code can be disabled from the
compilation process with commenting the following define:
#define CSDEBUG_INTERFACE 1
There is also a debug print methodolgy to select printf statements from
different areas of the driver. A debug print level is also used to allow
additional printfs to be active. Comment out the following line in the
driver to disable compilation of the CS_DBGOUT print statements:
#define CSDEBUG 1
Please see the defintions for cs_debuglevel and cs_debugmask for additional
information on the debug levels and sections.
There is also a csdbg executable to allow runtime manipulation of these
parameters. for a copy email: twoller@crystal.cirrus.com
MODULE_PARMS definitions
------------------------
MODULE_PARM(defaultorder, "i");
defaultorder=N
where N is a value from 1 to 12
The buffer order determines the size of the dma buffer for the driver.
under Linux, a smaller buffer allows more responsiveness from many of the
applications (e.g. games). A larger buffer allows some of the apps (esound)
to not underrun the dma buffer as easily. As default, use 32k (order=3)
rather than 64k as some of the games work more responsively.
(2^N) * PAGE_SIZE = allocated buffer size
MODULE_PARM(cs_debuglevel, "i");
MODULE_PARM(cs_debugmask, "i");
cs_debuglevel=N
cs_debugmask=0xMMMMMMMM
where N is a value from 0 (no debug printfs), to 9 (maximum)
0xMMMMMMMM is a debug mask corresponding to the CS_xxx bits (see driver source).
MODULE_PARM(hercules_egpio_disable, "i");
hercules_egpio_disable=N
where N is a 0 (enable egpio), or a 1 (disable egpio support)
MODULE_PARM(initdelay, "i");
initdelay=N
This value is used to determine the millescond delay during the initialization
code prior to powering up the PLL. On laptops this value can be used to
assist with errors on resume, mostly with IBM laptops. Basically, if the
system is booted under battery power then the mdelay()/udelay() functions fail to
properly delay the required time. Also, if the system is booted under AC power
and then the power removed, the mdelay()/udelay() functions will not delay properly.
MODULE_PARM(powerdown, "i");
powerdown=N
where N is 0 (disable any powerdown of the internal blocks) or 1 (enable powerdown)
MODULE_PARM(external_amp, "i");
external_amp=1
if N is set to 1, then force enabling the EAPD support in the primary AC97 codec.
override the detection logic and force the external amp bit in the AC97 0x26 register
to be reset (0). EAPD should be 0 for powerup, and 1 for powerdown. The VTB Santa Cruz
card has inverted logic, so there is a special function for these cards.
MODULE_PARM(thinkpad, "i");
thinkpad=1
if N is set to 1, then force enabling the clkrun functionality.
Currently, when the part is being used, then clkrun is disabled for the entire system,
but re-enabled when the driver is released or there is no outstanding open count.
......@@ -69,7 +69,10 @@ is the string "usb", and it passes these environment variables:
If "usbdevfs" is configured, DEVICE and DEVFS are also passed. DEVICE is
the pathname of the device, and is useful for devices with multiple and/or
alternate interfaces that complicate driver selection.
alternate interfaces that complicate driver selection. By design, USB
hotplugging is independent of "usbdevfs": you can do most essential parts
of USB device setup without using that filesystem, and without running a
user mode daemon to detect changes in system configuration.
Currently available policy agent implementations can load drivers for
modules, and can invoke driver-specific setup scripts. The newest ones
......@@ -85,14 +88,26 @@ driver modules get loaded, either at boot time or later.
See <linux/usb.h> for full information about such table entries; or look
at existing drivers. Each table entry describes one or more criteria to
be used when matching a driver to a device or class of devices.
be used when matching a driver to a device or class of devices. The
specific criteria are identified by bits set in "match_flags", paired
with field values. You can construct the criteria directly, or with
macros such as these, and use driver_info to store more information.
USB_DEVICE (vendorId, productId)
... matching devices with specified vendor and product ids
USB_DEVICE_VER (vendorId, productId, lo, hi)
... like USB_DEVICE with lo <= productversion <= hi
USB_INTERFACE_INFO (class, subclass, protocol)
... matching specified interface class info
USB_DEVICE_INFO (class, subclass, protocol)
... matching specified device class info
A short example, for a driver that supports several specific USB devices
and their quirks, might have a MODULE_DEVICE_TABLE like this:
static const struct usb_device_id mydriver_id_table = {
{ idVendor: 0x9999, idProduct 0xaaaa, driver_info: QUIRK_X },
{ idVendor: 0xbbbb, idProduct 0x8888, driver_info: QUIRK_Y|QUIRK_Z },
{ USB_DEVICE (0x9999, 0xaaaa), driver_info: QUIRK_X },
{ USB_DEVICE (0xbbbb, 0x8888), driver_info: QUIRK_Y|QUIRK_Z },
...
{ } /* end with an all-zeroes entry */
}
......
......@@ -409,6 +409,12 @@ M: mvw@planets.elm.net
L: linux-kernel@vger.kernel.org
S: Maintained
DAVICOM FAST ETHERNET (DMFE) NETWORK DRIVER
P: Tobias Ringstrom
M: tori@unhappy.mine.nu
L: linux-kernel@vger.kernel.org
S: Maintained
DOUBLETALK DRIVER
P: James R. Van Zandt
M: jrv@vanzandt.mv.com
......@@ -995,7 +1001,7 @@ PARALLEL PORT SUPPORT
P: Phil Blundell
M: Philip.Blundell@pobox.com
P: Tim Waugh
M: tim@cyberelk.demon.co.uk
M: tim@cyberelk.net
P: David Campbell
M: campbell@torque.net
P: Andrea Arcangeli
......@@ -1006,7 +1012,7 @@ S: Maintained
PARIDE DRIVERS FOR PARALLEL PORT IDE DEVICES
P: Tim Waugh
M: tim@cyberelk.demon.co.uk
M: tim@cyberelk.net
L: linux-parport@torque.net
W: http://www.torque.net/linux-pp.html
S: Maintained
......
VERSION = 2
PATCHLEVEL = 4
SUBLEVEL = 5
EXTRAVERSION =-pre3
EXTRAVERSION =-pre4
KERNELRELEASE=$(VERSION).$(PATCHLEVEL).$(SUBLEVEL)$(EXTRAVERSION)
......@@ -118,11 +118,7 @@ export SVGA_MODE = -DSVGA_MODE=NORMAL_VGA
CORE_FILES =kernel/kernel.o mm/mm.o fs/fs.o ipc/ipc.o
NETWORKS =net/network.o
DRIVERS =drivers/block/block.o \
drivers/char/char.o \
drivers/misc/misc.o \
drivers/net/net.o \
drivers/media/media.o
LIBS =$(TOPDIR)/lib/lib.a
SUBDIRS =kernel drivers mm fs net ipc lib
......@@ -132,6 +128,11 @@ DRIVERS-m :=
DRIVERS- :=
DRIVERS-$(CONFIG_PARPORT) += drivers/parport/driver.o
DRIVERS-y += drivers/char/char.o \
drivers/block/block.o \
drivers/misc/misc.o \
drivers/net/net.o \
drivers/media/media.o
DRIVERS-$(CONFIG_AGP) += drivers/char/agp/agp.o
DRIVERS-$(CONFIG_DRM) += drivers/char/drm/drm.o
DRIVERS-$(CONFIG_NUBUS) += drivers/nubus/nubus.a
......@@ -177,7 +178,7 @@ DRIVERS-$(CONFIG_PHONE) += drivers/telephony/telephony.o
DRIVERS-$(CONFIG_ACPI) += drivers/acpi/acpi.o
DRIVERS-$(CONFIG_MD) += drivers/md/mddev.o
DRIVERS += $(DRIVERS-y)
DRIVERS := $(DRIVERS-y)
# files removed with 'make clean'
......
......@@ -156,7 +156,7 @@ pcibios_align_resource(void *data, struct resource *res, unsigned long size)
else if (res->flags & IORESOURCE_MEM) {
/* Make sure we start at our min on all hoses */
if (start - hose->mem_space->start < PCIBIOS_MIN_MEM)
start = PCIBIOS_MIN_MEM + hose->io_space->start;
start = PCIBIOS_MIN_MEM + hose->mem_space->start;
/*
* The following holds at least for the Low Cost
......
......@@ -14,6 +14,7 @@
#include <linux/sched.h>
#include <linux/pci.h>
#include <linux/init.h>
#include <linux/reboot.h>
#include <asm/ptrace.h>
#include <asm/system.h>
......@@ -223,11 +224,21 @@ miata_init_pci(void)
static void
miata_kill_arch(int mode)
{
/* Who said DEC engineers have no sense of humor? ;-) */
if (alpha_using_srm) {
*(vuip) PYXIS_RESET = 0x0000dead;
mb();
switch(mode) {
case LINUX_REBOOT_CMD_RESTART:
/* Who said DEC engineers have no sense of humor? ;-) */
if (alpha_using_srm) {
*(vuip) PYXIS_RESET = 0x0000dead;
mb();
}
break;
case LINUX_REBOOT_CMD_HALT:
break;
case LINUX_REBOOT_CMD_POWER_OFF:
break;
}
halt();
}
......
......@@ -2,7 +2,9 @@
# Automatically generated make config: don't edit
#
CONFIG_ARM=y
# CONFIG_EISA is not set
# CONFIG_SBUS is not set
# CONFIG_MCA is not set
CONFIG_UID16=y
#
......@@ -23,6 +25,7 @@ CONFIG_OBSOLETE=y
CONFIG_ARCH_CLPS7500=y
# CONFIG_ARCH_CO285 is not set
# CONFIG_ARCH_EBSA110 is not set
# CONFIG_ARCH_L7200 is not set
# CONFIG_ARCH_FTVPCI is not set
# CONFIG_ARCH_TBOX is not set
# CONFIG_ARCH_SHARK is not set
......@@ -30,22 +33,51 @@ CONFIG_ARCH_CLPS7500=y
# CONFIG_ARCH_INTEGRATOR is not set
# CONFIG_ARCH_RPC is not set
# CONFIG_ARCH_SA1100 is not set
# CONFIG_ARCH_CLPS711X is not set
#
# Archimedes/A5000 Implementations
#
#
# Footbridge Implementations
#
#
# SA11x0 Implementations
#
#
# CLPS711X/EP721X Implementations
#
# CONFIG_ARCH_ACORN is not set
# CONFIG_FOOTBRIDGE is not set
# CONFIG_FOOTBRIDGE_HOST is not set
# CONFIG_FOOTBRIDGE_ADDIN is not set
CONFIG_CPU_32=y
# CONFIG_CPU_26 is not set
#
# Processor Type
#
CONFIG_CPU_32v3=y
CONFIG_CPU_ARM7=y
# CONFIG_CPU_32v4 is not set
# CONFIG_CPU_ARM610 is not set
CONFIG_CPU_ARM710=y
# CONFIG_CPU_ARM720T is not set
# CONFIG_CPU_ARM920T is not set
# CONFIG_CPU_ARM1020 is not set
# CONFIG_CPU_SA110 is not set
# CONFIG_CPU_SA1100 is not set
# CONFIG_DISCONTIGMEM is not set
# CONFIG_PCI is not set
# CONFIG_ISA is not set
# CONFIG_ISA_DMA is not set
#
# General setup
#
CONFIG_ANGELBOOT=y
# CONFIG_PCI is not set
CONFIG_ISA=y
# CONFIG_ISA_DMA is not set
# CONFIG_HOTPLUG is not set
# CONFIG_PCMCIA is not set
CONFIG_NET=y
......@@ -60,7 +92,7 @@ CONFIG_BINFMT_ELF=y
# CONFIG_BINFMT_MISC is not set
# CONFIG_PM is not set
# CONFIG_ARTHUR is not set
CONFIG_CMDLINE="root=/dev/nfs rw"
CONFIG_CMDLINE="mem=16M root=nfs"
# CONFIG_ALIGNMENT_TRAP is not set
#
......@@ -81,34 +113,35 @@ CONFIG_PARPORT_1284=y
# Memory Technology Devices (MTD)
#
CONFIG_MTD=y
# CONFIG_MTD_DEBUG is not set
#
# Disk-On-Chip Device Drivers
#
# CONFIG_MTD_DOC1000 is not set
# CONFIG_MTD_DOC2000 is not set
# CONFIG_MTD_DOC2001 is not set
# CONFIG_MTD_DOCPROBE is not set
#
# RAM/ROM Device Drivers
#
# CONFIG_MTD_SLRAM is not set
# CONFIG_MTD_PMC551 is not set
# CONFIG_MTD_PMC551_BUGFIX is not set
# CONFIG_MTD_PMC551_DEBUG is not set
# CONFIG_MTD_MTDRAM is not set
#
# MTD drivers for mapped chips
# Linearly Mapped Flash Device Drivers
#
# CONFIG_MTD_CFI is not set
# CONFIG_MTD_CFI_INTELEXT is not set
# CONFIG_MTD_CFI_AMDSTD is not set
# CONFIG_MTD_JEDEC is not set
# CONFIG_MTD_RAM is not set
# CONFIG_MTD_ROM is not set
# CONFIG_MTD_PHYSMAP is not set
# CONFIG_MTD_JEDEC is not set
#
# Drivers for chip mappings
#
# CONFIG_MTD_MIXMEM is not set
# CONFIG_MTD_NORA is not set
# CONFIG_MTD_OCTAGON is not set
# CONFIG_MTD_PNC2000 is not set
# CONFIG_MTD_RPXLITE is not set
# CONFIG_MTD_VMAX is not set
#
# User modules and translation layers for MTD devices
......@@ -122,7 +155,6 @@ CONFIG_MTD=y
# Plug and Play configuration
#
# CONFIG_PNP is not set
# CONFIG_ISAPNP is not set
#
# Block devices
......@@ -130,20 +162,12 @@ CONFIG_MTD=y
# CONFIG_BLK_DEV_FD is not set
# CONFIG_BLK_DEV_XD is not set
# CONFIG_PARIDE is not set
# CONFIG_BLK_CPQ_DA is not set
# CONFIG_BLK_DEV_DAC960 is not set
# CONFIG_BLK_DEV_LOOP is not set
# CONFIG_BLK_DEV_NBD is not set
# CONFIG_BLK_DEV_LVM is not set
# CONFIG_BLK_DEV_MD is not set
# CONFIG_MD_LINEAR is not set
# CONFIG_MD_RAID0 is not set
# CONFIG_MD_RAID1 is not set
# CONFIG_MD_RAID5 is not set
CONFIG_BLK_DEV_NBD=y
CONFIG_BLK_DEV_RAM=y
CONFIG_BLK_DEV_RAM_SIZE=4096
# CONFIG_BLK_DEV_INITRD is not set
CONFIG_BLK_DEV_FLD7500=y
# CONFIG_BLK_DEV_FLD7500 is not set
#
# Networking options
......@@ -159,10 +183,8 @@ CONFIG_INET=y
CONFIG_IP_PNP=y
CONFIG_IP_PNP_BOOTP=y
# CONFIG_IP_PNP_RARP is not set
# CONFIG_IP_ROUTER is not set
# CONFIG_NET_IPIP is not set
# CONFIG_NET_IPGRE is not set
# CONFIG_IP_ALIAS is not set
# CONFIG_INET_ECN is not set
# CONFIG_SYN_COOKIES is not set
# CONFIG_IPV6 is not set
......@@ -179,6 +201,7 @@ CONFIG_IP_PNP_BOOTP=y
# CONFIG_X25 is not set
# CONFIG_LAPB is not set
# CONFIG_LLC is not set
# CONFIG_NET_DIVERT is not set
# CONFIG_ECONET is not set
# CONFIG_WAN_ROUTER is not set
# CONFIG_NET_FASTROUTE is not set
......@@ -201,6 +224,7 @@ CONFIG_NETDEVICES=y
CONFIG_DUMMY=y
# CONFIG_BONDING is not set
# CONFIG_EQUALIZER is not set
# CONFIG_TUN is not set
# CONFIG_NET_SB1000 is not set
#
......@@ -213,16 +237,19 @@ CONFIG_NET_ETHERNET=y
# CONFIG_NET_VENDOR_RACAL is not set
# CONFIG_AT1700 is not set
# CONFIG_DEPCA is not set
# CONFIG_HP100 is not set
# CONFIG_NET_ISA is not set
# CONFIG_NET_PCI is not set
CONFIG_NET_PCI=y
# CONFIG_AC3200 is not set
# CONFIG_APRICOT is not set
CONFIG_CS89x0=y
# CONFIG_ZNET is not set
# CONFIG_NET_POCKET is not set
#
# Ethernet (1000 Mbit)
#
# CONFIG_YELLOWFIN is not set
# CONFIG_ACENIC is not set
# CONFIG_SK98LIN is not set
# CONFIG_ACENIC_OMIT_TIGON_I is not set
# CONFIG_FDDI is not set
# CONFIG_HIPPI is not set
# CONFIG_PLIP is not set
......@@ -283,16 +310,17 @@ CONFIG_SLIP_COMPRESSED=y
# I2O device support
#
# CONFIG_I2O is not set
# CONFIG_I2O_BLOCK is not set
# CONFIG_I2O_LAN is not set
# CONFIG_I2O_SCSI is not set
# CONFIG_I2O_PROC is not set
#
# ISDN subsystem
#
# CONFIG_ISDN is not set
#
# Input core support
#
# CONFIG_INPUT is not set
#
# Character devices
#
......@@ -305,7 +333,7 @@ CONFIG_SERIAL=y
CONFIG_UNIX98_PTYS=y
CONFIG_UNIX98_PTY_COUNT=256
CONFIG_PRINTER=y
CONFIG_LP_CONSOLE=y
# CONFIG_LP_CONSOLE is not set
# CONFIG_PPDEV is not set
#
......@@ -322,16 +350,38 @@ CONFIG_I2C_ALGOBIT=y
#
# Mice
#
# CONFIG_BUSMOUSE is not set
CONFIG_BUSMOUSE=y
# CONFIG_ATIXL_BUSMOUSE is not set
# CONFIG_LOGIBUSMOUSE is not set
# CONFIG_MS_BUSMOUSE is not set
CONFIG_MOUSE=y
CONFIG_PSMOUSE=y
# CONFIG_PSMOUSE is not set
# CONFIG_82C710_MOUSE is not set
# CONFIG_PC110_PAD is not set
#
# Joysticks
#
# CONFIG_JOYSTICK is not set
#
# Game port support
#
#
# Gameport joysticks
#
#
# Serial port support
#
#
# Serial port joysticks
#
#
# Parallel port joysticks
#
# CONFIG_QIC02_TAPE is not set
#
......@@ -341,17 +391,17 @@ CONFIG_PSMOUSE=y
CONFIG_CLPS7500_FLASH=y
# CONFIG_NVRAM is not set
# CONFIG_RTC is not set
#
# Video For Linux
#
# CONFIG_VIDEO_DEV is not set
# CONFIG_DTLK is not set
# CONFIG_R3964 is not set
# CONFIG_APPLICOM is not set
# CONFIG_AGP is not set
# CONFIG_DRM is not set
#
# Multimedia devices
#
# CONFIG_VIDEO_DEV is not set
#
# File systems
#
......@@ -359,39 +409,27 @@ CONFIG_CLPS7500_FLASH=y
# CONFIG_AUTOFS_FS is not set
# CONFIG_AUTOFS4_FS is not set
# CONFIG_ADFS_FS is not set
# CONFIG_ADFS_FS_RW is not set
# CONFIG_AFFS_FS is not set
# CONFIG_HFS_FS is not set
# CONFIG_BFS_FS is not set
# CONFIG_FAT_FS is not set
# CONFIG_MSDOS_FS is not set
# CONFIG_UMSDOS_FS is not set
# CONFIG_VFAT_FS is not set
# CONFIG_EFS_FS is not set
# CONFIG_JFFS_FS is not set
# CONFIG_CRAMFS is not set
# CONFIG_RAMFS is not set
# CONFIG_ISO9660_FS is not set
# CONFIG_JOLIET is not set
CONFIG_MINIX_FS=y
# CONFIG_NTFS_FS is not set
# CONFIG_NTFS_RW is not set
# CONFIG_HPFS_FS is not set
CONFIG_PROC_FS=y
# CONFIG_DEVFS_FS is not set
# CONFIG_DEVFS_MOUNT is not set
# CONFIG_DEVFS_DEBUG is not set
# CONFIG_DEVPTS_FS is not set
CONFIG_DEVPTS_FS=y
# CONFIG_QNX4FS_FS is not set
# CONFIG_QNX4FS_RW is not set
# CONFIG_ROMFS_FS is not set
CONFIG_EXT2_FS=y
# CONFIG_SYSV_FS is not set
# CONFIG_SYSV_FS_WRITE is not set
# CONFIG_UDF_FS is not set
# CONFIG_UDF_RW is not set
# CONFIG_UFS_FS is not set
# CONFIG_UFS_FS_WRITE is not set
#
# Network File Systems
......@@ -401,21 +439,10 @@ CONFIG_NFS_FS=y
# CONFIG_NFS_V3 is not set
CONFIG_ROOT_NFS=y
# CONFIG_NFSD is not set
# CONFIG_NFSD_V3 is not set
CONFIG_SUNRPC=y
CONFIG_LOCKD=y
# CONFIG_SMB_FS is not set
# CONFIG_NCP_FS is not set
# CONFIG_NCPFS_PACKET_SIGNING is not set
# CONFIG_NCPFS_IOCTL_LOCKING is not set
# CONFIG_NCPFS_STRONG is not set
# CONFIG_NCPFS_NFS_NS is not set
# CONFIG_NCPFS_OS2_NS is not set
# CONFIG_NCPFS_SMALLDOS is not set
# CONFIG_NCPFS_MOUNT_SUBDIR is not set
# CONFIG_NCPFS_NDS_DOMAINS is not set
# CONFIG_NCPFS_NLS is not set
# CONFIG_NCPFS_EXTRAS is not set
#
# Partition Types
......@@ -430,11 +457,14 @@ CONFIG_PARTITION_ADVANCED=y
# CONFIG_SGI_PARTITION is not set
# CONFIG_ULTRIX_PARTITION is not set
# CONFIG_SUN_PARTITION is not set
# CONFIG_SMB_NLS is not set
# CONFIG_NLS is not set
#
# Console drivers
#
CONFIG_PC_KEYB=y
CONFIG_PC_KEYMAP=y
# CONFIG_VGA_CONSOLE is not set
CONFIG_FB=y
......@@ -445,15 +475,14 @@ CONFIG_FB=y
CONFIG_DUMMY_CONSOLE=y
CONFIG_FB_ACORN=y
# CONFIG_CHRONTEL_7003 is not set
# CONFIG_FB_CYBER2000 is not set
# CONFIG_FB_VIRTUAL is not set
CONFIG_FBCON_ADVANCED=y
# CONFIG_FBCON_MFB is not set
# CONFIG_FBCON_CFB2 is not set
# CONFIG_FBCON_CFB4 is not set
CONFIG_FBCON_MFB=y
CONFIG_FBCON_CFB2=y
CONFIG_FBCON_CFB4=y
CONFIG_FBCON_CFB8=y
# CONFIG_FBCON_CFB16 is not set
# CONFIG_FBCON_CFB24 is not set
CONFIG_FBCON_CFB16=y
CONFIG_FBCON_CFB24=y
# CONFIG_FBCON_CFB32 is not set
# CONFIG_FBCON_AFB is not set
# CONFIG_FBCON_ILBM is not set
......@@ -487,4 +516,4 @@ CONFIG_FONT_8x16=y
# CONFIG_DEBUG_USER is not set
# CONFIG_DEBUG_INFO is not set
CONFIG_MAGIC_SYSRQ=y
# CONFIG_DEBUG_LL is not set
CONFIG_DEBUG_LL=y
......@@ -25,6 +25,7 @@ CONFIG_EXPERIMENTAL=y
# CONFIG_ARCH_CLPS7500 is not set
# CONFIG_ARCH_CO285 is not set
# CONFIG_ARCH_EBSA110 is not set
# CONFIG_ARCH_L7200 is not set
# CONFIG_ARCH_FOOTBRIDGE is not set
CONFIG_ARCH_INTEGRATOR=y
# CONFIG_ARCH_RPC is not set
......@@ -56,18 +57,28 @@ CONFIG_CPU_32=y
#
# Processor Type
#
# CONFIG_CPU_32v3 is not set
CONFIG_CPU_32v4=y
CONFIG_CPU_ARM720=y
CONFIG_CPU_ARM920=y
# CONFIG_CPU_ARM610 is not set
# CONFIG_CPU_ARM710 is not set
CONFIG_CPU_ARM720T=y
CONFIG_CPU_ARM920T=y
CONFIG_CPU_ARM920_CPU_IDLE=y
CONFIG_CPU_ARM920_I_CACHE_ON=y
CONFIG_CPU_ARM920_D_CACHE_ON=y
# CONFIG_CPU_ARM920_WRITETHROUGH is not set
# CONFIG_CPU_ARM1020 is not set
# CONFIG_CPU_SA110 is not set
# CONFIG_CPU_SA1100 is not set
# CONFIG_DISCONTIGMEM is not set
#
# General setup
#
#
# Please ensure that you have read the help on the next option
#
# CONFIG_ANGELBOOT is not set
CONFIG_PCI_INTEGRATOR=y
CONFIG_PCI=y
......@@ -103,23 +114,32 @@ CONFIG_ALIGNMENT_TRAP=y
# Memory Technology Devices (MTD)
#
CONFIG_MTD=y
# CONFIG_MTD_DEBUG is not set
#
# Disk-On-Chip Device Drivers
#
# CONFIG_MTD_DOC1000 is not set
# CONFIG_MTD_DOC2000 is not set
# CONFIG_MTD_DOC2001 is not set
# CONFIG_MTD_DOCPROBE is not set
#
# RAM/ROM Device Drivers
#
# CONFIG_MTD_SLRAM is not set
# CONFIG_MTD_PMC551 is not set
# CONFIG_MTD_MTDRAM is not set
#
# MTD drivers for mapped chips
# Linearly Mapped Flash Device Drivers
#
CONFIG_MTD_CFI=y
CONFIG_MTD_CFI_INTELEXT=y
# CONFIG_MTD_CFI_AMDSTD is not set
# CONFIG_MTD_JEDEC is not set
# CONFIG_MTD_RAM is not set
# CONFIG_MTD_ROM is not set
# CONFIG_MTD_JEDEC is not set
# CONFIG_MTD_PHYSMAP is not set
#
......@@ -347,6 +367,8 @@ CONFIG_VT_CONSOLE=y
CONFIG_SERIAL_AMBA=y
CONFIG_SERIAL_INTEGRATOR=y
CONFIG_SERIAL_AMBA_CONSOLE=y
CONFIG_SERIAL_CORE=y
CONFIG_SERIAL_CORE_CONSOLE=y
CONFIG_UNIX98_PTYS=y
CONFIG_UNIX98_PTY_COUNT=256
......@@ -403,6 +425,8 @@ CONFIG_PSMOUSE=y
# CONFIG_QUOTA is not set
# CONFIG_AUTOFS_FS is not set
# CONFIG_AUTOFS4_FS is not set
# CONFIG_REISERFS_FS is not set
# CONFIG_REISERFS_CHECK is not set
# CONFIG_ADFS_FS is not set
# CONFIG_ADFS_FS_RW is not set
# CONFIG_AFFS_FS is not set
......@@ -457,8 +481,6 @@ CONFIG_LOCKD=y
# CONFIG_NCPFS_NFS_NS is not set
# CONFIG_NCPFS_OS2_NS is not set
# CONFIG_NCPFS_SMALLDOS is not set
# CONFIG_NCPFS_MOUNT_SUBDIR is not set
# CONFIG_NCPFS_NDS_DOMAINS is not set
# CONFIG_NCPFS_NLS is not set
# CONFIG_NCPFS_EXTRAS is not set
......@@ -475,6 +497,7 @@ CONFIG_PARTITION_ADVANCED=y
# CONFIG_SGI_PARTITION is not set
# CONFIG_ULTRIX_PARTITION is not set
# CONFIG_SUN_PARTITION is not set
# CONFIG_SMB_NLS is not set
# CONFIG_NLS is not set
#
......@@ -503,7 +526,7 @@ CONFIG_VGA_CONSOLE=y
#
# Kernel hacking
#
CONFIG_FRAME_POINTER=y
# CONFIG_NO_FRAME_POINTER is not set
CONFIG_DEBUG_ERRORS=y
CONFIG_DEBUG_USER=y
# CONFIG_DEBUG_INFO is not set
......
This diff is collapsed.
......@@ -51,7 +51,6 @@ __setup("fpe=", fpe_setup);
extern void paging_init(struct meminfo *, struct machine_desc *desc);
extern void bootmem_init(struct meminfo *);
extern void reboot_setup(char *str);
extern unsigned long memparse(char *ptr, char **retptr);
extern int root_mountflags;
extern int _stext, _text, _etext, _edata, _end;
......
......@@ -48,3 +48,7 @@ ifeq ($(PROCESSOR),armo)
endif
include $(TOPDIR)/Rules.make
csumpartialcopy.o: csumpartialcopygeneric.S
csumpartialcopyuser.o: csumpartialcopygeneric.S
......@@ -12,57 +12,119 @@
.text
/* Function: __u32 csum_partial(const char *src, int len, __u32)
/*
* Function: __u32 csum_partial(const char *src, int len, __u32 sum)
* Params : r0 = buffer, r1 = len, r2 = checksum
* Returns : r0 = new checksum
*/
buf .req r0
len .req r1
sum .req r2
td0 .req r3
td1 .req r4 @ save before use
td2 .req r5 @ save before use
td3 .req lr
.zero: mov r0, sum
add sp, sp, #4
ldr pc, [sp], #4
/*
* Handle 0 to 7 bytes, with any alignment of source and
* destination pointers. Note that when we get here, C = 0
*/
.less8: teq len, #0 @ check for zero count
beq .zero
/* we must have at least one byte. */
tst buf, #1 @ odd address?
ldrneb td0, [buf], #1
subne len, len, #1
adcnes sum, sum, td0, lsl #8
.less4: tst len, #6
beq .less8_byte
/* we are now half-word aligned */
.less8_wordlp:
#ifdef __ARM_ARCH_4__
ldrh td0, [buf], #2
sub len, len, #2
#else
ldrb td0, [buf], #1
ldrb td3, [buf], #1
sub len, len, #2
orr td0, td0, td3, lsl #8
#endif
adcs sum, sum, td0
tst len, #6
bne .less8_wordlp
.less8_byte: tst len, #1 @ odd number of bytes
ldrneb td0, [buf], #1 @ include last byte
adcnes sum, sum, td0 @ update checksum
.done: adc r0, sum, #0 @ collect up the last carry
ldr td0, [sp], #4
tst td0, #1 @ check buffer alignment
movne td0, r0, lsl #8 @ rotate checksum by 8 bits
orrne r0, td0, r0, lsr #24
ldr pc, [sp], #4 @ return
.not_aligned: tst buf, #1 @ odd address
ldrneb td0, [buf], #1 @ make even
subne len, len, #1
adcnes sum, sum, td0, lsl #8 @ update checksum
tst buf, #2 @ 32-bit aligned?
#ifdef __ARM_ARCH_4__
ldrneh td0, [buf], #2 @ make 32-bit aligned
subne len, len, #2
#else
ldrneb td0, [buf], #1
ldrneb ip, [buf], #1
subne len, len, #2
orrne td0, td0, ip, lsl #8
#endif
adcnes sum, sum, td0 @ update checksum
mov pc, lr
ENTRY(csum_partial)
tst r0, #2
beq 1f
subs r1, r1, #2
addmi r1, r1, #2
bmi 3f
bic r0, r0, #3
ldr r3, [r0], #4
adds r2, r2, r3, lsr #16
adcs r2, r2, #0
1: adds r2, r2, #0
bics ip, r1, #31
stmfd sp!, {buf, lr}
cmp len, #8 @ Ensure that we have at least
blo .less8 @ 8 bytes to copy.
adds sum, sum, #0 @ C = 0
tst buf, #3 @ Test destination alignment
blne .not_aligned @ aligh destination, return here
1: bics ip, len, #31
beq 3f
stmfd sp!, {r4 - r6}
2: ldmia r0!, {r3 - r6}
adcs r2, r2, r3
adcs r2, r2, r4
adcs r2, r2, r5
adcs r2, r2, r6
ldmia r0!, {r3 - r6}
adcs r2, r2, r3
adcs r2, r2, r4
adcs r2, r2, r5
adcs r2, r2, r6
stmfd sp!, {r4 - r5}
2: ldmia buf!, {td0, td1, td2, td3}
adcs sum, sum, td0
adcs sum, sum, td1
adcs sum, sum, td2
adcs sum, sum, td3
ldmia buf!, {td0, td1, td2, td3}
adcs sum, sum, td0
adcs sum, sum, td1
adcs sum, sum, td2
adcs sum, sum, td3
sub ip, ip, #32
teq ip, #0
bne 2b
adcs r2, r2, #0
ldmfd sp!, {r4 - r6}
3: ands ip, r1, #0x1c
beq 5f
4: ldr r3, [r0], #4
sub ip, ip, #4
adcs r2, r2, r3
teq ip, #0
bne 4b
adcs r2, r2, #0
5: ands ip, r1, #3
moveq r0, r2
RETINSTR(moveq,pc,lr)
mov ip, ip, lsl #3
ldr r3, [r0]
rsb ip, ip, #32
mov r3, r3, lsl ip
adds r2, r2, r3, lsr ip
adc r0, r2, #0
RETINSTR(mov,pc,lr)
ldmfd sp!, {r4 - r5}
3: tst len, #0x1c @ should not change C
beq .less4
4: ldr td0, [buf], #4
sub len, len, #4
adcs sum, sum, td0
tst len, #0x1c
bne 4b
b .less4
......@@ -18,11 +18,11 @@
*/
.macro save_regs
stmfd sp!, {r4 - r8, fp, ip, lr, pc}
stmfd sp!, {r1, r4 - r8, fp, ip, lr, pc}
.endm
.macro load_regs,flags
LOADREGS(\flags,fp,{r4 - r8, fp, sp, pc})
LOADREGS(\flags,fp,{r1, r4 - r8, fp, sp, pc})
.endm
.macro load1b, reg1
......@@ -47,250 +47,6 @@
ldmia r0!, {\reg1, \reg2, \reg3, \reg4}
.endm
ENTRY(csum_partial_copy_nocheck)
mov ip, sp
save_regs
sub fp, ip, #4
cmp r2, #4
blt .too_small
tst r1, #2 @ Test destination alignment
beq .dst_aligned
load2b ip, r8
subs r2, r2, #2 @ We do not know if SRC is aligned...
orr ip, ip, r8, lsl #8
adds r3, r3, ip
adcs r3, r3, #0
strb ip, [r1], #1
mov ip, ip, lsr #8
strb ip, [r1], #1 @ Destination now aligned
.dst_aligned: tst r0, #3
bne .src_not_aligned
adds r3, r3, #0
bics ip, r2, #15 @ Routine for src & dst aligned
beq 2f
1: load4l r4, r5, r6, r7
stmia r1!, {r4, r5, r6, r7}
adcs r3, r3, r4
adcs r3, r3, r5
adcs r3, r3, r6
adcs r3, r3, r7
sub ip, ip, #16
teq ip, #0
bne 1b
2: ands ip, r2, #12
beq 4f
tst ip, #8
beq 3f
load2l r4, r5
stmia r1!, {r4, r5}
adcs r3, r3, r4
adcs r3, r3, r5
tst ip, #4
beq 4f
3: load1l r4
str r4, [r1], #4
adcs r3, r3, r4
4: ands r2, r2, #3
adceq r0, r3, #0
load_regs eqea
load1l r4
tst r2, #2
beq .exit
adcs r3, r3, r4, lsl #16
strb r4, [r1], #1
mov r4, r4, lsr #8
strb r4, [r1], #1
mov r4, r4, lsr #8
.exit: tst r2, #1
strneb r4, [r1], #1
andne r4, r4, #255
adcnes r3, r3, r4
adcs r0, r3, #0
load_regs ea
#define FN_ENTRY ENTRY(csum_partial_copy_nocheck)
.too_small: teq r2, #0
load_regs eqea
cmp r2, #2
blt .too_small1
load2b ip, r8
orr ip, ip, r8, lsl #8
adds r3, r3, ip
strb ip, [r1], #1
strb r8, [r1], #1
tst r2, #1
.too_small1: @ C = 0
beq .csum_exit
load1b ip
strb ip, [r1], #1
adcs r3, r3, ip
.csum_exit: adc r0, r3, #0
load_regs ea
.src_not_aligned:
cmp r2, #4
blt .too_small
and ip, r0, #3
bic r0, r0, #3
load1l r4
cmp ip, #2
beq .src2_aligned
bhi .src3_aligned
mov r4, r4, lsr #8
adds r3, r3, #0
bics ip, r2, #15
beq 2f
1: load4l r5, r6, r7, r8
orr r4, r4, r5, lsl #24
mov r5, r5, lsr #8
orr r5, r5, r6, lsl #24
mov r6, r6, lsr #8
orr r6, r6, r7, lsl #24
mov r7, r7, lsr #8
orr r7, r7, r8, lsl #24
stmia r1!, {r4, r5, r6, r7}
adcs r3, r3, r4
adcs r3, r3, r5
adcs r3, r3, r6
adcs r3, r3, r7
mov r4, r8, lsr #8
sub ip, ip, #16
teq ip, #0
bne 1b
2: ands ip, r2, #12
beq 4f
tst ip, #8
beq 3f
load2l r5, r6
orr r4, r4, r5, lsl #24
mov r5, r5, lsr #8
orr r5, r5, r6, lsl #24
stmia r1!, {r4, r5}
adcs r3, r3, r4
adcs r3, r3, r5
mov r4, r6, lsr #8
tst ip, #4
beq 4f
3: load1l r5
orr r4, r4, r5, lsl #24
str r4, [r1], #4
adcs r3, r3, r4
mov r4, r5, lsr #8
4: ands r2, r2, #3
adceq r0, r3, #0
load_regs eqea
tst r2, #2
beq .exit
adcs r3, r3, r4, lsl #16
strb r4, [r1], #1
mov r4, r4, lsr #8
strb r4, [r1], #1
mov r4, r4, lsr #8
b .exit
.src2_aligned: mov r4, r4, lsr #16
adds r3, r3, #0
bics ip, r2, #15
beq 2f
1: load4l r5, r6, r7, r8
orr r4, r4, r5, lsl #16
mov r5, r5, lsr #16
orr r5, r5, r6, lsl #16
mov r6, r6, lsr #16
orr r6, r6, r7, lsl #16
mov r7, r7, lsr #16
orr r7, r7, r8, lsl #16
stmia r1!, {r4, r5, r6, r7}
adcs r3, r3, r4
adcs r3, r3, r5
adcs r3, r3, r6
adcs r3, r3, r7
mov r4, r8, lsr #16
sub ip, ip, #16
teq ip, #0
bne 1b
2: ands ip, r2, #12
beq 4f
tst ip, #8
beq 3f
load2l r5, r6
orr r4, r4, r5, lsl #16
mov r5, r5, lsr #16
orr r5, r5, r6, lsl #16
stmia r1!, {r4, r5}
adcs r3, r3, r4
adcs r3, r3, r5
mov r4, r6, lsr #16
tst ip, #4
beq 4f
3: load1l r5
orr r4, r4, r5, lsl #16
str r4, [r1], #4
adcs r3, r3, r4
mov r4, r5, lsr #16
4: ands r2, r2, #3
adceq r0, r3, #0
load_regs eqea
tst r2, #2
beq .exit
adcs r3, r3, r4, lsl #16
strb r4, [r1], #1
mov r4, r4, lsr #8
strb r4, [r1], #1
tst r2, #1
adceq r0, r3, #0
load_regs eqea
load1b r4
b .exit
.src3_aligned: mov r4, r4, lsr #24
adds r3, r3, #0
bics ip, r2, #15
beq 2f
1: load4l r5, r6, r7, r8
orr r4, r4, r5, lsl #8
mov r5, r5, lsr #24
orr r5, r5, r6, lsl #8
mov r6, r6, lsr #24
orr r6, r6, r7, lsl #8
mov r7, r7, lsr #24
orr r7, r7, r8, lsl #8
stmia r1!, {r4, r5, r6, r7}
adcs r3, r3, r4
adcs r3, r3, r5
adcs r3, r3, r6
adcs r3, r3, r7
mov r4, r8, lsr #24
sub ip, ip, #16
teq ip, #0
bne 1b
2: ands ip, r2, #12
beq 4f
tst ip, #8
beq 3f
load2l r5, r6
orr r4, r4, r5, lsl #8
mov r5, r5, lsr #24
orr r5, r5, r6, lsl #8
stmia r1!, {r4, r5}
adcs r3, r3, r4
adcs r3, r3, r5
mov r4, r6, lsr #24
tst ip, #4
beq 4f
3: load1l r5
orr r4, r4, r5, lsl #8
str r4, [r1], #4
adcs r3, r3, r4
mov r4, r5, lsr #24
4: ands r2, r2, #3
adceq r0, r3, #0
load_regs eqea
tst r2, #2
beq .exit
adcs r3, r3, r4, lsl #16
strb r4, [r1], #1
load1l r4
strb r4, [r1], #1
adcs r3, r3, r4, lsl #24
mov r4, r4, lsr #8
b .exit
#include "csumpartialcopygeneric.S"
/*
* linux/arch/arm/lib/csumpartialcopygeneric.S
*
* Copyright (C) 1995-2001 Russell King
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 2 as
* published by the Free Software Foundation.
*/
/*
* unsigned int
* csum_partial_copy_xxx(const char *src, char *dst, int len, int sum, )
* r0 = src, r1 = dst, r2 = len, r3 = sum
* Returns : r0 = checksum
*
* Note that 'tst' and 'teq' preserve the carry flag.
*/
src .req r0
dst .req r1
len .req r2
sum .req r3
.zero: mov r0, sum
load_regs ea
/*
* Align an unaligned destination pointer. We know that
* we have >= 8 bytes here, so we don't need to check
* the length. Note that the source pointer hasn't been
* aligned yet.
*/
.dst_unaligned: tst dst, #1
beq .dst_16bit
load1b ip
sub len, len, #1
adcs sum, sum, ip, lsl #8 @ update checksum
strb ip, [dst], #1
tst dst, #2
moveq pc, lr @ dst is now 32bit aligned
.dst_16bit: load2b r8, ip
sub len, len, #2
adcs sum, sum, r8
strb r8, [dst], #1
adcs sum, sum, ip, lsl #8
strb ip, [dst], #1
mov pc, lr @ dst is now 32bit aligned
/*
* Handle 0 to 7 bytes, with any alignment of source and
* destination pointers. Note that when we get here, C = 0
*/
.less8: teq len, #0 @ check for zero count
beq .zero
/* we must have at least one byte. */
tst dst, #1 @ dst 16-bit aligned
beq .less8_aligned
/* Align dst */
load1b ip
sub len, len, #1
adcs sum, sum, ip, lsl #8 @ update checksum
strb ip, [dst], #1
tst len, #6
beq .less8_byteonly
1: load2b r8, ip
sub len, len, #2
adcs sum, sum, r8
strb r8, [dst], #1
adcs sum, sum, ip, lsl #8
strb ip, [dst], #1
.less8_aligned: tst len, #6
bne 1b
.less8_byteonly:
tst len, #1
beq .done
load1b r8
adcs sum, sum, r8 @ update checksum
strb r8, [dst], #1
b .done
FN_ENTRY
mov ip, sp
save_regs
sub fp, ip, #4
cmp len, #8 @ Ensure that we have at least
blo .less8 @ 8 bytes to copy.
adds sum, sum, #0 @ C = 0
tst dst, #3 @ Test destination alignment
blne .dst_unaligned @ align destination, return here
/*
* Ok, the dst pointer is now 32bit aligned, and we know
* that we must have more than 4 bytes to copy. Note
* that C contains the carry from the dst alignment above.
*/
tst src, #3 @ Test source alignment
bne .src_not_aligned
/* Routine for src & dst aligned */
bics ip, len, #15
beq 2f
1: load4l r4, r5, r6, r7
stmia dst!, {r4, r5, r6, r7}
adcs sum, sum, r4
adcs sum, sum, r5
adcs sum, sum, r6
adcs sum, sum, r7
sub ip, ip, #16
teq ip, #0
bne 1b
2: ands ip, len, #12
beq 4f
tst ip, #8
beq 3f
load2l r4, r5
stmia dst!, {r4, r5}
adcs sum, sum, r4
adcs sum, sum, r5
tst ip, #4
beq 4f
3: load1l r4
str r4, [dst], #4
adcs sum, sum, r4
4: ands len, len, #3
beq .done
load1l r4
tst len, #2
beq .exit
adcs sum, sum, r4, lsl #16
strb r4, [dst], #1
mov r4, r4, lsr #8
strb r4, [dst], #1
mov r4, r4, lsr #8
.exit: tst len, #1
strneb r4, [dst], #1
andne r4, r4, #255
adcnes sum, sum, r4
/*
* If the dst pointer was not 16-bit aligned, we
* need to rotate the checksum here to get around
* the inefficient byte manipulations in the
* architecture independent code.
*/
.done: adc r0, sum, #0
ldr sum, [sp, #0] @ dst
tst sum, #1
movne sum, r0, lsl #8
orrne r0, sum, r0, lsr #24
load_regs ea
.src_not_aligned:
adc sum, sum, #0 @ include C from dst alignment
and ip, src, #3
bic src, src, #3
load1l r4
cmp ip, #2
beq .src2_aligned
bhi .src3_aligned
mov r4, r4, lsr #8 @ C = 0
bics ip, len, #15
beq 2f
1: load4l r5, r6, r7, r8
orr r4, r4, r5, lsl #24
mov r5, r5, lsr #8
orr r5, r5, r6, lsl #24
mov r6, r6, lsr #8
orr r6, r6, r7, lsl #24
mov r7, r7, lsr #8
orr r7, r7, r8, lsl #24
stmia dst!, {r4, r5, r6, r7}
adcs sum, sum, r4
adcs sum, sum, r5
adcs sum, sum, r6
adcs sum, sum, r7
mov r4, r8, lsr #8
sub ip, ip, #16
teq ip, #0
bne 1b
2: ands ip, len, #12
beq 4f
tst ip, #8
beq 3f
load2l r5, r6
orr r4, r4, r5, lsl #24
mov r5, r5, lsr #8
orr r5, r5, r6, lsl #24
stmia dst!, {r4, r5}
adcs sum, sum, r4
adcs sum, sum, r5
mov r4, r6, lsr #8
tst ip, #4
beq 4f
3: load1l r5
orr r4, r4, r5, lsl #24
str r4, [dst], #4
adcs sum, sum, r4
mov r4, r5, lsr #8
4: ands len, len, #3
beq .done
tst len, #2
beq .exit
adcs sum, sum, r4, lsl #16
strb r4, [dst], #1
mov r4, r4, lsr #8
strb r4, [dst], #1
mov r4, r4, lsr #8
b .exit
.src2_aligned: mov r4, r4, lsr #16
adds sum, sum, #0
bics ip, len, #15
beq 2f
1: load4l r5, r6, r7, r8
orr r4, r4, r5, lsl #16
mov r5, r5, lsr #16
orr r5, r5, r6, lsl #16
mov r6, r6, lsr #16
orr r6, r6, r7, lsl #16
mov r7, r7, lsr #16
orr r7, r7, r8, lsl #16
stmia dst!, {r4, r5, r6, r7}
adcs sum, sum, r4
adcs sum, sum, r5
adcs sum, sum, r6
adcs sum, sum, r7
mov r4, r8, lsr #16
sub ip, ip, #16
teq ip, #0
bne 1b
2: ands ip, len, #12
beq 4f
tst ip, #8
beq 3f
load2l r5, r6
orr r4, r4, r5, lsl #16
mov r5, r5, lsr #16
orr r5, r5, r6, lsl #16
stmia dst!, {r4, r5}
adcs sum, sum, r4
adcs sum, sum, r5
mov r4, r6, lsr #16
tst ip, #4
beq 4f
3: load1l r5
orr r4, r4, r5, lsl #16
str r4, [dst], #4
adcs sum, sum, r4
mov r4, r5, lsr #16
4: ands len, len, #3
beq .done
tst len, #2
beq .exit
adcs sum, sum, r4, lsl #16
strb r4, [dst], #1
mov r4, r4, lsr #8
strb r4, [dst], #1
tst len, #1
beq .done
load1b r4
b .exit
.src3_aligned: mov r4, r4, lsr #24
adds sum, sum, #0
bics ip, len, #15
beq 2f
1: load4l r5, r6, r7, r8
orr r4, r4, r5, lsl #8
mov r5, r5, lsr #24
orr r5, r5, r6, lsl #8
mov r6, r6, lsr #24
orr r6, r6, r7, lsl #8
mov r7, r7, lsr #24
orr r7, r7, r8, lsl #8
stmia dst!, {r4, r5, r6, r7}
adcs sum, sum, r4
adcs sum, sum, r5
adcs sum, sum, r6
adcs sum, sum, r7
mov r4, r8, lsr #24
sub ip, ip, #16
teq ip, #0
bne 1b
2: ands ip, len, #12
beq 4f
tst ip, #8
beq 3f
load2l r5, r6
orr r4, r4, r5, lsl #8
mov r5, r5, lsr #24
orr r5, r5, r6, lsl #8
stmia dst!, {r4, r5}
adcs sum, sum, r4
adcs sum, sum, r5
mov r4, r6, lsr #24
tst ip, #4
beq 4f
3: load1l r5
orr r4, r4, r5, lsl #8
str r4, [dst], #4
adcs sum, sum, r4
mov r4, r5, lsr #24
4: ands len, len, #3
beq .done
tst len, #2
beq .exit
adcs sum, sum, r4, lsl #16
strb r4, [dst], #1
load1l r4
strb r4, [dst], #1
adcs sum, sum, r4, lsl #24
mov r4, r4, lsr #8
b .exit
......@@ -15,10 +15,6 @@
.text
/* Function: __u32 csum_partial_copy_from_user (const char *src, char *dst, int len, __u32 sum, int *err_ptr)
* Params : r0 = src, r1 = dst, r2 = len, r3 = sum, [sp, #0] = &err
* Returns : r0 = checksum, [[sp, #0], #0] = 0 or -EFAULT
*/
#if defined(CONFIG_CPU_32)
.macro save_regs
......@@ -152,253 +148,16 @@
#error Unknown CPU architecture
#endif
ENTRY(csum_partial_copy_from_user)
mov ip, sp
save_regs
sub fp, ip, #4
cmp r2, #4
blt .too_small
tst r1, #2 @ Test destination alignment
beq .dst_aligned
load2b ip, r8
subs r2, r2, #2 @ We do not know if SRC is aligned...
orr ip, ip, r8, lsl #8
adds r3, r3, ip
adcs r3, r3, #0
strb ip, [r1], #1
mov ip, ip, lsr #8
strb ip, [r1], #1 @ Destination now aligned
.dst_aligned: tst r0, #3
bne .src_not_aligned
adds r3, r3, #0
bics ip, r2, #15 @ Routine for src & dst aligned
beq 2f
1: load4l r4, r5, r6, r7
stmia r1!, {r4, r5, r6, r7}
adcs r3, r3, r4
adcs r3, r3, r5
adcs r3, r3, r6
adcs r3, r3, r7
sub ip, ip, #16
teq ip, #0
bne 1b
2: ands ip, r2, #12
beq 4f
tst ip, #8
beq 3f
load2l r4, r5
stmia r1!, {r4, r5}
adcs r3, r3, r4
adcs r3, r3, r5
tst ip, #4
beq 4f
3: load1l r4
str r4, [r1], #4
adcs r3, r3, r4
4: ands r2, r2, #3
adceq r0, r3, #0
load_regs eqea
load1l r4
tst r2, #2
beq .exit
adcs r3, r3, r4, lsl #16
strb r4, [r1], #1
mov r4, r4, lsr #8
strb r4, [r1], #1
mov r4, r4, lsr #8
.exit: tst r2, #1
strneb r4, [r1], #1
andne r4, r4, #255
adcnes r3, r3, r4
adcs r0, r3, #0
load_regs ea
.too_small: teq r2, #0
load_regs eqea
cmp r2, #2
blt .too_small1
load2b ip, r8
orr ip, ip, r8, lsl #8
adds r3, r3, ip
strb ip, [r1], #1
strb r8, [r1], #1
tst r2, #1
.too_small1: @ C = 0
beq .csum_exit
load1b ip
strb ip, [r1], #1
adcs r3, r3, ip
.csum_exit: adc r0, r3, #0
load_regs ea
.src_not_aligned:
cmp r2, #4
blt .too_small
and ip, r0, #3
bic r0, r0, #3
load1l r4
cmp ip, #2
beq .src2_aligned
bhi .src3_aligned
mov r4, r4, lsr #8
adds r3, r3, #0
bics ip, r2, #15
beq 2f
1: load4l r5, r6, r7, r8
orr r4, r4, r5, lsl #24
mov r5, r5, lsr #8
orr r5, r5, r6, lsl #24
mov r6, r6, lsr #8
orr r6, r6, r7, lsl #24
mov r7, r7, lsr #8
orr r7, r7, r8, lsl #24
stmia r1!, {r4, r5, r6, r7}
adcs r3, r3, r4
adcs r3, r3, r5
adcs r3, r3, r6
adcs r3, r3, r7
mov r4, r8, lsr #8
sub ip, ip, #16
teq ip, #0
bne 1b
2: ands ip, r2, #12
beq 4f
tst ip, #8
beq 3f
load2l r5, r6
orr r4, r4, r5, lsl #24
mov r5, r5, lsr #8
orr r5, r5, r6, lsl #24
stmia r1!, {r4, r5}
adcs r3, r3, r4
adcs r3, r3, r5
mov r4, r6, lsr #8
tst ip, #4
beq 4f
3: load1l r5
orr r4, r4, r5, lsl #24
str r4, [r1], #4
adcs r3, r3, r4
mov r4, r5, lsr #8
4: ands r2, r2, #3
adceq r0, r3, #0
load_regs eqea
tst r2, #2
beq .exit
adcs r3, r3, r4, lsl #16
strb r4, [r1], #1
mov r4, r4, lsr #8
strb r4, [r1], #1
mov r4, r4, lsr #8
b .exit
/*
* unsigned int
* csum_partial_copy_from_user(const char *src, char *dst, int len, int sum, int *err_ptr)
* r0 = src, r1 = dst, r2 = len, r3 = sum, [sp] = *err_ptr
* Returns : r0 = checksum, [[sp, #0], #0] = 0 or -EFAULT
*/
.src2_aligned: mov r4, r4, lsr #16
adds r3, r3, #0
bics ip, r2, #15
beq 2f
1: load4l r5, r6, r7, r8
orr r4, r4, r5, lsl #16
mov r5, r5, lsr #16
orr r5, r5, r6, lsl #16
mov r6, r6, lsr #16
orr r6, r6, r7, lsl #16
mov r7, r7, lsr #16
orr r7, r7, r8, lsl #16
stmia r1!, {r4, r5, r6, r7}
adcs r3, r3, r4
adcs r3, r3, r5
adcs r3, r3, r6
adcs r3, r3, r7
mov r4, r8, lsr #16
sub ip, ip, #16
teq ip, #0
bne 1b
2: ands ip, r2, #12
beq 4f
tst ip, #8
beq 3f
load2l r5, r6
orr r4, r4, r5, lsl #16
mov r5, r5, lsr #16
orr r5, r5, r6, lsl #16
stmia r1!, {r4, r5}
adcs r3, r3, r4
adcs r3, r3, r5
mov r4, r6, lsr #16
tst ip, #4
beq 4f
3: load1l r5
orr r4, r4, r5, lsl #16
str r4, [r1], #4
adcs r3, r3, r4
mov r4, r5, lsr #16
4: ands r2, r2, #3
adceq r0, r3, #0
load_regs eqea
tst r2, #2
beq .exit
adcs r3, r3, r4, lsl #16
strb r4, [r1], #1
mov r4, r4, lsr #8
strb r4, [r1], #1
tst r2, #1
adceq r0, r3, #0
load_regs eqea
load1b r4
b .exit
#define FN_ENTRY ENTRY(csum_partial_copy_from_user)
.src3_aligned: mov r4, r4, lsr #24
adds r3, r3, #0
bics ip, r2, #15
beq 2f
1: load4l r5, r6, r7, r8
orr r4, r4, r5, lsl #8
mov r5, r5, lsr #24
orr r5, r5, r6, lsl #8
mov r6, r6, lsr #24
orr r6, r6, r7, lsl #8
mov r7, r7, lsr #24
orr r7, r7, r8, lsl #8
stmia r1!, {r4, r5, r6, r7}
adcs r3, r3, r4
adcs r3, r3, r5
adcs r3, r3, r6
adcs r3, r3, r7
mov r4, r8, lsr #24
sub ip, ip, #16
teq ip, #0
bne 1b
2: ands ip, r2, #12
beq 4f
tst ip, #8
beq 3f
load2l r5, r6
orr r4, r4, r5, lsl #8
mov r5, r5, lsr #24
orr r5, r5, r6, lsl #8
stmia r1!, {r4, r5}
adcs r3, r3, r4
adcs r3, r3, r5
mov r4, r6, lsr #24
tst ip, #4
beq 4f
3: load1l r5
orr r4, r4, r5, lsl #8
str r4, [r1], #4
adcs r3, r3, r4
mov r4, r5, lsr #24
4: ands r2, r2, #3
adceq r0, r3, #0
load_regs eqea
tst r2, #2
beq .exit
adcs r3, r3, r4, lsl #16
strb r4, [r1], #1
load1l r4
strb r4, [r1], #1
adcs r3, r3, r4, lsl #24
mov r4, r4, lsr #8
b .exit
#include "csumpartialcopygeneric.S"
/*
* FIXME: minor buglet here
......@@ -411,13 +170,13 @@ ENTRY(csum_partial_copy_from_user)
#endif
.align 4
6001: mov r4, #-EFAULT
ldr r5, [fp, #4]
ldr r5, [fp, #4] @ *err_ptr
str r4, [r5]
ldmia sp, {r1, r2} @ retrieve original arguments
ldmia sp, {r1, r2} @ retrieve dst, len
add r2, r2, r1
mov r3, #0 @ zero the buffer
mov r0, #0 @ zero the buffer
6002: teq r2, r1
strneb r3, [r1], #1
strneb r0, [r1], #1
bne 6002b
load_regs ea
#if defined(CONFIG_CPU_32)
......
......@@ -132,7 +132,7 @@ union offset_union {
#define get8_unaligned_check(val,addr,err) \
__asm__( \
"1: ldrb %1, [%2]\n" \
"1: ldrb %1, [%2], #1\n" \
"2:\n" \
" .section .fixup,\"ax\"\n" \
" .align 2\n" \
......@@ -148,7 +148,7 @@ union offset_union {
#define get8t_unaligned_check(val,addr,err) \
__asm__( \
"1: ldrbt %1, [%2]\n" \
"1: ldrbt %1, [%2], #1\n" \
"2:\n" \
" .section .fixup,\"ax\"\n" \
" .align 2\n" \
......
......@@ -44,12 +44,13 @@ SECTIONS
*(.rodata)
*(.glue_7)
*(.glue_7t)
*(.kstrtab)
*(.got) /* Global offset table */
_etext = .; /* End of text section */
}
.kstrtab : { *(.kstrtab) }
. = ALIGN(16);
__ex_table : { /* Exception table */
__start___ex_table = .;
......
/* $Id: gpio.c,v 1.4 2001/02/27 13:52:48 bjornw Exp $
/* $Id: gpio.c,v 1.7 2001/04/04 13:30:08 matsfg Exp $
*
* Etrax general port I/O device
*
......@@ -9,6 +9,15 @@
* Johan Adolfsson (read/set directions)
*
* $Log: gpio.c,v $
* Revision 1.7 2001/04/04 13:30:08 matsfg
* Added bitset and bitclear for leds. Calls init_ioremap to set up memmapping
*
* Revision 1.6 2001/03/26 16:03:06 bjornw
* Needs linux/config.h
*
* Revision 1.5 2001/03/26 14:22:03 bjornw
* Namechange of some config options
*
* Revision 1.4 2001/02/27 13:52:48 bjornw
* malloc.h -> slab.h
*
......@@ -25,6 +34,7 @@
*/
#include <linux/config.h>
#include <linux/module.h>
#include <linux/sched.h>
#include <linux/slab.h>
......@@ -78,25 +88,25 @@ static volatile unsigned char *shads[2] = {
&port_pa_data_shadow, &port_pb_data_shadow };
/* What direction bits that are user changeable 1=changeable*/
#ifndef CONFIG_PA_CHANGEABLE_DIR
#define CONFIG_PA_CHANGEABLE_DIR 0x00
#ifndef CONFIG_ETRAX_PA_CHANGEABLE_DIR
#define CONFIG_ETRAX_PA_CHANGEABLE_DIR 0x00
#endif
#ifndef CONFIG_PB_CHANGEABLE_DIR
#define CONFIG_PB_CHANGEABLE_DIR 0x00
#ifndef CONFIG_ETRAX_PB_CHANGEABLE_DIR
#define CONFIG_ETRAX_PB_CHANGEABLE_DIR 0x00
#endif
#ifndef CONFIG_PA_CHANGEABLE_BITS
#define CONFIG_PA_CHANGEABLE_BITS 0xFF
#ifndef CONFIG_ETRAX_PA_CHANGEABLE_BITS
#define CONFIG_ETRAX_PA_CHANGEABLE_BITS 0xFF
#endif
#ifndef CONFIG_PB_CHANGEABLE_BITS
#define CONFIG_PB_CHANGEABLE_BITS 0xFF
#ifndef CONFIG_ETRAX_PB_CHANGEABLE_BITS
#define CONFIG_ETRAX_PB_CHANGEABLE_BITS 0xFF
#endif
static unsigned char changeable_dir[2] = { CONFIG_PA_CHANGEABLE_DIR,
CONFIG_PB_CHANGEABLE_DIR };
static unsigned char changeable_bits[2] = { CONFIG_PA_CHANGEABLE_BITS,
CONFIG_PB_CHANGEABLE_BITS };
static unsigned char changeable_dir[2] = { CONFIG_ETRAX_PA_CHANGEABLE_DIR,
CONFIG_ETRAX_PB_CHANGEABLE_DIR };
static unsigned char changeable_bits[2] = { CONFIG_ETRAX_PA_CHANGEABLE_BITS,
CONFIG_ETRAX_PB_CHANGEABLE_BITS };
static volatile unsigned char *dir[2] = { R_PORT_PA_DIR, R_PORT_PB_DIR };
......@@ -240,7 +250,7 @@ gpio_ioctl(struct inode *inode, struct file *file,
default:
if(priv->minor == LEDS)
return gpio_leds_ioctl(cmd, arg);
else
else
return -EINVAL;
}
......@@ -252,7 +262,12 @@ gpio_leds_ioctl(unsigned int cmd, unsigned long arg)
{
unsigned char green;
unsigned char red;
static int initialized = 0;
if(!initialized)
{
initialized = 1;
init_ioremap();
}
switch (_IOC_NR(cmd)) {
case IO_LEDACTIVE_SET:
green = ((unsigned char) arg) & 1;
......@@ -260,6 +275,11 @@ gpio_leds_ioctl(unsigned int cmd, unsigned long arg)
LED_ACTIVE_SET_G(green);
LED_ACTIVE_SET_R(red);
break;
case IO_LED_SETBIT:
LED_BIT_SET(arg);
break;
case IO_LED_CLRBIT:
LED_BIT_CLR(arg);
default:
return -EINVAL;
}
......
This diff is collapsed.
/* $Id: i2c.h,v 1.2 2001/01/18 15:49:30 bjornw Exp $ */
/* $Id: i2c.h,v 1.3 2001/03/19 12:43:01 markusl Exp $ */
/* High level I2C actions */
int i2c_writereg(unsigned char theSlave, unsigned char theReg, unsigned char theValue);
unsigned char i2c_readreg(unsigned char theSlave, unsigned char theReg);
/* Low level I2C */
static void i2c_start(void);
static void i2c_stop(void);
static void i2c_outbyte(unsigned char x);
static unsigned char i2c_inbyte(void);
static int i2c_getack(void);
static void i2c_sendack(void);
void i2c_start(void);
void i2c_stop(void);
void i2c_outbyte(unsigned char x);
unsigned char i2c_inbyte(void);
int i2c_getack(void);
void i2c_sendack(void);
/*
* Machine Check Handler For PII/PIII
*/
#include <linux/init.h>
#include <linux/types.h>
#include <linux/kernel.h>
#include <linux/sched.h>
#include <asm/processor.h>
#include <asm/msr.h>
/*
* Machine Check Handler For PII/PIII
*/
static int banks;
void do_machine_check(struct pt_regs * regs, long error_code)
static void intel_machine_check(struct pt_regs * regs, long error_code)
{
int recover=1;
u32 alow, ahigh, high, low;
......@@ -62,28 +64,101 @@ void do_machine_check(struct pt_regs * regs, long error_code)
wrmsr(0x17a,mcgstl, mcgsth);
}
/*
* Machine check handler for Pentium class Intel
*/
static void pentium_machine_check(struct pt_regs * regs, long error_code)
{
u32 loaddr, hi, lotype;
rdmsr(0x0, loaddr, hi);
rdmsr(0x1, lotype, hi);
printk(KERN_EMERG "CPU#%d: Machine Check Exception: 0x%8X (type 0x%8X).\n", smp_processor_id(), loaddr, lotype);
if(lotype&(1<<5))
printk(KERN_EMERG "CPU#%d: Possible thermal failure (CPU on fire ?).\n", smp_processor_id());
}
/*
* This has to be run for each processor
* Machine check handler for WinChip C6
*/
static void winchip_machine_check(struct pt_regs * regs, long error_code)
{
printk(KERN_EMERG "CPU#%d: Machine Check Exception.\n", smp_processor_id());
}
/*
* Handle unconfigured int18 (should never happen)
*/
static void unexpected_machine_check(struct pt_regs * regs, long error_code)
{
printk(KERN_ERR "CPU#%d: Unexpected int18 (Machine Check).\n", smp_processor_id());
}
/*
* Call the installed machine check handler for this CPU setup.
*/
void mcheck_init(struct cpuinfo_x86 *c)
static void (*machine_check_vector)(struct pt_regs *, long error_code) = unexpected_machine_check;
void do_machine_check(struct pt_regs * regs, long error_code)
{
machine_check_vector(regs, error_code);
}
/*
* Set up machine check reporting for Intel processors
*/
void __init intel_mcheck_init(struct cpuinfo_x86 *c)
{
u32 l, h;
int i;
static int done;
if( c->x86_vendor != X86_VENDOR_INTEL )
return;
/*
* Check for MCE support
*/
if( !test_bit(X86_FEATURE_MCE, &c->x86_capability) )
return;
/*
* Pentium machine check
*/
if(c->x86 == 5)
{
machine_check_vector = pentium_machine_check;
wmb();
/* Read registers before enabling */
rdmsr(0x0, l, h);
rdmsr(0x1, l, h);
if(done==0)
printk(KERN_INFO "Intel old style machine check architecture supported.\n");
/* Enable MCE */
__asm__ __volatile__ (
"movl %%cr4, %%eax\n\t"
"orl $0x40, %%eax\n\t"
"movl %%eax, %%cr4\n\t" : : : "eax");
printk(KERN_INFO "Intel old style machine check reporting enabled on CPU#%d.\n", smp_processor_id());
return;
}
/*
* Check for PPro style MCA
*/
if( !test_bit(X86_FEATURE_MCA, &c->x86_capability) )
return;
/* Ok machine check is available */
machine_check_vector = intel_machine_check;
wmb();
if(done==0)
printk(KERN_INFO "Intel machine check architecture supported.\n");
rdmsr(0x179, l, h);
......@@ -105,3 +180,52 @@ void mcheck_init(struct cpuinfo_x86 *c)
printk(KERN_INFO "Intel machine check reporting enabled on CPU#%d.\n", smp_processor_id());
done=1;
}
/*
* Set up machine check reporting on the Winchip C6 series
*/
static void winchip_mcheck_init(struct cpuinfo_x86 *c)
{
u32 lo, hi;
/* Not supported on C3 */
if(c->x86 != 5)
return;
/* Winchip C6 */
machine_check_vector = winchip_machine_check;
wmb();
rdmsr(0x107, lo, hi);
lo|= (1<<2); /* Enable EIERRINT (int 18 MCE) */
lo&= ~(1<<4); /* Enable MCE */
wrmsr(0x107, lo, hi);
__asm__ __volatile__ (
"movl %%cr4, %%eax\n\t"
"orl $0x40, %%eax\n\t"
"movl %%eax, %%cr4\n\t" : : : "eax");
printk(KERN_INFO "Winchip machine check reporting enabled on CPU#%d.\n", smp_processor_id());
}
/*
* This has to be run for each processor
*/
void __init mcheck_init(struct cpuinfo_x86 *c)
{
switch(c->x86_vendor)
{
case X86_VENDOR_AMD:
/*
* AMD K7 machine check is Intel like
*/
if(c->x86 == 6)
intel_mcheck_init(c);
break;
case X86_VENDOR_INTEL:
intel_mcheck_init(c);
break;
case X86_VENDOR_CENTAUR:
winchip_mcheck_init(c);
break;
}
}
......@@ -350,3 +350,35 @@ void pcibios_set_master(struct pci_dev *dev)
printk("PCI: Setting latency timer of device %s to %d\n", dev->slot_name, lat);
pci_write_config_byte(dev, PCI_LATENCY_TIMER, lat);
}
int pci_mmap_page_range(struct pci_dev *dev, struct vm_area_struct *vma,
enum pci_mmap_state mmap_state, int write_combine)
{
unsigned long prot;
/* I/O space cannot be accessed via normal processor loads and
* stores on this platform.
*/
if (mmap_state == pci_mmap_io)
return -EINVAL;
/* Leave vm_pgoff as-is, the PCI space address is the physical
* address on this platform.
*/
vma->vm_flags |= (VM_SHM | VM_LOCKED | VM_IO);
prot = pgprot_val(vma->vm_page_prot);
if (boot_cpu_data.x86 > 3)
prot |= _PAGE_PCD | _PAGE_PWT;
vma->vm_page_prot = __pgprot(prot);
/* Write-combine setting is ignored, it is changed via the mtrr
* interfaces on this platform.
*/
if (remap_page_range(vma->vm_start, vma->vm_pgoff << PAGE_SHIFT,
vma->vm_end - vma->vm_start,
vma->vm_page_prot))
return -EAGAIN;
return 0;
}
......@@ -51,49 +51,3 @@ ENTRY(__up_wakeup)
moveml (%sp)+,%a0/%d0/%d1
rts
ENTRY(__down_read_failed)
moveml %a0/%d0/%d1,-(%sp)
jcc 3f
1: movel %a1,-(%sp)
jbsr SYMBOL_NAME(down_read_failed_biased)
movel (%sp)+,%a1
2: moveml (%sp)+,%a0/%d0/%d1
rts
3: movel %a1,-(%sp)
jbsr SYMBOL_NAME(down_read_failed)
movel (%sp)+,%a1
subql #1,%a1@
jpl 2b
jcc 3b
jra 1b
ENTRY(__down_write_failed)
moveml %a0/%d0/%d1,-(%sp)
jcc 3f
1: movel %a1,-(%sp)
jbsr SYMBOL_NAME(down_write_failed_biased)
movel (%sp)+,%a1
2: moveml (%sp)+,%a0/%d0/%d1
rts
3: movel %a1,-(%sp)
jbsr SYMBOL_NAME(down_write_failed)
movel (%sp)+,%a1
subl #RW_LOCK_BIAS,%a1@
jpl 2b
jcc 3b
jra 1b
ENTRY(__rwsem_wake)
moveml %a0/%d0/%d1,-(%sp)
jeq 1f
movel %a1,-(%sp)
jbsr SYMBOL_NAME(rwsem_wake_readers)
jra 2f
1: movel %a1,-(%sp)
jbsr rwsem_wake_writer
2: movel (%sp)+,%a1
moveml (%sp)+,%a0/%d0/%d1
rts
......@@ -246,6 +246,10 @@ unsigned long mm_vtop(unsigned long vaddr)
voff -= m68k_memory[i].size;
} while (++i < m68k_num_memory);
/* As a special case allow `__pa(high_memory)'. */
if (voff == 0)
return m68k_memory[i-1].addr + m68k_memory[i-1].size;
return mm_vtop_fallback(vaddr);
}
#endif
......
......@@ -141,48 +141,9 @@ znetboot: $(CHECKS) vmlinux
@$(MAKECHRPBOOT) $@
endif
.PHONY: clean_config
clean_config:
%_config: arch/ppc/configs/%_defconfig
rm -f .config arch/ppc/defconfig
gemini_config: clean_config
cp -f arch/ppc/configs/gemini_defconfig arch/ppc/defconfig
pmac_config: clean_config
cp -f arch/ppc/configs/pmac_defconfig arch/ppc/defconfig
prep_config: clean_config
cp -f arch/ppc/configs/prep_defconfig arch/ppc/defconfig
chrp_config: clean_config
cp -f arch/ppc/configs/chrp_defconfig arch/ppc/defconfig
common_config: clean_config
cp -f arch/ppc/configs/common_defconfig arch/ppc/defconfig
mbx_config: clean_config
cp -f arch/ppc/configs/mbx_defconfig arch/ppc/defconfig
apus_config: clean_config
cp -f arch/ppc/configs/apus_defconfig arch/ppc/defconfig
oak_config: clean_config
cp -f arch/ppc/configs/oak_defconfig arch/ppc/defconfig
walnut_config: clean_config
cp -f arch/ppc/configs/walnut_defconfig arch/ppc/defconfig
rpxlite_config: clean_config
cp -f arch/ppc/configs/rpxlite_defconfig arch/ppc/defconfig
rpxcllf_config: clean_config
cp -f arch/ppc/configs/rpxcllf_defconfig arch/ppc/defconfig
bseip_config: clean_config
cp -f arch/ppc/configs/bseip_defconfig arch/ppc/defconfig
est8260_config: clean_config
cp -f arch/ppc/configs/est8260_defconfig arch/ppc/defconfig
cp -f arch/ppc/configs/$(@:config=defconfig) arch/ppc/defconfig
archclean:
rm -f arch/ppc/kernel/{mk_defs,ppc_defs.h,find_name,checks}
......
......@@ -14,6 +14,6 @@ export-objs := amiga_ksyms.o
obj-y := config.o amiints.o cia.o time.o bootinfo.o amisound.o \
chipram.o amiga_ksyms.o
obj-$(CONFIG_AMIGA_PCMCIA) += pcmia.o
obj-$(CONFIG_AMIGA_PCMCIA) += pcmcia.o
include $(TOPDIR)/Rules.make
......@@ -255,9 +255,10 @@ void amiga_free_irq(unsigned int irq, void *dev_id)
return;
}
if (irq >= IRQ_AMIGA_AUTO)
if (irq >= IRQ_AMIGA_AUTO) {
sys_free_irq(irq - IRQ_AMIGA_AUTO, dev_id);
return;
}
if (irq >= IRQ_AMIGA_CIAA) {
cia_free_irq(irq, dev_id);
return;
......@@ -295,7 +296,10 @@ void amiga_enable_irq(unsigned int irq)
return;
}
if (--ami_ablecount[irq])
ami_ablecount[irq]--;
if (ami_ablecount[irq]<0)
ami_ablecount[irq]=0;
else if (ami_ablecount[irq])
return;
/* No action for auto-vector interrupts */
......@@ -347,64 +351,16 @@ inline void amiga_do_irq(int irq, struct pt_regs *fp)
ami_irq_list[irq]->handler(irq, ami_irq_list[irq]->dev_id, fp);
}
void amiga_do_irq_list(int irq, struct pt_regs *fp, struct irq_server *server)
void amiga_do_irq_list(int irq, struct pt_regs *fp)
{
irq_node_t *node, *slow_nodes;
unsigned short intena;
unsigned long flags;
irq_node_t *node;
kstat.irqs[0][SYS_IRQS + irq]++;
if (server->count++)
server->reentrance = 1;
intena = ami_intena_vals[irq];
custom.intreq = intena;
custom.intreq = ami_intena_vals[irq];
/* serve first fast handlers - there can only be one of these */
node = ami_irq_list[irq];
/*
* Timer interrupts show up like this
*/
if (!node) {
server->count--;
return;
}
if (node && (node->flags & SA_INTERRUPT)) {
save_flags(flags);
cli();
for (node = ami_irq_list[irq]; node; node = node->next)
node->handler(irq, node->dev_id, fp);
restore_flags(flags);
server->count--;
return;
}
/*
* Disable the interrupt source in question and reenable all
* other interrupts. No interrupt handler should ever touch
* the intena flags directly!
*/
custom.intena = intena;
save_flags(flags);
sti();
slow_nodes = node;
for (;;) {
for (; node; node = node->next)
node->handler(irq, node->dev_id, fp);
if (!server->reentrance) {
server->count--;
restore_flags(flags);
custom.intena = IF_SETCLR | intena;
return;
}
server->reentrance = 0;
node = slow_nodes;
}
}
/*
......@@ -437,7 +393,6 @@ static void ami_int1(int irq, void *dev_id, struct pt_regs *fp)
static void ami_int3(int irq, void *dev_id, struct pt_regs *fp)
{
unsigned short ints = custom.intreqr & custom.intenar;
static struct irq_server server = {0, 0};
/* if a blitter interrupt */
if (ints & IF_BLIT) {
......@@ -453,7 +408,7 @@ static void ami_int3(int irq, void *dev_id, struct pt_regs *fp)
/* if a vertical blank interrupt */
if (ints & IF_VERTB)
amiga_do_irq_list(IRQ_AMIGA_VERTB, fp, &server);
amiga_do_irq_list(IRQ_AMIGA_VERTB, fp);
}
static void ami_int4(int irq, void *dev_id, struct pt_regs *fp)
......@@ -512,7 +467,7 @@ static void ami_int7(int irq, void *dev_id, struct pt_regs *fp)
and executes them in a loop. Having ami_badint at the end of the chain
is a bad idea. */
void (*amiga_default_handler[SYS_IRQS])(int, void *, struct pt_regs *) = {
NULL, ami_int1, NULL, NULL /* FB expects to replace ami_int3*/,
NULL, ami_int1, NULL, ami_int3,
ami_int4, ami_int5, NULL, ami_int7
};
#else
......
/*
** linux/amiga/chipram.c
**
** Modified 03-May-94 by Geert Uytterhoeven <geert@linux-m68k.org>
** - 64-bit aligned allocations for full AGA compatibility
*/
#include <linux/config.h>
#include <linux/types.h>
#include <linux/kernel.h>
#include <linux/init.h>
#include <linux/zorro.h>
#include <asm/amigahw.h>
struct chip_desc {
unsigned first : 1;
unsigned last : 1;
unsigned alloced : 1;
unsigned length : 24;
long pad; /* We suppose this makes this struct 64 bits long!! */
};
#define DP(ptr) ((struct chip_desc *)(ptr))
u_long amiga_chip_size;
static unsigned long chipavail;
static struct resource chipram = { "Chip RAM", 0 };
unsigned long amiga_chip_avail( void )
{
#ifdef DEBUG
printk("chip_avail : %ld bytes\n",chipavail);
#endif
return chipavail;
}
void __init amiga_chip_init (void)
{
struct chip_desc *dp;
if (!AMIGAHW_PRESENT(CHIP_RAM))
return;
#ifndef CONFIG_APUS_FAST_EXCEPT
/*
* Remove the first 4 pages where PPC exception handlers will
* be located.
*/
amiga_chip_size -= 0x4000;
#endif
chipram.end = amiga_chip_size-1;
request_resource(&iomem_resource, &chipram);
/* initialize start boundary */
dp = DP(chipaddr);
dp->first = 1;
dp->alloced = 0;
dp->length = amiga_chip_size - 2*sizeof(*dp);
/* initialize end boundary */
dp = DP(chipaddr + amiga_chip_size) - 1;
dp->last = 1;
dp->alloced = 0;
dp->length = amiga_chip_size - 2*sizeof(*dp);
chipavail = dp->length; /*MILAN*/
#ifdef DEBUG
printk ("chipram end boundary is %p, length is %d\n", dp,
dp->length);
#endif
}
void *amiga_chip_alloc(long size, const char *name)
{
/* last chunk */
struct chip_desc *dp;
void *ptr;
/* round off */
size = (size + 7) & ~7;
#ifdef DEBUG
printk("amiga_chip_alloc: allocate %ld bytes\n", size);
#endif
/*
* get pointer to descriptor for last chunk by
* going backwards from end chunk
*/
dp = DP(chipaddr + amiga_chip_size) - 1;
dp = DP((unsigned long)dp - dp->length) - 1;
while ((dp->alloced || dp->length < size)
&& !dp->first)
dp = DP ((unsigned long)dp - dp[-1].length) - 2;
if (dp->alloced || dp->length < size) {
printk ("no chipmem available for %ld allocation\n", size);
return NULL;
}
if (dp->length < (size + 2*sizeof(*dp))) {
/* length too small to split; allocate the whole thing */
dp->alloced = 1;
ptr = (void *)(dp+1);
dp = DP((unsigned long)ptr + dp->length);
dp->alloced = 1;
#ifdef DEBUG
printk ("amiga_chip_alloc: no split\n");
#endif
} else {
/* split the extent; use the end part */
long newsize = dp->length - (2*sizeof(*dp) + size);
#ifdef DEBUG
printk ("amiga_chip_alloc: splitting %d to %ld\n", dp->length,
newsize);
#endif
dp->length = newsize;
dp = DP((unsigned long)(dp+1) + newsize);
dp->first = dp->last = 0;
dp->alloced = 0;
dp->length = newsize;
dp++;
dp->first = dp->last = 0;
dp->alloced = 1;
dp->length = size;
ptr = (void *)(dp+1);
dp = DP((unsigned long)ptr + size);
dp->alloced = 1;
dp->length = size;
}
#ifdef DEBUG
printk ("amiga_chip_alloc: returning %p\n", ptr);
#endif
if ((unsigned long)ptr & 7)
panic("amiga_chip_alloc: alignment violation\n");
chipavail -= size + (2*sizeof(*dp)); /*MILAN*/
if (!request_mem_region(ZTWO_PADDR(ptr), size, name))
printk(KERN_WARNING "amiga_chip_alloc: region of size %ld at 0x%08lx "
"is busy\n", size, ZTWO_PADDR(ptr));
return ptr;
}
void amiga_chip_free (void *ptr)
{
struct chip_desc *sdp = DP(ptr) - 1, *dp2;
struct chip_desc *edp = DP((unsigned long)ptr + sdp->length);
chipavail += sdp->length + (2* sizeof(sdp)); /*MILAN*/
#ifdef DEBUG
printk("chip_free: free %ld bytes at %p\n",sdp->length,ptr);
#endif
/* deallocate the chunk */
sdp->alloced = edp->alloced = 0;
release_mem_region(ZTWO_PADDR(ptr), sdp->length);
/* check if we should merge with the previous chunk */
if (!sdp->first && !sdp[-1].alloced) {
dp2 = DP((unsigned long)sdp - sdp[-1].length) - 2;
dp2->length += sdp->length + 2*sizeof(*sdp);
edp->length = dp2->length;
sdp = dp2;
}
/* check if we should merge with the following chunk */
if (!edp->last && !edp[1].alloced) {
dp2 = DP((unsigned long)edp + edp[1].length) + 2;
dp2->length += edp->length + 2*sizeof(*sdp);
sdp->length = dp2->length;
edp = dp2;
}
}
#include "../../m68k/amiga/chipram.c"
......@@ -27,18 +27,17 @@ struct ciabase {
u_short int_mask;
int handler_irq, cia_irq, server_irq;
char *name;
struct irq_server server;
irq_handler_t irq_list[CIA_IRQS];
} ciaa_base = {
&ciaa, 0, 0, IF_PORTS,
IRQ_AMIGA_AUTO_2, IRQ_AMIGA_CIAA,
IRQ_AMIGA_PORTS,
"CIAA handler", {0, 0}
"CIAA handler"
}, ciab_base = {
&ciab, 0, 0, IF_EXTER,
IRQ_AMIGA_AUTO_6, IRQ_AMIGA_CIAB,
IRQ_AMIGA_EXTER,
"CIAB handler", {0, 0}
"CIAB handler"
};
#define CIA_SET_BASE_ADJUST_IRQ(base, irq) \
......@@ -197,7 +196,7 @@ static void cia_handler(int irq, void *dev_id, struct pt_regs *fp)
}
ints >>= 1;
}
amiga_do_irq_list(base->server_irq, fp, &base->server);
amiga_do_irq_list(base->server_irq, fp);
}
void __init cia_init_IRQ(struct ciabase *base)
......
#define m68k_debug_device debug_device
#include <linux/init.h>
/* machine dependent "kbd-reset" setup function */
void (*mach_kbd_reset_setup) (char *, int) __initdata = 0;
#include <asm/io.h>
/*
* linux/arch/m68k/amiga/config.c
*
......@@ -28,6 +21,10 @@ void (*mach_kbd_reset_setup) (char *, int) __initdata = 0;
#include <linux/kd.h>
#include <linux/tty.h>
#include <linux/console.h>
#include <linux/init.h>
#ifdef CONFIG_ZORRO
#include <linux/zorro.h>
#endif
#include <asm/bootinfo.h>
#include <asm/setup.h>
......@@ -36,10 +33,12 @@ void (*mach_kbd_reset_setup) (char *, int) __initdata = 0;
#include <asm/amigahw.h>
#include <asm/amigaints.h>
#include <asm/irq.h>
#include <asm/keyboard.h>
#include <asm/machdep.h>
#include <linux/zorro.h>
#include <asm/io.h>
unsigned long powerup_PCI_present;
unsigned long powerup_BPPCPLUS_present;
unsigned long amiga_model;
unsigned long amiga_eclock;
unsigned long amiga_masterclock;
......@@ -121,7 +120,7 @@ static struct console amiga_console_driver = {
};
#ifdef CONFIG_MAGIC_SYSRQ
static char amiga_sysrq_xlate[128] =
char amiga_sysrq_xlate[128] =
"\0001234567890-=\\\000\000" /* 0x00 - 0x0f */
"qwertyuiop[]\000123" /* 0x10 - 0x1f */
"asdfghjkl;'\000\000456" /* 0x20 - 0x2f */
......@@ -139,16 +138,18 @@ extern void (*kd_mksound)(unsigned int, unsigned int);
* Motherboard Resources present in all Amiga models
*/
static struct resource mb_res[] = {
{ "Ranger Memory", 0x00c00000, 0x00c7ffff },
{ "CIA B", 0x00bfd000, 0x00bfdfff },
{ "CIA A", 0x00bfe000, 0x00bfefff },
{ "Custom I/O", 0x00dff000, 0x00dfffff },
{ "Kickstart ROM", 0x00f80000, 0x00ffffff }
static struct {
struct resource _ciab, _ciaa, _custom, _kickstart;
} mb_resources = {
// { "Ranger Memory", 0x00c00000, 0x00c7ffff },
_ciab: { "CIA B", 0x00bfd000, 0x00bfdfff },
_ciaa: { "CIA A", 0x00bfe000, 0x00bfefff },
_custom: { "Custom I/O", 0x00dff000, 0x00dfffff },
_kickstart: { "Kickstart ROM", 0x00f80000, 0x00ffffff }
};
static struct resource rtc_resource = {
"A2000 RTC", 0x00dc0000, 0x00dcffff
NULL, 0x00dc0000, 0x00dcffff
};
static struct resource ram_resource[NUM_MEMINFO];
......@@ -194,6 +195,7 @@ int amiga_parse_bootinfo(const struct bi_record *record)
break;
case BI_AMIGA_AUTOCON:
#ifdef CONFIG_ZORRO
if (zorro_num_autocon < ZORRO_NUM_AUTO) {
const struct ConfigDev *cd = (struct ConfigDev *)data;
struct zorro_dev *dev = &zorro_autocon[zorro_num_autocon++];
......@@ -204,12 +206,21 @@ int amiga_parse_bootinfo(const struct bi_record *record)
dev->resource.end = dev->resource.start+cd->cd_BoardSize-1;
} else
printk("amiga_parse_bootinfo: too many AutoConfig devices\n");
#endif /* CONFIG_ZORRO */
break;
case BI_AMIGA_SERPER:
/* serial port period: ignored here */
break;
case BI_AMIGA_PUP_BRIDGE:
powerup_PCI_present = *(const unsigned short *)data;
break;
case BI_AMIGA_BPPC_SCSI:
powerup_BPPCPLUS_present = *(const unsigned short *)data;
break;
default:
unknown = 1;
}
......@@ -392,11 +403,8 @@ void __init config_amiga(void)
/* Some APUS boxes may have PCI memory, but ... */
iomem_resource.name = "Memory";
request_resource(&iomem_resource, &ranger_resource);
request_resource(&iomem_resource, &ciab_resource);
request_resource(&iomem_resource, &ciaa_resource);
request_resource(&iomem_resource, &custom_chips_resource);
request_resource(&iomem_resource, &kickstart_resource);
for (i = 0; i < 4; i++)
request_resource(&iomem_resource, &((struct resource *)&mb_resources)[i]);
mach_sched_init = amiga_sched_init;
mach_keyb_init = amiga_keyb_init;
......@@ -415,11 +423,12 @@ void __init config_amiga(void)
mach_gettimeoffset = amiga_gettimeoffset;
if (AMIGAHW_PRESENT(A3000_CLK)){
mach_gettod = a3000_gettod;
rtc_resource.name[1] = '3';
rtc_resource.name = "A3000 RTC";
request_resource(&iomem_resource, &rtc_resource);
}
else{ /* if (AMIGAHW_PRESENT(A2000_CLK)) */
mach_gettod = a2000_gettod;
rtc_resource.name = "A2000 RTC";
request_resource(&iomem_resource, &rtc_resource);
}
......@@ -439,14 +448,10 @@ void __init config_amiga(void)
mach_floppy_setup = amiga_floppy_setup;
#endif
mach_reset = amiga_reset;
#ifdef CONFIG_DUMMY_CONSOLE
conswitchp = &dummy_con;
kd_mksound = amiga_mksound;
#ifdef CONFIG_MAGIC_SYSRQ
mach_sysrq_key = 0x5f; /* HELP */
mach_sysrq_shift_state = 0x03; /* SHIFT+ALTGR */
mach_sysrq_shift_mask = 0xff; /* all modifiers except CapsLock */
mach_sysrq_xlate = amiga_sysrq_xlate;
#endif
kd_mksound = amiga_mksound;
#ifdef CONFIG_HEARTBEAT
mach_heartbeat = amiga_heartbeat;
#endif
......@@ -500,11 +505,14 @@ void __init config_amiga(void)
static unsigned short jiffy_ticks;
static void __init amiga_sched_init(void (*timer_routine)(int, void *,
struct pt_regs *))
struct pt_regs *))
{
static struct resource sched_res = {
"timer", 0x00bfd400, 0x00bfd5ff,
};
jiffy_ticks = (amiga_eclock+HZ/2)/HZ;
if (!request_mem_region(CIAB_PHYSADDR+0x400, 0x200, "timer"))
if (request_resource(&mb_resources._ciab, &sched_res))
printk("Cannot allocate ciab.ta{lo,hi}\n");
ciab.cra &= 0xC0; /* turn off timer A, continuous mode, from Eclk */
ciab.talo = jiffy_ticks % 256;
......@@ -612,6 +620,8 @@ static int amiga_hwclk(int op, struct hwclk_time *t)
t->wday = tod->weekday;
t->mon = tod->month1 * 10 + tod->month2 - 1;
t->year = tod->year1 * 10 + tod->year2;
if (t->year <= 69)
t->year += 100;
} else {
tod->second1 = t->sec / 10;
tod->second2 = t->sec % 10;
......@@ -625,6 +635,8 @@ static int amiga_hwclk(int op, struct hwclk_time *t)
tod->weekday = t->wday;
tod->month1 = (t->mon + 1) / 10;
tod->month2 = (t->mon + 1) % 10;
if (t->year >= 100)
t->year -= 100;
tod->year1 = t->year / 10;
tod->year2 = t->year % 10;
}
......@@ -646,6 +658,8 @@ static int amiga_hwclk(int op, struct hwclk_time *t)
t->wday = tod->weekday;
t->mon = tod->month1 * 10 + tod->month2 - 1;
t->year = tod->year1 * 10 + tod->year2;
if (t->year <= 69)
t->year += 100;
if (!(tod->cntrl3 & TOD2000_CNTRL3_24HMODE)){
if (!(tod->hour1 & TOD2000_HOUR1_PM) && t->hour == 12)
......@@ -672,6 +686,8 @@ static int amiga_hwclk(int op, struct hwclk_time *t)
tod->weekday = t->wday;
tod->month1 = (t->mon + 1) / 10;
tod->month2 = (t->mon + 1) % 10;
if (t->year >= 100)
t->year -= 100;
tod->year1 = t->year / 10;
tod->year2 = t->year % 10;
}
......@@ -796,7 +812,9 @@ static void amiga_mem_console_write(struct console *co, const char *s,
static void amiga_savekmsg_init(void)
{
savekmsg = (struct savekmsg *)amiga_chip_alloc(SAVEKMSG_MAXMEM, "Debug");
static struct resource debug_res = { "Debug" };
savekmsg = amiga_chip_alloc_res(SAVEKMSG_MAXMEM, &debug_res);
savekmsg->magic1 = SAVEKMSG_MAGIC1;
savekmsg->magic2 = SAVEKMSG_MAGIC2;
savekmsg->magicptr = virt_to_phys(savekmsg);
......
......@@ -15,6 +15,8 @@ _start:
1: dcbf 0,9
icbi 0,9
addi 9,9,0x20
cmplwi 0,9,8
cmplw 0,9,8
blt 1b
sync
isync
b start
......@@ -127,15 +127,18 @@ define_bool CONFIG_SBUS n
# Yes MCA RS/6000s exist but Linux-PPC does not currently support any
define_bool CONFIG_MCA n
if [ "$CONFIG_APUS" = "y" -o "$CONFIG_4xx" = "y" -o \
"$CONFIG_8260" = "y" ]; then
if [ "$CONFIG_4xx" = "y" -o "$CONFIG_8260" = "y" ]; then
define_bool CONFIG_PCI n
else
if [ "$CONFIG_8xx" = "y" ]; then
bool 'QSpan PCI' CONFIG_PCI_QSPAN
define_bool CONFIG_PCI $CONFIG_PCI_QSPAN
else
define_bool CONFIG_PCI y
if [ "$CONFIG_APUS" = "y" ]; then
bool 'PCI for Permedia2' CONFIG_PCI
else
define_bool CONFIG_PCI y
fi
fi
fi
......@@ -165,7 +168,11 @@ fi
source drivers/parport/Config.in
if [ "$CONFIG_4xx" != "y" -a "$CONFIG_8xx" != "y" ]; then
tristate 'Support for /dev/rtc' CONFIG_PPC_RTC
if [ "$CONFIG_APUS" != "y" ]; then
tristate 'Support for /dev/rtc' CONFIG_PPC_RTC
else
bool 'Generic /dev/rtc emulation' CONFIG_GEN_RTC
fi
fi
if [ "$CONFIG_ALL_PPC" = "y" ]; then
......@@ -186,12 +193,26 @@ if [ "$CONFIG_APUS" = "y" ]; then
define_bool CONFIG_AMIGAMOUSE y
define_bool CONFIG_ABSTRACT_CONSOLE y
define_bool CONFIG_FB y
define_bool CONFIG_MOUSE y
define_bool CONFIG_BUSMOUSE y
define_bool CONFIG_APUS_FAST_EXCEPT y
if [ "$CONFIG_EXPERIMENTAL" = "y" ]; then
bool 'Amiga 1200/600 PCMCIA support' CONFIG_AMIGA_PCMCIA
fi
tristate 'Amiga builtin serial support' CONFIG_AMIGA_BUILTIN_SERIAL
tristate 'Parallel printer support' CONFIG_M68K_PRINTER
tristate 'GVP IO-Extender support' CONFIG_GVPIOEXT
dep_tristate 'GVP IO-Extender parallel printer support' CONFIG_GVPIOEXT_LP $CONFIG_GVPIOEXT
dep_tristate 'GVP IO-Extender PLIP support' CONFIG_GVPIOEXT_PLIP $CONFIG_GVPIOEXT
tristate 'Multiface Card III serial support' CONFIG_MULTIFACE_III_TTY
if [ "$CONFIG_EXPERIMENTAL" = "y" ]; then
tristate 'Commodore A2232 serial support (EXPERIMENTAL)' CONFIG_A2232
fi
if [ "$CONFIG_AMIGA_PCMCIA" = "y" ]; then
tristate 'Hisoft Whippet PCMCIA serial support' CONFIG_WHIPPET_SERIAL
tristate 'PCMCIA NE2000 support' CONFIG_APNE
fi
if [ "$CONFIG_AMIGA_BUILTIN_SERIAL" = "y" -o "$CONFIG_GVPIOEXT" = "y" -o \
"$CONFIG_MULTIFACE_III_TTY" = "y" ]; then
bool 'Support for serial port console' CONFIG_SERIAL_CONSOLE
......
This diff is collapsed.
......@@ -57,6 +57,9 @@ endif
obj-$(CONFIG_MATH_EMULATION) += softemu8xx.o
obj-$(CONFIG_MBX) += i8259.o
obj-$(CONFIG_APUS) += apus_setup.o
ifeq ($(CONFIG_APUS),y)
obj-$(CONFIG_PCI) += apus_pci.o
endif
obj-$(CONFIG_ALL_PPC) += pmac_pic.o pmac_setup.o pmac_time.o prom.o \
feature.o pmac_pci.o chrp_setup.o \
chrp_time.o chrp_pci.o open_pic.o \
......
/*
* Copyright (C) Michel Dnzer <michdaen@iiic.ethz.ch>
*
* APUS PCI routines.
*
* Currently, only B/CVisionPPC cards (Permedia2) are supported.
*
* Thanks to Geert Uytterhoeven for the idea:
* Read values from given config space(s) for the first devices, -1 otherwise
*
*/
#include <linux/config.h>
#ifdef CONFIG_AMIGA
#include <linux/kernel.h>
#include <linux/pci.h>
#include <linux/delay.h>
#include <linux/string.h>
#include <asm/init.h>
#include <asm/io.h>
#include <asm/pci-bridge.h>
#include <asm/machdep.h>
#include "apus_pci.h"
/* These definitions are mostly adapted from pm2fb.c */
#undef APUS_PCI_MASTER_DEBUG
#ifdef APUS_PCI_MASTER_DEBUG
#define DPRINTK(a,b...) printk(KERN_DEBUG "apus_pci: %s: " a, __FUNCTION__ , ## b)
#else
#define DPRINTK(a,b...)
#endif
/*
* The _DEFINITIVE_ memory mapping/unmapping functions.
* This is due to the fact that they're changing soooo often...
*/
#define DEFW() wmb()
#define DEFR() rmb()
#define DEFRW() mb()
#define DEVNO(d) ((d)>>3)
#define FNNO(d) ((d)&7)
extern unsigned long powerup_PCI_present;
static struct pci_controller *apus_hose;
__apus
void *pci_io_base(unsigned int bus)
{
return 0;
}
#define cfg_read(val, addr, type, op) *val = op((type)(addr))
#define cfg_write(val, addr, type, op) op((val), (type *)(addr)); DEFW()
#define cfg_read_bad *val = ~0;
#define cfg_write_bad ;
#define cfg_read_val(val) *val
#define cfg_write_val(val) val
#define APUS_PCI_OP(rw, size, type, op, mask) \
__apus int \
apus_pcibios_##rw##_config_##size(struct pci_dev *dev, int offset, type val) \
{ \
int fnno = FNNO(dev->devfn); \
int devno = DEVNO(dev->devfn); \
\
if (dev->bus->number > 0 || devno != 1) { \
cfg_##rw##_bad; \
return PCIBIOS_DEVICE_NOT_FOUND; \
} \
/* base address + function offset + offset ^ endianness conversion */ \
cfg_##rw(val, apus_hose->cfg_data + (fnno<<5) + (offset ^ mask), \
type, op); \
\
DPRINTK(#op " b: 0x%x, d: 0x%x, f: 0x%x, o: 0x%x, v: 0x%x\n", \
dev->bus->number, dev->devfn>>3, dev->devfn&7, \
offset, cfg_##rw##_val(val)); \
return PCIBIOS_SUCCESSFUL; \
}
APUS_PCI_OP(read, byte, u8 *, readb, 3)
APUS_PCI_OP(read, word, u16 *, readw, 2)
APUS_PCI_OP(read, dword, u32 *, readl, 0)
APUS_PCI_OP(write, byte, u8, writeb, 3)
APUS_PCI_OP(write, word, u16, writew, 2)
APUS_PCI_OP(write, dword, u32, writel, 0)
static struct pci_ops apus_pci_ops = {
apus_pcibios_read_config_byte,
apus_pcibios_read_config_word,
apus_pcibios_read_config_dword,
apus_pcibios_write_config_byte,
apus_pcibios_write_config_word,
apus_pcibios_write_config_dword
};
static struct resource pci_mem = { "B/CVisionPPC PCI mem", CVPPC_FB_APERTURE_ONE, CVPPC_PCI_CONFIG, IORESOURCE_MEM };
void __init
apus_pcibios_fixup(void)
{
/* struct pci_dev *dev = pci_find_slot(0, 1<<3);
unsigned int reg, val, offset;*/
/* FIXME: interrupt? */
/*dev->interrupt = xxx;*/
request_resource(&iomem_resource, &pci_mem);
printk("%s: PCI mem resource requested\n", __FUNCTION__);
}
static void __init apus_pcibios_fixup_bus(struct pci_bus *bus)
{
bus->resource[1] = &pci_mem;
}
/*
* This is from pm2fb.c again
*
* Check if PCI (B/CVisionPPC) is available, initialize it and set up
* the pcibios_* pointers
*/
void __init
apus_setup_pci_ptrs(void)
{
if (!powerup_PCI_present) {
DPRINTK("no PCI bridge detected\n");
return;
}
DPRINTK("Phase5 B/CVisionPPC PCI bridge detected.\n");
apus_hose = pcibios_alloc_controller();
if (!apus_hose) {
printk("apus_pci: Can't allocate PCI controller structure\n");
return;
}
if (!(apus_hose->cfg_data = ioremap(CVPPC_PCI_CONFIG, 256))) {
printk("apus_pci: unable to map PCI config region\n");
return;
}
if (!(apus_hose->cfg_addr = ioremap(CSPPC_PCI_BRIDGE, 256))) {
printk("apus_pci: unable to map PCI bridge\n");
return;
}
writel(CSPPCF_BRIDGE_BIG_ENDIAN, apus_hose->cfg_addr + CSPPC_BRIDGE_ENDIAN);
DEFW();
writel(CVPPC_REGS_REGION, apus_hose->cfg_data+ PCI_BASE_ADDRESS_0);
DEFW();
writel(CVPPC_FB_APERTURE_ONE, apus_hose->cfg_data + PCI_BASE_ADDRESS_1);
DEFW();
writel(CVPPC_FB_APERTURE_TWO, apus_hose->cfg_data + PCI_BASE_ADDRESS_2);
DEFW();
writel(CVPPC_ROM_ADDRESS, apus_hose->cfg_data + PCI_ROM_ADDRESS);
DEFW();
writel(0xef000000 | PCI_COMMAND_IO | PCI_COMMAND_MEMORY |
PCI_COMMAND_MASTER, apus_hose->cfg_data + PCI_COMMAND);
DEFW();
apus_hose->first_busno = 0;
apus_hose->last_busno = 0;
apus_hose->ops = &apus_pci_ops;
ppc_md.pcibios_fixup = apus_pcibios_fixup;
ppc_md.pcibios_fixup_bus = apus_pcibios_fixup_bus;
return;
}
#endif /* CONFIG_AMIGA */
/*
* Phase5 CybervisionPPC (TVP4020) definitions for the Permedia2 framebuffer
* driver.
*
* Copyright (c) 1998-1999 Ilario Nardinocchi (nardinoc@CS.UniBO.IT)
* --------------------------------------------------------------------------
* $Id: cvisionppc.h,v 1.9 1999/03/12 09:45:06 illo Exp $
* --------------------------------------------------------------------------
* This file is subject to the terms and conditions of the GNU General Public
* License. See the file README.legal in the main directory of this archive
* for more details.
*/
#ifndef APUS_PCI_H
#define APUS_PCI_H
#include "pci.h"
#define CSPPC_PCI_BRIDGE 0xfffe0000
#define CSPPC_BRIDGE_ENDIAN 0x0000
#define CSPPC_BRIDGE_INT 0x0010
#define CVPPC_PCI_CONFIG 0xfffc0000
#define CVPPC_ROM_ADDRESS 0xe2000001
#define CVPPC_REGS_REGION 0xef000000
#define CVPPC_FB_APERTURE_ONE 0xe0000000
#define CVPPC_FB_APERTURE_TWO 0xe1000000
#define CVPPC_FB_SIZE 0x00800000
/* CVPPC_BRIDGE_ENDIAN */
#define CSPPCF_BRIDGE_BIG_ENDIAN 0x02
/* CVPPC_BRIDGE_INT */
#define CSPPCF_BRIDGE_ACTIVE_INT2 0x01
#endif /* APUS_PCI_H */
This diff is collapsed.
/* $Id: pci_common.c,v 1.17 2001/05/15 12:32:52 davem Exp $
/* $Id: pci_common.c,v 1.18 2001/05/18 23:06:35 davem Exp $
* pci_common.c: PCI controller common support.
*
* Copyright (C) 1999 David S. Miller (davem@redhat.com)
......@@ -500,15 +500,21 @@ void __init pci_assign_unassigned(struct pci_pbm_info *pbm,
static int __init pci_intmap_match(struct pci_dev *pdev, unsigned int *interrupt)
{
struct linux_prom_pci_intmap bridge_local_intmap[PROM_PCIIMAP_MAX], *intmap;
struct linux_prom_pci_intmask bridge_local_intmask, *intmask;
struct pcidev_cookie *dev_pcp = pdev->sysdata;
struct pci_pbm_info *pbm = dev_pcp->pbm;
struct linux_prom_pci_registers *pregs = dev_pcp->prom_regs;
unsigned int hi, mid, lo, irq;
int i;
int i, num_intmap;
if (pbm->num_pbm_intmap == 0)
return 0;
intmap = &pbm->pbm_intmap[0];
intmask = &pbm->pbm_intmask;
num_intmap = pbm->num_pbm_intmap;
/* If we are underneath a PCI bridge, use PROM register
* property of the parent bridge which is closest to
* the PBM.
......@@ -516,7 +522,7 @@ static int __init pci_intmap_match(struct pci_dev *pdev, unsigned int *interrupt
if (pdev->bus->number != pbm->pci_first_busno) {
struct pcidev_cookie *bus_pcp;
struct pci_dev *pwalk;
int offset;
int offset, plen;
pwalk = pdev->bus->self;
while (pwalk->bus &&
......@@ -524,6 +530,27 @@ static int __init pci_intmap_match(struct pci_dev *pdev, unsigned int *interrupt
pwalk = pwalk->bus->self;
bus_pcp = pwalk->sysdata;
/* But if the PCI bridge has it's own interrupt map
* and mask properties, use that and the device regs.
*/
plen = prom_getproperty(bus_pcp->prom_node, "interrupt-map",
(char *) &bridge_local_intmap[0],
sizeof(bridge_local_intmap));
if (plen != -1) {
intmap = &bridge_local_intmap[0];
num_intmap = plen / sizeof(struct linux_prom_pci_intmap);
plen = prom_getproperty(bus_pcp->prom_node, "interrupt-map-mask",
(char *) &bridge_local_intmask,
sizeof(bridge_local_intmask));
if (plen == -1) {
prom_printf("pbm_intmap_match: Bridge has intmap but "
"no intmask.\n");
prom_halt();
}
goto check_intmap;
}
pregs = bus_pcp->prom_regs;
offset = prom_getint(dev_pcp->prom_node,
......@@ -544,17 +571,18 @@ static int __init pci_intmap_match(struct pci_dev *pdev, unsigned int *interrupt
}
}
hi = pregs->phys_hi & pbm->pbm_intmask.phys_hi;
mid = pregs->phys_mid & pbm->pbm_intmask.phys_mid;
lo = pregs->phys_lo & pbm->pbm_intmask.phys_lo;
irq = *interrupt & pbm->pbm_intmask.interrupt;
for (i = 0; i < pbm->num_pbm_intmap; i++) {
if (pbm->pbm_intmap[i].phys_hi == hi &&
pbm->pbm_intmap[i].phys_mid == mid &&
pbm->pbm_intmap[i].phys_lo == lo &&
pbm->pbm_intmap[i].interrupt == irq) {
*interrupt = pbm->pbm_intmap[i].cinterrupt;
check_intmap:
hi = pregs->phys_hi & intmask->phys_hi;
mid = pregs->phys_mid & intmask->phys_mid;
lo = pregs->phys_lo & intmask->phys_lo;
irq = *interrupt & intmask->interrupt;
for (i = 0; i < num_intmap; i++) {
if (intmap[i].phys_hi == hi &&
intmap[i].phys_mid == mid &&
intmap[i].phys_lo == lo &&
intmap[i].interrupt == irq) {
*interrupt = intmap[i].cinterrupt;
return 1;
}
}
......
This diff is collapsed.
......@@ -363,7 +363,7 @@ static int floppy_ioctl(struct inode *inode, struct file *filp,
sizeof(struct floppy_struct));
return err;
}
return -ENOIOCTLCMD;
return -ENOTTY;
}
static int floppy_open(struct inode *inode, struct file *filp)
......
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment