Commit e250954a authored by Linus Torvalds's avatar Linus Torvalds

Import 2.1.106

parent 9a8f8b7c
......@@ -1492,6 +1492,12 @@ N: Alessandro Rubini
E: rubini@ipvvis.unipv.it
D: the gpm mouse server and kernel support for it
N: Paul Russell
E: Paul.Russell@rustcorp.com.au
W: http://www.adelaide.net.au/~rustcorp
D: Ruggedly handsome.
D: Developed Generic IP Firewalling Chains with Michael Neuling.
N: Thomas Sailer
E: sailer@ife.ee.ethz.ch
E: HB9JNX@HB9W.CHE.EU (packet radio)
......@@ -1787,6 +1793,11 @@ S: Chudenicka 8
S: 10200 Prague 10, Hostivar
S: Czech Republic
N: Andrew Veliath
E: andrewtv@usa.net
D: Turtle Beach MultiSound sound driver
S: USA
N: Dirk Verworner
D: Co-author of german book ``Linux-Kernel-Programmierung''
D: Co-founder of Berlin Linux User Group
......
......@@ -33,7 +33,7 @@ http://cyberbuzz.gatech.edu/kaboom/linux/ as well.
Also, don't forget http://www.linuxhq.com/ for all your Linux kernel
needs.
Last updated: May 12, 1998
Last updated: May 31, 1998
Current Author: Chris Ricker (kaboom@gatech.edu).
Current Minimal Requirements
......@@ -47,10 +47,10 @@ running, the suggested command should tell you.
- Gnu C 2.7.2.3 ; gcc --version
- Binutils 2.8.1.0.23 ; ld -v
- Linux C Library 5.4.44 ; ls -l /lib/libc.so.*
- Dynamic Linker (ld.so) 1.9.5 ; ldd --version
- Dynamic Linker (ld.so) 1.9.9 ; ldd --version or ldd -v
- Linux C++ Library 2.7.2.8 ; ls -l /usr/lib/libg++.so.*
- Procps 1.2.7 ; ps --version
- Procinfo 13 ; procinfo -v
- Procinfo 14 ; procinfo -v
- Mount 2.7l ; mount --version
- Net-tools 1.45 ; hostname -V
- Loadlin 1.6a
......@@ -190,6 +190,17 @@ net-tools. This will also fix other problems. For example, the format
of /proc/net/dev changed; as a result, an older ifconfig will
incorrectly report errors.
As of 2.1.102, the firewalling code has been replaced with
firewalling chains. See
http://www.adelaide.net.au/~rustcorp/ipfwchains/ipfwchains.html for
more information. Among other things, you'll now need to use ipchains
instead of ipfwadm to configure your filters.
The IP firewalling code has been replaced: ipfwadm will no longer
work. You need to obtain `ipchains', available from
http://www.adelaide.net.au/~rustcorp/ipfwchains/ipfwchains.html
which includes an ipfwadm wrapper.
Memory
======
......@@ -209,8 +220,8 @@ use autofs as well as the new NFS utils.
RPM
===
If you run Red Hat Linux or any other distribution that uses RPM, you
need to upgrade RPM to version 2.2.7 or later.
If you run Red Hat Linux or any other distribution that uses RPM,
you need to upgrade RPM to version 2.2.7 or later.
DOSEMU
======
......@@ -344,9 +355,9 @@ ftp://sunsite.unc.edu/pub/Linux/GCC/release.libg++-2.7.2.8
Dynamic Linker
==============
The 1.9.5 release:
ftp://tsx-11.mit.edu/pub/linux/packages/GCC/ld.so-1.9.5.tar.gz
ftp://sunsite.unc.edu/pub/Linux/GCC/ld.so-1.9.5.tar.gz
The 1.9.9 release:
ftp://tsx-11.mit.edu/pub/linux/packages/GCC/ld.so-1.9.9.tar.gz
ftp://sunsite.unc.edu/pub/Linux/GCC/ld.so-1.9.9.tar.gz
Modules utilities
=================
......@@ -364,21 +375,21 @@ ftp://sunsite.unc.edu/pub/Linux/system/status/ps/procps-1.2.7.tgz
Procinfo utilities
==================
The 13 release:
ftp://ftp.cistron.nl/pub/people/svm/procinfo-13.tar.gz
The 14 release:
ftp://ftp.cistron.nl/pub/people/svm/procinfo-14.tar.gz
RPM utilities
=============
The 2.2.7 release for Intel:
ftp://ftp.redhat.com/pub/redhat/redhat-4.0/updates/i386/rpm-2.2.7-1.i386.rpm
ftp://ftp.redhat.com/pub/redhat/redhat-4.0/updates/i386/rpm-devel-2.2.7-1.i386.rpm
ftp://ftp.redhat.com/pub/redhat/old-releases/redhat-4.0/updates/i386/rpm-2.2.7-1.i386.rpm
ftp://ftp.redhat.com/pub/redhat/old-releases/redhat-4.0/updates/i386/rpm-devel-2.2.7-1.i386.rpm
The 2.2.7 release for Alpha:
ftp://ftp.redhat.com/pub/redhat/redhat-4.0/updates/axp/rpm-2.2.7-1.axp.rpm
ftp://ftp.redhat.com/pub/redhat/redhat-4.0/updates/axp/rpm-devel-2.2.7-1.axp.rpm
ftp://ftp.redhat.com/pub/redhat/old-releases/redhat-4.0/updates/axp/rpm-2.2.7-1.axp.rpm
ftp://ftp.redhat.com/pub/redhat/old-releases/redhat-4.0/updates/axp/rpm-devel-2.2.7-1.axp.rpm
The 2.2.7 release for SPARC:
ftp://ftp.redhat.com/pub/redhat/redhat-4.0/updates/i386/rpm-2.2.7-1.sparc.rpm
ftp://ftp.redhat.com/pub/redhat/redhat-4.0/updates/i386/rpm-devel-2.2.7-1.sparc.rpm
ftp://ftp.redhat.com/pub/redhat/old-releases/redhat-4.0/updates/sparc/rpm-2.2.7-1.sparc.rpm
ftp://ftp.redhat.com/pub/redhat/old-releases/redhat-4.0/updates/sparc/rpm-devel-2.2.7-1.sparc.rpm
DOSEMU
======
......@@ -456,6 +467,13 @@ PPP
The 2.3.5 release:
ftp://cs.anu.edu.au/pub/software/ppp/ppp-2.3.5.tar.gz
IP Chains
=========
The 1.3.3 release:
http://www.adelaide.net.au/~rustcorp/ipfwchains/ipchains-source-1.3.3.tar.gz
http://www.adelaide.net.au/~rustcorp/ipfwchains/ipchains-source-1.3.3.tar.bz2
Other Info
==========
......
This diff is collapsed.
......@@ -21,7 +21,8 @@ Mount options that are unique to the isofs filesystem.
check=strict Matches only filenames with the exact same case
cruft Try to handle badly formatted CDs.
map=off Do not map non-rockridge filenames to lowercase
map=normal Map rockridge filenames to lowercase
map=normal Map non-rockridge filenames to lowecase
map=acorn As map=normal but also apply Acorn extensions if present
mode=xxx Sets the permissions on files to xxx
nojoliet Ignore Joliet extensions if they are present.
norock Ignore rockridge extensions if they are present.
......
......@@ -44,6 +44,7 @@ parallel port IDE subsystem, including:
Imation Superdisk LS-120
FreeCom Power CD
Hewlett-Packard 5GB tape drive
Hewlett-Packard 7100 and 7200 CD-RW drives
as well as most of the clone and no-name products on the market.
......@@ -57,8 +58,9 @@ high-level drivers for each of the different type of supported device:
pcd ATAPI CD-ROM
pf ATAPI disk
pt ATAPI tape
pg ATAPI generic
(Support for ATAPI CD-R and CD-RW drives is in the design phase.)
(Currently, the pg driver is only used with CD-R drives).
The high-level drivers function according to the relevant standards.
The third component of PARIDE is a set of low-level protocol drivers
......@@ -72,7 +74,8 @@ support is available for almost all known adapter protocols:
dstr DataStor EP-2000 (TW)
epat Shuttle EPAT (UK)
epia Shuttle EPIA (UK)
fit2 FIT TD-2000
fit2 FIT TD-2000 (US)
fit3 FIT TD-3000 (US)
frpw Freecom Power (DE)
kbic KingByte KBIC-951A and KBIC-971A (TW)
ktti KT Technology PHd adapter (SG)
......@@ -111,6 +114,7 @@ and high-level drivers that you would use:
Avatar Shark pd epat
FreeCom CD-ROM pcd frpw
Hewlett-Packard 5GB Tape pt epat
Hewlett-Packard 7100/7200 pg epat
2.1 Configuring built-in drivers
......@@ -258,6 +262,7 @@ for u in 0 1 2 3 ; do mkdev pcd$u b 46 $u ; done
for u in 0 1 2 3 ; do mkdev pf$u b 47 $u ; done
for u in 0 1 2 3 ; do mkdev pt$u c 96 $u ; done
for u in 0 1 2 3 ; do mkdev npt$u c 96 $[ $u + 128 ] ; done
for u in 0 1 2 3 ; do mkdev pg$u c 97 $u ; done
#
# end of mkd
......@@ -285,6 +290,11 @@ floppy that you could share with a DOS system:
mkdosfs /dev/pf0
mount /dev/pf0 /mnt
2.4 Using the pg driver
The pg driver can be used in conjunction with the cdrecord program
to create CD-ROMs. For more information, and the required patches
to cdrecord, please visit http://www.torque.net/parport/cdr.html .
3. Troubleshooting
......@@ -333,6 +343,6 @@ have in your mail headers, when sending mail to the list server.
You might also find some useful information on the linux-parport
web pages (although they are not always up to date) at
http://www.torque.net/linux-pp.html
http://www.torque.net/parport/
ALS-007 based soundcards
========================
Support for soundcards based around the Avance Logic ALS-007 chip is
included. The ALS-007 is a single chip PnP sound solution which is mostly
hardware compatible with the Sound Blaster 16 card, with most differences
occuring in the use of the mixer registers. For this reason the ALS-007
code is integrated as part of the Sound Blaster 16 driver (adding only 800
bytes to the SB16 driver).
To use an ALS-007 soundcard under Linux, enable the following options in the
sound configuration section of the kernel config:
- 100% Sound Blaster compatibles (SB16/32/64, ESS, Jazz16) support
- FM synthesizer (YM3812/OPL-3) support
Since the ALS-007 is a PnP card, the sound driver probably should be
compiled as a module, with the isapnptools used to wake up the soundcard.
Set the "I/O base for SB", "Sound Blaster IRQ" and "Sound Blaster DMA" (8 bit -
either 0, 1 or 3) to the values used in your particular installation (they
should match the values used to configure the card using isapnp). The
ALS-007 does NOT implement 16 bit DMA, so the "Sound Blaster 16 bit DMA"
should be set to -1. If you wish to use the externel MPU-401 interface on
the card, "MPU401 I/O base of SB16" and "SB MPU401 IRQ" should be set to
the appropriate values for your installation. (Note that the ALS-007
requires a separate IRQ for the MPU-401, so don't specify -1 here). (Note
that the base port of the internal FM synth is fixed at 0x388 on the ALS007;
in any case the FM synth location is not setable in the kernel config).
The resulting sound driver will provide the following capabilities:
- 8 and 16 bit audio playback
- 8 and 16 bit audio recording
- Software selection of record source (line in, CD, FM, mic, master)
- Record and playback of midi data via the external MPU-401
- Playback of midi data using inbuilt FM synthesizer
- Control of the ALS-007 mixer via any OSS-compatible mixer programs.
Controls available are Master (L&R), Line in (L&R), CD (L&R),
DSP/PCM/audio out (L&R), FM (L&R) and Mic in (mono).
Jonathan Woithe
jwoithe@physics.adelaide.edu.au
30 March 1998
......@@ -5,7 +5,7 @@ with 2.1.86 and 2.1.88) with modularized sound support these lines can
be issued (of course with the suitable values for the parameters)
after PNP setup:
insmod sound.o
modprobe sound.o
insmod uart401.o
insmod sb.o io=0x220 irq=5 dma=1 dma16=5 mpu_io=0x330
insmod awe_wave.o
......@@ -59,5 +59,6 @@ rmmod opl3
rmmod sb
rmmod uart401
rmmod sound
rmmod soundcore
-----
Getting Firmware
~~~~~~~~~~~~~~~~
See the end of this document on how to obtain and create the necessary
firmware files.
Supported Features
~~~~~~~~~~~~~~~~~~
Currently digital audio and mixer functionality is supported. (memory
mapped digital audio is not yet supported). MultiSound support is
fully modularized, and can only be used as modules:
msnd - MultiSound base (requires soundcore)
msnd_classic - Base audio/mixer support for Classic, Monetery and
Tahiti cards
msnd_pinnacle - Base audio/mixer support for Pinnacle and Fiji cards
Important Notes - Read Before Using
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
* The firmware files are not included (may change in future). You
must obtain these images from Turtle Beach (they are included in the
MultiSound Development Kits), and place them in /etc/sound for
example, and give the full paths in the Linux configuration. Please
note these files must be binary files, not assember.
* You need the following information to use this driver: the card's
I/O base (i.e. 0x250), the IRQ (i.e. 5), and the shared memory area
(i.e. 0xd8000).
* Probing is not currently implemented, and only the msnd_classic
driver will actually program the card's IRQ and SMA locations; the
msnd_pinnacle is primarily for use with the card in PnP mode, however
it should work if you know what the card's resource values are (this
will change in the future).
* Note the Turtle Beach Pinnacle card contains a Kurzweil MA-1
synthesizer with an MPU compatible interface, which should work with
the mpu401 module. You must know the resource values of the MA-1.
Examples
~~~~~~~~
* If you have a MultiSound Classic/Monterey/Tahiti:
insmod soundcore
insmod msnd
insmod msnd_classic io=0x290 irq=7 mem=0xd0000
* If you have a MultiSound Pinnacle:
insmod soundcore
insmod msnd
insmod msnd_pinnacle io=0x210 irq=5 mem=0xd8000
* To use the MPU-compatible Kurzweil synth on the Pinnacle, add the
following:
insmod sound
insmod mpu401 io=0x330 irq=9
msnd_classic, msnd_pinnacle Required Options
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
If the following options are not given, the module will not load.
Examine the kernel message log for informative error messages.
WARNING--probing isn't supported so try to make sure you have the
correct shared memory area, otherwise you may experience problems.
io I/O base of DSP, e.g. io=0x210
irq IRQ number, e.g. irq=5
mem Shared memory area, e.g. mem=0xd8000
msnd_classic, msnd_pinnacle Additional Options
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
fifosize The digital audio FIFOs, in kilobytes. The default is
64kB (two FIFOs are allocated, so this uses up 128kB).
calibrate_signal Setting this to one calibrates the ADCs to the
signal, zero calibrates to the card (defaults
to zero).
Creating and Obtaining Firmware
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
For the Classic/Tahiti/Monterey
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Download to /tmp and unzip the following file from Turtle Beach:
ftp://ftp.tbeach.com/pub/tbs/pinn/msndvkit.zip
When unzipped, unzip the file named MsndFiles.zip. Then copy the
following firmware files to /etc/sound (note the file renaming):
cp DSPCODE/MSNDINIT.BIN /etc/sound/msndinit.bin
cp DSPCODE/MSNDPERM.REB /etc/sound/msndperm.bin
When configuring the Linux kernel, specify /etc/sound/msndinit.bin and
/etc/sound/msndperm.bin for the two firmware files.
For the Pinnacle/Fiji
~~~~~~~~~~~~~~~~~~~~~
Download to /tmp and unzip the following file from Turtle Beach (be
sure to use the entire URL; some have had trouble navigating to the
URL):
ftp://ftp.tbeach.com/oldpub/tbs/pinn/pnddk100.zip
Put the following lines into a file named conv.l (between the start
and end lines):
-- conv.l start --
%%
[ \n\t,\r] ;
\;.* ;
DB ;
[0-9A-Fa-f]+H { int n; sscanf(yytext, "%xH", &n); printf("%c", n); }
-- conv.l end --
Then, compile the conv program with GNU make with the following
command:
make LEX=flex LOADLIBES=-lfl conv
This should give you an executable named conv. Now, we create the
binary firmware files by doing the following conversion (assuming the
archive unpacked into a directory named PINNDDK):
./conv < PINNDDK/dspcode/pndspini.asm > /etc/sound/pndspini.bin
./conv < PINNDDK/dspcode/pndsperm.asm > /etc/sound/pndsperm.bin
The conv (and conv.l) program is not needed after conversion and can
be safely deleted. Then, when configuring the Linux kernel, specify
/etc/sound/pndspini.bin and /etc/sound/pndsperm.bin for the two
firmware files.
......@@ -32,7 +32,11 @@ To make this driver work with Mwave you must set mwave_bug. You also need
to warm boot from DOS/Windows with the required firmware loaded under this
OS. IBM are being difficult about documenting how to load this firmware.
Advance Logic ALS007
Avance Logic ALS007
This card isn't currently supported. I have patches to merge however that
add limited support.
This card is supported; see the separate file ALS007 for full details.
Avance Logic ALS100
This card is supported; setup should be as for a standard Sound Blaster 16.
The driver will identify the audio device as a "Sound Blaster 16 (ALS-100)".
......@@ -277,7 +277,7 @@ S: Maintainted
HIGH-SPEED SCC DRIVER FOR AX.25
P: Klaus Kudielka
M: oe1kib@oe1xtu.ampr.org
M: oe1kib@oe1kib.ampr.org
L: linux-hams@vger.rutgers.edu
S: Maintained
......@@ -304,6 +304,12 @@ M: Gadi Oxman <gadio@netvision.net.il>
L: linux-kernel@vger.rutgers.edu
S: Maintained
IP FIREWALL
P: Paul Russell
M: Paul.Russell@rustcorp.com.au
W: http://www.adelaide.net.au/~rustcorp/ipfwchains/ipfwchains.html
S: Maintained
IPX/SPX NETWORK LAYER
P: Jay Schulist
M: Jay Schulist <Jay.Schulist@spacs.k12.wi.us>
......@@ -379,6 +385,11 @@ M: rubini@ipvvis.unipv.it
L: linux-kernel@vger.rutgers.edu
S: Maintained
MULTISOUND SOUND DRIVER
P: Andrew Veliath
M: andrewtv@usa.net
S: Maintained
NCP FILESYSTEM:
P: Petr Vandrovec
M: vandrove@vc.cvut.cz
......@@ -539,6 +550,12 @@ M: io8-linux@specialix.co.uk
L: linux-kernel@vger.rutgers.edu ?
S: Supported
SPX NETWORK LAYER
P: Jay Schulist
M: Jay.Schulist@spacs.k12.wi.us
L: linux-net@vger.rutgers.edu
S: Supported
STALLION TECHNOLOGIES MULTIPORT SERIAL BOARDS
P: Greg Ungerer
M: support@stallion.oz.au
......@@ -571,8 +588,9 @@ S: Supported
TOKEN-RING NETWORK DRIVER
P: Paul Norton
M: pnorton@cts.com
M: p.norton@computer.org
L: linux-net@vger.rutgers.edu
L: linux-tr@emissary.aus-etc.com
S: Maintained
U14-34F SCSI DRIVER
......@@ -631,6 +649,19 @@ W: http://qsl.net/dl1bke/
L: linux-hams@vger.rutgers.edu
S: Maintained
ARM PORT
P: Russell King
M: linux@arm.uk.linux.org
L: linux-arm@vger.rutgers.edu
L: arm-linux@tardis.ed.ac.uk
W: http://www.arm.uk.linux.org/~rmk/armlinux.html
S: Maintained
ARM MFM AND FLOPPY DRIVERS
P: Dave Gilbert
M: linux@treblig.org
S: Maintained
REST:
P: Linus Torvalds
S: Buried alive in diapers
......@@ -2,7 +2,7 @@ VERSION = 2
PATCHLEVEL = 1
SUBLEVEL = 106
ARCH := $(shell uname -m | sed -e s/i.86/i386/ -e s/sun4u/sparc64/)
ARCH := $(shell uname -m | sed -e s/i.86/i386/ -e s/sun4u/sparc64/ -e s/arm*/arm/ -e s/sa110/arm/)
#
# For SMP kernels, set this. We don't want to have this in the config file
......
......@@ -39,8 +39,8 @@ WHAT IS LINUX?
ON WHAT HARDWARE DOES IT RUN?
Linux was first developed for 386/486-based PCs. These days it also
runs on DEC Alphas, SUN Sparcs, M68000 machines (like Atari and Amiga),
MIPS, PowerPC, and others.
runs on ARMs, DEC Alphas, SUN Sparcs, M68000 machines (like Atari and
Amiga), MIPS and PowerPC, and others.
DOCUMENTATION:
......
......@@ -537,11 +537,15 @@ asmlinkage int osf_utsname(char *name)
error = verify_area(VERIFY_WRITE, name, 5 * 32);
if (error)
goto out;
down(&uts_sem);
copy_to_user(name + 0, system_utsname.sysname, 32);
copy_to_user(name + 32, system_utsname.nodename, 32);
copy_to_user(name + 64, system_utsname.release, 32);
copy_to_user(name + 96, system_utsname.version, 32);
copy_to_user(name + 128, system_utsname.machine, 32);
up(&uts_sem);
out:
unlock_kernel();
return error;
......@@ -602,11 +606,13 @@ asmlinkage int osf_getdomainname(char *name, int namelen)
if (namelen > 32)
len = 32;
down(&uts_sem);
for (i = 0; i < len; ++i) {
put_user(system_utsname.domainname[i], name + i);
__put_user(system_utsname.domainname[i], name + i);
if (system_utsname.domainname[i] == '\0')
break;
}
up(&uts_sem);
out:
unlock_kernel();
return error;
......@@ -843,6 +849,8 @@ asmlinkage long osf_sysinfo(int command, char *buf, long count)
printk("sysinfo(%d)", command);
goto out;
}
down(&uts_sem);
res = sysinfo_table[offset];
len = strlen(res)+1;
if (len > count)
......@@ -851,6 +859,7 @@ asmlinkage long osf_sysinfo(int command, char *buf, long count)
err = -EFAULT;
else
err = 0;
up(&uts_sem);
out:
unlock_kernel();
return err;
......
......@@ -120,6 +120,7 @@ asmlinkage int sys_idle(void)
/* endless idle loop with no priority at all */
current->counter = -100;
for (;;) {
check_pgt_cache();
schedule();
}
ret = 0;
......
......@@ -28,6 +28,67 @@ extern void show_net_buffers(void);
struct thread_struct * original_pcb_ptr;
#ifndef __SMP__
struct pgtable_cache_struct quicklists;
#endif
void __bad_pmd(pgd_t *pgd)
{
printk("Bad pgd in pmd_alloc: %08lx\n", pgd_val(*pgd));
pgd_set(pgd, BAD_PAGETABLE);
}
void __bad_pte(pmd_t *pmd)
{
printk("Bad pmd in pte_alloc: %08lx\n", pmd_val(*pmd));
pmd_set(pmd, (pte_t *) BAD_PAGETABLE);
}
pmd_t *get_pmd_slow(pgd_t *pgd, unsigned long offset)
{
pmd_t *pmd;
pmd = (pmd_t *) __get_free_page(GFP_KERNEL);
if (pgd_none(*pgd)) {
if (pmd) {
clear_page((unsigned long)pmd);
pgd_set(pgd, pmd);
return pmd + offset;
}
pgd_set(pgd, BAD_PAGETABLE);
return NULL;
}
free_page((unsigned long)pmd);
if (pgd_bad(*pgd)) {
__bad_pmd(pgd);
return NULL;
}
return (pmd_t *) pgd_page(*pgd) + offset;
}
pte_t *get_pte_slow(pmd_t *pmd, unsigned long offset)
{
pte_t *pte;
pte = (pte_t *) __get_free_page(GFP_KERNEL);
if (pmd_none(*pmd)) {
if (pte) {
clear_page((unsigned long)pte);
pmd_set(pmd, pte);
return pte + offset;
}
pmd_set(pmd, (pte_t *) BAD_PAGETABLE);
return NULL;
}
free_page((unsigned long)pte);
if (pmd_bad(*pmd)) {
__bad_pte(pmd);
return NULL;
}
return (pte_t *) pmd_page(*pmd) + offset;
}
/*
* BAD_PAGE is the page that is used for page faults when linux
* is out-of-memory. Older versions of linux just did a
......@@ -56,7 +117,7 @@ pte_t __bad_page(void)
void show_mem(void)
{
int i,free = 0,total = 0,reserved = 0;
int shared = 0;
int shared = 0, cached = 0;
printk("\nMem-info:\n");
show_free_areas();
......@@ -66,6 +127,8 @@ void show_mem(void)
total++;
if (PageReserved(mem_map+i))
reserved++;
else if (PageSwapCache(mem_map+i))
cached++;
else if (!atomic_read(&mem_map[i].count))
free++;
else
......@@ -75,6 +138,8 @@ void show_mem(void)
printk("%d free pages\n",free);
printk("%d reserved pages\n",reserved);
printk("%d pages shared\n",shared);
printk("%d pages swap cached\n",cached);
printk("%d pages in page table cache\n",pgtable_cache_size);
show_buffers();
#ifdef CONFIG_NET
show_net_buffers();
......@@ -213,16 +278,16 @@ void mem_init(unsigned long start_mem, unsigned long end_mem)
void free_initmem (void)
{
extern char __init_begin, __init_end;
unsigned long addr;
addr = (unsigned long)(&__init_begin);
for (; addr < (unsigned long)(&__init_end); addr += PAGE_SIZE) {
mem_map[MAP_NR(addr)].flags &= ~(1 << PG_reserved);
atomic_set(&mem_map[MAP_NR(addr)].count, 1);
free_page(addr);
}
printk ("Freeing unused kernel memory: %ldk freed\n",
extern char __init_begin, __init_end;
unsigned long addr;
addr = (unsigned long)(&__init_begin);
for (; addr < (unsigned long)(&__init_end); addr += PAGE_SIZE) {
mem_map[MAP_NR(addr)].flags &= ~(1 << PG_reserved);
atomic_set(&mem_map[MAP_NR(addr)].count, 1);
free_page(addr);
}
printk ("Freeing unused kernel memory: %ldk freed\n",
(&__init_end - &__init_begin) >> 10);
}
......
......@@ -309,16 +309,20 @@ sys_compat_mount (char *devname, char *dirname, char *type, unsigned long flags,
asmlinkage int sys_uname (struct old_utsname * name)
{
static int warned = 0;
int err;
if (warned == 0) {
warned ++;
printk (KERN_NOTICE "%s (%d): obsolete uname call\n",
current->comm, current->pid);
}
if (name && !copy_to_user (name, &system_utsname, sizeof (*name)))
return 0;
return -EFAULT;
if(!name)
return -EFAULT;
down(&uts_sem);
err=copy_to_user (name, &system_utsname, sizeof (*name));
up(&uts_sem);
return err?-EFAULT:0;
}
asmlinkage int sys_olduname(struct oldold_utsname * name)
......@@ -338,6 +342,8 @@ asmlinkage int sys_olduname(struct oldold_utsname * name)
if (!access_ok(VERIFY_WRITE,name,sizeof(struct oldold_utsname)))
return -EFAULT;
down(&uts_sem);
error = __copy_to_user(&name->sysname,&system_utsname.sysname,__OLD_UTS_LEN);
error -= __put_user(0,name->sysname+__OLD_UTS_LEN);
error -= __copy_to_user(&name->nodename,&system_utsname.nodename,__OLD_UTS_LEN);
......@@ -348,6 +354,9 @@ asmlinkage int sys_olduname(struct oldold_utsname * name)
error -= __put_user(0,name->version+__OLD_UTS_LEN);
error -= __copy_to_user(&name->machine,&system_utsname.machine,__OLD_UTS_LEN);
error -= __put_user(0,name->machine+__OLD_UTS_LEN);
up(&uts_sem);
error = error ? -EFAULT : 0;
return error;
......
......@@ -531,6 +531,24 @@ end_move_self:
out #0x60,al
call empty_8042
! wait until a20 really *is* enabled; it can take a fair amount of
! time on any
push ds
push es
xor ax,ax ! segment 0x0000
mov ds,ax
dec ax ! segment 0xffff (HMA)
mov es,ax
a20_wait:
inc ax
mov [0x7c00],ax ! any unused memory location < 64K
seg es
cmp ax,[0x7c10] ! corresponding HMA address
je a20_wait ! loop until no longer aliased
pop es
pop ds
! make sure any possible coprocessor is properly reset..
xor ax,ax
......
......@@ -104,11 +104,6 @@ startup_32:
* in 16-bit mode for the "real" operations.
*/
call setup_idt
xorl %eax,%eax
1: incl %eax # check that A20 really IS enabled
movl %eax,0x000000 # loop forever if it isn't
cmpl %eax,0x100000
je 1b
/*
* Initialize eflags. Some BIOS's leave bits like NT set. This would
* confuse the debugger if this code is traced.
......
......@@ -125,8 +125,10 @@ asmlinkage int sys_idle(void)
* the APM bios knowing only one CPU at a time will do
* so.
*/
if (!start_idle)
if (!start_idle) {
check_pgt_cache();
start_idle = jiffies;
}
if (jiffies - start_idle > HARD_IDLE_TIMEOUT)
hard_idle();
else {
......@@ -158,6 +160,7 @@ int cpu_idle(void *unused)
if(current_cpu_data.hlt_works_ok &&
!hlt_counter && !need_resched)
__asm("hlt");
check_pgt_cache();
/*
* tq_scheduler currently assumes we're running in a process
* context (ie that we hold the kernel lock..)
......@@ -551,9 +554,9 @@ int dump_fpu (struct pt_regs * regs, struct user_i387_struct* fpu)
if ((fpvalid = current->used_math) != 0) {
if (boot_cpu_data.hard_math) {
if (last_task_used_math == current) {
__asm__("clts ; fsave %0; fwait": :"m" (*fpu));
}
if (last_task_used_math == current) {
__asm__("clts ; fsave %0; fwait": :"m" (*fpu));
}
else
memcpy(fpu,&current->tss.i387.hard,sizeof(*fpu));
} else {
......
......@@ -361,7 +361,7 @@ static struct cpu_model_info cpu_models[] __initdata = {
{ X86_VENDOR_AMD, 5,
{ "K5/SSA5 (PR-75, PR-90, PR-100)", "K5 (PR-120, PR-133)",
"K5 (PR-166)", "K5 (PR-200)", NULL, NULL,
"K6 (166 - 266)", "K6 (166 - 300)", "K6-3D (200 - 450)",
"K6 (166 - 266)", "K6 (166 - 300)", "K6-2 (200 - 450)",
"K6-3D-Plus (200 - 450)", NULL, NULL, NULL, NULL, NULL, NULL }},
{ X86_VENDOR_UMC, 4,
{ NULL, "U5D", "U5S", NULL, NULL, NULL, NULL, NULL, NULL, NULL,
......@@ -442,11 +442,11 @@ int get_cpuinfo(char * buffer)
{
char *p = buffer;
int sep_bug;
static const char *x86_cap_flags[] = {
"fpu", "vme", "de", "pse", "tsc", "msr", "pae", "mce",
"cx8", "apic", "10", "sep", "mtrr", "pge", "mca", "cmov",
"fcmov", "17", "18", "19", "20", "21", "22", "mmx",
"osfxsr", "25", "26", "27", "28", "29", "30", "amd3d"
static char *x86_cap_flags[] = {
"fpu", "vme", "de", "pse", "tsc", "msr", "6", "mce",
"cx8", "9", "10", "sep", "12", "pge", "14", "cmov",
"16", "17", "18", "19", "20", "21", "22", "mmx",
"24", "25", "26", "27", "28", "29", "30", "31"
};
struct cpuinfo_x86 *c = cpu_data;
int i, n;
......@@ -474,6 +474,24 @@ int get_cpuinfo(char * buffer)
} else
p += sprintf(p, "stepping\t: unknown\n");
/* Modify the capabilities according to chip type */
if (c->x86_mask) {
if (c->x86_vendor == X86_VENDOR_CYRIX) {
x86_cap_flags[24] = "cxmmx";
} else if (c->x86_vendor == X86_VENDOR_AMD) {
x86_cap_flags[16] = "fcmov";
x86_cap_flags[31] = "amd3d";
} else if (c->x86_vendor == X86_VENDOR_INTEL) {
x86_cap_flags[6] = "pae";
x86_cap_flags[9] = "apic";
x86_cap_flags[12] = "mtrr";
x86_cap_flags[14] = "mca";
x86_cap_flags[16] = "pat";
x86_cap_flags[17] = "pse";
x86_cap_flags[24] = "osfxsr";
}
}
sep_bug = c->x86_vendor == X86_VENDOR_INTEL &&
c->x86 == 0x06 &&
c->cpuid_level >= 0 &&
......
......@@ -597,6 +597,9 @@ __initfunc(void smp_store_cpu_info(int id))
struct cpuinfo_x86 *c=&cpu_data[id];
*c = boot_cpu_data;
c->pte_quick = 0;
c->pgd_quick = 0;
c->pgtable_cache_sz = 0;
identify_cpu(c);
/*
* Mask B, Pentium, but not Pentium MMX
......
......@@ -216,9 +216,13 @@ asmlinkage int sys_ipc (uint call, int first, int second, int third, void *ptr,
*/
asmlinkage int sys_uname(struct old_utsname * name)
{
if (name && !copy_to_user(name, &system_utsname, sizeof (*name)))
return 0;
return -EFAULT;
int err;
if (!name)
return -EFAULT;
down(&uts_sem);
err=copy_to_user(name, &system_utsname, sizeof (*name));
up(&uts_sem);
return err?-EFAULT:0;
}
asmlinkage int sys_olduname(struct oldold_utsname * name)
......@@ -230,6 +234,8 @@ asmlinkage int sys_olduname(struct oldold_utsname * name)
if (!access_ok(VERIFY_WRITE,name,sizeof(struct oldold_utsname)))
return -EFAULT;
down(&uts_sem);
error = __copy_to_user(&name->sysname,&system_utsname.sysname,__OLD_UTS_LEN);
error |= __put_user(0,name->sysname+__OLD_UTS_LEN);
error |= __copy_to_user(&name->nodename,&system_utsname.nodename,__OLD_UTS_LEN);
......@@ -240,7 +246,9 @@ asmlinkage int sys_olduname(struct oldold_utsname * name)
error |= __put_user(0,name->version+__OLD_UTS_LEN);
error |= __copy_to_user(&name->machine,&system_utsname.machine,__OLD_UTS_LEN);
error |= __put_user(0,name->machine+__OLD_UTS_LEN);
up(&uts_sem);
error = error ? -EFAULT : 0;
return error;
......
......@@ -8,6 +8,9 @@
* Authors: Jorge Cwik, <jorge@laser.satlink.net>
* Arnt Gulbrandsen, <agulbra@nvg.unit.no>
* Tom May, <ftom@netcom.com>
* Pentium Pro/II routines:
* Alexander Kjeldaas <astor@guardian.no>
* Finn Arne Gangstad <finnag@guardian.no>
* Lots of code moved from tcp.c and ip.c; see those files
* for more names.
*
......@@ -26,6 +29,8 @@
* computes a partial checksum, e.g. for TCP/UDP fragments
*/
#if CPU!=686
unsigned int csum_partial(const unsigned char * buff, int len, unsigned int sum) {
/*
* Experiments with ethernet and slip connections show that buff
......@@ -97,6 +102,101 @@ unsigned int csum_partial(const unsigned char * buff, int len, unsigned int sum)
return(sum);
}
#else /* 686 */
unsigned int csum_partial(const unsigned char * buf, int len, unsigned int sum) {
__asm__ ("
testl $2, %%esi
jnz 30f
10:
movl %%ecx, %%edx
movl %%ecx, %%ebx
andl $0x7c, %%ebx
shrl $7, %%ecx
addl %%ebx,%%esi
shrl $2, %%ebx
negl %%ebx
lea 45f(%%ebx,%%ebx,2), %%ebx
testl %%esi, %%esi
jmp %%ebx
# Handle 2-byte-aligned regions
20: addw (%%esi), %%ax
lea 2(%%esi), %%esi
adcl $0, %%eax
jmp 10b
30: subl $2, %%ecx
ja 20b
je 32f
movzbl (%%esi),%%ebx # csumming 1 byte, 2-aligned
addl %%ebx, %%eax
adcl $0, %%eax
jmp 80f
32:
addw (%%esi), %%ax # csumming 2 bytes, 2-aligned
adcl $0, %%eax
jmp 80f
40:
addl -128(%%esi), %%eax
adcl -124(%%esi), %%eax
adcl -120(%%esi), %%eax
adcl -116(%%esi), %%eax
adcl -112(%%esi), %%eax
adcl -108(%%esi), %%eax
adcl -104(%%esi), %%eax
adcl -100(%%esi), %%eax
adcl -96(%%esi), %%eax
adcl -92(%%esi), %%eax
adcl -88(%%esi), %%eax
adcl -84(%%esi), %%eax
adcl -80(%%esi), %%eax
adcl -76(%%esi), %%eax
adcl -72(%%esi), %%eax
adcl -68(%%esi), %%eax
adcl -64(%%esi), %%eax
adcl -60(%%esi), %%eax
adcl -56(%%esi), %%eax
adcl -52(%%esi), %%eax
adcl -48(%%esi), %%eax
adcl -44(%%esi), %%eax
adcl -40(%%esi), %%eax
adcl -36(%%esi), %%eax
adcl -32(%%esi), %%eax
adcl -28(%%esi), %%eax
adcl -24(%%esi), %%eax
adcl -20(%%esi), %%eax
adcl -16(%%esi), %%eax
adcl -12(%%esi), %%eax
adcl -8(%%esi), %%eax
adcl -4(%%esi), %%eax
45:
lea 128(%%esi), %%esi
adcl $0, %%eax
dec %%ecx
jge 40b
movl %%edx, %%ecx
50: andl $3, %%ecx
jz 80f
# Handle the last 1-3 bytes without jumping
notl %%ecx # 1->2, 2->1, 3->0, higher bits are masked
movl $0xffffff,%%ebx # by the shll and shrl instructions
shll $3,%%ecx
shrl %%cl,%%ebx
andl -128(%%esi),%%ebx # esi is 4-aligned so should be ok
addl %%ebx,%%eax
adcl $0,%%eax
80: "
: "=a"(sum)
: "0"(sum), "c"(len), "S"(buf)
: "bx", "cx", "dx", "si");
return(sum);
}
#endif
/*
* Copy from ds while checksumming, otherwise like csum_partial
*
......@@ -112,13 +212,15 @@ unsigned int csum_partial(const unsigned char * buff, int len, unsigned int sum)
" 9999: "#y"; \n \
.section __ex_table, \"a\"; \n \
.long 9999b, 6001f \n \
.previous"
.previous\n"
#define DST(y...) \
" 9999: "#y"; \n \
.section __ex_table, \"a\"; \n \
.long 9999b, 6002f \n \
.previous"
.previous\n"
#if CPU!=686
unsigned int csum_partial_copy_generic (const char *src, char *dst,
int len, int sum, int *src_err_ptr, int *dst_err_ptr)
......@@ -242,6 +344,79 @@ unsigned int csum_partial_copy_generic (const char *src, char *dst,
return(sum);
}
#else /* CPU == 686 */
#define ROUND1(x) \
SRC(movl x(%%esi), %%ebx ) \
"addl %%ebx, %%eax\n" \
DST(movl %%ebx, x(%%edi) )
#define ROUND(x) \
SRC(movl x(%%esi), %%ebx ) \
"adcl %%ebx, %%eax\n" \
DST(movl %%ebx, x(%%edi) )
unsigned int csum_partial_copy_generic (const char *src, char *dst,
int len, int sum, int *src_err_ptr, int *dst_err_ptr)
{
__asm__ __volatile__ ("
movl %%ecx, %%edx
movl %%ecx, %%ebx
shrl $6, %%ecx
andl $0x3c, %%ebx
negl %%ebx
subl %%ebx, %%esi
subl %%ebx, %%edi
lea 3f(%%ebx,%%ebx), %%ebx
testl %%esi, %%esi
jmp %%ebx
1: addl $64,%%esi
addl $64,%%edi\n"
ROUND1(-64) ROUND(-60) ROUND(-56) ROUND(-52)
ROUND (-48) ROUND(-44) ROUND(-40) ROUND(-36)
ROUND (-32) ROUND(-28) ROUND(-24) ROUND(-20)
ROUND (-16) ROUND(-12) ROUND(-8) ROUND(-4)
"3: adcl $0,%%eax
dec %%ecx
jge 1b
4: andl $3, %%edx
jz 7f
cmpl $2, %%edx
jb 5f
" SRC(movw (%%esi), %%dx )"
leal 2(%%esi), %%esi
" DST(movw %%dx, (%%edi) )"
leal 2(%%edi), %%edi
je 6f
shll $16,%%edx
5:" SRC(movb (%%esi), %%dl )"
" DST(movb %%dl, (%%edi) )"
6: addl %%edx, %%eax
adcl $0, %%eax
7:
.section .fixup, \"ax\"
6000: movl %7, (%%ebx)
# FIXME: do zeroing of rest of the buffer here.
jmp 7b
6001: movl %1, %%ebx
jmp 6000b
6002: movl %2, %%ebx
jmp 6000b
.previous
"
: "=a"(sum), "=m"(src_err_ptr), "=m"(dst_err_ptr)
: "0"(sum), "c"(len), "S"(src), "D" (dst),
"i" (-EFAULT)
: "bx", "cx", "dx", "si", "di" );
return(sum);
}
#undef ROUND
#undef ROUND1
#endif
#undef SRC
#undef DST
......
......@@ -27,11 +27,66 @@
#include <asm/pgtable.h>
#include <asm/dma.h>
const char bad_pmd_string[] = "Bad pmd in pte_alloc: %08lx\n";
extern void die_if_kernel(char *,struct pt_regs *,long);
extern void show_net_buffers(void);
void __bad_pte_kernel(pmd_t *pmd)
{
printk("Bad pmd in pte_alloc: %08lx\n", pmd_val(*pmd));
pmd_val(*pmd) = _KERNPG_TABLE + __pa(BAD_PAGETABLE);
}
void __bad_pte(pmd_t *pmd)
{
printk("Bad pmd in pte_alloc: %08lx\n", pmd_val(*pmd));
pmd_val(*pmd) = _PAGE_TABLE + __pa(BAD_PAGETABLE);
}
pte_t *get_pte_kernel_slow(pmd_t *pmd, unsigned long offset)
{
pte_t *pte;
pte = (pte_t *) __get_free_page(GFP_KERNEL);
if (pmd_none(*pmd)) {
if (pte) {
clear_page((unsigned long)pte);
pmd_val(*pmd) = _KERNPG_TABLE + __pa(pte);
return pte + offset;
}
pmd_val(*pmd) = _KERNPG_TABLE + __pa(BAD_PAGETABLE);
return NULL;
}
free_page((unsigned long)pte);
if (pmd_bad(*pmd)) {
__bad_pte_kernel(pmd);
return NULL;
}
return (pte_t *) pmd_page(*pmd) + offset;
}
pte_t *get_pte_slow(pmd_t *pmd, unsigned long offset)
{
unsigned long pte;
pte = (unsigned long) __get_free_page(GFP_KERNEL);
if (pmd_none(*pmd)) {
if (pte) {
clear_page(pte);
pmd_val(*pmd) = _PAGE_TABLE + __pa(pte);
return (pte_t *)(pte + offset);
}
pmd_val(*pmd) = _PAGE_TABLE + __pa(BAD_PAGETABLE);
return NULL;
}
free_page(pte);
if (pmd_bad(*pmd)) {
__bad_pte(pmd);
return NULL;
}
return (pte_t *) (pmd_page(*pmd) + offset);
}
/*
* BAD_PAGE is the page that is used for page faults when linux
* is out-of-memory. Older versions of linux just did a
......@@ -82,7 +137,7 @@ void show_mem(void)
total++;
if (PageReserved(mem_map+i))
reserved++;
if (PageSwapCache(mem_map+i))
else if (PageSwapCache(mem_map+i))
cached++;
else if (!atomic_read(&mem_map[i].count))
free++;
......@@ -93,6 +148,7 @@ void show_mem(void)
printk("%d reserved pages\n",reserved);
printk("%d pages shared\n",shared);
printk("%d pages swap cached\n",cached);
printk("%ld pages in page table cache\n",pgtable_cache_size);
show_buffers();
#ifdef CONFIG_NET
show_net_buffers();
......
......@@ -64,6 +64,11 @@ CORE_FILES := $(CORE_FILES) arch/m68k/mac/mac.o
SUBDIRS := $(SUBDIRS) arch/m68k/mac
endif
ifdef CONFIG_HP300
CORE_FILES := $(CORE_FILES) arch/m68k/hp300/hp300.o
SUBDIRS := $(SUBDIRS) arch/m68k/hp300
endif
ifdef CONFIG_APOLLO
CORE_FILES := $(CORE_FILES) arch/m68k/apollo/apollo.o
SUBDIRS := $(SUBDIRS) arch/m68k/apollo
......@@ -74,6 +79,11 @@ CORE_FILES := $(CORE_FILES) arch/m68k/mvme16x/mvme16x.o
SUBDIRS := $(SUBDIRS) arch/m68k/mvme16x
endif
ifdef CONFIG_BVME6000
CORE_FILES := $(CORE_FILES) arch/m68k/bvme6000/bvme6000.o
SUBDIRS := $(SUBDIRS) arch/m68k/bvme6000
endif
ifdef CONFIG_M68040
CORE_FILES := $(CORE_FILES) arch/m68k/fpsp040/fpsp.o
SUBDIRS := $(SUBDIRS) arch/m68k/fpsp040
......
......@@ -294,7 +294,7 @@ SYMBOL_NAME_STR(atari_fast_irq_handler) ":
addql #8,%%sp
addql #4,%%sp
jbra "SYMBOL_NAME_STR(ret_from_interrupt)
: : "i" (&kstat.irqs), "n" (PT_OFF_FORMATVEC)
: : "i" (&kstat.irqs[0]), "n" (PT_OFF_FORMATVEC)
);
}
......
......@@ -28,7 +28,6 @@
#include <asm/atariints.h>
#include <asm/atarihw.h>
#include <asm/atarikb.h>
#include <asm/atari_mouse.h>
#include <asm/atari_joystick.h>
#include <asm/irq.h>
......@@ -193,7 +192,7 @@ static u_short ataalt_map[NR_KEYS] __initdata = {
0xf200, 0xf200, 0xf200, 0xf200, 0xf200, 0xf200, 0xf200, 0xf200
};
static u_short atashift_alt_map[NR_KEYS] = {
static u_short atashift_alt_map[NR_KEYS] __initdata = {
0xf200, 0xf81b, 0xf821, 0xf840, 0xf823, 0xf824, 0xf825, 0xf85e,
0xf826, 0xf82a, 0xf828, 0xf829, 0xf85f, 0xf82b, 0xf808, 0xf809,
0xf851, 0xf857, 0xf845, 0xf852, 0xf854, 0xf859, 0xf855, 0xf849,
......@@ -767,14 +766,17 @@ void atari_kbd_leds (unsigned int leds)
__initfunc(int atari_keyb_init(void))
{
/* setup key map */
memcpy(plain_map, ataplain_map, sizeof(plain_map));
memcpy(shift_map, atashift_map, sizeof(shift_map));
memcpy(key_maps[0], ataplain_map, sizeof(plain_map));
memcpy(key_maps[1], atashift_map, sizeof(plain_map));
memcpy(key_maps[4], atactrl_map, sizeof(plain_map));
memcpy(key_maps[5], atashift_ctrl_map, sizeof(plain_map));
memcpy(key_maps[8], ataalt_map, sizeof(plain_map));
/* Atari doesn't have an altgr_map, so we can reuse its memory for
atashift_alt_map */
memcpy(key_maps[2], atashift_alt_map, sizeof(plain_map));
key_maps[9] = key_maps[2];
key_maps[2] = 0; /* ataaltgr_map */
memcpy(ctrl_map, atactrl_map, sizeof(ctrl_map));
memcpy(shift_ctrl_map, atashift_ctrl_map, sizeof(shift_ctrl_map));
memcpy(alt_map, ataalt_map, sizeof(alt_map));
key_maps[9] = atashift_alt_map;
memcpy(ctrl_alt_map, atactrl_alt_map, sizeof(ctrl_alt_map));
memcpy(key_maps[12], atactrl_alt_map, sizeof(plain_map));
key_maps[13] = atashift_ctrl_alt_map;
keymap_count = 8;
......@@ -860,3 +862,8 @@ int atari_kbdrate( struct kbd_repeat *k )
return( 0 );
}
/* for "kbd-reset" cmdline param */
__initfunc(void kbd_reset_setup(char *str, int *ints))
{
}
......@@ -10,6 +10,9 @@
* License. See the file COPYING in the main directory of this archive
* for more details.
*
* 1998-05-31 ++andreas: atari_mksound rewritten to always use the envelope,
* no timer, atari_nosound removed.
*
*/
......@@ -31,22 +34,6 @@
* stuff from the old atasound.c
*/
static void atari_nosound (unsigned long ignored)
{
unsigned char tmp;
unsigned long flags;
/* turn off generator A in mixer control */
save_flags(flags);
cli();
sound_ym.rd_data_reg_sel = 7;
tmp = sound_ym.rd_data_reg_sel;
sound_ym.wd_data = tmp | 0x39;
restore_flags(flags);
}
void atari_microwire_cmd (int cmd)
{
tt_microwire.mask = 0x7ff;
......@@ -58,90 +45,62 @@ void atari_microwire_cmd (int cmd)
}
#define PC_FREQ 1192180
/* PSG base frequency */
#define PSG_FREQ 125000
/* PSG envelope base frequency times 10 */
#define PSG_ENV_FREQ_10 78125
void atari_mksound (unsigned int count, unsigned int ticks)
void atari_mksound (unsigned int hz, unsigned int ticks)
{
static struct timer_list sound_timer = { NULL, NULL, 0, 0,
atari_nosound };
/*
* Generates sound of some count for some number of clock ticks
* [count = 1193180 / frequency]
*/
/* Generates sound of some frequency for some number of clock
ticks. */
unsigned long flags;
unsigned char tmp;
int period;
save_flags(flags);
cli();
if (count == 750 && ticks == HZ/8) {
/* Special case: These values are used by console.c to
* generate the console bell. They are cached here and the
* sound actually generated is somehow special: it uses the
* generator B and an envelope. No timer is needed therefore
* and the bell doesn't disturb an other ongoing sound.
*/
/* Convert from frequency value to PSG period value (base
frequency 125 kHz). */
period = PSG_FREQ / hz;
if (period > 0xfff) period = 0xfff;
/* set envelope duration to 492 ms */
/* Disable generator A in mixer control. */
sound_ym.rd_data_reg_sel = 7;
tmp = sound_ym.rd_data_reg_sel;
tmp |= 011;
sound_ym.wd_data = tmp;
/* Set generator A frequency to hz. */
sound_ym.rd_data_reg_sel = 0;
sound_ym.wd_data = period & 0xff;
sound_ym.rd_data_reg_sel = 1;
sound_ym.wd_data = (period >> 8) & 0xf;
if (ticks) {
/* Set length of envelope (max 8 sec). */
int length = (ticks * PSG_ENV_FREQ_10) / HZ / 10;
if (length > 0xffff) length = 0xffff;
sound_ym.rd_data_reg_sel = 11;
sound_ym.wd_data = 0;
sound_ym.wd_data = length & 0xff;
sound_ym.rd_data_reg_sel = 12;
sound_ym.wd_data = 15;
/* envelope form: max -> min single */
sound_ym.wd_data = length >> 8;
/* Envelope form: max -> min single. */
sound_ym.rd_data_reg_sel = 13;
sound_ym.wd_data = 9;
/* set generator B frequency to 2400 Hz */
sound_ym.rd_data_reg_sel = 2;
sound_ym.wd_data = 52;
sound_ym.rd_data_reg_sel = 3;
sound_ym.wd_data = 0;
/* set volume of generator B to envelope control */
sound_ym.rd_data_reg_sel = 9;
/* Use envelope for generator A. */
sound_ym.rd_data_reg_sel = 8;
sound_ym.wd_data = 0x10;
/* enable generator B in the mixer control */
sound_ym.rd_data_reg_sel = 7;
tmp = sound_ym.rd_data_reg_sel;
sound_ym.wd_data = (tmp & ~0x02) | 0x38;
restore_flags(flags);
return;
}
del_timer( &sound_timer );
if (!count) {
atari_nosound( 0 );
}
else {
/* convert from frequency value
* to PSG period value (base frequency 125 kHz).
*/
int period = PSG_FREQ / count;
if (period > 0xfff) period = 0xfff;
/* set generator A frequency to 0 */
sound_ym.rd_data_reg_sel = 0;
sound_ym.wd_data = period & 0xff;
sound_ym.rd_data_reg_sel = 1;
sound_ym.wd_data = (period >> 8) & 0xf;
/* turn on generator A in mixer control (but not noise
* generator!) */
sound_ym.rd_data_reg_sel = 7;
tmp = sound_ym.rd_data_reg_sel;
sound_ym.wd_data = (tmp & ~0x01) | 0x38;
/* set generator A level to maximum, no envelope */
} else {
/* Set generator A level to maximum, no envelope. */
sound_ym.rd_data_reg_sel = 8;
sound_ym.wd_data = 15;
if (ticks) {
sound_timer.expires = jiffies + ticks;
add_timer( &sound_timer );
}
}
/* Turn on generator A in mixer control. */
sound_ym.rd_data_reg_sel = 7;
tmp &= ~1;
sound_ym.wd_data = tmp;
restore_flags(flags);
}
......@@ -38,6 +38,7 @@
#include <asm/atari_stram.h>
#include <asm/system.h>
#include <asm/machdep.h>
#include <asm/hwtest.h>
u_long atari_mch_cookie;
u_long atari_mch_type = 0;
......@@ -98,39 +99,15 @@ static char atari_sysrq_xlate[128] =
extern void (*kd_mksound)(unsigned int, unsigned int);
/* This function tests for the presence of an address, specially a
* hardware register address. It is called very early in the kernel
* initialization process, when the VBR register isn't set up yet. On
* an Atari, it still points to address 0, which is unmapped. So a bus
* error would cause another bus error while fetching the exception
* vector, and the CPU would do nothing at all. So we needed to set up
* a temporary VBR and a vector table for the duration of the test.
/* I've moved hwreg_present() and hwreg_present_bywrite() out into
* mm/hwtest.c, to avoid having multiple copies of the same routine
* in the kernel [I wanted them in hp300 and they were already used
* in the nubus code. NB: I don't have an Atari so this might (just
* conceivably) break something.
* I've preserved the #if 0 version of hwreg_present_bywrite() here
* for posterity.
* -- Peter Maydell <pmaydell@chiark.greenend.org.uk>, 05/1998
*/
__initfunc(static int hwreg_present( volatile void *regp ))
{
int ret = 0;
long save_sp, save_vbr;
long tmp_vectors[3];
__asm__ __volatile__
( "movec %/vbr,%2\n\t"
"movel #Lberr1,%4@(8)\n\t"
"movec %4,%/vbr\n\t"
"movel %/sp,%1\n\t"
"moveq #0,%0\n\t"
"tstb %3@\n\t"
"nop\n\t"
"moveq #1,%0\n"
"Lberr1:\n\t"
"movel %1,%/sp\n\t"
"movec %2,%/vbr"
: "=&d" (ret), "=&r" (save_sp), "=&r" (save_vbr)
: "a" (regp), "a" (tmp_vectors)
);
return( ret );
}
#if 0
__initfunc(static int
......@@ -163,35 +140,6 @@ hwreg_present_bywrite(volatile void *regp, unsigned char val))
}
#endif
/* Basically the same, but writes a value into a word register, protected
* by a bus error handler */
__initfunc(static int hwreg_write( volatile void *regp, unsigned short val ))
{
int ret;
long save_sp, save_vbr;
long tmp_vectors[3];
__asm__ __volatile__
( "movec %/vbr,%2\n\t"
"movel #Lberr2,%4@(8)\n\t"
"movec %4,%/vbr\n\t"
"movel %/sp,%1\n\t"
"moveq #0,%0\n\t"
"movew %5,%3@\n\t"
"nop \n\t" /* If this nop isn't present, 'ret' may already be
* loaded with 1 at the time the bus error
* happens! */
"moveq #1,%0\n"
"Lberr2:\n\t"
"movel %1,%/sp\n\t"
"movec %2,%/vbr"
: "=&d" (ret), "=&r" (save_sp), "=&r" (save_vbr)
: "a" (regp), "a" (tmp_vectors), "g" (val)
);
return( ret );
}
/* ++roman: This is a more elaborate test for an SCC chip, since the plain
* Medusa board generates DTACK at the SCC's standard addresses, but a SCC
......
......@@ -15,7 +15,6 @@
#include <asm/atarikb.h>
#include <asm/atari_joystick.h>
#include <asm/atari_mouse.h>
#include <asm/uaccess.h>
#define MAJOR_NR JOYSTICK_MAJOR
......
......@@ -954,7 +954,7 @@ static int unswap_by_read( unsigned char *map, unsigned long max,
return( -ENOMEM );
}
DPRINTK( "unswap: reading swap page %lu to %08lx\n", i, page );
read_swap_page( entry, (char *)page );
rw_swap_page( READ, entry, (char *)page, 1 );
for_each_task(p) {
if (unswap_process( p->mm, entry, page, 0 )) {
......
......@@ -83,7 +83,7 @@ static void mste_write(struct MSTE_RTC *val)
#define RTC_READ(reg) \
({ unsigned char __val; \
writeb(reg,&tt_rtc.regsel); \
(void) writeb(reg,&tt_rtc.regsel); \
__val = tt_rtc.data; \
__val; \
})
......
#
# Makefile for Linux arch/m68k/bvme6000 source directory
#
# Note! Dependencies are done automagically by 'make dep', which also
# removes any old dependencies. DON'T put your own dependencies here
# unless it's something special (ie not a .c file).
#
# Note 2! The CFLAGS definitions are now in the main makefile...
O_TARGET := bvme6000.o
O_OBJS := config.o bvmeints.o rtc.o
#OX_OBJS = ksyms.o
include $(TOPDIR)/Rules.make
/*
* arch/m68k/bvme6000/bvmeints.c
*
* Copyright (C) 1997 Richard Hirst [richard@sleepie.demon.co.uk]
*
* based on amiints.c -- Amiga Linux interrupt handling code
*
* 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.
*
*/
#include <linux/types.h>
#include <linux/kernel.h>
#include <linux/errno.h>
#include <asm/ptrace.h>
#include <asm/system.h>
#include <asm/irq.h>
#include <asm/traps.h>
static void bvme6000_defhand (int irq, void *dev_id, struct pt_regs *fp);
/*
* This should ideally be 4 elements only, for speed.
*/
static struct {
void (*handler)(int, void *, struct pt_regs *);
unsigned long flags;
void *dev_id;
const char *devname;
unsigned count;
} irq_tab[256];
/*
* void bvme6000_init_IRQ (void)
*
* Parameters: None
*
* Returns: Nothing
*
* This function is called during kernel startup to initialize
* the bvme6000 IRQ handling routines.
*/
void bvme6000_init_IRQ (void)
{
int i;
for (i = 0; i < 256; i++) {
irq_tab[i].handler = bvme6000_defhand;
irq_tab[i].flags = IRQ_FLG_STD;
irq_tab[i].dev_id = NULL;
irq_tab[i].devname = NULL;
irq_tab[i].count = 0;
}
}
int bvme6000_request_irq(unsigned int irq,
void (*handler)(int, void *, struct pt_regs *),
unsigned long flags, const char *devname, void *dev_id)
{
if (irq > 255) {
printk("%s: Incorrect IRQ %d from %s\n", __FUNCTION__, irq, devname);
return -ENXIO;
}
#if 0
/* Nothing special about auto-vectored devices for the BVME6000,
* but treat it specially to avoid changes elsewhere.
*/
if (irq >= VEC_INT1 && irq <= VEC_INT7)
return sys_request_irq(irq - VEC_SPUR, handler, flags,
devname, dev_id);
#endif
if (!(irq_tab[irq].flags & IRQ_FLG_STD)) {
if (irq_tab[irq].flags & IRQ_FLG_LOCK) {
printk("%s: IRQ %d from %s is not replaceable\n",
__FUNCTION__, irq, irq_tab[irq].devname);
return -EBUSY;
}
if (flags & IRQ_FLG_REPLACE) {
printk("%s: %s can't replace IRQ %d from %s\n",
__FUNCTION__, devname, irq, irq_tab[irq].devname);
return -EBUSY;
}
}
irq_tab[irq].handler = handler;
irq_tab[irq].flags = flags;
irq_tab[irq].dev_id = dev_id;
irq_tab[irq].devname = devname;
return 0;
}
void bvme6000_free_irq(unsigned int irq, void *dev_id)
{
if (irq > 255) {
printk("%s: Incorrect IRQ %d\n", __FUNCTION__, irq);
return;
}
#if 0
if (irq >= VEC_INT1 && irq <= VEC_INT7) {
sys_free_irq(irq - VEC_SPUR, dev_id);
return;
}
#endif
if (irq_tab[irq].dev_id != dev_id)
printk("%s: Removing probably wrong IRQ %d from %s\n",
__FUNCTION__, irq, irq_tab[irq].devname);
irq_tab[irq].handler = bvme6000_defhand;
irq_tab[irq].flags = IRQ_FLG_STD;
irq_tab[irq].dev_id = NULL;
irq_tab[irq].devname = NULL;
}
void bvme6000_process_int (unsigned long vec, struct pt_regs *fp)
{
if (vec > 255)
panic ("bvme6000_process_int: Illegal vector %ld", vec);
irq_tab[vec].count++;
irq_tab[vec].handler(vec, irq_tab[vec].dev_id, fp);
}
int bvme6000_get_irq_list (char *buf)
{
int i, len = 0;
for (i = 0; i < 256; i++) {
if (irq_tab[i].count)
len += sprintf (buf+len, "Vec 0x%02x: %8d %s\n",
i, irq_tab[i].count,
irq_tab[i].devname ? irq_tab[i].devname : "free");
}
return len;
}
static void bvme6000_defhand (int irq, void *dev_id, struct pt_regs *fp)
{
printk ("Unknown interrupt 0x%02x\n", irq);
}
void bvme6000_enable_irq (unsigned int irq)
{
}
void bvme6000_disable_irq (unsigned int irq)
{
}
This diff is collapsed.
/*
* Real Time Clock interface for Linux on the BVME6000
*
* Based on the PC driver by Paul Gortmaker.
*/
#define RTC_VERSION "1.00"
#include <linux/types.h>
#include <linux/errno.h>
#include <linux/miscdevice.h>
#include <linux/malloc.h>
#include <linux/ioport.h>
#include <linux/fcntl.h>
#include <linux/init.h>
#include <linux/poll.h>
#include <linux/mc146818rtc.h> /* For struct rtc_time and ioctls, etc */
#include <asm/bvme6000hw.h>
#include <asm/io.h>
#include <asm/uaccess.h>
#include <asm/system.h>
#include <asm/setup.h>
/*
* We sponge a minor off of the misc major. No need slurping
* up another valuable major dev number for this. If you add
* an ioctl, make sure you don't conflict with SPARC's RTC
* ioctls.
*/
#define BCD2BIN(val) (((val)&15) + ((val)>>4)*10)
#define BIN2BCD(val) ((((val)/10)<<4) + (val)%10)
static unsigned char days_in_mo[] =
{0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
static char rtc_status = 0;
static int rtc_ioctl(struct inode *inode, struct file *file, unsigned int cmd,
unsigned long arg)
{
volatile RtcPtr_t rtc = (RtcPtr_t)BVME_RTC_BASE;
unsigned char msr;
unsigned long flags;
struct rtc_time wtime;
switch (cmd) {
case RTC_RD_TIME: /* Read the time/date from RTC */
{
save_flags(flags);
cli();
/* Ensure clock and real-time-mode-register are accessible */
msr = rtc->msr & 0xc0;
rtc->msr = 0x40;
do {
wtime.tm_sec = BCD2BIN(rtc->bcd_sec);
wtime.tm_min = BCD2BIN(rtc->bcd_min);
wtime.tm_hour = BCD2BIN(rtc->bcd_hr);
wtime.tm_mday = BCD2BIN(rtc->bcd_dom);
wtime.tm_mon = BCD2BIN(rtc->bcd_mth)-1;
wtime.tm_year = BCD2BIN(rtc->bcd_year);
if (wtime.tm_year < 70)
wtime.tm_year += 100;
wtime.tm_wday = BCD2BIN(rtc->bcd_dow)-1;
} while (wtime.tm_sec != BCD2BIN(rtc->bcd_sec));
rtc->msr = msr;
restore_flags(flags);
return copy_to_user((void *)arg, &wtime, sizeof wtime) ?
-EFAULT : 0;
}
case RTC_SET_TIME: /* Set the RTC */
{
unsigned char leap_yr;
struct rtc_time rtc_tm;
if (!suser())
return -EACCES;
if (copy_from_user(&rtc_tm, (struct rtc_time*)arg,
sizeof(struct rtc_time)))
return -EFAULT;
leap_yr = ((!(rtc_tm.tm_year % 4) && (rtc_tm.tm_year % 100)) || !(rtc_tm.tm_year % 400));
if ((rtc_tm.tm_mon > 12) || (rtc_tm.tm_mday == 0))
return -EINVAL;
if (rtc_tm.tm_mday > (days_in_mo[rtc_tm.tm_mon] + ((rtc_tm.tm_mon == 2) && leap_yr)))
return -EINVAL;
if ((rtc_tm.tm_hour >= 24) || (rtc_tm.tm_min >= 60) || (rtc_tm.tm_sec >= 60))
return -EINVAL;
save_flags(flags);
cli();
/* Ensure clock and real-time-mode-register are accessible */
msr = rtc->msr & 0xc0;
rtc->msr = 0x40;
rtc->t0cr_rtmr = rtc_tm.tm_year%4;
rtc->bcd_tenms = 0;
rtc->bcd_sec = BIN2BCD(rtc_tm.tm_sec);
rtc->bcd_min = BIN2BCD(rtc_tm.tm_min);
rtc->bcd_hr = BIN2BCD(rtc_tm.tm_hour);
rtc->bcd_dom = BIN2BCD(rtc_tm.tm_mday);
rtc->bcd_mth = BIN2BCD(rtc_tm.tm_mon + 1);
rtc->bcd_year = BIN2BCD(rtc_tm.tm_year%100);
if (rtc_tm.tm_wday >= 0)
rtc->bcd_dow = BIN2BCD(rtc_tm.tm_wday+1);
rtc->t0cr_rtmr = rtc_tm.tm_year%4 | 0x08;
rtc->msr = msr;
restore_flags(flags);
return 0;
}
default:
return -EINVAL;
}
}
/*
* We enforce only one user at a time here with the open/close.
* Also clear the previous interrupt data on an open, and clean
* up things on a close.
*/
static int rtc_open(struct inode *inode, struct file *file)
{
if(rtc_status)
return -EBUSY;
rtc_status = 1;
return 0;
}
static int rtc_release(struct inode *inode, struct file *file)
{
rtc_status = 0;
return 0;
}
/*
* The various file operations we support.
*/
static struct file_operations rtc_fops = {
NULL,
NULL,
NULL, /* No write */
NULL, /* No readdir */
NULL,
rtc_ioctl,
NULL, /* No mmap */
rtc_open,
rtc_release
};
static struct miscdevice rtc_dev=
{
RTC_MINOR,
"rtc",
&rtc_fops
};
__initfunc(int rtc_DP8570A_init(void))
{
if (!MACH_IS_BVME6000)
return -ENODEV;
printk(KERN_INFO "DP8570A Real Time Clock Driver v%s\n", RTC_VERSION);
misc_register(&rtc_dev);
return 0;
}
......@@ -19,7 +19,7 @@ fi
endmenu
mainmenu_option next_comment
comment 'Platform-dependent setup'
comment 'Platform dependent setup'
bool 'Amiga support' CONFIG_AMIGA
bool 'Atari support' CONFIG_ATARI
......@@ -30,13 +30,19 @@ if [ "$CONFIG_ATARI" = "y" ]; then
fi
fi
bool 'Macintosh support' CONFIG_MAC
if [ "$CONFIG_MAC" = "y" ]; then
define_bool CONFIG_NUBUS y
fi
bool 'Apollo support' CONFIG_APOLLO
bool 'VME (Motorola and BVM) support' CONFIG_VME
if [ "$CONFIG_VME" = "y" ]; then
bool 'MVME162, 166 and 167 support' CONFIG_MVME16x
# bool 'BVME4000 and BVME6000 support' CONFIG_BVME6000
bool 'BVME4000 and BVME6000 support' CONFIG_BVME6000
fi
bool 'HP9000/300 support' CONFIG_HP300
if [ "$CONFIG_HP300" = "y" ]; then
bool 'DIO bus support' CONFIG_DIO
fi
if [ "$CONFIG_PCI" = "y" ]; then
bool 'Backward-compatible /proc/pci' CONFIG_PCI_OLD_PROC
fi
......@@ -57,6 +63,7 @@ fi
bool 'Advanced processor options' CONFIG_ADVANCED_CPU
if [ "$CONFIG_ADVANCED_CPU" = "y" ]; then
bool 'Use read-modify-write instructions' CONFIG_RMW_INSNS
bool 'Use write-through caching for 68060 supervisor accesses' CONFIG_060_WRITETHROUGH
fi
endmenu
......@@ -73,11 +80,6 @@ tristate 'Kernel support for MISC binaries' CONFIG_BINFMT_MISC
if [ "$CONFIG_AMIGA" = "y" ]; then
bool 'Amiga AutoConfig Identification' CONFIG_ZORRO
# bool 'Amiga GSP (TMS340x0) support' CONFIG_AMIGA_GSP
# if [ "$CONFIG_AMIGA_GSP" = "y" ]; then
# bool 'DMI Resolver support' CONFIG_GSP_RESOLVER
# bool 'A2410 support' CONFIG_GSP_A2410
# fi
fi
if [ "$CONFIG_ATARI" = "y" ]; then
bool 'Support for ST-RAM as swap space' CONFIG_STRAM_SWAP
......@@ -85,73 +87,17 @@ if [ "$CONFIG_ATARI" = "y" ]; then
fi
if [ "$CONFIG_AMIGA" = "y" -o "$CONFIG_ATARI" = "y" ]; then
bool 'Use power LED as a heartbeat' CONFIG_HEARTBEAT
fi
endmenu
#
# Block device driver configuration
#
mainmenu_option next_comment
comment 'Floppy, IDE, and other block devices'
if [ "$CONFIG_AMIGA" = "y" ]; then
tristate 'Amiga floppy support' CONFIG_AMIGA_FLOPPY
fi
if [ "$CONFIG_ATARI" = "y" ]; then
tristate 'Atari floppy support' CONFIG_ATARI_FLOPPY
fi
if [ "$CONFIG_MAC" = "y" ]; then
tristate 'Macintosh IWM floppy support' CONFIG_MAC_FLOPPY
fi
#Normal floppy disk support' CONFIG_BLK_DEV_FD
tristate 'Enhanced IDE/MFM/RLL disk/cdrom/tape/floppy support' CONFIG_BLK_DEV_IDE
if [ "$CONFIG_BLK_DEV_IDE" != "n" ]; then
dep_tristate ' Include IDE/ATA-2 DISK support' CONFIG_BLK_DEV_IDEDISK $CONFIG_BLK_DEV_IDE
dep_tristate ' Include IDE/ATAPI CDROM support' CONFIG_BLK_DEV_IDECD $CONFIG_BLK_DEV_IDE
dep_tristate ' Include IDE/ATAPI TAPE support' CONFIG_BLK_DEV_IDETAPE $CONFIG_BLK_DEV_IDE
dep_tristate ' Include IDE/ATAPI FLOPPY support' CONFIG_BLK_DEV_IDEFLOPPY $CONFIG_BLK_DEV_IDE
dep_tristate ' SCSI emulation support' CONFIG_BLK_DEV_IDESCSI $CONFIG_BLK_DEV_IDE
if [ "$CONFIG_AMIGA" = "y" ]; then
bool ' Amiga Gayle IDE interface support' CONFIG_BLK_DEV_GAYLE
if [ "$CONFIG_EXPERIMENTAL" = "y" ]; then
bool ' Buddha/Catweasel IDE interface support' CONFIG_BLK_DEV_BUDDHA
bool ' Amiga IDE Doubler support' CONFIG_BLK_DEV_IDEDOUBLER $CONFIG_BLK_DEV_GAYLE
fi
fi
if [ "$CONFIG_ATARI" = "y" ]; then
bool ' Falcon IDE interface support' CONFIG_BLK_DEV_FALCON_IDE
fi
fi
if [ "$CONFIG_AMIGA" = "y" ]; then
tristate 'Amiga Zorro II ramdisk support' CONFIG_AMIGA_Z2RAM
fi
if [ "$CONFIG_ATARI" = "y" ]; then
tristate 'Atari ACSI support' CONFIG_ATARI_ACSI
if [ "$CONFIG_ATARI_ACSI" != "n" ]; then
comment 'Some devices (e.g. CD jukebox) support multiple LUNs'
bool 'Probe all LUNs on each ACSI device' CONFIG_ACSI_MULTI_LUN
dep_tristate 'Atari SLM laser printer support' CONFIG_ATARI_SLM $CONFIG_ATARI_ACSI
else
if [ "$CONFIG_HP300" = "y" ]; then
# We have a dedicated heartbeat LED. :-)
define_bool CONFIG_HEARTBEAT y
fi
fi
comment 'Additional Block Devices'
tristate 'Loopback device support' CONFIG_BLK_DEV_LOOP
bool 'Multiple devices driver support' CONFIG_BLK_DEV_MD
if [ "$CONFIG_BLK_DEV_MD" = "y" ]; then
tristate ' Linear (append) mode' CONFIG_MD_LINEAR
tristate ' RAID-0 (striping) mode' CONFIG_MD_STRIPED
fi
if [ "$CONFIG_MD_LINEAR" = "y" -o "$CONFIG_MD_STRIPED" = "y" ]; then
bool ' Boot support (linear, striped)' CONFIG_MD_BOOT
fi
tristate 'RAM disk support' CONFIG_BLK_DEV_RAM
if [ "$CONFIG_BLK_DEV_RAM" = "y" ]; then
bool ' Initial RAM disk (initrd) support' CONFIG_BLK_DEV_INITRD
fi
bool '/proc/hardware support' CONFIG_PROC_HARDWARE
endmenu
source drivers/block/Config.in
if [ "$CONFIG_NET" = "y" ]; then
source net/Config.in
fi
......@@ -196,15 +142,21 @@ if [ "$CONFIG_AMIGA" = "y" ]; then
bool 'A4000T SCSI support' CONFIG_A4000T_SCSI
bool 'A4091 SCSI support' CONFIG_A4091_SCSI
bool 'WarpEngine SCSI support' CONFIG_WARPENGINE_SCSI
bool 'Cyberstorm Mk III SCSI support' CONFIG_CYBERSTORMIII_SCSI
# bool 'Cyberstorm Mk III SCSI support' CONFIG_CYBERSTORMIII_SCSI
# bool 'GVP Turbo 040/060 SCSI support' CONFIG_GVP_TURBO_SCSI
fi
if [ "$CONFIG_MAC" = "y" ]; then
bool ' Macintosh Quadra/Powerbook IDE interface support' CONFIG_BLK_DEV_MAC_IDE
fi
fi
if [ "$CONFIG_ATARI" = "y" ]; then
dep_tristate 'Atari native SCSI support' CONFIG_ATARI_SCSI $CONFIG_SCSI
bool 'Long delays for Toshiba CD-ROMs' CONFIG_ATARI_SCSI_TOSHIBA_DELAY
if [ "$CONFIG_EXPERIMENTAL" = "y" -a "$CONFIG_HADES" = "y" ]; then
bool 'Hades SCSI DMA emulator (EXPERIMENTAL)' CONFIG_TT_DMA_EMUL
if [ "$CONFIG_ATARI_SCSI" != "n" ]; then
bool ' Long delays for Toshiba CD-ROMs' CONFIG_ATARI_SCSI_TOSHIBA_DELAY
bool ' Reset SCSI-devices at boottime' CONFIG_ATARI_SCSI_RESET_BOOT
if [ "$CONFIG_EXPERIMENTAL" = "y" -a "$CONFIG_HADES" = "y" ]; then
bool ' Hades SCSI DMA emulator (EXPERIMENTAL)' CONFIG_TT_DMA_EMUL
fi
fi
fi
if [ "$CONFIG_MAC" = "y" ]; then
......@@ -216,6 +168,10 @@ if [ "$CONFIG_VME" = "y" -a "$CONFIG_MVME16x" = "y" ]; then
bool 'NCR53C710 SCSI driver for MVME16x' CONFIG_MVME16x_SCSI
fi
if [ "$CONFIG_VME" = "y" -a "$CONFIG_BVME6000" = "y" ]; then
bool 'NCR53C710 SCSI driver for BVME6000' CONFIG_BVME6000_SCSI
fi
endmenu
fi
......@@ -264,6 +220,9 @@ fi
if [ "$CONFIG_VME" = "y" -a "$CONFIG_MVME16x" = "y" ]; then
bool 'MVME16x Ethernet support' CONFIG_APRICOT
fi
if [ "$CONFIG_VME" = "y" -a "$CONFIG_BVME6000" = "y" ]; then
bool 'BVME6000 Ethernet support' CONFIG_APRICOT
fi
fi
endmenu
......@@ -322,20 +281,31 @@ if [ "$CONFIG_AMIGA" = "y" ]; then
tristate 'Multiface Card III serial support' CONFIG_MULTIFACE_III_TTY
bool 'Hisoft Whippet PCMCIA serial support' CONFIG_WHIPPET
fi
if [ "$CONFIG_AMIGA" = "y" -o "$CONFIG_ATARI" = "y" ]; then
if [ "$CONFIG_MAC" = "y" ]; then
bool 'Mac SCC serial support' CONFIG_MAC_SCC
fi
if [ "$CONFIG_HP300" = "y" -a "$CONFIG_DIO" = "y" ]; then
tristate 'HP DCA serial support' CONFIG_HPDCA
fi
if [ "$CONFIG_AMIGA" = "y" -o "$CONFIG_ATARI" = "y" -o \
"$CONFIG_MAC" = "y" -o "$CONFIG_HP300" = "y" ]; then
if [ "$CONFIG_ATARI_MFPSER" = "y" -o "$CONFIG_ATARI_SCC" = "y" -o \
"$CONFIG_ATARI_MIDI" = "y" -o "$CONFIG_AMIGA_BUILTIN_SERIAL" = "y" -o \
"$CONFIG_GVPIOEXT" = "y" -o "$CONFIG_MULTIFACE_III_TTY" = "y" ]; then
"$CONFIG_ATARI_MIDI" = "y" -o "$CONFIG_MAC_SCC" = "y" -o \
"$CONFIG_AMIGA_BUILTIN_SERIAL" = "y" -o \
"$CONFIG_GVPIOEXT" = "y" -o "$CONFIG_MULTIFACE_III_TTY" = "y" -o \
"$CONFIG_HPDCA" = "y" ]; then
bool 'Support for serial port console' CONFIG_SERIAL_CONSOLE
fi
fi
if [ "$CONFIG_MAC" = "y" ]; then
bool 'Mac SCC serial support' CONFIG_MAC_SCC
fi
if [ "$CONFIG_VME" = "y" ]; then
define_bool CONFIG_SERIAL_CONSOLE y
bool 'CD2401 support for MVME166/7 serial ports' CONFIG_SERIAL167
bool 'SCC support for MVME162 serial ports' CONFIG_MVME162_SCC
if [ "$CONFIG_MVME16x" = "y" ]; then
bool 'CD2401 support for MVME166/7 serial ports' CONFIG_SERIAL167
bool 'SCC support for MVME162 serial ports' CONFIG_MVME162_SCC
fi
if [ "$CONFIG_BVME6000" = "y" ]; then
bool 'SCC support for BVME6000 serial ports' CONFIG_BVME6000_SCC
fi
fi
if [ "$CONFIG_APOLLO" = "y" ]; then
bool 'Support for DN serial port (dummy)' CONFIG_SERIAL
......@@ -348,7 +318,7 @@ if [ "$CONFIG_WATCHDOG" != "n" ]; then
bool ' Software Watchdog' CONFIG_SOFT_WATCHDOG
fi
bool 'Support for user misc device modules' CONFIG_UMISC
if [ "$CONFIG_AMIGA" = "y" -o "$CONFIG_ATARI" = "y" ]; then
if [ "$CONFIG_AMIGA" = "y" -o "$CONFIG_ATARI" = "y" -o "$CONFIG_MAC" = "y" ]; then
define_bool CONFIG_ABSTRACT_CONSOLE y
fi
if [ "$CONFIG_ATARI" = "y" ]; then
......
......@@ -45,6 +45,8 @@ CONFIG_ZORRO=y
# CONFIG_AMIGA_GSP is not set
# CONFIG_GSP_RESOLVER is not set
# CONFIG_GSP_A2410 is not set
# CONFIG_HEARTBEAT is not set
CONFIG_PROC_HARDWARE=y
#
# Block device driver configuration
......@@ -133,6 +135,8 @@ CONFIG_GVP11_SCSI=y
# CONFIG_A4091_SCSI is not set
# CONFIG_WARPENGINE_SCSI is not set
CONFIG_ATARI_SCSI=y
# CONFIG_ATARI_SCSI_TOSHIBA_DELAY is not set
# CONFIG_ATARI_SCSI_RESET_BOOT is not set
#
# Network device support
......
#
# Makefile for Linux arch/m68k/hp300 source directory
#
# Note! Dependencies are done automagically by 'make dep', which also
# removes any old dependencies. DON'T put your own dependencies here
# unless it's something special (ie not a .c file).
#
# Note 2! The CFLAGS definitions are now in the main makefile...
O_TARGET := hp300.o
O_OBJS := ksyms.o config.o ints.o time.o reboot.o hil.o
include $(TOPDIR)/Rules.make
HP300 notes
-----------
The Linux/HP web page is at <http://www.tazenda.demon.co.uk/phil/linux-hp/>
Currently only 9000/340 machines have been tested. Any amount of RAM should
work now but I've only tried 16MB and 12MB.
The serial console is probably broken at the moment but the Topcat/HIL keyboard
combination seems to work for me. Your mileage may vary.
The LANCE driver works after a fashion but only if you reset the chip before
every packet. This doesn't make for very speedy operation.
/*
* linux/arch/m68k/hp300/config.c
*
* Copyright (C) 1998 Philip Blundell <philb@gnu.org>
*
* This file contains the HP300-specific initialisation code. It gets
* called by setup.c.
*/
#include <linux/config.h>
#include <linux/types.h>
#include <linux/mm.h>
#include <linux/kd.h>
#include <linux/tty.h>
#include <linux/console.h>
#include <linux/interrupt.h>
#include <linux/init.h>
#include <asm/machdep.h>
#include <asm/blinken.h>
#include <asm/io.h> /* readb() and writeb() */
#include <asm/hwtest.h> /* hwreg_present() */
#include "ints.h"
#include "time.h"
extern void hp300_reset(void);
extern void hp300_hil_init(void);
#ifdef CONFIG_HEARTBEAT
static void hp300_pulse(int x)
{
if (x)
blinken_leds(0xfe);
else
blinken_leds(0xff);
}
#endif
static int hp300_kbdrate(struct kbd_repeat *k)
{
return 0;
}
static void hp300_kbd_leds(unsigned int leds)
{
}
__initfunc(void config_hp300(void))
{
mach_sched_init = hp300_sched_init;
mach_keyb_init = hp300_hil_init;
mach_kbdrate = hp300_kbdrate;
mach_kbd_leds = hp300_kbd_leds;
mach_init_IRQ = hp300_init_IRQ;
mach_request_irq = hp300_request_irq;
mach_free_irq = hp300_free_irq;
#if 0
mach_get_model = hp300_get_model;
mach_get_irq_list = hp300_get_irq_list;
#endif
mach_gettimeoffset = hp300_gettimeoffset;
#if 0
mach_gettod = hp300_gettod;
#endif
mach_reset = hp300_reset;
#ifdef CONFIG_HEARTBEAT
mach_heartbeat = hp300_pulse;
#endif
#ifdef CONFIG_FB
conswitchp = &fb_con;
#endif
mach_max_dma_address = 0xffffffff;
}
/* for "kbd-reset" cmdline param */
__initfunc(void kbd_reset_setup(char *str, int *ints))
{
}
/*
* linux/arch/m68k/hp300/hil.c
*
* Copyright (C) 1998 Philip Blundell <philb@gnu.org>
*
* HP300 Human Interface Loop driver. This handles the keyboard and mouse.
*/
#include <linux/stddef.h>
#include <linux/kernel.h>
#include <linux/sched.h>
#include <linux/init.h>
#include <linux/keyboard.h>
#include <linux/kbd_ll.h>
#include <asm/io.h>
#include <asm/hwtest.h>
#include <asm/ptrace.h>
#include <asm/irq.h>
#include <asm/system.h>
#define HILBASE 0xf0428000
#define HIL_DATA 0x1
#define HIL_CMD 0x3
#define HIL_BUSY 0x02
#define HIL_DATA_RDY 0x01
#define hil_busy() (readb(HILBASE + HIL_CMD) & HIL_BUSY)
#define hil_data_available() (readb(HILBASE + HIL_CMD) & HIL_DATA_RDY)
#define hil_status() (readb(HILBASE + HIL_CMD))
#define hil_command(x) do { writeb((x), HILBASE + HIL_CMD); } while (0)
#define hil_read_data() (readb(HILBASE + HIL_DATA))
#define hil_write_data(x) do { writeb((x), HILBASE + HIL_DATA); } while (0)
#define HIL_SETARD 0xA0 /* set auto-repeat delay */
#define HIL_SETARR 0xA2 /* set auto-repeat rate */
#define HIL_SETTONE 0xA3 /* set tone generator */
#define HIL_CNMT 0xB2 /* clear nmi */
#define HIL_INTON 0x5C /* Turn on interrupts. */
#define HIL_INTOFF 0x5D /* Turn off interrupts. */
#define HIL_TRIGGER 0xC5 /* trigger command */
#define HIL_STARTCMD 0xE0 /* start loop command */
#define HIL_TIMEOUT 0xFE /* timeout */
#define HIL_READTIME 0x13 /* Read real time register */
#define HIL_READBUSY 0x02 /* internal "busy" register */
#define HIL_READKBDLANG 0x12 /* read keyboard language code */
#define HIL_READKBDSADR 0xF9
#define HIL_WRITEKBDSADR 0xE9
#define HIL_READLPSTAT 0xFA
#define HIL_WRITELPSTAT 0xEA
#define HIL_READLPCTRL 0xFB
#define HIL_WRITELPCTRL 0xEB
#define HIL_IRQ 1
static u_short hp_plain_map[NR_KEYS] __initdata = {
0xf200, 0xf01b, 0xf20e, 0xf700, 0xf700, 0xf700, 0xf702, 0xf036,
0xf037, 0xf038, 0xf039, 0xf030, 0xf02d, 0xf03d, 0xf008, 0xf009,
0xfb71, 0xfb77, 0xfb65, 0xfb72, 0xfb74, 0xfb79, 0xfb75, 0xfb69,
0xfb62, 0xfb76, 0xf063, 0xfb78, 0xfb7a, 0xf702, 0xfb61, 0xfb73,
0xfb64, 0xfb66, 0xfb67, 0xfb68, 0xfb6a, 0xfb6b, 0xfb6c, 0xf03b,
0xfb68, 0xfb67, 0xfb66, 0xfb64, 0xfb73, 0xfb61, 0xfb63, 0xfb76,
0xfb75, 0xfb79, 0xfb74, 0xfb72, 0xfb65, 0xfb77, 0xfb71, 0xf200,
0xf037, 0xf036, 0xf035, 0xf034, 0xf033, 0xf032, 0xf031, 0xf104,
0xf105, 0xf106, 0xf107, 0xf108, 0xf109, 0xf200, 0xf200, 0xf114,
0xf603, 0xf200, 0xf30b, 0xf601, 0xf200, 0xf602, 0xf30a, 0xf200,
0xf600, 0xf200, 0xf115, 0xf07f, 0xf200, 0xf200, 0xf200, 0xf200,
0xf038, 0xf039, 0xf030, 0xf200, 0xf200, 0xf008, 0xf200, 0xf200,
0xfb69, 0xfb6f, 0xfb70, 0xf312, 0xf313, 0xf30d, 0xf30c, 0xf307,
0xfb6a, 0xfb6b, 0xfb6c, 0xf305, 0xf306, 0xf00d, 0xf302, 0xf303,
0xfb6d, 0xf02c, 0xf02e, 0xf02f, 0xf200, 0xf200, 0xf200, 0xf200,
0xfb6e, 0xf020, 0xf200, 0xf200, 0xf200, 0xf200, 0xf200, 0xf200
};
static u_short hp_shift_map[NR_KEYS] __initdata = {
0xf200, 0xf01b, 0xf20e, 0xf700, 0xf700, 0xf700, 0xf002, 0xf036,
0xf037, 0xf038, 0xf039, 0xf030, 0xf02d, 0xf03d, 0xf008, 0xf009,
0xfb71, 0xfb77, 0xfb65, 0xfb72, 0xfb74, 0xfb79, 0xfb75, 0xfb69,
0xfb62, 0xfb76, 0xf063, 0xfb78, 0xfb7a, 0xf702, 0xfb61, 0xfb73,
0xfb64, 0xfb66, 0xfb67, 0xfb68, 0xfb6a, 0xfb6b, 0xfb6c, 0xf03b,
0xfb68, 0xfb67, 0xfb66, 0xfb64, 0xfb73, 0xfb61, 0xfb63, 0xfb76,
0xfb75, 0xfb79, 0xfb74, 0xfb72, 0xfb65, 0xfb77, 0xfb71, 0xf200,
0xf037, 0xf036, 0xf035, 0xf034, 0xf033, 0xf032, 0xf031, 0xf104,
0xf105, 0xf106, 0xf107, 0xf108, 0xf109, 0xf200, 0xf200, 0xf114,
0xf603, 0xf200, 0xf30b, 0xf601, 0xf200, 0xf602, 0xf30a, 0xf200,
0xf600, 0xf200, 0xf115, 0xf07f, 0xf200, 0xf200, 0xf200, 0xf200,
0xf038, 0xf039, 0xf030, 0xf200, 0xf200, 0xf008, 0xf200, 0xf200,
0xfb69, 0xfb6f, 0xfb70, 0xf312, 0xf313, 0xf30d, 0xf30c, 0xf307,
0xfb6a, 0xfb6b, 0xfb6c, 0xf305, 0xf306, 0xf00d, 0xf302, 0xf303,
0xfb6d, 0xf02c, 0xf02e, 0xf02f, 0xf200, 0xf200, 0xf200, 0xf200,
0xfb6e, 0xf020, 0xf200, 0xf200, 0xf200, 0xf200, 0xf200, 0xf200
};
static u_short hp_ctrl_map[NR_KEYS] __initdata = {
0xf200, 0xf200, 0xf200, 0xf000, 0xf01b, 0xf01c, 0xf01d, 0xf01e,
0xf01f, 0xf07f, 0xf200, 0xf200, 0xf01f, 0xf200, 0xf008, 0xf200,
0xf011, 0xf017, 0xf005, 0xf012, 0xf014, 0xf019, 0xf015, 0xf009,
0xf00f, 0xf010, 0xf003, 0xf01d, 0xf201, 0xf702, 0xf001, 0xf013,
0xf004, 0xf006, 0xf007, 0xf008, 0xf00a, 0xf00b, 0xf00c, 0xf200,
0xf007, 0xf000, 0xf700, 0xf01c, 0xf01a, 0xf018, 0xf003, 0xf016,
0xf002, 0xf00e, 0xf00d, 0xf200, 0xf200, 0xf07f, 0xf700, 0xf200,
0xf703, 0xf000, 0xf207, 0xf100, 0xf101, 0xf102, 0xf103, 0xf104,
0xf105, 0xf106, 0xf107, 0xf108, 0xf109, 0xf200, 0xf200, 0xf114,
0xf603, 0xf200, 0xf30b, 0xf601, 0xf200, 0xf602, 0xf30a, 0xf200,
0xf600, 0xf200, 0xf115, 0xf07f, 0xf200, 0xf200, 0xf200, 0xf200,
0xf200, 0xf200, 0xf200, 0xf200, 0xf200, 0xf200, 0xf200, 0xf200,
0xf200, 0xf1ff, 0xf202, 0xf312, 0xf313, 0xf30d, 0xf30c, 0xf307,
0xf308, 0xf309, 0xf304, 0xf305, 0xf306, 0xf301, 0xf302, 0xf303,
0xf300, 0xf310, 0xf30e, 0xf200, 0xf200, 0xf200, 0xf200, 0xf200,
0xf200, 0xf200, 0xf200, 0xf200, 0xf200, 0xf200, 0xf200, 0xf200
};
struct {
unsigned char s, c;
int valid;
} hil_last;
#define hil_getlast(s,c) do { s = hil_last.s; c = hil_last.c; hil_last.valid = 0; } while (0)
struct {
unsigned char data[16];
unsigned int ptr;
} poll;
unsigned char curdev = 0;
static void poll_finished(void)
{
switch (poll.data[0])
{
case 0x40:
{
unsigned char scode = (poll.data[1] >> 1) | ((poll.data[1] & 1)?0x80:0);
#if 0
if (scode & 0x80)
printk("[%02x]", scode & 0x7f);
#endif
handle_scancode(scode);
}
break;
}
curdev = 0;
}
static inline void handle_status(unsigned char s, unsigned char c)
{
if (c & 0x8) {
/* End of block */
if (c & 0x10)
poll_finished();
} else {
if (c & 0x10) {
if (curdev)
poll_finished(); /* just in case */
curdev = c & 7;
poll.ptr = 0;
}
}
}
static inline void handle_data(unsigned char s, unsigned char c)
{
if (curdev)
poll.data[poll.ptr++] = c;
}
/*
* Handle HIL interrupts.
*/
static void hil_interrupt(int irq, void *handle, struct pt_regs *regs)
{
unsigned char s, c;
s = hil_status(); c = hil_read_data();
switch (s >> 4)
{
case 0x5:
handle_status(s, c);
break;
case 0x6:
handle_data(s, c);
break;
case 0x4:
hil_last.s = s;
hil_last.c = c;
mb();
hil_last.valid = 1;
break;
}
}
/*
* Send a command to the HIL
*/
static void hil_do(unsigned char cmd, unsigned char *data, unsigned int len)
{
unsigned long flags;
save_flags(flags); cli();
while (hil_busy());
hil_command(cmd);
while (len--) {
while (hil_busy());
hil_write_data(*(data++));
}
restore_flags(flags);
}
/*
* Initialise HIL.
*/
__initfunc(void hp300_hil_init(void))
{
unsigned char s, c, kbid;
unsigned int n = 0;
memcpy(key_maps[0], hp_plain_map, sizeof(plain_map));
memcpy(key_maps[1], hp_shift_map, sizeof(plain_map));
memcpy(key_maps[4], hp_ctrl_map, sizeof(plain_map));
if (!hwreg_present((void *)(HILBASE + HIL_DATA)))
return; /* maybe this can happen */
request_irq(HIL_IRQ, hil_interrupt, 0, "HIL", NULL);
/* Turn on interrupts */
hil_do(HIL_INTON, NULL, 0);
/* Look for keyboards */
hil_do(HIL_READKBDSADR, NULL, 0);
while (!hil_last.valid) {
if (n++ > 1000) {
printk("HIL: timed out, assuming no keyboard present.\n");
return;
}
mb();
}
hil_getlast(s, c);
if (c == 0) {
printk("HIL: no keyboard present.\n");
return;
}
for (kbid = 0; (kbid < 8) && ((c & (1<<kbid)) == 0); kbid++);
printk("HIL: keyboard found at id %d\n", kbid);
/* set it to raw mode */
c = 0;
hil_do(HIL_WRITEKBDSADR, &c, 1);
}
/*
* linux/arch/m68k/hp300/ints.c
*
* Copyright (C) 1998 Philip Blundell <philb@gnu.org>
*
* This file contains the HP300-specific interrupt handling. There
* isn't much here -- we only use the autovector interrupts and at the
* moment everything difficult is handled by the generic code.
*/
#include <linux/config.h>
#include <asm/ptrace.h>
#include <linux/types.h>
#include <linux/init.h>
#include <linux/sched.h>
#include <linux/kernel_stat.h>
#include <linux/interrupt.h>
#include <asm/machdep.h>
#include <asm/irq.h>
#include <asm/io.h>
#include <asm/system.h>
#include <asm/traps.h>
#include "ints.h"
static void hp300_nmi_handler(int irq, void *dev_id, struct pt_regs *fp)
{
extern void hp300_reset(void);
printk("RESET pressed - self destruct sequence initiated.\n");
hp300_reset();
}
int hp300_request_irq(unsigned int irq,
void (*handler) (int, void *, struct pt_regs *),
unsigned long flags, const char *devname, void *dev_id)
{
return sys_request_irq(irq, handler, flags, devname, dev_id);
}
void hp300_free_irq(unsigned int irq, void *dev_id)
{
sys_free_irq(irq, dev_id);
}
__initfunc(void hp300_init_IRQ(void))
{
/* IPL6 - NMI (keyboard reset) */
sys_request_irq(7, hp300_nmi_handler, IRQ_FLG_STD, "NMI", hp300_nmi_handler);
}
extern void hp300_init_IRQ(void);
extern void (*hp300_handlers[8])(int, void *, struct pt_regs *);
extern void hp300_free_irq(unsigned int irq, void *dev_id);
extern int hp300_request_irq(unsigned int irq,
void (*handler) (int, void *, struct pt_regs *),
unsigned long flags, const char *devname, void *dev_id);
/*
* linux/arch/m68k/hp300/ksyms.c
*
* Copyright (C) 1998 Philip Blundell <philb@gnu.org>
*
* This file contains the HP300-specific kernel symbols. None yet. :-)
*/
#include <linux/module.h>
/*
* linux/arch/m68k/hp300/reboot.S
*
* Copyright (C) 1998 Philip Blundell <philb@gnu.org>
*
* Do the dirty work of rebooting the machine. Basically we need to undo all the
* good stuff that head.S did when we started up. The caches and MMU must be
* disabled and then we jump back to the PROM. This is a bit gruesome but we put
* a brave face on it.
*/
/* XXX Doesn't work yet. Not sure why and can't be bothered to fix it at the moment. */
.globl hp300_reset
hp300_reset:
.chip 68030
oriw #0x0700,%sr /* cli() */
movel hp300_phys_ram_base, %d1
movel #0, %d0
movec %d0, %vbr /* reset vector table */
lea zero, %a0
lea 1f, %a1
add %d1, %a0
add %d1, %a1
pmove %tc, %a0@
bclr #7, %a0@
pmove %a0@, %tc /* goodbye MMU */
jmp %a1@
1: movel #0x808, %d0
movec %d0, %cacr /* cache off */
moveb #0, 0x1ffff
movel #0x1a4, %a0
jmp %a0@
zero: .quad 0
/*
* linux/arch/m68k/hp300/time.c
*
* Copyright (C) 1998 Philip Blundell <philb@gnu.org>
*
* This file contains the HP300-specific time handling code.
*/
#include <linux/config.h>
#include <asm/ptrace.h>
#include <linux/types.h>
#include <linux/init.h>
#include <linux/sched.h>
#include <linux/kernel_stat.h>
#include <linux/interrupt.h>
#include <asm/machdep.h>
#include <asm/irq.h>
#include <asm/io.h>
#include <asm/system.h>
#include <asm/traps.h>
#include "ints.h"
/* Clock hardware definitions */
#define CLOCKBASE 0xf05f8000
#define CLKCR1 0x1
#define CLKCR2 0x3
#define CLKCR3 CLKCR1
#define CLKSR CLKCR2
#define CLKMSB1 0x5
#define CLKMSB2 0x9
#define CLKMSB3 0xD
unsigned long hp300_gettimeoffset (void)
{
return 0L;
}
static void hp300_tick(int irq, void *dev_id, struct pt_regs *regs)
{
unsigned long tmp;
void (*vector)(int, void *, struct pt_regs *) = dev_id;
readb(CLOCKBASE + CLKSR);
asm volatile ("movpw %1@(5),%0" : "=r" (tmp) : "a" (CLOCKBASE));
vector(irq, NULL, regs);
}
__initfunc(void hp300_sched_init(void (*vector)(int, void *, struct pt_regs *)))
{
unsigned int intval = (10000 / 4) - 1;
writeb(0x1, CLOCKBASE + CLKCR2); /* select CR1 */
writeb(0x1, CLOCKBASE + CLKCR1); /* reset */
asm volatile(" movpw %0,%1@(5)" : : "d" (intval), "a" (CLOCKBASE));
sys_request_irq(6, hp300_tick, IRQ_FLG_STD, "timer tick", vector);
writeb(0x1, CLOCKBASE + CLKCR2); /* select CR1 */
writeb(0x40, CLOCKBASE + CLKCR1); /* enable irq */
}
extern void hp300_sched_init(void (*vector)(int, void *, struct pt_regs *));
extern unsigned long hp300_gettimeoffset (void);
......@@ -33,7 +33,6 @@
* been removed in this version.
*/
#include <linux/bios32.h>
#include <linux/pci.h>
#include <linux/malloc.h>
#include <linux/mm.h>
......@@ -49,7 +48,7 @@
#define GB (1024*MB)
#define MAJOR_REV 0
#define MINOR_REV 0
#define MINOR_REV 1
/*
* Base addresses of the PCI memory and I/O areas on the Hades.
......@@ -264,12 +263,14 @@ __initfunc(static void disable_dev(struct pci_dev *dev))
#define MAX(val1, val2) ( ((val1) > (val2)) ? val1 : val2)
__initfunc(static void layout_dev(struct pci_dev *dev))
__initfunc(static void layout_dev(struct pci_dev *dev, unsigned long pci_mem_base,
unsigned long pci_io_base))
{
struct pci_bus *bus;
unsigned short cmd;
unsigned int base, mask, size, reg;
unsigned int alignto;
int i;
/*
* Skip video cards for the time being.
......@@ -283,7 +284,7 @@ __initfunc(static void layout_dev(struct pci_dev *dev))
bus = dev->bus;
pcibios_read_config_word(bus->number, dev->devfn, PCI_COMMAND, &cmd);
for (reg = PCI_BASE_ADDRESS_0; reg <= PCI_BASE_ADDRESS_5; reg += 4)
for (reg = PCI_BASE_ADDRESS_0, i = 0; reg <= PCI_BASE_ADDRESS_5; reg += 4, i++)
{
/*
* Figure out how much space and of what type this
......@@ -297,6 +298,7 @@ __initfunc(static void layout_dev(struct pci_dev *dev))
if (!base)
{
/* this base-address register is unused */
dev->base_address[i] = 0;
continue;
}
......@@ -322,6 +324,7 @@ __initfunc(static void layout_dev(struct pci_dev *dev))
io_base = base + size;
pcibios_write_config_dword(bus->number, dev->devfn,
reg, base | 0x1);
dev->base_address[i] = (pci_io_base + base) | 1;
DBG_DEVS(("layout_dev: IO address: %lX\n", base));
}
else
......@@ -369,6 +372,7 @@ __initfunc(static void layout_dev(struct pci_dev *dev))
mem_base = base + size;
pcibios_write_config_dword(bus->number, dev->devfn,
reg, base);
dev->base_address[i] = pci_mem_base + base;
}
}
......@@ -396,7 +400,8 @@ __initfunc(static void layout_dev(struct pci_dev *dev))
bus->number, PCI_SLOT(dev->devfn), dev->vendor, dev->device, dev->class));
}
__initfunc(static void layout_bus(struct pci_bus *bus))
__initfunc(static void layout_bus(struct pci_bus *bus, unsigned long pci_mem_base,
unsigned long pci_io_base))
{
struct pci_dev *dev;
......@@ -438,7 +443,7 @@ __initfunc(static void layout_bus(struct pci_bus *bus))
for (dev = bus->devices; dev; dev = dev->sibling)
{
if (dev->class >> 16 != PCI_BASE_CLASS_BRIDGE)
layout_dev(dev);
layout_dev(dev, pci_mem_base, pci_io_base);
}
}
......@@ -507,8 +512,7 @@ int pcibios_present(void)
return 0;
}
__initfunc(unsigned long pcibios_init(unsigned long mem_start,
unsigned long mem_end))
__initfunc(void pcibios_init(void))
{
printk("Linux/m68k PCI BIOS32 revision %x.%02x\n", MAJOR_REV, MINOR_REV);
......@@ -516,7 +520,8 @@ __initfunc(unsigned long pcibios_init(unsigned long mem_start,
printk("...NOT modifying existing PCI configuration\n");
#endif
return mem_start;
pci_mem_base = 0x80000000;
pci_io_base = 0xB0000000;
}
/*
......@@ -555,26 +560,35 @@ __initfunc(static inline void hades_fixup(void))
}
}
__initfunc(unsigned long pcibios_fixup(unsigned long mem_start,
unsigned long mem_end))
__initfunc(void pcibios_fixup(void))
{
#if PCI_MODIFY
unsigned long orig_mem_base, orig_io_base;
orig_mem_base = pci_mem_base;
orig_io_base = pci_io_base;
pci_mem_base = 0;
pci_io_base = 0;
/*
* Scan the tree, allocating PCI memory and I/O space.
*/
layout_bus(&pci_root);
#endif
layout_bus(&pci_root, orig_mem_base, orig_io_base);
pci_mem_base = 0x80000000;
pci_io_base = 0xB0000000;
pci_mem_base = orig_mem_base;
pci_io_base = orig_io_base;
#endif
/*
* Now is the time to do all those dirty little deeds...
*/
hades_fixup();
}
return mem_start;
__initfunc(char *pcibios_setup(char *str))
{
return str;
}
#endif /* CONFIG_PCI */
......@@ -579,6 +579,9 @@ SYMBOL_NAME_LABEL(sys_call_table)
.long SYMBOL_NAME(sys_pread) /* 180 */
.long SYMBOL_NAME(sys_pwrite)
.long SYMBOL_NAME(sys_lchown);
.long SYMBOL_NAME(sys_getcwd)
.long SYMBOL_NAME(sys_capget)
.long SYMBOL_NAME(sys_capset) /* 185 */
.rept NR_syscalls-(.-SYMBOL_NAME(sys_call_table))/4
.long SYMBOL_NAME(sys_ni_syscall)
.endr
......@@ -17,6 +17,7 @@
** 95/11/18 Richard Hirst: Added MVME166 support
** 96/04/26 Guenther Kelleter: fixed identity mapping for Falcon with
** Magnum- and FX-alternate ram
** 98/04/25 Phil Blundell: added HP300 support
**
** 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
......@@ -73,10 +74,25 @@
#include <asm/pgtable.h>
.globl SYMBOL_NAME(kernel_pg_dir), SYMBOL_NAME(kpt)
.globl SYMBOL_NAME(availmem), SYMBOL_NAME(mvme_bdid_ptr)
.globl SYMBOL_NAME(availmem)
.globl SYMBOL_NAME(m68k_pgtable_cachemode)
.globl SYMBOL_NAME(kernel_pmd_table), SYMBOL_NAME(swapper_pg_dir)
#if defined(CONFIG_MVME16x)
.globl SYMBOL_NAME(mvme_bdid_ptr)
#endif
/*
* Added m68k_supervisor_cachemode for 68060 boards where some drivers
* need writethrough caching for supervisor accesses. Drivers known to
* be effected are 53c7xx.c and apricot.c (when used on VME boards).
* Richard Hirst.
*/
#ifdef CONFIG_060_WRITETHROUGH
.globl SYMBOL_NAME(m68k_supervisor_cachemode)
#endif
D6B_0460 = 16 /* indicates 680[46]0 in d6 */
D6B_060 = 17 /* indicates 68060 in d6 */
D6F_040 = 1<<D6B_0460
......@@ -146,12 +162,23 @@ TABLENR_16MB = 64 /* same for 16 MB */
#define is_not_amiga(lab) moveq &MACH_AMIGA,%d7; cmpl %d4,%d7; jne lab
#define is_not_atari(lab) moveq &MACH_ATARI,%d7; cmpl %d4,%d7; jne lab
#define is_not_mvme16x(lab) moveq &MACH_MVME16x,%d7; cmpl %d4,%d7; jne lab
#define is_not_bvme6000(lab) moveq &MACH_BVME6000,%d7; cmpl %d4,%d7; jne lab
#define is_not_hp300(lab) moveq &MACH_HP300,%d7 ; cmpl %d4,%d7; jne lab
#define is_040_or_060(lab) btst &D6B_0460,%d6; jne lab
#define is_not_040_or_060(lab) btst &D6B_0460,%d6; jeq lab
#define is_060(lab) btst &D6B_060,%d6; jne lab
#define is_not_060(lab) btst &D6B_060,%d6; jeq lab
/* On the HP300 we use the on-board LEDs for debug output before
the console is running. Writing a 1 bit turns the corresponding LED
_off_ - on the 340 bit 7 is towards the back panel of the machine. */
#ifdef CONFIG_HP300
#define leds(x) is_not_hp300(42f) ; moveb #(x),%d7 ; jbsr Lset_leds; 42:
#else
#define leds(x)
#endif
.text
ENTRY(_stext)
/*
......@@ -164,6 +191,7 @@ ENTRY(_stext)
.long MACH_AMIGA, AMIGA_BOOTI_VERSION
.long MACH_ATARI, ATARI_BOOTI_VERSION
.long MACH_MVME16x, MVME16x_BOOTI_VERSION
.long MACH_BVME6000, BVME6000_BOOTI_VERSION
.long 0
1: jra SYMBOL_NAME(_start)
......@@ -224,6 +252,22 @@ ENTRY(_start)
movew %d6,%d0
movel %d0,%a0@ /* save cache mode for page tables */
/*
* If this is a 68060 board using drivers with cache coherency
* problems, then supervisor memory accesses need to be write-through
* also; otherwise, we want copyback.
*/
#if defined(CONFIG_060_WRITETHROUGH)
is_not_060(Lset_norm)
jra 1f
Lset_norm:
move.w #_PAGE_CACHE040,%d0
1:
lea %pc@(SYMBOL_NAME(m68k_supervisor_cachemode)),%a0
movel %d0,%a0@
#endif
/*
* raise interrupt level
*/
......@@ -386,7 +430,12 @@ Lnotypetest:
movel %a3,%a0
movel %d5,%a1
addw #_PAGE_GLOBAL040+_PAGE_CACHE040+_PAGE_PRESENT+_PAGE_ACCESSED,%a1
#if defined(CONFIG_060_WRITETHROUGH)
addw #_PAGE_GLOBAL040+_PAGE_PRESENT+_PAGE_ACCESSED,%a1
addl m68k_supervisor_cachemode,%a1
#else
addw #_PAGE_GLOBAL040+_PAGE_CACHE040+_PAGE_PRESENT+_PAGE_ACCESSED,%a1
#endif
movew #(PAGE_TABLE_SIZE*TABLENR_4MB)-1,%d1
movel #PAGESIZE,%d2
1: movel %a1,%a0@+
......@@ -424,6 +473,9 @@ Lnotypetest:
* of %a2 are forgotten.
*/
Lnot040:
leds(0x4)
/*
* Do any machine specific page table initializations.
*/
......@@ -615,6 +667,21 @@ Lspata68040:
Lnotatari:
#endif
#ifdef CONFIG_HP300
is_not_hp300(Lnothp300)
/* On the HP300, we map the ROM, INTIO and DIO regions (phys. 0x00xxxxxx)
by mapping 32MB from 0xf0xxxxxx -> 0x00xxxxxx) using an 030 early
termination page descriptor. The ROM mapping is needed because the LEDs
are mapped there too. */
movel #_PAGE_NOCACHE030+_PAGE_PRESENT+_PAGE_ACCESSED,%d0
movel %d0,%a5@(0x78<<2)
Lnothp300:
#endif
#if defined(CONFIG_MVME16x)
is_not_mvme16x(Lnot16x)
......@@ -639,6 +706,25 @@ Lnotatari:
Lnot16x:
#endif
#if defined(CONFIG_BVME6000)
is_not_bvme6000(Lnotbvm)
/*
* On BVME6000 we have already created kernel page tables for
* 4MB of RAM at address 0, so now need to do a transparent
* mapping of the top of memory space. Make it 0.5GByte for now.
*/
movel #0xe01f0000,%d2 /* logical address base */
orw #0xa040,%d2 /* add in magic bits */
.long 0x4e7b2005 /* movec d2,ittr1 */
.long 0x4e7b2007 /* movec d2,dttr1 */
.long 0x4e7b2004 /* movec d2,ittr0 */
.long 0x4e7b2006 /* movec d2,dttr0 */
Lnotbvm:
#endif
/*
* Setup a transparent mapping of the physical memory we are executing in.
*
......@@ -647,6 +733,7 @@ Lnot16x:
*/
Lmapphys:
putc('J')
leds(0x8)
#ifdef CONFIG_AMIGA
is_not_amiga(Lmapphysnotamiga)
......@@ -853,6 +940,80 @@ Lmapphysnot16x:
#endif
#if defined(CONFIG_HP300)
is_not_hp300(Lmapphysnothp300)
/*
* Physical RAM is at 0xff000000. We want to map the kernel at 0x00000000.
* In order to avoid disaster when we enable the MMU we need to make a
* transparent mapping of the RAM we're executing out of as well.
*/
/*
* save physaddr of phys mem in register a3
*/
.chip 68030
lea %pc@(Lmmu),%a3
movel %d5,%d0
andl #0xff000000,%d0 /* logical address base */
orw #TTR_ENABLE+TTR_CI+TTR_RWM+TTR_FCB2+TTR_FCM1+TTR_FCM0,%d0
movel %d0,%a3@
pmove %a3@,%tt0
/* no limit, 4byte descriptors */
movel #0x80000002,%a3@
movel %a5,%a3@(4)
pmove %a3@,%srp
pmove %a3@,%crp
pflusha
/*
* enable,super root enable,4096 byte pages,7 bit root index,
* 7 bit pointer index, 6 bit page table index.
*/
movel #0x82c07760,%a3@
pmove %a3@,%tc /* enable the MMU */
jmp 1f
1:
.chip 68k
/*
* Fix up the custom register to point to the new location of the LEDs.
*/
lea %pc@(Lcustom),%a1
movel #0xf0000000,%a1@
/*
* Energise the FPU and caches.
*/
orl #0x64, 0xf05f400c
Lmapphysnothp300:
#endif
#if defined(CONFIG_BVME6000)
is_not_bvme6000(Lmapphysnotbvm)
/*
* save physaddr of phys mem in register a3
*/
moveq #'L',%d7
jbsr Lserial_putc
.word 0xf4d8 /* CINVA I/D */
.word 0xf518 /* pflusha */
.long 0x4e7bd807 /* movec a5,srp */
.long 0x4e7bd806 /* movec a5,urp */
movel #(TC_ENABLE+TC_PAGE4K),%d0
/*
* this value is also ok for the 68060, we don`t use the cache
* mode/protection defaults
*/
.long 0x4e7b0003 /* movec d0,tc (enable the MMU) */
jra LdoneMMUenable /* branch to continuation of startup */
Lmapphysnotbvm:
#endif
LdoneMMUenable:
/*
......@@ -861,6 +1022,7 @@ LdoneMMUenable:
*/
putc('M')
leds(0x10)
/*
* d5 contains physaddr of kernel start
......@@ -917,6 +1079,7 @@ Lcache68060:
/* jump to the kernel start */
putr()
leds(0x55)
subl %a6,%a6 /* clear a6 for gdb */
jbsr SYMBOL_NAME(start_kernel)
......@@ -998,6 +1161,11 @@ LMFP_UDR = 0xfffa2f
#endif
#endif
#if defined (CONFIG_BVME6000)
BVME_SCC_CTRL_A = 0xffb0000b
BVME_SCC_DATA_A = 0xffb0000f
#endif
/*
* Serial port output support.
*/
......@@ -1062,6 +1230,17 @@ Lserial_init:
9:
rts
#ifdef CONFIG_HP300
/* Set LEDs to %d7 */
.even
Lset_leds:
moveml %a0/%a1,%sp@-
movel %pc@(Lcustom),%a1
moveb %d7,%a1@(0x1ffff)
moveml %sp@+,%a0/%a1
rts
#endif
/*
* Output character in d7 on serial port.
* d7 thrashed.
......@@ -1073,6 +1252,16 @@ Lserial_putc:
jne 2f
moveb %d7,%sp@-
.long 0x4e4f0020
jra 9f
2:
#endif
#ifdef CONFIG_BVME6000
cmpil #MACH_BVME6000,%d4
jne 2f
1: btst #2,BVME_SCC_CTRL_A
jeq 1b
moveb %d7,BVME_SCC_DATA_A
jra 9f
2:
#endif
#ifdef CONFIG_AMIGA
......@@ -1199,5 +1388,11 @@ SYMBOL_NAME_LABEL(availmem)
.long 0
SYMBOL_NAME_LABEL(m68k_pgtable_cachemode)
.long 0
#ifdef CONFIG_060_WRITETHROUGH
SYMBOL_NAME_LABEL(m68k_supervisor_cachemode)
.long 0
#endif
#if defined(CONFIG_MVME16x)
SYMBOL_NAME_LABEL(mvme_bdid_ptr)
.long 0
#endif
This diff is collapsed.
......@@ -62,7 +62,3 @@ EXPORT_SYMBOL_NOVERS(memcmp);
EXPORT_SYMBOL_NOVERS(__down_failed);
EXPORT_SYMBOL_NOVERS(__down_failed_interruptible);
EXPORT_SYMBOL_NOVERS(__up_wakeup);
#ifdef CONFIG_PCI
EXPORT_SYMBOL(pci_devices);
#endif
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.
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