Merge branch 'master'
This commit is contained in:
commit
ad73c67e79
|
@ -30,6 +30,11 @@ include/config
|
|||
include/linux/autoconf.h
|
||||
include/linux/compile.h
|
||||
include/linux/version.h
|
||||
include/linux/utsrelease.h
|
||||
|
||||
# stgit generated dirs
|
||||
patches-*
|
||||
|
||||
# quilt's files
|
||||
patches
|
||||
series
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -153,10 +153,13 @@ scaling_governor, and by "echoing" the name of another
|
|||
that some governors won't load - they only
|
||||
work on some specific architectures or
|
||||
processors.
|
||||
scaling_min_freq and
|
||||
scaling_min_freq and
|
||||
scaling_max_freq show the current "policy limits" (in
|
||||
kHz). By echoing new values into these
|
||||
files, you can change these limits.
|
||||
NOTE: when setting a policy you need to
|
||||
first set scaling_max_freq, then
|
||||
scaling_min_freq.
|
||||
|
||||
|
||||
If you have selected the "userspace" governor which allows you to
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -51,8 +51,6 @@ Debugging Information
|
|||
|
||||
References
|
||||
|
||||
IETF IP over InfiniBand (ipoib) Working Group
|
||||
http://ietf.org/html.charters/ipoib-charter.html
|
||||
Transmission of IP over InfiniBand (IPoIB) (RFC 4391)
|
||||
http://ietf.org/rfc/rfc4391.txt
|
||||
IP over InfiniBand (IPoIB) Architecture (RFC 4392)
|
||||
|
|
|
@ -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]
|
||||
|
|
|
@ -211,9 +211,8 @@ Controls the kernel's behaviour when an oops or BUG is encountered.
|
|||
|
||||
0: try to continue operation
|
||||
|
||||
1: delay a few seconds (to give klogd time to record the oops output) and
|
||||
then panic. If the `panic' sysctl is also non-zero then the machine will
|
||||
be rebooted.
|
||||
1: panic immediatly. If the `panic' sysctl is also non-zero then the
|
||||
machine will be rebooted.
|
||||
|
||||
==============================================================
|
||||
|
||||
|
|
|
@ -59,7 +59,7 @@ bind to an interface (or perhaps several) using an ioctl call. You
|
|||
would issue more ioctls to the device to communicate to it using
|
||||
control, bulk, or other kinds of USB transfers. The IOCTLs are
|
||||
listed in the <linux/usbdevice_fs.h> file, and at this writing the
|
||||
source code (linux/drivers/usb/devio.c) is the primary reference
|
||||
source code (linux/drivers/usb/core/devio.c) is the primary reference
|
||||
for how to access devices through those files.
|
||||
|
||||
Note that since by default these BBB/DDD files are writable only by
|
||||
|
|
|
@ -5,8 +5,7 @@ For USB help other than the readme files that are located in
|
|||
Documentation/usb/*, see the following:
|
||||
|
||||
Linux-USB project: http://www.linux-usb.org
|
||||
mirrors at http://www.suse.cz/development/linux-usb/
|
||||
and http://usb.in.tum.de/linux-usb/
|
||||
mirrors at http://usb.in.tum.de/linux-usb/
|
||||
and http://it.linux-usb.org
|
||||
Linux USB Guide: http://linux-usb.sourceforge.net
|
||||
Linux-USB device overview (working devices and drivers):
|
||||
|
|
36
MAINTAINERS
36
MAINTAINERS
|
@ -214,6 +214,12 @@ W: http://acpi.sourceforge.net/
|
|||
T: git kernel.org:/pub/scm/linux/kernel/git/lenb/linux-acpi-2.6.git
|
||||
S: Maintained
|
||||
|
||||
ACPI PCI HOTPLUG DRIVER
|
||||
P: Kristen Carlson Accardi
|
||||
M: kristen.c.accardi@intel.com
|
||||
L: pcihpd-discuss@lists.sourceforge.net
|
||||
S: Maintained
|
||||
|
||||
AD1816 SOUND DRIVER
|
||||
P: Thorsten Knabe
|
||||
M: Thorsten Knabe <linux@thorsten-knabe.de>
|
||||
|
@ -292,6 +298,13 @@ L: info-linux@geode.amd.com
|
|||
W: http://www.amd.com/us-en/ConnectivitySolutions/TechnicalResources/0,,50_2334_2452_11363,00.html
|
||||
S: Supported
|
||||
|
||||
AOA (Apple Onboard Audio) ALSA DRIVER
|
||||
P: Johannes Berg
|
||||
M: johannes@sipsolutions.net
|
||||
L: linuxppc-dev@ozlabs.org
|
||||
L: alsa-devel@alsa-project.org
|
||||
S: Maintained
|
||||
|
||||
APM DRIVER
|
||||
P: Stephen Rothwell
|
||||
M: sfr@canb.auug.org.au
|
||||
|
@ -978,6 +991,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
|
||||
|
@ -1616,7 +1633,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
|
||||
|
@ -1660,9 +1677,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
|
||||
|
@ -1900,6 +1916,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
|
||||
|
@ -2644,6 +2666,14 @@ M: dbrownell@users.sourceforge.net
|
|||
L: spi-devel-general@lists.sourceforge.net
|
||||
S: Maintained
|
||||
|
||||
STABLE BRANCH:
|
||||
P: Greg Kroah-Hartman
|
||||
M: greg@kroah.com
|
||||
P: Chris Wright
|
||||
M: chrisw@sous-sol.org
|
||||
L: stable@kernel.org
|
||||
S: Maintained
|
||||
|
||||
TPM DEVICE DRIVER
|
||||
P: Kylene Hall
|
||||
M: kjhall@us.ibm.com
|
||||
|
|
7
Makefile
7
Makefile
|
@ -1,7 +1,7 @@
|
|||
VERSION = 2
|
||||
PATCHLEVEL = 6
|
||||
SUBLEVEL = 18
|
||||
EXTRAVERSION = -rc3
|
||||
EXTRAVERSION = -rc4
|
||||
NAME=Crazed Snow-Weasel
|
||||
|
||||
# *DOCUMENTATION*
|
||||
|
@ -310,8 +310,8 @@ CPPFLAGS := -D__KERNEL__ $(LINUXINCLUDE)
|
|||
CFLAGS := -Wall -Wundef -Wstrict-prototypes -Wno-trigraphs \
|
||||
-fno-strict-aliasing -fno-common
|
||||
# Force gcc to behave correct even for buggy distributions
|
||||
CFLAGS += $(call cc-option, -fno-stack-protector-all \
|
||||
-fno-stack-protector)
|
||||
CFLAGS += $(call cc-option, -fno-stack-protector)
|
||||
|
||||
AFLAGS := -D__ASSEMBLY__
|
||||
|
||||
# Read KERNELRELEASE from include/config/kernel.release (if it exists)
|
||||
|
@ -368,6 +368,7 @@ endif
|
|||
|
||||
no-dot-config-targets := clean mrproper distclean \
|
||||
cscope TAGS tags help %docs check% \
|
||||
include/linux/version.h headers_% \
|
||||
kernelrelease kernelversion
|
||||
|
||||
config-targets := 0
|
||||
|
|
|
@ -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. */
|
||||
|
|
|
@ -95,7 +95,8 @@ static void gic_set_cpu(unsigned int irq, cpumask_t mask_val)
|
|||
}
|
||||
#endif
|
||||
|
||||
static struct irqchip gic_chip = {
|
||||
static struct irq_chip gic_chip = {
|
||||
.name = "GIC",
|
||||
.ack = gic_ack_irq,
|
||||
.mask = gic_mask_irq,
|
||||
.unmask = gic_unmask_irq,
|
||||
|
|
|
@ -204,7 +204,8 @@ static void locomo_unmask_irq(unsigned int irq)
|
|||
locomo_writel(r, mapbase + LOCOMO_ICR);
|
||||
}
|
||||
|
||||
static struct irqchip locomo_chip = {
|
||||
static struct irq_chip locomo_chip = {
|
||||
.name = "LOCOMO",
|
||||
.ack = locomo_ack_irq,
|
||||
.mask = locomo_mask_irq,
|
||||
.unmask = locomo_unmask_irq,
|
||||
|
@ -249,7 +250,8 @@ static void locomo_key_unmask_irq(unsigned int irq)
|
|||
locomo_writel(r, mapbase + LOCOMO_KEYBOARD + LOCOMO_KIC);
|
||||
}
|
||||
|
||||
static struct irqchip locomo_key_chip = {
|
||||
static struct irq_chip locomo_key_chip = {
|
||||
.name = "LOCOMO-key",
|
||||
.ack = locomo_key_ack_irq,
|
||||
.mask = locomo_key_mask_irq,
|
||||
.unmask = locomo_key_unmask_irq,
|
||||
|
@ -312,7 +314,8 @@ static void locomo_gpio_unmask_irq(unsigned int irq)
|
|||
locomo_writel(r, mapbase + LOCOMO_GIE);
|
||||
}
|
||||
|
||||
static struct irqchip locomo_gpio_chip = {
|
||||
static struct irq_chip locomo_gpio_chip = {
|
||||
.name = "LOCOMO-gpio",
|
||||
.ack = locomo_gpio_ack_irq,
|
||||
.mask = locomo_gpio_mask_irq,
|
||||
.unmask = locomo_gpio_unmask_irq,
|
||||
|
@ -357,7 +360,8 @@ static void locomo_lt_unmask_irq(unsigned int irq)
|
|||
locomo_writel(r, mapbase + LOCOMO_LTINT);
|
||||
}
|
||||
|
||||
static struct irqchip locomo_lt_chip = {
|
||||
static struct irq_chip locomo_lt_chip = {
|
||||
.name = "LOCOMO-lt",
|
||||
.ack = locomo_lt_ack_irq,
|
||||
.mask = locomo_lt_mask_irq,
|
||||
.unmask = locomo_lt_unmask_irq,
|
||||
|
@ -418,7 +422,8 @@ static void locomo_spi_unmask_irq(unsigned int irq)
|
|||
locomo_writel(r, mapbase + LOCOMO_SPIIE);
|
||||
}
|
||||
|
||||
static struct irqchip locomo_spi_chip = {
|
||||
static struct irq_chip locomo_spi_chip = {
|
||||
.name = "LOCOMO-spi",
|
||||
.ack = locomo_spi_ack_irq,
|
||||
.mask = locomo_spi_mask_irq,
|
||||
.unmask = locomo_spi_unmask_irq,
|
||||
|
|
|
@ -272,7 +272,8 @@ static int sa1111_wake_lowirq(unsigned int irq, unsigned int on)
|
|||
return 0;
|
||||
}
|
||||
|
||||
static struct irqchip sa1111_low_chip = {
|
||||
static struct irq_chip sa1111_low_chip = {
|
||||
.name = "SA1111-l",
|
||||
.ack = sa1111_ack_irq,
|
||||
.mask = sa1111_mask_lowirq,
|
||||
.unmask = sa1111_unmask_lowirq,
|
||||
|
@ -368,7 +369,8 @@ static int sa1111_wake_highirq(unsigned int irq, unsigned int on)
|
|||
return 0;
|
||||
}
|
||||
|
||||
static struct irqchip sa1111_high_chip = {
|
||||
static struct irq_chip sa1111_high_chip = {
|
||||
.name = "SA1111-h",
|
||||
.ack = sa1111_ack_irq,
|
||||
.mask = sa1111_mask_highirq,
|
||||
.unmask = sa1111_unmask_highirq,
|
||||
|
|
|
@ -39,7 +39,8 @@ static void vic_unmask_irq(unsigned int irq)
|
|||
writel(1 << irq, base + VIC_INT_ENABLE);
|
||||
}
|
||||
|
||||
static struct irqchip vic_chip = {
|
||||
static struct irq_chip vic_chip = {
|
||||
.name = "VIC",
|
||||
.ack = vic_mask_irq,
|
||||
.mask = vic_mask_irq,
|
||||
.unmask = vic_unmask_irq,
|
||||
|
|
|
@ -470,7 +470,8 @@ static void ecard_irq_mask(unsigned int irqnr)
|
|||
}
|
||||
}
|
||||
|
||||
static struct irqchip ecard_chip = {
|
||||
static struct irq_chip ecard_chip = {
|
||||
.name = "ECARD",
|
||||
.ack = ecard_irq_mask,
|
||||
.mask = ecard_irq_mask,
|
||||
.unmask = ecard_irq_unmask,
|
||||
|
|
|
@ -77,6 +77,7 @@ int show_interrupts(struct seq_file *p, void *v)
|
|||
seq_printf(p, "%3d: ", i);
|
||||
for_each_present_cpu(cpu)
|
||||
seq_printf(p, "%10u ", kstat_cpu(cpu).irqs[i]);
|
||||
seq_printf(p, " %10s", irq_desc[i].chip->name ? : "-");
|
||||
seq_printf(p, " %s", action->name);
|
||||
for (action = action->next; action; action = action->next)
|
||||
seq_printf(p, ", %s", action->name);
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
|
@ -327,7 +327,8 @@ static int gpio_irq_type(unsigned pin, unsigned type)
|
|||
return (type == IRQT_BOTHEDGE) ? 0 : -EINVAL;
|
||||
}
|
||||
|
||||
static struct irqchip gpio_irqchip = {
|
||||
static struct irq_chip gpio_irqchip = {
|
||||
.name = "GPIO",
|
||||
.mask = gpio_irq_mask,
|
||||
.unmask = gpio_irq_unmask,
|
||||
.set_type = gpio_irq_type,
|
||||
|
|
|
@ -114,7 +114,8 @@ void at91_irq_resume(void)
|
|||
#define at91_aic_set_wake NULL
|
||||
#endif
|
||||
|
||||
static struct irqchip at91_aic_chip = {
|
||||
static struct irq_chip at91_aic_chip = {
|
||||
.name = "AIC",
|
||||
.ack = at91_aic_mask_irq,
|
||||
.mask = at91_aic_mask_irq,
|
||||
.unmask = at91_aic_unmask_irq,
|
||||
|
|
|
@ -204,13 +204,15 @@ imx_gpiod_demux_handler(unsigned int irq_unused, struct irqdesc *desc,
|
|||
imx_gpio_handler(mask, irq, desc, regs);
|
||||
}
|
||||
|
||||
static struct irqchip imx_internal_chip = {
|
||||
static struct irq_chip imx_internal_chip = {
|
||||
.name = "MPU",
|
||||
.ack = imx_mask_irq,
|
||||
.mask = imx_mask_irq,
|
||||
.unmask = imx_unmask_irq,
|
||||
};
|
||||
|
||||
static struct irqchip imx_gpio_chip = {
|
||||
static struct irq_chip imx_gpio_chip = {
|
||||
.name = "GPIO",
|
||||
.ack = imx_gpio_ack_irq,
|
||||
.mask = imx_gpio_mask_irq,
|
||||
.unmask = imx_gpio_unmask_irq,
|
||||
|
|
|
@ -161,7 +161,8 @@ static void sc_unmask_irq(unsigned int irq)
|
|||
writel(1 << irq, VA_IC_BASE + IRQ_ENABLE_SET);
|
||||
}
|
||||
|
||||
static struct irqchip sc_chip = {
|
||||
static struct irq_chip sc_chip = {
|
||||
.name = "SC",
|
||||
.ack = sc_mask_irq,
|
||||
.mask = sc_mask_irq,
|
||||
.unmask = sc_unmask_irq,
|
||||
|
|
|
@ -156,7 +156,8 @@ static void cic_unmask_irq(unsigned int irq)
|
|||
cic_writel(1 << irq, INTCP_VA_CIC_BASE + IRQ_ENABLE_SET);
|
||||
}
|
||||
|
||||
static struct irqchip cic_chip = {
|
||||
static struct irq_chip cic_chip = {
|
||||
.name = "CIC",
|
||||
.ack = cic_mask_irq,
|
||||
.mask = cic_mask_irq,
|
||||
.unmask = cic_unmask_irq,
|
||||
|
@ -174,7 +175,8 @@ static void pic_unmask_irq(unsigned int irq)
|
|||
pic_writel(1 << irq, INTCP_VA_PIC_BASE + IRQ_ENABLE_SET);
|
||||
}
|
||||
|
||||
static struct irqchip pic_chip = {
|
||||
static struct irq_chip pic_chip = {
|
||||
.name = "PIC",
|
||||
.ack = pic_mask_irq,
|
||||
.mask = pic_mask_irq,
|
||||
.unmask = pic_unmask_irq,
|
||||
|
@ -192,7 +194,8 @@ static void sic_unmask_irq(unsigned int irq)
|
|||
sic_writel(1 << irq, INTCP_VA_SIC_BASE + IRQ_ENABLE_SET);
|
||||
}
|
||||
|
||||
static struct irqchip sic_chip = {
|
||||
static struct irq_chip sic_chip = {
|
||||
.name = "SIC",
|
||||
.ack = sic_mask_irq,
|
||||
.mask = sic_mask_irq,
|
||||
.unmask = sic_unmask_irq,
|
||||
|
|
|
@ -52,7 +52,8 @@ iop321_irq_unmask (unsigned int irq)
|
|||
intctl_write(iop321_mask);
|
||||
}
|
||||
|
||||
struct irqchip ext_chip = {
|
||||
struct irq_chip ext_chip = {
|
||||
.name = "IOP",
|
||||
.ack = iop321_irq_mask,
|
||||
.mask = iop321_irq_mask,
|
||||
.unmask = iop321_irq_unmask,
|
||||
|
|
|
@ -77,13 +77,15 @@ iop331_irq_unmask2(unsigned int irq)
|
|||
intctl_write1(iop331_mask1);
|
||||
}
|
||||
|
||||
struct irqchip iop331_irqchip1 = {
|
||||
struct irq_chip iop331_irqchip1 = {
|
||||
.name = "IOP-1",
|
||||
.ack = iop331_irq_mask1,
|
||||
.mask = iop331_irq_mask1,
|
||||
.unmask = iop331_irq_unmask1,
|
||||
};
|
||||
|
||||
struct irqchip iop331_irqchip2 = {
|
||||
struct irq_chip iop331_irqchip2 = {
|
||||
.name = "IOP-2",
|
||||
.ack = iop331_irq_mask2,
|
||||
.mask = iop331_irq_mask2,
|
||||
.unmask = iop331_irq_unmask2,
|
||||
|
|
|
@ -63,7 +63,8 @@ static void kev7a400_unmask_cpld_irq (u32 irq)
|
|||
CPLD_WR_PB_INT_MASK = CPLD_IRQ_mask;
|
||||
}
|
||||
|
||||
static struct irqchip kev7a400_cpld_chip = {
|
||||
static struct irq_chip kev7a400_cpld_chip = {
|
||||
.name = "CPLD",
|
||||
.ack = kev7a400_ack_cpld_irq,
|
||||
.mask = kev7a400_mask_cpld_irq,
|
||||
.unmask = kev7a400_unmask_cpld_irq,
|
||||
|
|
|
@ -200,7 +200,8 @@ static void lh7a40x_unmask_cpld_irq (u32 irq)
|
|||
}
|
||||
}
|
||||
|
||||
static struct irqchip lpd7a40x_cpld_chip = {
|
||||
static struct irq_chip lpd7a40x_cpld_chip = {
|
||||
.name = "CPLD",
|
||||
.ack = lh7a40x_ack_cpld_irq,
|
||||
.mask = lh7a40x_mask_cpld_irq,
|
||||
.unmask = lh7a40x_unmask_cpld_irq,
|
||||
|
|
|
@ -43,7 +43,8 @@ lh7a400_unmask_cpld_irq (u32 irq)
|
|||
}
|
||||
|
||||
static struct
|
||||
irqchip lh7a400_cpld_chip = {
|
||||
irq_chip lh7a400_cpld_chip = {
|
||||
.name = "CPLD",
|
||||
.ack = lh7a400_ack_cpld_irq,
|
||||
.mask = lh7a400_mask_cpld_irq,
|
||||
.unmask = lh7a400_unmask_cpld_irq,
|
||||
|
|
|
@ -38,13 +38,15 @@ static void lh7a400_ack_gpio_irq (u32 irq)
|
|||
INTC_INTENC = (1 << irq);
|
||||
}
|
||||
|
||||
static struct irqchip lh7a400_internal_chip = {
|
||||
static struct irq_chip lh7a400_internal_chip = {
|
||||
.name = "MPU",
|
||||
.ack = lh7a400_mask_irq, /* Level triggering -> mask is ack */
|
||||
.mask = lh7a400_mask_irq,
|
||||
.unmask = lh7a400_unmask_irq,
|
||||
};
|
||||
|
||||
static struct irqchip lh7a400_gpio_chip = {
|
||||
static struct irq_chip lh7a400_gpio_chip = {
|
||||
.name = "GPIO",
|
||||
.ack = lh7a400_ack_gpio_irq,
|
||||
.mask = lh7a400_mask_irq,
|
||||
.unmask = lh7a400_unmask_irq,
|
||||
|
|
|
@ -76,25 +76,29 @@ static void lh7a404_vic2_ack_gpio_irq (u32 irq)
|
|||
VIC2_INTENCLR = (1 << irq);
|
||||
}
|
||||
|
||||
static struct irqchip lh7a404_vic1_chip = {
|
||||
static struct irq_chip lh7a404_vic1_chip = {
|
||||
.name = "VIC1",
|
||||
.ack = lh7a404_vic1_mask_irq, /* Because level-triggered */
|
||||
.mask = lh7a404_vic1_mask_irq,
|
||||
.unmask = lh7a404_vic1_unmask_irq,
|
||||
};
|
||||
|
||||
static struct irqchip lh7a404_vic2_chip = {
|
||||
static struct irq_chip lh7a404_vic2_chip = {
|
||||
.name = "VIC2",
|
||||
.ack = lh7a404_vic2_mask_irq, /* Because level-triggered */
|
||||
.mask = lh7a404_vic2_mask_irq,
|
||||
.unmask = lh7a404_vic2_unmask_irq,
|
||||
};
|
||||
|
||||
static struct irqchip lh7a404_gpio_vic1_chip = {
|
||||
static struct irq_chip lh7a404_gpio_vic1_chip = {
|
||||
.name = "GPIO-VIC1",
|
||||
.ack = lh7a404_vic1_ack_gpio_irq,
|
||||
.mask = lh7a404_vic1_mask_irq,
|
||||
.unmask = lh7a404_vic1_unmask_irq,
|
||||
};
|
||||
|
||||
static struct irqchip lh7a404_gpio_vic2_chip = {
|
||||
static struct irq_chip lh7a404_gpio_vic2_chip = {
|
||||
.name = "GPIO-VIC2",
|
||||
.ack = lh7a404_vic2_ack_gpio_irq,
|
||||
.mask = lh7a404_vic2_mask_irq,
|
||||
.unmask = lh7a404_vic2_unmask_irq,
|
||||
|
|
|
@ -50,7 +50,8 @@ static void lh7a40x_unmask_cpld_irq (u32 irq)
|
|||
}
|
||||
}
|
||||
|
||||
static struct irqchip lh7a40x_cpld_chip = {
|
||||
static struct irq_chip lh7a40x_cpld_chip = {
|
||||
.name = "CPLD",
|
||||
.ack = lh7a40x_ack_cpld_irq,
|
||||
.mask = lh7a40x_mask_cpld_irq,
|
||||
.unmask = lh7a40x_unmask_cpld_irq,
|
||||
|
|
|
@ -106,14 +106,16 @@ void innovator_fpga_IRQ_demux(unsigned int irq, struct irqdesc *desc,
|
|||
}
|
||||
}
|
||||
|
||||
static struct irqchip omap_fpga_irq_ack = {
|
||||
static struct irq_chip omap_fpga_irq_ack = {
|
||||
.name = "FPGA-ack",
|
||||
.ack = fpga_mask_ack_irq,
|
||||
.mask = fpga_mask_irq,
|
||||
.unmask = fpga_unmask_irq,
|
||||
};
|
||||
|
||||
|
||||
static struct irqchip omap_fpga_irq = {
|
||||
static struct irq_chip omap_fpga_irq = {
|
||||
.name = "FPGA",
|
||||
.ack = fpga_ack_irq,
|
||||
.mask = fpga_mask_irq,
|
||||
.unmask = fpga_unmask_irq,
|
||||
|
|
|
@ -168,7 +168,8 @@ static struct omap_irq_bank omap1610_irq_banks[] = {
|
|||
};
|
||||
#endif
|
||||
|
||||
static struct irqchip omap_irq_chip = {
|
||||
static struct irq_chip omap_irq_chip = {
|
||||
.name = "MPU",
|
||||
.ack = omap_mask_ack_irq,
|
||||
.mask = omap_mask_irq,
|
||||
.unmask = omap_unmask_irq,
|
||||
|
|
|
@ -94,7 +94,8 @@ static void omap_mask_ack_irq(unsigned int irq)
|
|||
omap_ack_irq(irq);
|
||||
}
|
||||
|
||||
static struct irqchip omap_irq_chip = {
|
||||
static struct irq_chip omap_irq_chip = {
|
||||
.name = "INTC",
|
||||
.ack = omap_mask_ack_irq,
|
||||
.mask = omap_mask_irq,
|
||||
.unmask = omap_unmask_irq,
|
||||
|
|
|
@ -39,7 +39,8 @@ static void pxa_unmask_low_irq(unsigned int irq)
|
|||
ICMR |= (1 << (irq + PXA_IRQ_SKIP));
|
||||
}
|
||||
|
||||
static struct irqchip pxa_internal_chip_low = {
|
||||
static struct irq_chip pxa_internal_chip_low = {
|
||||
.name = "SC",
|
||||
.ack = pxa_mask_low_irq,
|
||||
.mask = pxa_mask_low_irq,
|
||||
.unmask = pxa_unmask_low_irq,
|
||||
|
@ -61,7 +62,8 @@ static void pxa_unmask_high_irq(unsigned int irq)
|
|||
ICMR2 |= (1 << (irq - 32 + PXA_IRQ_SKIP));
|
||||
}
|
||||
|
||||
static struct irqchip pxa_internal_chip_high = {
|
||||
static struct irq_chip pxa_internal_chip_high = {
|
||||
.name = "SC-hi",
|
||||
.ack = pxa_mask_high_irq,
|
||||
.mask = pxa_mask_high_irq,
|
||||
.unmask = pxa_unmask_high_irq,
|
||||
|
@ -129,7 +131,8 @@ static void pxa_ack_low_gpio(unsigned int irq)
|
|||
GEDR0 = (1 << (irq - IRQ_GPIO0));
|
||||
}
|
||||
|
||||
static struct irqchip pxa_low_gpio_chip = {
|
||||
static struct irq_chip pxa_low_gpio_chip = {
|
||||
.name = "GPIO-l",
|
||||
.ack = pxa_ack_low_gpio,
|
||||
.mask = pxa_mask_low_irq,
|
||||
.unmask = pxa_unmask_low_irq,
|
||||
|
@ -237,7 +240,8 @@ static void pxa_unmask_muxed_gpio(unsigned int irq)
|
|||
GFER(gpio) = GPIO_IRQ_falling_edge[idx] & GPIO_IRQ_mask[idx];
|
||||
}
|
||||
|
||||
static struct irqchip pxa_muxed_gpio_chip = {
|
||||
static struct irq_chip pxa_muxed_gpio_chip = {
|
||||
.name = "GPIO",
|
||||
.ack = pxa_ack_muxed_gpio,
|
||||
.mask = pxa_mask_muxed_gpio,
|
||||
.unmask = pxa_unmask_muxed_gpio,
|
||||
|
|
|
@ -68,7 +68,8 @@ static void lpd270_unmask_irq(unsigned int irq)
|
|||
__raw_writew(lpd270_irq_enabled, LPD270_INT_MASK);
|
||||
}
|
||||
|
||||
static struct irqchip lpd270_irq_chip = {
|
||||
static struct irq_chip lpd270_irq_chip = {
|
||||
.name = "CPLD",
|
||||
.ack = lpd270_mask_irq,
|
||||
.mask = lpd270_mask_irq,
|
||||
.unmask = lpd270_unmask_irq,
|
||||
|
|
|
@ -78,7 +78,8 @@ static void lubbock_unmask_irq(unsigned int irq)
|
|||
LUB_IRQ_MASK_EN = (lubbock_irq_enabled |= (1 << lubbock_irq));
|
||||
}
|
||||
|
||||
static struct irqchip lubbock_irq_chip = {
|
||||
static struct irq_chip lubbock_irq_chip = {
|
||||
.name = "FPGA",
|
||||
.ack = lubbock_mask_irq,
|
||||
.mask = lubbock_mask_irq,
|
||||
.unmask = lubbock_unmask_irq,
|
||||
|
|
|
@ -64,7 +64,8 @@ static void mainstone_unmask_irq(unsigned int irq)
|
|||
MST_INTMSKENA = (mainstone_irq_enabled |= (1 << mainstone_irq));
|
||||
}
|
||||
|
||||
static struct irqchip mainstone_irq_chip = {
|
||||
static struct irq_chip mainstone_irq_chip = {
|
||||
.name = "FPGA",
|
||||
.ack = mainstone_mask_irq,
|
||||
.mask = mainstone_mask_irq,
|
||||
.unmask = mainstone_unmask_irq,
|
||||
|
|
|
@ -95,7 +95,8 @@ static int sa1100_low_gpio_wake(unsigned int irq, unsigned int on)
|
|||
return 0;
|
||||
}
|
||||
|
||||
static struct irqchip sa1100_low_gpio_chip = {
|
||||
static struct irq_chip sa1100_low_gpio_chip = {
|
||||
.name = "GPIO-l",
|
||||
.ack = sa1100_low_gpio_ack,
|
||||
.mask = sa1100_low_gpio_mask,
|
||||
.unmask = sa1100_low_gpio_unmask,
|
||||
|
@ -178,7 +179,8 @@ static int sa1100_high_gpio_wake(unsigned int irq, unsigned int on)
|
|||
return 0;
|
||||
}
|
||||
|
||||
static struct irqchip sa1100_high_gpio_chip = {
|
||||
static struct irq_chip sa1100_high_gpio_chip = {
|
||||
.name = "GPIO-h",
|
||||
.ack = sa1100_high_gpio_ack,
|
||||
.mask = sa1100_high_gpio_mask,
|
||||
.unmask = sa1100_high_gpio_unmask,
|
||||
|
@ -215,7 +217,8 @@ static int sa1100_set_wake(unsigned int irq, unsigned int on)
|
|||
return -EINVAL;
|
||||
}
|
||||
|
||||
static struct irqchip sa1100_normal_chip = {
|
||||
static struct irq_chip sa1100_normal_chip = {
|
||||
.name = "SC",
|
||||
.ack = sa1100_mask_irq,
|
||||
.mask = sa1100_mask_irq,
|
||||
.unmask = sa1100_unmask_irq,
|
||||
|
|
|
@ -69,7 +69,8 @@ static irqreturn_t bogus_int(int irq, void *dev_id, struct pt_regs *regs)
|
|||
|
||||
static struct irqaction cascade;
|
||||
|
||||
static struct irqchip fb_chip = {
|
||||
static struct irq_chip fb_chip = {
|
||||
.name = "XT-PIC",
|
||||
.ack = shark_ack_8259A_irq,
|
||||
.mask = shark_disable_8259A_irq,
|
||||
.unmask = shark_enable_8259A_irq,
|
||||
|
|
|
@ -69,7 +69,8 @@ static void sic_unmask_irq(unsigned int irq)
|
|||
writel(1 << irq, VA_SIC_BASE + SIC_IRQ_ENABLE_SET);
|
||||
}
|
||||
|
||||
static struct irqchip sic_chip = {
|
||||
static struct irq_chip sic_chip = {
|
||||
.name = "SIC",
|
||||
.ack = sic_mask_irq,
|
||||
.mask = sic_mask_irq,
|
||||
.unmask = sic_unmask_irq,
|
||||
|
|
|
@ -944,7 +944,8 @@ static void mpuio_unmask_irq(unsigned int irq)
|
|||
_set_gpio_irqenable(bank, gpio, 1);
|
||||
}
|
||||
|
||||
static struct irqchip gpio_irq_chip = {
|
||||
static struct irq_chip gpio_irq_chip = {
|
||||
.name = "GPIO",
|
||||
.ack = gpio_ack_irq,
|
||||
.mask = gpio_mask_irq,
|
||||
.unmask = gpio_unmask_irq,
|
||||
|
@ -952,10 +953,11 @@ static struct irqchip gpio_irq_chip = {
|
|||
.set_wake = gpio_wake_enable,
|
||||
};
|
||||
|
||||
static struct irqchip mpuio_irq_chip = {
|
||||
static struct irq_chip mpuio_irq_chip = {
|
||||
.name = "MPUIO",
|
||||
.ack = mpuio_ack_irq,
|
||||
.mask = mpuio_mask_irq,
|
||||
.unmask = mpuio_unmask_irq
|
||||
.unmask = mpuio_unmask_irq
|
||||
};
|
||||
|
||||
static int initialized;
|
||||
|
|
|
@ -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)
|
||||
|
||||
|
|
|
@ -96,6 +96,7 @@ config X86_POWERNOW_K8_ACPI
|
|||
|
||||
config X86_GX_SUSPMOD
|
||||
tristate "Cyrix MediaGX/NatSemi Geode Suspend Modulation"
|
||||
depends on PCI
|
||||
help
|
||||
This add the CPUFreq driver for NatSemi Geode processors which
|
||||
support suspend modulation.
|
||||
|
@ -202,7 +203,7 @@ config X86_LONGRUN
|
|||
config X86_LONGHAUL
|
||||
tristate "VIA Cyrix III Longhaul"
|
||||
select CPU_FREQ_TABLE
|
||||
depends on BROKEN
|
||||
depends on ACPI_PROCESSOR
|
||||
help
|
||||
This adds the CPUFreq driver for VIA Samuel/CyrixIII,
|
||||
VIA Cyrix Samuel/C3, VIA Cyrix Ezra and VIA Cyrix Ezra-T
|
||||
|
|
|
@ -384,8 +384,7 @@ static int acpi_cpufreq_early_init_acpi(void)
|
|||
}
|
||||
|
||||
/* Do initialization in ACPI core */
|
||||
acpi_processor_preregister_performance(acpi_perf_data);
|
||||
return 0;
|
||||
return acpi_processor_preregister_performance(acpi_perf_data);
|
||||
}
|
||||
|
||||
static int
|
||||
|
|
|
@ -29,11 +29,13 @@
|
|||
#include <linux/cpufreq.h>
|
||||
#include <linux/slab.h>
|
||||
#include <linux/string.h>
|
||||
#include <linux/pci.h>
|
||||
|
||||
#include <asm/msr.h>
|
||||
#include <asm/timex.h>
|
||||
#include <asm/io.h>
|
||||
#include <asm/acpi.h>
|
||||
#include <linux/acpi.h>
|
||||
#include <acpi/processor.h>
|
||||
|
||||
#include "longhaul.h"
|
||||
|
||||
|
@ -56,6 +58,8 @@ static int minvid, maxvid;
|
|||
static unsigned int minmult, maxmult;
|
||||
static int can_scale_voltage;
|
||||
static int vrmrev;
|
||||
static struct acpi_processor *pr = NULL;
|
||||
static struct acpi_processor_cx *cx = NULL;
|
||||
|
||||
/* Module parameters */
|
||||
static int dont_scale_voltage;
|
||||
|
@ -118,84 +122,65 @@ static int longhaul_get_cpu_mult(void)
|
|||
return eblcr_table[invalue];
|
||||
}
|
||||
|
||||
/* For processor with BCR2 MSR */
|
||||
|
||||
static void do_powersaver(union msr_longhaul *longhaul,
|
||||
unsigned int clock_ratio_index)
|
||||
static void do_longhaul1(int cx_address, unsigned int clock_ratio_index)
|
||||
{
|
||||
struct pci_dev *dev;
|
||||
unsigned long flags;
|
||||
unsigned int tmp_mask;
|
||||
int version;
|
||||
int i;
|
||||
u16 pci_cmd;
|
||||
u16 cmd_state[64];
|
||||
union msr_bcr2 bcr2;
|
||||
u32 t;
|
||||
|
||||
switch (cpu_model) {
|
||||
case CPU_EZRA_T:
|
||||
version = 3;
|
||||
break;
|
||||
case CPU_NEHEMIAH:
|
||||
version = 0xf;
|
||||
break;
|
||||
default:
|
||||
return;
|
||||
}
|
||||
|
||||
rdmsrl(MSR_VIA_LONGHAUL, longhaul->val);
|
||||
longhaul->bits.SoftBusRatio = clock_ratio_index & 0xf;
|
||||
longhaul->bits.SoftBusRatio4 = (clock_ratio_index & 0x10) >> 4;
|
||||
longhaul->bits.EnableSoftBusRatio = 1;
|
||||
longhaul->bits.RevisionKey = 0;
|
||||
|
||||
preempt_disable();
|
||||
local_irq_save(flags);
|
||||
|
||||
/*
|
||||
* get current pci bus master state for all devices
|
||||
* and clear bus master bit
|
||||
*/
|
||||
dev = NULL;
|
||||
i = 0;
|
||||
do {
|
||||
dev = pci_get_device(PCI_ANY_ID, PCI_ANY_ID, dev);
|
||||
if (dev != NULL) {
|
||||
pci_read_config_word(dev, PCI_COMMAND, &pci_cmd);
|
||||
cmd_state[i++] = pci_cmd;
|
||||
pci_cmd &= ~PCI_COMMAND_MASTER;
|
||||
pci_write_config_word(dev, PCI_COMMAND, pci_cmd);
|
||||
}
|
||||
} while (dev != NULL);
|
||||
|
||||
tmp_mask=inb(0x21); /* works on C3. save mask. */
|
||||
outb(0xFE,0x21); /* TMR0 only */
|
||||
outb(0xFF,0x80); /* delay */
|
||||
rdmsrl(MSR_VIA_BCR2, bcr2.val);
|
||||
/* Enable software clock multiplier */
|
||||
bcr2.bits.ESOFTBF = 1;
|
||||
bcr2.bits.CLOCKMUL = clock_ratio_index;
|
||||
|
||||
/* Sync to timer tick */
|
||||
safe_halt();
|
||||
wrmsrl(MSR_VIA_LONGHAUL, longhaul->val);
|
||||
halt();
|
||||
ACPI_FLUSH_CPU_CACHE();
|
||||
/* Change frequency on next halt or sleep */
|
||||
wrmsrl(MSR_VIA_BCR2, bcr2.val);
|
||||
/* Invoke C3 */
|
||||
inb(cx_address);
|
||||
/* Dummy op - must do something useless after P_LVL3 read */
|
||||
t = inl(acpi_fadt.xpm_tmr_blk.address);
|
||||
|
||||
/* Disable software clock multiplier */
|
||||
local_irq_disable();
|
||||
rdmsrl(MSR_VIA_BCR2, bcr2.val);
|
||||
bcr2.bits.ESOFTBF = 0;
|
||||
wrmsrl(MSR_VIA_BCR2, bcr2.val);
|
||||
}
|
||||
|
||||
outb(tmp_mask,0x21); /* restore mask */
|
||||
/* For processor with Longhaul MSR */
|
||||
|
||||
/* restore pci bus master state for all devices */
|
||||
dev = NULL;
|
||||
i = 0;
|
||||
do {
|
||||
dev = pci_get_device(PCI_ANY_ID, PCI_ANY_ID, dev);
|
||||
if (dev != NULL) {
|
||||
pci_cmd = cmd_state[i++];
|
||||
pci_write_config_byte(dev, PCI_COMMAND, pci_cmd);
|
||||
}
|
||||
} while (dev != NULL);
|
||||
local_irq_restore(flags);
|
||||
preempt_enable();
|
||||
static void do_powersaver(int cx_address, unsigned int clock_ratio_index)
|
||||
{
|
||||
union msr_longhaul longhaul;
|
||||
u32 t;
|
||||
|
||||
/* disable bus ratio bit */
|
||||
rdmsrl(MSR_VIA_LONGHAUL, longhaul->val);
|
||||
longhaul->bits.EnableSoftBusRatio = 0;
|
||||
longhaul->bits.RevisionKey = version;
|
||||
wrmsrl(MSR_VIA_LONGHAUL, longhaul->val);
|
||||
rdmsrl(MSR_VIA_LONGHAUL, longhaul.val);
|
||||
longhaul.bits.RevisionKey = longhaul.bits.RevisionID;
|
||||
longhaul.bits.SoftBusRatio = clock_ratio_index & 0xf;
|
||||
longhaul.bits.SoftBusRatio4 = (clock_ratio_index & 0x10) >> 4;
|
||||
longhaul.bits.EnableSoftBusRatio = 1;
|
||||
|
||||
/* Sync to timer tick */
|
||||
safe_halt();
|
||||
ACPI_FLUSH_CPU_CACHE();
|
||||
/* Change frequency on next halt or sleep */
|
||||
wrmsrl(MSR_VIA_LONGHAUL, longhaul.val);
|
||||
/* Invoke C3 */
|
||||
inb(cx_address);
|
||||
/* Dummy op - must do something useless after P_LVL3 read */
|
||||
t = inl(acpi_fadt.xpm_tmr_blk.address);
|
||||
|
||||
/* Disable bus ratio bit */
|
||||
local_irq_disable();
|
||||
longhaul.bits.RevisionKey = longhaul.bits.RevisionID;
|
||||
longhaul.bits.EnableSoftBusRatio = 0;
|
||||
longhaul.bits.EnableSoftBSEL = 0;
|
||||
longhaul.bits.EnableSoftVID = 0;
|
||||
wrmsrl(MSR_VIA_LONGHAUL, longhaul.val);
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -209,9 +194,9 @@ static void longhaul_setstate(unsigned int clock_ratio_index)
|
|||
{
|
||||
int speed, mult;
|
||||
struct cpufreq_freqs freqs;
|
||||
union msr_longhaul longhaul;
|
||||
union msr_bcr2 bcr2;
|
||||
static unsigned int old_ratio=-1;
|
||||
unsigned long flags;
|
||||
unsigned int pic1_mask, pic2_mask;
|
||||
|
||||
if (old_ratio == clock_ratio_index)
|
||||
return;
|
||||
|
@ -234,6 +219,20 @@ static void longhaul_setstate(unsigned int clock_ratio_index)
|
|||
dprintk ("Setting to FSB:%dMHz Mult:%d.%dx (%s)\n",
|
||||
fsb, mult/10, mult%10, print_speed(speed/1000));
|
||||
|
||||
preempt_disable();
|
||||
local_irq_save(flags);
|
||||
|
||||
pic2_mask = inb(0xA1);
|
||||
pic1_mask = inb(0x21); /* works on C3. save mask. */
|
||||
outb(0xFF,0xA1); /* Overkill */
|
||||
outb(0xFE,0x21); /* TMR0 only */
|
||||
|
||||
/* Disable bus master arbitration */
|
||||
if (pr->flags.bm_check) {
|
||||
acpi_set_register(ACPI_BITREG_ARB_DISABLE, 1,
|
||||
ACPI_MTX_DO_NOT_LOCK);
|
||||
}
|
||||
|
||||
switch (longhaul_version) {
|
||||
|
||||
/*
|
||||
|
@ -245,20 +244,7 @@ static void longhaul_setstate(unsigned int clock_ratio_index)
|
|||
*/
|
||||
case TYPE_LONGHAUL_V1:
|
||||
case TYPE_LONGHAUL_V2:
|
||||
rdmsrl (MSR_VIA_BCR2, bcr2.val);
|
||||
/* Enable software clock multiplier */
|
||||
bcr2.bits.ESOFTBF = 1;
|
||||
bcr2.bits.CLOCKMUL = clock_ratio_index;
|
||||
local_irq_disable();
|
||||
wrmsrl (MSR_VIA_BCR2, bcr2.val);
|
||||
safe_halt();
|
||||
|
||||
/* Disable software clock multiplier */
|
||||
rdmsrl (MSR_VIA_BCR2, bcr2.val);
|
||||
bcr2.bits.ESOFTBF = 0;
|
||||
local_irq_disable();
|
||||
wrmsrl (MSR_VIA_BCR2, bcr2.val);
|
||||
local_irq_enable();
|
||||
do_longhaul1(cx->address, clock_ratio_index);
|
||||
break;
|
||||
|
||||
/*
|
||||
|
@ -273,10 +259,22 @@ static void longhaul_setstate(unsigned int clock_ratio_index)
|
|||
* to work in practice.
|
||||
*/
|
||||
case TYPE_POWERSAVER:
|
||||
do_powersaver(&longhaul, clock_ratio_index);
|
||||
do_powersaver(cx->address, clock_ratio_index);
|
||||
break;
|
||||
}
|
||||
|
||||
/* Enable bus master arbitration */
|
||||
if (pr->flags.bm_check) {
|
||||
acpi_set_register(ACPI_BITREG_ARB_DISABLE, 0,
|
||||
ACPI_MTX_DO_NOT_LOCK);
|
||||
}
|
||||
|
||||
outb(pic2_mask,0xA1); /* restore mask */
|
||||
outb(pic1_mask,0x21);
|
||||
|
||||
local_irq_restore(flags);
|
||||
preempt_enable();
|
||||
|
||||
cpufreq_notify_transition(&freqs, CPUFREQ_POSTCHANGE);
|
||||
}
|
||||
|
||||
|
@ -324,9 +322,11 @@ static int guess_fsb(void)
|
|||
static int __init longhaul_get_ranges(void)
|
||||
{
|
||||
unsigned long invalue;
|
||||
unsigned int multipliers[32]= {
|
||||
50,30,40,100,55,35,45,95,90,70,80,60,120,75,85,65,
|
||||
-1,110,120,-1,135,115,125,105,130,150,160,140,-1,155,-1,145 };
|
||||
unsigned int ezra_t_multipliers[32]= {
|
||||
90, 30, 40, 100, 55, 35, 45, 95,
|
||||
50, 70, 80, 60, 120, 75, 85, 65,
|
||||
-1, 110, 120, -1, 135, 115, 125, 105,
|
||||
130, 150, 160, 140, -1, 155, -1, 145 };
|
||||
unsigned int j, k = 0;
|
||||
union msr_longhaul longhaul;
|
||||
unsigned long lo, hi;
|
||||
|
@ -355,13 +355,13 @@ static int __init longhaul_get_ranges(void)
|
|||
invalue = longhaul.bits.MaxMHzBR;
|
||||
if (longhaul.bits.MaxMHzBR4)
|
||||
invalue += 16;
|
||||
maxmult=multipliers[invalue];
|
||||
maxmult=ezra_t_multipliers[invalue];
|
||||
|
||||
invalue = longhaul.bits.MinMHzBR;
|
||||
if (longhaul.bits.MinMHzBR4 == 1)
|
||||
minmult = 30;
|
||||
else
|
||||
minmult = multipliers[invalue];
|
||||
minmult = ezra_t_multipliers[invalue];
|
||||
fsb = eblcr_fsb_table_v2[longhaul.bits.MaxMHzFSB];
|
||||
break;
|
||||
}
|
||||
|
@ -527,6 +527,18 @@ static unsigned int longhaul_get(unsigned int cpu)
|
|||
return calc_speed(longhaul_get_cpu_mult());
|
||||
}
|
||||
|
||||
static acpi_status longhaul_walk_callback(acpi_handle obj_handle,
|
||||
u32 nesting_level,
|
||||
void *context, void **return_value)
|
||||
{
|
||||
struct acpi_device *d;
|
||||
|
||||
if ( acpi_bus_get_device(obj_handle, &d) ) {
|
||||
return 0;
|
||||
}
|
||||
*return_value = (void *)acpi_driver_data(d);
|
||||
return 1;
|
||||
}
|
||||
|
||||
static int __init longhaul_cpu_init(struct cpufreq_policy *policy)
|
||||
{
|
||||
|
@ -534,6 +546,15 @@ static int __init longhaul_cpu_init(struct cpufreq_policy *policy)
|
|||
char *cpuname=NULL;
|
||||
int ret;
|
||||
|
||||
/* Check ACPI support for C3 state */
|
||||
acpi_walk_namespace(ACPI_TYPE_PROCESSOR, ACPI_ROOT_OBJECT, ACPI_UINT32_MAX,
|
||||
&longhaul_walk_callback, NULL, (void *)&pr);
|
||||
if (pr == NULL) goto err_acpi;
|
||||
|
||||
cx = &pr->power.states[ACPI_STATE_C3];
|
||||
if (cx->address == 0 || cx->latency > 1000) goto err_acpi;
|
||||
|
||||
/* Now check what we have on this motherboard */
|
||||
switch (c->x86_model) {
|
||||
case 6:
|
||||
cpu_model = CPU_SAMUEL;
|
||||
|
@ -634,6 +655,10 @@ static int __init longhaul_cpu_init(struct cpufreq_policy *policy)
|
|||
cpufreq_frequency_table_get_attr(longhaul_table, policy->cpu);
|
||||
|
||||
return 0;
|
||||
|
||||
err_acpi:
|
||||
printk(KERN_ERR PFX "No ACPI support for CPU frequency changes.\n");
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
static int __devexit longhaul_cpu_exit(struct cpufreq_policy *policy)
|
||||
|
@ -666,6 +691,18 @@ static int __init longhaul_init(void)
|
|||
if (c->x86_vendor != X86_VENDOR_CENTAUR || c->x86 != 6)
|
||||
return -ENODEV;
|
||||
|
||||
#ifdef CONFIG_SMP
|
||||
if (num_online_cpus() > 1) {
|
||||
return -ENODEV;
|
||||
printk(KERN_ERR PFX "More than 1 CPU detected, longhaul disabled.\n");
|
||||
}
|
||||
#endif
|
||||
#ifdef CONFIG_X86_IO_APIC
|
||||
if (cpu_has_apic) {
|
||||
printk(KERN_ERR PFX "APIC detected. Longhaul is currently broken in this configuration.\n");
|
||||
return -ENODEV;
|
||||
}
|
||||
#endif
|
||||
switch (c->x86_model) {
|
||||
case 6 ... 9:
|
||||
return cpufreq_register_driver(&longhaul_driver);
|
||||
|
@ -699,6 +736,6 @@ MODULE_AUTHOR ("Dave Jones <davej@codemonkey.org.uk>");
|
|||
MODULE_DESCRIPTION ("Longhaul driver for VIA Cyrix processors.");
|
||||
MODULE_LICENSE ("GPL");
|
||||
|
||||
module_init(longhaul_init);
|
||||
late_initcall(longhaul_init);
|
||||
module_exit(longhaul_exit);
|
||||
|
||||
|
|
|
@ -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);
|
||||
|
||||
|
|
|
@ -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();
|
||||
}
|
||||
}
|
||||
|
|
|
@ -453,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);
|
||||
}
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -151,7 +151,7 @@ static void
|
|||
simscsi_sg_readwrite (struct scsi_cmnd *sc, int mode, unsigned long offset)
|
||||
{
|
||||
int list_len = sc->use_sg;
|
||||
struct scatterlist *sl = (struct scatterlist *)sc->buffer;
|
||||
struct scatterlist *sl = (struct scatterlist *)sc->request_buffer;
|
||||
struct disk_stat stat;
|
||||
struct disk_req req;
|
||||
|
||||
|
@ -244,7 +244,7 @@ static void simscsi_fillresult(struct scsi_cmnd *sc, char *buf, unsigned len)
|
|||
|
||||
if (scatterlen == 0)
|
||||
memcpy(sc->request_buffer, buf, len);
|
||||
else for (slp = (struct scatterlist *)sc->buffer; scatterlen-- > 0 && len > 0; slp++) {
|
||||
else for (slp = (struct scatterlist *)sc->request_buffer; scatterlen-- > 0 && len > 0; slp++) {
|
||||
unsigned thislen = min(len, slp->length);
|
||||
|
||||
memcpy(page_address(slp->page) + slp->offset, buf, thislen);
|
||||
|
|
|
@ -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)
|
||||
|
||||
|
|
|
@ -632,7 +632,7 @@ kern_memory_descriptor (unsigned long phys_addr)
|
|||
if (phys_addr - md->start < (md->num_pages << EFI_PAGE_SHIFT))
|
||||
return md;
|
||||
}
|
||||
return 0;
|
||||
return NULL;
|
||||
}
|
||||
|
||||
static efi_memory_desc_t *
|
||||
|
@ -652,7 +652,7 @@ efi_memory_descriptor (unsigned long phys_addr)
|
|||
if (phys_addr - md->phys_addr < (md->num_pages << EFI_PAGE_SHIFT))
|
||||
return md;
|
||||
}
|
||||
return 0;
|
||||
return NULL;
|
||||
}
|
||||
|
||||
u32
|
||||
|
@ -923,7 +923,7 @@ find_memmap_space (void)
|
|||
void
|
||||
efi_memmap_init(unsigned long *s, unsigned long *e)
|
||||
{
|
||||
struct kern_memdesc *k, *prev = 0;
|
||||
struct kern_memdesc *k, *prev = NULL;
|
||||
u64 contig_low=0, contig_high=0;
|
||||
u64 as, ae, lim;
|
||||
void *efi_map_start, *efi_map_end, *p, *q;
|
||||
|
|
|
@ -12,6 +12,7 @@ SECTIONS
|
|||
. = GATE_ADDR + SIZEOF_HEADERS;
|
||||
|
||||
.hash : { *(.hash) } :readable
|
||||
.gnu.hash : { *(.gnu.hash) }
|
||||
.dynsym : { *(.dynsym) }
|
||||
.dynstr : { *(.dynstr) }
|
||||
.gnu.version : { *(.gnu.version) }
|
||||
|
|
|
@ -853,7 +853,6 @@ END(__ia64_init_fpu)
|
|||
*/
|
||||
GLOBAL_ENTRY(ia64_switch_mode_phys)
|
||||
{
|
||||
alloc r2=ar.pfs,0,0,0,0
|
||||
rsm psr.i | psr.ic // disable interrupts and interrupt collection
|
||||
mov r15=ip
|
||||
}
|
||||
|
@ -902,7 +901,6 @@ END(ia64_switch_mode_phys)
|
|||
*/
|
||||
GLOBAL_ENTRY(ia64_switch_mode_virt)
|
||||
{
|
||||
alloc r2=ar.pfs,0,0,0,0
|
||||
rsm psr.i | psr.ic // disable interrupts and interrupt collection
|
||||
mov r15=ip
|
||||
}
|
||||
|
|
|
@ -62,7 +62,7 @@ EXPORT_SYMBOL(__udivdi3);
|
|||
EXPORT_SYMBOL(__moddi3);
|
||||
EXPORT_SYMBOL(__umoddi3);
|
||||
|
||||
#if defined(CONFIG_MD_RAID5) || defined(CONFIG_MD_RAID5_MODULE)
|
||||
#if defined(CONFIG_MD_RAID456) || defined(CONFIG_MD_RAID456_MODULE)
|
||||
extern void xor_ia64_2(void);
|
||||
extern void xor_ia64_3(void);
|
||||
extern void xor_ia64_4(void);
|
||||
|
|
|
@ -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));
|
||||
}
|
||||
|
|
|
@ -217,12 +217,7 @@ GLOBAL_ENTRY(ia64_pal_call_phys_stacked)
|
|||
.body
|
||||
;;
|
||||
ld8 loc2 = [loc2] // loc2 <- entry point
|
||||
mov out0 = in0 // first argument
|
||||
mov out1 = in1 // copy arg2
|
||||
mov out2 = in2 // copy arg3
|
||||
mov out3 = in3 // copy arg3
|
||||
;;
|
||||
mov loc3 = psr // save psr
|
||||
mov loc3 = psr // save psr
|
||||
;;
|
||||
mov loc4=ar.rsc // save RSE configuration
|
||||
dep.z loc2=loc2,0,61 // convert pal entry point to physical
|
||||
|
@ -236,18 +231,23 @@ GLOBAL_ENTRY(ia64_pal_call_phys_stacked)
|
|||
;;
|
||||
andcm r16=loc3,r16 // removes bits to clear from psr
|
||||
br.call.sptk.many rp=ia64_switch_mode_phys
|
||||
.ret6:
|
||||
|
||||
mov out0 = in0 // first argument
|
||||
mov out1 = in1 // copy arg2
|
||||
mov out2 = in2 // copy arg3
|
||||
mov out3 = in3 // copy arg3
|
||||
mov loc5 = r19
|
||||
mov loc6 = r20
|
||||
|
||||
br.call.sptk.many rp=b7 // now make the call
|
||||
.ret7:
|
||||
|
||||
mov ar.rsc=0 // put RSE in enforced lazy, LE mode
|
||||
mov r16=loc3 // r16= original psr
|
||||
mov r19=loc5
|
||||
mov r20=loc6
|
||||
br.call.sptk.many rp=ia64_switch_mode_virt // return to virtual mode
|
||||
|
||||
.ret8: mov psr.l = loc3 // restore init PSR
|
||||
mov psr.l = loc3 // restore init PSR
|
||||
mov ar.pfs = loc1
|
||||
mov rp = loc0
|
||||
;;
|
||||
|
|
|
@ -566,29 +566,23 @@ version_info(char *page)
|
|||
pal_version_u_t min_ver, cur_ver;
|
||||
char *p = page;
|
||||
|
||||
/* The PAL_VERSION call is advertised as being able to support
|
||||
* both physical and virtual mode calls. This seems to be a documentation
|
||||
* bug rather than firmware bug. In fact, it does only support physical mode.
|
||||
* So now the code reflects this fact and the pal_version() has been updated
|
||||
* accordingly.
|
||||
*/
|
||||
if (ia64_pal_version(&min_ver, &cur_ver) != 0) return 0;
|
||||
if (ia64_pal_version(&min_ver, &cur_ver) != 0)
|
||||
return 0;
|
||||
|
||||
p += sprintf(p,
|
||||
"PAL_vendor : 0x%02x (min=0x%02x)\n"
|
||||
"PAL_A : %x.%x.%x (min=%x.%x.%x)\n"
|
||||
"PAL_B : %x.%x.%x (min=%x.%x.%x)\n",
|
||||
cur_ver.pal_version_s.pv_pal_vendor, min_ver.pal_version_s.pv_pal_vendor,
|
||||
|
||||
cur_ver.pal_version_s.pv_pal_a_model>>4,
|
||||
cur_ver.pal_version_s.pv_pal_a_model&0xf, cur_ver.pal_version_s.pv_pal_a_rev,
|
||||
min_ver.pal_version_s.pv_pal_a_model>>4,
|
||||
min_ver.pal_version_s.pv_pal_a_model&0xf, min_ver.pal_version_s.pv_pal_a_rev,
|
||||
|
||||
cur_ver.pal_version_s.pv_pal_b_model>>4,
|
||||
cur_ver.pal_version_s.pv_pal_b_model&0xf, cur_ver.pal_version_s.pv_pal_b_rev,
|
||||
min_ver.pal_version_s.pv_pal_b_model>>4,
|
||||
min_ver.pal_version_s.pv_pal_b_model&0xf, min_ver.pal_version_s.pv_pal_b_rev);
|
||||
"PAL_A : %02x.%02x (min=%02x.%02x)\n"
|
||||
"PAL_B : %02x.%02x (min=%02x.%02x)\n",
|
||||
cur_ver.pal_version_s.pv_pal_vendor,
|
||||
min_ver.pal_version_s.pv_pal_vendor,
|
||||
cur_ver.pal_version_s.pv_pal_a_model,
|
||||
cur_ver.pal_version_s.pv_pal_a_rev,
|
||||
min_ver.pal_version_s.pv_pal_a_model,
|
||||
min_ver.pal_version_s.pv_pal_a_rev,
|
||||
cur_ver.pal_version_s.pv_pal_b_model,
|
||||
cur_ver.pal_version_s.pv_pal_b_rev,
|
||||
min_ver.pal_version_s.pv_pal_b_model,
|
||||
min_ver.pal_version_s.pv_pal_b_rev);
|
||||
return p - page;
|
||||
}
|
||||
|
||||
|
@ -958,9 +952,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 +962,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 +1013,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);
|
||||
}
|
||||
|
|
|
@ -32,32 +32,38 @@
|
|||
|
||||
extern void __init efi_memmap_walk_uc(efi_freemem_callback_t, void *);
|
||||
|
||||
#define MAX_UNCACHED_GRANULES 5
|
||||
static int allocated_granules;
|
||||
struct uncached_pool {
|
||||
struct gen_pool *pool;
|
||||
struct mutex add_chunk_mutex; /* serialize adding a converted chunk */
|
||||
int nchunks_added; /* #of converted chunks added to pool */
|
||||
atomic_t status; /* smp called function's return status*/
|
||||
};
|
||||
|
||||
struct gen_pool *uncached_pool[MAX_NUMNODES];
|
||||
#define MAX_CONVERTED_CHUNKS_PER_NODE 2
|
||||
|
||||
struct uncached_pool uncached_pools[MAX_NUMNODES];
|
||||
|
||||
|
||||
static void uncached_ipi_visibility(void *data)
|
||||
{
|
||||
int status;
|
||||
struct uncached_pool *uc_pool = (struct uncached_pool *)data;
|
||||
|
||||
status = ia64_pal_prefetch_visibility(PAL_VISIBILITY_PHYSICAL);
|
||||
if ((status != PAL_VISIBILITY_OK) &&
|
||||
(status != PAL_VISIBILITY_OK_REMOTE_NEEDED))
|
||||
printk(KERN_DEBUG "pal_prefetch_visibility() returns %i on "
|
||||
"CPU %i\n", status, raw_smp_processor_id());
|
||||
atomic_inc(&uc_pool->status);
|
||||
}
|
||||
|
||||
|
||||
static void uncached_ipi_mc_drain(void *data)
|
||||
{
|
||||
int status;
|
||||
struct uncached_pool *uc_pool = (struct uncached_pool *)data;
|
||||
|
||||
status = ia64_pal_mc_drain();
|
||||
if (status)
|
||||
printk(KERN_WARNING "ia64_pal_mc_drain() failed with %i on "
|
||||
"CPU %i\n", status, raw_smp_processor_id());
|
||||
if (status != PAL_STATUS_SUCCESS)
|
||||
atomic_inc(&uc_pool->status);
|
||||
}
|
||||
|
||||
|
||||
|
@ -70,21 +76,34 @@ static void uncached_ipi_mc_drain(void *data)
|
|||
* This is accomplished by first allocating a granule of cached memory pages
|
||||
* and then converting them to uncached memory pages.
|
||||
*/
|
||||
static int uncached_add_chunk(struct gen_pool *pool, int nid)
|
||||
static int uncached_add_chunk(struct uncached_pool *uc_pool, int nid)
|
||||
{
|
||||
struct page *page;
|
||||
int status, i;
|
||||
int status, i, nchunks_added = uc_pool->nchunks_added;
|
||||
unsigned long c_addr, uc_addr;
|
||||
|
||||
if (allocated_granules >= MAX_UNCACHED_GRANULES)
|
||||
if (mutex_lock_interruptible(&uc_pool->add_chunk_mutex) != 0)
|
||||
return -1; /* interrupted by a signal */
|
||||
|
||||
if (uc_pool->nchunks_added > nchunks_added) {
|
||||
/* someone added a new chunk while we were waiting */
|
||||
mutex_unlock(&uc_pool->add_chunk_mutex);
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (uc_pool->nchunks_added >= MAX_CONVERTED_CHUNKS_PER_NODE) {
|
||||
mutex_unlock(&uc_pool->add_chunk_mutex);
|
||||
return -1;
|
||||
}
|
||||
|
||||
/* attempt to allocate a granule's worth of cached memory pages */
|
||||
|
||||
page = alloc_pages_node(nid, GFP_KERNEL | __GFP_ZERO,
|
||||
IA64_GRANULE_SHIFT-PAGE_SHIFT);
|
||||
if (!page)
|
||||
if (!page) {
|
||||
mutex_unlock(&uc_pool->add_chunk_mutex);
|
||||
return -1;
|
||||
}
|
||||
|
||||
/* convert the memory pages from cached to uncached */
|
||||
|
||||
|
@ -102,11 +121,14 @@ static int uncached_add_chunk(struct gen_pool *pool, int nid)
|
|||
flush_tlb_kernel_range(uc_addr, uc_adddr + IA64_GRANULE_SIZE);
|
||||
|
||||
status = ia64_pal_prefetch_visibility(PAL_VISIBILITY_PHYSICAL);
|
||||
if (!status) {
|
||||
status = smp_call_function(uncached_ipi_visibility, NULL, 0, 1);
|
||||
if (status)
|
||||
if (status == PAL_VISIBILITY_OK_REMOTE_NEEDED) {
|
||||
atomic_set(&uc_pool->status, 0);
|
||||
status = smp_call_function(uncached_ipi_visibility, uc_pool,
|
||||
0, 1);
|
||||
if (status || atomic_read(&uc_pool->status))
|
||||
goto failed;
|
||||
}
|
||||
} else if (status != PAL_VISIBILITY_OK)
|
||||
goto failed;
|
||||
|
||||
preempt_disable();
|
||||
|
||||
|
@ -120,20 +142,24 @@ static int uncached_add_chunk(struct gen_pool *pool, int nid)
|
|||
|
||||
preempt_enable();
|
||||
|
||||
ia64_pal_mc_drain();
|
||||
status = smp_call_function(uncached_ipi_mc_drain, NULL, 0, 1);
|
||||
if (status)
|
||||
status = ia64_pal_mc_drain();
|
||||
if (status != PAL_STATUS_SUCCESS)
|
||||
goto failed;
|
||||
atomic_set(&uc_pool->status, 0);
|
||||
status = smp_call_function(uncached_ipi_mc_drain, uc_pool, 0, 1);
|
||||
if (status || atomic_read(&uc_pool->status))
|
||||
goto failed;
|
||||
|
||||
/*
|
||||
* The chunk of memory pages has been converted to uncached so now we
|
||||
* can add it to the pool.
|
||||
*/
|
||||
status = gen_pool_add(pool, uc_addr, IA64_GRANULE_SIZE, nid);
|
||||
status = gen_pool_add(uc_pool->pool, uc_addr, IA64_GRANULE_SIZE, nid);
|
||||
if (status)
|
||||
goto failed;
|
||||
|
||||
allocated_granules++;
|
||||
uc_pool->nchunks_added++;
|
||||
mutex_unlock(&uc_pool->add_chunk_mutex);
|
||||
return 0;
|
||||
|
||||
/* failed to convert or add the chunk so give it back to the kernel */
|
||||
|
@ -142,6 +168,7 @@ failed:
|
|||
ClearPageUncached(&page[i]);
|
||||
|
||||
free_pages(c_addr, IA64_GRANULE_SHIFT-PAGE_SHIFT);
|
||||
mutex_unlock(&uc_pool->add_chunk_mutex);
|
||||
return -1;
|
||||
}
|
||||
|
||||
|
@ -158,7 +185,7 @@ failed:
|
|||
unsigned long uncached_alloc_page(int starting_nid)
|
||||
{
|
||||
unsigned long uc_addr;
|
||||
struct gen_pool *pool;
|
||||
struct uncached_pool *uc_pool;
|
||||
int nid;
|
||||
|
||||
if (unlikely(starting_nid >= MAX_NUMNODES))
|
||||
|
@ -171,14 +198,14 @@ unsigned long uncached_alloc_page(int starting_nid)
|
|||
do {
|
||||
if (!node_online(nid))
|
||||
continue;
|
||||
pool = uncached_pool[nid];
|
||||
if (pool == NULL)
|
||||
uc_pool = &uncached_pools[nid];
|
||||
if (uc_pool->pool == NULL)
|
||||
continue;
|
||||
do {
|
||||
uc_addr = gen_pool_alloc(pool, PAGE_SIZE);
|
||||
uc_addr = gen_pool_alloc(uc_pool->pool, PAGE_SIZE);
|
||||
if (uc_addr != 0)
|
||||
return uc_addr;
|
||||
} while (uncached_add_chunk(pool, nid) == 0);
|
||||
} while (uncached_add_chunk(uc_pool, nid) == 0);
|
||||
|
||||
} while ((nid = (nid + 1) % MAX_NUMNODES) != starting_nid);
|
||||
|
||||
|
@ -197,7 +224,7 @@ EXPORT_SYMBOL(uncached_alloc_page);
|
|||
void uncached_free_page(unsigned long uc_addr)
|
||||
{
|
||||
int nid = paddr_to_nid(uc_addr - __IA64_UNCACHED_OFFSET);
|
||||
struct gen_pool *pool = uncached_pool[nid];
|
||||
struct gen_pool *pool = uncached_pools[nid].pool;
|
||||
|
||||
if (unlikely(pool == NULL))
|
||||
return;
|
||||
|
@ -224,7 +251,7 @@ static int __init uncached_build_memmap(unsigned long uc_start,
|
|||
unsigned long uc_end, void *arg)
|
||||
{
|
||||
int nid = paddr_to_nid(uc_start - __IA64_UNCACHED_OFFSET);
|
||||
struct gen_pool *pool = uncached_pool[nid];
|
||||
struct gen_pool *pool = uncached_pools[nid].pool;
|
||||
size_t size = uc_end - uc_start;
|
||||
|
||||
touch_softlockup_watchdog();
|
||||
|
@ -242,7 +269,8 @@ static int __init uncached_init(void)
|
|||
int nid;
|
||||
|
||||
for_each_online_node(nid) {
|
||||
uncached_pool[nid] = gen_pool_create(PAGE_SHIFT, nid);
|
||||
uncached_pools[nid].pool = gen_pool_create(PAGE_SHIFT, nid);
|
||||
mutex_init(&uncached_pools[nid].add_chunk_mutex);
|
||||
}
|
||||
|
||||
efi_memmap_walk_uc(uncached_build_memmap, NULL);
|
||||
|
|
|
@ -14,7 +14,7 @@ lib-y := __divsi3.o __udivsi3.o __modsi3.o __umodsi3.o \
|
|||
lib-$(CONFIG_ITANIUM) += copy_page.o copy_user.o memcpy.o
|
||||
lib-$(CONFIG_MCKINLEY) += copy_page_mck.o memcpy_mck.o
|
||||
lib-$(CONFIG_PERFMON) += carta_random.o
|
||||
lib-$(CONFIG_MD_RAID5) += xor.o
|
||||
lib-$(CONFIG_MD_RAID456) += xor.o
|
||||
|
||||
AFLAGS___divdi3.o =
|
||||
AFLAGS___udivdi3.o = -DUNSIGNED
|
||||
|
|
|
@ -27,6 +27,7 @@
|
|||
|
||||
#ifdef CONFIG_VIRTUAL_MEM_MAP
|
||||
static unsigned long num_dma_physpages;
|
||||
static unsigned long max_gap;
|
||||
#endif
|
||||
|
||||
/**
|
||||
|
@ -45,9 +46,15 @@ show_mem (void)
|
|||
|
||||
printk("Free swap: %6ldkB\n", nr_swap_pages<<(PAGE_SHIFT-10));
|
||||
i = max_mapnr;
|
||||
while (i-- > 0) {
|
||||
if (!pfn_valid(i))
|
||||
for (i = 0; i < max_mapnr; i++) {
|
||||
if (!pfn_valid(i)) {
|
||||
#ifdef CONFIG_VIRTUAL_MEM_MAP
|
||||
if (max_gap < LARGE_GAP)
|
||||
continue;
|
||||
i = vmemmap_find_next_valid_pfn(0, i) - 1;
|
||||
#endif
|
||||
continue;
|
||||
}
|
||||
total++;
|
||||
if (PageReserved(mem_map+i))
|
||||
reserved++;
|
||||
|
@ -234,7 +241,6 @@ paging_init (void)
|
|||
unsigned long zones_size[MAX_NR_ZONES];
|
||||
#ifdef CONFIG_VIRTUAL_MEM_MAP
|
||||
unsigned long zholes_size[MAX_NR_ZONES];
|
||||
unsigned long max_gap;
|
||||
#endif
|
||||
|
||||
/* initialize mem_map[] */
|
||||
|
@ -266,7 +272,6 @@ paging_init (void)
|
|||
}
|
||||
}
|
||||
|
||||
max_gap = 0;
|
||||
efi_memmap_walk(find_largest_hole, (u64 *)&max_gap);
|
||||
if (max_gap < LARGE_GAP) {
|
||||
vmem_map = (struct page *) 0;
|
||||
|
@ -277,7 +282,8 @@ paging_init (void)
|
|||
|
||||
/* allocate virtual_mem_map */
|
||||
|
||||
map_size = PAGE_ALIGN(max_low_pfn * sizeof(struct page));
|
||||
map_size = PAGE_ALIGN(ALIGN(max_low_pfn, MAX_ORDER_NR_PAGES) *
|
||||
sizeof(struct page));
|
||||
vmalloc_end -= map_size;
|
||||
vmem_map = (struct page *) vmalloc_end;
|
||||
efi_memmap_walk(create_mem_map_page_table, NULL);
|
||||
|
|
|
@ -534,68 +534,6 @@ void __cpuinit *per_cpu_init(void)
|
|||
}
|
||||
#endif /* CONFIG_SMP */
|
||||
|
||||
#ifdef CONFIG_VIRTUAL_MEM_MAP
|
||||
static inline int find_next_valid_pfn_for_pgdat(pg_data_t *pgdat, int i)
|
||||
{
|
||||
unsigned long end_address, hole_next_pfn;
|
||||
unsigned long stop_address;
|
||||
|
||||
end_address = (unsigned long) &vmem_map[pgdat->node_start_pfn + i];
|
||||
end_address = PAGE_ALIGN(end_address);
|
||||
|
||||
stop_address = (unsigned long) &vmem_map[
|
||||
pgdat->node_start_pfn + pgdat->node_spanned_pages];
|
||||
|
||||
do {
|
||||
pgd_t *pgd;
|
||||
pud_t *pud;
|
||||
pmd_t *pmd;
|
||||
pte_t *pte;
|
||||
|
||||
pgd = pgd_offset_k(end_address);
|
||||
if (pgd_none(*pgd)) {
|
||||
end_address += PGDIR_SIZE;
|
||||
continue;
|
||||
}
|
||||
|
||||
pud = pud_offset(pgd, end_address);
|
||||
if (pud_none(*pud)) {
|
||||
end_address += PUD_SIZE;
|
||||
continue;
|
||||
}
|
||||
|
||||
pmd = pmd_offset(pud, end_address);
|
||||
if (pmd_none(*pmd)) {
|
||||
end_address += PMD_SIZE;
|
||||
continue;
|
||||
}
|
||||
|
||||
pte = pte_offset_kernel(pmd, end_address);
|
||||
retry_pte:
|
||||
if (pte_none(*pte)) {
|
||||
end_address += PAGE_SIZE;
|
||||
pte++;
|
||||
if ((end_address < stop_address) &&
|
||||
(end_address != ALIGN(end_address, 1UL << PMD_SHIFT)))
|
||||
goto retry_pte;
|
||||
continue;
|
||||
}
|
||||
/* Found next valid vmem_map page */
|
||||
break;
|
||||
} while (end_address < stop_address);
|
||||
|
||||
end_address = min(end_address, stop_address);
|
||||
end_address = end_address - (unsigned long) vmem_map + sizeof(struct page) - 1;
|
||||
hole_next_pfn = end_address / sizeof(struct page);
|
||||
return hole_next_pfn - pgdat->node_start_pfn;
|
||||
}
|
||||
#else
|
||||
static inline int find_next_valid_pfn_for_pgdat(pg_data_t *pgdat, int i)
|
||||
{
|
||||
return i + 1;
|
||||
}
|
||||
#endif
|
||||
|
||||
/**
|
||||
* show_mem - give short summary of memory stats
|
||||
*
|
||||
|
@ -625,7 +563,8 @@ void show_mem(void)
|
|||
if (pfn_valid(pgdat->node_start_pfn + i))
|
||||
page = pfn_to_page(pgdat->node_start_pfn + i);
|
||||
else {
|
||||
i = find_next_valid_pfn_for_pgdat(pgdat, i) - 1;
|
||||
i = vmemmap_find_next_valid_pfn(pgdat->node_id,
|
||||
i) - 1;
|
||||
continue;
|
||||
}
|
||||
if (PageReserved(page))
|
||||
|
@ -751,7 +690,8 @@ void __init paging_init(void)
|
|||
efi_memmap_walk(filter_rsvd_memory, count_node_pages);
|
||||
|
||||
#ifdef CONFIG_VIRTUAL_MEM_MAP
|
||||
vmalloc_end -= PAGE_ALIGN(max_low_pfn * sizeof(struct page));
|
||||
vmalloc_end -= PAGE_ALIGN(ALIGN(max_low_pfn, MAX_ORDER_NR_PAGES) *
|
||||
sizeof(struct page));
|
||||
vmem_map = (struct page *) vmalloc_end;
|
||||
efi_memmap_walk(create_mem_map_page_table, NULL);
|
||||
printk("Virtual mem_map starts at 0x%p\n", vmem_map);
|
||||
|
|
|
@ -415,6 +415,61 @@ ia64_mmu_init (void *my_cpu_data)
|
|||
}
|
||||
|
||||
#ifdef CONFIG_VIRTUAL_MEM_MAP
|
||||
int vmemmap_find_next_valid_pfn(int node, int i)
|
||||
{
|
||||
unsigned long end_address, hole_next_pfn;
|
||||
unsigned long stop_address;
|
||||
pg_data_t *pgdat = NODE_DATA(node);
|
||||
|
||||
end_address = (unsigned long) &vmem_map[pgdat->node_start_pfn + i];
|
||||
end_address = PAGE_ALIGN(end_address);
|
||||
|
||||
stop_address = (unsigned long) &vmem_map[
|
||||
pgdat->node_start_pfn + pgdat->node_spanned_pages];
|
||||
|
||||
do {
|
||||
pgd_t *pgd;
|
||||
pud_t *pud;
|
||||
pmd_t *pmd;
|
||||
pte_t *pte;
|
||||
|
||||
pgd = pgd_offset_k(end_address);
|
||||
if (pgd_none(*pgd)) {
|
||||
end_address += PGDIR_SIZE;
|
||||
continue;
|
||||
}
|
||||
|
||||
pud = pud_offset(pgd, end_address);
|
||||
if (pud_none(*pud)) {
|
||||
end_address += PUD_SIZE;
|
||||
continue;
|
||||
}
|
||||
|
||||
pmd = pmd_offset(pud, end_address);
|
||||
if (pmd_none(*pmd)) {
|
||||
end_address += PMD_SIZE;
|
||||
continue;
|
||||
}
|
||||
|
||||
pte = pte_offset_kernel(pmd, end_address);
|
||||
retry_pte:
|
||||
if (pte_none(*pte)) {
|
||||
end_address += PAGE_SIZE;
|
||||
pte++;
|
||||
if ((end_address < stop_address) &&
|
||||
(end_address != ALIGN(end_address, 1UL << PMD_SHIFT)))
|
||||
goto retry_pte;
|
||||
continue;
|
||||
}
|
||||
/* Found next valid vmem_map page */
|
||||
break;
|
||||
} while (end_address < stop_address);
|
||||
|
||||
end_address = min(end_address, stop_address);
|
||||
end_address = end_address - (unsigned long) vmem_map + sizeof(struct page) - 1;
|
||||
hole_next_pfn = end_address / sizeof(struct page);
|
||||
return hole_next_pfn - pgdat->node_start_pfn;
|
||||
}
|
||||
|
||||
int __init
|
||||
create_mem_map_page_table (u64 start, u64 end, void *arg)
|
||||
|
|
|
@ -32,7 +32,7 @@ ioremap (unsigned long offset, unsigned long size)
|
|||
*/
|
||||
attr = kern_mem_attribute(offset, size);
|
||||
if (attr & EFI_MEMORY_WB)
|
||||
return phys_to_virt(offset);
|
||||
return (void __iomem *) phys_to_virt(offset);
|
||||
else if (attr & EFI_MEMORY_UC)
|
||||
return __ioremap(offset, size);
|
||||
|
||||
|
@ -43,7 +43,7 @@ ioremap (unsigned long offset, unsigned long size)
|
|||
gran_base = GRANULEROUNDDOWN(offset);
|
||||
gran_size = GRANULEROUNDUP(offset + size) - gran_base;
|
||||
if (efi_mem_attribute(gran_base, gran_size) & EFI_MEMORY_WB)
|
||||
return phys_to_virt(offset);
|
||||
return (void __iomem *) phys_to_virt(offset);
|
||||
|
||||
return __ioremap(offset, size);
|
||||
}
|
||||
|
@ -53,7 +53,7 @@ void __iomem *
|
|||
ioremap_nocache (unsigned long offset, unsigned long size)
|
||||
{
|
||||
if (kern_mem_attribute(offset, size) & EFI_MEMORY_WB)
|
||||
return 0;
|
||||
return NULL;
|
||||
|
||||
return __ioremap(offset, size);
|
||||
}
|
||||
|
|
|
@ -480,7 +480,7 @@ xpc_activating(void *__partid)
|
|||
partid_t partid = (u64) __partid;
|
||||
struct xpc_partition *part = &xpc_partitions[partid];
|
||||
unsigned long irq_flags;
|
||||
struct sched_param param = { sched_priority: MAX_RT_PRIO - 1 };
|
||||
struct sched_param param = { .sched_priority = MAX_RT_PRIO - 1 };
|
||||
int ret;
|
||||
|
||||
|
||||
|
|
|
@ -74,7 +74,7 @@ tioce_mmr_war_pre(struct tioce_kernel *kern, void *mmr_addr)
|
|||
else
|
||||
mmr_war_offset = 0x158;
|
||||
|
||||
readq_relaxed((void *)(mmr_base + mmr_war_offset));
|
||||
readq_relaxed((void __iomem *)(mmr_base + mmr_war_offset));
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -92,8 +92,8 @@ tioce_mmr_war_post(struct tioce_kernel *kern, void *mmr_addr)
|
|||
|
||||
if (mmr_offset < 0x45000) {
|
||||
if (mmr_offset == 0x100)
|
||||
readq_relaxed((void *)(mmr_base + 0x38));
|
||||
readq_relaxed((void *)(mmr_base + 0xb050));
|
||||
readq_relaxed((void __iomem *)(mmr_base + 0x38));
|
||||
readq_relaxed((void __iomem *)(mmr_base + 0xb050));
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -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) }
|
||||
|
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue