Commit 5d2e518d authored by Linus Torvalds's avatar Linus Torvalds

2.1.97 - for brave people only.

I made a 2.1.97 release, in order to synch up with some large patch-sets
I've gotten (non-x86 architecture updates). But due to the new baby this
really hasn't been through my usual exhaustive stress-test ("make bzImage"
+ "boot") so buyer beware.

                Linus
parent f38a2456
......@@ -1433,8 +1433,8 @@ S: 75019 Paris
S: France
N: Rik van Riel
E: H.H.vanRiel@fys.ruu.nl
W: http://www.fys.ruu.nl/~riel/
E: H.H.vanRiel@phys.uu.nl
W: http://www.phys.uu.nl/~riel/
D: Maintainer of the mm-patches page (see www.linuxhq.com)
D: Documentation/sysctl/*, kswapd fixes, random kernel hacker
S: Vorenkampsweg 1
......
......@@ -434,6 +434,15 @@ CONFIG_BLK_DEV_ALI14XX
I/O speeds to be set as well. See the Documentation/ide.txt and
ali14xx.c files for more info.
Apple Macintosh builtin IDE interface support (EXPERIMENTAL)
CONFIG_BLK_DEV_MAC_IDE
This is the IDE driver for the builtin IDE interface on some Apple
Macintosh models. It supports both the Quadra/Performa/LC 630 and
the PowerBook 190 IDE interface.
Say Y if you have such a Macintosh model and want to use IDE devices
(hard disks, CD-ROM drives, etc.) that are connected to the builtin
IDE interface.
XT hard disk support
CONFIG_BLK_DEV_XD
Very old 8 bit hard disk controllers used in the IBM XT computer. To
......@@ -956,6 +965,19 @@ CONFIG_SERIAL_SHARE_IRQ
serial ports on the same board to share a single IRQ. To enable
support for this in the serial driver, say Y here.
Autodetect IRQ on standard ports (unsafe)
CONFIG_SERIAL_DETECT_IRQ
Enable this option if you want the kernel to try to guess which IRQ
is configured during the boot sequence and you're too lazy to edit
the boot scripts to use the setserial command. This option can be
unsafe and should not be enabled on most machines. It is far
better to dynamically request autoconfiguration during the boot-time
scripts using the setserial command. You can change the IRQ and/or
request automatic IRQ configuration at any time by using the
"setserial" program. I wouldn't include this config option at all except
people keep bellyaching about it. I guess they are really are too lazy
to edit their boot scripts. :-) If unsure, say No.
Support special multiport boards
CONFIG_SERIAL_MULTIPORT
Some multiport serial ports have special ports which are used to
......@@ -7301,8 +7323,9 @@ CONFIG_ATARI
Macintosh support
CONFIG_MAC
This option would enable support for the Apple Macintosh if there was
any for it. Say N unless you've coded all the necessary support. ;)
This option enables support for the Apple Macintosh series of computers
(yes, there is experimental support now, at least for part of the series).
Say N unless you're willing to code the remaining necessary support. ;)
# CONFIG_APOLLO, etc. coming soon (?)
......
......@@ -53,8 +53,13 @@ have been remapped by the kernel.
4. Obsolete functions
~~~~~~~~~~~~~~~~~~~~~
<linux/bios32.h> is obsolete and should not be included in new code.
pcibios_find_(device|class) are also obsolete and should be replaced by
pci_find_(device|class).
5. Bus mastering
~~~~~~~~~~~~~~~~
If you need to setup a bus-mastering card, just call pci_set_master(). It
should set PCI_COMMAND_MASTER in the command register and adjust the latency
timer if needed.
......@@ -4,6 +4,8 @@
This document and the related code was written by me (Cort Dougan), please
email me (cort@cs.nmt.edu) if you have questions, comments or corrections.
Last Change: 2.16.98
This entry in the proc directory is readable by all users but only
writable by root.
......
Information about Linux/PPC SMP mode
=====================================================================
This document and the related code was written by me (Cort Dougan), please
email me (cort@cs.nmt.edu) if you have questions, comments or corrections.
This document and the related code was written by me
(Cort Dougan, cort@cs.nmt.edu) please email me if you have questions,
comments or corrections.
Last Change: 4.1.98
SMP support for Linux/PPC is still in its early stages and likely to
be buggy for a while. If you want to help by writing code or testing
......@@ -10,11 +13,17 @@ different hardware please email me!
1. State of Supported Hardware
UMAX s900
PowerSurge Architecture - UMAX s900, Apple 9500/9600/8500/8600/7500/7600
The second processor on this machine boots up just fine and
enters its idle loop. Hopefully a completely working SMP kernel
on this machine will be done shortly.
The code makes the assumption of only two processors. The changes
necessary to work with any number would not be overly difficult but
I don't have any machines with >2 processors so it's not high on my
list of priorities. If anyone else would like do to the work email
me and I can point out the places that need changed.
BeBox
BeBox support hasn't been added to the 2.1.X kernels from 2.0.X
but work is being done and SMP support for BeBox is in the works.
......@@ -4,26 +4,31 @@
Please mail me me (Cort Dougan, cort@cs.nmt.edu) if you have questions,
comments or corrections.
This just covers sound on the PReP systems for now, and later will
contain information on the PowerMac's.
Last Change: 3.24.98
Sound has been tested and is working with the PowerStack and IBM Power
Series onboard sound systems which are based on the cs4231(2) chip.
The sound options when doing the make config are a bit different from the
default, though.
This just covers sound on the PReP and CHRP systems for now and later
will contain information on the PowerMac's.
Sound on PReP has been tested and is working with the PowerStack and IBM
Power Series onboard sound systems which are based on the cs4231(2) chip.
The sound options when doing the make config are a bit different from
the default, though.
The I/O base, irq and dma lines that you enter during the make config
are ignored and are set when booting according to the machine type.
This is so that one binary can be used for Motorola and IBM machines
which use different values and isn't allowed by the driver, so things are
hacked together in such a way as to allow this information to be set
automatically on boot.
which use different values and isn't allowed by the driver, so things
are hacked together in such a way as to allow this information to be
set automatically on boot.
1. Motorola PowerStack PReP machines
1. PowerStack
Enable support for "Crystal CS4232 based (PnP) cards" and for the
Microsoft Sound System. The MSS isn't used, but some of the routines
that the CS4232 driver uses are in it.
Enable support for "Crystal CS4232 based (PnP) cards". Although the
options you set are ignored and determined automatically on boot these
are included for information only:
Although the options you set are ignored and determined automatically
on boot these are included for information only:
(830) CS4232 audio I/O base 530, 604, E80 or F40
(10) CS4232 audio IRQ 5, 7, 9, 11, 12 or 15
......@@ -33,16 +38,31 @@ automatically on boot.
This will allow simultaneous record and playback, as 2 different dma
channels are used.
The sound will be all left channel and very low volume since the
auxiliary input isn't muted by default. I had the changes necessary
for this in the kernel but the sound driver maintainer didn't want
to include them since it wasn't common in other machines. To fix this
you need to mute it using a mixer utility of some sort (if you find one
please let me know) or by patching the driver yourself and recompiling.
There is a problem on the PowerStack 2's (PowerStack Pro's) using a
different irq/drq than the kernel expects. Unfortunately, I don't know
which irq/drq it is so if anyone knows please email me.
Midi is not supported since the cs4232 driver doesn't support midi yet.
2. IBM machines
2. IBM PowerPersonal PReP machines and IBM LongTrail CHRP
I've only tested sound on the Power Personal Series of IBM workstations
so if you try it on others please let me know the result.
so if you try it on others please let me know the result. I'm especially
interested in the 43p's sound system, which I know nothing about.
Enable support for "Crystal CS4232 based (PnP) cards" and for the
Microsoft Sound System. The MSS isn't used, but some of the routines
that the CS4232 driver uses are in it.
Enable support for "Crystal CS4232 based (PnP) cards". Although the
options you set are ignored and determined automatically on boot these
are included for information only:
Although the options you set are ignored and determined automatically
on boot these are included for information only:
(530) CS4232 audio I/O base 530, 604, E80 or F40
(5) CS4232 audio IRQ 5, 7, 9, 11, 12 or 15
......@@ -54,4 +74,3 @@ automatically on boot.
This setup does _NOT_ allow for recording yet.
Midi is not supported since the cs4232 driver doesn't support midi yet.
Documentation for /proc/sys/*/* version 0.1
(c) 1998, Rik van Riel <H.H.vanRiel@fys.ruu.nl>
(c) 1998, Rik van Riel <H.H.vanRiel@phys.uu.nl>
'Why', I hear you ask, 'would anyone even _want_ documentation
for them sysctl files? If anybody really needs it, it's all in
......@@ -32,7 +32,7 @@ it. Not only to have a great laugh, but also to make sure that
you're the last RTFMing person to screw up.
In short, e-mail your suggestions, corrections and / or horror
stories to: <H.H.vanRiel@fys.ruu.nl>
stories to: <H.H.vanRiel@phys.uu.nl>
Rik van Riel.
......
Documentation for /proc/sys/kernel/* version 0.1
(c) 1998, Rik van Riel <H.H.vanRiel@fys.ruu.nl>
(c) 1998, Rik van Riel <H.H.vanRiel@phys.uu.nl>
For general info and legal blurb, please look in README.
......
Documentation for /proc/sys/vm/* version 0.1
(c) 1998, Rik van Riel <H.H.vanRiel@fys.ruu.nl>
(c) 1998, Rik van Riel <H.H.vanRiel@phys.uu.nl>
For general info and legal blurb, please look in README.
......
VERSION = 2
PATCHLEVEL = 1
SUBLEVEL = 96
SUBLEVEL = 97
ARCH := $(shell uname -m | sed -e s/i.86/i386/ -e s/sun4u/sparc64/)
......
/*
* bios32.c - Low-Level PCI Access
*
* $Id: bios32.c,v 1.26 1998/02/18 15:21:09 mj Exp $
* $Id: bios32.c,v 1.29 1998/04/17 16:31:15 mj Exp $
*
* Sponsored by
* iX Multiuser Multitasking Magazine
......@@ -73,6 +73,7 @@
#include <linux/kernel.h>
#include <linux/pci.h>
#include <linux/init.h>
#include <linux/ioport.h>
#include <asm/page.h>
#include <asm/segment.h>
......@@ -86,6 +87,14 @@
#include "irq.h"
#undef DEBUG
#ifdef DEBUG
#define DBG(x...) printk(x)
#else
#define DBG(x...)
#endif
/*
* Generic PCI access -- indirect calls according to detected HW.
*/
......@@ -158,11 +167,13 @@ int pcibios_write_config_dword (unsigned char bus,
return access_pci->write_config_dword(bus, device_fn, where, value);
}
static unsigned int pci_probe = ~0;
#define PCI_PROBE_BIOS 1
#define PCI_PROBE_CONF1 2
#define PCI_PROBE_CONF2 4
#define PCI_NO_SORT 0x100
#define PCI_BIOS_SORT 0x200
static unsigned int pci_probe = PCI_PROBE_BIOS | PCI_PROBE_CONF1 | PCI_PROBE_CONF2;
/*
* Direct access to PCI hardware...
......@@ -596,8 +607,10 @@ static int pci_bios_find_class (unsigned int class_code, unsigned short index,
return (int) (ret & 0xff00) >> 8;
}
static int pci_bios_find_device (unsigned short vendor, unsigned short device_id,
unsigned short index, unsigned char *bus, unsigned char *device_fn)
#endif
__initfunc(static int pci_bios_find_device (unsigned short vendor, unsigned short device_id,
unsigned short index, unsigned char *bus, unsigned char *device_fn))
{
unsigned short bx;
unsigned short ret;
......@@ -621,8 +634,6 @@ static int pci_bios_find_device (unsigned short vendor, unsigned short device_id
return (int) (ret & 0xff00) >> 8;
}
#endif
static int pci_bios_read_config_byte(unsigned char bus,
unsigned char device_fn, unsigned char where, unsigned char *value)
{
......@@ -803,13 +814,13 @@ __initfunc(static struct pci_access *pci_find_bios(void))
check->fields.revision, check);
continue;
}
printk ("PCI: BIOS32 Service Directory structure at 0x%p\n", check);
DBG("PCI: BIOS32 Service Directory structure at 0x%p\n", check);
if (check->fields.entry >= 0x100000) {
printk("PCI: BIOS32 entry in high memory, cannot use.\n");
printk("PCI: BIOS32 entry (0x%p) in high memory, cannot use.\n", check);
return NULL;
} else {
bios32_entry = check->fields.entry;
printk ("PCI: BIOS32 Service Directory entry at 0x%lx\n", bios32_entry);
DBG("PCI: BIOS32 Service Directory entry at 0x%lx\n", bios32_entry);
bios32_indirect.address = bios32_entry + PAGE_OFFSET;
if (check_pcibios())
return &pci_bios_access;
......@@ -817,18 +828,104 @@ __initfunc(static struct pci_access *pci_find_bios(void))
break; /* Hopefully more than one BIOS32 cannot happen... */
}
/*
* If we were told to use the PCI BIOS and it's not present, avoid
* touching the hardware.
*/
pci_probe = 0;
return NULL;
}
/*
* Sort the device list according to PCI BIOS.
*/
__initfunc(void pcibios_sort(void))
{
struct pci_dev *dev = pci_devices;
struct pci_dev **last = &pci_devices;
struct pci_dev *d, **dd, *e;
int idx;
unsigned char bus, devfn;
DBG("PCI: Sorting device list...\n");
while ((e = dev)) {
idx = 0;
while (pci_bios_find_device(e->vendor, e->device, idx, &bus, &devfn) == PCIBIOS_SUCCESSFUL) {
idx++;
for(dd=&dev; (d = *dd); dd = &d->next) {
if (d->bus->number == bus && d->devfn == devfn) {
*dd = d->next;
*last = d;
last = &d->next;
break;
}
}
if (!d)
printk("PCI: BIOS reporting unknown device %02x:%02x\n", bus, devfn);
}
if (!idx) {
printk("PCI: Device %02x:%02x not found by BIOS\n",
dev->bus->number, dev->devfn);
d = dev;
dev = dev->next;
*last = d;
last = &d->next;
}
}
*last = NULL;
}
#endif
/*
* Arch-dependent fixups.
* Several BIOS'es forget to assign addresses to I/O ranges.
* We try to fix it here, expecting there are free addresses
* starting with 0x5800. Ugly, but until we come with better
* resource management, it's the only simple solution.
*/
static int pci_last_io_addr __initdata = 0x5800;
__initfunc(void pcibios_fixup_io_addr(struct pci_dev *dev, int idx))
{
unsigned short cmd;
unsigned int reg = PCI_BASE_ADDRESS_0 + 4*idx;
unsigned int size, addr, try;
unsigned int bus = dev->bus->number;
unsigned int devfn = dev->devfn;
if (!pci_last_io_addr) {
printk("PCI: Unassigned I/O space for %02x:%02x\n", bus, devfn);
return;
}
pcibios_read_config_word(bus, devfn, PCI_COMMAND, &cmd);
pcibios_write_config_word(bus, devfn, PCI_COMMAND, cmd & ~PCI_COMMAND_IO);
pcibios_write_config_dword(bus, devfn, reg, ~0);
pcibios_read_config_dword(bus, devfn, reg, &size);
size = (~(size & PCI_BASE_ADDRESS_IO_MASK) & 0xffff) + 1;
addr = 0;
if (!size || size > 0x100)
printk("PCI: Unable to handle I/O allocation for %02x:%02x (%04x), tell <mj@ucw.cz>\n", bus, devfn, size);
else {
do {
addr = (pci_last_io_addr + size - 1) & ~(size-1);
pci_last_io_addr = addr + size;
} while (check_region(addr, size));
printk("PCI: Assigning I/O space %04x-%04x to device %02x:%02x\n", addr, addr+size-1, bus, devfn);
pcibios_write_config_dword(bus, devfn, reg, addr | PCI_BASE_ADDRESS_SPACE_IO);
pcibios_read_config_dword(bus, devfn, reg, &try);
if ((try & PCI_BASE_ADDRESS_IO_MASK) != addr) {
addr = 0;
printk("PCI: Address setup failed, got %04x\n", try);
} else
dev->base_address[idx] = try;
}
if (!addr) {
pcibios_write_config_dword(bus, devfn, reg, 0);
dev->base_address[idx] = 0;
}
pcibios_write_config_word(bus, devfn, PCI_COMMAND, cmd);
}
/*
* Arch-dependent fixups. We need to fix here base addresses, I/O
* and memory enables and IRQ's as the PCI BIOS'es are buggy as hell.
*/
__initfunc(void pcibios_fixup(void))
......@@ -836,7 +933,6 @@ __initfunc(void pcibios_fixup(void))
struct pci_dev *dev;
int i, has_io, has_mem;
unsigned short cmd;
unsigned char pin;
for(dev = pci_devices; dev; dev=dev->next) {
/*
......@@ -849,18 +945,15 @@ __initfunc(void pcibios_fixup(void))
for(i=0; i<6; i++) {
unsigned long a = dev->base_address[i];
if (a & PCI_BASE_ADDRESS_SPACE_IO) {
has_io |= 1;
has_io = 1;
a &= PCI_BASE_ADDRESS_IO_MASK;
if (!a || a == PCI_BASE_ADDRESS_IO_MASK) {
printk(KERN_WARNING "PCI: BIOS forgot to assign address #%d to device %02x:%02x,"
" please report to <mj@ucw.cz>\n", i, dev->bus->number, dev->devfn);
has_io |= 2;
}
if (!a || a == PCI_BASE_ADDRESS_IO_MASK)
pcibios_fixup_io_addr(dev, i);
} else if (a & PCI_BASE_ADDRESS_MEM_MASK)
has_mem = 1;
}
pci_read_config_word(dev, PCI_COMMAND, &cmd);
if (has_io == 1 && !(cmd & PCI_COMMAND_IO)) {
if (has_io && !(cmd & PCI_COMMAND_IO)) {
printk("PCI: Enabling I/O for device %02x:%02x\n",
dev->bus->number, dev->devfn);
cmd |= PCI_COMMAND_IO;
......@@ -872,14 +965,15 @@ __initfunc(void pcibios_fixup(void))
cmd |= PCI_COMMAND_MEMORY;
pci_write_config_word(dev, PCI_COMMAND, cmd);
}
pci_read_config_byte(dev, PCI_INTERRUPT_PIN, &pin);
#ifdef __SMP__
/*
* Recalculate IRQ numbers if we use the I/O APIC
*/
{
int irq;
unsigned char pin;
pci_read_config_byte(dev, PCI_INTERRUPT_PIN, &pin);
if (pin) {
pin--; /* interrupt pins are numbered starting from 1 */
irq = IO_APIC_get_PCI_irq_vector (dev->bus->number, PCI_SLOT(dev->devfn), pin);
......@@ -896,30 +990,38 @@ __initfunc(void pcibios_fixup(void))
*/
if (dev->irq >= NR_IRQS)
dev->irq = 0;
if (pin && !dev->irq)
printk(KERN_WARNING "PCI: Bogus IRQ for device %02x:%02x [pin=%x], please report to <mj@ucw.cz>\n",
dev->bus->number, dev->devfn, pin);
}
#ifdef CONFIG_PCI_BIOS
if ((pci_probe & PCI_BIOS_SORT) && !(pci_probe & PCI_NO_SORT))
pcibios_sort();
#endif
}
/*
* Initialization. Try all known PCI access methods.
* Initialization. Try all known PCI access methods. Note that we support
* using both PCI BIOS and direct access: in such cases, we use I/O ports
* to access config space, but we still keep BIOS order of cards to be
* compatible with 2.0.X. This should go away in 2.3.
*/
__initfunc(void pcibios_init(void))
{
struct pci_access *a = NULL;
struct pci_access *bios = NULL;
struct pci_access *dir = NULL;
#ifdef CONFIG_PCI_BIOS
if (pci_probe & PCI_PROBE_BIOS)
a = pci_find_bios();
if ((pci_probe & PCI_PROBE_BIOS) && ((bios = pci_find_bios())))
pci_probe |= PCI_BIOS_SORT;
#endif
#ifdef CONFIG_PCI_DIRECT
if (!a && (pci_probe & (PCI_PROBE_CONF1 | PCI_PROBE_CONF2)))
a = pci_check_direct();
if (pci_probe & (PCI_PROBE_CONF1 | PCI_PROBE_CONF2))
dir = pci_check_direct();
#endif
if (a)
access_pci = a;
if (dir)
access_pci = dir;
else if (bios)
access_pci = bios;
}
#if !defined(CONFIG_PCI_BIOS) && !defined(CONFIG_PCI_DIRECT)
......@@ -928,25 +1030,35 @@ __initfunc(void pcibios_init(void))
__initfunc(char *pcibios_setup(char *str))
{
if (!strncmp(str, "off", 3)) {
if (!strcmp(str, "off")) {
pci_probe = 0;
return NULL;
} else if (!strncmp(str, "io=", 3)) {
char *p;
unsigned int x = simple_strtoul(str+3, &p, 16);
if (p && *p)
return str;
pci_last_io_addr = x;
return NULL;
}
#ifdef CONFIG_PCI_BIOS
else if (!strncmp(str, "bios", 4)) {
else if (!strcmp(str, "bios")) {
pci_probe = PCI_PROBE_BIOS;
return NULL;
} else if (!strncmp(str, "nobios", 6)) {
} else if (!strcmp(str, "nobios")) {
pci_probe &= ~PCI_PROBE_BIOS;
return NULL;
} else if (!strcmp(str, "nosort")) {
pci_probe |= PCI_NO_SORT;
return NULL;
}
#endif
#ifdef CONFIG_PCI_DIRECT
else if (!strncmp(str, "conf1", 5)) {
else if (!strcmp(str, "conf1")) {
pci_probe = PCI_PROBE_CONF1;
return NULL;
}
else if (!strncmp(str, "conf2", 5)) {
else if (!strcmp(str, "conf2")) {
pci_probe = PCI_PROBE_CONF2;
return NULL;
}
......
......@@ -64,7 +64,7 @@ static int write_ldt(void * ptr, unsigned long bytecount, int oldmode)
*/
if (!mm->segments) {
for (i=1 ; i<NR_TASKS ; i++) {
if (task[i]->mm == mm) {
if (task[i] == current) {
if (!(mm->segments = (void *) vmalloc(LDT_ENTRIES*LDT_ENTRY_SIZE)))
return -ENOMEM;
memset(mm->segments, 0, LDT_ENTRIES*LDT_ENTRY_SIZE);
......
......@@ -488,7 +488,7 @@ void copy_segments(int nr, struct task_struct *p, struct mm_struct *new_mm)
memcpy(ldt, old_mm->segments, LDT_ENTRIES*LDT_ENTRY_SIZE);
}
}
set_ldt_desc(gdt+(nr<<1)+FIRST_LDT_ENTRY, ldt, LDT_ENTRIES);
set_ldt_desc(gdt+(nr<<1)+FIRST_LDT_ENTRY, ldt, ldt_size);
}
int copy_thread(int nr, unsigned long clone_flags, unsigned long esp,
......
......@@ -20,7 +20,7 @@
of the stack frame of math_emulate() */
#define SETUP_DATA_AREA(arg) FPU_info = (struct info *) &arg
#define LDT_DESCRIPTOR(s) (((struct ldt_struct *)current->mm->segments)[(s) >> 3])
#define LDT_DESCRIPTOR(s) (((struct desc_struct *)current->mm->segments)[(s) >> 3])
#define SEG_D_SIZE(x) ((x).b & (3 << 21))
#define SEG_G_BIT(x) ((x).b & (1 << 23))
#define SEG_GRANULARITY(x) (((x).b & (1 << 23)) ? 4096 : 1)
......
#
# Makefile for the linux MPC8xx ppc-specific parts of comm processor
#
# 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 definition is now in the main makefile...
O_TARGET := 8xx_io.a
O_OBJS = commproc.o uart.o enet.o
include $(TOPDIR)/Rules.make
/*
* General Purpose functions for the global management of the
* Communication Processor Module.
* Copyright (c) 1997 Dan Malek (dmalek@jlc.net)
*
* In addition to the individual control of the communication
* channels, there are a few functions that globally affect the
* communication processor.
*
* Buffer descriptors must be allocated from the dual ported memory
* space. The allocator for that is here. When the communication
* process is reset, we reclaim the memory available. There is
* currently no deallocator for this memory.
* The amount of space available is platform dependent. On the
* MBX, the EPPC software loads additional microcode into the
* communication processor, and uses some of the DP ram for this
* purpose. Current, the first 512 bytes and the last 256 bytes of
* memory are used. Right now I am conservative and only use the
* memory that can never be used for microcode. If there are
* applications that require more DP ram, we can expand the boundaries
* but then we have to be careful of any downloaded microcode.
*/
#include <linux/config.h>
#include <linux/errno.h>
#include <linux/sched.h>
#include <linux/kernel.h>
#include <linux/param.h>
#include <linux/string.h>
#include <linux/mm.h>
#include <linux/interrupt.h>
#include <asm/irq.h>
#include <asm/mbx.h>
#include <asm/page.h>
#include <asm/pgtable.h>
#include <asm/8xx_immap.h>
#include "commproc.h"
static uint dp_alloc_base; /* Starting offset in DP ram */
static uint dp_alloc_top; /* Max offset + 1 */
static uint host_buffer; /* One page of host buffer */
static uint host_end; /* end + 1 */
cpm8xx_t *cpmp; /* Pointer to comm processor space */
/* CPM interrupt vector functions.
*/
struct cpm_action {
void (*handler)(void *);
void *dev_id;
};
static struct cpm_action cpm_vecs[CPMVEC_NR];
static void cpm_interrupt(int irq, void * dev, struct pt_regs * regs);
static void cpm_error_interrupt(void *);
void
mbx_cpm_reset(uint host_page_addr)
{
volatile immap_t *imp;
volatile cpm8xx_t *commproc;
pte_t *pte;
imp = (immap_t *)MBX_IMAP_ADDR;
commproc = (cpm8xx_t *)&imp->im_cpm;
#ifdef notdef
/* We can't do this. It seems to blow away the microcode
* patch that EPPC-Bug loaded for us. EPPC-Bug uses SCC1 for
* Ethernet, SMC1 for the console, and I2C for serial EEPROM.
* Our own drivers quickly reset all of these.
*/
/* Perform a reset.
*/
commproc->cp_cpcr = (CPM_CR_RST | CPM_CR_FLG);
/* Wait for it.
*/
while (commproc->cp_cpcr & CPM_CR_FLG);
#endif
/* Set SDMA Bus Request priority 5.
*/
imp->im_siu_conf.sc_sdcr = 1;
/* Reclaim the DP memory for our use.
*/
dp_alloc_base = CPM_DATAONLY_BASE;
dp_alloc_top = dp_alloc_base + CPM_DATAONLY_SIZE;
/* Set the host page for allocation.
*/
host_buffer = host_page_addr; /* Host virtual page address */
host_end = host_page_addr + PAGE_SIZE;
pte = va_to_pte(&init_task, host_page_addr);
pte_val(*pte) |= _PAGE_NO_CACHE;
flush_tlb_page(current->mm->mmap, host_buffer);
/* Tell everyone where the comm processor resides.
*/
cpmp = (cpm8xx_t *)commproc;
/* Initialize the CPM interrupt controller.
*/
((immap_t *)MBX_IMAP_ADDR)->im_cpic.cpic_cicr =
(CICR_SCD_SCC4 | CICR_SCC_SCC3 | CICR_SCB_SCC2 | CICR_SCA_SCC1) |
((CPM_INTERRUPT/2) << 13) | CICR_HP_MASK;
((immap_t *)MBX_IMAP_ADDR)->im_cpic.cpic_cimr = 0;
/* Set our interrupt handler with the core CPU.
*/
if (request_irq(CPM_INTERRUPT, cpm_interrupt, 0, "cpm", NULL) != 0)
panic("Could not allocate CPM IRQ!");
/* Install our own error handler.
*/
cpm_install_handler(CPMVEC_ERROR, cpm_error_interrupt, NULL);
((immap_t *)MBX_IMAP_ADDR)->im_cpic.cpic_cicr |= CICR_IEN;
}
/* CPM interrupt controller interrupt.
*/
static void
cpm_interrupt(int irq, void * dev, struct pt_regs * regs)
{
uint vec;
/* Get the vector by setting the ACK bit and then reading
* the register.
*/
((volatile immap_t *)MBX_IMAP_ADDR)->im_cpic.cpic_civr = 1;
vec = ((volatile immap_t *)MBX_IMAP_ADDR)->im_cpic.cpic_civr;
vec >>= 11;
if (cpm_vecs[vec].handler != 0)
(*cpm_vecs[vec].handler)(cpm_vecs[vec].dev_id);
else
((immap_t *)MBX_IMAP_ADDR)->im_cpic.cpic_cimr &= ~(1 << vec);
/* After servicing the interrupt, we have to remove the status
* indicator.
*/
((immap_t *)MBX_IMAP_ADDR)->im_cpic.cpic_cisr |= (1 << vec);
}
/* The CPM can generate the error interrupt when there is a race condition
* between generating and masking interrupts. All we have to do is ACK it
* and return. This is a no-op function so we don't need any special
* tests in the interrupt handler.
*/
static void
cpm_error_interrupt(void *dev)
{
}
/* Install a CPM interrupt handler.
*/
void
cpm_install_handler(int vec, void (*handler)(void *), void *dev_id)
{
if (cpm_vecs[vec].handler != 0)
printk("CPM interrupt %x replacing %x\n",
(uint)handler, (uint)cpm_vecs[vec].handler);
cpm_vecs[vec].handler = handler;
cpm_vecs[vec].dev_id = dev_id;
((immap_t *)MBX_IMAP_ADDR)->im_cpic.cpic_cimr |= (1 << vec);
}
/* Allocate some memory from the dual ported ram. We may want to
* enforce alignment restrictions, but right now everyone is a good
* citizen.
*/
uint
mbx_cpm_dpalloc(uint size)
{
uint retloc;
if ((dp_alloc_base + size) >= dp_alloc_top)
return(CPM_DP_NOSPACE);
retloc = dp_alloc_base;
dp_alloc_base += size;
return(retloc);
}
/* We also own one page of host buffer space for the allocation of
* UART "fifos" and the like.
*/
uint
mbx_cpm_hostalloc(uint size)
{
uint retloc;
if ((host_buffer + size) >= host_end)
return(0);
retloc = host_buffer;
host_buffer += size;
return(retloc);
}
/* Set a baud rate generator. This needs lots of work. There are
* four BRGs, any of which can be wired to any channel.
* The internal baud rate clock is the system clock divided by 16.
* I need to find a way to get this system clock frequency, which is
* part of the VPD.......
*/
#define BRG_INT_CLK (40000000/16)
void
mbx_cpm_setbrg(uint brg, uint rate)
{
volatile uint *bp;
/* This is good enough to get SMCs running.....
*/
bp = (uint *)&cpmp->cp_brgc1;
bp += brg;
*bp = ((BRG_INT_CLK / rate) << 1) | CPM_BRG_EN;
}
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
......@@ -12,14 +12,7 @@
# Rewritten by Cort Dougan and Paul Mackerras
#
ifdef CONFIG_CHRP
# XXX for now
KERNELBASE =0x90000000
KERNELLOAD =0x90010000
else
KERNELBASE =0xc0000000
KERNELLOAD =0xc0000000
endif
KERNELLOAD =0xc0000000
# PowerPC (cross) tools
ifneq ($(shell uname -m),ppc)
......@@ -32,21 +25,13 @@ ASFLAGS =
LINKFLAGS = -T arch/ppc/vmlinux.lds -Ttext $(KERNELLOAD) -Bstatic
CFLAGSINC = -D__KERNEL__ -I$(TOPDIR)/include -D__powerpc__
CFLAGS := $(CFLAGS) -D__powerpc__ -fsigned-char -msoft-float -pipe \
-fno-builtin -ffixed-r2 -Wno-uninitialized -mmultiple -mstring \
-DKERNELBASE=$(KERNELBASE)
-fno-builtin -ffixed-r2 -Wno-uninitialized -mmultiple -mstring
CPP = $(CC) -E $(CFLAGS)
ifdef CONFIG_601
CFLAGS := $(CFLAGS) -mcpu=601 -DCPU=601
ifdef CONFIG_8xx
CFLAGS := $(CFLAGS) -mcpu=860
endif
ifdef CONFIG_603
CFLAGS := $(CFLAGS) -mcpu=603 -DCPU=603
endif
ifdef CONFIG_604
CFLAGS := $(CFLAGS) -mcpu=604 -DCPU=604
endif
HEAD := arch/ppc/kernel/head.o
......@@ -64,6 +49,11 @@ MAKEBOOT = $(MAKE) -C arch/$(ARCH)/boot
MAKECOFFBOOT = $(MAKE) -C arch/$(ARCH)/coffboot
MAKECHRPBOOT = $(MAKE) -C arch/$(ARCH)/chrpboot
ifdef CONFIG_8xx
SUBDIRS += arch/ppc/8xx_io
DRIVERS += arch/ppc/8xx_io/8xx_io.a drivers/net/net.a
endif
checks:
@$(MAKE) -C arch/$(ARCH)/kernel checks
......@@ -83,6 +73,19 @@ prep_config:
rm -f .config arch/ppc/defconfig
ln -s prep_defconfig arch/ppc/defconfig
chrp_config:
rm -f .config arch/ppc/defconfig
ln -s chrp_defconfig arch/ppc/defconfig
common_config:
rm -f .config arch/ppc/common_defconfig
ln -s common_defconfig arch/ppc/defconfig
mbx_config:
rm -f .config arch/ppc/defconfig
ln -s mbx_defconfig arch/ppc/defconfig
tags:
etags */*.c include/{asm,linux}/*.h arch/ppc/kernel/*.{c,h}
......
......@@ -25,31 +25,70 @@ ZOFF = 0
ZSZ = 0
IOFF = 0
ISZ = 0
ifeq ($(CONFIG_MBX),y)
ZLINKFLAGS = -T ../vmlinux.lds -Ttext 0x00100000
else
#ZLINKFLAGS = -T ../vmlinux.lds -Ttext 0x00800000
ZLINKFLAGS = -T ../vmlinux.lds -Ttext 0x00600000
endif
GZIP_FLAGS = -v9
OBJECTS := head.o misc.o vreset.o kbd.o ../coffboot/zlib.o # inflate.o unzip.o
#OBJECTS := crt0.o start.o vreset.o
OBJECTS := head.o misc.o ../coffboot/zlib.o # inflate.o unzip.o
CFLAGS = -O2 -DSTDC_HEADERS -fno-builtin -I$(TOPDIR)/include
OBJCOPY = $(CROSS_COMPILE)objcopy
OBJCOPY_ARGS = -O elf32-powerpc
ifeq ($(CONFIG_MBX),y)
OBJECTS += mbxtty.o
CFLAGS += -DCONFIG_MBX
else
OBJECTS += vreset.o kbd.o
endif
all: zImage
ifeq ($(CONFIG_ALL_PPC),y)
CONFIG_PREP = y
endif
ifeq ($(CONFIG_PREP),y)
mkprep : mkprep.c
$(HOSTCC) -DKERNELBASE=$(KERNELBASE) -o mkprep mkprep.c
zvmlinux.initrd: zvmlinux
$(LD) $(ZLINKFLAGS) -o zvmlinux.initrd.tmp $(OBJECTS)
$(OBJCOPY) $(OBJCOPY_ARGS) -R .comment \
--add-section=initrd=ramdisk.image.gz \
--add-section=image=../coffboot/vmlinux.gz \
zvmlinux.initrd.tmp zvmlinux.initrd
$(CC) $(CFLAGS) -DINITRD_OFFSET=`sh offset zvmlinux.initrd initrd` \
-DINITRD_SIZE=`sh size zvmlinux.initrd initrd` \
-DZIMAGE_OFFSET=`sh offset zvmlinux.initrd image` \
-DZIMAGE_SIZE=`sh size zvmlinux.initrd image` \
-DKERNELBASE=$(KERNELBASE) -c -o misc.o misc.c
$(LD) $(ZLINKFLAGS) -o zvmlinux.initrd.tmp $(OBJECTS)
$(OBJCOPY) $(OBJCOPY_ARGS) -R .comment \
--add-section=initrd=ramdisk.image.gz \
--add-section=image=../coffboot/vmlinux.gz \
zvmlinux.initrd.tmp $@
rm zvmlinux.initrd.tmp
floppy: $(TOPDIR)/vmlinux zImage
dd if=zImage of=/dev/fd0H1440 bs=64b
else
zvmlinux.initrd:
endif
znetboot : zImage
cp zImage /tftpboot/zImage.prep
zImage: zvmlinux mkprep
ifeq ($(CONFIG_PREP),y)
./mkprep -pbp zvmlinux zImage
endif
ifeq ($(CONFIG_MBX),y)
ln -sf zvmlinux zImage
endif
znetboot.initrd : zImage.initrd
cp zImage.initrd /tftpboot/zImage.prep
zImage.initrd: zvmlinux.initrd mkprep
ifeq ($(CONFIG_PREP),y)
./mkprep -pbp zvmlinux.initrd zImage.initrd
endif
ifeq ($(CONFIG_MBX),y)
ln -sf zvmlinux.initrd zImage.initrd
endif
zvmlinux: $(OBJECTS) ../coffboot/vmlinux.gz
#
......@@ -63,61 +102,39 @@ zvmlinux: $(OBJECTS) ../coffboot/vmlinux.gz
# then with the offset rebuild the bootloader so we know where the kernel is
#
$(CC) $(CFLAGS) -DINITRD_OFFSET=0 -DINITRD_SIZE=0 \
-DZIMAGE_OFFSET=`./offset zvmlinux image` \
-DZIMAGE_SIZE=`./size zvmlinux image` -DKERNELBASE=$(KERNELBASE) \
-DZIMAGE_OFFSET=`sh offset zvmlinux image` \
-DZIMAGE_SIZE=`sh size zvmlinux image` -DKERNELBASE=$(KERNELBASE) \
-c -o misc.o misc.c
$(LD) $(ZLINKFLAGS) -o zvmlinux.tmp $(OBJECTS)
$(OBJCOPY) $(OBJCOPY_ARGS) -R .comment --add-section=image=../coffboot/vmlinux.gz \
zvmlinux.tmp $@
rm zvmlinux.tmp
zvmlinux.initrd: zvmlinux
$(LD) $(ZLINKFLAGS) -o zvmlinux.initrd.tmp $(OBJECTS)
$(OBJCOPY) $(OBJCOPY_ARGS) -R .comment \
--add-section=initrd=ramdisk.image.gz \
--add-section=image=../coffboot/vmlinux.gz \
zvmlinux.initrd.tmp zvmlinux.initrd
$(CC) $(CFLAGS) -DINITRD_OFFSET=`./offset zvmlinux.initrd initrd` \
-DINITRD_SIZE=`./size zvmlinux.initrd initrd` \
-DZIMAGE_OFFSET=`./offset zvmlinux.initrd image` \
-DZIMAGE_SIZE=`./size zvmlinux.initrd image` \
-DKERNELBASE=$(KERNELBASE) -c -o misc.o misc.c
$(LD) $(ZLINKFLAGS) -o zvmlinux.initrd.tmp $(OBJECTS)
$(OBJCOPY) $(OBJCOPY_ARGS) -R .comment \
--add-section=initrd=ramdisk.image.gz \
--add-section=image=../coffboot/vmlinux.gz \
zvmlinux.initrd.tmp $@
rm zvmlinux.initrd.tmp
zImage: zvmlinux mkprep
./mkprep -pbp zvmlinux zImage
zImage.initrd: zvmlinux.initrd mkprep
./mkprep -pbp zvmlinux.initrd zImage.initrd
else
mkprep:
floppy:
znetboot:
znetboot.initrd:
zvmlinux:
zvmlinux.initrd:
zImage:
zImage.initrd:
floppy: $(TOPDIR)/vmlinux zImage
ifeq ($(CONFIG_PREP),y)
dd if=zImage of=/dev/fd0H1440 bs=64b
endif
mkprep : mkprep.c
ifeq ($(CONFIG_PREP),y)
$(HOSTCC) -DKERNELBASE=$(KERNELBASE) -o mkprep mkprep.c
endif
znetboot : zImage
ifeq ($(CONFIG_PREP),y)
cp zImage /tftpboot/zImage.prep
endif
ifeq ($(CONFIG_MBX),y)
cp zImage /tftpboot/zImage.mbx
endif
# just here to match coffboot/Makefile
vmlinux.coff:
vmlinux.coff.initrd:
znetboot.initrd : zImage.initrd
ifeq ($(CONFIG_PREP),y)
cp zImage.initrd /tftpboot/zImage.prep
endif
ifeq ($(CONFIG_MBX),y)
cp zImage.initrd /tftpboot/zImage.mbx
endif
clean:
rm -f vmlinux* zvmlinux* mkprep zImage*
......@@ -128,3 +145,7 @@ fastdep:
dep:
$(CPP) -M *.S *.c > .depend
# just here to match coffboot/Makefile
vmlinux.coff:
vmlinux.coff.initrd:
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
......@@ -16,11 +16,11 @@ void gunzip(void *, int, unsigned char *, int *);
#define get_16be(x) (*(unsigned short *)(x))
#define get_32be(x) (*(unsigned *)(x))
#define RAM_START 0x90000000
#define RAM_END 0x90800000 /* only 8M mapped with BATs */
#define RAM_START 0x00000000
#define RAM_END 0x00800000 /* only 8M mapped with BATs */
#define RAM_FREE 0x90540000 /* after image of chrpboot */
#define PROG_START 0x90010000
#define RAM_FREE 0x00540000 /* after image of chrpboot */
#define PROG_START 0x00010000
char *avail_ram;
char *end_avail;
......@@ -40,7 +40,7 @@ chrpboot(int a1, int a2, void *prom)
unsigned initrd_start, initrd_size;
printf("chrpboot starting\n\r");
setup_bats();
/* setup_bats(); */
if (initrd_len) {
initrd_size = initrd_len;
......
......@@ -23,10 +23,10 @@ setup_bats:
b 5f
4: ori 4,4,0xff /* set up BAT registers for 604 */
li 5,2
mtdbatu 0,4
mtdbatl 0,5
5: mtibatu 0,4
mtibatl 0,5
mtdbatu 3,4
mtdbatl 3,5
5: mtibatu 3,4
mtibatl 3,5
isync
blr
......
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
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