Merge branch 'from-linus' into bcm43xx
This commit is contained in:
commit
ebf572b448
|
@ -58,6 +58,9 @@
|
|||
!Iinclude/linux/ktime.h
|
||||
!Iinclude/linux/hrtimer.h
|
||||
!Ekernel/hrtimer.c
|
||||
</sect1>
|
||||
<sect1><title>Workqueues and Kevents</title>
|
||||
!Ekernel/workqueue.c
|
||||
</sect1>
|
||||
<sect1><title>Internal Functions</title>
|
||||
!Ikernel/exit.c
|
||||
|
@ -300,7 +303,7 @@ X!Ekernel/module.c
|
|||
</sect1>
|
||||
|
||||
<sect1><title>Resources Management</title>
|
||||
!Ekernel/resource.c
|
||||
!Ikernel/resource.c
|
||||
</sect1>
|
||||
|
||||
<sect1><title>MTRR Handling</title>
|
||||
|
@ -312,9 +315,7 @@ X!Ekernel/module.c
|
|||
!Edrivers/pci/pci-driver.c
|
||||
!Edrivers/pci/remove.c
|
||||
!Edrivers/pci/pci-acpi.c
|
||||
<!-- kerneldoc does not understand __devinit
|
||||
X!Edrivers/pci/search.c
|
||||
-->
|
||||
!Edrivers/pci/search.c
|
||||
!Edrivers/pci/msi.c
|
||||
!Edrivers/pci/bus.c
|
||||
<!-- FIXME: Removed for now since no structured comments in source
|
||||
|
|
|
@ -10,7 +10,9 @@ kernel, the process can sometimes be daunting if you're not familiar
|
|||
with "the system." This text is a collection of suggestions which
|
||||
can greatly increase the chances of your change being accepted.
|
||||
|
||||
If you are submitting a driver, also read Documentation/SubmittingDrivers.
|
||||
Read Documentation/SubmitChecklist for a list of items to check
|
||||
before submitting code. If you are submitting a driver, also read
|
||||
Documentation/SubmittingDrivers.
|
||||
|
||||
|
||||
|
||||
|
@ -74,9 +76,6 @@ There are a number of scripts which can aid in this:
|
|||
Quilt:
|
||||
http://savannah.nongnu.org/projects/quilt
|
||||
|
||||
Randy Dunlap's patch scripts:
|
||||
http://www.xenotime.net/linux/scripts/patching-scripts-002.tar.gz
|
||||
|
||||
Andrew Morton's patch scripts:
|
||||
http://www.zip.com.au/~akpm/linux/patches/
|
||||
Instead of these scripts, quilt is the recommended patch management
|
||||
|
@ -484,7 +483,7 @@ Greg Kroah-Hartman "How to piss off a kernel subsystem maintainer".
|
|||
<http://www.kroah.com/log/2005/10/19/>
|
||||
<http://www.kroah.com/log/2006/01/11/>
|
||||
|
||||
NO!!!! No more huge patch bombs to linux-kernel@vger.kernel.org people!.
|
||||
NO!!!! No more huge patch bombs to linux-kernel@vger.kernel.org people!
|
||||
<http://marc.theaimsgroup.com/?l=linux-kernel&m=112112749912944&w=2>
|
||||
|
||||
Kernel Documentation/CodingStyle
|
||||
|
@ -493,4 +492,3 @@ Kernel Documentation/CodingStyle
|
|||
Linus Torvald's mail on the canonical patch format:
|
||||
<http://lkml.org/lkml/2005/4/7/183>
|
||||
--
|
||||
Last updated on 17 Nov 2005.
|
||||
|
|
|
@ -64,11 +64,13 @@ Compile the kernel with
|
|||
CONFIG_TASK_DELAY_ACCT=y
|
||||
CONFIG_TASKSTATS=y
|
||||
|
||||
Enable the accounting at boot time by adding
|
||||
the following to the kernel boot options
|
||||
delayacct
|
||||
Delay accounting is enabled by default at boot up.
|
||||
To disable, add
|
||||
nodelayacct
|
||||
to the kernel boot options. The rest of the instructions
|
||||
below assume this has not been done.
|
||||
|
||||
and after the system has booted up, use a utility
|
||||
After the system has booted up, use a utility
|
||||
similar to getdelays.c to access the delays
|
||||
seen by a given task or a task group (tgid).
|
||||
The utility also allows a given command to be
|
||||
|
|
|
@ -251,16 +251,24 @@ A: This is what you would need in your kernel code to receive notifications.
|
|||
return NOTIFY_OK;
|
||||
}
|
||||
|
||||
static struct notifier_block foobar_cpu_notifer =
|
||||
static struct notifier_block __cpuinitdata foobar_cpu_notifer =
|
||||
{
|
||||
.notifier_call = foobar_cpu_callback,
|
||||
};
|
||||
|
||||
You need to call register_cpu_notifier() from your init function.
|
||||
Init functions could be of two types:
|
||||
1. early init (init function called when only the boot processor is online).
|
||||
2. late init (init function called _after_ all the CPUs are online).
|
||||
|
||||
In your init function,
|
||||
For the first case, you should add the following to your init function
|
||||
|
||||
register_cpu_notifier(&foobar_cpu_notifier);
|
||||
|
||||
For the second case, you should add the following to your init function
|
||||
|
||||
register_hotcpu_notifier(&foobar_cpu_notifier);
|
||||
|
||||
You can fail PREPARE notifiers if something doesn't work to prepare resources.
|
||||
This will stop the activity and send a following CANCELED event back.
|
||||
|
||||
|
|
|
@ -2565,10 +2565,10 @@ Your cooperation is appreciated.
|
|||
243 = /dev/usb/dabusb3 Fourth dabusb device
|
||||
|
||||
180 block USB block devices
|
||||
0 = /dev/uba First USB block device
|
||||
8 = /dev/ubb Second USB block device
|
||||
16 = /dev/ubc Thrid USB block device
|
||||
...
|
||||
0 = /dev/uba First USB block device
|
||||
8 = /dev/ubb Second USB block device
|
||||
16 = /dev/ubc Third USB block device
|
||||
...
|
||||
|
||||
181 char Conrad Electronic parallel port radio clocks
|
||||
0 = /dev/pcfclock0 First Conrad radio clock
|
||||
|
|
|
@ -72,6 +72,22 @@ initrd adds the following new options:
|
|||
initrd is mounted as root, and the normal boot procedure is followed,
|
||||
with the RAM disk still mounted as root.
|
||||
|
||||
Compressed cpio images
|
||||
----------------------
|
||||
|
||||
Recent kernels have support for populating a ramdisk from a compressed cpio
|
||||
archive, on such systems, the creation of a ramdisk image doesn't need to
|
||||
involve special block devices or loopbacks, you merely create a directory on
|
||||
disk with the desired initrd content, cd to that directory, and run (as an
|
||||
example):
|
||||
|
||||
find . | cpio --quiet -c -o | gzip -9 -n > /boot/imagefile.img
|
||||
|
||||
Examining the contents of an existing image file is just as simple:
|
||||
|
||||
mkdir /tmp/imagefile
|
||||
cd /tmp/imagefile
|
||||
gzip -cd /boot/imagefile.img | cpio -imd --quiet
|
||||
|
||||
Installation
|
||||
------------
|
||||
|
|
|
@ -407,6 +407,20 @@ more details, with real examples.
|
|||
The second argument is optional, and if supplied will be used
|
||||
if first argument is not supported.
|
||||
|
||||
ld-option
|
||||
ld-option is used to check if $(CC) when used to link object files
|
||||
supports the given option. An optional second option may be
|
||||
specified if first option are not supported.
|
||||
|
||||
Example:
|
||||
#arch/i386/kernel/Makefile
|
||||
vsyscall-flags += $(call ld-option, -Wl$(comma)--hash-style=sysv)
|
||||
|
||||
In the above example vsyscall-flags will be assigned the option
|
||||
-Wl$(comma)--hash-style=sysv if it is supported by $(CC).
|
||||
The second argument is optional, and if supplied will be used
|
||||
if first argument is not supported.
|
||||
|
||||
cc-option
|
||||
cc-option is used to check if $(CC) support a given option, and not
|
||||
supported to use an optional second option.
|
||||
|
|
|
@ -448,8 +448,6 @@ running once the system is up.
|
|||
Format: <area>[,<node>]
|
||||
See also Documentation/networking/decnet.txt.
|
||||
|
||||
delayacct [KNL] Enable per-task delay accounting
|
||||
|
||||
dhash_entries= [KNL]
|
||||
Set number of hash buckets for dentry cache.
|
||||
|
||||
|
@ -1031,6 +1029,8 @@ running once the system is up.
|
|||
|
||||
nocache [ARM]
|
||||
|
||||
nodelayacct [KNL] Disable per-task delay accounting
|
||||
|
||||
nodisconnect [HW,SCSI,M68K] Disables SCSI disconnects.
|
||||
|
||||
noexec [IA-64]
|
||||
|
|
|
@ -238,6 +238,13 @@ Debugging
|
|||
pagefaulttrace Dump all page faults. Only useful for extreme debugging
|
||||
and will create a lot of output.
|
||||
|
||||
call_trace=[old|both|newfallback|new]
|
||||
old: use old inexact backtracer
|
||||
new: use new exact dwarf2 unwinder
|
||||
both: print entries from both
|
||||
newfallback: use new unwinder but fall back to old if it gets
|
||||
stuck (default)
|
||||
|
||||
Misc
|
||||
|
||||
noreplacement Don't replace instructions with more appropriate ones
|
||||
|
|
15
MAINTAINERS
15
MAINTAINERS
|
@ -968,6 +968,10 @@ P: Andrey V. Savochkin
|
|||
M: saw@saw.sw.com.sg
|
||||
S: Maintained
|
||||
|
||||
EFS FILESYSTEM
|
||||
W: http://aeschi.ch.eu.org/efs/
|
||||
S: Orphan
|
||||
|
||||
EMU10K1 SOUND DRIVER
|
||||
P: James Courtier-Dutton
|
||||
M: James@superbug.demon.co.uk
|
||||
|
@ -1598,7 +1602,7 @@ W: http://jfs.sourceforge.net/
|
|||
T: git kernel.org:/pub/scm/linux/kernel/git/shaggy/jfs-2.6.git
|
||||
S: Supported
|
||||
|
||||
JOURNALLING LAYER FOR BLOCK DEVICS (JBD)
|
||||
JOURNALLING LAYER FOR BLOCK DEVICES (JBD)
|
||||
P: Stephen Tweedie, Andrew Morton
|
||||
M: sct@redhat.com, akpm@osdl.org
|
||||
L: ext2-devel@lists.sourceforge.net
|
||||
|
@ -1642,9 +1646,8 @@ S: Maintained
|
|||
|
||||
KERNEL JANITORS
|
||||
P: Several
|
||||
L: kernel-janitors@osdl.org
|
||||
L: kernel-janitors@lists.osdl.org
|
||||
W: http://www.kerneljanitors.org/
|
||||
W: http://sf.net/projects/kernel-janitor/
|
||||
S: Maintained
|
||||
|
||||
KERNEL NFSD
|
||||
|
@ -1882,6 +1885,12 @@ S: linux-scsi@vger.kernel.org
|
|||
W: http://megaraid.lsilogic.com
|
||||
S: Maintained
|
||||
|
||||
MEMORY MANAGEMENT
|
||||
L: linux-mm@kvack.org
|
||||
L: linux-kernel@vger.kernel.org
|
||||
W: http://www.linux-mm.org
|
||||
S: Maintained
|
||||
|
||||
MEMORY TECHNOLOGY DEVICES (MTD)
|
||||
P: David Woodhouse
|
||||
M: dwmw2@infradead.org
|
||||
|
|
2
Makefile
2
Makefile
|
@ -1,7 +1,7 @@
|
|||
VERSION = 2
|
||||
PATCHLEVEL = 6
|
||||
SUBLEVEL = 18
|
||||
EXTRAVERSION = -rc2
|
||||
EXTRAVERSION = -rc3
|
||||
NAME=Crazed Snow-Weasel
|
||||
|
||||
# *DOCUMENTATION*
|
||||
|
|
|
@ -274,16 +274,14 @@ ev7_process_pal_subpacket(struct el_subpacket *header)
|
|||
struct el_subpacket_handler ev7_pal_subpacket_handler =
|
||||
SUBPACKET_HANDLER_INIT(EL_CLASS__PAL, ev7_process_pal_subpacket);
|
||||
|
||||
void
|
||||
void
|
||||
ev7_register_error_handlers(void)
|
||||
{
|
||||
int i;
|
||||
|
||||
for(i = 0;
|
||||
i<sizeof(el_ev7_pal_annotations)/sizeof(el_ev7_pal_annotations[1]);
|
||||
i++) {
|
||||
for (i = 0; i < ARRAY_SIZE(el_ev7_pal_annotations); i++)
|
||||
cdl_register_subpacket_annotation(&el_ev7_pal_annotations[i]);
|
||||
}
|
||||
|
||||
cdl_register_subpacket_handler(&ev7_pal_subpacket_handler);
|
||||
}
|
||||
|
||||
|
|
|
@ -623,12 +623,12 @@ osf_sysinfo(int command, char __user *buf, long count)
|
|||
long len, err = -EINVAL;
|
||||
|
||||
offset = command-1;
|
||||
if (offset >= sizeof(sysinfo_table)/sizeof(char *)) {
|
||||
if (offset >= ARRAY_SIZE(sysinfo_table)) {
|
||||
/* Digital UNIX has a few unpublished interfaces here */
|
||||
printk("sysinfo(%d)", command);
|
||||
goto out;
|
||||
}
|
||||
|
||||
|
||||
down_read(&uts_sem);
|
||||
res = sysinfo_table[offset];
|
||||
len = strlen(res)+1;
|
||||
|
|
|
@ -114,8 +114,6 @@ struct alpha_machine_vector alpha_mv;
|
|||
int alpha_using_srm;
|
||||
#endif
|
||||
|
||||
#define N(a) (sizeof(a)/sizeof(a[0]))
|
||||
|
||||
static struct alpha_machine_vector *get_sysvec(unsigned long, unsigned long,
|
||||
unsigned long);
|
||||
static struct alpha_machine_vector *get_sysvec_byname(const char *);
|
||||
|
@ -240,7 +238,7 @@ reserve_std_resources(void)
|
|||
standard_io_resources[0].start = RTC_PORT(0);
|
||||
standard_io_resources[0].end = RTC_PORT(0) + 0x10;
|
||||
|
||||
for (i = 0; i < N(standard_io_resources); ++i)
|
||||
for (i = 0; i < ARRAY_SIZE(standard_io_resources); ++i)
|
||||
request_resource(io, standard_io_resources+i);
|
||||
}
|
||||
|
||||
|
@ -918,13 +916,13 @@ get_sysvec(unsigned long type, unsigned long variation, unsigned long cpu)
|
|||
|
||||
/* Search the system tables first... */
|
||||
vec = NULL;
|
||||
if (type < N(systype_vecs)) {
|
||||
if (type < ARRAY_SIZE(systype_vecs)) {
|
||||
vec = systype_vecs[type];
|
||||
} else if ((type > ST_API_BIAS) &&
|
||||
(type - ST_API_BIAS) < N(api_vecs)) {
|
||||
(type - ST_API_BIAS) < ARRAY_SIZE(api_vecs)) {
|
||||
vec = api_vecs[type - ST_API_BIAS];
|
||||
} else if ((type > ST_UNOFFICIAL_BIAS) &&
|
||||
(type - ST_UNOFFICIAL_BIAS) < N(unofficial_vecs)) {
|
||||
(type - ST_UNOFFICIAL_BIAS) < ARRAY_SIZE(unofficial_vecs)) {
|
||||
vec = unofficial_vecs[type - ST_UNOFFICIAL_BIAS];
|
||||
}
|
||||
|
||||
|
@ -938,11 +936,11 @@ get_sysvec(unsigned long type, unsigned long variation, unsigned long cpu)
|
|||
|
||||
switch (type) {
|
||||
case ST_DEC_ALCOR:
|
||||
if (member < N(alcor_indices))
|
||||
if (member < ARRAY_SIZE(alcor_indices))
|
||||
vec = alcor_vecs[alcor_indices[member]];
|
||||
break;
|
||||
case ST_DEC_EB164:
|
||||
if (member < N(eb164_indices))
|
||||
if (member < ARRAY_SIZE(eb164_indices))
|
||||
vec = eb164_vecs[eb164_indices[member]];
|
||||
/* PC164 may show as EB164 variation with EV56 CPU,
|
||||
but, since no true EB164 had anything but EV5... */
|
||||
|
@ -950,24 +948,24 @@ get_sysvec(unsigned long type, unsigned long variation, unsigned long cpu)
|
|||
vec = &pc164_mv;
|
||||
break;
|
||||
case ST_DEC_EB64P:
|
||||
if (member < N(eb64p_indices))
|
||||
if (member < ARRAY_SIZE(eb64p_indices))
|
||||
vec = eb64p_vecs[eb64p_indices[member]];
|
||||
break;
|
||||
case ST_DEC_EB66:
|
||||
if (member < N(eb66_indices))
|
||||
if (member < ARRAY_SIZE(eb66_indices))
|
||||
vec = eb66_vecs[eb66_indices[member]];
|
||||
break;
|
||||
case ST_DEC_MARVEL:
|
||||
if (member < N(marvel_indices))
|
||||
if (member < ARRAY_SIZE(marvel_indices))
|
||||
vec = marvel_vecs[marvel_indices[member]];
|
||||
break;
|
||||
case ST_DEC_TITAN:
|
||||
vec = titan_vecs[0]; /* default */
|
||||
if (member < N(titan_indices))
|
||||
if (member < ARRAY_SIZE(titan_indices))
|
||||
vec = titan_vecs[titan_indices[member]];
|
||||
break;
|
||||
case ST_DEC_TSUNAMI:
|
||||
if (member < N(tsunami_indices))
|
||||
if (member < ARRAY_SIZE(tsunami_indices))
|
||||
vec = tsunami_vecs[tsunami_indices[member]];
|
||||
break;
|
||||
case ST_DEC_1000:
|
||||
|
@ -1039,7 +1037,7 @@ get_sysvec_byname(const char *name)
|
|||
|
||||
size_t i;
|
||||
|
||||
for (i = 0; i < N(all_vecs); ++i) {
|
||||
for (i = 0; i < ARRAY_SIZE(all_vecs); ++i) {
|
||||
struct alpha_machine_vector *mv = all_vecs[i];
|
||||
if (strcasecmp(mv->vector_name, name) == 0)
|
||||
return mv;
|
||||
|
@ -1055,13 +1053,13 @@ get_sysnames(unsigned long type, unsigned long variation, unsigned long cpu,
|
|||
|
||||
/* If not in the tables, make it UNKNOWN,
|
||||
else set type name to family */
|
||||
if (type < N(systype_names)) {
|
||||
if (type < ARRAY_SIZE(systype_names)) {
|
||||
*type_name = systype_names[type];
|
||||
} else if ((type > ST_API_BIAS) &&
|
||||
(type - ST_API_BIAS) < N(api_names)) {
|
||||
(type - ST_API_BIAS) < ARRAY_SIZE(api_names)) {
|
||||
*type_name = api_names[type - ST_API_BIAS];
|
||||
} else if ((type > ST_UNOFFICIAL_BIAS) &&
|
||||
(type - ST_UNOFFICIAL_BIAS) < N(unofficial_names)) {
|
||||
(type - ST_UNOFFICIAL_BIAS) < ARRAY_SIZE(unofficial_names)) {
|
||||
*type_name = unofficial_names[type - ST_UNOFFICIAL_BIAS];
|
||||
} else {
|
||||
*type_name = sys_unknown;
|
||||
|
@ -1083,7 +1081,7 @@ get_sysnames(unsigned long type, unsigned long variation, unsigned long cpu,
|
|||
default: /* default to variation "0" for now */
|
||||
break;
|
||||
case ST_DEC_EB164:
|
||||
if (member < N(eb164_indices))
|
||||
if (member < ARRAY_SIZE(eb164_indices))
|
||||
*variation_name = eb164_names[eb164_indices[member]];
|
||||
/* PC164 may show as EB164 variation, but with EV56 CPU,
|
||||
so, since no true EB164 had anything but EV5... */
|
||||
|
@ -1091,32 +1089,32 @@ get_sysnames(unsigned long type, unsigned long variation, unsigned long cpu,
|
|||
*variation_name = eb164_names[1]; /* make it PC164 */
|
||||
break;
|
||||
case ST_DEC_ALCOR:
|
||||
if (member < N(alcor_indices))
|
||||
if (member < ARRAY_SIZE(alcor_indices))
|
||||
*variation_name = alcor_names[alcor_indices[member]];
|
||||
break;
|
||||
case ST_DEC_EB64P:
|
||||
if (member < N(eb64p_indices))
|
||||
if (member < ARRAY_SIZE(eb64p_indices))
|
||||
*variation_name = eb64p_names[eb64p_indices[member]];
|
||||
break;
|
||||
case ST_DEC_EB66:
|
||||
if (member < N(eb66_indices))
|
||||
if (member < ARRAY_SIZE(eb66_indices))
|
||||
*variation_name = eb66_names[eb66_indices[member]];
|
||||
break;
|
||||
case ST_DEC_MARVEL:
|
||||
if (member < N(marvel_indices))
|
||||
if (member < ARRAY_SIZE(marvel_indices))
|
||||
*variation_name = marvel_names[marvel_indices[member]];
|
||||
break;
|
||||
case ST_DEC_RAWHIDE:
|
||||
if (member < N(rawhide_indices))
|
||||
if (member < ARRAY_SIZE(rawhide_indices))
|
||||
*variation_name = rawhide_names[rawhide_indices[member]];
|
||||
break;
|
||||
case ST_DEC_TITAN:
|
||||
*variation_name = titan_names[0]; /* default */
|
||||
if (member < N(titan_indices))
|
||||
if (member < ARRAY_SIZE(titan_indices))
|
||||
*variation_name = titan_names[titan_indices[member]];
|
||||
break;
|
||||
case ST_DEC_TSUNAMI:
|
||||
if (member < N(tsunami_indices))
|
||||
if (member < ARRAY_SIZE(tsunami_indices))
|
||||
*variation_name = tsunami_names[tsunami_indices[member]];
|
||||
break;
|
||||
}
|
||||
|
@ -1211,7 +1209,7 @@ show_cpuinfo(struct seq_file *f, void *slot)
|
|||
|
||||
cpu_index = (unsigned) (cpu->type - 1);
|
||||
cpu_name = "Unknown";
|
||||
if (cpu_index < N(cpu_names))
|
||||
if (cpu_index < ARRAY_SIZE(cpu_names))
|
||||
cpu_name = cpu_names[cpu_index];
|
||||
|
||||
get_sysnames(hwrpb->sys_type, hwrpb->sys_variation,
|
||||
|
|
|
@ -182,16 +182,16 @@ static unsigned long __init
|
|||
ruffian_get_bank_size(unsigned long offset)
|
||||
{
|
||||
unsigned long bank_addr, bank, ret = 0;
|
||||
|
||||
|
||||
/* Valid offsets are: 0x800, 0x840 and 0x880
|
||||
since Ruffian only uses three banks. */
|
||||
bank_addr = (unsigned long)PYXIS_MCR + offset;
|
||||
bank = *(vulp)bank_addr;
|
||||
|
||||
|
||||
/* Check BANK_ENABLE */
|
||||
if (bank & 0x01) {
|
||||
static unsigned long size[] __initdata = {
|
||||
0x40000000UL, /* 0x00, 1G */
|
||||
0x40000000UL, /* 0x00, 1G */
|
||||
0x20000000UL, /* 0x02, 512M */
|
||||
0x10000000UL, /* 0x04, 256M */
|
||||
0x08000000UL, /* 0x06, 128M */
|
||||
|
@ -203,7 +203,7 @@ ruffian_get_bank_size(unsigned long offset)
|
|||
};
|
||||
|
||||
bank = (bank & 0x1e) >> 1;
|
||||
if (bank < sizeof(size)/sizeof(*size))
|
||||
if (bank < ARRAY_SIZE(size))
|
||||
ret = size[bank];
|
||||
}
|
||||
|
||||
|
|
|
@ -233,7 +233,7 @@ validate_cc_value(unsigned long cc)
|
|||
index = cpu->type & 0xffffffff;
|
||||
|
||||
/* If index out of bounds, no way to validate. */
|
||||
if (index >= sizeof(cpu_hz)/sizeof(cpu_hz[0]))
|
||||
if (index >= ARRAY_SIZE(cpu_hz))
|
||||
return cc;
|
||||
|
||||
/* If index contains no data, no way to validate. */
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
#
|
||||
# Automatically generated make config: don't edit
|
||||
# Linux kernel version: 2.6.18-rc1
|
||||
# Sun Jul 9 15:21:30 2006
|
||||
# Linux kernel version: 2.6.18-rc1-git9
|
||||
# Sat Jul 15 15:08:10 2006
|
||||
#
|
||||
CONFIG_ARM=y
|
||||
CONFIG_MMU=y
|
||||
|
@ -30,6 +30,7 @@ CONFIG_SWAP=y
|
|||
CONFIG_SYSVIPC=y
|
||||
# CONFIG_POSIX_MQUEUE is not set
|
||||
# CONFIG_BSD_PROCESS_ACCT is not set
|
||||
# CONFIG_TASKSTATS is not set
|
||||
CONFIG_SYSCTL=y
|
||||
# CONFIG_AUDIT is not set
|
||||
CONFIG_IKCONFIG=y
|
||||
|
@ -749,7 +750,7 @@ CONFIG_VIDEO_V4L2=y
|
|||
# USB support
|
||||
#
|
||||
CONFIG_USB_ARCH_HAS_HCD=y
|
||||
# CONFIG_USB_ARCH_HAS_OHCI is not set
|
||||
CONFIG_USB_ARCH_HAS_OHCI=y
|
||||
# CONFIG_USB_ARCH_HAS_EHCI is not set
|
||||
CONFIG_USB=y
|
||||
CONFIG_USB_DEBUG=y
|
||||
|
@ -766,6 +767,9 @@ CONFIG_USB_DYNAMIC_MINORS=y
|
|||
# USB Host Controller Drivers
|
||||
#
|
||||
# CONFIG_USB_ISP116X_HCD is not set
|
||||
CONFIG_USB_OHCI_HCD=y
|
||||
# CONFIG_USB_OHCI_BIG_ENDIAN is not set
|
||||
CONFIG_USB_OHCI_LITTLE_ENDIAN=y
|
||||
# CONFIG_USB_SL811_HCD is not set
|
||||
|
||||
#
|
||||
|
@ -855,6 +859,7 @@ CONFIG_USB_SERIAL_CONSOLE=y
|
|||
CONFIG_USB_SERIAL_PL2303=y
|
||||
# CONFIG_USB_SERIAL_HP4X is not set
|
||||
# CONFIG_USB_SERIAL_SAFE is not set
|
||||
# CONFIG_USB_SERIAL_SIERRAWIRELESS is not set
|
||||
# CONFIG_USB_SERIAL_TI is not set
|
||||
# CONFIG_USB_SERIAL_CYBERJACK is not set
|
||||
# CONFIG_USB_SERIAL_XIRCOM is not set
|
||||
|
@ -871,7 +876,7 @@ CONFIG_USB_SERIAL_PL2303=y
|
|||
# CONFIG_USB_LEGOTOWER is not set
|
||||
# CONFIG_USB_LCD is not set
|
||||
# CONFIG_USB_LED is not set
|
||||
# CONFIG_USB_CY7C63 is not set
|
||||
# CONFIG_USB_CYPRESS_CY7C63 is not set
|
||||
# CONFIG_USB_CYTHERM is not set
|
||||
# CONFIG_USB_PHIDGETKIT is not set
|
||||
# CONFIG_USB_PHIDGETSERVO is not set
|
||||
|
@ -916,6 +921,7 @@ CONFIG_RTC_INTF_DEV=y
|
|||
# CONFIG_RTC_DRV_X1205 is not set
|
||||
# CONFIG_RTC_DRV_DS1307 is not set
|
||||
# CONFIG_RTC_DRV_DS1553 is not set
|
||||
# CONFIG_RTC_DRV_ISL1208 is not set
|
||||
# CONFIG_RTC_DRV_DS1672 is not set
|
||||
# CONFIG_RTC_DRV_DS1742 is not set
|
||||
# CONFIG_RTC_DRV_PCF8563 is not set
|
||||
|
@ -1023,7 +1029,6 @@ CONFIG_SUNRPC=y
|
|||
# CONFIG_RPCSEC_GSS_SPKM3 is not set
|
||||
# CONFIG_SMB_FS is not set
|
||||
# CONFIG_CIFS is not set
|
||||
# CONFIG_CIFS_DEBUG2 is not set
|
||||
# CONFIG_NCP_FS is not set
|
||||
# CONFIG_CODA_FS is not set
|
||||
# CONFIG_AFS_FS is not set
|
||||
|
|
|
@ -114,9 +114,9 @@ ENTRY(secondary_startup)
|
|||
* Use the page tables supplied from __cpu_up.
|
||||
*/
|
||||
adr r4, __secondary_data
|
||||
ldmia r4, {r5, r6, r13} @ address to jump to after
|
||||
ldmia r4, {r5, r7, r13} @ address to jump to after
|
||||
sub r4, r4, r5 @ mmu has been enabled
|
||||
ldr r4, [r6, r4] @ get secondary_data.pgdir
|
||||
ldr r4, [r7, r4] @ get secondary_data.pgdir
|
||||
adr lr, __enable_mmu @ return address
|
||||
add pc, r10, #12 @ initialise processor
|
||||
@ (return control reg)
|
||||
|
@ -125,7 +125,7 @@ ENTRY(secondary_startup)
|
|||
* r6 = &secondary_data
|
||||
*/
|
||||
ENTRY(__secondary_switched)
|
||||
ldr sp, [r6, #4] @ get secondary_data.stack
|
||||
ldr sp, [r7, #4] @ get secondary_data.stack
|
||||
mov fp, #0
|
||||
b secondary_start_kernel
|
||||
|
||||
|
|
|
@ -232,11 +232,8 @@ NORET_TYPE void die(const char *str, struct pt_regs *regs, int err)
|
|||
bust_spinlocks(0);
|
||||
spin_unlock_irq(&die_lock);
|
||||
|
||||
if (panic_on_oops) {
|
||||
printk(KERN_EMERG "Fatal exception: panic in 5 seconds\n");
|
||||
ssleep(5);
|
||||
panic("Fatal exception");
|
||||
}
|
||||
if (panic_on_oops)
|
||||
panic("Fatal exception: panic_on_oops");
|
||||
|
||||
do_exit(SIGSEGV);
|
||||
}
|
||||
|
|
|
@ -8,7 +8,7 @@
|
|||
#include <linux/ioport.h>
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/tty.h>
|
||||
#include <linux/screen_info.h>
|
||||
|
||||
#include <asm/hardware/dec21285.h>
|
||||
#include <asm/io.h>
|
||||
|
|
|
@ -60,11 +60,12 @@ static struct map_desc anubis_iodesc[] __initdata = {
|
|||
.virtual = (u32)S3C24XX_VA_ISA_BYTE,
|
||||
.pfn = __phys_to_pfn(0x0),
|
||||
.length = SZ_4M,
|
||||
.type = MT_DEVICE
|
||||
.type = MT_DEVICE,
|
||||
}, {
|
||||
.virtual = (u32)S3C24XX_VA_ISA_WORD,
|
||||
.pfn = __phys_to_pfn(0x0),
|
||||
.length = SZ_4M, MT_DEVICE
|
||||
.length = SZ_4M,
|
||||
.type = MT_DEVICE,
|
||||
},
|
||||
|
||||
/* we could possibly compress the next set down into a set of smaller tables
|
||||
|
@ -78,36 +79,12 @@ static struct map_desc anubis_iodesc[] __initdata = {
|
|||
.virtual = (u32)ANUBIS_VA_CTRL1,
|
||||
.pfn = __phys_to_pfn(ANUBIS_PA_CTRL1),
|
||||
.length = SZ_4K,
|
||||
.type = MT_DEVICE
|
||||
.type = MT_DEVICE,
|
||||
}, {
|
||||
.virtual = (u32)ANUBIS_VA_CTRL2,
|
||||
.pfn = __phys_to_pfn(ANUBIS_PA_CTRL2),
|
||||
.length = SZ_4K,
|
||||
.type =MT_DEVICE
|
||||
},
|
||||
|
||||
/* IDE drives */
|
||||
|
||||
{
|
||||
.virtual = (u32)ANUBIS_IDEPRI,
|
||||
.pfn = __phys_to_pfn(S3C2410_CS3),
|
||||
.length = SZ_1M,
|
||||
.type = MT_DEVICE
|
||||
}, {
|
||||
.virtual = (u32)ANUBIS_IDEPRIAUX,
|
||||
.pfn = __phys_to_pfn(S3C2410_CS3+(1<<26)),
|
||||
.length = SZ_1M,
|
||||
.type = MT_DEVICE
|
||||
}, {
|
||||
.virtual = (u32)ANUBIS_IDESEC,
|
||||
.pfn = __phys_to_pfn(S3C2410_CS4),
|
||||
.length = SZ_1M,
|
||||
.type = MT_DEVICE
|
||||
}, {
|
||||
.virtual = (u32)ANUBIS_IDESECAUX,
|
||||
.pfn = __phys_to_pfn(S3C2410_CS4+(1<<26)),
|
||||
.length = SZ_1M,
|
||||
.type = MT_DEVICE
|
||||
.type = MT_DEVICE,
|
||||
},
|
||||
};
|
||||
|
||||
|
@ -126,7 +103,7 @@ static struct s3c24xx_uart_clksrc anubis_serial_clocks[] = {
|
|||
.name = "pclk",
|
||||
.divisor = 1,
|
||||
.min_baud = 0,
|
||||
.max_baud = 0.
|
||||
.max_baud = 0,
|
||||
}
|
||||
};
|
||||
|
||||
|
@ -139,7 +116,7 @@ static struct s3c2410_uartcfg anubis_uartcfgs[] __initdata = {
|
|||
.ulcon = ULCON,
|
||||
.ufcon = UFCON,
|
||||
.clocks = anubis_serial_clocks,
|
||||
.clocks_size = ARRAY_SIZE(anubis_serial_clocks)
|
||||
.clocks_size = ARRAY_SIZE(anubis_serial_clocks),
|
||||
},
|
||||
[1] = {
|
||||
.hwport = 2,
|
||||
|
@ -148,7 +125,7 @@ static struct s3c2410_uartcfg anubis_uartcfgs[] __initdata = {
|
|||
.ulcon = ULCON,
|
||||
.ufcon = UFCON,
|
||||
.clocks = anubis_serial_clocks,
|
||||
.clocks_size = ARRAY_SIZE(anubis_serial_clocks)
|
||||
.clocks_size = ARRAY_SIZE(anubis_serial_clocks),
|
||||
},
|
||||
};
|
||||
|
||||
|
@ -162,7 +139,7 @@ static struct mtd_partition anubis_default_nand_part[] = {
|
|||
[0] = {
|
||||
.name = "Boot Agent",
|
||||
.size = SZ_16K,
|
||||
.offset = 0
|
||||
.offset = 0,
|
||||
},
|
||||
[1] = {
|
||||
.name = "/boot",
|
||||
|
@ -194,21 +171,21 @@ static struct s3c2410_nand_set anubis_nand_sets[] = {
|
|||
.nr_chips = 1,
|
||||
.nr_map = external_map,
|
||||
.nr_partitions = ARRAY_SIZE(anubis_default_nand_part),
|
||||
.partitions = anubis_default_nand_part
|
||||
.partitions = anubis_default_nand_part,
|
||||
},
|
||||
[0] = {
|
||||
.name = "chip0",
|
||||
.nr_chips = 1,
|
||||
.nr_map = chip0_map,
|
||||
.nr_partitions = ARRAY_SIZE(anubis_default_nand_part),
|
||||
.partitions = anubis_default_nand_part
|
||||
.partitions = anubis_default_nand_part,
|
||||
},
|
||||
[2] = {
|
||||
.name = "chip1",
|
||||
.nr_chips = 1,
|
||||
.nr_map = chip1_map,
|
||||
.nr_partitions = ARRAY_SIZE(anubis_default_nand_part),
|
||||
.partitions = anubis_default_nand_part
|
||||
.partitions = anubis_default_nand_part,
|
||||
},
|
||||
};
|
||||
|
||||
|
@ -313,7 +290,7 @@ static struct s3c24xx_board anubis_board __initdata = {
|
|||
.devices = anubis_devices,
|
||||
.devices_count = ARRAY_SIZE(anubis_devices),
|
||||
.clocks = anubis_clocks,
|
||||
.clocks_count = ARRAY_SIZE(anubis_clocks)
|
||||
.clocks_count = ARRAY_SIZE(anubis_clocks),
|
||||
};
|
||||
|
||||
static void __init anubis_map_io(void)
|
||||
|
|
|
@ -67,12 +67,12 @@ static struct map_desc osiris_iodesc[] __initdata = {
|
|||
.virtual = (u32)OSIRIS_VA_CTRL1,
|
||||
.pfn = __phys_to_pfn(OSIRIS_PA_CTRL1),
|
||||
.length = SZ_16K,
|
||||
.type = MT_DEVICE
|
||||
.type = MT_DEVICE,
|
||||
}, {
|
||||
.virtual = (u32)OSIRIS_VA_CTRL2,
|
||||
.pfn = __phys_to_pfn(OSIRIS_PA_CTRL2),
|
||||
.length = SZ_16K,
|
||||
.type = MT_DEVICE
|
||||
.type = MT_DEVICE,
|
||||
},
|
||||
};
|
||||
|
||||
|
@ -91,7 +91,7 @@ static struct s3c24xx_uart_clksrc osiris_serial_clocks[] = {
|
|||
.name = "pclk",
|
||||
.divisor = 1,
|
||||
.min_baud = 0,
|
||||
.max_baud = 0.
|
||||
.max_baud = 0,
|
||||
}
|
||||
};
|
||||
|
||||
|
@ -103,7 +103,7 @@ static struct s3c2410_uartcfg osiris_uartcfgs[] __initdata = {
|
|||
.ulcon = ULCON,
|
||||
.ufcon = UFCON,
|
||||
.clocks = osiris_serial_clocks,
|
||||
.clocks_size = ARRAY_SIZE(osiris_serial_clocks)
|
||||
.clocks_size = ARRAY_SIZE(osiris_serial_clocks),
|
||||
},
|
||||
[1] = {
|
||||
.hwport = 1,
|
||||
|
@ -112,7 +112,7 @@ static struct s3c2410_uartcfg osiris_uartcfgs[] __initdata = {
|
|||
.ulcon = ULCON,
|
||||
.ufcon = UFCON,
|
||||
.clocks = osiris_serial_clocks,
|
||||
.clocks_size = ARRAY_SIZE(osiris_serial_clocks)
|
||||
.clocks_size = ARRAY_SIZE(osiris_serial_clocks),
|
||||
},
|
||||
};
|
||||
|
||||
|
@ -126,7 +126,7 @@ static struct mtd_partition osiris_default_nand_part[] = {
|
|||
[0] = {
|
||||
.name = "Boot Agent",
|
||||
.size = SZ_16K,
|
||||
.offset = 0
|
||||
.offset = 0,
|
||||
},
|
||||
[1] = {
|
||||
.name = "/boot",
|
||||
|
@ -158,21 +158,21 @@ static struct s3c2410_nand_set osiris_nand_sets[] = {
|
|||
.nr_chips = 1,
|
||||
.nr_map = external_map,
|
||||
.nr_partitions = ARRAY_SIZE(osiris_default_nand_part),
|
||||
.partitions = osiris_default_nand_part
|
||||
.partitions = osiris_default_nand_part,
|
||||
},
|
||||
[0] = {
|
||||
.name = "chip0",
|
||||
.nr_chips = 1,
|
||||
.nr_map = chip0_map,
|
||||
.nr_partitions = ARRAY_SIZE(osiris_default_nand_part),
|
||||
.partitions = osiris_default_nand_part
|
||||
.partitions = osiris_default_nand_part,
|
||||
},
|
||||
[2] = {
|
||||
.name = "chip1",
|
||||
.nr_chips = 1,
|
||||
.nr_map = chip1_map,
|
||||
.nr_partitions = ARRAY_SIZE(osiris_default_nand_part),
|
||||
.partitions = osiris_default_nand_part
|
||||
.partitions = osiris_default_nand_part,
|
||||
},
|
||||
};
|
||||
|
||||
|
@ -245,7 +245,7 @@ static struct s3c24xx_board osiris_board __initdata = {
|
|||
.devices = osiris_devices,
|
||||
.devices_count = ARRAY_SIZE(osiris_devices),
|
||||
.clocks = osiris_clocks,
|
||||
.clocks_count = ARRAY_SIZE(osiris_clocks)
|
||||
.clocks_count = ARRAY_SIZE(osiris_clocks),
|
||||
};
|
||||
|
||||
static void __init osiris_map_io(void)
|
||||
|
|
|
@ -363,7 +363,9 @@ EXPORT_SYMBOL(__ioremap);
|
|||
|
||||
void __iounmap(void __iomem *addr)
|
||||
{
|
||||
#ifndef CONFIG_SMP
|
||||
struct vm_struct **p, *tmp;
|
||||
#endif
|
||||
unsigned int section_mapping = 0;
|
||||
|
||||
addr = (void __iomem *)(PAGE_MASK & (unsigned long)addr);
|
||||
|
|
|
@ -13,6 +13,7 @@
|
|||
#include <asm/cacheflush.h>
|
||||
#include <asm/proc-fns.h>
|
||||
#include <asm/tlbflush.h>
|
||||
#include <asm/page.h>
|
||||
|
||||
#ifndef MULTI_CPU
|
||||
EXPORT_SYMBOL(cpu_dcache_clean_area);
|
||||
|
@ -30,6 +31,13 @@ EXPORT_SYMBOL(__cpuc_coherent_kern_range);
|
|||
EXPORT_SYMBOL(cpu_cache);
|
||||
#endif
|
||||
|
||||
#ifndef MULTI_USER
|
||||
EXPORT_SYMBOL(__cpu_clear_user_page);
|
||||
EXPORT_SYMBOL(__cpu_copy_user_page);
|
||||
#else
|
||||
EXPORT_SYMBOL(cpu_user);
|
||||
#endif
|
||||
|
||||
/*
|
||||
* No module should need to touch the TLB (and currently
|
||||
* no modules do. We export this for "loadkernel" support
|
||||
|
|
|
@ -536,6 +536,11 @@ cpu_80200_name:
|
|||
.asciz "XScale-80200"
|
||||
.size cpu_80200_name, . - cpu_80200_name
|
||||
|
||||
.type cpu_80219_name, #object
|
||||
cpu_80219_name:
|
||||
.asciz "XScale-80219"
|
||||
.size cpu_80219_name, . - cpu_80219_name
|
||||
|
||||
.type cpu_8032x_name, #object
|
||||
cpu_8032x_name:
|
||||
.asciz "XScale-IOP8032x Family"
|
||||
|
@ -613,10 +618,33 @@ __80200_proc_info:
|
|||
.long xscale_cache_fns
|
||||
.size __80200_proc_info, . - __80200_proc_info
|
||||
|
||||
.type __80219_proc_info,#object
|
||||
__80219_proc_info:
|
||||
.long 0x69052e20
|
||||
.long 0xffffffe0
|
||||
.long PMD_TYPE_SECT | \
|
||||
PMD_SECT_BUFFERABLE | \
|
||||
PMD_SECT_CACHEABLE | \
|
||||
PMD_SECT_AP_WRITE | \
|
||||
PMD_SECT_AP_READ
|
||||
.long PMD_TYPE_SECT | \
|
||||
PMD_SECT_AP_WRITE | \
|
||||
PMD_SECT_AP_READ
|
||||
b __xscale_setup
|
||||
.long cpu_arch_name
|
||||
.long cpu_elf_name
|
||||
.long HWCAP_SWP|HWCAP_HALF|HWCAP_THUMB|HWCAP_FAST_MULT|HWCAP_EDSP
|
||||
.long cpu_80219_name
|
||||
.long xscale_processor_functions
|
||||
.long v4wbi_tlb_fns
|
||||
.long xscale_mc_user_fns
|
||||
.long xscale_cache_fns
|
||||
.size __80219_proc_info, . - __80219_proc_info
|
||||
|
||||
.type __8032x_proc_info,#object
|
||||
__8032x_proc_info:
|
||||
.long 0x69052420
|
||||
.long 0xfffff5e0 @ mask should accomodate IOP80219 also
|
||||
.long 0xffffffe0
|
||||
.long PMD_TYPE_SECT | \
|
||||
PMD_SECT_BUFFERABLE | \
|
||||
PMD_SECT_CACHEABLE | \
|
||||
|
|
|
@ -672,7 +672,7 @@ config MTRR
|
|||
See <file:Documentation/mtrr.txt> for more information.
|
||||
|
||||
config EFI
|
||||
bool "Boot from EFI support (EXPERIMENTAL)"
|
||||
bool "Boot from EFI support"
|
||||
depends on ACPI
|
||||
default n
|
||||
---help---
|
||||
|
|
|
@ -59,7 +59,8 @@ quiet_cmd_syscall = SYSCALL $@
|
|||
|
||||
export CPPFLAGS_vsyscall.lds += -P -C -U$(ARCH)
|
||||
|
||||
vsyscall-flags = -shared -s -Wl,-soname=linux-gate.so.1
|
||||
vsyscall-flags = -shared -s -Wl,-soname=linux-gate.so.1 \
|
||||
$(call ld-option, -Wl$(comma)--hash-style=sysv)
|
||||
SYSCFLAGS_vsyscall-sysenter.so = $(vsyscall-flags)
|
||||
SYSCFLAGS_vsyscall-int80.so = $(vsyscall-flags)
|
||||
|
||||
|
|
|
@ -759,7 +759,7 @@ static int __cpuinit cache_sysfs_init(void)
|
|||
if (num_cache_leaves == 0)
|
||||
return 0;
|
||||
|
||||
register_cpu_notifier(&cacheinfo_cpu_notifier);
|
||||
register_hotcpu_notifier(&cacheinfo_cpu_notifier);
|
||||
|
||||
for_each_online_cpu(i) {
|
||||
cacheinfo_cpu_callback(&cacheinfo_cpu_notifier, CPU_ONLINE,
|
||||
|
|
|
@ -9,6 +9,6 @@ void winchip_mcheck_init(struct cpuinfo_x86 *c);
|
|||
/* Call the installed machine check handler for this CPU setup. */
|
||||
extern fastcall void (*machine_check_vector)(struct pt_regs *, long error_code);
|
||||
|
||||
extern int mce_disabled __initdata;
|
||||
extern int mce_disabled;
|
||||
extern int nr_mce_banks;
|
||||
|
||||
|
|
|
@ -204,7 +204,7 @@ VM_MASK = 0x00020000
|
|||
ENTRY(ret_from_fork)
|
||||
CFI_STARTPROC
|
||||
pushl %eax
|
||||
CFI_ADJUST_CFA_OFFSET -4
|
||||
CFI_ADJUST_CFA_OFFSET 4
|
||||
call schedule_tail
|
||||
GET_THREAD_INFO(%ebp)
|
||||
popl %eax
|
||||
|
|
|
@ -256,11 +256,6 @@ static int __kprobes kprobe_handler(struct pt_regs *regs)
|
|||
int ret = 0;
|
||||
kprobe_opcode_t *addr;
|
||||
struct kprobe_ctlblk *kcb;
|
||||
#ifdef CONFIG_PREEMPT
|
||||
unsigned pre_preempt_count = preempt_count();
|
||||
#else
|
||||
unsigned pre_preempt_count = 1;
|
||||
#endif
|
||||
|
||||
addr = (kprobe_opcode_t *)(regs->eip - sizeof(kprobe_opcode_t));
|
||||
|
||||
|
@ -338,13 +333,15 @@ static int __kprobes kprobe_handler(struct pt_regs *regs)
|
|||
return 1;
|
||||
|
||||
ss_probe:
|
||||
if (pre_preempt_count && p->ainsn.boostable == 1 && !p->post_handler){
|
||||
#ifndef CONFIG_PREEMPT
|
||||
if (p->ainsn.boostable == 1 && !p->post_handler){
|
||||
/* Boost up -- we can execute copied instructions directly */
|
||||
reset_current_kprobe();
|
||||
regs->eip = (unsigned long)p->ainsn.insn;
|
||||
preempt_enable_no_resched();
|
||||
return 1;
|
||||
}
|
||||
#endif
|
||||
prepare_singlestep(p, regs);
|
||||
kcb->kprobe_status = KPROBE_HIT_SS;
|
||||
return 1;
|
||||
|
|
|
@ -189,14 +189,11 @@ NORET_TYPE void machine_kexec(struct kimage *image)
|
|||
memcpy((void *)reboot_code_buffer, relocate_new_kernel,
|
||||
relocate_new_kernel_size);
|
||||
|
||||
/* The segment registers are funny things, they are
|
||||
* automatically loaded from a table, in memory wherever you
|
||||
* set them to a specific selector, but this table is never
|
||||
* accessed again you set the segment to a different selector.
|
||||
*
|
||||
* The more common model is are caches where the behide
|
||||
* the scenes work is done, but is also dropped at arbitrary
|
||||
* times.
|
||||
/* The segment registers are funny things, they have both a
|
||||
* visible and an invisible part. Whenever the visible part is
|
||||
* set to a specific selector, the invisible part is loaded
|
||||
* with from a table in memory. At no other time is the
|
||||
* descriptor table in memory accessed.
|
||||
*
|
||||
* I take advantage of this here by force loading the
|
||||
* segments, before I zap the gdt with an invalid value.
|
||||
|
|
|
@ -575,6 +575,7 @@ void touch_nmi_watchdog (void)
|
|||
*/
|
||||
touch_softlockup_watchdog();
|
||||
}
|
||||
EXPORT_SYMBOL(touch_nmi_watchdog);
|
||||
|
||||
extern void die_nmi(struct pt_regs *, const char *msg);
|
||||
|
||||
|
|
|
@ -690,8 +690,8 @@ struct task_struct fastcall * __switch_to(struct task_struct *prev_p, struct tas
|
|||
/*
|
||||
* Now maybe handle debug registers and/or IO bitmaps
|
||||
*/
|
||||
if (unlikely((task_thread_info(next_p)->flags & _TIF_WORK_CTXSW))
|
||||
|| test_tsk_thread_flag(prev_p, TIF_IO_BITMAP))
|
||||
if (unlikely((task_thread_info(next_p)->flags & _TIF_WORK_CTXSW)
|
||||
|| test_tsk_thread_flag(prev_p, TIF_IO_BITMAP)))
|
||||
__switch_to_xtra(next_p, tss);
|
||||
|
||||
disable_tsc(prev_p, next_p);
|
||||
|
|
|
@ -212,14 +212,20 @@ valid_k7:
|
|||
* then we print a warning if not, and always resync.
|
||||
*/
|
||||
|
||||
static atomic_t tsc_start_flag = ATOMIC_INIT(0);
|
||||
static atomic_t tsc_count_start = ATOMIC_INIT(0);
|
||||
static atomic_t tsc_count_stop = ATOMIC_INIT(0);
|
||||
static unsigned long long tsc_values[NR_CPUS];
|
||||
static struct {
|
||||
atomic_t start_flag;
|
||||
atomic_t count_start;
|
||||
atomic_t count_stop;
|
||||
unsigned long long values[NR_CPUS];
|
||||
} tsc __initdata = {
|
||||
.start_flag = ATOMIC_INIT(0),
|
||||
.count_start = ATOMIC_INIT(0),
|
||||
.count_stop = ATOMIC_INIT(0),
|
||||
};
|
||||
|
||||
#define NR_LOOPS 5
|
||||
|
||||
static void __init synchronize_tsc_bp (void)
|
||||
static void __init synchronize_tsc_bp(void)
|
||||
{
|
||||
int i;
|
||||
unsigned long long t0;
|
||||
|
@ -233,7 +239,7 @@ static void __init synchronize_tsc_bp (void)
|
|||
/* convert from kcyc/sec to cyc/usec */
|
||||
one_usec = cpu_khz / 1000;
|
||||
|
||||
atomic_set(&tsc_start_flag, 1);
|
||||
atomic_set(&tsc.start_flag, 1);
|
||||
wmb();
|
||||
|
||||
/*
|
||||
|
@ -250,16 +256,16 @@ static void __init synchronize_tsc_bp (void)
|
|||
/*
|
||||
* all APs synchronize but they loop on '== num_cpus'
|
||||
*/
|
||||
while (atomic_read(&tsc_count_start) != num_booting_cpus()-1)
|
||||
while (atomic_read(&tsc.count_start) != num_booting_cpus()-1)
|
||||
cpu_relax();
|
||||
atomic_set(&tsc_count_stop, 0);
|
||||
atomic_set(&tsc.count_stop, 0);
|
||||
wmb();
|
||||
/*
|
||||
* this lets the APs save their current TSC:
|
||||
*/
|
||||
atomic_inc(&tsc_count_start);
|
||||
atomic_inc(&tsc.count_start);
|
||||
|
||||
rdtscll(tsc_values[smp_processor_id()]);
|
||||
rdtscll(tsc.values[smp_processor_id()]);
|
||||
/*
|
||||
* We clear the TSC in the last loop:
|
||||
*/
|
||||
|
@ -269,56 +275,54 @@ static void __init synchronize_tsc_bp (void)
|
|||
/*
|
||||
* Wait for all APs to leave the synchronization point:
|
||||
*/
|
||||
while (atomic_read(&tsc_count_stop) != num_booting_cpus()-1)
|
||||
while (atomic_read(&tsc.count_stop) != num_booting_cpus()-1)
|
||||
cpu_relax();
|
||||
atomic_set(&tsc_count_start, 0);
|
||||
atomic_set(&tsc.count_start, 0);
|
||||
wmb();
|
||||
atomic_inc(&tsc_count_stop);
|
||||
atomic_inc(&tsc.count_stop);
|
||||
}
|
||||
|
||||
sum = 0;
|
||||
for (i = 0; i < NR_CPUS; i++) {
|
||||
if (cpu_isset(i, cpu_callout_map)) {
|
||||
t0 = tsc_values[i];
|
||||
t0 = tsc.values[i];
|
||||
sum += t0;
|
||||
}
|
||||
}
|
||||
avg = sum;
|
||||
do_div(avg, num_booting_cpus());
|
||||
|
||||
sum = 0;
|
||||
for (i = 0; i < NR_CPUS; i++) {
|
||||
if (!cpu_isset(i, cpu_callout_map))
|
||||
continue;
|
||||
delta = tsc_values[i] - avg;
|
||||
delta = tsc.values[i] - avg;
|
||||
if (delta < 0)
|
||||
delta = -delta;
|
||||
/*
|
||||
* We report bigger than 2 microseconds clock differences.
|
||||
*/
|
||||
if (delta > 2*one_usec) {
|
||||
long realdelta;
|
||||
long long realdelta;
|
||||
|
||||
if (!buggy) {
|
||||
buggy = 1;
|
||||
printk("\n");
|
||||
}
|
||||
realdelta = delta;
|
||||
do_div(realdelta, one_usec);
|
||||
if (tsc_values[i] < avg)
|
||||
if (tsc.values[i] < avg)
|
||||
realdelta = -realdelta;
|
||||
|
||||
if (realdelta > 0)
|
||||
printk(KERN_INFO "CPU#%d had %ld usecs TSC "
|
||||
if (realdelta)
|
||||
printk(KERN_INFO "CPU#%d had %Ld usecs TSC "
|
||||
"skew, fixed it up.\n", i, realdelta);
|
||||
}
|
||||
|
||||
sum += delta;
|
||||
}
|
||||
if (!buggy)
|
||||
printk("passed.\n");
|
||||
}
|
||||
|
||||
static void __init synchronize_tsc_ap (void)
|
||||
static void __init synchronize_tsc_ap(void)
|
||||
{
|
||||
int i;
|
||||
|
||||
|
@ -327,20 +331,20 @@ static void __init synchronize_tsc_ap (void)
|
|||
* this gets called, so we first wait for the BP to
|
||||
* finish SMP initialization:
|
||||
*/
|
||||
while (!atomic_read(&tsc_start_flag))
|
||||
while (!atomic_read(&tsc.start_flag))
|
||||
cpu_relax();
|
||||
|
||||
for (i = 0; i < NR_LOOPS; i++) {
|
||||
atomic_inc(&tsc_count_start);
|
||||
while (atomic_read(&tsc_count_start) != num_booting_cpus())
|
||||
atomic_inc(&tsc.count_start);
|
||||
while (atomic_read(&tsc.count_start) != num_booting_cpus())
|
||||
cpu_relax();
|
||||
|
||||
rdtscll(tsc_values[smp_processor_id()]);
|
||||
rdtscll(tsc.values[smp_processor_id()]);
|
||||
if (i == NR_LOOPS-1)
|
||||
write_tsc(0, 0);
|
||||
|
||||
atomic_inc(&tsc_count_stop);
|
||||
while (atomic_read(&tsc_count_stop) != num_booting_cpus())
|
||||
atomic_inc(&tsc.count_stop);
|
||||
while (atomic_read(&tsc.count_stop) != num_booting_cpus())
|
||||
cpu_relax();
|
||||
}
|
||||
}
|
||||
|
|
|
@ -135,7 +135,7 @@ unsigned long profile_pc(struct pt_regs *regs)
|
|||
{
|
||||
unsigned long pc = instruction_pointer(regs);
|
||||
|
||||
if (in_lock_functions(pc))
|
||||
if (!user_mode_vm(regs) && in_lock_functions(pc))
|
||||
return *(unsigned long *)(regs->ebp + 4);
|
||||
|
||||
return pc;
|
||||
|
|
|
@ -187,10 +187,21 @@ static void show_trace_log_lvl(struct task_struct *task, struct pt_regs *regs,
|
|||
if (unwind_init_blocked(&info, task) == 0)
|
||||
unw_ret = show_trace_unwind(&info, log_lvl);
|
||||
}
|
||||
if (unw_ret > 0) {
|
||||
if (call_trace > 0)
|
||||
if (unw_ret > 0 && !arch_unw_user_mode(&info)) {
|
||||
#ifdef CONFIG_STACK_UNWIND
|
||||
print_symbol("DWARF2 unwinder stuck at %s\n",
|
||||
UNW_PC(&info));
|
||||
if (call_trace == 1) {
|
||||
printk("Leftover inexact backtrace:\n");
|
||||
if (UNW_SP(&info))
|
||||
stack = (void *)UNW_SP(&info);
|
||||
} else if (call_trace > 1)
|
||||
return;
|
||||
printk("%sLegacy call trace:\n", log_lvl);
|
||||
else
|
||||
printk("Full inexact backtrace again:\n");
|
||||
#else
|
||||
printk("Inexact backtrace:\n");
|
||||
#endif
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -442,11 +453,9 @@ void die(const char * str, struct pt_regs * regs, long err)
|
|||
if (in_interrupt())
|
||||
panic("Fatal exception in interrupt");
|
||||
|
||||
if (panic_on_oops) {
|
||||
printk(KERN_EMERG "Fatal exception: panic in 5 seconds\n");
|
||||
ssleep(5);
|
||||
panic("Fatal exception");
|
||||
}
|
||||
if (panic_on_oops)
|
||||
panic("Fatal exception: panic_on_oops");
|
||||
|
||||
oops_exit();
|
||||
do_exit(SIGSEGV);
|
||||
}
|
||||
|
@ -1238,8 +1247,10 @@ static int __init call_trace_setup(char *s)
|
|||
call_trace = -1;
|
||||
else if (strcmp(s, "both") == 0)
|
||||
call_trace = 0;
|
||||
else if (strcmp(s, "new") == 0)
|
||||
else if (strcmp(s, "newfallback") == 0)
|
||||
call_trace = 1;
|
||||
else if (strcmp(s, "new") == 2)
|
||||
call_trace = 2;
|
||||
return 1;
|
||||
}
|
||||
__setup("call_trace=", call_trace_setup);
|
||||
|
|
|
@ -10,6 +10,7 @@ SECTIONS
|
|||
. = VDSO_PRELINK + SIZEOF_HEADERS;
|
||||
|
||||
.hash : { *(.hash) } :text
|
||||
.gnu.hash : { *(.gnu.hash) }
|
||||
.dynsym : { *(.dynsym) }
|
||||
.dynstr : { *(.dynstr) }
|
||||
.gnu.version : { *(.gnu.version) }
|
||||
|
|
|
@ -363,7 +363,7 @@ CONFIG_BLK_DEV_IDECD=y
|
|||
#
|
||||
CONFIG_IDE_GENERIC=y
|
||||
CONFIG_BLK_DEV_IDEPCI=y
|
||||
# CONFIG_IDEPCI_SHARE_IRQ is not set
|
||||
CONFIG_IDEPCI_SHARE_IRQ=y
|
||||
# CONFIG_BLK_DEV_OFFBOARD is not set
|
||||
# CONFIG_BLK_DEV_GENERIC is not set
|
||||
# CONFIG_BLK_DEV_OPTI621 is not set
|
||||
|
|
|
@ -366,7 +366,7 @@ CONFIG_BLK_DEV_IDESCSI=m
|
|||
# CONFIG_IDE_GENERIC is not set
|
||||
# CONFIG_BLK_DEV_IDEPNP is not set
|
||||
CONFIG_BLK_DEV_IDEPCI=y
|
||||
# CONFIG_IDEPCI_SHARE_IRQ is not set
|
||||
CONFIG_IDEPCI_SHARE_IRQ=y
|
||||
# CONFIG_BLK_DEV_OFFBOARD is not set
|
||||
CONFIG_BLK_DEV_GENERIC=y
|
||||
# CONFIG_BLK_DEV_OPTI621 is not set
|
||||
|
|
|
@ -45,7 +45,8 @@ CPPFLAGS_gate.lds := -P -C -U$(ARCH)
|
|||
quiet_cmd_gate = GATE $@
|
||||
cmd_gate = $(CC) -nostdlib $(GATECFLAGS_$(@F)) -Wl,-T,$(filter-out FORCE,$^) -o $@
|
||||
|
||||
GATECFLAGS_gate.so = -shared -s -Wl,-soname=linux-gate.so.1
|
||||
GATECFLAGS_gate.so = -shared -s -Wl,-soname=linux-gate.so.1 \
|
||||
$(call ld-option, -Wl$(comma)--hash-style=sysv)
|
||||
$(obj)/gate.so: $(obj)/gate.lds $(obj)/gate.o FORCE
|
||||
$(call if_changed,gate)
|
||||
|
||||
|
|
|
@ -12,6 +12,7 @@ SECTIONS
|
|||
. = GATE_ADDR + SIZEOF_HEADERS;
|
||||
|
||||
.hash : { *(.hash) } :readable
|
||||
.gnu.hash : { *(.gnu.hash) }
|
||||
.dynsym : { *(.dynsym) }
|
||||
.dynstr : { *(.dynstr) }
|
||||
.gnu.version : { *(.gnu.version) }
|
||||
|
|
|
@ -448,11 +448,20 @@ int __kprobes arch_prepare_kprobe(struct kprobe *p)
|
|||
return 0;
|
||||
}
|
||||
|
||||
void __kprobes flush_insn_slot(struct kprobe *p)
|
||||
{
|
||||
unsigned long arm_addr;
|
||||
|
||||
arm_addr = ((unsigned long)&p->opcode.bundle) & ~0xFULL;
|
||||
flush_icache_range(arm_addr, arm_addr + sizeof(bundle_t));
|
||||
}
|
||||
|
||||
void __kprobes arch_arm_kprobe(struct kprobe *p)
|
||||
{
|
||||
unsigned long addr = (unsigned long)p->addr;
|
||||
unsigned long arm_addr = addr & ~0xFULL;
|
||||
|
||||
flush_insn_slot(p);
|
||||
memcpy((char *)arm_addr, &p->ainsn.insn.bundle, sizeof(bundle_t));
|
||||
flush_icache_range(arm_addr, arm_addr + sizeof(bundle_t));
|
||||
}
|
||||
|
|
|
@ -958,9 +958,9 @@ remove_palinfo_proc_entries(unsigned int hcpu)
|
|||
}
|
||||
}
|
||||
|
||||
static int __cpuinit palinfo_cpu_callback(struct notifier_block *nfb,
|
||||
unsigned long action,
|
||||
void *hcpu)
|
||||
#ifdef CONFIG_HOTPLUG_CPU
|
||||
static int palinfo_cpu_callback(struct notifier_block *nfb,
|
||||
unsigned long action, void *hcpu)
|
||||
{
|
||||
unsigned int hotcpu = (unsigned long)hcpu;
|
||||
|
||||
|
@ -968,20 +968,19 @@ static int __cpuinit palinfo_cpu_callback(struct notifier_block *nfb,
|
|||
case CPU_ONLINE:
|
||||
create_palinfo_proc_entries(hotcpu);
|
||||
break;
|
||||
#ifdef CONFIG_HOTPLUG_CPU
|
||||
case CPU_DEAD:
|
||||
remove_palinfo_proc_entries(hotcpu);
|
||||
break;
|
||||
#endif
|
||||
}
|
||||
return NOTIFY_OK;
|
||||
}
|
||||
|
||||
static struct notifier_block __cpuinitdata palinfo_cpu_notifier =
|
||||
static struct notifier_block palinfo_cpu_notifier =
|
||||
{
|
||||
.notifier_call = palinfo_cpu_callback,
|
||||
.priority = 0,
|
||||
};
|
||||
#endif
|
||||
|
||||
static int __init
|
||||
palinfo_init(void)
|
||||
|
@ -1020,7 +1019,7 @@ palinfo_exit(void)
|
|||
/*
|
||||
* Unregister from cpu notifier callbacks
|
||||
*/
|
||||
unregister_cpu_notifier(&palinfo_cpu_notifier);
|
||||
unregister_hotcpu_notifier(&palinfo_cpu_notifier);
|
||||
}
|
||||
|
||||
module_init(palinfo_init);
|
||||
|
|
|
@ -435,7 +435,7 @@ static int __cpuinit cache_sysfs_init(void)
|
|||
(void *)(long)i);
|
||||
}
|
||||
|
||||
register_cpu_notifier(&cache_cpu_notifier);
|
||||
register_hotcpu_notifier(&cache_cpu_notifier);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
|
|
@ -117,11 +117,8 @@ die (const char *str, struct pt_regs *regs, long err)
|
|||
die.lock_owner = -1;
|
||||
spin_unlock_irq(&die.lock);
|
||||
|
||||
if (panic_on_oops) {
|
||||
printk(KERN_EMERG "Fatal exception: panic in 5 seconds\n");
|
||||
ssleep(5);
|
||||
panic("Fatal exception");
|
||||
}
|
||||
if (panic_on_oops)
|
||||
panic("Fatal exception: panic_on_oops");
|
||||
|
||||
do_exit(SIGSEGV);
|
||||
}
|
||||
|
|
|
@ -204,6 +204,7 @@ SECTIONS
|
|||
*(.dynstr)
|
||||
*(.dynamic)
|
||||
*(.hash)
|
||||
*(.gnu.hash)
|
||||
#endif
|
||||
}
|
||||
|
||||
|
|
|
@ -504,7 +504,7 @@ config CPU_FREQ_PMAC
|
|||
|
||||
config CPU_FREQ_PMAC64
|
||||
bool "Support for some Apple G5s"
|
||||
depends on CPU_FREQ && PMAC_SMU && PPC64
|
||||
depends on CPU_FREQ && PPC64
|
||||
select CPU_FREQ_TABLE
|
||||
help
|
||||
This adds support for frequency switching on Apple iMac G5,
|
||||
|
|
|
@ -1,16 +1,18 @@
|
|||
#
|
||||
# Automatically generated make config: don't edit
|
||||
# Linux kernel version: 2.6.17-rc5
|
||||
# Mon May 29 14:47:49 2006
|
||||
# Linux kernel version: 2.6.17
|
||||
# Mon Jul 3 14:20:49 2006
|
||||
#
|
||||
# CONFIG_PPC64 is not set
|
||||
CONFIG_PPC32=y
|
||||
CONFIG_PPC_MERGE=y
|
||||
CONFIG_MMU=y
|
||||
CONFIG_GENERIC_HARDIRQS=y
|
||||
CONFIG_IRQ_PER_CPU=y
|
||||
CONFIG_RWSEM_XCHGADD_ALGORITHM=y
|
||||
CONFIG_GENERIC_HWEIGHT=y
|
||||
CONFIG_GENERIC_CALIBRATE_DELAY=y
|
||||
CONFIG_GENERIC_FIND_NEXT_BIT=y
|
||||
CONFIG_PPC=y
|
||||
CONFIG_EARLY_PRINTK=y
|
||||
CONFIG_GENERIC_NVRAM=y
|
||||
|
@ -29,6 +31,7 @@ CONFIG_CLASSIC32=y
|
|||
# CONFIG_PPC_82xx is not set
|
||||
# CONFIG_PPC_83xx is not set
|
||||
# CONFIG_PPC_85xx is not set
|
||||
# CONFIG_PPC_86xx is not set
|
||||
# CONFIG_40x is not set
|
||||
# CONFIG_44x is not set
|
||||
# CONFIG_8xx is not set
|
||||
|
@ -39,6 +42,7 @@ CONFIG_ALTIVEC=y
|
|||
CONFIG_PPC_STD_MMU=y
|
||||
CONFIG_PPC_STD_MMU_32=y
|
||||
# CONFIG_SMP is not set
|
||||
CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config"
|
||||
|
||||
#
|
||||
# Code maturity level options
|
||||
|
@ -72,10 +76,12 @@ CONFIG_PRINTK=y
|
|||
CONFIG_BUG=y
|
||||
CONFIG_ELF_CORE=y
|
||||
CONFIG_BASE_FULL=y
|
||||
CONFIG_RT_MUTEXES=y
|
||||
CONFIG_FUTEX=y
|
||||
CONFIG_EPOLL=y
|
||||
CONFIG_SHMEM=y
|
||||
CONFIG_SLAB=y
|
||||
CONFIG_VM_EVENT_COUNTERS=y
|
||||
# CONFIG_TINY_SHMEM is not set
|
||||
CONFIG_BASE_SMALL=0
|
||||
# CONFIG_SLOB is not set
|
||||
|
@ -119,6 +125,9 @@ CONFIG_PPC_MULTIPLATFORM=y
|
|||
# CONFIG_APUS is not set
|
||||
# CONFIG_PPC_CHRP is not set
|
||||
CONFIG_PPC_PMAC=y
|
||||
# CONFIG_PPC_CELL is not set
|
||||
# CONFIG_PPC_CELL_NATIVE is not set
|
||||
# CONFIG_UDBG_RTAS_CONSOLE is not set
|
||||
CONFIG_MPIC=y
|
||||
# CONFIG_PPC_RTAS is not set
|
||||
# CONFIG_MMIO_NVRAM is not set
|
||||
|
@ -154,6 +163,7 @@ CONFIG_PREEMPT_NONE=y
|
|||
# CONFIG_PREEMPT is not set
|
||||
CONFIG_BINFMT_ELF=y
|
||||
CONFIG_BINFMT_MISC=m
|
||||
CONFIG_ARCH_ENABLE_MEMORY_HOTPLUG=y
|
||||
# CONFIG_KEXEC is not set
|
||||
CONFIG_ARCH_FLATMEM_ENABLE=y
|
||||
CONFIG_SELECT_MEMORY_MODEL=y
|
||||
|
@ -164,6 +174,7 @@ CONFIG_FLATMEM=y
|
|||
CONFIG_FLAT_NODE_MEM_MAP=y
|
||||
# CONFIG_SPARSEMEM_STATIC is not set
|
||||
CONFIG_SPLIT_PTLOCK_CPUS=4
|
||||
# CONFIG_RESOURCES_64BIT is not set
|
||||
CONFIG_PROC_DEVICETREE=y
|
||||
# CONFIG_CMDLINE_BOOL is not set
|
||||
CONFIG_PM=y
|
||||
|
@ -182,6 +193,7 @@ CONFIG_GENERIC_ISA_DMA=y
|
|||
CONFIG_PPC_INDIRECT_PCI=y
|
||||
CONFIG_PCI=y
|
||||
CONFIG_PCI_DOMAINS=y
|
||||
# CONFIG_PCIEPORTBUS is not set
|
||||
# CONFIG_PCI_DEBUG is not set
|
||||
|
||||
#
|
||||
|
@ -256,6 +268,8 @@ CONFIG_INET_ESP=y
|
|||
# CONFIG_INET_IPCOMP is not set
|
||||
# CONFIG_INET_XFRM_TUNNEL is not set
|
||||
# CONFIG_INET_TUNNEL is not set
|
||||
# CONFIG_INET_XFRM_MODE_TRANSPORT is not set
|
||||
# CONFIG_INET_XFRM_MODE_TUNNEL is not set
|
||||
CONFIG_INET_DIAG=y
|
||||
CONFIG_INET_TCP_DIAG=y
|
||||
# CONFIG_TCP_CONG_ADVANCED is not set
|
||||
|
@ -268,6 +282,7 @@ CONFIG_TCP_CONG_BIC=y
|
|||
# CONFIG_IPV6 is not set
|
||||
# CONFIG_INET6_XFRM_TUNNEL is not set
|
||||
# CONFIG_INET6_TUNNEL is not set
|
||||
# CONFIG_NETWORK_SECMARK is not set
|
||||
CONFIG_NETFILTER=y
|
||||
# CONFIG_NETFILTER_DEBUG is not set
|
||||
|
||||
|
@ -292,9 +307,11 @@ CONFIG_NETFILTER_XT_MATCH_MARK=m
|
|||
CONFIG_NETFILTER_XT_MATCH_POLICY=m
|
||||
CONFIG_NETFILTER_XT_MATCH_MULTIPORT=m
|
||||
CONFIG_NETFILTER_XT_MATCH_PKTTYPE=m
|
||||
# CONFIG_NETFILTER_XT_MATCH_QUOTA is not set
|
||||
CONFIG_NETFILTER_XT_MATCH_REALM=m
|
||||
CONFIG_NETFILTER_XT_MATCH_SCTP=m
|
||||
CONFIG_NETFILTER_XT_MATCH_STATE=m
|
||||
# CONFIG_NETFILTER_XT_MATCH_STATISTIC is not set
|
||||
CONFIG_NETFILTER_XT_MATCH_STRING=m
|
||||
CONFIG_NETFILTER_XT_MATCH_TCPMSS=m
|
||||
|
||||
|
@ -313,6 +330,7 @@ CONFIG_IP_NF_TFTP=m
|
|||
CONFIG_IP_NF_AMANDA=m
|
||||
CONFIG_IP_NF_PPTP=m
|
||||
CONFIG_IP_NF_H323=m
|
||||
# CONFIG_IP_NF_SIP is not set
|
||||
# CONFIG_IP_NF_QUEUE is not set
|
||||
CONFIG_IP_NF_IPTABLES=m
|
||||
CONFIG_IP_NF_MATCH_IPRANGE=m
|
||||
|
@ -457,6 +475,7 @@ CONFIG_IRTTY_SIR=m
|
|||
# CONFIG_ALI_FIR is not set
|
||||
# CONFIG_VLSI_FIR is not set
|
||||
# CONFIG_VIA_FIR is not set
|
||||
# CONFIG_MCS_FIR is not set
|
||||
CONFIG_BT=m
|
||||
CONFIG_BT_L2CAP=m
|
||||
CONFIG_BT_SCO=m
|
||||
|
@ -500,6 +519,7 @@ CONFIG_WIRELESS_EXT=y
|
|||
CONFIG_PREVENT_FIRMWARE_BUILD=y
|
||||
CONFIG_FW_LOADER=y
|
||||
# CONFIG_DEBUG_DRIVER is not set
|
||||
# CONFIG_SYS_HYPERVISOR is not set
|
||||
|
||||
#
|
||||
# Connector - unified userspace <-> kernelspace linker
|
||||
|
@ -600,7 +620,6 @@ CONFIG_BLK_DEV_PDC202XX_NEW=y
|
|||
CONFIG_BLK_DEV_IDE_PMAC=y
|
||||
CONFIG_BLK_DEV_IDE_PMAC_ATA100FIRST=y
|
||||
CONFIG_BLK_DEV_IDEDMA_PMAC=y
|
||||
CONFIG_BLK_DEV_IDE_PMAC_BLINK=y
|
||||
# CONFIG_IDE_ARM is not set
|
||||
CONFIG_BLK_DEV_IDEDMA=y
|
||||
# CONFIG_IDEDMA_IVB is not set
|
||||
|
@ -661,6 +680,7 @@ CONFIG_SCSI_AIC7XXX_OLD=m
|
|||
# CONFIG_MEGARAID_LEGACY is not set
|
||||
# CONFIG_MEGARAID_SAS is not set
|
||||
# CONFIG_SCSI_SATA is not set
|
||||
# CONFIG_SCSI_HPTIOP is not set
|
||||
# CONFIG_SCSI_BUSLOGIC is not set
|
||||
# CONFIG_SCSI_DMX3191D is not set
|
||||
# CONFIG_SCSI_EATA is not set
|
||||
|
@ -705,9 +725,7 @@ CONFIG_MD_LINEAR=m
|
|||
CONFIG_MD_RAID0=m
|
||||
CONFIG_MD_RAID1=m
|
||||
CONFIG_MD_RAID10=m
|
||||
CONFIG_MD_RAID5=m
|
||||
CONFIG_MD_RAID5_RESHAPE=y
|
||||
CONFIG_MD_RAID6=m
|
||||
# CONFIG_MD_RAID456 is not set
|
||||
CONFIG_MD_MULTIPATH=m
|
||||
CONFIG_MD_FAULTY=m
|
||||
CONFIG_BLK_DEV_DM=m
|
||||
|
@ -750,7 +768,6 @@ CONFIG_IEEE1394_OHCI1394=m
|
|||
#
|
||||
CONFIG_IEEE1394_VIDEO1394=m
|
||||
CONFIG_IEEE1394_SBP2=m
|
||||
# CONFIG_IEEE1394_SBP2_PHYS_DMA is not set
|
||||
# CONFIG_IEEE1394_ETH1394 is not set
|
||||
CONFIG_IEEE1394_DV1394=m
|
||||
CONFIG_IEEE1394_RAWIO=m
|
||||
|
@ -766,9 +783,12 @@ CONFIG_IEEE1394_RAWIO=m
|
|||
CONFIG_ADB=y
|
||||
CONFIG_ADB_CUDA=y
|
||||
CONFIG_ADB_PMU=y
|
||||
CONFIG_ADB_PMU_LED=y
|
||||
CONFIG_ADB_PMU_LED_IDE=y
|
||||
CONFIG_PMAC_APM_EMU=m
|
||||
CONFIG_PMAC_MEDIABAY=y
|
||||
CONFIG_PMAC_BACKLIGHT=y
|
||||
CONFIG_PMAC_BACKLIGHT_LEGACY=y
|
||||
CONFIG_INPUT_ADBHID=y
|
||||
CONFIG_MAC_EMUMOUSEBTN=y
|
||||
CONFIG_THERM_WINDTUNNEL=m
|
||||
|
@ -858,6 +878,7 @@ CONFIG_PCNET32=y
|
|||
# CONFIG_CHELSIO_T1 is not set
|
||||
# CONFIG_IXGB is not set
|
||||
# CONFIG_S2IO is not set
|
||||
# CONFIG_MYRI10GE is not set
|
||||
|
||||
#
|
||||
# Token Ring devices
|
||||
|
@ -908,6 +929,7 @@ CONFIG_APPLE_AIRPORT=m
|
|||
# Prism GT/Duette 802.11(a/b/g) PCI/Cardbus support
|
||||
#
|
||||
CONFIG_PRISM54=m
|
||||
# CONFIG_USB_ZD1201 is not set
|
||||
# CONFIG_HOSTAP is not set
|
||||
CONFIG_NET_WIRELESS=y
|
||||
|
||||
|
@ -998,6 +1020,7 @@ CONFIG_SERIO=y
|
|||
CONFIG_VT=y
|
||||
CONFIG_VT_CONSOLE=y
|
||||
CONFIG_HW_CONSOLE=y
|
||||
# CONFIG_VT_HW_CONSOLE_BINDING is not set
|
||||
# CONFIG_SERIAL_NONSTANDARD is not set
|
||||
|
||||
#
|
||||
|
@ -1029,6 +1052,7 @@ CONFIG_LEGACY_PTY_COUNT=256
|
|||
# Watchdog Cards
|
||||
#
|
||||
# CONFIG_WATCHDOG is not set
|
||||
# CONFIG_HW_RANDOM is not set
|
||||
CONFIG_NVRAM=y
|
||||
CONFIG_GEN_RTC=y
|
||||
# CONFIG_GEN_RTC_X is not set
|
||||
|
@ -1040,6 +1064,7 @@ CONFIG_GEN_RTC=y
|
|||
# Ftape, the floppy tape device driver
|
||||
#
|
||||
CONFIG_AGP=m
|
||||
# CONFIG_AGP_SIS is not set
|
||||
# CONFIG_AGP_VIA is not set
|
||||
CONFIG_AGP_UNINORTH=m
|
||||
CONFIG_DRM=m
|
||||
|
@ -1092,6 +1117,7 @@ CONFIG_I2C_ALGOBIT=y
|
|||
CONFIG_I2C_POWERMAC=y
|
||||
# CONFIG_I2C_MPC is not set
|
||||
# CONFIG_I2C_NFORCE2 is not set
|
||||
# CONFIG_I2C_OCORES is not set
|
||||
# CONFIG_I2C_PARPORT_LIGHT is not set
|
||||
# CONFIG_I2C_PROSAVAGE is not set
|
||||
# CONFIG_I2C_SAVAGE4 is not set
|
||||
|
@ -1156,12 +1182,13 @@ CONFIG_VIDEO_V4L2=y
|
|||
#
|
||||
# Graphics support
|
||||
#
|
||||
# CONFIG_FIRMWARE_EDID is not set
|
||||
CONFIG_FB=y
|
||||
CONFIG_FB_CFB_FILLRECT=y
|
||||
CONFIG_FB_CFB_COPYAREA=y
|
||||
CONFIG_FB_CFB_IMAGEBLIT=y
|
||||
CONFIG_FB_MACMODES=y
|
||||
CONFIG_FB_FIRMWARE_EDID=y
|
||||
CONFIG_FB_BACKLIGHT=y
|
||||
CONFIG_FB_MODE_HELPERS=y
|
||||
CONFIG_FB_TILEBLITTING=y
|
||||
# CONFIG_FB_CIRRUS is not set
|
||||
|
@ -1178,6 +1205,7 @@ CONFIG_FB_IMSTT=y
|
|||
# CONFIG_FB_S1D13XXX is not set
|
||||
CONFIG_FB_NVIDIA=y
|
||||
CONFIG_FB_NVIDIA_I2C=y
|
||||
CONFIG_FB_NVIDIA_BACKLIGHT=y
|
||||
# CONFIG_FB_RIVA is not set
|
||||
CONFIG_FB_MATROX=y
|
||||
CONFIG_FB_MATROX_MILLENIUM=y
|
||||
|
@ -1187,12 +1215,15 @@ CONFIG_FB_MATROX_MYSTIQUE=y
|
|||
# CONFIG_FB_MATROX_MULTIHEAD is not set
|
||||
CONFIG_FB_RADEON=y
|
||||
CONFIG_FB_RADEON_I2C=y
|
||||
CONFIG_FB_RADEON_BACKLIGHT=y
|
||||
# CONFIG_FB_RADEON_DEBUG is not set
|
||||
CONFIG_FB_ATY128=y
|
||||
CONFIG_FB_ATY128_BACKLIGHT=y
|
||||
CONFIG_FB_ATY=y
|
||||
CONFIG_FB_ATY_CT=y
|
||||
# CONFIG_FB_ATY_GENERIC_LCD is not set
|
||||
CONFIG_FB_ATY_GX=y
|
||||
CONFIG_FB_ATY_BACKLIGHT=y
|
||||
# CONFIG_FB_SAVAGE is not set
|
||||
# CONFIG_FB_SIS is not set
|
||||
# CONFIG_FB_NEOMAGIC is not set
|
||||
|
@ -1221,7 +1252,11 @@ CONFIG_LOGO=y
|
|||
CONFIG_LOGO_LINUX_MONO=y
|
||||
CONFIG_LOGO_LINUX_VGA16=y
|
||||
CONFIG_LOGO_LINUX_CLUT224=y
|
||||
# CONFIG_BACKLIGHT_LCD_SUPPORT is not set
|
||||
CONFIG_BACKLIGHT_LCD_SUPPORT=y
|
||||
CONFIG_BACKLIGHT_CLASS_DEVICE=y
|
||||
CONFIG_BACKLIGHT_DEVICE=y
|
||||
CONFIG_LCD_CLASS_DEVICE=m
|
||||
CONFIG_LCD_DEVICE=y
|
||||
|
||||
#
|
||||
# Sound
|
||||
|
@ -1278,6 +1313,18 @@ CONFIG_SND_DUMMY=m
|
|||
# CONFIG_SND_CMIPCI is not set
|
||||
# CONFIG_SND_CS4281 is not set
|
||||
# CONFIG_SND_CS46XX is not set
|
||||
# CONFIG_SND_DARLA20 is not set
|
||||
# CONFIG_SND_GINA20 is not set
|
||||
# CONFIG_SND_LAYLA20 is not set
|
||||
# CONFIG_SND_DARLA24 is not set
|
||||
# CONFIG_SND_GINA24 is not set
|
||||
# CONFIG_SND_LAYLA24 is not set
|
||||
# CONFIG_SND_MONA is not set
|
||||
# CONFIG_SND_MIA is not set
|
||||
# CONFIG_SND_ECHO3G is not set
|
||||
# CONFIG_SND_INDIGO is not set
|
||||
# CONFIG_SND_INDIGOIO is not set
|
||||
# CONFIG_SND_INDIGODJ is not set
|
||||
# CONFIG_SND_EMU10K1 is not set
|
||||
# CONFIG_SND_EMU10K1X is not set
|
||||
# CONFIG_SND_ENS1370 is not set
|
||||
|
@ -1314,6 +1361,17 @@ CONFIG_SND_DUMMY=m
|
|||
CONFIG_SND_POWERMAC=m
|
||||
CONFIG_SND_POWERMAC_AUTO_DRC=y
|
||||
|
||||
#
|
||||
# Apple Onboard Audio driver
|
||||
#
|
||||
CONFIG_SND_AOA=m
|
||||
CONFIG_SND_AOA_FABRIC_LAYOUT=m
|
||||
CONFIG_SND_AOA_ONYX=m
|
||||
CONFIG_SND_AOA_TAS=m
|
||||
CONFIG_SND_AOA_TOONIE=m
|
||||
CONFIG_SND_AOA_SOUNDBUS=m
|
||||
CONFIG_SND_AOA_SOUNDBUS_I2S=m
|
||||
|
||||
#
|
||||
# USB devices
|
||||
#
|
||||
|
@ -1355,6 +1413,7 @@ CONFIG_USB_DYNAMIC_MINORS=y
|
|||
CONFIG_USB_EHCI_HCD=m
|
||||
CONFIG_USB_EHCI_SPLIT_ISO=y
|
||||
CONFIG_USB_EHCI_ROOT_HUB_TT=y
|
||||
# CONFIG_USB_EHCI_TT_NEWSCHED is not set
|
||||
# CONFIG_USB_ISP116X_HCD is not set
|
||||
CONFIG_USB_OHCI_HCD=y
|
||||
# CONFIG_USB_OHCI_BIG_ENDIAN is not set
|
||||
|
@ -1431,7 +1490,6 @@ CONFIG_USB_NET_NET1080=m
|
|||
# CONFIG_USB_NET_RNDIS_HOST is not set
|
||||
# CONFIG_USB_NET_CDC_SUBSET is not set
|
||||
CONFIG_USB_NET_ZAURUS=m
|
||||
# CONFIG_USB_ZD1201 is not set
|
||||
CONFIG_USB_MON=y
|
||||
|
||||
#
|
||||
|
@ -1499,10 +1557,12 @@ CONFIG_USB_EZUSB=y
|
|||
# CONFIG_USB_LEGOTOWER is not set
|
||||
# CONFIG_USB_LCD is not set
|
||||
# CONFIG_USB_LED is not set
|
||||
# CONFIG_USB_CY7C63 is not set
|
||||
# CONFIG_USB_CYTHERM is not set
|
||||
# CONFIG_USB_PHIDGETKIT is not set
|
||||
# CONFIG_USB_PHIDGETSERVO is not set
|
||||
# CONFIG_USB_IDMOUSE is not set
|
||||
CONFIG_USB_APPLEDISPLAY=m
|
||||
# CONFIG_USB_SISUSBVGA is not set
|
||||
# CONFIG_USB_LD is not set
|
||||
# CONFIG_USB_TEST is not set
|
||||
|
@ -1524,7 +1584,8 @@ CONFIG_USB_EZUSB=y
|
|||
#
|
||||
# LED devices
|
||||
#
|
||||
# CONFIG_NEW_LEDS is not set
|
||||
CONFIG_NEW_LEDS=y
|
||||
CONFIG_LEDS_CLASS=y
|
||||
|
||||
#
|
||||
# LED drivers
|
||||
|
@ -1533,6 +1594,10 @@ CONFIG_USB_EZUSB=y
|
|||
#
|
||||
# LED Triggers
|
||||
#
|
||||
CONFIG_LEDS_TRIGGERS=y
|
||||
# CONFIG_LEDS_TRIGGER_TIMER is not set
|
||||
CONFIG_LEDS_TRIGGER_IDE_DISK=y
|
||||
# CONFIG_LEDS_TRIGGER_HEARTBEAT is not set
|
||||
|
||||
#
|
||||
# InfiniBand support
|
||||
|
@ -1548,6 +1613,19 @@ CONFIG_USB_EZUSB=y
|
|||
#
|
||||
# CONFIG_RTC_CLASS is not set
|
||||
|
||||
#
|
||||
# DMA Engine support
|
||||
#
|
||||
# CONFIG_DMA_ENGINE is not set
|
||||
|
||||
#
|
||||
# DMA Clients
|
||||
#
|
||||
|
||||
#
|
||||
# DMA Devices
|
||||
#
|
||||
|
||||
#
|
||||
# File systems
|
||||
#
|
||||
|
@ -1569,6 +1647,7 @@ CONFIG_FS_POSIX_ACL=y
|
|||
# CONFIG_MINIX_FS is not set
|
||||
# CONFIG_ROMFS_FS is not set
|
||||
CONFIG_INOTIFY=y
|
||||
CONFIG_INOTIFY_USER=y
|
||||
# CONFIG_QUOTA is not set
|
||||
CONFIG_DNOTIFY=y
|
||||
# CONFIG_AUTOFS_FS is not set
|
||||
|
@ -1649,6 +1728,7 @@ CONFIG_RPCSEC_GSS_KRB5=y
|
|||
CONFIG_SMB_FS=m
|
||||
# CONFIG_SMB_NLS_DEFAULT is not set
|
||||
# CONFIG_CIFS is not set
|
||||
# CONFIG_CIFS_DEBUG2 is not set
|
||||
# CONFIG_NCP_FS is not set
|
||||
# CONFIG_CODA_FS is not set
|
||||
# CONFIG_AFS_FS is not set
|
||||
|
@ -1732,6 +1812,7 @@ CONFIG_TEXTSEARCH=y
|
|||
CONFIG_TEXTSEARCH_KMP=m
|
||||
CONFIG_TEXTSEARCH_BM=m
|
||||
CONFIG_TEXTSEARCH_FSM=m
|
||||
CONFIG_PLIST=y
|
||||
|
||||
#
|
||||
# Instrumentation Support
|
||||
|
@ -1744,12 +1825,15 @@ CONFIG_OPROFILE=y
|
|||
#
|
||||
# CONFIG_PRINTK_TIME is not set
|
||||
# CONFIG_MAGIC_SYSRQ is not set
|
||||
# CONFIG_UNUSED_SYMBOLS is not set
|
||||
CONFIG_DEBUG_KERNEL=y
|
||||
CONFIG_LOG_BUF_SHIFT=14
|
||||
CONFIG_DETECT_SOFTLOCKUP=y
|
||||
# CONFIG_SCHEDSTATS is not set
|
||||
# CONFIG_DEBUG_SLAB is not set
|
||||
# CONFIG_DEBUG_MUTEXES is not set
|
||||
# CONFIG_DEBUG_RT_MUTEXES is not set
|
||||
# CONFIG_RT_MUTEX_TESTER is not set
|
||||
# CONFIG_DEBUG_SPINLOCK is not set
|
||||
# CONFIG_DEBUG_SPINLOCK_SLEEP is not set
|
||||
# CONFIG_DEBUG_KOBJECT is not set
|
||||
|
@ -1763,11 +1847,7 @@ CONFIG_XMON=y
|
|||
CONFIG_XMON_DEFAULT=y
|
||||
# CONFIG_BDI_SWITCH is not set
|
||||
CONFIG_BOOTX_TEXT=y
|
||||
# CONFIG_PPC_EARLY_DEBUG_LPAR is not set
|
||||
# CONFIG_PPC_EARLY_DEBUG_G5 is not set
|
||||
# CONFIG_PPC_EARLY_DEBUG_RTAS is not set
|
||||
# CONFIG_PPC_EARLY_DEBUG_MAPLE is not set
|
||||
# CONFIG_PPC_EARLY_DEBUG_ISERIES is not set
|
||||
# CONFIG_PPC_EARLY_DEBUG is not set
|
||||
|
||||
#
|
||||
# Security options
|
||||
|
|
|
@ -191,6 +191,37 @@ exception_marker:
|
|||
ori reg,reg,(label)@l; /* virt addr of handler ... */
|
||||
#endif
|
||||
|
||||
/*
|
||||
* Equal to EXCEPTION_PROLOG_PSERIES, except that it forces 64bit mode.
|
||||
* The firmware calls the registered system_reset_fwnmi and
|
||||
* machine_check_fwnmi handlers in 32bit mode if the cpu happens to run
|
||||
* a 32bit application at the time of the event.
|
||||
* This firmware bug is present on POWER4 and JS20.
|
||||
*/
|
||||
#define EXCEPTION_PROLOG_PSERIES_FORCE_64BIT(area, label) \
|
||||
mfspr r13,SPRN_SPRG3; /* get paca address into r13 */ \
|
||||
std r9,area+EX_R9(r13); /* save r9 - r12 */ \
|
||||
std r10,area+EX_R10(r13); \
|
||||
std r11,area+EX_R11(r13); \
|
||||
std r12,area+EX_R12(r13); \
|
||||
mfspr r9,SPRN_SPRG1; \
|
||||
std r9,area+EX_R13(r13); \
|
||||
mfcr r9; \
|
||||
clrrdi r12,r13,32; /* get high part of &label */ \
|
||||
mfmsr r10; \
|
||||
/* force 64bit mode */ \
|
||||
li r11,5; /* MSR_SF_LG|MSR_ISF_LG */ \
|
||||
rldimi r10,r11,61,0; /* insert into top 3 bits */ \
|
||||
/* done 64bit mode */ \
|
||||
mfspr r11,SPRN_SRR0; /* save SRR0 */ \
|
||||
LOAD_HANDLER(r12,label) \
|
||||
ori r10,r10,MSR_IR|MSR_DR|MSR_RI; \
|
||||
mtspr SPRN_SRR0,r12; \
|
||||
mfspr r12,SPRN_SRR1; /* and SRR1 */ \
|
||||
mtspr SPRN_SRR1,r10; \
|
||||
rfid; \
|
||||
b . /* prevent speculative execution */
|
||||
|
||||
#define EXCEPTION_PROLOG_PSERIES(area, label) \
|
||||
mfspr r13,SPRN_SPRG3; /* get paca address into r13 */ \
|
||||
std r9,area+EX_R9(r13); /* save r9 - r12 */ \
|
||||
|
@ -604,14 +635,14 @@ slb_miss_user_pseries:
|
|||
system_reset_fwnmi:
|
||||
HMT_MEDIUM
|
||||
mtspr SPRN_SPRG1,r13 /* save r13 */
|
||||
EXCEPTION_PROLOG_PSERIES(PACA_EXGEN, system_reset_common)
|
||||
EXCEPTION_PROLOG_PSERIES_FORCE_64BIT(PACA_EXGEN, system_reset_common)
|
||||
|
||||
.globl machine_check_fwnmi
|
||||
.align 7
|
||||
machine_check_fwnmi:
|
||||
HMT_MEDIUM
|
||||
mtspr SPRN_SPRG1,r13 /* save r13 */
|
||||
EXCEPTION_PROLOG_PSERIES(PACA_EXMC, machine_check_common)
|
||||
EXCEPTION_PROLOG_PSERIES_FORCE_64BIT(PACA_EXMC, machine_check_common)
|
||||
|
||||
#ifdef CONFIG_PPC_ISERIES
|
||||
/*** ISeries-LPAR interrupt handlers ***/
|
||||
|
|
|
@ -112,7 +112,7 @@ static int __init add_legacy_port(struct device_node *np, int want_index,
|
|||
static int __init add_legacy_soc_port(struct device_node *np,
|
||||
struct device_node *soc_dev)
|
||||
{
|
||||
phys_addr_t addr;
|
||||
u64 addr;
|
||||
u32 *addrp;
|
||||
upf_t flags = UPF_BOOT_AUTOCONF | UPF_SKIP_TEST | UPF_SHARE_IRQ;
|
||||
|
||||
|
@ -143,7 +143,7 @@ static int __init add_legacy_isa_port(struct device_node *np,
|
|||
u32 *reg;
|
||||
char *typep;
|
||||
int index = -1;
|
||||
phys_addr_t taddr;
|
||||
u64 taddr;
|
||||
|
||||
DBG(" -> add_legacy_isa_port(%s)\n", np->full_name);
|
||||
|
||||
|
@ -165,10 +165,13 @@ static int __init add_legacy_isa_port(struct device_node *np,
|
|||
if (typep && *typep == 'S')
|
||||
index = simple_strtol(typep+1, NULL, 0) - 1;
|
||||
|
||||
/* Translate ISA address */
|
||||
/* Translate ISA address. If it fails, we still register the port
|
||||
* with no translated address so that it can be picked up as an IO
|
||||
* port later by the serial driver
|
||||
*/
|
||||
taddr = of_translate_address(np, reg);
|
||||
if (taddr == OF_BAD_ADDR)
|
||||
return -1;
|
||||
taddr = 0;
|
||||
|
||||
/* Add port, irq will be dealt with later */
|
||||
return add_legacy_port(np, index, UPIO_PORT, reg[1], taddr,
|
||||
|
@ -180,7 +183,7 @@ static int __init add_legacy_isa_port(struct device_node *np,
|
|||
static int __init add_legacy_pci_port(struct device_node *np,
|
||||
struct device_node *pci_dev)
|
||||
{
|
||||
phys_addr_t addr, base;
|
||||
u64 addr, base;
|
||||
u32 *addrp;
|
||||
unsigned int flags;
|
||||
int iotype, index = -1, lindex = 0;
|
||||
|
|
|
@ -687,7 +687,7 @@ _GLOBAL(kexec_sequence)
|
|||
/* clear out hardware hash page table and tlb */
|
||||
ld r5,0(r27) /* deref function descriptor */
|
||||
mtctr r5
|
||||
bctrl /* ppc_md.hash_clear_all(void); */
|
||||
bctrl /* ppc_md.hpte_clear_all(void); */
|
||||
|
||||
/*
|
||||
* kexec image calling is:
|
||||
|
|
|
@ -557,7 +557,9 @@ unsigned long prom_memparse(const char *ptr, const char **retptr)
|
|||
static void __init early_cmdline_parse(void)
|
||||
{
|
||||
struct prom_t *_prom = &RELOC(prom);
|
||||
#ifdef CONFIG_PPC64
|
||||
const char *opt;
|
||||
#endif
|
||||
char *p;
|
||||
int l = 0;
|
||||
|
||||
|
@ -2030,6 +2032,39 @@ static void __init fixup_device_tree_maple(void)
|
|||
#define fixup_device_tree_maple()
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_PPC_CHRP
|
||||
/* Pegasos lacks the "ranges" property in the isa node */
|
||||
static void __init fixup_device_tree_chrp(void)
|
||||
{
|
||||
phandle isa;
|
||||
u32 isa_ranges[6];
|
||||
char *name;
|
||||
int rc;
|
||||
|
||||
name = "/pci@80000000/isa@c";
|
||||
isa = call_prom("finddevice", 1, 1, ADDR(name));
|
||||
if (!PHANDLE_VALID(isa))
|
||||
return;
|
||||
|
||||
rc = prom_getproplen(isa, "ranges");
|
||||
if (rc != 0 && rc != PROM_ERROR)
|
||||
return;
|
||||
|
||||
prom_printf("Fixing up missing ISA range on Pegasos...\n");
|
||||
|
||||
isa_ranges[0] = 0x1;
|
||||
isa_ranges[1] = 0x0;
|
||||
isa_ranges[2] = 0x01006000;
|
||||
isa_ranges[3] = 0x0;
|
||||
isa_ranges[4] = 0x0;
|
||||
isa_ranges[5] = 0x00010000;
|
||||
prom_setprop(isa, name, "ranges",
|
||||
isa_ranges, sizeof(isa_ranges));
|
||||
}
|
||||
#else
|
||||
#define fixup_device_tree_chrp()
|
||||
#endif
|
||||
|
||||
#if defined(CONFIG_PPC64) && defined(CONFIG_PPC_PMAC)
|
||||
static void __init fixup_device_tree_pmac(void)
|
||||
{
|
||||
|
@ -2077,6 +2112,7 @@ static void __init fixup_device_tree_pmac(void)
|
|||
static void __init fixup_device_tree(void)
|
||||
{
|
||||
fixup_device_tree_maple();
|
||||
fixup_device_tree_chrp();
|
||||
fixup_device_tree_pmac();
|
||||
}
|
||||
|
||||
|
|
|
@ -144,13 +144,15 @@ void smp_message_recv(int msg, struct pt_regs *regs)
|
|||
|
||||
void smp_send_reschedule(int cpu)
|
||||
{
|
||||
smp_ops->message_pass(cpu, PPC_MSG_RESCHEDULE);
|
||||
if (likely(smp_ops))
|
||||
smp_ops->message_pass(cpu, PPC_MSG_RESCHEDULE);
|
||||
}
|
||||
|
||||
#ifdef CONFIG_DEBUGGER
|
||||
void smp_send_debugger_break(int cpu)
|
||||
{
|
||||
smp_ops->message_pass(cpu, PPC_MSG_DEBUGGER_BREAK);
|
||||
if (likely(smp_ops))
|
||||
smp_ops->message_pass(cpu, PPC_MSG_DEBUGGER_BREAK);
|
||||
}
|
||||
#endif
|
||||
|
||||
|
@ -158,7 +160,7 @@ void smp_send_debugger_break(int cpu)
|
|||
void crash_send_ipi(void (*crash_ipi_callback)(struct pt_regs *))
|
||||
{
|
||||
crash_ipi_function_ptr = crash_ipi_callback;
|
||||
if (crash_ipi_callback) {
|
||||
if (crash_ipi_callback && smp_ops) {
|
||||
mb();
|
||||
smp_ops->message_pass(MSG_ALL_BUT_SELF, PPC_MSG_DEBUGGER_BREAK);
|
||||
}
|
||||
|
@ -220,6 +222,9 @@ int smp_call_function (void (*func) (void *info), void *info, int nonatomic,
|
|||
/* Can deadlock when called with interrupts disabled */
|
||||
WARN_ON(irqs_disabled());
|
||||
|
||||
if (unlikely(smp_ops == NULL))
|
||||
return -1;
|
||||
|
||||
data.func = func;
|
||||
data.info = info;
|
||||
atomic_set(&data.started, 0);
|
||||
|
@ -357,7 +362,10 @@ void __init smp_prepare_cpus(unsigned int max_cpus)
|
|||
smp_store_cpu_info(boot_cpuid);
|
||||
cpu_callin_map[boot_cpuid] = 1;
|
||||
|
||||
max_cpus = smp_ops->probe();
|
||||
if (smp_ops)
|
||||
max_cpus = smp_ops->probe();
|
||||
else
|
||||
max_cpus = 1;
|
||||
|
||||
smp_space_timers(max_cpus);
|
||||
|
||||
|
@ -453,7 +461,7 @@ void generic_mach_cpu_die(void)
|
|||
|
||||
static int __devinit cpu_enable(unsigned int cpu)
|
||||
{
|
||||
if (smp_ops->cpu_enable)
|
||||
if (smp_ops && smp_ops->cpu_enable)
|
||||
return smp_ops->cpu_enable(cpu);
|
||||
|
||||
return -ENOSYS;
|
||||
|
@ -467,7 +475,8 @@ int __devinit __cpu_up(unsigned int cpu)
|
|||
if (!cpu_enable(cpu))
|
||||
return 0;
|
||||
|
||||
if (smp_ops->cpu_bootable && !smp_ops->cpu_bootable(cpu))
|
||||
if (smp_ops == NULL ||
|
||||
(smp_ops->cpu_bootable && !smp_ops->cpu_bootable(cpu)))
|
||||
return -EINVAL;
|
||||
|
||||
/* Make sure callin-map entry is 0 (can be leftover a CPU
|
||||
|
@ -568,7 +577,8 @@ void __init smp_cpus_done(unsigned int max_cpus)
|
|||
old_mask = current->cpus_allowed;
|
||||
set_cpus_allowed(current, cpumask_of_cpu(boot_cpuid));
|
||||
|
||||
smp_ops->setup_cpu(boot_cpuid);
|
||||
if (smp_ops)
|
||||
smp_ops->setup_cpu(boot_cpuid);
|
||||
|
||||
set_cpus_allowed(current, old_mask);
|
||||
|
||||
|
|
|
@ -278,7 +278,7 @@ static void unregister_cpu_online(unsigned int cpu)
|
|||
}
|
||||
#endif /* CONFIG_HOTPLUG_CPU */
|
||||
|
||||
static int __devinit sysfs_cpu_notify(struct notifier_block *self,
|
||||
static int __cpuinit sysfs_cpu_notify(struct notifier_block *self,
|
||||
unsigned long action, void *hcpu)
|
||||
{
|
||||
unsigned int cpu = (unsigned int)(long)hcpu;
|
||||
|
@ -296,7 +296,7 @@ static int __devinit sysfs_cpu_notify(struct notifier_block *self,
|
|||
return NOTIFY_OK;
|
||||
}
|
||||
|
||||
static struct notifier_block __devinitdata sysfs_cpu_nb = {
|
||||
static struct notifier_block __cpuinitdata sysfs_cpu_nb = {
|
||||
.notifier_call = sysfs_cpu_notify,
|
||||
};
|
||||
|
||||
|
|
|
@ -150,13 +150,9 @@ int die(const char *str, struct pt_regs *regs, long err)
|
|||
if (in_interrupt())
|
||||
panic("Fatal exception in interrupt");
|
||||
|
||||
if (panic_on_oops) {
|
||||
#ifdef CONFIG_PPC64
|
||||
printk(KERN_EMERG "Fatal exception: panic in 5 seconds\n");
|
||||
ssleep(5);
|
||||
#endif
|
||||
panic("Fatal exception");
|
||||
}
|
||||
if (panic_on_oops)
|
||||
panic("Fatal exception: panic_on_oops");
|
||||
|
||||
do_exit(err);
|
||||
|
||||
return 0;
|
||||
|
|
|
@ -81,10 +81,14 @@ static int udbg_550_getc(void)
|
|||
void udbg_init_uart(void __iomem *comport, unsigned int speed,
|
||||
unsigned int clock)
|
||||
{
|
||||
unsigned int dll, base_bauds = clock / 16;
|
||||
unsigned int dll, base_bauds;
|
||||
|
||||
if (clock == 0)
|
||||
clock = 1843200;
|
||||
if (speed == 0)
|
||||
speed = 9600;
|
||||
|
||||
base_bauds = clock / 16;
|
||||
dll = base_bauds / speed;
|
||||
|
||||
if (comport) {
|
||||
|
|
|
@ -14,7 +14,8 @@ obj-vdso32 := $(addprefix $(obj)/, $(obj-vdso32))
|
|||
|
||||
|
||||
EXTRA_CFLAGS := -shared -s -fno-common -fno-builtin
|
||||
EXTRA_CFLAGS += -nostdlib -Wl,-soname=linux-vdso32.so.1
|
||||
EXTRA_CFLAGS += -nostdlib -Wl,-soname=linux-vdso32.so.1 \
|
||||
$(call ld-option, -Wl$(comma)--hash-style=sysv)
|
||||
EXTRA_AFLAGS := -D__VDSO32__ -s
|
||||
|
||||
obj-y += vdso32_wrapper.o
|
||||
|
|
|
@ -14,6 +14,7 @@ SECTIONS
|
|||
{
|
||||
. = VDSO32_LBASE + SIZEOF_HEADERS;
|
||||
.hash : { *(.hash) } :text
|
||||
.gnu.hash : { *(.gnu.hash) }
|
||||
.dynsym : { *(.dynsym) }
|
||||
.dynstr : { *(.dynstr) }
|
||||
.gnu.version : { *(.gnu.version) }
|
||||
|
|
|
@ -8,7 +8,8 @@ targets := $(obj-vdso64) vdso64.so
|
|||
obj-vdso64 := $(addprefix $(obj)/, $(obj-vdso64))
|
||||
|
||||
EXTRA_CFLAGS := -shared -s -fno-common -fno-builtin
|
||||
EXTRA_CFLAGS += -nostdlib -Wl,-soname=linux-vdso64.so.1
|
||||
EXTRA_CFLAGS += -nostdlib -Wl,-soname=linux-vdso64.so.1 \
|
||||
$(call ld-option, -Wl$(comma)--hash-style=sysv)
|
||||
EXTRA_AFLAGS := -D__VDSO64__ -s
|
||||
|
||||
obj-y += vdso64_wrapper.o
|
||||
|
|
|
@ -12,6 +12,7 @@ SECTIONS
|
|||
{
|
||||
. = VDSO64_LBASE + SIZEOF_HEADERS;
|
||||
.hash : { *(.hash) } :text
|
||||
.gnu.hash : { *(.gnu.hash) }
|
||||
.dynsym : { *(.dynsym) }
|
||||
.dynstr : { *(.dynstr) }
|
||||
.gnu.version : { *(.gnu.version) }
|
||||
|
|
|
@ -320,7 +320,8 @@ void __init lmb_enforce_memory_limit(unsigned long memory_limit)
|
|||
break;
|
||||
}
|
||||
|
||||
lmb.rmo_size = lmb.memory.region[0].size;
|
||||
if (lmb.memory.region[0].size < lmb.rmo_size)
|
||||
lmb.rmo_size = lmb.memory.region[0].size;
|
||||
|
||||
/* And truncate any reserves above the limit also. */
|
||||
for (i = 0; i < lmb.reserved.cnt; i++) {
|
||||
|
|
|
@ -291,10 +291,6 @@ void __init chrp_setup_arch(void)
|
|||
|
||||
pci_create_OF_bus_map();
|
||||
|
||||
#ifdef CONFIG_SMP
|
||||
smp_ops = &chrp_smp_ops;
|
||||
#endif /* CONFIG_SMP */
|
||||
|
||||
/*
|
||||
* Print the banner, then scroll down so boot progress
|
||||
* can be printed. -- Cort
|
||||
|
@ -479,6 +475,14 @@ void __init chrp_init_IRQ(void)
|
|||
chrp_find_openpic();
|
||||
chrp_find_8259();
|
||||
|
||||
#ifdef CONFIG_SMP
|
||||
/* Pegasos has no MPIC, those ops would make it crash. It might be an
|
||||
* option to move setting them to after we probe the PIC though
|
||||
*/
|
||||
if (chrp_mpic != NULL)
|
||||
smp_ops = &chrp_smp_ops;
|
||||
#endif /* CONFIG_SMP */
|
||||
|
||||
if (_chrp_type == _CHRP_Pegasos)
|
||||
ppc_md.get_irq = i8259_irq;
|
||||
|
||||
|
|
|
@ -221,10 +221,17 @@ static void __init maple_init_IRQ(void)
|
|||
* in Maple device-tree where the type of the controller is
|
||||
* open-pic and not interrupt-controller
|
||||
*/
|
||||
for_each_node_by_type(np, "open-pic") {
|
||||
mpic_node = np;
|
||||
break;
|
||||
}
|
||||
|
||||
for_each_node_by_type(np, "interrupt-controller")
|
||||
if (device_is_compatible(np, "open-pic")) {
|
||||
mpic_node = np;
|
||||
break;
|
||||
}
|
||||
if (mpic_node == NULL)
|
||||
for_each_node_by_type(np, "open-pic") {
|
||||
mpic_node = np;
|
||||
break;
|
||||
}
|
||||
if (mpic_node == NULL) {
|
||||
printk(KERN_ERR
|
||||
"Failed to locate the MPIC interrupt controller\n");
|
||||
|
@ -252,6 +259,8 @@ static void __init maple_init_IRQ(void)
|
|||
|
||||
/* XXX Maple specific bits */
|
||||
flags |= MPIC_BROKEN_U3 | MPIC_WANTS_RESET;
|
||||
/* All U3/U4 are big-endian, older SLOF firmware doesn't encode this */
|
||||
flags |= MPIC_BIG_ENDIAN;
|
||||
|
||||
/* Setup the openpic driver. More device-tree junks, we hard code no
|
||||
* ISUs for now. I'll have to revisit some stuffs with the folks doing
|
||||
|
|
|
@ -10,19 +10,32 @@
|
|||
#include <linux/kernel.h>
|
||||
#include <linux/fb.h>
|
||||
#include <linux/backlight.h>
|
||||
#include <linux/adb.h>
|
||||
#include <linux/pmu.h>
|
||||
#include <asm/atomic.h>
|
||||
#include <asm/prom.h>
|
||||
#include <asm/backlight.h>
|
||||
|
||||
#define OLD_BACKLIGHT_MAX 15
|
||||
|
||||
static void pmac_backlight_key_worker(void *data);
|
||||
static DECLARE_WORK(pmac_backlight_key_work, pmac_backlight_key_worker, NULL);
|
||||
static void pmac_backlight_set_legacy_worker(void *data);
|
||||
|
||||
/* Although this variable is used in interrupt context, it makes no sense to
|
||||
* protect it. No user is able to produce enough key events per second and
|
||||
static DECLARE_WORK(pmac_backlight_key_work, pmac_backlight_key_worker, NULL);
|
||||
static DECLARE_WORK(pmac_backlight_set_legacy_work, pmac_backlight_set_legacy_worker, NULL);
|
||||
|
||||
/* Although these variables are used in interrupt context, it makes no sense to
|
||||
* protect them. No user is able to produce enough key events per second and
|
||||
* notice the errors that might happen.
|
||||
*/
|
||||
static int pmac_backlight_key_queued;
|
||||
static int pmac_backlight_set_legacy_queued;
|
||||
|
||||
/* The via-pmu code allows the backlight to be grabbed, in which case the
|
||||
* in-kernel control of the brightness needs to be disabled. This should
|
||||
* only be used by really old PowerBooks.
|
||||
*/
|
||||
static atomic_t kernel_backlight_disabled = ATOMIC_INIT(0);
|
||||
|
||||
/* Protect the pmac_backlight variable */
|
||||
DEFINE_MUTEX(pmac_backlight_mutex);
|
||||
|
@ -82,6 +95,9 @@ int pmac_backlight_curve_lookup(struct fb_info *info, int value)
|
|||
|
||||
static void pmac_backlight_key_worker(void *data)
|
||||
{
|
||||
if (atomic_read(&kernel_backlight_disabled))
|
||||
return;
|
||||
|
||||
mutex_lock(&pmac_backlight_mutex);
|
||||
if (pmac_backlight) {
|
||||
struct backlight_properties *props;
|
||||
|
@ -107,8 +123,12 @@ static void pmac_backlight_key_worker(void *data)
|
|||
mutex_unlock(&pmac_backlight_mutex);
|
||||
}
|
||||
|
||||
/* This function is called in interrupt context */
|
||||
void pmac_backlight_key(int direction)
|
||||
{
|
||||
if (atomic_read(&kernel_backlight_disabled))
|
||||
return;
|
||||
|
||||
/* we can receive multiple interrupts here, but the scheduled work
|
||||
* will run only once, with the last value
|
||||
*/
|
||||
|
@ -116,7 +136,7 @@ void pmac_backlight_key(int direction)
|
|||
schedule_work(&pmac_backlight_key_work);
|
||||
}
|
||||
|
||||
int pmac_backlight_set_legacy_brightness(int brightness)
|
||||
static int __pmac_backlight_set_legacy_brightness(int brightness)
|
||||
{
|
||||
int error = -ENXIO;
|
||||
|
||||
|
@ -145,6 +165,28 @@ int pmac_backlight_set_legacy_brightness(int brightness)
|
|||
return error;
|
||||
}
|
||||
|
||||
static void pmac_backlight_set_legacy_worker(void *data)
|
||||
{
|
||||
if (atomic_read(&kernel_backlight_disabled))
|
||||
return;
|
||||
|
||||
__pmac_backlight_set_legacy_brightness(pmac_backlight_set_legacy_queued);
|
||||
}
|
||||
|
||||
/* This function is called in interrupt context */
|
||||
void pmac_backlight_set_legacy_brightness_pmu(int brightness) {
|
||||
if (atomic_read(&kernel_backlight_disabled))
|
||||
return;
|
||||
|
||||
pmac_backlight_set_legacy_queued = brightness;
|
||||
schedule_work(&pmac_backlight_set_legacy_work);
|
||||
}
|
||||
|
||||
int pmac_backlight_set_legacy_brightness(int brightness)
|
||||
{
|
||||
return __pmac_backlight_set_legacy_brightness(brightness);
|
||||
}
|
||||
|
||||
int pmac_backlight_get_legacy_brightness()
|
||||
{
|
||||
int result = -ENXIO;
|
||||
|
@ -167,6 +209,16 @@ int pmac_backlight_get_legacy_brightness()
|
|||
return result;
|
||||
}
|
||||
|
||||
void pmac_backlight_disable()
|
||||
{
|
||||
atomic_inc(&kernel_backlight_disabled);
|
||||
}
|
||||
|
||||
void pmac_backlight_enable()
|
||||
{
|
||||
atomic_dec(&kernel_backlight_disabled);
|
||||
}
|
||||
|
||||
EXPORT_SYMBOL_GPL(pmac_backlight);
|
||||
EXPORT_SYMBOL_GPL(pmac_backlight_mutex);
|
||||
EXPORT_SYMBOL_GPL(pmac_has_backlight_type);
|
||||
|
|
|
@ -181,13 +181,18 @@ static void __init bootx_add_chosen_props(unsigned long base,
|
|||
}
|
||||
|
||||
static void __init bootx_add_display_props(unsigned long base,
|
||||
unsigned long *mem_end)
|
||||
unsigned long *mem_end,
|
||||
int has_real_node)
|
||||
{
|
||||
boot_infos_t *bi = bootx_info;
|
||||
u32 tmp;
|
||||
|
||||
bootx_dt_add_prop("linux,boot-display", NULL, 0, mem_end);
|
||||
bootx_dt_add_prop("linux,opened", NULL, 0, mem_end);
|
||||
if (has_real_node) {
|
||||
bootx_dt_add_prop("linux,boot-display", NULL, 0, mem_end);
|
||||
bootx_dt_add_prop("linux,opened", NULL, 0, mem_end);
|
||||
} else
|
||||
bootx_dt_add_prop("linux,bootx-noscreen", NULL, 0, mem_end);
|
||||
|
||||
tmp = bi->dispDeviceDepth;
|
||||
bootx_dt_add_prop("linux,bootx-depth", &tmp, 4, mem_end);
|
||||
tmp = bi->dispDeviceRect[2] - bi->dispDeviceRect[0];
|
||||
|
@ -241,11 +246,6 @@ static void __init bootx_scan_dt_build_strings(unsigned long base,
|
|||
DBG(" detected display ! adding properties names !\n");
|
||||
bootx_dt_add_string("linux,boot-display", mem_end);
|
||||
bootx_dt_add_string("linux,opened", mem_end);
|
||||
bootx_dt_add_string("linux,bootx-depth", mem_end);
|
||||
bootx_dt_add_string("linux,bootx-width", mem_end);
|
||||
bootx_dt_add_string("linux,bootx-height", mem_end);
|
||||
bootx_dt_add_string("linux,bootx-linebytes", mem_end);
|
||||
bootx_dt_add_string("linux,bootx-addr", mem_end);
|
||||
strncpy(bootx_disp_path, namep, 255);
|
||||
}
|
||||
|
||||
|
@ -329,10 +329,13 @@ static void __init bootx_scan_dt_build_struct(unsigned long base,
|
|||
ppp = &pp->next;
|
||||
}
|
||||
|
||||
if (node == bootx_node_chosen)
|
||||
if (node == bootx_node_chosen) {
|
||||
bootx_add_chosen_props(base, mem_end);
|
||||
if (node == bootx_info->dispDeviceRegEntryOffset)
|
||||
bootx_add_display_props(base, mem_end);
|
||||
if (bootx_info->dispDeviceRegEntryOffset == 0)
|
||||
bootx_add_display_props(base, mem_end, 0);
|
||||
}
|
||||
else if (node == bootx_info->dispDeviceRegEntryOffset)
|
||||
bootx_add_display_props(base, mem_end, 1);
|
||||
|
||||
/* do all our children */
|
||||
cpp = &np->child;
|
||||
|
@ -374,6 +377,14 @@ static unsigned long __init bootx_flatten_dt(unsigned long start)
|
|||
mem_end += 4;
|
||||
bootx_dt_strend = mem_end;
|
||||
bootx_scan_dt_build_strings(base, 4, &mem_end);
|
||||
/* Add some strings */
|
||||
bootx_dt_add_string("linux,bootx-noscreen", &mem_end);
|
||||
bootx_dt_add_string("linux,bootx-depth", &mem_end);
|
||||
bootx_dt_add_string("linux,bootx-width", &mem_end);
|
||||
bootx_dt_add_string("linux,bootx-height", &mem_end);
|
||||
bootx_dt_add_string("linux,bootx-linebytes", &mem_end);
|
||||
bootx_dt_add_string("linux,bootx-addr", &mem_end);
|
||||
/* Wrap up strings */
|
||||
hdr->off_dt_strings = bootx_dt_strbase - mem_start;
|
||||
hdr->dt_strings_size = bootx_dt_strend - bootx_dt_strbase;
|
||||
|
||||
|
@ -471,6 +482,7 @@ void __init bootx_init(unsigned long r3, unsigned long r4)
|
|||
if (bi->dispDeviceDepth == 16)
|
||||
bi->dispDeviceDepth = 15;
|
||||
|
||||
|
||||
#ifdef CONFIG_BOOTX_TEXT
|
||||
ptr = (unsigned long)bi->logicalDisplayBase;
|
||||
ptr += bi->dispDeviceRect[1] * bi->dispDeviceRowBytes;
|
||||
|
@ -508,6 +520,7 @@ void __init bootx_init(unsigned long r3, unsigned long r4)
|
|||
#ifdef CONFIG_BOOTX_TEXT
|
||||
btext_welcome(bi);
|
||||
#endif
|
||||
|
||||
/* New BootX enters kernel with MMU off, i/os are not allowed
|
||||
* here. This hack will have been done by the boostrap anyway.
|
||||
*/
|
||||
|
|
|
@ -10,6 +10,8 @@
|
|||
* that is iMac G5 and latest single CPU desktop.
|
||||
*/
|
||||
|
||||
#undef DEBUG
|
||||
|
||||
#include <linux/module.h>
|
||||
#include <linux/types.h>
|
||||
#include <linux/errno.h>
|
||||
|
@ -30,13 +32,7 @@
|
|||
#include <asm/smu.h>
|
||||
#include <asm/pmac_pfunc.h>
|
||||
|
||||
#undef DEBUG
|
||||
|
||||
#ifdef DEBUG
|
||||
#define DBG(fmt...) printk(fmt)
|
||||
#else
|
||||
#define DBG(fmt...)
|
||||
#endif
|
||||
#define DBG(fmt...) pr_debug(fmt)
|
||||
|
||||
/* see 970FX user manual */
|
||||
|
||||
|
@ -82,8 +78,6 @@ static struct freq_attr* g5_cpu_freqs_attr[] = {
|
|||
/* Power mode data is an array of the 32 bits PCR values to use for
|
||||
* the various frequencies, retrieved from the device-tree
|
||||
*/
|
||||
static u32 *g5_pmode_data;
|
||||
static int g5_pmode_max;
|
||||
static int g5_pmode_cur;
|
||||
|
||||
static void (*g5_switch_volt)(int speed_mode);
|
||||
|
@ -93,6 +87,11 @@ static int (*g5_query_freq)(void);
|
|||
static DEFINE_MUTEX(g5_switch_mutex);
|
||||
|
||||
|
||||
#ifdef CONFIG_PMAC_SMU
|
||||
|
||||
static u32 *g5_pmode_data;
|
||||
static int g5_pmode_max;
|
||||
|
||||
static struct smu_sdbp_fvt *g5_fvt_table; /* table of op. points */
|
||||
static int g5_fvt_count; /* number of op. points */
|
||||
static int g5_fvt_cur; /* current op. point */
|
||||
|
@ -209,6 +208,16 @@ static int g5_scom_query_freq(void)
|
|||
return i;
|
||||
}
|
||||
|
||||
/*
|
||||
* Fake voltage switching for platforms with missing support
|
||||
*/
|
||||
|
||||
static void g5_dummy_switch_volt(int speed_mode)
|
||||
{
|
||||
}
|
||||
|
||||
#endif /* CONFIG_PMAC_SMU */
|
||||
|
||||
/*
|
||||
* Platform function based voltage switching for PowerMac7,2 & 7,3
|
||||
*/
|
||||
|
@ -248,6 +257,9 @@ static int g5_pfunc_switch_freq(int speed_mode)
|
|||
struct pmf_args args;
|
||||
u32 done = 0;
|
||||
unsigned long timeout;
|
||||
int rc;
|
||||
|
||||
DBG("g5_pfunc_switch_freq(%d)\n", speed_mode);
|
||||
|
||||
/* If frequency is going up, first ramp up the voltage */
|
||||
if (speed_mode < g5_pmode_cur)
|
||||
|
@ -255,9 +267,12 @@ static int g5_pfunc_switch_freq(int speed_mode)
|
|||
|
||||
/* Do it */
|
||||
if (speed_mode == CPUFREQ_HIGH)
|
||||
pmf_call_one(pfunc_cpu_setfreq_high, NULL);
|
||||
rc = pmf_call_one(pfunc_cpu_setfreq_high, NULL);
|
||||
else
|
||||
pmf_call_one(pfunc_cpu_setfreq_low, NULL);
|
||||
rc = pmf_call_one(pfunc_cpu_setfreq_low, NULL);
|
||||
|
||||
if (rc)
|
||||
printk(KERN_WARNING "cpufreq: pfunc switch error %d\n", rc);
|
||||
|
||||
/* It's an irq GPIO so we should be able to just block here,
|
||||
* I'll do that later after I've properly tested the IRQ code for
|
||||
|
@ -296,13 +311,6 @@ static int g5_pfunc_query_freq(void)
|
|||
return val ? CPUFREQ_HIGH : CPUFREQ_LOW;
|
||||
}
|
||||
|
||||
/*
|
||||
* Fake voltage switching for platforms with missing support
|
||||
*/
|
||||
|
||||
static void g5_dummy_switch_volt(int speed_mode)
|
||||
{
|
||||
}
|
||||
|
||||
/*
|
||||
* Common interface to the cpufreq core
|
||||
|
@ -375,6 +383,8 @@ static struct cpufreq_driver g5_cpufreq_driver = {
|
|||
};
|
||||
|
||||
|
||||
#ifdef CONFIG_PMAC_SMU
|
||||
|
||||
static int __init g5_neo2_cpufreq_init(struct device_node *cpus)
|
||||
{
|
||||
struct device_node *cpunode;
|
||||
|
@ -525,6 +535,9 @@ static int __init g5_neo2_cpufreq_init(struct device_node *cpus)
|
|||
return rc;
|
||||
}
|
||||
|
||||
#endif /* CONFIG_PMAC_SMU */
|
||||
|
||||
|
||||
static int __init g5_pm72_cpufreq_init(struct device_node *cpus)
|
||||
{
|
||||
struct device_node *cpuid = NULL, *hwclock = NULL, *cpunode = NULL;
|
||||
|
@ -533,6 +546,9 @@ static int __init g5_pm72_cpufreq_init(struct device_node *cpus)
|
|||
u64 max_freq, min_freq, ih, il;
|
||||
int has_volt = 1, rc = 0;
|
||||
|
||||
DBG("cpufreq: Initializing for PowerMac7,2, PowerMac7,3 and"
|
||||
" RackMac3,1...\n");
|
||||
|
||||
/* Get first CPU node */
|
||||
for (cpunode = NULL;
|
||||
(cpunode = of_get_next_child(cpus, cpunode)) != NULL;) {
|
||||
|
@ -636,6 +652,15 @@ static int __init g5_pm72_cpufreq_init(struct device_node *cpus)
|
|||
*/
|
||||
ih = *((u32 *)(eeprom + 0x10));
|
||||
il = *((u32 *)(eeprom + 0x20));
|
||||
|
||||
/* Check for machines with no useful settings */
|
||||
if (il == ih) {
|
||||
printk(KERN_WARNING "cpufreq: No low frequency mode available"
|
||||
" on this model !\n");
|
||||
rc = -ENODEV;
|
||||
goto bail;
|
||||
}
|
||||
|
||||
min_freq = 0;
|
||||
if (ih != 0 && il != 0)
|
||||
min_freq = (max_freq * il) / ih;
|
||||
|
@ -643,7 +668,7 @@ static int __init g5_pm72_cpufreq_init(struct device_node *cpus)
|
|||
/* Sanity check */
|
||||
if (min_freq >= max_freq || min_freq < 1000) {
|
||||
printk(KERN_ERR "cpufreq: Can't calculate low frequency !\n");
|
||||
rc = -ENODEV;
|
||||
rc = -ENXIO;
|
||||
goto bail;
|
||||
}
|
||||
g5_cpu_freqs[0].frequency = max_freq;
|
||||
|
@ -690,16 +715,10 @@ static int __init g5_pm72_cpufreq_init(struct device_node *cpus)
|
|||
return rc;
|
||||
}
|
||||
|
||||
static int __init g5_rm31_cpufreq_init(struct device_node *cpus)
|
||||
{
|
||||
/* NYI */
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int __init g5_cpufreq_init(void)
|
||||
{
|
||||
struct device_node *cpus;
|
||||
int rc;
|
||||
int rc = 0;
|
||||
|
||||
cpus = of_find_node_by_path("/cpus");
|
||||
if (cpus == NULL) {
|
||||
|
@ -708,12 +727,13 @@ static int __init g5_cpufreq_init(void)
|
|||
}
|
||||
|
||||
if (machine_is_compatible("PowerMac7,2") ||
|
||||
machine_is_compatible("PowerMac7,3"))
|
||||
machine_is_compatible("PowerMac7,3") ||
|
||||
machine_is_compatible("RackMac3,1"))
|
||||
rc = g5_pm72_cpufreq_init(cpus);
|
||||
else if (machine_is_compatible("RackMac3,1"))
|
||||
rc = g5_rm31_cpufreq_init(cpus);
|
||||
#ifdef CONFIG_PMAC_SMU
|
||||
else
|
||||
rc = g5_neo2_cpufreq_init(cpus);
|
||||
#endif /* CONFIG_PMAC_SMU */
|
||||
|
||||
of_node_put(cpus);
|
||||
return rc;
|
||||
|
|
|
@ -501,7 +501,8 @@ static void pseries_dedicated_idle_sleep(void)
|
|||
}
|
||||
|
||||
/*
|
||||
* Cede if the other thread is not idle, so that it can
|
||||
* If not SMT, cede processor. If CPU is running SMT
|
||||
* cede if the other thread is not idle, so that it can
|
||||
* go single-threaded. If the other thread is idle,
|
||||
* we ask the hypervisor if it has pending work it
|
||||
* wants to do and cede if it does. Otherwise we keep
|
||||
|
@ -514,7 +515,8 @@ static void pseries_dedicated_idle_sleep(void)
|
|||
* very low priority. The cede enables interrupts, which
|
||||
* doesn't matter here.
|
||||
*/
|
||||
if (!lppaca[cpu ^ 1].idle || poll_pending() == H_PENDING)
|
||||
if (!cpu_has_feature(CPU_FTR_SMT) || !lppaca[cpu ^ 1].idle
|
||||
|| poll_pending() == H_PENDING)
|
||||
cede_processor();
|
||||
|
||||
out:
|
||||
|
|
|
@ -8,6 +8,7 @@ SECTIONS
|
|||
. = + SIZEOF_HEADERS;
|
||||
.interp : { *(.interp) }
|
||||
.hash : { *(.hash) }
|
||||
.gnu.hash : { *(.gnu.hash) }
|
||||
.dynsym : { *(.dynsym) }
|
||||
.dynstr : { *(.dynstr) }
|
||||
.rel.text : { *(.rel.text) }
|
||||
|
|
|
@ -617,7 +617,8 @@ appldata_offline_cpu(int cpu)
|
|||
spin_unlock(&appldata_timer_lock);
|
||||
}
|
||||
|
||||
static int __cpuinit
|
||||
#ifdef CONFIG_HOTPLUG_CPU
|
||||
static int
|
||||
appldata_cpu_notify(struct notifier_block *self,
|
||||
unsigned long action, void *hcpu)
|
||||
{
|
||||
|
@ -625,20 +626,19 @@ appldata_cpu_notify(struct notifier_block *self,
|
|||
case CPU_ONLINE:
|
||||
appldata_online_cpu((long) hcpu);
|
||||
break;
|
||||
#ifdef CONFIG_HOTPLUG_CPU
|
||||
case CPU_DEAD:
|
||||
appldata_offline_cpu((long) hcpu);
|
||||
break;
|
||||
#endif
|
||||
default:
|
||||
break;
|
||||
}
|
||||
return NOTIFY_OK;
|
||||
}
|
||||
|
||||
static struct notifier_block __devinitdata appldata_nb = {
|
||||
static struct notifier_block appldata_nb = {
|
||||
.notifier_call = appldata_cpu_notify,
|
||||
};
|
||||
#endif
|
||||
|
||||
/*
|
||||
* appldata_init()
|
||||
|
@ -662,7 +662,7 @@ static int __init appldata_init(void)
|
|||
appldata_online_cpu(i);
|
||||
|
||||
/* Register cpu hotplug notifier */
|
||||
register_cpu_notifier(&appldata_nb);
|
||||
register_hotcpu_notifier(&appldata_nb);
|
||||
|
||||
appldata_sysctl_header = register_sysctl_table(appldata_dir_table, 1);
|
||||
#ifdef MODULE
|
||||
|
|
|
@ -1,13 +1,16 @@
|
|||
#
|
||||
# Automatically generated make config: don't edit
|
||||
# Linux kernel version: 2.6.17-rc1
|
||||
# Mon Apr 3 14:34:15 2006
|
||||
# Linux kernel version: 2.6.18-rc2
|
||||
# Thu Jul 27 13:51:07 2006
|
||||
#
|
||||
CONFIG_MMU=y
|
||||
CONFIG_LOCKDEP_SUPPORT=y
|
||||
CONFIG_STACKTRACE_SUPPORT=y
|
||||
CONFIG_RWSEM_XCHGADD_ALGORITHM=y
|
||||
CONFIG_GENERIC_HWEIGHT=y
|
||||
CONFIG_GENERIC_CALIBRATE_DELAY=y
|
||||
CONFIG_S390=y
|
||||
CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config"
|
||||
|
||||
#
|
||||
# Code maturity level options
|
||||
|
@ -25,6 +28,7 @@ CONFIG_SWAP=y
|
|||
CONFIG_SYSVIPC=y
|
||||
CONFIG_POSIX_MQUEUE=y
|
||||
# CONFIG_BSD_PROCESS_ACCT is not set
|
||||
# CONFIG_TASKSTATS is not set
|
||||
CONFIG_SYSCTL=y
|
||||
CONFIG_AUDIT=y
|
||||
# CONFIG_AUDITSYSCALL is not set
|
||||
|
@ -43,10 +47,12 @@ CONFIG_PRINTK=y
|
|||
CONFIG_BUG=y
|
||||
CONFIG_ELF_CORE=y
|
||||
CONFIG_BASE_FULL=y
|
||||
CONFIG_RT_MUTEXES=y
|
||||
CONFIG_FUTEX=y
|
||||
CONFIG_EPOLL=y
|
||||
CONFIG_SHMEM=y
|
||||
CONFIG_SLAB=y
|
||||
CONFIG_VM_EVENT_COUNTERS=y
|
||||
# CONFIG_TINY_SHMEM is not set
|
||||
CONFIG_BASE_SMALL=0
|
||||
# CONFIG_SLOB is not set
|
||||
|
@ -94,7 +100,6 @@ CONFIG_HOTPLUG_CPU=y
|
|||
CONFIG_DEFAULT_MIGRATION_COST=1000000
|
||||
CONFIG_COMPAT=y
|
||||
CONFIG_SYSVIPC_COMPAT=y
|
||||
CONFIG_BINFMT_ELF32=y
|
||||
|
||||
#
|
||||
# Code generation options
|
||||
|
@ -115,6 +120,7 @@ CONFIG_FLATMEM=y
|
|||
CONFIG_FLAT_NODE_MEM_MAP=y
|
||||
# CONFIG_SPARSEMEM_STATIC is not set
|
||||
CONFIG_SPLIT_PTLOCK_CPUS=4
|
||||
CONFIG_RESOURCES_64BIT=y
|
||||
|
||||
#
|
||||
# I/O subsystem configuration
|
||||
|
@ -142,6 +148,7 @@ CONFIG_VIRT_CPU_ACCOUNTING=y
|
|||
# CONFIG_APPLDATA_BASE is not set
|
||||
CONFIG_NO_IDLE_HZ=y
|
||||
CONFIG_NO_IDLE_HZ_INIT=y
|
||||
CONFIG_S390_HYPFS_FS=y
|
||||
CONFIG_KEXEC=y
|
||||
|
||||
#
|
||||
|
@ -174,6 +181,8 @@ CONFIG_IP_FIB_HASH=y
|
|||
# CONFIG_INET_IPCOMP is not set
|
||||
# CONFIG_INET_XFRM_TUNNEL is not set
|
||||
# CONFIG_INET_TUNNEL is not set
|
||||
CONFIG_INET_XFRM_MODE_TRANSPORT=y
|
||||
CONFIG_INET_XFRM_MODE_TUNNEL=y
|
||||
CONFIG_INET_DIAG=y
|
||||
CONFIG_INET_TCP_DIAG=y
|
||||
# CONFIG_TCP_CONG_ADVANCED is not set
|
||||
|
@ -186,7 +195,10 @@ CONFIG_IPV6=y
|
|||
# CONFIG_INET6_IPCOMP is not set
|
||||
# CONFIG_INET6_XFRM_TUNNEL is not set
|
||||
# CONFIG_INET6_TUNNEL is not set
|
||||
CONFIG_INET6_XFRM_MODE_TRANSPORT=y
|
||||
CONFIG_INET6_XFRM_MODE_TUNNEL=y
|
||||
# CONFIG_IPV6_TUNNEL is not set
|
||||
# CONFIG_NETWORK_SECMARK is not set
|
||||
# CONFIG_NETFILTER is not set
|
||||
|
||||
#
|
||||
|
@ -263,6 +275,7 @@ CONFIG_NET_ESTIMATOR=y
|
|||
# Network testing
|
||||
#
|
||||
# CONFIG_NET_PKTGEN is not set
|
||||
# CONFIG_NET_TCPPROBE is not set
|
||||
# CONFIG_HAMRADIO is not set
|
||||
# CONFIG_IRDA is not set
|
||||
# CONFIG_BT is not set
|
||||
|
@ -276,6 +289,7 @@ CONFIG_STANDALONE=y
|
|||
CONFIG_PREVENT_FIRMWARE_BUILD=y
|
||||
# CONFIG_FW_LOADER is not set
|
||||
# CONFIG_DEBUG_DRIVER is not set
|
||||
CONFIG_SYS_HYPERVISOR=y
|
||||
|
||||
#
|
||||
# Connector - unified userspace <-> kernelspace linker
|
||||
|
@ -334,6 +348,7 @@ CONFIG_BLK_DEV_NBD=m
|
|||
CONFIG_BLK_DEV_RAM=y
|
||||
CONFIG_BLK_DEV_RAM_COUNT=16
|
||||
CONFIG_BLK_DEV_RAM_SIZE=4096
|
||||
CONFIG_BLK_DEV_RAM_BLOCKSIZE=1024
|
||||
CONFIG_BLK_DEV_INITRD=y
|
||||
# CONFIG_CDROM_PKTCDVD is not set
|
||||
|
||||
|
@ -359,9 +374,7 @@ CONFIG_MD_LINEAR=m
|
|||
CONFIG_MD_RAID0=m
|
||||
CONFIG_MD_RAID1=m
|
||||
# CONFIG_MD_RAID10 is not set
|
||||
CONFIG_MD_RAID5=m
|
||||
# CONFIG_MD_RAID5_RESHAPE is not set
|
||||
# CONFIG_MD_RAID6 is not set
|
||||
# CONFIG_MD_RAID456 is not set
|
||||
CONFIG_MD_MULTIPATH=m
|
||||
# CONFIG_MD_FAULTY is not set
|
||||
CONFIG_BLK_DEV_DM=y
|
||||
|
@ -419,7 +432,8 @@ CONFIG_S390_TAPE_34XX=m
|
|||
#
|
||||
# Cryptographic devices
|
||||
#
|
||||
CONFIG_Z90CRYPT=m
|
||||
CONFIG_ZCRYPT=m
|
||||
# CONFIG_ZCRYPT_MONOLITHIC is not set
|
||||
|
||||
#
|
||||
# Network device support
|
||||
|
@ -509,6 +523,7 @@ CONFIG_FS_MBCACHE=y
|
|||
# CONFIG_MINIX_FS is not set
|
||||
# CONFIG_ROMFS_FS is not set
|
||||
CONFIG_INOTIFY=y
|
||||
CONFIG_INOTIFY_USER=y
|
||||
# CONFIG_QUOTA is not set
|
||||
CONFIG_DNOTIFY=y
|
||||
# CONFIG_AUTOFS_FS is not set
|
||||
|
@ -614,26 +629,36 @@ CONFIG_MSDOS_PARTITION=y
|
|||
# Instrumentation Support
|
||||
#
|
||||
# CONFIG_PROFILING is not set
|
||||
# CONFIG_STATISTICS is not set
|
||||
CONFIG_STATISTICS=y
|
||||
CONFIG_KPROBES=y
|
||||
|
||||
#
|
||||
# Kernel hacking
|
||||
#
|
||||
CONFIG_TRACE_IRQFLAGS_SUPPORT=y
|
||||
# CONFIG_PRINTK_TIME is not set
|
||||
CONFIG_MAGIC_SYSRQ=y
|
||||
# CONFIG_UNUSED_SYMBOLS is not set
|
||||
CONFIG_DEBUG_KERNEL=y
|
||||
CONFIG_LOG_BUF_SHIFT=17
|
||||
# CONFIG_DETECT_SOFTLOCKUP is not set
|
||||
# CONFIG_SCHEDSTATS is not set
|
||||
# CONFIG_DEBUG_SLAB is not set
|
||||
CONFIG_DEBUG_PREEMPT=y
|
||||
CONFIG_DEBUG_MUTEXES=y
|
||||
# CONFIG_DEBUG_RT_MUTEXES is not set
|
||||
# CONFIG_RT_MUTEX_TESTER is not set
|
||||
CONFIG_DEBUG_SPINLOCK=y
|
||||
CONFIG_DEBUG_MUTEXES=y
|
||||
# CONFIG_DEBUG_RWSEMS is not set
|
||||
# CONFIG_DEBUG_LOCK_ALLOC is not set
|
||||
# CONFIG_PROVE_LOCKING is not set
|
||||
CONFIG_DEBUG_SPINLOCK_SLEEP=y
|
||||
# CONFIG_DEBUG_LOCKING_API_SELFTESTS is not set
|
||||
# CONFIG_DEBUG_KOBJECT is not set
|
||||
# CONFIG_DEBUG_INFO is not set
|
||||
CONFIG_DEBUG_FS=y
|
||||
# CONFIG_DEBUG_VM is not set
|
||||
# CONFIG_FRAME_POINTER is not set
|
||||
# CONFIG_UNWIND_INFO is not set
|
||||
CONFIG_FORCED_INLINING=y
|
||||
# CONFIG_RCU_TORTURE_TEST is not set
|
||||
|
@ -688,3 +713,4 @@ CONFIG_CRYPTO=y
|
|||
# CONFIG_CRC16 is not set
|
||||
CONFIG_CRC32=m
|
||||
# CONFIG_LIBCRC32C is not set
|
||||
CONFIG_PLIST=y
|
||||
|
|
|
@ -225,6 +225,32 @@ static __inline__ int has_low_battery(void)
|
|||
return (data1 == data2); /* Was the write blocked? */
|
||||
}
|
||||
|
||||
static void __init mostek_set_system_time(void)
|
||||
{
|
||||
unsigned int year, mon, day, hour, min, sec;
|
||||
struct mostek48t02 *mregs;
|
||||
|
||||
mregs = (struct mostek48t02 *)mstk48t02_regs;
|
||||
if(!mregs) {
|
||||
prom_printf("Something wrong, clock regs not mapped yet.\n");
|
||||
prom_halt();
|
||||
}
|
||||
spin_lock_irq(&mostek_lock);
|
||||
mregs->creg |= MSTK_CREG_READ;
|
||||
sec = MSTK_REG_SEC(mregs);
|
||||
min = MSTK_REG_MIN(mregs);
|
||||
hour = MSTK_REG_HOUR(mregs);
|
||||
day = MSTK_REG_DOM(mregs);
|
||||
mon = MSTK_REG_MONTH(mregs);
|
||||
year = MSTK_CVT_YEAR( MSTK_REG_YEAR(mregs) );
|
||||
xtime.tv_sec = mktime(year, mon, day, hour, min, sec);
|
||||
xtime.tv_nsec = (INITIAL_JIFFIES % HZ) * (NSEC_PER_SEC / HZ);
|
||||
set_normalized_timespec(&wall_to_monotonic,
|
||||
-xtime.tv_sec, -xtime.tv_nsec);
|
||||
mregs->creg &= ~MSTK_CREG_READ;
|
||||
spin_unlock_irq(&mostek_lock);
|
||||
}
|
||||
|
||||
/* Probe for the real time clock chip on Sun4 */
|
||||
static __inline__ void sun4_clock_probe(void)
|
||||
{
|
||||
|
@ -273,6 +299,7 @@ static __inline__ void sun4_clock_probe(void)
|
|||
#endif
|
||||
}
|
||||
|
||||
#ifndef CONFIG_SUN4
|
||||
static int __devinit clock_probe(struct of_device *op, const struct of_device_id *match)
|
||||
{
|
||||
struct device_node *dp = op->node;
|
||||
|
@ -307,6 +334,8 @@ static int __devinit clock_probe(struct of_device *op, const struct of_device_id
|
|||
if (mostek_read(mstk48t02_regs + MOSTEK_SEC) & MSTK_STOP)
|
||||
kick_start_clock();
|
||||
|
||||
mostek_set_system_time();
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -325,56 +354,37 @@ static struct of_platform_driver clock_driver = {
|
|||
|
||||
|
||||
/* Probe for the mostek real time clock chip. */
|
||||
static void clock_init(void)
|
||||
static int __init clock_init(void)
|
||||
{
|
||||
of_register_driver(&clock_driver, &of_bus_type);
|
||||
return of_register_driver(&clock_driver, &of_bus_type);
|
||||
}
|
||||
|
||||
/* Must be after subsys_initcall() so that busses are probed. Must
|
||||
* be before device_initcall() because things like the RTC driver
|
||||
* need to see the clock registers.
|
||||
*/
|
||||
fs_initcall(clock_init);
|
||||
#endif /* !CONFIG_SUN4 */
|
||||
|
||||
void __init sbus_time_init(void)
|
||||
{
|
||||
unsigned int year, mon, day, hour, min, sec;
|
||||
struct mostek48t02 *mregs;
|
||||
|
||||
#ifdef CONFIG_SUN4
|
||||
int temp;
|
||||
struct intersil *iregs;
|
||||
#endif
|
||||
|
||||
BTFIXUPSET_CALL(bus_do_settimeofday, sbus_do_settimeofday, BTFIXUPCALL_NORM);
|
||||
btfixup();
|
||||
|
||||
if (ARCH_SUN4)
|
||||
sun4_clock_probe();
|
||||
else
|
||||
clock_init();
|
||||
|
||||
sparc_init_timers(timer_interrupt);
|
||||
|
||||
#ifdef CONFIG_SUN4
|
||||
if(idprom->id_machtype == (SM_SUN4 | SM_4_330)) {
|
||||
#endif
|
||||
mregs = (struct mostek48t02 *)mstk48t02_regs;
|
||||
if(!mregs) {
|
||||
prom_printf("Something wrong, clock regs not mapped yet.\n");
|
||||
prom_halt();
|
||||
}
|
||||
spin_lock_irq(&mostek_lock);
|
||||
mregs->creg |= MSTK_CREG_READ;
|
||||
sec = MSTK_REG_SEC(mregs);
|
||||
min = MSTK_REG_MIN(mregs);
|
||||
hour = MSTK_REG_HOUR(mregs);
|
||||
day = MSTK_REG_DOM(mregs);
|
||||
mon = MSTK_REG_MONTH(mregs);
|
||||
year = MSTK_CVT_YEAR( MSTK_REG_YEAR(mregs) );
|
||||
xtime.tv_sec = mktime(year, mon, day, hour, min, sec);
|
||||
xtime.tv_nsec = (INITIAL_JIFFIES % HZ) * (NSEC_PER_SEC / HZ);
|
||||
set_normalized_timespec(&wall_to_monotonic,
|
||||
-xtime.tv_sec, -xtime.tv_nsec);
|
||||
mregs->creg &= ~MSTK_CREG_READ;
|
||||
spin_unlock_irq(&mostek_lock);
|
||||
#ifdef CONFIG_SUN4
|
||||
mostek_set_system_time();
|
||||
} else if(idprom->id_machtype == (SM_SUN4 | SM_4_260) ) {
|
||||
/* initialise the intersil on sun4 */
|
||||
unsigned int year, mon, day, hour, min, sec;
|
||||
int temp;
|
||||
struct intersil *iregs;
|
||||
|
||||
iregs=intersil_clock;
|
||||
if(!iregs) {
|
||||
|
|
|
@ -26,6 +26,7 @@ SECTIONS
|
|||
|
||||
/* Read-only sections, merged into text segment: */
|
||||
.hash : { *(.hash) }
|
||||
.gnu.hash : { *(.gnu.hash) }
|
||||
.dynsym : { *(.dynsym) }
|
||||
.dynstr : { *(.dynstr) }
|
||||
.gnu.version : { *(.gnu.version) }
|
||||
|
|
|
@ -1,8 +1,8 @@
|
|||
/*
|
||||
* arch/v850/kernel/setup.c -- Arch-dependent initialization functions
|
||||
*
|
||||
* Copyright (C) 2001,02,03,05 NEC Electronics Corporation
|
||||
* Copyright (C) 2001,02,03,05 Miles Bader <miles@gnu.org>
|
||||
* Copyright (C) 2001,02,03,05,06 NEC Electronics Corporation
|
||||
* Copyright (C) 2001,02,03,05,06 Miles Bader <miles@gnu.org>
|
||||
*
|
||||
* This file is subject to the terms and conditions of the GNU General
|
||||
* Public License. See the file COPYING in the main directory of this
|
||||
|
@ -190,7 +190,7 @@ void free_initmem (void)
|
|||
for (addr = start; addr < end; addr += PAGE_SIZE) {
|
||||
struct page *page = virt_to_page (addr);
|
||||
ClearPageReserved (page);
|
||||
set_page_count (page, 1);
|
||||
init_page_count (page);
|
||||
__free_page (page);
|
||||
total_ram_pages++;
|
||||
}
|
||||
|
|
|
@ -21,9 +21,6 @@ EXPORT_SYMBOL (trap_table);
|
|||
|
||||
/* platform dependent support */
|
||||
EXPORT_SYMBOL (kernel_thread);
|
||||
EXPORT_SYMBOL (enable_irq);
|
||||
EXPORT_SYMBOL (disable_irq);
|
||||
EXPORT_SYMBOL (disable_irq_nosync);
|
||||
EXPORT_SYMBOL (__bug);
|
||||
|
||||
/* Networking helper routines. */
|
||||
|
@ -33,22 +30,9 @@ EXPORT_SYMBOL (ip_compute_csum);
|
|||
EXPORT_SYMBOL (ip_fast_csum);
|
||||
|
||||
/* string / mem functions */
|
||||
EXPORT_SYMBOL (strcpy);
|
||||
EXPORT_SYMBOL (strncpy);
|
||||
EXPORT_SYMBOL (strcat);
|
||||
EXPORT_SYMBOL (strncat);
|
||||
EXPORT_SYMBOL (strcmp);
|
||||
EXPORT_SYMBOL (strncmp);
|
||||
EXPORT_SYMBOL (strchr);
|
||||
EXPORT_SYMBOL (strlen);
|
||||
EXPORT_SYMBOL (strnlen);
|
||||
EXPORT_SYMBOL (strrchr);
|
||||
EXPORT_SYMBOL (strstr);
|
||||
EXPORT_SYMBOL (memset);
|
||||
EXPORT_SYMBOL (memcpy);
|
||||
EXPORT_SYMBOL (memmove);
|
||||
EXPORT_SYMBOL (memcmp);
|
||||
EXPORT_SYMBOL (memscan);
|
||||
|
||||
/* semaphores */
|
||||
EXPORT_SYMBOL (__down);
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
#
|
||||
# Automatically generated make config: don't edit
|
||||
# Linux kernel version: 2.6.17-git22
|
||||
# Tue Jul 4 14:24:40 2006
|
||||
# Linux kernel version: 2.6.18-rc2
|
||||
# Tue Jul 18 17:13:20 2006
|
||||
#
|
||||
CONFIG_X86_64=y
|
||||
CONFIG_64BIT=y
|
||||
|
@ -37,6 +37,7 @@ CONFIG_SWAP=y
|
|||
CONFIG_SYSVIPC=y
|
||||
CONFIG_POSIX_MQUEUE=y
|
||||
# CONFIG_BSD_PROCESS_ACCT is not set
|
||||
# CONFIG_TASKSTATS is not set
|
||||
CONFIG_SYSCTL=y
|
||||
# CONFIG_AUDIT is not set
|
||||
CONFIG_IKCONFIG=y
|
||||
|
@ -413,6 +414,7 @@ CONFIG_BLK_DEV_LOOP=y
|
|||
CONFIG_BLK_DEV_RAM=y
|
||||
CONFIG_BLK_DEV_RAM_COUNT=16
|
||||
CONFIG_BLK_DEV_RAM_SIZE=4096
|
||||
CONFIG_BLK_DEV_RAM_BLOCKSIZE=1024
|
||||
CONFIG_BLK_DEV_INITRD=y
|
||||
# CONFIG_CDROM_PKTCDVD is not set
|
||||
# CONFIG_ATA_OVER_ETH is not set
|
||||
|
@ -1195,7 +1197,7 @@ CONFIG_USB_MON=y
|
|||
# CONFIG_USB_LEGOTOWER is not set
|
||||
# CONFIG_USB_LCD is not set
|
||||
# CONFIG_USB_LED is not set
|
||||
# CONFIG_USB_CY7C63 is not set
|
||||
# CONFIG_USB_CYPRESS_CY7C63 is not set
|
||||
# CONFIG_USB_CYTHERM is not set
|
||||
# CONFIG_USB_PHIDGETKIT is not set
|
||||
# CONFIG_USB_PHIDGETSERVO is not set
|
||||
|
@ -1373,7 +1375,6 @@ CONFIG_SUNRPC=y
|
|||
# CONFIG_RPCSEC_GSS_SPKM3 is not set
|
||||
# CONFIG_SMB_FS is not set
|
||||
# CONFIG_CIFS is not set
|
||||
# CONFIG_CIFS_DEBUG2 is not set
|
||||
# CONFIG_NCP_FS is not set
|
||||
# CONFIG_CODA_FS is not set
|
||||
# CONFIG_AFS_FS is not set
|
||||
|
|
|
@ -23,6 +23,7 @@ targets := $(foreach F,sysenter syscall,vsyscall-$F.o vsyscall-$F.so)
|
|||
# The DSO images are built using a special linker script
|
||||
quiet_cmd_syscall = SYSCALL $@
|
||||
cmd_syscall = $(CC) -m32 -nostdlib -shared -s \
|
||||
$(call ld-option, -Wl$(comma)--hash-style=sysv) \
|
||||
-Wl,-soname=linux-gate.so.1 -o $@ \
|
||||
-Wl,-T,$(filter-out FORCE,$^)
|
||||
|
||||
|
|
|
@ -103,7 +103,7 @@ ENTRY(ia32_sysenter_target)
|
|||
pushq %rax
|
||||
CFI_ADJUST_CFA_OFFSET 8
|
||||
cld
|
||||
SAVE_ARGS 0,0,1
|
||||
SAVE_ARGS 0,0,0
|
||||
/* no need to do an access_ok check here because rbp has been
|
||||
32bit zero extended */
|
||||
1: movl (%rbp),%r9d
|
||||
|
|
|
@ -11,6 +11,7 @@ SECTIONS
|
|||
. = VSYSCALL_BASE + SIZEOF_HEADERS;
|
||||
|
||||
.hash : { *(.hash) } :text
|
||||
.gnu.hash : { *(.gnu.hash) }
|
||||
.dynsym : { *(.dynsym) }
|
||||
.dynstr : { *(.dynstr) }
|
||||
.gnu.version : { *(.gnu.version) }
|
||||
|
|
|
@ -207,14 +207,11 @@ NORET_TYPE void machine_kexec(struct kimage *image)
|
|||
__flush_tlb();
|
||||
|
||||
|
||||
/* The segment registers are funny things, they are
|
||||
* automatically loaded from a table, in memory wherever you
|
||||
* set them to a specific selector, but this table is never
|
||||
* accessed again unless you set the segment to a different selector.
|
||||
*
|
||||
* The more common model are caches where the behide
|
||||
* the scenes work is done, but is also dropped at arbitrary
|
||||
* times.
|
||||
/* The segment registers are funny things, they have both a
|
||||
* visible and an invisible part. Whenever the visible part is
|
||||
* set to a specific selector, the invisible part is loaded
|
||||
* with from a table in memory. At no other time is the
|
||||
* descriptor table in memory accessed.
|
||||
*
|
||||
* I take advantage of this here by force loading the
|
||||
* segments, before I zap the gdt with an invalid value.
|
||||
|
|
|
@ -615,7 +615,7 @@ static __cpuinit int mce_create_device(unsigned int cpu)
|
|||
}
|
||||
|
||||
#ifdef CONFIG_HOTPLUG_CPU
|
||||
static __cpuinit void mce_remove_device(unsigned int cpu)
|
||||
static void mce_remove_device(unsigned int cpu)
|
||||
{
|
||||
int i;
|
||||
|
||||
|
@ -626,10 +626,9 @@ static __cpuinit void mce_remove_device(unsigned int cpu)
|
|||
sysdev_remove_file(&per_cpu(device_mce,cpu), &attr_check_interval);
|
||||
sysdev_unregister(&per_cpu(device_mce,cpu));
|
||||
}
|
||||
#endif
|
||||
|
||||
/* Get notified when a cpu comes on/off. Be hotplug friendly. */
|
||||
static __cpuinit int
|
||||
static int
|
||||
mce_cpu_callback(struct notifier_block *nfb, unsigned long action, void *hcpu)
|
||||
{
|
||||
unsigned int cpu = (unsigned long)hcpu;
|
||||
|
@ -638,18 +637,17 @@ mce_cpu_callback(struct notifier_block *nfb, unsigned long action, void *hcpu)
|
|||
case CPU_ONLINE:
|
||||
mce_create_device(cpu);
|
||||
break;
|
||||
#ifdef CONFIG_HOTPLUG_CPU
|
||||
case CPU_DEAD:
|
||||
mce_remove_device(cpu);
|
||||
break;
|
||||
#endif
|
||||
}
|
||||
return NOTIFY_OK;
|
||||
}
|
||||
|
||||
static struct notifier_block __cpuinitdata mce_cpu_notifier = {
|
||||
static struct notifier_block mce_cpu_notifier = {
|
||||
.notifier_call = mce_cpu_callback,
|
||||
};
|
||||
#endif
|
||||
|
||||
static __init int mce_init_device(void)
|
||||
{
|
||||
|
@ -664,7 +662,7 @@ static __init int mce_init_device(void)
|
|||
mce_create_device(i);
|
||||
}
|
||||
|
||||
register_cpu_notifier(&mce_cpu_notifier);
|
||||
register_hotcpu_notifier(&mce_cpu_notifier);
|
||||
misc_register(&mce_log_device);
|
||||
return err;
|
||||
}
|
||||
|
|
|
@ -558,7 +558,7 @@ out:
|
|||
* of shared sysfs dir/files, and rest of the cores will be symlinked to it.
|
||||
*/
|
||||
|
||||
static __cpuinit void deallocate_threshold_block(unsigned int cpu,
|
||||
static void deallocate_threshold_block(unsigned int cpu,
|
||||
unsigned int bank)
|
||||
{
|
||||
struct threshold_block *pos = NULL;
|
||||
|
@ -578,7 +578,7 @@ static __cpuinit void deallocate_threshold_block(unsigned int cpu,
|
|||
per_cpu(threshold_banks, cpu)[bank]->blocks = NULL;
|
||||
}
|
||||
|
||||
static __cpuinit void threshold_remove_bank(unsigned int cpu, int bank)
|
||||
static void threshold_remove_bank(unsigned int cpu, int bank)
|
||||
{
|
||||
int i = 0;
|
||||
struct threshold_bank *b;
|
||||
|
@ -618,7 +618,7 @@ free_out:
|
|||
per_cpu(threshold_banks, cpu)[bank] = NULL;
|
||||
}
|
||||
|
||||
static __cpuinit void threshold_remove_device(unsigned int cpu)
|
||||
static void threshold_remove_device(unsigned int cpu)
|
||||
{
|
||||
unsigned int bank;
|
||||
|
||||
|
@ -629,14 +629,8 @@ static __cpuinit void threshold_remove_device(unsigned int cpu)
|
|||
}
|
||||
}
|
||||
|
||||
#else /* !CONFIG_HOTPLUG_CPU */
|
||||
static void threshold_remove_device(unsigned int cpu)
|
||||
{
|
||||
}
|
||||
#endif
|
||||
|
||||
/* get notified when a cpu comes on/off */
|
||||
static int __cpuinit threshold_cpu_callback(struct notifier_block *nfb,
|
||||
static int threshold_cpu_callback(struct notifier_block *nfb,
|
||||
unsigned long action, void *hcpu)
|
||||
{
|
||||
/* cpu was unsigned int to begin with */
|
||||
|
@ -659,9 +653,10 @@ static int __cpuinit threshold_cpu_callback(struct notifier_block *nfb,
|
|||
return NOTIFY_OK;
|
||||
}
|
||||
|
||||
static struct notifier_block threshold_cpu_notifier __cpuinitdata = {
|
||||
static struct notifier_block threshold_cpu_notifier = {
|
||||
.notifier_call = threshold_cpu_callback,
|
||||
};
|
||||
#endif /* CONFIG_HOTPLUG_CPU */
|
||||
|
||||
static __init int threshold_init_device(void)
|
||||
{
|
||||
|
@ -673,7 +668,7 @@ static __init int threshold_init_device(void)
|
|||
if (err)
|
||||
return err;
|
||||
}
|
||||
register_cpu_notifier(&threshold_cpu_notifier);
|
||||
register_hotcpu_notifier(&threshold_cpu_notifier);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
|
@ -85,7 +85,8 @@
|
|||
#define CSR_AGENT_MASK 0xffe0ffff
|
||||
|
||||
#define MAX_NUM_OF_PHBS 8 /* how many PHBs in total? */
|
||||
#define MAX_PHB_BUS_NUM (MAX_NUM_OF_PHBS * 2) /* max dev->bus->number */
|
||||
#define MAX_NUM_CHASSIS 8 /* max number of chassis */
|
||||
#define MAX_PHB_BUS_NUM (MAX_NUM_OF_PHBS * MAX_NUM_CHASSIS * 2) /* max dev->bus->number */
|
||||
#define PHBS_PER_CALGARY 4
|
||||
|
||||
/* register offsets in Calgary's internal register space */
|
||||
|
@ -110,7 +111,8 @@ static const unsigned long phb_offsets[] = {
|
|||
0xB000 /* PHB3 */
|
||||
};
|
||||
|
||||
void* tce_table_kva[MAX_NUM_OF_PHBS * MAX_NUMNODES];
|
||||
static char bus_to_phb[MAX_PHB_BUS_NUM];
|
||||
void* tce_table_kva[MAX_PHB_BUS_NUM];
|
||||
unsigned int specified_table_size = TCE_TABLE_SIZE_UNSPECIFIED;
|
||||
static int translate_empty_slots __read_mostly = 0;
|
||||
static int calgary_detected __read_mostly = 0;
|
||||
|
@ -119,7 +121,7 @@ static int calgary_detected __read_mostly = 0;
|
|||
* the bitmap of PHBs the user requested that we disable
|
||||
* translation on.
|
||||
*/
|
||||
static DECLARE_BITMAP(translation_disabled, MAX_NUMNODES * MAX_PHB_BUS_NUM);
|
||||
static DECLARE_BITMAP(translation_disabled, MAX_PHB_BUS_NUM);
|
||||
|
||||
static void tce_cache_blast(struct iommu_table *tbl);
|
||||
|
||||
|
@ -452,7 +454,7 @@ static struct dma_mapping_ops calgary_dma_ops = {
|
|||
|
||||
static inline int busno_to_phbid(unsigned char num)
|
||||
{
|
||||
return bus_to_phb(num) % PHBS_PER_CALGARY;
|
||||
return bus_to_phb[num];
|
||||
}
|
||||
|
||||
static inline unsigned long split_queue_offset(unsigned char num)
|
||||
|
@ -812,7 +814,7 @@ static int __init calgary_init(void)
|
|||
int i, ret = -ENODEV;
|
||||
struct pci_dev *dev = NULL;
|
||||
|
||||
for (i = 0; i <= num_online_nodes() * MAX_NUM_OF_PHBS; i++) {
|
||||
for (i = 0; i < MAX_PHB_BUS_NUM; i++) {
|
||||
dev = pci_get_device(PCI_VENDOR_ID_IBM,
|
||||
PCI_DEVICE_ID_IBM_CALGARY,
|
||||
dev);
|
||||
|
@ -822,7 +824,7 @@ static int __init calgary_init(void)
|
|||
calgary_init_one_nontraslated(dev);
|
||||
continue;
|
||||
}
|
||||
if (!tce_table_kva[i] && !translate_empty_slots) {
|
||||
if (!tce_table_kva[dev->bus->number] && !translate_empty_slots) {
|
||||
pci_dev_put(dev);
|
||||
continue;
|
||||
}
|
||||
|
@ -842,7 +844,7 @@ error:
|
|||
pci_dev_put(dev);
|
||||
continue;
|
||||
}
|
||||
if (!tce_table_kva[i] && !translate_empty_slots)
|
||||
if (!tce_table_kva[dev->bus->number] && !translate_empty_slots)
|
||||
continue;
|
||||
calgary_disable_translation(dev);
|
||||
calgary_free_tar(dev);
|
||||
|
@ -876,9 +878,10 @@ static inline int __init determine_tce_table_size(u64 ram)
|
|||
void __init detect_calgary(void)
|
||||
{
|
||||
u32 val;
|
||||
int bus, table_idx;
|
||||
int bus;
|
||||
void *tbl;
|
||||
int detected = 0;
|
||||
int calgary_found = 0;
|
||||
int phb = -1;
|
||||
|
||||
/*
|
||||
* if the user specified iommu=off or iommu=soft or we found
|
||||
|
@ -889,38 +892,46 @@ void __init detect_calgary(void)
|
|||
|
||||
specified_table_size = determine_tce_table_size(end_pfn * PAGE_SIZE);
|
||||
|
||||
for (bus = 0, table_idx = 0;
|
||||
bus <= num_online_nodes() * MAX_PHB_BUS_NUM;
|
||||
bus++) {
|
||||
BUG_ON(bus > MAX_NUMNODES * MAX_PHB_BUS_NUM);
|
||||
for (bus = 0; bus < MAX_PHB_BUS_NUM; bus++) {
|
||||
int dev;
|
||||
|
||||
tce_table_kva[bus] = NULL;
|
||||
bus_to_phb[bus] = -1;
|
||||
|
||||
if (read_pci_config(bus, 0, 0, 0) != PCI_VENDOR_DEVICE_ID_CALGARY)
|
||||
continue;
|
||||
|
||||
/*
|
||||
* There are 4 PHBs per Calgary chip. Set phb to which phb (0-3)
|
||||
* it is connected to releative to the clagary chip.
|
||||
*/
|
||||
phb = (phb + 1) % PHBS_PER_CALGARY;
|
||||
|
||||
if (test_bit(bus, translation_disabled)) {
|
||||
printk(KERN_INFO "Calgary: translation is disabled for "
|
||||
"PHB 0x%x\n", bus);
|
||||
/* skip this phb, don't allocate a tbl for it */
|
||||
tce_table_kva[table_idx] = NULL;
|
||||
table_idx++;
|
||||
continue;
|
||||
}
|
||||
/*
|
||||
* scan the first slot of the PCI bus to see if there
|
||||
* are any devices present
|
||||
* Scan the slots of the PCI bus to see if there is a device present.
|
||||
* The parent bus will be the zero-ith device, so start at 1.
|
||||
*/
|
||||
val = read_pci_config(bus, 1, 0, 0);
|
||||
if (val != 0xffffffff || translate_empty_slots) {
|
||||
tbl = alloc_tce_table();
|
||||
if (!tbl)
|
||||
goto cleanup;
|
||||
detected = 1;
|
||||
} else
|
||||
tbl = NULL;
|
||||
|
||||
tce_table_kva[table_idx] = tbl;
|
||||
table_idx++;
|
||||
for (dev = 1; dev < 8; dev++) {
|
||||
val = read_pci_config(bus, dev, 0, 0);
|
||||
if (val != 0xffffffff || translate_empty_slots) {
|
||||
tbl = alloc_tce_table();
|
||||
if (!tbl)
|
||||
goto cleanup;
|
||||
tce_table_kva[bus] = tbl;
|
||||
bus_to_phb[bus] = phb;
|
||||
calgary_found = 1;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (detected) {
|
||||
if (calgary_found) {
|
||||
iommu_detected = 1;
|
||||
calgary_detected = 1;
|
||||
printk(KERN_INFO "PCI-DMA: Calgary IOMMU detected. "
|
||||
|
@ -929,9 +940,9 @@ void __init detect_calgary(void)
|
|||
return;
|
||||
|
||||
cleanup:
|
||||
for (--table_idx; table_idx >= 0; --table_idx)
|
||||
if (tce_table_kva[table_idx])
|
||||
free_tce_table(tce_table_kva[table_idx]);
|
||||
for (--bus; bus >= 0; --bus)
|
||||
if (tce_table_kva[bus])
|
||||
free_tce_table(tce_table_kva[bus]);
|
||||
}
|
||||
|
||||
int __init calgary_iommu_init(void)
|
||||
|
@ -1002,7 +1013,7 @@ static int __init calgary_parse_options(char *p)
|
|||
if (p == endp)
|
||||
break;
|
||||
|
||||
if (bridge <= (num_online_nodes() * MAX_PHB_BUS_NUM)) {
|
||||
if (bridge < MAX_PHB_BUS_NUM) {
|
||||
printk(KERN_INFO "Calgary: disabling "
|
||||
"translation for PHB 0x%x\n", bridge);
|
||||
set_bit(bridge, translation_disabled);
|
||||
|
|
|
@ -31,9 +31,10 @@ struct dma_mapping_ops swiotlb_dma_ops = {
|
|||
void pci_swiotlb_init(void)
|
||||
{
|
||||
/* don't initialize swiotlb if iommu=off (no_iommu=1) */
|
||||
if (!iommu_detected && !no_iommu &&
|
||||
(end_pfn > MAX_DMA32_PFN || force_iommu))
|
||||
if (!iommu_detected && !no_iommu && end_pfn > MAX_DMA32_PFN)
|
||||
swiotlb = 1;
|
||||
if (swiotlb_force)
|
||||
swiotlb = 1;
|
||||
if (swiotlb) {
|
||||
printk(KERN_INFO "PCI-DMA: Using software bounce buffering for IO (SWIOTLB)\n");
|
||||
swiotlb_init();
|
||||
|
|
|
@ -96,7 +96,6 @@ static inline unsigned int table_size_to_number_of_entries(unsigned char size)
|
|||
static int tce_table_setparms(struct pci_dev *dev, struct iommu_table *tbl)
|
||||
{
|
||||
unsigned int bitmapsz;
|
||||
unsigned int tce_table_index;
|
||||
unsigned long bmppages;
|
||||
int ret;
|
||||
|
||||
|
@ -105,8 +104,7 @@ static int tce_table_setparms(struct pci_dev *dev, struct iommu_table *tbl)
|
|||
/* set the tce table size - measured in entries */
|
||||
tbl->it_size = table_size_to_number_of_entries(specified_table_size);
|
||||
|
||||
tce_table_index = bus_to_phb(tbl->it_busno);
|
||||
tbl->it_base = (unsigned long)tce_table_kva[tce_table_index];
|
||||
tbl->it_base = (unsigned long)tce_table_kva[dev->bus->number];
|
||||
if (!tbl->it_base) {
|
||||
printk(KERN_ERR "Calgary: iommu_table_setparms: "
|
||||
"no table allocated?!\n");
|
||||
|
|
|
@ -28,6 +28,7 @@
|
|||
#include <linux/acpi.h>
|
||||
#ifdef CONFIG_ACPI
|
||||
#include <acpi/achware.h> /* for PM timer frequency */
|
||||
#include <acpi/acpi_bus.h>
|
||||
#endif
|
||||
#include <asm/8253pit.h>
|
||||
#include <asm/pgtable.h>
|
||||
|
@ -193,7 +194,7 @@ unsigned long profile_pc(struct pt_regs *regs)
|
|||
is just accounted to the spinlock function.
|
||||
Better would be to write these functions in assembler again
|
||||
and check exactly. */
|
||||
if (in_lock_functions(pc)) {
|
||||
if (!user_mode(regs) && in_lock_functions(pc)) {
|
||||
char *v = *(char **)regs->rsp;
|
||||
if ((v >= _stext && v <= _etext) ||
|
||||
(v >= _sinittext && v <= _einittext) ||
|
||||
|
@ -953,11 +954,18 @@ __cpuinit int unsynchronized_tsc(void)
|
|||
#ifdef CONFIG_SMP
|
||||
if (apic_is_clustered_box())
|
||||
return 1;
|
||||
/* Intel systems are normally all synchronized. Exceptions
|
||||
are handled in the check above. */
|
||||
if (boot_cpu_data.x86_vendor == X86_VENDOR_INTEL)
|
||||
return 0;
|
||||
#endif
|
||||
/* Most intel systems have synchronized TSCs except for
|
||||
multi node systems */
|
||||
if (boot_cpu_data.x86_vendor == X86_VENDOR_INTEL) {
|
||||
#ifdef CONFIG_ACPI
|
||||
/* But TSC doesn't tick in C3 so don't use it there */
|
||||
if (acpi_fadt.length > 0 && acpi_fadt.plvl3_lat < 100)
|
||||
return 1;
|
||||
#endif
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* Assume multi socket systems are not synchronized */
|
||||
return num_present_cpus() > 1;
|
||||
}
|
||||
|
|
|
@ -254,7 +254,6 @@ void show_trace(struct task_struct *tsk, struct pt_regs *regs, unsigned long * s
|
|||
{
|
||||
const unsigned cpu = safe_smp_processor_id();
|
||||
unsigned long *irqstack_end = (unsigned long *)cpu_pda(cpu)->irqstackptr;
|
||||
int i = 11;
|
||||
unsigned used = 0;
|
||||
|
||||
printk("\nCall Trace:\n");
|
||||
|
@ -275,11 +274,20 @@ void show_trace(struct task_struct *tsk, struct pt_regs *regs, unsigned long * s
|
|||
if (unwind_init_blocked(&info, tsk) == 0)
|
||||
unw_ret = show_trace_unwind(&info, NULL);
|
||||
}
|
||||
if (unw_ret > 0) {
|
||||
if (call_trace > 0)
|
||||
if (unw_ret > 0 && !arch_unw_user_mode(&info)) {
|
||||
#ifdef CONFIG_STACK_UNWIND
|
||||
unsigned long rip = info.regs.rip;
|
||||
print_symbol("DWARF2 unwinder stuck at %s\n", rip);
|
||||
if (call_trace == 1) {
|
||||
printk("Leftover inexact backtrace:\n");
|
||||
stack = (unsigned long *)info.regs.rsp;
|
||||
} else if (call_trace > 1)
|
||||
return;
|
||||
printk("Legacy call trace:");
|
||||
i = 18;
|
||||
else
|
||||
printk("Full inexact backtrace again:\n");
|
||||
#else
|
||||
printk("Inexact backtrace:\n");
|
||||
#endif
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -521,7 +529,7 @@ void __kprobes oops_end(unsigned long flags)
|
|||
/* Nest count reaches zero, release the lock. */
|
||||
spin_unlock_irqrestore(&die_lock, flags);
|
||||
if (panic_on_oops)
|
||||
panic("Oops");
|
||||
panic("Fatal exception: panic_on_oops");
|
||||
}
|
||||
|
||||
void __kprobes __die(const char * str, struct pt_regs * regs, long err)
|
||||
|
@ -1118,8 +1126,10 @@ static int __init call_trace_setup(char *s)
|
|||
call_trace = -1;
|
||||
else if (strcmp(s, "both") == 0)
|
||||
call_trace = 0;
|
||||
else if (strcmp(s, "new") == 0)
|
||||
else if (strcmp(s, "newfallback") == 0)
|
||||
call_trace = 1;
|
||||
else if (strcmp(s, "new") == 0)
|
||||
call_trace = 2;
|
||||
return 1;
|
||||
}
|
||||
__setup("call_trace=", call_trace_setup);
|
||||
|
|
|
@ -2,7 +2,6 @@
|
|||
#include <linux/pci.h>
|
||||
#include <asm/mpspec.h>
|
||||
#include <linux/cpumask.h>
|
||||
#include <asm/k8.h>
|
||||
|
||||
/*
|
||||
* This discovers the pcibus <-> node mapping on AMD K8.
|
||||
|
@ -19,6 +18,7 @@
|
|||
#define NR_LDT_BUS_NUMBER_REGISTERS 3
|
||||
#define SECONDARY_LDT_BUS_NUMBER(dword) ((dword >> 8) & 0xFF)
|
||||
#define SUBORDINATE_LDT_BUS_NUMBER(dword) ((dword >> 16) & 0xFF)
|
||||
#define PCI_DEVICE_ID_K8HTCONFIG 0x1100
|
||||
|
||||
/**
|
||||
* fill_mp_bus_to_cpumask()
|
||||
|
@ -28,7 +28,8 @@
|
|||
__init static int
|
||||
fill_mp_bus_to_cpumask(void)
|
||||
{
|
||||
int i, j, k;
|
||||
struct pci_dev *nb_dev = NULL;
|
||||
int i, j;
|
||||
u32 ldtbus, nid;
|
||||
static int lbnr[3] = {
|
||||
LDT_BUS_NUMBER_REGISTER_0,
|
||||
|
@ -36,9 +37,8 @@ fill_mp_bus_to_cpumask(void)
|
|||
LDT_BUS_NUMBER_REGISTER_2
|
||||
};
|
||||
|
||||
cache_k8_northbridges();
|
||||
for (k = 0; k < num_k8_northbridges; k++) {
|
||||
struct pci_dev *nb_dev = k8_northbridges[k];
|
||||
while ((nb_dev = pci_get_device(PCI_VENDOR_ID_AMD,
|
||||
PCI_DEVICE_ID_K8HTCONFIG, nb_dev))) {
|
||||
pci_read_config_dword(nb_dev, NODE_ID_REGISTER, &nid);
|
||||
|
||||
for (i = 0; i < NR_LDT_BUS_NUMBER_REGISTERS; i++) {
|
||||
|
|
|
@ -487,11 +487,9 @@ void die(const char * str, struct pt_regs * regs, long err)
|
|||
if (in_interrupt())
|
||||
panic("Fatal exception in interrupt");
|
||||
|
||||
if (panic_on_oops) {
|
||||
printk(KERN_EMERG "Fatal exception: panic in 5 seconds\n");
|
||||
ssleep(5);
|
||||
panic("Fatal exception");
|
||||
}
|
||||
if (panic_on_oops)
|
||||
panic("Fatal exception: panic_on_oops");
|
||||
|
||||
do_exit(err);
|
||||
}
|
||||
|
||||
|
|
|
@ -139,7 +139,7 @@ static int __cpuinit topology_sysfs_init(void)
|
|||
(void *)(long)i);
|
||||
}
|
||||
|
||||
register_cpu_notifier(&topology_cpu_notifier);
|
||||
register_hotcpu_notifier(&topology_cpu_notifier);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
|
|
@ -300,6 +300,15 @@ static struct request *nbd_read_stat(struct nbd_device *lo)
|
|||
lo->disk->disk_name, result);
|
||||
goto harderror;
|
||||
}
|
||||
|
||||
if (ntohl(reply.magic) != NBD_REPLY_MAGIC) {
|
||||
printk(KERN_ERR "%s: Wrong magic (0x%lx)\n",
|
||||
lo->disk->disk_name,
|
||||
(unsigned long)ntohl(reply.magic));
|
||||
result = -EPROTO;
|
||||
goto harderror;
|
||||
}
|
||||
|
||||
req = nbd_find_request(lo, reply.handle);
|
||||
if (unlikely(IS_ERR(req))) {
|
||||
result = PTR_ERR(req);
|
||||
|
@ -312,13 +321,6 @@ static struct request *nbd_read_stat(struct nbd_device *lo)
|
|||
goto harderror;
|
||||
}
|
||||
|
||||
if (ntohl(reply.magic) != NBD_REPLY_MAGIC) {
|
||||
printk(KERN_ERR "%s: Wrong magic (0x%lx)\n",
|
||||
lo->disk->disk_name,
|
||||
(unsigned long)ntohl(reply.magic));
|
||||
result = -EPROTO;
|
||||
goto harderror;
|
||||
}
|
||||
if (ntohl(reply.error)) {
|
||||
printk(KERN_ERR "%s: Other side returned error (%d)\n",
|
||||
lo->disk->disk_name, ntohl(reply.error));
|
||||
|
@ -339,7 +341,8 @@ static struct request *nbd_read_stat(struct nbd_device *lo)
|
|||
printk(KERN_ERR "%s: Receive data failed (result %d)\n",
|
||||
lo->disk->disk_name,
|
||||
result);
|
||||
goto harderror;
|
||||
req->errors++;
|
||||
return req;
|
||||
}
|
||||
dprintk(DBG_RX, "%s: request %p: got %d bytes data\n",
|
||||
lo->disk->disk_name, req, bvec->bv_len);
|
||||
|
|
|
@ -2577,19 +2577,19 @@ static int pkt_ctl_ioctl(struct inode *inode, struct file *file, unsigned int cm
|
|||
case PKT_CTRL_CMD_SETUP:
|
||||
if (!capable(CAP_SYS_ADMIN))
|
||||
return -EPERM;
|
||||
mutex_lock(&ctl_mutex);
|
||||
mutex_lock_nested(&ctl_mutex, SINGLE_DEPTH_NESTING);
|
||||
ret = pkt_setup_dev(&ctrl_cmd);
|
||||
mutex_unlock(&ctl_mutex);
|
||||
break;
|
||||
case PKT_CTRL_CMD_TEARDOWN:
|
||||
if (!capable(CAP_SYS_ADMIN))
|
||||
return -EPERM;
|
||||
mutex_lock(&ctl_mutex);
|
||||
mutex_lock_nested(&ctl_mutex, SINGLE_DEPTH_NESTING);
|
||||
ret = pkt_remove_dev(&ctrl_cmd);
|
||||
mutex_unlock(&ctl_mutex);
|
||||
break;
|
||||
case PKT_CTRL_CMD_STATUS:
|
||||
mutex_lock(&ctl_mutex);
|
||||
mutex_lock_nested(&ctl_mutex, SINGLE_DEPTH_NESTING);
|
||||
pkt_get_status(&ctrl_cmd);
|
||||
mutex_unlock(&ctl_mutex);
|
||||
break;
|
||||
|
|
|
@ -107,10 +107,14 @@ found:
|
|||
if (err) {
|
||||
printk(KERN_ERR PFX "RNG registering failed (%d)\n",
|
||||
err);
|
||||
goto out;
|
||||
goto err_unmap;
|
||||
}
|
||||
out:
|
||||
return err;
|
||||
|
||||
err_unmap:
|
||||
iounmap(mem);
|
||||
goto out;
|
||||
}
|
||||
|
||||
static void __exit mod_exit(void)
|
||||
|
|
|
@ -164,7 +164,7 @@ static int __init mod_init(void)
|
|||
if (err) {
|
||||
printk(KERN_ERR PFX "RNG registering failed (%d)\n",
|
||||
err);
|
||||
goto out;
|
||||
goto err_unmap;
|
||||
}
|
||||
out:
|
||||
return err;
|
||||
|
|
|
@ -221,7 +221,6 @@ static struct nsc_gpio_ops pc8736x_gpio_ops = {
|
|||
.gpio_change = pc8736x_gpio_change,
|
||||
.gpio_current = pc8736x_gpio_current
|
||||
};
|
||||
EXPORT_SYMBOL(pc8736x_gpio_ops);
|
||||
|
||||
static int pc8736x_gpio_open(struct inode *inode, struct file *file)
|
||||
{
|
||||
|
|
|
@ -51,6 +51,7 @@ void proc_fork_connector(struct task_struct *task)
|
|||
struct cn_msg *msg;
|
||||
struct proc_event *ev;
|
||||
__u8 buffer[CN_PROC_MSG_SIZE];
|
||||
struct timespec ts;
|
||||
|
||||
if (atomic_read(&proc_event_num_listeners) < 1)
|
||||
return;
|
||||
|
@ -58,7 +59,8 @@ void proc_fork_connector(struct task_struct *task)
|
|||
msg = (struct cn_msg*)buffer;
|
||||
ev = (struct proc_event*)msg->data;
|
||||
get_seq(&msg->seq, &ev->cpu);
|
||||
ktime_get_ts(&ev->timestamp); /* get high res monotonic timestamp */
|
||||
ktime_get_ts(&ts); /* get high res monotonic timestamp */
|
||||
ev->timestamp_ns = timespec_to_ns(&ts);
|
||||
ev->what = PROC_EVENT_FORK;
|
||||
ev->event_data.fork.parent_pid = task->real_parent->pid;
|
||||
ev->event_data.fork.parent_tgid = task->real_parent->tgid;
|
||||
|
@ -76,6 +78,7 @@ void proc_exec_connector(struct task_struct *task)
|
|||
{
|
||||
struct cn_msg *msg;
|
||||
struct proc_event *ev;
|
||||
struct timespec ts;
|
||||
__u8 buffer[CN_PROC_MSG_SIZE];
|
||||
|
||||
if (atomic_read(&proc_event_num_listeners) < 1)
|
||||
|
@ -84,7 +87,8 @@ void proc_exec_connector(struct task_struct *task)
|
|||
msg = (struct cn_msg*)buffer;
|
||||
ev = (struct proc_event*)msg->data;
|
||||
get_seq(&msg->seq, &ev->cpu);
|
||||
ktime_get_ts(&ev->timestamp);
|
||||
ktime_get_ts(&ts); /* get high res monotonic timestamp */
|
||||
ev->timestamp_ns = timespec_to_ns(&ts);
|
||||
ev->what = PROC_EVENT_EXEC;
|
||||
ev->event_data.exec.process_pid = task->pid;
|
||||
ev->event_data.exec.process_tgid = task->tgid;
|
||||
|
@ -100,6 +104,7 @@ void proc_id_connector(struct task_struct *task, int which_id)
|
|||
struct cn_msg *msg;
|
||||
struct proc_event *ev;
|
||||
__u8 buffer[CN_PROC_MSG_SIZE];
|
||||
struct timespec ts;
|
||||
|
||||
if (atomic_read(&proc_event_num_listeners) < 1)
|
||||
return;
|
||||
|
@ -118,7 +123,8 @@ void proc_id_connector(struct task_struct *task, int which_id)
|
|||
} else
|
||||
return;
|
||||
get_seq(&msg->seq, &ev->cpu);
|
||||
ktime_get_ts(&ev->timestamp);
|
||||
ktime_get_ts(&ts); /* get high res monotonic timestamp */
|
||||
ev->timestamp_ns = timespec_to_ns(&ts);
|
||||
|
||||
memcpy(&msg->id, &cn_proc_event_id, sizeof(msg->id));
|
||||
msg->ack = 0; /* not used */
|
||||
|
@ -131,6 +137,7 @@ void proc_exit_connector(struct task_struct *task)
|
|||
struct cn_msg *msg;
|
||||
struct proc_event *ev;
|
||||
__u8 buffer[CN_PROC_MSG_SIZE];
|
||||
struct timespec ts;
|
||||
|
||||
if (atomic_read(&proc_event_num_listeners) < 1)
|
||||
return;
|
||||
|
@ -138,7 +145,8 @@ void proc_exit_connector(struct task_struct *task)
|
|||
msg = (struct cn_msg*)buffer;
|
||||
ev = (struct proc_event*)msg->data;
|
||||
get_seq(&msg->seq, &ev->cpu);
|
||||
ktime_get_ts(&ev->timestamp);
|
||||
ktime_get_ts(&ts); /* get high res monotonic timestamp */
|
||||
ev->timestamp_ns = timespec_to_ns(&ts);
|
||||
ev->what = PROC_EVENT_EXIT;
|
||||
ev->event_data.exit.process_pid = task->pid;
|
||||
ev->event_data.exit.process_tgid = task->tgid;
|
||||
|
@ -164,6 +172,7 @@ static void cn_proc_ack(int err, int rcvd_seq, int rcvd_ack)
|
|||
struct cn_msg *msg;
|
||||
struct proc_event *ev;
|
||||
__u8 buffer[CN_PROC_MSG_SIZE];
|
||||
struct timespec ts;
|
||||
|
||||
if (atomic_read(&proc_event_num_listeners) < 1)
|
||||
return;
|
||||
|
@ -171,7 +180,8 @@ static void cn_proc_ack(int err, int rcvd_seq, int rcvd_ack)
|
|||
msg = (struct cn_msg*)buffer;
|
||||
ev = (struct proc_event*)msg->data;
|
||||
msg->seq = rcvd_seq;
|
||||
ktime_get_ts(&ev->timestamp);
|
||||
ktime_get_ts(&ts); /* get high res monotonic timestamp */
|
||||
ev->timestamp_ns = timespec_to_ns(&ts);
|
||||
ev->cpu = -1;
|
||||
ev->what = PROC_EVENT_NONE;
|
||||
ev->event_data.ack.err = err;
|
||||
|
|
|
@ -682,6 +682,7 @@ config BLK_DEV_SVWKS
|
|||
config BLK_DEV_SGIIOC4
|
||||
tristate "Silicon Graphics IOC4 chipset ATA/ATAPI support"
|
||||
depends on (IA64_SGI_SN2 || IA64_GENERIC) && SGI_IOC4
|
||||
select IDEPCI_SHARE_IRQ
|
||||
help
|
||||
This driver adds PIO & MultiMode DMA-2 support for the SGI IOC4
|
||||
chipset, which has one channel and can support two devices.
|
||||
|
@ -773,20 +774,6 @@ config BLK_DEV_IDEDMA_PMAC
|
|||
to transfer data to and from memory. Saying Y is safe and improves
|
||||
performance.
|
||||
|
||||
config BLK_DEV_IDE_PMAC_BLINK
|
||||
bool "Blink laptop LED on drive activity (DEPRECATED)"
|
||||
depends on BLK_DEV_IDE_PMAC && ADB_PMU
|
||||
select ADB_PMU_LED
|
||||
select LEDS_TRIGGERS
|
||||
select LEDS_TRIGGER_IDE_DISK
|
||||
help
|
||||
This option enables the use of the sleep LED as a hard drive
|
||||
activity LED.
|
||||
This option is deprecated, it only selects ADB_PMU_LED and
|
||||
LEDS_TRIGGER_IDE_DISK and changes the code in the new led class
|
||||
device to default to the ide-disk trigger (which should be set
|
||||
from userspace via sysfs).
|
||||
|
||||
config BLK_DEV_IDE_SWARM
|
||||
tristate "IDE for Sibyte evaluation boards"
|
||||
depends on SIBYTE_SB1xxx_SOC
|
||||
|
|
|
@ -776,7 +776,7 @@ static void update_ordered(ide_drive_t *drive)
|
|||
* not available so we don't need to recheck that.
|
||||
*/
|
||||
capacity = idedisk_capacity(drive);
|
||||
barrier = ide_id_has_flush_cache(id) &&
|
||||
barrier = ide_id_has_flush_cache(id) && !drive->noflush &&
|
||||
(drive->addressing == 0 || capacity <= (1ULL << 28) ||
|
||||
ide_id_has_flush_cache_ext(id));
|
||||
|
||||
|
|
|
@ -750,7 +750,7 @@ void ide_dma_verbose(ide_drive_t *drive)
|
|||
goto bug_dma_off;
|
||||
printk(", DMA");
|
||||
} else if (id->field_valid & 1) {
|
||||
printk(", BUG");
|
||||
goto bug_dma_off;
|
||||
}
|
||||
return;
|
||||
bug_dma_off:
|
||||
|
|
|
@ -23,6 +23,7 @@
|
|||
#include <linux/hdreg.h>
|
||||
#include <linux/ide.h>
|
||||
#include <linux/bitops.h>
|
||||
#include <linux/nmi.h>
|
||||
|
||||
#include <asm/byteorder.h>
|
||||
#include <asm/irq.h>
|
||||
|
@ -1243,6 +1244,7 @@ int ide_wait_not_busy(ide_hwif_t *hwif, unsigned long timeout)
|
|||
if (stat == 0xff)
|
||||
return -ENODEV;
|
||||
touch_softlockup_watchdog();
|
||||
touch_nmi_watchdog();
|
||||
}
|
||||
return -EBUSY;
|
||||
}
|
||||
|
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue