Merge branch 'linus' into perf/core
Merge reason: Pick up upstream fixes. Signed-off-by: Ingo Molnar <mingo@elte.hu>
This commit is contained in:
commit
eff430de53
|
@ -387,26 +387,6 @@ Who: Tejun Heo <tj@kernel.org>
|
|||
|
||||
----------------------------
|
||||
|
||||
What: Support for lcd_switch and display_get in asus-laptop driver
|
||||
When: March 2010
|
||||
Why: These two features use non-standard interfaces. There are the
|
||||
only features that really need multiple path to guess what's
|
||||
the right method name on a specific laptop.
|
||||
|
||||
Removing them will allow to remove a lot of code an significantly
|
||||
clean the drivers.
|
||||
|
||||
This will affect the backlight code which won't be able to know
|
||||
if the backlight is on or off. The platform display file will also be
|
||||
write only (like the one in eeepc-laptop).
|
||||
|
||||
This should'nt affect a lot of user because they usually know
|
||||
when their display is on or off.
|
||||
|
||||
Who: Corentin Chary <corentin.chary@gmail.com>
|
||||
|
||||
----------------------------
|
||||
|
||||
What: sysfs-class-rfkill state file
|
||||
When: Feb 2014
|
||||
Files: net/rfkill/core.c
|
||||
|
|
|
@ -0,0 +1,62 @@
|
|||
Kernel driver max16064
|
||||
======================
|
||||
|
||||
Supported chips:
|
||||
* Maxim MAX16064
|
||||
Prefix: 'max16064'
|
||||
Addresses scanned: -
|
||||
Datasheet: http://datasheets.maxim-ic.com/en/ds/MAX16064.pdf
|
||||
|
||||
Author: Guenter Roeck <guenter.roeck@ericsson.com>
|
||||
|
||||
|
||||
Description
|
||||
-----------
|
||||
|
||||
This driver supports hardware montoring for Maxim MAX16064 Quad Power-Supply
|
||||
Controller with Active-Voltage Output Control and PMBus Interface.
|
||||
|
||||
The driver is a client driver to the core PMBus driver.
|
||||
Please see Documentation/hwmon/pmbus for details on PMBus client drivers.
|
||||
|
||||
|
||||
Usage Notes
|
||||
-----------
|
||||
|
||||
This driver does not auto-detect devices. You will have to instantiate the
|
||||
devices explicitly. Please see Documentation/i2c/instantiating-devices for
|
||||
details.
|
||||
|
||||
|
||||
Platform data support
|
||||
---------------------
|
||||
|
||||
The driver supports standard PMBus driver platform data.
|
||||
|
||||
|
||||
Sysfs entries
|
||||
-------------
|
||||
|
||||
The following attributes are supported. Limits are read-write; all other
|
||||
attributes are read-only.
|
||||
|
||||
in[1-4]_label "vout[1-4]"
|
||||
in[1-4]_input Measured voltage. From READ_VOUT register.
|
||||
in[1-4]_min Minumum Voltage. From VOUT_UV_WARN_LIMIT register.
|
||||
in[1-4]_max Maximum voltage. From VOUT_OV_WARN_LIMIT register.
|
||||
in[1-4]_lcrit Critical minumum Voltage. VOUT_UV_FAULT_LIMIT register.
|
||||
in[1-4]_crit Critical maximum voltage. From VOUT_OV_FAULT_LIMIT register.
|
||||
in[1-4]_min_alarm Voltage low alarm. From VOLTAGE_UV_WARNING status.
|
||||
in[1-4]_max_alarm Voltage high alarm. From VOLTAGE_OV_WARNING status.
|
||||
in[1-4]_lcrit_alarm Voltage critical low alarm. From VOLTAGE_UV_FAULT status.
|
||||
in[1-4]_crit_alarm Voltage critical high alarm. From VOLTAGE_OV_FAULT status.
|
||||
|
||||
temp1_input Measured temperature. From READ_TEMPERATURE_1 register.
|
||||
temp1_max Maximum temperature. From OT_WARN_LIMIT register.
|
||||
temp1_crit Critical high temperature. From OT_FAULT_LIMIT register.
|
||||
temp1_max_alarm Chip temperature high alarm. Set by comparing
|
||||
READ_TEMPERATURE_1 with OT_WARN_LIMIT if TEMP_OT_WARNING
|
||||
status is set.
|
||||
temp1_crit_alarm Chip temperature critical high alarm. Set by comparing
|
||||
READ_TEMPERATURE_1 with OT_FAULT_LIMIT if TEMP_OT_FAULT
|
||||
status is set.
|
|
@ -0,0 +1,79 @@
|
|||
Kernel driver max34440
|
||||
======================
|
||||
|
||||
Supported chips:
|
||||
* Maxim MAX34440
|
||||
Prefixes: 'max34440'
|
||||
Addresses scanned: -
|
||||
Datasheet: http://datasheets.maxim-ic.com/en/ds/MAX34440.pdf
|
||||
* Maxim MAX34441
|
||||
PMBus 5-Channel Power-Supply Manager and Intelligent Fan Controller
|
||||
Prefixes: 'max34441'
|
||||
Addresses scanned: -
|
||||
Datasheet: http://datasheets.maxim-ic.com/en/ds/MAX34441.pdf
|
||||
|
||||
Author: Guenter Roeck <guenter.roeck@ericsson.com>
|
||||
|
||||
|
||||
Description
|
||||
-----------
|
||||
|
||||
This driver supports hardware montoring for Maxim MAX34440 PMBus 6-Channel
|
||||
Power-Supply Manager and MAX34441 PMBus 5-Channel Power-Supply Manager
|
||||
and Intelligent Fan Controller.
|
||||
|
||||
The driver is a client driver to the core PMBus driver. Please see
|
||||
Documentation/hwmon/pmbus for details on PMBus client drivers.
|
||||
|
||||
|
||||
Usage Notes
|
||||
-----------
|
||||
|
||||
This driver does not auto-detect devices. You will have to instantiate the
|
||||
devices explicitly. Please see Documentation/i2c/instantiating-devices for
|
||||
details.
|
||||
|
||||
|
||||
Platform data support
|
||||
---------------------
|
||||
|
||||
The driver supports standard PMBus driver platform data.
|
||||
|
||||
|
||||
Sysfs entries
|
||||
-------------
|
||||
|
||||
The following attributes are supported. Limits are read-write; all other
|
||||
attributes are read-only.
|
||||
|
||||
in[1-6]_label "vout[1-6]".
|
||||
in[1-6]_input Measured voltage. From READ_VOUT register.
|
||||
in[1-6]_min Minumum Voltage. From VOUT_UV_WARN_LIMIT register.
|
||||
in[1-6]_max Maximum voltage. From VOUT_OV_WARN_LIMIT register.
|
||||
in[1-6]_lcrit Critical minumum Voltage. VOUT_UV_FAULT_LIMIT register.
|
||||
in[1-6]_crit Critical maximum voltage. From VOUT_OV_FAULT_LIMIT register.
|
||||
in[1-6]_min_alarm Voltage low alarm. From VOLTAGE_UV_WARNING status.
|
||||
in[1-6]_max_alarm Voltage high alarm. From VOLTAGE_OV_WARNING status.
|
||||
in[1-6]_lcrit_alarm Voltage critical low alarm. From VOLTAGE_UV_FAULT status.
|
||||
in[1-6]_crit_alarm Voltage critical high alarm. From VOLTAGE_OV_FAULT status.
|
||||
|
||||
curr[1-6]_label "iout[1-6]".
|
||||
curr[1-6]_input Measured current. From READ_IOUT register.
|
||||
curr[1-6]_max Maximum current. From IOUT_OC_WARN_LIMIT register.
|
||||
curr[1-6]_crit Critical maximum current. From IOUT_OC_FAULT_LIMIT register.
|
||||
curr[1-6]_max_alarm Current high alarm. From IOUT_OC_WARNING status.
|
||||
curr[1-6]_crit_alarm Current critical high alarm. From IOUT_OC_FAULT status.
|
||||
|
||||
in6 and curr6 attributes only exist for MAX34440.
|
||||
|
||||
temp[1-8]_input Measured temperatures. From READ_TEMPERATURE_1 register.
|
||||
temp1 is the chip's internal temperature. temp2..temp5
|
||||
are remote I2C temperature sensors. For MAX34441, temp6
|
||||
is a remote thermal-diode sensor. For MAX34440, temp6..8
|
||||
are remote I2C temperature sensors.
|
||||
temp[1-8]_max Maximum temperature. From OT_WARN_LIMIT register.
|
||||
temp[1-8]_crit Critical high temperature. From OT_FAULT_LIMIT register.
|
||||
temp[1-8]_max_alarm Temperature high alarm.
|
||||
temp[1-8]_crit_alarm Temperature critical high alarm.
|
||||
|
||||
temp7 and temp8 attributes only exist for MAX34440.
|
|
@ -0,0 +1,69 @@
|
|||
Kernel driver max8688
|
||||
=====================
|
||||
|
||||
Supported chips:
|
||||
* Maxim MAX8688
|
||||
Prefix: 'max8688'
|
||||
Addresses scanned: -
|
||||
Datasheet: http://datasheets.maxim-ic.com/en/ds/MAX8688.pdf
|
||||
|
||||
Author: Guenter Roeck <guenter.roeck@ericsson.com>
|
||||
|
||||
|
||||
Description
|
||||
-----------
|
||||
|
||||
This driver supports hardware montoring for Maxim MAX8688 Digital Power-Supply
|
||||
Controller/Monitor with PMBus Interface.
|
||||
|
||||
The driver is a client driver to the core PMBus driver. Please see
|
||||
Documentation/hwmon/pmbus for details on PMBus client drivers.
|
||||
|
||||
|
||||
Usage Notes
|
||||
-----------
|
||||
|
||||
This driver does not auto-detect devices. You will have to instantiate the
|
||||
devices explicitly. Please see Documentation/i2c/instantiating-devices for
|
||||
details.
|
||||
|
||||
|
||||
Platform data support
|
||||
---------------------
|
||||
|
||||
The driver supports standard PMBus driver platform data.
|
||||
|
||||
|
||||
Sysfs entries
|
||||
-------------
|
||||
|
||||
The following attributes are supported. Limits are read-write; all other
|
||||
attributes are read-only.
|
||||
|
||||
in1_label "vout1"
|
||||
in1_input Measured voltage. From READ_VOUT register.
|
||||
in1_min Minumum Voltage. From VOUT_UV_WARN_LIMIT register.
|
||||
in1_max Maximum voltage. From VOUT_OV_WARN_LIMIT register.
|
||||
in1_lcrit Critical minumum Voltage. VOUT_UV_FAULT_LIMIT register.
|
||||
in1_crit Critical maximum voltage. From VOUT_OV_FAULT_LIMIT register.
|
||||
in1_min_alarm Voltage low alarm. From VOLTAGE_UV_WARNING status.
|
||||
in1_max_alarm Voltage high alarm. From VOLTAGE_OV_WARNING status.
|
||||
in1_lcrit_alarm Voltage critical low alarm. From VOLTAGE_UV_FAULT status.
|
||||
in1_crit_alarm Voltage critical high alarm. From VOLTAGE_OV_FAULT status.
|
||||
|
||||
curr1_label "iout1"
|
||||
curr1_input Measured current. From READ_IOUT register.
|
||||
curr1_max Maximum current. From IOUT_OC_WARN_LIMIT register.
|
||||
curr1_crit Critical maximum current. From IOUT_OC_FAULT_LIMIT register.
|
||||
curr1_max_alarm Current high alarm. From IOUT_OC_WARN_LIMIT register.
|
||||
curr1_crit_alarm Current critical high alarm. From IOUT_OC_FAULT status.
|
||||
|
||||
temp1_input Measured temperature. From READ_TEMPERATURE_1 register.
|
||||
temp1_max Maximum temperature. From OT_WARN_LIMIT register.
|
||||
temp1_crit Critical high temperature. From OT_FAULT_LIMIT register.
|
||||
temp1_max_alarm Chip temperature high alarm. Set by comparing
|
||||
READ_TEMPERATURE_1 with OT_WARN_LIMIT if TEMP_OT_WARNING
|
||||
status is set.
|
||||
temp1_crit_alarm Chip temperature critical high alarm. Set by comparing
|
||||
READ_TEMPERATURE_1 with OT_FAULT_LIMIT if TEMP_OT_FAULT
|
||||
status is set.
|
|
@ -13,26 +13,6 @@ Supported chips:
|
|||
Prefix: 'ltc2978'
|
||||
Addresses scanned: -
|
||||
Datasheet: http://cds.linear.com/docs/Datasheet/2978fa.pdf
|
||||
* Maxim MAX16064
|
||||
Quad Power-Supply Controller
|
||||
Prefix: 'max16064'
|
||||
Addresses scanned: -
|
||||
Datasheet: http://datasheets.maxim-ic.com/en/ds/MAX16064.pdf
|
||||
* Maxim MAX34440
|
||||
PMBus 6-Channel Power-Supply Manager
|
||||
Prefixes: 'max34440'
|
||||
Addresses scanned: -
|
||||
Datasheet: http://datasheets.maxim-ic.com/en/ds/MAX34440.pdf
|
||||
* Maxim MAX34441
|
||||
PMBus 5-Channel Power-Supply Manager and Intelligent Fan Controller
|
||||
Prefixes: 'max34441'
|
||||
Addresses scanned: -
|
||||
Datasheet: http://datasheets.maxim-ic.com/en/ds/MAX34441.pdf
|
||||
* Maxim MAX8688
|
||||
Digital Power-Supply Controller/Monitor
|
||||
Prefix: 'max8688'
|
||||
Addresses scanned: -
|
||||
Datasheet: http://datasheets.maxim-ic.com/en/ds/MAX8688.pdf
|
||||
* Generic PMBus devices
|
||||
Prefix: 'pmbus'
|
||||
Addresses scanned: -
|
||||
|
@ -175,11 +155,13 @@ currX_crit Critical maximum current.
|
|||
From IIN_OC_FAULT_LIMIT or IOUT_OC_FAULT_LIMIT register.
|
||||
currX_alarm Current high alarm.
|
||||
From IIN_OC_WARNING or IOUT_OC_WARNING status.
|
||||
currX_max_alarm Current high alarm.
|
||||
From IIN_OC_WARN_LIMIT or IOUT_OC_WARN_LIMIT status.
|
||||
currX_lcrit_alarm Output current critical low alarm.
|
||||
From IOUT_UC_FAULT status.
|
||||
currX_crit_alarm Current critical high alarm.
|
||||
From IIN_OC_FAULT or IOUT_OC_FAULT status.
|
||||
currX_label "iin" or "vinY"
|
||||
currX_label "iin" or "ioutY"
|
||||
|
||||
powerX_input Measured power. From READ_PIN or READ_POUT register.
|
||||
powerX_cap Output power cap. From POUT_MAX register.
|
||||
|
@ -193,13 +175,13 @@ powerX_crit_alarm Output power critical high alarm.
|
|||
From POUT_OP_FAULT status.
|
||||
powerX_label "pin" or "poutY"
|
||||
|
||||
tempX_input Measured tempererature.
|
||||
tempX_input Measured temperature.
|
||||
From READ_TEMPERATURE_X register.
|
||||
tempX_min Mimimum tempererature. From UT_WARN_LIMIT register.
|
||||
tempX_max Maximum tempererature. From OT_WARN_LIMIT register.
|
||||
tempX_lcrit Critical low tempererature.
|
||||
tempX_min Mimimum temperature. From UT_WARN_LIMIT register.
|
||||
tempX_max Maximum temperature. From OT_WARN_LIMIT register.
|
||||
tempX_lcrit Critical low temperature.
|
||||
From UT_FAULT_LIMIT register.
|
||||
tempX_crit Critical high tempererature.
|
||||
tempX_crit Critical high temperature.
|
||||
From OT_FAULT_LIMIT register.
|
||||
tempX_min_alarm Chip temperature low alarm. Set by comparing
|
||||
READ_TEMPERATURE_X with UT_WARN_LIMIT if
|
||||
|
|
|
@ -150,8 +150,8 @@ in8_crit_alarm Channel F critical alarm
|
|||
in9_crit_alarm AIN1 critical alarm
|
||||
in10_crit_alarm AIN2 critical alarm
|
||||
|
||||
temp1_input Chip tempererature
|
||||
temp1_min Mimimum chip tempererature
|
||||
temp1_max Maximum chip tempererature
|
||||
temp1_crit Critical chip tempererature
|
||||
temp1_input Chip temperature
|
||||
temp1_min Mimimum chip temperature
|
||||
temp1_max Maximum chip temperature
|
||||
temp1_crit Critical chip temperature
|
||||
temp1_crit_alarm Temperature critical alarm
|
||||
|
|
|
@ -0,0 +1,109 @@
|
|||
How to Get Your Patch Accepted Into the Hwmon Subsystem
|
||||
-------------------------------------------------------
|
||||
|
||||
This text is is a collection of suggestions for people writing patches or
|
||||
drivers for the hwmon subsystem. Following these suggestions will greatly
|
||||
increase the chances of your change being accepted.
|
||||
|
||||
|
||||
1. General
|
||||
----------
|
||||
|
||||
* It should be unnecessary to mention, but please read and follow
|
||||
Documentation/SubmitChecklist
|
||||
Documentation/SubmittingDrivers
|
||||
Documentation/SubmittingPatches
|
||||
Documentation/CodingStyle
|
||||
|
||||
* If your patch generates checkpatch warnings, please refrain from explanations
|
||||
such as "I don't like that coding style". Keep in mind that each unnecessary
|
||||
warning helps hiding a real problem. If you don't like the kernel coding
|
||||
style, don't write kernel drivers.
|
||||
|
||||
* Please test your patch thoroughly. We are not your test group.
|
||||
Sometimes a patch can not or not completely be tested because of missing
|
||||
hardware. In such cases, you should test-build the code on at least one
|
||||
architecture. If run-time testing was not achieved, it should be written
|
||||
explicitly below the patch header.
|
||||
|
||||
* If your patch (or the driver) is affected by configuration options such as
|
||||
CONFIG_SMP or CONFIG_HOTPLUG, make sure it compiles for all configuration
|
||||
variants.
|
||||
|
||||
|
||||
2. Adding functionality to existing drivers
|
||||
-------------------------------------------
|
||||
|
||||
* Make sure the documentation in Documentation/hwmon/<driver_name> is up to
|
||||
date.
|
||||
|
||||
* Make sure the information in Kconfig is up to date.
|
||||
|
||||
* If the added functionality requires some cleanup or structural changes, split
|
||||
your patch into a cleanup part and the actual addition. This makes it easier
|
||||
to review your changes, and to bisect any resulting problems.
|
||||
|
||||
* Never mix bug fixes, cleanup, and functional enhancements in a single patch.
|
||||
|
||||
|
||||
3. New drivers
|
||||
--------------
|
||||
|
||||
* Running your patch or driver file(s) through checkpatch does not mean its
|
||||
formatting is clean. If unsure about formatting in your new driver, run it
|
||||
through Lindent. Lindent is not perfect, and you may have to do some minor
|
||||
cleanup, but it is a good start.
|
||||
|
||||
* Consider adding yourself to MAINTAINERS.
|
||||
|
||||
* Document the driver in Documentation/hwmon/<driver_name>.
|
||||
|
||||
* Add the driver to Kconfig and Makefile in alphabetical order.
|
||||
|
||||
* Make sure that all dependencies are listed in Kconfig. For new drivers, it
|
||||
is most likely prudent to add a dependency on EXPERIMENTAL.
|
||||
|
||||
* Avoid forward declarations if you can. Rearrange the code if necessary.
|
||||
|
||||
* Avoid calculations in macros and macro-generated functions. While such macros
|
||||
may save a line or so in the source, it obfuscates the code and makes code
|
||||
review more difficult. It may also result in code which is more complicated
|
||||
than necessary. Use inline functions or just regular functions instead.
|
||||
|
||||
* If the driver has a detect function, make sure it is silent. Debug messages
|
||||
and messages printed after a successful detection are acceptable, but it
|
||||
must not print messages such as "Chip XXX not found/supported".
|
||||
|
||||
Keep in mind that the detect function will run for all drivers supporting an
|
||||
address if a chip is detected on that address. Unnecessary messages will just
|
||||
pollute the kernel log and not provide any value.
|
||||
|
||||
* Provide a detect function if and only if a chip can be detected reliably.
|
||||
|
||||
* Avoid writing to chip registers in the detect function. If you have to write,
|
||||
only do it after you have already gathered enough data to be certain that the
|
||||
detection is going to be successful.
|
||||
|
||||
Keep in mind that the chip might not be what your driver believes it is, and
|
||||
writing to it might cause a bad misconfiguration.
|
||||
|
||||
* Make sure there are no race conditions in the probe function. Specifically,
|
||||
completely initialize your chip first, then create sysfs entries and register
|
||||
with the hwmon subsystem.
|
||||
|
||||
* Do not provide support for deprecated sysfs attributes.
|
||||
|
||||
* Do not create non-standard attributes unless really needed. If you have to use
|
||||
non-standard attributes, or you believe you do, discuss it on the mailing list
|
||||
first. Either case, provide a detailed explanation why you need the
|
||||
non-standard attribute(s).
|
||||
Standard attributes are specified in Documentation/hwmon/sysfs-interface.
|
||||
|
||||
* When deciding which sysfs attributes to support, look at the chip's
|
||||
capabilities. While we do not expect your driver to support everything the
|
||||
chip may offer, it should at least support all limits and alarms.
|
||||
|
||||
* Last but not least, please check if a driver for your chip already exists
|
||||
before starting to write a new driver. Especially for temperature sensors,
|
||||
new chips are often variants of previously released chips. In some cases,
|
||||
a presumably new chip may simply have been relabeled.
|
|
@ -0,0 +1,262 @@
|
|||
The input protocol uses a map of types and codes to express input device values
|
||||
to userspace. This document describes the types and codes and how and when they
|
||||
may be used.
|
||||
|
||||
A single hardware event generates multiple input events. Each input event
|
||||
contains the new value of a single data item. A special event type, EV_SYN, is
|
||||
used to separate input events into packets of input data changes occurring at
|
||||
the same moment in time. In the following, the term "event" refers to a single
|
||||
input event encompassing a type, code, and value.
|
||||
|
||||
The input protocol is a stateful protocol. Events are emitted only when values
|
||||
of event codes have changed. However, the state is maintained within the Linux
|
||||
input subsystem; drivers do not need to maintain the state and may attempt to
|
||||
emit unchanged values without harm. Userspace may obtain the current state of
|
||||
event code values using the EVIOCG* ioctls defined in linux/input.h. The event
|
||||
reports supported by a device are also provided by sysfs in
|
||||
class/input/event*/device/capabilities/, and the properties of a device are
|
||||
provided in class/input/event*/device/properties.
|
||||
|
||||
Types:
|
||||
==========
|
||||
Types are groupings of codes under a logical input construct. Each type has a
|
||||
set of applicable codes to be used in generating events. See the Codes section
|
||||
for details on valid codes for each type.
|
||||
|
||||
* EV_SYN:
|
||||
- Used as markers to separate events. Events may be separated in time or in
|
||||
space, such as with the multitouch protocol.
|
||||
|
||||
* EV_KEY:
|
||||
- Used to describe state changes of keyboards, buttons, or other key-like
|
||||
devices.
|
||||
|
||||
* EV_REL:
|
||||
- Used to describe relative axis value changes, e.g. moving the mouse 5 units
|
||||
to the left.
|
||||
|
||||
* EV_ABS:
|
||||
- Used to describe absolute axis value changes, e.g. describing the
|
||||
coordinates of a touch on a touchscreen.
|
||||
|
||||
* EV_MSC:
|
||||
- Used to describe miscellaneous input data that do not fit into other types.
|
||||
|
||||
* EV_SW:
|
||||
- Used to describe binary state input switches.
|
||||
|
||||
* EV_LED:
|
||||
- Used to turn LEDs on devices on and off.
|
||||
|
||||
* EV_SND:
|
||||
- Used to output sound to devices.
|
||||
|
||||
* EV_REP:
|
||||
- Used for autorepeating devices.
|
||||
|
||||
* EV_FF:
|
||||
- Used to send force feedback commands to an input device.
|
||||
|
||||
* EV_PWR:
|
||||
- A special type for power button and switch input.
|
||||
|
||||
* EV_FF_STATUS:
|
||||
- Used to receive force feedback device status.
|
||||
|
||||
Codes:
|
||||
==========
|
||||
Codes define the precise type of event.
|
||||
|
||||
EV_SYN:
|
||||
----------
|
||||
EV_SYN event values are undefined. Their usage is defined only by when they are
|
||||
sent in the evdev event stream.
|
||||
|
||||
* SYN_REPORT:
|
||||
- Used to synchronize and separate events into packets of input data changes
|
||||
occurring at the same moment in time. For example, motion of a mouse may set
|
||||
the REL_X and REL_Y values for one motion, then emit a SYN_REPORT. The next
|
||||
motion will emit more REL_X and REL_Y values and send another SYN_REPORT.
|
||||
|
||||
* SYN_CONFIG:
|
||||
- TBD
|
||||
|
||||
* SYN_MT_REPORT:
|
||||
- Used to synchronize and separate touch events. See the
|
||||
multi-touch-protocol.txt document for more information.
|
||||
|
||||
* SYN_DROPPED:
|
||||
- Used to indicate buffer overrun in the evdev client's event queue.
|
||||
Client should ignore all events up to and including next SYN_REPORT
|
||||
event and query the device (using EVIOCG* ioctls) to obtain its
|
||||
current state.
|
||||
|
||||
EV_KEY:
|
||||
----------
|
||||
EV_KEY events take the form KEY_<name> or BTN_<name>. For example, KEY_A is used
|
||||
to represent the 'A' key on a keyboard. When a key is depressed, an event with
|
||||
the key's code is emitted with value 1. When the key is released, an event is
|
||||
emitted with value 0. Some hardware send events when a key is repeated. These
|
||||
events have a value of 2. In general, KEY_<name> is used for keyboard keys, and
|
||||
BTN_<name> is used for other types of momentary switch events.
|
||||
|
||||
A few EV_KEY codes have special meanings:
|
||||
|
||||
* BTN_TOOL_<name>:
|
||||
- These codes are used in conjunction with input trackpads, tablets, and
|
||||
touchscreens. These devices may be used with fingers, pens, or other tools.
|
||||
When an event occurs and a tool is used, the corresponding BTN_TOOL_<name>
|
||||
code should be set to a value of 1. When the tool is no longer interacting
|
||||
with the input device, the BTN_TOOL_<name> code should be reset to 0. All
|
||||
trackpads, tablets, and touchscreens should use at least one BTN_TOOL_<name>
|
||||
code when events are generated.
|
||||
|
||||
* BTN_TOUCH:
|
||||
BTN_TOUCH is used for touch contact. While an input tool is determined to be
|
||||
within meaningful physical contact, the value of this property must be set
|
||||
to 1. Meaningful physical contact may mean any contact, or it may mean
|
||||
contact conditioned by an implementation defined property. For example, a
|
||||
touchpad may set the value to 1 only when the touch pressure rises above a
|
||||
certain value. BTN_TOUCH may be combined with BTN_TOOL_<name> codes. For
|
||||
example, a pen tablet may set BTN_TOOL_PEN to 1 and BTN_TOUCH to 0 while the
|
||||
pen is hovering over but not touching the tablet surface.
|
||||
|
||||
Note: For appropriate function of the legacy mousedev emulation driver,
|
||||
BTN_TOUCH must be the first evdev code emitted in a synchronization frame.
|
||||
|
||||
Note: Historically a touch device with BTN_TOOL_FINGER and BTN_TOUCH was
|
||||
interpreted as a touchpad by userspace, while a similar device without
|
||||
BTN_TOOL_FINGER was interpreted as a touchscreen. For backwards compatibility
|
||||
with current userspace it is recommended to follow this distinction. In the
|
||||
future, this distinction will be deprecated and the device properties ioctl
|
||||
EVIOCGPROP, defined in linux/input.h, will be used to convey the device type.
|
||||
|
||||
* BTN_TOOL_FINGER, BTN_TOOL_DOUBLETAP, BTN_TOOL_TRIPLETAP, BTN_TOOL_QUADTAP:
|
||||
- These codes denote one, two, three, and four finger interaction on a
|
||||
trackpad or touchscreen. For example, if the user uses two fingers and moves
|
||||
them on the touchpad in an effort to scroll content on screen,
|
||||
BTN_TOOL_DOUBLETAP should be set to value 1 for the duration of the motion.
|
||||
Note that all BTN_TOOL_<name> codes and the BTN_TOUCH code are orthogonal in
|
||||
purpose. A trackpad event generated by finger touches should generate events
|
||||
for one code from each group. At most only one of these BTN_TOOL_<name>
|
||||
codes should have a value of 1 during any synchronization frame.
|
||||
|
||||
Note: Historically some drivers emitted multiple of the finger count codes with
|
||||
a value of 1 in the same synchronization frame. This usage is deprecated.
|
||||
|
||||
Note: In multitouch drivers, the input_mt_report_finger_count() function should
|
||||
be used to emit these codes. Please see multi-touch-protocol.txt for details.
|
||||
|
||||
EV_REL:
|
||||
----------
|
||||
EV_REL events describe relative changes in a property. For example, a mouse may
|
||||
move to the left by a certain number of units, but its absolute position in
|
||||
space is unknown. If the absolute position is known, EV_ABS codes should be used
|
||||
instead of EV_REL codes.
|
||||
|
||||
A few EV_REL codes have special meanings:
|
||||
|
||||
* REL_WHEEL, REL_HWHEEL:
|
||||
- These codes are used for vertical and horizontal scroll wheels,
|
||||
respectively.
|
||||
|
||||
EV_ABS:
|
||||
----------
|
||||
EV_ABS events describe absolute changes in a property. For example, a touchpad
|
||||
may emit coordinates for a touch location.
|
||||
|
||||
A few EV_ABS codes have special meanings:
|
||||
|
||||
* ABS_DISTANCE:
|
||||
- Used to describe the distance of a tool from an interaction surface. This
|
||||
event should only be emitted while the tool is hovering, meaning in close
|
||||
proximity of the device and while the value of the BTN_TOUCH code is 0. If
|
||||
the input device may be used freely in three dimensions, consider ABS_Z
|
||||
instead.
|
||||
|
||||
* ABS_MT_<name>:
|
||||
- Used to describe multitouch input events. Please see
|
||||
multi-touch-protocol.txt for details.
|
||||
|
||||
EV_SW:
|
||||
----------
|
||||
EV_SW events describe stateful binary switches. For example, the SW_LID code is
|
||||
used to denote when a laptop lid is closed.
|
||||
|
||||
Upon binding to a device or resuming from suspend, a driver must report
|
||||
the current switch state. This ensures that the device, kernel, and userspace
|
||||
state is in sync.
|
||||
|
||||
Upon resume, if the switch state is the same as before suspend, then the input
|
||||
subsystem will filter out the duplicate switch state reports. The driver does
|
||||
not need to keep the state of the switch at any time.
|
||||
|
||||
EV_MSC:
|
||||
----------
|
||||
EV_MSC events are used for input and output events that do not fall under other
|
||||
categories.
|
||||
|
||||
EV_LED:
|
||||
----------
|
||||
EV_LED events are used for input and output to set and query the state of
|
||||
various LEDs on devices.
|
||||
|
||||
EV_REP:
|
||||
----------
|
||||
EV_REP events are used for specifying autorepeating events.
|
||||
|
||||
EV_SND:
|
||||
----------
|
||||
EV_SND events are used for sending sound commands to simple sound output
|
||||
devices.
|
||||
|
||||
EV_FF:
|
||||
----------
|
||||
EV_FF events are used to initialize a force feedback capable device and to cause
|
||||
such device to feedback.
|
||||
|
||||
EV_PWR:
|
||||
----------
|
||||
EV_PWR events are a special type of event used specifically for power
|
||||
mangement. Its usage is not well defined. To be addressed later.
|
||||
|
||||
Guidelines:
|
||||
==========
|
||||
The guidelines below ensure proper single-touch and multi-finger functionality.
|
||||
For multi-touch functionality, see the multi-touch-protocol.txt document for
|
||||
more information.
|
||||
|
||||
Mice:
|
||||
----------
|
||||
REL_{X,Y} must be reported when the mouse moves. BTN_LEFT must be used to report
|
||||
the primary button press. BTN_{MIDDLE,RIGHT,4,5,etc.} should be used to report
|
||||
further buttons of the device. REL_WHEEL and REL_HWHEEL should be used to report
|
||||
scroll wheel events where available.
|
||||
|
||||
Touchscreens:
|
||||
----------
|
||||
ABS_{X,Y} must be reported with the location of the touch. BTN_TOUCH must be
|
||||
used to report when a touch is active on the screen.
|
||||
BTN_{MOUSE,LEFT,MIDDLE,RIGHT} must not be reported as the result of touch
|
||||
contact. BTN_TOOL_<name> events should be reported where possible.
|
||||
|
||||
Trackpads:
|
||||
----------
|
||||
Legacy trackpads that only provide relative position information must report
|
||||
events like mice described above.
|
||||
|
||||
Trackpads that provide absolute touch position must report ABS_{X,Y} for the
|
||||
location of the touch. BTN_TOUCH should be used to report when a touch is active
|
||||
on the trackpad. Where multi-finger support is available, BTN_TOOL_<name> should
|
||||
be used to report the number of touches active on the trackpad.
|
||||
|
||||
Tablets:
|
||||
----------
|
||||
BTN_TOOL_<name> events must be reported when a stylus or other tool is active on
|
||||
the tablet. ABS_{X,Y} must be reported with the location of the tool. BTN_TOUCH
|
||||
should be used to report when the tool is in contact with the tablet.
|
||||
BTN_{STYLUS,STYLUS2} should be used to report buttons on the tool itself. Any
|
||||
button may be used for buttons on the tablet except BTN_{MOUSE,LEFT}.
|
||||
BTN_{0,1,2,etc} are good generic codes for unlabeled buttons. Do not use
|
||||
meaningful buttons, like BTN_FORWARD, unless the button is labeled for that
|
||||
purpose on the device.
|
|
@ -552,6 +552,16 @@ also have
|
|||
within the array where IO will be blocked. This is currently
|
||||
only supported for raid4/5/6.
|
||||
|
||||
sync_min
|
||||
sync_max
|
||||
The two values, given as numbers of sectors, indicate a range
|
||||
withing the array where 'check'/'repair' will operate. Must be
|
||||
a multiple of chunk_size. When it reaches "sync_max" it will
|
||||
pause, rather than complete.
|
||||
You can use 'select' or 'poll' on "sync_completed" to wait for
|
||||
that number to reach sync_max. Then you can either increase
|
||||
"sync_max", or can write 'idle' to "sync_action".
|
||||
|
||||
|
||||
Each active md device may also have attributes specific to the
|
||||
personality module that manages it.
|
||||
|
|
54
MAINTAINERS
54
MAINTAINERS
|
@ -151,6 +151,7 @@ S: Maintained
|
|||
F: drivers/net/hamradio/6pack.c
|
||||
|
||||
8169 10/100/1000 GIGABIT ETHERNET DRIVER
|
||||
M: Realtek linux nic maintainers <nic_swsd@realtek.com>
|
||||
M: Francois Romieu <romieu@fr.zoreil.com>
|
||||
L: netdev@vger.kernel.org
|
||||
S: Maintained
|
||||
|
@ -184,10 +185,9 @@ F: Documentation/filesystems/9p.txt
|
|||
F: fs/9p/
|
||||
|
||||
A2232 SERIAL BOARD DRIVER
|
||||
M: Enver Haase <A2232@gmx.net>
|
||||
L: linux-m68k@lists.linux-m68k.org
|
||||
S: Maintained
|
||||
F: drivers/char/ser_a2232*
|
||||
S: Orphan
|
||||
F: drivers/staging/generic_serial/ser_a2232*
|
||||
|
||||
AACRAID SCSI RAID DRIVER
|
||||
M: Adaptec OEM Raid Solutions <aacraid@adaptec.com>
|
||||
|
@ -877,6 +877,13 @@ F: arch/arm/mach-mv78xx0/
|
|||
F: arch/arm/mach-orion5x/
|
||||
F: arch/arm/plat-orion/
|
||||
|
||||
ARM/Orion SoC/Technologic Systems TS-78xx platform support
|
||||
M: Alexander Clouter <alex@digriz.org.uk>
|
||||
L: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
|
||||
W: http://www.digriz.org.uk/ts78xx/kernel
|
||||
S: Maintained
|
||||
F: arch/arm/mach-orion5x/ts78xx-*
|
||||
|
||||
ARM/MIOA701 MACHINE SUPPORT
|
||||
M: Robert Jarzmik <robert.jarzmik@free.fr>
|
||||
L: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
|
||||
|
@ -1063,7 +1070,7 @@ F: arch/arm/mach-shmobile/
|
|||
F: drivers/sh/
|
||||
|
||||
ARM/TELECHIPS ARM ARCHITECTURE
|
||||
M: "Hans J. Koch" <hjk@linutronix.de>
|
||||
M: "Hans J. Koch" <hjk@hansjkoch.de>
|
||||
L: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
|
||||
S: Maintained
|
||||
F: arch/arm/plat-tcc/
|
||||
|
@ -1823,11 +1830,10 @@ S: Maintained
|
|||
F: drivers/platform/x86/compal-laptop.c
|
||||
|
||||
COMPUTONE INTELLIPORT MULTIPORT CARD
|
||||
M: "Michael H. Warfield" <mhw@wittsend.com>
|
||||
W: http://www.wittsend.com/computone.html
|
||||
S: Maintained
|
||||
S: Orphan
|
||||
F: Documentation/serial/computone.txt
|
||||
F: drivers/char/ip2/
|
||||
F: drivers/staging/tty/ip2/
|
||||
|
||||
CONEXANT ACCESSRUNNER USB DRIVER
|
||||
M: Simon Arlott <cxacru@fire.lp0.eu>
|
||||
|
@ -2010,7 +2016,7 @@ F: drivers/net/wan/cycx*
|
|||
CYCLADES ASYNC MUX DRIVER
|
||||
W: http://www.cyclades.com/
|
||||
S: Orphan
|
||||
F: drivers/char/cyclades.c
|
||||
F: drivers/tty/cyclades.c
|
||||
F: include/linux/cyclades.h
|
||||
|
||||
CYCLADES PC300 DRIVER
|
||||
|
@ -2124,8 +2130,8 @@ L: Eng.Linux@digi.com
|
|||
W: http://www.digi.com
|
||||
S: Orphan
|
||||
F: Documentation/serial/digiepca.txt
|
||||
F: drivers/char/epca*
|
||||
F: drivers/char/digi*
|
||||
F: drivers/staging/tty/epca*
|
||||
F: drivers/staging/tty/digi*
|
||||
|
||||
DIOLAN U2C-12 I2C DRIVER
|
||||
M: Guenter Roeck <guenter.roeck@ericsson.com>
|
||||
|
@ -4077,7 +4083,7 @@ F: drivers/video/matrox/matroxfb_*
|
|||
F: include/linux/matroxfb.h
|
||||
|
||||
MAX6650 HARDWARE MONITOR AND FAN CONTROLLER DRIVER
|
||||
M: "Hans J. Koch" <hjk@linutronix.de>
|
||||
M: "Hans J. Koch" <hjk@hansjkoch.de>
|
||||
L: lm-sensors@lm-sensors.org
|
||||
S: Maintained
|
||||
F: Documentation/hwmon/max6650
|
||||
|
@ -4192,7 +4198,7 @@ MOXA SMARTIO/INDUSTIO/INTELLIO SERIAL CARD
|
|||
M: Jiri Slaby <jirislaby@gmail.com>
|
||||
S: Maintained
|
||||
F: Documentation/serial/moxa-smartio
|
||||
F: drivers/char/mxser.*
|
||||
F: drivers/tty/mxser.*
|
||||
|
||||
MSI LAPTOP SUPPORT
|
||||
M: "Lee, Chun-Yi" <jlee@novell.com>
|
||||
|
@ -4234,7 +4240,7 @@ F: sound/oss/msnd*
|
|||
|
||||
MULTITECH MULTIPORT CARD (ISICOM)
|
||||
S: Orphan
|
||||
F: drivers/char/isicom.c
|
||||
F: drivers/tty/isicom.c
|
||||
F: include/linux/isicom.h
|
||||
|
||||
MUSB MULTIPOINT HIGH SPEED DUAL-ROLE CONTROLLER
|
||||
|
@ -5273,14 +5279,14 @@ F: drivers/memstick/host/r592.*
|
|||
RISCOM8 DRIVER
|
||||
S: Orphan
|
||||
F: Documentation/serial/riscom8.txt
|
||||
F: drivers/char/riscom8*
|
||||
F: drivers/staging/tty/riscom8*
|
||||
|
||||
ROCKETPORT DRIVER
|
||||
P: Comtrol Corp.
|
||||
W: http://www.comtrol.com
|
||||
S: Maintained
|
||||
F: Documentation/serial/rocket.txt
|
||||
F: drivers/char/rocket*
|
||||
F: drivers/tty/rocket*
|
||||
|
||||
ROSE NETWORK LAYER
|
||||
M: Ralf Baechle <ralf@linux-mips.org>
|
||||
|
@ -5916,10 +5922,9 @@ F: arch/arm/mach-spear6xx/spear600.c
|
|||
F: arch/arm/mach-spear6xx/spear600_evb.c
|
||||
|
||||
SPECIALIX IO8+ MULTIPORT SERIAL CARD DRIVER
|
||||
M: Roger Wolff <R.E.Wolff@BitWizard.nl>
|
||||
S: Supported
|
||||
S: Orphan
|
||||
F: Documentation/serial/specialix.txt
|
||||
F: drivers/char/specialix*
|
||||
F: drivers/staging/tty/specialix*
|
||||
|
||||
SPI SUBSYSTEM
|
||||
M: David Brownell <dbrownell@users.sourceforge.net>
|
||||
|
@ -5964,7 +5969,6 @@ F: arch/alpha/kernel/srm_env.c
|
|||
|
||||
STABLE BRANCH
|
||||
M: Greg Kroah-Hartman <greg@kroah.com>
|
||||
M: Chris Wright <chrisw@sous-sol.org>
|
||||
L: stable@kernel.org
|
||||
S: Maintained
|
||||
|
||||
|
@ -6248,7 +6252,8 @@ M: Greg Ungerer <gerg@uclinux.org>
|
|||
W: http://www.uclinux.org/
|
||||
L: uclinux-dev@uclinux.org (subscribers-only)
|
||||
S: Maintained
|
||||
F: arch/m68knommu/
|
||||
F: arch/m68k/*/*_no.*
|
||||
F: arch/m68k/include/asm/*_no.*
|
||||
|
||||
UCLINUX FOR RENESAS H8/300 (H8300)
|
||||
M: Yoshinori Sato <ysato@users.sourceforge.jp>
|
||||
|
@ -6618,7 +6623,7 @@ F: fs/hostfs/
|
|||
F: fs/hppfs/
|
||||
|
||||
USERSPACE I/O (UIO)
|
||||
M: "Hans J. Koch" <hjk@linutronix.de>
|
||||
M: "Hans J. Koch" <hjk@hansjkoch.de>
|
||||
M: Greg Kroah-Hartman <gregkh@suse.de>
|
||||
S: Maintained
|
||||
F: Documentation/DocBook/uio-howto.tmpl
|
||||
|
@ -6916,6 +6921,13 @@ T: git git://git.kernel.org/pub/scm/linux/kernel/git/mjg59/platform-drivers-x86.
|
|||
S: Maintained
|
||||
F: drivers/platform/x86
|
||||
|
||||
XEN NETWORK BACKEND DRIVER
|
||||
M: Ian Campbell <ian.campbell@citrix.com>
|
||||
L: xen-devel@lists.xensource.com (moderated for non-subscribers)
|
||||
L: netdev@vger.kernel.org
|
||||
S: Supported
|
||||
F: drivers/net/xen-netback/*
|
||||
|
||||
XEN PCI SUBSYSTEM
|
||||
M: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
|
||||
L: xen-devel@lists.xensource.com (moderated for non-subscribers)
|
||||
|
|
2
Makefile
2
Makefile
|
@ -1,7 +1,7 @@
|
|||
VERSION = 2
|
||||
PATCHLEVEL = 6
|
||||
SUBLEVEL = 39
|
||||
EXTRAVERSION = -rc2
|
||||
EXTRAVERSION = -rc4
|
||||
NAME = Flesh-Eating Bats with Fangs
|
||||
|
||||
# *DOCUMENTATION*
|
||||
|
|
|
@ -4,7 +4,7 @@
|
|||
|
||||
extra-y := head.o vmlinux.lds
|
||||
asflags-y := $(KBUILD_CFLAGS)
|
||||
ccflags-y := -Werror -Wno-sign-compare
|
||||
ccflags-y := -Wno-sign-compare
|
||||
|
||||
obj-y := entry.o traps.o process.o init_task.o osf_sys.o irq.o \
|
||||
irq_alpha.o signal.o setup.o ptrace.o time.o \
|
||||
|
|
|
@ -88,7 +88,7 @@ conf_read(unsigned long addr, unsigned char type1,
|
|||
{
|
||||
unsigned long flags;
|
||||
unsigned long mid = MCPCIA_HOSE2MID(hose->index);
|
||||
unsigned int stat0, value, temp, cpu;
|
||||
unsigned int stat0, value, cpu;
|
||||
|
||||
cpu = smp_processor_id();
|
||||
|
||||
|
@ -101,7 +101,7 @@ conf_read(unsigned long addr, unsigned char type1,
|
|||
stat0 = *(vuip)MCPCIA_CAP_ERR(mid);
|
||||
*(vuip)MCPCIA_CAP_ERR(mid) = stat0;
|
||||
mb();
|
||||
temp = *(vuip)MCPCIA_CAP_ERR(mid);
|
||||
*(vuip)MCPCIA_CAP_ERR(mid);
|
||||
DBG_CFG(("conf_read: MCPCIA_CAP_ERR(%d) was 0x%x\n", mid, stat0));
|
||||
|
||||
mb();
|
||||
|
@ -136,7 +136,7 @@ conf_write(unsigned long addr, unsigned int value, unsigned char type1,
|
|||
{
|
||||
unsigned long flags;
|
||||
unsigned long mid = MCPCIA_HOSE2MID(hose->index);
|
||||
unsigned int stat0, temp, cpu;
|
||||
unsigned int stat0, cpu;
|
||||
|
||||
cpu = smp_processor_id();
|
||||
|
||||
|
@ -145,7 +145,7 @@ conf_write(unsigned long addr, unsigned int value, unsigned char type1,
|
|||
/* Reset status register to avoid losing errors. */
|
||||
stat0 = *(vuip)MCPCIA_CAP_ERR(mid);
|
||||
*(vuip)MCPCIA_CAP_ERR(mid) = stat0; mb();
|
||||
temp = *(vuip)MCPCIA_CAP_ERR(mid);
|
||||
*(vuip)MCPCIA_CAP_ERR(mid);
|
||||
DBG_CFG(("conf_write: MCPCIA CAP_ERR(%d) was 0x%x\n", mid, stat0));
|
||||
|
||||
draina();
|
||||
|
@ -157,7 +157,7 @@ conf_write(unsigned long addr, unsigned int value, unsigned char type1,
|
|||
*((vuip)addr) = value;
|
||||
mb();
|
||||
mb(); /* magic */
|
||||
temp = *(vuip)MCPCIA_CAP_ERR(mid); /* read to force the write */
|
||||
*(vuip)MCPCIA_CAP_ERR(mid); /* read to force the write */
|
||||
mcheck_expected(cpu) = 0;
|
||||
mb();
|
||||
|
||||
|
@ -572,12 +572,10 @@ mcpcia_print_system_area(unsigned long la_ptr)
|
|||
void
|
||||
mcpcia_machine_check(unsigned long vector, unsigned long la_ptr)
|
||||
{
|
||||
struct el_common *mchk_header;
|
||||
struct el_MCPCIA_uncorrected_frame_mcheck *mchk_logout;
|
||||
unsigned int cpu = smp_processor_id();
|
||||
int expected;
|
||||
|
||||
mchk_header = (struct el_common *)la_ptr;
|
||||
mchk_logout = (struct el_MCPCIA_uncorrected_frame_mcheck *)la_ptr;
|
||||
expected = mcheck_expected(cpu);
|
||||
|
||||
|
|
|
@ -533,8 +533,6 @@ static struct el_subpacket_annotation el_titan_annotations[] = {
|
|||
static struct el_subpacket *
|
||||
el_process_regatta_subpacket(struct el_subpacket *header)
|
||||
{
|
||||
int status;
|
||||
|
||||
if (header->class != EL_CLASS__REGATTA_FAMILY) {
|
||||
printk("%s ** Unexpected header CLASS %d TYPE %d, aborting\n",
|
||||
err_print_prefix,
|
||||
|
@ -551,7 +549,7 @@ el_process_regatta_subpacket(struct el_subpacket *header)
|
|||
printk("%s ** Occurred on CPU %d:\n",
|
||||
err_print_prefix,
|
||||
(int)header->by_type.regatta_frame.cpuid);
|
||||
status = privateer_process_logout_frame((struct el_common *)
|
||||
privateer_process_logout_frame((struct el_common *)
|
||||
header->by_type.regatta_frame.data_start, 1);
|
||||
break;
|
||||
default:
|
||||
|
|
|
@ -228,7 +228,7 @@ struct irqaction timer_irqaction = {
|
|||
void __init
|
||||
init_rtc_irq(void)
|
||||
{
|
||||
irq_set_chip_and_handler_name(RTC_IRQ, &no_irq_chip,
|
||||
irq_set_chip_and_handler_name(RTC_IRQ, &dummy_irq_chip,
|
||||
handle_simple_irq, "RTC");
|
||||
setup_irq(RTC_IRQ, &timer_irqaction);
|
||||
}
|
||||
|
|
|
@ -1404,8 +1404,6 @@ determine_cpu_caches (unsigned int cpu_type)
|
|||
case PCA56_CPU:
|
||||
case PCA57_CPU:
|
||||
{
|
||||
unsigned long cbox_config, size;
|
||||
|
||||
if (cpu_type == PCA56_CPU) {
|
||||
L1I = CSHAPE(16*1024, 6, 1);
|
||||
L1D = CSHAPE(8*1024, 5, 1);
|
||||
|
@ -1415,10 +1413,12 @@ determine_cpu_caches (unsigned int cpu_type)
|
|||
}
|
||||
L3 = -1;
|
||||
|
||||
#if 0
|
||||
unsigned long cbox_config, size;
|
||||
|
||||
cbox_config = *(vulp) phys_to_virt (0xfffff00008UL);
|
||||
size = 512*1024 * (1 << ((cbox_config >> 12) & 3));
|
||||
|
||||
#if 0
|
||||
L2 = ((cbox_config >> 31) & 1 ? CSHAPE (size, 6, 1) : -1);
|
||||
#else
|
||||
L2 = external_cache_probe(512*1024, 6);
|
||||
|
|
|
@ -79,7 +79,6 @@
|
|||
static unsigned long __init SMCConfigState(unsigned long baseAddr)
|
||||
{
|
||||
unsigned char devId;
|
||||
unsigned char devRev;
|
||||
|
||||
unsigned long configPort;
|
||||
unsigned long indexPort;
|
||||
|
@ -100,7 +99,7 @@ static unsigned long __init SMCConfigState(unsigned long baseAddr)
|
|||
devId = inb(dataPort);
|
||||
if (devId == VALID_DEVICE_ID) {
|
||||
outb(DEVICE_REV, indexPort);
|
||||
devRev = inb(dataPort);
|
||||
/* unsigned char devRev = */ inb(dataPort);
|
||||
break;
|
||||
}
|
||||
else
|
||||
|
|
|
@ -156,7 +156,6 @@ static void __init
|
|||
wildfire_init_irq_per_pca(int qbbno, int pcano)
|
||||
{
|
||||
int i, irq_bias;
|
||||
unsigned long io_bias;
|
||||
static struct irqaction isa_enable = {
|
||||
.handler = no_action,
|
||||
.name = "isa_enable",
|
||||
|
@ -165,10 +164,12 @@ wildfire_init_irq_per_pca(int qbbno, int pcano)
|
|||
irq_bias = qbbno * (WILDFIRE_PCA_PER_QBB * WILDFIRE_IRQ_PER_PCA)
|
||||
+ pcano * WILDFIRE_IRQ_PER_PCA;
|
||||
|
||||
#if 0
|
||||
unsigned long io_bias;
|
||||
|
||||
/* Only need the following for first PCI bus per PCA. */
|
||||
io_bias = WILDFIRE_IO(qbbno, pcano<<1) - WILDFIRE_IO_BIAS;
|
||||
|
||||
#if 0
|
||||
outb(0, DMA1_RESET_REG + io_bias);
|
||||
outb(0, DMA2_RESET_REG + io_bias);
|
||||
outb(DMA_MODE_CASCADE, DMA2_MODE_REG + io_bias);
|
||||
|
|
|
@ -153,6 +153,7 @@ void read_persistent_clock(struct timespec *ts)
|
|||
year += 100;
|
||||
|
||||
ts->tv_sec = mktime(year, mon, day, hour, min, sec);
|
||||
ts->tv_nsec = 0;
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -1540,7 +1540,6 @@ config HIGHMEM
|
|||
config HIGHPTE
|
||||
bool "Allocate 2nd-level pagetables from highmem"
|
||||
depends on HIGHMEM
|
||||
depends on !OUTER_CACHE
|
||||
|
||||
config HW_PERF_EVENTS
|
||||
bool "Enable hardware performance counter support for perf events"
|
||||
|
@ -2012,6 +2011,8 @@ source "kernel/power/Kconfig"
|
|||
|
||||
config ARCH_SUSPEND_POSSIBLE
|
||||
depends on !ARCH_S5P64X0 && !ARCH_S5P6442
|
||||
depends on CPU_ARM920T || CPU_ARM926T || CPU_SA1100 || \
|
||||
CPU_V6 || CPU_V6K || CPU_V7 || CPU_XSC3 || CPU_XSCALE
|
||||
def_bool y
|
||||
|
||||
endmenu
|
||||
|
|
|
@ -63,17 +63,6 @@ config DEBUG_USER
|
|||
8 - SIGSEGV faults
|
||||
16 - SIGBUS faults
|
||||
|
||||
config DEBUG_ERRORS
|
||||
bool "Verbose kernel error messages"
|
||||
depends on DEBUG_KERNEL
|
||||
help
|
||||
This option controls verbose debugging information which can be
|
||||
printed when the kernel detects an internal error. This debugging
|
||||
information is useful to kernel hackers when tracking down problems,
|
||||
but mostly meaningless to other people. It's safe to say Y unless
|
||||
you are concerned with the code size or don't want to see these
|
||||
messages.
|
||||
|
||||
config DEBUG_STACK_USAGE
|
||||
bool "Enable stack utilization instrumentation"
|
||||
depends on DEBUG_KERNEL
|
||||
|
|
|
@ -16,5 +16,4 @@ obj-$(CONFIG_SHARP_SCOOP) += scoop.o
|
|||
obj-$(CONFIG_ARCH_IXP2000) += uengine.o
|
||||
obj-$(CONFIG_ARCH_IXP23XX) += uengine.o
|
||||
obj-$(CONFIG_PCI_HOST_ITE8152) += it8152.o
|
||||
obj-$(CONFIG_COMMON_CLKDEV) += clkdev.o
|
||||
obj-$(CONFIG_ARM_TIMER_SP804) += timer-sp.o
|
||||
|
|
|
@ -2,6 +2,7 @@
|
|||
#define __ASM_ARM_CPUTYPE_H
|
||||
|
||||
#include <linux/stringify.h>
|
||||
#include <linux/kernel.h>
|
||||
|
||||
#define CPUID_ID 0
|
||||
#define CPUID_CACHETYPE 1
|
||||
|
|
|
@ -43,6 +43,7 @@ static inline void thread_notify(unsigned long rc, struct thread_info *thread)
|
|||
#define THREAD_NOTIFY_FLUSH 0
|
||||
#define THREAD_NOTIFY_EXIT 1
|
||||
#define THREAD_NOTIFY_SWITCH 2
|
||||
#define THREAD_NOTIFY_COPY 3
|
||||
|
||||
#endif
|
||||
#endif
|
||||
|
|
|
@ -396,6 +396,10 @@
|
|||
#define __NR_fanotify_init (__NR_SYSCALL_BASE+367)
|
||||
#define __NR_fanotify_mark (__NR_SYSCALL_BASE+368)
|
||||
#define __NR_prlimit64 (__NR_SYSCALL_BASE+369)
|
||||
#define __NR_name_to_handle_at (__NR_SYSCALL_BASE+370)
|
||||
#define __NR_open_by_handle_at (__NR_SYSCALL_BASE+371)
|
||||
#define __NR_clock_adjtime (__NR_SYSCALL_BASE+372)
|
||||
#define __NR_syncfs (__NR_SYSCALL_BASE+373)
|
||||
|
||||
/*
|
||||
* The following SWIs are ARM private.
|
||||
|
|
|
@ -29,7 +29,7 @@ obj-$(CONFIG_MODULES) += armksyms.o module.o
|
|||
obj-$(CONFIG_ARTHUR) += arthur.o
|
||||
obj-$(CONFIG_ISA_DMA) += dma-isa.o
|
||||
obj-$(CONFIG_PCI) += bios32.o isa.o
|
||||
obj-$(CONFIG_PM) += sleep.o
|
||||
obj-$(CONFIG_PM_SLEEP) += sleep.o
|
||||
obj-$(CONFIG_HAVE_SCHED_CLOCK) += sched_clock.o
|
||||
obj-$(CONFIG_SMP) += smp.o smp_tlb.o
|
||||
obj-$(CONFIG_HAVE_ARM_SCU) += smp_scu.o
|
||||
|
|
|
@ -379,6 +379,10 @@
|
|||
CALL(sys_fanotify_init)
|
||||
CALL(sys_fanotify_mark)
|
||||
CALL(sys_prlimit64)
|
||||
/* 370 */ CALL(sys_name_to_handle_at)
|
||||
CALL(sys_open_by_handle_at)
|
||||
CALL(sys_clock_adjtime)
|
||||
CALL(sys_syncfs)
|
||||
#ifndef syscalls_counted
|
||||
.equ syscalls_padding, ((NR_syscalls + 3) & ~3) - NR_syscalls
|
||||
#define syscalls_counted
|
||||
|
|
|
@ -40,15 +40,22 @@ EXPORT_SYMBOL(elf_check_arch);
|
|||
void elf_set_personality(const struct elf32_hdr *x)
|
||||
{
|
||||
unsigned int eflags = x->e_flags;
|
||||
unsigned int personality = PER_LINUX_32BIT;
|
||||
unsigned int personality = current->personality & ~PER_MASK;
|
||||
|
||||
/*
|
||||
* We only support Linux ELF executables, so always set the
|
||||
* personality to LINUX.
|
||||
*/
|
||||
personality |= PER_LINUX;
|
||||
|
||||
/*
|
||||
* APCS-26 is only valid for OABI executables
|
||||
*/
|
||||
if ((eflags & EF_ARM_EABI_MASK) == EF_ARM_EABI_UNKNOWN) {
|
||||
if (eflags & EF_ARM_APCS_26)
|
||||
personality = PER_LINUX;
|
||||
}
|
||||
if ((eflags & EF_ARM_EABI_MASK) == EF_ARM_EABI_UNKNOWN &&
|
||||
(eflags & EF_ARM_APCS_26))
|
||||
personality &= ~ADDR_LIMIT_32BIT;
|
||||
else
|
||||
personality |= ADDR_LIMIT_32BIT;
|
||||
|
||||
set_personality(personality);
|
||||
|
||||
|
|
|
@ -868,6 +868,13 @@ static void reset_ctrl_regs(void *info)
|
|||
*/
|
||||
asm volatile("mcr p14, 0, %0, c1, c0, 4" : : "r" (0));
|
||||
isb();
|
||||
|
||||
/*
|
||||
* Clear any configured vector-catch events before
|
||||
* enabling monitor mode.
|
||||
*/
|
||||
asm volatile("mcr p14, 0, %0, c0, c7, 0" : : "r" (0));
|
||||
isb();
|
||||
}
|
||||
|
||||
if (enable_monitor_mode())
|
||||
|
|
|
@ -221,7 +221,7 @@ again:
|
|||
prev_raw_count &= armpmu->max_period;
|
||||
|
||||
if (overflow)
|
||||
delta = armpmu->max_period - prev_raw_count + new_raw_count;
|
||||
delta = armpmu->max_period - prev_raw_count + new_raw_count + 1;
|
||||
else
|
||||
delta = new_raw_count - prev_raw_count;
|
||||
|
||||
|
|
|
@ -372,6 +372,8 @@ copy_thread(unsigned long clone_flags, unsigned long stack_start,
|
|||
if (clone_flags & CLONE_SETTLS)
|
||||
thread->tp_value = regs->ARM_r3;
|
||||
|
||||
thread_notify(THREAD_NOTIFY_COPY, thread);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
|
@ -410,8 +410,7 @@ static int bad_syscall(int n, struct pt_regs *regs)
|
|||
struct thread_info *thread = current_thread_info();
|
||||
siginfo_t info;
|
||||
|
||||
if (current->personality != PER_LINUX &&
|
||||
current->personality != PER_LINUX_32BIT &&
|
||||
if ((current->personality & PER_MASK) != PER_LINUX &&
|
||||
thread->exec_domain->handler) {
|
||||
thread->exec_domain->handler(n, regs);
|
||||
return regs->ARM_r0;
|
||||
|
|
|
@ -10,7 +10,7 @@
|
|||
#define BANK_OFF(n) (((n) < 3) ? (n) << 2 : 0x100 + (((n) - 3) << 2))
|
||||
#define GPIO_REG(x) (*((volatile u32 *)(GPIO_REGS_VIRT + (x))))
|
||||
|
||||
#define NR_BUILTIN_GPIO (192)
|
||||
#define NR_BUILTIN_GPIO IRQ_GPIO_NUM
|
||||
|
||||
#define gpio_to_bank(gpio) ((gpio) >> 5)
|
||||
#define gpio_to_irq(gpio) (IRQ_GPIO_START + (gpio))
|
||||
|
|
|
@ -8,6 +8,15 @@
|
|||
#define MFP_DRIVE_MEDIUM (0x2 << 13)
|
||||
#define MFP_DRIVE_FAST (0x3 << 13)
|
||||
|
||||
#undef MFP_CFG
|
||||
#undef MFP_CFG_DRV
|
||||
|
||||
#define MFP_CFG(pin, af) \
|
||||
(MFP_LPM_INPUT | MFP_PIN(MFP_PIN_##pin) | MFP_##af | MFP_DRIVE_MEDIUM)
|
||||
|
||||
#define MFP_CFG_DRV(pin, af, drv) \
|
||||
(MFP_LPM_INPUT | MFP_PIN(MFP_PIN_##pin) | MFP_##af | MFP_DRIVE_##drv)
|
||||
|
||||
/* GPIO */
|
||||
#define GPIO0_GPIO MFP_CFG(GPIO0, AF5)
|
||||
#define GPIO1_GPIO MFP_CFG(GPIO1, AF5)
|
||||
|
|
|
@ -160,10 +160,7 @@ static struct msm_mmc_platform_data qsd8x50_sdc1_data = {
|
|||
|
||||
static void __init qsd8x50_init_mmc(void)
|
||||
{
|
||||
if (machine_is_qsd8x50_ffa() || machine_is_qsd8x50a_ffa())
|
||||
vreg_mmc = vreg_get(NULL, "gp6");
|
||||
else
|
||||
vreg_mmc = vreg_get(NULL, "gp5");
|
||||
vreg_mmc = vreg_get(NULL, "gp5");
|
||||
|
||||
if (IS_ERR(vreg_mmc)) {
|
||||
pr_err("vreg get for vreg_mmc failed (%ld)\n",
|
||||
|
|
|
@ -269,7 +269,7 @@ int __cpuinit local_timer_setup(struct clock_event_device *evt)
|
|||
|
||||
/* Use existing clock_event for cpu 0 */
|
||||
if (!smp_processor_id())
|
||||
return;
|
||||
return 0;
|
||||
|
||||
writel(DGT_CLK_CTL_DIV_4, MSM_TMR_BASE + DGT_CLK_CTL);
|
||||
|
||||
|
|
|
@ -99,11 +99,24 @@
|
|||
#define GAFR(x) GPIO_REG(0x54 + (((x) & 0x70) >> 2))
|
||||
|
||||
|
||||
#define NR_BUILTIN_GPIO 128
|
||||
#define NR_BUILTIN_GPIO PXA_GPIO_IRQ_NUM
|
||||
|
||||
#define gpio_to_bank(gpio) ((gpio) >> 5)
|
||||
#define gpio_to_irq(gpio) IRQ_GPIO(gpio)
|
||||
#define irq_to_gpio(irq) IRQ_TO_GPIO(irq)
|
||||
|
||||
static inline int irq_to_gpio(unsigned int irq)
|
||||
{
|
||||
int gpio;
|
||||
|
||||
if (irq == IRQ_GPIO0 || irq == IRQ_GPIO1)
|
||||
return irq - IRQ_GPIO0;
|
||||
|
||||
gpio = irq - PXA_GPIO_IRQ_BASE;
|
||||
if (gpio >= 2 && gpio < NR_BUILTIN_GPIO)
|
||||
return gpio;
|
||||
|
||||
return -1;
|
||||
}
|
||||
|
||||
#ifdef CONFIG_CPU_PXA26x
|
||||
/* GPIO86/87/88/89 on PXA26x have their direction bits in GPDR2 inverted,
|
||||
|
|
|
@ -93,9 +93,6 @@
|
|||
#define GPIO_2_x_TO_IRQ(x) (PXA_GPIO_IRQ_BASE + (x))
|
||||
#define IRQ_GPIO(x) (((x) < 2) ? (IRQ_GPIO0 + (x)) : GPIO_2_x_TO_IRQ(x))
|
||||
|
||||
#define IRQ_TO_GPIO_2_x(i) ((i) - PXA_GPIO_IRQ_BASE)
|
||||
#define IRQ_TO_GPIO(i) (((i) < IRQ_GPIO(2)) ? ((i) - IRQ_GPIO0) : IRQ_TO_GPIO_2_x(i))
|
||||
|
||||
/*
|
||||
* The following interrupts are for board specific purposes. Since
|
||||
* the kernel can only run on one machine at a time, we can re-use
|
||||
|
|
|
@ -285,7 +285,7 @@ static inline void pxa25x_init_pm(void) {}
|
|||
|
||||
static int pxa25x_set_wake(struct irq_data *d, unsigned int on)
|
||||
{
|
||||
int gpio = IRQ_TO_GPIO(d->irq);
|
||||
int gpio = irq_to_gpio(d->irq);
|
||||
uint32_t mask = 0;
|
||||
|
||||
if (gpio >= 0 && gpio < 85)
|
||||
|
|
|
@ -345,7 +345,7 @@ static inline void pxa27x_init_pm(void) {}
|
|||
*/
|
||||
static int pxa27x_set_wake(struct irq_data *d, unsigned int on)
|
||||
{
|
||||
int gpio = IRQ_TO_GPIO(d->irq);
|
||||
int gpio = irq_to_gpio(d->irq);
|
||||
uint32_t mask;
|
||||
|
||||
if (gpio >= 0 && gpio < 128)
|
||||
|
|
|
@ -257,7 +257,8 @@ static void tegra_gpio_irq_handler(unsigned int irq, struct irq_desc *desc)
|
|||
void tegra_gpio_resume(void)
|
||||
{
|
||||
unsigned long flags;
|
||||
int b, p, i;
|
||||
int b;
|
||||
int p;
|
||||
|
||||
local_irq_save(flags);
|
||||
|
||||
|
@ -280,7 +281,8 @@ void tegra_gpio_resume(void)
|
|||
void tegra_gpio_suspend(void)
|
||||
{
|
||||
unsigned long flags;
|
||||
int b, p, i;
|
||||
int b;
|
||||
int p;
|
||||
|
||||
local_irq_save(flags);
|
||||
for (b = 0; b < ARRAY_SIZE(tegra_gpio_banks); b++) {
|
||||
|
|
|
@ -1362,14 +1362,15 @@ static int tegra_clk_shared_bus_set_rate(struct clk *c, unsigned long rate)
|
|||
{
|
||||
unsigned long flags;
|
||||
int ret;
|
||||
long new_rate = rate;
|
||||
|
||||
rate = clk_round_rate(c->parent, rate);
|
||||
if (rate < 0)
|
||||
return rate;
|
||||
new_rate = clk_round_rate(c->parent, new_rate);
|
||||
if (new_rate < 0)
|
||||
return new_rate;
|
||||
|
||||
spin_lock_irqsave(&c->parent->spinlock, flags);
|
||||
|
||||
c->u.shared_bus_user.rate = rate;
|
||||
c->u.shared_bus_user.rate = new_rate;
|
||||
ret = tegra_clk_shared_bus_update(c->parent);
|
||||
|
||||
spin_unlock_irqrestore(&c->parent->spinlock, flags);
|
||||
|
|
|
@ -7,6 +7,7 @@
|
|||
#include <linux/shm.h>
|
||||
#include <linux/sched.h>
|
||||
#include <linux/io.h>
|
||||
#include <linux/personality.h>
|
||||
#include <linux/random.h>
|
||||
#include <asm/cputype.h>
|
||||
#include <asm/system.h>
|
||||
|
@ -82,7 +83,8 @@ arch_get_unmapped_area(struct file *filp, unsigned long addr,
|
|||
mm->cached_hole_size = 0;
|
||||
}
|
||||
/* 8 bits of randomness in 20 address space bits */
|
||||
if (current->flags & PF_RANDOMIZE)
|
||||
if ((current->flags & PF_RANDOMIZE) &&
|
||||
!(current->personality & ADDR_NO_RANDOMIZE))
|
||||
addr += (get_random_int() % (1 << 8)) << PAGE_SHIFT;
|
||||
|
||||
full_search:
|
||||
|
|
|
@ -390,7 +390,7 @@ ENTRY(cpu_arm920_set_pte_ext)
|
|||
/* Suspend/resume support: taken from arch/arm/plat-s3c24xx/sleep.S */
|
||||
.globl cpu_arm920_suspend_size
|
||||
.equ cpu_arm920_suspend_size, 4 * 3
|
||||
#ifdef CONFIG_PM
|
||||
#ifdef CONFIG_PM_SLEEP
|
||||
ENTRY(cpu_arm920_do_suspend)
|
||||
stmfd sp!, {r4 - r7, lr}
|
||||
mrc p15, 0, r4, c13, c0, 0 @ PID
|
||||
|
|
|
@ -404,7 +404,7 @@ ENTRY(cpu_arm926_set_pte_ext)
|
|||
/* Suspend/resume support: taken from arch/arm/plat-s3c24xx/sleep.S */
|
||||
.globl cpu_arm926_suspend_size
|
||||
.equ cpu_arm926_suspend_size, 4 * 3
|
||||
#ifdef CONFIG_PM
|
||||
#ifdef CONFIG_PM_SLEEP
|
||||
ENTRY(cpu_arm926_do_suspend)
|
||||
stmfd sp!, {r4 - r7, lr}
|
||||
mrc p15, 0, r4, c13, c0, 0 @ PID
|
||||
|
|
|
@ -171,7 +171,7 @@ ENTRY(cpu_sa1100_set_pte_ext)
|
|||
|
||||
.globl cpu_sa1100_suspend_size
|
||||
.equ cpu_sa1100_suspend_size, 4*4
|
||||
#ifdef CONFIG_PM
|
||||
#ifdef CONFIG_PM_SLEEP
|
||||
ENTRY(cpu_sa1100_do_suspend)
|
||||
stmfd sp!, {r4 - r7, lr}
|
||||
mrc p15, 0, r4, c3, c0, 0 @ domain ID
|
||||
|
|
|
@ -124,7 +124,7 @@ ENTRY(cpu_v6_set_pte_ext)
|
|||
/* Suspend/resume support: taken from arch/arm/mach-s3c64xx/sleep.S */
|
||||
.globl cpu_v6_suspend_size
|
||||
.equ cpu_v6_suspend_size, 4 * 8
|
||||
#ifdef CONFIG_PM
|
||||
#ifdef CONFIG_PM_SLEEP
|
||||
ENTRY(cpu_v6_do_suspend)
|
||||
stmfd sp!, {r4 - r11, lr}
|
||||
mrc p15, 0, r4, c13, c0, 0 @ FCSE/PID
|
||||
|
|
|
@ -211,7 +211,7 @@ cpu_v7_name:
|
|||
/* Suspend/resume support: derived from arch/arm/mach-s5pv210/sleep.S */
|
||||
.globl cpu_v7_suspend_size
|
||||
.equ cpu_v7_suspend_size, 4 * 8
|
||||
#ifdef CONFIG_PM
|
||||
#ifdef CONFIG_PM_SLEEP
|
||||
ENTRY(cpu_v7_do_suspend)
|
||||
stmfd sp!, {r4 - r11, lr}
|
||||
mrc p15, 0, r4, c13, c0, 0 @ FCSE/PID
|
||||
|
|
|
@ -417,7 +417,7 @@ ENTRY(cpu_xsc3_set_pte_ext)
|
|||
|
||||
.globl cpu_xsc3_suspend_size
|
||||
.equ cpu_xsc3_suspend_size, 4 * 8
|
||||
#ifdef CONFIG_PM
|
||||
#ifdef CONFIG_PM_SLEEP
|
||||
ENTRY(cpu_xsc3_do_suspend)
|
||||
stmfd sp!, {r4 - r10, lr}
|
||||
mrc p14, 0, r4, c6, c0, 0 @ clock configuration, for turbo mode
|
||||
|
|
|
@ -518,7 +518,7 @@ ENTRY(cpu_xscale_set_pte_ext)
|
|||
|
||||
.globl cpu_xscale_suspend_size
|
||||
.equ cpu_xscale_suspend_size, 4 * 7
|
||||
#ifdef CONFIG_PM
|
||||
#ifdef CONFIG_PM_SLEEP
|
||||
ENTRY(cpu_xscale_do_suspend)
|
||||
stmfd sp!, {r4 - r10, lr}
|
||||
mrc p14, 0, r4, c6, c0, 0 @ clock configuration, for turbo mode
|
||||
|
|
|
@ -19,17 +19,6 @@
|
|||
|
||||
#define PFX "s5p pm: "
|
||||
|
||||
/* s3c_pm_check_resume_pin
|
||||
*
|
||||
* check to see if the pin is configured correctly for sleep mode, and
|
||||
* make any necessary adjustments if it is not
|
||||
*/
|
||||
|
||||
static void s3c_pm_check_resume_pin(unsigned int pin, unsigned int irqoffs)
|
||||
{
|
||||
/* nothing here yet */
|
||||
}
|
||||
|
||||
/* s3c_pm_configure_extint
|
||||
*
|
||||
* configure all external interrupt pins
|
||||
|
|
|
@ -164,7 +164,6 @@ static inline int in_region(void *ptr, int size, void *what, size_t whatsz)
|
|||
*/
|
||||
static u32 *s3c_pm_runcheck(struct resource *res, u32 *val)
|
||||
{
|
||||
void *save_at = phys_to_virt(s3c_sleep_save_phys);
|
||||
unsigned long addr;
|
||||
unsigned long left;
|
||||
void *stkpage;
|
||||
|
@ -192,11 +191,6 @@ static u32 *s3c_pm_runcheck(struct resource *res, u32 *val)
|
|||
goto skip_check;
|
||||
}
|
||||
|
||||
if (in_region(ptr, left, save_at, 32*4 )) {
|
||||
S3C_PMDBG("skipping %08lx, has save block in\n", addr);
|
||||
goto skip_check;
|
||||
}
|
||||
|
||||
/* calculate and check the checksum */
|
||||
|
||||
calc = crc32_le(~0, ptr, left);
|
||||
|
|
|
@ -214,8 +214,9 @@ void s3c_pm_do_restore_core(struct sleep_save *ptr, int count)
|
|||
*
|
||||
* print any IRQs asserted at resume time (ie, we woke from)
|
||||
*/
|
||||
static void s3c_pm_show_resume_irqs(int start, unsigned long which,
|
||||
unsigned long mask)
|
||||
static void __maybe_unused s3c_pm_show_resume_irqs(int start,
|
||||
unsigned long which,
|
||||
unsigned long mask)
|
||||
{
|
||||
int i;
|
||||
|
||||
|
|
|
@ -78,6 +78,14 @@ static void vfp_thread_exit(struct thread_info *thread)
|
|||
put_cpu();
|
||||
}
|
||||
|
||||
static void vfp_thread_copy(struct thread_info *thread)
|
||||
{
|
||||
struct thread_info *parent = current_thread_info();
|
||||
|
||||
vfp_sync_hwstate(parent);
|
||||
thread->vfpstate = parent->vfpstate;
|
||||
}
|
||||
|
||||
/*
|
||||
* When this function is called with the following 'cmd's, the following
|
||||
* is true while this function is being run:
|
||||
|
@ -104,12 +112,17 @@ static void vfp_thread_exit(struct thread_info *thread)
|
|||
static int vfp_notifier(struct notifier_block *self, unsigned long cmd, void *v)
|
||||
{
|
||||
struct thread_info *thread = v;
|
||||
u32 fpexc;
|
||||
#ifdef CONFIG_SMP
|
||||
unsigned int cpu;
|
||||
#endif
|
||||
|
||||
if (likely(cmd == THREAD_NOTIFY_SWITCH)) {
|
||||
u32 fpexc = fmrx(FPEXC);
|
||||
switch (cmd) {
|
||||
case THREAD_NOTIFY_SWITCH:
|
||||
fpexc = fmrx(FPEXC);
|
||||
|
||||
#ifdef CONFIG_SMP
|
||||
unsigned int cpu = thread->cpu;
|
||||
cpu = thread->cpu;
|
||||
|
||||
/*
|
||||
* On SMP, if VFP is enabled, save the old state in
|
||||
|
@ -134,13 +147,20 @@ static int vfp_notifier(struct notifier_block *self, unsigned long cmd, void *v)
|
|||
* old state.
|
||||
*/
|
||||
fmxr(FPEXC, fpexc & ~FPEXC_EN);
|
||||
return NOTIFY_DONE;
|
||||
}
|
||||
break;
|
||||
|
||||
if (cmd == THREAD_NOTIFY_FLUSH)
|
||||
case THREAD_NOTIFY_FLUSH:
|
||||
vfp_thread_flush(thread);
|
||||
else
|
||||
break;
|
||||
|
||||
case THREAD_NOTIFY_EXIT:
|
||||
vfp_thread_exit(thread);
|
||||
break;
|
||||
|
||||
case THREAD_NOTIFY_COPY:
|
||||
vfp_thread_copy(thread);
|
||||
break;
|
||||
}
|
||||
|
||||
return NOTIFY_DONE;
|
||||
}
|
||||
|
|
|
@ -94,6 +94,13 @@ struct tag_ethernet {
|
|||
|
||||
#define ETH_INVALID_PHY 0xff
|
||||
|
||||
/* board information */
|
||||
#define ATAG_BOARDINFO 0x54410008
|
||||
|
||||
struct tag_boardinfo {
|
||||
u32 board_number;
|
||||
};
|
||||
|
||||
struct tag {
|
||||
struct tag_header hdr;
|
||||
union {
|
||||
|
@ -102,6 +109,7 @@ struct tag {
|
|||
struct tag_cmdline cmdline;
|
||||
struct tag_clock clock;
|
||||
struct tag_ethernet ethernet;
|
||||
struct tag_boardinfo boardinfo;
|
||||
} u;
|
||||
};
|
||||
|
||||
|
@ -128,6 +136,7 @@ extern struct tag *bootloader_tags;
|
|||
|
||||
extern resource_size_t fbmem_start;
|
||||
extern resource_size_t fbmem_size;
|
||||
extern u32 board_number;
|
||||
|
||||
void setup_processor(void);
|
||||
|
||||
|
|
|
@ -390,6 +390,21 @@ static int __init parse_tag_clock(struct tag *tag)
|
|||
}
|
||||
__tagtable(ATAG_CLOCK, parse_tag_clock);
|
||||
|
||||
/*
|
||||
* The board_number correspond to the bd->bi_board_number in U-Boot. This
|
||||
* parameter is only available during initialisation and can be used in some
|
||||
* kind of board identification.
|
||||
*/
|
||||
u32 __initdata board_number;
|
||||
|
||||
static int __init parse_tag_boardinfo(struct tag *tag)
|
||||
{
|
||||
board_number = tag->u.boardinfo.board_number;
|
||||
|
||||
return 0;
|
||||
}
|
||||
__tagtable(ATAG_BOARDINFO, parse_tag_boardinfo);
|
||||
|
||||
/*
|
||||
* Scan the tag table for this tag, and call its parse function. The
|
||||
* tag table is built by the linker from all the __tagtable
|
||||
|
|
|
@ -95,28 +95,6 @@ void _exception(long signr, struct pt_regs *regs, int code,
|
|||
info.si_code = code;
|
||||
info.si_addr = (void __user *)addr;
|
||||
force_sig_info(signr, &info, current);
|
||||
|
||||
/*
|
||||
* Init gets no signals that it doesn't have a handler for.
|
||||
* That's all very well, but if it has caused a synchronous
|
||||
* exception and we ignore the resulting signal, it will just
|
||||
* generate the same exception over and over again and we get
|
||||
* nowhere. Better to kill it and let the kernel panic.
|
||||
*/
|
||||
if (is_global_init(current)) {
|
||||
__sighandler_t handler;
|
||||
|
||||
spin_lock_irq(¤t->sighand->siglock);
|
||||
handler = current->sighand->action[signr-1].sa.sa_handler;
|
||||
spin_unlock_irq(¤t->sighand->siglock);
|
||||
if (handler == SIG_DFL) {
|
||||
/* init has generated a synchronous exception
|
||||
and it doesn't have a handler for the signal */
|
||||
printk(KERN_CRIT "init has generated signal %ld "
|
||||
"but has no handler for it\n", signr);
|
||||
do_exit(signr);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
asmlinkage void do_nmi(unsigned long ecr, struct pt_regs *regs)
|
||||
|
|
|
@ -35,22 +35,30 @@ void at32_clk_register(struct clk *clk)
|
|||
spin_unlock(&clk_list_lock);
|
||||
}
|
||||
|
||||
static struct clk *__clk_get(struct device *dev, const char *id)
|
||||
{
|
||||
struct clk *clk;
|
||||
|
||||
list_for_each_entry(clk, &at32_clock_list, list) {
|
||||
if (clk->dev == dev && strcmp(id, clk->name) == 0) {
|
||||
return clk;
|
||||
}
|
||||
}
|
||||
|
||||
return ERR_PTR(-ENOENT);
|
||||
}
|
||||
|
||||
struct clk *clk_get(struct device *dev, const char *id)
|
||||
{
|
||||
struct clk *clk;
|
||||
|
||||
spin_lock(&clk_list_lock);
|
||||
|
||||
list_for_each_entry(clk, &at32_clock_list, list) {
|
||||
if (clk->dev == dev && strcmp(id, clk->name) == 0) {
|
||||
spin_unlock(&clk_list_lock);
|
||||
return clk;
|
||||
}
|
||||
}
|
||||
|
||||
clk = __clk_get(dev, id);
|
||||
spin_unlock(&clk_list_lock);
|
||||
return ERR_PTR(-ENOENT);
|
||||
|
||||
return clk;
|
||||
}
|
||||
|
||||
EXPORT_SYMBOL(clk_get);
|
||||
|
||||
void clk_put(struct clk *clk)
|
||||
|
@ -257,15 +265,15 @@ static int clk_show(struct seq_file *s, void *unused)
|
|||
spin_lock(&clk_list_lock);
|
||||
|
||||
/* show clock tree as derived from the three oscillators */
|
||||
clk = clk_get(NULL, "osc32k");
|
||||
clk = __clk_get(NULL, "osc32k");
|
||||
dump_clock(clk, &r);
|
||||
clk_put(clk);
|
||||
|
||||
clk = clk_get(NULL, "osc0");
|
||||
clk = __clk_get(NULL, "osc0");
|
||||
dump_clock(clk, &r);
|
||||
clk_put(clk);
|
||||
|
||||
clk = clk_get(NULL, "osc1");
|
||||
clk = __clk_get(NULL, "osc1");
|
||||
dump_clock(clk, &r);
|
||||
clk_put(clk);
|
||||
|
||||
|
|
|
@ -61,34 +61,34 @@ struct eic {
|
|||
static struct eic *nmi_eic;
|
||||
static bool nmi_enabled;
|
||||
|
||||
static void eic_ack_irq(struct irq_chip *d)
|
||||
static void eic_ack_irq(struct irq_data *d)
|
||||
{
|
||||
struct eic *eic = irq_data_get_irq_chip_data(data);
|
||||
struct eic *eic = irq_data_get_irq_chip_data(d);
|
||||
eic_writel(eic, ICR, 1 << (d->irq - eic->first_irq));
|
||||
}
|
||||
|
||||
static void eic_mask_irq(struct irq_chip *d)
|
||||
static void eic_mask_irq(struct irq_data *d)
|
||||
{
|
||||
struct eic *eic = irq_data_get_irq_chip_data(data);
|
||||
struct eic *eic = irq_data_get_irq_chip_data(d);
|
||||
eic_writel(eic, IDR, 1 << (d->irq - eic->first_irq));
|
||||
}
|
||||
|
||||
static void eic_mask_ack_irq(struct irq_chip *d)
|
||||
static void eic_mask_ack_irq(struct irq_data *d)
|
||||
{
|
||||
struct eic *eic = irq_data_get_irq_chip_data(data);
|
||||
struct eic *eic = irq_data_get_irq_chip_data(d);
|
||||
eic_writel(eic, ICR, 1 << (d->irq - eic->first_irq));
|
||||
eic_writel(eic, IDR, 1 << (d->irq - eic->first_irq));
|
||||
}
|
||||
|
||||
static void eic_unmask_irq(struct irq_chip *d)
|
||||
static void eic_unmask_irq(struct irq_data *d)
|
||||
{
|
||||
struct eic *eic = irq_data_get_irq_chip_data(data);
|
||||
struct eic *eic = irq_data_get_irq_chip_data(d);
|
||||
eic_writel(eic, IER, 1 << (d->irq - eic->first_irq));
|
||||
}
|
||||
|
||||
static int eic_set_irq_type(struct irq_chip *d, unsigned int flow_type)
|
||||
static int eic_set_irq_type(struct irq_data *d, unsigned int flow_type)
|
||||
{
|
||||
struct eic *eic = irq_data_get_irq_chip_data(data);
|
||||
struct eic *eic = irq_data_get_irq_chip_data(d);
|
||||
unsigned int irq = d->irq;
|
||||
unsigned int i = irq - eic->first_irq;
|
||||
u32 mode, edge, level;
|
||||
|
@ -191,7 +191,7 @@ static int __init eic_probe(struct platform_device *pdev)
|
|||
|
||||
regs = platform_get_resource(pdev, IORESOURCE_MEM, 0);
|
||||
int_irq = platform_get_irq(pdev, 0);
|
||||
if (!regs || !int_irq) {
|
||||
if (!regs || (int)int_irq <= 0) {
|
||||
dev_dbg(&pdev->dev, "missing regs and/or irq resource\n");
|
||||
return -ENXIO;
|
||||
}
|
||||
|
|
|
@ -257,7 +257,7 @@ static void gpio_irq_mask(struct irq_data *d)
|
|||
pio_writel(pio, IDR, 1 << (gpio & 0x1f));
|
||||
}
|
||||
|
||||
static void gpio_irq_unmask(struct irq_data *d))
|
||||
static void gpio_irq_unmask(struct irq_data *d)
|
||||
{
|
||||
unsigned gpio = irq_to_gpio(d->irq);
|
||||
struct pio_device *pio = &pio_dev[gpio >> 5];
|
||||
|
|
|
@ -53,7 +53,7 @@ cpu_enter_idle:
|
|||
st.w r8[TI_flags], r9
|
||||
unmask_interrupts
|
||||
sleep CPU_SLEEP_IDLE
|
||||
.size cpu_idle_sleep, . - cpu_idle_sleep
|
||||
.size cpu_enter_idle, . - cpu_enter_idle
|
||||
|
||||
/*
|
||||
* Common return path for PM functions that don't run from
|
||||
|
|
|
@ -19,11 +19,11 @@
|
|||
* Force strict CPU ordering.
|
||||
*/
|
||||
#define nop() __asm__ __volatile__ ("nop;\n\t" : : )
|
||||
#define mb() __asm__ __volatile__ ("" : : : "memory")
|
||||
#define rmb() __asm__ __volatile__ ("" : : : "memory")
|
||||
#define wmb() __asm__ __volatile__ ("" : : : "memory")
|
||||
#define set_mb(var, value) do { (void) xchg(&var, value); } while (0)
|
||||
#define read_barrier_depends() do { } while(0)
|
||||
#define smp_mb() mb()
|
||||
#define smp_rmb() rmb()
|
||||
#define smp_wmb() wmb()
|
||||
#define set_mb(var, value) do { var = value; mb(); } while (0)
|
||||
#define smp_read_barrier_depends() read_barrier_depends()
|
||||
|
||||
#ifdef CONFIG_SMP
|
||||
asmlinkage unsigned long __raw_xchg_1_asm(volatile void *ptr, unsigned long value);
|
||||
|
@ -37,16 +37,16 @@ asmlinkage unsigned long __raw_cmpxchg_4_asm(volatile void *ptr,
|
|||
unsigned long new, unsigned long old);
|
||||
|
||||
#ifdef __ARCH_SYNC_CORE_DCACHE
|
||||
# define smp_mb() do { barrier(); smp_check_barrier(); smp_mark_barrier(); } while (0)
|
||||
# define smp_rmb() do { barrier(); smp_check_barrier(); } while (0)
|
||||
# define smp_wmb() do { barrier(); smp_mark_barrier(); } while (0)
|
||||
#define smp_read_barrier_depends() do { barrier(); smp_check_barrier(); } while (0)
|
||||
|
||||
/* Force Core data cache coherence */
|
||||
# define mb() do { barrier(); smp_check_barrier(); smp_mark_barrier(); } while (0)
|
||||
# define rmb() do { barrier(); smp_check_barrier(); } while (0)
|
||||
# define wmb() do { barrier(); smp_mark_barrier(); } while (0)
|
||||
# define read_barrier_depends() do { barrier(); smp_check_barrier(); } while (0)
|
||||
#else
|
||||
# define smp_mb() barrier()
|
||||
# define smp_rmb() barrier()
|
||||
# define smp_wmb() barrier()
|
||||
#define smp_read_barrier_depends() barrier()
|
||||
# define mb() barrier()
|
||||
# define rmb() barrier()
|
||||
# define wmb() barrier()
|
||||
# define read_barrier_depends() do { } while (0)
|
||||
#endif
|
||||
|
||||
static inline unsigned long __xchg(unsigned long x, volatile void *ptr,
|
||||
|
@ -99,10 +99,10 @@ static inline unsigned long __cmpxchg(volatile void *ptr, unsigned long old,
|
|||
|
||||
#else /* !CONFIG_SMP */
|
||||
|
||||
#define smp_mb() barrier()
|
||||
#define smp_rmb() barrier()
|
||||
#define smp_wmb() barrier()
|
||||
#define smp_read_barrier_depends() do { } while(0)
|
||||
#define mb() barrier()
|
||||
#define rmb() barrier()
|
||||
#define wmb() barrier()
|
||||
#define read_barrier_depends() do { } while (0)
|
||||
|
||||
struct __xchg_dummy {
|
||||
unsigned long a[100];
|
||||
|
|
|
@ -268,7 +268,7 @@ void disable_gptimers(uint16_t mask)
|
|||
_disable_gptimers(mask);
|
||||
for (i = 0; i < MAX_BLACKFIN_GPTIMERS; ++i)
|
||||
if (mask & (1 << i))
|
||||
group_regs[BFIN_TIMER_OCTET(i)]->status |= trun_mask[i];
|
||||
group_regs[BFIN_TIMER_OCTET(i)]->status = trun_mask[i];
|
||||
SSYNC();
|
||||
}
|
||||
EXPORT_SYMBOL(disable_gptimers);
|
||||
|
|
|
@ -206,8 +206,14 @@ irqreturn_t bfin_gptmr0_interrupt(int irq, void *dev_id)
|
|||
{
|
||||
struct clock_event_device *evt = dev_id;
|
||||
smp_mb();
|
||||
evt->event_handler(evt);
|
||||
/*
|
||||
* We want to ACK before we handle so that we can handle smaller timer
|
||||
* intervals. This way if the timer expires again while we're handling
|
||||
* things, we're more likely to see that 2nd int rather than swallowing
|
||||
* it by ACKing the int at the end of this handler.
|
||||
*/
|
||||
bfin_gptmr0_ack();
|
||||
evt->event_handler(evt);
|
||||
return IRQ_HANDLED;
|
||||
}
|
||||
|
||||
|
|
|
@ -109,10 +109,23 @@ static void ipi_flush_icache(void *info)
|
|||
struct blackfin_flush_data *fdata = info;
|
||||
|
||||
/* Invalidate the memory holding the bounds of the flushed region. */
|
||||
invalidate_dcache_range((unsigned long)fdata,
|
||||
(unsigned long)fdata + sizeof(*fdata));
|
||||
blackfin_dcache_invalidate_range((unsigned long)fdata,
|
||||
(unsigned long)fdata + sizeof(*fdata));
|
||||
|
||||
flush_icache_range(fdata->start, fdata->end);
|
||||
/* Make sure all write buffers in the data side of the core
|
||||
* are flushed before trying to invalidate the icache. This
|
||||
* needs to be after the data flush and before the icache
|
||||
* flush so that the SSYNC does the right thing in preventing
|
||||
* the instruction prefetcher from hitting things in cached
|
||||
* memory at the wrong time -- it runs much further ahead than
|
||||
* the pipeline.
|
||||
*/
|
||||
SSYNC();
|
||||
|
||||
/* ipi_flaush_icache is invoked by generic flush_icache_range,
|
||||
* so call blackfin arch icache flush directly here.
|
||||
*/
|
||||
blackfin_icache_flush_range(fdata->start, fdata->end);
|
||||
}
|
||||
|
||||
static void ipi_call_function(unsigned int cpu, struct ipi_message *msg)
|
||||
|
|
|
@ -343,10 +343,14 @@
|
|||
#define __NR_fanotify_init 337
|
||||
#define __NR_fanotify_mark 338
|
||||
#define __NR_prlimit64 339
|
||||
#define __NR_name_to_handle_at 340
|
||||
#define __NR_open_by_handle_at 341
|
||||
#define __NR_clock_adjtime 342
|
||||
#define __NR_syncfs 343
|
||||
|
||||
#ifdef __KERNEL__
|
||||
|
||||
#define NR_syscalls 340
|
||||
#define NR_syscalls 344
|
||||
|
||||
#define __ARCH_WANT_IPC_PARSE_VERSION
|
||||
#define __ARCH_WANT_OLD_READDIR
|
||||
|
|
|
@ -750,4 +750,8 @@ sys_call_table:
|
|||
.long sys_fanotify_init
|
||||
.long sys_fanotify_mark
|
||||
.long sys_prlimit64
|
||||
.long sys_name_to_handle_at /* 340 */
|
||||
.long sys_open_by_handle_at
|
||||
.long sys_clock_adjtime
|
||||
.long sys_syncfs
|
||||
|
||||
|
|
|
@ -358,6 +358,10 @@ ENTRY(sys_call_table)
|
|||
.long sys_fanotify_init
|
||||
.long sys_fanotify_mark
|
||||
.long sys_prlimit64
|
||||
.long sys_name_to_handle_at /* 340 */
|
||||
.long sys_open_by_handle_at
|
||||
.long sys_clock_adjtime
|
||||
.long sys_syncfs
|
||||
|
||||
.rept NR_syscalls-(.-sys_call_table)/4
|
||||
.long sys_ni_syscall
|
||||
|
|
|
@ -6,7 +6,6 @@ config MICROBLAZE
|
|||
select HAVE_FUNCTION_GRAPH_TRACER
|
||||
select HAVE_DYNAMIC_FTRACE
|
||||
select HAVE_FTRACE_MCOUNT_RECORD
|
||||
select USB_ARCH_HAS_EHCI
|
||||
select ARCH_WANT_OPTIONAL_GPIOLIB
|
||||
select HAVE_OPROFILE
|
||||
select HAVE_ARCH_KGDB
|
||||
|
|
|
@ -209,7 +209,7 @@ config ARCH_HIBERNATION_POSSIBLE
|
|||
config ARCH_SUSPEND_POSSIBLE
|
||||
def_bool y
|
||||
depends on ADB_PMU || PPC_EFIKA || PPC_LITE5200 || PPC_83xx || \
|
||||
PPC_85xx || PPC_86xx || PPC_PSERIES || 44x || 40x
|
||||
(PPC_85xx && !SMP) || PPC_86xx || PPC_PSERIES || 44x || 40x
|
||||
|
||||
config PPC_DCR_NATIVE
|
||||
bool
|
||||
|
|
|
@ -382,10 +382,12 @@ extern const char *powerpc_base_platform;
|
|||
#define CPU_FTRS_E500_2 (CPU_FTR_MAYBE_CAN_DOZE | CPU_FTR_USE_TB | \
|
||||
CPU_FTR_SPE_COMP | CPU_FTR_MAYBE_CAN_NAP | \
|
||||
CPU_FTR_NODSISRALIGN | CPU_FTR_NOEXECUTE)
|
||||
#define CPU_FTRS_E500MC (CPU_FTR_MAYBE_CAN_DOZE | CPU_FTR_USE_TB | \
|
||||
CPU_FTR_MAYBE_CAN_NAP | CPU_FTR_NODSISRALIGN | \
|
||||
#define CPU_FTRS_E500MC (CPU_FTR_USE_TB | CPU_FTR_NODSISRALIGN | \
|
||||
CPU_FTR_L2CSR | CPU_FTR_LWSYNC | CPU_FTR_NOEXECUTE | \
|
||||
CPU_FTR_DBELL)
|
||||
#define CPU_FTRS_E5500 (CPU_FTR_USE_TB | CPU_FTR_NODSISRALIGN | \
|
||||
CPU_FTR_L2CSR | CPU_FTR_LWSYNC | CPU_FTR_NOEXECUTE | \
|
||||
CPU_FTR_DBELL | CPU_FTR_POPCNTB | CPU_FTR_POPCNTD)
|
||||
#define CPU_FTRS_GENERIC_32 (CPU_FTR_COMMON | CPU_FTR_NODSISRALIGN)
|
||||
|
||||
/* 64-bit CPUs */
|
||||
|
@ -435,11 +437,15 @@ extern const char *powerpc_base_platform;
|
|||
#define CPU_FTRS_COMPATIBLE (CPU_FTR_USE_TB | CPU_FTR_PPCAS_ARCH_V2)
|
||||
|
||||
#ifdef __powerpc64__
|
||||
#ifdef CONFIG_PPC_BOOK3E
|
||||
#define CPU_FTRS_POSSIBLE (CPU_FTRS_E5500)
|
||||
#else
|
||||
#define CPU_FTRS_POSSIBLE \
|
||||
(CPU_FTRS_POWER3 | CPU_FTRS_RS64 | CPU_FTRS_POWER4 | \
|
||||
CPU_FTRS_PPC970 | CPU_FTRS_POWER5 | CPU_FTRS_POWER6 | \
|
||||
CPU_FTRS_POWER7 | CPU_FTRS_CELL | CPU_FTRS_PA6T | \
|
||||
CPU_FTR_1T_SEGMENT | CPU_FTR_VSX)
|
||||
#endif
|
||||
#else
|
||||
enum {
|
||||
CPU_FTRS_POSSIBLE =
|
||||
|
@ -473,16 +479,21 @@ enum {
|
|||
#endif
|
||||
#ifdef CONFIG_E500
|
||||
CPU_FTRS_E500 | CPU_FTRS_E500_2 | CPU_FTRS_E500MC |
|
||||
CPU_FTRS_E5500 |
|
||||
#endif
|
||||
0,
|
||||
};
|
||||
#endif /* __powerpc64__ */
|
||||
|
||||
#ifdef __powerpc64__
|
||||
#ifdef CONFIG_PPC_BOOK3E
|
||||
#define CPU_FTRS_ALWAYS (CPU_FTRS_E5500)
|
||||
#else
|
||||
#define CPU_FTRS_ALWAYS \
|
||||
(CPU_FTRS_POWER3 & CPU_FTRS_RS64 & CPU_FTRS_POWER4 & \
|
||||
CPU_FTRS_PPC970 & CPU_FTRS_POWER5 & CPU_FTRS_POWER6 & \
|
||||
CPU_FTRS_POWER7 & CPU_FTRS_CELL & CPU_FTRS_PA6T & CPU_FTRS_POSSIBLE)
|
||||
#endif
|
||||
#else
|
||||
enum {
|
||||
CPU_FTRS_ALWAYS =
|
||||
|
@ -513,6 +524,7 @@ enum {
|
|||
#endif
|
||||
#ifdef CONFIG_E500
|
||||
CPU_FTRS_E500 & CPU_FTRS_E500_2 & CPU_FTRS_E500MC &
|
||||
CPU_FTRS_E5500 &
|
||||
#endif
|
||||
CPU_FTRS_POSSIBLE,
|
||||
};
|
||||
|
|
|
@ -162,7 +162,7 @@ extern unsigned long bad_call_to_PMD_PAGE_SIZE(void);
|
|||
* on platforms where such control is possible.
|
||||
*/
|
||||
#if defined(CONFIG_KGDB) || defined(CONFIG_XMON) || defined(CONFIG_BDI_SWITCH) ||\
|
||||
defined(CONFIG_KPROBES)
|
||||
defined(CONFIG_KPROBES) || defined(CONFIG_DYNAMIC_FTRACE)
|
||||
#define PAGE_KERNEL_TEXT PAGE_KERNEL_X
|
||||
#else
|
||||
#define PAGE_KERNEL_TEXT PAGE_KERNEL_ROX
|
||||
|
|
|
@ -1973,7 +1973,7 @@ static struct cpu_spec __initdata cpu_specs[] = {
|
|||
.pvr_mask = 0xffff0000,
|
||||
.pvr_value = 0x80240000,
|
||||
.cpu_name = "e5500",
|
||||
.cpu_features = CPU_FTRS_E500MC,
|
||||
.cpu_features = CPU_FTRS_E5500,
|
||||
.cpu_user_features = COMMON_USER_BOOKE,
|
||||
.mmu_features = MMU_FTR_TYPE_FSL_E | MMU_FTR_BIG_PHYS |
|
||||
MMU_FTR_USE_TLBILX,
|
||||
|
|
|
@ -163,7 +163,7 @@ static void crash_kexec_prepare_cpus(int cpu)
|
|||
}
|
||||
|
||||
/* wait for all the CPUs to hit real mode but timeout if they don't come in */
|
||||
#if defined(CONFIG_PPC_STD_MMU_64) && defined(CONFIG_SMP)
|
||||
#ifdef CONFIG_PPC_STD_MMU_64
|
||||
static void crash_kexec_wait_realmode(int cpu)
|
||||
{
|
||||
unsigned int msecs;
|
||||
|
@ -188,9 +188,7 @@ static void crash_kexec_wait_realmode(int cpu)
|
|||
}
|
||||
mb();
|
||||
}
|
||||
#else
|
||||
static inline void crash_kexec_wait_realmode(int cpu) {}
|
||||
#endif
|
||||
#endif /* CONFIG_PPC_STD_MMU_64 */
|
||||
|
||||
/*
|
||||
* This function will be called by secondary cpus or by kexec cpu
|
||||
|
@ -235,7 +233,9 @@ void crash_kexec_secondary(struct pt_regs *regs)
|
|||
crash_ipi_callback(regs);
|
||||
}
|
||||
|
||||
#else
|
||||
#else /* ! CONFIG_SMP */
|
||||
static inline void crash_kexec_wait_realmode(int cpu) {}
|
||||
|
||||
static void crash_kexec_prepare_cpus(int cpu)
|
||||
{
|
||||
/*
|
||||
|
@ -255,7 +255,7 @@ void crash_kexec_secondary(struct pt_regs *regs)
|
|||
{
|
||||
cpus_in_sr = CPU_MASK_NONE;
|
||||
}
|
||||
#endif
|
||||
#endif /* CONFIG_SMP */
|
||||
|
||||
/*
|
||||
* Register a function to be called on shutdown. Only use this if you
|
||||
|
|
|
@ -527,7 +527,7 @@ static int ibmebus_bus_pm_resume_noirq(struct device *dev)
|
|||
|
||||
#endif /* !CONFIG_SUSPEND */
|
||||
|
||||
#ifdef CONFIG_HIBERNATION
|
||||
#ifdef CONFIG_HIBERNATE_CALLBACKS
|
||||
|
||||
static int ibmebus_bus_pm_freeze(struct device *dev)
|
||||
{
|
||||
|
@ -665,7 +665,7 @@ static int ibmebus_bus_pm_restore_noirq(struct device *dev)
|
|||
return ret;
|
||||
}
|
||||
|
||||
#else /* !CONFIG_HIBERNATION */
|
||||
#else /* !CONFIG_HIBERNATE_CALLBACKS */
|
||||
|
||||
#define ibmebus_bus_pm_freeze NULL
|
||||
#define ibmebus_bus_pm_thaw NULL
|
||||
|
@ -676,7 +676,7 @@ static int ibmebus_bus_pm_restore_noirq(struct device *dev)
|
|||
#define ibmebus_bus_pm_poweroff_noirq NULL
|
||||
#define ibmebus_bus_pm_restore_noirq NULL
|
||||
|
||||
#endif /* !CONFIG_HIBERNATION */
|
||||
#endif /* !CONFIG_HIBERNATE_CALLBACKS */
|
||||
|
||||
static struct dev_pm_ops ibmebus_bus_dev_pm_ops = {
|
||||
.prepare = ibmebus_bus_pm_prepare,
|
||||
|
|
|
@ -330,9 +330,11 @@ void __init find_legacy_serial_ports(void)
|
|||
if (!parent)
|
||||
continue;
|
||||
if (of_match_node(legacy_serial_parents, parent) != NULL) {
|
||||
index = add_legacy_soc_port(np, np);
|
||||
if (index >= 0 && np == stdout)
|
||||
legacy_serial_console = index;
|
||||
if (of_device_is_available(np)) {
|
||||
index = add_legacy_soc_port(np, np);
|
||||
if (index >= 0 && np == stdout)
|
||||
legacy_serial_console = index;
|
||||
}
|
||||
}
|
||||
of_node_put(parent);
|
||||
}
|
||||
|
|
|
@ -398,6 +398,25 @@ static int check_excludes(struct perf_event **ctrs, unsigned int cflags[],
|
|||
return 0;
|
||||
}
|
||||
|
||||
static u64 check_and_compute_delta(u64 prev, u64 val)
|
||||
{
|
||||
u64 delta = (val - prev) & 0xfffffffful;
|
||||
|
||||
/*
|
||||
* POWER7 can roll back counter values, if the new value is smaller
|
||||
* than the previous value it will cause the delta and the counter to
|
||||
* have bogus values unless we rolled a counter over. If a coutner is
|
||||
* rolled back, it will be smaller, but within 256, which is the maximum
|
||||
* number of events to rollback at once. If we dectect a rollback
|
||||
* return 0. This can lead to a small lack of precision in the
|
||||
* counters.
|
||||
*/
|
||||
if (prev > val && (prev - val) < 256)
|
||||
delta = 0;
|
||||
|
||||
return delta;
|
||||
}
|
||||
|
||||
static void power_pmu_read(struct perf_event *event)
|
||||
{
|
||||
s64 val, delta, prev;
|
||||
|
@ -416,10 +435,11 @@ static void power_pmu_read(struct perf_event *event)
|
|||
prev = local64_read(&event->hw.prev_count);
|
||||
barrier();
|
||||
val = read_pmc(event->hw.idx);
|
||||
delta = check_and_compute_delta(prev, val);
|
||||
if (!delta)
|
||||
return;
|
||||
} while (local64_cmpxchg(&event->hw.prev_count, prev, val) != prev);
|
||||
|
||||
/* The counters are only 32 bits wide */
|
||||
delta = (val - prev) & 0xfffffffful;
|
||||
local64_add(delta, &event->count);
|
||||
local64_sub(delta, &event->hw.period_left);
|
||||
}
|
||||
|
@ -449,8 +469,9 @@ static void freeze_limited_counters(struct cpu_hw_events *cpuhw,
|
|||
val = (event->hw.idx == 5) ? pmc5 : pmc6;
|
||||
prev = local64_read(&event->hw.prev_count);
|
||||
event->hw.idx = 0;
|
||||
delta = (val - prev) & 0xfffffffful;
|
||||
local64_add(delta, &event->count);
|
||||
delta = check_and_compute_delta(prev, val);
|
||||
if (delta)
|
||||
local64_add(delta, &event->count);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -458,14 +479,16 @@ static void thaw_limited_counters(struct cpu_hw_events *cpuhw,
|
|||
unsigned long pmc5, unsigned long pmc6)
|
||||
{
|
||||
struct perf_event *event;
|
||||
u64 val;
|
||||
u64 val, prev;
|
||||
int i;
|
||||
|
||||
for (i = 0; i < cpuhw->n_limited; ++i) {
|
||||
event = cpuhw->limited_counter[i];
|
||||
event->hw.idx = cpuhw->limited_hwidx[i];
|
||||
val = (event->hw.idx == 5) ? pmc5 : pmc6;
|
||||
local64_set(&event->hw.prev_count, val);
|
||||
prev = local64_read(&event->hw.prev_count);
|
||||
if (check_and_compute_delta(prev, val))
|
||||
local64_set(&event->hw.prev_count, val);
|
||||
perf_event_update_userpage(event);
|
||||
}
|
||||
}
|
||||
|
@ -1197,7 +1220,7 @@ static void record_and_restart(struct perf_event *event, unsigned long val,
|
|||
|
||||
/* we don't have to worry about interrupts here */
|
||||
prev = local64_read(&event->hw.prev_count);
|
||||
delta = (val - prev) & 0xfffffffful;
|
||||
delta = check_and_compute_delta(prev, val);
|
||||
local64_add(delta, &event->count);
|
||||
|
||||
/*
|
||||
|
|
|
@ -229,6 +229,9 @@ static u64 scan_dispatch_log(u64 stop_tb)
|
|||
u64 stolen = 0;
|
||||
u64 dtb;
|
||||
|
||||
if (!dtl)
|
||||
return 0;
|
||||
|
||||
if (i == vpa->dtl_idx)
|
||||
return 0;
|
||||
while (i < vpa->dtl_idx) {
|
||||
|
|
|
@ -842,6 +842,7 @@ static void __devinit smp_core99_setup_cpu(int cpu_nr)
|
|||
mpic_setup_this_cpu();
|
||||
}
|
||||
|
||||
#ifdef CONFIG_PPC64
|
||||
#ifdef CONFIG_HOTPLUG_CPU
|
||||
static int smp_core99_cpu_notify(struct notifier_block *self,
|
||||
unsigned long action, void *hcpu)
|
||||
|
@ -879,7 +880,6 @@ static struct notifier_block __cpuinitdata smp_core99_cpu_nb = {
|
|||
|
||||
static void __init smp_core99_bringup_done(void)
|
||||
{
|
||||
#ifdef CONFIG_PPC64
|
||||
extern void g5_phy_disable_cpu1(void);
|
||||
|
||||
/* Close i2c bus if it was used for tb sync */
|
||||
|
@ -894,14 +894,14 @@ static void __init smp_core99_bringup_done(void)
|
|||
set_cpu_present(1, false);
|
||||
g5_phy_disable_cpu1();
|
||||
}
|
||||
#endif /* CONFIG_PPC64 */
|
||||
|
||||
#ifdef CONFIG_HOTPLUG_CPU
|
||||
register_cpu_notifier(&smp_core99_cpu_nb);
|
||||
#endif
|
||||
|
||||
if (ppc_md.progress)
|
||||
ppc_md.progress("smp_core99_bringup_done", 0x349);
|
||||
}
|
||||
#endif /* CONFIG_PPC64 */
|
||||
|
||||
#ifdef CONFIG_HOTPLUG_CPU
|
||||
|
||||
|
@ -975,7 +975,9 @@ static void pmac_cpu_die(void)
|
|||
struct smp_ops_t core99_smp_ops = {
|
||||
.message_pass = smp_mpic_message_pass,
|
||||
.probe = smp_core99_probe,
|
||||
#ifdef CONFIG_PPC64
|
||||
.bringup_done = smp_core99_bringup_done,
|
||||
#endif
|
||||
.kick_cpu = smp_core99_kick_cpu,
|
||||
.setup_cpu = smp_core99_setup_cpu,
|
||||
.give_timebase = smp_core99_give_timebase,
|
||||
|
|
|
@ -287,14 +287,22 @@ static int alloc_dispatch_logs(void)
|
|||
int cpu, ret;
|
||||
struct paca_struct *pp;
|
||||
struct dtl_entry *dtl;
|
||||
struct kmem_cache *dtl_cache;
|
||||
|
||||
if (!firmware_has_feature(FW_FEATURE_SPLPAR))
|
||||
return 0;
|
||||
|
||||
dtl_cache = kmem_cache_create("dtl", DISPATCH_LOG_BYTES,
|
||||
DISPATCH_LOG_BYTES, 0, NULL);
|
||||
if (!dtl_cache) {
|
||||
pr_warn("Failed to create dispatch trace log buffer cache\n");
|
||||
pr_warn("Stolen time statistics will be unreliable\n");
|
||||
return 0;
|
||||
}
|
||||
|
||||
for_each_possible_cpu(cpu) {
|
||||
pp = &paca[cpu];
|
||||
dtl = kmalloc_node(DISPATCH_LOG_BYTES, GFP_KERNEL,
|
||||
cpu_to_node(cpu));
|
||||
dtl = kmem_cache_alloc(dtl_cache, GFP_KERNEL);
|
||||
if (!dtl) {
|
||||
pr_warn("Failed to allocate dispatch trace log for cpu %d\n",
|
||||
cpu);
|
||||
|
|
|
@ -324,6 +324,11 @@ int __init fsl_add_bridge(struct device_node *dev, int is_primary)
|
|||
struct resource rsrc;
|
||||
const int *bus_range;
|
||||
|
||||
if (!of_device_is_available(dev)) {
|
||||
pr_warning("%s: disabled\n", dev->full_name);
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
pr_debug("Adding PCI host bridge %s\n", dev->full_name);
|
||||
|
||||
/* Fetch host bridge registers address */
|
||||
|
|
|
@ -1457,7 +1457,6 @@ int fsl_rio_setup(struct platform_device *dev)
|
|||
port->ops = ops;
|
||||
port->priv = priv;
|
||||
port->phys_efptr = 0x100;
|
||||
rio_register_mport(port);
|
||||
|
||||
priv->regs_win = ioremap(regs.start, regs.end - regs.start + 1);
|
||||
rio_regs_win = priv->regs_win;
|
||||
|
@ -1504,6 +1503,9 @@ int fsl_rio_setup(struct platform_device *dev)
|
|||
dev_info(&dev->dev, "RapidIO Common Transport System size: %d\n",
|
||||
port->sys_size ? 65536 : 256);
|
||||
|
||||
if (rio_register_mport(port))
|
||||
goto err;
|
||||
|
||||
if (port->host_deviceid >= 0)
|
||||
out_be32(priv->regs_win + RIO_GCCSR, RIO_PORT_GEN_HOST |
|
||||
RIO_PORT_GEN_MASTER | RIO_PORT_GEN_DISCOVERED);
|
||||
|
|
|
@ -460,7 +460,7 @@ startup:
|
|||
#ifndef CONFIG_MARCH_G5
|
||||
# check capabilities against MARCH_{G5,Z900,Z990,Z9_109,Z10}
|
||||
xc __LC_STFL_FAC_LIST(8),__LC_STFL_FAC_LIST
|
||||
stfl __LC_STFL_FAC_LIST # store facility list
|
||||
.insn s,0xb2b10000,__LC_STFL_FAC_LIST # store facility list
|
||||
tm __LC_STFL_FAC_LIST,0x01 # stfle available ?
|
||||
jz 0f
|
||||
la %r0,0
|
||||
|
|
|
@ -46,7 +46,9 @@ smp_restart_cpu:
|
|||
ltr %r4,%r4 /* New stack ? */
|
||||
jz 1f
|
||||
lr %r15,%r4
|
||||
1: basr %r14,%r2
|
||||
1: lr %r14,%r2 /* r14: Function to call */
|
||||
lr %r2,%r3 /* r2 : Parameter for function*/
|
||||
basr %r14,%r14 /* Call function */
|
||||
|
||||
.gprregs_addr:
|
||||
.long .gprregs
|
||||
|
|
|
@ -42,7 +42,9 @@ smp_restart_cpu:
|
|||
ltgr %r4,%r4 /* New stack ? */
|
||||
jz 1f
|
||||
lgr %r15,%r4
|
||||
1: basr %r14,%r2
|
||||
1: lgr %r14,%r2 /* r14: Function to call */
|
||||
lgr %r2,%r3 /* r2 : Parameter for function*/
|
||||
basr %r14,%r14 /* Call function */
|
||||
|
||||
.section .data,"aw",@progbits
|
||||
.gprregs:
|
||||
|
|
|
@ -517,12 +517,8 @@ stop_exit:
|
|||
|
||||
static int check_hardware_prerequisites(void)
|
||||
{
|
||||
unsigned long long facility_bits[2];
|
||||
|
||||
memcpy(facility_bits, S390_lowcore.stfle_fac_list, 32);
|
||||
if (!(facility_bits[1] & (1ULL << 59)))
|
||||
if (!test_facility(68))
|
||||
return -EOPNOTSUPP;
|
||||
|
||||
return 0;
|
||||
}
|
||||
/*
|
||||
|
|
|
@ -4,6 +4,10 @@ menu "UML-specific options"
|
|||
|
||||
menu "Host processor type and features"
|
||||
|
||||
config CMPXCHG_LOCAL
|
||||
bool
|
||||
default n
|
||||
|
||||
source "arch/x86/Kconfig.cpu"
|
||||
|
||||
endmenu
|
||||
|
|
|
@ -0,0 +1,6 @@
|
|||
#ifndef __UM_BUG_H
|
||||
#define __UM_BUG_H
|
||||
|
||||
#include <asm-generic/bug.h>
|
||||
|
||||
#endif
|
|
@ -66,7 +66,7 @@ static inline void gart_set_size_and_enable(struct pci_dev *dev, u32 order)
|
|||
* Don't enable translation but enable GART IO and CPU accesses.
|
||||
* Also, set DISTLBWALKPRB since GART tables memory is UC.
|
||||
*/
|
||||
ctl = DISTLBWALKPRB | order << 1;
|
||||
ctl = order << 1;
|
||||
|
||||
pci_write_config_dword(dev, AMD64_GARTAPERTURECTL, ctl);
|
||||
}
|
||||
|
@ -75,17 +75,17 @@ static inline void enable_gart_translation(struct pci_dev *dev, u64 addr)
|
|||
{
|
||||
u32 tmp, ctl;
|
||||
|
||||
/* address of the mappings table */
|
||||
addr >>= 12;
|
||||
tmp = (u32) addr<<4;
|
||||
tmp &= ~0xf;
|
||||
pci_write_config_dword(dev, AMD64_GARTTABLEBASE, tmp);
|
||||
/* address of the mappings table */
|
||||
addr >>= 12;
|
||||
tmp = (u32) addr<<4;
|
||||
tmp &= ~0xf;
|
||||
pci_write_config_dword(dev, AMD64_GARTTABLEBASE, tmp);
|
||||
|
||||
/* Enable GART translation for this hammer. */
|
||||
pci_read_config_dword(dev, AMD64_GARTAPERTURECTL, &ctl);
|
||||
ctl |= GARTEN;
|
||||
ctl &= ~(DISGARTCPU | DISGARTIO);
|
||||
pci_write_config_dword(dev, AMD64_GARTAPERTURECTL, ctl);
|
||||
/* Enable GART translation for this hammer. */
|
||||
pci_read_config_dword(dev, AMD64_GARTAPERTURECTL, &ctl);
|
||||
ctl |= GARTEN | DISTLBWALKPRB;
|
||||
ctl &= ~(DISGARTCPU | DISGARTIO);
|
||||
pci_write_config_dword(dev, AMD64_GARTAPERTURECTL, ctl);
|
||||
}
|
||||
|
||||
static inline int aperture_valid(u64 aper_base, u32 aper_size, u32 min_size)
|
||||
|
|
|
@ -96,11 +96,15 @@
|
|||
#define MSR_IA32_MC0_ADDR 0x00000402
|
||||
#define MSR_IA32_MC0_MISC 0x00000403
|
||||
|
||||
#define MSR_AMD64_MC0_MASK 0xc0010044
|
||||
|
||||
#define MSR_IA32_MCx_CTL(x) (MSR_IA32_MC0_CTL + 4*(x))
|
||||
#define MSR_IA32_MCx_STATUS(x) (MSR_IA32_MC0_STATUS + 4*(x))
|
||||
#define MSR_IA32_MCx_ADDR(x) (MSR_IA32_MC0_ADDR + 4*(x))
|
||||
#define MSR_IA32_MCx_MISC(x) (MSR_IA32_MC0_MISC + 4*(x))
|
||||
|
||||
#define MSR_AMD64_MCx_MASK(x) (MSR_AMD64_MC0_MASK + (x))
|
||||
|
||||
/* These are consecutive and not in the normal 4er MCE bank block */
|
||||
#define MSR_IA32_MC0_CTL2 0x00000280
|
||||
#define MSR_IA32_MCx_CTL2(x) (MSR_IA32_MC0_CTL2 + (x))
|
||||
|
|
|
@ -51,7 +51,7 @@ static inline void numa_remove_cpu(int cpu) { }
|
|||
#endif /* CONFIG_NUMA */
|
||||
|
||||
#ifdef CONFIG_DEBUG_PER_CPU_MAPS
|
||||
struct cpumask __cpuinit *debug_cpumask_set_cpu(int cpu, int enable);
|
||||
void debug_cpumask_set_cpu(int cpu, int node, bool enable);
|
||||
#endif
|
||||
|
||||
#endif /* _ASM_X86_NUMA_H */
|
||||
|
|
|
@ -499,7 +499,7 @@ out:
|
|||
* Don't enable translation yet but enable GART IO and CPU
|
||||
* accesses and set DISTLBWALKPRB since GART table memory is UC.
|
||||
*/
|
||||
u32 ctl = DISTLBWALKPRB | aper_order << 1;
|
||||
u32 ctl = aper_order << 1;
|
||||
|
||||
bus = amd_nb_bus_dev_ranges[i].bus;
|
||||
dev_base = amd_nb_bus_dev_ranges[i].dev_base;
|
||||
|
|
|
@ -615,6 +615,25 @@ static void __cpuinit init_amd(struct cpuinfo_x86 *c)
|
|||
/* As a rule processors have APIC timer running in deep C states */
|
||||
if (c->x86 >= 0xf && !cpu_has_amd_erratum(amd_erratum_400))
|
||||
set_cpu_cap(c, X86_FEATURE_ARAT);
|
||||
|
||||
/*
|
||||
* Disable GART TLB Walk Errors on Fam10h. We do this here
|
||||
* because this is always needed when GART is enabled, even in a
|
||||
* kernel which has no MCE support built in.
|
||||
*/
|
||||
if (c->x86 == 0x10) {
|
||||
/*
|
||||
* BIOS should disable GartTlbWlk Errors themself. If
|
||||
* it doesn't do it here as suggested by the BKDG.
|
||||
*
|
||||
* Fixes: https://bugzilla.kernel.org/show_bug.cgi?id=33012
|
||||
*/
|
||||
u64 mask;
|
||||
|
||||
rdmsrl(MSR_AMD64_MCx_MASK(4), mask);
|
||||
mask |= (1 << 10);
|
||||
wrmsrl(MSR_AMD64_MCx_MASK(4), mask);
|
||||
}
|
||||
}
|
||||
|
||||
#ifdef CONFIG_X86_32
|
||||
|
|
|
@ -8,7 +8,7 @@ static __initconst const u64 amd_hw_cache_event_ids
|
|||
[ C(L1D) ] = {
|
||||
[ C(OP_READ) ] = {
|
||||
[ C(RESULT_ACCESS) ] = 0x0040, /* Data Cache Accesses */
|
||||
[ C(RESULT_MISS) ] = 0x0041, /* Data Cache Misses */
|
||||
[ C(RESULT_MISS) ] = 0x0141, /* Data Cache Misses */
|
||||
},
|
||||
[ C(OP_WRITE) ] = {
|
||||
[ C(RESULT_ACCESS) ] = 0x0142, /* Data Cache Refills :system */
|
||||
|
@ -427,7 +427,9 @@ static __initconst const struct x86_pmu amd_pmu = {
|
|||
*
|
||||
* Exceptions:
|
||||
*
|
||||
* 0x000 FP PERF_CTL[3], PERF_CTL[5:3] (*)
|
||||
* 0x003 FP PERF_CTL[3]
|
||||
* 0x004 FP PERF_CTL[3], PERF_CTL[5:3] (*)
|
||||
* 0x00B FP PERF_CTL[3]
|
||||
* 0x00D FP PERF_CTL[3]
|
||||
* 0x023 DE PERF_CTL[2:0]
|
||||
|
@ -448,6 +450,8 @@ static __initconst const struct x86_pmu amd_pmu = {
|
|||
* 0x0DF LS PERF_CTL[5:0]
|
||||
* 0x1D6 EX PERF_CTL[5:0]
|
||||
* 0x1D8 EX PERF_CTL[5:0]
|
||||
*
|
||||
* (*) depending on the umask all FPU counters may be used
|
||||
*/
|
||||
|
||||
static struct event_constraint amd_f15_PMC0 = EVENT_CONSTRAINT(0, 0x01, 0);
|
||||
|
@ -460,18 +464,28 @@ static struct event_constraint amd_f15_PMC53 = EVENT_CONSTRAINT(0, 0x38, 0);
|
|||
static struct event_constraint *
|
||||
amd_get_event_constraints_f15h(struct cpu_hw_events *cpuc, struct perf_event *event)
|
||||
{
|
||||
unsigned int event_code = amd_get_event_code(&event->hw);
|
||||
struct hw_perf_event *hwc = &event->hw;
|
||||
unsigned int event_code = amd_get_event_code(hwc);
|
||||
|
||||
switch (event_code & AMD_EVENT_TYPE_MASK) {
|
||||
case AMD_EVENT_FP:
|
||||
switch (event_code) {
|
||||
case 0x000:
|
||||
if (!(hwc->config & 0x0000F000ULL))
|
||||
break;
|
||||
if (!(hwc->config & 0x00000F00ULL))
|
||||
break;
|
||||
return &amd_f15_PMC3;
|
||||
case 0x004:
|
||||
if (hweight_long(hwc->config & ARCH_PERFMON_EVENTSEL_UMASK) <= 1)
|
||||
break;
|
||||
return &amd_f15_PMC3;
|
||||
case 0x003:
|
||||
case 0x00B:
|
||||
case 0x00D:
|
||||
return &amd_f15_PMC3;
|
||||
default:
|
||||
return &amd_f15_PMC53;
|
||||
}
|
||||
return &amd_f15_PMC53;
|
||||
case AMD_EVENT_LS:
|
||||
case AMD_EVENT_DC:
|
||||
case AMD_EVENT_EX_LS:
|
||||
|
|
|
@ -81,6 +81,9 @@ static u32 gart_unmapped_entry;
|
|||
#define AGPEXTERN
|
||||
#endif
|
||||
|
||||
/* GART can only remap to physical addresses < 1TB */
|
||||
#define GART_MAX_PHYS_ADDR (1ULL << 40)
|
||||
|
||||
/* backdoor interface to AGP driver */
|
||||
AGPEXTERN int agp_memory_reserved;
|
||||
AGPEXTERN __u32 *agp_gatt_table;
|
||||
|
@ -212,9 +215,13 @@ static dma_addr_t dma_map_area(struct device *dev, dma_addr_t phys_mem,
|
|||
size_t size, int dir, unsigned long align_mask)
|
||||
{
|
||||
unsigned long npages = iommu_num_pages(phys_mem, size, PAGE_SIZE);
|
||||
unsigned long iommu_page = alloc_iommu(dev, npages, align_mask);
|
||||
unsigned long iommu_page;
|
||||
int i;
|
||||
|
||||
if (unlikely(phys_mem + size > GART_MAX_PHYS_ADDR))
|
||||
return bad_dma_addr;
|
||||
|
||||
iommu_page = alloc_iommu(dev, npages, align_mask);
|
||||
if (iommu_page == -1) {
|
||||
if (!nonforced_iommu(dev, phys_mem, size))
|
||||
return phys_mem;
|
||||
|
|
|
@ -213,53 +213,48 @@ int early_cpu_to_node(int cpu)
|
|||
return per_cpu(x86_cpu_to_node_map, cpu);
|
||||
}
|
||||
|
||||
struct cpumask __cpuinit *debug_cpumask_set_cpu(int cpu, int enable)
|
||||
void debug_cpumask_set_cpu(int cpu, int node, bool enable)
|
||||
{
|
||||
int node = early_cpu_to_node(cpu);
|
||||
struct cpumask *mask;
|
||||
char buf[64];
|
||||
|
||||
if (node == NUMA_NO_NODE) {
|
||||
/* early_cpu_to_node() already emits a warning and trace */
|
||||
return NULL;
|
||||
return;
|
||||
}
|
||||
mask = node_to_cpumask_map[node];
|
||||
if (!mask) {
|
||||
pr_err("node_to_cpumask_map[%i] NULL\n", node);
|
||||
dump_stack();
|
||||
return NULL;
|
||||
}
|
||||
|
||||
cpulist_scnprintf(buf, sizeof(buf), mask);
|
||||
printk(KERN_DEBUG "%s cpu %d node %d: mask now %s\n",
|
||||
enable ? "numa_add_cpu" : "numa_remove_cpu",
|
||||
cpu, node, buf);
|
||||
return mask;
|
||||
}
|
||||
|
||||
# ifndef CONFIG_NUMA_EMU
|
||||
static void __cpuinit numa_set_cpumask(int cpu, int enable)
|
||||
{
|
||||
struct cpumask *mask;
|
||||
|
||||
mask = debug_cpumask_set_cpu(cpu, enable);
|
||||
if (!mask)
|
||||
return;
|
||||
}
|
||||
|
||||
if (enable)
|
||||
cpumask_set_cpu(cpu, mask);
|
||||
else
|
||||
cpumask_clear_cpu(cpu, mask);
|
||||
|
||||
cpulist_scnprintf(buf, sizeof(buf), mask);
|
||||
printk(KERN_DEBUG "%s cpu %d node %d: mask now %s\n",
|
||||
enable ? "numa_add_cpu" : "numa_remove_cpu",
|
||||
cpu, node, buf);
|
||||
return;
|
||||
}
|
||||
|
||||
# ifndef CONFIG_NUMA_EMU
|
||||
static void __cpuinit numa_set_cpumask(int cpu, bool enable)
|
||||
{
|
||||
debug_cpumask_set_cpu(cpu, early_cpu_to_node(cpu), enable);
|
||||
}
|
||||
|
||||
void __cpuinit numa_add_cpu(int cpu)
|
||||
{
|
||||
numa_set_cpumask(cpu, 1);
|
||||
numa_set_cpumask(cpu, true);
|
||||
}
|
||||
|
||||
void __cpuinit numa_remove_cpu(int cpu)
|
||||
{
|
||||
numa_set_cpumask(cpu, 0);
|
||||
numa_set_cpumask(cpu, false);
|
||||
}
|
||||
# endif /* !CONFIG_NUMA_EMU */
|
||||
|
||||
|
|
|
@ -454,10 +454,9 @@ void __cpuinit numa_remove_cpu(int cpu)
|
|||
cpumask_clear_cpu(cpu, node_to_cpumask_map[i]);
|
||||
}
|
||||
#else /* !CONFIG_DEBUG_PER_CPU_MAPS */
|
||||
static void __cpuinit numa_set_cpumask(int cpu, int enable)
|
||||
static void __cpuinit numa_set_cpumask(int cpu, bool enable)
|
||||
{
|
||||
struct cpumask *mask;
|
||||
int nid, physnid, i;
|
||||
int nid, physnid;
|
||||
|
||||
nid = early_cpu_to_node(cpu);
|
||||
if (nid == NUMA_NO_NODE) {
|
||||
|
@ -467,28 +466,21 @@ static void __cpuinit numa_set_cpumask(int cpu, int enable)
|
|||
|
||||
physnid = emu_nid_to_phys[nid];
|
||||
|
||||
for_each_online_node(i) {
|
||||
for_each_online_node(nid) {
|
||||
if (emu_nid_to_phys[nid] != physnid)
|
||||
continue;
|
||||
|
||||
mask = debug_cpumask_set_cpu(cpu, enable);
|
||||
if (!mask)
|
||||
return;
|
||||
|
||||
if (enable)
|
||||
cpumask_set_cpu(cpu, mask);
|
||||
else
|
||||
cpumask_clear_cpu(cpu, mask);
|
||||
debug_cpumask_set_cpu(cpu, nid, enable);
|
||||
}
|
||||
}
|
||||
|
||||
void __cpuinit numa_add_cpu(int cpu)
|
||||
{
|
||||
numa_set_cpumask(cpu, 1);
|
||||
numa_set_cpumask(cpu, true);
|
||||
}
|
||||
|
||||
void __cpuinit numa_remove_cpu(int cpu)
|
||||
{
|
||||
numa_set_cpumask(cpu, 0);
|
||||
numa_set_cpumask(cpu, false);
|
||||
}
|
||||
#endif /* !CONFIG_DEBUG_PER_CPU_MAPS */
|
||||
|
|
|
@ -74,6 +74,7 @@
|
|||
compatible = "intel,ce4100-pci", "pci";
|
||||
device_type = "pci";
|
||||
bus-range = <1 1>;
|
||||
reg = <0x0800 0x0 0x0 0x0 0x0>;
|
||||
ranges = <0x2000000 0 0xdffe0000 0x2000000 0 0xdffe0000 0 0x1000>;
|
||||
|
||||
interrupt-parent = <&ioapic2>;
|
||||
|
@ -412,6 +413,7 @@
|
|||
#address-cells = <2>;
|
||||
#size-cells = <1>;
|
||||
compatible = "isa";
|
||||
reg = <0xf800 0x0 0x0 0x0 0x0>;
|
||||
ranges = <1 0 0 0 0 0x100>;
|
||||
|
||||
rtc@70 {
|
||||
|
|
|
@ -97,11 +97,11 @@ static int __init sfi_parse_mtmr(struct sfi_table_header *table)
|
|||
pentry->freq_hz, pentry->irq);
|
||||
if (!pentry->irq)
|
||||
continue;
|
||||
mp_irq.type = MP_IOAPIC;
|
||||
mp_irq.type = MP_INTSRC;
|
||||
mp_irq.irqtype = mp_INT;
|
||||
/* triggering mode edge bit 2-3, active high polarity bit 0-1 */
|
||||
mp_irq.irqflag = 5;
|
||||
mp_irq.srcbus = 0;
|
||||
mp_irq.srcbus = MP_BUS_ISA;
|
||||
mp_irq.srcbusirq = pentry->irq; /* IRQ */
|
||||
mp_irq.dstapic = MP_APIC_ALL;
|
||||
mp_irq.dstirq = pentry->irq;
|
||||
|
@ -168,10 +168,10 @@ int __init sfi_parse_mrtc(struct sfi_table_header *table)
|
|||
for (totallen = 0; totallen < sfi_mrtc_num; totallen++, pentry++) {
|
||||
pr_debug("RTC[%d]: paddr = 0x%08x, irq = %d\n",
|
||||
totallen, (u32)pentry->phys_addr, pentry->irq);
|
||||
mp_irq.type = MP_IOAPIC;
|
||||
mp_irq.type = MP_INTSRC;
|
||||
mp_irq.irqtype = mp_INT;
|
||||
mp_irq.irqflag = 0xf; /* level trigger and active low */
|
||||
mp_irq.srcbus = 0;
|
||||
mp_irq.srcbus = MP_BUS_ISA;
|
||||
mp_irq.srcbusirq = pentry->irq; /* IRQ */
|
||||
mp_irq.dstapic = MP_APIC_ALL;
|
||||
mp_irq.dstirq = pentry->irq;
|
||||
|
@ -282,7 +282,7 @@ void __init x86_mrst_early_setup(void)
|
|||
/* Avoid searching for BIOS MP tables */
|
||||
x86_init.mpparse.find_smp_config = x86_init_noop;
|
||||
x86_init.mpparse.get_smp_config = x86_init_uint_noop;
|
||||
|
||||
set_bit(MP_BUS_ISA, mp_bus_not_pci);
|
||||
}
|
||||
|
||||
/*
|
||||
|
|
|
@ -39,6 +39,7 @@ config XEN_MAX_DOMAIN_MEMORY
|
|||
config XEN_SAVE_RESTORE
|
||||
bool
|
||||
depends on XEN
|
||||
select HIBERNATE_CALLBACKS
|
||||
default y
|
||||
|
||||
config XEN_DEBUG_FS
|
||||
|
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue