Commit 47516c7a authored by Richard Henderson's avatar Richard Henderson

Merge with mainline.

parents d77e03bd 4c55cc62
...@@ -2846,6 +2846,7 @@ S: 76131 Karlsruhe ...@@ -2846,6 +2846,7 @@ S: 76131 Karlsruhe
S: Germany S: Germany
N: James Simmons N: James Simmons
E: jsimmons@infradead.org
E: jsimmons@users.sf.net E: jsimmons@users.sf.net
D: Frame buffer device maintainer D: Frame buffer device maintainer
D: input layer developement D: input layer developement
......
Intel 810/815 Framebuffer driver
Tony Daplas <adaplas@pol.net>
http://i810fb.sourceforge.net
March 17, 2002
First Released: July 2001
================================================================
A. Introduction
This is a framebuffer driver for various Intel 810/815 compatible
graphics devices. These would include:
Intel 810
Intel 810E
Intel 810-DC100
Intel 815 Internal graphics only, 100Mhz FSB
Intel 815 Internal graphics only
Intel 815 Internal graphics and AGP
B. Features
- Choice of using Discrete Video Timings, VESA Generalized Timing
Formula, or a framebuffer specific database to set the video mode
- Supports a variable range of horizontal and vertical resolution, and
vertical refresh rates if the VESA Generalized Timing Formula is
enabled.
- Supports color depths of 8, 16, 24 and 32 bits per pixel
- Supports pseudocolor, directcolor, or truecolor visuals
- Full and optimized hardware acceleration at 8, 16 and 24 bpp
- Robust video state save and restore
- MTRR support
- Utilizes user-entered monitor specifications to automatically
calculate required video mode parameters.
- Can concurrently run with xfree86 running with native i810 drivers
- Hardware Cursor Support
C. List of available options
a. "video=i810fb"
enables the i810 driver
Recommendation: required
b. "xres:<value>"
select horizontal resolution in pixels
Recommendation: user preference
(default = 640)
c. "yres:<value>"
select vertical resolution in scanlines. If Discrete Video Timings
is enabled, this will be ignored and computed as 3*xres/4.
Recommendation: user preference
(default = 480)
d. "vyres:<value>"
select virtual vertical resolution in scanlines. If (0) or none
is specified, this will be computed against maximum available memory.
Recommendation: do not set
(default = 480)
e. "vram:<value>"
select amount of system RAM in MB to allocate for the video memory
Recommendation: 1 - 4 MB.
(default = 4)
f. "bpp:<value>"
select desired pixel depth
Recommendation: 8
(default = 8)
g. "hsync1/hsync2:<value>"
select the minimum and maximum Horizontal Sync Frequency of the
monitor in KHz. If a using a fixed frequency monitor, hsync1 must
be equal to hsync2.
Recommendation: check monitor manual for correct values
default (29/30)
h. "vsync1/vsync2:<value>"
select the minimum and maximum Vertical Sync Frequency of the monitor
in Hz. You can also use this option to lock your monitor's refresh
rate.
Recommendation: check monitor manual for correct values
(default = 60/60)
IMPORTANT: If you need to clamp your timings, try to give some
leeway for computational errors (over/underflows). Example: if
using vsync1/vsync2 = 60/60, make sure hsync1/hsync2 has at least
a 1 unit difference, and vice versa.
i. "voffset:<value>"
select at what offset in MB of the logical memory to allocate the
framebuffer memory. The intent is to avoid the memory blocks
used by standard graphics applications (XFree86). The default
offset (16 MB for a 64MB aperture, 8 MB for a 32MB aperture) will
avoid XFree86's usage and allows up to 7MB/15MB of framebuffer
memory. Depending on your usage, adjust the value up or down,
(0 for maximum usage, 31/63 MB for the least amount). Note, an
arbitrary setting may conflict with XFree86.
Recommendation: do not set
(default = 8 or 16 MB)
j. "accel"
enable text acceleration. This can be enabled/reenabled anytime
by using 'fbset -accel true/false'.
Recommendation: enable
(default = not set)
k. "mtrr"
enable MTRR. This allows data transfers to the framebuffer memory
to occur in bursts which can significantly increase performance.
Not very helpful with the i810/i815 because of 'shared memory'.
Recommendation: do not set
(default = not set)
l. "extvga"
if specified, secondary/external VGA output will always be enabled.
Useful if the BIOS turns off the VGA port when no monitor is attached.
The external VGA monitor can then be attached without rebooting.
Recommendation: do not set
(default = not set)
m. "sync"
Forces the hardware engine to do a "sync" or wait for the hardware
to finish before starting another instruction. This will produce a
more stable setup, but will be slower.
Recommendation: do not set
(default = not set)
n. "dcolor"
Use directcolor visual instead of truecolor for pixel depths greater
than 8 bpp. Useful for color tuning, such as gamma control.
Recommendation: do not set
(default = not set)
D. Kernel booting
Separate each option/option-pair by commas (,) and the option from its value
with a colon (:) as in the following:
video=i810fb:option1,option2:value2
Sample Usage
------------
In /etc/lilo.conf, add the line:
append="video=i810fb:vram:2,xres:1024,yres:768,bpp:8,hsync1:30,hsync2:55, \
vsync1:50,vsync2:85,accel,mtrr"
This will initialize the framebuffer to 1024x768 at 8bpp. The framebuffer
will use 2 MB of System RAM. MTRR support will be enabled. The refresh rate
will be computed based on the hsync1/hsync2 and vsync1/vsync2 values.
IMPORTANT:
You must include hsync1, hsync2, vsync1 and vsync2 to enable video modes
better than 640x480 at 60Hz.
E. Module options
The module parameters are essentially similar to the kernel
parameters. The main difference is that you need to include a Boolean value
(1 for TRUE, and 0 for FALSE) for those options which don't need a value.
Example, to enable MTRR, include "mtrr=1".
Sample Usage
------------
Using the same setup as described above, load the module like this:
modprobe i810fb vram=2 xres=1024 bpp=8 hsync1=30 hsync2=55 vsync1=50 \
vsync2=85 accel=1 mtrr=1
Or just add the following to /etc/modules.conf
options i810fb vram=2 xres=1024 bpp=16 hsync1=30 hsync2=55 vsync1=50 \
vsync2=85 accel=1 mtrr=1
and just do a
modprobe i810fb
F. Setup
a. Do your usual method of configuring the kernel.
make menuconfig/xconfig/config
b. Under "Code Maturity Options", enable "Prompt for experimental/
incomplete code/drivers".
c. Enable agpgart support for the Intel 810/815 on-board graphics.
This is required. The option is under "Character Devices"
d. Under "Graphics Support", select "Intel 810/815" either statically
or as a module. Choose "use VESA GTF for video timings" if you
need to maximize the capability of your display. To be on the
safe side, you can leave this unselected.
e. If you want a framebuffer console, enable it under "Console
Drivers"
f. Compile your kernel.
g. Load the driver as described in section D and E.
Optional:
h. If you are going to run XFree86 with its native drivers, the
standard XFree86 4.1.0 and 4.2.0 drivers should work as is.
However, there's a bug in the XFree86 i810 drivers. It attempts
to use XAA even when switched to the console. This will crash
your server. I have a fix at this site:
http://i810fb.sourceforge.net.
You can either use the patch, or just replace
/usr/X11R6/lib/modules/drivers/i810_drv.o
with the one provided at the website.
i. Try the DirectFB (http://www.directfb.org) + the i810 gfxdriver
patch to see the chipset in action (or inaction :-).
G. Acknowledgment:
1. Geert Uytterhoeven - his excellent howto and the virtual
framebuffer driver code made this possible.
2. Jeff Hartmann for his agpgart code.
3. The X developers. Insights were provided just by reading the
XFree86 source code.
4. Intel(c). For this value-oriented chipset driver and for
providing documentation.
5. Matt Sottek. His inputs and ideas helped in making some
optimizations possible.
H. Home Page:
A more complete, and probably updated information is provided at
http://i810fb.sourceforge.net.
###########################
Tony
...@@ -644,7 +644,7 @@ S: Supported ...@@ -644,7 +644,7 @@ S: Supported
FRAMEBUFFER LAYER FRAMEBUFFER LAYER
P: James Simmons, Geert Uytterhoeven P: James Simmons, Geert Uytterhoeven
M: jsimmons@users.sf.net, geert@linux-m68k.org M: jsimmons@infradead.org, geert@linux-m68k.org
L: linux-fbdev-devel@lists.sourceforge.net L: linux-fbdev-devel@lists.sourceforge.net
W: http://www.linux-fbdev.org W: http://www.linux-fbdev.org
S: Supported S: Supported
......
VERSION = 2 VERSION = 2
PATCHLEVEL = 5 PATCHLEVEL = 5
SUBLEVEL = 53 SUBLEVEL = 54
EXTRAVERSION = EXTRAVERSION =
# *DOCUMENTATION* # *DOCUMENTATION*
......
...@@ -35,6 +35,7 @@ ...@@ -35,6 +35,7 @@
#include <linux/ipc.h> #include <linux/ipc.h>
#include <linux/namei.h> #include <linux/namei.h>
#include <linux/uio.h> #include <linux/uio.h>
#include <linux/vfs.h>
#include <asm/fpu.h> #include <asm/fpu.h>
#include <asm/io.h> #include <asm/io.h>
......
...@@ -67,18 +67,12 @@ void module_free(struct module *module, void *region) ...@@ -67,18 +67,12 @@ void module_free(struct module *module, void *region)
vfree(region); vfree(region);
} }
long int module_frob_arch_sections(const Elf_Ehdr *hdr,
module_core_size(const Elf32_Ehdr *hdr, const Elf32_Shdr *sechdrs, const Elf_Shdr *sechdrs,
const char *secstrings, struct module *module) const char *secstrings,
struct module *mod)
{ {
return module->core_size; return 0;
}
long
module_init_size(const Elf32_Ehdr *hdr, const Elf32_Shdr *sechdrs,
const char *secstrings, struct module *module)
{
return module->init_size;
} }
int int
...@@ -88,7 +82,7 @@ apply_relocate(Elf32_Shdr *sechdrs, const char *strtab, unsigned int symindex, ...@@ -88,7 +82,7 @@ apply_relocate(Elf32_Shdr *sechdrs, const char *strtab, unsigned int symindex,
Elf32_Shdr *symsec = sechdrs + symindex; Elf32_Shdr *symsec = sechdrs + symindex;
Elf32_Shdr *relsec = sechdrs + relindex; Elf32_Shdr *relsec = sechdrs + relindex;
Elf32_Shdr *dstsec = sechdrs + relsec->sh_info; Elf32_Shdr *dstsec = sechdrs + relsec->sh_info;
Elf32_Rel *rel = (void *)relsec->sh_offset; Elf32_Rel *rel = (void *)relsec->sh_addr;
unsigned int i; unsigned int i;
for (i = 0; i < relsec->sh_size / sizeof(Elf32_Rel); i++, rel++) { for (i = 0; i < relsec->sh_size / sizeof(Elf32_Rel); i++, rel++) {
...@@ -103,7 +97,7 @@ apply_relocate(Elf32_Shdr *sechdrs, const char *strtab, unsigned int symindex, ...@@ -103,7 +97,7 @@ apply_relocate(Elf32_Shdr *sechdrs, const char *strtab, unsigned int symindex,
return -ENOEXEC; return -ENOEXEC;
} }
sym = ((Elf32_Sym *)symsec->sh_offset) + offset; sym = ((Elf32_Sym *)symsec->sh_addr) + offset;
if (!sym->st_value) { if (!sym->st_value) {
printk(KERN_WARNING "%s: unknown symbol %s\n", printk(KERN_WARNING "%s: unknown symbol %s\n",
module->name, strtab + sym->st_name); module->name, strtab + sym->st_name);
...@@ -118,7 +112,7 @@ apply_relocate(Elf32_Shdr *sechdrs, const char *strtab, unsigned int symindex, ...@@ -118,7 +112,7 @@ apply_relocate(Elf32_Shdr *sechdrs, const char *strtab, unsigned int symindex,
return -ENOEXEC; return -ENOEXEC;
} }
loc = dstsec->sh_offset + rel->r_offset; loc = dstsec->sh_addr + rel->r_offset;
switch (ELF32_R_TYPE(rel->r_info)) { switch (ELF32_R_TYPE(rel->r_info)) {
case R_ARM_ABS32: case R_ARM_ABS32:
......
...@@ -45,20 +45,12 @@ void module_free(struct module *mod, void *module_region) ...@@ -45,20 +45,12 @@ void module_free(struct module *mod, void *module_region)
} }
/* We don't need anything special. */ /* We don't need anything special. */
long module_core_size(const Elf32_Ehdr *hdr, int module_frob_arch_sections(const Elf_Ehdr *hdr,
const Elf32_Shdr *sechdrs, const Elf_Shdr *sechdrs,
const char *secstrings, const char *secstrings,
struct module *module) struct module *mod)
{ {
return module->core_size; return 0;
}
long module_init_size(const Elf32_Ehdr *hdr,
const Elf32_Shdr *sechdrs,
const char *secstrings,
struct module *module)
{
return module->init_size;
} }
int apply_relocate(Elf32_Shdr *sechdrs, int apply_relocate(Elf32_Shdr *sechdrs,
...@@ -68,7 +60,7 @@ int apply_relocate(Elf32_Shdr *sechdrs, ...@@ -68,7 +60,7 @@ int apply_relocate(Elf32_Shdr *sechdrs,
struct module *me) struct module *me)
{ {
unsigned int i; unsigned int i;
Elf32_Rel *rel = (void *)sechdrs[relsec].sh_offset; Elf32_Rel *rel = (void *)sechdrs[relsec].sh_addr;
Elf32_Sym *sym; Elf32_Sym *sym;
uint32_t *location; uint32_t *location;
...@@ -76,10 +68,10 @@ int apply_relocate(Elf32_Shdr *sechdrs, ...@@ -76,10 +68,10 @@ int apply_relocate(Elf32_Shdr *sechdrs,
sechdrs[relsec].sh_info); sechdrs[relsec].sh_info);
for (i = 0; i < sechdrs[relsec].sh_size / sizeof(*rel); i++) { for (i = 0; i < sechdrs[relsec].sh_size / sizeof(*rel); i++) {
/* This is where to make the change */ /* This is where to make the change */
location = (void *)sechdrs[sechdrs[relsec].sh_info].sh_offset location = (void *)sechdrs[sechdrs[relsec].sh_info].sh_addr
+ rel[i].r_offset; + rel[i].r_offset;
/* This is the symbol it is referring to */ /* This is the symbol it is referring to */
sym = (Elf32_Sym *)sechdrs[symindex].sh_offset sym = (Elf32_Sym *)sechdrs[symindex].sh_addr
+ ELF32_R_SYM(rel[i].r_info); + ELF32_R_SYM(rel[i].r_info);
if (!sym->st_value) { if (!sym->st_value) {
printk(KERN_WARNING "%s: Unknown symbol %s\n", printk(KERN_WARNING "%s: Unknown symbol %s\n",
......
...@@ -48,6 +48,7 @@ ...@@ -48,6 +48,7 @@
#include <linux/stat.h> #include <linux/stat.h>
#include <linux/ipc.h> #include <linux/ipc.h>
#include <linux/compat.h> #include <linux/compat.h>
#include <linux/vfs.h>
#include <asm/types.h> #include <asm/types.h>
#include <asm/uaccess.h> #include <asm/uaccess.h>
......
...@@ -22,6 +22,7 @@ ...@@ -22,6 +22,7 @@
#include <linux/smp_lock.h> #include <linux/smp_lock.h>
#include <linux/utsname.h> #include <linux/utsname.h>
#include <linux/file.h> #include <linux/file.h>
#include <linux/vfs.h>
#include <asm/ptrace.h> #include <asm/ptrace.h>
#include <asm/page.h> #include <asm/page.h>
......
...@@ -27,6 +27,7 @@ ...@@ -27,6 +27,7 @@
#include <linux/timex.h> #include <linux/timex.h>
#include <linux/dnotify.h> #include <linux/dnotify.h>
#include <linux/compat.h> #include <linux/compat.h>
#include <linux/vfs.h>
#include <net/sock.h> #include <net/sock.h>
#include <asm/uaccess.h> #include <asm/uaccess.h>
......
...@@ -10,6 +10,7 @@ ...@@ -10,6 +10,7 @@
#include <linux/smp_lock.h> #include <linux/smp_lock.h>
#include <linux/utsname.h> #include <linux/utsname.h>
#include <linux/vmalloc.h> #include <linux/vmalloc.h>
#include <linux/vfs.h>
#include <asm/errno.h> #include <asm/errno.h>
#include <asm/pgalloc.h> #include <asm/pgalloc.h>
......
...@@ -52,6 +52,7 @@ ...@@ -52,6 +52,7 @@
#include <linux/mman.h> #include <linux/mman.h>
#include <linux/binfmts.h> #include <linux/binfmts.h>
#include <linux/namei.h> #include <linux/namei.h>
#include <linux/vfs.h>
#include <asm/types.h> #include <asm/types.h>
#include <asm/uaccess.h> #include <asm/uaccess.h>
......
...@@ -101,24 +101,31 @@ static unsigned long get_plt_size(const Elf32_Ehdr *hdr, ...@@ -101,24 +101,31 @@ static unsigned long get_plt_size(const Elf32_Ehdr *hdr,
return ret; return ret;
} }
long module_core_size(const Elf32_Ehdr *hdr, int module_frob_arch_sections(Elf32_Ehdr *hdr,
const Elf32_Shdr *sechdrs, Elf32_Shdr *sechdrs,
const char *secstrings, const char *secstrings,
struct module *module) struct module *me)
{ {
module->arch.core_plt_offset = ALIGN(module->core_size, 4); unsigned int i;
return module->arch.core_plt_offset
+ get_plt_size(hdr, sechdrs, secstrings, 0);
}
long module_init_size(const Elf32_Ehdr *hdr, /* Find .plt and .pltinit sections */
const Elf32_Shdr *sechdrs, for (i = 0; i < hdr->e_shnum; i++) {
const char *secstrings, if (strcmp(secstrings + sechdrs[i].sh_name, ".plt.init") == 0)
struct module *module) me->arch.init_plt_section = i;
{ else if (strcmp(secstrings + sechdrs[i].sh_name, ".plt") == 0)
module->arch.init_plt_offset = ALIGN(module->init_size, 4); me->arch.core_plt_section = i;
return module->arch.init_plt_offset }
+ get_plt_size(hdr, sechdrs, secstrings, 1); if (!me->arch.core_plt_section || !me->arch.init_plt_section) {
printk("Module doesn't contain .plt or .plt.init sections.\n");
return -ENOEXEC;
}
/* Override their sizes */
sechdrs[me->arch.core_plt_section].sh_size
= get_plt_size(hdr, sechdrs, secstrings, 0);
sechdrs[me->arch.init_plt_section].sh_size
= get_plt_size(hdr, sechdrs, secstrings, 1);
return 0;
} }
int apply_relocate(Elf32_Shdr *sechdrs, int apply_relocate(Elf32_Shdr *sechdrs,
...@@ -141,17 +148,20 @@ static inline int entry_matches(struct ppc_plt_entry *entry, Elf32_Addr val) ...@@ -141,17 +148,20 @@ static inline int entry_matches(struct ppc_plt_entry *entry, Elf32_Addr val)
} }
/* Set up a trampoline in the PLT to bounce us to the distant function */ /* Set up a trampoline in the PLT to bounce us to the distant function */
static uint32_t do_plt_call(void *location, Elf32_Addr val, struct module *mod) static uint32_t do_plt_call(void *location,
Elf32_Addr val,
Elf32_Shdr *sechdrs,
struct module *mod)
{ {
struct ppc_plt_entry *entry; struct ppc_plt_entry *entry;
DEBUGP("Doing plt for call to 0x%x at 0x%x\n", val, (unsigned int)location); DEBUGP("Doing plt for call to 0x%x at 0x%x\n", val, (unsigned int)location);
/* Init, or core PLT? */ /* Init, or core PLT? */
if (location >= mod->module_core if (location >= mod->module_core
&& location < mod->module_core + mod->arch.core_plt_offset) && location < mod->module_core + mod->core_size)
entry = mod->module_core + mod->arch.core_plt_offset; entry = (void *)sechdrs[mod->arch.core_plt_section].sh_addr;
else else
entry = mod->module_init + mod->arch.init_plt_offset; entry = (void *)sechdrs[mod->arch.init_plt_section].sh_addr;
/* Find this entry, or if that fails, the next avail. entry */ /* Find this entry, or if that fails, the next avail. entry */
while (entry->jump[0]) { while (entry->jump[0]) {
...@@ -176,7 +186,7 @@ int apply_relocate_add(Elf32_Shdr *sechdrs, ...@@ -176,7 +186,7 @@ int apply_relocate_add(Elf32_Shdr *sechdrs,
struct module *module) struct module *module)
{ {
unsigned int i; unsigned int i;
Elf32_Rela *rela = (void *)sechdrs[relsec].sh_offset; Elf32_Rela *rela = (void *)sechdrs[relsec].sh_addr;
Elf32_Sym *sym; Elf32_Sym *sym;
uint32_t *location; uint32_t *location;
uint32_t value; uint32_t value;
...@@ -185,10 +195,10 @@ int apply_relocate_add(Elf32_Shdr *sechdrs, ...@@ -185,10 +195,10 @@ int apply_relocate_add(Elf32_Shdr *sechdrs,
sechdrs[relsec].sh_info); sechdrs[relsec].sh_info);
for (i = 0; i < sechdrs[relsec].sh_size / sizeof(*rela); i++) { for (i = 0; i < sechdrs[relsec].sh_size / sizeof(*rela); i++) {
/* This is where to make the change */ /* This is where to make the change */
location = (void *)sechdrs[sechdrs[relsec].sh_info].sh_offset location = (void *)sechdrs[sechdrs[relsec].sh_info].sh_addr
+ rela[i].r_offset; + rela[i].r_offset;
/* This is the symbol it is referring to */ /* This is the symbol it is referring to */
sym = (Elf32_Sym *)sechdrs[symindex].sh_offset sym = (Elf32_Sym *)sechdrs[symindex].sh_addr
+ ELF32_R_SYM(rela[i].r_info); + ELF32_R_SYM(rela[i].r_info);
if (!sym->st_value) { if (!sym->st_value) {
printk(KERN_WARNING "%s: Unknown symbol %s\n", printk(KERN_WARNING "%s: Unknown symbol %s\n",
...@@ -220,7 +230,8 @@ int apply_relocate_add(Elf32_Shdr *sechdrs, ...@@ -220,7 +230,8 @@ int apply_relocate_add(Elf32_Shdr *sechdrs,
case R_PPC_REL24: case R_PPC_REL24:
if ((int)(value - (uint32_t)location) < -0x02000000 if ((int)(value - (uint32_t)location) < -0x02000000
|| (int)(value - (uint32_t)location) >= 0x02000000) || (int)(value - (uint32_t)location) >= 0x02000000)
value = do_plt_call(location, value, module); value = do_plt_call(location, value,
sechdrs, module);
/* Only replace bits 2 through 26 */ /* Only replace bits 2 through 26 */
DEBUGP("REL24 value = %08X. location = %08X\n", DEBUGP("REL24 value = %08X. location = %08X\n",
......
...@@ -51,26 +51,15 @@ void module_free(struct module *mod, void *module_region) ...@@ -51,26 +51,15 @@ void module_free(struct module *mod, void *module_region)
table entries. */ table entries. */
} }
/* s390/s390x needs additional memory for GOT/PLT sections. */ int module_frob_arch_sections(const Elf_Ehdr *hdr,
long module_core_size(const Elf32_Ehdr *hdr, const Elf_Shdr *sechdrs,
const Elf32_Shdr *sechdrs, const char *secstrings,
const char *secstrings, struct module *mod)
struct module *module)
{ {
// FIXME: add space needed for GOT/PLT // FIXME: add space needed for GOT/PLT
return module->core_size; return 0;
}
long module_init_size(const Elf32_Ehdr *hdr,
const Elf32_Shdr *sechdrs,
const char *secstrings,
struct module *module)
{
return module->init_size;
} }
int apply_relocate(Elf_Shdr *sechdrs, int apply_relocate(Elf_Shdr *sechdrs,
const char *strtab, const char *strtab,
unsigned int symindex, unsigned int symindex,
...@@ -78,7 +67,7 @@ int apply_relocate(Elf_Shdr *sechdrs, ...@@ -78,7 +67,7 @@ int apply_relocate(Elf_Shdr *sechdrs,
struct module *me) struct module *me)
{ {
unsigned int i; unsigned int i;
ElfW(Rel) *rel = (void *)sechdrs[relsec].sh_offset; ElfW(Rel) *rel = (void *)sechdrs[relsec].sh_addr;
ElfW(Sym) *sym; ElfW(Sym) *sym;
ElfW(Addr) *location; ElfW(Addr) *location;
...@@ -86,10 +75,10 @@ int apply_relocate(Elf_Shdr *sechdrs, ...@@ -86,10 +75,10 @@ int apply_relocate(Elf_Shdr *sechdrs,
sechdrs[relsec].sh_info); sechdrs[relsec].sh_info);
for (i = 0; i < sechdrs[relsec].sh_size / sizeof(*rel); i++) { for (i = 0; i < sechdrs[relsec].sh_size / sizeof(*rel); i++) {
/* This is where to make the change */ /* This is where to make the change */
location = (void *)sechdrs[sechdrs[relsec].sh_info].sh_offset location = (void *)sechdrs[sechdrs[relsec].sh_info].sh_addr
+ rel[i].r_offset; + rel[i].r_offset;
/* This is the symbol it is referring to */ /* This is the symbol it is referring to */
sym = (ElfW(Sym) *)sechdrs[symindex].sh_offset sym = (ElfW(Sym) *)sechdrs[symindex].sh_addr
+ ELFW(R_SYM)(rel[i].r_info); + ELFW(R_SYM)(rel[i].r_info);
if (!sym->st_value) { if (!sym->st_value) {
printk(KERN_WARNING "%s: Unknown symbol %s\n", printk(KERN_WARNING "%s: Unknown symbol %s\n",
......
...@@ -57,6 +57,7 @@ ...@@ -57,6 +57,7 @@
#include <linux/sysctl.h> #include <linux/sysctl.h>
#include <linux/binfmts.h> #include <linux/binfmts.h>
#include <linux/compat.h> #include <linux/compat.h>
#include <linux/vfs.h>
#include <asm/types.h> #include <asm/types.h>
#include <asm/ipc.h> #include <asm/ipc.h>
......
...@@ -52,25 +52,15 @@ void module_free(struct module *mod, void *module_region) ...@@ -52,25 +52,15 @@ void module_free(struct module *mod, void *module_region)
} }
/* s390/s390x needs additional memory for GOT/PLT sections. */ /* s390/s390x needs additional memory for GOT/PLT sections. */
long module_core_size(const Elf32_Ehdr *hdr, int module_frob_arch_sections(const Elf_Ehdr *hdr,
const Elf32_Shdr *sechdrs, const Elf_Shdr *sechdrs,
const char *secstrings, const char *secstrings,
struct module *module) struct module *mod)
{ {
// FIXME: add space needed for GOT/PLT // FIXME: add space needed for GOT/PLT
return module->core_size; return 0;
}
long module_init_size(const Elf32_Ehdr *hdr,
const Elf32_Shdr *sechdrs,
const char *secstrings,
struct module *module)
{
return module->init_size;
} }
int apply_relocate(Elf_Shdr *sechdrs, int apply_relocate(Elf_Shdr *sechdrs,
const char *strtab, const char *strtab,
unsigned int symindex, unsigned int symindex,
...@@ -78,7 +68,7 @@ int apply_relocate(Elf_Shdr *sechdrs, ...@@ -78,7 +68,7 @@ int apply_relocate(Elf_Shdr *sechdrs,
struct module *me) struct module *me)
{ {
unsigned int i; unsigned int i;
ElfW(Rel) *rel = (void *)sechdrs[relsec].sh_offset; ElfW(Rel) *rel = (void *)sechdrs[relsec].sh_addr;
ElfW(Sym) *sym; ElfW(Sym) *sym;
ElfW(Addr) *location; ElfW(Addr) *location;
...@@ -86,10 +76,10 @@ int apply_relocate(Elf_Shdr *sechdrs, ...@@ -86,10 +76,10 @@ int apply_relocate(Elf_Shdr *sechdrs,
sechdrs[relsec].sh_info); sechdrs[relsec].sh_info);
for (i = 0; i < sechdrs[relsec].sh_size / sizeof(*rel); i++) { for (i = 0; i < sechdrs[relsec].sh_size / sizeof(*rel); i++) {
/* This is where to make the change */ /* This is where to make the change */
location = (void *)sechdrs[sechdrs[relsec].sh_info].sh_offset location = (void *)sechdrs[sechdrs[relsec].sh_info].sh_addr
+ rel[i].r_offset; + rel[i].r_offset;
/* This is the symbol it is referring to */ /* This is the symbol it is referring to */
sym = (ElfW(Sym) *)sechdrs[symindex].sh_offset sym = (ElfW(Sym) *)sechdrs[symindex].sh_addr
+ ELFW(R_SYM)(rel[i].r_info); + ELFW(R_SYM)(rel[i].r_info);
if (!sym->st_value) { if (!sym->st_value) {
printk(KERN_WARNING "%s: Unknown symbol %s\n", printk(KERN_WARNING "%s: Unknown symbol %s\n",
......
...@@ -37,20 +37,12 @@ void module_free(struct module *mod, void *module_region) ...@@ -37,20 +37,12 @@ void module_free(struct module *mod, void *module_region)
} }
/* We don't need anything special. */ /* We don't need anything special. */
long module_core_size(const Elf32_Ehdr *hdr, int module_frob_arch_sections(const Elf_Ehdr *hdr,
const Elf32_Shdr *sechdrs, const Elf_Shdr *sechdrs,
const char *secstrings, const char *secstrings,
struct module *module) struct module *mod)
{ {
return module->core_size; return 0;
}
long module_init_size(const Elf32_Ehdr *hdr,
const Elf32_Shdr *sechdrs,
const char *secstrings,
struct module *module)
{
return module->init_size;
} }
int apply_relocate(Elf32_Shdr *sechdrs, int apply_relocate(Elf32_Shdr *sechdrs,
...@@ -71,7 +63,7 @@ int apply_relocate_add(Elf32_Shdr *sechdrs, ...@@ -71,7 +63,7 @@ int apply_relocate_add(Elf32_Shdr *sechdrs,
struct module *me) struct module *me)
{ {
unsigned int i; unsigned int i;
Elf32_Rela *rel = (void *)sechdrs[relsec].sh_offset; Elf32_Rela *rel = (void *)sechdrs[relsec].sh_addr;
Elf32_Sym *sym; Elf32_Sym *sym;
u8 *location; u8 *location;
u32 *loc32; u32 *loc32;
...@@ -80,11 +72,11 @@ int apply_relocate_add(Elf32_Shdr *sechdrs, ...@@ -80,11 +72,11 @@ int apply_relocate_add(Elf32_Shdr *sechdrs,
Elf32_Addr v; Elf32_Addr v;
/* This is where to make the change */ /* This is where to make the change */
location = (u8 *)sechdrs[sechdrs[relsec].sh_info].sh_offset location = (u8 *)sechdrs[sechdrs[relsec].sh_info].sh_addr
+ rel[i].r_offset; + rel[i].r_offset;
loc32 = (u32 *) location; loc32 = (u32 *) location;
/* This is the symbol it is referring to */ /* This is the symbol it is referring to */
sym = (Elf32_Sym *)sechdrs[symindex].sh_offset sym = (Elf32_Sym *)sechdrs[symindex].sh_addr
+ ELF32_R_SYM(rel[i].r_info); + ELF32_R_SYM(rel[i].r_info);
if (!(v = sym->st_value)) { if (!(v = sym->st_value)) {
printk(KERN_WARNING "%s: Unknown symbol %s\n", printk(KERN_WARNING "%s: Unknown symbol %s\n",
......
...@@ -144,20 +144,12 @@ void module_free(struct module *mod, void *module_region) ...@@ -144,20 +144,12 @@ void module_free(struct module *mod, void *module_region)
} }
/* We don't need anything special. */ /* We don't need anything special. */
long module_core_size(const Elf64_Ehdr *hdr, int module_frob_arch_sections(const Elf_Ehdr *hdr,
const Elf64_Shdr *sechdrs, const Elf_Shdr *sechdrs,
const char *secstrings, const char *secstrings,
struct module *module) struct module *mod)
{ {
return module->core_size; return 0;
}
long module_init_size(const Elf64_Ehdr *hdr,
const Elf64_Shdr *sechdrs,
const char *secstrings,
struct module *module)
{
return module->init_size;
} }
int apply_relocate(Elf64_Shdr *sechdrs, int apply_relocate(Elf64_Shdr *sechdrs,
...@@ -178,7 +170,7 @@ int apply_relocate_add(Elf64_Shdr *sechdrs, ...@@ -178,7 +170,7 @@ int apply_relocate_add(Elf64_Shdr *sechdrs,
struct module *me) struct module *me)
{ {
unsigned int i; unsigned int i;
Elf64_Rela *rel = (void *)sechdrs[relsec].sh_offset; Elf64_Rela *rel = (void *)sechdrs[relsec].sh_addr;
Elf64_Sym *sym; Elf64_Sym *sym;
u8 *location; u8 *location;
u32 *loc32; u32 *loc32;
...@@ -187,14 +179,14 @@ int apply_relocate_add(Elf64_Shdr *sechdrs, ...@@ -187,14 +179,14 @@ int apply_relocate_add(Elf64_Shdr *sechdrs,
Elf64_Addr v; Elf64_Addr v;
/* This is where to make the change */ /* This is where to make the change */
location = (u8 *)sechdrs[sechdrs[relsec].sh_info].sh_offset location = (u8 *)sechdrs[sechdrs[relsec].sh_info].sh_addr
+ rel[i].r_offset; + rel[i].r_offset;
loc32 = (u32 *) location; loc32 = (u32 *) location;
BUG_ON(((u64)location >> (u64)32) != (u64)0); BUG_ON(((u64)location >> (u64)32) != (u64)0);
/* This is the symbol it is referring to */ /* This is the symbol it is referring to */
sym = (Elf64_Sym *)sechdrs[symindex].sh_offset sym = (Elf64_Sym *)sechdrs[symindex].sh_addr
+ ELF64_R_SYM(rel[i].r_info); + ELF64_R_SYM(rel[i].r_info);
if (!(v = sym->st_value)) { if (!(v = sym->st_value)) {
printk(KERN_WARNING "%s: Unknown symbol %s\n", printk(KERN_WARNING "%s: Unknown symbol %s\n",
......
...@@ -52,6 +52,7 @@ ...@@ -52,6 +52,7 @@
#include <linux/dnotify.h> #include <linux/dnotify.h>
#include <linux/security.h> #include <linux/security.h>
#include <linux/compat.h> #include <linux/compat.h>
#include <linux/vfs.h>
#include <asm/types.h> #include <asm/types.h>
#include <asm/ipc.h> #include <asm/ipc.h>
......
...@@ -20,6 +20,7 @@ ...@@ -20,6 +20,7 @@
#include <linux/resource.h> #include <linux/resource.h>
#include <linux/quotaops.h> #include <linux/quotaops.h>
#include <linux/mount.h> #include <linux/mount.h>
#include <linux/vfs.h>
#include <asm/uaccess.h> #include <asm/uaccess.h>
#include <asm/string.h> #include <asm/string.h>
......
...@@ -160,7 +160,7 @@ int apply_relocate_add (Elf32_Shdr *sechdrs, const char *strtab, ...@@ -160,7 +160,7 @@ int apply_relocate_add (Elf32_Shdr *sechdrs, const char *strtab,
struct module *mod) struct module *mod)
{ {
unsigned int i; unsigned int i;
Elf32_Rela *rela = (void *)sechdrs[relsec].sh_offset; Elf32_Rela *rela = (void *)sechdrs[relsec].sh_addr;
DEBUGP ("Applying relocate section %u to %u\n", relsec, DEBUGP ("Applying relocate section %u to %u\n", relsec,
sechdrs[relsec].sh_info); sechdrs[relsec].sh_info);
...@@ -168,11 +168,11 @@ int apply_relocate_add (Elf32_Shdr *sechdrs, const char *strtab, ...@@ -168,11 +168,11 @@ int apply_relocate_add (Elf32_Shdr *sechdrs, const char *strtab,
for (i = 0; i < sechdrs[relsec].sh_size / sizeof (*rela); i++) { for (i = 0; i < sechdrs[relsec].sh_size / sizeof (*rela); i++) {
/* This is where to make the change */ /* This is where to make the change */
uint32_t *loc uint32_t *loc
= ((void *)sechdrs[sechdrs[relsec].sh_info].sh_offset = ((void *)sechdrs[sechdrs[relsec].sh_info].sh_addr
+ rela[i].r_offset); + rela[i].r_offset);
/* This is the symbol it is referring to */ /* This is the symbol it is referring to */
Elf32_Sym *sym Elf32_Sym *sym
= ((Elf32_Sym *)sechdrs[symindex].sh_offset = ((Elf32_Sym *)sechdrs[symindex].sh_addr
+ ELF32_R_SYM (rela[i].r_info)); + ELF32_R_SYM (rela[i].r_info));
uint32_t val = sym->st_value; uint32_t val = sym->st_value;
......
...@@ -58,6 +58,7 @@ ...@@ -58,6 +58,7 @@
#include <linux/init.h> #include <linux/init.h>
#include <linux/aio_abi.h> #include <linux/aio_abi.h>
#include <linux/compat.h> #include <linux/compat.h>
#include <linux/vfs.h>
#include <asm/mman.h> #include <asm/mman.h>
#include <asm/types.h> #include <asm/types.h>
#include <asm/uaccess.h> #include <asm/uaccess.h>
......
...@@ -26,20 +26,12 @@ ...@@ -26,20 +26,12 @@
#define DEBUGP(fmt...) #define DEBUGP(fmt...)
/* We don't need anything special. */ /* We don't need anything special. */
long module_core_size(const Elf64_Ehdr *hdr, int module_frob_arch_sections(const Elf_Ehdr *hdr,
const Elf64_Shdr *sechdrs, const Elf_Shdr *sechdrs,
const char *secstrings, const char *secstrings,
struct module *module) struct module *mod)
{ {
return module->core_size; return 0;
}
long module_init_size(const Elf64_Ehdr *hdr,
const Elf64_Shdr *sechdrs,
const char *secstrings,
struct module *module)
{
return module->init_size;
} }
int apply_relocate_add(Elf64_Shdr *sechdrs, int apply_relocate_add(Elf64_Shdr *sechdrs,
...@@ -49,7 +41,7 @@ int apply_relocate_add(Elf64_Shdr *sechdrs, ...@@ -49,7 +41,7 @@ int apply_relocate_add(Elf64_Shdr *sechdrs,
struct module *me) struct module *me)
{ {
unsigned int i; unsigned int i;
Elf64_Rela *rel = (void *)sechdrs[relsec].sh_offset; Elf64_Rela *rel = (void *)sechdrs[relsec].sh_addr;
Elf64_Sym *sym; Elf64_Sym *sym;
void *loc; void *loc;
u64 val; u64 val;
...@@ -58,11 +50,11 @@ int apply_relocate_add(Elf64_Shdr *sechdrs, ...@@ -58,11 +50,11 @@ int apply_relocate_add(Elf64_Shdr *sechdrs,
sechdrs[relsec].sh_info); sechdrs[relsec].sh_info);
for (i = 0; i < sechdrs[relsec].sh_size / sizeof(*rel); i++) { for (i = 0; i < sechdrs[relsec].sh_size / sizeof(*rel); i++) {
/* This is where to make the change */ /* This is where to make the change */
loc = (void *)sechdrs[sechdrs[relsec].sh_info].sh_offset loc = (void *)sechdrs[sechdrs[relsec].sh_info].sh_addr
+ rel[i].r_offset; + rel[i].r_offset;
/* This is the symbol it is referring to */ /* This is the symbol it is referring to */
sym = (Elf64_Sym *)sechdrs[symindex].sh_offset sym = (Elf64_Sym *)sechdrs[symindex].sh_addr
+ ELF64_R_SYM(rel[i].r_info); + ELF64_R_SYM(rel[i].r_info);
if (!sym->st_value) { if (!sym->st_value) {
printk(KERN_WARNING "%s: Unknown symbol %s\n", printk(KERN_WARNING "%s: Unknown symbol %s\n",
......
...@@ -130,7 +130,7 @@ extern void console_map_init(void); ...@@ -130,7 +130,7 @@ extern void console_map_init(void);
extern void prom_con_init(void); extern void prom_con_init(void);
#endif #endif
#ifdef CONFIG_MDA_CONSOLE #ifdef CONFIG_MDA_CONSOLE
extern void mda_console_init(void); extern int mda_console_init(void);
#endif #endif
#ifdef CONFIG_FRAMEBUFFER_CONSOLE #ifdef CONFIG_FRAMEBUFFER_CONSOLE
extern int fb_console_init(void); extern int fb_console_init(void);
......
...@@ -119,9 +119,6 @@ static int __init miropcm20_rds_init(void) ...@@ -119,9 +119,6 @@ static int __init miropcm20_rds_init(void)
return -EINVAL; return -EINVAL;
printk("miropcm20-rds: userinterface driver loaded.\n"); printk("miropcm20-rds: userinterface driver loaded.\n");
#if DEBUG
printk("v4l-name: %s\n", devfs_get_name(pcm20_radio.devfs_handle, 0));
#endif
return 0; return 0;
} }
......
...@@ -246,35 +246,17 @@ static __inline__ int __get_order(unsigned long size) ...@@ -246,35 +246,17 @@ static __inline__ int __get_order(unsigned long size)
#endif #endif
/* /*
* We use our new error handling code if the kernel version is 2.5.1 or newer. * We use our new error handling code if the kernel version is 2.4.18 or newer.
*/ */
#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,5,1) #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,18)
#define MPT_SCSI_USE_NEW_EH #define MPT_SCSI_USE_NEW_EH
#endif #endif
#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,5,28)
#define mptscsih_lock(iocp, flags) \
spin_lock_irqsave(&iocp->FreeQlock, flags)
#else
#define mptscsih_lock(iocp, flags) \
({ save_flags(flags); \
cli(); \
})
#endif
#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,5,28)
#define mptscsih_unlock(iocp, flags) \
spin_unlock_irqrestore(&iocp->FreeQlock, flags)
#else
#define mptscsih_unlock(iocp, flags) restore_flags(flags);
#endif
#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,5,41) #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,5,41)
#define mpt_work_struct work_struct #define mpt_work_struct work_struct
#define MPT_INIT_WORK(_task, _func, _data) INIT_WORK(_task, _func, _data) #define MPT_INIT_WORK(_task, _func, _data) INIT_WORK(_task, _func, _data)
#else #else
#define mpt_work_struct tq_struct #define mpt_work_struct tq_struct
#define MPT_INIT_WORK(_task, _func, _data) \ #define MPT_INIT_WORK(_task, _func, _data) \
({ (_task)->sync = 0; \ ({ (_task)->sync = 0; \
(_task)->routine = (_func); \ (_task)->routine = (_func); \
...@@ -282,6 +264,13 @@ static __inline__ int __get_order(unsigned long size) ...@@ -282,6 +264,13 @@ static __inline__ int __get_order(unsigned long size)
}) })
#endif #endif
#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,5,28)
#define mptscsih_sync_irq(_irq) synchronize_irq(_irq)
#else
#define mptscsih_sync_irq(_irq) synchronize_irq()
#endif
/*}-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/ /*}-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/
#endif /* _LINUX_COMPAT_H */ #endif /* _LINUX_COMPAT_H */
......
This diff is collapsed.
...@@ -13,7 +13,7 @@ ...@@ -13,7 +13,7 @@
* (mailto:sjralston1@netscape.net) * (mailto:sjralston1@netscape.net)
* (mailto:Pam.Delaney@lsil.com) * (mailto:Pam.Delaney@lsil.com)
* *
* $Id: mptbase.h,v 1.136 2002/10/21 13:51:54 pdelaney Exp $ * $Id: mptbase.h,v 1.141 2002/12/03 21:26:32 pdelaney Exp $
*/ */
/*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/ /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/
/* /*
...@@ -80,8 +80,8 @@ ...@@ -80,8 +80,8 @@
#define COPYRIGHT "Copyright (c) 1999-2002 " MODULEAUTHOR #define COPYRIGHT "Copyright (c) 1999-2002 " MODULEAUTHOR
#endif #endif
#define MPT_LINUX_VERSION_COMMON "2.03.00.02" #define MPT_LINUX_VERSION_COMMON "2.03.01.01"
#define MPT_LINUX_PACKAGE_NAME "@(#)mptlinux-2.03.00.02" #define MPT_LINUX_PACKAGE_NAME "@(#)mptlinux-2.03.01.01"
#define WHAT_MAGIC_STRING "@" "(" "#" ")" #define WHAT_MAGIC_STRING "@" "(" "#" ")"
#define show_mptmod_ver(s,ver) \ #define show_mptmod_ver(s,ver) \
...@@ -134,8 +134,10 @@ ...@@ -134,8 +134,10 @@
#define CAN_SLEEP 1 #define CAN_SLEEP 1
#define NO_SLEEP 0 #define NO_SLEEP 0
/* #define MPT_COALESCING_TIMEOUT 0x10
* SCSI transfer rate defines.
/*
* SCSI transfer rate defines.
*/ */
#define MPT_ULTRA320 0x08 #define MPT_ULTRA320 0x08
#define MPT_ULTRA160 0x09 #define MPT_ULTRA160 0x09
...@@ -524,7 +526,7 @@ typedef struct _mpt_ioctl_events { ...@@ -524,7 +526,7 @@ typedef struct _mpt_ioctl_events {
#define MPT_SCSICFG_DV_PENDING 0x04 /* DV on this physical id pending */ #define MPT_SCSICFG_DV_PENDING 0x04 /* DV on this physical id pending */
#define MPT_SCSICFG_DV_NOT_DONE 0x08 /* DV has not been performed */ #define MPT_SCSICFG_DV_NOT_DONE 0x08 /* DV has not been performed */
#define MPT_SCSICFG_BLK_NEGO 0x10 /* WriteSDP1 with WDTR and SDTR disabled */ #define MPT_SCSICFG_BLK_NEGO 0x10 /* WriteSDP1 with WDTR and SDTR disabled */
#define MPT_SCSICFG_RELOAD_IOC_PG3 0x20 /* IOC Pg 3 data is obsolete */
/* Args passed to writeSDP1: */ /* Args passed to writeSDP1: */
#define MPT_SCSICFG_USE_NVRAM 0x01 /* WriteSDP1 using NVRAM */ #define MPT_SCSICFG_USE_NVRAM 0x01 /* WriteSDP1 using NVRAM */
#define MPT_SCSICFG_ALL_IDS 0x02 /* WriteSDP1 to all IDS */ #define MPT_SCSICFG_ALL_IDS 0x02 /* WriteSDP1 to all IDS */
...@@ -756,6 +758,12 @@ typedef struct _mpt_sge { ...@@ -756,6 +758,12 @@ typedef struct _mpt_sge {
#define nehprintk(x) #define nehprintk(x)
#endif #endif
#if defined(MPT_DEBUG_CONFIG) || defined(MPT_DEBUG)
#define dcprintk(x) printk x
#else
#define dcprintk(x)
#endif
#define MPT_INDEX_2_MFPTR(ioc,idx) \ #define MPT_INDEX_2_MFPTR(ioc,idx) \
(MPT_FRAME_HDR*)( (u8*)(ioc)->req_frames + (ioc)->req_sz * (idx) ) (MPT_FRAME_HDR*)( (u8*)(ioc)->req_frames + (ioc)->req_sz * (idx) )
...@@ -1009,6 +1017,7 @@ extern int mpt_HardResetHandler(MPT_ADAPTER *ioc, int sleepFlag); ...@@ -1009,6 +1017,7 @@ extern int mpt_HardResetHandler(MPT_ADAPTER *ioc, int sleepFlag);
extern int mpt_config(MPT_ADAPTER *ioc, CONFIGPARMS *cfg); extern int mpt_config(MPT_ADAPTER *ioc, CONFIGPARMS *cfg);
extern void *mpt_alloc_fw_memory(MPT_ADAPTER *ioc, int size, int *frags, int *alloc_sz); extern void *mpt_alloc_fw_memory(MPT_ADAPTER *ioc, int size, int *frags, int *alloc_sz);
extern void mpt_free_fw_memory(MPT_ADAPTER *ioc, fw_image_t **alt_img); extern void mpt_free_fw_memory(MPT_ADAPTER *ioc, fw_image_t **alt_img);
extern int mpt_read_ioc_pg_3(MPT_ADAPTER *ioc);
/* /*
* Public data decl's... * Public data decl's...
......
...@@ -34,7 +34,7 @@ ...@@ -34,7 +34,7 @@
* (mailto:sjralston1@netscape.net) * (mailto:sjralston1@netscape.net)
* (mailto:Pam.Delaney@lsil.com) * (mailto:Pam.Delaney@lsil.com)
* *
* $Id: mptctl.c,v 1.61 2002/10/17 20:15:57 pdelaney Exp $ * $Id: mptctl.c,v 1.63 2002/12/03 21:26:33 pdelaney Exp $
*/ */
/*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/ /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/
/* /*
...@@ -2911,9 +2911,9 @@ int __init mptctl_init(void) ...@@ -2911,9 +2911,9 @@ int __init mptctl_init(void)
#endif /*} sparc */ #endif /*} sparc */
/* Register this device */ /* Register this device */
if (misc_register(&mptctl_miscdev) == -1) { err = misc_register(&mptctl_miscdev);
if (err < 0) {
printk(KERN_ERR MYNAM ": Can't register misc device [minor=%d].\n", MPT_MINOR); printk(KERN_ERR MYNAM ": Can't register misc device [minor=%d].\n", MPT_MINOR);
err = -EBUSY;
goto out_fail; goto out_fail;
} }
printk(KERN_INFO MYNAM ": Registered with Fusion MPT base driver\n"); printk(KERN_INFO MYNAM ": Registered with Fusion MPT base driver\n");
......
...@@ -20,7 +20,7 @@ ...@@ -20,7 +20,7 @@
* (mailto:sjralston1@netscape.net) * (mailto:sjralston1@netscape.net)
* (mailto:Pam.Delaney@lsil.com) * (mailto:Pam.Delaney@lsil.com)
* *
* $Id: mptctl.h,v 1.12 2002/10/17 20:15:58 pdelaney Exp $ * $Id: mptctl.h,v 1.13 2002/12/03 21:26:33 pdelaney Exp $
*/ */
/*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/ /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/
/* /*
......
This diff is collapsed.
...@@ -20,7 +20,7 @@ ...@@ -20,7 +20,7 @@
* (mailto:netscape.net) * (mailto:netscape.net)
* (mailto:Pam.Delaney@lsil.com) * (mailto:Pam.Delaney@lsil.com)
* *
* $Id: mptscsih.h,v 1.20 2002/10/17 20:16:00 pdelaney Exp $ * $Id: mptscsih.h,v 1.21 2002/12/03 21:26:35 pdelaney Exp $
*/ */
/*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/ /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/
/* /*
...@@ -73,9 +73,16 @@ ...@@ -73,9 +73,16 @@
* Try to keep these at 2^N-1 * Try to keep these at 2^N-1
*/ */
#define MPT_FC_CAN_QUEUE 63 #define MPT_FC_CAN_QUEUE 63
//#define MPT_SCSI_CAN_QUEUE 31 #if defined MPT_SCSI_USE_NEW_EH
#define MPT_SCSI_CAN_QUEUE MPT_FC_CAN_QUEUE #define MPT_SCSI_CAN_QUEUE 127
#define MPT_SCSI_CMD_PER_LUN 7 #else
#define MPT_SCSI_CAN_QUEUE 63
#endif
#define MPT_SCSI_CMD_PER_DEV_HIGH 31
#define MPT_SCSI_CMD_PER_DEV_LOW 7
#define MPT_SCSI_CMD_PER_LUN 7
#define MPT_SCSI_MAX_SECTORS 8192 #define MPT_SCSI_MAX_SECTORS 8192
...@@ -206,11 +213,16 @@ struct mptscsih_driver_setup ...@@ -206,11 +213,16 @@ struct mptscsih_driver_setup
#define x_scsi_dev_reset mptscsih_dev_reset #define x_scsi_dev_reset mptscsih_dev_reset
#define x_scsi_host_reset mptscsih_host_reset #define x_scsi_host_reset mptscsih_host_reset
#define x_scsi_bios_param mptscsih_bios_param #define x_scsi_bios_param mptscsih_bios_param
#define x_scsi_slave_configure mptscsih_slave_configure
#define x_scsi_taskmgmt_bh mptscsih_taskmgmt_bh #define x_scsi_taskmgmt_bh mptscsih_taskmgmt_bh
#define x_scsi_old_abort mptscsih_old_abort #define x_scsi_old_abort mptscsih_old_abort
#define x_scsi_old_reset mptscsih_old_reset #define x_scsi_old_reset mptscsih_old_reset
#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,5,52)
#define x_scsi_slave_configure mptscsih_slave_configure
#else
#define x_scsi_select_queue_depths mptscsih_select_queue_depths
#endif
#define x_scsi_proc_info mptscsih_proc_info
/*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/ /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/
/* /*
...@@ -237,8 +249,14 @@ extern int x_scsi_bios_param(Disk *, struct block_device *, int *); ...@@ -237,8 +249,14 @@ extern int x_scsi_bios_param(Disk *, struct block_device *, int *);
#else #else
extern int x_scsi_bios_param(Disk *, kdev_t, int *); extern int x_scsi_bios_param(Disk *, kdev_t, int *);
#endif #endif
extern int x_scsi_slave_configure(Scsi_Device *);
extern void x_scsi_taskmgmt_bh(void *); extern void x_scsi_taskmgmt_bh(void *);
#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,5,52)
extern int x_scsi_slave_configure(Scsi_Device *);
#else
extern void x_scsi_select_queue_depths(struct Scsi_Host *, Scsi_Device *);
#endif
extern int x_scsi_proc_info(char *, char **, off_t, int, int, int);
#if LINUX_VERSION_CODE < KERNEL_VERSION(2,3,0) #if LINUX_VERSION_CODE < KERNEL_VERSION(2,3,0)
#define PROC_SCSI_DECL #define PROC_SCSI_DECL
...@@ -248,14 +266,19 @@ extern void x_scsi_taskmgmt_bh(void *); ...@@ -248,14 +266,19 @@ extern void x_scsi_taskmgmt_bh(void *);
#ifdef MPT_SCSI_USE_NEW_EH #ifdef MPT_SCSI_USE_NEW_EH
#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,5,44) #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,5,52)
#define MPT_SCSIHOST { \ #define MPT_SCSIHOST { \
PROC_SCSI_DECL \ PROC_SCSI_DECL \
.proc_info = x_scsi_proc_info, \
.name = "MPT SCSI Host", \ .name = "MPT SCSI Host", \
.detect = x_scsi_detect, \ .detect = x_scsi_detect, \
.release = x_scsi_release, \ .release = x_scsi_release, \
.info = x_scsi_info, \ .info = x_scsi_info, \
.command = NULL, \
.queuecommand = x_scsi_queuecommand, \
.slave_configure = x_scsi_slave_configure, \
.eh_strategy_handler = NULL, \
.eh_abort_handler = x_scsi_abort, \ .eh_abort_handler = x_scsi_abort, \
.eh_device_reset_handler = x_scsi_dev_reset, \ .eh_device_reset_handler = x_scsi_dev_reset, \
.eh_bus_reset_handler = x_scsi_bus_reset, \ .eh_bus_reset_handler = x_scsi_bus_reset, \
...@@ -275,6 +298,7 @@ extern void x_scsi_taskmgmt_bh(void *); ...@@ -275,6 +298,7 @@ extern void x_scsi_taskmgmt_bh(void *);
#define MPT_SCSIHOST { \ #define MPT_SCSIHOST { \
.next = NULL, \ .next = NULL, \
PROC_SCSI_DECL \ PROC_SCSI_DECL \
.proc_info = x_scsi_proc_info, \
.name = "MPT SCSI Host", \ .name = "MPT SCSI Host", \
.detect = x_scsi_detect, \ .detect = x_scsi_detect, \
.release = x_scsi_release, \ .release = x_scsi_release, \
......
...@@ -1841,7 +1841,6 @@ ppp_register_channel(struct ppp_channel *chan) ...@@ -1841,7 +1841,6 @@ ppp_register_channel(struct ppp_channel *chan)
list_add(&pch->list, &new_channels); list_add(&pch->list, &new_channels);
atomic_inc(&channel_count); atomic_inc(&channel_count);
spin_unlock_bh(&all_channels_lock); spin_unlock_bh(&all_channels_lock);
MOD_INC_USE_COUNT;
return 0; return 0;
} }
...@@ -1904,7 +1903,6 @@ ppp_unregister_channel(struct ppp_channel *chan) ...@@ -1904,7 +1903,6 @@ ppp_unregister_channel(struct ppp_channel *chan)
wake_up_interruptible(&pch->file.rwait); wake_up_interruptible(&pch->file.rwait);
if (atomic_dec_and_test(&pch->file.refcnt)) if (atomic_dec_and_test(&pch->file.refcnt))
ppp_destroy_channel(pch); ppp_destroy_channel(pch);
MOD_DEC_USE_COUNT;
} }
/* /*
......
...@@ -40,25 +40,18 @@ static struct pppox_proto *proto[PX_MAX_PROTO+1]; ...@@ -40,25 +40,18 @@ static struct pppox_proto *proto[PX_MAX_PROTO+1];
int register_pppox_proto(int proto_num, struct pppox_proto *pp) int register_pppox_proto(int proto_num, struct pppox_proto *pp)
{ {
if (proto_num < 0 || proto_num > PX_MAX_PROTO) { if (proto_num < 0 || proto_num > PX_MAX_PROTO)
return -EINVAL; return -EINVAL;
}
if (proto[proto_num]) if (proto[proto_num])
return -EALREADY; return -EALREADY;
MOD_INC_USE_COUNT;
proto[proto_num] = pp; proto[proto_num] = pp;
return 0; return 0;
} }
void unregister_pppox_proto(int proto_num) void unregister_pppox_proto(int proto_num)
{ {
if (proto_num >= 0 && proto_num <= PX_MAX_PROTO) { if (proto_num >= 0 && proto_num <= PX_MAX_PROTO)
proto[proto_num] = NULL; proto[proto_num] = NULL;
MOD_DEC_USE_COUNT;
}
} }
void pppox_unbind_sock(struct sock *sk) void pppox_unbind_sock(struct sock *sk)
......
...@@ -95,7 +95,6 @@ slhc_init(int rslots, int tslots) ...@@ -95,7 +95,6 @@ slhc_init(int rslots, int tslots)
register struct cstate *ts; register struct cstate *ts;
struct slcompress *comp; struct slcompress *comp;
MOD_INC_USE_COUNT;
comp = (struct slcompress *)kmalloc(sizeof(struct slcompress), comp = (struct slcompress *)kmalloc(sizeof(struct slcompress),
GFP_KERNEL); GFP_KERNEL);
if (! comp) if (! comp)
...@@ -147,7 +146,6 @@ slhc_init(int rslots, int tslots) ...@@ -147,7 +146,6 @@ slhc_init(int rslots, int tslots)
out_free: out_free:
kfree((unsigned char *)comp); kfree((unsigned char *)comp);
out_fail: out_fail:
MOD_DEC_USE_COUNT;
return NULL; return NULL;
} }
...@@ -166,7 +164,6 @@ slhc_free(struct slcompress *comp) ...@@ -166,7 +164,6 @@ slhc_free(struct slcompress *comp)
kfree( comp->rstate ); kfree( comp->rstate );
kfree( comp ); kfree( comp );
MOD_DEC_USE_COUNT;
} }
...@@ -685,7 +682,6 @@ slhc_remember(struct slcompress *comp, unsigned char *icp, int isize) ...@@ -685,7 +682,6 @@ slhc_remember(struct slcompress *comp, unsigned char *icp, int isize)
return isize; return isize;
} }
int int
slhc_toss(struct slcompress *comp) slhc_toss(struct slcompress *comp)
{ {
......
...@@ -295,27 +295,21 @@ config FB_VGA16 ...@@ -295,27 +295,21 @@ config FB_VGA16
vga16fb.o. vga16fb.o.
config FB_STI config FB_STI
bool "Generic STI frame buffer device support" bool "HP STI frame buffer device support"
depends on FB && PARISC depends on FB && PARISC
default y
---help--- ---help---
STI refers to the HP "Standard Text Interface" which is a set of STI refers to the HP "Standard Text Interface" which is a set of
BIOS routines contained in a ROM chip in HP PA-RISC based machines. BIOS routines contained in a ROM chip in HP PA-RISC based machines.
Enabling this option will implement the linux framebuffer device and Enabling this option will implement the linux framebuffer device
an fbcon color text console using calls to the STI BIOS routines. using calls to the STI BIOS routines for initialisation.
The HP framebuffer device is usually planar, uses a strange memory
layout, and changing the plane mask to create colored pixels If you enable this option, you will get a planar framebuffer device
requires a call to the STI routines, so do not expect /dev/fb to /dev/fb which will work on the most common HP graphic cards of the
actually be useful. However, it is the best we have as far as NGLE family, including the artist chips (in the 7xx and Bxxx series),
graphics on the HP chipsets due to lack of hardware level HCRX, HCRX24, CRX, CRX24 and VisEG series.
documentation for the various on-board HP chipsets used in these
systems. It is sufficient for basic text console functions, It is safe to enable this option, so you should probably say "Y".
including fonts.
You should probably enable this option, unless you are having
trouble getting video when booting the kernel (make sure it isn't
just that you are running the console on the serial port, though).
Really old HP boxes may not have STI, and must use the PDC BIOS
console or the IODC BIOS.
config FB_MAC config FB_MAC
bool "Generic Macintosh display support" bool "Generic Macintosh display support"
...@@ -471,6 +465,44 @@ config FB_RIVA ...@@ -471,6 +465,44 @@ config FB_RIVA
module will be called rivafb.o. If you want to compile it as a module will be called rivafb.o. If you want to compile it as a
module, say M here and read <file:Documentation/modules.txt>. module, say M here and read <file:Documentation/modules.txt>.
config FB_I810
tristate "Intel 810/815 support (EXPERIMENTAL)"
depends on FB && AGP && AGP_INTEL && EXPERIMENTAL && PCI
help
This driver supports the on-board graphics built in to the Intel 810
and 815 chipsets. Say Y if you have and plan to use such a board.
The driver is also available as a module ( = code which can be
inserted and removed from the running kernel whenever you want).
The module will be called i810fb.o. If you want to compile it as a
module, say M here and read <file:Documentation/modules.txt>.
For more information, please read
<file:Documentation/fb/intel810.txt>
config FB_I810_GTF
bool "use VESA Generalized Timing Formula"
depends on FB_I810
help
If you say Y, then the VESA standard, Generalized Timing Formula
or GTF, will be used to calculate the required video timing values
per video mode. Since the GTF allows nondiscrete timings
(nondiscrete being a range of values as opposed to discrete being a
set of values), you'll be able to use any combination of horizontal
and vertical resolutions, and vertical refresh rates without having
to specify your own timing parameters. This is especially useful
to maximize the performance of an aging display, or if you just
have a display with nonstandard dimensions. A VESA compliant
monitor is recommended, but can still work with non-compliant ones.
If you need or want this, then select this option. The timings may
not be compliant with Intel's recommended values. Use at your own
risk.
If you say N, the driver will revert to discrete video timings
using a set recommended by Intel in their documentation.
If unsure, say N.
config FB_MATROX config FB_MATROX
tristate "Matrox acceleration" tristate "Matrox acceleration"
depends on FB && PCI depends on FB && PCI
...@@ -759,7 +791,7 @@ config FB_TRIDENT ...@@ -759,7 +791,7 @@ config FB_TRIDENT
The driver is also available as a module ( = code which can be The driver is also available as a module ( = code which can be
inserted and removed from the running kernel whenever you want). The inserted and removed from the running kernel whenever you want). The
module will be called rivafb.o. If you want to compile it as a module will be called tridentfb.o. If you want to compile it as a
module, say M here and read <file:Documentation/modules.txt>. module, say M here and read <file:Documentation/modules.txt>.
config FB_PM3 config FB_PM3
......
...@@ -12,8 +12,7 @@ export-objs := fbmem.o fbcmap.o fbmon.o modedb.o softcursor.o cfbfillrect.o ...@@ -12,8 +12,7 @@ export-objs := fbmem.o fbcmap.o fbmon.o modedb.o softcursor.o cfbfillrect.o
obj-$(CONFIG_VT) += console/ obj-$(CONFIG_VT) += console/
# Add fbmon.o back into obj-$(CONFIG_FB) in 2.5.x obj-$(CONFIG_FB) += fbmem.o fbmon.o fbcmap.o modedb.o softcursor.o
obj-$(CONFIG_FB) += fbmem.o fbcmap.o modedb.o softcursor.o
# Only include macmodes.o if we have FB support and are PPC # Only include macmodes.o if we have FB support and are PPC
ifeq ($(CONFIG_FB),y) ifeq ($(CONFIG_FB),y)
obj-$(CONFIG_PPC) += macmodes.o obj-$(CONFIG_PPC) += macmodes.o
...@@ -27,13 +26,13 @@ obj-$(CONFIG_FB_APOLLO) += dnfb.o cfbfillrect.o cfbimgblt.o ...@@ -27,13 +26,13 @@ obj-$(CONFIG_FB_APOLLO) += dnfb.o cfbfillrect.o cfbimgblt.o
obj-$(CONFIG_FB_Q40) += q40fb.o cfbfillrect.o cfbcopyarea.o cfbimgblt.o obj-$(CONFIG_FB_Q40) += q40fb.o cfbfillrect.o cfbcopyarea.o cfbimgblt.o
obj-$(CONFIG_FB_ATARI) += atafb.o obj-$(CONFIG_FB_ATARI) += atafb.o
obj-$(CONFIG_FB_ATY128) += aty128fb.o cfbfillrect.o cfbcopyarea.o cfbimgblt.o obj-$(CONFIG_FB_ATY128) += aty128fb.o cfbfillrect.o cfbcopyarea.o cfbimgblt.o
obj-$(CONFIG_FB_RADEON) += radeonfb.o obj-$(CONFIG_FB_RADEON) += radeonfb.o cfbfillrect.o cfbcopyarea.o cfbimgblt.o
obj-$(CONFIG_FB_NEOMAGIC) += neofb.o cfbfillrect.o cfbcopyarea.o cfbimgblt.o obj-$(CONFIG_FB_NEOMAGIC) += neofb.o cfbfillrect.o cfbcopyarea.o cfbimgblt.o
obj-$(CONFIG_FB_IGA) += igafb.o cfbfillrect.o cfbcopyarea.o cfbimgblit.o obj-$(CONFIG_FB_IGA) += igafb.o cfbfillrect.o cfbcopyarea.o cfbimgblt.o
obj-$(CONFIG_FB_CONTROL) += controlfb.o obj-$(CONFIG_FB_CONTROL) += controlfb.o
obj-$(CONFIG_FB_PLATINUM) += platinumfb.o obj-$(CONFIG_FB_PLATINUM) += platinumfb.o
obj-$(CONFIG_FB_VALKYRIE) += valkyriefb.o obj-$(CONFIG_FB_VALKYRIE) += valkyriefb.o
obj-$(CONFIG_FB_CT65550) += chipsfb.o obj-$(CONFIG_FB_CT65550) += chipsfb.o cfbfillrect.o cfbcopyarea.o cfbimgblt.o
obj-$(CONFIG_FB_ANAKIN) += anakinfb.o cfbfillrect.o cfbcopyarea.o cfbimgblt.o obj-$(CONFIG_FB_ANAKIN) += anakinfb.o cfbfillrect.o cfbcopyarea.o cfbimgblt.o
obj-$(CONFIG_FB_CLPS711X) += clps711xfb.o cfbfillrect.o cfbcopyarea.o cfbimgblt.o obj-$(CONFIG_FB_CLPS711X) += clps711xfb.o cfbfillrect.o cfbcopyarea.o cfbimgblt.o
obj-$(CONFIG_FB_CYBER) += cyberfb.o obj-$(CONFIG_FB_CYBER) += cyberfb.o
...@@ -42,7 +41,7 @@ obj-$(CONFIG_FB_SGIVW) += sgivwfb.o cfbfillrect.o cfbcopyarea.o cfbim ...@@ -42,7 +41,7 @@ obj-$(CONFIG_FB_SGIVW) += sgivwfb.o cfbfillrect.o cfbcopyarea.o cfbim
obj-$(CONFIG_FB_3DFX) += tdfxfb.o obj-$(CONFIG_FB_3DFX) += tdfxfb.o
obj-$(CONFIG_FB_MAC) += macfb.o macmodes.o cfbfillrect.o cfbcopyarea.o cfbimgblt.o obj-$(CONFIG_FB_MAC) += macfb.o macmodes.o cfbfillrect.o cfbcopyarea.o cfbimgblt.o
obj-$(CONFIG_FB_HP300) += hpfb.o cfbfillrect.o cfbimgblt.o obj-$(CONFIG_FB_HP300) += hpfb.o cfbfillrect.o cfbimgblt.o
obj-$(CONFIG_FB_OF) += offb.o cfbfillrect.o cfbimgblit.o cfbcopyarea.o obj-$(CONFIG_FB_OF) += offb.o cfbfillrect.o cfbimgblt.o cfbcopyarea.o
obj-$(CONFIG_FB_IMSTT) += imsttfb.o obj-$(CONFIG_FB_IMSTT) += imsttfb.o
obj-$(CONFIG_FB_RETINAZ3) += retz3fb.o obj-$(CONFIG_FB_RETINAZ3) += retz3fb.o
obj-$(CONFIG_FB_CLGEN) += clgenfb.o obj-$(CONFIG_FB_CLGEN) += clgenfb.o
...@@ -63,7 +62,7 @@ obj-$(CONFIG_FB_TCX) += tcxfb.o sbusfb.o ...@@ -63,7 +62,7 @@ obj-$(CONFIG_FB_TCX) += tcxfb.o sbusfb.o
obj-$(CONFIG_FB_CGFOURTEEN) += cgfourteenfb.o sbusfb.o obj-$(CONFIG_FB_CGFOURTEEN) += cgfourteenfb.o sbusfb.o
obj-$(CONFIG_FB_P9100) += p9100fb.o sbusfb.o obj-$(CONFIG_FB_P9100) += p9100fb.o sbusfb.o
obj-$(CONFIG_FB_LEO) += leofb.o sbusfb.o obj-$(CONFIG_FB_LEO) += leofb.o sbusfb.o
obj-$(CONFIG_FB_STI) += stifb.o console/sticore.o obj-$(CONFIG_FB_STI) += stifb.o cfbfillrect.o cfbcopyarea.o cfbimgblt.o
obj-$(CONFIG_FB_PMAG_BA) += pmag-ba-fb.o cfbfillrect.o cfbcopyarea.o cfbimgblt.o obj-$(CONFIG_FB_PMAG_BA) += pmag-ba-fb.o cfbfillrect.o cfbcopyarea.o cfbimgblt.o
obj-$(CONFIG_FB_PMAGB_B) += pmagb-b-fb.o cfbfillrect.o cfbcopyarea.o cfbimgblt.o obj-$(CONFIG_FB_PMAGB_B) += pmagb-b-fb.o cfbfillrect.o cfbcopyarea.o cfbimgblt.o
obj-$(CONFIG_FB_MAXINE) += maxinefb.o cfbfillrect.o cfbcopyarea.o cfbimgblt.o obj-$(CONFIG_FB_MAXINE) += maxinefb.o cfbfillrect.o cfbcopyarea.o cfbimgblt.o
...@@ -74,6 +73,8 @@ obj-$(CONFIG_FB_RIVA) += riva/ cfbfillrect.o cfbcopyarea.o \ ...@@ -74,6 +73,8 @@ obj-$(CONFIG_FB_RIVA) += riva/ cfbfillrect.o cfbcopyarea.o \
cfbimgblt.o vgastate.o cfbimgblt.o vgastate.o
obj-$(CONFIG_FB_SIS) += sis/ obj-$(CONFIG_FB_SIS) += sis/
obj-$(CONFIG_FB_ATY) += aty/ cfbimgblt.o obj-$(CONFIG_FB_ATY) += aty/ cfbimgblt.o
obj-$(CONFIG_FB_I810) += i810/ cfbfillrect.o cfbcopyarea.o \
cfbimgblt.o vgastate.o
obj-$(CONFIG_FB_SUN3) += sun3fb.o obj-$(CONFIG_FB_SUN3) += sun3fb.o
obj-$(CONFIG_FB_HGA) += hgafb.o cfbfillrect.o cfbcopyarea.o cfbimgblt.o obj-$(CONFIG_FB_HGA) += hgafb.o cfbfillrect.o cfbcopyarea.o cfbimgblt.o
...@@ -82,7 +83,7 @@ obj-$(CONFIG_FB_VIRTUAL) += vfb.o cfbfillrect.o cfbcopyarea.o cfbimgblt ...@@ -82,7 +83,7 @@ obj-$(CONFIG_FB_VIRTUAL) += vfb.o cfbfillrect.o cfbcopyarea.o cfbimgblt
obj-$(CONFIG_FB_HIT) += hitfb.o cfbfillrect.o cfbcopyarea.o cfbimgblt.o obj-$(CONFIG_FB_HIT) += hitfb.o cfbfillrect.o cfbcopyarea.o cfbimgblt.o
obj-$(CONFIG_FB_E1355) += epson1355fb.o obj-$(CONFIG_FB_E1355) += epson1355fb.o
obj-$(CONFIG_FB_PVR2) += pvr2fb.o obj-$(CONFIG_FB_PVR2) += pvr2fb.o
obj-$(CONFIG_FB_VOODOO1) += sstfb.o obj-$(CONFIG_FB_VOODOO1) += sstfb.o cfbfillrect.o cfbcopyarea.o cfbimgblt.o
# Files generated that shall be removed upon make clean # Files generated that shall be removed upon make clean
clean-files := promcon_tbl.c clean-files := promcon_tbl.c
......
...@@ -70,7 +70,7 @@ ...@@ -70,7 +70,7 @@
#ifdef __powerpc__ #ifdef __powerpc__
#include <asm/prom.h> #include <asm/prom.h>
#include <video/macmodes.h> #include "../macmodes.h"
#endif #endif
#ifdef __sparc__ #ifdef __sparc__
#include <asm/pbm.h> #include <asm/pbm.h>
...@@ -84,9 +84,6 @@ ...@@ -84,9 +84,6 @@
#ifdef CONFIG_BOOTX_TEXT #ifdef CONFIG_BOOTX_TEXT
#include <asm/btext.h> #include <asm/btext.h>
#endif #endif
#ifdef CONFIG_NVRAM
#include <linux/nvram.h>
#endif
#ifdef CONFIG_PMAC_BACKLIGHT #ifdef CONFIG_PMAC_BACKLIGHT
#include <asm/backlight.h> #include <asm/backlight.h>
#endif #endif
...@@ -226,14 +223,9 @@ static char *mode_option __initdata = NULL; ...@@ -226,14 +223,9 @@ static char *mode_option __initdata = NULL;
#endif #endif
#ifdef CONFIG_PPC #ifdef CONFIG_PPC
#ifdef CONFIG_NVRAM_NOT_DEFINED
static int default_vmode __initdata = VMODE_NVRAM;
static int default_cmode __initdata = CMODE_NVRAM;
#else
static int default_vmode __initdata = VMODE_CHOOSE; static int default_vmode __initdata = VMODE_CHOOSE;
static int default_cmode __initdata = CMODE_CHOOSE; static int default_cmode __initdata = CMODE_CHOOSE;
#endif #endif
#endif
#ifdef CONFIG_ATARI #ifdef CONFIG_ATARI
static unsigned int mach64_count __initdata = 0; static unsigned int mach64_count __initdata = 0;
...@@ -984,6 +976,7 @@ static int atyfb_release(struct fb_info *info, int user) ...@@ -984,6 +976,7 @@ static int atyfb_release(struct fb_info *info, int user)
var.yres_virtual = var.yres_virtual =
var.yres; var.yres;
} }
fb_set_var(&var, -1, info);
} }
} }
} }
...@@ -1246,8 +1239,8 @@ static void atyfb_save_palette(struct atyfb_par *par, int enter) ...@@ -1246,8 +1239,8 @@ static void atyfb_save_palette(struct atyfb_par *par, int enter)
static void atyfb_palette(int enter) static void atyfb_palette(int enter)
{ {
struct fb_info *info;
struct atyfb_par *par; struct atyfb_par *par;
struct fb_info *info;
int i; int i;
for (i = 0; i < FB_MAX; i++) { for (i = 0; i < FB_MAX; i++) {
...@@ -1409,16 +1402,16 @@ static int aty_power_mgmt(int sleep, struct atyfb_par *par) ...@@ -1409,16 +1402,16 @@ static int aty_power_mgmt(int sleep, struct atyfb_par *par)
static int aty_sleep_notify(struct pmu_sleep_notifier *self, int when) static int aty_sleep_notify(struct pmu_sleep_notifier *self, int when)
{ {
struct fb_info *info; struct fb_info *info;
struct atyfb_par *par = (struct atyfb_par *) info->fb.par; struct atyfb_par *par;
int result; int result;
result = PBOOK_SLEEP_OK; result = PBOOK_SLEEP_OK;
for (info = first_display; info != NULL; info = par->next) { for (info = first_display; info != NULL; info = par->next) {
struct fb_fix_screeninfo fix;
int nb; int nb;
nb = fb_display[fg_console].var.yres * info->fix.line_length; par = (struct atyfb_par *) info->fb.par;
nb = info->var.yres * info->fix.line_length;
switch (when) { switch (when) {
case PBOOK_SLEEP_REQUEST: case PBOOK_SLEEP_REQUEST:
...@@ -1436,7 +1429,7 @@ static int aty_sleep_notify(struct pmu_sleep_notifier *self, int when) ...@@ -1436,7 +1429,7 @@ static int aty_sleep_notify(struct pmu_sleep_notifier *self, int when)
if (par->blitter_may_be_busy) if (par->blitter_may_be_busy)
wait_for_idle(par); wait_for_idle(par);
/* Stop accel engine (stop bus mastering) */ /* Stop accel engine (stop bus mastering) */
if (par->accel_flags & FB_ACCELF_TEXT) if (info->accel_flags & FB_ACCELF_TEXT)
aty_reset_engine(par); aty_reset_engine(par);
/* Backup fb content */ /* Backup fb content */
...@@ -1841,14 +1834,6 @@ static int __init aty_init(struct fb_info *info, const char *name) ...@@ -1841,14 +1834,6 @@ static int __init aty_init(struct fb_info *info, const char *name)
(&var, info, mode_option, 8)) (&var, info, mode_option, 8))
var = default_var; var = default_var;
} else { } else {
#ifdef CONFIG_NVRAM
if (default_vmode == VMODE_NVRAM) {
default_vmode = nvram_read_byte(NV_VMODE);
if (default_vmode <= 0
|| default_vmode > VMODE_MAX)
default_vmode = VMODE_CHOOSE;
}
#endif
if (default_vmode == VMODE_CHOOSE) { if (default_vmode == VMODE_CHOOSE) {
if (M64_HAS(G3_PB_1024x768)) if (M64_HAS(G3_PB_1024x768))
/* G3 PowerBook with 1024x768 LCD */ /* G3 PowerBook with 1024x768 LCD */
...@@ -1870,10 +1855,6 @@ static int __init aty_init(struct fb_info *info, const char *name) ...@@ -1870,10 +1855,6 @@ static int __init aty_init(struct fb_info *info, const char *name)
if (default_vmode <= 0 if (default_vmode <= 0
|| default_vmode > VMODE_MAX) || default_vmode > VMODE_MAX)
default_vmode = VMODE_640_480_60; default_vmode = VMODE_640_480_60;
#ifdef CONFIG_NVRAM
if (default_cmode == CMODE_NVRAM)
default_cmode = nvram_read_byte(NV_CMODE);
#endif
if (default_cmode < CMODE_8 if (default_cmode < CMODE_8
|| default_cmode > CMODE_32) || default_cmode > CMODE_32)
default_cmode = CMODE_8; default_cmode = CMODE_8;
......
...@@ -56,8 +56,6 @@ ...@@ -56,8 +56,6 @@
#include <asm/uaccess.h> #include <asm/uaccess.h>
#include <linux/fb.h> #include <linux/fb.h>
#include <linux/init.h> #include <linux/init.h>
#include <linux/selection.h>
#include <linux/console.h>
#include <linux/pci.h> #include <linux/pci.h>
#include <linux/ioport.h> #include <linux/ioport.h>
#include <asm/io.h> #include <asm/io.h>
...@@ -65,10 +63,7 @@ ...@@ -65,10 +63,7 @@
#ifdef CONFIG_ALL_PPC #ifdef CONFIG_ALL_PPC
#include <asm/prom.h> #include <asm/prom.h>
#include <asm/pci-bridge.h> #include <asm/pci-bridge.h>
#include <video/macmodes.h> #include "macmodes.h"
#ifdef CONFIG_NVRAM
#include <linux/nvram.h>
#endif
#endif #endif
#ifdef CONFIG_ADB_PMU #ifdef CONFIG_ADB_PMU
...@@ -285,7 +280,6 @@ struct aty128_constants { ...@@ -285,7 +280,6 @@ struct aty128_constants {
struct aty128_crtc { struct aty128_crtc {
u32 gen_cntl; u32 gen_cntl;
u32 ext_cntl;
u32 h_total, h_sync_strt_wid; u32 h_total, h_sync_strt_wid;
u32 v_total, v_sync_strt_wid; u32 v_total, v_sync_strt_wid;
u32 pitch; u32 pitch;
...@@ -326,10 +320,13 @@ struct aty128fb_par { ...@@ -326,10 +320,13 @@ struct aty128fb_par {
unsigned char *save_framebuffer; unsigned char *save_framebuffer;
int pm_reg; int pm_reg;
int crt_on, lcd_on; int crt_on, lcd_on;
struct pci_dev *pdev;
struct fb_info *next;
#endif #endif
unsigned char red[64]; /* see comments in aty128fb_setcolreg */ u8 red[32]; /* see aty128fb_setcolreg */
unsigned char green[64]; u8 green[64];
unsigned char blue[64]; u8 blue[32];
u32 pseudo_palette[16]; /* used for TRUECOLOR */
}; };
#ifdef CONFIG_PMAC_PBOOK #ifdef CONFIG_PMAC_PBOOK
...@@ -337,6 +334,7 @@ int aty128_sleep_notify(struct pmu_sleep_notifier *self, int when); ...@@ -337,6 +334,7 @@ int aty128_sleep_notify(struct pmu_sleep_notifier *self, int when);
static struct pmu_sleep_notifier aty128_sleep_notifier = { static struct pmu_sleep_notifier aty128_sleep_notifier = {
aty128_sleep_notify, SLEEP_LEVEL_VIDEO, aty128_sleep_notify, SLEEP_LEVEL_VIDEO,
}; };
static struct fb_info *aty128_fb = NULL;
#endif #endif
#define round_div(n, d) ((n+(d/2))/d) #define round_div(n, d) ((n+(d/2))/d)
...@@ -1203,7 +1201,11 @@ aty128fb_set_par(struct fb_info *info) ...@@ -1203,7 +1201,11 @@ aty128fb_set_par(struct fb_info *info)
{ {
struct aty128fb_par *par = info->par; struct aty128fb_par *par = info->par;
u32 config; u32 config;
int err;
if ((err = aty128_decode_var(&info->var, par)) != 0)
return err;
if (par->blitter_may_be_busy) if (par->blitter_may_be_busy)
wait_for_idle(par); wait_for_idle(par);
...@@ -1271,15 +1273,22 @@ static int ...@@ -1271,15 +1273,22 @@ static int
aty128_decode_var(struct fb_var_screeninfo *var, struct aty128fb_par *par) aty128_decode_var(struct fb_var_screeninfo *var, struct aty128fb_par *par)
{ {
int err; int err;
struct aty128_crtc crtc;
struct aty128_pll pll;
struct aty128_ddafifo fifo_reg;
if ((err = aty128_var_to_crtc(var, &par->crtc, par))) if ((err = aty128_var_to_crtc(var, &crtc, par)))
return err; return err;
if ((err = aty128_var_to_pll(var->pixclock, &par->pll, par))) if ((err = aty128_var_to_pll(var->pixclock, &pll, par)))
return err; return err;
if ((err = aty128_ddafifo(&par->fifo_reg, &par->pll, par->crtc.depth, par))) if ((err = aty128_ddafifo(&fifo_reg, &pll, crtc.depth, par)))
return err; return err;
par->crtc = crtc;
par->pll = pll;
par->fifo_reg = fifo_reg;
par->accel_flags = var->accel_flags; par->accel_flags = var->accel_flags;
return 0; return 0;
...@@ -1312,12 +1321,13 @@ aty128_encode_var(struct fb_var_screeninfo *var, ...@@ -1312,12 +1321,13 @@ aty128_encode_var(struct fb_var_screeninfo *var,
static int static int
aty128fb_check_var(struct fb_var_screeninfo *var, struct fb_info *info) aty128fb_check_var(struct fb_var_screeninfo *var, struct fb_info *info)
{ {
struct aty128fb_par *par = info->par; struct aty128fb_par par;
int err; int err;
if ((err = aty128_decode_var(var, par)) != 0) par = *(struct aty128fb_par *)info->par;
if ((err = aty128_decode_var(var, &par)) != 0)
return err; return err;
aty128_encode_var(var, par); aty128_encode_var(var, &par);
return 0; return 0;
} }
...@@ -1602,7 +1612,12 @@ aty128_init(struct pci_dev *pdev, const struct pci_device_id *ent) ...@@ -1602,7 +1612,12 @@ aty128_init(struct pci_dev *pdev, const struct pci_device_id *ent)
#endif /* CONFIG_PMAC_BACKLIGHT */ #endif /* CONFIG_PMAC_BACKLIGHT */
#ifdef CONFIG_PMAC_PBOOK #ifdef CONFIG_PMAC_PBOOK
par->pm_reg = pci_find_capability(pdev, PCI_CAP_ID_PM); par->pm_reg = pci_find_capability(pdev, PCI_CAP_ID_PM);
pmu_register_sleep_notifier(&aty128_sleep_notifier); if (aty128_fb == NULL) {
/* XXX can only put one chip to sleep */
aty128_fb = info;
} else
printk(KERN_WARNING "aty128fb: can only sleep one Rage 128\n");
par->pdev = pdev;
#endif #endif
printk(KERN_INFO "fb%d: %s frame buffer device on %s\n", printk(KERN_INFO "fb%d: %s frame buffer device on %s\n",
...@@ -1647,8 +1662,7 @@ aty128_probe(struct pci_dev *pdev, const struct pci_device_id *ent) ...@@ -1647,8 +1662,7 @@ aty128_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
} }
/* We have the resources. Now virtualize them */ /* We have the resources. Now virtualize them */
size = sizeof(struct fb_info) + sizeof(struct aty128fb_par) + size = sizeof(struct fb_info) + sizeof(struct aty128fb_par);
sizeof(u32)*16;
if (!(info = kmalloc(size, GFP_ATOMIC))) { if (!(info = kmalloc(size, GFP_ATOMIC))) {
printk(KERN_ERR "aty128fb: can't alloc fb_info_aty128\n"); printk(KERN_ERR "aty128fb: can't alloc fb_info_aty128\n");
goto err_unmap_out; goto err_unmap_out;
...@@ -1656,9 +1670,7 @@ aty128_probe(struct pci_dev *pdev, const struct pci_device_id *ent) ...@@ -1656,9 +1670,7 @@ aty128_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
memset(info, 0, size); memset(info, 0, size);
par = (struct aty128fb_par *)(info + 1); par = (struct aty128fb_par *)(info + 1);
info->pseudo_palette = (void *) (par + 1); info->pseudo_palette = par->pseudo_palette;
memset(info, 0, sizeof(struct fb_info));
info->par = par; info->par = par;
info->fix = aty128fb_fix; info->fix = aty128fb_fix;
...@@ -1758,6 +1770,10 @@ static void __devexit aty128_remove(struct pci_dev *pdev) ...@@ -1758,6 +1770,10 @@ static void __devexit aty128_remove(struct pci_dev *pdev)
pci_resource_len(pdev, 1)); pci_resource_len(pdev, 1));
release_mem_region(pci_resource_start(pdev, 2), release_mem_region(pci_resource_start(pdev, 2),
pci_resource_len(pdev, 2)); pci_resource_len(pdev, 2));
#ifdef CONFIG_PMAC_PBOOK
if (info == aty128_fb)
aty128_fb = NULL;
#endif
kfree(info); kfree(info);
} }
#endif /* CONFIG_PCI */ #endif /* CONFIG_PCI */
...@@ -2008,7 +2024,7 @@ aty128fb_setcolreg(u_int regno, u_int red, u_int green, u_int blue, ...@@ -2008,7 +2024,7 @@ aty128fb_setcolreg(u_int regno, u_int red, u_int green, u_int blue,
} }
} }
if (par->crtc.depth == 16) { if (par->crtc.depth == 16 && regno > 0) {
/* /*
* With the 5-6-5 split of bits for RGB at 16 bits/pixel, we * With the 5-6-5 split of bits for RGB at 16 bits/pixel, we
* have 32 slots for R and B values but 64 slots for G values. * have 32 slots for R and B values but 64 slots for G values.
...@@ -2016,12 +2032,13 @@ aty128fb_setcolreg(u_int regno, u_int red, u_int green, u_int blue, ...@@ -2016,12 +2032,13 @@ aty128fb_setcolreg(u_int regno, u_int red, u_int green, u_int blue,
* goes in a different slot, and we have to avoid disturbing * goes in a different slot, and we have to avoid disturbing
* the other fields in the slots we touch. * the other fields in the slots we touch.
*/ */
par->red[regno] = red;
par->green[regno] = green; par->green[regno] = green;
par->blue[regno] = blue; if (regno < 32) {
if (regno > 0 && regno < 32) par->red[regno] = red;
par->blue[regno] = blue;
aty128_st_pal(regno * 8, red, par->green[regno*2], aty128_st_pal(regno * 8, red, par->green[regno*2],
blue, par); blue, par);
}
red = par->red[regno/2]; red = par->red[regno/2];
blue = par->blue[regno/2]; blue = par->blue[regno/2];
regno <<= 2; regno <<= 2;
...@@ -2213,6 +2230,7 @@ aty128_set_suspend(struct aty128fb_par *par, int suspend) ...@@ -2213,6 +2230,7 @@ aty128_set_suspend(struct aty128fb_par *par, int suspend)
{ {
u32 pmgt; u32 pmgt;
u16 pwr_command; u16 pwr_command;
struct pci_dev *pdev = par->pdev;
if (!par->pm_reg) if (!par->pm_reg)
return; return;
...@@ -2237,17 +2255,16 @@ aty128_set_suspend(struct aty128fb_par *par, int suspend) ...@@ -2237,17 +2255,16 @@ aty128_set_suspend(struct aty128fb_par *par, int suspend)
aty_st_le32(BUS_CNTL1, 0x00000010); aty_st_le32(BUS_CNTL1, 0x00000010);
aty_st_le32(MEM_POWER_MISC, 0x0c830000); aty_st_le32(MEM_POWER_MISC, 0x0c830000);
mdelay(100); mdelay(100);
pci_read_config_word(par->pdev, par->pm_reg+PCI_PM_CTRL, &pwr_command); pci_read_config_word(pdev, par->pm_reg+PCI_PM_CTRL, &pwr_command);
/* Switch PCI power management to D2 */ /* Switch PCI power management to D2 */
pci_write_config_word(par->pdev, par->pm_reg+PCI_PM_CTRL, pci_write_config_word(pdev, par->pm_reg+PCI_PM_CTRL,
(pwr_command & ~PCI_PM_CTRL_STATE_MASK) | 2); (pwr_command & ~PCI_PM_CTRL_STATE_MASK) | 2);
pci_read_config_word(par->pdev, par->pm_reg+PCI_PM_CTRL, &pwr_command); pci_read_config_word(pdev, par->pm_reg+PCI_PM_CTRL, &pwr_command);
} else { } else {
/* Switch back PCI power management to D0 */ /* Switch back PCI power management to D0 */
mdelay(100); mdelay(100);
pci_write_config_word(par->pdev, par->pm_reg+PCI_PM_CTRL, 0); pci_write_config_word(pdev, par->pm_reg+PCI_PM_CTRL, 0);
mdelay(100); pci_read_config_word(pdev, par->pm_reg+PCI_PM_CTRL, &pwr_command);
pci_read_config_word(par->pdev, par->pm_reg+PCI_PM_CTRL, &pwr_command);
mdelay(100); mdelay(100);
} }
} }
...@@ -2259,10 +2276,13 @@ aty128_set_suspend(struct aty128fb_par *par, int suspend) ...@@ -2259,10 +2276,13 @@ aty128_set_suspend(struct aty128fb_par *par, int suspend)
int int
aty128_sleep_notify(struct pmu_sleep_notifier *self, int when) aty128_sleep_notify(struct pmu_sleep_notifier *self, int when)
{ {
int result = PBOOK_SLEEP_OK, nb; int nb;
struct fb_info *info = info; /* FIXME!!! How do find which framebuffer */ struct fb_info *info = aty128_fb;
struct aty128fb_par *par = info->par; struct aty128fb_par *par;
if (info == NULL)
return PBOOK_SLEEP_OK;
par = info->par;
nb = info->var.yres * info->fix.line_length; nb = info->var.yres * info->fix.line_length;
switch (when) { switch (when) {
...@@ -2311,17 +2331,23 @@ aty128_sleep_notify(struct pmu_sleep_notifier *self, int when) ...@@ -2311,17 +2331,23 @@ aty128_sleep_notify(struct pmu_sleep_notifier *self, int when)
aty128fb_blank(0, info); aty128fb_blank(0, info);
break; break;
} }
return result; return PBOOK_SLEEP_OK;
} }
#endif /* CONFIG_PMAC_PBOOK */ #endif /* CONFIG_PMAC_PBOOK */
int __init aty128fb_init(void) int __init aty128fb_init(void)
{ {
#ifdef CONFIG_PMAC_PBOOK
pmu_register_sleep_notifier(&aty128_sleep_notifier);
#endif
return pci_module_init(&aty128fb_driver); return pci_module_init(&aty128fb_driver);
} }
static void __exit aty128fb_exit(void) static void __exit aty128fb_exit(void)
{ {
#ifdef CONFIG_PMAC_PBOOK
pmu_unregister_sleep_notifier(&aty128_sleep_notifier);
#endif
pci_unregister_driver(&aty128fb_driver); pci_unregister_driver(&aty128fb_driver);
} }
......
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
...@@ -4,7 +4,7 @@ ...@@ -4,7 +4,7 @@
/* */ /* */
/**********************************************/ /**********************************************/
#include "font.h" #include <linux/font.h>
#define FONTDATAMAX (11*256) #define FONTDATAMAX (11*256)
......
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
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