Merge branch 'x86/core' into perfcounters/core
Conflicts: arch/x86/kernel/apic/apic.c arch/x86/kernel/irqinit_32.c Signed-off-by: Ingo Molnar <mingo@elte.hu>
This commit is contained in:
commit
8e818179eb
1
CREDITS
1
CREDITS
|
@ -2166,7 +2166,6 @@ D: Initial implementation of VC's, pty's and select()
|
||||||
|
|
||||||
N: Pavel Machek
|
N: Pavel Machek
|
||||||
E: pavel@ucw.cz
|
E: pavel@ucw.cz
|
||||||
E: pavel@suse.cz
|
|
||||||
D: Softcursor for vga, hypertech cdrom support, vcsa bugfix, nbd
|
D: Softcursor for vga, hypertech cdrom support, vcsa bugfix, nbd
|
||||||
D: sun4/330 port, capabilities for elf, speedup for rm on ext2, USB,
|
D: sun4/330 port, capabilities for elf, speedup for rm on ext2, USB,
|
||||||
D: work on suspend-to-ram/disk, killing duplicates from ioctl32
|
D: work on suspend-to-ram/disk, killing duplicates from ioctl32
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
What: /sys/firmware/memmap/
|
What: /sys/firmware/memmap/
|
||||||
Date: June 2008
|
Date: June 2008
|
||||||
Contact: Bernhard Walle <bwalle@suse.de>
|
Contact: Bernhard Walle <bernhard.walle@gmx.de>
|
||||||
Description:
|
Description:
|
||||||
On all platforms, the firmware provides a memory map which the
|
On all platforms, the firmware provides a memory map which the
|
||||||
kernel reads. The resources from that memory map are registered
|
kernel reads. The resources from that memory map are registered
|
||||||
|
|
|
@ -6,7 +6,7 @@
|
||||||
# To add a new book the only step required is to add the book to the
|
# To add a new book the only step required is to add the book to the
|
||||||
# list of DOCBOOKS.
|
# list of DOCBOOKS.
|
||||||
|
|
||||||
DOCBOOKS := z8530book.xml mcabook.xml \
|
DOCBOOKS := z8530book.xml mcabook.xml device-drivers.xml \
|
||||||
kernel-hacking.xml kernel-locking.xml deviceiobook.xml \
|
kernel-hacking.xml kernel-locking.xml deviceiobook.xml \
|
||||||
procfs-guide.xml writing_usb_driver.xml networking.xml \
|
procfs-guide.xml writing_usb_driver.xml networking.xml \
|
||||||
kernel-api.xml filesystems.xml lsm.xml usb.xml kgdb.xml \
|
kernel-api.xml filesystems.xml lsm.xml usb.xml kgdb.xml \
|
||||||
|
|
|
@ -0,0 +1,418 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<!DOCTYPE book PUBLIC "-//OASIS//DTD DocBook XML V4.1.2//EN"
|
||||||
|
"http://www.oasis-open.org/docbook/xml/4.1.2/docbookx.dtd" []>
|
||||||
|
|
||||||
|
<book id="LinuxDriversAPI">
|
||||||
|
<bookinfo>
|
||||||
|
<title>Linux Device Drivers</title>
|
||||||
|
|
||||||
|
<legalnotice>
|
||||||
|
<para>
|
||||||
|
This documentation 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 of the License, or (at your option) any later
|
||||||
|
version.
|
||||||
|
</para>
|
||||||
|
|
||||||
|
<para>
|
||||||
|
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.
|
||||||
|
</para>
|
||||||
|
|
||||||
|
<para>
|
||||||
|
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., 59 Temple Place, Suite 330, Boston,
|
||||||
|
MA 02111-1307 USA
|
||||||
|
</para>
|
||||||
|
|
||||||
|
<para>
|
||||||
|
For more details see the file COPYING in the source
|
||||||
|
distribution of Linux.
|
||||||
|
</para>
|
||||||
|
</legalnotice>
|
||||||
|
</bookinfo>
|
||||||
|
|
||||||
|
<toc></toc>
|
||||||
|
|
||||||
|
<chapter id="Basics">
|
||||||
|
<title>Driver Basics</title>
|
||||||
|
<sect1><title>Driver Entry and Exit points</title>
|
||||||
|
!Iinclude/linux/init.h
|
||||||
|
</sect1>
|
||||||
|
|
||||||
|
<sect1><title>Atomic and pointer manipulation</title>
|
||||||
|
!Iarch/x86/include/asm/atomic_32.h
|
||||||
|
!Iarch/x86/include/asm/unaligned.h
|
||||||
|
</sect1>
|
||||||
|
|
||||||
|
<sect1><title>Delaying, scheduling, and timer routines</title>
|
||||||
|
!Iinclude/linux/sched.h
|
||||||
|
!Ekernel/sched.c
|
||||||
|
!Ekernel/timer.c
|
||||||
|
</sect1>
|
||||||
|
<sect1><title>High-resolution timers</title>
|
||||||
|
!Iinclude/linux/ktime.h
|
||||||
|
!Iinclude/linux/hrtimer.h
|
||||||
|
!Ekernel/hrtimer.c
|
||||||
|
</sect1>
|
||||||
|
<sect1><title>Workqueues and Kevents</title>
|
||||||
|
!Ekernel/workqueue.c
|
||||||
|
</sect1>
|
||||||
|
<sect1><title>Internal Functions</title>
|
||||||
|
!Ikernel/exit.c
|
||||||
|
!Ikernel/signal.c
|
||||||
|
!Iinclude/linux/kthread.h
|
||||||
|
!Ekernel/kthread.c
|
||||||
|
</sect1>
|
||||||
|
|
||||||
|
<sect1><title>Kernel objects manipulation</title>
|
||||||
|
<!--
|
||||||
|
X!Iinclude/linux/kobject.h
|
||||||
|
-->
|
||||||
|
!Elib/kobject.c
|
||||||
|
</sect1>
|
||||||
|
|
||||||
|
<sect1><title>Kernel utility functions</title>
|
||||||
|
!Iinclude/linux/kernel.h
|
||||||
|
!Ekernel/printk.c
|
||||||
|
!Ekernel/panic.c
|
||||||
|
!Ekernel/sys.c
|
||||||
|
!Ekernel/rcupdate.c
|
||||||
|
</sect1>
|
||||||
|
|
||||||
|
<sect1><title>Device Resource Management</title>
|
||||||
|
!Edrivers/base/devres.c
|
||||||
|
</sect1>
|
||||||
|
|
||||||
|
</chapter>
|
||||||
|
|
||||||
|
<chapter id="devdrivers">
|
||||||
|
<title>Device drivers infrastructure</title>
|
||||||
|
<sect1><title>Device Drivers Base</title>
|
||||||
|
<!--
|
||||||
|
X!Iinclude/linux/device.h
|
||||||
|
-->
|
||||||
|
!Edrivers/base/driver.c
|
||||||
|
!Edrivers/base/core.c
|
||||||
|
!Edrivers/base/class.c
|
||||||
|
!Edrivers/base/firmware_class.c
|
||||||
|
!Edrivers/base/transport_class.c
|
||||||
|
<!-- Cannot be included, because
|
||||||
|
attribute_container_add_class_device_adapter
|
||||||
|
and attribute_container_classdev_to_container
|
||||||
|
exceed allowed 44 characters maximum
|
||||||
|
X!Edrivers/base/attribute_container.c
|
||||||
|
-->
|
||||||
|
!Edrivers/base/sys.c
|
||||||
|
<!--
|
||||||
|
X!Edrivers/base/interface.c
|
||||||
|
-->
|
||||||
|
!Edrivers/base/platform.c
|
||||||
|
!Edrivers/base/bus.c
|
||||||
|
</sect1>
|
||||||
|
<sect1><title>Device Drivers Power Management</title>
|
||||||
|
!Edrivers/base/power/main.c
|
||||||
|
</sect1>
|
||||||
|
<sect1><title>Device Drivers ACPI Support</title>
|
||||||
|
<!-- Internal functions only
|
||||||
|
X!Edrivers/acpi/sleep/main.c
|
||||||
|
X!Edrivers/acpi/sleep/wakeup.c
|
||||||
|
X!Edrivers/acpi/motherboard.c
|
||||||
|
X!Edrivers/acpi/bus.c
|
||||||
|
-->
|
||||||
|
!Edrivers/acpi/scan.c
|
||||||
|
!Idrivers/acpi/scan.c
|
||||||
|
<!-- No correct structured comments
|
||||||
|
X!Edrivers/acpi/pci_bind.c
|
||||||
|
-->
|
||||||
|
</sect1>
|
||||||
|
<sect1><title>Device drivers PnP support</title>
|
||||||
|
!Idrivers/pnp/core.c
|
||||||
|
<!-- No correct structured comments
|
||||||
|
X!Edrivers/pnp/system.c
|
||||||
|
-->
|
||||||
|
!Edrivers/pnp/card.c
|
||||||
|
!Idrivers/pnp/driver.c
|
||||||
|
!Edrivers/pnp/manager.c
|
||||||
|
!Edrivers/pnp/support.c
|
||||||
|
</sect1>
|
||||||
|
<sect1><title>Userspace IO devices</title>
|
||||||
|
!Edrivers/uio/uio.c
|
||||||
|
!Iinclude/linux/uio_driver.h
|
||||||
|
</sect1>
|
||||||
|
</chapter>
|
||||||
|
|
||||||
|
<chapter id="parportdev">
|
||||||
|
<title>Parallel Port Devices</title>
|
||||||
|
!Iinclude/linux/parport.h
|
||||||
|
!Edrivers/parport/ieee1284.c
|
||||||
|
!Edrivers/parport/share.c
|
||||||
|
!Idrivers/parport/daisy.c
|
||||||
|
</chapter>
|
||||||
|
|
||||||
|
<chapter id="message_devices">
|
||||||
|
<title>Message-based devices</title>
|
||||||
|
<sect1><title>Fusion message devices</title>
|
||||||
|
!Edrivers/message/fusion/mptbase.c
|
||||||
|
!Idrivers/message/fusion/mptbase.c
|
||||||
|
!Edrivers/message/fusion/mptscsih.c
|
||||||
|
!Idrivers/message/fusion/mptscsih.c
|
||||||
|
!Idrivers/message/fusion/mptctl.c
|
||||||
|
!Idrivers/message/fusion/mptspi.c
|
||||||
|
!Idrivers/message/fusion/mptfc.c
|
||||||
|
!Idrivers/message/fusion/mptlan.c
|
||||||
|
</sect1>
|
||||||
|
<sect1><title>I2O message devices</title>
|
||||||
|
!Iinclude/linux/i2o.h
|
||||||
|
!Idrivers/message/i2o/core.h
|
||||||
|
!Edrivers/message/i2o/iop.c
|
||||||
|
!Idrivers/message/i2o/iop.c
|
||||||
|
!Idrivers/message/i2o/config-osm.c
|
||||||
|
!Edrivers/message/i2o/exec-osm.c
|
||||||
|
!Idrivers/message/i2o/exec-osm.c
|
||||||
|
!Idrivers/message/i2o/bus-osm.c
|
||||||
|
!Edrivers/message/i2o/device.c
|
||||||
|
!Idrivers/message/i2o/device.c
|
||||||
|
!Idrivers/message/i2o/driver.c
|
||||||
|
!Idrivers/message/i2o/pci.c
|
||||||
|
!Idrivers/message/i2o/i2o_block.c
|
||||||
|
!Idrivers/message/i2o/i2o_scsi.c
|
||||||
|
!Idrivers/message/i2o/i2o_proc.c
|
||||||
|
</sect1>
|
||||||
|
</chapter>
|
||||||
|
|
||||||
|
<chapter id="snddev">
|
||||||
|
<title>Sound Devices</title>
|
||||||
|
!Iinclude/sound/core.h
|
||||||
|
!Esound/sound_core.c
|
||||||
|
!Iinclude/sound/pcm.h
|
||||||
|
!Esound/core/pcm.c
|
||||||
|
!Esound/core/device.c
|
||||||
|
!Esound/core/info.c
|
||||||
|
!Esound/core/rawmidi.c
|
||||||
|
!Esound/core/sound.c
|
||||||
|
!Esound/core/memory.c
|
||||||
|
!Esound/core/pcm_memory.c
|
||||||
|
!Esound/core/init.c
|
||||||
|
!Esound/core/isadma.c
|
||||||
|
!Esound/core/control.c
|
||||||
|
!Esound/core/pcm_lib.c
|
||||||
|
!Esound/core/hwdep.c
|
||||||
|
!Esound/core/pcm_native.c
|
||||||
|
!Esound/core/memalloc.c
|
||||||
|
<!-- FIXME: Removed for now since no structured comments in source
|
||||||
|
X!Isound/sound_firmware.c
|
||||||
|
-->
|
||||||
|
</chapter>
|
||||||
|
|
||||||
|
<chapter id="uart16x50">
|
||||||
|
<title>16x50 UART Driver</title>
|
||||||
|
!Iinclude/linux/serial_core.h
|
||||||
|
!Edrivers/serial/serial_core.c
|
||||||
|
!Edrivers/serial/8250.c
|
||||||
|
</chapter>
|
||||||
|
|
||||||
|
<chapter id="fbdev">
|
||||||
|
<title>Frame Buffer Library</title>
|
||||||
|
|
||||||
|
<para>
|
||||||
|
The frame buffer drivers depend heavily on four data structures.
|
||||||
|
These structures are declared in include/linux/fb.h. They are
|
||||||
|
fb_info, fb_var_screeninfo, fb_fix_screeninfo and fb_monospecs.
|
||||||
|
The last three can be made available to and from userland.
|
||||||
|
</para>
|
||||||
|
|
||||||
|
<para>
|
||||||
|
fb_info defines the current state of a particular video card.
|
||||||
|
Inside fb_info, there exists a fb_ops structure which is a
|
||||||
|
collection of needed functions to make fbdev and fbcon work.
|
||||||
|
fb_info is only visible to the kernel.
|
||||||
|
</para>
|
||||||
|
|
||||||
|
<para>
|
||||||
|
fb_var_screeninfo is used to describe the features of a video card
|
||||||
|
that are user defined. With fb_var_screeninfo, things such as
|
||||||
|
depth and the resolution may be defined.
|
||||||
|
</para>
|
||||||
|
|
||||||
|
<para>
|
||||||
|
The next structure is fb_fix_screeninfo. This defines the
|
||||||
|
properties of a card that are created when a mode is set and can't
|
||||||
|
be changed otherwise. A good example of this is the start of the
|
||||||
|
frame buffer memory. This "locks" the address of the frame buffer
|
||||||
|
memory, so that it cannot be changed or moved.
|
||||||
|
</para>
|
||||||
|
|
||||||
|
<para>
|
||||||
|
The last structure is fb_monospecs. In the old API, there was
|
||||||
|
little importance for fb_monospecs. This allowed for forbidden things
|
||||||
|
such as setting a mode of 800x600 on a fix frequency monitor. With
|
||||||
|
the new API, fb_monospecs prevents such things, and if used
|
||||||
|
correctly, can prevent a monitor from being cooked. fb_monospecs
|
||||||
|
will not be useful until kernels 2.5.x.
|
||||||
|
</para>
|
||||||
|
|
||||||
|
<sect1><title>Frame Buffer Memory</title>
|
||||||
|
!Edrivers/video/fbmem.c
|
||||||
|
</sect1>
|
||||||
|
<!--
|
||||||
|
<sect1><title>Frame Buffer Console</title>
|
||||||
|
X!Edrivers/video/console/fbcon.c
|
||||||
|
</sect1>
|
||||||
|
-->
|
||||||
|
<sect1><title>Frame Buffer Colormap</title>
|
||||||
|
!Edrivers/video/fbcmap.c
|
||||||
|
</sect1>
|
||||||
|
<!-- FIXME:
|
||||||
|
drivers/video/fbgen.c has no docs, which stuffs up the sgml. Comment
|
||||||
|
out until somebody adds docs. KAO
|
||||||
|
<sect1><title>Frame Buffer Generic Functions</title>
|
||||||
|
X!Idrivers/video/fbgen.c
|
||||||
|
</sect1>
|
||||||
|
KAO -->
|
||||||
|
<sect1><title>Frame Buffer Video Mode Database</title>
|
||||||
|
!Idrivers/video/modedb.c
|
||||||
|
!Edrivers/video/modedb.c
|
||||||
|
</sect1>
|
||||||
|
<sect1><title>Frame Buffer Macintosh Video Mode Database</title>
|
||||||
|
!Edrivers/video/macmodes.c
|
||||||
|
</sect1>
|
||||||
|
<sect1><title>Frame Buffer Fonts</title>
|
||||||
|
<para>
|
||||||
|
Refer to the file drivers/video/console/fonts.c for more information.
|
||||||
|
</para>
|
||||||
|
<!-- FIXME: Removed for now since no structured comments in source
|
||||||
|
X!Idrivers/video/console/fonts.c
|
||||||
|
-->
|
||||||
|
</sect1>
|
||||||
|
</chapter>
|
||||||
|
|
||||||
|
<chapter id="input_subsystem">
|
||||||
|
<title>Input Subsystem</title>
|
||||||
|
!Iinclude/linux/input.h
|
||||||
|
!Edrivers/input/input.c
|
||||||
|
!Edrivers/input/ff-core.c
|
||||||
|
!Edrivers/input/ff-memless.c
|
||||||
|
</chapter>
|
||||||
|
|
||||||
|
<chapter id="spi">
|
||||||
|
<title>Serial Peripheral Interface (SPI)</title>
|
||||||
|
<para>
|
||||||
|
SPI is the "Serial Peripheral Interface", widely used with
|
||||||
|
embedded systems because it is a simple and efficient
|
||||||
|
interface: basically a multiplexed shift register.
|
||||||
|
Its three signal wires hold a clock (SCK, often in the range
|
||||||
|
of 1-20 MHz), a "Master Out, Slave In" (MOSI) data line, and
|
||||||
|
a "Master In, Slave Out" (MISO) data line.
|
||||||
|
SPI is a full duplex protocol; for each bit shifted out the
|
||||||
|
MOSI line (one per clock) another is shifted in on the MISO line.
|
||||||
|
Those bits are assembled into words of various sizes on the
|
||||||
|
way to and from system memory.
|
||||||
|
An additional chipselect line is usually active-low (nCS);
|
||||||
|
four signals are normally used for each peripheral, plus
|
||||||
|
sometimes an interrupt.
|
||||||
|
</para>
|
||||||
|
<para>
|
||||||
|
The SPI bus facilities listed here provide a generalized
|
||||||
|
interface to declare SPI busses and devices, manage them
|
||||||
|
according to the standard Linux driver model, and perform
|
||||||
|
input/output operations.
|
||||||
|
At this time, only "master" side interfaces are supported,
|
||||||
|
where Linux talks to SPI peripherals and does not implement
|
||||||
|
such a peripheral itself.
|
||||||
|
(Interfaces to support implementing SPI slaves would
|
||||||
|
necessarily look different.)
|
||||||
|
</para>
|
||||||
|
<para>
|
||||||
|
The programming interface is structured around two kinds of driver,
|
||||||
|
and two kinds of device.
|
||||||
|
A "Controller Driver" abstracts the controller hardware, which may
|
||||||
|
be as simple as a set of GPIO pins or as complex as a pair of FIFOs
|
||||||
|
connected to dual DMA engines on the other side of the SPI shift
|
||||||
|
register (maximizing throughput). Such drivers bridge between
|
||||||
|
whatever bus they sit on (often the platform bus) and SPI, and
|
||||||
|
expose the SPI side of their device as a
|
||||||
|
<structname>struct spi_master</structname>.
|
||||||
|
SPI devices are children of that master, represented as a
|
||||||
|
<structname>struct spi_device</structname> and manufactured from
|
||||||
|
<structname>struct spi_board_info</structname> descriptors which
|
||||||
|
are usually provided by board-specific initialization code.
|
||||||
|
A <structname>struct spi_driver</structname> is called a
|
||||||
|
"Protocol Driver", and is bound to a spi_device using normal
|
||||||
|
driver model calls.
|
||||||
|
</para>
|
||||||
|
<para>
|
||||||
|
The I/O model is a set of queued messages. Protocol drivers
|
||||||
|
submit one or more <structname>struct spi_message</structname>
|
||||||
|
objects, which are processed and completed asynchronously.
|
||||||
|
(There are synchronous wrappers, however.) Messages are
|
||||||
|
built from one or more <structname>struct spi_transfer</structname>
|
||||||
|
objects, each of which wraps a full duplex SPI transfer.
|
||||||
|
A variety of protocol tweaking options are needed, because
|
||||||
|
different chips adopt very different policies for how they
|
||||||
|
use the bits transferred with SPI.
|
||||||
|
</para>
|
||||||
|
!Iinclude/linux/spi/spi.h
|
||||||
|
!Fdrivers/spi/spi.c spi_register_board_info
|
||||||
|
!Edrivers/spi/spi.c
|
||||||
|
</chapter>
|
||||||
|
|
||||||
|
<chapter id="i2c">
|
||||||
|
<title>I<superscript>2</superscript>C and SMBus Subsystem</title>
|
||||||
|
|
||||||
|
<para>
|
||||||
|
I<superscript>2</superscript>C (or without fancy typography, "I2C")
|
||||||
|
is an acronym for the "Inter-IC" bus, a simple bus protocol which is
|
||||||
|
widely used where low data rate communications suffice.
|
||||||
|
Since it's also a licensed trademark, some vendors use another
|
||||||
|
name (such as "Two-Wire Interface", TWI) for the same bus.
|
||||||
|
I2C only needs two signals (SCL for clock, SDA for data), conserving
|
||||||
|
board real estate and minimizing signal quality issues.
|
||||||
|
Most I2C devices use seven bit addresses, and bus speeds of up
|
||||||
|
to 400 kHz; there's a high speed extension (3.4 MHz) that's not yet
|
||||||
|
found wide use.
|
||||||
|
I2C is a multi-master bus; open drain signaling is used to
|
||||||
|
arbitrate between masters, as well as to handshake and to
|
||||||
|
synchronize clocks from slower clients.
|
||||||
|
</para>
|
||||||
|
|
||||||
|
<para>
|
||||||
|
The Linux I2C programming interfaces support only the master
|
||||||
|
side of bus interactions, not the slave side.
|
||||||
|
The programming interface is structured around two kinds of driver,
|
||||||
|
and two kinds of device.
|
||||||
|
An I2C "Adapter Driver" abstracts the controller hardware; it binds
|
||||||
|
to a physical device (perhaps a PCI device or platform_device) and
|
||||||
|
exposes a <structname>struct i2c_adapter</structname> representing
|
||||||
|
each I2C bus segment it manages.
|
||||||
|
On each I2C bus segment will be I2C devices represented by a
|
||||||
|
<structname>struct i2c_client</structname>. Those devices will
|
||||||
|
be bound to a <structname>struct i2c_driver</structname>,
|
||||||
|
which should follow the standard Linux driver model.
|
||||||
|
(At this writing, a legacy model is more widely used.)
|
||||||
|
There are functions to perform various I2C protocol operations; at
|
||||||
|
this writing all such functions are usable only from task context.
|
||||||
|
</para>
|
||||||
|
|
||||||
|
<para>
|
||||||
|
The System Management Bus (SMBus) is a sibling protocol. Most SMBus
|
||||||
|
systems are also I2C conformant. The electrical constraints are
|
||||||
|
tighter for SMBus, and it standardizes particular protocol messages
|
||||||
|
and idioms. Controllers that support I2C can also support most
|
||||||
|
SMBus operations, but SMBus controllers don't support all the protocol
|
||||||
|
options that an I2C controller will.
|
||||||
|
There are functions to perform various SMBus protocol operations,
|
||||||
|
either using I2C primitives or by issuing SMBus commands to
|
||||||
|
i2c_adapter devices which don't support those I2C operations.
|
||||||
|
</para>
|
||||||
|
|
||||||
|
!Iinclude/linux/i2c.h
|
||||||
|
!Fdrivers/i2c/i2c-boardinfo.c i2c_register_board_info
|
||||||
|
!Edrivers/i2c/i2c-core.c
|
||||||
|
</chapter>
|
||||||
|
|
||||||
|
</book>
|
|
@ -38,58 +38,6 @@
|
||||||
|
|
||||||
<toc></toc>
|
<toc></toc>
|
||||||
|
|
||||||
<chapter id="Basics">
|
|
||||||
<title>Driver Basics</title>
|
|
||||||
<sect1><title>Driver Entry and Exit points</title>
|
|
||||||
!Iinclude/linux/init.h
|
|
||||||
</sect1>
|
|
||||||
|
|
||||||
<sect1><title>Atomic and pointer manipulation</title>
|
|
||||||
!Iarch/x86/include/asm/atomic_32.h
|
|
||||||
!Iarch/x86/include/asm/unaligned.h
|
|
||||||
</sect1>
|
|
||||||
|
|
||||||
<sect1><title>Delaying, scheduling, and timer routines</title>
|
|
||||||
!Iinclude/linux/sched.h
|
|
||||||
!Ekernel/sched.c
|
|
||||||
!Ekernel/timer.c
|
|
||||||
</sect1>
|
|
||||||
<sect1><title>High-resolution timers</title>
|
|
||||||
!Iinclude/linux/ktime.h
|
|
||||||
!Iinclude/linux/hrtimer.h
|
|
||||||
!Ekernel/hrtimer.c
|
|
||||||
</sect1>
|
|
||||||
<sect1><title>Workqueues and Kevents</title>
|
|
||||||
!Ekernel/workqueue.c
|
|
||||||
</sect1>
|
|
||||||
<sect1><title>Internal Functions</title>
|
|
||||||
!Ikernel/exit.c
|
|
||||||
!Ikernel/signal.c
|
|
||||||
!Iinclude/linux/kthread.h
|
|
||||||
!Ekernel/kthread.c
|
|
||||||
</sect1>
|
|
||||||
|
|
||||||
<sect1><title>Kernel objects manipulation</title>
|
|
||||||
<!--
|
|
||||||
X!Iinclude/linux/kobject.h
|
|
||||||
-->
|
|
||||||
!Elib/kobject.c
|
|
||||||
</sect1>
|
|
||||||
|
|
||||||
<sect1><title>Kernel utility functions</title>
|
|
||||||
!Iinclude/linux/kernel.h
|
|
||||||
!Ekernel/printk.c
|
|
||||||
!Ekernel/panic.c
|
|
||||||
!Ekernel/sys.c
|
|
||||||
!Ekernel/rcupdate.c
|
|
||||||
</sect1>
|
|
||||||
|
|
||||||
<sect1><title>Device Resource Management</title>
|
|
||||||
!Edrivers/base/devres.c
|
|
||||||
</sect1>
|
|
||||||
|
|
||||||
</chapter>
|
|
||||||
|
|
||||||
<chapter id="adt">
|
<chapter id="adt">
|
||||||
<title>Data Types</title>
|
<title>Data Types</title>
|
||||||
<sect1><title>Doubly Linked Lists</title>
|
<sect1><title>Doubly Linked Lists</title>
|
||||||
|
@ -298,62 +246,6 @@ X!Earch/x86/kernel/mca_32.c
|
||||||
!Ikernel/acct.c
|
!Ikernel/acct.c
|
||||||
</chapter>
|
</chapter>
|
||||||
|
|
||||||
<chapter id="devdrivers">
|
|
||||||
<title>Device drivers infrastructure</title>
|
|
||||||
<sect1><title>Device Drivers Base</title>
|
|
||||||
<!--
|
|
||||||
X!Iinclude/linux/device.h
|
|
||||||
-->
|
|
||||||
!Edrivers/base/driver.c
|
|
||||||
!Edrivers/base/core.c
|
|
||||||
!Edrivers/base/class.c
|
|
||||||
!Edrivers/base/firmware_class.c
|
|
||||||
!Edrivers/base/transport_class.c
|
|
||||||
<!-- Cannot be included, because
|
|
||||||
attribute_container_add_class_device_adapter
|
|
||||||
and attribute_container_classdev_to_container
|
|
||||||
exceed allowed 44 characters maximum
|
|
||||||
X!Edrivers/base/attribute_container.c
|
|
||||||
-->
|
|
||||||
!Edrivers/base/sys.c
|
|
||||||
<!--
|
|
||||||
X!Edrivers/base/interface.c
|
|
||||||
-->
|
|
||||||
!Edrivers/base/platform.c
|
|
||||||
!Edrivers/base/bus.c
|
|
||||||
</sect1>
|
|
||||||
<sect1><title>Device Drivers Power Management</title>
|
|
||||||
!Edrivers/base/power/main.c
|
|
||||||
</sect1>
|
|
||||||
<sect1><title>Device Drivers ACPI Support</title>
|
|
||||||
<!-- Internal functions only
|
|
||||||
X!Edrivers/acpi/sleep/main.c
|
|
||||||
X!Edrivers/acpi/sleep/wakeup.c
|
|
||||||
X!Edrivers/acpi/motherboard.c
|
|
||||||
X!Edrivers/acpi/bus.c
|
|
||||||
-->
|
|
||||||
!Edrivers/acpi/scan.c
|
|
||||||
!Idrivers/acpi/scan.c
|
|
||||||
<!-- No correct structured comments
|
|
||||||
X!Edrivers/acpi/pci_bind.c
|
|
||||||
-->
|
|
||||||
</sect1>
|
|
||||||
<sect1><title>Device drivers PnP support</title>
|
|
||||||
!Idrivers/pnp/core.c
|
|
||||||
<!-- No correct structured comments
|
|
||||||
X!Edrivers/pnp/system.c
|
|
||||||
-->
|
|
||||||
!Edrivers/pnp/card.c
|
|
||||||
!Idrivers/pnp/driver.c
|
|
||||||
!Edrivers/pnp/manager.c
|
|
||||||
!Edrivers/pnp/support.c
|
|
||||||
</sect1>
|
|
||||||
<sect1><title>Userspace IO devices</title>
|
|
||||||
!Edrivers/uio/uio.c
|
|
||||||
!Iinclude/linux/uio_driver.h
|
|
||||||
</sect1>
|
|
||||||
</chapter>
|
|
||||||
|
|
||||||
<chapter id="blkdev">
|
<chapter id="blkdev">
|
||||||
<title>Block Devices</title>
|
<title>Block Devices</title>
|
||||||
!Eblock/blk-core.c
|
!Eblock/blk-core.c
|
||||||
|
@ -381,275 +273,6 @@ X!Edrivers/pnp/system.c
|
||||||
!Edrivers/char/misc.c
|
!Edrivers/char/misc.c
|
||||||
</chapter>
|
</chapter>
|
||||||
|
|
||||||
<chapter id="parportdev">
|
|
||||||
<title>Parallel Port Devices</title>
|
|
||||||
!Iinclude/linux/parport.h
|
|
||||||
!Edrivers/parport/ieee1284.c
|
|
||||||
!Edrivers/parport/share.c
|
|
||||||
!Idrivers/parport/daisy.c
|
|
||||||
</chapter>
|
|
||||||
|
|
||||||
<chapter id="message_devices">
|
|
||||||
<title>Message-based devices</title>
|
|
||||||
<sect1><title>Fusion message devices</title>
|
|
||||||
!Edrivers/message/fusion/mptbase.c
|
|
||||||
!Idrivers/message/fusion/mptbase.c
|
|
||||||
!Edrivers/message/fusion/mptscsih.c
|
|
||||||
!Idrivers/message/fusion/mptscsih.c
|
|
||||||
!Idrivers/message/fusion/mptctl.c
|
|
||||||
!Idrivers/message/fusion/mptspi.c
|
|
||||||
!Idrivers/message/fusion/mptfc.c
|
|
||||||
!Idrivers/message/fusion/mptlan.c
|
|
||||||
</sect1>
|
|
||||||
<sect1><title>I2O message devices</title>
|
|
||||||
!Iinclude/linux/i2o.h
|
|
||||||
!Idrivers/message/i2o/core.h
|
|
||||||
!Edrivers/message/i2o/iop.c
|
|
||||||
!Idrivers/message/i2o/iop.c
|
|
||||||
!Idrivers/message/i2o/config-osm.c
|
|
||||||
!Edrivers/message/i2o/exec-osm.c
|
|
||||||
!Idrivers/message/i2o/exec-osm.c
|
|
||||||
!Idrivers/message/i2o/bus-osm.c
|
|
||||||
!Edrivers/message/i2o/device.c
|
|
||||||
!Idrivers/message/i2o/device.c
|
|
||||||
!Idrivers/message/i2o/driver.c
|
|
||||||
!Idrivers/message/i2o/pci.c
|
|
||||||
!Idrivers/message/i2o/i2o_block.c
|
|
||||||
!Idrivers/message/i2o/i2o_scsi.c
|
|
||||||
!Idrivers/message/i2o/i2o_proc.c
|
|
||||||
</sect1>
|
|
||||||
</chapter>
|
|
||||||
|
|
||||||
<chapter id="snddev">
|
|
||||||
<title>Sound Devices</title>
|
|
||||||
!Iinclude/sound/core.h
|
|
||||||
!Esound/sound_core.c
|
|
||||||
!Iinclude/sound/pcm.h
|
|
||||||
!Esound/core/pcm.c
|
|
||||||
!Esound/core/device.c
|
|
||||||
!Esound/core/info.c
|
|
||||||
!Esound/core/rawmidi.c
|
|
||||||
!Esound/core/sound.c
|
|
||||||
!Esound/core/memory.c
|
|
||||||
!Esound/core/pcm_memory.c
|
|
||||||
!Esound/core/init.c
|
|
||||||
!Esound/core/isadma.c
|
|
||||||
!Esound/core/control.c
|
|
||||||
!Esound/core/pcm_lib.c
|
|
||||||
!Esound/core/hwdep.c
|
|
||||||
!Esound/core/pcm_native.c
|
|
||||||
!Esound/core/memalloc.c
|
|
||||||
<!-- FIXME: Removed for now since no structured comments in source
|
|
||||||
X!Isound/sound_firmware.c
|
|
||||||
-->
|
|
||||||
</chapter>
|
|
||||||
|
|
||||||
<chapter id="uart16x50">
|
|
||||||
<title>16x50 UART Driver</title>
|
|
||||||
!Iinclude/linux/serial_core.h
|
|
||||||
!Edrivers/serial/serial_core.c
|
|
||||||
!Edrivers/serial/8250.c
|
|
||||||
</chapter>
|
|
||||||
|
|
||||||
<chapter id="fbdev">
|
|
||||||
<title>Frame Buffer Library</title>
|
|
||||||
|
|
||||||
<para>
|
|
||||||
The frame buffer drivers depend heavily on four data structures.
|
|
||||||
These structures are declared in include/linux/fb.h. They are
|
|
||||||
fb_info, fb_var_screeninfo, fb_fix_screeninfo and fb_monospecs.
|
|
||||||
The last three can be made available to and from userland.
|
|
||||||
</para>
|
|
||||||
|
|
||||||
<para>
|
|
||||||
fb_info defines the current state of a particular video card.
|
|
||||||
Inside fb_info, there exists a fb_ops structure which is a
|
|
||||||
collection of needed functions to make fbdev and fbcon work.
|
|
||||||
fb_info is only visible to the kernel.
|
|
||||||
</para>
|
|
||||||
|
|
||||||
<para>
|
|
||||||
fb_var_screeninfo is used to describe the features of a video card
|
|
||||||
that are user defined. With fb_var_screeninfo, things such as
|
|
||||||
depth and the resolution may be defined.
|
|
||||||
</para>
|
|
||||||
|
|
||||||
<para>
|
|
||||||
The next structure is fb_fix_screeninfo. This defines the
|
|
||||||
properties of a card that are created when a mode is set and can't
|
|
||||||
be changed otherwise. A good example of this is the start of the
|
|
||||||
frame buffer memory. This "locks" the address of the frame buffer
|
|
||||||
memory, so that it cannot be changed or moved.
|
|
||||||
</para>
|
|
||||||
|
|
||||||
<para>
|
|
||||||
The last structure is fb_monospecs. In the old API, there was
|
|
||||||
little importance for fb_monospecs. This allowed for forbidden things
|
|
||||||
such as setting a mode of 800x600 on a fix frequency monitor. With
|
|
||||||
the new API, fb_monospecs prevents such things, and if used
|
|
||||||
correctly, can prevent a monitor from being cooked. fb_monospecs
|
|
||||||
will not be useful until kernels 2.5.x.
|
|
||||||
</para>
|
|
||||||
|
|
||||||
<sect1><title>Frame Buffer Memory</title>
|
|
||||||
!Edrivers/video/fbmem.c
|
|
||||||
</sect1>
|
|
||||||
<!--
|
|
||||||
<sect1><title>Frame Buffer Console</title>
|
|
||||||
X!Edrivers/video/console/fbcon.c
|
|
||||||
</sect1>
|
|
||||||
-->
|
|
||||||
<sect1><title>Frame Buffer Colormap</title>
|
|
||||||
!Edrivers/video/fbcmap.c
|
|
||||||
</sect1>
|
|
||||||
<!-- FIXME:
|
|
||||||
drivers/video/fbgen.c has no docs, which stuffs up the sgml. Comment
|
|
||||||
out until somebody adds docs. KAO
|
|
||||||
<sect1><title>Frame Buffer Generic Functions</title>
|
|
||||||
X!Idrivers/video/fbgen.c
|
|
||||||
</sect1>
|
|
||||||
KAO -->
|
|
||||||
<sect1><title>Frame Buffer Video Mode Database</title>
|
|
||||||
!Idrivers/video/modedb.c
|
|
||||||
!Edrivers/video/modedb.c
|
|
||||||
</sect1>
|
|
||||||
<sect1><title>Frame Buffer Macintosh Video Mode Database</title>
|
|
||||||
!Edrivers/video/macmodes.c
|
|
||||||
</sect1>
|
|
||||||
<sect1><title>Frame Buffer Fonts</title>
|
|
||||||
<para>
|
|
||||||
Refer to the file drivers/video/console/fonts.c for more information.
|
|
||||||
</para>
|
|
||||||
<!-- FIXME: Removed for now since no structured comments in source
|
|
||||||
X!Idrivers/video/console/fonts.c
|
|
||||||
-->
|
|
||||||
</sect1>
|
|
||||||
</chapter>
|
|
||||||
|
|
||||||
<chapter id="input_subsystem">
|
|
||||||
<title>Input Subsystem</title>
|
|
||||||
!Iinclude/linux/input.h
|
|
||||||
!Edrivers/input/input.c
|
|
||||||
!Edrivers/input/ff-core.c
|
|
||||||
!Edrivers/input/ff-memless.c
|
|
||||||
</chapter>
|
|
||||||
|
|
||||||
<chapter id="spi">
|
|
||||||
<title>Serial Peripheral Interface (SPI)</title>
|
|
||||||
<para>
|
|
||||||
SPI is the "Serial Peripheral Interface", widely used with
|
|
||||||
embedded systems because it is a simple and efficient
|
|
||||||
interface: basically a multiplexed shift register.
|
|
||||||
Its three signal wires hold a clock (SCK, often in the range
|
|
||||||
of 1-20 MHz), a "Master Out, Slave In" (MOSI) data line, and
|
|
||||||
a "Master In, Slave Out" (MISO) data line.
|
|
||||||
SPI is a full duplex protocol; for each bit shifted out the
|
|
||||||
MOSI line (one per clock) another is shifted in on the MISO line.
|
|
||||||
Those bits are assembled into words of various sizes on the
|
|
||||||
way to and from system memory.
|
|
||||||
An additional chipselect line is usually active-low (nCS);
|
|
||||||
four signals are normally used for each peripheral, plus
|
|
||||||
sometimes an interrupt.
|
|
||||||
</para>
|
|
||||||
<para>
|
|
||||||
The SPI bus facilities listed here provide a generalized
|
|
||||||
interface to declare SPI busses and devices, manage them
|
|
||||||
according to the standard Linux driver model, and perform
|
|
||||||
input/output operations.
|
|
||||||
At this time, only "master" side interfaces are supported,
|
|
||||||
where Linux talks to SPI peripherals and does not implement
|
|
||||||
such a peripheral itself.
|
|
||||||
(Interfaces to support implementing SPI slaves would
|
|
||||||
necessarily look different.)
|
|
||||||
</para>
|
|
||||||
<para>
|
|
||||||
The programming interface is structured around two kinds of driver,
|
|
||||||
and two kinds of device.
|
|
||||||
A "Controller Driver" abstracts the controller hardware, which may
|
|
||||||
be as simple as a set of GPIO pins or as complex as a pair of FIFOs
|
|
||||||
connected to dual DMA engines on the other side of the SPI shift
|
|
||||||
register (maximizing throughput). Such drivers bridge between
|
|
||||||
whatever bus they sit on (often the platform bus) and SPI, and
|
|
||||||
expose the SPI side of their device as a
|
|
||||||
<structname>struct spi_master</structname>.
|
|
||||||
SPI devices are children of that master, represented as a
|
|
||||||
<structname>struct spi_device</structname> and manufactured from
|
|
||||||
<structname>struct spi_board_info</structname> descriptors which
|
|
||||||
are usually provided by board-specific initialization code.
|
|
||||||
A <structname>struct spi_driver</structname> is called a
|
|
||||||
"Protocol Driver", and is bound to a spi_device using normal
|
|
||||||
driver model calls.
|
|
||||||
</para>
|
|
||||||
<para>
|
|
||||||
The I/O model is a set of queued messages. Protocol drivers
|
|
||||||
submit one or more <structname>struct spi_message</structname>
|
|
||||||
objects, which are processed and completed asynchronously.
|
|
||||||
(There are synchronous wrappers, however.) Messages are
|
|
||||||
built from one or more <structname>struct spi_transfer</structname>
|
|
||||||
objects, each of which wraps a full duplex SPI transfer.
|
|
||||||
A variety of protocol tweaking options are needed, because
|
|
||||||
different chips adopt very different policies for how they
|
|
||||||
use the bits transferred with SPI.
|
|
||||||
</para>
|
|
||||||
!Iinclude/linux/spi/spi.h
|
|
||||||
!Fdrivers/spi/spi.c spi_register_board_info
|
|
||||||
!Edrivers/spi/spi.c
|
|
||||||
</chapter>
|
|
||||||
|
|
||||||
<chapter id="i2c">
|
|
||||||
<title>I<superscript>2</superscript>C and SMBus Subsystem</title>
|
|
||||||
|
|
||||||
<para>
|
|
||||||
I<superscript>2</superscript>C (or without fancy typography, "I2C")
|
|
||||||
is an acronym for the "Inter-IC" bus, a simple bus protocol which is
|
|
||||||
widely used where low data rate communications suffice.
|
|
||||||
Since it's also a licensed trademark, some vendors use another
|
|
||||||
name (such as "Two-Wire Interface", TWI) for the same bus.
|
|
||||||
I2C only needs two signals (SCL for clock, SDA for data), conserving
|
|
||||||
board real estate and minimizing signal quality issues.
|
|
||||||
Most I2C devices use seven bit addresses, and bus speeds of up
|
|
||||||
to 400 kHz; there's a high speed extension (3.4 MHz) that's not yet
|
|
||||||
found wide use.
|
|
||||||
I2C is a multi-master bus; open drain signaling is used to
|
|
||||||
arbitrate between masters, as well as to handshake and to
|
|
||||||
synchronize clocks from slower clients.
|
|
||||||
</para>
|
|
||||||
|
|
||||||
<para>
|
|
||||||
The Linux I2C programming interfaces support only the master
|
|
||||||
side of bus interactions, not the slave side.
|
|
||||||
The programming interface is structured around two kinds of driver,
|
|
||||||
and two kinds of device.
|
|
||||||
An I2C "Adapter Driver" abstracts the controller hardware; it binds
|
|
||||||
to a physical device (perhaps a PCI device or platform_device) and
|
|
||||||
exposes a <structname>struct i2c_adapter</structname> representing
|
|
||||||
each I2C bus segment it manages.
|
|
||||||
On each I2C bus segment will be I2C devices represented by a
|
|
||||||
<structname>struct i2c_client</structname>. Those devices will
|
|
||||||
be bound to a <structname>struct i2c_driver</structname>,
|
|
||||||
which should follow the standard Linux driver model.
|
|
||||||
(At this writing, a legacy model is more widely used.)
|
|
||||||
There are functions to perform various I2C protocol operations; at
|
|
||||||
this writing all such functions are usable only from task context.
|
|
||||||
</para>
|
|
||||||
|
|
||||||
<para>
|
|
||||||
The System Management Bus (SMBus) is a sibling protocol. Most SMBus
|
|
||||||
systems are also I2C conformant. The electrical constraints are
|
|
||||||
tighter for SMBus, and it standardizes particular protocol messages
|
|
||||||
and idioms. Controllers that support I2C can also support most
|
|
||||||
SMBus operations, but SMBus controllers don't support all the protocol
|
|
||||||
options that an I2C controller will.
|
|
||||||
There are functions to perform various SMBus protocol operations,
|
|
||||||
either using I2C primitives or by issuing SMBus commands to
|
|
||||||
i2c_adapter devices which don't support those I2C operations.
|
|
||||||
</para>
|
|
||||||
|
|
||||||
!Iinclude/linux/i2c.h
|
|
||||||
!Fdrivers/i2c/i2c-boardinfo.c i2c_register_board_info
|
|
||||||
!Edrivers/i2c/i2c-core.c
|
|
||||||
</chapter>
|
|
||||||
|
|
||||||
<chapter id="clk">
|
<chapter id="clk">
|
||||||
<title>Clock Framework</title>
|
<title>Clock Framework</title>
|
||||||
|
|
||||||
|
|
|
@ -93,7 +93,7 @@ the PCI Express Port Bus driver from loading a service driver.
|
||||||
|
|
||||||
int pcie_port_service_register(struct pcie_port_service_driver *new)
|
int pcie_port_service_register(struct pcie_port_service_driver *new)
|
||||||
|
|
||||||
This API replaces the Linux Driver Model's pci_module_init API. A
|
This API replaces the Linux Driver Model's pci_register_driver API. A
|
||||||
service driver should always calls pcie_port_service_register at
|
service driver should always calls pcie_port_service_register at
|
||||||
module init. Note that after service driver being loaded, calls
|
module init. Note that after service driver being loaded, calls
|
||||||
such as pci_enable_device(dev) and pci_set_master(dev) are no longer
|
such as pci_enable_device(dev) and pci_set_master(dev) are no longer
|
||||||
|
|
|
@ -252,10 +252,8 @@ cgroup file system directories.
|
||||||
When a task is moved from one cgroup to another, it gets a new
|
When a task is moved from one cgroup to another, it gets a new
|
||||||
css_set pointer - if there's an already existing css_set with the
|
css_set pointer - if there's an already existing css_set with the
|
||||||
desired collection of cgroups then that group is reused, else a new
|
desired collection of cgroups then that group is reused, else a new
|
||||||
css_set is allocated. Note that the current implementation uses a
|
css_set is allocated. The appropriate existing css_set is located by
|
||||||
linear search to locate an appropriate existing css_set, so isn't
|
looking into a hash table.
|
||||||
very efficient. A future version will use a hash table for better
|
|
||||||
performance.
|
|
||||||
|
|
||||||
To allow access from a cgroup to the css_sets (and hence tasks)
|
To allow access from a cgroup to the css_sets (and hence tasks)
|
||||||
that comprise it, a set of cg_cgroup_link objects form a lattice;
|
that comprise it, a set of cg_cgroup_link objects form a lattice;
|
||||||
|
|
|
@ -142,7 +142,7 @@ into the rest of the kernel, none in performance critical paths:
|
||||||
- in fork and exit, to attach and detach a task from its cpuset.
|
- in fork and exit, to attach and detach a task from its cpuset.
|
||||||
- in sched_setaffinity, to mask the requested CPUs by what's
|
- in sched_setaffinity, to mask the requested CPUs by what's
|
||||||
allowed in that tasks cpuset.
|
allowed in that tasks cpuset.
|
||||||
- in sched.c migrate_all_tasks(), to keep migrating tasks within
|
- in sched.c migrate_live_tasks(), to keep migrating tasks within
|
||||||
the CPUs allowed by their cpuset, if possible.
|
the CPUs allowed by their cpuset, if possible.
|
||||||
- in the mbind and set_mempolicy system calls, to mask the requested
|
- in the mbind and set_mempolicy system calls, to mask the requested
|
||||||
Memory Nodes by what's allowed in that tasks cpuset.
|
Memory Nodes by what's allowed in that tasks cpuset.
|
||||||
|
@ -175,6 +175,10 @@ files describing that cpuset:
|
||||||
- mem_exclusive flag: is memory placement exclusive?
|
- mem_exclusive flag: is memory placement exclusive?
|
||||||
- mem_hardwall flag: is memory allocation hardwalled
|
- mem_hardwall flag: is memory allocation hardwalled
|
||||||
- memory_pressure: measure of how much paging pressure in cpuset
|
- memory_pressure: measure of how much paging pressure in cpuset
|
||||||
|
- memory_spread_page flag: if set, spread page cache evenly on allowed nodes
|
||||||
|
- memory_spread_slab flag: if set, spread slab cache evenly on allowed nodes
|
||||||
|
- sched_load_balance flag: if set, load balance within CPUs on that cpuset
|
||||||
|
- sched_relax_domain_level: the searching range when migrating tasks
|
||||||
|
|
||||||
In addition, the root cpuset only has the following file:
|
In addition, the root cpuset only has the following file:
|
||||||
- memory_pressure_enabled flag: compute memory_pressure?
|
- memory_pressure_enabled flag: compute memory_pressure?
|
||||||
|
@ -252,7 +256,7 @@ is causing.
|
||||||
|
|
||||||
This is useful both on tightly managed systems running a wide mix of
|
This is useful both on tightly managed systems running a wide mix of
|
||||||
submitted jobs, which may choose to terminate or re-prioritize jobs that
|
submitted jobs, which may choose to terminate or re-prioritize jobs that
|
||||||
are trying to use more memory than allowed on the nodes assigned them,
|
are trying to use more memory than allowed on the nodes assigned to them,
|
||||||
and with tightly coupled, long running, massively parallel scientific
|
and with tightly coupled, long running, massively parallel scientific
|
||||||
computing jobs that will dramatically fail to meet required performance
|
computing jobs that will dramatically fail to meet required performance
|
||||||
goals if they start to use more memory than allowed to them.
|
goals if they start to use more memory than allowed to them.
|
||||||
|
@ -485,17 +489,22 @@ of CPUs allowed to a cpuset having 'sched_load_balance' enabled.
|
||||||
The internal kernel cpuset to scheduler interface passes from the
|
The internal kernel cpuset to scheduler interface passes from the
|
||||||
cpuset code to the scheduler code a partition of the load balanced
|
cpuset code to the scheduler code a partition of the load balanced
|
||||||
CPUs in the system. This partition is a set of subsets (represented
|
CPUs in the system. This partition is a set of subsets (represented
|
||||||
as an array of cpumask_t) of CPUs, pairwise disjoint, that cover all
|
as an array of struct cpumask) of CPUs, pairwise disjoint, that cover
|
||||||
the CPUs that must be load balanced.
|
all the CPUs that must be load balanced.
|
||||||
|
|
||||||
Whenever the 'sched_load_balance' flag changes, or CPUs come or go
|
The cpuset code builds a new such partition and passes it to the
|
||||||
from a cpuset with this flag enabled, or a cpuset with this flag
|
scheduler sched domain setup code, to have the sched domains rebuilt
|
||||||
enabled is removed, the cpuset code builds a new such partition and
|
as necessary, whenever:
|
||||||
passes it to the scheduler sched domain setup code, to have the sched
|
- the 'sched_load_balance' flag of a cpuset with non-empty CPUs changes,
|
||||||
domains rebuilt as necessary.
|
- or CPUs come or go from a cpuset with this flag enabled,
|
||||||
|
- or 'sched_relax_domain_level' value of a cpuset with non-empty CPUs
|
||||||
|
and with this flag enabled changes,
|
||||||
|
- or a cpuset with non-empty CPUs and with this flag enabled is removed,
|
||||||
|
- or a cpu is offlined/onlined.
|
||||||
|
|
||||||
This partition exactly defines what sched domains the scheduler should
|
This partition exactly defines what sched domains the scheduler should
|
||||||
setup - one sched domain for each element (cpumask_t) in the partition.
|
setup - one sched domain for each element (struct cpumask) in the
|
||||||
|
partition.
|
||||||
|
|
||||||
The scheduler remembers the currently active sched domain partitions.
|
The scheduler remembers the currently active sched domain partitions.
|
||||||
When the scheduler routine partition_sched_domains() is invoked from
|
When the scheduler routine partition_sched_domains() is invoked from
|
||||||
|
@ -559,7 +568,7 @@ domain, the largest value among those is used. Be careful, if one
|
||||||
requests 0 and others are -1 then 0 is used.
|
requests 0 and others are -1 then 0 is used.
|
||||||
|
|
||||||
Note that modifying this file will have both good and bad effects,
|
Note that modifying this file will have both good and bad effects,
|
||||||
and whether it is acceptable or not will be depend on your situation.
|
and whether it is acceptable or not depends on your situation.
|
||||||
Don't modify this file if you are not sure.
|
Don't modify this file if you are not sure.
|
||||||
|
|
||||||
If your situation is:
|
If your situation is:
|
||||||
|
@ -600,19 +609,15 @@ to allocate a page of memory for that task.
|
||||||
|
|
||||||
If a cpuset has its 'cpus' modified, then each task in that cpuset
|
If a cpuset has its 'cpus' modified, then each task in that cpuset
|
||||||
will have its allowed CPU placement changed immediately. Similarly,
|
will have its allowed CPU placement changed immediately. Similarly,
|
||||||
if a tasks pid is written to a cpusets 'tasks' file, in either its
|
if a tasks pid is written to another cpusets 'tasks' file, then its
|
||||||
current cpuset or another cpuset, then its allowed CPU placement is
|
allowed CPU placement is changed immediately. If such a task had been
|
||||||
changed immediately. If such a task had been bound to some subset
|
bound to some subset of its cpuset using the sched_setaffinity() call,
|
||||||
of its cpuset using the sched_setaffinity() call, the task will be
|
the task will be allowed to run on any CPU allowed in its new cpuset,
|
||||||
allowed to run on any CPU allowed in its new cpuset, negating the
|
negating the effect of the prior sched_setaffinity() call.
|
||||||
affect of the prior sched_setaffinity() call.
|
|
||||||
|
|
||||||
In summary, the memory placement of a task whose cpuset is changed is
|
In summary, the memory placement of a task whose cpuset is changed is
|
||||||
updated by the kernel, on the next allocation of a page for that task,
|
updated by the kernel, on the next allocation of a page for that task,
|
||||||
but the processor placement is not updated, until that tasks pid is
|
and the processor placement is updated immediately.
|
||||||
rewritten to the 'tasks' file of its cpuset. This is done to avoid
|
|
||||||
impacting the scheduler code in the kernel with a check for changes
|
|
||||||
in a tasks processor placement.
|
|
||||||
|
|
||||||
Normally, once a page is allocated (given a physical page
|
Normally, once a page is allocated (given a physical page
|
||||||
of main memory) then that page stays on whatever node it
|
of main memory) then that page stays on whatever node it
|
||||||
|
@ -681,10 +686,14 @@ and then start a subshell 'sh' in that cpuset:
|
||||||
# The next line should display '/Charlie'
|
# The next line should display '/Charlie'
|
||||||
cat /proc/self/cpuset
|
cat /proc/self/cpuset
|
||||||
|
|
||||||
In the future, a C library interface to cpusets will likely be
|
There are ways to query or modify cpusets:
|
||||||
available. For now, the only way to query or modify cpusets is
|
- via the cpuset file system directly, using the various cd, mkdir, echo,
|
||||||
via the cpuset file system, using the various cd, mkdir, echo, cat,
|
cat, rmdir commands from the shell, or their equivalent from C.
|
||||||
rmdir commands from the shell, or their equivalent from C.
|
- via the C library libcpuset.
|
||||||
|
- via the C library libcgroup.
|
||||||
|
(http://sourceforge.net/proects/libcg/)
|
||||||
|
- via the python application cset.
|
||||||
|
(http://developer.novell.com/wiki/index.php/Cpuset)
|
||||||
|
|
||||||
The sched_setaffinity calls can also be done at the shell prompt using
|
The sched_setaffinity calls can also be done at the shell prompt using
|
||||||
SGI's runon or Robert Love's taskset. The mbind and set_mempolicy
|
SGI's runon or Robert Love's taskset. The mbind and set_mempolicy
|
||||||
|
@ -756,7 +765,7 @@ mount -t cpuset X /dev/cpuset
|
||||||
|
|
||||||
is equivalent to
|
is equivalent to
|
||||||
|
|
||||||
mount -t cgroup -ocpuset X /dev/cpuset
|
mount -t cgroup -ocpuset,noprefix X /dev/cpuset
|
||||||
echo "/sbin/cpuset_release_agent" > /dev/cpuset/release_agent
|
echo "/sbin/cpuset_release_agent" > /dev/cpuset/release_agent
|
||||||
|
|
||||||
2.2 Adding/removing cpus
|
2.2 Adding/removing cpus
|
||||||
|
|
|
@ -128,8 +128,10 @@ Attributes
|
||||||
~~~~~~~~~~
|
~~~~~~~~~~
|
||||||
struct device_attribute {
|
struct device_attribute {
|
||||||
struct attribute attr;
|
struct attribute attr;
|
||||||
ssize_t (*show)(struct device * dev, char * buf, size_t count, loff_t off);
|
ssize_t (*show)(struct device *dev, struct device_attribute *attr,
|
||||||
ssize_t (*store)(struct device * dev, const char * buf, size_t count, loff_t off);
|
char *buf);
|
||||||
|
ssize_t (*store)(struct device *dev, struct device_attribute *attr,
|
||||||
|
const char *buf, size_t count);
|
||||||
};
|
};
|
||||||
|
|
||||||
Attributes of devices can be exported via drivers using a simple
|
Attributes of devices can be exported via drivers using a simple
|
||||||
|
|
|
@ -2,8 +2,10 @@
|
||||||
sysfs - _The_ filesystem for exporting kernel objects.
|
sysfs - _The_ filesystem for exporting kernel objects.
|
||||||
|
|
||||||
Patrick Mochel <mochel@osdl.org>
|
Patrick Mochel <mochel@osdl.org>
|
||||||
|
Mike Murphy <mamurph@cs.clemson.edu>
|
||||||
|
|
||||||
10 January 2003
|
Revised: 22 February 2009
|
||||||
|
Original: 10 January 2003
|
||||||
|
|
||||||
|
|
||||||
What it is:
|
What it is:
|
||||||
|
@ -64,12 +66,13 @@ An attribute definition is simply:
|
||||||
|
|
||||||
struct attribute {
|
struct attribute {
|
||||||
char * name;
|
char * name;
|
||||||
|
struct module *owner;
|
||||||
mode_t mode;
|
mode_t mode;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
int sysfs_create_file(struct kobject * kobj, struct attribute * attr);
|
int sysfs_create_file(struct kobject * kobj, const struct attribute * attr);
|
||||||
void sysfs_remove_file(struct kobject * kobj, struct attribute * attr);
|
void sysfs_remove_file(struct kobject * kobj, const struct attribute * attr);
|
||||||
|
|
||||||
|
|
||||||
A bare attribute contains no means to read or write the value of the
|
A bare attribute contains no means to read or write the value of the
|
||||||
|
@ -81,8 +84,10 @@ For example, the driver model defines struct device_attribute like:
|
||||||
|
|
||||||
struct device_attribute {
|
struct device_attribute {
|
||||||
struct attribute attr;
|
struct attribute attr;
|
||||||
ssize_t (*show)(struct device * dev, char * buf);
|
ssize_t (*show)(struct device *dev, struct device_attribute *attr,
|
||||||
ssize_t (*store)(struct device * dev, const char * buf);
|
char *buf);
|
||||||
|
ssize_t (*store)(struct device *dev, struct device_attribute *attr,
|
||||||
|
const char *buf, size_t count);
|
||||||
};
|
};
|
||||||
|
|
||||||
int device_create_file(struct device *, struct device_attribute *);
|
int device_create_file(struct device *, struct device_attribute *);
|
||||||
|
@ -91,11 +96,7 @@ void device_remove_file(struct device *, struct device_attribute *);
|
||||||
It also defines this helper for defining device attributes:
|
It also defines this helper for defining device attributes:
|
||||||
|
|
||||||
#define DEVICE_ATTR(_name, _mode, _show, _store) \
|
#define DEVICE_ATTR(_name, _mode, _show, _store) \
|
||||||
struct device_attribute dev_attr_##_name = { \
|
struct device_attribute dev_attr_##_name = __ATTR(_name, _mode, _show, _store)
|
||||||
.attr = {.name = __stringify(_name) , .mode = _mode }, \
|
|
||||||
.show = _show, \
|
|
||||||
.store = _store, \
|
|
||||||
};
|
|
||||||
|
|
||||||
For example, declaring
|
For example, declaring
|
||||||
|
|
||||||
|
@ -107,9 +108,9 @@ static struct device_attribute dev_attr_foo = {
|
||||||
.attr = {
|
.attr = {
|
||||||
.name = "foo",
|
.name = "foo",
|
||||||
.mode = S_IWUSR | S_IRUGO,
|
.mode = S_IWUSR | S_IRUGO,
|
||||||
},
|
|
||||||
.show = show_foo,
|
.show = show_foo,
|
||||||
.store = store_foo,
|
.store = store_foo,
|
||||||
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
@ -161,10 +162,12 @@ To read or write attributes, show() or store() methods must be
|
||||||
specified when declaring the attribute. The method types should be as
|
specified when declaring the attribute. The method types should be as
|
||||||
simple as those defined for device attributes:
|
simple as those defined for device attributes:
|
||||||
|
|
||||||
ssize_t (*show)(struct device * dev, char * buf);
|
ssize_t (*show)(struct device * dev, struct device_attribute * attr,
|
||||||
ssize_t (*store)(struct device * dev, const char * buf);
|
char * buf);
|
||||||
|
ssize_t (*store)(struct device * dev, struct device_attribute * attr,
|
||||||
|
const char * buf);
|
||||||
|
|
||||||
IOW, they should take only an object and a buffer as parameters.
|
IOW, they should take only an object, an attribute, and a buffer as parameters.
|
||||||
|
|
||||||
|
|
||||||
sysfs allocates a buffer of size (PAGE_SIZE) and passes it to the
|
sysfs allocates a buffer of size (PAGE_SIZE) and passes it to the
|
||||||
|
@ -300,13 +303,15 @@ Structure:
|
||||||
|
|
||||||
struct device_attribute {
|
struct device_attribute {
|
||||||
struct attribute attr;
|
struct attribute attr;
|
||||||
ssize_t (*show)(struct device * dev, char * buf);
|
ssize_t (*show)(struct device *dev, struct device_attribute *attr,
|
||||||
ssize_t (*store)(struct device * dev, const char * buf);
|
char *buf);
|
||||||
|
ssize_t (*store)(struct device *dev, struct device_attribute *attr,
|
||||||
|
const char *buf, size_t count);
|
||||||
};
|
};
|
||||||
|
|
||||||
Declaring:
|
Declaring:
|
||||||
|
|
||||||
DEVICE_ATTR(_name, _str, _mode, _show, _store);
|
DEVICE_ATTR(_name, _mode, _show, _store);
|
||||||
|
|
||||||
Creation/Removal:
|
Creation/Removal:
|
||||||
|
|
||||||
|
@ -342,7 +347,8 @@ Structure:
|
||||||
struct driver_attribute {
|
struct driver_attribute {
|
||||||
struct attribute attr;
|
struct attribute attr;
|
||||||
ssize_t (*show)(struct device_driver *, char * buf);
|
ssize_t (*show)(struct device_driver *, char * buf);
|
||||||
ssize_t (*store)(struct device_driver *, const char * buf);
|
ssize_t (*store)(struct device_driver *, const char * buf,
|
||||||
|
size_t count);
|
||||||
};
|
};
|
||||||
|
|
||||||
Declaring:
|
Declaring:
|
||||||
|
|
|
@ -0,0 +1,101 @@
|
||||||
|
/* Disk protection for HP machines.
|
||||||
|
*
|
||||||
|
* Copyright 2008 Eric Piel
|
||||||
|
* Copyright 2009 Pavel Machek <pavel@suse.cz>
|
||||||
|
*
|
||||||
|
* GPLv2.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
#include <fcntl.h>
|
||||||
|
#include <sys/stat.h>
|
||||||
|
#include <sys/types.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <stdint.h>
|
||||||
|
#include <errno.h>
|
||||||
|
#include <signal.h>
|
||||||
|
|
||||||
|
void write_int(char *path, int i)
|
||||||
|
{
|
||||||
|
char buf[1024];
|
||||||
|
int fd = open(path, O_RDWR);
|
||||||
|
if (fd < 0) {
|
||||||
|
perror("open");
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
sprintf(buf, "%d", i);
|
||||||
|
if (write(fd, buf, strlen(buf)) != strlen(buf)) {
|
||||||
|
perror("write");
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
close(fd);
|
||||||
|
}
|
||||||
|
|
||||||
|
void set_led(int on)
|
||||||
|
{
|
||||||
|
write_int("/sys/class/leds/hp::hddprotect/brightness", on);
|
||||||
|
}
|
||||||
|
|
||||||
|
void protect(int seconds)
|
||||||
|
{
|
||||||
|
write_int("/sys/block/sda/device/unload_heads", seconds*1000);
|
||||||
|
}
|
||||||
|
|
||||||
|
int on_ac(void)
|
||||||
|
{
|
||||||
|
// /sys/class/power_supply/AC0/online
|
||||||
|
}
|
||||||
|
|
||||||
|
int lid_open(void)
|
||||||
|
{
|
||||||
|
// /proc/acpi/button/lid/LID/state
|
||||||
|
}
|
||||||
|
|
||||||
|
void ignore_me(void)
|
||||||
|
{
|
||||||
|
protect(0);
|
||||||
|
set_led(0);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
int main(int argc, char* argv[])
|
||||||
|
{
|
||||||
|
int fd, ret;
|
||||||
|
|
||||||
|
fd = open("/dev/freefall", O_RDONLY);
|
||||||
|
if (fd < 0) {
|
||||||
|
perror("open");
|
||||||
|
return EXIT_FAILURE;
|
||||||
|
}
|
||||||
|
|
||||||
|
signal(SIGALRM, ignore_me);
|
||||||
|
|
||||||
|
for (;;) {
|
||||||
|
unsigned char count;
|
||||||
|
|
||||||
|
ret = read(fd, &count, sizeof(count));
|
||||||
|
alarm(0);
|
||||||
|
if ((ret == -1) && (errno == EINTR)) {
|
||||||
|
/* Alarm expired, time to unpark the heads */
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (ret != sizeof(count)) {
|
||||||
|
perror("read");
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
protect(21);
|
||||||
|
set_led(1);
|
||||||
|
if (1 || on_ac() || lid_open()) {
|
||||||
|
alarm(2);
|
||||||
|
} else {
|
||||||
|
alarm(20);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
close(fd);
|
||||||
|
return EXIT_SUCCESS;
|
||||||
|
}
|
|
@ -33,6 +33,14 @@ rate - reports the sampling rate of the accelerometer device in HZ
|
||||||
This driver also provides an absolute input class device, allowing
|
This driver also provides an absolute input class device, allowing
|
||||||
the laptop to act as a pinball machine-esque joystick.
|
the laptop to act as a pinball machine-esque joystick.
|
||||||
|
|
||||||
|
Another feature of the driver is misc device called "freefall" that
|
||||||
|
acts similar to /dev/rtc and reacts on free-fall interrupts received
|
||||||
|
from the device. It supports blocking operations, poll/select and
|
||||||
|
fasync operation modes. You must read 1 bytes from the device. The
|
||||||
|
result is number of free-fall interrupts since the last successful
|
||||||
|
read (or 255 if number of interrupts would not fit).
|
||||||
|
|
||||||
|
|
||||||
Axes orientation
|
Axes orientation
|
||||||
----------------
|
----------------
|
||||||
|
|
||||||
|
|
|
@ -114,7 +114,7 @@ In addition, the following text indicates that the option:
|
||||||
Parameters denoted with BOOT are actually interpreted by the boot
|
Parameters denoted with BOOT are actually interpreted by the boot
|
||||||
loader, and have no meaning to the kernel directly.
|
loader, and have no meaning to the kernel directly.
|
||||||
Do not modify the syntax of boot loader parameters without extreme
|
Do not modify the syntax of boot loader parameters without extreme
|
||||||
need or coordination with <Documentation/x86/i386/boot.txt>.
|
need or coordination with <Documentation/x86/boot.txt>.
|
||||||
|
|
||||||
There are also arch-specific kernel-parameters not documented here.
|
There are also arch-specific kernel-parameters not documented here.
|
||||||
See for example <Documentation/x86/x86_64/boot-options.txt>.
|
See for example <Documentation/x86/x86_64/boot-options.txt>.
|
||||||
|
@ -134,7 +134,7 @@ and is between 256 and 4096 characters. It is defined in the file
|
||||||
|
|
||||||
acpi= [HW,ACPI,X86-64,i386]
|
acpi= [HW,ACPI,X86-64,i386]
|
||||||
Advanced Configuration and Power Interface
|
Advanced Configuration and Power Interface
|
||||||
Format: { force | off | ht | strict | noirq }
|
Format: { force | off | ht | strict | noirq | rsdt }
|
||||||
force -- enable ACPI if default was off
|
force -- enable ACPI if default was off
|
||||||
off -- disable ACPI if default was on
|
off -- disable ACPI if default was on
|
||||||
noirq -- do not use ACPI for IRQ routing
|
noirq -- do not use ACPI for IRQ routing
|
||||||
|
@ -1308,8 +1308,13 @@ and is between 256 and 4096 characters. It is defined in the file
|
||||||
|
|
||||||
memtest= [KNL,X86] Enable memtest
|
memtest= [KNL,X86] Enable memtest
|
||||||
Format: <integer>
|
Format: <integer>
|
||||||
range: 0,4 : pattern number
|
|
||||||
default : 0 <disable>
|
default : 0 <disable>
|
||||||
|
Specifies the number of memtest passes to be
|
||||||
|
performed. Each pass selects another test
|
||||||
|
pattern from a given set of patterns. Memtest
|
||||||
|
fills the memory with this pattern, validates
|
||||||
|
memory contents and reserves bad memory
|
||||||
|
regions that are detected.
|
||||||
|
|
||||||
meye.*= [HW] Set MotionEye Camera parameters
|
meye.*= [HW] Set MotionEye Camera parameters
|
||||||
See Documentation/video4linux/meye.txt.
|
See Documentation/video4linux/meye.txt.
|
||||||
|
@ -2449,7 +2454,7 @@ and is between 256 and 4096 characters. It is defined in the file
|
||||||
See Documentation/fb/modedb.txt.
|
See Documentation/fb/modedb.txt.
|
||||||
|
|
||||||
vga= [BOOT,X86-32] Select a particular video mode
|
vga= [BOOT,X86-32] Select a particular video mode
|
||||||
See Documentation/x86/i386/boot.txt and
|
See Documentation/x86/boot.txt and
|
||||||
Documentation/svga.txt.
|
Documentation/svga.txt.
|
||||||
Use vga=ask for menu.
|
Use vga=ask for menu.
|
||||||
This is actually a boot loader parameter; the value is
|
This is actually a boot loader parameter; the value is
|
||||||
|
|
|
@ -78,12 +78,10 @@ to view your kernel log and look for "mmiotrace has lost events" warning. If
|
||||||
events were lost, the trace is incomplete. You should enlarge the buffers and
|
events were lost, the trace is incomplete. You should enlarge the buffers and
|
||||||
try again. Buffers are enlarged by first seeing how large the current buffers
|
try again. Buffers are enlarged by first seeing how large the current buffers
|
||||||
are:
|
are:
|
||||||
$ cat /debug/tracing/trace_entries
|
$ cat /debug/tracing/buffer_size_kb
|
||||||
gives you a number. Approximately double this number and write it back, for
|
gives you a number. Approximately double this number and write it back, for
|
||||||
instance:
|
instance:
|
||||||
$ echo 0 > /debug/tracing/tracing_enabled
|
$ echo 128000 > /debug/tracing/buffer_size_kb
|
||||||
$ echo 128000 > /debug/tracing/trace_entries
|
|
||||||
$ echo 1 > /debug/tracing/tracing_enabled
|
|
||||||
Then start again from the top.
|
Then start again from the top.
|
||||||
|
|
||||||
If you are doing a trace for a driver project, e.g. Nouveau, you should also
|
If you are doing a trace for a driver project, e.g. Nouveau, you should also
|
||||||
|
|
29
MAINTAINERS
29
MAINTAINERS
|
@ -692,6 +692,13 @@ M: kernel@wantstofly.org
|
||||||
L: linux-arm-kernel@lists.arm.linux.org.uk (subscribers-only)
|
L: linux-arm-kernel@lists.arm.linux.org.uk (subscribers-only)
|
||||||
S: Maintained
|
S: Maintained
|
||||||
|
|
||||||
|
ARM/NUVOTON W90X900 ARM ARCHITECTURE
|
||||||
|
P: Wan ZongShun
|
||||||
|
M: mcuos.com@gmail.com
|
||||||
|
L: linux-arm-kernel@lists.arm.linux.org.uk (subscribers-only)
|
||||||
|
W: http://www.mcuos.com
|
||||||
|
S: Maintained
|
||||||
|
|
||||||
ARPD SUPPORT
|
ARPD SUPPORT
|
||||||
P: Jonathan Layes
|
P: Jonathan Layes
|
||||||
L: netdev@vger.kernel.org
|
L: netdev@vger.kernel.org
|
||||||
|
@ -1905,10 +1912,10 @@ W: http://gigaset307x.sourceforge.net/
|
||||||
S: Maintained
|
S: Maintained
|
||||||
|
|
||||||
HARD DRIVE ACTIVE PROTECTION SYSTEM (HDAPS) DRIVER
|
HARD DRIVE ACTIVE PROTECTION SYSTEM (HDAPS) DRIVER
|
||||||
P: Robert Love
|
P: Frank Seidel
|
||||||
M: rlove@rlove.org
|
M: frank@f-seidel.de
|
||||||
M: linux-kernel@vger.kernel.org
|
L: lm-sensors@lm-sensors.org
|
||||||
W: http://www.kernel.org/pub/linux/kernel/people/rml/hdaps/
|
W: http://www.kernel.org/pub/linux/kernel/people/fseidel/hdaps/
|
||||||
S: Maintained
|
S: Maintained
|
||||||
|
|
||||||
GSPCA FINEPIX SUBDRIVER
|
GSPCA FINEPIX SUBDRIVER
|
||||||
|
@ -2001,7 +2008,7 @@ S: Maintained
|
||||||
|
|
||||||
HIBERNATION (aka Software Suspend, aka swsusp)
|
HIBERNATION (aka Software Suspend, aka swsusp)
|
||||||
P: Pavel Machek
|
P: Pavel Machek
|
||||||
M: pavel@suse.cz
|
M: pavel@ucw.cz
|
||||||
P: Rafael J. Wysocki
|
P: Rafael J. Wysocki
|
||||||
M: rjw@sisk.pl
|
M: rjw@sisk.pl
|
||||||
L: linux-pm@lists.linux-foundation.org
|
L: linux-pm@lists.linux-foundation.org
|
||||||
|
@ -3327,8 +3334,8 @@ P: Jeremy Fitzhardinge
|
||||||
M: jeremy@xensource.com
|
M: jeremy@xensource.com
|
||||||
P: Chris Wright
|
P: Chris Wright
|
||||||
M: chrisw@sous-sol.org
|
M: chrisw@sous-sol.org
|
||||||
P: Zachary Amsden
|
P: Alok Kataria
|
||||||
M: zach@vmware.com
|
M: akataria@vmware.com
|
||||||
P: Rusty Russell
|
P: Rusty Russell
|
||||||
M: rusty@rustcorp.com.au
|
M: rusty@rustcorp.com.au
|
||||||
L: virtualization@lists.osdl.org
|
L: virtualization@lists.osdl.org
|
||||||
|
@ -4172,7 +4179,7 @@ SUSPEND TO RAM
|
||||||
P: Len Brown
|
P: Len Brown
|
||||||
M: len.brown@intel.com
|
M: len.brown@intel.com
|
||||||
P: Pavel Machek
|
P: Pavel Machek
|
||||||
M: pavel@suse.cz
|
M: pavel@ucw.cz
|
||||||
P: Rafael J. Wysocki
|
P: Rafael J. Wysocki
|
||||||
M: rjw@sisk.pl
|
M: rjw@sisk.pl
|
||||||
L: linux-pm@lists.linux-foundation.org
|
L: linux-pm@lists.linux-foundation.org
|
||||||
|
@ -4924,11 +4931,11 @@ L: zd1211-devs@lists.sourceforge.net (subscribers-only)
|
||||||
S: Maintained
|
S: Maintained
|
||||||
|
|
||||||
ZR36067 VIDEO FOR LINUX DRIVER
|
ZR36067 VIDEO FOR LINUX DRIVER
|
||||||
P: Ronald Bultje
|
|
||||||
M: rbultje@ronald.bitfreak.net
|
|
||||||
L: mjpeg-users@lists.sourceforge.net
|
L: mjpeg-users@lists.sourceforge.net
|
||||||
|
L: linux-media@vger.kernel.org
|
||||||
W: http://mjpeg.sourceforge.net/driver-zoran/
|
W: http://mjpeg.sourceforge.net/driver-zoran/
|
||||||
S: Maintained
|
T: Mercurial http://linuxtv.org/hg/v4l-dvb
|
||||||
|
S: Odd Fixes
|
||||||
|
|
||||||
ZS DECSTATION Z85C30 SERIAL DRIVER
|
ZS DECSTATION Z85C30 SERIAL DRIVER
|
||||||
P: Maciej W. Rozycki
|
P: Maciej W. Rozycki
|
||||||
|
|
4
Makefile
4
Makefile
|
@ -1,7 +1,7 @@
|
||||||
VERSION = 2
|
VERSION = 2
|
||||||
PATCHLEVEL = 6
|
PATCHLEVEL = 6
|
||||||
SUBLEVEL = 29
|
SUBLEVEL = 29
|
||||||
EXTRAVERSION = -rc5
|
EXTRAVERSION = -rc6
|
||||||
NAME = Erotic Pickled Herring
|
NAME = Erotic Pickled Herring
|
||||||
|
|
||||||
# *DOCUMENTATION*
|
# *DOCUMENTATION*
|
||||||
|
@ -389,6 +389,7 @@ PHONY += outputmakefile
|
||||||
# output directory.
|
# output directory.
|
||||||
outputmakefile:
|
outputmakefile:
|
||||||
ifneq ($(KBUILD_SRC),)
|
ifneq ($(KBUILD_SRC),)
|
||||||
|
$(Q)ln -fsn $(srctree) source
|
||||||
$(Q)$(CONFIG_SHELL) $(srctree)/scripts/mkmakefile \
|
$(Q)$(CONFIG_SHELL) $(srctree)/scripts/mkmakefile \
|
||||||
$(srctree) $(objtree) $(VERSION) $(PATCHLEVEL)
|
$(srctree) $(objtree) $(VERSION) $(PATCHLEVEL)
|
||||||
endif
|
endif
|
||||||
|
@ -947,7 +948,6 @@ ifneq ($(KBUILD_SRC),)
|
||||||
mkdir -p include2; \
|
mkdir -p include2; \
|
||||||
ln -fsn $(srctree)/include/asm-$(SRCARCH) include2/asm; \
|
ln -fsn $(srctree)/include/asm-$(SRCARCH) include2/asm; \
|
||||||
fi
|
fi
|
||||||
ln -fsn $(srctree) source
|
|
||||||
endif
|
endif
|
||||||
|
|
||||||
# prepare2 creates a makefile if using a separate output directory
|
# prepare2 creates a makefile if using a separate output directory
|
||||||
|
|
2
README
2
README
|
@ -188,7 +188,7 @@ CONFIGURING the kernel:
|
||||||
values to random values.
|
values to random values.
|
||||||
|
|
||||||
You can find more information on using the Linux kernel config tools
|
You can find more information on using the Linux kernel config tools
|
||||||
in Documentation/kbuild/make-configs.txt.
|
in Documentation/kbuild/kconfig.txt.
|
||||||
|
|
||||||
NOTES on "make config":
|
NOTES on "make config":
|
||||||
- having unnecessary drivers will make the kernel bigger, and can
|
- having unnecessary drivers will make the kernel bigger, and can
|
||||||
|
|
|
@ -93,8 +93,8 @@ common_shutdown_1(void *generic_ptr)
|
||||||
if (cpuid != boot_cpuid) {
|
if (cpuid != boot_cpuid) {
|
||||||
flags |= 0x00040000UL; /* "remain halted" */
|
flags |= 0x00040000UL; /* "remain halted" */
|
||||||
*pflags = flags;
|
*pflags = flags;
|
||||||
cpu_clear(cpuid, cpu_present_map);
|
set_cpu_present(cpuid, false);
|
||||||
cpu_clear(cpuid, cpu_possible_map);
|
set_cpu_possible(cpuid, false);
|
||||||
halt();
|
halt();
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
@ -120,8 +120,8 @@ common_shutdown_1(void *generic_ptr)
|
||||||
|
|
||||||
#ifdef CONFIG_SMP
|
#ifdef CONFIG_SMP
|
||||||
/* Wait for the secondaries to halt. */
|
/* Wait for the secondaries to halt. */
|
||||||
cpu_clear(boot_cpuid, cpu_present_map);
|
set_cpu_present(boot_cpuid, false);
|
||||||
cpu_clear(boot_cpuid, cpu_possible_map);
|
set_cpu_possible(boot_cpuid, false);
|
||||||
while (cpus_weight(cpu_present_map))
|
while (cpus_weight(cpu_present_map))
|
||||||
barrier();
|
barrier();
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -120,12 +120,12 @@ void __cpuinit
|
||||||
smp_callin(void)
|
smp_callin(void)
|
||||||
{
|
{
|
||||||
int cpuid = hard_smp_processor_id();
|
int cpuid = hard_smp_processor_id();
|
||||||
cpumask_t mask = cpu_online_map;
|
|
||||||
|
|
||||||
if (cpu_test_and_set(cpuid, mask)) {
|
if (cpu_online(cpuid)) {
|
||||||
printk("??, cpu 0x%x already present??\n", cpuid);
|
printk("??, cpu 0x%x already present??\n", cpuid);
|
||||||
BUG();
|
BUG();
|
||||||
}
|
}
|
||||||
|
set_cpu_online(cpuid, true);
|
||||||
|
|
||||||
/* Turn on machine checks. */
|
/* Turn on machine checks. */
|
||||||
wrmces(7);
|
wrmces(7);
|
||||||
|
@ -436,8 +436,8 @@ setup_smp(void)
|
||||||
((char *)cpubase + i*hwrpb->processor_size);
|
((char *)cpubase + i*hwrpb->processor_size);
|
||||||
if ((cpu->flags & 0x1cc) == 0x1cc) {
|
if ((cpu->flags & 0x1cc) == 0x1cc) {
|
||||||
smp_num_probed++;
|
smp_num_probed++;
|
||||||
cpu_set(i, cpu_possible_map);
|
set_cpu_possible(i, true);
|
||||||
cpu_set(i, cpu_present_map);
|
set_cpu_present(i, true);
|
||||||
cpu->pal_revision = boot_cpu_palrev;
|
cpu->pal_revision = boot_cpu_palrev;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -470,8 +470,8 @@ smp_prepare_cpus(unsigned int max_cpus)
|
||||||
|
|
||||||
/* Nothing to do on a UP box, or when told not to. */
|
/* Nothing to do on a UP box, or when told not to. */
|
||||||
if (smp_num_probed == 1 || max_cpus == 0) {
|
if (smp_num_probed == 1 || max_cpus == 0) {
|
||||||
cpu_possible_map = cpumask_of_cpu(boot_cpuid);
|
init_cpu_possible(cpumask_of(boot_cpuid));
|
||||||
cpu_present_map = cpumask_of_cpu(boot_cpuid);
|
init_cpu_present(cpumask_of(boot_cpuid));
|
||||||
printk(KERN_INFO "SMP mode deactivated.\n");
|
printk(KERN_INFO "SMP mode deactivated.\n");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
|
@ -608,7 +608,7 @@ CONFIG_WATCHDOG_NOWAYOUT=y
|
||||||
# Watchdog Device Drivers
|
# Watchdog Device Drivers
|
||||||
#
|
#
|
||||||
# CONFIG_SOFT_WATCHDOG is not set
|
# CONFIG_SOFT_WATCHDOG is not set
|
||||||
CONFIG_AT91SAM9_WATCHDOG=y
|
CONFIG_AT91SAM9X_WATCHDOG=y
|
||||||
|
|
||||||
#
|
#
|
||||||
# USB-based Watchdog Cards
|
# USB-based Watchdog Cards
|
||||||
|
|
|
@ -700,7 +700,7 @@ CONFIG_WATCHDOG_NOWAYOUT=y
|
||||||
# Watchdog Device Drivers
|
# Watchdog Device Drivers
|
||||||
#
|
#
|
||||||
# CONFIG_SOFT_WATCHDOG is not set
|
# CONFIG_SOFT_WATCHDOG is not set
|
||||||
CONFIG_AT91SAM9_WATCHDOG=y
|
CONFIG_AT91SAM9X_WATCHDOG=y
|
||||||
|
|
||||||
#
|
#
|
||||||
# USB-based Watchdog Cards
|
# USB-based Watchdog Cards
|
||||||
|
|
|
@ -710,7 +710,7 @@ CONFIG_WATCHDOG_NOWAYOUT=y
|
||||||
# Watchdog Device Drivers
|
# Watchdog Device Drivers
|
||||||
#
|
#
|
||||||
# CONFIG_SOFT_WATCHDOG is not set
|
# CONFIG_SOFT_WATCHDOG is not set
|
||||||
CONFIG_AT91SAM9_WATCHDOG=y
|
CONFIG_AT91SAM9X_WATCHDOG=y
|
||||||
|
|
||||||
#
|
#
|
||||||
# USB-based Watchdog Cards
|
# USB-based Watchdog Cards
|
||||||
|
|
|
@ -606,7 +606,7 @@ CONFIG_WATCHDOG_NOWAYOUT=y
|
||||||
# Watchdog Device Drivers
|
# Watchdog Device Drivers
|
||||||
#
|
#
|
||||||
# CONFIG_SOFT_WATCHDOG is not set
|
# CONFIG_SOFT_WATCHDOG is not set
|
||||||
CONFIG_AT91SAM9_WATCHDOG=y
|
CONFIG_AT91SAM9X_WATCHDOG=y
|
||||||
|
|
||||||
#
|
#
|
||||||
# Sonics Silicon Backplane
|
# Sonics Silicon Backplane
|
||||||
|
|
|
@ -727,7 +727,7 @@ CONFIG_WATCHDOG_NOWAYOUT=y
|
||||||
# Watchdog Device Drivers
|
# Watchdog Device Drivers
|
||||||
#
|
#
|
||||||
# CONFIG_SOFT_WATCHDOG is not set
|
# CONFIG_SOFT_WATCHDOG is not set
|
||||||
# CONFIG_AT91SAM9_WATCHDOG is not set
|
# CONFIG_AT91SAM9X_WATCHDOG is not set
|
||||||
|
|
||||||
#
|
#
|
||||||
# USB-based Watchdog Cards
|
# USB-based Watchdog Cards
|
||||||
|
|
|
@ -74,9 +74,9 @@ EXPORT_SYMBOL(elf_set_personality);
|
||||||
*/
|
*/
|
||||||
int arm_elf_read_implies_exec(const struct elf32_hdr *x, int executable_stack)
|
int arm_elf_read_implies_exec(const struct elf32_hdr *x, int executable_stack)
|
||||||
{
|
{
|
||||||
if (executable_stack != EXSTACK_ENABLE_X)
|
if (executable_stack != EXSTACK_DISABLE_X)
|
||||||
return 1;
|
return 1;
|
||||||
if (cpu_architecture() <= CPU_ARCH_ARMv6)
|
if (cpu_architecture() < CPU_ARCH_ARMv6)
|
||||||
return 1;
|
return 1;
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
|
@ -697,7 +697,7 @@ static void __init at91_add_device_rtt(void)
|
||||||
* Watchdog
|
* Watchdog
|
||||||
* -------------------------------------------------------------------- */
|
* -------------------------------------------------------------------- */
|
||||||
|
|
||||||
#if defined(CONFIG_AT91SAM9_WATCHDOG) || defined(CONFIG_AT91SAM9_WATCHDOG_MODULE)
|
#if defined(CONFIG_AT91SAM9X_WATCHDOG) || defined(CONFIG_AT91SAM9X_WATCHDOG_MODULE)
|
||||||
static struct platform_device at91cap9_wdt_device = {
|
static struct platform_device at91cap9_wdt_device = {
|
||||||
.name = "at91_wdt",
|
.name = "at91_wdt",
|
||||||
.id = -1,
|
.id = -1,
|
||||||
|
|
|
@ -643,7 +643,7 @@ static void __init at91_add_device_rtt(void)
|
||||||
* Watchdog
|
* Watchdog
|
||||||
* -------------------------------------------------------------------- */
|
* -------------------------------------------------------------------- */
|
||||||
|
|
||||||
#if defined(CONFIG_AT91SAM9_WATCHDOG) || defined(CONFIG_AT91SAM9_WATCHDOG_MODULE)
|
#if defined(CONFIG_AT91SAM9X_WATCHDOG) || defined(CONFIG_AT91SAM9X_WATCHDOG_MODULE)
|
||||||
static struct platform_device at91sam9260_wdt_device = {
|
static struct platform_device at91sam9260_wdt_device = {
|
||||||
.name = "at91_wdt",
|
.name = "at91_wdt",
|
||||||
.id = -1,
|
.id = -1,
|
||||||
|
|
|
@ -621,7 +621,7 @@ static void __init at91_add_device_rtt(void)
|
||||||
* Watchdog
|
* Watchdog
|
||||||
* -------------------------------------------------------------------- */
|
* -------------------------------------------------------------------- */
|
||||||
|
|
||||||
#if defined(CONFIG_AT91SAM9_WATCHDOG) || defined(CONFIG_AT91SAM9_WATCHDOG_MODULE)
|
#if defined(CONFIG_AT91SAM9X_WATCHDOG) || defined(CONFIG_AT91SAM9X_WATCHDOG_MODULE)
|
||||||
static struct platform_device at91sam9261_wdt_device = {
|
static struct platform_device at91sam9261_wdt_device = {
|
||||||
.name = "at91_wdt",
|
.name = "at91_wdt",
|
||||||
.id = -1,
|
.id = -1,
|
||||||
|
|
|
@ -854,7 +854,7 @@ static void __init at91_add_device_rtt(void)
|
||||||
* Watchdog
|
* Watchdog
|
||||||
* -------------------------------------------------------------------- */
|
* -------------------------------------------------------------------- */
|
||||||
|
|
||||||
#if defined(CONFIG_AT91SAM9_WATCHDOG) || defined(CONFIG_AT91SAM9_WATCHDOG_MODULE)
|
#if defined(CONFIG_AT91SAM9X_WATCHDOG) || defined(CONFIG_AT91SAM9X_WATCHDOG_MODULE)
|
||||||
static struct platform_device at91sam9263_wdt_device = {
|
static struct platform_device at91sam9263_wdt_device = {
|
||||||
.name = "at91_wdt",
|
.name = "at91_wdt",
|
||||||
.id = -1,
|
.id = -1,
|
||||||
|
|
|
@ -609,7 +609,7 @@ static void __init at91_add_device_rtt(void)
|
||||||
* Watchdog
|
* Watchdog
|
||||||
* -------------------------------------------------------------------- */
|
* -------------------------------------------------------------------- */
|
||||||
|
|
||||||
#if defined(CONFIG_AT91SAM9_WATCHDOG) || defined(CONFIG_AT91SAM9_WATCHDOG_MODULE)
|
#if defined(CONFIG_AT91SAM9X_WATCHDOG) || defined(CONFIG_AT91SAM9X_WATCHDOG_MODULE)
|
||||||
static struct platform_device at91sam9rl_wdt_device = {
|
static struct platform_device at91sam9rl_wdt_device = {
|
||||||
.name = "at91_wdt",
|
.name = "at91_wdt",
|
||||||
.id = -1,
|
.id = -1,
|
||||||
|
|
|
@ -490,7 +490,8 @@ postcore_initcall(at91_gpio_debugfs_init);
|
||||||
|
|
||||||
/*--------------------------------------------------------------------------*/
|
/*--------------------------------------------------------------------------*/
|
||||||
|
|
||||||
/* This lock class tells lockdep that GPIO irqs are in a different
|
/*
|
||||||
|
* This lock class tells lockdep that GPIO irqs are in a different
|
||||||
* category than their parents, so it won't report false recursion.
|
* category than their parents, so it won't report false recursion.
|
||||||
*/
|
*/
|
||||||
static struct lock_class_key gpio_lock_class;
|
static struct lock_class_key gpio_lock_class;
|
||||||
|
@ -509,9 +510,6 @@ void __init at91_gpio_irq_setup(void)
|
||||||
unsigned id = this->id;
|
unsigned id = this->id;
|
||||||
unsigned i;
|
unsigned i;
|
||||||
|
|
||||||
/* enable PIO controller's clock */
|
|
||||||
clk_enable(this->clock);
|
|
||||||
|
|
||||||
__raw_writel(~0, this->regbase + PIO_IDR);
|
__raw_writel(~0, this->regbase + PIO_IDR);
|
||||||
|
|
||||||
for (i = 0, pin = this->chipbase; i < 32; i++, pin++) {
|
for (i = 0, pin = this->chipbase; i < 32; i++, pin++) {
|
||||||
|
@ -556,7 +554,14 @@ void __init at91_gpio_init(struct at91_gpio_bank *data, int nr_banks)
|
||||||
data->chipbase = PIN_BASE + i * 32;
|
data->chipbase = PIN_BASE + i * 32;
|
||||||
data->regbase = data->offset + (void __iomem *)AT91_VA_BASE_SYS;
|
data->regbase = data->offset + (void __iomem *)AT91_VA_BASE_SYS;
|
||||||
|
|
||||||
/* AT91SAM9263_ID_PIOCDE groups PIOC, PIOD, PIOE */
|
/* enable PIO controller's clock */
|
||||||
|
clk_enable(data->clock);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Some processors share peripheral ID between multiple GPIO banks.
|
||||||
|
* SAM9263 (PIOC, PIOD, PIOE)
|
||||||
|
* CAP9 (PIOA, PIOB, PIOC, PIOD)
|
||||||
|
*/
|
||||||
if (last && last->id == data->id)
|
if (last && last->id == data->id)
|
||||||
last->next = data;
|
last->next = data;
|
||||||
}
|
}
|
||||||
|
|
|
@ -93,6 +93,7 @@ struct atmel_nand_data {
|
||||||
u8 enable_pin; /* chip enable */
|
u8 enable_pin; /* chip enable */
|
||||||
u8 det_pin; /* card detect */
|
u8 det_pin; /* card detect */
|
||||||
u8 rdy_pin; /* ready/busy */
|
u8 rdy_pin; /* ready/busy */
|
||||||
|
u8 rdy_pin_active_low; /* rdy_pin value is inverted */
|
||||||
u8 ale; /* address line number connected to ALE */
|
u8 ale; /* address line number connected to ALE */
|
||||||
u8 cle; /* address line number connected to CLE */
|
u8 cle; /* address line number connected to CLE */
|
||||||
u8 bus_width_16; /* buswidth is 16 bit */
|
u8 bus_width_16; /* buswidth is 16 bit */
|
||||||
|
|
|
@ -1,3 +0,0 @@
|
||||||
/*
|
|
||||||
* arch/arm/mach-ep93xx/include/mach/gesbc9312.h
|
|
||||||
*/
|
|
|
@ -10,7 +10,6 @@
|
||||||
|
|
||||||
#include "platform.h"
|
#include "platform.h"
|
||||||
|
|
||||||
#include "gesbc9312.h"
|
|
||||||
#include "ts72xx.h"
|
#include "ts72xx.h"
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -42,7 +42,7 @@ void __init kirkwood_init_irq(void)
|
||||||
writel(0, GPIO_EDGE_CAUSE(32));
|
writel(0, GPIO_EDGE_CAUSE(32));
|
||||||
|
|
||||||
for (i = IRQ_KIRKWOOD_GPIO_START; i < NR_IRQS; i++) {
|
for (i = IRQ_KIRKWOOD_GPIO_START; i < NR_IRQS; i++) {
|
||||||
set_irq_chip(i, &orion_gpio_irq_level_chip);
|
set_irq_chip(i, &orion_gpio_irq_chip);
|
||||||
set_irq_handler(i, handle_level_irq);
|
set_irq_handler(i, handle_level_irq);
|
||||||
irq_desc[i].status |= IRQ_LEVEL;
|
irq_desc[i].status |= IRQ_LEVEL;
|
||||||
set_irq_flags(i, IRQF_VALID);
|
set_irq_flags(i, IRQF_VALID);
|
||||||
|
|
|
@ -40,7 +40,7 @@ void __init mv78xx0_init_irq(void)
|
||||||
writel(0, GPIO_EDGE_CAUSE(0));
|
writel(0, GPIO_EDGE_CAUSE(0));
|
||||||
|
|
||||||
for (i = IRQ_MV78XX0_GPIO_START; i < NR_IRQS; i++) {
|
for (i = IRQ_MV78XX0_GPIO_START; i < NR_IRQS; i++) {
|
||||||
set_irq_chip(i, &orion_gpio_irq_level_chip);
|
set_irq_chip(i, &orion_gpio_irq_chip);
|
||||||
set_irq_handler(i, handle_level_irq);
|
set_irq_handler(i, handle_level_irq);
|
||||||
irq_desc[i].status |= IRQ_LEVEL;
|
irq_desc[i].status |= IRQ_LEVEL;
|
||||||
set_irq_flags(i, IRQF_VALID);
|
set_irq_flags(i, IRQF_VALID);
|
||||||
|
|
|
@ -565,7 +565,7 @@ u32 omap2_clksel_to_divisor(struct clk *clk, u32 field_val)
|
||||||
*
|
*
|
||||||
* Given a struct clk of a rate-selectable clksel clock, and a clock divisor,
|
* Given a struct clk of a rate-selectable clksel clock, and a clock divisor,
|
||||||
* find the corresponding register field value. The return register value is
|
* find the corresponding register field value. The return register value is
|
||||||
* the value before left-shifting. Returns 0xffffffff on error
|
* the value before left-shifting. Returns ~0 on error
|
||||||
*/
|
*/
|
||||||
u32 omap2_divisor_to_clksel(struct clk *clk, u32 div)
|
u32 omap2_divisor_to_clksel(struct clk *clk, u32 div)
|
||||||
{
|
{
|
||||||
|
@ -577,7 +577,7 @@ u32 omap2_divisor_to_clksel(struct clk *clk, u32 div)
|
||||||
|
|
||||||
clks = omap2_get_clksel_by_parent(clk, clk->parent);
|
clks = omap2_get_clksel_by_parent(clk, clk->parent);
|
||||||
if (clks == NULL)
|
if (clks == NULL)
|
||||||
return 0;
|
return ~0;
|
||||||
|
|
||||||
for (clkr = clks->rates; clkr->div; clkr++) {
|
for (clkr = clks->rates; clkr->div; clkr++) {
|
||||||
if ((clkr->flags & cpu_mask) && (clkr->div == div))
|
if ((clkr->flags & cpu_mask) && (clkr->div == div))
|
||||||
|
@ -588,7 +588,7 @@ u32 omap2_divisor_to_clksel(struct clk *clk, u32 div)
|
||||||
printk(KERN_ERR "clock: Could not find divisor %d for "
|
printk(KERN_ERR "clock: Could not find divisor %d for "
|
||||||
"clock %s parent %s\n", div, clk->name,
|
"clock %s parent %s\n", div, clk->name,
|
||||||
clk->parent->name);
|
clk->parent->name);
|
||||||
return 0;
|
return ~0;
|
||||||
}
|
}
|
||||||
|
|
||||||
return clkr->val;
|
return clkr->val;
|
||||||
|
@ -708,7 +708,7 @@ static u32 omap2_clksel_get_src_field(void __iomem **src_addr,
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
for (clkr = clks->rates; clkr->div; clkr++) {
|
for (clkr = clks->rates; clkr->div; clkr++) {
|
||||||
if (clkr->flags & (cpu_mask | DEFAULT_RATE))
|
if (clkr->flags & cpu_mask && clkr->flags & DEFAULT_RATE)
|
||||||
break; /* Found the default rate for this platform */
|
break; /* Found the default rate for this platform */
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -746,7 +746,7 @@ int omap2_clk_set_parent(struct clk *clk, struct clk *new_parent)
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
|
|
||||||
if (clk->usecount > 0)
|
if (clk->usecount > 0)
|
||||||
_omap2_clk_disable(clk);
|
omap2_clk_disable(clk);
|
||||||
|
|
||||||
/* Set new source value (previous dividers if any in effect) */
|
/* Set new source value (previous dividers if any in effect) */
|
||||||
reg_val = __raw_readl(src_addr) & ~field_mask;
|
reg_val = __raw_readl(src_addr) & ~field_mask;
|
||||||
|
@ -759,11 +759,11 @@ int omap2_clk_set_parent(struct clk *clk, struct clk *new_parent)
|
||||||
wmb();
|
wmb();
|
||||||
}
|
}
|
||||||
|
|
||||||
if (clk->usecount > 0)
|
|
||||||
_omap2_clk_enable(clk);
|
|
||||||
|
|
||||||
clk->parent = new_parent;
|
clk->parent = new_parent;
|
||||||
|
|
||||||
|
if (clk->usecount > 0)
|
||||||
|
omap2_clk_enable(clk);
|
||||||
|
|
||||||
/* CLKSEL clocks follow their parents' rates, divided by a divisor */
|
/* CLKSEL clocks follow their parents' rates, divided by a divisor */
|
||||||
clk->rate = new_parent->rate;
|
clk->rate = new_parent->rate;
|
||||||
|
|
||||||
|
|
|
@ -44,7 +44,7 @@ void __init orion5x_init_irq(void)
|
||||||
* User can use set_type() if he wants to use edge types handlers.
|
* User can use set_type() if he wants to use edge types handlers.
|
||||||
*/
|
*/
|
||||||
for (i = IRQ_ORION5X_GPIO_START; i < NR_IRQS; i++) {
|
for (i = IRQ_ORION5X_GPIO_START; i < NR_IRQS; i++) {
|
||||||
set_irq_chip(i, &orion_gpio_irq_level_chip);
|
set_irq_chip(i, &orion_gpio_irq_chip);
|
||||||
set_irq_handler(i, handle_level_irq);
|
set_irq_handler(i, handle_level_irq);
|
||||||
irq_desc[i].status |= IRQ_LEVEL;
|
irq_desc[i].status |= IRQ_LEVEL;
|
||||||
set_irq_flags(i, IRQF_VALID);
|
set_irq_flags(i, IRQF_VALID);
|
||||||
|
|
|
@ -19,6 +19,7 @@
|
||||||
#include <linux/serial_8250.h>
|
#include <linux/serial_8250.h>
|
||||||
#include <linux/ata_platform.h>
|
#include <linux/ata_platform.h>
|
||||||
#include <linux/io.h>
|
#include <linux/io.h>
|
||||||
|
#include <linux/i2c.h>
|
||||||
|
|
||||||
#include <asm/elf.h>
|
#include <asm/elf.h>
|
||||||
#include <asm/mach-types.h>
|
#include <asm/mach-types.h>
|
||||||
|
@ -201,8 +202,13 @@ static struct platform_device *devs[] __initdata = {
|
||||||
&pata_device,
|
&pata_device,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
static struct i2c_board_info i2c_rtc = {
|
||||||
|
I2C_BOARD_INFO("pcf8583", 0x50)
|
||||||
|
};
|
||||||
|
|
||||||
static int __init rpc_init(void)
|
static int __init rpc_init(void)
|
||||||
{
|
{
|
||||||
|
i2c_register_board_info(0, &i2c_rtc, 1);
|
||||||
return platform_add_devices(devs, ARRAY_SIZE(devs));
|
return platform_add_devices(devs, ARRAY_SIZE(devs));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -693,7 +693,8 @@ static void __init sanity_check_meminfo(void)
|
||||||
* Check whether this memory bank would entirely overlap
|
* Check whether this memory bank would entirely overlap
|
||||||
* the vmalloc area.
|
* the vmalloc area.
|
||||||
*/
|
*/
|
||||||
if (__va(bank->start) >= VMALLOC_MIN) {
|
if (__va(bank->start) >= VMALLOC_MIN ||
|
||||||
|
__va(bank->start) < PAGE_OFFSET) {
|
||||||
printk(KERN_NOTICE "Ignoring RAM at %.8lx-%.8lx "
|
printk(KERN_NOTICE "Ignoring RAM at %.8lx-%.8lx "
|
||||||
"(vmalloc region overlap).\n",
|
"(vmalloc region overlap).\n",
|
||||||
bank->start, bank->start + bank->size - 1);
|
bank->start, bank->start + bank->size - 1);
|
||||||
|
|
|
@ -265,51 +265,36 @@ EXPORT_SYMBOL(orion_gpio_set_blink);
|
||||||
* polarity LEVEL mask
|
* polarity LEVEL mask
|
||||||
*
|
*
|
||||||
****************************************************************************/
|
****************************************************************************/
|
||||||
static void gpio_irq_edge_ack(u32 irq)
|
|
||||||
{
|
|
||||||
int pin = irq_to_gpio(irq);
|
|
||||||
|
|
||||||
|
static void gpio_irq_ack(u32 irq)
|
||||||
|
{
|
||||||
|
int type = irq_desc[irq].status & IRQ_TYPE_SENSE_MASK;
|
||||||
|
if (type & (IRQ_TYPE_EDGE_RISING | IRQ_TYPE_EDGE_FALLING)) {
|
||||||
|
int pin = irq_to_gpio(irq);
|
||||||
writel(~(1 << (pin & 31)), GPIO_EDGE_CAUSE(pin));
|
writel(~(1 << (pin & 31)), GPIO_EDGE_CAUSE(pin));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void gpio_irq_edge_mask(u32 irq)
|
static void gpio_irq_mask(u32 irq)
|
||||||
{
|
{
|
||||||
int pin = irq_to_gpio(irq);
|
int pin = irq_to_gpio(irq);
|
||||||
u32 u;
|
int type = irq_desc[irq].status & IRQ_TYPE_SENSE_MASK;
|
||||||
|
u32 reg = (type & (IRQ_TYPE_EDGE_RISING | IRQ_TYPE_EDGE_FALLING)) ?
|
||||||
u = readl(GPIO_EDGE_MASK(pin));
|
GPIO_EDGE_MASK(pin) : GPIO_LEVEL_MASK(pin);
|
||||||
|
u32 u = readl(reg);
|
||||||
u &= ~(1 << (pin & 31));
|
u &= ~(1 << (pin & 31));
|
||||||
writel(u, GPIO_EDGE_MASK(pin));
|
writel(u, reg);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void gpio_irq_edge_unmask(u32 irq)
|
static void gpio_irq_unmask(u32 irq)
|
||||||
{
|
{
|
||||||
int pin = irq_to_gpio(irq);
|
int pin = irq_to_gpio(irq);
|
||||||
u32 u;
|
int type = irq_desc[irq].status & IRQ_TYPE_SENSE_MASK;
|
||||||
|
u32 reg = (type & (IRQ_TYPE_EDGE_RISING | IRQ_TYPE_EDGE_FALLING)) ?
|
||||||
u = readl(GPIO_EDGE_MASK(pin));
|
GPIO_EDGE_MASK(pin) : GPIO_LEVEL_MASK(pin);
|
||||||
|
u32 u = readl(reg);
|
||||||
u |= 1 << (pin & 31);
|
u |= 1 << (pin & 31);
|
||||||
writel(u, GPIO_EDGE_MASK(pin));
|
writel(u, reg);
|
||||||
}
|
|
||||||
|
|
||||||
static void gpio_irq_level_mask(u32 irq)
|
|
||||||
{
|
|
||||||
int pin = irq_to_gpio(irq);
|
|
||||||
u32 u;
|
|
||||||
|
|
||||||
u = readl(GPIO_LEVEL_MASK(pin));
|
|
||||||
u &= ~(1 << (pin & 31));
|
|
||||||
writel(u, GPIO_LEVEL_MASK(pin));
|
|
||||||
}
|
|
||||||
|
|
||||||
static void gpio_irq_level_unmask(u32 irq)
|
|
||||||
{
|
|
||||||
int pin = irq_to_gpio(irq);
|
|
||||||
u32 u;
|
|
||||||
|
|
||||||
u = readl(GPIO_LEVEL_MASK(pin));
|
|
||||||
u |= 1 << (pin & 31);
|
|
||||||
writel(u, GPIO_LEVEL_MASK(pin));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static int gpio_irq_set_type(u32 irq, u32 type)
|
static int gpio_irq_set_type(u32 irq, u32 type)
|
||||||
|
@ -331,9 +316,9 @@ static int gpio_irq_set_type(u32 irq, u32 type)
|
||||||
* Set edge/level type.
|
* Set edge/level type.
|
||||||
*/
|
*/
|
||||||
if (type & (IRQ_TYPE_EDGE_RISING | IRQ_TYPE_EDGE_FALLING)) {
|
if (type & (IRQ_TYPE_EDGE_RISING | IRQ_TYPE_EDGE_FALLING)) {
|
||||||
desc->chip = &orion_gpio_irq_edge_chip;
|
desc->handle_irq = handle_edge_irq;
|
||||||
} else if (type & (IRQ_TYPE_LEVEL_HIGH | IRQ_TYPE_LEVEL_LOW)) {
|
} else if (type & (IRQ_TYPE_LEVEL_HIGH | IRQ_TYPE_LEVEL_LOW)) {
|
||||||
desc->chip = &orion_gpio_irq_level_chip;
|
desc->handle_irq = handle_level_irq;
|
||||||
} else {
|
} else {
|
||||||
printk(KERN_ERR "failed to set irq=%d (type=%d)\n", irq, type);
|
printk(KERN_ERR "failed to set irq=%d (type=%d)\n", irq, type);
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
|
@ -371,19 +356,11 @@ static int gpio_irq_set_type(u32 irq, u32 type)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
struct irq_chip orion_gpio_irq_edge_chip = {
|
struct irq_chip orion_gpio_irq_chip = {
|
||||||
.name = "orion_gpio_irq_edge",
|
.name = "orion_gpio",
|
||||||
.ack = gpio_irq_edge_ack,
|
.ack = gpio_irq_ack,
|
||||||
.mask = gpio_irq_edge_mask,
|
.mask = gpio_irq_mask,
|
||||||
.unmask = gpio_irq_edge_unmask,
|
.unmask = gpio_irq_unmask,
|
||||||
.set_type = gpio_irq_set_type,
|
|
||||||
};
|
|
||||||
|
|
||||||
struct irq_chip orion_gpio_irq_level_chip = {
|
|
||||||
.name = "orion_gpio_irq_level",
|
|
||||||
.mask = gpio_irq_level_mask,
|
|
||||||
.mask_ack = gpio_irq_level_mask,
|
|
||||||
.unmask = gpio_irq_level_unmask,
|
|
||||||
.set_type = gpio_irq_set_type,
|
.set_type = gpio_irq_set_type,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -31,8 +31,7 @@ void orion_gpio_set_blink(unsigned pin, int blink);
|
||||||
/*
|
/*
|
||||||
* GPIO interrupt handling.
|
* GPIO interrupt handling.
|
||||||
*/
|
*/
|
||||||
extern struct irq_chip orion_gpio_irq_edge_chip;
|
extern struct irq_chip orion_gpio_irq_chip;
|
||||||
extern struct irq_chip orion_gpio_irq_level_chip;
|
|
||||||
void orion_gpio_irq_handler(int irqoff);
|
void orion_gpio_irq_handler(int irqoff);
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -116,6 +116,7 @@ struct atmel_nand_data {
|
||||||
int enable_pin; /* chip enable */
|
int enable_pin; /* chip enable */
|
||||||
int det_pin; /* card detect */
|
int det_pin; /* card detect */
|
||||||
int rdy_pin; /* ready/busy */
|
int rdy_pin; /* ready/busy */
|
||||||
|
u8 rdy_pin_active_low; /* rdy_pin value is inverted */
|
||||||
u8 ale; /* address line number connected to ALE */
|
u8 ale; /* address line number connected to ALE */
|
||||||
u8 cle; /* address line number connected to CLE */
|
u8 cle; /* address line number connected to CLE */
|
||||||
u8 bus_width_16; /* buswidth is 16 bit */
|
u8 bus_width_16; /* buswidth is 16 bit */
|
||||||
|
|
|
@ -221,7 +221,11 @@ config IA64_HP_SIM
|
||||||
|
|
||||||
config IA64_XEN_GUEST
|
config IA64_XEN_GUEST
|
||||||
bool "Xen guest"
|
bool "Xen guest"
|
||||||
|
select SWIOTLB
|
||||||
depends on XEN
|
depends on XEN
|
||||||
|
help
|
||||||
|
Build a kernel that runs on Xen guest domain. At this moment only
|
||||||
|
16KB page size in supported.
|
||||||
|
|
||||||
endchoice
|
endchoice
|
||||||
|
|
||||||
|
@ -479,8 +483,7 @@ config HOLES_IN_ZONE
|
||||||
default y if VIRTUAL_MEM_MAP
|
default y if VIRTUAL_MEM_MAP
|
||||||
|
|
||||||
config HAVE_ARCH_EARLY_PFN_TO_NID
|
config HAVE_ARCH_EARLY_PFN_TO_NID
|
||||||
def_bool y
|
def_bool NUMA && SPARSEMEM
|
||||||
depends on NEED_MULTIPLE_NODES
|
|
||||||
|
|
||||||
config HAVE_ARCH_NODEDATA_EXTENSION
|
config HAVE_ARCH_NODEDATA_EXTENSION
|
||||||
def_bool y
|
def_bool y
|
||||||
|
|
File diff suppressed because it is too large
Load Diff
|
@ -24,6 +24,10 @@
|
||||||
#include <linux/types.h>
|
#include <linux/types.h>
|
||||||
#include <linux/ioctl.h>
|
#include <linux/ioctl.h>
|
||||||
|
|
||||||
|
/* Select x86 specific features in <linux/kvm.h> */
|
||||||
|
#define __KVM_HAVE_IOAPIC
|
||||||
|
#define __KVM_HAVE_DEVICE_ASSIGNMENT
|
||||||
|
|
||||||
/* Architectural interrupt line count. */
|
/* Architectural interrupt line count. */
|
||||||
#define KVM_NR_INTERRUPTS 256
|
#define KVM_NR_INTERRUPTS 256
|
||||||
|
|
||||||
|
|
|
@ -31,10 +31,6 @@ static inline int pfn_to_nid(unsigned long pfn)
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef CONFIG_HAVE_ARCH_EARLY_PFN_TO_NID
|
|
||||||
extern int early_pfn_to_nid(unsigned long pfn);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef CONFIG_IA64_DIG /* DIG systems are small */
|
#ifdef CONFIG_IA64_DIG /* DIG systems are small */
|
||||||
# define MAX_PHYSNODE_ID 8
|
# define MAX_PHYSNODE_ID 8
|
||||||
# define NR_NODE_MEMBLKS (MAX_NUMNODES * 8)
|
# define NR_NODE_MEMBLKS (MAX_NUMNODES * 8)
|
||||||
|
|
|
@ -39,7 +39,7 @@
|
||||||
/* BTE status register only supports 16 bits for length field */
|
/* BTE status register only supports 16 bits for length field */
|
||||||
#define BTE_LEN_BITS (16)
|
#define BTE_LEN_BITS (16)
|
||||||
#define BTE_LEN_MASK ((1 << BTE_LEN_BITS) - 1)
|
#define BTE_LEN_MASK ((1 << BTE_LEN_BITS) - 1)
|
||||||
#define BTE_MAX_XFER ((1 << BTE_LEN_BITS) * L1_CACHE_BYTES)
|
#define BTE_MAX_XFER (BTE_LEN_MASK << L1_CACHE_SHIFT)
|
||||||
|
|
||||||
|
|
||||||
/* Define hardware */
|
/* Define hardware */
|
||||||
|
|
|
@ -736,14 +736,15 @@ int __cpu_disable(void)
|
||||||
return -EBUSY;
|
return -EBUSY;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
cpu_clear(cpu, cpu_online_map);
|
||||||
|
|
||||||
if (migrate_platform_irqs(cpu)) {
|
if (migrate_platform_irqs(cpu)) {
|
||||||
cpu_set(cpu, cpu_online_map);
|
cpu_set(cpu, cpu_online_map);
|
||||||
return (-EBUSY);
|
return -EBUSY;
|
||||||
}
|
}
|
||||||
|
|
||||||
remove_siblinginfo(cpu);
|
remove_siblinginfo(cpu);
|
||||||
fixup_irqs();
|
fixup_irqs();
|
||||||
cpu_clear(cpu, cpu_online_map);
|
|
||||||
local_flush_tlb_all();
|
local_flush_tlb_all();
|
||||||
cpu_clear(cpu, cpu_callin_map);
|
cpu_clear(cpu, cpu_callin_map);
|
||||||
return 0;
|
return 0;
|
||||||
|
|
|
@ -1337,6 +1337,10 @@ static void kvm_release_vm_pages(struct kvm *kvm)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void kvm_arch_sync_events(struct kvm *kvm)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
void kvm_arch_destroy_vm(struct kvm *kvm)
|
void kvm_arch_destroy_vm(struct kvm *kvm)
|
||||||
{
|
{
|
||||||
kvm_iommu_unmap_guest(kvm);
|
kvm_iommu_unmap_guest(kvm);
|
||||||
|
|
|
@ -455,12 +455,17 @@ fpswa_ret_t vmm_fp_emulate(int fp_fault, void *bundle, unsigned long *ipsr,
|
||||||
if (!vmm_fpswa_interface)
|
if (!vmm_fpswa_interface)
|
||||||
return (fpswa_ret_t) {-1, 0, 0, 0};
|
return (fpswa_ret_t) {-1, 0, 0, 0};
|
||||||
|
|
||||||
/*
|
|
||||||
* Just let fpswa driver to use hardware fp registers.
|
|
||||||
* No fp register is valid in memory.
|
|
||||||
*/
|
|
||||||
memset(&fp_state, 0, sizeof(fp_state_t));
|
memset(&fp_state, 0, sizeof(fp_state_t));
|
||||||
|
|
||||||
|
/*
|
||||||
|
* compute fp_state. only FP registers f6 - f11 are used by the
|
||||||
|
* vmm, so set those bits in the mask and set the low volatile
|
||||||
|
* pointer to point to these registers.
|
||||||
|
*/
|
||||||
|
fp_state.bitmask_low64 = 0xfc0; /* bit6..bit11 */
|
||||||
|
|
||||||
|
fp_state.fp_state_low_volatile = (fp_state_low_volatile_t *) ®s->f6;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* unsigned long (*EFI_FPSWA) (
|
* unsigned long (*EFI_FPSWA) (
|
||||||
* unsigned long trap_type,
|
* unsigned long trap_type,
|
||||||
|
@ -545,10 +550,6 @@ void reflect_interruption(u64 ifa, u64 isr, u64 iim,
|
||||||
status = vmm_handle_fpu_swa(0, regs, isr);
|
status = vmm_handle_fpu_swa(0, regs, isr);
|
||||||
if (!status)
|
if (!status)
|
||||||
return ;
|
return ;
|
||||||
else if (-EAGAIN == status) {
|
|
||||||
vcpu_decrement_iip(vcpu);
|
|
||||||
return ;
|
|
||||||
}
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -58,7 +58,7 @@ paddr_to_nid(unsigned long paddr)
|
||||||
* SPARSEMEM to allocate the SPARSEMEM sectionmap on the NUMA node where
|
* SPARSEMEM to allocate the SPARSEMEM sectionmap on the NUMA node where
|
||||||
* the section resides.
|
* the section resides.
|
||||||
*/
|
*/
|
||||||
int early_pfn_to_nid(unsigned long pfn)
|
int __meminit __early_pfn_to_nid(unsigned long pfn)
|
||||||
{
|
{
|
||||||
int i, section = pfn >> PFN_SECTION_SHIFT, ssec, esec;
|
int i, section = pfn >> PFN_SECTION_SHIFT, ssec, esec;
|
||||||
|
|
||||||
|
@ -70,7 +70,7 @@ int early_pfn_to_nid(unsigned long pfn)
|
||||||
return node_memblk[i].nid;
|
return node_memblk[i].nid;
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef CONFIG_MEMORY_HOTPLUG
|
#ifdef CONFIG_MEMORY_HOTPLUG
|
||||||
|
|
|
@ -97,9 +97,10 @@ bte_result_t bte_copy(u64 src, u64 dest, u64 len, u64 mode, void *notification)
|
||||||
return BTE_SUCCESS;
|
return BTE_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
BUG_ON((len & L1_CACHE_MASK) ||
|
BUG_ON(len & L1_CACHE_MASK);
|
||||||
(src & L1_CACHE_MASK) || (dest & L1_CACHE_MASK));
|
BUG_ON(src & L1_CACHE_MASK);
|
||||||
BUG_ON(!(len < ((BTE_LEN_MASK + 1) << L1_CACHE_SHIFT)));
|
BUG_ON(dest & L1_CACHE_MASK);
|
||||||
|
BUG_ON(len > BTE_MAX_XFER);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Start with interface corresponding to cpu number
|
* Start with interface corresponding to cpu number
|
||||||
|
|
|
@ -8,8 +8,7 @@ config XEN
|
||||||
depends on PARAVIRT && MCKINLEY && IA64_PAGE_SIZE_16KB && EXPERIMENTAL
|
depends on PARAVIRT && MCKINLEY && IA64_PAGE_SIZE_16KB && EXPERIMENTAL
|
||||||
select XEN_XENCOMM
|
select XEN_XENCOMM
|
||||||
select NO_IDLE_HZ
|
select NO_IDLE_HZ
|
||||||
|
# followings are required to save/restore.
|
||||||
# those are required to save/restore.
|
|
||||||
select ARCH_SUSPEND_POSSIBLE
|
select ARCH_SUSPEND_POSSIBLE
|
||||||
select SUSPEND
|
select SUSPEND
|
||||||
select PM_SLEEP
|
select PM_SLEEP
|
||||||
|
|
|
@ -153,7 +153,7 @@ xen_post_smp_prepare_boot_cpu(void)
|
||||||
xen_setup_vcpu_info_placement();
|
xen_setup_vcpu_info_placement();
|
||||||
}
|
}
|
||||||
|
|
||||||
static const struct pv_init_ops xen_init_ops __initdata = {
|
static const struct pv_init_ops xen_init_ops __initconst = {
|
||||||
.banner = xen_banner,
|
.banner = xen_banner,
|
||||||
|
|
||||||
.reserve_memory = xen_reserve_memory,
|
.reserve_memory = xen_reserve_memory,
|
||||||
|
@ -337,7 +337,7 @@ xen_iosapic_write(char __iomem *iosapic, unsigned int reg, u32 val)
|
||||||
HYPERVISOR_physdev_op(PHYSDEVOP_apic_write, &apic_op);
|
HYPERVISOR_physdev_op(PHYSDEVOP_apic_write, &apic_op);
|
||||||
}
|
}
|
||||||
|
|
||||||
static const struct pv_iosapic_ops xen_iosapic_ops __initdata = {
|
static const struct pv_iosapic_ops xen_iosapic_ops __initconst = {
|
||||||
.pcat_compat_init = xen_pcat_compat_init,
|
.pcat_compat_init = xen_pcat_compat_init,
|
||||||
.__get_irq_chip = xen_iosapic_get_irq_chip,
|
.__get_irq_chip = xen_iosapic_get_irq_chip,
|
||||||
|
|
||||||
|
|
|
@ -187,8 +187,8 @@ __asm__ (__ALIGN_STR "\n" \
|
||||||
" jbra ret_from_interrupt\n" \
|
" jbra ret_from_interrupt\n" \
|
||||||
: : "i" (&kstat_cpu(0).irqs[n+8]), "i" (&irq_handler[n+8]), \
|
: : "i" (&kstat_cpu(0).irqs[n+8]), "i" (&irq_handler[n+8]), \
|
||||||
"n" (PT_OFF_SR), "n" (n), \
|
"n" (PT_OFF_SR), "n" (n), \
|
||||||
"i" (n & 8 ? (n & 16 ? &tt_mfp.int_mk_a : &mfp.int_mk_a) \
|
"i" (n & 8 ? (n & 16 ? &tt_mfp.int_mk_a : &st_mfp.int_mk_a) \
|
||||||
: (n & 16 ? &tt_mfp.int_mk_b : &mfp.int_mk_b)), \
|
: (n & 16 ? &tt_mfp.int_mk_b : &st_mfp.int_mk_b)), \
|
||||||
"m" (preempt_count()), "di" (HARDIRQ_OFFSET) \
|
"m" (preempt_count()), "di" (HARDIRQ_OFFSET) \
|
||||||
); \
|
); \
|
||||||
for (;;); /* fake noreturn */ \
|
for (;;); /* fake noreturn */ \
|
||||||
|
@ -366,14 +366,14 @@ void __init atari_init_IRQ(void)
|
||||||
/* Initialize the MFP(s) */
|
/* Initialize the MFP(s) */
|
||||||
|
|
||||||
#ifdef ATARI_USE_SOFTWARE_EOI
|
#ifdef ATARI_USE_SOFTWARE_EOI
|
||||||
mfp.vec_adr = 0x48; /* Software EOI-Mode */
|
st_mfp.vec_adr = 0x48; /* Software EOI-Mode */
|
||||||
#else
|
#else
|
||||||
mfp.vec_adr = 0x40; /* Automatic EOI-Mode */
|
st_mfp.vec_adr = 0x40; /* Automatic EOI-Mode */
|
||||||
#endif
|
#endif
|
||||||
mfp.int_en_a = 0x00; /* turn off MFP-Ints */
|
st_mfp.int_en_a = 0x00; /* turn off MFP-Ints */
|
||||||
mfp.int_en_b = 0x00;
|
st_mfp.int_en_b = 0x00;
|
||||||
mfp.int_mk_a = 0xff; /* no Masking */
|
st_mfp.int_mk_a = 0xff; /* no Masking */
|
||||||
mfp.int_mk_b = 0xff;
|
st_mfp.int_mk_b = 0xff;
|
||||||
|
|
||||||
if (ATARIHW_PRESENT(TT_MFP)) {
|
if (ATARIHW_PRESENT(TT_MFP)) {
|
||||||
#ifdef ATARI_USE_SOFTWARE_EOI
|
#ifdef ATARI_USE_SOFTWARE_EOI
|
||||||
|
|
|
@ -609,10 +609,10 @@ int atari_keyb_init(void)
|
||||||
ACIA_RHTID : 0);
|
ACIA_RHTID : 0);
|
||||||
|
|
||||||
/* make sure the interrupt line is up */
|
/* make sure the interrupt line is up */
|
||||||
} while ((mfp.par_dt_reg & 0x10) == 0);
|
} while ((st_mfp.par_dt_reg & 0x10) == 0);
|
||||||
|
|
||||||
/* enable ACIA Interrupts */
|
/* enable ACIA Interrupts */
|
||||||
mfp.active_edge &= ~0x10;
|
st_mfp.active_edge &= ~0x10;
|
||||||
atari_turnon_irq(IRQ_MFP_ACIA);
|
atari_turnon_irq(IRQ_MFP_ACIA);
|
||||||
|
|
||||||
ikbd_self_test = 1;
|
ikbd_self_test = 1;
|
||||||
|
|
|
@ -258,7 +258,7 @@ void __init config_atari(void)
|
||||||
printk("STND_SHIFTER ");
|
printk("STND_SHIFTER ");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (hwreg_present(&mfp.par_dt_reg)) {
|
if (hwreg_present(&st_mfp.par_dt_reg)) {
|
||||||
ATARIHW_SET(ST_MFP);
|
ATARIHW_SET(ST_MFP);
|
||||||
printk("ST_MFP ");
|
printk("ST_MFP ");
|
||||||
}
|
}
|
||||||
|
|
|
@ -34,9 +34,9 @@ static struct console atari_console_driver = {
|
||||||
|
|
||||||
static inline void ata_mfp_out(char c)
|
static inline void ata_mfp_out(char c)
|
||||||
{
|
{
|
||||||
while (!(mfp.trn_stat & 0x80)) /* wait for tx buf empty */
|
while (!(st_mfp.trn_stat & 0x80)) /* wait for tx buf empty */
|
||||||
barrier();
|
barrier();
|
||||||
mfp.usart_dta = c;
|
st_mfp.usart_dta = c;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void atari_mfp_console_write(struct console *co, const char *str,
|
static void atari_mfp_console_write(struct console *co, const char *str,
|
||||||
|
@ -91,7 +91,7 @@ static int ata_par_out(char c)
|
||||||
/* This a some-seconds timeout in case no printer is connected */
|
/* This a some-seconds timeout in case no printer is connected */
|
||||||
unsigned long i = loops_per_jiffy > 1 ? loops_per_jiffy : 10000000/HZ;
|
unsigned long i = loops_per_jiffy > 1 ? loops_per_jiffy : 10000000/HZ;
|
||||||
|
|
||||||
while ((mfp.par_dt_reg & 1) && --i) /* wait for BUSY == L */
|
while ((st_mfp.par_dt_reg & 1) && --i) /* wait for BUSY == L */
|
||||||
;
|
;
|
||||||
if (!i)
|
if (!i)
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -131,9 +131,9 @@ static void atari_par_console_write(struct console *co, const char *str,
|
||||||
#if 0
|
#if 0
|
||||||
int atari_mfp_console_wait_key(struct console *co)
|
int atari_mfp_console_wait_key(struct console *co)
|
||||||
{
|
{
|
||||||
while (!(mfp.rcv_stat & 0x80)) /* wait for rx buf filled */
|
while (!(st_mfp.rcv_stat & 0x80)) /* wait for rx buf filled */
|
||||||
barrier();
|
barrier();
|
||||||
return mfp.usart_dta;
|
return st_mfp.usart_dta;
|
||||||
}
|
}
|
||||||
|
|
||||||
int atari_scc_console_wait_key(struct console *co)
|
int atari_scc_console_wait_key(struct console *co)
|
||||||
|
@ -175,12 +175,12 @@ static void __init atari_init_mfp_port(int cflag)
|
||||||
baud = B9600; /* use default 9600bps for non-implemented rates */
|
baud = B9600; /* use default 9600bps for non-implemented rates */
|
||||||
baud -= B1200; /* baud_table[] starts at 1200bps */
|
baud -= B1200; /* baud_table[] starts at 1200bps */
|
||||||
|
|
||||||
mfp.trn_stat &= ~0x01; /* disable TX */
|
st_mfp.trn_stat &= ~0x01; /* disable TX */
|
||||||
mfp.usart_ctr = parity | csize | 0x88; /* 1:16 clk mode, 1 stop bit */
|
st_mfp.usart_ctr = parity | csize | 0x88; /* 1:16 clk mode, 1 stop bit */
|
||||||
mfp.tim_ct_cd &= 0x70; /* stop timer D */
|
st_mfp.tim_ct_cd &= 0x70; /* stop timer D */
|
||||||
mfp.tim_dt_d = baud_table[baud];
|
st_mfp.tim_dt_d = baud_table[baud];
|
||||||
mfp.tim_ct_cd |= 0x01; /* start timer D, 1:4 */
|
st_mfp.tim_ct_cd |= 0x01; /* start timer D, 1:4 */
|
||||||
mfp.trn_stat |= 0x01; /* enable TX */
|
st_mfp.trn_stat |= 0x01; /* enable TX */
|
||||||
}
|
}
|
||||||
|
|
||||||
#define SCC_WRITE(reg, val) \
|
#define SCC_WRITE(reg, val) \
|
||||||
|
|
|
@ -27,9 +27,9 @@ void __init
|
||||||
atari_sched_init(irq_handler_t timer_routine)
|
atari_sched_init(irq_handler_t timer_routine)
|
||||||
{
|
{
|
||||||
/* set Timer C data Register */
|
/* set Timer C data Register */
|
||||||
mfp.tim_dt_c = INT_TICKS;
|
st_mfp.tim_dt_c = INT_TICKS;
|
||||||
/* start timer C, div = 1:100 */
|
/* start timer C, div = 1:100 */
|
||||||
mfp.tim_ct_cd = (mfp.tim_ct_cd & 15) | 0x60;
|
st_mfp.tim_ct_cd = (st_mfp.tim_ct_cd & 15) | 0x60;
|
||||||
/* install interrupt service routine for MFP Timer C */
|
/* install interrupt service routine for MFP Timer C */
|
||||||
if (request_irq(IRQ_MFP_TIMC, timer_routine, IRQ_TYPE_SLOW,
|
if (request_irq(IRQ_MFP_TIMC, timer_routine, IRQ_TYPE_SLOW,
|
||||||
"timer", timer_routine))
|
"timer", timer_routine))
|
||||||
|
@ -46,11 +46,11 @@ unsigned long atari_gettimeoffset (void)
|
||||||
unsigned long ticks, offset = 0;
|
unsigned long ticks, offset = 0;
|
||||||
|
|
||||||
/* read MFP timer C current value */
|
/* read MFP timer C current value */
|
||||||
ticks = mfp.tim_dt_c;
|
ticks = st_mfp.tim_dt_c;
|
||||||
/* The probability of underflow is less than 2% */
|
/* The probability of underflow is less than 2% */
|
||||||
if (ticks > INT_TICKS - INT_TICKS / 50)
|
if (ticks > INT_TICKS - INT_TICKS / 50)
|
||||||
/* Check for pending timer interrupt */
|
/* Check for pending timer interrupt */
|
||||||
if (mfp.int_pn_b & (1 << 5))
|
if (st_mfp.int_pn_b & (1 << 5))
|
||||||
offset = TICK_SIZE;
|
offset = TICK_SIZE;
|
||||||
|
|
||||||
ticks = INT_TICKS - ticks;
|
ticks = INT_TICKS - ticks;
|
||||||
|
|
|
@ -113,7 +113,7 @@ extern struct atari_hw_present atari_hw_present;
|
||||||
* of nops on various machines. Somebody claimed that the tstb takes 600 ns.
|
* of nops on various machines. Somebody claimed that the tstb takes 600 ns.
|
||||||
*/
|
*/
|
||||||
#define MFPDELAY() \
|
#define MFPDELAY() \
|
||||||
__asm__ __volatile__ ( "tstb %0" : : "m" (mfp.par_dt_reg) : "cc" );
|
__asm__ __volatile__ ( "tstb %0" : : "m" (st_mfp.par_dt_reg) : "cc" );
|
||||||
|
|
||||||
/* Do cache push/invalidate for DMA read/write. This function obeys the
|
/* Do cache push/invalidate for DMA read/write. This function obeys the
|
||||||
* snooping on some machines (Medusa) and processors: The Medusa itself can
|
* snooping on some machines (Medusa) and processors: The Medusa itself can
|
||||||
|
@ -565,7 +565,7 @@ struct MFP
|
||||||
u_char char_dummy23;
|
u_char char_dummy23;
|
||||||
u_char usart_dta;
|
u_char usart_dta;
|
||||||
};
|
};
|
||||||
# define mfp ((*(volatile struct MFP*)MFP_BAS))
|
# define st_mfp ((*(volatile struct MFP*)MFP_BAS))
|
||||||
|
|
||||||
/* TT's second MFP */
|
/* TT's second MFP */
|
||||||
|
|
||||||
|
|
|
@ -113,7 +113,7 @@ static inline int get_mfp_bit( unsigned irq, int type )
|
||||||
{ unsigned char mask, *reg;
|
{ unsigned char mask, *reg;
|
||||||
|
|
||||||
mask = 1 << (irq & 7);
|
mask = 1 << (irq & 7);
|
||||||
reg = (unsigned char *)&mfp.int_en_a + type*4 +
|
reg = (unsigned char *)&st_mfp.int_en_a + type*4 +
|
||||||
((irq & 8) >> 2) + (((irq-8) & 16) << 3);
|
((irq & 8) >> 2) + (((irq-8) & 16) << 3);
|
||||||
return( *reg & mask );
|
return( *reg & mask );
|
||||||
}
|
}
|
||||||
|
@ -123,7 +123,7 @@ static inline void set_mfp_bit( unsigned irq, int type )
|
||||||
{ unsigned char mask, *reg;
|
{ unsigned char mask, *reg;
|
||||||
|
|
||||||
mask = 1 << (irq & 7);
|
mask = 1 << (irq & 7);
|
||||||
reg = (unsigned char *)&mfp.int_en_a + type*4 +
|
reg = (unsigned char *)&st_mfp.int_en_a + type*4 +
|
||||||
((irq & 8) >> 2) + (((irq-8) & 16) << 3);
|
((irq & 8) >> 2) + (((irq-8) & 16) << 3);
|
||||||
__asm__ __volatile__ ( "orb %0,%1"
|
__asm__ __volatile__ ( "orb %0,%1"
|
||||||
: : "di" (mask), "m" (*reg) : "memory" );
|
: : "di" (mask), "m" (*reg) : "memory" );
|
||||||
|
@ -134,7 +134,7 @@ static inline void clear_mfp_bit( unsigned irq, int type )
|
||||||
{ unsigned char mask, *reg;
|
{ unsigned char mask, *reg;
|
||||||
|
|
||||||
mask = ~(1 << (irq & 7));
|
mask = ~(1 << (irq & 7));
|
||||||
reg = (unsigned char *)&mfp.int_en_a + type*4 +
|
reg = (unsigned char *)&st_mfp.int_en_a + type*4 +
|
||||||
((irq & 8) >> 2) + (((irq-8) & 16) << 3);
|
((irq & 8) >> 2) + (((irq-8) & 16) << 3);
|
||||||
if (type == MFP_PENDING || type == MFP_SERVICE)
|
if (type == MFP_PENDING || type == MFP_SERVICE)
|
||||||
__asm__ __volatile__ ( "moveb %0,%1"
|
__asm__ __volatile__ ( "moveb %0,%1"
|
||||||
|
|
|
@ -7,6 +7,7 @@ mainmenu "Linux Kernel Configuration"
|
||||||
|
|
||||||
config MN10300
|
config MN10300
|
||||||
def_bool y
|
def_bool y
|
||||||
|
select HAVE_OPROFILE
|
||||||
|
|
||||||
config AM33
|
config AM33
|
||||||
def_bool y
|
def_bool y
|
||||||
|
|
|
@ -173,7 +173,7 @@ static int pci_ampci_write_config_byte(struct pci_bus *bus, unsigned int devfn,
|
||||||
BRIDGEREGB(where) = value;
|
BRIDGEREGB(where) = value;
|
||||||
} else {
|
} else {
|
||||||
if (bus->number == 0 &&
|
if (bus->number == 0 &&
|
||||||
(devfn == PCI_DEVFN(2, 0) && devfn == PCI_DEVFN(3, 0))
|
(devfn == PCI_DEVFN(2, 0) || devfn == PCI_DEVFN(3, 0))
|
||||||
)
|
)
|
||||||
__pcidebug("<= %02x", bus, devfn, where, value);
|
__pcidebug("<= %02x", bus, devfn, where, value);
|
||||||
CONFIG_ADDRESS = CONFIG_CMD(bus, devfn, where);
|
CONFIG_ADDRESS = CONFIG_CMD(bus, devfn, where);
|
||||||
|
|
|
@ -60,7 +60,7 @@
|
||||||
/* It should be preserving the high 48 bits and then specifically */
|
/* It should be preserving the high 48 bits and then specifically */
|
||||||
/* preserving _PAGE_SECONDARY | _PAGE_GROUP_IX */
|
/* preserving _PAGE_SECONDARY | _PAGE_GROUP_IX */
|
||||||
#define _PAGE_CHG_MASK (PAGE_MASK | _PAGE_ACCESSED | _PAGE_DIRTY | \
|
#define _PAGE_CHG_MASK (PAGE_MASK | _PAGE_ACCESSED | _PAGE_DIRTY | \
|
||||||
_PAGE_HPTEFLAGS)
|
_PAGE_HPTEFLAGS | _PAGE_SPECIAL)
|
||||||
|
|
||||||
/* Bits to mask out from a PMD to get to the PTE page */
|
/* Bits to mask out from a PMD to get to the PTE page */
|
||||||
#define PMD_MASKED_BITS 0
|
#define PMD_MASKED_BITS 0
|
||||||
|
|
|
@ -114,7 +114,7 @@ static inline struct subpage_prot_table *pgd_subpage_prot(pgd_t *pgd)
|
||||||
* pgprot changes
|
* pgprot changes
|
||||||
*/
|
*/
|
||||||
#define _PAGE_CHG_MASK (PTE_RPN_MASK | _PAGE_HPTEFLAGS | _PAGE_DIRTY | \
|
#define _PAGE_CHG_MASK (PTE_RPN_MASK | _PAGE_HPTEFLAGS | _PAGE_DIRTY | \
|
||||||
_PAGE_ACCESSED)
|
_PAGE_ACCESSED | _PAGE_SPECIAL)
|
||||||
|
|
||||||
/* Bits to mask out from a PMD to get to the PTE page */
|
/* Bits to mask out from a PMD to get to the PTE page */
|
||||||
#define PMD_MASKED_BITS 0x1ff
|
#define PMD_MASKED_BITS 0x1ff
|
||||||
|
|
|
@ -429,7 +429,8 @@ extern int icache_44x_need_flush;
|
||||||
#define PMD_PAGE_SIZE(pmd) bad_call_to_PMD_PAGE_SIZE()
|
#define PMD_PAGE_SIZE(pmd) bad_call_to_PMD_PAGE_SIZE()
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#define _PAGE_CHG_MASK (PAGE_MASK | _PAGE_ACCESSED | _PAGE_DIRTY)
|
#define _PAGE_CHG_MASK (PAGE_MASK | _PAGE_ACCESSED | _PAGE_DIRTY | \
|
||||||
|
_PAGE_SPECIAL)
|
||||||
|
|
||||||
|
|
||||||
#define PAGE_PROT_BITS (_PAGE_GUARDED | _PAGE_COHERENT | _PAGE_NO_CACHE | \
|
#define PAGE_PROT_BITS (_PAGE_GUARDED | _PAGE_COHERENT | _PAGE_NO_CACHE | \
|
||||||
|
|
|
@ -646,11 +646,16 @@ static int emulate_vsx(unsigned char __user *addr, unsigned int reg,
|
||||||
unsigned int areg, struct pt_regs *regs,
|
unsigned int areg, struct pt_regs *regs,
|
||||||
unsigned int flags, unsigned int length)
|
unsigned int flags, unsigned int length)
|
||||||
{
|
{
|
||||||
char *ptr = (char *) ¤t->thread.TS_FPR(reg);
|
char *ptr;
|
||||||
int ret = 0;
|
int ret = 0;
|
||||||
|
|
||||||
flush_vsx_to_thread(current);
|
flush_vsx_to_thread(current);
|
||||||
|
|
||||||
|
if (reg < 32)
|
||||||
|
ptr = (char *) ¤t->thread.TS_FPR(reg);
|
||||||
|
else
|
||||||
|
ptr = (char *) ¤t->thread.vr[reg - 32];
|
||||||
|
|
||||||
if (flags & ST)
|
if (flags & ST)
|
||||||
ret = __copy_to_user(addr, ptr, length);
|
ret = __copy_to_user(addr, ptr, length);
|
||||||
else {
|
else {
|
||||||
|
|
|
@ -125,6 +125,10 @@ static void kvmppc_free_vcpus(struct kvm *kvm)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void kvm_arch_sync_events(struct kvm *kvm)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
void kvm_arch_destroy_vm(struct kvm *kvm)
|
void kvm_arch_destroy_vm(struct kvm *kvm)
|
||||||
{
|
{
|
||||||
kvmppc_free_vcpus(kvm);
|
kvmppc_free_vcpus(kvm);
|
||||||
|
|
|
@ -19,6 +19,7 @@
|
||||||
#include <linux/notifier.h>
|
#include <linux/notifier.h>
|
||||||
#include <linux/lmb.h>
|
#include <linux/lmb.h>
|
||||||
#include <linux/of.h>
|
#include <linux/of.h>
|
||||||
|
#include <linux/pfn.h>
|
||||||
#include <asm/sparsemem.h>
|
#include <asm/sparsemem.h>
|
||||||
#include <asm/prom.h>
|
#include <asm/prom.h>
|
||||||
#include <asm/system.h>
|
#include <asm/system.h>
|
||||||
|
@ -882,7 +883,7 @@ static void mark_reserved_regions_for_nid(int nid)
|
||||||
unsigned long physbase = lmb.reserved.region[i].base;
|
unsigned long physbase = lmb.reserved.region[i].base;
|
||||||
unsigned long size = lmb.reserved.region[i].size;
|
unsigned long size = lmb.reserved.region[i].size;
|
||||||
unsigned long start_pfn = physbase >> PAGE_SHIFT;
|
unsigned long start_pfn = physbase >> PAGE_SHIFT;
|
||||||
unsigned long end_pfn = ((physbase + size) >> PAGE_SHIFT);
|
unsigned long end_pfn = PFN_UP(physbase + size);
|
||||||
struct node_active_region node_ar;
|
struct node_active_region node_ar;
|
||||||
unsigned long node_end_pfn = node->node_start_pfn +
|
unsigned long node_end_pfn = node->node_start_pfn +
|
||||||
node->node_spanned_pages;
|
node->node_spanned_pages;
|
||||||
|
@ -908,7 +909,7 @@ static void mark_reserved_regions_for_nid(int nid)
|
||||||
*/
|
*/
|
||||||
if (end_pfn > node_ar.end_pfn)
|
if (end_pfn > node_ar.end_pfn)
|
||||||
reserve_size = (node_ar.end_pfn << PAGE_SHIFT)
|
reserve_size = (node_ar.end_pfn << PAGE_SHIFT)
|
||||||
- (start_pfn << PAGE_SHIFT);
|
- physbase;
|
||||||
/*
|
/*
|
||||||
* Only worry about *this* node, others may not
|
* Only worry about *this* node, others may not
|
||||||
* yet have valid NODE_DATA().
|
* yet have valid NODE_DATA().
|
||||||
|
|
|
@ -328,7 +328,7 @@ static int __init ps3_mm_add_memory(void)
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
core_initcall(ps3_mm_add_memory);
|
device_initcall(ps3_mm_add_memory);
|
||||||
|
|
||||||
/*============================================================================*/
|
/*============================================================================*/
|
||||||
/* dma routines */
|
/* dma routines */
|
||||||
|
|
|
@ -145,7 +145,7 @@ cputime_to_timeval(const cputime_t cputime, struct timeval *value)
|
||||||
value->tv_usec = rp.subreg.even / 4096;
|
value->tv_usec = rp.subreg.even / 4096;
|
||||||
value->tv_sec = rp.subreg.odd;
|
value->tv_sec = rp.subreg.odd;
|
||||||
#else
|
#else
|
||||||
value->tv_usec = cputime % 4096000000ULL;
|
value->tv_usec = (cputime % 4096000000ULL) / 4096;
|
||||||
value->tv_sec = cputime / 4096000000ULL;
|
value->tv_sec = cputime / 4096000000ULL;
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
|
@ -43,6 +43,8 @@ struct mem_chunk {
|
||||||
|
|
||||||
extern struct mem_chunk memory_chunk[];
|
extern struct mem_chunk memory_chunk[];
|
||||||
extern unsigned long real_memory_size;
|
extern unsigned long real_memory_size;
|
||||||
|
extern int memory_end_set;
|
||||||
|
extern unsigned long memory_end;
|
||||||
|
|
||||||
void detect_memory_layout(struct mem_chunk chunk[]);
|
void detect_memory_layout(struct mem_chunk chunk[]);
|
||||||
|
|
||||||
|
|
|
@ -82,7 +82,9 @@ char elf_platform[ELF_PLATFORM_SIZE];
|
||||||
|
|
||||||
struct mem_chunk __initdata memory_chunk[MEMORY_CHUNKS];
|
struct mem_chunk __initdata memory_chunk[MEMORY_CHUNKS];
|
||||||
volatile int __cpu_logical_map[NR_CPUS]; /* logical cpu to cpu address */
|
volatile int __cpu_logical_map[NR_CPUS]; /* logical cpu to cpu address */
|
||||||
static unsigned long __initdata memory_end;
|
|
||||||
|
int __initdata memory_end_set;
|
||||||
|
unsigned long __initdata memory_end;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* This is set up by the setup-routine at boot-time
|
* This is set up by the setup-routine at boot-time
|
||||||
|
@ -281,6 +283,7 @@ void (*pm_power_off)(void) = machine_power_off;
|
||||||
static int __init early_parse_mem(char *p)
|
static int __init early_parse_mem(char *p)
|
||||||
{
|
{
|
||||||
memory_end = memparse(p, &p);
|
memory_end = memparse(p, &p);
|
||||||
|
memory_end_set = 1;
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
early_param("mem", early_parse_mem);
|
early_param("mem", early_parse_mem);
|
||||||
|
@ -508,8 +511,10 @@ static void __init setup_memory_end(void)
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
#if defined(CONFIG_ZFCPDUMP) || defined(CONFIG_ZFCPDUMP_MODULE)
|
#if defined(CONFIG_ZFCPDUMP) || defined(CONFIG_ZFCPDUMP_MODULE)
|
||||||
if (ipl_info.type == IPL_TYPE_FCP_DUMP)
|
if (ipl_info.type == IPL_TYPE_FCP_DUMP) {
|
||||||
memory_end = ZFCPDUMP_HSA_SIZE;
|
memory_end = ZFCPDUMP_HSA_SIZE;
|
||||||
|
memory_end_set = 1;
|
||||||
|
}
|
||||||
#endif
|
#endif
|
||||||
memory_size = 0;
|
memory_size = 0;
|
||||||
memory_end &= PAGE_MASK;
|
memory_end &= PAGE_MASK;
|
||||||
|
|
|
@ -212,6 +212,10 @@ static void kvm_free_vcpus(struct kvm *kvm)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void kvm_arch_sync_events(struct kvm *kvm)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
void kvm_arch_destroy_vm(struct kvm *kvm)
|
void kvm_arch_destroy_vm(struct kvm *kvm)
|
||||||
{
|
{
|
||||||
kvm_free_vcpus(kvm);
|
kvm_free_vcpus(kvm);
|
||||||
|
|
|
@ -78,7 +78,7 @@ void vde_init_libstuff(struct vde_data *vpri, struct vde_init *init)
|
||||||
{
|
{
|
||||||
struct vde_open_args *args;
|
struct vde_open_args *args;
|
||||||
|
|
||||||
vpri->args = kmalloc(sizeof(struct vde_open_args), UM_GFP_KERNEL);
|
vpri->args = uml_kmalloc(sizeof(struct vde_open_args), UM_GFP_KERNEL);
|
||||||
if (vpri->args == NULL) {
|
if (vpri->args == NULL) {
|
||||||
printk(UM_KERN_ERR "vde_init_libstuff - vde_open_args "
|
printk(UM_KERN_ERR "vde_init_libstuff - vde_open_args "
|
||||||
"allocation failed");
|
"allocation failed");
|
||||||
|
@ -91,8 +91,8 @@ void vde_init_libstuff(struct vde_data *vpri, struct vde_init *init)
|
||||||
args->group = init->group;
|
args->group = init->group;
|
||||||
args->mode = init->mode ? init->mode : 0700;
|
args->mode = init->mode ? init->mode : 0700;
|
||||||
|
|
||||||
args->port ? printk(UM_KERN_INFO "port %d", args->port) :
|
args->port ? printk("port %d", args->port) :
|
||||||
printk(UM_KERN_INFO "undefined port");
|
printk("undefined port");
|
||||||
}
|
}
|
||||||
|
|
||||||
int vde_user_read(void *conn, void *buf, int len)
|
int vde_user_read(void *conn, void *buf, int len)
|
||||||
|
|
|
@ -285,6 +285,7 @@ config X86_BIGSMP
|
||||||
---help---
|
---help---
|
||||||
This option is needed for the systems that have more than 8 CPUs
|
This option is needed for the systems that have more than 8 CPUs
|
||||||
|
|
||||||
|
if X86_32
|
||||||
config X86_EXTENDED_PLATFORM
|
config X86_EXTENDED_PLATFORM
|
||||||
bool "Support for extended (non-PC) x86 platforms"
|
bool "Support for extended (non-PC) x86 platforms"
|
||||||
default y
|
default y
|
||||||
|
@ -293,12 +294,36 @@ config X86_EXTENDED_PLATFORM
|
||||||
standard PC platforms. (which covers the vast majority of
|
standard PC platforms. (which covers the vast majority of
|
||||||
systems out there.)
|
systems out there.)
|
||||||
|
|
||||||
If you enable this option then you'll be able to select a number
|
If you enable this option then you'll be able to select support
|
||||||
of non-PC x86 platforms.
|
for the following (non-PC) 32 bit x86 platforms:
|
||||||
|
AMD Elan
|
||||||
|
NUMAQ (IBM/Sequent)
|
||||||
|
RDC R-321x SoC
|
||||||
|
SGI 320/540 (Visual Workstation)
|
||||||
|
Summit/EXA (IBM x440)
|
||||||
|
Unisys ES7000 IA32 series
|
||||||
|
|
||||||
If you have one of these systems, or if you want to build a
|
If you have one of these systems, or if you want to build a
|
||||||
generic distribution kernel, say Y here - otherwise say N.
|
generic distribution kernel, say Y here - otherwise say N.
|
||||||
|
endif
|
||||||
|
|
||||||
|
if X86_64
|
||||||
|
config X86_EXTENDED_PLATFORM
|
||||||
|
bool "Support for extended (non-PC) x86 platforms"
|
||||||
|
default y
|
||||||
|
---help---
|
||||||
|
If you disable this option then the kernel will only support
|
||||||
|
standard PC platforms. (which covers the vast majority of
|
||||||
|
systems out there.)
|
||||||
|
|
||||||
|
If you enable this option then you'll be able to select support
|
||||||
|
for the following (non-PC) 64 bit x86 platforms:
|
||||||
|
ScaleMP vSMP
|
||||||
|
SGI Ultraviolet
|
||||||
|
|
||||||
|
If you have one of these systems, or if you want to build a
|
||||||
|
generic distribution kernel, say Y here - otherwise say N.
|
||||||
|
endif
|
||||||
# This is an alphabetically sorted list of 64 bit extended platforms
|
# This is an alphabetically sorted list of 64 bit extended platforms
|
||||||
# Please maintain the alphabetic order if and when there are additions
|
# Please maintain the alphabetic order if and when there are additions
|
||||||
|
|
||||||
|
@ -397,19 +422,6 @@ config X86_ES7000
|
||||||
Support for Unisys ES7000 systems. Say 'Y' here if this kernel is
|
Support for Unisys ES7000 systems. Say 'Y' here if this kernel is
|
||||||
supposed to run on an IA32-based Unisys ES7000 system.
|
supposed to run on an IA32-based Unisys ES7000 system.
|
||||||
|
|
||||||
config X86_VOYAGER
|
|
||||||
bool "Voyager (NCR)"
|
|
||||||
depends on SMP && !PCI && BROKEN
|
|
||||||
depends on X86_32_NON_STANDARD
|
|
||||||
---help---
|
|
||||||
Voyager is an MCA-based 32-way capable SMP architecture proprietary
|
|
||||||
to NCR Corp. Machine classes 345x/35xx/4100/51xx are Voyager-based.
|
|
||||||
|
|
||||||
*** WARNING ***
|
|
||||||
|
|
||||||
If you do not specifically know you have a Voyager based machine,
|
|
||||||
say N here, otherwise the kernel you build will not be bootable.
|
|
||||||
|
|
||||||
config SCHED_OMIT_FRAME_POINTER
|
config SCHED_OMIT_FRAME_POINTER
|
||||||
def_bool y
|
def_bool y
|
||||||
prompt "Single-depth WCHAN output"
|
prompt "Single-depth WCHAN output"
|
||||||
|
|
|
@ -175,28 +175,8 @@ config IOMMU_LEAK
|
||||||
Add a simple leak tracer to the IOMMU code. This is useful when you
|
Add a simple leak tracer to the IOMMU code. This is useful when you
|
||||||
are debugging a buggy device driver that leaks IOMMU mappings.
|
are debugging a buggy device driver that leaks IOMMU mappings.
|
||||||
|
|
||||||
config MMIOTRACE
|
config HAVE_MMIOTRACE_SUPPORT
|
||||||
bool "Memory mapped IO tracing"
|
def_bool y
|
||||||
depends on DEBUG_KERNEL && PCI
|
|
||||||
select TRACING
|
|
||||||
help
|
|
||||||
Mmiotrace traces Memory Mapped I/O access and is meant for
|
|
||||||
debugging and reverse engineering. It is called from the ioremap
|
|
||||||
implementation and works via page faults. Tracing is disabled by
|
|
||||||
default and can be enabled at run-time.
|
|
||||||
|
|
||||||
See Documentation/tracers/mmiotrace.txt.
|
|
||||||
If you are not helping to develop drivers, say N.
|
|
||||||
|
|
||||||
config MMIOTRACE_TEST
|
|
||||||
tristate "Test module for mmiotrace"
|
|
||||||
depends on MMIOTRACE && m
|
|
||||||
help
|
|
||||||
This is a dumb module for testing mmiotrace. It is very dangerous
|
|
||||||
as it will write garbage to IO memory starting at a given address.
|
|
||||||
However, it should be safe to use on e.g. unused portion of VRAM.
|
|
||||||
|
|
||||||
Say N, unless you absolutely know what you are doing.
|
|
||||||
|
|
||||||
#
|
#
|
||||||
# IO delay types:
|
# IO delay types:
|
||||||
|
|
|
@ -32,7 +32,6 @@ setup-y += a20.o cmdline.o copy.o cpu.o cpucheck.o edd.o
|
||||||
setup-y += header.o main.o mca.o memory.o pm.o pmjump.o
|
setup-y += header.o main.o mca.o memory.o pm.o pmjump.o
|
||||||
setup-y += printf.o string.o tty.o video.o video-mode.o version.o
|
setup-y += printf.o string.o tty.o video.o video-mode.o version.o
|
||||||
setup-$(CONFIG_X86_APM_BOOT) += apm.o
|
setup-$(CONFIG_X86_APM_BOOT) += apm.o
|
||||||
setup-$(CONFIG_X86_VOYAGER) += voyager.o
|
|
||||||
|
|
||||||
# The link order of the video-*.o modules can matter. In particular,
|
# The link order of the video-*.o modules can matter. In particular,
|
||||||
# video-vga.o *must* be listed first, followed by video-vesa.o.
|
# video-vga.o *must* be listed first, followed by video-vesa.o.
|
||||||
|
|
|
@ -126,11 +126,6 @@ static void enable_a20_fast(void)
|
||||||
|
|
||||||
int enable_a20(void)
|
int enable_a20(void)
|
||||||
{
|
{
|
||||||
#ifdef CONFIG_X86_VOYAGER
|
|
||||||
/* On Voyager, a20_test() is unsafe? */
|
|
||||||
enable_a20_kbc();
|
|
||||||
return 0;
|
|
||||||
#else
|
|
||||||
int loops = A20_ENABLE_LOOPS;
|
int loops = A20_ENABLE_LOOPS;
|
||||||
int kbc_err;
|
int kbc_err;
|
||||||
|
|
||||||
|
@ -164,5 +159,4 @@ int enable_a20(void)
|
||||||
}
|
}
|
||||||
|
|
||||||
return -1;
|
return -1;
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -302,9 +302,6 @@ void probe_cards(int unsafe);
|
||||||
/* video-vesa.c */
|
/* video-vesa.c */
|
||||||
void vesa_store_edid(void);
|
void vesa_store_edid(void);
|
||||||
|
|
||||||
/* voyager.c */
|
|
||||||
int query_voyager(void);
|
|
||||||
|
|
||||||
#endif /* __ASSEMBLY__ */
|
#endif /* __ASSEMBLY__ */
|
||||||
|
|
||||||
#endif /* BOOT_BOOT_H */
|
#endif /* BOOT_BOOT_H */
|
||||||
|
|
|
@ -25,14 +25,12 @@
|
||||||
|
|
||||||
#include <linux/linkage.h>
|
#include <linux/linkage.h>
|
||||||
#include <asm/segment.h>
|
#include <asm/segment.h>
|
||||||
#include <asm/page.h>
|
#include <asm/page_types.h>
|
||||||
#include <asm/boot.h>
|
#include <asm/boot.h>
|
||||||
#include <asm/asm-offsets.h>
|
#include <asm/asm-offsets.h>
|
||||||
|
|
||||||
.section ".text.head","ax",@progbits
|
.section ".text.head","ax",@progbits
|
||||||
.globl startup_32
|
ENTRY(startup_32)
|
||||||
|
|
||||||
startup_32:
|
|
||||||
cld
|
cld
|
||||||
/* test KEEP_SEGMENTS flag to see if the bootloader is asking
|
/* test KEEP_SEGMENTS flag to see if the bootloader is asking
|
||||||
* us to not reload segments */
|
* us to not reload segments */
|
||||||
|
@ -113,6 +111,8 @@ startup_32:
|
||||||
*/
|
*/
|
||||||
leal relocated(%ebx), %eax
|
leal relocated(%ebx), %eax
|
||||||
jmp *%eax
|
jmp *%eax
|
||||||
|
ENDPROC(startup_32)
|
||||||
|
|
||||||
.section ".text"
|
.section ".text"
|
||||||
relocated:
|
relocated:
|
||||||
|
|
||||||
|
|
|
@ -26,8 +26,8 @@
|
||||||
|
|
||||||
#include <linux/linkage.h>
|
#include <linux/linkage.h>
|
||||||
#include <asm/segment.h>
|
#include <asm/segment.h>
|
||||||
#include <asm/pgtable.h>
|
#include <asm/pgtable_types.h>
|
||||||
#include <asm/page.h>
|
#include <asm/page_types.h>
|
||||||
#include <asm/boot.h>
|
#include <asm/boot.h>
|
||||||
#include <asm/msr.h>
|
#include <asm/msr.h>
|
||||||
#include <asm/processor-flags.h>
|
#include <asm/processor-flags.h>
|
||||||
|
@ -35,9 +35,7 @@
|
||||||
|
|
||||||
.section ".text.head"
|
.section ".text.head"
|
||||||
.code32
|
.code32
|
||||||
.globl startup_32
|
ENTRY(startup_32)
|
||||||
|
|
||||||
startup_32:
|
|
||||||
cld
|
cld
|
||||||
/* test KEEP_SEGMENTS flag to see if the bootloader is asking
|
/* test KEEP_SEGMENTS flag to see if the bootloader is asking
|
||||||
* us to not reload segments */
|
* us to not reload segments */
|
||||||
|
@ -176,6 +174,7 @@ startup_32:
|
||||||
|
|
||||||
/* Jump from 32bit compatibility mode into 64bit mode. */
|
/* Jump from 32bit compatibility mode into 64bit mode. */
|
||||||
lret
|
lret
|
||||||
|
ENDPROC(startup_32)
|
||||||
|
|
||||||
no_longmode:
|
no_longmode:
|
||||||
/* This isn't an x86-64 CPU so hang */
|
/* This isn't an x86-64 CPU so hang */
|
||||||
|
@ -295,7 +294,6 @@ relocated:
|
||||||
call decompress_kernel
|
call decompress_kernel
|
||||||
popq %rsi
|
popq %rsi
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Jump to the decompressed kernel.
|
* Jump to the decompressed kernel.
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -8,6 +8,8 @@
|
||||||
*
|
*
|
||||||
* ----------------------------------------------------------------------- */
|
* ----------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
#include <linux/linkage.h>
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Memory copy routines
|
* Memory copy routines
|
||||||
*/
|
*/
|
||||||
|
@ -15,9 +17,7 @@
|
||||||
.code16gcc
|
.code16gcc
|
||||||
.text
|
.text
|
||||||
|
|
||||||
.globl memcpy
|
GLOBAL(memcpy)
|
||||||
.type memcpy, @function
|
|
||||||
memcpy:
|
|
||||||
pushw %si
|
pushw %si
|
||||||
pushw %di
|
pushw %di
|
||||||
movw %ax, %di
|
movw %ax, %di
|
||||||
|
@ -31,11 +31,9 @@ memcpy:
|
||||||
popw %di
|
popw %di
|
||||||
popw %si
|
popw %si
|
||||||
ret
|
ret
|
||||||
.size memcpy, .-memcpy
|
ENDPROC(memcpy)
|
||||||
|
|
||||||
.globl memset
|
GLOBAL(memset)
|
||||||
.type memset, @function
|
|
||||||
memset:
|
|
||||||
pushw %di
|
pushw %di
|
||||||
movw %ax, %di
|
movw %ax, %di
|
||||||
movzbl %dl, %eax
|
movzbl %dl, %eax
|
||||||
|
@ -48,52 +46,42 @@ memset:
|
||||||
rep; stosb
|
rep; stosb
|
||||||
popw %di
|
popw %di
|
||||||
ret
|
ret
|
||||||
.size memset, .-memset
|
ENDPROC(memset)
|
||||||
|
|
||||||
.globl copy_from_fs
|
GLOBAL(copy_from_fs)
|
||||||
.type copy_from_fs, @function
|
|
||||||
copy_from_fs:
|
|
||||||
pushw %ds
|
pushw %ds
|
||||||
pushw %fs
|
pushw %fs
|
||||||
popw %ds
|
popw %ds
|
||||||
call memcpy
|
call memcpy
|
||||||
popw %ds
|
popw %ds
|
||||||
ret
|
ret
|
||||||
.size copy_from_fs, .-copy_from_fs
|
ENDPROC(copy_from_fs)
|
||||||
|
|
||||||
.globl copy_to_fs
|
GLOBAL(copy_to_fs)
|
||||||
.type copy_to_fs, @function
|
|
||||||
copy_to_fs:
|
|
||||||
pushw %es
|
pushw %es
|
||||||
pushw %fs
|
pushw %fs
|
||||||
popw %es
|
popw %es
|
||||||
call memcpy
|
call memcpy
|
||||||
popw %es
|
popw %es
|
||||||
ret
|
ret
|
||||||
.size copy_to_fs, .-copy_to_fs
|
ENDPROC(copy_to_fs)
|
||||||
|
|
||||||
#if 0 /* Not currently used, but can be enabled as needed */
|
#if 0 /* Not currently used, but can be enabled as needed */
|
||||||
|
GLOBAL(copy_from_gs)
|
||||||
.globl copy_from_gs
|
|
||||||
.type copy_from_gs, @function
|
|
||||||
copy_from_gs:
|
|
||||||
pushw %ds
|
pushw %ds
|
||||||
pushw %gs
|
pushw %gs
|
||||||
popw %ds
|
popw %ds
|
||||||
call memcpy
|
call memcpy
|
||||||
popw %ds
|
popw %ds
|
||||||
ret
|
ret
|
||||||
.size copy_from_gs, .-copy_from_gs
|
ENDPROC(copy_from_gs)
|
||||||
.globl copy_to_gs
|
|
||||||
|
|
||||||
.type copy_to_gs, @function
|
GLOBAL(copy_to_gs)
|
||||||
copy_to_gs:
|
|
||||||
pushw %es
|
pushw %es
|
||||||
pushw %gs
|
pushw %gs
|
||||||
popw %es
|
popw %es
|
||||||
call memcpy
|
call memcpy
|
||||||
popw %es
|
popw %es
|
||||||
ret
|
ret
|
||||||
.size copy_to_gs, .-copy_to_gs
|
ENDPROC(copy_to_gs)
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -19,7 +19,7 @@
|
||||||
#include <linux/utsrelease.h>
|
#include <linux/utsrelease.h>
|
||||||
#include <asm/boot.h>
|
#include <asm/boot.h>
|
||||||
#include <asm/e820.h>
|
#include <asm/e820.h>
|
||||||
#include <asm/page.h>
|
#include <asm/page_types.h>
|
||||||
#include <asm/setup.h>
|
#include <asm/setup.h>
|
||||||
#include "boot.h"
|
#include "boot.h"
|
||||||
#include "offsets.h"
|
#include "offsets.h"
|
||||||
|
|
|
@ -149,11 +149,6 @@ void main(void)
|
||||||
/* Query MCA information */
|
/* Query MCA information */
|
||||||
query_mca();
|
query_mca();
|
||||||
|
|
||||||
/* Voyager */
|
|
||||||
#ifdef CONFIG_X86_VOYAGER
|
|
||||||
query_voyager();
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* Query Intel SpeedStep (IST) information */
|
/* Query Intel SpeedStep (IST) information */
|
||||||
query_ist();
|
query_ist();
|
||||||
|
|
||||||
|
|
|
@ -15,18 +15,15 @@
|
||||||
#include <asm/boot.h>
|
#include <asm/boot.h>
|
||||||
#include <asm/processor-flags.h>
|
#include <asm/processor-flags.h>
|
||||||
#include <asm/segment.h>
|
#include <asm/segment.h>
|
||||||
|
#include <linux/linkage.h>
|
||||||
|
|
||||||
.text
|
.text
|
||||||
|
|
||||||
.globl protected_mode_jump
|
|
||||||
.type protected_mode_jump, @function
|
|
||||||
|
|
||||||
.code16
|
.code16
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* void protected_mode_jump(u32 entrypoint, u32 bootparams);
|
* void protected_mode_jump(u32 entrypoint, u32 bootparams);
|
||||||
*/
|
*/
|
||||||
protected_mode_jump:
|
GLOBAL(protected_mode_jump)
|
||||||
movl %edx, %esi # Pointer to boot_params table
|
movl %edx, %esi # Pointer to boot_params table
|
||||||
|
|
||||||
xorl %ebx, %ebx
|
xorl %ebx, %ebx
|
||||||
|
@ -47,12 +44,10 @@ protected_mode_jump:
|
||||||
.byte 0x66, 0xea # ljmpl opcode
|
.byte 0x66, 0xea # ljmpl opcode
|
||||||
2: .long in_pm32 # offset
|
2: .long in_pm32 # offset
|
||||||
.word __BOOT_CS # segment
|
.word __BOOT_CS # segment
|
||||||
|
ENDPROC(protected_mode_jump)
|
||||||
.size protected_mode_jump, .-protected_mode_jump
|
|
||||||
|
|
||||||
.code32
|
.code32
|
||||||
.type in_pm32, @function
|
GLOBAL(in_pm32)
|
||||||
in_pm32:
|
|
||||||
# Set up data segments for flat 32-bit mode
|
# Set up data segments for flat 32-bit mode
|
||||||
movl %ecx, %ds
|
movl %ecx, %ds
|
||||||
movl %ecx, %es
|
movl %ecx, %es
|
||||||
|
@ -78,5 +73,4 @@ in_pm32:
|
||||||
lldt %cx
|
lldt %cx
|
||||||
|
|
||||||
jmpl *%eax # Jump to the 32-bit entrypoint
|
jmpl *%eax # Jump to the 32-bit entrypoint
|
||||||
|
ENDPROC(in_pm32)
|
||||||
.size in_pm32, .-in_pm32
|
|
||||||
|
|
|
@ -1,40 +0,0 @@
|
||||||
/* -*- linux-c -*- ------------------------------------------------------- *
|
|
||||||
*
|
|
||||||
* Copyright (C) 1991, 1992 Linus Torvalds
|
|
||||||
* Copyright 2007 rPath, Inc. - All Rights Reserved
|
|
||||||
*
|
|
||||||
* This file is part of the Linux kernel, and is made available under
|
|
||||||
* the terms of the GNU General Public License version 2.
|
|
||||||
*
|
|
||||||
* ----------------------------------------------------------------------- */
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Get the Voyager config information
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include "boot.h"
|
|
||||||
|
|
||||||
int query_voyager(void)
|
|
||||||
{
|
|
||||||
u8 err;
|
|
||||||
u16 es, di;
|
|
||||||
/* Abuse the apm_bios_info area for this */
|
|
||||||
u8 *data_ptr = (u8 *)&boot_params.apm_bios_info;
|
|
||||||
|
|
||||||
data_ptr[0] = 0xff; /* Flag on config not found(?) */
|
|
||||||
|
|
||||||
asm("pushw %%es ; "
|
|
||||||
"int $0x15 ; "
|
|
||||||
"setc %0 ; "
|
|
||||||
"movw %%es, %1 ; "
|
|
||||||
"popw %%es"
|
|
||||||
: "=q" (err), "=r" (es), "=D" (di)
|
|
||||||
: "a" (0xffc0));
|
|
||||||
|
|
||||||
if (err)
|
|
||||||
return -1; /* Not Voyager */
|
|
||||||
|
|
||||||
set_fs(es);
|
|
||||||
copy_from_fs(data_ptr, di, 7); /* Table is 7 bytes apparently */
|
|
||||||
return 0;
|
|
||||||
}
|
|
|
@ -1,7 +1,7 @@
|
||||||
#
|
#
|
||||||
# Automatically generated make config: don't edit
|
# Automatically generated make config: don't edit
|
||||||
# Linux kernel version: 2.6.29-rc4
|
# Linux kernel version: 2.6.29-rc4
|
||||||
# Thu Feb 12 12:57:57 2009
|
# Tue Feb 24 15:50:58 2009
|
||||||
#
|
#
|
||||||
# CONFIG_64BIT is not set
|
# CONFIG_64BIT is not set
|
||||||
CONFIG_X86_32=y
|
CONFIG_X86_32=y
|
||||||
|
@ -197,7 +197,6 @@ CONFIG_SPARSE_IRQ=y
|
||||||
CONFIG_X86_FIND_SMP_CONFIG=y
|
CONFIG_X86_FIND_SMP_CONFIG=y
|
||||||
CONFIG_X86_MPPARSE=y
|
CONFIG_X86_MPPARSE=y
|
||||||
# CONFIG_X86_ELAN is not set
|
# CONFIG_X86_ELAN is not set
|
||||||
# CONFIG_X86_VOYAGER is not set
|
|
||||||
# CONFIG_X86_GENERICARCH is not set
|
# CONFIG_X86_GENERICARCH is not set
|
||||||
# CONFIG_X86_VSMP is not set
|
# CONFIG_X86_VSMP is not set
|
||||||
# CONFIG_X86_RDC321X is not set
|
# CONFIG_X86_RDC321X is not set
|
||||||
|
@ -267,7 +266,9 @@ CONFIG_PREEMPT_VOLUNTARY=y
|
||||||
CONFIG_X86_LOCAL_APIC=y
|
CONFIG_X86_LOCAL_APIC=y
|
||||||
CONFIG_X86_IO_APIC=y
|
CONFIG_X86_IO_APIC=y
|
||||||
CONFIG_X86_REROUTE_FOR_BROKEN_BOOT_IRQS=y
|
CONFIG_X86_REROUTE_FOR_BROKEN_BOOT_IRQS=y
|
||||||
# CONFIG_X86_MCE is not set
|
CONFIG_X86_MCE=y
|
||||||
|
CONFIG_X86_MCE_NONFATAL=y
|
||||||
|
CONFIG_X86_MCE_P4THERMAL=y
|
||||||
CONFIG_VM86=y
|
CONFIG_VM86=y
|
||||||
# CONFIG_TOSHIBA is not set
|
# CONFIG_TOSHIBA is not set
|
||||||
# CONFIG_I8K is not set
|
# CONFIG_I8K is not set
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
#
|
#
|
||||||
# Automatically generated make config: don't edit
|
# Automatically generated make config: don't edit
|
||||||
# Linux kernel version: 2.6.29-rc4
|
# Linux kernel version: 2.6.29-rc4
|
||||||
# Thu Feb 12 12:57:29 2009
|
# Tue Feb 24 15:44:16 2009
|
||||||
#
|
#
|
||||||
CONFIG_64BIT=y
|
CONFIG_64BIT=y
|
||||||
# CONFIG_X86_32 is not set
|
# CONFIG_X86_32 is not set
|
||||||
|
@ -199,7 +199,6 @@ CONFIG_SPARSE_IRQ=y
|
||||||
CONFIG_X86_FIND_SMP_CONFIG=y
|
CONFIG_X86_FIND_SMP_CONFIG=y
|
||||||
CONFIG_X86_MPPARSE=y
|
CONFIG_X86_MPPARSE=y
|
||||||
# CONFIG_X86_ELAN is not set
|
# CONFIG_X86_ELAN is not set
|
||||||
# CONFIG_X86_VOYAGER is not set
|
|
||||||
# CONFIG_X86_GENERICARCH is not set
|
# CONFIG_X86_GENERICARCH is not set
|
||||||
# CONFIG_X86_VSMP is not set
|
# CONFIG_X86_VSMP is not set
|
||||||
CONFIG_SCHED_OMIT_FRAME_POINTER=y
|
CONFIG_SCHED_OMIT_FRAME_POINTER=y
|
||||||
|
@ -267,7 +266,9 @@ CONFIG_PREEMPT_VOLUNTARY=y
|
||||||
CONFIG_X86_LOCAL_APIC=y
|
CONFIG_X86_LOCAL_APIC=y
|
||||||
CONFIG_X86_IO_APIC=y
|
CONFIG_X86_IO_APIC=y
|
||||||
CONFIG_X86_REROUTE_FOR_BROKEN_BOOT_IRQS=y
|
CONFIG_X86_REROUTE_FOR_BROKEN_BOOT_IRQS=y
|
||||||
# CONFIG_X86_MCE is not set
|
CONFIG_X86_MCE=y
|
||||||
|
CONFIG_X86_MCE_INTEL=y
|
||||||
|
CONFIG_X86_MCE_AMD=y
|
||||||
# CONFIG_I8K is not set
|
# CONFIG_I8K is not set
|
||||||
CONFIG_MICROCODE=y
|
CONFIG_MICROCODE=y
|
||||||
CONFIG_MICROCODE_INTEL=y
|
CONFIG_MICROCODE_INTEL=y
|
||||||
|
|
|
@ -33,8 +33,6 @@
|
||||||
#include <asm/sigframe.h>
|
#include <asm/sigframe.h>
|
||||||
#include <asm/sys_ia32.h>
|
#include <asm/sys_ia32.h>
|
||||||
|
|
||||||
#define DEBUG_SIG 0
|
|
||||||
|
|
||||||
#define _BLOCKABLE (~(sigmask(SIGKILL) | sigmask(SIGSTOP)))
|
#define _BLOCKABLE (~(sigmask(SIGKILL) | sigmask(SIGSTOP)))
|
||||||
|
|
||||||
#define FIX_EFLAGS (X86_EFLAGS_AC | X86_EFLAGS_OF | \
|
#define FIX_EFLAGS (X86_EFLAGS_AC | X86_EFLAGS_OF | \
|
||||||
|
@ -190,42 +188,47 @@ asmlinkage long sys32_sigaltstack(const stack_ia32_t __user *uss_ptr,
|
||||||
/*
|
/*
|
||||||
* Do a signal return; undo the signal stack.
|
* Do a signal return; undo the signal stack.
|
||||||
*/
|
*/
|
||||||
|
#define loadsegment_gs(v) load_gs_index(v)
|
||||||
|
#define loadsegment_fs(v) loadsegment(fs, v)
|
||||||
|
#define loadsegment_ds(v) loadsegment(ds, v)
|
||||||
|
#define loadsegment_es(v) loadsegment(es, v)
|
||||||
|
|
||||||
|
#define get_user_seg(seg) ({ unsigned int v; savesegment(seg, v); v; })
|
||||||
|
#define set_user_seg(seg, v) loadsegment_##seg(v)
|
||||||
|
|
||||||
#define COPY(x) { \
|
#define COPY(x) { \
|
||||||
get_user_ex(regs->x, &sc->x); \
|
get_user_ex(regs->x, &sc->x); \
|
||||||
}
|
}
|
||||||
|
|
||||||
#define COPY_SEG_CPL3(seg) { \
|
#define GET_SEG(seg) ({ \
|
||||||
unsigned short tmp; \
|
unsigned short tmp; \
|
||||||
get_user_ex(tmp, &sc->seg); \
|
get_user_ex(tmp, &sc->seg); \
|
||||||
regs->seg = tmp | 3; \
|
tmp; \
|
||||||
}
|
})
|
||||||
|
|
||||||
|
#define COPY_SEG_CPL3(seg) do { \
|
||||||
|
regs->seg = GET_SEG(seg) | 3; \
|
||||||
|
} while (0)
|
||||||
|
|
||||||
#define RELOAD_SEG(seg) { \
|
#define RELOAD_SEG(seg) { \
|
||||||
unsigned int cur, pre; \
|
unsigned int pre = GET_SEG(seg); \
|
||||||
get_user_ex(pre, &sc->seg); \
|
unsigned int cur = get_user_seg(seg); \
|
||||||
savesegment(seg, cur); \
|
|
||||||
pre |= 3; \
|
pre |= 3; \
|
||||||
if (pre != cur) \
|
if (pre != cur) \
|
||||||
loadsegment(seg, pre); \
|
set_user_seg(seg, pre); \
|
||||||
}
|
}
|
||||||
|
|
||||||
static int ia32_restore_sigcontext(struct pt_regs *regs,
|
static int ia32_restore_sigcontext(struct pt_regs *regs,
|
||||||
struct sigcontext_ia32 __user *sc,
|
struct sigcontext_ia32 __user *sc,
|
||||||
unsigned int *pax)
|
unsigned int *pax)
|
||||||
{
|
{
|
||||||
unsigned int tmpflags, gs, oldgs, err = 0;
|
unsigned int tmpflags, err = 0;
|
||||||
void __user *buf;
|
void __user *buf;
|
||||||
u32 tmp;
|
u32 tmp;
|
||||||
|
|
||||||
/* Always make any pending restarted system calls return -EINTR */
|
/* Always make any pending restarted system calls return -EINTR */
|
||||||
current_thread_info()->restart_block.fn = do_no_restart_syscall;
|
current_thread_info()->restart_block.fn = do_no_restart_syscall;
|
||||||
|
|
||||||
#if DEBUG_SIG
|
|
||||||
printk(KERN_DEBUG "SIG restore_sigcontext: "
|
|
||||||
"sc=%p err(%x) eip(%x) cs(%x) flg(%x)\n",
|
|
||||||
sc, sc->err, sc->ip, sc->cs, sc->flags);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
get_user_try {
|
get_user_try {
|
||||||
/*
|
/*
|
||||||
* Reload fs and gs if they have changed in the signal
|
* Reload fs and gs if they have changed in the signal
|
||||||
|
@ -233,12 +236,7 @@ static int ia32_restore_sigcontext(struct pt_regs *regs,
|
||||||
* the handler, but does not clobber them at least in the
|
* the handler, but does not clobber them at least in the
|
||||||
* normal case.
|
* normal case.
|
||||||
*/
|
*/
|
||||||
get_user_ex(gs, &sc->gs);
|
RELOAD_SEG(gs);
|
||||||
gs |= 3;
|
|
||||||
savesegment(gs, oldgs);
|
|
||||||
if (gs != oldgs)
|
|
||||||
load_gs_index(gs);
|
|
||||||
|
|
||||||
RELOAD_SEG(fs);
|
RELOAD_SEG(fs);
|
||||||
RELOAD_SEG(ds);
|
RELOAD_SEG(ds);
|
||||||
RELOAD_SEG(es);
|
RELOAD_SEG(es);
|
||||||
|
@ -337,17 +335,13 @@ static int ia32_setup_sigcontext(struct sigcontext_ia32 __user *sc,
|
||||||
void __user *fpstate,
|
void __user *fpstate,
|
||||||
struct pt_regs *regs, unsigned int mask)
|
struct pt_regs *regs, unsigned int mask)
|
||||||
{
|
{
|
||||||
int tmp, err = 0;
|
int err = 0;
|
||||||
|
|
||||||
put_user_try {
|
put_user_try {
|
||||||
savesegment(gs, tmp);
|
put_user_ex(get_user_seg(gs), (unsigned int __user *)&sc->gs);
|
||||||
put_user_ex(tmp, (unsigned int __user *)&sc->gs);
|
put_user_ex(get_user_seg(fs), (unsigned int __user *)&sc->fs);
|
||||||
savesegment(fs, tmp);
|
put_user_ex(get_user_seg(ds), (unsigned int __user *)&sc->ds);
|
||||||
put_user_ex(tmp, (unsigned int __user *)&sc->fs);
|
put_user_ex(get_user_seg(es), (unsigned int __user *)&sc->es);
|
||||||
savesegment(ds, tmp);
|
|
||||||
put_user_ex(tmp, (unsigned int __user *)&sc->ds);
|
|
||||||
savesegment(es, tmp);
|
|
||||||
put_user_ex(tmp, (unsigned int __user *)&sc->es);
|
|
||||||
|
|
||||||
put_user_ex(regs->di, &sc->di);
|
put_user_ex(regs->di, &sc->di);
|
||||||
put_user_ex(regs->si, &sc->si);
|
put_user_ex(regs->si, &sc->si);
|
||||||
|
@ -488,11 +482,6 @@ int ia32_setup_frame(int sig, struct k_sigaction *ka,
|
||||||
regs->cs = __USER32_CS;
|
regs->cs = __USER32_CS;
|
||||||
regs->ss = __USER32_DS;
|
regs->ss = __USER32_DS;
|
||||||
|
|
||||||
#if DEBUG_SIG
|
|
||||||
printk(KERN_DEBUG "SIG deliver (%s:%d): sp=%p pc=%lx ra=%u\n",
|
|
||||||
current->comm, current->pid, frame, regs->ip, frame->pretcode);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -574,10 +563,5 @@ int ia32_setup_rt_frame(int sig, struct k_sigaction *ka, siginfo_t *info,
|
||||||
regs->cs = __USER32_CS;
|
regs->cs = __USER32_CS;
|
||||||
regs->ss = __USER32_DS;
|
regs->ss = __USER32_DS;
|
||||||
|
|
||||||
#if DEBUG_SIG
|
|
||||||
printk(KERN_DEBUG "SIG deliver (%s:%d): sp=%p pc=%lx ra=%u\n",
|
|
||||||
current->comm, current->pid, frame, regs->ip, frame->pretcode);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
|
@ -146,7 +146,7 @@ static inline u64 native_x2apic_icr_read(void)
|
||||||
return val;
|
return val;
|
||||||
}
|
}
|
||||||
|
|
||||||
extern int x2apic;
|
extern int x2apic, x2apic_phys;
|
||||||
extern void check_x2apic(void);
|
extern void check_x2apic(void);
|
||||||
extern void enable_x2apic(void);
|
extern void enable_x2apic(void);
|
||||||
extern void enable_IR_x2apic(void);
|
extern void enable_IR_x2apic(void);
|
||||||
|
|
|
@ -1,26 +0,0 @@
|
||||||
#ifndef _ASM_X86_ARCH_HOOKS_H
|
|
||||||
#define _ASM_X86_ARCH_HOOKS_H
|
|
||||||
|
|
||||||
#include <linux/interrupt.h>
|
|
||||||
|
|
||||||
/*
|
|
||||||
* linux/include/asm/arch_hooks.h
|
|
||||||
*
|
|
||||||
* define the architecture specific hooks
|
|
||||||
*/
|
|
||||||
|
|
||||||
/* these aren't arch hooks, they are generic routines
|
|
||||||
* that can be used by the hooks */
|
|
||||||
extern void init_ISA_irqs(void);
|
|
||||||
extern irqreturn_t timer_interrupt(int irq, void *dev_id);
|
|
||||||
|
|
||||||
/* these are the defined hooks */
|
|
||||||
extern void intr_init_hook(void);
|
|
||||||
extern void pre_intr_init_hook(void);
|
|
||||||
extern void pre_setup_arch_hook(void);
|
|
||||||
extern void trap_init_hook(void);
|
|
||||||
extern void pre_time_init_hook(void);
|
|
||||||
extern void time_init_hook(void);
|
|
||||||
extern void mca_nmi_hook(void);
|
|
||||||
|
|
||||||
#endif /* _ASM_X86_ARCH_HOOKS_H */
|
|
|
@ -60,4 +60,8 @@ extern struct irq_chip i8259A_chip;
|
||||||
extern void mask_8259A(void);
|
extern void mask_8259A(void);
|
||||||
extern void unmask_8259A(void);
|
extern void unmask_8259A(void);
|
||||||
|
|
||||||
|
#ifdef CONFIG_X86_32
|
||||||
|
extern void init_ISA_irqs(void);
|
||||||
|
#endif
|
||||||
|
|
||||||
#endif /* _ASM_X86_I8259_H */
|
#endif /* _ASM_X86_I8259_H */
|
||||||
|
|
|
@ -124,9 +124,14 @@ static inline void *phys_to_virt(phys_addr_t address)
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* ISA I/O bus memory addresses are 1:1 with the physical address.
|
* ISA I/O bus memory addresses are 1:1 with the physical address.
|
||||||
|
* However, we truncate the address to unsigned int to avoid undesirable
|
||||||
|
* promitions in legacy drivers.
|
||||||
*/
|
*/
|
||||||
#define isa_virt_to_bus (unsigned long)virt_to_phys
|
static inline unsigned int isa_virt_to_bus(volatile void *address)
|
||||||
#define isa_page_to_bus page_to_phys
|
{
|
||||||
|
return (unsigned int)virt_to_phys(address);
|
||||||
|
}
|
||||||
|
#define isa_page_to_bus(page) ((unsigned int)page_to_phys(page))
|
||||||
#define isa_bus_to_virt phys_to_virt
|
#define isa_bus_to_virt phys_to_virt
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
|
@ -23,6 +23,12 @@
|
||||||
#include <asm/pgtable.h>
|
#include <asm/pgtable.h>
|
||||||
#include <asm/tlbflush.h>
|
#include <asm/tlbflush.h>
|
||||||
|
|
||||||
|
int
|
||||||
|
reserve_io_memtype_wc(u64 base, unsigned long size, pgprot_t *prot);
|
||||||
|
|
||||||
|
void
|
||||||
|
free_io_memtype(u64 base, unsigned long size);
|
||||||
|
|
||||||
void *
|
void *
|
||||||
iomap_atomic_prot_pfn(unsigned long pfn, enum km_type type, pgprot_t prot);
|
iomap_atomic_prot_pfn(unsigned long pfn, enum km_type type, pgprot_t prot);
|
||||||
|
|
||||||
|
|
|
@ -128,7 +128,7 @@
|
||||||
#ifndef __ASSEMBLY__
|
#ifndef __ASSEMBLY__
|
||||||
static inline int invalid_vm86_irq(int irq)
|
static inline int invalid_vm86_irq(int irq)
|
||||||
{
|
{
|
||||||
return irq < 3 || irq > 15;
|
return irq < FIRST_VM86_IRQ || irq > LAST_VM86_IRQ;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
|
@ -9,6 +9,13 @@
|
||||||
#include <linux/types.h>
|
#include <linux/types.h>
|
||||||
#include <linux/ioctl.h>
|
#include <linux/ioctl.h>
|
||||||
|
|
||||||
|
/* Select x86 specific features in <linux/kvm.h> */
|
||||||
|
#define __KVM_HAVE_PIT
|
||||||
|
#define __KVM_HAVE_IOAPIC
|
||||||
|
#define __KVM_HAVE_DEVICE_ASSIGNMENT
|
||||||
|
#define __KVM_HAVE_MSI
|
||||||
|
#define __KVM_HAVE_USER_NMI
|
||||||
|
|
||||||
/* Architectural interrupt line count. */
|
/* Architectural interrupt line count. */
|
||||||
#define KVM_NR_INTERRUPTS 256
|
#define KVM_NR_INTERRUPTS 256
|
||||||
|
|
||||||
|
|
|
@ -52,70 +52,14 @@
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#define GLOBAL(name) \
|
||||||
|
.globl name; \
|
||||||
|
name:
|
||||||
|
|
||||||
#ifdef CONFIG_X86_ALIGNMENT_16
|
#ifdef CONFIG_X86_ALIGNMENT_16
|
||||||
#define __ALIGN .align 16,0x90
|
#define __ALIGN .align 16,0x90
|
||||||
#define __ALIGN_STR ".align 16,0x90"
|
#define __ALIGN_STR ".align 16,0x90"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/*
|
|
||||||
* to check ENTRY_X86/END_X86 and
|
|
||||||
* KPROBE_ENTRY_X86/KPROBE_END_X86
|
|
||||||
* unbalanced-missed-mixed appearance
|
|
||||||
*/
|
|
||||||
#define __set_entry_x86 .set ENTRY_X86_IN, 0
|
|
||||||
#define __unset_entry_x86 .set ENTRY_X86_IN, 1
|
|
||||||
#define __set_kprobe_x86 .set KPROBE_X86_IN, 0
|
|
||||||
#define __unset_kprobe_x86 .set KPROBE_X86_IN, 1
|
|
||||||
|
|
||||||
#define __macro_err_x86 .error "ENTRY_X86/KPROBE_X86 unbalanced,missed,mixed"
|
|
||||||
|
|
||||||
#define __check_entry_x86 \
|
|
||||||
.ifdef ENTRY_X86_IN; \
|
|
||||||
.ifeq ENTRY_X86_IN; \
|
|
||||||
__macro_err_x86; \
|
|
||||||
.abort; \
|
|
||||||
.endif; \
|
|
||||||
.endif
|
|
||||||
|
|
||||||
#define __check_kprobe_x86 \
|
|
||||||
.ifdef KPROBE_X86_IN; \
|
|
||||||
.ifeq KPROBE_X86_IN; \
|
|
||||||
__macro_err_x86; \
|
|
||||||
.abort; \
|
|
||||||
.endif; \
|
|
||||||
.endif
|
|
||||||
|
|
||||||
#define __check_entry_kprobe_x86 \
|
|
||||||
__check_entry_x86; \
|
|
||||||
__check_kprobe_x86
|
|
||||||
|
|
||||||
#define ENTRY_KPROBE_FINAL_X86 __check_entry_kprobe_x86
|
|
||||||
|
|
||||||
#define ENTRY_X86(name) \
|
|
||||||
__check_entry_kprobe_x86; \
|
|
||||||
__set_entry_x86; \
|
|
||||||
.globl name; \
|
|
||||||
__ALIGN; \
|
|
||||||
name:
|
|
||||||
|
|
||||||
#define END_X86(name) \
|
|
||||||
__unset_entry_x86; \
|
|
||||||
__check_entry_kprobe_x86; \
|
|
||||||
.size name, .-name
|
|
||||||
|
|
||||||
#define KPROBE_ENTRY_X86(name) \
|
|
||||||
__check_entry_kprobe_x86; \
|
|
||||||
__set_kprobe_x86; \
|
|
||||||
.pushsection .kprobes.text, "ax"; \
|
|
||||||
.globl name; \
|
|
||||||
__ALIGN; \
|
|
||||||
name:
|
|
||||||
|
|
||||||
#define KPROBE_END_X86(name) \
|
|
||||||
__unset_kprobe_x86; \
|
|
||||||
__check_entry_kprobe_x86; \
|
|
||||||
.size name, .-name; \
|
|
||||||
.popsection
|
|
||||||
|
|
||||||
#endif /* _ASM_X86_LINKAGE_H */
|
#endif /* _ASM_X86_LINKAGE_H */
|
||||||
|
|
||||||
|
|
|
@ -1,17 +0,0 @@
|
||||||
/* defines for inline arch setup functions */
|
|
||||||
#include <linux/clockchips.h>
|
|
||||||
|
|
||||||
#include <asm/voyager.h>
|
|
||||||
#include <asm/i8253.h>
|
|
||||||
|
|
||||||
/**
|
|
||||||
* do_timer_interrupt_hook - hook into timer tick
|
|
||||||
*
|
|
||||||
* Call the pit clock event handler. see asm/i8253.h
|
|
||||||
**/
|
|
||||||
static inline void do_timer_interrupt_hook(void)
|
|
||||||
{
|
|
||||||
global_clock_event->event_handler(global_clock_event);
|
|
||||||
voyager_timer_interrupt();
|
|
||||||
}
|
|
||||||
|
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue