mirror of https://gitee.com/openkylin/linux.git
Merge branch 'linus' into perf/core, to refresh the branch
Signed-off-by: Ingo Molnar <mingo@kernel.org>
This commit is contained in:
commit
4f56186ec0
|
@ -32,7 +32,7 @@ Example:
|
||||||
compatible = "st,stm32h743-rcc", "st,stm32-rcc";
|
compatible = "st,stm32h743-rcc", "st,stm32-rcc";
|
||||||
reg = <0x58024400 0x400>;
|
reg = <0x58024400 0x400>;
|
||||||
#reset-cells = <1>;
|
#reset-cells = <1>;
|
||||||
#clock-cells = <2>;
|
#clock-cells = <1>;
|
||||||
clocks = <&clk_hse>, <&clk_lse>, <&clk_i2s_ckin>;
|
clocks = <&clk_hse>, <&clk_lse>, <&clk_i2s_ckin>;
|
||||||
|
|
||||||
st,syscfg = <&pwrcfg>;
|
st,syscfg = <&pwrcfg>;
|
||||||
|
|
|
@ -8,6 +8,12 @@ Required properties:
|
||||||
the firmware event log
|
the firmware event log
|
||||||
- linux,sml-size : size of the memory allocated for the firmware event log
|
- linux,sml-size : size of the memory allocated for the firmware event log
|
||||||
|
|
||||||
|
Optional properties:
|
||||||
|
|
||||||
|
- powered-while-suspended: present when the TPM is left powered on between
|
||||||
|
suspend and resume (makes the suspend/resume
|
||||||
|
callbacks do nothing).
|
||||||
|
|
||||||
Example (for OpenPower Systems with Nuvoton TPM 2.0 on I2C)
|
Example (for OpenPower Systems with Nuvoton TPM 2.0 on I2C)
|
||||||
----------------------------------------------------------
|
----------------------------------------------------------
|
||||||
|
|
||||||
|
|
|
@ -3,8 +3,8 @@ Device tree binding vendor prefix registry. Keep list in alphabetical order.
|
||||||
This isn't an exhaustive list, but you should add new prefixes to it before
|
This isn't an exhaustive list, but you should add new prefixes to it before
|
||||||
using them to avoid name-space collisions.
|
using them to avoid name-space collisions.
|
||||||
|
|
||||||
abcn Abracon Corporation
|
|
||||||
abilis Abilis Systems
|
abilis Abilis Systems
|
||||||
|
abracon Abracon Corporation
|
||||||
actions Actions Semiconductor Co., Ltd.
|
actions Actions Semiconductor Co., Ltd.
|
||||||
active-semi Active-Semi International Inc
|
active-semi Active-Semi International Inc
|
||||||
ad Avionic Design GmbH
|
ad Avionic Design GmbH
|
||||||
|
|
|
@ -675,7 +675,7 @@ sub-domain of the parent domain.
|
||||||
|
|
||||||
Support for power domains is provided through the :c:member:`pm_domain` field of
|
Support for power domains is provided through the :c:member:`pm_domain` field of
|
||||||
|struct device|. This field is a pointer to an object of type
|
|struct device|. This field is a pointer to an object of type
|
||||||
|struct dev_pm_domain|, defined in :file:`include/linux/pm.h``, providing a set
|
|struct dev_pm_domain|, defined in :file:`include/linux/pm.h`, providing a set
|
||||||
of power management callbacks analogous to the subsystem-level and device driver
|
of power management callbacks analogous to the subsystem-level and device driver
|
||||||
callbacks that are executed for the given device during all power transitions,
|
callbacks that are executed for the given device during all power transitions,
|
||||||
instead of the respective subsystem-level callbacks. Specifically, if a
|
instead of the respective subsystem-level callbacks. Specifically, if a
|
||||||
|
|
|
@ -337,7 +337,7 @@ Examples for low-level BPF:
|
||||||
jeq #14, good /* __NR_rt_sigprocmask */
|
jeq #14, good /* __NR_rt_sigprocmask */
|
||||||
jeq #13, good /* __NR_rt_sigaction */
|
jeq #13, good /* __NR_rt_sigaction */
|
||||||
jeq #35, good /* __NR_nanosleep */
|
jeq #35, good /* __NR_nanosleep */
|
||||||
bad: ret #0 /* SECCOMP_RET_KILL */
|
bad: ret #0 /* SECCOMP_RET_KILL_THREAD */
|
||||||
good: ret #0x7fff0000 /* SECCOMP_RET_ALLOW */
|
good: ret #0x7fff0000 /* SECCOMP_RET_ALLOW */
|
||||||
|
|
||||||
The above example code can be placed into a file (here called "foo"), and
|
The above example code can be placed into a file (here called "foo"), and
|
||||||
|
|
|
@ -1680,6 +1680,9 @@ accept_dad - INTEGER
|
||||||
2: Enable DAD, and disable IPv6 operation if MAC-based duplicate
|
2: Enable DAD, and disable IPv6 operation if MAC-based duplicate
|
||||||
link-local address has been found.
|
link-local address has been found.
|
||||||
|
|
||||||
|
DAD operation and mode on a given interface will be selected according
|
||||||
|
to the maximum value of conf/{all,interface}/accept_dad.
|
||||||
|
|
||||||
force_tllao - BOOLEAN
|
force_tllao - BOOLEAN
|
||||||
Enable sending the target link-layer address option even when
|
Enable sending the target link-layer address option even when
|
||||||
responding to a unicast neighbor solicitation.
|
responding to a unicast neighbor solicitation.
|
||||||
|
@ -1727,16 +1730,23 @@ suppress_frag_ndisc - INTEGER
|
||||||
|
|
||||||
optimistic_dad - BOOLEAN
|
optimistic_dad - BOOLEAN
|
||||||
Whether to perform Optimistic Duplicate Address Detection (RFC 4429).
|
Whether to perform Optimistic Duplicate Address Detection (RFC 4429).
|
||||||
0: disabled (default)
|
0: disabled (default)
|
||||||
1: enabled
|
1: enabled
|
||||||
|
|
||||||
|
Optimistic Duplicate Address Detection for the interface will be enabled
|
||||||
|
if at least one of conf/{all,interface}/optimistic_dad is set to 1,
|
||||||
|
it will be disabled otherwise.
|
||||||
|
|
||||||
use_optimistic - BOOLEAN
|
use_optimistic - BOOLEAN
|
||||||
If enabled, do not classify optimistic addresses as deprecated during
|
If enabled, do not classify optimistic addresses as deprecated during
|
||||||
source address selection. Preferred addresses will still be chosen
|
source address selection. Preferred addresses will still be chosen
|
||||||
before optimistic addresses, subject to other ranking in the source
|
before optimistic addresses, subject to other ranking in the source
|
||||||
address selection algorithm.
|
address selection algorithm.
|
||||||
0: disabled (default)
|
0: disabled (default)
|
||||||
1: enabled
|
1: enabled
|
||||||
|
|
||||||
|
This will be enabled if at least one of
|
||||||
|
conf/{all,interface}/use_optimistic is set to 1, disabled otherwise.
|
||||||
|
|
||||||
stable_secret - IPv6 address
|
stable_secret - IPv6 address
|
||||||
This IPv6 address will be used as a secret to generate IPv6
|
This IPv6 address will be used as a secret to generate IPv6
|
||||||
|
|
|
@ -13,42 +13,42 @@ an example setup using a data-center-class switch ASIC chip. Other setups
|
||||||
with SR-IOV or soft switches, such as OVS, are possible.
|
with SR-IOV or soft switches, such as OVS, are possible.
|
||||||
|
|
||||||
|
|
||||||
User-space tools
|
User-space tools
|
||||||
|
|
||||||
user space |
|
user space |
|
||||||
+-------------------------------------------------------------------+
|
+-------------------------------------------------------------------+
|
||||||
kernel | Netlink
|
kernel | Netlink
|
||||||
|
|
|
|
||||||
+--------------+-------------------------------+
|
+--------------+-------------------------------+
|
||||||
| Network stack |
|
| Network stack |
|
||||||
| (Linux) |
|
| (Linux) |
|
||||||
| |
|
| |
|
||||||
+----------------------------------------------+
|
+----------------------------------------------+
|
||||||
|
|
||||||
sw1p2 sw1p4 sw1p6
|
sw1p2 sw1p4 sw1p6
|
||||||
sw1p1 + sw1p3 + sw1p5 + eth1
|
sw1p1 + sw1p3 + sw1p5 + eth1
|
||||||
+ | + | + | +
|
+ | + | + | +
|
||||||
| | | | | | |
|
| | | | | | |
|
||||||
+--+----+----+----+-+--+----+---+ +-----+-----+
|
+--+----+----+----+----+----+---+ +-----+-----+
|
||||||
| Switch driver | | mgmt |
|
| Switch driver | | mgmt |
|
||||||
| (this document) | | driver |
|
| (this document) | | driver |
|
||||||
| | | |
|
| | | |
|
||||||
+--------------+----------------+ +-----------+
|
+--------------+----------------+ +-----------+
|
||||||
|
|
|
|
||||||
kernel | HW bus (eg PCI)
|
kernel | HW bus (eg PCI)
|
||||||
+-------------------------------------------------------------------+
|
+-------------------------------------------------------------------+
|
||||||
hardware |
|
hardware |
|
||||||
+--------------+---+------------+
|
+--------------+----------------+
|
||||||
| Switch device (sw1) |
|
| Switch device (sw1) |
|
||||||
| +----+ +--------+
|
| +----+ +--------+
|
||||||
| | v offloaded data path | mgmt port
|
| | v offloaded data path | mgmt port
|
||||||
| | | |
|
| | | |
|
||||||
+--|----|----+----+----+----+---+
|
+--|----|----+----+----+----+---+
|
||||||
| | | | | |
|
| | | | | |
|
||||||
+ + + + + +
|
+ + + + + +
|
||||||
p1 p2 p3 p4 p5 p6
|
p1 p2 p3 p4 p5 p6
|
||||||
|
|
||||||
front-panel ports
|
front-panel ports
|
||||||
|
|
||||||
|
|
||||||
Fig 1.
|
Fig 1.
|
||||||
|
|
|
@ -75,6 +75,7 @@ show up in /proc/sys/kernel:
|
||||||
- reboot-cmd [ SPARC only ]
|
- reboot-cmd [ SPARC only ]
|
||||||
- rtsig-max
|
- rtsig-max
|
||||||
- rtsig-nr
|
- rtsig-nr
|
||||||
|
- seccomp/ ==> Documentation/userspace-api/seccomp_filter.rst
|
||||||
- sem
|
- sem
|
||||||
- sem_next_id [ sysv ipc ]
|
- sem_next_id [ sysv ipc ]
|
||||||
- sg-big-buff [ generic SCSI device (sg) ]
|
- sg-big-buff [ generic SCSI device (sg) ]
|
||||||
|
|
|
@ -87,11 +87,16 @@ Return values
|
||||||
A seccomp filter may return any of the following values. If multiple
|
A seccomp filter may return any of the following values. If multiple
|
||||||
filters exist, the return value for the evaluation of a given system
|
filters exist, the return value for the evaluation of a given system
|
||||||
call will always use the highest precedent value. (For example,
|
call will always use the highest precedent value. (For example,
|
||||||
``SECCOMP_RET_KILL`` will always take precedence.)
|
``SECCOMP_RET_KILL_PROCESS`` will always take precedence.)
|
||||||
|
|
||||||
In precedence order, they are:
|
In precedence order, they are:
|
||||||
|
|
||||||
``SECCOMP_RET_KILL``:
|
``SECCOMP_RET_KILL_PROCESS``:
|
||||||
|
Results in the entire process exiting immediately without executing
|
||||||
|
the system call. The exit status of the task (``status & 0x7f``)
|
||||||
|
will be ``SIGSYS``, not ``SIGKILL``.
|
||||||
|
|
||||||
|
``SECCOMP_RET_KILL_THREAD``:
|
||||||
Results in the task exiting immediately without executing the
|
Results in the task exiting immediately without executing the
|
||||||
system call. The exit status of the task (``status & 0x7f``) will
|
system call. The exit status of the task (``status & 0x7f``) will
|
||||||
be ``SIGSYS``, not ``SIGKILL``.
|
be ``SIGSYS``, not ``SIGKILL``.
|
||||||
|
@ -141,6 +146,15 @@ In precedence order, they are:
|
||||||
allow use of ptrace, even of other sandboxed processes, without
|
allow use of ptrace, even of other sandboxed processes, without
|
||||||
extreme care; ptracers can use this mechanism to escape.)
|
extreme care; ptracers can use this mechanism to escape.)
|
||||||
|
|
||||||
|
``SECCOMP_RET_LOG``:
|
||||||
|
Results in the system call being executed after it is logged. This
|
||||||
|
should be used by application developers to learn which syscalls their
|
||||||
|
application needs without having to iterate through multiple test and
|
||||||
|
development cycles to build the list.
|
||||||
|
|
||||||
|
This action will only be logged if "log" is present in the
|
||||||
|
actions_logged sysctl string.
|
||||||
|
|
||||||
``SECCOMP_RET_ALLOW``:
|
``SECCOMP_RET_ALLOW``:
|
||||||
Results in the system call being executed.
|
Results in the system call being executed.
|
||||||
|
|
||||||
|
@ -169,7 +183,41 @@ The ``samples/seccomp/`` directory contains both an x86-specific example
|
||||||
and a more generic example of a higher level macro interface for BPF
|
and a more generic example of a higher level macro interface for BPF
|
||||||
program generation.
|
program generation.
|
||||||
|
|
||||||
|
Sysctls
|
||||||
|
=======
|
||||||
|
|
||||||
|
Seccomp's sysctl files can be found in the ``/proc/sys/kernel/seccomp/``
|
||||||
|
directory. Here's a description of each file in that directory:
|
||||||
|
|
||||||
|
``actions_avail``:
|
||||||
|
A read-only ordered list of seccomp return values (refer to the
|
||||||
|
``SECCOMP_RET_*`` macros above) in string form. The ordering, from
|
||||||
|
left-to-right, is the least permissive return value to the most
|
||||||
|
permissive return value.
|
||||||
|
|
||||||
|
The list represents the set of seccomp return values supported
|
||||||
|
by the kernel. A userspace program may use this list to
|
||||||
|
determine if the actions found in the ``seccomp.h``, when the
|
||||||
|
program was built, differs from the set of actions actually
|
||||||
|
supported in the current running kernel.
|
||||||
|
|
||||||
|
``actions_logged``:
|
||||||
|
A read-write ordered list of seccomp return values (refer to the
|
||||||
|
``SECCOMP_RET_*`` macros above) that are allowed to be logged. Writes
|
||||||
|
to the file do not need to be in ordered form but reads from the file
|
||||||
|
will be ordered in the same way as the actions_avail sysctl.
|
||||||
|
|
||||||
|
It is important to note that the value of ``actions_logged`` does not
|
||||||
|
prevent certain actions from being logged when the audit subsystem is
|
||||||
|
configured to audit a task. If the action is not found in
|
||||||
|
``actions_logged`` list, the final decision on whether to audit the
|
||||||
|
action for that task is ultimately left up to the audit subsystem to
|
||||||
|
decide for all seccomp return values other than ``SECCOMP_RET_ALLOW``.
|
||||||
|
|
||||||
|
The ``allow`` string is not accepted in the ``actions_logged`` sysctl
|
||||||
|
as it is not possible to log ``SECCOMP_RET_ALLOW`` actions. Attempting
|
||||||
|
to write ``allow`` to the sysctl will result in an EINVAL being
|
||||||
|
returned.
|
||||||
|
|
||||||
Adding architecture support
|
Adding architecture support
|
||||||
===========================
|
===========================
|
||||||
|
|
18
MAINTAINERS
18
MAINTAINERS
|
@ -352,6 +352,18 @@ L: linux-acpi@vger.kernel.org
|
||||||
S: Maintained
|
S: Maintained
|
||||||
F: drivers/acpi/arm64
|
F: drivers/acpi/arm64
|
||||||
|
|
||||||
|
ACPI PMIC DRIVERS
|
||||||
|
M: "Rafael J. Wysocki" <rjw@rjwysocki.net>
|
||||||
|
M: Len Brown <lenb@kernel.org>
|
||||||
|
R: Andy Shevchenko <andy@infradead.org>
|
||||||
|
R: Mika Westerberg <mika.westerberg@linux.intel.com>
|
||||||
|
L: linux-acpi@vger.kernel.org
|
||||||
|
Q: https://patchwork.kernel.org/project/linux-acpi/list/
|
||||||
|
T: git git://git.kernel.org/pub/scm/linux/kernel/git/rafael/linux-pm
|
||||||
|
B: https://bugzilla.kernel.org
|
||||||
|
S: Supported
|
||||||
|
F: drivers/acpi/pmic/
|
||||||
|
|
||||||
ACPI THERMAL DRIVER
|
ACPI THERMAL DRIVER
|
||||||
M: Zhang Rui <rui.zhang@intel.com>
|
M: Zhang Rui <rui.zhang@intel.com>
|
||||||
L: linux-acpi@vger.kernel.org
|
L: linux-acpi@vger.kernel.org
|
||||||
|
@ -2853,7 +2865,6 @@ S: Supported
|
||||||
F: drivers/scsi/bnx2i/
|
F: drivers/scsi/bnx2i/
|
||||||
|
|
||||||
BROADCOM BNX2X 10 GIGABIT ETHERNET DRIVER
|
BROADCOM BNX2X 10 GIGABIT ETHERNET DRIVER
|
||||||
M: Yuval Mintz <Yuval.Mintz@cavium.com>
|
|
||||||
M: Ariel Elior <ariel.elior@cavium.com>
|
M: Ariel Elior <ariel.elior@cavium.com>
|
||||||
M: everest-linux-l2@cavium.com
|
M: everest-linux-l2@cavium.com
|
||||||
L: netdev@vger.kernel.org
|
L: netdev@vger.kernel.org
|
||||||
|
@ -6643,8 +6654,8 @@ M: Alexander Aring <alex.aring@gmail.com>
|
||||||
M: Stefan Schmidt <stefan@osg.samsung.com>
|
M: Stefan Schmidt <stefan@osg.samsung.com>
|
||||||
L: linux-wpan@vger.kernel.org
|
L: linux-wpan@vger.kernel.org
|
||||||
W: http://wpan.cakelab.org/
|
W: http://wpan.cakelab.org/
|
||||||
T: git git://git.kernel.org/pub/scm/linux/kernel/git/bluetooth/bluetooth.git
|
T: git git://git.kernel.org/pub/scm/linux/kernel/git/sschmidt/wpan.git
|
||||||
T: git git://git.kernel.org/pub/scm/linux/kernel/git/bluetooth/bluetooth-next.git
|
T: git git://git.kernel.org/pub/scm/linux/kernel/git/sschmidt/wpan-next.git
|
||||||
S: Maintained
|
S: Maintained
|
||||||
F: net/ieee802154/
|
F: net/ieee802154/
|
||||||
F: net/mac802154/
|
F: net/mac802154/
|
||||||
|
@ -11047,7 +11058,6 @@ S: Supported
|
||||||
F: drivers/scsi/qedi/
|
F: drivers/scsi/qedi/
|
||||||
|
|
||||||
QLOGIC QL4xxx ETHERNET DRIVER
|
QLOGIC QL4xxx ETHERNET DRIVER
|
||||||
M: Yuval Mintz <Yuval.Mintz@cavium.com>
|
|
||||||
M: Ariel Elior <Ariel.Elior@cavium.com>
|
M: Ariel Elior <Ariel.Elior@cavium.com>
|
||||||
M: everest-linux-l2@cavium.com
|
M: everest-linux-l2@cavium.com
|
||||||
L: netdev@vger.kernel.org
|
L: netdev@vger.kernel.org
|
||||||
|
|
6
Makefile
6
Makefile
|
@ -1,7 +1,7 @@
|
||||||
VERSION = 4
|
VERSION = 4
|
||||||
PATCHLEVEL = 14
|
PATCHLEVEL = 14
|
||||||
SUBLEVEL = 0
|
SUBLEVEL = 0
|
||||||
EXTRAVERSION = -rc1
|
EXTRAVERSION = -rc2
|
||||||
NAME = Fearless Coyote
|
NAME = Fearless Coyote
|
||||||
|
|
||||||
# *DOCUMENTATION*
|
# *DOCUMENTATION*
|
||||||
|
@ -1172,11 +1172,11 @@ headers_check: headers_install
|
||||||
|
|
||||||
PHONY += kselftest
|
PHONY += kselftest
|
||||||
kselftest:
|
kselftest:
|
||||||
$(Q)$(MAKE) -C tools/testing/selftests run_tests
|
$(Q)$(MAKE) -C $(srctree)/tools/testing/selftests run_tests
|
||||||
|
|
||||||
PHONY += kselftest-clean
|
PHONY += kselftest-clean
|
||||||
kselftest-clean:
|
kselftest-clean:
|
||||||
$(Q)$(MAKE) -C tools/testing/selftests clean
|
$(Q)$(MAKE) -C $(srctree)/tools/testing/selftests clean
|
||||||
|
|
||||||
PHONY += kselftest-merge
|
PHONY += kselftest-merge
|
||||||
kselftest-merge:
|
kselftest-merge:
|
||||||
|
|
|
@ -78,9 +78,6 @@ struct task_struct;
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#define copy_segments(tsk, mm) do { } while (0)
|
|
||||||
#define release_segments(mm) do { } while (0)
|
|
||||||
|
|
||||||
#define KSTK_EIP(tsk) (task_pt_regs(tsk)->ret)
|
#define KSTK_EIP(tsk) (task_pt_regs(tsk)->ret)
|
||||||
#define KSTK_ESP(tsk) (task_pt_regs(tsk)->sp)
|
#define KSTK_ESP(tsk) (task_pt_regs(tsk)->sp)
|
||||||
|
|
||||||
|
|
|
@ -139,11 +139,10 @@ extern int vfp_restore_user_hwstate(struct user_vfp __user *,
|
||||||
#define TIF_NEED_RESCHED 1 /* rescheduling necessary */
|
#define TIF_NEED_RESCHED 1 /* rescheduling necessary */
|
||||||
#define TIF_NOTIFY_RESUME 2 /* callback before returning to user */
|
#define TIF_NOTIFY_RESUME 2 /* callback before returning to user */
|
||||||
#define TIF_UPROBE 3 /* breakpointed or singlestepping */
|
#define TIF_UPROBE 3 /* breakpointed or singlestepping */
|
||||||
#define TIF_FSCHECK 4 /* Check FS is USER_DS on return */
|
#define TIF_SYSCALL_TRACE 4 /* syscall trace active */
|
||||||
#define TIF_SYSCALL_TRACE 5 /* syscall trace active */
|
#define TIF_SYSCALL_AUDIT 5 /* syscall auditing active */
|
||||||
#define TIF_SYSCALL_AUDIT 6 /* syscall auditing active */
|
#define TIF_SYSCALL_TRACEPOINT 6 /* syscall tracepoint instrumentation */
|
||||||
#define TIF_SYSCALL_TRACEPOINT 7 /* syscall tracepoint instrumentation */
|
#define TIF_SECCOMP 7 /* seccomp syscall filtering active */
|
||||||
#define TIF_SECCOMP 8 /* seccomp syscall filtering active */
|
|
||||||
|
|
||||||
#define TIF_NOHZ 12 /* in adaptive nohz mode */
|
#define TIF_NOHZ 12 /* in adaptive nohz mode */
|
||||||
#define TIF_USING_IWMMXT 17
|
#define TIF_USING_IWMMXT 17
|
||||||
|
@ -154,7 +153,6 @@ extern int vfp_restore_user_hwstate(struct user_vfp __user *,
|
||||||
#define _TIF_NEED_RESCHED (1 << TIF_NEED_RESCHED)
|
#define _TIF_NEED_RESCHED (1 << TIF_NEED_RESCHED)
|
||||||
#define _TIF_NOTIFY_RESUME (1 << TIF_NOTIFY_RESUME)
|
#define _TIF_NOTIFY_RESUME (1 << TIF_NOTIFY_RESUME)
|
||||||
#define _TIF_UPROBE (1 << TIF_UPROBE)
|
#define _TIF_UPROBE (1 << TIF_UPROBE)
|
||||||
#define _TIF_FSCHECK (1 << TIF_FSCHECK)
|
|
||||||
#define _TIF_SYSCALL_TRACE (1 << TIF_SYSCALL_TRACE)
|
#define _TIF_SYSCALL_TRACE (1 << TIF_SYSCALL_TRACE)
|
||||||
#define _TIF_SYSCALL_AUDIT (1 << TIF_SYSCALL_AUDIT)
|
#define _TIF_SYSCALL_AUDIT (1 << TIF_SYSCALL_AUDIT)
|
||||||
#define _TIF_SYSCALL_TRACEPOINT (1 << TIF_SYSCALL_TRACEPOINT)
|
#define _TIF_SYSCALL_TRACEPOINT (1 << TIF_SYSCALL_TRACEPOINT)
|
||||||
|
@ -168,9 +166,8 @@ extern int vfp_restore_user_hwstate(struct user_vfp __user *,
|
||||||
/*
|
/*
|
||||||
* Change these and you break ASM code in entry-common.S
|
* Change these and you break ASM code in entry-common.S
|
||||||
*/
|
*/
|
||||||
#define _TIF_WORK_MASK (_TIF_NEED_RESCHED | _TIF_SIGPENDING | \
|
#define _TIF_WORK_MASK (_TIF_NEED_RESCHED | _TIF_SIGPENDING | \
|
||||||
_TIF_NOTIFY_RESUME | _TIF_UPROBE | \
|
_TIF_NOTIFY_RESUME | _TIF_UPROBE)
|
||||||
_TIF_FSCHECK)
|
|
||||||
|
|
||||||
#endif /* __KERNEL__ */
|
#endif /* __KERNEL__ */
|
||||||
#endif /* __ASM_ARM_THREAD_INFO_H */
|
#endif /* __ASM_ARM_THREAD_INFO_H */
|
||||||
|
|
|
@ -70,8 +70,6 @@ static inline void set_fs(mm_segment_t fs)
|
||||||
{
|
{
|
||||||
current_thread_info()->addr_limit = fs;
|
current_thread_info()->addr_limit = fs;
|
||||||
modify_domain(DOMAIN_KERNEL, fs ? DOMAIN_CLIENT : DOMAIN_MANAGER);
|
modify_domain(DOMAIN_KERNEL, fs ? DOMAIN_CLIENT : DOMAIN_MANAGER);
|
||||||
/* On user-mode return, check fs is correct */
|
|
||||||
set_thread_flag(TIF_FSCHECK);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#define segment_eq(a, b) ((a) == (b))
|
#define segment_eq(a, b) ((a) == (b))
|
||||||
|
|
|
@ -12,6 +12,7 @@
|
||||||
#include <asm/unistd.h>
|
#include <asm/unistd.h>
|
||||||
#include <asm/ftrace.h>
|
#include <asm/ftrace.h>
|
||||||
#include <asm/unwind.h>
|
#include <asm/unwind.h>
|
||||||
|
#include <asm/memory.h>
|
||||||
#ifdef CONFIG_AEABI
|
#ifdef CONFIG_AEABI
|
||||||
#include <asm/unistd-oabi.h>
|
#include <asm/unistd-oabi.h>
|
||||||
#endif
|
#endif
|
||||||
|
@ -48,12 +49,14 @@ ret_fast_syscall:
|
||||||
UNWIND(.fnstart )
|
UNWIND(.fnstart )
|
||||||
UNWIND(.cantunwind )
|
UNWIND(.cantunwind )
|
||||||
disable_irq_notrace @ disable interrupts
|
disable_irq_notrace @ disable interrupts
|
||||||
|
ldr r2, [tsk, #TI_ADDR_LIMIT]
|
||||||
|
cmp r2, #TASK_SIZE
|
||||||
|
blne addr_limit_check_failed
|
||||||
ldr r1, [tsk, #TI_FLAGS] @ re-check for syscall tracing
|
ldr r1, [tsk, #TI_FLAGS] @ re-check for syscall tracing
|
||||||
tst r1, #_TIF_SYSCALL_WORK
|
tst r1, #_TIF_SYSCALL_WORK | _TIF_WORK_MASK
|
||||||
bne fast_work_pending
|
|
||||||
tst r1, #_TIF_WORK_MASK
|
|
||||||
bne fast_work_pending
|
bne fast_work_pending
|
||||||
|
|
||||||
|
|
||||||
/* perform architecture specific actions before user return */
|
/* perform architecture specific actions before user return */
|
||||||
arch_ret_to_user r1, lr
|
arch_ret_to_user r1, lr
|
||||||
|
|
||||||
|
@ -76,16 +79,16 @@ ret_fast_syscall:
|
||||||
UNWIND(.cantunwind )
|
UNWIND(.cantunwind )
|
||||||
str r0, [sp, #S_R0 + S_OFF]! @ save returned r0
|
str r0, [sp, #S_R0 + S_OFF]! @ save returned r0
|
||||||
disable_irq_notrace @ disable interrupts
|
disable_irq_notrace @ disable interrupts
|
||||||
|
ldr r2, [tsk, #TI_ADDR_LIMIT]
|
||||||
|
cmp r2, #TASK_SIZE
|
||||||
|
blne addr_limit_check_failed
|
||||||
ldr r1, [tsk, #TI_FLAGS] @ re-check for syscall tracing
|
ldr r1, [tsk, #TI_FLAGS] @ re-check for syscall tracing
|
||||||
tst r1, #_TIF_SYSCALL_WORK
|
tst r1, #_TIF_SYSCALL_WORK | _TIF_WORK_MASK
|
||||||
bne fast_work_pending
|
|
||||||
tst r1, #_TIF_WORK_MASK
|
|
||||||
beq no_work_pending
|
beq no_work_pending
|
||||||
UNWIND(.fnend )
|
UNWIND(.fnend )
|
||||||
ENDPROC(ret_fast_syscall)
|
ENDPROC(ret_fast_syscall)
|
||||||
|
|
||||||
/* Slower path - fall through to work_pending */
|
/* Slower path - fall through to work_pending */
|
||||||
fast_work_pending:
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
tst r1, #_TIF_SYSCALL_WORK
|
tst r1, #_TIF_SYSCALL_WORK
|
||||||
|
@ -111,6 +114,9 @@ ENTRY(ret_to_user)
|
||||||
ret_slow_syscall:
|
ret_slow_syscall:
|
||||||
disable_irq_notrace @ disable interrupts
|
disable_irq_notrace @ disable interrupts
|
||||||
ENTRY(ret_to_user_from_irq)
|
ENTRY(ret_to_user_from_irq)
|
||||||
|
ldr r2, [tsk, #TI_ADDR_LIMIT]
|
||||||
|
cmp r2, #TASK_SIZE
|
||||||
|
blne addr_limit_check_failed
|
||||||
ldr r1, [tsk, #TI_FLAGS]
|
ldr r1, [tsk, #TI_FLAGS]
|
||||||
tst r1, #_TIF_WORK_MASK
|
tst r1, #_TIF_WORK_MASK
|
||||||
bne slow_work_pending
|
bne slow_work_pending
|
||||||
|
|
|
@ -614,10 +614,6 @@ do_work_pending(struct pt_regs *regs, unsigned int thread_flags, int syscall)
|
||||||
* Update the trace code with the current status.
|
* Update the trace code with the current status.
|
||||||
*/
|
*/
|
||||||
trace_hardirqs_off();
|
trace_hardirqs_off();
|
||||||
|
|
||||||
/* Check valid user FS if needed */
|
|
||||||
addr_limit_user_check();
|
|
||||||
|
|
||||||
do {
|
do {
|
||||||
if (likely(thread_flags & _TIF_NEED_RESCHED)) {
|
if (likely(thread_flags & _TIF_NEED_RESCHED)) {
|
||||||
schedule();
|
schedule();
|
||||||
|
@ -678,3 +674,9 @@ struct page *get_signal_page(void)
|
||||||
|
|
||||||
return page;
|
return page;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Defer to generic check */
|
||||||
|
asmlinkage void addr_limit_check_failed(void)
|
||||||
|
{
|
||||||
|
addr_limit_user_check();
|
||||||
|
}
|
||||||
|
|
|
@ -50,17 +50,22 @@ KBUILD_CFLAGS += -fno-asynchronous-unwind-tables
|
||||||
KBUILD_CFLAGS += $(call cc-option, -mpc-relative-literal-loads)
|
KBUILD_CFLAGS += $(call cc-option, -mpc-relative-literal-loads)
|
||||||
KBUILD_AFLAGS += $(lseinstr) $(brokengasinst)
|
KBUILD_AFLAGS += $(lseinstr) $(brokengasinst)
|
||||||
|
|
||||||
|
KBUILD_CFLAGS += $(call cc-option,-mabi=lp64)
|
||||||
|
KBUILD_AFLAGS += $(call cc-option,-mabi=lp64)
|
||||||
|
|
||||||
ifeq ($(CONFIG_CPU_BIG_ENDIAN), y)
|
ifeq ($(CONFIG_CPU_BIG_ENDIAN), y)
|
||||||
KBUILD_CPPFLAGS += -mbig-endian
|
KBUILD_CPPFLAGS += -mbig-endian
|
||||||
CHECKFLAGS += -D__AARCH64EB__
|
CHECKFLAGS += -D__AARCH64EB__
|
||||||
AS += -EB
|
AS += -EB
|
||||||
LD += -EB
|
LD += -EB
|
||||||
|
LDFLAGS += -maarch64linuxb
|
||||||
UTS_MACHINE := aarch64_be
|
UTS_MACHINE := aarch64_be
|
||||||
else
|
else
|
||||||
KBUILD_CPPFLAGS += -mlittle-endian
|
KBUILD_CPPFLAGS += -mlittle-endian
|
||||||
CHECKFLAGS += -D__AARCH64EL__
|
CHECKFLAGS += -D__AARCH64EL__
|
||||||
AS += -EL
|
AS += -EL
|
||||||
LD += -EL
|
LD += -EL
|
||||||
|
LDFLAGS += -maarch64linux
|
||||||
UTS_MACHINE := aarch64
|
UTS_MACHINE := aarch64
|
||||||
endif
|
endif
|
||||||
|
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
#ifndef __ASM_LINKAGE_H
|
#ifndef __ASM_LINKAGE_H
|
||||||
#define __ASM_LINKAGE_H
|
#define __ASM_LINKAGE_H
|
||||||
|
|
||||||
#define __ALIGN .align 4
|
#define __ALIGN .align 2
|
||||||
#define __ALIGN_STR ".align 4"
|
#define __ALIGN_STR ".align 2"
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -321,6 +321,8 @@ void kernel_neon_end(void)
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL(kernel_neon_end);
|
EXPORT_SYMBOL(kernel_neon_end);
|
||||||
|
|
||||||
|
#ifdef CONFIG_EFI
|
||||||
|
|
||||||
static DEFINE_PER_CPU(struct fpsimd_state, efi_fpsimd_state);
|
static DEFINE_PER_CPU(struct fpsimd_state, efi_fpsimd_state);
|
||||||
static DEFINE_PER_CPU(bool, efi_fpsimd_state_used);
|
static DEFINE_PER_CPU(bool, efi_fpsimd_state_used);
|
||||||
|
|
||||||
|
@ -370,6 +372,8 @@ void __efi_fpsimd_end(void)
|
||||||
kernel_neon_end();
|
kernel_neon_end();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#endif /* CONFIG_EFI */
|
||||||
|
|
||||||
#endif /* CONFIG_KERNEL_MODE_NEON */
|
#endif /* CONFIG_KERNEL_MODE_NEON */
|
||||||
|
|
||||||
#ifdef CONFIG_CPU_PM
|
#ifdef CONFIG_CPU_PM
|
||||||
|
|
|
@ -751,10 +751,10 @@ asmlinkage void do_notify_resume(struct pt_regs *regs,
|
||||||
*/
|
*/
|
||||||
trace_hardirqs_off();
|
trace_hardirqs_off();
|
||||||
|
|
||||||
/* Check valid user FS if needed */
|
|
||||||
addr_limit_user_check();
|
|
||||||
|
|
||||||
do {
|
do {
|
||||||
|
/* Check valid user FS if needed */
|
||||||
|
addr_limit_user_check();
|
||||||
|
|
||||||
if (thread_flags & _TIF_NEED_RESCHED) {
|
if (thread_flags & _TIF_NEED_RESCHED) {
|
||||||
schedule();
|
schedule();
|
||||||
} else {
|
} else {
|
||||||
|
|
|
@ -92,9 +92,6 @@ static inline void release_thread(struct task_struct *dead_task)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
#define copy_segments(tsk, mm) do { } while (0)
|
|
||||||
#define release_segments(mm) do { } while (0)
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* saved kernel SP and DP of a blocked thread.
|
* saved kernel SP and DP of a blocked thread.
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -92,10 +92,6 @@ static inline void release_thread(struct task_struct *dead_task)
|
||||||
extern asmlinkage void save_user_regs(struct user_context *target);
|
extern asmlinkage void save_user_regs(struct user_context *target);
|
||||||
extern asmlinkage void *restore_user_regs(const struct user_context *target, ...);
|
extern asmlinkage void *restore_user_regs(const struct user_context *target, ...);
|
||||||
|
|
||||||
#define copy_segments(tsk, mm) do { } while (0)
|
|
||||||
#define release_segments(mm) do { } while (0)
|
|
||||||
#define forget_segments() do { } while (0)
|
|
||||||
|
|
||||||
unsigned long get_wchan(struct task_struct *p);
|
unsigned long get_wchan(struct task_struct *p);
|
||||||
|
|
||||||
#define KSTK_EIP(tsk) ((tsk)->thread.frame0->pc)
|
#define KSTK_EIP(tsk) ((tsk)->thread.frame0->pc)
|
||||||
|
|
|
@ -118,14 +118,6 @@ struct mm_struct;
|
||||||
/* Free all resources held by a thread. */
|
/* Free all resources held by a thread. */
|
||||||
extern void release_thread(struct task_struct *);
|
extern void release_thread(struct task_struct *);
|
||||||
|
|
||||||
/* Copy and release all segment info associated with a VM */
|
|
||||||
extern void copy_segments(struct task_struct *p, struct mm_struct * mm);
|
|
||||||
extern void release_segments(struct mm_struct * mm);
|
|
||||||
|
|
||||||
/* Copy and release all segment info associated with a VM */
|
|
||||||
#define copy_segments(p, mm) do { } while (0)
|
|
||||||
#define release_segments(mm) do { } while (0)
|
|
||||||
|
|
||||||
unsigned long get_wchan(struct task_struct *p);
|
unsigned long get_wchan(struct task_struct *p);
|
||||||
#define KSTK_EIP(tsk) ((tsk)->thread.lr)
|
#define KSTK_EIP(tsk) ((tsk)->thread.lr)
|
||||||
#define KSTK_ESP(tsk) ((tsk)->thread.sp)
|
#define KSTK_ESP(tsk) ((tsk)->thread.sp)
|
||||||
|
|
|
@ -131,9 +131,6 @@ static inline void release_thread(struct task_struct *dead_task)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
#define copy_segments(tsk, mm) do { } while (0)
|
|
||||||
#define release_segments(mm) do { } while (0)
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Return saved PC of a blocked thread.
|
* Return saved PC of a blocked thread.
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -39,7 +39,7 @@ config MICROBLAZE
|
||||||
# Endianness selection
|
# Endianness selection
|
||||||
choice
|
choice
|
||||||
prompt "Endianness selection"
|
prompt "Endianness selection"
|
||||||
default CPU_BIG_ENDIAN
|
default CPU_LITTLE_ENDIAN
|
||||||
help
|
help
|
||||||
microblaze architectures can be configured for either little or
|
microblaze architectures can be configured for either little or
|
||||||
big endian formats. Be sure to select the appropriate mode.
|
big endian formats. Be sure to select the appropriate mode.
|
||||||
|
|
|
@ -7,6 +7,7 @@ generic-y += fcntl.h
|
||||||
generic-y += ioctl.h
|
generic-y += ioctl.h
|
||||||
generic-y += ioctls.h
|
generic-y += ioctls.h
|
||||||
generic-y += ipcbuf.h
|
generic-y += ipcbuf.h
|
||||||
|
generic-y += kvm_para.h
|
||||||
generic-y += mman.h
|
generic-y += mman.h
|
||||||
generic-y += msgbuf.h
|
generic-y += msgbuf.h
|
||||||
generic-y += param.h
|
generic-y += param.h
|
||||||
|
|
|
@ -165,7 +165,7 @@ int dma_direct_mmap_coherent(struct device *dev, struct vm_area_struct *vma,
|
||||||
unsigned long attrs)
|
unsigned long attrs)
|
||||||
{
|
{
|
||||||
#ifdef CONFIG_MMU
|
#ifdef CONFIG_MMU
|
||||||
unsigned long user_count = (vma->vm_end - vma->vm_start) >> PAGE_SHIFT;
|
unsigned long user_count = vma_pages(vma);
|
||||||
unsigned long count = PAGE_ALIGN(size) >> PAGE_SHIFT;
|
unsigned long count = PAGE_ALIGN(size) >> PAGE_SHIFT;
|
||||||
unsigned long off = vma->vm_pgoff;
|
unsigned long off = vma->vm_pgoff;
|
||||||
unsigned long pfn;
|
unsigned long pfn;
|
||||||
|
|
|
@ -22,10 +22,10 @@
|
||||||
#include "pci.h"
|
#include "pci.h"
|
||||||
|
|
||||||
static int (*ath79_pci_plat_dev_init)(struct pci_dev *dev);
|
static int (*ath79_pci_plat_dev_init)(struct pci_dev *dev);
|
||||||
static const struct ath79_pci_irq *ath79_pci_irq_map __initdata;
|
static const struct ath79_pci_irq *ath79_pci_irq_map;
|
||||||
static unsigned ath79_pci_nr_irqs __initdata;
|
static unsigned ath79_pci_nr_irqs;
|
||||||
|
|
||||||
static const struct ath79_pci_irq ar71xx_pci_irq_map[] __initconst = {
|
static const struct ath79_pci_irq ar71xx_pci_irq_map[] = {
|
||||||
{
|
{
|
||||||
.slot = 17,
|
.slot = 17,
|
||||||
.pin = 1,
|
.pin = 1,
|
||||||
|
@ -41,7 +41,7 @@ static const struct ath79_pci_irq ar71xx_pci_irq_map[] __initconst = {
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
static const struct ath79_pci_irq ar724x_pci_irq_map[] __initconst = {
|
static const struct ath79_pci_irq ar724x_pci_irq_map[] = {
|
||||||
{
|
{
|
||||||
.slot = 0,
|
.slot = 0,
|
||||||
.pin = 1,
|
.pin = 1,
|
||||||
|
@ -49,7 +49,7 @@ static const struct ath79_pci_irq ar724x_pci_irq_map[] __initconst = {
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
static const struct ath79_pci_irq qca955x_pci_irq_map[] __initconst = {
|
static const struct ath79_pci_irq qca955x_pci_irq_map[] = {
|
||||||
{
|
{
|
||||||
.bus = 0,
|
.bus = 0,
|
||||||
.slot = 0,
|
.slot = 0,
|
||||||
|
@ -64,7 +64,7 @@ static const struct ath79_pci_irq qca955x_pci_irq_map[] __initconst = {
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
int __init pcibios_map_irq(const struct pci_dev *dev, uint8_t slot, uint8_t pin)
|
int pcibios_map_irq(const struct pci_dev *dev, uint8_t slot, uint8_t pin)
|
||||||
{
|
{
|
||||||
int irq = -1;
|
int irq = -1;
|
||||||
int i;
|
int i;
|
||||||
|
|
|
@ -1377,29 +1377,32 @@ do { \
|
||||||
|
|
||||||
#define __write_64bit_c0_split(source, sel, val) \
|
#define __write_64bit_c0_split(source, sel, val) \
|
||||||
do { \
|
do { \
|
||||||
|
unsigned long long __tmp; \
|
||||||
unsigned long __flags; \
|
unsigned long __flags; \
|
||||||
\
|
\
|
||||||
local_irq_save(__flags); \
|
local_irq_save(__flags); \
|
||||||
if (sel == 0) \
|
if (sel == 0) \
|
||||||
__asm__ __volatile__( \
|
__asm__ __volatile__( \
|
||||||
".set\tmips64\n\t" \
|
".set\tmips64\n\t" \
|
||||||
"dsll\t%L0, %L0, 32\n\t" \
|
"dsll\t%L0, %L1, 32\n\t" \
|
||||||
"dsrl\t%L0, %L0, 32\n\t" \
|
"dsrl\t%L0, %L0, 32\n\t" \
|
||||||
"dsll\t%M0, %M0, 32\n\t" \
|
"dsll\t%M0, %M1, 32\n\t" \
|
||||||
"or\t%L0, %L0, %M0\n\t" \
|
"or\t%L0, %L0, %M0\n\t" \
|
||||||
"dmtc0\t%L0, " #source "\n\t" \
|
"dmtc0\t%L0, " #source "\n\t" \
|
||||||
".set\tmips0" \
|
".set\tmips0" \
|
||||||
: : "r" (val)); \
|
: "=&r,r" (__tmp) \
|
||||||
|
: "r,0" (val)); \
|
||||||
else \
|
else \
|
||||||
__asm__ __volatile__( \
|
__asm__ __volatile__( \
|
||||||
".set\tmips64\n\t" \
|
".set\tmips64\n\t" \
|
||||||
"dsll\t%L0, %L0, 32\n\t" \
|
"dsll\t%L0, %L1, 32\n\t" \
|
||||||
"dsrl\t%L0, %L0, 32\n\t" \
|
"dsrl\t%L0, %L0, 32\n\t" \
|
||||||
"dsll\t%M0, %M0, 32\n\t" \
|
"dsll\t%M0, %M1, 32\n\t" \
|
||||||
"or\t%L0, %L0, %M0\n\t" \
|
"or\t%L0, %L0, %M0\n\t" \
|
||||||
"dmtc0\t%L0, " #source ", " #sel "\n\t" \
|
"dmtc0\t%L0, " #source ", " #sel "\n\t" \
|
||||||
".set\tmips0" \
|
".set\tmips0" \
|
||||||
: : "r" (val)); \
|
: "=&r,r" (__tmp) \
|
||||||
|
: "r,0" (val)); \
|
||||||
local_irq_restore(__flags); \
|
local_irq_restore(__flags); \
|
||||||
} while (0)
|
} while (0)
|
||||||
|
|
||||||
|
|
|
@ -618,8 +618,7 @@ static int mipspmu_event_init(struct perf_event *event)
|
||||||
return -ENOENT;
|
return -ENOENT;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((unsigned int)event->cpu >= nr_cpumask_bits ||
|
if (event->cpu >= 0 && !cpu_online(event->cpu))
|
||||||
(event->cpu >= 0 && !cpu_online(event->cpu)))
|
|
||||||
return -ENODEV;
|
return -ENODEV;
|
||||||
|
|
||||||
if (!atomic_inc_not_zero(&active_events)) {
|
if (!atomic_inc_not_zero(&active_events)) {
|
||||||
|
|
|
@ -32,13 +32,13 @@
|
||||||
#define INTC PC104PLUS_INTC_IRQ
|
#define INTC PC104PLUS_INTC_IRQ
|
||||||
#define INTD PC104PLUS_INTD_IRQ
|
#define INTD PC104PLUS_INTD_IRQ
|
||||||
|
|
||||||
static char irq_tab_capcella[][5] __initdata = {
|
static char irq_tab_capcella[][5] = {
|
||||||
[11] = { -1, INT1, INT1, INT1, INT1 },
|
[11] = { -1, INT1, INT1, INT1, INT1 },
|
||||||
[12] = { -1, INT2, INT2, INT2, INT2 },
|
[12] = { -1, INT2, INT2, INT2, INT2 },
|
||||||
[14] = { -1, INTA, INTB, INTC, INTD }
|
[14] = { -1, INTA, INTB, INTC, INTD }
|
||||||
};
|
};
|
||||||
|
|
||||||
int __init pcibios_map_irq(const struct pci_dev *dev, u8 slot, u8 pin)
|
int pcibios_map_irq(const struct pci_dev *dev, u8 slot, u8 pin)
|
||||||
{
|
{
|
||||||
return irq_tab_capcella[slot][pin];
|
return irq_tab_capcella[slot][pin];
|
||||||
}
|
}
|
||||||
|
|
|
@ -147,7 +147,7 @@ static void qube_raq_via_board_id_fixup(struct pci_dev *dev)
|
||||||
DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_VIA, PCI_DEVICE_ID_VIA_82C586_0,
|
DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_VIA, PCI_DEVICE_ID_VIA_82C586_0,
|
||||||
qube_raq_via_board_id_fixup);
|
qube_raq_via_board_id_fixup);
|
||||||
|
|
||||||
static char irq_tab_qube1[] __initdata = {
|
static char irq_tab_qube1[] = {
|
||||||
[COBALT_PCICONF_CPU] = 0,
|
[COBALT_PCICONF_CPU] = 0,
|
||||||
[COBALT_PCICONF_ETH0] = QUBE1_ETH0_IRQ,
|
[COBALT_PCICONF_ETH0] = QUBE1_ETH0_IRQ,
|
||||||
[COBALT_PCICONF_RAQSCSI] = SCSI_IRQ,
|
[COBALT_PCICONF_RAQSCSI] = SCSI_IRQ,
|
||||||
|
@ -156,7 +156,7 @@ static char irq_tab_qube1[] __initdata = {
|
||||||
[COBALT_PCICONF_ETH1] = 0
|
[COBALT_PCICONF_ETH1] = 0
|
||||||
};
|
};
|
||||||
|
|
||||||
static char irq_tab_cobalt[] __initdata = {
|
static char irq_tab_cobalt[] = {
|
||||||
[COBALT_PCICONF_CPU] = 0,
|
[COBALT_PCICONF_CPU] = 0,
|
||||||
[COBALT_PCICONF_ETH0] = ETH0_IRQ,
|
[COBALT_PCICONF_ETH0] = ETH0_IRQ,
|
||||||
[COBALT_PCICONF_RAQSCSI] = SCSI_IRQ,
|
[COBALT_PCICONF_RAQSCSI] = SCSI_IRQ,
|
||||||
|
@ -165,7 +165,7 @@ static char irq_tab_cobalt[] __initdata = {
|
||||||
[COBALT_PCICONF_ETH1] = ETH1_IRQ
|
[COBALT_PCICONF_ETH1] = ETH1_IRQ
|
||||||
};
|
};
|
||||||
|
|
||||||
static char irq_tab_raq2[] __initdata = {
|
static char irq_tab_raq2[] = {
|
||||||
[COBALT_PCICONF_CPU] = 0,
|
[COBALT_PCICONF_CPU] = 0,
|
||||||
[COBALT_PCICONF_ETH0] = ETH0_IRQ,
|
[COBALT_PCICONF_ETH0] = ETH0_IRQ,
|
||||||
[COBALT_PCICONF_RAQSCSI] = RAQ2_SCSI_IRQ,
|
[COBALT_PCICONF_RAQSCSI] = RAQ2_SCSI_IRQ,
|
||||||
|
@ -174,7 +174,7 @@ static char irq_tab_raq2[] __initdata = {
|
||||||
[COBALT_PCICONF_ETH1] = ETH1_IRQ
|
[COBALT_PCICONF_ETH1] = ETH1_IRQ
|
||||||
};
|
};
|
||||||
|
|
||||||
int __init pcibios_map_irq(const struct pci_dev *dev, u8 slot, u8 pin)
|
int pcibios_map_irq(const struct pci_dev *dev, u8 slot, u8 pin)
|
||||||
{
|
{
|
||||||
if (cobalt_board_id <= COBALT_BRD_ID_QUBE1)
|
if (cobalt_board_id <= COBALT_BRD_ID_QUBE1)
|
||||||
return irq_tab_qube1[slot];
|
return irq_tab_qube1[slot];
|
||||||
|
|
|
@ -43,7 +43,7 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#define MAX_SLOT_NUM 10
|
#define MAX_SLOT_NUM 10
|
||||||
static unsigned char irq_map[][5] __initdata = {
|
static unsigned char irq_map[][5] = {
|
||||||
[3] = {0, MARKEINS_PCI_IRQ_INTB, MARKEINS_PCI_IRQ_INTC,
|
[3] = {0, MARKEINS_PCI_IRQ_INTB, MARKEINS_PCI_IRQ_INTC,
|
||||||
MARKEINS_PCI_IRQ_INTD, 0,},
|
MARKEINS_PCI_IRQ_INTD, 0,},
|
||||||
[4] = {0, MARKEINS_PCI_IRQ_INTA, 0, 0, 0,},
|
[4] = {0, MARKEINS_PCI_IRQ_INTA, 0, 0, 0,},
|
||||||
|
@ -85,7 +85,7 @@ static void emma2rh_pci_host_fixup(struct pci_dev *dev)
|
||||||
DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_NEC, PCI_DEVICE_ID_NEC_EMMA2RH,
|
DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_NEC, PCI_DEVICE_ID_NEC_EMMA2RH,
|
||||||
emma2rh_pci_host_fixup);
|
emma2rh_pci_host_fixup);
|
||||||
|
|
||||||
int __init pcibios_map_irq(const struct pci_dev *dev, u8 slot, u8 pin)
|
int pcibios_map_irq(const struct pci_dev *dev, u8 slot, u8 pin)
|
||||||
{
|
{
|
||||||
return irq_map[slot][pin];
|
return irq_map[slot][pin];
|
||||||
}
|
}
|
||||||
|
|
|
@ -19,7 +19,7 @@
|
||||||
/* South bridge slot number is set by the pci probe process */
|
/* South bridge slot number is set by the pci probe process */
|
||||||
static u8 sb_slot = 5;
|
static u8 sb_slot = 5;
|
||||||
|
|
||||||
int __init pcibios_map_irq(const struct pci_dev *dev, u8 slot, u8 pin)
|
int pcibios_map_irq(const struct pci_dev *dev, u8 slot, u8 pin)
|
||||||
{
|
{
|
||||||
int irq = 0;
|
int irq = 0;
|
||||||
|
|
||||||
|
|
|
@ -21,7 +21,7 @@
|
||||||
#define INTB MACEPCI_SHARED0_IRQ
|
#define INTB MACEPCI_SHARED0_IRQ
|
||||||
#define INTC MACEPCI_SHARED1_IRQ
|
#define INTC MACEPCI_SHARED1_IRQ
|
||||||
#define INTD MACEPCI_SHARED2_IRQ
|
#define INTD MACEPCI_SHARED2_IRQ
|
||||||
static char irq_tab_mace[][5] __initdata = {
|
static char irq_tab_mace[][5] = {
|
||||||
/* Dummy INT#A INT#B INT#C INT#D */
|
/* Dummy INT#A INT#B INT#C INT#D */
|
||||||
{0, 0, 0, 0, 0}, /* This is placeholder row - never used */
|
{0, 0, 0, 0, 0}, /* This is placeholder row - never used */
|
||||||
{0, SCSI0, SCSI0, SCSI0, SCSI0},
|
{0, SCSI0, SCSI0, SCSI0, SCSI0},
|
||||||
|
@ -39,7 +39,7 @@ static char irq_tab_mace[][5] __initdata = {
|
||||||
* irqs. I suppose a device without a pin A will thank us for doing it
|
* irqs. I suppose a device without a pin A will thank us for doing it
|
||||||
* right if there exists such a broken piece of crap.
|
* right if there exists such a broken piece of crap.
|
||||||
*/
|
*/
|
||||||
int __init pcibios_map_irq(const struct pci_dev *dev, u8 slot, u8 pin)
|
int pcibios_map_irq(const struct pci_dev *dev, u8 slot, u8 pin)
|
||||||
{
|
{
|
||||||
return irq_tab_mace[slot][pin];
|
return irq_tab_mace[slot][pin];
|
||||||
}
|
}
|
||||||
|
|
|
@ -31,7 +31,7 @@
|
||||||
#include <asm/txx9/pci.h>
|
#include <asm/txx9/pci.h>
|
||||||
#include <asm/txx9/jmr3927.h>
|
#include <asm/txx9/jmr3927.h>
|
||||||
|
|
||||||
int __init jmr3927_pci_map_irq(const struct pci_dev *dev, u8 slot, u8 pin)
|
int jmr3927_pci_map_irq(const struct pci_dev *dev, u8 slot, u8 pin)
|
||||||
{
|
{
|
||||||
unsigned char irq = pin;
|
unsigned char irq = pin;
|
||||||
|
|
||||||
|
|
|
@ -23,7 +23,7 @@ int pcibios_plat_dev_init(struct pci_dev *dev)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
int __init pcibios_map_irq(const struct pci_dev *dev, u8 slot, u8 pin)
|
int pcibios_map_irq(const struct pci_dev *dev, u8 slot, u8 pin)
|
||||||
{
|
{
|
||||||
return of_irq_parse_and_map_pci(dev, slot, pin);
|
return of_irq_parse_and_map_pci(dev, slot, pin);
|
||||||
}
|
}
|
||||||
|
|
|
@ -30,7 +30,7 @@
|
||||||
#define PCID 7
|
#define PCID 7
|
||||||
|
|
||||||
/* all the pci device has the PCIA pin, check the datasheet. */
|
/* all the pci device has the PCIA pin, check the datasheet. */
|
||||||
static char irq_tab[][5] __initdata = {
|
static char irq_tab[][5] = {
|
||||||
/* INTA INTB INTC INTD */
|
/* INTA INTB INTC INTD */
|
||||||
{0, 0, 0, 0, 0}, /* 11: Unused */
|
{0, 0, 0, 0, 0}, /* 11: Unused */
|
||||||
{0, 0, 0, 0, 0}, /* 12: Unused */
|
{0, 0, 0, 0, 0}, /* 12: Unused */
|
||||||
|
@ -51,7 +51,7 @@ static char irq_tab[][5] __initdata = {
|
||||||
{0, 0, 0, 0, 0}, /* 27: Unused */
|
{0, 0, 0, 0, 0}, /* 27: Unused */
|
||||||
};
|
};
|
||||||
|
|
||||||
int __init pcibios_map_irq(const struct pci_dev *dev, u8 slot, u8 pin)
|
int pcibios_map_irq(const struct pci_dev *dev, u8 slot, u8 pin)
|
||||||
{
|
{
|
||||||
int virq;
|
int virq;
|
||||||
|
|
||||||
|
|
|
@ -32,7 +32,7 @@ static void print_fixup_info(const struct pci_dev *pdev)
|
||||||
pdev->vendor, pdev->device, pdev->irq);
|
pdev->vendor, pdev->device, pdev->irq);
|
||||||
}
|
}
|
||||||
|
|
||||||
int __init pcibios_map_irq(const struct pci_dev *dev, u8 slot, u8 pin)
|
int pcibios_map_irq(const struct pci_dev *dev, u8 slot, u8 pin)
|
||||||
{
|
{
|
||||||
print_fixup_info(dev);
|
print_fixup_info(dev);
|
||||||
return dev->irq;
|
return dev->irq;
|
||||||
|
|
|
@ -12,7 +12,7 @@
|
||||||
static char pci_irq[5] = {
|
static char pci_irq[5] = {
|
||||||
};
|
};
|
||||||
|
|
||||||
static char irq_tab[][5] __initdata = {
|
static char irq_tab[][5] = {
|
||||||
/* INTA INTB INTC INTD */
|
/* INTA INTB INTC INTD */
|
||||||
{0, 0, 0, 0, 0 }, /* 0: GT64120 PCI bridge */
|
{0, 0, 0, 0, 0 }, /* 0: GT64120 PCI bridge */
|
||||||
{0, 0, 0, 0, 0 }, /* 1: Unused */
|
{0, 0, 0, 0, 0 }, /* 1: Unused */
|
||||||
|
@ -38,7 +38,7 @@ static char irq_tab[][5] __initdata = {
|
||||||
{0, PCID, PCIA, PCIB, PCIC } /* 21: PCI Slot 4 */
|
{0, PCID, PCIA, PCIB, PCIC } /* 21: PCI Slot 4 */
|
||||||
};
|
};
|
||||||
|
|
||||||
int __init pcibios_map_irq(const struct pci_dev *dev, u8 slot, u8 pin)
|
int pcibios_map_irq(const struct pci_dev *dev, u8 slot, u8 pin)
|
||||||
{
|
{
|
||||||
int virq;
|
int virq;
|
||||||
virq = irq_tab[slot][pin];
|
virq = irq_tab[slot][pin];
|
||||||
|
|
|
@ -22,19 +22,19 @@
|
||||||
|
|
||||||
#include <asm/vr41xx/mpc30x.h>
|
#include <asm/vr41xx/mpc30x.h>
|
||||||
|
|
||||||
static const int internal_func_irqs[] __initconst = {
|
static const int internal_func_irqs[] = {
|
||||||
VRC4173_CASCADE_IRQ,
|
VRC4173_CASCADE_IRQ,
|
||||||
VRC4173_AC97_IRQ,
|
VRC4173_AC97_IRQ,
|
||||||
VRC4173_USB_IRQ,
|
VRC4173_USB_IRQ,
|
||||||
};
|
};
|
||||||
|
|
||||||
static const int irq_tab_mpc30x[] __initconst = {
|
static const int irq_tab_mpc30x[] = {
|
||||||
[12] = VRC4173_PCMCIA1_IRQ,
|
[12] = VRC4173_PCMCIA1_IRQ,
|
||||||
[13] = VRC4173_PCMCIA2_IRQ,
|
[13] = VRC4173_PCMCIA2_IRQ,
|
||||||
[29] = MQ200_IRQ,
|
[29] = MQ200_IRQ,
|
||||||
};
|
};
|
||||||
|
|
||||||
int __init pcibios_map_irq(const struct pci_dev *dev, u8 slot, u8 pin)
|
int pcibios_map_irq(const struct pci_dev *dev, u8 slot, u8 pin)
|
||||||
{
|
{
|
||||||
if (slot == 30)
|
if (slot == 30)
|
||||||
return internal_func_irqs[PCI_FUNC(dev->devfn)];
|
return internal_func_irqs[PCI_FUNC(dev->devfn)];
|
||||||
|
|
|
@ -47,7 +47,7 @@
|
||||||
|
|
||||||
#if defined(CONFIG_PMC_MSP7120_GW)
|
#if defined(CONFIG_PMC_MSP7120_GW)
|
||||||
/* Garibaldi Board IRQ wiring to PCI slots */
|
/* Garibaldi Board IRQ wiring to PCI slots */
|
||||||
static char irq_tab[][5] __initdata = {
|
static char irq_tab[][5] = {
|
||||||
/* INTA INTB INTC INTD */
|
/* INTA INTB INTC INTD */
|
||||||
{0, 0, 0, 0, 0 }, /* (AD[0]): Unused */
|
{0, 0, 0, 0, 0 }, /* (AD[0]): Unused */
|
||||||
{0, 0, 0, 0, 0 }, /* (AD[1]): Unused */
|
{0, 0, 0, 0, 0 }, /* (AD[1]): Unused */
|
||||||
|
@ -86,7 +86,7 @@ static char irq_tab[][5] __initdata = {
|
||||||
#elif defined(CONFIG_PMC_MSP7120_EVAL)
|
#elif defined(CONFIG_PMC_MSP7120_EVAL)
|
||||||
|
|
||||||
/* MSP7120 Eval Board IRQ wiring to PCI slots */
|
/* MSP7120 Eval Board IRQ wiring to PCI slots */
|
||||||
static char irq_tab[][5] __initdata = {
|
static char irq_tab[][5] = {
|
||||||
/* INTA INTB INTC INTD */
|
/* INTA INTB INTC INTD */
|
||||||
{0, 0, 0, 0, 0 }, /* (AD[0]): Unused */
|
{0, 0, 0, 0, 0 }, /* (AD[0]): Unused */
|
||||||
{0, 0, 0, 0, 0 }, /* (AD[1]): Unused */
|
{0, 0, 0, 0, 0 }, /* (AD[1]): Unused */
|
||||||
|
@ -125,7 +125,7 @@ static char irq_tab[][5] __initdata = {
|
||||||
#else
|
#else
|
||||||
|
|
||||||
/* Unknown board -- don't assign any IRQs */
|
/* Unknown board -- don't assign any IRQs */
|
||||||
static char irq_tab[][5] __initdata = {
|
static char irq_tab[][5] = {
|
||||||
/* INTA INTB INTC INTD */
|
/* INTA INTB INTC INTD */
|
||||||
{0, 0, 0, 0, 0 }, /* (AD[0]): Unused */
|
{0, 0, 0, 0, 0 }, /* (AD[0]): Unused */
|
||||||
{0, 0, 0, 0, 0 }, /* (AD[1]): Unused */
|
{0, 0, 0, 0, 0 }, /* (AD[1]): Unused */
|
||||||
|
@ -202,7 +202,7 @@ int pcibios_plat_dev_init(struct pci_dev *dev)
|
||||||
* RETURNS: IRQ number
|
* RETURNS: IRQ number
|
||||||
*
|
*
|
||||||
****************************************************************************/
|
****************************************************************************/
|
||||||
int __init pcibios_map_irq(const struct pci_dev *dev, u8 slot, u8 pin)
|
int pcibios_map_irq(const struct pci_dev *dev, u8 slot, u8 pin)
|
||||||
{
|
{
|
||||||
#if !defined(CONFIG_PMC_MSP7120_GW) && !defined(CONFIG_PMC_MSP7120_EVAL)
|
#if !defined(CONFIG_PMC_MSP7120_GW) && !defined(CONFIG_PMC_MSP7120_EVAL)
|
||||||
printk(KERN_WARNING "PCI: unknown board, no PCI IRQs assigned.\n");
|
printk(KERN_WARNING "PCI: unknown board, no PCI IRQs assigned.\n");
|
||||||
|
|
|
@ -36,7 +36,7 @@
|
||||||
#include <asm/txx9/pci.h>
|
#include <asm/txx9/pci.h>
|
||||||
#include <asm/txx9/rbtx4927.h>
|
#include <asm/txx9/rbtx4927.h>
|
||||||
|
|
||||||
int __init rbtx4927_pci_map_irq(const struct pci_dev *dev, u8 slot, u8 pin)
|
int rbtx4927_pci_map_irq(const struct pci_dev *dev, u8 slot, u8 pin)
|
||||||
{
|
{
|
||||||
unsigned char irq = pin;
|
unsigned char irq = pin;
|
||||||
|
|
||||||
|
|
|
@ -13,7 +13,7 @@
|
||||||
#include <asm/txx9/pci.h>
|
#include <asm/txx9/pci.h>
|
||||||
#include <asm/txx9/rbtx4938.h>
|
#include <asm/txx9/rbtx4938.h>
|
||||||
|
|
||||||
int __init rbtx4938_pci_map_irq(const struct pci_dev *dev, u8 slot, u8 pin)
|
int rbtx4938_pci_map_irq(const struct pci_dev *dev, u8 slot, u8 pin)
|
||||||
{
|
{
|
||||||
int irq = tx4938_pcic1_map_irq(dev, slot);
|
int irq = tx4938_pcic1_map_irq(dev, slot);
|
||||||
|
|
||||||
|
|
|
@ -40,7 +40,7 @@
|
||||||
* seem to be a documentation error. At least on my RM200C the Cirrus
|
* seem to be a documentation error. At least on my RM200C the Cirrus
|
||||||
* Logic CL-GD5434 VGA is device 3.
|
* Logic CL-GD5434 VGA is device 3.
|
||||||
*/
|
*/
|
||||||
static char irq_tab_rm200[8][5] __initdata = {
|
static char irq_tab_rm200[8][5] = {
|
||||||
/* INTA INTB INTC INTD */
|
/* INTA INTB INTC INTD */
|
||||||
{ 0, 0, 0, 0, 0 }, /* EISA bridge */
|
{ 0, 0, 0, 0, 0 }, /* EISA bridge */
|
||||||
{ SCSI, SCSI, SCSI, SCSI, SCSI }, /* SCSI */
|
{ SCSI, SCSI, SCSI, SCSI, SCSI }, /* SCSI */
|
||||||
|
@ -57,7 +57,7 @@ static char irq_tab_rm200[8][5] __initdata = {
|
||||||
*
|
*
|
||||||
* The VGA card is optional for RM300 systems.
|
* The VGA card is optional for RM300 systems.
|
||||||
*/
|
*/
|
||||||
static char irq_tab_rm300d[8][5] __initdata = {
|
static char irq_tab_rm300d[8][5] = {
|
||||||
/* INTA INTB INTC INTD */
|
/* INTA INTB INTC INTD */
|
||||||
{ 0, 0, 0, 0, 0 }, /* EISA bridge */
|
{ 0, 0, 0, 0, 0 }, /* EISA bridge */
|
||||||
{ SCSI, SCSI, SCSI, SCSI, SCSI }, /* SCSI */
|
{ SCSI, SCSI, SCSI, SCSI, SCSI }, /* SCSI */
|
||||||
|
@ -69,7 +69,7 @@ static char irq_tab_rm300d[8][5] __initdata = {
|
||||||
{ 0, INTD, INTA, INTB, INTC }, /* Slot 4 */
|
{ 0, INTD, INTA, INTB, INTC }, /* Slot 4 */
|
||||||
};
|
};
|
||||||
|
|
||||||
static char irq_tab_rm300e[5][5] __initdata = {
|
static char irq_tab_rm300e[5][5] = {
|
||||||
/* INTA INTB INTC INTD */
|
/* INTA INTB INTC INTD */
|
||||||
{ 0, 0, 0, 0, 0 }, /* HOST bridge */
|
{ 0, 0, 0, 0, 0 }, /* HOST bridge */
|
||||||
{ SCSI, SCSI, SCSI, SCSI, SCSI }, /* SCSI */
|
{ SCSI, SCSI, SCSI, SCSI, SCSI }, /* SCSI */
|
||||||
|
@ -96,7 +96,7 @@ static char irq_tab_rm300e[5][5] __initdata = {
|
||||||
#define INTC PCIT_IRQ_INTC
|
#define INTC PCIT_IRQ_INTC
|
||||||
#define INTD PCIT_IRQ_INTD
|
#define INTD PCIT_IRQ_INTD
|
||||||
|
|
||||||
static char irq_tab_pcit[13][5] __initdata = {
|
static char irq_tab_pcit[13][5] = {
|
||||||
/* INTA INTB INTC INTD */
|
/* INTA INTB INTC INTD */
|
||||||
{ 0, 0, 0, 0, 0 }, /* HOST bridge */
|
{ 0, 0, 0, 0, 0 }, /* HOST bridge */
|
||||||
{ SCSI0, SCSI0, SCSI0, SCSI0, SCSI0 }, /* SCSI */
|
{ SCSI0, SCSI0, SCSI0, SCSI0, SCSI0 }, /* SCSI */
|
||||||
|
@ -113,7 +113,7 @@ static char irq_tab_pcit[13][5] __initdata = {
|
||||||
{ 0, INTA, INTB, INTC, INTD }, /* Slot 5 */
|
{ 0, INTA, INTB, INTC, INTD }, /* Slot 5 */
|
||||||
};
|
};
|
||||||
|
|
||||||
static char irq_tab_pcit_cplus[13][5] __initdata = {
|
static char irq_tab_pcit_cplus[13][5] = {
|
||||||
/* INTA INTB INTC INTD */
|
/* INTA INTB INTC INTD */
|
||||||
{ 0, 0, 0, 0, 0 }, /* HOST bridge */
|
{ 0, 0, 0, 0, 0 }, /* HOST bridge */
|
||||||
{ 0, INTB, INTC, INTD, INTA }, /* PCI Slot 9 */
|
{ 0, INTB, INTC, INTD, INTA }, /* PCI Slot 9 */
|
||||||
|
@ -130,7 +130,7 @@ static inline int is_rm300_revd(void)
|
||||||
return (csmsr & 0xa0) == 0x20;
|
return (csmsr & 0xa0) == 0x20;
|
||||||
}
|
}
|
||||||
|
|
||||||
int __init pcibios_map_irq(const struct pci_dev *dev, u8 slot, u8 pin)
|
int pcibios_map_irq(const struct pci_dev *dev, u8 slot, u8 pin)
|
||||||
{
|
{
|
||||||
switch (sni_brd_type) {
|
switch (sni_brd_type) {
|
||||||
case SNI_BRD_PCI_TOWER_CPLUS:
|
case SNI_BRD_PCI_TOWER_CPLUS:
|
||||||
|
|
|
@ -23,7 +23,7 @@
|
||||||
|
|
||||||
#include <asm/vr41xx/tb0219.h>
|
#include <asm/vr41xx/tb0219.h>
|
||||||
|
|
||||||
int __init pcibios_map_irq(const struct pci_dev *dev, u8 slot, u8 pin)
|
int pcibios_map_irq(const struct pci_dev *dev, u8 slot, u8 pin)
|
||||||
{
|
{
|
||||||
int irq = -1;
|
int irq = -1;
|
||||||
|
|
||||||
|
|
|
@ -23,7 +23,7 @@
|
||||||
#include <asm/vr41xx/giu.h>
|
#include <asm/vr41xx/giu.h>
|
||||||
#include <asm/vr41xx/tb0226.h>
|
#include <asm/vr41xx/tb0226.h>
|
||||||
|
|
||||||
int __init pcibios_map_irq(const struct pci_dev *dev, u8 slot, u8 pin)
|
int pcibios_map_irq(const struct pci_dev *dev, u8 slot, u8 pin)
|
||||||
{
|
{
|
||||||
int irq = -1;
|
int irq = -1;
|
||||||
|
|
||||||
|
|
|
@ -22,7 +22,7 @@
|
||||||
|
|
||||||
#include <asm/vr41xx/tb0287.h>
|
#include <asm/vr41xx/tb0287.h>
|
||||||
|
|
||||||
int __init pcibios_map_irq(const struct pci_dev *dev, u8 slot, u8 pin)
|
int pcibios_map_irq(const struct pci_dev *dev, u8 slot, u8 pin)
|
||||||
{
|
{
|
||||||
unsigned char bus;
|
unsigned char bus;
|
||||||
int irq = -1;
|
int irq = -1;
|
||||||
|
|
|
@ -522,7 +522,7 @@ static int __init alchemy_pci_init(void)
|
||||||
arch_initcall(alchemy_pci_init);
|
arch_initcall(alchemy_pci_init);
|
||||||
|
|
||||||
|
|
||||||
int __init pcibios_map_irq(const struct pci_dev *dev, u8 slot, u8 pin)
|
int pcibios_map_irq(const struct pci_dev *dev, u8 slot, u8 pin)
|
||||||
{
|
{
|
||||||
struct alchemy_pci_context *ctx = dev->sysdata;
|
struct alchemy_pci_context *ctx = dev->sysdata;
|
||||||
if (ctx && ctx->board_map_irq)
|
if (ctx && ctx->board_map_irq)
|
||||||
|
|
|
@ -28,7 +28,7 @@
|
||||||
#include <linux/bcma/bcma.h>
|
#include <linux/bcma/bcma.h>
|
||||||
#include <bcm47xx.h>
|
#include <bcm47xx.h>
|
||||||
|
|
||||||
int __init pcibios_map_irq(const struct pci_dev *dev, u8 slot, u8 pin)
|
int pcibios_map_irq(const struct pci_dev *dev, u8 slot, u8 pin)
|
||||||
{
|
{
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
|
@ -61,7 +61,7 @@ arch_initcall(lasat_pci_setup);
|
||||||
#define LASAT_IRQ_PCIC (LASAT_IRQ_BASE + 7)
|
#define LASAT_IRQ_PCIC (LASAT_IRQ_BASE + 7)
|
||||||
#define LASAT_IRQ_PCID (LASAT_IRQ_BASE + 8)
|
#define LASAT_IRQ_PCID (LASAT_IRQ_BASE + 8)
|
||||||
|
|
||||||
int __init pcibios_map_irq(const struct pci_dev *dev, u8 slot, u8 pin)
|
int pcibios_map_irq(const struct pci_dev *dev, u8 slot, u8 pin)
|
||||||
{
|
{
|
||||||
switch (slot) {
|
switch (slot) {
|
||||||
case 1:
|
case 1:
|
||||||
|
|
|
@ -361,7 +361,7 @@ static int mt7620_pci_probe(struct platform_device *pdev)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
int __init pcibios_map_irq(const struct pci_dev *dev, u8 slot, u8 pin)
|
int pcibios_map_irq(const struct pci_dev *dev, u8 slot, u8 pin)
|
||||||
{
|
{
|
||||||
u16 cmd;
|
u16 cmd;
|
||||||
u32 val;
|
u32 val;
|
||||||
|
|
|
@ -59,8 +59,7 @@ union octeon_pci_address {
|
||||||
} s;
|
} s;
|
||||||
};
|
};
|
||||||
|
|
||||||
int __initconst (*octeon_pcibios_map_irq)(const struct pci_dev *dev,
|
int (*octeon_pcibios_map_irq)(const struct pci_dev *dev, u8 slot, u8 pin);
|
||||||
u8 slot, u8 pin);
|
|
||||||
enum octeon_dma_bar_type octeon_dma_bar_type = OCTEON_DMA_BAR_TYPE_INVALID;
|
enum octeon_dma_bar_type octeon_dma_bar_type = OCTEON_DMA_BAR_TYPE_INVALID;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -74,7 +73,7 @@ enum octeon_dma_bar_type octeon_dma_bar_type = OCTEON_DMA_BAR_TYPE_INVALID;
|
||||||
* as it goes through each bridge.
|
* as it goes through each bridge.
|
||||||
* Returns Interrupt number for the device
|
* Returns Interrupt number for the device
|
||||||
*/
|
*/
|
||||||
int __init pcibios_map_irq(const struct pci_dev *dev, u8 slot, u8 pin)
|
int pcibios_map_irq(const struct pci_dev *dev, u8 slot, u8 pin)
|
||||||
{
|
{
|
||||||
if (octeon_pcibios_map_irq)
|
if (octeon_pcibios_map_irq)
|
||||||
return octeon_pcibios_map_irq(dev, slot, pin);
|
return octeon_pcibios_map_irq(dev, slot, pin);
|
||||||
|
|
|
@ -181,7 +181,7 @@ static inline void rt2880_pci_write_u32(unsigned long reg, u32 val)
|
||||||
spin_unlock_irqrestore(&rt2880_pci_lock, flags);
|
spin_unlock_irqrestore(&rt2880_pci_lock, flags);
|
||||||
}
|
}
|
||||||
|
|
||||||
int __init pcibios_map_irq(const struct pci_dev *dev, u8 slot, u8 pin)
|
int pcibios_map_irq(const struct pci_dev *dev, u8 slot, u8 pin)
|
||||||
{
|
{
|
||||||
u16 cmd;
|
u16 cmd;
|
||||||
int irq = -1;
|
int irq = -1;
|
||||||
|
|
|
@ -564,7 +564,7 @@ static int rt3883_pci_probe(struct platform_device *pdev)
|
||||||
return err;
|
return err;
|
||||||
}
|
}
|
||||||
|
|
||||||
int __init pcibios_map_irq(const struct pci_dev *dev, u8 slot, u8 pin)
|
int pcibios_map_irq(const struct pci_dev *dev, u8 slot, u8 pin)
|
||||||
{
|
{
|
||||||
return of_irq_parse_and_map_pci(dev, slot, pin);
|
return of_irq_parse_and_map_pci(dev, slot, pin);
|
||||||
}
|
}
|
||||||
|
|
|
@ -112,7 +112,7 @@ int __init tx4938_pciclk66_setup(void)
|
||||||
return pciclk;
|
return pciclk;
|
||||||
}
|
}
|
||||||
|
|
||||||
int __init tx4938_pcic1_map_irq(const struct pci_dev *dev, u8 slot)
|
int tx4938_pcic1_map_irq(const struct pci_dev *dev, u8 slot)
|
||||||
{
|
{
|
||||||
if (get_tx4927_pcicptr(dev->bus->sysdata) == tx4938_pcic1ptr) {
|
if (get_tx4927_pcicptr(dev->bus->sysdata) == tx4938_pcic1ptr) {
|
||||||
switch (slot) {
|
switch (slot) {
|
||||||
|
|
|
@ -48,7 +48,7 @@ void __init tx4939_report_pci1clk(void)
|
||||||
((pciclk + 50000) / 100000) % 10);
|
((pciclk + 50000) / 100000) % 10);
|
||||||
}
|
}
|
||||||
|
|
||||||
int __init tx4939_pcic1_map_irq(const struct pci_dev *dev, u8 slot)
|
int tx4939_pcic1_map_irq(const struct pci_dev *dev, u8 slot)
|
||||||
{
|
{
|
||||||
if (get_tx4927_pcicptr(dev->bus->sysdata) == tx4939_pcic1ptr) {
|
if (get_tx4927_pcicptr(dev->bus->sysdata) == tx4939_pcic1ptr) {
|
||||||
switch (slot) {
|
switch (slot) {
|
||||||
|
@ -68,7 +68,7 @@ int __init tx4939_pcic1_map_irq(const struct pci_dev *dev, u8 slot)
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
int __init tx4939_pci_map_irq(const struct pci_dev *dev, u8 slot, u8 pin)
|
int tx4939_pci_map_irq(const struct pci_dev *dev, u8 slot, u8 pin)
|
||||||
{
|
{
|
||||||
int irq = tx4939_pcic1_map_irq(dev, slot);
|
int irq = tx4939_pcic1_map_irq(dev, slot);
|
||||||
|
|
||||||
|
|
|
@ -205,7 +205,7 @@ int xlp_socdev_to_node(const struct pci_dev *lnkdev)
|
||||||
return PCI_SLOT(lnkdev->devfn) / 8;
|
return PCI_SLOT(lnkdev->devfn) / 8;
|
||||||
}
|
}
|
||||||
|
|
||||||
int __init pcibios_map_irq(const struct pci_dev *dev, u8 slot, u8 pin)
|
int pcibios_map_irq(const struct pci_dev *dev, u8 slot, u8 pin)
|
||||||
{
|
{
|
||||||
struct pci_dev *lnkdev;
|
struct pci_dev *lnkdev;
|
||||||
int lnkfunc, node;
|
int lnkfunc, node;
|
||||||
|
|
|
@ -315,7 +315,7 @@ static void xls_pcie_ack_b(struct irq_data *d)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
int __init pcibios_map_irq(const struct pci_dev *dev, u8 slot, u8 pin)
|
int pcibios_map_irq(const struct pci_dev *dev, u8 slot, u8 pin)
|
||||||
{
|
{
|
||||||
return get_irq_vector(dev);
|
return get_irq_vector(dev);
|
||||||
}
|
}
|
||||||
|
|
|
@ -1464,8 +1464,7 @@ static int cvmx_pcie_rc_initialize(int pcie_port)
|
||||||
* as it goes through each bridge.
|
* as it goes through each bridge.
|
||||||
* Returns Interrupt number for the device
|
* Returns Interrupt number for the device
|
||||||
*/
|
*/
|
||||||
int __init octeon_pcie_pcibios_map_irq(const struct pci_dev *dev,
|
int octeon_pcie_pcibios_map_irq(const struct pci_dev *dev, u8 slot, u8 pin)
|
||||||
u8 slot, u8 pin)
|
|
||||||
{
|
{
|
||||||
/*
|
/*
|
||||||
* The EBH5600 board with the PCI to PCIe bridge mistakenly
|
* The EBH5600 board with the PCI to PCIe bridge mistakenly
|
||||||
|
|
|
@ -22,6 +22,8 @@
|
||||||
#include <linux/smp.h>
|
#include <linux/smp.h>
|
||||||
#include <linux/interrupt.h>
|
#include <linux/interrupt.h>
|
||||||
|
|
||||||
|
#include <asm/setup.h>
|
||||||
|
|
||||||
#ifdef CONFIG_MIPS_MT_SMP
|
#ifdef CONFIG_MIPS_MT_SMP
|
||||||
#define MIPS_CPU_IPI_RESCHED_IRQ 0 /* SW int 0 for resched */
|
#define MIPS_CPU_IPI_RESCHED_IRQ 0 /* SW int 0 for resched */
|
||||||
#define MIPS_CPU_IPI_CALL_IRQ 1 /* SW int 1 for call */
|
#define MIPS_CPU_IPI_CALL_IRQ 1 /* SW int 1 for call */
|
||||||
|
|
|
@ -386,9 +386,10 @@ int pcibios_plat_dev_init(struct pci_dev *dev)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
int __init pcibios_map_irq(const struct pci_dev *dev, u8 slot, u8 pin)
|
static int (*txx9_pci_map_irq)(const struct pci_dev *dev, u8 slot, u8 pin);
|
||||||
|
int pcibios_map_irq(const struct pci_dev *dev, u8 slot, u8 pin)
|
||||||
{
|
{
|
||||||
return txx9_board_vec->pci_map_irq(dev, slot, pin);
|
return txx9_pci_map_irq(dev, slot, pin);
|
||||||
}
|
}
|
||||||
|
|
||||||
char * (*txx9_board_pcibios_setup)(char *str) __initdata;
|
char * (*txx9_board_pcibios_setup)(char *str) __initdata;
|
||||||
|
@ -424,5 +425,8 @@ char *__init txx9_pcibios_setup(char *str)
|
||||||
txx9_pci_err_action = TXX9_PCI_ERR_IGNORE;
|
txx9_pci_err_action = TXX9_PCI_ERR_IGNORE;
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
txx9_pci_map_irq = txx9_board_vec->pci_map_irq;
|
||||||
|
|
||||||
return str;
|
return str;
|
||||||
}
|
}
|
||||||
|
|
|
@ -59,10 +59,6 @@ void arch_cpu_idle(void)
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
void release_segments(struct mm_struct *mm)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
void machine_restart(char *cmd)
|
void machine_restart(char *cmd)
|
||||||
{
|
{
|
||||||
#ifdef CONFIG_KERNEL_DEBUGGER
|
#ifdef CONFIG_KERNEL_DEBUGGER
|
||||||
|
@ -112,14 +108,6 @@ void release_thread(struct task_struct *dead_task)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
|
||||||
* we do not have to muck with descriptors here, that is
|
|
||||||
* done in switch_mm() as needed.
|
|
||||||
*/
|
|
||||||
void copy_segments(struct task_struct *p, struct mm_struct *new_mm)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* this gets called so that we can store lazy state into memory and copy the
|
* this gets called so that we can store lazy state into memory and copy the
|
||||||
* current task into the new thread.
|
* current task into the new thread.
|
||||||
|
|
|
@ -257,6 +257,18 @@ config PARISC_PAGE_SIZE_64KB
|
||||||
|
|
||||||
endchoice
|
endchoice
|
||||||
|
|
||||||
|
config PARISC_SELF_EXTRACT
|
||||||
|
bool "Build kernel as self-extracting executable"
|
||||||
|
default y
|
||||||
|
help
|
||||||
|
Say Y if you want to build the parisc kernel as a kind of
|
||||||
|
self-extracting executable.
|
||||||
|
|
||||||
|
If you say N here, the kernel will be compressed with gzip
|
||||||
|
which can be loaded by the palo bootloader directly too.
|
||||||
|
|
||||||
|
If you don't know what to do here, say Y.
|
||||||
|
|
||||||
config SMP
|
config SMP
|
||||||
bool "Symmetric multi-processing support"
|
bool "Symmetric multi-processing support"
|
||||||
---help---
|
---help---
|
||||||
|
|
|
@ -129,8 +129,13 @@ Image: vmlinux
|
||||||
bzImage: vmlinux
|
bzImage: vmlinux
|
||||||
$(Q)$(MAKE) $(build)=$(boot) $(boot)/$@
|
$(Q)$(MAKE) $(build)=$(boot) $(boot)/$@
|
||||||
|
|
||||||
|
ifdef CONFIG_PARISC_SELF_EXTRACT
|
||||||
vmlinuz: bzImage
|
vmlinuz: bzImage
|
||||||
$(OBJCOPY) $(boot)/bzImage $@
|
$(OBJCOPY) $(boot)/bzImage $@
|
||||||
|
else
|
||||||
|
vmlinuz: vmlinux
|
||||||
|
@gzip -cf -9 $< > $@
|
||||||
|
endif
|
||||||
|
|
||||||
install:
|
install:
|
||||||
$(CONFIG_SHELL) $(src)/arch/parisc/install.sh \
|
$(CONFIG_SHELL) $(src)/arch/parisc/install.sh \
|
||||||
|
|
|
@ -15,7 +15,7 @@ targets += misc.o piggy.o sizes.h head.o real2.o firmware.o
|
||||||
KBUILD_CFLAGS := -D__KERNEL__ -O2 -DBOOTLOADER
|
KBUILD_CFLAGS := -D__KERNEL__ -O2 -DBOOTLOADER
|
||||||
KBUILD_CFLAGS += -DDISABLE_BRANCH_PROFILING
|
KBUILD_CFLAGS += -DDISABLE_BRANCH_PROFILING
|
||||||
KBUILD_CFLAGS += $(cflags-y) -fno-delete-null-pointer-checks
|
KBUILD_CFLAGS += $(cflags-y) -fno-delete-null-pointer-checks
|
||||||
KBUILD_CFLAGS += -fno-PIE -mno-space-regs -mdisable-fpregs
|
KBUILD_CFLAGS += -fno-PIE -mno-space-regs -mdisable-fpregs -Os
|
||||||
ifndef CONFIG_64BIT
|
ifndef CONFIG_64BIT
|
||||||
KBUILD_CFLAGS += -mfast-indirect-calls
|
KBUILD_CFLAGS += -mfast-indirect-calls
|
||||||
endif
|
endif
|
||||||
|
|
|
@ -24,7 +24,8 @@
|
||||||
/* Symbols defined by linker scripts */
|
/* Symbols defined by linker scripts */
|
||||||
extern char input_data[];
|
extern char input_data[];
|
||||||
extern int input_len;
|
extern int input_len;
|
||||||
extern __le32 output_len; /* at unaligned address, little-endian */
|
/* output_len is inserted by the linker possibly at an unaligned address */
|
||||||
|
extern __le32 output_len __aligned(1);
|
||||||
extern char _text, _end;
|
extern char _text, _end;
|
||||||
extern char _bss, _ebss;
|
extern char _bss, _ebss;
|
||||||
extern char _startcode_end;
|
extern char _startcode_end;
|
||||||
|
|
|
@ -280,6 +280,7 @@ void setup_pdc(void); /* in inventory.c */
|
||||||
/* wrapper-functions from pdc.c */
|
/* wrapper-functions from pdc.c */
|
||||||
|
|
||||||
int pdc_add_valid(unsigned long address);
|
int pdc_add_valid(unsigned long address);
|
||||||
|
int pdc_instr(unsigned int *instr);
|
||||||
int pdc_chassis_info(struct pdc_chassis_info *chassis_info, void *led_info, unsigned long len);
|
int pdc_chassis_info(struct pdc_chassis_info *chassis_info, void *led_info, unsigned long len);
|
||||||
int pdc_chassis_disp(unsigned long disp);
|
int pdc_chassis_disp(unsigned long disp);
|
||||||
int pdc_chassis_warn(unsigned long *warn);
|
int pdc_chassis_warn(unsigned long *warn);
|
||||||
|
|
|
@ -1,6 +1,7 @@
|
||||||
#ifndef __ASM_SMP_H
|
#ifndef __ASM_SMP_H
|
||||||
#define __ASM_SMP_H
|
#define __ASM_SMP_H
|
||||||
|
|
||||||
|
extern int init_per_cpu(int cpuid);
|
||||||
|
|
||||||
#if defined(CONFIG_SMP)
|
#if defined(CONFIG_SMP)
|
||||||
|
|
||||||
|
|
|
@ -232,6 +232,26 @@ int pdc_add_valid(unsigned long address)
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL(pdc_add_valid);
|
EXPORT_SYMBOL(pdc_add_valid);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* pdc_instr - Get instruction that invokes PDCE_CHECK in HPMC handler.
|
||||||
|
* @instr: Pointer to variable which will get instruction opcode.
|
||||||
|
*
|
||||||
|
* The return value is PDC_OK (0) in case call succeeded.
|
||||||
|
*/
|
||||||
|
int __init pdc_instr(unsigned int *instr)
|
||||||
|
{
|
||||||
|
int retval;
|
||||||
|
unsigned long flags;
|
||||||
|
|
||||||
|
spin_lock_irqsave(&pdc_lock, flags);
|
||||||
|
retval = mem_pdc_call(PDC_INSTR, 0UL, __pa(pdc_result));
|
||||||
|
convert_to_wide(pdc_result);
|
||||||
|
*instr = pdc_result[0];
|
||||||
|
spin_unlock_irqrestore(&pdc_lock, flags);
|
||||||
|
|
||||||
|
return retval;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* pdc_chassis_info - Return chassis information.
|
* pdc_chassis_info - Return chassis information.
|
||||||
* @result: The return buffer.
|
* @result: The return buffer.
|
||||||
|
|
|
@ -15,6 +15,7 @@
|
||||||
#include <linux/memblock.h>
|
#include <linux/memblock.h>
|
||||||
#include <linux/seq_file.h>
|
#include <linux/seq_file.h>
|
||||||
#include <linux/kthread.h>
|
#include <linux/kthread.h>
|
||||||
|
#include <linux/initrd.h>
|
||||||
|
|
||||||
#include <asm/pdc.h>
|
#include <asm/pdc.h>
|
||||||
#include <asm/pdcpat.h>
|
#include <asm/pdcpat.h>
|
||||||
|
@ -216,8 +217,16 @@ void __init pdc_pdt_init(void)
|
||||||
}
|
}
|
||||||
|
|
||||||
for (i = 0; i < pdt_status.pdt_entries; i++) {
|
for (i = 0; i < pdt_status.pdt_entries; i++) {
|
||||||
|
unsigned long addr;
|
||||||
|
|
||||||
report_mem_err(pdt_entry[i]);
|
report_mem_err(pdt_entry[i]);
|
||||||
|
|
||||||
|
addr = pdt_entry[i] & PDT_ADDR_PHYS_MASK;
|
||||||
|
if (IS_ENABLED(CONFIG_BLK_DEV_INITRD) &&
|
||||||
|
addr >= initrd_start && addr < initrd_end)
|
||||||
|
pr_crit("CRITICAL: initrd possibly broken "
|
||||||
|
"due to bad memory!\n");
|
||||||
|
|
||||||
/* mark memory page bad */
|
/* mark memory page bad */
|
||||||
memblock_reserve(pdt_entry[i] & PAGE_MASK, PAGE_SIZE);
|
memblock_reserve(pdt_entry[i] & PAGE_MASK, PAGE_SIZE);
|
||||||
}
|
}
|
||||||
|
|
|
@ -317,7 +317,7 @@ void __init collect_boot_cpu_data(void)
|
||||||
*
|
*
|
||||||
* o Enable CPU profiling hooks.
|
* o Enable CPU profiling hooks.
|
||||||
*/
|
*/
|
||||||
int init_per_cpu(int cpunum)
|
int __init init_per_cpu(int cpunum)
|
||||||
{
|
{
|
||||||
int ret;
|
int ret;
|
||||||
struct pdc_coproc_cfg coproc_cfg;
|
struct pdc_coproc_cfg coproc_cfg;
|
||||||
|
|
|
@ -38,6 +38,7 @@
|
||||||
#include <linux/export.h>
|
#include <linux/export.h>
|
||||||
#include <linux/sched.h>
|
#include <linux/sched.h>
|
||||||
#include <linux/sched/clock.h>
|
#include <linux/sched/clock.h>
|
||||||
|
#include <linux/start_kernel.h>
|
||||||
|
|
||||||
#include <asm/processor.h>
|
#include <asm/processor.h>
|
||||||
#include <asm/sections.h>
|
#include <asm/sections.h>
|
||||||
|
@ -48,6 +49,7 @@
|
||||||
#include <asm/io.h>
|
#include <asm/io.h>
|
||||||
#include <asm/setup.h>
|
#include <asm/setup.h>
|
||||||
#include <asm/unwind.h>
|
#include <asm/unwind.h>
|
||||||
|
#include <asm/smp.h>
|
||||||
|
|
||||||
static char __initdata command_line[COMMAND_LINE_SIZE];
|
static char __initdata command_line[COMMAND_LINE_SIZE];
|
||||||
|
|
||||||
|
@ -115,7 +117,6 @@ void __init dma_ops_init(void)
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
extern int init_per_cpu(int cpuid);
|
|
||||||
extern void collect_boot_cpu_data(void);
|
extern void collect_boot_cpu_data(void);
|
||||||
|
|
||||||
void __init setup_arch(char **cmdline_p)
|
void __init setup_arch(char **cmdline_p)
|
||||||
|
@ -398,9 +399,8 @@ static int __init parisc_init(void)
|
||||||
}
|
}
|
||||||
arch_initcall(parisc_init);
|
arch_initcall(parisc_init);
|
||||||
|
|
||||||
void start_parisc(void)
|
void __init start_parisc(void)
|
||||||
{
|
{
|
||||||
extern void start_kernel(void);
|
|
||||||
extern void early_trap_init(void);
|
extern void early_trap_init(void);
|
||||||
|
|
||||||
int ret, cpunum;
|
int ret, cpunum;
|
||||||
|
|
|
@ -255,12 +255,11 @@ void arch_send_call_function_single_ipi(int cpu)
|
||||||
static void __init
|
static void __init
|
||||||
smp_cpu_init(int cpunum)
|
smp_cpu_init(int cpunum)
|
||||||
{
|
{
|
||||||
extern int init_per_cpu(int); /* arch/parisc/kernel/processor.c */
|
|
||||||
extern void init_IRQ(void); /* arch/parisc/kernel/irq.c */
|
extern void init_IRQ(void); /* arch/parisc/kernel/irq.c */
|
||||||
extern void start_cpu_itimer(void); /* arch/parisc/kernel/time.c */
|
extern void start_cpu_itimer(void); /* arch/parisc/kernel/time.c */
|
||||||
|
|
||||||
/* Set modes and Enable floating point coprocessor */
|
/* Set modes and Enable floating point coprocessor */
|
||||||
(void) init_per_cpu(cpunum);
|
init_per_cpu(cpunum);
|
||||||
|
|
||||||
disable_sr_hashing();
|
disable_sr_hashing();
|
||||||
|
|
||||||
|
|
|
@ -817,7 +817,7 @@ void __init initialize_ivt(const void *iva)
|
||||||
u32 check = 0;
|
u32 check = 0;
|
||||||
u32 *ivap;
|
u32 *ivap;
|
||||||
u32 *hpmcp;
|
u32 *hpmcp;
|
||||||
u32 length;
|
u32 length, instr;
|
||||||
|
|
||||||
if (strcmp((const char *)iva, "cows can fly"))
|
if (strcmp((const char *)iva, "cows can fly"))
|
||||||
panic("IVT invalid");
|
panic("IVT invalid");
|
||||||
|
@ -827,6 +827,14 @@ void __init initialize_ivt(const void *iva)
|
||||||
for (i = 0; i < 8; i++)
|
for (i = 0; i < 8; i++)
|
||||||
*ivap++ = 0;
|
*ivap++ = 0;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Use PDC_INSTR firmware function to get instruction that invokes
|
||||||
|
* PDCE_CHECK in HPMC handler. See programming note at page 1-31 of
|
||||||
|
* the PA 1.1 Firmware Architecture document.
|
||||||
|
*/
|
||||||
|
if (pdc_instr(&instr) == PDC_OK)
|
||||||
|
ivap[0] = instr;
|
||||||
|
|
||||||
/* Compute Checksum for HPMC handler */
|
/* Compute Checksum for HPMC handler */
|
||||||
length = os_hpmc_size;
|
length = os_hpmc_size;
|
||||||
ivap[7] = length;
|
ivap[7] = length;
|
||||||
|
|
|
@ -14,6 +14,7 @@
|
||||||
#include <linux/slab.h>
|
#include <linux/slab.h>
|
||||||
#include <linux/kallsyms.h>
|
#include <linux/kallsyms.h>
|
||||||
#include <linux/sort.h>
|
#include <linux/sort.h>
|
||||||
|
#include <linux/sched.h>
|
||||||
|
|
||||||
#include <linux/uaccess.h>
|
#include <linux/uaccess.h>
|
||||||
#include <asm/assembly.h>
|
#include <asm/assembly.h>
|
||||||
|
@ -279,6 +280,17 @@ static void unwind_frame_regs(struct unwind_frame_info *info)
|
||||||
|
|
||||||
info->prev_sp = sp - 64;
|
info->prev_sp = sp - 64;
|
||||||
info->prev_ip = 0;
|
info->prev_ip = 0;
|
||||||
|
|
||||||
|
/* The stack is at the end inside the thread_union
|
||||||
|
* struct. If we reach data, we have reached the
|
||||||
|
* beginning of the stack and should stop unwinding. */
|
||||||
|
if (info->prev_sp >= (unsigned long) task_thread_info(info->t) &&
|
||||||
|
info->prev_sp < ((unsigned long) task_thread_info(info->t)
|
||||||
|
+ THREAD_SZ_ALGN)) {
|
||||||
|
info->prev_sp = 0;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
if (get_user(tmp, (unsigned long *)(info->prev_sp - RP_OFFSET)))
|
if (get_user(tmp, (unsigned long *)(info->prev_sp - RP_OFFSET)))
|
||||||
break;
|
break;
|
||||||
info->prev_ip = tmp;
|
info->prev_ip = tmp;
|
||||||
|
|
|
@ -17,6 +17,7 @@
|
||||||
#include <linux/interrupt.h>
|
#include <linux/interrupt.h>
|
||||||
#include <linux/extable.h>
|
#include <linux/extable.h>
|
||||||
#include <linux/uaccess.h>
|
#include <linux/uaccess.h>
|
||||||
|
#include <linux/hugetlb.h>
|
||||||
|
|
||||||
#include <asm/traps.h>
|
#include <asm/traps.h>
|
||||||
|
|
||||||
|
@ -261,7 +262,7 @@ void do_page_fault(struct pt_regs *regs, unsigned long code,
|
||||||
struct task_struct *tsk;
|
struct task_struct *tsk;
|
||||||
struct mm_struct *mm;
|
struct mm_struct *mm;
|
||||||
unsigned long acc_type;
|
unsigned long acc_type;
|
||||||
int fault;
|
int fault = 0;
|
||||||
unsigned int flags;
|
unsigned int flags;
|
||||||
|
|
||||||
if (faulthandler_disabled())
|
if (faulthandler_disabled())
|
||||||
|
@ -315,7 +316,8 @@ void do_page_fault(struct pt_regs *regs, unsigned long code,
|
||||||
goto out_of_memory;
|
goto out_of_memory;
|
||||||
else if (fault & VM_FAULT_SIGSEGV)
|
else if (fault & VM_FAULT_SIGSEGV)
|
||||||
goto bad_area;
|
goto bad_area;
|
||||||
else if (fault & VM_FAULT_SIGBUS)
|
else if (fault & (VM_FAULT_SIGBUS|VM_FAULT_HWPOISON|
|
||||||
|
VM_FAULT_HWPOISON_LARGE))
|
||||||
goto bad_area;
|
goto bad_area;
|
||||||
BUG();
|
BUG();
|
||||||
}
|
}
|
||||||
|
@ -352,8 +354,7 @@ void do_page_fault(struct pt_regs *regs, unsigned long code,
|
||||||
|
|
||||||
if (user_mode(regs)) {
|
if (user_mode(regs)) {
|
||||||
struct siginfo si;
|
struct siginfo si;
|
||||||
|
unsigned int lsb = 0;
|
||||||
show_signal_msg(regs, code, address, tsk, vma);
|
|
||||||
|
|
||||||
switch (code) {
|
switch (code) {
|
||||||
case 15: /* Data TLB miss fault/Data page fault */
|
case 15: /* Data TLB miss fault/Data page fault */
|
||||||
|
@ -386,6 +387,30 @@ void do_page_fault(struct pt_regs *regs, unsigned long code,
|
||||||
si.si_code = (code == 26) ? SEGV_ACCERR : SEGV_MAPERR;
|
si.si_code = (code == 26) ? SEGV_ACCERR : SEGV_MAPERR;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef CONFIG_MEMORY_FAILURE
|
||||||
|
if (fault & (VM_FAULT_HWPOISON|VM_FAULT_HWPOISON_LARGE)) {
|
||||||
|
printk(KERN_ERR
|
||||||
|
"MCE: Killing %s:%d due to hardware memory corruption fault at %08lx\n",
|
||||||
|
tsk->comm, tsk->pid, address);
|
||||||
|
si.si_signo = SIGBUS;
|
||||||
|
si.si_code = BUS_MCEERR_AR;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Either small page or large page may be poisoned.
|
||||||
|
* In other words, VM_FAULT_HWPOISON_LARGE and
|
||||||
|
* VM_FAULT_HWPOISON are mutually exclusive.
|
||||||
|
*/
|
||||||
|
if (fault & VM_FAULT_HWPOISON_LARGE)
|
||||||
|
lsb = hstate_index_to_shift(VM_FAULT_GET_HINDEX(fault));
|
||||||
|
else if (fault & VM_FAULT_HWPOISON)
|
||||||
|
lsb = PAGE_SHIFT;
|
||||||
|
else
|
||||||
|
show_signal_msg(regs, code, address, tsk, vma);
|
||||||
|
si.si_addr_lsb = lsb;
|
||||||
|
|
||||||
si.si_errno = 0;
|
si.si_errno = 0;
|
||||||
si.si_addr = (void __user *) address;
|
si.si_addr = (void __user *) address;
|
||||||
force_sig_info(si.si_signo, &si, current);
|
force_sig_info(si.si_signo, &si, current);
|
||||||
|
|
|
@ -138,10 +138,11 @@ CONFIG_FRAMEBUFFER_CONSOLE=y
|
||||||
CONFIG_LOGO=y
|
CONFIG_LOGO=y
|
||||||
CONFIG_SOUND=m
|
CONFIG_SOUND=m
|
||||||
CONFIG_SND=m
|
CONFIG_SND=m
|
||||||
CONFIG_SND_SEQUENCER=m
|
CONFIG_SND_OSSEMUL=y
|
||||||
CONFIG_SND_MIXER_OSS=m
|
CONFIG_SND_MIXER_OSS=m
|
||||||
CONFIG_SND_PCM_OSS=m
|
CONFIG_SND_PCM_OSS=m
|
||||||
CONFIG_SND_SEQUENCER_OSS=y
|
CONFIG_SND_SEQUENCER=m
|
||||||
|
CONFIG_SND_SEQUENCER_OSS=m
|
||||||
CONFIG_SND_POWERMAC=m
|
CONFIG_SND_POWERMAC=m
|
||||||
CONFIG_SND_AOA=m
|
CONFIG_SND_AOA=m
|
||||||
CONFIG_SND_AOA_FABRIC_LAYOUT=m
|
CONFIG_SND_AOA_FABRIC_LAYOUT=m
|
||||||
|
|
|
@ -64,11 +64,12 @@ CONFIG_LOGO=y
|
||||||
# CONFIG_LOGO_LINUX_CLUT224 is not set
|
# CONFIG_LOGO_LINUX_CLUT224 is not set
|
||||||
CONFIG_SOUND=y
|
CONFIG_SOUND=y
|
||||||
CONFIG_SND=y
|
CONFIG_SND=y
|
||||||
CONFIG_SND_SEQUENCER=y
|
CONFIG_SND_OSSEMUL=y
|
||||||
CONFIG_SND_MIXER_OSS=y
|
CONFIG_SND_MIXER_OSS=y
|
||||||
CONFIG_SND_PCM_OSS=y
|
CONFIG_SND_PCM_OSS=y
|
||||||
CONFIG_SND_SEQUENCER_OSS=y
|
|
||||||
# CONFIG_SND_VERBOSE_PROCFS is not set
|
# CONFIG_SND_VERBOSE_PROCFS is not set
|
||||||
|
CONFIG_SND_SEQUENCER=y
|
||||||
|
CONFIG_SND_SEQUENCER_OSS=y
|
||||||
# CONFIG_USB_SUPPORT is not set
|
# CONFIG_USB_SUPPORT is not set
|
||||||
CONFIG_RTC_CLASS=y
|
CONFIG_RTC_CLASS=y
|
||||||
CONFIG_RTC_DRV_GENERIC=y
|
CONFIG_RTC_DRV_GENERIC=y
|
||||||
|
|
|
@ -115,9 +115,10 @@ CONFIG_VGACON_SOFT_SCROLLBACK=y
|
||||||
CONFIG_LOGO=y
|
CONFIG_LOGO=y
|
||||||
CONFIG_SOUND=y
|
CONFIG_SOUND=y
|
||||||
CONFIG_SND=y
|
CONFIG_SND=y
|
||||||
CONFIG_SND_SEQUENCER=y
|
CONFIG_SND_OSSEMUL=y
|
||||||
CONFIG_SND_MIXER_OSS=y
|
CONFIG_SND_MIXER_OSS=y
|
||||||
CONFIG_SND_PCM_OSS=y
|
CONFIG_SND_PCM_OSS=y
|
||||||
|
CONFIG_SND_SEQUENCER=y
|
||||||
CONFIG_SND_SEQUENCER_OSS=y
|
CONFIG_SND_SEQUENCER_OSS=y
|
||||||
CONFIG_SND_USB_AUDIO=y
|
CONFIG_SND_USB_AUDIO=y
|
||||||
CONFIG_SND_USB_USX2Y=y
|
CONFIG_SND_USB_USX2Y=y
|
||||||
|
|
|
@ -227,11 +227,12 @@ CONFIG_FRAMEBUFFER_CONSOLE=y
|
||||||
CONFIG_LOGO=y
|
CONFIG_LOGO=y
|
||||||
CONFIG_SOUND=m
|
CONFIG_SOUND=m
|
||||||
CONFIG_SND=m
|
CONFIG_SND=m
|
||||||
CONFIG_SND_SEQUENCER=m
|
CONFIG_SND_OSSEMUL=y
|
||||||
CONFIG_SND_SEQ_DUMMY=m
|
|
||||||
CONFIG_SND_MIXER_OSS=m
|
CONFIG_SND_MIXER_OSS=m
|
||||||
CONFIG_SND_PCM_OSS=m
|
CONFIG_SND_PCM_OSS=m
|
||||||
CONFIG_SND_SEQUENCER_OSS=y
|
CONFIG_SND_SEQUENCER=m
|
||||||
|
CONFIG_SND_SEQ_DUMMY=m
|
||||||
|
CONFIG_SND_SEQUENCER_OSS=m
|
||||||
CONFIG_SND_DUMMY=m
|
CONFIG_SND_DUMMY=m
|
||||||
CONFIG_SND_POWERMAC=m
|
CONFIG_SND_POWERMAC=m
|
||||||
CONFIG_SND_AOA=m
|
CONFIG_SND_AOA=m
|
||||||
|
|
|
@ -222,11 +222,12 @@ CONFIG_FRAMEBUFFER_CONSOLE=y
|
||||||
CONFIG_LOGO=y
|
CONFIG_LOGO=y
|
||||||
CONFIG_SOUND=m
|
CONFIG_SOUND=m
|
||||||
CONFIG_SND=m
|
CONFIG_SND=m
|
||||||
CONFIG_SND_SEQUENCER=m
|
CONFIG_SND_OSSEMUL=y
|
||||||
CONFIG_SND_SEQ_DUMMY=m
|
|
||||||
CONFIG_SND_MIXER_OSS=m
|
CONFIG_SND_MIXER_OSS=m
|
||||||
CONFIG_SND_PCM_OSS=m
|
CONFIG_SND_PCM_OSS=m
|
||||||
CONFIG_SND_SEQUENCER_OSS=y
|
CONFIG_SND_SEQUENCER=m
|
||||||
|
CONFIG_SND_SEQ_DUMMY=m
|
||||||
|
CONFIG_SND_SEQUENCER_OSS=m
|
||||||
CONFIG_SND_POWERMAC=m
|
CONFIG_SND_POWERMAC=m
|
||||||
CONFIG_SND_AOA=m
|
CONFIG_SND_AOA=m
|
||||||
CONFIG_SND_AOA_FABRIC_LAYOUT=m
|
CONFIG_SND_AOA_FABRIC_LAYOUT=m
|
||||||
|
|
|
@ -141,11 +141,12 @@ CONFIG_FRAMEBUFFER_CONSOLE=y
|
||||||
CONFIG_LOGO=y
|
CONFIG_LOGO=y
|
||||||
CONFIG_SOUND=m
|
CONFIG_SOUND=m
|
||||||
CONFIG_SND=m
|
CONFIG_SND=m
|
||||||
CONFIG_SND_SEQUENCER=m
|
CONFIG_SND_OSSEMUL=y
|
||||||
CONFIG_SND_SEQ_DUMMY=m
|
|
||||||
CONFIG_SND_MIXER_OSS=m
|
CONFIG_SND_MIXER_OSS=m
|
||||||
CONFIG_SND_PCM_OSS=m
|
CONFIG_SND_PCM_OSS=m
|
||||||
CONFIG_SND_SEQUENCER_OSS=y
|
CONFIG_SND_SEQUENCER=m
|
||||||
|
CONFIG_SND_SEQ_DUMMY=m
|
||||||
|
CONFIG_SND_SEQUENCER_OSS=m
|
||||||
CONFIG_HID_DRAGONRISE=y
|
CONFIG_HID_DRAGONRISE=y
|
||||||
CONFIG_HID_GYRATION=y
|
CONFIG_HID_GYRATION=y
|
||||||
CONFIG_HID_TWINHAN=y
|
CONFIG_HID_TWINHAN=y
|
||||||
|
|
|
@ -789,17 +789,18 @@ CONFIG_LOGO=y
|
||||||
# CONFIG_LOGO_LINUX_VGA16 is not set
|
# CONFIG_LOGO_LINUX_VGA16 is not set
|
||||||
CONFIG_SOUND=m
|
CONFIG_SOUND=m
|
||||||
CONFIG_SND=m
|
CONFIG_SND=m
|
||||||
CONFIG_SND_SEQUENCER=m
|
CONFIG_SND_OSSEMUL=y
|
||||||
CONFIG_SND_SEQ_DUMMY=m
|
|
||||||
CONFIG_SND_MIXER_OSS=m
|
CONFIG_SND_MIXER_OSS=m
|
||||||
CONFIG_SND_PCM_OSS=m
|
CONFIG_SND_PCM_OSS=m
|
||||||
CONFIG_SND_SEQUENCER_OSS=y
|
|
||||||
CONFIG_SND_DYNAMIC_MINORS=y
|
CONFIG_SND_DYNAMIC_MINORS=y
|
||||||
# CONFIG_SND_SUPPORT_OLD_API is not set
|
# CONFIG_SND_SUPPORT_OLD_API is not set
|
||||||
CONFIG_SND_VERBOSE_PRINTK=y
|
CONFIG_SND_VERBOSE_PRINTK=y
|
||||||
CONFIG_SND_DEBUG=y
|
CONFIG_SND_DEBUG=y
|
||||||
CONFIG_SND_DEBUG_VERBOSE=y
|
CONFIG_SND_DEBUG_VERBOSE=y
|
||||||
CONFIG_SND_PCM_XRUN_DEBUG=y
|
CONFIG_SND_PCM_XRUN_DEBUG=y
|
||||||
|
CONFIG_SND_SEQUENCER=m
|
||||||
|
CONFIG_SND_SEQ_DUMMY=m
|
||||||
|
CONFIG_SND_SEQUENCER_OSS=m
|
||||||
CONFIG_SND_DUMMY=m
|
CONFIG_SND_DUMMY=m
|
||||||
CONFIG_SND_VIRMIDI=m
|
CONFIG_SND_VIRMIDI=m
|
||||||
CONFIG_SND_MTPAV=m
|
CONFIG_SND_MTPAV=m
|
||||||
|
|
|
@ -79,11 +79,12 @@ CONFIG_FB=y
|
||||||
CONFIG_FRAMEBUFFER_CONSOLE=y
|
CONFIG_FRAMEBUFFER_CONSOLE=y
|
||||||
CONFIG_SOUND=y
|
CONFIG_SOUND=y
|
||||||
CONFIG_SND=y
|
CONFIG_SND=y
|
||||||
CONFIG_SND_SEQUENCER=y
|
CONFIG_SND_OSSEMUL=y
|
||||||
CONFIG_SND_MIXER_OSS=y
|
CONFIG_SND_MIXER_OSS=y
|
||||||
CONFIG_SND_PCM_OSS=y
|
CONFIG_SND_PCM_OSS=y
|
||||||
CONFIG_SND_SEQUENCER_OSS=y
|
|
||||||
# CONFIG_SND_VERBOSE_PROCFS is not set
|
# CONFIG_SND_VERBOSE_PROCFS is not set
|
||||||
|
CONFIG_SND_SEQUENCER=y
|
||||||
|
CONFIG_SND_SEQUENCER_OSS=y
|
||||||
CONFIG_HID_APPLE=m
|
CONFIG_HID_APPLE=m
|
||||||
CONFIG_HID_WACOM=m
|
CONFIG_HID_WACOM=m
|
||||||
CONFIG_MMC=y
|
CONFIG_MMC=y
|
||||||
|
|
|
@ -1019,6 +1019,10 @@ int eeh_init(void)
|
||||||
} else if ((ret = eeh_ops->init()))
|
} else if ((ret = eeh_ops->init()))
|
||||||
return ret;
|
return ret;
|
||||||
|
|
||||||
|
/* Initialize PHB PEs */
|
||||||
|
list_for_each_entry_safe(hose, tmp, &hose_list, list_node)
|
||||||
|
eeh_dev_phb_init_dynamic(hose);
|
||||||
|
|
||||||
/* Initialize EEH event */
|
/* Initialize EEH event */
|
||||||
ret = eeh_event_init();
|
ret = eeh_event_init();
|
||||||
if (ret)
|
if (ret)
|
||||||
|
|
|
@ -78,21 +78,3 @@ void eeh_dev_phb_init_dynamic(struct pci_controller *phb)
|
||||||
/* EEH PE for PHB */
|
/* EEH PE for PHB */
|
||||||
eeh_phb_pe_create(phb);
|
eeh_phb_pe_create(phb);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* eeh_dev_phb_init - Create EEH devices for devices included in existing PHBs
|
|
||||||
*
|
|
||||||
* Scan all the existing PHBs and create EEH devices for their OF
|
|
||||||
* nodes and their children OF nodes
|
|
||||||
*/
|
|
||||||
static int __init eeh_dev_phb_init(void)
|
|
||||||
{
|
|
||||||
struct pci_controller *phb, *tmp;
|
|
||||||
|
|
||||||
list_for_each_entry_safe(phb, tmp, &hose_list, list_node)
|
|
||||||
eeh_dev_phb_init_dynamic(phb);
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
core_initcall(eeh_dev_phb_init);
|
|
||||||
|
|
|
@ -104,8 +104,10 @@ static unsigned long can_optimize(struct kprobe *p)
|
||||||
* and that can be emulated.
|
* and that can be emulated.
|
||||||
*/
|
*/
|
||||||
if (!is_conditional_branch(*p->ainsn.insn) &&
|
if (!is_conditional_branch(*p->ainsn.insn) &&
|
||||||
analyse_instr(&op, ®s, *p->ainsn.insn))
|
analyse_instr(&op, ®s, *p->ainsn.insn) == 1) {
|
||||||
|
emulate_update_regs(®s, &op);
|
||||||
nip = regs.nip;
|
nip = regs.nip;
|
||||||
|
}
|
||||||
|
|
||||||
return nip;
|
return nip;
|
||||||
}
|
}
|
||||||
|
|
|
@ -131,7 +131,7 @@ static void flush_tmregs_to_thread(struct task_struct *tsk)
|
||||||
* in the appropriate thread structures from live.
|
* in the appropriate thread structures from live.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
if (tsk != current)
|
if ((!cpu_has_feature(CPU_FTR_TM)) || (tsk != current))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if (MSR_TM_SUSPENDED(mfmsr())) {
|
if (MSR_TM_SUSPENDED(mfmsr())) {
|
||||||
|
|
|
@ -437,6 +437,7 @@ static inline int check_io_access(struct pt_regs *regs)
|
||||||
int machine_check_e500mc(struct pt_regs *regs)
|
int machine_check_e500mc(struct pt_regs *regs)
|
||||||
{
|
{
|
||||||
unsigned long mcsr = mfspr(SPRN_MCSR);
|
unsigned long mcsr = mfspr(SPRN_MCSR);
|
||||||
|
unsigned long pvr = mfspr(SPRN_PVR);
|
||||||
unsigned long reason = mcsr;
|
unsigned long reason = mcsr;
|
||||||
int recoverable = 1;
|
int recoverable = 1;
|
||||||
|
|
||||||
|
@ -478,8 +479,15 @@ int machine_check_e500mc(struct pt_regs *regs)
|
||||||
* may still get logged and cause a machine check. We should
|
* may still get logged and cause a machine check. We should
|
||||||
* only treat the non-write shadow case as non-recoverable.
|
* only treat the non-write shadow case as non-recoverable.
|
||||||
*/
|
*/
|
||||||
if (!(mfspr(SPRN_L1CSR2) & L1CSR2_DCWS))
|
/* On e6500 core, L1 DCWS (Data cache write shadow mode) bit
|
||||||
recoverable = 0;
|
* is not implemented but L1 data cache always runs in write
|
||||||
|
* shadow mode. Hence on data cache parity errors HW will
|
||||||
|
* automatically invalidate the L1 Data Cache.
|
||||||
|
*/
|
||||||
|
if (PVR_VER(pvr) != PVR_VER_E6500) {
|
||||||
|
if (!(mfspr(SPRN_L1CSR2) & L1CSR2_DCWS))
|
||||||
|
recoverable = 0;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (reason & MCSR_L2MMU_MHIT) {
|
if (reason & MCSR_L2MMU_MHIT) {
|
||||||
|
|
|
@ -944,9 +944,9 @@ NOKPROBE_SYMBOL(emulate_dcbz);
|
||||||
: "r" (addr), "i" (-EFAULT), "0" (err))
|
: "r" (addr), "i" (-EFAULT), "0" (err))
|
||||||
|
|
||||||
static nokprobe_inline void set_cr0(const struct pt_regs *regs,
|
static nokprobe_inline void set_cr0(const struct pt_regs *regs,
|
||||||
struct instruction_op *op, int rd)
|
struct instruction_op *op)
|
||||||
{
|
{
|
||||||
long val = regs->gpr[rd];
|
long val = op->val;
|
||||||
|
|
||||||
op->type |= SETCC;
|
op->type |= SETCC;
|
||||||
op->ccval = (regs->ccr & 0x0fffffff) | ((regs->xer >> 3) & 0x10000000);
|
op->ccval = (regs->ccr & 0x0fffffff) | ((regs->xer >> 3) & 0x10000000);
|
||||||
|
@ -1326,7 +1326,7 @@ int analyse_instr(struct instruction_op *op, const struct pt_regs *regs,
|
||||||
case 13: /* addic. */
|
case 13: /* addic. */
|
||||||
imm = (short) instr;
|
imm = (short) instr;
|
||||||
add_with_carry(regs, op, rd, regs->gpr[ra], imm, 0);
|
add_with_carry(regs, op, rd, regs->gpr[ra], imm, 0);
|
||||||
set_cr0(regs, op, rd);
|
set_cr0(regs, op);
|
||||||
return 1;
|
return 1;
|
||||||
|
|
||||||
case 14: /* addi */
|
case 14: /* addi */
|
||||||
|
@ -1397,13 +1397,13 @@ int analyse_instr(struct instruction_op *op, const struct pt_regs *regs,
|
||||||
|
|
||||||
case 28: /* andi. */
|
case 28: /* andi. */
|
||||||
op->val = regs->gpr[rd] & (unsigned short) instr;
|
op->val = regs->gpr[rd] & (unsigned short) instr;
|
||||||
set_cr0(regs, op, ra);
|
set_cr0(regs, op);
|
||||||
goto logical_done_nocc;
|
goto logical_done_nocc;
|
||||||
|
|
||||||
case 29: /* andis. */
|
case 29: /* andis. */
|
||||||
imm = (unsigned short) instr;
|
imm = (unsigned short) instr;
|
||||||
op->val = regs->gpr[rd] & (imm << 16);
|
op->val = regs->gpr[rd] & (imm << 16);
|
||||||
set_cr0(regs, op, ra);
|
set_cr0(regs, op);
|
||||||
goto logical_done_nocc;
|
goto logical_done_nocc;
|
||||||
|
|
||||||
#ifdef __powerpc64__
|
#ifdef __powerpc64__
|
||||||
|
@ -1513,10 +1513,10 @@ int analyse_instr(struct instruction_op *op, const struct pt_regs *regs,
|
||||||
op->type = COMPUTE + SETCC;
|
op->type = COMPUTE + SETCC;
|
||||||
imm = 0xf0000000UL;
|
imm = 0xf0000000UL;
|
||||||
val = regs->gpr[rd];
|
val = regs->gpr[rd];
|
||||||
op->val = regs->ccr;
|
op->ccval = regs->ccr;
|
||||||
for (sh = 0; sh < 8; ++sh) {
|
for (sh = 0; sh < 8; ++sh) {
|
||||||
if (instr & (0x80000 >> sh))
|
if (instr & (0x80000 >> sh))
|
||||||
op->val = (op->val & ~imm) |
|
op->ccval = (op->ccval & ~imm) |
|
||||||
(val & imm);
|
(val & imm);
|
||||||
imm >>= 4;
|
imm >>= 4;
|
||||||
}
|
}
|
||||||
|
@ -1651,8 +1651,9 @@ int analyse_instr(struct instruction_op *op, const struct pt_regs *regs,
|
||||||
goto arith_done;
|
goto arith_done;
|
||||||
|
|
||||||
case 235: /* mullw */
|
case 235: /* mullw */
|
||||||
op->val = (unsigned int) regs->gpr[ra] *
|
op->val = (long)(int) regs->gpr[ra] *
|
||||||
(unsigned int) regs->gpr[rb];
|
(int) regs->gpr[rb];
|
||||||
|
|
||||||
goto arith_done;
|
goto arith_done;
|
||||||
|
|
||||||
case 266: /* add */
|
case 266: /* add */
|
||||||
|
@ -2526,7 +2527,7 @@ int analyse_instr(struct instruction_op *op, const struct pt_regs *regs,
|
||||||
|
|
||||||
logical_done:
|
logical_done:
|
||||||
if (instr & 1)
|
if (instr & 1)
|
||||||
set_cr0(regs, op, ra);
|
set_cr0(regs, op);
|
||||||
logical_done_nocc:
|
logical_done_nocc:
|
||||||
op->reg = ra;
|
op->reg = ra;
|
||||||
op->type |= SETREG;
|
op->type |= SETREG;
|
||||||
|
@ -2534,7 +2535,7 @@ int analyse_instr(struct instruction_op *op, const struct pt_regs *regs,
|
||||||
|
|
||||||
arith_done:
|
arith_done:
|
||||||
if (instr & 1)
|
if (instr & 1)
|
||||||
set_cr0(regs, op, rd);
|
set_cr0(regs, op);
|
||||||
compute_done:
|
compute_done:
|
||||||
op->reg = rd;
|
op->reg = rd;
|
||||||
op->type |= SETREG;
|
op->type |= SETREG;
|
||||||
|
|
|
@ -793,6 +793,11 @@ void perf_event_print_debug(void)
|
||||||
u32 pmcs[MAX_HWEVENTS];
|
u32 pmcs[MAX_HWEVENTS];
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
|
if (!ppmu) {
|
||||||
|
pr_info("Performance monitor hardware not registered.\n");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
if (!ppmu->n_counter)
|
if (!ppmu->n_counter)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
|
|
@ -393,7 +393,13 @@ static void pnv_program_cpu_hotplug_lpcr(unsigned int cpu, u64 lpcr_val)
|
||||||
u64 pir = get_hard_smp_processor_id(cpu);
|
u64 pir = get_hard_smp_processor_id(cpu);
|
||||||
|
|
||||||
mtspr(SPRN_LPCR, lpcr_val);
|
mtspr(SPRN_LPCR, lpcr_val);
|
||||||
opal_slw_set_reg(pir, SPRN_LPCR, lpcr_val);
|
|
||||||
|
/*
|
||||||
|
* Program the LPCR via stop-api only if the deepest stop state
|
||||||
|
* can lose hypervisor context.
|
||||||
|
*/
|
||||||
|
if (supported_cpuidle_states & OPAL_PM_LOSE_FULL_CONTEXT)
|
||||||
|
opal_slw_set_reg(pir, SPRN_LPCR, lpcr_val);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
|
@ -266,7 +266,6 @@ int dlpar_attach_node(struct device_node *dn, struct device_node *parent)
|
||||||
return rc;
|
return rc;
|
||||||
}
|
}
|
||||||
|
|
||||||
of_node_put(dn->parent);
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -462,15 +462,19 @@ static ssize_t dlpar_cpu_add(u32 drc_index)
|
||||||
}
|
}
|
||||||
|
|
||||||
dn = dlpar_configure_connector(cpu_to_be32(drc_index), parent);
|
dn = dlpar_configure_connector(cpu_to_be32(drc_index), parent);
|
||||||
of_node_put(parent);
|
|
||||||
if (!dn) {
|
if (!dn) {
|
||||||
pr_warn("Failed call to configure-connector, drc index: %x\n",
|
pr_warn("Failed call to configure-connector, drc index: %x\n",
|
||||||
drc_index);
|
drc_index);
|
||||||
dlpar_release_drc(drc_index);
|
dlpar_release_drc(drc_index);
|
||||||
|
of_node_put(parent);
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
}
|
}
|
||||||
|
|
||||||
rc = dlpar_attach_node(dn, parent);
|
rc = dlpar_attach_node(dn, parent);
|
||||||
|
|
||||||
|
/* Regardless we are done with parent now */
|
||||||
|
of_node_put(parent);
|
||||||
|
|
||||||
if (rc) {
|
if (rc) {
|
||||||
saved_rc = rc;
|
saved_rc = rc;
|
||||||
pr_warn("Failed to attach node %s, rc: %d, drc index: %x\n",
|
pr_warn("Failed to attach node %s, rc: %d, drc index: %x\n",
|
||||||
|
|
|
@ -226,8 +226,10 @@ static int add_dt_node(__be32 parent_phandle, __be32 drc_index)
|
||||||
return -ENOENT;
|
return -ENOENT;
|
||||||
|
|
||||||
dn = dlpar_configure_connector(drc_index, parent_dn);
|
dn = dlpar_configure_connector(drc_index, parent_dn);
|
||||||
if (!dn)
|
if (!dn) {
|
||||||
|
of_node_put(parent_dn);
|
||||||
return -ENOENT;
|
return -ENOENT;
|
||||||
|
}
|
||||||
|
|
||||||
rc = dlpar_attach_node(dn, parent_dn);
|
rc = dlpar_attach_node(dn, parent_dn);
|
||||||
if (rc)
|
if (rc)
|
||||||
|
|
|
@ -1507,7 +1507,9 @@ static inline pmd_t pmdp_huge_clear_flush(struct vm_area_struct *vma,
|
||||||
static inline void pmdp_invalidate(struct vm_area_struct *vma,
|
static inline void pmdp_invalidate(struct vm_area_struct *vma,
|
||||||
unsigned long addr, pmd_t *pmdp)
|
unsigned long addr, pmd_t *pmdp)
|
||||||
{
|
{
|
||||||
pmdp_xchg_direct(vma->vm_mm, addr, pmdp, __pmd(_SEGMENT_ENTRY_EMPTY));
|
pmd_t pmd = __pmd(pmd_val(*pmdp) | _SEGMENT_ENTRY_INVALID);
|
||||||
|
|
||||||
|
pmdp_xchg_direct(vma->vm_mm, addr, pmdp, pmd);
|
||||||
}
|
}
|
||||||
|
|
||||||
#define __HAVE_ARCH_PMDP_SET_WRPROTECT
|
#define __HAVE_ARCH_PMDP_SET_WRPROTECT
|
||||||
|
|
|
@ -404,18 +404,6 @@ static inline void save_vector_registers(void)
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
static int __init topology_setup(char *str)
|
|
||||||
{
|
|
||||||
bool enabled;
|
|
||||||
int rc;
|
|
||||||
|
|
||||||
rc = kstrtobool(str, &enabled);
|
|
||||||
if (!rc && !enabled)
|
|
||||||
S390_lowcore.machine_flags &= ~MACHINE_FLAG_TOPOLOGY;
|
|
||||||
return rc;
|
|
||||||
}
|
|
||||||
early_param("topology", topology_setup);
|
|
||||||
|
|
||||||
static int __init disable_vector_extension(char *str)
|
static int __init disable_vector_extension(char *str)
|
||||||
{
|
{
|
||||||
S390_lowcore.machine_flags &= ~MACHINE_FLAG_VX;
|
S390_lowcore.machine_flags &= ~MACHINE_FLAG_VX;
|
||||||
|
|
|
@ -823,9 +823,12 @@ static int cpumsf_pmu_event_init(struct perf_event *event)
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Check online status of the CPU to which the event is pinned */
|
/* Check online status of the CPU to which the event is pinned */
|
||||||
if ((unsigned int)event->cpu >= nr_cpumask_bits ||
|
if (event->cpu >= 0) {
|
||||||
(event->cpu >= 0 && !cpu_online(event->cpu)))
|
if ((unsigned int)event->cpu >= nr_cpumask_bits)
|
||||||
return -ENODEV;
|
return -ENODEV;
|
||||||
|
if (!cpu_online(event->cpu))
|
||||||
|
return -ENODEV;
|
||||||
|
}
|
||||||
|
|
||||||
/* Force reset of idle/hv excludes regardless of what the
|
/* Force reset of idle/hv excludes regardless of what the
|
||||||
* user requested.
|
* user requested.
|
||||||
|
|
|
@ -8,6 +8,8 @@
|
||||||
|
|
||||||
#include <linux/workqueue.h>
|
#include <linux/workqueue.h>
|
||||||
#include <linux/bootmem.h>
|
#include <linux/bootmem.h>
|
||||||
|
#include <linux/uaccess.h>
|
||||||
|
#include <linux/sysctl.h>
|
||||||
#include <linux/cpuset.h>
|
#include <linux/cpuset.h>
|
||||||
#include <linux/device.h>
|
#include <linux/device.h>
|
||||||
#include <linux/export.h>
|
#include <linux/export.h>
|
||||||
|
@ -29,12 +31,20 @@
|
||||||
#define PTF_VERTICAL (1UL)
|
#define PTF_VERTICAL (1UL)
|
||||||
#define PTF_CHECK (2UL)
|
#define PTF_CHECK (2UL)
|
||||||
|
|
||||||
|
enum {
|
||||||
|
TOPOLOGY_MODE_HW,
|
||||||
|
TOPOLOGY_MODE_SINGLE,
|
||||||
|
TOPOLOGY_MODE_PACKAGE,
|
||||||
|
TOPOLOGY_MODE_UNINITIALIZED
|
||||||
|
};
|
||||||
|
|
||||||
struct mask_info {
|
struct mask_info {
|
||||||
struct mask_info *next;
|
struct mask_info *next;
|
||||||
unsigned char id;
|
unsigned char id;
|
||||||
cpumask_t mask;
|
cpumask_t mask;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
static int topology_mode = TOPOLOGY_MODE_UNINITIALIZED;
|
||||||
static void set_topology_timer(void);
|
static void set_topology_timer(void);
|
||||||
static void topology_work_fn(struct work_struct *work);
|
static void topology_work_fn(struct work_struct *work);
|
||||||
static struct sysinfo_15_1_x *tl_info;
|
static struct sysinfo_15_1_x *tl_info;
|
||||||
|
@ -59,11 +69,26 @@ static cpumask_t cpu_group_map(struct mask_info *info, unsigned int cpu)
|
||||||
cpumask_t mask;
|
cpumask_t mask;
|
||||||
|
|
||||||
cpumask_copy(&mask, cpumask_of(cpu));
|
cpumask_copy(&mask, cpumask_of(cpu));
|
||||||
if (!MACHINE_HAS_TOPOLOGY)
|
switch (topology_mode) {
|
||||||
return mask;
|
case TOPOLOGY_MODE_HW:
|
||||||
for (; info; info = info->next) {
|
while (info) {
|
||||||
if (cpumask_test_cpu(cpu, &info->mask))
|
if (cpumask_test_cpu(cpu, &info->mask)) {
|
||||||
return info->mask;
|
mask = info->mask;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
info = info->next;
|
||||||
|
}
|
||||||
|
if (cpumask_empty(&mask))
|
||||||
|
cpumask_copy(&mask, cpumask_of(cpu));
|
||||||
|
break;
|
||||||
|
case TOPOLOGY_MODE_PACKAGE:
|
||||||
|
cpumask_copy(&mask, cpu_present_mask);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
/* fallthrough */
|
||||||
|
case TOPOLOGY_MODE_SINGLE:
|
||||||
|
cpumask_copy(&mask, cpumask_of(cpu));
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
return mask;
|
return mask;
|
||||||
}
|
}
|
||||||
|
@ -74,7 +99,7 @@ static cpumask_t cpu_thread_map(unsigned int cpu)
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
cpumask_copy(&mask, cpumask_of(cpu));
|
cpumask_copy(&mask, cpumask_of(cpu));
|
||||||
if (!MACHINE_HAS_TOPOLOGY)
|
if (topology_mode != TOPOLOGY_MODE_HW)
|
||||||
return mask;
|
return mask;
|
||||||
cpu -= cpu % (smp_cpu_mtid + 1);
|
cpu -= cpu % (smp_cpu_mtid + 1);
|
||||||
for (i = 0; i <= smp_cpu_mtid; i++)
|
for (i = 0; i <= smp_cpu_mtid; i++)
|
||||||
|
@ -184,10 +209,8 @@ static void topology_update_polarization_simple(void)
|
||||||
{
|
{
|
||||||
int cpu;
|
int cpu;
|
||||||
|
|
||||||
mutex_lock(&smp_cpu_state_mutex);
|
|
||||||
for_each_possible_cpu(cpu)
|
for_each_possible_cpu(cpu)
|
||||||
smp_cpu_set_polarization(cpu, POLARIZATION_HRZ);
|
smp_cpu_set_polarization(cpu, POLARIZATION_HRZ);
|
||||||
mutex_unlock(&smp_cpu_state_mutex);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static int ptf(unsigned long fc)
|
static int ptf(unsigned long fc)
|
||||||
|
@ -223,7 +246,7 @@ int topology_set_cpu_management(int fc)
|
||||||
static void update_cpu_masks(void)
|
static void update_cpu_masks(void)
|
||||||
{
|
{
|
||||||
struct cpu_topology_s390 *topo;
|
struct cpu_topology_s390 *topo;
|
||||||
int cpu;
|
int cpu, id;
|
||||||
|
|
||||||
for_each_possible_cpu(cpu) {
|
for_each_possible_cpu(cpu) {
|
||||||
topo = &cpu_topology[cpu];
|
topo = &cpu_topology[cpu];
|
||||||
|
@ -231,12 +254,13 @@ static void update_cpu_masks(void)
|
||||||
topo->core_mask = cpu_group_map(&socket_info, cpu);
|
topo->core_mask = cpu_group_map(&socket_info, cpu);
|
||||||
topo->book_mask = cpu_group_map(&book_info, cpu);
|
topo->book_mask = cpu_group_map(&book_info, cpu);
|
||||||
topo->drawer_mask = cpu_group_map(&drawer_info, cpu);
|
topo->drawer_mask = cpu_group_map(&drawer_info, cpu);
|
||||||
if (!MACHINE_HAS_TOPOLOGY) {
|
if (topology_mode != TOPOLOGY_MODE_HW) {
|
||||||
|
id = topology_mode == TOPOLOGY_MODE_PACKAGE ? 0 : cpu;
|
||||||
topo->thread_id = cpu;
|
topo->thread_id = cpu;
|
||||||
topo->core_id = cpu;
|
topo->core_id = cpu;
|
||||||
topo->socket_id = cpu;
|
topo->socket_id = id;
|
||||||
topo->book_id = cpu;
|
topo->book_id = id;
|
||||||
topo->drawer_id = cpu;
|
topo->drawer_id = id;
|
||||||
if (cpu_present(cpu))
|
if (cpu_present(cpu))
|
||||||
cpumask_set_cpu(cpu, &cpus_with_topology);
|
cpumask_set_cpu(cpu, &cpus_with_topology);
|
||||||
}
|
}
|
||||||
|
@ -254,6 +278,7 @@ static int __arch_update_cpu_topology(void)
|
||||||
struct sysinfo_15_1_x *info = tl_info;
|
struct sysinfo_15_1_x *info = tl_info;
|
||||||
int rc = 0;
|
int rc = 0;
|
||||||
|
|
||||||
|
mutex_lock(&smp_cpu_state_mutex);
|
||||||
cpumask_clear(&cpus_with_topology);
|
cpumask_clear(&cpus_with_topology);
|
||||||
if (MACHINE_HAS_TOPOLOGY) {
|
if (MACHINE_HAS_TOPOLOGY) {
|
||||||
rc = 1;
|
rc = 1;
|
||||||
|
@ -263,6 +288,7 @@ static int __arch_update_cpu_topology(void)
|
||||||
update_cpu_masks();
|
update_cpu_masks();
|
||||||
if (!MACHINE_HAS_TOPOLOGY)
|
if (!MACHINE_HAS_TOPOLOGY)
|
||||||
topology_update_polarization_simple();
|
topology_update_polarization_simple();
|
||||||
|
mutex_unlock(&smp_cpu_state_mutex);
|
||||||
return rc;
|
return rc;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -289,6 +315,11 @@ void topology_schedule_update(void)
|
||||||
schedule_work(&topology_work);
|
schedule_work(&topology_work);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void topology_flush_work(void)
|
||||||
|
{
|
||||||
|
flush_work(&topology_work);
|
||||||
|
}
|
||||||
|
|
||||||
static void topology_timer_fn(unsigned long ignored)
|
static void topology_timer_fn(unsigned long ignored)
|
||||||
{
|
{
|
||||||
if (ptf(PTF_CHECK))
|
if (ptf(PTF_CHECK))
|
||||||
|
@ -459,6 +490,12 @@ void __init topology_init_early(void)
|
||||||
struct sysinfo_15_1_x *info;
|
struct sysinfo_15_1_x *info;
|
||||||
|
|
||||||
set_sched_topology(s390_topology);
|
set_sched_topology(s390_topology);
|
||||||
|
if (topology_mode == TOPOLOGY_MODE_UNINITIALIZED) {
|
||||||
|
if (MACHINE_HAS_TOPOLOGY)
|
||||||
|
topology_mode = TOPOLOGY_MODE_HW;
|
||||||
|
else
|
||||||
|
topology_mode = TOPOLOGY_MODE_SINGLE;
|
||||||
|
}
|
||||||
if (!MACHINE_HAS_TOPOLOGY)
|
if (!MACHINE_HAS_TOPOLOGY)
|
||||||
goto out;
|
goto out;
|
||||||
tl_info = memblock_virt_alloc(PAGE_SIZE, PAGE_SIZE);
|
tl_info = memblock_virt_alloc(PAGE_SIZE, PAGE_SIZE);
|
||||||
|
@ -474,12 +511,97 @@ void __init topology_init_early(void)
|
||||||
__arch_update_cpu_topology();
|
__arch_update_cpu_topology();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static inline int topology_get_mode(int enabled)
|
||||||
|
{
|
||||||
|
if (!enabled)
|
||||||
|
return TOPOLOGY_MODE_SINGLE;
|
||||||
|
return MACHINE_HAS_TOPOLOGY ? TOPOLOGY_MODE_HW : TOPOLOGY_MODE_PACKAGE;
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline int topology_is_enabled(void)
|
||||||
|
{
|
||||||
|
return topology_mode != TOPOLOGY_MODE_SINGLE;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int __init topology_setup(char *str)
|
||||||
|
{
|
||||||
|
bool enabled;
|
||||||
|
int rc;
|
||||||
|
|
||||||
|
rc = kstrtobool(str, &enabled);
|
||||||
|
if (rc)
|
||||||
|
return rc;
|
||||||
|
topology_mode = topology_get_mode(enabled);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
early_param("topology", topology_setup);
|
||||||
|
|
||||||
|
static int topology_ctl_handler(struct ctl_table *ctl, int write,
|
||||||
|
void __user *buffer, size_t *lenp, loff_t *ppos)
|
||||||
|
{
|
||||||
|
unsigned int len;
|
||||||
|
int new_mode;
|
||||||
|
char buf[2];
|
||||||
|
|
||||||
|
if (!*lenp || *ppos) {
|
||||||
|
*lenp = 0;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
if (!write) {
|
||||||
|
strncpy(buf, topology_is_enabled() ? "1\n" : "0\n",
|
||||||
|
ARRAY_SIZE(buf));
|
||||||
|
len = strnlen(buf, ARRAY_SIZE(buf));
|
||||||
|
if (len > *lenp)
|
||||||
|
len = *lenp;
|
||||||
|
if (copy_to_user(buffer, buf, len))
|
||||||
|
return -EFAULT;
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
|
len = *lenp;
|
||||||
|
if (copy_from_user(buf, buffer, len > sizeof(buf) ? sizeof(buf) : len))
|
||||||
|
return -EFAULT;
|
||||||
|
if (buf[0] != '0' && buf[0] != '1')
|
||||||
|
return -EINVAL;
|
||||||
|
mutex_lock(&smp_cpu_state_mutex);
|
||||||
|
new_mode = topology_get_mode(buf[0] == '1');
|
||||||
|
if (topology_mode != new_mode) {
|
||||||
|
topology_mode = new_mode;
|
||||||
|
topology_schedule_update();
|
||||||
|
}
|
||||||
|
mutex_unlock(&smp_cpu_state_mutex);
|
||||||
|
topology_flush_work();
|
||||||
|
out:
|
||||||
|
*lenp = len;
|
||||||
|
*ppos += len;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static struct ctl_table topology_ctl_table[] = {
|
||||||
|
{
|
||||||
|
.procname = "topology",
|
||||||
|
.mode = 0644,
|
||||||
|
.proc_handler = topology_ctl_handler,
|
||||||
|
},
|
||||||
|
{ },
|
||||||
|
};
|
||||||
|
|
||||||
|
static struct ctl_table topology_dir_table[] = {
|
||||||
|
{
|
||||||
|
.procname = "s390",
|
||||||
|
.maxlen = 0,
|
||||||
|
.mode = 0555,
|
||||||
|
.child = topology_ctl_table,
|
||||||
|
},
|
||||||
|
{ },
|
||||||
|
};
|
||||||
|
|
||||||
static int __init topology_init(void)
|
static int __init topology_init(void)
|
||||||
{
|
{
|
||||||
if (MACHINE_HAS_TOPOLOGY)
|
if (MACHINE_HAS_TOPOLOGY)
|
||||||
set_topology_timer();
|
set_topology_timer();
|
||||||
else
|
else
|
||||||
topology_update_polarization_simple();
|
topology_update_polarization_simple();
|
||||||
|
register_sysctl_table(topology_dir_table);
|
||||||
return device_create_file(cpu_subsys.dev_root, &dev_attr_dispatching);
|
return device_create_file(cpu_subsys.dev_root, &dev_attr_dispatching);
|
||||||
}
|
}
|
||||||
device_initcall(topology_init);
|
device_initcall(topology_init);
|
||||||
|
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue