This commit is contained in:
Paul Mackerras 2008-01-24 10:07:21 +11:00
Родитель fa28237cfc 8f7b3d156d
Коммит 9156ad4833
459 изменённых файлов: 4194 добавлений и 3000 удалений

Просмотреть файл

@ -527,29 +527,30 @@ and is between 256 and 4096 characters. It is defined in the file
Format: <area>[,<node>] Format: <area>[,<node>]
See also Documentation/networking/decnet.txt. See also Documentation/networking/decnet.txt.
default_blu= [VT] vt.default_blu= [VT]
Format: <blue0>,<blue1>,<blue2>,...,<blue15> Format: <blue0>,<blue1>,<blue2>,...,<blue15>
Change the default blue palette of the console. Change the default blue palette of the console.
This is a 16-member array composed of values This is a 16-member array composed of values
ranging from 0-255. ranging from 0-255.
default_grn= [VT] vt.default_grn= [VT]
Format: <green0>,<green1>,<green2>,...,<green15> Format: <green0>,<green1>,<green2>,...,<green15>
Change the default green palette of the console. Change the default green palette of the console.
This is a 16-member array composed of values This is a 16-member array composed of values
ranging from 0-255. ranging from 0-255.
default_red= [VT] vt.default_red= [VT]
Format: <red0>,<red1>,<red2>,...,<red15> Format: <red0>,<red1>,<red2>,...,<red15>
Change the default red palette of the console. Change the default red palette of the console.
This is a 16-member array composed of values This is a 16-member array composed of values
ranging from 0-255. ranging from 0-255.
default_utf8= [VT] vt.default_utf8=
[VT]
Format=<0|1> Format=<0|1>
Set system-wide default UTF-8 mode for all tty's. Set system-wide default UTF-8 mode for all tty's.
Default is 0 and by setting to 1, it enables UTF-8 Default is 1, i.e. UTF-8 mode is enabled for all
mode for all newly opened or allocated terminals. newly opened terminals.
dhash_entries= [KNL] dhash_entries= [KNL]
Set number of hash buckets for dentry cache. Set number of hash buckets for dentry cache.
@ -883,6 +884,14 @@ and is between 256 and 4096 characters. It is defined in the file
lapic_timer_c2_ok [X86-32,x86-64,APIC] trust the local apic timer in lapic_timer_c2_ok [X86-32,x86-64,APIC] trust the local apic timer in
C2 power state. C2 power state.
libata.dma= [LIBATA] DMA control
libata.dma=0 Disable all PATA and SATA DMA
libata.dma=1 PATA and SATA Disk DMA only
libata.dma=2 ATAPI (CDROM) DMA only
libata.dma=4 Compact Flash DMA only
Combinations also work, so libata.dma=3 enables DMA
for disks and CDROMs, but not CFs.
libata.noacpi [LIBATA] Disables use of ACPI in libata suspend/resume libata.noacpi [LIBATA] Disables use of ACPI in libata suspend/resume
when set. when set.
Format: <int> Format: <int>

Просмотреть файл

@ -45,29 +45,6 @@ long fails. The definition looks like :
typedef struct { atomic_long_t a; } local_t; typedef struct { atomic_long_t a; } local_t;
* Rules to follow when using local atomic operations
- Variables touched by local ops must be per cpu variables.
- _Only_ the CPU owner of these variables must write to them.
- This CPU can use local ops from any context (process, irq, softirq, nmi, ...)
to update its local_t variables.
- Preemption (or interrupts) must be disabled when using local ops in
process context to make sure the process won't be migrated to a
different CPU between getting the per-cpu variable and doing the
actual local op.
- When using local ops in interrupt context, no special care must be
taken on a mainline kernel, since they will run on the local CPU with
preemption already disabled. I suggest, however, to explicitly
disable preemption anyway to make sure it will still work correctly on
-rt kernels.
- Reading the local cpu variable will provide the current copy of the
variable.
- Reads of these variables can be done from any CPU, because updates to
"long", aligned, variables are always atomic. Since no memory
synchronization is done by the writer CPU, an outdated copy of the
variable can be read when reading some _other_ cpu's variables.
* Rules to follow when using local atomic operations * Rules to follow when using local atomic operations
- Variables touched by local ops must be per cpu variables. - Variables touched by local ops must be per cpu variables.

Просмотреть файл

@ -61,7 +61,10 @@ Transmit path guidelines:
2) Do not forget to update netdev->trans_start to jiffies after 2) Do not forget to update netdev->trans_start to jiffies after
each new tx packet is given to the hardware. each new tx packet is given to the hardware.
3) Do not forget that once you return 0 from your hard_start_xmit 3) A hard_start_xmit method must not modify the shared parts of a
cloned SKB.
4) Do not forget that once you return 0 from your hard_start_xmit
method, it is your driver's responsibility to free up the SKB method, it is your driver's responsibility to free up the SKB
and in some finite amount of time. and in some finite amount of time.

Просмотреть файл

@ -12,8 +12,8 @@ and many Linux driver to support it.
"wavelan" driver (old ISA Wavelan) "wavelan" driver (old ISA Wavelan)
---------------- ----------------
o Config : Network device -> Wireless LAN -> AT&T WaveLAN o Config : Network device -> Wireless LAN -> AT&T WaveLAN
o Location : .../drivers/net/wavelan* o Location : .../drivers/net/wireless/wavelan*
o in-line doc : .../drivers/net/wavelan.p.h o in-line doc : .../drivers/net/wireless/wavelan.p.h
o on-line doc : o on-line doc :
http://www.hpl.hp.com/personal/Jean_Tourrilhes/Linux/Wavelan.html http://www.hpl.hp.com/personal/Jean_Tourrilhes/Linux/Wavelan.html

Просмотреть файл

@ -97,10 +97,6 @@ ip=<client-ip>:<server-ip>:<gw-ip>:<netmask>:<hostname>:<device>:<autoconf>
autoconfiguration will take place. The most common way to use this autoconfiguration will take place. The most common way to use this
is "ip=dhcp". is "ip=dhcp".
Note that "ip=off" is not the same thing as "ip=::::::off", because in
the latter autoconfiguration will take place if any of DHCP, BOOTP or RARP
are compiled in the kernel.
<client-ip> IP address of the client. <client-ip> IP address of the client.
Default: Determined using autoconfiguration. Default: Determined using autoconfiguration.
@ -149,7 +145,9 @@ ip=<client-ip>:<server-ip>:<gw-ip>:<netmask>:<hostname>:<device>:<autoconf>
this option. this option.
off or none: don't use autoconfiguration off or none: don't use autoconfiguration
(do static IP assignment instead)
on or any: use any protocol available in the kernel on or any: use any protocol available in the kernel
(default)
dhcp: use DHCP dhcp: use DHCP
bootp: use BOOTP bootp: use BOOTP
rarp: use RARP rarp: use RARP

Просмотреть файл

@ -42,23 +42,27 @@ like this source file: see Documentation/watchdog/src/watchdog-simple.c
A more advanced driver could for example check that a HTTP server is A more advanced driver could for example check that a HTTP server is
still responding before doing the write call to ping the watchdog. still responding before doing the write call to ping the watchdog.
When the device is closed, the watchdog is disabled. This is not When the device is closed, the watchdog is disabled, unless the "Magic
always such a good idea, since if there is a bug in the watchdog Close" feature is supported (see below). This is not always such a
daemon and it crashes the system will not reboot. Because of this, good idea, since if there is a bug in the watchdog daemon and it
some of the drivers support the configuration option "Disable watchdog crashes the system will not reboot. Because of this, some of the
shutdown on close", CONFIG_WATCHDOG_NOWAYOUT. If it is set to Y when drivers support the configuration option "Disable watchdog shutdown on
compiling the kernel, there is no way of disabling the watchdog once close", CONFIG_WATCHDOG_NOWAYOUT. If it is set to Y when compiling
it has been started. So, if the watchdog daemon crashes, the system the kernel, there is no way of disabling the watchdog once it has been
will reboot after the timeout has passed. Watchdog devices also usually started. So, if the watchdog daemon crashes, the system will reboot
support the nowayout module parameter so that this option can be controlled after the timeout has passed. Watchdog devices also usually support
at runtime. the nowayout module parameter so that this option can be controlled at
runtime.
Drivers will not disable the watchdog, unless a specific magic character 'V' Magic Close feature:
has been sent /dev/watchdog just before closing the file. If the userspace
daemon closes the file without sending this special character, the driver If a driver supports "Magic Close", the driver will not disable the
will assume that the daemon (and userspace in general) died, and will stop watchdog unless a specific magic character 'V' has been sent to
pinging the watchdog without disabling it first. This will then cause a /dev/watchdog just before closing the file. If the userspace daemon
reboot if the watchdog is not re-opened in sufficient time. closes the file without sending this special character, the driver
will assume that the daemon (and userspace in general) died, and will
stop pinging the watchdog without disabling it first. This will then
cause a reboot if the watchdog is not re-opened in sufficient time.
The ioctl API: The ioctl API:

Просмотреть файл

@ -665,12 +665,18 @@ S: Maintained
ATMEL AT91 MCI DRIVER ATMEL AT91 MCI DRIVER
P: Nicolas Ferre P: Nicolas Ferre
M: nicolas.ferre@rfo.atmel.com M: nicolas.ferre@atmel.com
L: linux-arm-kernel@lists.arm.linux.org.uk (subscribers-only) L: linux-arm-kernel@lists.arm.linux.org.uk (subscribers-only)
W: http://www.atmel.com/products/AT91/ W: http://www.atmel.com/products/AT91/
W: http://www.at91.com/ W: http://www.at91.com/
S: Maintained S: Maintained
ATMEL LCDFB DRIVER
P: Nicolas Ferre
M: nicolas.ferre@atmel.com
L: linux-fbdev-devel@lists.sourceforge.net (subscribers-only)
S: Maintained
ATMEL MACB ETHERNET DRIVER ATMEL MACB ETHERNET DRIVER
P: Haavard Skinnemoen P: Haavard Skinnemoen
M: hskinnemoen@atmel.com M: hskinnemoen@atmel.com
@ -1870,8 +1876,10 @@ T: quilt kernel.org/pub/linux/kernel/people/bart/pata-2.6/
S: Maintained S: Maintained
IDE/ATAPI CDROM DRIVER IDE/ATAPI CDROM DRIVER
P: Borislav Petkov
M: bbpetkov@yahoo.de
L: linux-ide@vger.kernel.org L: linux-ide@vger.kernel.org
S: Unmaintained S: Maintained
IDE/ATAPI FLOPPY DRIVERS IDE/ATAPI FLOPPY DRIVERS
P: Paul Bristow P: Paul Bristow
@ -1917,7 +1925,7 @@ INFINIBAND SUBSYSTEM
P: Roland Dreier P: Roland Dreier
M: rolandd@cisco.com M: rolandd@cisco.com
P: Sean Hefty P: Sean Hefty
M: mshefty@ichips.intel.com M: sean.hefty@intel.com
P: Hal Rosenstock P: Hal Rosenstock
M: hal.rosenstock@gmail.com M: hal.rosenstock@gmail.com
L: general@lists.openfabrics.org L: general@lists.openfabrics.org
@ -1982,29 +1990,27 @@ L: netdev@vger.kernel.org
S: Maintained S: Maintained
INTEL PRO/100 ETHERNET SUPPORT INTEL PRO/100 ETHERNET SUPPORT
P: John Ronciak P: Auke Kok
M: john.ronciak@intel.com M: auke-jan.h.kok@intel.com
P: Jesse Brandeburg P: Jesse Brandeburg
M: jesse.brandeburg@intel.com M: jesse.brandeburg@intel.com
P: Jeff Kirsher P: Jeff Kirsher
M: jeffrey.t.kirsher@intel.com M: jeffrey.t.kirsher@intel.com
P: Auke Kok P: John Ronciak
M: auke-jan.h.kok@intel.com M: john.ronciak@intel.com
L: e1000-devel@lists.sourceforge.net L: e1000-devel@lists.sourceforge.net
W: http://sourceforge.net/projects/e1000/ W: http://sourceforge.net/projects/e1000/
S: Supported S: Supported
INTEL PRO/1000 GIGABIT ETHERNET SUPPORT INTEL PRO/1000 GIGABIT ETHERNET SUPPORT
P: Jeb Cramer P: Auke Kok
M: cramerj@intel.com M: auke-jan.h.kok@intel.com
P: John Ronciak
M: john.ronciak@intel.com
P: Jesse Brandeburg P: Jesse Brandeburg
M: jesse.brandeburg@intel.com M: jesse.brandeburg@intel.com
P: Jeff Kirsher P: Jeff Kirsher
M: jeffrey.t.kirsher@intel.com M: jeffrey.t.kirsher@intel.com
P: Auke Kok P: John Ronciak
M: auke-jan.h.kok@intel.com M: john.ronciak@intel.com
L: e1000-devel@lists.sourceforge.net L: e1000-devel@lists.sourceforge.net
W: http://sourceforge.net/projects/e1000/ W: http://sourceforge.net/projects/e1000/
S: Supported S: Supported
@ -2029,7 +2035,7 @@ P: James Ketrenos
M: jketreno@linux.intel.com M: jketreno@linux.intel.com
L: linux-wireless@vger.kernel.org L: linux-wireless@vger.kernel.org
L: ipw2100-devel@lists.sourceforge.net L: ipw2100-devel@lists.sourceforge.net
L: http://lists.sourceforge.net/mailman/listinfo/ipw2100-devel W: http://lists.sourceforge.net/mailman/listinfo/ipw2100-devel
W: http://ipw2100.sourceforge.net W: http://ipw2100.sourceforge.net
S: Supported S: Supported
@ -2040,7 +2046,7 @@ P: James Ketrenos
M: jketreno@linux.intel.com M: jketreno@linux.intel.com
L: linux-wireless@vger.kernel.org L: linux-wireless@vger.kernel.org
L: ipw2100-devel@lists.sourceforge.net L: ipw2100-devel@lists.sourceforge.net
L: http://lists.sourceforge.net/mailman/listinfo/ipw2100-devel W: http://lists.sourceforge.net/mailman/listinfo/ipw2100-devel
W: http://ipw2200.sourceforge.net W: http://ipw2200.sourceforge.net
S: Supported S: Supported
@ -2597,7 +2603,7 @@ S: Maintained
MSI LAPTOP SUPPORT MSI LAPTOP SUPPORT
P: Lennart Poettering P: Lennart Poettering
M: mzxreary@0pointer.de M: mzxreary@0pointer.de
L: https://tango.0pointer.de/mailman/listinfo/s270-linux W: https://tango.0pointer.de/mailman/listinfo/s270-linux
W: http://0pointer.de/lennart/tchibo.html W: http://0pointer.de/lennart/tchibo.html
S: Maintained S: Maintained
@ -2739,8 +2745,8 @@ T: git kernel.org:/pub/scm/linux/kernel/git/linville/wireless-2.6.git
S: Maintained S: Maintained
NETXEN (1/10) GbE SUPPORT NETXEN (1/10) GbE SUPPORT
P: Amit S. Kale P: Dhananjay Phadke
M: amitkale@netxen.com M: dhananjay@netxen.com
L: netdev@vger.kernel.org L: netdev@vger.kernel.org
W: http://www.netxen.com W: http://www.netxen.com
S: Supported S: Supported
@ -3611,8 +3617,10 @@ L: linux-kernel@vger.kernel.org ?
S: Supported S: Supported
SPIDERNET NETWORK DRIVER for CELL SPIDERNET NETWORK DRIVER for CELL
P: Linas Vepstas P: Ishizaki Kou
M: linas@austin.ibm.com M: kou.ishizaki@toshiba.co.jp
P: Jens Osterkamp
M: jens@de.ibm.com
L: netdev@vger.kernel.org L: netdev@vger.kernel.org
S: Supported S: Supported
@ -4054,6 +4062,14 @@ L: user-mode-linux-user@lists.sourceforge.net
W: http://user-mode-linux.sourceforge.net W: http://user-mode-linux.sourceforge.net
S: Maintained S: Maintained
USERSPACE I/O (UIO)
P: Hans J. Koch
M: hjk@linutronix.de
P: Greg Kroah-Hartman
M: gregkh@suse.de
L: linux-kernel@vger.kernel.org
S: Maintained
FAT/VFAT/MSDOS FILESYSTEM: FAT/VFAT/MSDOS FILESYSTEM:
P: OGAWA Hirofumi P: OGAWA Hirofumi
M: hirofumi@mail.parknet.co.jp M: hirofumi@mail.parknet.co.jp

Просмотреть файл

@ -1,7 +1,7 @@
VERSION = 2 VERSION = 2
PATCHLEVEL = 6 PATCHLEVEL = 6
SUBLEVEL = 24 SUBLEVEL = 24
EXTRAVERSION = -rc6 EXTRAVERSION = -rc8
NAME = Arr Matey! A Hairy Bilge Rat! NAME = Arr Matey! A Hairy Bilge Rat!
# *DOCUMENTATION* # *DOCUMENTATION*
@ -12,7 +12,7 @@ NAME = Arr Matey! A Hairy Bilge Rat!
# Do not: # Do not:
# o use make's built-in rules and variables # o use make's built-in rules and variables
# (this increases performance and avoid hard-to-debug behavour); # (this increases performance and avoids hard-to-debug behaviour);
# o print "Entering directory ..."; # o print "Entering directory ...";
MAKEFLAGS += -rR --no-print-directory MAKEFLAGS += -rR --no-print-directory
@ -1329,7 +1329,7 @@ else
ALLINCLUDE_ARCHS := $(SRCARCH) ALLINCLUDE_ARCHS := $(SRCARCH)
endif endif
else else
#Allow user to specify only ALLSOURCE_PATHS on the command line, keeping existing behavour. #Allow user to specify only ALLSOURCE_PATHS on the command line, keeping existing behaviour.
ALLINCLUDE_ARCHS := $(ALLSOURCE_ARCHS) ALLINCLUDE_ARCHS := $(ALLSOURCE_ARCHS)
endif endif

2
arch/.gitignore поставляемый Normal file
Просмотреть файл

@ -0,0 +1,2 @@
i386
x86_64

Просмотреть файл

@ -225,7 +225,7 @@ alpha_fp_emul (unsigned long pc)
FP_UNPACK_SP(SB, &vb); FP_UNPACK_SP(SB, &vb);
DR_c = DB_c; DR_c = DB_c;
DR_s = DB_s; DR_s = DB_s;
DR_e = DB_e; DR_e = DB_e + (1024 - 128);
DR_f = SB_f << (52 - 23); DR_f = SB_f << (52 - 23);
goto pack_d; goto pack_d;
} }

Просмотреть файл

@ -1072,11 +1072,13 @@ source "drivers/rtc/Kconfig"
source "drivers/dma/Kconfig" source "drivers/dma/Kconfig"
source "drivers/dca/Kconfig"
endmenu endmenu
source "fs/Kconfig" source "fs/Kconfig"
source "kernel/Kconfig.instrumentation" source "arch/arm/Kconfig.instrumentation"
source "arch/arm/Kconfig.debug" source "arch/arm/Kconfig.debug"

Просмотреть файл

@ -0,0 +1,52 @@
menuconfig INSTRUMENTATION
bool "Instrumentation Support"
default y
---help---
Say Y here to get to see options related to performance measurement,
system-wide debugging, and testing. This option alone does not add any
kernel code.
If you say N, all options in this submenu will be skipped and
disabled. If you're trying to debug the kernel itself, go see the
Kernel Hacking menu.
if INSTRUMENTATION
config PROFILING
bool "Profiling support (EXPERIMENTAL)"
help
Say Y here to enable the extended profiling support mechanisms used
by profilers such as OProfile.
config OPROFILE
tristate "OProfile system profiling (EXPERIMENTAL)"
depends on PROFILING && !UML
help
OProfile is a profiling system capable of profiling the
whole system, include the kernel, kernel modules, libraries,
and applications.
If unsure, say N.
config OPROFILE_ARMV6
bool
depends on OPROFILE && CPU_V6 && !SMP
default y
select OPROFILE_ARM11_CORE
config OPROFILE_MPCORE
bool
depends on OPROFILE && CPU_V6 && SMP
default y
select OPROFILE_ARM11_CORE
config OPROFILE_ARM11_CORE
bool
config MARKERS
bool "Activate markers"
help
Place an empty function call at each marker site. Can be
dynamically changed for a probe function.
endif # INSTRUMENTATION

Просмотреть файл

@ -109,6 +109,15 @@ static struct spi_board_info ek_spi_devices[] = {
#endif #endif
}; };
static struct i2c_board_info __initdata ek_i2c_devices[] = {
{
I2C_BOARD_INFO("ics1523", 0x26),
},
{
I2C_BOARD_INFO("dac3550", 0x4d),
}
};
#define EK_FLASH_BASE AT91_CHIPSELECT_0 #define EK_FLASH_BASE AT91_CHIPSELECT_0
#define EK_FLASH_SIZE 0x200000 #define EK_FLASH_SIZE 0x200000

Просмотреть файл

@ -40,31 +40,29 @@ static int fsample_keymap[] = {
KEY(0,1,KEY_RIGHT), KEY(0,1,KEY_RIGHT),
KEY(0,2,KEY_LEFT), KEY(0,2,KEY_LEFT),
KEY(0,3,KEY_DOWN), KEY(0,3,KEY_DOWN),
KEY(0,4,KEY_CENTER), KEY(0,4,KEY_ENTER),
KEY(0,5,KEY_0_5), KEY(1,0,KEY_F10),
KEY(1,0,KEY_SOFT2),
KEY(1,1,KEY_SEND), KEY(1,1,KEY_SEND),
KEY(1,2,KEY_END), KEY(1,2,KEY_END),
KEY(1,3,KEY_VOLUMEDOWN), KEY(1,3,KEY_VOLUMEDOWN),
KEY(1,4,KEY_VOLUMEUP), KEY(1,4,KEY_VOLUMEUP),
KEY(1,5,KEY_RECORD), KEY(1,5,KEY_RECORD),
KEY(2,0,KEY_SOFT1), KEY(2,0,KEY_F9),
KEY(2,1,KEY_3), KEY(2,1,KEY_3),
KEY(2,2,KEY_6), KEY(2,2,KEY_6),
KEY(2,3,KEY_9), KEY(2,3,KEY_9),
KEY(2,4,KEY_SHARP), KEY(2,4,KEY_KPDOT),
KEY(2,5,KEY_2_5),
KEY(3,0,KEY_BACK), KEY(3,0,KEY_BACK),
KEY(3,1,KEY_2), KEY(3,1,KEY_2),
KEY(3,2,KEY_5), KEY(3,2,KEY_5),
KEY(3,3,KEY_8), KEY(3,3,KEY_8),
KEY(3,4,KEY_0), KEY(3,4,KEY_0),
KEY(3,5,KEY_HEADSETHOOK), KEY(3,5,KEY_KPSLASH),
KEY(4,0,KEY_HOME), KEY(4,0,KEY_HOME),
KEY(4,1,KEY_1), KEY(4,1,KEY_1),
KEY(4,2,KEY_4), KEY(4,2,KEY_4),
KEY(4,3,KEY_7), KEY(4,3,KEY_7),
KEY(4,4,KEY_STAR), KEY(4,4,KEY_KPASTERISK),
KEY(4,5,KEY_POWER), KEY(4,5,KEY_POWER),
0 0
}; };

Просмотреть файл

@ -36,8 +36,6 @@
#include <asm/arch/omapfb.h> #include <asm/arch/omapfb.h>
#include <asm/arch/lcd_mipid.h> #include <asm/arch/lcd_mipid.h>
#include "../plat-omap/dsp/dsp_common.h"
#define ADS7846_PENDOWN_GPIO 15 #define ADS7846_PENDOWN_GPIO 15
static void __init omap_nokia770_init_irq(void) static void __init omap_nokia770_init_irq(void)
@ -318,6 +316,8 @@ static __init int omap_dsp_init(void)
out: out:
return ret; return ret;
} }
#else
#define omap_dsp_init() do {} while (0)
#endif /* CONFIG_OMAP_DSP */ #endif /* CONFIG_OMAP_DSP */
static void __init omap_nokia770_init(void) static void __init omap_nokia770_init(void)

Просмотреть файл

@ -39,31 +39,29 @@ static int p2_keymap[] = {
KEY(0,1,KEY_RIGHT), KEY(0,1,KEY_RIGHT),
KEY(0,2,KEY_LEFT), KEY(0,2,KEY_LEFT),
KEY(0,3,KEY_DOWN), KEY(0,3,KEY_DOWN),
KEY(0,4,KEY_CENTER), KEY(0,4,KEY_ENTER),
KEY(0,5,KEY_0_5), KEY(1,0,KEY_F10),
KEY(1,0,KEY_SOFT2),
KEY(1,1,KEY_SEND), KEY(1,1,KEY_SEND),
KEY(1,2,KEY_END), KEY(1,2,KEY_END),
KEY(1,3,KEY_VOLUMEDOWN), KEY(1,3,KEY_VOLUMEDOWN),
KEY(1,4,KEY_VOLUMEUP), KEY(1,4,KEY_VOLUMEUP),
KEY(1,5,KEY_RECORD), KEY(1,5,KEY_RECORD),
KEY(2,0,KEY_SOFT1), KEY(2,0,KEY_F9),
KEY(2,1,KEY_3), KEY(2,1,KEY_3),
KEY(2,2,KEY_6), KEY(2,2,KEY_6),
KEY(2,3,KEY_9), KEY(2,3,KEY_9),
KEY(2,4,KEY_SHARP), KEY(2,4,KEY_KPDOT),
KEY(2,5,KEY_2_5),
KEY(3,0,KEY_BACK), KEY(3,0,KEY_BACK),
KEY(3,1,KEY_2), KEY(3,1,KEY_2),
KEY(3,2,KEY_5), KEY(3,2,KEY_5),
KEY(3,3,KEY_8), KEY(3,3,KEY_8),
KEY(3,4,KEY_0), KEY(3,4,KEY_0),
KEY(3,5,KEY_HEADSETHOOK), KEY(3,5,KEY_KPSLASH),
KEY(4,0,KEY_HOME), KEY(4,0,KEY_HOME),
KEY(4,1,KEY_1), KEY(4,1,KEY_1),
KEY(4,2,KEY_4), KEY(4,2,KEY_4),
KEY(4,3,KEY_7), KEY(4,3,KEY_7),
KEY(4,4,KEY_STAR), KEY(4,4,KEY_KPASTERISK),
KEY(4,5,KEY_POWER), KEY(4,5,KEY_POWER),
0 0
}; };

Просмотреть файл

@ -178,13 +178,19 @@ static void pxa25x_cpu_pm_save(unsigned long *sleep_save)
SAVE(GAFR1_L); SAVE(GAFR1_U); SAVE(GAFR1_L); SAVE(GAFR1_U);
SAVE(GAFR2_L); SAVE(GAFR2_U); SAVE(GAFR2_L); SAVE(GAFR2_U);
SAVE(ICMR); SAVE(ICMR); ICMR = 0;
SAVE(CKEN); SAVE(CKEN);
SAVE(PSTR); SAVE(PSTR);
/* Clear GPIO transition detect bits */
GEDR0 = GEDR0; GEDR1 = GEDR1; GEDR2 = GEDR2;
} }
static void pxa25x_cpu_pm_restore(unsigned long *sleep_save) static void pxa25x_cpu_pm_restore(unsigned long *sleep_save)
{ {
/* ensure not to come back here if it wasn't intended */
PSPR = 0;
/* restore registers */ /* restore registers */
RESTORE_GPLEVEL(0); RESTORE_GPLEVEL(1); RESTORE_GPLEVEL(2); RESTORE_GPLEVEL(0); RESTORE_GPLEVEL(1); RESTORE_GPLEVEL(2);
RESTORE(GPDR0); RESTORE(GPDR1); RESTORE(GPDR2); RESTORE(GPDR0); RESTORE(GPDR1); RESTORE(GPDR2);
@ -195,7 +201,12 @@ static void pxa25x_cpu_pm_restore(unsigned long *sleep_save)
RESTORE(GFER0); RESTORE(GFER1); RESTORE(GFER2); RESTORE(GFER0); RESTORE(GFER1); RESTORE(GFER2);
RESTORE(PGSR0); RESTORE(PGSR1); RESTORE(PGSR2); RESTORE(PGSR0); RESTORE(PGSR1); RESTORE(PGSR2);
PSSR = PSSR_RDH | PSSR_PH;
RESTORE(CKEN); RESTORE(CKEN);
ICLR = 0;
ICCR = 1;
RESTORE(ICMR); RESTORE(ICMR);
RESTORE(PSTR); RESTORE(PSTR);
} }

Просмотреть файл

@ -43,11 +43,11 @@ pxa_cpu_save_cp:
pxa_cpu_save_sp: pxa_cpu_save_sp:
@ preserve phys address of stack @ preserve phys address of stack
mov r0, sp mov r0, sp
mov r2, lr str lr, [sp, #-4]!
bl sleep_phys_sp bl sleep_phys_sp
ldr r1, =sleep_save_sp ldr r1, =sleep_save_sp
str r0, [r1] str r0, [r1]
mov pc, r2 ldr pc, [sp], #4
/* /*
* pxa27x_cpu_suspend() * pxa27x_cpu_suspend()
@ -270,5 +270,3 @@ resume_after_mmu:
mar acc0, r2, r3 mar acc0, r2, r3
#endif #endif
ldmfd sp!, {r4 - r12, pc} @ return to caller ldmfd sp!, {r4 - r12, pc} @ return to caller

Просмотреть файл

@ -361,10 +361,12 @@ u32 vfp_estimate_sqrt_significand(u32 exponent, u32 significand);
* OP_SCALAR - this operation always operates in scalar mode * OP_SCALAR - this operation always operates in scalar mode
* OP_SD - the instruction exceptionally writes to a single precision result. * OP_SD - the instruction exceptionally writes to a single precision result.
* OP_DD - the instruction exceptionally writes to a double precision result. * OP_DD - the instruction exceptionally writes to a double precision result.
* OP_SM - the instruction exceptionally reads from a single precision operand.
*/ */
#define OP_SCALAR (1 << 0) #define OP_SCALAR (1 << 0)
#define OP_SD (1 << 1) #define OP_SD (1 << 1)
#define OP_DD (1 << 1) #define OP_DD (1 << 1)
#define OP_SM (1 << 2)
struct op { struct op {
u32 (* const fn)(int dd, int dn, int dm, u32 fpscr); u32 (* const fn)(int dd, int dn, int dm, u32 fpscr);

Просмотреть файл

@ -668,8 +668,8 @@ static struct op fops_ext[32] = {
[FEXT_TO_IDX(FEXT_FCMPZ)] = { vfp_double_fcmpz, OP_SCALAR }, [FEXT_TO_IDX(FEXT_FCMPZ)] = { vfp_double_fcmpz, OP_SCALAR },
[FEXT_TO_IDX(FEXT_FCMPEZ)] = { vfp_double_fcmpez, OP_SCALAR }, [FEXT_TO_IDX(FEXT_FCMPEZ)] = { vfp_double_fcmpez, OP_SCALAR },
[FEXT_TO_IDX(FEXT_FCVT)] = { vfp_double_fcvts, OP_SCALAR|OP_SD }, [FEXT_TO_IDX(FEXT_FCVT)] = { vfp_double_fcvts, OP_SCALAR|OP_SD },
[FEXT_TO_IDX(FEXT_FUITO)] = { vfp_double_fuito, OP_SCALAR }, [FEXT_TO_IDX(FEXT_FUITO)] = { vfp_double_fuito, OP_SCALAR|OP_SM },
[FEXT_TO_IDX(FEXT_FSITO)] = { vfp_double_fsito, OP_SCALAR }, [FEXT_TO_IDX(FEXT_FSITO)] = { vfp_double_fsito, OP_SCALAR|OP_SM },
[FEXT_TO_IDX(FEXT_FTOUI)] = { vfp_double_ftoui, OP_SCALAR|OP_SD }, [FEXT_TO_IDX(FEXT_FTOUI)] = { vfp_double_ftoui, OP_SCALAR|OP_SD },
[FEXT_TO_IDX(FEXT_FTOUIZ)] = { vfp_double_ftouiz, OP_SCALAR|OP_SD }, [FEXT_TO_IDX(FEXT_FTOUIZ)] = { vfp_double_ftouiz, OP_SCALAR|OP_SD },
[FEXT_TO_IDX(FEXT_FTOSI)] = { vfp_double_ftosi, OP_SCALAR|OP_SD }, [FEXT_TO_IDX(FEXT_FTOSI)] = { vfp_double_ftosi, OP_SCALAR|OP_SD },
@ -1128,7 +1128,7 @@ u32 vfp_double_cpdo(u32 inst, u32 fpscr)
u32 exceptions = 0; u32 exceptions = 0;
unsigned int dest; unsigned int dest;
unsigned int dn = vfp_get_dn(inst); unsigned int dn = vfp_get_dn(inst);
unsigned int dm = vfp_get_dm(inst); unsigned int dm;
unsigned int vecitr, veclen, vecstride; unsigned int vecitr, veclen, vecstride;
struct op *fop; struct op *fop;
@ -1145,6 +1145,14 @@ u32 vfp_double_cpdo(u32 inst, u32 fpscr)
else else
dest = vfp_get_dd(inst); dest = vfp_get_dd(inst);
/*
* f[us]ito takes a sN operand, not a dN operand.
*/
if (fop->flags & OP_SM)
dm = vfp_get_sm(inst);
else
dm = vfp_get_dm(inst);
/* /*
* If destination bank is zero, vector length is always '1'. * If destination bank is zero, vector length is always '1'.
* ARM DDI0100F C5.1.3, C5.3.2. * ARM DDI0100F C5.1.3, C5.3.2.

Просмотреть файл

@ -65,6 +65,10 @@ config GENERIC_CALIBRATE_DELAY
bool bool
default y default y
config HARDWARE_PM
def_bool y
depends on OPROFILE
source "init/Kconfig" source "init/Kconfig"
source "kernel/Kconfig.preempt" source "kernel/Kconfig.preempt"

Просмотреть файл

@ -6,136 +6,9 @@
*! *!
*! Functions exported: ds1302_readreg, ds1302_writereg, ds1302_init *! Functions exported: ds1302_readreg, ds1302_writereg, ds1302_init
*! *!
*! $Log: ds1302.c,v $
*! Revision 1.18 2005/01/24 09:11:26 mikaelam
*! Minor changes to get DS1302 RTC chip driver to work
*!
*! Revision 1.17 2005/01/05 06:11:22 starvik
*! No need to do local_irq_disable after local_irq_save.
*!
*! Revision 1.16 2004/12/13 12:21:52 starvik
*! Added I/O and DMA allocators from Linux 2.4
*!
*! Revision 1.14 2004/08/24 06:48:43 starvik
*! Whitespace cleanup
*!
*! Revision 1.13 2004/05/28 09:26:59 starvik
*! Modified I2C initialization to work in 2.6.
*!
*! Revision 1.12 2004/05/14 07:58:03 starvik
*! Merge of changes from 2.4
*!
*! Revision 1.10 2004/02/04 09:25:12 starvik
*! Merge of Linux 2.6.2
*!
*! Revision 1.9 2003/07/04 08:27:37 starvik
*! Merge of Linux 2.5.74
*!
*! Revision 1.8 2003/04/09 05:20:47 starvik
*! Merge of Linux 2.5.67
*!
*! Revision 1.6 2003/01/09 14:42:51 starvik
*! Merge of Linux 2.5.55
*!
*! Revision 1.4 2002/12/11 13:13:57 starvik
*! Added arch/ to v10 specific includes
*! Added fix from Linux 2.4 in serial.c (flush_to_flip_buffer)
*!
*! Revision 1.3 2002/11/20 11:56:10 starvik
*! Merge of Linux 2.5.48
*!
*! Revision 1.2 2002/11/18 13:16:06 starvik
*! Linux 2.5 port of latest 2.4 drivers
*!
*! Revision 1.15 2002/10/11 16:14:33 johana
*! Added CONFIG_ETRAX_DS1302_TRICKLE_CHARGE and initial setting of the
*! trcklecharge register.
*!
*! Revision 1.14 2002/10/10 12:15:38 magnusmn
*! Added support for having the RST signal on bit g0
*!
*! Revision 1.13 2002/05/29 15:16:08 johana
*! Removed unused variables.
*!
*! Revision 1.12 2002/04/10 15:35:25 johana
*! Moved probe function closer to init function and marked it __init.
*!
*! Revision 1.11 2001/06/14 12:35:52 jonashg
*! The ATA hack is back. It is unfortunately the only way to set g27 to output.
*!
*! Revision 1.9 2001/06/14 10:00:14 jonashg
*! No need for tempudelay to be inline anymore (had to adjust the usec to
*! loops conversion because of this to make it slow enough to be a udelay).
*!
*! Revision 1.8 2001/06/14 08:06:32 jonashg
*! Made tempudelay delay usecs (well, just a tad more).
*!
*! Revision 1.7 2001/06/13 14:18:11 jonashg
*! Only allow processes with SYS_TIME capability to set time and charge.
*!
*! Revision 1.6 2001/06/12 15:22:07 jonashg
*! * Made init function __init.
*! * Parameter to out_byte() is unsigned char.
*! * The magic number 42 has got a name.
*! * Removed comment about /proc (nothing is exported there).
*!
*! Revision 1.5 2001/06/12 14:35:13 jonashg
*! Gave the module a name and added it to printk's.
*!
*! Revision 1.4 2001/05/31 14:53:40 jonashg
*! Made tempudelay() inline so that the watchdog doesn't reset (see
*! function comment).
*!
*! Revision 1.3 2001/03/26 16:03:06 bjornw
*! Needs linux/config.h
*!
*! Revision 1.2 2001/03/20 19:42:00 bjornw
*! Use the ETRAX prefix on the DS1302 options
*!
*! Revision 1.1 2001/03/20 09:13:50 magnusmn
*! Linux 2.4 port
*!
*! Revision 1.10 2000/07/05 15:38:23 bjornw
*! Dont update kernel time when a RTC_SET_TIME is done
*!
*! Revision 1.9 2000/03/02 15:42:59 macce
*! * Hack to make RTC work on all 2100/2400
*!
*! Revision 1.8 2000/02/23 16:59:18 torbjore
*! added setup of R_GEN_CONFIG when RTC is connected to the generic port.
*!
*! Revision 1.7 2000/01/17 15:51:43 johana
*! Added RTC_SET_CHARGE ioctl to enable trickle charger.
*!
*! Revision 1.6 1999/10/27 13:19:47 bjornw
*! Added update_xtime_from_cmos which reads back the updated RTC into the kernel.
*! /dev/rtc calls it now.
*!
*! Revision 1.5 1999/10/27 12:39:37 bjornw
*! Disabled superuser check. Anyone can now set the time.
*!
*! Revision 1.4 1999/09/02 13:27:46 pkj
*! Added shadow for R_PORT_PB_CONFIG.
*! Renamed port_g_shadow to port_g_data_shadow.
*!
*! Revision 1.3 1999/09/02 08:28:06 pkj
*! Made it possible to select either port PB or the generic port for the RST
*! signal line to the DS1302 RTC.
*! Also make sure the RST bit is configured as output on Port PB (if used).
*!
*! Revision 1.2 1999/09/01 14:47:20 bjornw
*! Added support for /dev/rtc operations with ioctl RD_TIME and SET_TIME to read
*! and set the date. Register as major 121.
*!
*! Revision 1.1 1999/09/01 09:45:29 bjornw
*! Implemented a DS1302 RTC driver.
*!
*!
*! --------------------------------------------------------------------------- *! ---------------------------------------------------------------------------
*! *!
*! (C) Copyright 1999, 2000, 2001, 2002, 2003, 2004 Axis Communications AB, LUND, SWEDEN *! (C) Copyright 1999-2007 Axis Communications AB, LUND, SWEDEN
*!
*! $Id: ds1302.c,v 1.18 2005/01/24 09:11:26 mikaelam Exp $
*! *!
*!***************************************************************************/ *!***************************************************************************/
@ -156,6 +29,8 @@
#include <asm/rtc.h> #include <asm/rtc.h>
#include <asm/arch/io_interface_mux.h> #include <asm/arch/io_interface_mux.h>
#include "i2c.h"
#define RTC_MAJOR_NR 121 /* local major, change later */ #define RTC_MAJOR_NR 121 /* local major, change later */
static const char ds1302_name[] = "ds1302"; static const char ds1302_name[] = "ds1302";

Просмотреть файл

@ -392,6 +392,7 @@ int cris_request_io_interface(enum cris_io_interface ioif, const char *device_id
if (((interfaces[ioif].gpio_g_in & gpio_in_pins) != interfaces[ioif].gpio_g_in) || if (((interfaces[ioif].gpio_g_in & gpio_in_pins) != interfaces[ioif].gpio_g_in) ||
((interfaces[ioif].gpio_g_out & gpio_out_pins) != interfaces[ioif].gpio_g_out) || ((interfaces[ioif].gpio_g_out & gpio_out_pins) != interfaces[ioif].gpio_g_out) ||
((interfaces[ioif].gpio_b & gpio_pb_pins) != interfaces[ioif].gpio_b)) { ((interfaces[ioif].gpio_b & gpio_pb_pins) != interfaces[ioif].gpio_b)) {
local_irq_restore(flags);
printk(KERN_CRIT "cris_request_io_interface: Could not get required pins for interface %u\n", printk(KERN_CRIT "cris_request_io_interface: Could not get required pins for interface %u\n",
ioif); ioif);
return -EBUSY; return -EBUSY;

Просмотреть файл

@ -7,7 +7,7 @@
* *
* Ideas also taken from arch/arm. * Ideas also taken from arch/arm.
* *
* Copyright (C) 2000, 2001 Axis Communications AB * Copyright (C) 2000-2007 Axis Communications AB
* *
* Authors: Bjorn Wesen (bjornw@axis.com) * Authors: Bjorn Wesen (bjornw@axis.com)
* *
@ -40,84 +40,30 @@
*/ */
#define RESTART_CRIS_SYS(regs) regs->r10 = regs->orig_r10; regs->irp -= 2; #define RESTART_CRIS_SYS(regs) regs->r10 = regs->orig_r10; regs->irp -= 2;
int do_signal(int canrestart, sigset_t *oldset, struct pt_regs *regs); void do_signal(int canrestart, struct pt_regs *regs);
/* /*
* Atomically swap in the new signal mask, and wait for a signal. Define * Atomically swap in the new signal mask, and wait for a signal. Define
* dummy arguments to be able to reach the regs argument. (Note that this * dummy arguments to be able to reach the regs argument. (Note that this
* arrangement relies on old_sigset_t occupying one register.) * arrangement relies on old_sigset_t occupying one register.)
*/ */
int int sys_sigsuspend(old_sigset_t mask, long r11, long r12, long r13, long mof,
sys_sigsuspend(old_sigset_t mask, long r11, long r12, long r13, long mof, long srp, struct pt_regs *regs)
long srp, struct pt_regs *regs)
{ {
sigset_t saveset;
mask &= _BLOCKABLE; mask &= _BLOCKABLE;
spin_lock_irq(&current->sighand->siglock); spin_lock_irq(&current->sighand->siglock);
saveset = current->blocked; current->saved_sigmask = current->blocked;
siginitset(&current->blocked, mask); siginitset(&current->blocked, mask);
recalc_sigpending(); recalc_sigpending();
spin_unlock_irq(&current->sighand->siglock); spin_unlock_irq(&current->sighand->siglock);
current->state = TASK_INTERRUPTIBLE;
regs->r10 = -EINTR; schedule();
while (1) { set_thread_flag(TIF_RESTORE_SIGMASK);
current->state = TASK_INTERRUPTIBLE; return -ERESTARTNOHAND;
schedule();
if (do_signal(0, &saveset, regs))
/* We will get here twice: once to call the signal
handler, then again to return from the
sigsuspend system call. When calling the
signal handler, R10 holds the signal number as
set through do_signal. The sigsuspend call
will return with the restored value set above;
always -EINTR. */
return regs->r10;
}
} }
/* Define dummy arguments to be able to reach the regs argument. (Note that int sys_sigaction(int sig, const struct old_sigaction __user *act,
* this arrangement relies on size_t occupying one register.) struct old_sigaction *oact)
*/
int
sys_rt_sigsuspend(sigset_t *unewset, size_t sigsetsize, long r12, long r13,
long mof, long srp, struct pt_regs *regs)
{
sigset_t saveset, newset;
/* XXX: Don't preclude handling different sized sigset_t's. */
if (sigsetsize != sizeof(sigset_t))
return -EINVAL;
if (copy_from_user(&newset, unewset, sizeof(newset)))
return -EFAULT;
sigdelsetmask(&newset, ~_BLOCKABLE);
spin_lock_irq(&current->sighand->siglock);
saveset = current->blocked;
current->blocked = newset;
recalc_sigpending();
spin_unlock_irq(&current->sighand->siglock);
regs->r10 = -EINTR;
while (1) {
current->state = TASK_INTERRUPTIBLE;
schedule();
if (do_signal(0, &saveset, regs))
/* We will get here twice: once to call the signal
handler, then again to return from the
sigsuspend system call. When calling the
signal handler, R10 holds the signal number as
set through do_signal. The sigsuspend call
will return with the restored value set above;
always -EINTR. */
return regs->r10;
}
}
int
sys_sigaction(int sig, const struct old_sigaction __user *act,
struct old_sigaction *oact)
{ {
struct k_sigaction new_ka, old_ka; struct k_sigaction new_ka, old_ka;
int ret; int ret;
@ -147,8 +93,7 @@ sys_sigaction(int sig, const struct old_sigaction __user *act,
return ret; return ret;
} }
int int sys_sigaltstack(const stack_t *uss, stack_t __user *uoss)
sys_sigaltstack(const stack_t *uss, stack_t __user *uoss)
{ {
return do_sigaltstack(uss, uoss, rdusp()); return do_sigaltstack(uss, uoss, rdusp());
} }
@ -205,7 +150,7 @@ restore_sigcontext(struct pt_regs *regs, struct sigcontext __user *sc)
/* TODO: the other ports use regs->orig_XX to disable syscall checks /* TODO: the other ports use regs->orig_XX to disable syscall checks
* after this completes, but we don't use that mechanism. maybe we can * after this completes, but we don't use that mechanism. maybe we can
* use it now ? * use it now ?
*/ */
return err; return err;
@ -216,7 +161,7 @@ badframe:
/* Define dummy arguments to be able to reach the regs argument. */ /* Define dummy arguments to be able to reach the regs argument. */
asmlinkage int sys_sigreturn(long r10, long r11, long r12, long r13, long mof, asmlinkage int sys_sigreturn(long r10, long r11, long r12, long r13, long mof,
long srp, struct pt_regs *regs) long srp, struct pt_regs *regs)
{ {
struct sigframe __user *frame = (struct sigframe *)rdusp(); struct sigframe __user *frame = (struct sigframe *)rdusp();
@ -243,7 +188,7 @@ asmlinkage int sys_sigreturn(long r10, long r11, long r12, long r13, long mof,
current->blocked = set; current->blocked = set;
recalc_sigpending(); recalc_sigpending();
spin_unlock_irq(&current->sighand->siglock); spin_unlock_irq(&current->sighand->siglock);
if (restore_sigcontext(regs, &frame->sc)) if (restore_sigcontext(regs, &frame->sc))
goto badframe; goto badframe;
@ -254,11 +199,11 @@ asmlinkage int sys_sigreturn(long r10, long r11, long r12, long r13, long mof,
badframe: badframe:
force_sig(SIGSEGV, current); force_sig(SIGSEGV, current);
return 0; return 0;
} }
/* Define dummy arguments to be able to reach the regs argument. */ /* Define dummy arguments to be able to reach the regs argument. */
asmlinkage int sys_rt_sigreturn(long r10, long r11, long r12, long r13, asmlinkage int sys_rt_sigreturn(long r10, long r11, long r12, long r13,
long mof, long srp, struct pt_regs *regs) long mof, long srp, struct pt_regs *regs)
{ {
struct rt_sigframe __user *frame = (struct rt_sigframe *)rdusp(); struct rt_sigframe __user *frame = (struct rt_sigframe *)rdusp();
@ -282,7 +227,7 @@ asmlinkage int sys_rt_sigreturn(long r10, long r11, long r12, long r13,
current->blocked = set; current->blocked = set;
recalc_sigpending(); recalc_sigpending();
spin_unlock_irq(&current->sighand->siglock); spin_unlock_irq(&current->sighand->siglock);
if (restore_sigcontext(regs, &frame->uc.uc_mcontext)) if (restore_sigcontext(regs, &frame->uc.uc_mcontext))
goto badframe; goto badframe;
@ -294,14 +239,14 @@ asmlinkage int sys_rt_sigreturn(long r10, long r11, long r12, long r13,
badframe: badframe:
force_sig(SIGSEGV, current); force_sig(SIGSEGV, current);
return 0; return 0;
} }
/* /*
* Set up a signal frame. * Set up a signal frame.
*/ */
static int static int setup_sigcontext(struct sigcontext __user *sc,
setup_sigcontext(struct sigcontext __user *sc, struct pt_regs *regs, unsigned long mask) struct pt_regs *regs, unsigned long mask)
{ {
int err = 0; int err = 0;
unsigned long usp = rdusp(); unsigned long usp = rdusp();
@ -324,10 +269,11 @@ setup_sigcontext(struct sigcontext __user *sc, struct pt_regs *regs, unsigned lo
return err; return err;
} }
/* figure out where we want to put the new signal frame - usually on the stack */ /* Figure out where we want to put the new signal frame
* - usually on the stack. */
static inline void __user * static inline void __user *
get_sigframe(struct k_sigaction *ka, struct pt_regs * regs, size_t frame_size) get_sigframe(struct k_sigaction *ka, struct pt_regs *regs, size_t frame_size)
{ {
unsigned long sp = rdusp(); unsigned long sp = rdusp();
@ -345,15 +291,15 @@ get_sigframe(struct k_sigaction *ka, struct pt_regs * regs, size_t frame_size)
} }
/* grab and setup a signal frame. /* grab and setup a signal frame.
* *
* basically we stack a lot of state info, and arrange for the * basically we stack a lot of state info, and arrange for the
* user-mode program to return to the kernel using either a * user-mode program to return to the kernel using either a
* trampoline which performs the syscall sigreturn, or a provided * trampoline which performs the syscall sigreturn, or a provided
* user-mode trampoline. * user-mode trampoline.
*/ */
static void setup_frame(int sig, struct k_sigaction *ka, static int setup_frame(int sig, struct k_sigaction *ka,
sigset_t *set, struct pt_regs * regs) sigset_t *set, struct pt_regs *regs)
{ {
struct sigframe __user *frame; struct sigframe __user *frame;
unsigned long return_ip; unsigned long return_ip;
@ -401,14 +347,15 @@ static void setup_frame(int sig, struct k_sigaction *ka,
wrusp((unsigned long)frame); wrusp((unsigned long)frame);
return; return 0;
give_sigsegv: give_sigsegv:
force_sigsegv(sig, current); force_sigsegv(sig, current);
return -EFAULT;
} }
static void setup_rt_frame(int sig, struct k_sigaction *ka, siginfo_t *info, static int setup_rt_frame(int sig, struct k_sigaction *ka, siginfo_t *info,
sigset_t *set, struct pt_regs * regs) sigset_t *set, struct pt_regs *regs)
{ {
struct rt_sigframe __user *frame; struct rt_sigframe __user *frame;
unsigned long return_ip; unsigned long return_ip;
@ -443,9 +390,10 @@ static void setup_rt_frame(int sig, struct k_sigaction *ka, siginfo_t *info,
/* trampoline - the desired return ip is the retcode itself */ /* trampoline - the desired return ip is the retcode itself */
return_ip = (unsigned long)&frame->retcode; return_ip = (unsigned long)&frame->retcode;
/* This is movu.w __NR_rt_sigreturn, r9; break 13; */ /* This is movu.w __NR_rt_sigreturn, r9; break 13; */
err |= __put_user(0x9c5f, (short __user*)(frame->retcode+0)); err |= __put_user(0x9c5f, (short __user *)(frame->retcode+0));
err |= __put_user(__NR_rt_sigreturn, (short __user*)(frame->retcode+2)); err |= __put_user(__NR_rt_sigreturn,
err |= __put_user(0xe93d, (short __user*)(frame->retcode+4)); (short __user *)(frame->retcode+2));
err |= __put_user(0xe93d, (short __user *)(frame->retcode+4));
} }
if (err) if (err)
@ -455,73 +403,81 @@ static void setup_rt_frame(int sig, struct k_sigaction *ka, siginfo_t *info,
/* Set up registers for signal handler */ /* Set up registers for signal handler */
regs->irp = (unsigned long) ka->sa.sa_handler; /* what we enter NOW */ /* What we enter NOW */
regs->srp = return_ip; /* what we enter LATER */ regs->irp = (unsigned long) ka->sa.sa_handler;
regs->r10 = sig; /* first argument is signo */ /* What we enter LATER */
regs->r11 = (unsigned long) &frame->info; /* second argument is (siginfo_t *) */ regs->srp = return_ip;
regs->r12 = 0; /* third argument is unused */ /* First argument is signo */
regs->r10 = sig;
/* actually move the usp to reflect the stacked frame */ /* Second argument is (siginfo_t *) */
regs->r11 = (unsigned long)&frame->info;
/* Third argument is unused */
regs->r12 = 0;
/* Actually move the usp to reflect the stacked frame */
wrusp((unsigned long)frame); wrusp((unsigned long)frame);
return; return 0;
give_sigsegv: give_sigsegv:
force_sigsegv(sig, current); force_sigsegv(sig, current);
return -EFAULT;
} }
/* /*
* OK, we're invoking a handler * OK, we're invoking a handler
*/ */
static inline void static inline int handle_signal(int canrestart, unsigned long sig,
handle_signal(int canrestart, unsigned long sig, siginfo_t *info, struct k_sigaction *ka,
siginfo_t *info, struct k_sigaction *ka, sigset_t *oldset, struct pt_regs *regs)
sigset_t *oldset, struct pt_regs * regs)
{ {
int ret;
/* Are we from a system call? */ /* Are we from a system call? */
if (canrestart) { if (canrestart) {
/* If so, check system call restarting.. */ /* If so, check system call restarting.. */
switch (regs->r10) { switch (regs->r10) {
case -ERESTART_RESTARTBLOCK: case -ERESTART_RESTARTBLOCK:
case -ERESTARTNOHAND: case -ERESTARTNOHAND:
/* ERESTARTNOHAND means that the syscall should only be /* ERESTARTNOHAND means that the syscall should
restarted if there was no handler for the signal, and since * only be restarted if there was no handler for
we only get here if there is a handler, we don't restart */ * the signal, and since we only get here if there
* is a handler, we don't restart */
regs->r10 = -EINTR;
break;
case -ERESTARTSYS:
/* ERESTARTSYS means to restart the syscall if
* there is no handler or the handler was
* registered with SA_RESTART */
if (!(ka->sa.sa_flags & SA_RESTART)) {
regs->r10 = -EINTR; regs->r10 = -EINTR;
break; break;
}
case -ERESTARTSYS: /* fallthrough */
/* ERESTARTSYS means to restart the syscall if there is no case -ERESTARTNOINTR:
handler or the handler was registered with SA_RESTART */ /* ERESTARTNOINTR means that the syscall should
if (!(ka->sa.sa_flags & SA_RESTART)) { * be called again after the signal handler returns. */
regs->r10 = -EINTR; RESTART_CRIS_SYS(regs);
break;
}
/* fallthrough */
case -ERESTARTNOINTR:
/* ERESTARTNOINTR means that the syscall should be called again
after the signal handler returns. */
RESTART_CRIS_SYS(regs);
} }
} }
/* Set up the stack frame */ /* Set up the stack frame */
if (ka->sa.sa_flags & SA_SIGINFO) if (ka->sa.sa_flags & SA_SIGINFO)
setup_rt_frame(sig, ka, info, oldset, regs); ret = setup_rt_frame(sig, ka, info, oldset, regs);
else else
setup_frame(sig, ka, oldset, regs); ret = setup_frame(sig, ka, oldset, regs);
if (ka->sa.sa_flags & SA_ONESHOT) if (ret == 0) {
ka->sa.sa_handler = SIG_DFL; spin_lock_irq(&current->sighand->siglock);
sigorsets(&current->blocked, &current->blocked,
spin_lock_irq(&current->sighand->siglock); &ka->sa.sa_mask);
sigorsets(&current->blocked,&current->blocked,&ka->sa.sa_mask); if (!(ka->sa.sa_flags & SA_NODEFER))
if (!(ka->sa.sa_flags & SA_NODEFER)) sigaddset(&current->blocked, sig);
sigaddset(&current->blocked,sig); recalc_sigpending();
recalc_sigpending(); spin_unlock_irq(&current->sighand->siglock);
spin_unlock_irq(&current->sighand->siglock); }
return ret;
} }
/* /*
@ -536,11 +492,12 @@ handle_signal(int canrestart, unsigned long sig,
* mode below. * mode below.
*/ */
int do_signal(int canrestart, sigset_t *oldset, struct pt_regs *regs) void do_signal(int canrestart, struct pt_regs *regs)
{ {
siginfo_t info; siginfo_t info;
int signr; int signr;
struct k_sigaction ka; struct k_sigaction ka;
sigset_t *oldset;
/* /*
* We want the common case to go fast, which * We want the common case to go fast, which
@ -549,16 +506,26 @@ int do_signal(int canrestart, sigset_t *oldset, struct pt_regs *regs)
* if so. * if so.
*/ */
if (!user_mode(regs)) if (!user_mode(regs))
return 1; return;
if (!oldset) if (test_thread_flag(TIF_RESTORE_SIGMASK))
oldset = &current->saved_sigmask;
else
oldset = &current->blocked; oldset = &current->blocked;
signr = get_signal_to_deliver(&info, &ka, regs, NULL); signr = get_signal_to_deliver(&info, &ka, regs, NULL);
if (signr > 0) { if (signr > 0) {
/* Whee! Actually deliver the signal. */ /* Whee! Actually deliver the signal. */
handle_signal(canrestart, signr, &info, &ka, oldset, regs); if (handle_signal(canrestart, signr, &info, &ka,
return 1; oldset, regs)) {
/* a signal was successfully delivered; the saved
* sigmask will have been stored in the signal frame,
* and will be restored by sigreturn, so we can simply
* clear the TIF_RESTORE_SIGMASK flag */
if (test_thread_flag(TIF_RESTORE_SIGMASK))
clear_thread_flag(TIF_RESTORE_SIGMASK);
}
return;
} }
/* Did we come from a system call? */ /* Did we come from a system call? */
@ -569,10 +536,16 @@ int do_signal(int canrestart, sigset_t *oldset, struct pt_regs *regs)
regs->r10 == -ERESTARTNOINTR) { regs->r10 == -ERESTARTNOINTR) {
RESTART_CRIS_SYS(regs); RESTART_CRIS_SYS(regs);
} }
if (regs->r10 == -ERESTART_RESTARTBLOCK){ if (regs->r10 == -ERESTART_RESTARTBLOCK) {
regs->r10 = __NR_restart_syscall; regs->r10 = __NR_restart_syscall;
regs->irp -= 2; regs->irp -= 2;
} }
} }
return 0;
/* if there's no signal to deliver, we just put the saved sigmask
* back */
if (test_thread_flag(TIF_RESTORE_SIGMASK)) {
clear_thread_flag(TIF_RESTORE_SIGMASK);
sigprocmask(SIG_SETMASK, &current->saved_sigmask, NULL);
}
} }

Просмотреть файл

@ -13,6 +13,7 @@
#include <linux/swap.h> #include <linux/swap.h>
#include <linux/sched.h> #include <linux/sched.h>
#include <linux/init.h> #include <linux/init.h>
#include <linux/vmstat.h>
#include <asm/arch/svinto.h> #include <asm/arch/svinto.h>
#include <asm/types.h> #include <asm/types.h>
#include <asm/signal.h> #include <asm/signal.h>

Просмотреть файл

@ -9,7 +9,8 @@
*/ */
#include <asm-generic/vmlinux.lds.h> #include <asm-generic/vmlinux.lds.h>
#include <asm/page.h>
jiffies = jiffies_64; jiffies = jiffies_64;
SECTIONS SECTIONS
{ {
@ -23,7 +24,7 @@ SECTIONS
_stext = .; _stext = .;
__stext = .; __stext = .;
.text : { .text : {
*(.text) TEXT_TEXT
SCHED_TEXT SCHED_TEXT
LOCK_TEXT LOCK_TEXT
*(.fixup) *(.fixup)
@ -49,10 +50,10 @@ SECTIONS
__edata = . ; /* End of data section */ __edata = . ; /* End of data section */
_edata = . ; _edata = . ;
. = ALIGN(8192); /* init_task and stack, must be aligned */ . = ALIGN(PAGE_SIZE); /* init_task and stack, must be aligned */
.data.init_task : { *(.data.init_task) } .data.init_task : { *(.data.init_task) }
. = ALIGN(8192); /* Init code and data */ . = ALIGN(PAGE_SIZE); /* Init code and data */
__init_begin = .; __init_begin = .;
.init.text : { .init.text : {
_sinittext = .; _sinittext = .;
@ -66,13 +67,7 @@ SECTIONS
__setup_end = .; __setup_end = .;
.initcall.init : { .initcall.init : {
__initcall_start = .; __initcall_start = .;
*(.initcall1.init); INITCALLS
*(.initcall2.init);
*(.initcall3.init);
*(.initcall4.init);
*(.initcall5.init);
*(.initcall6.init);
*(.initcall7.init);
__initcall_end = .; __initcall_end = .;
} }
@ -88,16 +83,18 @@ SECTIONS
__initramfs_start = .; __initramfs_start = .;
*(.init.ramfs) *(.init.ramfs)
__initramfs_end = .; __initramfs_end = .;
/* We fill to the next page, so we can discard all init
pages without needing to consider what payload might be
appended to the kernel image. */
FILL (0);
. = ALIGN (8192);
} }
#endif #endif
__vmlinux_end = .; /* last address of the physical file */ __vmlinux_end = .; /* last address of the physical file */
__init_end = .;
/*
* We fill to the next page, so we can discard all init
* pages without needing to consider what payload might be
* appended to the kernel image.
*/
. = ALIGN(PAGE_SIZE);
__init_end = .;
__data_end = . ; /* Move to _edata ? */ __data_end = . ; /* Move to _edata ? */
__bss_start = .; /* BSS */ __bss_start = .; /* BSS */

Просмотреть файл

@ -1488,16 +1488,19 @@ ia64_handle_unaligned (unsigned long ifa, struct pt_regs *regs)
case LDFA_OP: case LDFA_OP:
case LDFCCLR_OP: case LDFCCLR_OP:
case LDFCNC_OP: case LDFCNC_OP:
case LDF_IMM_OP:
case LDFA_IMM_OP:
case LDFCCLR_IMM_OP:
case LDFCNC_IMM_OP:
if (u.insn.x) if (u.insn.x)
ret = emulate_load_floatpair(ifa, u.insn, regs); ret = emulate_load_floatpair(ifa, u.insn, regs);
else else
ret = emulate_load_float(ifa, u.insn, regs); ret = emulate_load_float(ifa, u.insn, regs);
break; break;
case LDF_IMM_OP:
case LDFA_IMM_OP:
case LDFCCLR_IMM_OP:
case LDFCNC_IMM_OP:
ret = emulate_load_float(ifa, u.insn, regs);
break;
case STF_OP: case STF_OP:
case STF_IMM_OP: case STF_IMM_OP:
ret = emulate_store_float(ifa, u.insn, regs); ret = emulate_store_float(ifa, u.insn, regs);

Просмотреть файл

@ -3,7 +3,7 @@
* License. See the file "COPYING" in the main directory of this archive * License. See the file "COPYING" in the main directory of this archive
* for more details. * for more details.
* *
* Copyright (c) 2004-2005 Silicon Graphics, Inc. All Rights Reserved. * Copyright (c) 2004-2007 Silicon Graphics, Inc. All Rights Reserved.
*/ */
@ -14,6 +14,11 @@
* PIO read fails, the MCA handler will force the error to look * PIO read fails, the MCA handler will force the error to look
* corrected and vector to the xp_error_PIOR which will return an error. * corrected and vector to the xp_error_PIOR which will return an error.
* *
* The definition of "consumption" and the time it takes for an MCA
* to surface is processor implementation specific. This code
* is sufficient on Itanium through the Montvale processor family.
* It may need to be adjusted for future processor implementations.
*
* extern int xp_nofault_PIOR(void *remote_register); * extern int xp_nofault_PIOR(void *remote_register);
*/ */
@ -22,11 +27,10 @@ xp_nofault_PIOR:
mov r8=r0 // Stage a success return value mov r8=r0 // Stage a success return value
ld8.acq r9=[r32];; // PIO Read the specified register ld8.acq r9=[r32];; // PIO Read the specified register
adds r9=1,r9;; // Add to force consumption adds r9=1,r9;; // Add to force consumption
or r9=r9,r9;; // Or to force consumption srlz.i;; // Allow time for MCA to surface
br.ret.sptk.many b0;; // Return success br.ret.sptk.many b0;; // Return success
.global xp_error_PIOR .global xp_error_PIOR
xp_error_PIOR: xp_error_PIOR:
mov r8=1 // Return value of 1 mov r8=1 // Return value of 1
br.ret.sptk.many b0;; // Return failure br.ret.sptk.many b0;; // Return failure

Просмотреть файл

@ -59,6 +59,8 @@ config BCM47XX
select SYS_SUPPORTS_LITTLE_ENDIAN select SYS_SUPPORTS_LITTLE_ENDIAN
select SSB select SSB
select SSB_DRIVER_MIPS select SSB_DRIVER_MIPS
select SSB_DRIVER_EXTIF
select SSB_PCICORE_HOSTMODE if PCI
select GENERIC_GPIO select GENERIC_GPIO
select SYS_HAS_EARLY_PRINTK select SYS_HAS_EARLY_PRINTK
select CFE select CFE
@ -992,8 +994,6 @@ config BOOT_ELF64
menu "CPU selection" menu "CPU selection"
source "kernel/time/Kconfig"
choice choice
prompt "CPU type" prompt "CPU type"
default CPU_R4X00 default CPU_R4X00
@ -1768,6 +1768,8 @@ config NR_CPUS
performance should round up your number of processors to the next performance should round up your number of processors to the next
power of two. power of two.
source "kernel/time/Kconfig"
# #
# Timer Interrupt Frequency Configuration # Timer Interrupt Frequency Configuration
# #

Просмотреть файл

@ -1,8 +1,8 @@
/* /*
* BRIEF MODULE DESCRIPTION * BRIEF MODULE DESCRIPTION
* Alchemy/AMD Au1x00 pci support. * Alchemy/AMD Au1x00 PCI support.
* *
* Copyright 2001,2002,2003 MontaVista Software Inc. * Copyright 2001-2003, 2007 MontaVista Software Inc.
* Author: MontaVista Software, Inc. * Author: MontaVista Software, Inc.
* ppopov@mvista.com or source@mvista.com * ppopov@mvista.com or source@mvista.com
* *
@ -66,6 +66,8 @@ static unsigned long virt_io_addr;
static int __init au1x_pci_setup(void) static int __init au1x_pci_setup(void)
{ {
extern void au1x_pci_cfg_init(void);
#if defined(CONFIG_SOC_AU1500) || defined(CONFIG_SOC_AU1550) #if defined(CONFIG_SOC_AU1500) || defined(CONFIG_SOC_AU1550)
virt_io_addr = (unsigned long)ioremap(Au1500_PCI_IO_START, virt_io_addr = (unsigned long)ioremap(Au1500_PCI_IO_START,
Au1500_PCI_IO_END - Au1500_PCI_IO_START + 1); Au1500_PCI_IO_END - Au1500_PCI_IO_START + 1);
@ -94,6 +96,8 @@ static int __init au1x_pci_setup(void)
set_io_port_base(virt_io_addr); set_io_port_base(virt_io_addr);
#endif #endif
au1x_pci_cfg_init();
register_pci_controller(&au1x_controller); register_pci_controller(&au1x_controller);
return 0; return 0;
} }

Просмотреть файл

@ -4,10 +4,15 @@
#include <linux/io.h> #include <linux/io.h>
#include <linux/serial_reg.h> #include <linux/serial_reg.h>
#include <cobalt.h>
#define UART_BASE ((void __iomem *)CKSEG1ADDR(0x1c800000)) #define UART_BASE ((void __iomem *)CKSEG1ADDR(0x1c800000))
void prom_putchar(char c) void prom_putchar(char c)
{ {
if (cobalt_board_id <= COBALT_BRD_ID_QUBE1)
return;
while (!(readb(UART_BASE + UART_LSR) & UART_LSR_THRE)) while (!(readb(UART_BASE + UART_LSR) & UART_LSR_THRE))
; ;

Просмотреть файл

@ -136,7 +136,8 @@ EXPORT(_stext)
* kernel load address. This is needed because this platform does * kernel load address. This is needed because this platform does
* not have a ELF loader yet. * not have a ELF loader yet.
*/ */
__INIT FEXPORT(__kernel_entry)
j kernel_entry
#endif #endif
__INIT_REFOK __INIT_REFOK

Просмотреть файл

@ -269,7 +269,7 @@ static void __init bootmem_init(void)
static void __init bootmem_init(void) static void __init bootmem_init(void)
{ {
unsigned long init_begin, reserved_end; unsigned long reserved_end;
unsigned long mapstart = ~0UL; unsigned long mapstart = ~0UL;
unsigned long bootmap_size; unsigned long bootmap_size;
int i; int i;
@ -344,7 +344,6 @@ static void __init bootmem_init(void)
min_low_pfn, max_low_pfn); min_low_pfn, max_low_pfn);
init_begin = PFN_UP(__pa_symbol(&__init_begin));
for (i = 0; i < boot_mem_map.nr_map; i++) { for (i = 0; i < boot_mem_map.nr_map; i++) {
unsigned long start, end; unsigned long start, end;
@ -352,8 +351,8 @@ static void __init bootmem_init(void)
end = PFN_DOWN(boot_mem_map.map[i].addr end = PFN_DOWN(boot_mem_map.map[i].addr
+ boot_mem_map.map[i].size); + boot_mem_map.map[i].size);
if (start <= init_begin) if (start <= min_low_pfn)
start = init_begin; start = min_low_pfn;
if (start >= end) if (start >= end)
continue; continue;

Просмотреть файл

@ -147,9 +147,9 @@ static __init int cpu_has_mfc0_count_bug(void)
return 1; return 1;
/* /*
* I don't have erratas for newer R4400 so be paranoid. * we assume newer revisions are ok
*/ */
return 1; return 0;
} }
return 0; return 0;

Просмотреть файл

@ -12,11 +12,11 @@ endif
MKLASATIMG = mklasatimg MKLASATIMG = mklasatimg
MKLASATIMG_ARCH = mq2,mqpro,sp100,sp200 MKLASATIMG_ARCH = mq2,mqpro,sp100,sp200
KERNEL_IMAGE = $(TOPDIR)/vmlinux KERNEL_IMAGE = vmlinux
KERNEL_START = $(shell $(NM) $(KERNEL_IMAGE) | grep " _text" | cut -f1 -d\ ) KERNEL_START = $(shell $(NM) $(KERNEL_IMAGE) | grep " _text" | cut -f1 -d\ )
KERNEL_ENTRY = $(shell $(NM) $(KERNEL_IMAGE) | grep kernel_entry | cut -f1 -d\ ) KERNEL_ENTRY = $(shell $(NM) $(KERNEL_IMAGE) | grep kernel_entry | cut -f1 -d\ )
LDSCRIPT= -L$(obj) -Tromscript.normal LDSCRIPT= -L$(srctree)/$(src) -Tromscript.normal
HEAD_DEFINES := -D_kernel_start=0x$(KERNEL_START) \ HEAD_DEFINES := -D_kernel_start=0x$(KERNEL_START) \
-D_kernel_entry=0x$(KERNEL_ENTRY) \ -D_kernel_entry=0x$(KERNEL_ENTRY) \
@ -24,7 +24,7 @@ HEAD_DEFINES := -D_kernel_start=0x$(KERNEL_START) \
-D TIMESTAMP=$(shell date +%s) -D TIMESTAMP=$(shell date +%s)
$(obj)/head.o: $(obj)/head.S $(KERNEL_IMAGE) $(obj)/head.o: $(obj)/head.S $(KERNEL_IMAGE)
$(CC) -fno-pic $(HEAD_DEFINES) -I$(TOPDIR)/include -c -o $@ $< $(CC) -fno-pic $(HEAD_DEFINES) $(LINUXINCLUDE) -c -o $@ $<
OBJECTS = head.o kImage.o OBJECTS = head.o kImage.o

Просмотреть файл

@ -169,7 +169,6 @@ void __init prom_meminit(void)
void __init prom_free_prom_memory(void) void __init prom_free_prom_memory(void)
{ {
#if 0 /* for now ... */
unsigned long addr; unsigned long addr;
int i; int i;
@ -181,5 +180,4 @@ void __init prom_free_prom_memory(void)
free_init_pages("prom memory", free_init_pages("prom memory",
addr, addr + boot_mem_map.map[i].size); addr, addr + boot_mem_map.map[i].size);
} }
#endif
} }

Просмотреть файл

@ -39,16 +39,18 @@ static void atlas_machine_power_off(void);
static void mips_machine_restart(char *command) static void mips_machine_restart(char *command)
{ {
unsigned int __iomem *softres_reg = ioremap(SOFTRES_REG, sizeof(unsigned int)); unsigned int __iomem *softres_reg =
ioremap(SOFTRES_REG, sizeof(unsigned int));
writew(GORESET, softres_reg); __raw_writel(GORESET, softres_reg);
} }
static void mips_machine_halt(void) static void mips_machine_halt(void)
{ {
unsigned int __iomem *softres_reg = ioremap(SOFTRES_REG, sizeof(unsigned int)); unsigned int __iomem *softres_reg =
ioremap(SOFTRES_REG, sizeof(unsigned int));
writew(GORESET, softres_reg); __raw_writel(GORESET, softres_reg);
} }
#if defined(CONFIG_MIPS_ATLAS) #if defined(CONFIG_MIPS_ATLAS)

Просмотреть файл

@ -149,7 +149,7 @@ void __init plat_mem_setup(void)
/* Check PCI clock */ /* Check PCI clock */
{ {
unsigned int __iomem *jmpr_p = (unsigned int *) ioremap(MALTA_JMPRS_REG, sizeof(unsigned int)); unsigned int __iomem *jmpr_p = (unsigned int *) ioremap(MALTA_JMPRS_REG, sizeof(unsigned int));
int jmpr = (readw(jmpr_p) >> 2) & 0x07; int jmpr = (__raw_readl(jmpr_p) >> 2) & 0x07;
static const int pciclocks[] __initdata = { static const int pciclocks[] __initdata = {
33, 20, 25, 30, 12, 16, 37, 10 33, 20, 25, 30, 12, 16, 37, 10
}; };

Просмотреть файл

@ -45,7 +45,7 @@ static gfp_t massage_gfp_flags(const struct device *dev, gfp_t gfp)
/* ignore region specifiers */ /* ignore region specifiers */
gfp &= ~(__GFP_DMA | __GFP_DMA32 | __GFP_HIGHMEM); gfp &= ~(__GFP_DMA | __GFP_DMA32 | __GFP_HIGHMEM);
#ifdef CONFIG_ZONE_DMA32 #ifdef CONFIG_ZONE_DMA
if (dev == NULL) if (dev == NULL)
gfp |= __GFP_DMA; gfp |= __GFP_DMA;
else if (dev->coherent_dma_mask < DMA_BIT_MASK(24)) else if (dev->coherent_dma_mask < DMA_BIT_MASK(24))

Просмотреть файл

@ -177,7 +177,7 @@ static char irq_tab_raq2[] __initdata = {
int __init pcibios_map_irq(const struct pci_dev *dev, u8 slot, u8 pin) int __init pcibios_map_irq(const struct pci_dev *dev, u8 slot, u8 pin)
{ {
if (cobalt_board_id < COBALT_BRD_ID_QUBE2) if (cobalt_board_id <= COBALT_BRD_ID_QUBE1)
return irq_tab_qube1[slot]; return irq_tab_qube1[slot];
if (cobalt_board_id == COBALT_BRD_ID_RAQ2) if (cobalt_board_id == COBALT_BRD_ID_RAQ2)

Просмотреть файл

@ -1,8 +1,8 @@
/* /*
* BRIEF MODULE DESCRIPTION * BRIEF MODULE DESCRIPTION
* Alchemy/AMD Au1x00 pci support. * Alchemy/AMD Au1x00 PCI support.
* *
* Copyright 2001,2002,2003 MontaVista Software Inc. * Copyright 2001-2003, 2007 MontaVista Software Inc.
* Author: MontaVista Software, Inc. * Author: MontaVista Software, Inc.
* ppopov@mvista.com or source@mvista.com * ppopov@mvista.com or source@mvista.com
* *
@ -69,10 +69,27 @@ void mod_wired_entry(int entry, unsigned long entrylo0,
write_c0_pagemask(old_pagemask); write_c0_pagemask(old_pagemask);
} }
struct vm_struct *pci_cfg_vm; static struct vm_struct *pci_cfg_vm;
static int pci_cfg_wired_entry; static int pci_cfg_wired_entry;
static int first_cfg = 1; static unsigned long last_entryLo0, last_entryLo1;
unsigned long last_entryLo0, last_entryLo1;
/*
* We can't ioremap the entire pci config space because it's too large.
* Nor can we call ioremap dynamically because some device drivers use
* the PCI config routines from within interrupt handlers and that
* becomes a problem in get_vm_area(). We use one wired TLB to handle
* all config accesses for all busses.
*/
void __init au1x_pci_cfg_init(void)
{
/* Reserve a wired entry for PCI config accesses */
pci_cfg_vm = get_vm_area(0x2000, VM_IOREMAP);
if (!pci_cfg_vm)
panic(KERN_ERR "PCI unable to get vm area\n");
pci_cfg_wired_entry = read_c0_wired();
add_wired_entry(0, 0, (unsigned long)pci_cfg_vm->addr, PM_4K);
last_entryLo0 = last_entryLo1 = 0xffffffff;
}
static int config_access(unsigned char access_type, struct pci_bus *bus, static int config_access(unsigned char access_type, struct pci_bus *bus,
unsigned int dev_fn, unsigned char where, unsigned int dev_fn, unsigned char where,
@ -97,27 +114,6 @@ static int config_access(unsigned char access_type, struct pci_bus *bus,
Au1500_PCI_STATCMD); Au1500_PCI_STATCMD);
au_sync_udelay(1); au_sync_udelay(1);
/*
* We can't ioremap the entire pci config space because it's
* too large. Nor can we call ioremap dynamically because some
* device drivers use the pci config routines from within
* interrupt handlers and that becomes a problem in get_vm_area().
* We use one wired tlb to handle all config accesses for all
* busses. To improve performance, if the current device
* is the same as the last device accessed, we don't touch the
* tlb.
*/
if (first_cfg) {
/* reserve a wired entry for pci config accesses */
first_cfg = 0;
pci_cfg_vm = get_vm_area(0x2000, VM_IOREMAP);
if (!pci_cfg_vm)
panic(KERN_ERR "PCI unable to get vm area\n");
pci_cfg_wired_entry = read_c0_wired();
add_wired_entry(0, 0, (unsigned long)pci_cfg_vm->addr, PM_4K);
last_entryLo0 = last_entryLo1 = 0xffffffff;
}
/* Allow board vendors to implement their own off-chip idsel. /* Allow board vendors to implement their own off-chip idsel.
* If it doesn't succeed, may as well bail out at this point. * If it doesn't succeed, may as well bail out at this point.
*/ */
@ -144,9 +140,12 @@ static int config_access(unsigned char access_type, struct pci_bus *bus,
/* page boundary */ /* page boundary */
cfg_base = cfg_base & PAGE_MASK; cfg_base = cfg_base & PAGE_MASK;
/*
* To improve performance, if the current device is the same as
* the last device accessed, we don't touch the TLB.
*/
entryLo0 = (6 << 26) | (cfg_base >> 6) | (2 << 3) | 7; entryLo0 = (6 << 26) | (cfg_base >> 6) | (2 << 3) | 7;
entryLo1 = (6 << 26) | (cfg_base >> 6) | (0x1000 >> 6) | (2 << 3) | 7; entryLo1 = (6 << 26) | (cfg_base >> 6) | (0x1000 >> 6) | (2 << 3) | 7;
if ((entryLo0 != last_entryLo0) || (entryLo1 != last_entryLo1)) { if ((entryLo0 != last_entryLo0) || (entryLo1 != last_entryLo1)) {
mod_wired_entry(pci_cfg_wired_entry, entryLo0, entryLo1, mod_wired_entry(pci_cfg_wired_entry, entryLo0, entryLo1,
(unsigned long)pci_cfg_vm->addr, PM_4K); (unsigned long)pci_cfg_vm->addr, PM_4K);

Просмотреть файл

@ -42,6 +42,10 @@ static int
mace_pci_read_config(struct pci_bus *bus, unsigned int devfn, mace_pci_read_config(struct pci_bus *bus, unsigned int devfn,
int reg, int size, u32 *val) int reg, int size, u32 *val)
{ {
u32 control = mace->pci.control;
/* disable master aborts interrupts during config read */
mace->pci.control = control & ~MACEPCI_CONTROL_MAR_INT;
mace->pci.config_addr = mkaddr(bus, devfn, reg); mace->pci.config_addr = mkaddr(bus, devfn, reg);
switch (size) { switch (size) {
case 1: case 1:
@ -54,6 +58,9 @@ mace_pci_read_config(struct pci_bus *bus, unsigned int devfn,
*val = mace->pci.config_data.l; *val = mace->pci.config_data.l;
break; break;
} }
/* ack possible master abort */
mace->pci.error &= ~MACEPCI_ERROR_MASTER_ABORT;
mace->pci.control = control;
DPRINTK("read%d: reg=%08x,val=%02x\n", size * 8, reg, *val); DPRINTK("read%d: reg=%08x,val=%02x\n", size * 8, reg, *val);

Просмотреть файл

@ -119,6 +119,7 @@ static struct pci_controller mace_pci_controller = {
.iommu = 0, .iommu = 0,
.mem_offset = MACE_PCI_MEM_OFFSET, .mem_offset = MACE_PCI_MEM_OFFSET,
.io_offset = 0, .io_offset = 0,
.io_map_base = CKSEG1ADDR(MACEPCI_LOW_IO),
}; };
static int __init mace_init(void) static int __init mace_init(void)
@ -135,7 +136,8 @@ static int __init mace_init(void)
BUG_ON(request_irq(MACE_PCI_BRIDGE_IRQ, macepci_error, 0, BUG_ON(request_irq(MACE_PCI_BRIDGE_IRQ, macepci_error, 0,
"MACE PCI error", NULL)); "MACE PCI error", NULL));
iomem_resource = mace_pci_mem_resource; /* extend memory resources */
iomem_resource.end = mace_pci_mem_resource.end;
ioport_resource = mace_pci_io_resource; ioport_resource = mace_pci_io_resource;
register_pci_controller(&mace_pci_controller); register_pci_controller(&mace_pci_controller);

Просмотреть файл

@ -22,7 +22,6 @@
#include <linux/kernel_stat.h> #include <linux/kernel_stat.h>
#include <linux/spinlock.h> #include <linux/spinlock.h>
#include <linux/interrupt.h> #include <linux/interrupt.h>
#include <linux/module.h>
#include <asm/bootinfo.h> #include <asm/bootinfo.h>
#include <asm/cpu.h> #include <asm/cpu.h>
@ -41,11 +40,60 @@ static cycle_t hpt_read(void)
return read_c0_count2(); return read_c0_count2();
} }
static struct clocksource pnx_clocksource = {
.name = "pnx8xxx",
.rating = 200,
.read = hpt_read,
.flags = CLOCK_SOURCE_IS_CONTINUOUS,
};
static void timer_ack(void) static void timer_ack(void)
{ {
write_c0_compare(cpj); write_c0_compare(cpj);
} }
static irqreturn_t pnx8xxx_timer_interrupt(int irq, void *dev_id)
{
struct clock_event_device *c = dev_id;
/* clear MATCH, signal the event */
c->event_handler(c);
return IRQ_HANDLED;
}
static struct irqaction pnx8xxx_timer_irq = {
.handler = pnx8xxx_timer_interrupt,
.flags = IRQF_DISABLED | IRQF_PERCPU,
.name = "pnx8xxx_timer",
};
static irqreturn_t monotonic_interrupt(int irq, void *dev_id)
{
/* Timer 2 clear interrupt */
write_c0_compare2(-1);
return IRQ_HANDLED;
}
static struct irqaction monotonic_irqaction = {
.handler = monotonic_interrupt,
.flags = IRQF_DISABLED,
.name = "Monotonic timer",
};
static int pnx8xxx_set_next_event(unsigned long delta,
struct clock_event_device *evt)
{
write_c0_compare(delta);
return 0;
}
static struct clock_event_device pnx8xxx_clockevent = {
.name = "pnx8xxx_clockevent",
.features = CLOCK_EVT_FEAT_ONESHOT,
.set_next_event = pnx8xxx_set_next_event,
};
/* /*
* plat_time_init() - it does the following things: * plat_time_init() - it does the following things:
* *
@ -58,11 +106,34 @@ static void timer_ack(void)
__init void plat_time_init(void) __init void plat_time_init(void)
{ {
unsigned int configPR;
unsigned int n; unsigned int n;
unsigned int m; unsigned int m;
unsigned int p; unsigned int p;
unsigned int pow2p; unsigned int pow2p;
clockevents_register_device(&pnx8xxx_clockevent);
clocksource_register(&pnx_clocksource);
setup_irq(PNX8550_INT_TIMER1, &pnx8xxx_timer_irq);
setup_irq(PNX8550_INT_TIMER2, &monotonic_irqaction);
/* Timer 1 start */
configPR = read_c0_config7();
configPR &= ~0x00000008;
write_c0_config7(configPR);
/* Timer 2 start */
configPR = read_c0_config7();
configPR &= ~0x00000010;
write_c0_config7(configPR);
/* Timer 3 stop */
configPR = read_c0_config7();
configPR |= 0x00000020;
write_c0_config7(configPR);
/* PLL0 sets MIPS clock (PLL1 <=> TM1, PLL6 <=> TM2, PLL5 <=> mem) */ /* PLL0 sets MIPS clock (PLL1 <=> TM1, PLL6 <=> TM2, PLL5 <=> mem) */
/* (but only if CLK_MIPS_CTL select value [bits 3:1] is 1: FIXME) */ /* (but only if CLK_MIPS_CTL select value [bits 3:1] is 1: FIXME) */
@ -87,42 +158,6 @@ __init void plat_time_init(void)
write_c0_count2(0); write_c0_count2(0);
write_c0_compare2(0xffffffff); write_c0_compare2(0xffffffff);
clocksource_mips.read = hpt_read;
mips_timer_ack = timer_ack;
} }
static irqreturn_t monotonic_interrupt(int irq, void *dev_id)
{
/* Timer 2 clear interrupt */
write_c0_compare2(-1);
return IRQ_HANDLED;
}
static struct irqaction monotonic_irqaction = {
.handler = monotonic_interrupt,
.flags = IRQF_DISABLED,
.name = "Monotonic timer",
};
void __init plat_timer_setup(struct irqaction *irq)
{
int configPR;
setup_irq(PNX8550_INT_TIMER1, irq);
setup_irq(PNX8550_INT_TIMER2, &monotonic_irqaction);
/* Timer 1 start */
configPR = read_c0_config7();
configPR &= ~0x00000008;
write_c0_config7(configPR);
/* Timer 2 start */
configPR = read_c0_config7();
configPR &= ~0x00000010;
write_c0_config7(configPR);
/* Timer 3 stop */
configPR = read_c0_config7();
configPR |= 0x00000020;
write_c0_config7(configPR);
}

Просмотреть файл

@ -426,7 +426,6 @@ static void ip32_irq0(void)
crime_int = crime->istat & crime_mask; crime_int = crime->istat & crime_mask;
irq = MACE_VID_IN1_IRQ + __ffs(crime_int); irq = MACE_VID_IN1_IRQ + __ffs(crime_int);
crime_int = 1 << irq;
if (crime_int & CRIME_MACEISA_INT_MASK) { if (crime_int & CRIME_MACEISA_INT_MASK) {
unsigned long mace_int = mace->perif.ctrl.istat; unsigned long mace_int = mace->perif.ctrl.istat;

Просмотреть файл

@ -13,21 +13,22 @@
#include <asm/ip32/mace.h> #include <asm/ip32/mace.h>
#include <asm/ip32/ip32_ints.h> #include <asm/ip32/ip32_ints.h>
/* #define MACEISA_SERIAL1_OFFS offsetof(struct sgi_mace, isa.serial1)
* .iobase isn't a constant (in the sense of C) so we fill it in at runtime. #define MACEISA_SERIAL2_OFFS offsetof(struct sgi_mace, isa.serial2)
*/
#define MACE_PORT(int) \ #define MACE_PORT(offset,_irq) \
{ \ { \
.irq = int, \ .mapbase = MACE_BASE + offset, \
.irq = _irq, \
.uartclk = 1843200, \ .uartclk = 1843200, \
.iotype = UPIO_MEM, \ .iotype = UPIO_MEM, \
.flags = UPF_SKIP_TEST, \ .flags = UPF_SKIP_TEST|UPF_IOREMAP, \
.regshift = 8, \ .regshift = 8, \
} }
static struct plat_serial8250_port uart8250_data[] = { static struct plat_serial8250_port uart8250_data[] = {
MACE_PORT(MACEISA_SERIAL1_IRQ), MACE_PORT(MACEISA_SERIAL1_OFFS, MACEISA_SERIAL1_IRQ),
MACE_PORT(MACEISA_SERIAL2_IRQ), MACE_PORT(MACEISA_SERIAL2_OFFS, MACEISA_SERIAL2_IRQ),
{ }, { },
}; };
@ -41,9 +42,6 @@ static struct platform_device uart8250_device = {
static int __init uart8250_init(void) static int __init uart8250_init(void)
{ {
uart8250_data[0].membase = (void __iomem *) &mace->isa.serial1;
uart8250_data[1].membase = (void __iomem *) &mace->isa.serial2;
return platform_device_register(&uart8250_device); return platform_device_register(&uart8250_device);
} }

Просмотреть файл

@ -598,8 +598,8 @@ static int __init rbtx4938_ethaddr_init(void)
printk(KERN_WARNING "seeprom: bad checksum.\n"); printk(KERN_WARNING "seeprom: bad checksum.\n");
} }
for (i = 0; i < 2; i++) { for (i = 0; i < 2; i++) {
unsigned int slot = TX4938_PCIC_IDSEL_AD_TO_SLOT(31 - i); unsigned int id =
unsigned int id = (1 << 8) | PCI_DEVFN(slot, 0); /* bus 1 */ TXX9_IRQ_BASE + (i ? TX4938_IR_ETH1 : TX4938_IR_ETH0);
struct platform_device *pdev; struct platform_device *pdev;
if (!(tx4938_ccfgptr->pcfg & if (!(tx4938_ccfgptr->pcfg &
(i ? TX4938_PCFG_ETH1_SEL : TX4938_PCFG_ETH0_SEL))) (i ? TX4938_PCFG_ETH1_SEL : TX4938_PCFG_ETH0_SEL)))

Просмотреть файл

@ -2,7 +2,7 @@
* This file adds the header file glue so that the shared files * This file adds the header file glue so that the shared files
* flatdevicetree.[ch] can compile and work in the powerpc bootwrapper. * flatdevicetree.[ch] can compile and work in the powerpc bootwrapper.
* *
* strncmp & strchr copied from <file:lib/strings.c> * strncmp & strchr copied from <file:lib/string.c>
* Copyright (C) 1991, 1992 Linus Torvalds * Copyright (C) 1991, 1992 Linus Torvalds
* *
* Maintained by: Mark A. Greer <mgreer@mvista.com> * Maintained by: Mark A. Greer <mgreer@mvista.com>

Просмотреть файл

@ -278,6 +278,7 @@ int iommu_map_sg(struct iommu_table *tbl, struct scatterlist *sglist,
unsigned long flags; unsigned long flags;
struct scatterlist *s, *outs, *segstart; struct scatterlist *s, *outs, *segstart;
int outcount, incount, i; int outcount, incount, i;
unsigned int align;
unsigned long handle; unsigned long handle;
BUG_ON(direction == DMA_NONE); BUG_ON(direction == DMA_NONE);
@ -309,7 +310,12 @@ int iommu_map_sg(struct iommu_table *tbl, struct scatterlist *sglist,
/* Allocate iommu entries for that segment */ /* Allocate iommu entries for that segment */
vaddr = (unsigned long) sg_virt(s); vaddr = (unsigned long) sg_virt(s);
npages = iommu_num_pages(vaddr, slen); npages = iommu_num_pages(vaddr, slen);
entry = iommu_range_alloc(tbl, npages, &handle, mask >> IOMMU_PAGE_SHIFT, 0); align = 0;
if (IOMMU_PAGE_SHIFT < PAGE_SHIFT && slen >= PAGE_SIZE &&
(vaddr & ~PAGE_MASK) == 0)
align = PAGE_SHIFT - IOMMU_PAGE_SHIFT;
entry = iommu_range_alloc(tbl, npages, &handle,
mask >> IOMMU_PAGE_SHIFT, align);
DBG(" - vaddr: %lx, size: %lx\n", vaddr, slen); DBG(" - vaddr: %lx, size: %lx\n", vaddr, slen);
@ -570,7 +576,7 @@ dma_addr_t iommu_map_single(struct iommu_table *tbl, void *vaddr,
{ {
dma_addr_t dma_handle = DMA_ERROR_CODE; dma_addr_t dma_handle = DMA_ERROR_CODE;
unsigned long uaddr; unsigned long uaddr;
unsigned int npages; unsigned int npages, align;
BUG_ON(direction == DMA_NONE); BUG_ON(direction == DMA_NONE);
@ -578,8 +584,13 @@ dma_addr_t iommu_map_single(struct iommu_table *tbl, void *vaddr,
npages = iommu_num_pages(uaddr, size); npages = iommu_num_pages(uaddr, size);
if (tbl) { if (tbl) {
align = 0;
if (IOMMU_PAGE_SHIFT < PAGE_SHIFT && size >= PAGE_SIZE &&
((unsigned long)vaddr & ~PAGE_MASK) == 0)
align = PAGE_SHIFT - IOMMU_PAGE_SHIFT;
dma_handle = iommu_alloc(tbl, vaddr, npages, direction, dma_handle = iommu_alloc(tbl, vaddr, npages, direction,
mask >> IOMMU_PAGE_SHIFT, 0); mask >> IOMMU_PAGE_SHIFT, align);
if (dma_handle == DMA_ERROR_CODE) { if (dma_handle == DMA_ERROR_CODE) {
if (printk_ratelimit()) { if (printk_ratelimit()) {
printk(KERN_INFO "iommu_alloc failed, " printk(KERN_INFO "iommu_alloc failed, "

Просмотреть файл

@ -2216,6 +2216,45 @@ static void __init fixup_device_tree_efika(void)
prom_printf("fixup_device_tree_efika: ", prom_printf("fixup_device_tree_efika: ",
"skipped entry %x - setprop error\n", i); "skipped entry %x - setprop error\n", i);
} }
/* Make sure ethernet mdio bus node exists */
node = call_prom("finddevice", 1, 1, ADDR("/builtin/mdio"));
if (!PHANDLE_VALID(node)) {
prom_printf("Adding Ethernet MDIO node\n");
call_prom("interpret", 1, 1,
" s\" /builtin\" find-device"
" new-device"
" 1 encode-int s\" #address-cells\" property"
" 0 encode-int s\" #size-cells\" property"
" s\" mdio\" 2dup device-name device-type"
" s\" mpc5200b-fec-phy\" encode-string"
" s\" compatible\" property"
" 0xf0003000 0x400 reg"
" 0x2 encode-int"
" 0x5 encode-int encode+"
" 0x3 encode-int encode+"
" s\" interrupts\" property"
" finish-device");
};
/* Make sure ethernet phy device node exist */
node = call_prom("finddevice", 1, 1, ADDR("/builtin/mdio/ethernet-phy"));
if (!PHANDLE_VALID(node)) {
prom_printf("Adding Ethernet PHY node\n");
call_prom("interpret", 1, 1,
" s\" /builtin/mdio\" find-device"
" new-device"
" s\" ethernet-phy\" device-name"
" 0x10 encode-int s\" reg\" property"
" my-self"
" ihandle>phandle"
" finish-device"
" s\" /builtin/ethernet\" find-device"
" encode-int"
" s\" phy-handle\" property"
" device-end");
}
} }
#else #else
#define fixup_device_tree_efika() #define fixup_device_tree_efika()

Просмотреть файл

@ -295,6 +295,8 @@ void slb_initialize(void)
create_shadowed_slbe(VMALLOC_START, mmu_kernel_ssize, vflags, 1); create_shadowed_slbe(VMALLOC_START, mmu_kernel_ssize, vflags, 1);
slb_shadow_clear(2);
/* We don't bolt the stack for the time being - we're in boot, /* We don't bolt the stack for the time being - we're in boot,
* so the stack is in the bolted segment. By the time it goes * so the stack is in the bolted segment. By the time it goes
* elsewhere, we'll call _switch() which will bolt in the new * elsewhere, we'll call _switch() which will bolt in the new

Просмотреть файл

@ -88,3 +88,8 @@ config CBE_CPUFREQ_PMI
but also at lower core voltage. but also at lower core voltage.
endmenu endmenu
config OPROFILE_CELL
def_bool y
depends on PPC_CELL_NATIVE && (OPROFILE = m || OPROFILE = y)

Просмотреть файл

@ -19,6 +19,7 @@ spu-manage-$(CONFIG_PPC_CELLEB) += spu_manage.o
spu-manage-$(CONFIG_PPC_CELL_NATIVE) += spu_manage.o spu-manage-$(CONFIG_PPC_CELL_NATIVE) += spu_manage.o
obj-$(CONFIG_SPU_BASE) += spu_callbacks.o spu_base.o \ obj-$(CONFIG_SPU_BASE) += spu_callbacks.o spu_base.o \
spu_notify.o \
spu_syscalls.o spu_fault.o \ spu_syscalls.o spu_fault.o \
$(spu-priv1-y) \ $(spu-priv1-y) \
$(spu-manage-y) \ $(spu-manage-y) \

Просмотреть файл

@ -0,0 +1,67 @@
/*
* Move OProfile dependencies from spufs module to the kernel so it
* can run on non-cell PPC.
*
* Copyright (C) IBM 2005
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2, or (at your option)
* any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/
#undef DEBUG
#include <linux/module.h>
#include <asm/spu.h>
#include "spufs/spufs.h"
static BLOCKING_NOTIFIER_HEAD(spu_switch_notifier);
void spu_switch_notify(struct spu *spu, struct spu_context *ctx)
{
blocking_notifier_call_chain(&spu_switch_notifier,
ctx ? ctx->object_id : 0, spu);
}
EXPORT_SYMBOL_GPL(spu_switch_notify);
int spu_switch_event_register(struct notifier_block *n)
{
int ret;
ret = blocking_notifier_chain_register(&spu_switch_notifier, n);
if (!ret)
notify_spus_active();
return ret;
}
EXPORT_SYMBOL_GPL(spu_switch_event_register);
int spu_switch_event_unregister(struct notifier_block *n)
{
return blocking_notifier_chain_unregister(&spu_switch_notifier, n);
}
EXPORT_SYMBOL_GPL(spu_switch_event_unregister);
void spu_set_profile_private_kref(struct spu_context *ctx,
struct kref *prof_info_kref,
void (* prof_info_release) (struct kref *kref))
{
ctx->prof_priv_kref = prof_info_kref;
ctx->prof_priv_release = prof_info_release;
}
EXPORT_SYMBOL_GPL(spu_set_profile_private_kref);
void *spu_get_profile_private_kref(struct spu_context *ctx)
{
return ctx->prof_priv_kref;
}
EXPORT_SYMBOL_GPL(spu_get_profile_private_kref);

Просмотреть файл

@ -145,6 +145,20 @@ int elf_coredump_extra_notes_write(struct file *file, loff_t *foffset)
return ret; return ret;
} }
void notify_spus_active(void)
{
struct spufs_calls *calls;
calls = spufs_calls_get();
if (!calls)
return;
calls->notify_spus_active();
spufs_calls_put(calls);
return;
}
int register_spu_syscalls(struct spufs_calls *calls) int register_spu_syscalls(struct spufs_calls *calls)
{ {
if (spufs_calls) if (spufs_calls)

Просмотреть файл

@ -177,19 +177,3 @@ void spu_release_saved(struct spu_context *ctx)
spu_release(ctx); spu_release(ctx);
} }
void spu_set_profile_private_kref(struct spu_context *ctx,
struct kref *prof_info_kref,
void ( * prof_info_release) (struct kref *kref))
{
ctx->prof_priv_kref = prof_info_kref;
ctx->prof_priv_release = prof_info_release;
}
EXPORT_SYMBOL_GPL(spu_set_profile_private_kref);
void *spu_get_profile_private_kref(struct spu_context *ctx)
{
return ctx->prof_priv_kref;
}
EXPORT_SYMBOL_GPL(spu_get_profile_private_kref);

Просмотреть файл

@ -182,15 +182,7 @@ static int node_allowed(struct spu_context *ctx, int node)
return rval; return rval;
} }
static BLOCKING_NOTIFIER_HEAD(spu_switch_notifier); void do_notify_spus_active(void)
void spu_switch_notify(struct spu *spu, struct spu_context *ctx)
{
blocking_notifier_call_chain(&spu_switch_notifier,
ctx ? ctx->object_id : 0, spu);
}
static void notify_spus_active(void)
{ {
int node; int node;
@ -217,22 +209,6 @@ static void notify_spus_active(void)
} }
} }
int spu_switch_event_register(struct notifier_block * n)
{
int ret;
ret = blocking_notifier_chain_register(&spu_switch_notifier, n);
if (!ret)
notify_spus_active();
return ret;
}
EXPORT_SYMBOL_GPL(spu_switch_event_register);
int spu_switch_event_unregister(struct notifier_block * n)
{
return blocking_notifier_chain_unregister(&spu_switch_notifier, n);
}
EXPORT_SYMBOL_GPL(spu_switch_event_unregister);
/** /**
* spu_bind_context - bind spu context to physical spu * spu_bind_context - bind spu context to physical spu
* @spu: physical spu to bind to * @spu: physical spu to bind to

Просмотреть файл

@ -86,5 +86,6 @@ struct spufs_calls spufs_calls = {
.spu_run = do_spu_run, .spu_run = do_spu_run,
.coredump_extra_notes_size = spufs_coredump_extra_notes_size, .coredump_extra_notes_size = spufs_coredump_extra_notes_size,
.coredump_extra_notes_write = spufs_coredump_extra_notes_write, .coredump_extra_notes_write = spufs_coredump_extra_notes_write,
.notify_spus_active = do_notify_spus_active,
.owner = THIS_MODULE, .owner = THIS_MODULE,
}; };

Просмотреть файл

@ -23,6 +23,7 @@
#include <linux/workqueue.h> #include <linux/workqueue.h>
#include <linux/fs.h> #include <linux/fs.h>
#include <linux/syscalls.h> #include <linux/syscalls.h>
#include <linux/ctype.h>
#include <asm/lmb.h> #include <asm/lmb.h>
@ -37,6 +38,8 @@ enum os_area_ldr_format {
HEADER_LDR_FORMAT_GZIP = 1, HEADER_LDR_FORMAT_GZIP = 1,
}; };
#define OS_AREA_HEADER_MAGIC_NUM "cell_ext_os_area"
/** /**
* struct os_area_header - os area header segment. * struct os_area_header - os area header segment.
* @magic_num: Always 'cell_ext_os_area'. * @magic_num: Always 'cell_ext_os_area'.
@ -114,13 +117,11 @@ struct os_area_params {
u8 _reserved_5[8]; u8 _reserved_5[8];
}; };
enum { #define OS_AREA_DB_MAGIC_NUM "-db-"
OS_AREA_DB_MAGIC_NUM = 0x2d64622dU,
};
/** /**
* struct os_area_db - Shared flash memory database. * struct os_area_db - Shared flash memory database.
* @magic_num: Always '-db-' = 0x2d64622d. * @magic_num: Always '-db-'.
* @version: os_area_db format version number. * @version: os_area_db format version number.
* @index_64: byte offset of the database id index for 64 bit variables. * @index_64: byte offset of the database id index for 64 bit variables.
* @count_64: number of usable 64 bit index entries * @count_64: number of usable 64 bit index entries
@ -135,7 +136,7 @@ enum {
*/ */
struct os_area_db { struct os_area_db {
u32 magic_num; u8 magic_num[4];
u16 version; u16 version;
u16 _reserved_1; u16 _reserved_1;
u16 index_64; u16 index_64;
@ -265,12 +266,26 @@ static void __init os_area_get_property(struct device_node *node,
prop->name); prop->name);
} }
static void dump_field(char *s, const u8 *field, int size_of_field)
{
#if defined(DEBUG)
int i;
for (i = 0; i < size_of_field; i++)
s[i] = isprint(field[i]) ? field[i] : '.';
s[i] = 0;
#endif
}
#define dump_header(_a) _dump_header(_a, __func__, __LINE__) #define dump_header(_a) _dump_header(_a, __func__, __LINE__)
static void _dump_header(const struct os_area_header *h, const char *func, static void _dump_header(const struct os_area_header *h, const char *func,
int line) int line)
{ {
char str[sizeof(h->magic_num) + 1];
dump_field(str, h->magic_num, sizeof(h->magic_num));
pr_debug("%s:%d: h.magic_num: '%s'\n", func, line, pr_debug("%s:%d: h.magic_num: '%s'\n", func, line,
h->magic_num); str);
pr_debug("%s:%d: h.hdr_version: %u\n", func, line, pr_debug("%s:%d: h.hdr_version: %u\n", func, line,
h->hdr_version); h->hdr_version);
pr_debug("%s:%d: h.db_area_offset: %u\n", func, line, pr_debug("%s:%d: h.db_area_offset: %u\n", func, line,
@ -311,7 +326,8 @@ static void _dump_params(const struct os_area_params *p, const char *func,
static int verify_header(const struct os_area_header *header) static int verify_header(const struct os_area_header *header)
{ {
if (memcmp(header->magic_num, "cell_ext_os_area", 16)) { if (memcmp(header->magic_num, OS_AREA_HEADER_MAGIC_NUM,
sizeof(header->magic_num))) {
pr_debug("%s:%d magic_num failed\n", __func__, __LINE__); pr_debug("%s:%d magic_num failed\n", __func__, __LINE__);
return -1; return -1;
} }
@ -331,7 +347,8 @@ static int verify_header(const struct os_area_header *header)
static int db_verify(const struct os_area_db *db) static int db_verify(const struct os_area_db *db)
{ {
if (db->magic_num != OS_AREA_DB_MAGIC_NUM) { if (memcmp(db->magic_num, OS_AREA_DB_MAGIC_NUM,
sizeof(db->magic_num))) {
pr_debug("%s:%d magic_num failed\n", __func__, __LINE__); pr_debug("%s:%d magic_num failed\n", __func__, __LINE__);
return -1; return -1;
} }
@ -484,8 +501,11 @@ static int db_get_rtc_diff(const struct os_area_db *db, int64_t *rtc_diff)
static void _dump_db(const struct os_area_db *db, const char *func, static void _dump_db(const struct os_area_db *db, const char *func,
int line) int line)
{ {
char str[sizeof(db->magic_num) + 1];
dump_field(str, db->magic_num, sizeof(db->magic_num));
pr_debug("%s:%d: db.magic_num: '%s'\n", func, line, pr_debug("%s:%d: db.magic_num: '%s'\n", func, line,
(const char*)&db->magic_num); str);
pr_debug("%s:%d: db.version: %u\n", func, line, pr_debug("%s:%d: db.version: %u\n", func, line,
db->version); db->version);
pr_debug("%s:%d: db.index_64: %u\n", func, line, pr_debug("%s:%d: db.index_64: %u\n", func, line,
@ -516,7 +536,7 @@ static void os_area_db_init(struct os_area_db *db)
memset(db, 0, sizeof(struct os_area_db)); memset(db, 0, sizeof(struct os_area_db));
db->magic_num = OS_AREA_DB_MAGIC_NUM; memcpy(db->magic_num, OS_AREA_DB_MAGIC_NUM, sizeof(db->magic_num));
db->version = 1; db->version = 1;
db->index_64 = HEADER_SIZE; db->index_64 = HEADER_SIZE;
db->count_64 = VALUES_64_COUNT; db->count_64 = VALUES_64_COUNT;

Просмотреть файл

@ -29,6 +29,7 @@
#include <asm/vdso_datapage.h> #include <asm/vdso_datapage.h>
#include <asm/pSeries_reconfig.h> #include <asm/pSeries_reconfig.h>
#include "xics.h" #include "xics.h"
#include "plpar_wrappers.h"
/* This version can't take the spinlock, because it never returns */ /* This version can't take the spinlock, because it never returns */
static struct rtas_args rtas_stop_self_args = { static struct rtas_args rtas_stop_self_args = {
@ -58,6 +59,7 @@ static void pseries_mach_cpu_die(void)
local_irq_disable(); local_irq_disable();
idle_task_exit(); idle_task_exit();
xics_teardown_cpu(0); xics_teardown_cpu(0);
unregister_slb_shadow(hard_smp_processor_id(), __pa(get_slb_shadow()));
rtas_stop_self(); rtas_stop_self();
/* Should never get here... */ /* Should never get here... */
BUG(); BUG();

Просмотреть файл

@ -5,7 +5,7 @@
* Based upon code written by Ross Biro, Linus Torvalds, Bob Manson, * Based upon code written by Ross Biro, Linus Torvalds, Bob Manson,
* and David Mosberger. * and David Mosberger.
* *
* Added Linux support -miguel (weird, eh?, the orignal code was meant * Added Linux support -miguel (weird, eh?, the original code was meant
* to emulate SunOS). * to emulate SunOS).
*/ */

Просмотреть файл

@ -436,7 +436,14 @@ void __init time_init(void)
static inline unsigned long do_gettimeoffset(void) static inline unsigned long do_gettimeoffset(void)
{ {
return (*master_l10_counter >> 10) & 0x1fffff; unsigned long val = *master_l10_counter;
unsigned long usec = (val >> 10) & 0x1fffff;
/* Limit hit? */
if (val & 0x80000000)
usec += 1000000 / HZ;
return usec;
} }
/* Ok, my cute asm atomicity trick doesn't work anymore. /* Ok, my cute asm atomicity trick doesn't work anymore.

Просмотреть файл

@ -1,6 +1,6 @@
/* arch/sparc64/kernel/ktlb.S: Kernel mapping TLB miss handling. /* arch/sparc64/kernel/ktlb.S: Kernel mapping TLB miss handling.
* *
* Copyright (C) 1995, 1997, 2005 David S. Miller <davem@davemloft.net> * Copyright (C) 1995, 1997, 2005, 2008 David S. Miller <davem@davemloft.net>
* Copyright (C) 1996 Eddie C. Dost (ecd@brainaid.de) * Copyright (C) 1996 Eddie C. Dost (ecd@brainaid.de)
* Copyright (C) 1996 Miguel de Icaza (miguel@nuclecu.unam.mx) * Copyright (C) 1996 Miguel de Icaza (miguel@nuclecu.unam.mx)
* Copyright (C) 1996,98,99 Jakub Jelinek (jj@sunsite.mff.cuni.cz) * Copyright (C) 1996,98,99 Jakub Jelinek (jj@sunsite.mff.cuni.cz)
@ -226,6 +226,7 @@ kvmap_dtlb_load:
ba,pt %xcc, sun4v_dtlb_load ba,pt %xcc, sun4v_dtlb_load
mov %g5, %g3 mov %g5, %g3
#ifdef CONFIG_SPARSEMEM_VMEMMAP
kvmap_vmemmap: kvmap_vmemmap:
sub %g4, %g5, %g5 sub %g4, %g5, %g5
srlx %g5, 22, %g5 srlx %g5, 22, %g5
@ -234,6 +235,7 @@ kvmap_vmemmap:
or %g1, %lo(vmemmap_table), %g1 or %g1, %lo(vmemmap_table), %g1
ba,pt %xcc, kvmap_dtlb_load ba,pt %xcc, kvmap_dtlb_load
ldx [%g1 + %g5], %g5 ldx [%g1 + %g5], %g5
#endif
kvmap_dtlb_nonlinear: kvmap_dtlb_nonlinear:
/* Catch kernel NULL pointer derefs. */ /* Catch kernel NULL pointer derefs. */
@ -242,12 +244,14 @@ kvmap_dtlb_nonlinear:
bleu,pn %xcc, kvmap_dtlb_longpath bleu,pn %xcc, kvmap_dtlb_longpath
nop nop
#ifdef CONFIG_SPARSEMEM_VMEMMAP
/* Do not use the TSB for vmemmap. */ /* Do not use the TSB for vmemmap. */
mov (VMEMMAP_BASE >> 24), %g5 mov (VMEMMAP_BASE >> 24), %g5
sllx %g5, 24, %g5 sllx %g5, 24, %g5
cmp %g4,%g5 cmp %g4,%g5
bgeu,pn %xcc, kvmap_vmemmap bgeu,pn %xcc, kvmap_vmemmap
nop nop
#endif
KERN_TSB_LOOKUP_TL1(%g4, %g6, %g5, %g1, %g2, %g3, kvmap_dtlb_load) KERN_TSB_LOOKUP_TL1(%g4, %g6, %g5, %g1, %g2, %g3, kvmap_dtlb_load)

Просмотреть файл

@ -1275,4 +1275,20 @@ int pci_dma_supported(struct pci_dev *pdev, u64 device_mask)
return (device_mask & dma_addr_mask) == dma_addr_mask; return (device_mask & dma_addr_mask) == dma_addr_mask;
} }
void pci_resource_to_user(const struct pci_dev *pdev, int bar,
const struct resource *rp, resource_size_t *start,
resource_size_t *end)
{
struct pci_pbm_info *pbm = pdev->dev.archdata.host_controller;
unsigned long offset;
if (rp->flags & IORESOURCE_IO)
offset = pbm->io_space.start;
else
offset = pbm->mem_space.start;
*start = rp->start - offset;
*end = rp->end - offset;
}
#endif /* !(CONFIG_PCI) */ #endif /* !(CONFIG_PCI) */

Просмотреть файл

@ -850,7 +850,7 @@ static int pbm_routes_this_ino(struct pci_pbm_info *pbm, u32 ino)
/* How the Tomatillo IRQs are routed around is pure guesswork here. /* How the Tomatillo IRQs are routed around is pure guesswork here.
* *
* All the Tomatillo devices I see in prtconf dumps seem to have only * All the Tomatillo devices I see in prtconf dumps seem to have only
* a single PCI bus unit attached to it. It would seem they are seperate * a single PCI bus unit attached to it. It would seem they are separate
* devices because their PortID (ie. JBUS ID) values are all different * devices because their PortID (ie. JBUS ID) values are all different
* and thus the registers are mapped to totally different locations. * and thus the registers are mapped to totally different locations.
* *

Просмотреть файл

@ -215,6 +215,7 @@ sun4v_itlb_error:
1: ba,pt %xcc, etrap 1: ba,pt %xcc, etrap
2: or %g7, %lo(2b), %g7 2: or %g7, %lo(2b), %g7
mov %l4, %o1
call sun4v_itlb_error_report call sun4v_itlb_error_report
add %sp, PTREGS_OFF, %o0 add %sp, PTREGS_OFF, %o0
@ -241,6 +242,7 @@ sun4v_dtlb_error:
1: ba,pt %xcc, etrap 1: ba,pt %xcc, etrap
2: or %g7, %lo(2b), %g7 2: or %g7, %lo(2b), %g7
mov %l4, %o1
call sun4v_dtlb_error_report call sun4v_dtlb_error_report
add %sp, PTREGS_OFF, %o0 add %sp, PTREGS_OFF, %o0

Просмотреть файл

@ -1950,6 +1950,8 @@ void sun4v_itlb_error_report(struct pt_regs *regs, int tl)
printk(KERN_EMERG "SUN4V-ITLB: Error at TPC[%lx], tl %d\n", printk(KERN_EMERG "SUN4V-ITLB: Error at TPC[%lx], tl %d\n",
regs->tpc, tl); regs->tpc, tl);
print_symbol(KERN_EMERG "SUN4V-ITLB: TPC<%s>\n", regs->tpc); print_symbol(KERN_EMERG "SUN4V-ITLB: TPC<%s>\n", regs->tpc);
printk(KERN_EMERG "SUN4V-ITLB: O7[%lx]\n", regs->u_regs[UREG_I7]);
print_symbol(KERN_EMERG "SUN4V-ITLB: O7<%s>\n", regs->u_regs[UREG_I7]);
printk(KERN_EMERG "SUN4V-ITLB: vaddr[%lx] ctx[%lx] " printk(KERN_EMERG "SUN4V-ITLB: vaddr[%lx] ctx[%lx] "
"pte[%lx] error[%lx]\n", "pte[%lx] error[%lx]\n",
sun4v_err_itlb_vaddr, sun4v_err_itlb_ctx, sun4v_err_itlb_vaddr, sun4v_err_itlb_ctx,
@ -1971,6 +1973,8 @@ void sun4v_dtlb_error_report(struct pt_regs *regs, int tl)
printk(KERN_EMERG "SUN4V-DTLB: Error at TPC[%lx], tl %d\n", printk(KERN_EMERG "SUN4V-DTLB: Error at TPC[%lx], tl %d\n",
regs->tpc, tl); regs->tpc, tl);
print_symbol(KERN_EMERG "SUN4V-DTLB: TPC<%s>\n", regs->tpc); print_symbol(KERN_EMERG "SUN4V-DTLB: TPC<%s>\n", regs->tpc);
printk(KERN_EMERG "SUN4V-DTLB: O7[%lx]\n", regs->u_regs[UREG_I7]);
print_symbol(KERN_EMERG "SUN4V-DTLB: O7<%s>\n", regs->u_regs[UREG_I7]);
printk(KERN_EMERG "SUN4V-DTLB: vaddr[%lx] ctx[%lx] " printk(KERN_EMERG "SUN4V-DTLB: vaddr[%lx] ctx[%lx] "
"pte[%lx] error[%lx]\n", "pte[%lx] error[%lx]\n",
sun4v_err_dtlb_vaddr, sun4v_err_dtlb_ctx, sun4v_err_dtlb_vaddr, sun4v_err_dtlb_ctx,

Просмотреть файл

@ -79,14 +79,14 @@ int start_watchdog(int *in_fd_ret, int *out_fd_ret, char *sock)
n = read(in_fds[0], &c, sizeof(c)); n = read(in_fds[0], &c, sizeof(c));
if (n == 0) { if (n == 0) {
printk("harddog_open - EOF on watchdog pipe\n"); printk("harddog_open - EOF on watchdog pipe\n");
helper_wait(pid); helper_wait(pid, 1, NULL);
err = -EIO; err = -EIO;
goto out_close_out; goto out_close_out;
} }
else if (n < 0) { else if (n < 0) {
printk("harddog_open - read of watchdog pipe failed, " printk("harddog_open - read of watchdog pipe failed, "
"err = %d\n", errno); "err = %d\n", errno);
helper_wait(pid); helper_wait(pid, 1, NULL);
err = n; err = n;
goto out_close_out; goto out_close_out;
} }

Просмотреть файл

@ -2256,14 +2256,12 @@ static int __init apm_init(void)
apm_info.disabled = 1; apm_info.disabled = 1;
return -ENODEV; return -ENODEV;
} }
if (PM_IS_ACTIVE()) { if (pm_flags & PM_ACPI) {
printk(KERN_NOTICE "apm: overridden by ACPI.\n"); printk(KERN_NOTICE "apm: overridden by ACPI.\n");
apm_info.disabled = 1; apm_info.disabled = 1;
return -ENODEV; return -ENODEV;
} }
#ifdef CONFIG_PM_LEGACY pm_flags |= PM_APM;
pm_active = 1;
#endif
/* /*
* Set up a segment that references the real mode segment 0x40 * Set up a segment that references the real mode segment 0x40
@ -2366,9 +2364,7 @@ static void __exit apm_exit(void)
kthread_stop(kapmd_task); kthread_stop(kapmd_task);
kapmd_task = NULL; kapmd_task = NULL;
} }
#ifdef CONFIG_PM_LEGACY pm_flags &= ~PM_APM;
pm_active = 0;
#endif
} }
module_init(apm_init); module_init(apm_init);

Просмотреть файл

@ -196,7 +196,7 @@ default_entry:
/* Do an early initialization of the fixmap area */ /* Do an early initialization of the fixmap area */
movl $(swapper_pg_dir - __PAGE_OFFSET), %edx movl $(swapper_pg_dir - __PAGE_OFFSET), %edx
movl $(swapper_pg_pmd - __PAGE_OFFSET), %eax movl $(swapper_pg_pmd - __PAGE_OFFSET), %eax
addl $0x007, %eax /* 0x007 = PRESENT+RW+USER */ addl $0x67, %eax /* 0x67 == _PAGE_TABLE */
movl %eax, 4092(%edx) movl %eax, 4092(%edx)
xorl %ebx,%ebx /* This is the boot CPU (BSP) */ xorl %ebx,%ebx /* This is the boot CPU (BSP) */

Просмотреть файл

@ -657,7 +657,7 @@ irqreturn_t hpet_rtc_interrupt(int irq, void *dev_id)
hpet_pie_count = 0; hpet_pie_count = 0;
} }
if (hpet_rtc_flags & RTC_PIE && if (hpet_rtc_flags & RTC_AIE &&
(curr_time.tm_sec == hpet_alarm_time.tm_sec) && (curr_time.tm_sec == hpet_alarm_time.tm_sec) &&
(curr_time.tm_min == hpet_alarm_time.tm_min) && (curr_time.tm_min == hpet_alarm_time.tm_min) &&
(curr_time.tm_hour == hpet_alarm_time.tm_hour)) (curr_time.tm_hour == hpet_alarm_time.tm_hour))

Просмотреть файл

@ -2169,14 +2169,10 @@ static inline void __init check_timer(void)
{ {
int apic1, pin1, apic2, pin2; int apic1, pin1, apic2, pin2;
int vector; int vector;
unsigned int ver;
unsigned long flags; unsigned long flags;
local_irq_save(flags); local_irq_save(flags);
ver = apic_read(APIC_LVR);
ver = GET_APIC_VERSION(ver);
/* /*
* get/set the timer IRQ vector: * get/set the timer IRQ vector:
*/ */
@ -2189,15 +2185,11 @@ static inline void __init check_timer(void)
* mode for the 8259A whenever interrupts are routed * mode for the 8259A whenever interrupts are routed
* through I/O APICs. Also IRQ0 has to be enabled in * through I/O APICs. Also IRQ0 has to be enabled in
* the 8259A which implies the virtual wire has to be * the 8259A which implies the virtual wire has to be
* disabled in the local APIC. Finally timer interrupts * disabled in the local APIC.
* need to be acknowledged manually in the 8259A for
* timer_interrupt() and for the i82489DX when using
* the NMI watchdog.
*/ */
apic_write_around(APIC_LVT0, APIC_LVT_MASKED | APIC_DM_EXTINT); apic_write_around(APIC_LVT0, APIC_LVT_MASKED | APIC_DM_EXTINT);
init_8259A(1); init_8259A(1);
timer_ack = !cpu_has_tsc; timer_ack = 1;
timer_ack |= (nmi_watchdog == NMI_IO_APIC && !APIC_INTEGRATED(ver));
if (timer_over_8254 > 0) if (timer_over_8254 > 0)
enable_8259A_irq(0); enable_8259A_irq(0);

Просмотреть файл

@ -278,12 +278,12 @@ static int mfgpt_next_event(unsigned long delta, struct clock_event_device *evt)
static irqreturn_t mfgpt_tick(int irq, void *dev_id) static irqreturn_t mfgpt_tick(int irq, void *dev_id)
{ {
/* Turn off the clock (and clear the event) */
mfgpt_disable_timer(mfgpt_event_clock);
if (mfgpt_tick_mode == CLOCK_EVT_MODE_SHUTDOWN) if (mfgpt_tick_mode == CLOCK_EVT_MODE_SHUTDOWN)
return IRQ_HANDLED; return IRQ_HANDLED;
/* Turn off the clock */
mfgpt_disable_timer(mfgpt_event_clock);
/* Clear the counter */ /* Clear the counter */
geode_mfgpt_write(mfgpt_event_clock, MFGPT_REG_COUNTER, 0); geode_mfgpt_write(mfgpt_event_clock, MFGPT_REG_COUNTER, 0);
@ -319,10 +319,6 @@ static int __init mfgpt_timer_setup(void)
} }
mfgpt_event_clock = timer; mfgpt_event_clock = timer;
/* Set the clock scale and enable the event mode for CMP2 */
val = MFGPT_SCALE | (3 << 8);
geode_mfgpt_write(mfgpt_event_clock, MFGPT_REG_SETUP, val);
/* Set up the IRQ on the MFGPT side */ /* Set up the IRQ on the MFGPT side */
if (geode_mfgpt_setup_irq(mfgpt_event_clock, MFGPT_CMP2, irq)) { if (geode_mfgpt_setup_irq(mfgpt_event_clock, MFGPT_CMP2, irq)) {
@ -339,6 +335,11 @@ static int __init mfgpt_timer_setup(void)
goto err; goto err;
} }
/* Set the clock scale and enable the event mode for CMP2 */
val = MFGPT_SCALE | (3 << 8);
geode_mfgpt_write(mfgpt_event_clock, MFGPT_REG_SETUP, val);
/* Set up the clock event */ /* Set up the clock event */
mfgpt_clockevent.mult = div_sc(MFGPT_HZ, NSEC_PER_SEC, 32); mfgpt_clockevent.mult = div_sc(MFGPT_HZ, NSEC_PER_SEC, 32);
mfgpt_clockevent.min_delta_ns = clockevent_delta2ns(0xF, mfgpt_clockevent.min_delta_ns = clockevent_delta2ns(0xF,

Просмотреть файл

@ -25,7 +25,6 @@
#include <asm/smp.h> #include <asm/smp.h>
#include <asm/nmi.h> #include <asm/nmi.h>
#include <asm/timer.h>
#include "mach_traps.h" #include "mach_traps.h"
@ -84,7 +83,7 @@ static int __init check_nmi_watchdog(void)
prev_nmi_count = kmalloc(NR_CPUS * sizeof(int), GFP_KERNEL); prev_nmi_count = kmalloc(NR_CPUS * sizeof(int), GFP_KERNEL);
if (!prev_nmi_count) if (!prev_nmi_count)
goto error; return -1;
printk(KERN_INFO "Testing NMI watchdog ... "); printk(KERN_INFO "Testing NMI watchdog ... ");
@ -119,7 +118,7 @@ static int __init check_nmi_watchdog(void)
if (!atomic_read(&nmi_active)) { if (!atomic_read(&nmi_active)) {
kfree(prev_nmi_count); kfree(prev_nmi_count);
atomic_set(&nmi_active, -1); atomic_set(&nmi_active, -1);
goto error; return -1;
} }
printk("OK.\n"); printk("OK.\n");
@ -130,10 +129,6 @@ static int __init check_nmi_watchdog(void)
kfree(prev_nmi_count); kfree(prev_nmi_count);
return 0; return 0;
error:
timer_ack = !cpu_has_tsc;
return -1;
} }
/* This needs to happen later in boot so counters are working */ /* This needs to happen later in boot so counters are working */
late_initcall(check_nmi_watchdog); late_initcall(check_nmi_watchdog);

Просмотреть файл

@ -204,6 +204,10 @@ void cpu_idle(void)
} }
} }
static void do_nothing(void *unused)
{
}
void cpu_idle_wait(void) void cpu_idle_wait(void)
{ {
unsigned int cpu, this_cpu = get_cpu(); unsigned int cpu, this_cpu = get_cpu();
@ -228,6 +232,13 @@ void cpu_idle_wait(void)
cpu_clear(cpu, map); cpu_clear(cpu, map);
} }
cpus_and(map, map, cpu_online_map); cpus_and(map, map, cpu_online_map);
/*
* We waited 1 sec, if a CPU still did not call idle
* it may be because it is in idle and not waking up
* because it has nothing to do.
* Give all the remaining CPUS a kick.
*/
smp_call_function_mask(map, do_nothing, 0, 0);
} while (!cpus_empty(map)); } while (!cpus_empty(map));
set_cpus_allowed(current, tmp); set_cpus_allowed(current, tmp);

Просмотреть файл

@ -135,6 +135,10 @@ static void poll_idle (void)
cpu_relax(); cpu_relax();
} }
static void do_nothing(void *unused)
{
}
void cpu_idle_wait(void) void cpu_idle_wait(void)
{ {
unsigned int cpu, this_cpu = get_cpu(); unsigned int cpu, this_cpu = get_cpu();
@ -160,6 +164,13 @@ void cpu_idle_wait(void)
cpu_clear(cpu, map); cpu_clear(cpu, map);
} }
cpus_and(map, map, cpu_online_map); cpus_and(map, map, cpu_online_map);
/*
* We waited 1 sec, if a CPU still did not call idle
* it may be because it is in idle and not waking up
* because it has nothing to do.
* Give all the remaining CPUS a kick.
*/
smp_call_function_mask(map, do_nothing, 0, 0);
} while (!cpus_empty(map)); } while (!cpus_empty(map));
set_cpus_allowed(current, tmp); set_cpus_allowed(current, tmp);

Просмотреть файл

@ -141,8 +141,8 @@ static void __cpuinit smp_store_cpu_info(int id)
struct cpuinfo_x86 *c = &cpu_data(id); struct cpuinfo_x86 *c = &cpu_data(id);
*c = boot_cpu_data; *c = boot_cpu_data;
identify_cpu(c);
c->cpu_index = id; c->cpu_index = id;
identify_cpu(c);
print_cpu_info(c); print_cpu_info(c);
} }
@ -526,7 +526,7 @@ struct create_idle {
int cpu; int cpu;
}; };
void do_fork_idle(struct work_struct *work) static void __cpuinit do_fork_idle(struct work_struct *work)
{ {
struct create_idle *c_idle = struct create_idle *c_idle =
container_of(work, struct create_idle, work); container_of(work, struct create_idle, work);

Просмотреть файл

@ -541,6 +541,7 @@ fastcall void do_##name(struct pt_regs * regs, long error_code) \
info.si_errno = 0; \ info.si_errno = 0; \
info.si_code = sicode; \ info.si_code = sicode; \
info.si_addr = (void __user *)siaddr; \ info.si_addr = (void __user *)siaddr; \
trace_hardirqs_fixup(); \
if (notify_die(DIE_TRAP, str, regs, error_code, trapnr, signr) \ if (notify_die(DIE_TRAP, str, regs, error_code, trapnr, signr) \
== NOTIFY_STOP) \ == NOTIFY_STOP) \
return; \ return; \

Просмотреть файл

@ -635,6 +635,7 @@ asmlinkage void do_##name(struct pt_regs * regs, long error_code) \
info.si_errno = 0; \ info.si_errno = 0; \
info.si_code = sicode; \ info.si_code = sicode; \
info.si_addr = (void __user *)siaddr; \ info.si_addr = (void __user *)siaddr; \
trace_hardirqs_fixup(); \
if (notify_die(DIE_TRAP, str, regs, error_code, trapnr, signr) \ if (notify_die(DIE_TRAP, str, regs, error_code, trapnr, signr) \
== NOTIFY_STOP) \ == NOTIFY_STOP) \
return; \ return; \

Просмотреть файл

@ -321,8 +321,13 @@ extern void set_highmem_pages_init(int);
static void __init set_highmem_pages_init(int bad_ppro) static void __init set_highmem_pages_init(int bad_ppro)
{ {
int pfn; int pfn;
for (pfn = highstart_pfn; pfn < highend_pfn; pfn++) for (pfn = highstart_pfn; pfn < highend_pfn; pfn++) {
add_one_highpage_init(pfn_to_page(pfn), pfn, bad_ppro); /*
* Holes under sparsemem might not have no mem_map[]:
*/
if (pfn_valid(pfn))
add_one_highpage_init(pfn_to_page(pfn), pfn, bad_ppro);
}
totalram_pages += totalhigh_pages; totalram_pages += totalhigh_pages;
} }
#endif /* CONFIG_FLATMEM */ #endif /* CONFIG_FLATMEM */

Просмотреть файл

@ -380,7 +380,7 @@ static int __init ppro_init(char ** cpu_type)
if (cpu_model == 14) if (cpu_model == 14)
*cpu_type = "i386/core"; *cpu_type = "i386/core";
else if (cpu_model == 15) else if (cpu_model == 15 || cpu_model == 23)
*cpu_type = "i386/core_2"; *cpu_type = "i386/core_2";
else if (cpu_model > 0xd) else if (cpu_model > 0xd)
return 0; return 0;

Просмотреть файл

@ -25,7 +25,6 @@
#include <linux/time.h> #include <linux/time.h>
#include <asm/uaccess.h> #include <asm/uaccess.h>
static DEFINE_PER_CPU(unsigned long long, blk_trace_cpu_offset) = { 0, };
static unsigned int blktrace_seq __read_mostly = 1; static unsigned int blktrace_seq __read_mostly = 1;
/* /*
@ -41,7 +40,7 @@ static void trace_note(struct blk_trace *bt, pid_t pid, int action,
const int cpu = smp_processor_id(); const int cpu = smp_processor_id();
t->magic = BLK_IO_TRACE_MAGIC | BLK_IO_TRACE_VERSION; t->magic = BLK_IO_TRACE_MAGIC | BLK_IO_TRACE_VERSION;
t->time = cpu_clock(cpu) - per_cpu(blk_trace_cpu_offset, cpu); t->time = ktime_to_ns(ktime_get());
t->device = bt->dev; t->device = bt->dev;
t->action = action; t->action = action;
t->pid = pid; t->pid = pid;
@ -159,7 +158,7 @@ void __blk_add_trace(struct blk_trace *bt, sector_t sector, int bytes,
t->magic = BLK_IO_TRACE_MAGIC | BLK_IO_TRACE_VERSION; t->magic = BLK_IO_TRACE_MAGIC | BLK_IO_TRACE_VERSION;
t->sequence = ++(*sequence); t->sequence = ++(*sequence);
t->time = cpu_clock(cpu) - per_cpu(blk_trace_cpu_offset, cpu); t->time = ktime_to_ns(ktime_get());
t->sector = sector; t->sector = sector;
t->bytes = bytes; t->bytes = bytes;
t->action = what; t->action = what;
@ -179,7 +178,7 @@ void __blk_add_trace(struct blk_trace *bt, sector_t sector, int bytes,
EXPORT_SYMBOL_GPL(__blk_add_trace); EXPORT_SYMBOL_GPL(__blk_add_trace);
static struct dentry *blk_tree_root; static struct dentry *blk_tree_root;
static struct mutex blk_tree_mutex; static DEFINE_MUTEX(blk_tree_mutex);
static unsigned int root_users; static unsigned int root_users;
static inline void blk_remove_root(void) static inline void blk_remove_root(void)
@ -505,77 +504,3 @@ void blk_trace_shutdown(struct request_queue *q)
blk_trace_remove(q); blk_trace_remove(q);
} }
} }
/*
* Average offset over two calls to cpu_clock() with a gettimeofday()
* in the middle
*/
static void blk_check_time(unsigned long long *t, int this_cpu)
{
unsigned long long a, b;
struct timeval tv;
a = cpu_clock(this_cpu);
do_gettimeofday(&tv);
b = cpu_clock(this_cpu);
*t = tv.tv_sec * 1000000000 + tv.tv_usec * 1000;
*t -= (a + b) / 2;
}
/*
* calibrate our inter-CPU timings
*/
static void blk_trace_check_cpu_time(void *data)
{
unsigned long long *t;
int this_cpu = get_cpu();
t = &per_cpu(blk_trace_cpu_offset, this_cpu);
/*
* Just call it twice, hopefully the second call will be cache hot
* and a little more precise
*/
blk_check_time(t, this_cpu);
blk_check_time(t, this_cpu);
put_cpu();
}
static void blk_trace_set_ht_offsets(void)
{
#if defined(CONFIG_SCHED_SMT)
int cpu, i;
/*
* now make sure HT siblings have the same time offset
*/
preempt_disable();
for_each_online_cpu(cpu) {
unsigned long long *cpu_off, *sibling_off;
for_each_cpu_mask(i, per_cpu(cpu_sibling_map, cpu)) {
if (i == cpu)
continue;
cpu_off = &per_cpu(blk_trace_cpu_offset, cpu);
sibling_off = &per_cpu(blk_trace_cpu_offset, i);
*sibling_off = *cpu_off;
}
}
preempt_enable();
#endif
}
static __init int blk_trace_init(void)
{
mutex_init(&blk_tree_mutex);
on_each_cpu(blk_trace_check_cpu_time, NULL, 1, 1);
blk_trace_set_ht_offsets();
return 0;
}
module_init(blk_trace_init);

Просмотреть файл

@ -82,6 +82,12 @@ config ACPI_PROCFS_POWER
and functions, which do not yet exist in /sys and functions, which do not yet exist in /sys
Say N to delete power /proc/acpi/ folders that have moved to /sys/ Say N to delete power /proc/acpi/ folders that have moved to /sys/
config ACPI_SYSFS_POWER
bool "Future power /sys interface"
select POWER_SUPPLY
default y
---help---
Say N to disable power /sys interface
config ACPI_PROC_EVENT config ACPI_PROC_EVENT
bool "Deprecated /proc/acpi/event support" bool "Deprecated /proc/acpi/event support"
depends on PROC_FS depends on PROC_FS
@ -103,7 +109,6 @@ config ACPI_PROC_EVENT
config ACPI_AC config ACPI_AC
tristate "AC Adapter" tristate "AC Adapter"
depends on X86 depends on X86
select POWER_SUPPLY
default y default y
help help
This driver adds support for the AC Adapter object, which indicates This driver adds support for the AC Adapter object, which indicates
@ -113,7 +118,6 @@ config ACPI_AC
config ACPI_BATTERY config ACPI_BATTERY
tristate "Battery" tristate "Battery"
depends on X86 depends on X86
select POWER_SUPPLY
default y default y
help help
This driver adds support for battery information through This driver adds support for battery information through
@ -368,7 +372,6 @@ config ACPI_HOTPLUG_MEMORY
config ACPI_SBS config ACPI_SBS
tristate "Smart Battery System" tristate "Smart Battery System"
depends on X86 depends on X86
select POWER_SUPPLY
help help
This driver adds support for the Smart Battery System, another This driver adds support for the Smart Battery System, another
type of access to battery information, found on some laptops. type of access to battery information, found on some laptops.

Просмотреть файл

@ -31,7 +31,9 @@
#include <linux/proc_fs.h> #include <linux/proc_fs.h>
#include <linux/seq_file.h> #include <linux/seq_file.h>
#endif #endif
#ifdef CONFIG_ACPI_SYSFS_POWER
#include <linux/power_supply.h> #include <linux/power_supply.h>
#endif
#include <acpi/acpi_bus.h> #include <acpi/acpi_bus.h>
#include <acpi/acpi_drivers.h> #include <acpi/acpi_drivers.h>
@ -79,7 +81,9 @@ static struct acpi_driver acpi_ac_driver = {
}; };
struct acpi_ac { struct acpi_ac {
#ifdef CONFIG_ACPI_SYSFS_POWER
struct power_supply charger; struct power_supply charger;
#endif
struct acpi_device * device; struct acpi_device * device;
unsigned long state; unsigned long state;
}; };
@ -94,7 +98,7 @@ static const struct file_operations acpi_ac_fops = {
.release = single_release, .release = single_release,
}; };
#endif #endif
#ifdef CONFIG_ACPI_SYSFS_POWER
static int get_ac_property(struct power_supply *psy, static int get_ac_property(struct power_supply *psy,
enum power_supply_property psp, enum power_supply_property psp,
union power_supply_propval *val) union power_supply_propval *val)
@ -113,7 +117,7 @@ static int get_ac_property(struct power_supply *psy,
static enum power_supply_property ac_props[] = { static enum power_supply_property ac_props[] = {
POWER_SUPPLY_PROP_ONLINE, POWER_SUPPLY_PROP_ONLINE,
}; };
#endif
/* -------------------------------------------------------------------------- /* --------------------------------------------------------------------------
AC Adapter Management AC Adapter Management
-------------------------------------------------------------------------- */ -------------------------------------------------------------------------- */
@ -241,7 +245,9 @@ static void acpi_ac_notify(acpi_handle handle, u32 event, void *data)
acpi_bus_generate_netlink_event(device->pnp.device_class, acpi_bus_generate_netlink_event(device->pnp.device_class,
device->dev.bus_id, event, device->dev.bus_id, event,
(u32) ac->state); (u32) ac->state);
#ifdef CONFIG_ACPI_SYSFS_POWER
kobject_uevent(&ac->charger.dev->kobj, KOBJ_CHANGE); kobject_uevent(&ac->charger.dev->kobj, KOBJ_CHANGE);
#endif
break; break;
default: default:
ACPI_DEBUG_PRINT((ACPI_DB_INFO, ACPI_DEBUG_PRINT((ACPI_DB_INFO,
@ -280,12 +286,14 @@ static int acpi_ac_add(struct acpi_device *device)
#endif #endif
if (result) if (result)
goto end; goto end;
#ifdef CONFIG_ACPI_SYSFS_POWER
ac->charger.name = acpi_device_bid(device); ac->charger.name = acpi_device_bid(device);
ac->charger.type = POWER_SUPPLY_TYPE_MAINS; ac->charger.type = POWER_SUPPLY_TYPE_MAINS;
ac->charger.properties = ac_props; ac->charger.properties = ac_props;
ac->charger.num_properties = ARRAY_SIZE(ac_props); ac->charger.num_properties = ARRAY_SIZE(ac_props);
ac->charger.get_property = get_ac_property; ac->charger.get_property = get_ac_property;
power_supply_register(&ac->device->dev, &ac->charger); power_supply_register(&ac->device->dev, &ac->charger);
#endif
status = acpi_install_notify_handler(device->handle, status = acpi_install_notify_handler(device->handle,
ACPI_ALL_NOTIFY, acpi_ac_notify, ACPI_ALL_NOTIFY, acpi_ac_notify,
ac); ac);
@ -319,8 +327,10 @@ static int acpi_ac_resume(struct acpi_device *device)
old_state = ac->state; old_state = ac->state;
if (acpi_ac_get_state(ac)) if (acpi_ac_get_state(ac))
return 0; return 0;
#ifdef CONFIG_ACPI_SYSFS_POWER
if (old_state != ac->state) if (old_state != ac->state)
kobject_uevent(&ac->charger.dev->kobj, KOBJ_CHANGE); kobject_uevent(&ac->charger.dev->kobj, KOBJ_CHANGE);
#endif
return 0; return 0;
} }
@ -337,8 +347,10 @@ static int acpi_ac_remove(struct acpi_device *device, int type)
status = acpi_remove_notify_handler(device->handle, status = acpi_remove_notify_handler(device->handle,
ACPI_ALL_NOTIFY, acpi_ac_notify); ACPI_ALL_NOTIFY, acpi_ac_notify);
#ifdef CONFIG_ACPI_SYSFS_POWER
if (ac->charger.dev) if (ac->charger.dev)
power_supply_unregister(&ac->charger); power_supply_unregister(&ac->charger);
#endif
#ifdef CONFIG_ACPI_PROCFS_POWER #ifdef CONFIG_ACPI_PROCFS_POWER
acpi_ac_remove_fs(device); acpi_ac_remove_fs(device);
#endif #endif

Просмотреть файл

@ -40,7 +40,9 @@
#include <acpi/acpi_bus.h> #include <acpi/acpi_bus.h>
#include <acpi/acpi_drivers.h> #include <acpi/acpi_drivers.h>
#ifdef CONFIG_ACPI_SYSFS_POWER
#include <linux/power_supply.h> #include <linux/power_supply.h>
#endif
#define ACPI_BATTERY_VALUE_UNKNOWN 0xFFFFFFFF #define ACPI_BATTERY_VALUE_UNKNOWN 0xFFFFFFFF
@ -86,7 +88,9 @@ MODULE_DEVICE_TABLE(acpi, battery_device_ids);
struct acpi_battery { struct acpi_battery {
struct mutex lock; struct mutex lock;
#ifdef CONFIG_ACPI_SYSFS_POWER
struct power_supply bat; struct power_supply bat;
#endif
struct acpi_device *device; struct acpi_device *device;
unsigned long update_time; unsigned long update_time;
int current_now; int current_now;
@ -117,6 +121,7 @@ inline int acpi_battery_present(struct acpi_battery *battery)
return battery->device->status.battery_present; return battery->device->status.battery_present;
} }
#ifdef CONFIG_ACPI_SYSFS_POWER
static int acpi_battery_technology(struct acpi_battery *battery) static int acpi_battery_technology(struct acpi_battery *battery)
{ {
if (!strcasecmp("NiCd", battery->type)) if (!strcasecmp("NiCd", battery->type))
@ -222,6 +227,7 @@ static enum power_supply_property energy_battery_props[] = {
POWER_SUPPLY_PROP_MODEL_NAME, POWER_SUPPLY_PROP_MODEL_NAME,
POWER_SUPPLY_PROP_MANUFACTURER, POWER_SUPPLY_PROP_MANUFACTURER,
}; };
#endif
#ifdef CONFIG_ACPI_PROCFS_POWER #ifdef CONFIG_ACPI_PROCFS_POWER
inline char *acpi_battery_units(struct acpi_battery *battery) inline char *acpi_battery_units(struct acpi_battery *battery)
@ -398,6 +404,7 @@ static int acpi_battery_init_alarm(struct acpi_battery *battery)
return acpi_battery_set_alarm(battery); return acpi_battery_set_alarm(battery);
} }
#ifdef CONFIG_ACPI_SYSFS_POWER
static ssize_t acpi_battery_alarm_show(struct device *dev, static ssize_t acpi_battery_alarm_show(struct device *dev,
struct device_attribute *attr, struct device_attribute *attr,
char *buf) char *buf)
@ -429,11 +436,6 @@ static int sysfs_add_battery(struct acpi_battery *battery)
{ {
int result; int result;
battery->update_time = 0;
result = acpi_battery_get_info(battery);
acpi_battery_init_alarm(battery);
if (result)
return result;
if (battery->power_unit) { if (battery->power_unit) {
battery->bat.properties = charge_battery_props; battery->bat.properties = charge_battery_props;
battery->bat.num_properties = battery->bat.num_properties =
@ -462,18 +464,31 @@ static void sysfs_remove_battery(struct acpi_battery *battery)
power_supply_unregister(&battery->bat); power_supply_unregister(&battery->bat);
battery->bat.dev = NULL; battery->bat.dev = NULL;
} }
#endif
static int acpi_battery_update(struct acpi_battery *battery) static int acpi_battery_update(struct acpi_battery *battery)
{ {
int result = acpi_battery_get_status(battery); int result;
result = acpi_battery_get_status(battery);
if (result) if (result)
return result; return result;
#ifdef CONFIG_ACPI_SYSFS_POWER
if (!acpi_battery_present(battery)) { if (!acpi_battery_present(battery)) {
sysfs_remove_battery(battery); sysfs_remove_battery(battery);
battery->update_time = 0;
return 0; return 0;
} }
#endif
if (!battery->update_time) {
result = acpi_battery_get_info(battery);
if (result)
return result;
acpi_battery_init_alarm(battery);
}
#ifdef CONFIG_ACPI_SYSFS_POWER
if (!battery->bat.dev) if (!battery->bat.dev)
sysfs_add_battery(battery); sysfs_add_battery(battery);
#endif
return acpi_battery_get_state(battery); return acpi_battery_get_state(battery);
} }
@ -767,9 +782,11 @@ static void acpi_battery_notify(acpi_handle handle, u32 event, void *data)
acpi_bus_generate_netlink_event(device->pnp.device_class, acpi_bus_generate_netlink_event(device->pnp.device_class,
device->dev.bus_id, event, device->dev.bus_id, event,
acpi_battery_present(battery)); acpi_battery_present(battery));
#ifdef CONFIG_ACPI_SYSFS_POWER
/* acpi_batter_update could remove power_supply object */ /* acpi_batter_update could remove power_supply object */
if (battery->bat.dev) if (battery->bat.dev)
kobject_uevent(&battery->bat.dev->kobj, KOBJ_CHANGE); kobject_uevent(&battery->bat.dev->kobj, KOBJ_CHANGE);
#endif
} }
static int acpi_battery_add(struct acpi_device *device) static int acpi_battery_add(struct acpi_device *device)
@ -828,7 +845,9 @@ static int acpi_battery_remove(struct acpi_device *device, int type)
#ifdef CONFIG_ACPI_PROCFS_POWER #ifdef CONFIG_ACPI_PROCFS_POWER
acpi_battery_remove_fs(device); acpi_battery_remove_fs(device);
#endif #endif
#ifdef CONFIG_ACPI_SYSFS_POWER
sysfs_remove_battery(battery); sysfs_remove_battery(battery);
#endif
mutex_destroy(&battery->lock); mutex_destroy(&battery->lock);
kfree(battery); kfree(battery);
return 0; return 0;

Просмотреть файл

@ -29,7 +29,6 @@
#include <linux/list.h> #include <linux/list.h>
#include <linux/sched.h> #include <linux/sched.h>
#include <linux/pm.h> #include <linux/pm.h>
#include <linux/pm_legacy.h>
#include <linux/device.h> #include <linux/device.h>
#include <linux/proc_fs.h> #include <linux/proc_fs.h>
#ifdef CONFIG_X86 #ifdef CONFIG_X86
@ -764,16 +763,14 @@ static int __init acpi_init(void)
result = acpi_bus_init(); result = acpi_bus_init();
if (!result) { if (!result) {
#ifdef CONFIG_PM_LEGACY if (!(pm_flags & PM_APM))
if (!PM_IS_ACTIVE()) pm_flags |= PM_ACPI;
pm_active = 1;
else { else {
printk(KERN_INFO PREFIX printk(KERN_INFO PREFIX
"APM is already active, exiting\n"); "APM is already active, exiting\n");
disable_acpi(); disable_acpi();
result = -ENODEV; result = -ENODEV;
} }
#endif
} else } else
disable_acpi(); disable_acpi();

Просмотреть файл

@ -892,6 +892,17 @@ static int acpi_ec_stop(struct acpi_device *device, int type)
return 0; return 0;
} }
int __init acpi_boot_ec_enable(void)
{
if (!boot_ec || boot_ec->handlers_installed)
return 0;
if (!ec_install_handlers(boot_ec)) {
first_ec = boot_ec;
return 0;
}
return -EFAULT;
}
int __init acpi_ec_ecdt_probe(void) int __init acpi_ec_ecdt_probe(void)
{ {
int ret; int ret;
@ -924,9 +935,10 @@ int __init acpi_ec_ecdt_probe(void)
goto error; goto error;
/* We really need to limit this workaround, the only ASUS, /* We really need to limit this workaround, the only ASUS,
* which needs it, has fake EC._INI method, so use it as flag. * which needs it, has fake EC._INI method, so use it as flag.
* Keep boot_ec struct as it will be needed soon.
*/ */
if (ACPI_FAILURE(acpi_get_handle(boot_ec->handle, "_INI", &x))) if (ACPI_FAILURE(acpi_get_handle(boot_ec->handle, "_INI", &x)))
goto error; return -ENODEV;
} }
ret = ec_install_handlers(boot_ec); ret = ec_install_handlers(boot_ec);

Просмотреть файл

@ -344,7 +344,7 @@ acpi_ev_address_space_dispatch(union acpi_operand_object *region_obj,
* setup will potentially execute control methods * setup will potentially execute control methods
* (e.g., _REG method for this region) * (e.g., _REG method for this region)
*/ */
acpi_ex_relinquish_interpreter(); acpi_ex_exit_interpreter();
status = region_setup(region_obj, ACPI_REGION_ACTIVATE, status = region_setup(region_obj, ACPI_REGION_ACTIVATE,
handler_desc->address_space.context, handler_desc->address_space.context,
@ -352,7 +352,7 @@ acpi_ev_address_space_dispatch(union acpi_operand_object *region_obj,
/* Re-enter the interpreter */ /* Re-enter the interpreter */
acpi_ex_reacquire_interpreter(); acpi_ex_enter_interpreter();
/* Check for failure of the Region Setup */ /* Check for failure of the Region Setup */
@ -405,7 +405,7 @@ acpi_ev_address_space_dispatch(union acpi_operand_object *region_obj,
* exit the interpreter because the handler *might* block -- we don't * exit the interpreter because the handler *might* block -- we don't
* know what it will do, so we can't hold the lock on the intepreter. * know what it will do, so we can't hold the lock on the intepreter.
*/ */
acpi_ex_relinquish_interpreter(); acpi_ex_exit_interpreter();
} }
/* Call the handler */ /* Call the handler */
@ -426,7 +426,7 @@ acpi_ev_address_space_dispatch(union acpi_operand_object *region_obj,
* We just returned from a non-default handler, we must re-enter the * We just returned from a non-default handler, we must re-enter the
* interpreter * interpreter
*/ */
acpi_ex_reacquire_interpreter(); acpi_ex_enter_interpreter();
} }
return_ACPI_STATUS(status); return_ACPI_STATUS(status);

Просмотреть файл

@ -429,6 +429,15 @@ int acpi_pci_irq_enable(struct pci_dev *dev)
&polarity, &link, &polarity, &link,
acpi_pci_allocate_irq); acpi_pci_allocate_irq);
if (irq < 0) {
/*
* IDE legacy mode controller IRQs are magic. Why do compat
* extensions always make such a nasty mess.
*/
if (dev->class >> 8 == PCI_CLASS_STORAGE_IDE &&
(dev->class & 0x05) == 0)
return 0;
}
/* /*
* No IRQ known to the ACPI subsystem - maybe the BIOS / * No IRQ known to the ACPI subsystem - maybe the BIOS /
* driver reported one, then use it. Exit in any case. * driver reported one, then use it. Exit in any case.

Просмотреть файл

@ -76,7 +76,11 @@ static void (*pm_idle_save) (void) __read_mostly;
#define PM_TIMER_TICKS_TO_US(p) (((p) * 1000)/(PM_TIMER_FREQUENCY/1000)) #define PM_TIMER_TICKS_TO_US(p) (((p) * 1000)/(PM_TIMER_FREQUENCY/1000))
static unsigned int max_cstate __read_mostly = ACPI_PROCESSOR_MAX_POWER; static unsigned int max_cstate __read_mostly = ACPI_PROCESSOR_MAX_POWER;
#ifdef CONFIG_CPU_IDLE
module_param(max_cstate, uint, 0000); module_param(max_cstate, uint, 0000);
#else
module_param(max_cstate, uint, 0644);
#endif
static unsigned int nocst __read_mostly; static unsigned int nocst __read_mostly;
module_param(nocst, uint, 0000); module_param(nocst, uint, 0000);

Просмотреть файл

@ -40,7 +40,9 @@
#include <linux/jiffies.h> #include <linux/jiffies.h>
#include <linux/delay.h> #include <linux/delay.h>
#ifdef CONFIG_ACPI_SYSFS_POWER
#include <linux/power_supply.h> #include <linux/power_supply.h>
#endif
#include "sbshc.h" #include "sbshc.h"
@ -80,7 +82,9 @@ static const struct acpi_device_id sbs_device_ids[] = {
MODULE_DEVICE_TABLE(acpi, sbs_device_ids); MODULE_DEVICE_TABLE(acpi, sbs_device_ids);
struct acpi_battery { struct acpi_battery {
#ifdef CONFIG_ACPI_SYSFS_POWER
struct power_supply bat; struct power_supply bat;
#endif
struct acpi_sbs *sbs; struct acpi_sbs *sbs;
#ifdef CONFIG_ACPI_PROCFS_POWER #ifdef CONFIG_ACPI_PROCFS_POWER
struct proc_dir_entry *proc_entry; struct proc_dir_entry *proc_entry;
@ -113,7 +117,9 @@ struct acpi_battery {
#define to_acpi_battery(x) container_of(x, struct acpi_battery, bat); #define to_acpi_battery(x) container_of(x, struct acpi_battery, bat);
struct acpi_sbs { struct acpi_sbs {
#ifdef CONFIG_ACPI_SYSFS_POWER
struct power_supply charger; struct power_supply charger;
#endif
struct acpi_device *device; struct acpi_device *device;
struct acpi_smb_hc *hc; struct acpi_smb_hc *hc;
struct mutex lock; struct mutex lock;
@ -157,6 +163,7 @@ static inline int acpi_battery_scale(struct acpi_battery *battery)
acpi_battery_ipscale(battery); acpi_battery_ipscale(battery);
} }
#ifdef CONFIG_ACPI_SYSFS_POWER
static int sbs_get_ac_property(struct power_supply *psy, static int sbs_get_ac_property(struct power_supply *psy,
enum power_supply_property psp, enum power_supply_property psp,
union power_supply_propval *val) union power_supply_propval *val)
@ -294,6 +301,7 @@ static enum power_supply_property sbs_energy_battery_props[] = {
POWER_SUPPLY_PROP_MODEL_NAME, POWER_SUPPLY_PROP_MODEL_NAME,
POWER_SUPPLY_PROP_MANUFACTURER, POWER_SUPPLY_PROP_MANUFACTURER,
}; };
#endif
/* -------------------------------------------------------------------------- /* --------------------------------------------------------------------------
Smart Battery System Management Smart Battery System Management
@ -429,6 +437,7 @@ static int acpi_ac_get_present(struct acpi_sbs *sbs)
return result; return result;
} }
#ifdef CONFIG_ACPI_SYSFS_POWER
static ssize_t acpi_battery_alarm_show(struct device *dev, static ssize_t acpi_battery_alarm_show(struct device *dev,
struct device_attribute *attr, struct device_attribute *attr,
char *buf) char *buf)
@ -458,6 +467,7 @@ static struct device_attribute alarm_attr = {
.show = acpi_battery_alarm_show, .show = acpi_battery_alarm_show,
.store = acpi_battery_alarm_store, .store = acpi_battery_alarm_store,
}; };
#endif
/* -------------------------------------------------------------------------- /* --------------------------------------------------------------------------
FS Interface (/proc/acpi) FS Interface (/proc/acpi)
@ -793,6 +803,7 @@ static int acpi_battery_add(struct acpi_sbs *sbs, int id)
&acpi_battery_state_fops, &acpi_battery_alarm_fops, &acpi_battery_state_fops, &acpi_battery_alarm_fops,
battery); battery);
#endif #endif
#ifdef CONFIG_ACPI_SYSFS_POWER
battery->bat.name = battery->name; battery->bat.name = battery->name;
battery->bat.type = POWER_SUPPLY_TYPE_BATTERY; battery->bat.type = POWER_SUPPLY_TYPE_BATTERY;
if (!acpi_battery_mode(battery)) { if (!acpi_battery_mode(battery)) {
@ -813,6 +824,7 @@ static int acpi_battery_add(struct acpi_sbs *sbs, int id)
goto end; goto end;
battery->have_sysfs_alarm = 1; battery->have_sysfs_alarm = 1;
end: end:
#endif
printk(KERN_INFO PREFIX "%s [%s]: Battery Slot [%s] (battery %s)\n", printk(KERN_INFO PREFIX "%s [%s]: Battery Slot [%s] (battery %s)\n",
ACPI_SBS_DEVICE_NAME, acpi_device_bid(sbs->device), ACPI_SBS_DEVICE_NAME, acpi_device_bid(sbs->device),
battery->name, sbs->battery->present ? "present" : "absent"); battery->name, sbs->battery->present ? "present" : "absent");
@ -822,12 +834,13 @@ static int acpi_battery_add(struct acpi_sbs *sbs, int id)
static void acpi_battery_remove(struct acpi_sbs *sbs, int id) static void acpi_battery_remove(struct acpi_sbs *sbs, int id)
{ {
struct acpi_battery *battery = &sbs->battery[id]; struct acpi_battery *battery = &sbs->battery[id];
#ifdef CONFIG_ACPI_SYSFS_POWER
if (battery->bat.dev) { if (battery->bat.dev) {
if (battery->have_sysfs_alarm) if (battery->have_sysfs_alarm)
device_remove_file(battery->bat.dev, &alarm_attr); device_remove_file(battery->bat.dev, &alarm_attr);
power_supply_unregister(&battery->bat); power_supply_unregister(&battery->bat);
} }
#endif
#ifdef CONFIG_ACPI_PROCFS_POWER #ifdef CONFIG_ACPI_PROCFS_POWER
if (battery->proc_entry) if (battery->proc_entry)
acpi_sbs_remove_fs(&battery->proc_entry, acpi_battery_dir); acpi_sbs_remove_fs(&battery->proc_entry, acpi_battery_dir);
@ -848,12 +861,14 @@ static int acpi_charger_add(struct acpi_sbs *sbs)
if (result) if (result)
goto end; goto end;
#endif #endif
#ifdef CONFIG_ACPI_SYSFS_POWER
sbs->charger.name = "sbs-charger"; sbs->charger.name = "sbs-charger";
sbs->charger.type = POWER_SUPPLY_TYPE_MAINS; sbs->charger.type = POWER_SUPPLY_TYPE_MAINS;
sbs->charger.properties = sbs_ac_props; sbs->charger.properties = sbs_ac_props;
sbs->charger.num_properties = ARRAY_SIZE(sbs_ac_props); sbs->charger.num_properties = ARRAY_SIZE(sbs_ac_props);
sbs->charger.get_property = sbs_get_ac_property; sbs->charger.get_property = sbs_get_ac_property;
power_supply_register(&sbs->device->dev, &sbs->charger); power_supply_register(&sbs->device->dev, &sbs->charger);
#endif
printk(KERN_INFO PREFIX "%s [%s]: AC Adapter [%s] (%s)\n", printk(KERN_INFO PREFIX "%s [%s]: AC Adapter [%s] (%s)\n",
ACPI_SBS_DEVICE_NAME, acpi_device_bid(sbs->device), ACPI_SBS_DEVICE_NAME, acpi_device_bid(sbs->device),
ACPI_AC_DIR_NAME, sbs->charger_present ? "on-line" : "off-line"); ACPI_AC_DIR_NAME, sbs->charger_present ? "on-line" : "off-line");
@ -863,8 +878,10 @@ static int acpi_charger_add(struct acpi_sbs *sbs)
static void acpi_charger_remove(struct acpi_sbs *sbs) static void acpi_charger_remove(struct acpi_sbs *sbs)
{ {
#ifdef CONFIG_ACPI_SYSFS_POWER
if (sbs->charger.dev) if (sbs->charger.dev)
power_supply_unregister(&sbs->charger); power_supply_unregister(&sbs->charger);
#endif
#ifdef CONFIG_ACPI_PROCFS_POWER #ifdef CONFIG_ACPI_PROCFS_POWER
if (sbs->charger_entry) if (sbs->charger_entry)
acpi_sbs_remove_fs(&sbs->charger_entry, acpi_ac_dir); acpi_sbs_remove_fs(&sbs->charger_entry, acpi_ac_dir);
@ -885,7 +902,9 @@ void acpi_sbs_callback(void *context)
ACPI_SBS_NOTIFY_STATUS, ACPI_SBS_NOTIFY_STATUS,
sbs->charger_present); sbs->charger_present);
#endif #endif
#ifdef CONFIG_ACPI_SYSFS_POWER
kobject_uevent(&sbs->charger.dev->kobj, KOBJ_CHANGE); kobject_uevent(&sbs->charger.dev->kobj, KOBJ_CHANGE);
#endif
} }
if (sbs->manager_present) { if (sbs->manager_present) {
for (id = 0; id < MAX_SBS_BAT; ++id) { for (id = 0; id < MAX_SBS_BAT; ++id) {
@ -902,7 +921,9 @@ void acpi_sbs_callback(void *context)
ACPI_SBS_NOTIFY_STATUS, ACPI_SBS_NOTIFY_STATUS,
bat->present); bat->present);
#endif #endif
#ifdef CONFIG_ACPI_SYSFS_POWER
kobject_uevent(&bat->bat.dev->kobj, KOBJ_CHANGE); kobject_uevent(&bat->bat.dev->kobj, KOBJ_CHANGE);
#endif
} }
} }
} }

Просмотреть файл

@ -1449,6 +1449,8 @@ static int acpi_bus_scan_fixed(struct acpi_device *root)
return result; return result;
} }
int __init acpi_boot_ec_enable(void);
static int __init acpi_scan_init(void) static int __init acpi_scan_init(void)
{ {
int result; int result;
@ -1480,6 +1482,10 @@ static int __init acpi_scan_init(void)
* Enumerate devices in the ACPI namespace. * Enumerate devices in the ACPI namespace.
*/ */
result = acpi_bus_scan_fixed(acpi_root); result = acpi_bus_scan_fixed(acpi_root);
/* EC region might be needed at bus_scan, so enable it now */
acpi_boot_ec_enable();
if (!result) if (!result)
result = acpi_bus_scan(acpi_root, &ops); result = acpi_bus_scan(acpi_root, &ops);

Просмотреть файл

@ -132,6 +132,7 @@ enum {
ich8_2port_sata, ich8_2port_sata,
ich8m_apple_sata_ahci, /* locks up on second port enable */ ich8m_apple_sata_ahci, /* locks up on second port enable */
tolapai_sata_ahci, tolapai_sata_ahci,
piix_pata_vmw, /* PIIX4 for VMware, spurious DMA_ERR */
/* constants for mapping table */ /* constants for mapping table */
P0 = 0, /* port 0 */ P0 = 0, /* port 0 */
@ -165,6 +166,7 @@ static void piix_set_piomode(struct ata_port *ap, struct ata_device *adev);
static void piix_set_dmamode(struct ata_port *ap, struct ata_device *adev); static void piix_set_dmamode(struct ata_port *ap, struct ata_device *adev);
static void ich_set_dmamode(struct ata_port *ap, struct ata_device *adev); static void ich_set_dmamode(struct ata_port *ap, struct ata_device *adev);
static int ich_pata_cable_detect(struct ata_port *ap); static int ich_pata_cable_detect(struct ata_port *ap);
static u8 piix_vmw_bmdma_status(struct ata_port *ap);
#ifdef CONFIG_PM #ifdef CONFIG_PM
static int piix_pci_device_suspend(struct pci_dev *pdev, pm_message_t mesg); static int piix_pci_device_suspend(struct pci_dev *pdev, pm_message_t mesg);
static int piix_pci_device_resume(struct pci_dev *pdev); static int piix_pci_device_resume(struct pci_dev *pdev);
@ -175,6 +177,8 @@ static unsigned int in_module_init = 1;
static const struct pci_device_id piix_pci_tbl[] = { static const struct pci_device_id piix_pci_tbl[] = {
/* Intel PIIX3 for the 430HX etc */ /* Intel PIIX3 for the 430HX etc */
{ 0x8086, 0x7010, PCI_ANY_ID, PCI_ANY_ID, 0, 0, piix_pata_mwdma }, { 0x8086, 0x7010, PCI_ANY_ID, PCI_ANY_ID, 0, 0, piix_pata_mwdma },
/* VMware ICH4 */
{ 0x8086, 0x7111, 0x15ad, 0x1976, 0, 0, piix_pata_vmw },
/* Intel PIIX4 for the 430TX/440BX/MX chipset: UDMA 33 */ /* Intel PIIX4 for the 430TX/440BX/MX chipset: UDMA 33 */
/* Also PIIX4E (fn3 rev 2) and PIIX4M (fn3 rev 3) */ /* Also PIIX4E (fn3 rev 2) and PIIX4M (fn3 rev 3) */
{ 0x8086, 0x7111, PCI_ANY_ID, PCI_ANY_ID, 0, 0, piix_pata_33 }, { 0x8086, 0x7111, PCI_ANY_ID, PCI_ANY_ID, 0, 0, piix_pata_33 },
@ -383,6 +387,38 @@ static const struct ata_port_operations piix_sata_ops = {
.port_start = ata_port_start, .port_start = ata_port_start,
}; };
static const struct ata_port_operations piix_vmw_ops = {
.set_piomode = piix_set_piomode,
.set_dmamode = piix_set_dmamode,
.mode_filter = ata_pci_default_filter,
.tf_load = ata_tf_load,
.tf_read = ata_tf_read,
.check_status = ata_check_status,
.exec_command = ata_exec_command,
.dev_select = ata_std_dev_select,
.bmdma_setup = ata_bmdma_setup,
.bmdma_start = ata_bmdma_start,
.bmdma_stop = ata_bmdma_stop,
.bmdma_status = piix_vmw_bmdma_status,
.qc_prep = ata_qc_prep,
.qc_issue = ata_qc_issue_prot,
.data_xfer = ata_data_xfer,
.freeze = ata_bmdma_freeze,
.thaw = ata_bmdma_thaw,
.error_handler = piix_pata_error_handler,
.post_internal_cmd = ata_bmdma_post_internal_cmd,
.cable_detect = ata_cable_40wire,
.irq_handler = ata_interrupt,
.irq_clear = ata_bmdma_irq_clear,
.irq_on = ata_irq_on,
.port_start = ata_port_start,
};
static const struct piix_map_db ich5_map_db = { static const struct piix_map_db ich5_map_db = {
.mask = 0x7, .mask = 0x7,
.port_enable = 0x3, .port_enable = 0x3,
@ -623,6 +659,16 @@ static struct ata_port_info piix_port_info[] = {
.port_ops = &piix_sata_ops, .port_ops = &piix_sata_ops,
}, },
[piix_pata_vmw] =
{
.sht = &piix_sht,
.flags = PIIX_PATA_FLAGS,
.pio_mask = 0x1f, /* pio0-4 */
.mwdma_mask = 0x06, /* mwdma1-2 ?? CHECK 0 should be ok but slow */
.udma_mask = ATA_UDMA_MASK_40C,
.port_ops = &piix_vmw_ops,
},
}; };
static struct pci_bits piix_enable_bits[] = { static struct pci_bits piix_enable_bits[] = {
@ -1135,6 +1181,11 @@ static int piix_pci_device_resume(struct pci_dev *pdev)
} }
#endif #endif
static u8 piix_vmw_bmdma_status(struct ata_port *ap)
{
return ata_bmdma_status(ap) & ~ATA_DMA_ERR;
}
#define AHCI_PCI_BAR 5 #define AHCI_PCI_BAR 5
#define AHCI_GLOBAL_CTL 0x04 #define AHCI_GLOBAL_CTL 0x04
#define AHCI_ENABLE (1 << 31) #define AHCI_ENABLE (1 << 31)

Просмотреть файл

@ -6998,7 +6998,9 @@ int ata_host_start(struct ata_host *host)
rc = ap->ops->port_start(ap); rc = ap->ops->port_start(ap);
if (rc) { if (rc) {
if (rc != -ENODEV) if (rc != -ENODEV)
dev_printk(KERN_ERR, host->dev, "failed to start port %d (errno=%d)\n", i, rc); dev_printk(KERN_ERR, host->dev,
"failed to start port %d "
"(errno=%d)\n", i, rc);
goto err_out; goto err_out;
} }
} }

Просмотреть файл

@ -1733,11 +1733,15 @@ static void ata_eh_link_autopsy(struct ata_link *link)
ehc->i.action &= ~ATA_EH_PERDEV_MASK; ehc->i.action &= ~ATA_EH_PERDEV_MASK;
} }
/* consider speeding down */ /* propagate timeout to host link */
if ((all_err_mask & AC_ERR_TIMEOUT) && !ata_is_host_link(link))
ap->link.eh_context.i.err_mask |= AC_ERR_TIMEOUT;
/* record error and consider speeding down */
dev = ehc->i.dev; dev = ehc->i.dev;
if (!dev && ata_link_max_devices(link) == 1 && if (!dev && ((ata_link_max_devices(link) == 1 &&
ata_dev_enabled(link->device)) ata_dev_enabled(link->device))))
dev = link->device; dev = link->device;
if (dev) if (dev)
ehc->i.action |= ata_eh_speed_down(dev, is_io, all_err_mask); ehc->i.action |= ata_eh_speed_down(dev, is_io, all_err_mask);
@ -1759,8 +1763,14 @@ void ata_eh_autopsy(struct ata_port *ap)
{ {
struct ata_link *link; struct ata_link *link;
__ata_port_for_each_link(link, ap) ata_port_for_each_link(link, ap)
ata_eh_link_autopsy(link); ata_eh_link_autopsy(link);
/* Autopsy of fanout ports can affect host link autopsy.
* Perform host link autopsy last.
*/
if (ap->nr_pmp_links)
ata_eh_link_autopsy(&ap->link);
} }
/** /**
@ -2157,13 +2167,11 @@ int ata_eh_reset(struct ata_link *link, int classify,
if (ata_link_offline(link)) if (ata_link_offline(link))
continue; continue;
/* apply class override and convert UNKNOWN to NONE */ /* apply class override */
if (lflags & ATA_LFLAG_ASSUME_ATA) if (lflags & ATA_LFLAG_ASSUME_ATA)
classes[dev->devno] = ATA_DEV_ATA; classes[dev->devno] = ATA_DEV_ATA;
else if (lflags & ATA_LFLAG_ASSUME_SEMB) else if (lflags & ATA_LFLAG_ASSUME_SEMB)
classes[dev->devno] = ATA_DEV_SEMB_UNSUP; /* not yet */ classes[dev->devno] = ATA_DEV_SEMB_UNSUP; /* not yet */
else if (classes[dev->devno] == ATA_DEV_UNKNOWN)
classes[dev->devno] = ATA_DEV_NONE;
} }
/* record current link speed */ /* record current link speed */

Просмотреть файл

@ -495,14 +495,12 @@ static void sata_pmp_quirks(struct ata_port *ap)
/* SError.N need a kick in the ass to get working */ /* SError.N need a kick in the ass to get working */
link->flags |= ATA_LFLAG_HRST_TO_RESUME; link->flags |= ATA_LFLAG_HRST_TO_RESUME;
/* class code report is unreliable */ /* Class code report is unreliable and SRST
if (link->pmp < 5) * times out under certain configurations.
link->flags |= ATA_LFLAG_ASSUME_ATA; * Config device can be at port 0 or 5 and
* locks up on SRST.
/* The config device, which can be either at
* port 0 or 5, locks up on SRST.
*/ */
if (link->pmp == 0 || link->pmp == 5) if (link->pmp <= 5)
link->flags |= ATA_LFLAG_NO_SRST | link->flags |= ATA_LFLAG_NO_SRST |
ATA_LFLAG_ASSUME_ATA; ATA_LFLAG_ASSUME_ATA;

Просмотреть файл

@ -841,6 +841,9 @@ static void ata_scsi_dev_config(struct scsi_device *sdev,
blk_queue_max_hw_segments(q, q->max_hw_segments - 1); blk_queue_max_hw_segments(q, q->max_hw_segments - 1);
} }
if (dev->class == ATA_DEV_ATA)
sdev->manage_start_stop = 1;
if (dev->flags & ATA_DFLAG_AN) if (dev->flags & ATA_DFLAG_AN)
set_bit(SDEV_EVT_MEDIA_CHANGE, sdev->supported_events); set_bit(SDEV_EVT_MEDIA_CHANGE, sdev->supported_events);
@ -872,8 +875,6 @@ int ata_scsi_slave_config(struct scsi_device *sdev)
ata_scsi_sdev_config(sdev); ata_scsi_sdev_config(sdev);
sdev->manage_start_stop = 1;
if (dev) if (dev)
ata_scsi_dev_config(sdev, dev); ata_scsi_dev_config(sdev, dev);

Просмотреть файл

@ -806,7 +806,10 @@ int ata_pci_init_one(struct pci_dev *pdev,
if (rc) if (rc)
goto err_out; goto err_out;
if (!legacy_mode) { if (!legacy_mode && pdev->irq) {
/* We may have no IRQ assigned in which case we can poll. This
shouldn't happen on a sane system but robustness is cheap
in this case */
rc = devm_request_irq(dev, pdev->irq, pi->port_ops->irq_handler, rc = devm_request_irq(dev, pdev->irq, pi->port_ops->irq_handler,
IRQF_SHARED, DRV_NAME, host); IRQF_SHARED, DRV_NAME, host);
if (rc) if (rc)
@ -814,7 +817,7 @@ int ata_pci_init_one(struct pci_dev *pdev,
ata_port_desc(host->ports[0], "irq %d", pdev->irq); ata_port_desc(host->ports[0], "irq %d", pdev->irq);
ata_port_desc(host->ports[1], "irq %d", pdev->irq); ata_port_desc(host->ports[1], "irq %d", pdev->irq);
} else { } else if (legacy_mode) {
if (!ata_port_is_dummy(host->ports[0])) { if (!ata_port_is_dummy(host->ports[0])) {
rc = devm_request_irq(dev, ATA_PRIMARY_IRQ(pdev), rc = devm_request_irq(dev, ATA_PRIMARY_IRQ(pdev),
pi->port_ops->irq_handler, pi->port_ops->irq_handler,

Просмотреть файл

@ -1509,7 +1509,8 @@ static int __devinit bfin_atapi_probe(struct platform_device *pdev)
if (res == NULL) if (res == NULL)
return -EINVAL; return -EINVAL;
while (bfin_port_info[board_idx].udma_mask>0 && udma_fsclk[udma_mode] > fsclk) { while (bfin_port_info[board_idx].udma_mask > 0 &&
udma_fsclk[udma_mode] > fsclk) {
udma_mode--; udma_mode--;
bfin_port_info[board_idx].udma_mask >>= 1; bfin_port_info[board_idx].udma_mask >>= 1;
} }

Просмотреть файл

@ -130,10 +130,11 @@ static struct ata_port_operations ixp4xx_port_ops = {
.port_start = ata_port_start, .port_start = ata_port_start,
}; };
static void ixp4xx_setup_port(struct ata_ioports *ioaddr, static void ixp4xx_setup_port(struct ata_port *ap,
struct ixp4xx_pata_data *data, struct ixp4xx_pata_data *data,
unsigned long raw_cs0, unsigned long raw_cs1) unsigned long raw_cs0, unsigned long raw_cs1)
{ {
struct ata_ioports *ioaddr = &ap->ioaddr;
unsigned long raw_cmd = raw_cs0; unsigned long raw_cmd = raw_cs0;
unsigned long raw_ctl = raw_cs1 + 0x06; unsigned long raw_ctl = raw_cs1 + 0x06;

Некоторые файлы не были показаны из-за слишком большого количества измененных файлов Показать больше