mirror of https://gitee.com/openkylin/linux.git
Merge commit 'v2.6.36-rc7' into core/rcu
Merge reason: Update from -rc3 to -rc7. Signed-off-by: Ingo Molnar <mingo@elte.hu>
This commit is contained in:
commit
556ef63255
8
CREDITS
8
CREDITS
|
@ -3554,12 +3554,12 @@ E: cvance@nai.com
|
||||||
D: portions of the Linux Security Module (LSM) framework and security modules
|
D: portions of the Linux Security Module (LSM) framework and security modules
|
||||||
|
|
||||||
N: Petr Vandrovec
|
N: Petr Vandrovec
|
||||||
E: vandrove@vc.cvut.cz
|
E: petr@vandrovec.name
|
||||||
D: Small contributions to ncpfs
|
D: Small contributions to ncpfs
|
||||||
D: Matrox framebuffer driver
|
D: Matrox framebuffer driver
|
||||||
S: Chudenicka 8
|
S: 21513 Conradia Ct
|
||||||
S: 10200 Prague 10, Hostivar
|
S: Cupertino, CA 95014
|
||||||
S: Czech Republic
|
S: USA
|
||||||
|
|
||||||
N: Thibaut Varene
|
N: Thibaut Varene
|
||||||
E: T-Bone@parisc-linux.org
|
E: T-Bone@parisc-linux.org
|
||||||
|
|
|
@ -46,7 +46,6 @@
|
||||||
|
|
||||||
<sect1><title>Atomic and pointer manipulation</title>
|
<sect1><title>Atomic and pointer manipulation</title>
|
||||||
!Iarch/x86/include/asm/atomic.h
|
!Iarch/x86/include/asm/atomic.h
|
||||||
!Iarch/x86/include/asm/unaligned.h
|
|
||||||
</sect1>
|
</sect1>
|
||||||
|
|
||||||
<sect1><title>Delaying, scheduling, and timer routines</title>
|
<sect1><title>Delaying, scheduling, and timer routines</title>
|
||||||
|
|
|
@ -57,7 +57,6 @@
|
||||||
</para>
|
</para>
|
||||||
|
|
||||||
<sect1><title>String Conversions</title>
|
<sect1><title>String Conversions</title>
|
||||||
!Ilib/vsprintf.c
|
|
||||||
!Elib/vsprintf.c
|
!Elib/vsprintf.c
|
||||||
</sect1>
|
</sect1>
|
||||||
<sect1><title>String Manipulation</title>
|
<sect1><title>String Manipulation</title>
|
||||||
|
|
|
@ -0,0 +1,45 @@
|
||||||
|
CFQ ioscheduler tunables
|
||||||
|
========================
|
||||||
|
|
||||||
|
slice_idle
|
||||||
|
----------
|
||||||
|
This specifies how long CFQ should idle for next request on certain cfq queues
|
||||||
|
(for sequential workloads) and service trees (for random workloads) before
|
||||||
|
queue is expired and CFQ selects next queue to dispatch from.
|
||||||
|
|
||||||
|
By default slice_idle is a non-zero value. That means by default we idle on
|
||||||
|
queues/service trees. This can be very helpful on highly seeky media like
|
||||||
|
single spindle SATA/SAS disks where we can cut down on overall number of
|
||||||
|
seeks and see improved throughput.
|
||||||
|
|
||||||
|
Setting slice_idle to 0 will remove all the idling on queues/service tree
|
||||||
|
level and one should see an overall improved throughput on faster storage
|
||||||
|
devices like multiple SATA/SAS disks in hardware RAID configuration. The down
|
||||||
|
side is that isolation provided from WRITES also goes down and notion of
|
||||||
|
IO priority becomes weaker.
|
||||||
|
|
||||||
|
So depending on storage and workload, it might be useful to set slice_idle=0.
|
||||||
|
In general I think for SATA/SAS disks and software RAID of SATA/SAS disks
|
||||||
|
keeping slice_idle enabled should be useful. For any configurations where
|
||||||
|
there are multiple spindles behind single LUN (Host based hardware RAID
|
||||||
|
controller or for storage arrays), setting slice_idle=0 might end up in better
|
||||||
|
throughput and acceptable latencies.
|
||||||
|
|
||||||
|
CFQ IOPS Mode for group scheduling
|
||||||
|
===================================
|
||||||
|
Basic CFQ design is to provide priority based time slices. Higher priority
|
||||||
|
process gets bigger time slice and lower priority process gets smaller time
|
||||||
|
slice. Measuring time becomes harder if storage is fast and supports NCQ and
|
||||||
|
it would be better to dispatch multiple requests from multiple cfq queues in
|
||||||
|
request queue at a time. In such scenario, it is not possible to measure time
|
||||||
|
consumed by single queue accurately.
|
||||||
|
|
||||||
|
What is possible though is to measure number of requests dispatched from a
|
||||||
|
single queue and also allow dispatch from multiple cfq queue at the same time.
|
||||||
|
This effectively becomes the fairness in terms of IOPS (IO operations per
|
||||||
|
second).
|
||||||
|
|
||||||
|
If one sets slice_idle=0 and if storage supports NCQ, CFQ internally switches
|
||||||
|
to IOPS mode and starts providing fairness in terms of number of requests
|
||||||
|
dispatched. Note that this mode switching takes effect only for group
|
||||||
|
scheduling. For non-cgroup users nothing should change.
|
|
@ -217,6 +217,7 @@ Details of cgroup files
|
||||||
CFQ sysfs tunable
|
CFQ sysfs tunable
|
||||||
=================
|
=================
|
||||||
/sys/block/<disk>/queue/iosched/group_isolation
|
/sys/block/<disk>/queue/iosched/group_isolation
|
||||||
|
-----------------------------------------------
|
||||||
|
|
||||||
If group_isolation=1, it provides stronger isolation between groups at the
|
If group_isolation=1, it provides stronger isolation between groups at the
|
||||||
expense of throughput. By default group_isolation is 0. In general that
|
expense of throughput. By default group_isolation is 0. In general that
|
||||||
|
@ -243,6 +244,33 @@ By default one should run with group_isolation=0. If that is not sufficient
|
||||||
and one wants stronger isolation between groups, then set group_isolation=1
|
and one wants stronger isolation between groups, then set group_isolation=1
|
||||||
but this will come at cost of reduced throughput.
|
but this will come at cost of reduced throughput.
|
||||||
|
|
||||||
|
/sys/block/<disk>/queue/iosched/slice_idle
|
||||||
|
------------------------------------------
|
||||||
|
On a faster hardware CFQ can be slow, especially with sequential workload.
|
||||||
|
This happens because CFQ idles on a single queue and single queue might not
|
||||||
|
drive deeper request queue depths to keep the storage busy. In such scenarios
|
||||||
|
one can try setting slice_idle=0 and that would switch CFQ to IOPS
|
||||||
|
(IO operations per second) mode on NCQ supporting hardware.
|
||||||
|
|
||||||
|
That means CFQ will not idle between cfq queues of a cfq group and hence be
|
||||||
|
able to driver higher queue depth and achieve better throughput. That also
|
||||||
|
means that cfq provides fairness among groups in terms of IOPS and not in
|
||||||
|
terms of disk time.
|
||||||
|
|
||||||
|
/sys/block/<disk>/queue/iosched/group_idle
|
||||||
|
------------------------------------------
|
||||||
|
If one disables idling on individual cfq queues and cfq service trees by
|
||||||
|
setting slice_idle=0, group_idle kicks in. That means CFQ will still idle
|
||||||
|
on the group in an attempt to provide fairness among groups.
|
||||||
|
|
||||||
|
By default group_idle is same as slice_idle and does not do anything if
|
||||||
|
slice_idle is enabled.
|
||||||
|
|
||||||
|
One can experience an overall throughput drop if you have created multiple
|
||||||
|
groups and put applications in that group which are not driving enough
|
||||||
|
IO to keep disk busy. In that case set group_idle=0, and CFQ will not idle
|
||||||
|
on individual groups and throughput should improve.
|
||||||
|
|
||||||
What works
|
What works
|
||||||
==========
|
==========
|
||||||
- Currently only sync IO queues are support. All the buffered writes are
|
- Currently only sync IO queues are support. All the buffered writes are
|
||||||
|
|
|
@ -91,12 +91,11 @@ name The chip name.
|
||||||
I2C devices get this attribute created automatically.
|
I2C devices get this attribute created automatically.
|
||||||
RO
|
RO
|
||||||
|
|
||||||
update_rate The rate at which the chip will update readings.
|
update_interval The interval at which the chip will update readings.
|
||||||
Unit: millisecond
|
Unit: millisecond
|
||||||
RW
|
RW
|
||||||
Some devices have a variable update rate. This attribute
|
Some devices have a variable update rate or interval.
|
||||||
can be used to change the update rate to the desired
|
This attribute can be used to change it to the desired value.
|
||||||
frequency.
|
|
||||||
|
|
||||||
|
|
||||||
************
|
************
|
||||||
|
|
|
@ -345,5 +345,10 @@ documentation, in <filename>, for the functions listed.
|
||||||
section titled <section title> from <filename>.
|
section titled <section title> from <filename>.
|
||||||
Spaces are allowed in <section title>; do not quote the <section title>.
|
Spaces are allowed in <section title>; do not quote the <section title>.
|
||||||
|
|
||||||
|
!C<filename> is replaced by nothing, but makes the tools check that
|
||||||
|
all DOC: sections and documented functions, symbols, etc. are used.
|
||||||
|
This makes sense to use when you use !F/!P only and want to verify
|
||||||
|
that all documentation is included.
|
||||||
|
|
||||||
Tim.
|
Tim.
|
||||||
*/ <twaugh@redhat.com>
|
*/ <twaugh@redhat.com>
|
||||||
|
|
|
@ -13,7 +13,7 @@ regulators (where voltage output is controllable) and current sinks (where
|
||||||
current limit is controllable).
|
current limit is controllable).
|
||||||
|
|
||||||
(C) 2008 Wolfson Microelectronics PLC.
|
(C) 2008 Wolfson Microelectronics PLC.
|
||||||
Author: Liam Girdwood <lg@opensource.wolfsonmicro.com>
|
Author: Liam Girdwood <lrg@slimlogic.co.uk>
|
||||||
|
|
||||||
|
|
||||||
Nomenclature
|
Nomenclature
|
||||||
|
|
|
@ -296,6 +296,7 @@ Conexant 5051
|
||||||
Conexant 5066
|
Conexant 5066
|
||||||
=============
|
=============
|
||||||
laptop Basic Laptop config (default)
|
laptop Basic Laptop config (default)
|
||||||
|
hp-laptop HP laptops, e g G60
|
||||||
dell-laptop Dell laptops
|
dell-laptop Dell laptops
|
||||||
dell-vostro Dell Vostro
|
dell-vostro Dell Vostro
|
||||||
olpc-xo-1_5 OLPC XO 1.5
|
olpc-xo-1_5 OLPC XO 1.5
|
||||||
|
|
|
@ -0,0 +1,380 @@
|
||||||
|
|
||||||
|
Concurrency Managed Workqueue (cmwq)
|
||||||
|
|
||||||
|
September, 2010 Tejun Heo <tj@kernel.org>
|
||||||
|
Florian Mickler <florian@mickler.org>
|
||||||
|
|
||||||
|
CONTENTS
|
||||||
|
|
||||||
|
1. Introduction
|
||||||
|
2. Why cmwq?
|
||||||
|
3. The Design
|
||||||
|
4. Application Programming Interface (API)
|
||||||
|
5. Example Execution Scenarios
|
||||||
|
6. Guidelines
|
||||||
|
|
||||||
|
|
||||||
|
1. Introduction
|
||||||
|
|
||||||
|
There are many cases where an asynchronous process execution context
|
||||||
|
is needed and the workqueue (wq) API is the most commonly used
|
||||||
|
mechanism for such cases.
|
||||||
|
|
||||||
|
When such an asynchronous execution context is needed, a work item
|
||||||
|
describing which function to execute is put on a queue. An
|
||||||
|
independent thread serves as the asynchronous execution context. The
|
||||||
|
queue is called workqueue and the thread is called worker.
|
||||||
|
|
||||||
|
While there are work items on the workqueue the worker executes the
|
||||||
|
functions associated with the work items one after the other. When
|
||||||
|
there is no work item left on the workqueue the worker becomes idle.
|
||||||
|
When a new work item gets queued, the worker begins executing again.
|
||||||
|
|
||||||
|
|
||||||
|
2. Why cmwq?
|
||||||
|
|
||||||
|
In the original wq implementation, a multi threaded (MT) wq had one
|
||||||
|
worker thread per CPU and a single threaded (ST) wq had one worker
|
||||||
|
thread system-wide. A single MT wq needed to keep around the same
|
||||||
|
number of workers as the number of CPUs. The kernel grew a lot of MT
|
||||||
|
wq users over the years and with the number of CPU cores continuously
|
||||||
|
rising, some systems saturated the default 32k PID space just booting
|
||||||
|
up.
|
||||||
|
|
||||||
|
Although MT wq wasted a lot of resource, the level of concurrency
|
||||||
|
provided was unsatisfactory. The limitation was common to both ST and
|
||||||
|
MT wq albeit less severe on MT. Each wq maintained its own separate
|
||||||
|
worker pool. A MT wq could provide only one execution context per CPU
|
||||||
|
while a ST wq one for the whole system. Work items had to compete for
|
||||||
|
those very limited execution contexts leading to various problems
|
||||||
|
including proneness to deadlocks around the single execution context.
|
||||||
|
|
||||||
|
The tension between the provided level of concurrency and resource
|
||||||
|
usage also forced its users to make unnecessary tradeoffs like libata
|
||||||
|
choosing to use ST wq for polling PIOs and accepting an unnecessary
|
||||||
|
limitation that no two polling PIOs can progress at the same time. As
|
||||||
|
MT wq don't provide much better concurrency, users which require
|
||||||
|
higher level of concurrency, like async or fscache, had to implement
|
||||||
|
their own thread pool.
|
||||||
|
|
||||||
|
Concurrency Managed Workqueue (cmwq) is a reimplementation of wq with
|
||||||
|
focus on the following goals.
|
||||||
|
|
||||||
|
* Maintain compatibility with the original workqueue API.
|
||||||
|
|
||||||
|
* Use per-CPU unified worker pools shared by all wq to provide
|
||||||
|
flexible level of concurrency on demand without wasting a lot of
|
||||||
|
resource.
|
||||||
|
|
||||||
|
* Automatically regulate worker pool and level of concurrency so that
|
||||||
|
the API users don't need to worry about such details.
|
||||||
|
|
||||||
|
|
||||||
|
3. The Design
|
||||||
|
|
||||||
|
In order to ease the asynchronous execution of functions a new
|
||||||
|
abstraction, the work item, is introduced.
|
||||||
|
|
||||||
|
A work item is a simple struct that holds a pointer to the function
|
||||||
|
that is to be executed asynchronously. Whenever a driver or subsystem
|
||||||
|
wants a function to be executed asynchronously it has to set up a work
|
||||||
|
item pointing to that function and queue that work item on a
|
||||||
|
workqueue.
|
||||||
|
|
||||||
|
Special purpose threads, called worker threads, execute the functions
|
||||||
|
off of the queue, one after the other. If no work is queued, the
|
||||||
|
worker threads become idle. These worker threads are managed in so
|
||||||
|
called thread-pools.
|
||||||
|
|
||||||
|
The cmwq design differentiates between the user-facing workqueues that
|
||||||
|
subsystems and drivers queue work items on and the backend mechanism
|
||||||
|
which manages thread-pool and processes the queued work items.
|
||||||
|
|
||||||
|
The backend is called gcwq. There is one gcwq for each possible CPU
|
||||||
|
and one gcwq to serve work items queued on unbound workqueues.
|
||||||
|
|
||||||
|
Subsystems and drivers can create and queue work items through special
|
||||||
|
workqueue API functions as they see fit. They can influence some
|
||||||
|
aspects of the way the work items are executed by setting flags on the
|
||||||
|
workqueue they are putting the work item on. These flags include
|
||||||
|
things like CPU locality, reentrancy, concurrency limits and more. To
|
||||||
|
get a detailed overview refer to the API description of
|
||||||
|
alloc_workqueue() below.
|
||||||
|
|
||||||
|
When a work item is queued to a workqueue, the target gcwq is
|
||||||
|
determined according to the queue parameters and workqueue attributes
|
||||||
|
and appended on the shared worklist of the gcwq. For example, unless
|
||||||
|
specifically overridden, a work item of a bound workqueue will be
|
||||||
|
queued on the worklist of exactly that gcwq that is associated to the
|
||||||
|
CPU the issuer is running on.
|
||||||
|
|
||||||
|
For any worker pool implementation, managing the concurrency level
|
||||||
|
(how many execution contexts are active) is an important issue. cmwq
|
||||||
|
tries to keep the concurrency at a minimal but sufficient level.
|
||||||
|
Minimal to save resources and sufficient in that the system is used at
|
||||||
|
its full capacity.
|
||||||
|
|
||||||
|
Each gcwq bound to an actual CPU implements concurrency management by
|
||||||
|
hooking into the scheduler. The gcwq is notified whenever an active
|
||||||
|
worker wakes up or sleeps and keeps track of the number of the
|
||||||
|
currently runnable workers. Generally, work items are not expected to
|
||||||
|
hog a CPU and consume many cycles. That means maintaining just enough
|
||||||
|
concurrency to prevent work processing from stalling should be
|
||||||
|
optimal. As long as there are one or more runnable workers on the
|
||||||
|
CPU, the gcwq doesn't start execution of a new work, but, when the
|
||||||
|
last running worker goes to sleep, it immediately schedules a new
|
||||||
|
worker so that the CPU doesn't sit idle while there are pending work
|
||||||
|
items. This allows using a minimal number of workers without losing
|
||||||
|
execution bandwidth.
|
||||||
|
|
||||||
|
Keeping idle workers around doesn't cost other than the memory space
|
||||||
|
for kthreads, so cmwq holds onto idle ones for a while before killing
|
||||||
|
them.
|
||||||
|
|
||||||
|
For an unbound wq, the above concurrency management doesn't apply and
|
||||||
|
the gcwq for the pseudo unbound CPU tries to start executing all work
|
||||||
|
items as soon as possible. The responsibility of regulating
|
||||||
|
concurrency level is on the users. There is also a flag to mark a
|
||||||
|
bound wq to ignore the concurrency management. Please refer to the
|
||||||
|
API section for details.
|
||||||
|
|
||||||
|
Forward progress guarantee relies on that workers can be created when
|
||||||
|
more execution contexts are necessary, which in turn is guaranteed
|
||||||
|
through the use of rescue workers. All work items which might be used
|
||||||
|
on code paths that handle memory reclaim are required to be queued on
|
||||||
|
wq's that have a rescue-worker reserved for execution under memory
|
||||||
|
pressure. Else it is possible that the thread-pool deadlocks waiting
|
||||||
|
for execution contexts to free up.
|
||||||
|
|
||||||
|
|
||||||
|
4. Application Programming Interface (API)
|
||||||
|
|
||||||
|
alloc_workqueue() allocates a wq. The original create_*workqueue()
|
||||||
|
functions are deprecated and scheduled for removal. alloc_workqueue()
|
||||||
|
takes three arguments - @name, @flags and @max_active. @name is the
|
||||||
|
name of the wq and also used as the name of the rescuer thread if
|
||||||
|
there is one.
|
||||||
|
|
||||||
|
A wq no longer manages execution resources but serves as a domain for
|
||||||
|
forward progress guarantee, flush and work item attributes. @flags
|
||||||
|
and @max_active control how work items are assigned execution
|
||||||
|
resources, scheduled and executed.
|
||||||
|
|
||||||
|
@flags:
|
||||||
|
|
||||||
|
WQ_NON_REENTRANT
|
||||||
|
|
||||||
|
By default, a wq guarantees non-reentrance only on the same
|
||||||
|
CPU. A work item may not be executed concurrently on the same
|
||||||
|
CPU by multiple workers but is allowed to be executed
|
||||||
|
concurrently on multiple CPUs. This flag makes sure
|
||||||
|
non-reentrance is enforced across all CPUs. Work items queued
|
||||||
|
to a non-reentrant wq are guaranteed to be executed by at most
|
||||||
|
one worker system-wide at any given time.
|
||||||
|
|
||||||
|
WQ_UNBOUND
|
||||||
|
|
||||||
|
Work items queued to an unbound wq are served by a special
|
||||||
|
gcwq which hosts workers which are not bound to any specific
|
||||||
|
CPU. This makes the wq behave as a simple execution context
|
||||||
|
provider without concurrency management. The unbound gcwq
|
||||||
|
tries to start execution of work items as soon as possible.
|
||||||
|
Unbound wq sacrifices locality but is useful for the following
|
||||||
|
cases.
|
||||||
|
|
||||||
|
* Wide fluctuation in the concurrency level requirement is
|
||||||
|
expected and using bound wq may end up creating large number
|
||||||
|
of mostly unused workers across different CPUs as the issuer
|
||||||
|
hops through different CPUs.
|
||||||
|
|
||||||
|
* Long running CPU intensive workloads which can be better
|
||||||
|
managed by the system scheduler.
|
||||||
|
|
||||||
|
WQ_FREEZEABLE
|
||||||
|
|
||||||
|
A freezeable wq participates in the freeze phase of the system
|
||||||
|
suspend operations. Work items on the wq are drained and no
|
||||||
|
new work item starts execution until thawed.
|
||||||
|
|
||||||
|
WQ_RESCUER
|
||||||
|
|
||||||
|
All wq which might be used in the memory reclaim paths _MUST_
|
||||||
|
have this flag set. This reserves one worker exclusively for
|
||||||
|
the execution of this wq under memory pressure.
|
||||||
|
|
||||||
|
WQ_HIGHPRI
|
||||||
|
|
||||||
|
Work items of a highpri wq are queued at the head of the
|
||||||
|
worklist of the target gcwq and start execution regardless of
|
||||||
|
the current concurrency level. In other words, highpri work
|
||||||
|
items will always start execution as soon as execution
|
||||||
|
resource is available.
|
||||||
|
|
||||||
|
Ordering among highpri work items is preserved - a highpri
|
||||||
|
work item queued after another highpri work item will start
|
||||||
|
execution after the earlier highpri work item starts.
|
||||||
|
|
||||||
|
Although highpri work items are not held back by other
|
||||||
|
runnable work items, they still contribute to the concurrency
|
||||||
|
level. Highpri work items in runnable state will prevent
|
||||||
|
non-highpri work items from starting execution.
|
||||||
|
|
||||||
|
This flag is meaningless for unbound wq.
|
||||||
|
|
||||||
|
WQ_CPU_INTENSIVE
|
||||||
|
|
||||||
|
Work items of a CPU intensive wq do not contribute to the
|
||||||
|
concurrency level. In other words, runnable CPU intensive
|
||||||
|
work items will not prevent other work items from starting
|
||||||
|
execution. This is useful for bound work items which are
|
||||||
|
expected to hog CPU cycles so that their execution is
|
||||||
|
regulated by the system scheduler.
|
||||||
|
|
||||||
|
Although CPU intensive work items don't contribute to the
|
||||||
|
concurrency level, start of their executions is still
|
||||||
|
regulated by the concurrency management and runnable
|
||||||
|
non-CPU-intensive work items can delay execution of CPU
|
||||||
|
intensive work items.
|
||||||
|
|
||||||
|
This flag is meaningless for unbound wq.
|
||||||
|
|
||||||
|
WQ_HIGHPRI | WQ_CPU_INTENSIVE
|
||||||
|
|
||||||
|
This combination makes the wq avoid interaction with
|
||||||
|
concurrency management completely and behave as a simple
|
||||||
|
per-CPU execution context provider. Work items queued on a
|
||||||
|
highpri CPU-intensive wq start execution as soon as resources
|
||||||
|
are available and don't affect execution of other work items.
|
||||||
|
|
||||||
|
@max_active:
|
||||||
|
|
||||||
|
@max_active determines the maximum number of execution contexts per
|
||||||
|
CPU which can be assigned to the work items of a wq. For example,
|
||||||
|
with @max_active of 16, at most 16 work items of the wq can be
|
||||||
|
executing at the same time per CPU.
|
||||||
|
|
||||||
|
Currently, for a bound wq, the maximum limit for @max_active is 512
|
||||||
|
and the default value used when 0 is specified is 256. For an unbound
|
||||||
|
wq, the limit is higher of 512 and 4 * num_possible_cpus(). These
|
||||||
|
values are chosen sufficiently high such that they are not the
|
||||||
|
limiting factor while providing protection in runaway cases.
|
||||||
|
|
||||||
|
The number of active work items of a wq is usually regulated by the
|
||||||
|
users of the wq, more specifically, by how many work items the users
|
||||||
|
may queue at the same time. Unless there is a specific need for
|
||||||
|
throttling the number of active work items, specifying '0' is
|
||||||
|
recommended.
|
||||||
|
|
||||||
|
Some users depend on the strict execution ordering of ST wq. The
|
||||||
|
combination of @max_active of 1 and WQ_UNBOUND is used to achieve this
|
||||||
|
behavior. Work items on such wq are always queued to the unbound gcwq
|
||||||
|
and only one work item can be active at any given time thus achieving
|
||||||
|
the same ordering property as ST wq.
|
||||||
|
|
||||||
|
|
||||||
|
5. Example Execution Scenarios
|
||||||
|
|
||||||
|
The following example execution scenarios try to illustrate how cmwq
|
||||||
|
behave under different configurations.
|
||||||
|
|
||||||
|
Work items w0, w1, w2 are queued to a bound wq q0 on the same CPU.
|
||||||
|
w0 burns CPU for 5ms then sleeps for 10ms then burns CPU for 5ms
|
||||||
|
again before finishing. w1 and w2 burn CPU for 5ms then sleep for
|
||||||
|
10ms.
|
||||||
|
|
||||||
|
Ignoring all other tasks, works and processing overhead, and assuming
|
||||||
|
simple FIFO scheduling, the following is one highly simplified version
|
||||||
|
of possible sequences of events with the original wq.
|
||||||
|
|
||||||
|
TIME IN MSECS EVENT
|
||||||
|
0 w0 starts and burns CPU
|
||||||
|
5 w0 sleeps
|
||||||
|
15 w0 wakes up and burns CPU
|
||||||
|
20 w0 finishes
|
||||||
|
20 w1 starts and burns CPU
|
||||||
|
25 w1 sleeps
|
||||||
|
35 w1 wakes up and finishes
|
||||||
|
35 w2 starts and burns CPU
|
||||||
|
40 w2 sleeps
|
||||||
|
50 w2 wakes up and finishes
|
||||||
|
|
||||||
|
And with cmwq with @max_active >= 3,
|
||||||
|
|
||||||
|
TIME IN MSECS EVENT
|
||||||
|
0 w0 starts and burns CPU
|
||||||
|
5 w0 sleeps
|
||||||
|
5 w1 starts and burns CPU
|
||||||
|
10 w1 sleeps
|
||||||
|
10 w2 starts and burns CPU
|
||||||
|
15 w2 sleeps
|
||||||
|
15 w0 wakes up and burns CPU
|
||||||
|
20 w0 finishes
|
||||||
|
20 w1 wakes up and finishes
|
||||||
|
25 w2 wakes up and finishes
|
||||||
|
|
||||||
|
If @max_active == 2,
|
||||||
|
|
||||||
|
TIME IN MSECS EVENT
|
||||||
|
0 w0 starts and burns CPU
|
||||||
|
5 w0 sleeps
|
||||||
|
5 w1 starts and burns CPU
|
||||||
|
10 w1 sleeps
|
||||||
|
15 w0 wakes up and burns CPU
|
||||||
|
20 w0 finishes
|
||||||
|
20 w1 wakes up and finishes
|
||||||
|
20 w2 starts and burns CPU
|
||||||
|
25 w2 sleeps
|
||||||
|
35 w2 wakes up and finishes
|
||||||
|
|
||||||
|
Now, let's assume w1 and w2 are queued to a different wq q1 which has
|
||||||
|
WQ_HIGHPRI set,
|
||||||
|
|
||||||
|
TIME IN MSECS EVENT
|
||||||
|
0 w1 and w2 start and burn CPU
|
||||||
|
5 w1 sleeps
|
||||||
|
10 w2 sleeps
|
||||||
|
10 w0 starts and burns CPU
|
||||||
|
15 w0 sleeps
|
||||||
|
15 w1 wakes up and finishes
|
||||||
|
20 w2 wakes up and finishes
|
||||||
|
25 w0 wakes up and burns CPU
|
||||||
|
30 w0 finishes
|
||||||
|
|
||||||
|
If q1 has WQ_CPU_INTENSIVE set,
|
||||||
|
|
||||||
|
TIME IN MSECS EVENT
|
||||||
|
0 w0 starts and burns CPU
|
||||||
|
5 w0 sleeps
|
||||||
|
5 w1 and w2 start and burn CPU
|
||||||
|
10 w1 sleeps
|
||||||
|
15 w2 sleeps
|
||||||
|
15 w0 wakes up and burns CPU
|
||||||
|
20 w0 finishes
|
||||||
|
20 w1 wakes up and finishes
|
||||||
|
25 w2 wakes up and finishes
|
||||||
|
|
||||||
|
|
||||||
|
6. Guidelines
|
||||||
|
|
||||||
|
* Do not forget to use WQ_RESCUER if a wq may process work items which
|
||||||
|
are used during memory reclaim. Each wq with WQ_RESCUER set has one
|
||||||
|
rescuer thread reserved for it. If there is dependency among
|
||||||
|
multiple work items used during memory reclaim, they should be
|
||||||
|
queued to separate wq each with WQ_RESCUER.
|
||||||
|
|
||||||
|
* Unless strict ordering is required, there is no need to use ST wq.
|
||||||
|
|
||||||
|
* Unless there is a specific need, using 0 for @max_active is
|
||||||
|
recommended. In most use cases, concurrency level usually stays
|
||||||
|
well under the default limit.
|
||||||
|
|
||||||
|
* A wq serves as a domain for forward progress guarantee (WQ_RESCUER),
|
||||||
|
flush and work item attributes. Work items which are not involved
|
||||||
|
in memory reclaim and don't need to be flushed as a part of a group
|
||||||
|
of work items, and don't require any special attribute, can use one
|
||||||
|
of the system wq. There is no difference in execution
|
||||||
|
characteristics between using a dedicated wq and a system wq.
|
||||||
|
|
||||||
|
* Unless work items are expected to consume a huge amount of CPU
|
||||||
|
cycles, using a bound wq is usually beneficial due to the increased
|
||||||
|
level of locality in wq operations and work item execution.
|
59
MAINTAINERS
59
MAINTAINERS
|
@ -962,6 +962,13 @@ W: http://www.fluff.org/ben/linux/
|
||||||
S: Maintained
|
S: Maintained
|
||||||
F: arch/arm/mach-s3c6410/
|
F: arch/arm/mach-s3c6410/
|
||||||
|
|
||||||
|
ARM/S5P ARM ARCHITECTURES
|
||||||
|
M: Kukjin Kim <kgene.kim@samsung.com>
|
||||||
|
L: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
|
||||||
|
L: linux-samsung-soc@vger.kernel.org (moderated for non-subscribers)
|
||||||
|
S: Maintained
|
||||||
|
F: arch/arm/mach-s5p*/
|
||||||
|
|
||||||
ARM/SHMOBILE ARM ARCHITECTURE
|
ARM/SHMOBILE ARM ARCHITECTURE
|
||||||
M: Paul Mundt <lethal@linux-sh.org>
|
M: Paul Mundt <lethal@linux-sh.org>
|
||||||
M: Magnus Damm <magnus.damm@gmail.com>
|
M: Magnus Damm <magnus.damm@gmail.com>
|
||||||
|
@ -1135,7 +1142,7 @@ ATLX ETHERNET DRIVERS
|
||||||
M: Jay Cliburn <jcliburn@gmail.com>
|
M: Jay Cliburn <jcliburn@gmail.com>
|
||||||
M: Chris Snook <chris.snook@gmail.com>
|
M: Chris Snook <chris.snook@gmail.com>
|
||||||
M: Jie Yang <jie.yang@atheros.com>
|
M: Jie Yang <jie.yang@atheros.com>
|
||||||
L: atl1-devel@lists.sourceforge.net
|
L: netdev@vger.kernel.org
|
||||||
W: http://sourceforge.net/projects/atl1
|
W: http://sourceforge.net/projects/atl1
|
||||||
W: http://atl1.sourceforge.net
|
W: http://atl1.sourceforge.net
|
||||||
S: Maintained
|
S: Maintained
|
||||||
|
@ -1220,7 +1227,7 @@ F: drivers/auxdisplay/
|
||||||
F: include/linux/cfag12864b.h
|
F: include/linux/cfag12864b.h
|
||||||
|
|
||||||
AVR32 ARCHITECTURE
|
AVR32 ARCHITECTURE
|
||||||
M: Haavard Skinnemoen <hskinnemoen@atmel.com>
|
M: Hans-Christian Egtvedt <hans-christian.egtvedt@atmel.com>
|
||||||
W: http://www.atmel.com/products/AVR32/
|
W: http://www.atmel.com/products/AVR32/
|
||||||
W: http://avr32linux.org/
|
W: http://avr32linux.org/
|
||||||
W: http://avrfreaks.net/
|
W: http://avrfreaks.net/
|
||||||
|
@ -1228,7 +1235,7 @@ S: Supported
|
||||||
F: arch/avr32/
|
F: arch/avr32/
|
||||||
|
|
||||||
AVR32/AT32AP MACHINE SUPPORT
|
AVR32/AT32AP MACHINE SUPPORT
|
||||||
M: Haavard Skinnemoen <hskinnemoen@atmel.com>
|
M: Hans-Christian Egtvedt <hans-christian.egtvedt@atmel.com>
|
||||||
S: Supported
|
S: Supported
|
||||||
F: arch/avr32/mach-at32ap/
|
F: arch/avr32/mach-at32ap/
|
||||||
|
|
||||||
|
@ -1445,6 +1452,16 @@ S: Maintained
|
||||||
F: Documentation/video4linux/cafe_ccic
|
F: Documentation/video4linux/cafe_ccic
|
||||||
F: drivers/media/video/cafe_ccic*
|
F: drivers/media/video/cafe_ccic*
|
||||||
|
|
||||||
|
CAIF NETWORK LAYER
|
||||||
|
M: Sjur Braendeland <sjur.brandeland@stericsson.com>
|
||||||
|
L: netdev@vger.kernel.org
|
||||||
|
S: Supported
|
||||||
|
F: Documentation/networking/caif/
|
||||||
|
F: drivers/net/caif/
|
||||||
|
F: include/linux/caif/
|
||||||
|
F: include/net/caif/
|
||||||
|
F: net/caif/
|
||||||
|
|
||||||
CALGARY x86-64 IOMMU
|
CALGARY x86-64 IOMMU
|
||||||
M: Muli Ben-Yehuda <muli@il.ibm.com>
|
M: Muli Ben-Yehuda <muli@il.ibm.com>
|
||||||
M: "Jon D. Mason" <jdmason@kudzu.us>
|
M: "Jon D. Mason" <jdmason@kudzu.us>
|
||||||
|
@ -2189,6 +2206,12 @@ W: http://acpi4asus.sf.net
|
||||||
S: Maintained
|
S: Maintained
|
||||||
F: drivers/platform/x86/eeepc-laptop.c
|
F: drivers/platform/x86/eeepc-laptop.c
|
||||||
|
|
||||||
|
EFIFB FRAMEBUFFER DRIVER
|
||||||
|
L: linux-fbdev@vger.kernel.org
|
||||||
|
M: Peter Jones <pjones@redhat.com>
|
||||||
|
S: Maintained
|
||||||
|
F: drivers/video/efifb.c
|
||||||
|
|
||||||
EFS FILESYSTEM
|
EFS FILESYSTEM
|
||||||
W: http://aeschi.ch.eu.org/efs/
|
W: http://aeschi.ch.eu.org/efs/
|
||||||
S: Orphan
|
S: Orphan
|
||||||
|
@ -2647,9 +2670,14 @@ S: Maintained
|
||||||
F: drivers/media/video/gspca/
|
F: drivers/media/video/gspca/
|
||||||
|
|
||||||
HARDWARE MONITORING
|
HARDWARE MONITORING
|
||||||
|
M: Jean Delvare <khali@linux-fr.org>
|
||||||
|
M: Guenter Roeck <guenter.roeck@ericsson.com>
|
||||||
L: lm-sensors@lm-sensors.org
|
L: lm-sensors@lm-sensors.org
|
||||||
W: http://www.lm-sensors.org/
|
W: http://www.lm-sensors.org/
|
||||||
S: Orphan
|
T: quilt kernel.org/pub/linux/kernel/people/jdelvare/linux-2.6/jdelvare-hwmon/
|
||||||
|
T: quilt kernel.org/pub/linux/kernel/people/groeck/linux-staging/
|
||||||
|
T: git git://git.kernel.org/pub/scm/linux/kernel/git/groeck/linux-staging.git
|
||||||
|
S: Maintained
|
||||||
F: Documentation/hwmon/
|
F: Documentation/hwmon/
|
||||||
F: drivers/hwmon/
|
F: drivers/hwmon/
|
||||||
F: include/linux/hwmon*.h
|
F: include/linux/hwmon*.h
|
||||||
|
@ -3760,9 +3788,8 @@ W: http://www.syskonnect.com
|
||||||
S: Supported
|
S: Supported
|
||||||
|
|
||||||
MATROX FRAMEBUFFER DRIVER
|
MATROX FRAMEBUFFER DRIVER
|
||||||
M: Petr Vandrovec <vandrove@vc.cvut.cz>
|
|
||||||
L: linux-fbdev@vger.kernel.org
|
L: linux-fbdev@vger.kernel.org
|
||||||
S: Maintained
|
S: Orphan
|
||||||
F: drivers/video/matrox/matroxfb_*
|
F: drivers/video/matrox/matroxfb_*
|
||||||
F: include/linux/matroxfb.h
|
F: include/linux/matroxfb.h
|
||||||
|
|
||||||
|
@ -3886,10 +3913,8 @@ F: Documentation/serial/moxa-smartio
|
||||||
F: drivers/char/mxser.*
|
F: drivers/char/mxser.*
|
||||||
|
|
||||||
MSI LAPTOP SUPPORT
|
MSI LAPTOP SUPPORT
|
||||||
M: Lennart Poettering <mzxreary@0pointer.de>
|
M: Lee, Chun-Yi <jlee@novell.com>
|
||||||
L: platform-driver-x86@vger.kernel.org
|
L: platform-driver-x86@vger.kernel.org
|
||||||
W: https://tango.0pointer.de/mailman/listinfo/s270-linux
|
|
||||||
W: http://0pointer.de/lennart/tchibo.html
|
|
||||||
S: Maintained
|
S: Maintained
|
||||||
F: drivers/platform/x86/msi-laptop.c
|
F: drivers/platform/x86/msi-laptop.c
|
||||||
|
|
||||||
|
@ -3906,8 +3931,10 @@ S: Supported
|
||||||
F: drivers/mfd/
|
F: drivers/mfd/
|
||||||
|
|
||||||
MULTIMEDIA CARD (MMC), SECURE DIGITAL (SD) AND SDIO SUBSYSTEM
|
MULTIMEDIA CARD (MMC), SECURE DIGITAL (SD) AND SDIO SUBSYSTEM
|
||||||
S: Orphan
|
M: Chris Ball <cjb@laptop.org>
|
||||||
L: linux-mmc@vger.kernel.org
|
L: linux-mmc@vger.kernel.org
|
||||||
|
T: git git://git.kernel.org/pub/scm/linux/kernel/git/cjb/mmc.git
|
||||||
|
S: Maintained
|
||||||
F: drivers/mmc/
|
F: drivers/mmc/
|
||||||
F: include/linux/mmc/
|
F: include/linux/mmc/
|
||||||
|
|
||||||
|
@ -3929,7 +3956,7 @@ F: drivers/char/isicom.c
|
||||||
F: include/linux/isicom.h
|
F: include/linux/isicom.h
|
||||||
|
|
||||||
MUSB MULTIPOINT HIGH SPEED DUAL-ROLE CONTROLLER
|
MUSB MULTIPOINT HIGH SPEED DUAL-ROLE CONTROLLER
|
||||||
M: Felipe Balbi <felipe.balbi@nokia.com>
|
M: Felipe Balbi <balbi@ti.com>
|
||||||
L: linux-usb@vger.kernel.org
|
L: linux-usb@vger.kernel.org
|
||||||
T: git git://gitorious.org/usb/usb.git
|
T: git git://gitorious.org/usb/usb.git
|
||||||
S: Maintained
|
S: Maintained
|
||||||
|
@ -3949,8 +3976,8 @@ S: Maintained
|
||||||
F: drivers/net/natsemi.c
|
F: drivers/net/natsemi.c
|
||||||
|
|
||||||
NCP FILESYSTEM
|
NCP FILESYSTEM
|
||||||
M: Petr Vandrovec <vandrove@vc.cvut.cz>
|
M: Petr Vandrovec <petr@vandrovec.name>
|
||||||
S: Maintained
|
S: Odd Fixes
|
||||||
F: fs/ncpfs/
|
F: fs/ncpfs/
|
||||||
|
|
||||||
NCR DUAL 700 SCSI DRIVER (MICROCHANNEL)
|
NCR DUAL 700 SCSI DRIVER (MICROCHANNEL)
|
||||||
|
@ -4227,7 +4254,7 @@ S: Maintained
|
||||||
F: drivers/char/hw_random/omap-rng.c
|
F: drivers/char/hw_random/omap-rng.c
|
||||||
|
|
||||||
OMAP USB SUPPORT
|
OMAP USB SUPPORT
|
||||||
M: Felipe Balbi <felipe.balbi@nokia.com>
|
M: Felipe Balbi <balbi@ti.com>
|
||||||
M: David Brownell <dbrownell@users.sourceforge.net>
|
M: David Brownell <dbrownell@users.sourceforge.net>
|
||||||
L: linux-usb@vger.kernel.org
|
L: linux-usb@vger.kernel.org
|
||||||
L: linux-omap@vger.kernel.org
|
L: linux-omap@vger.kernel.org
|
||||||
|
@ -5078,8 +5105,10 @@ S: Maintained
|
||||||
F: drivers/mmc/host/sdricoh_cs.c
|
F: drivers/mmc/host/sdricoh_cs.c
|
||||||
|
|
||||||
SECURE DIGITAL HOST CONTROLLER INTERFACE (SDHCI) DRIVER
|
SECURE DIGITAL HOST CONTROLLER INTERFACE (SDHCI) DRIVER
|
||||||
S: Orphan
|
M: Chris Ball <cjb@laptop.org>
|
||||||
L: linux-mmc@vger.kernel.org
|
L: linux-mmc@vger.kernel.org
|
||||||
|
T: git git://git.kernel.org/pub/scm/linux/kernel/git/cjb/mmc.git
|
||||||
|
S: Maintained
|
||||||
F: drivers/mmc/host/sdhci.*
|
F: drivers/mmc/host/sdhci.*
|
||||||
|
|
||||||
SECURE DIGITAL HOST CONTROLLER INTERFACE, OPEN FIRMWARE BINDINGS (SDHCI-OF)
|
SECURE DIGITAL HOST CONTROLLER INTERFACE, OPEN FIRMWARE BINDINGS (SDHCI-OF)
|
||||||
|
|
2
Makefile
2
Makefile
|
@ -1,7 +1,7 @@
|
||||||
VERSION = 2
|
VERSION = 2
|
||||||
PATCHLEVEL = 6
|
PATCHLEVEL = 6
|
||||||
SUBLEVEL = 36
|
SUBLEVEL = 36
|
||||||
EXTRAVERSION = -rc3
|
EXTRAVERSION = -rc7
|
||||||
NAME = Sheep on Meth
|
NAME = Sheep on Meth
|
||||||
|
|
||||||
# *DOCUMENTATION*
|
# *DOCUMENTATION*
|
||||||
|
|
|
@ -32,8 +32,9 @@ config HAVE_OPROFILE
|
||||||
|
|
||||||
config KPROBES
|
config KPROBES
|
||||||
bool "Kprobes"
|
bool "Kprobes"
|
||||||
depends on KALLSYMS && MODULES
|
depends on MODULES
|
||||||
depends on HAVE_KPROBES
|
depends on HAVE_KPROBES
|
||||||
|
select KALLSYMS
|
||||||
help
|
help
|
||||||
Kprobes allows you to trap at almost any kernel address and
|
Kprobes allows you to trap at almost any kernel address and
|
||||||
execute a callback function. register_kprobe() establishes
|
execute a callback function. register_kprobe() establishes
|
||||||
|
@ -45,7 +46,6 @@ config OPTPROBES
|
||||||
def_bool y
|
def_bool y
|
||||||
depends on KPROBES && HAVE_OPTPROBES
|
depends on KPROBES && HAVE_OPTPROBES
|
||||||
depends on !PREEMPT
|
depends on !PREEMPT
|
||||||
select KALLSYMS_ALL
|
|
||||||
|
|
||||||
config HAVE_EFFICIENT_UNALIGNED_ACCESS
|
config HAVE_EFFICIENT_UNALIGNED_ACCESS
|
||||||
bool
|
bool
|
||||||
|
|
|
@ -43,6 +43,8 @@ extern void smp_imb(void);
|
||||||
/* ??? Ought to use this in arch/alpha/kernel/signal.c too. */
|
/* ??? Ought to use this in arch/alpha/kernel/signal.c too. */
|
||||||
|
|
||||||
#ifndef CONFIG_SMP
|
#ifndef CONFIG_SMP
|
||||||
|
#include <linux/sched.h>
|
||||||
|
|
||||||
extern void __load_new_mm_context(struct mm_struct *);
|
extern void __load_new_mm_context(struct mm_struct *);
|
||||||
static inline void
|
static inline void
|
||||||
flush_icache_user_range(struct vm_area_struct *vma, struct page *page,
|
flush_icache_user_range(struct vm_area_struct *vma, struct page *page,
|
||||||
|
|
|
@ -449,10 +449,13 @@
|
||||||
#define __NR_pwritev 491
|
#define __NR_pwritev 491
|
||||||
#define __NR_rt_tgsigqueueinfo 492
|
#define __NR_rt_tgsigqueueinfo 492
|
||||||
#define __NR_perf_event_open 493
|
#define __NR_perf_event_open 493
|
||||||
|
#define __NR_fanotify_init 494
|
||||||
|
#define __NR_fanotify_mark 495
|
||||||
|
#define __NR_prlimit64 496
|
||||||
|
|
||||||
#ifdef __KERNEL__
|
#ifdef __KERNEL__
|
||||||
|
|
||||||
#define NR_SYSCALLS 494
|
#define NR_SYSCALLS 497
|
||||||
|
|
||||||
#define __ARCH_WANT_IPC_PARSE_VERSION
|
#define __ARCH_WANT_IPC_PARSE_VERSION
|
||||||
#define __ARCH_WANT_OLD_READDIR
|
#define __ARCH_WANT_OLD_READDIR
|
||||||
|
@ -463,6 +466,7 @@
|
||||||
#define __ARCH_WANT_SYS_OLD_GETRLIMIT
|
#define __ARCH_WANT_SYS_OLD_GETRLIMIT
|
||||||
#define __ARCH_WANT_SYS_OLDUMOUNT
|
#define __ARCH_WANT_SYS_OLDUMOUNT
|
||||||
#define __ARCH_WANT_SYS_SIGPENDING
|
#define __ARCH_WANT_SYS_SIGPENDING
|
||||||
|
#define __ARCH_WANT_SYS_RT_SIGSUSPEND
|
||||||
|
|
||||||
/* "Conditional" syscalls. What we want is
|
/* "Conditional" syscalls. What we want is
|
||||||
|
|
||||||
|
|
|
@ -73,8 +73,6 @@
|
||||||
ldq $20, HAE_REG($19); \
|
ldq $20, HAE_REG($19); \
|
||||||
stq $21, HAE_CACHE($19); \
|
stq $21, HAE_CACHE($19); \
|
||||||
stq $21, 0($20); \
|
stq $21, 0($20); \
|
||||||
ldq $0, 0($sp); \
|
|
||||||
ldq $1, 8($sp); \
|
|
||||||
99:; \
|
99:; \
|
||||||
ldq $19, 72($sp); \
|
ldq $19, 72($sp); \
|
||||||
ldq $20, 80($sp); \
|
ldq $20, 80($sp); \
|
||||||
|
@ -316,19 +314,24 @@ ret_from_sys_call:
|
||||||
cmovne $26, 0, $19 /* $19 = 0 => non-restartable */
|
cmovne $26, 0, $19 /* $19 = 0 => non-restartable */
|
||||||
ldq $0, SP_OFF($sp)
|
ldq $0, SP_OFF($sp)
|
||||||
and $0, 8, $0
|
and $0, 8, $0
|
||||||
beq $0, restore_all
|
beq $0, ret_to_kernel
|
||||||
ret_from_reschedule:
|
ret_to_user:
|
||||||
/* Make sure need_resched and sigpending don't change between
|
/* Make sure need_resched and sigpending don't change between
|
||||||
sampling and the rti. */
|
sampling and the rti. */
|
||||||
lda $16, 7
|
lda $16, 7
|
||||||
call_pal PAL_swpipl
|
call_pal PAL_swpipl
|
||||||
ldl $5, TI_FLAGS($8)
|
ldl $5, TI_FLAGS($8)
|
||||||
and $5, _TIF_WORK_MASK, $2
|
and $5, _TIF_WORK_MASK, $2
|
||||||
bne $5, work_pending
|
bne $2, work_pending
|
||||||
restore_all:
|
restore_all:
|
||||||
RESTORE_ALL
|
RESTORE_ALL
|
||||||
call_pal PAL_rti
|
call_pal PAL_rti
|
||||||
|
|
||||||
|
ret_to_kernel:
|
||||||
|
lda $16, 7
|
||||||
|
call_pal PAL_swpipl
|
||||||
|
br restore_all
|
||||||
|
|
||||||
.align 3
|
.align 3
|
||||||
$syscall_error:
|
$syscall_error:
|
||||||
/*
|
/*
|
||||||
|
@ -363,7 +366,7 @@ $ret_success:
|
||||||
* $8: current.
|
* $8: current.
|
||||||
* $19: The old syscall number, or zero if this is not a return
|
* $19: The old syscall number, or zero if this is not a return
|
||||||
* from a syscall that errored and is possibly restartable.
|
* from a syscall that errored and is possibly restartable.
|
||||||
* $20: Error indication.
|
* $20: The old a3 value
|
||||||
*/
|
*/
|
||||||
|
|
||||||
.align 4
|
.align 4
|
||||||
|
@ -392,12 +395,18 @@ $work_resched:
|
||||||
|
|
||||||
$work_notifysig:
|
$work_notifysig:
|
||||||
mov $sp, $16
|
mov $sp, $16
|
||||||
br $1, do_switch_stack
|
bsr $1, do_switch_stack
|
||||||
mov $sp, $17
|
mov $sp, $17
|
||||||
mov $5, $18
|
mov $5, $18
|
||||||
|
mov $19, $9 /* save old syscall number */
|
||||||
|
mov $20, $10 /* save old a3 */
|
||||||
|
and $5, _TIF_SIGPENDING, $2
|
||||||
|
cmovne $2, 0, $9 /* we don't want double syscall restarts */
|
||||||
jsr $26, do_notify_resume
|
jsr $26, do_notify_resume
|
||||||
|
mov $9, $19
|
||||||
|
mov $10, $20
|
||||||
bsr $1, undo_switch_stack
|
bsr $1, undo_switch_stack
|
||||||
br restore_all
|
br ret_to_user
|
||||||
.end work_pending
|
.end work_pending
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -430,6 +439,7 @@ strace:
|
||||||
beq $1, 1f
|
beq $1, 1f
|
||||||
ldq $27, 0($2)
|
ldq $27, 0($2)
|
||||||
1: jsr $26, ($27), sys_gettimeofday
|
1: jsr $26, ($27), sys_gettimeofday
|
||||||
|
ret_from_straced:
|
||||||
ldgp $gp, 0($26)
|
ldgp $gp, 0($26)
|
||||||
|
|
||||||
/* check return.. */
|
/* check return.. */
|
||||||
|
@ -650,7 +660,7 @@ kernel_thread:
|
||||||
/* We don't actually care for a3 success widgetry in the kernel.
|
/* We don't actually care for a3 success widgetry in the kernel.
|
||||||
Not for positive errno values. */
|
Not for positive errno values. */
|
||||||
stq $0, 0($sp) /* $0 */
|
stq $0, 0($sp) /* $0 */
|
||||||
br restore_all
|
br ret_to_kernel
|
||||||
.end kernel_thread
|
.end kernel_thread
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -757,11 +767,15 @@ sys_vfork:
|
||||||
.ent sys_sigreturn
|
.ent sys_sigreturn
|
||||||
sys_sigreturn:
|
sys_sigreturn:
|
||||||
.prologue 0
|
.prologue 0
|
||||||
|
lda $9, ret_from_straced
|
||||||
|
cmpult $26, $9, $9
|
||||||
mov $sp, $17
|
mov $sp, $17
|
||||||
lda $18, -SWITCH_STACK_SIZE($sp)
|
lda $18, -SWITCH_STACK_SIZE($sp)
|
||||||
lda $sp, -SWITCH_STACK_SIZE($sp)
|
lda $sp, -SWITCH_STACK_SIZE($sp)
|
||||||
jsr $26, do_sigreturn
|
jsr $26, do_sigreturn
|
||||||
br $1, undo_switch_stack
|
bne $9, 1f
|
||||||
|
jsr $26, syscall_trace
|
||||||
|
1: br $1, undo_switch_stack
|
||||||
br ret_from_sys_call
|
br ret_from_sys_call
|
||||||
.end sys_sigreturn
|
.end sys_sigreturn
|
||||||
|
|
||||||
|
@ -770,46 +784,18 @@ sys_sigreturn:
|
||||||
.ent sys_rt_sigreturn
|
.ent sys_rt_sigreturn
|
||||||
sys_rt_sigreturn:
|
sys_rt_sigreturn:
|
||||||
.prologue 0
|
.prologue 0
|
||||||
|
lda $9, ret_from_straced
|
||||||
|
cmpult $26, $9, $9
|
||||||
mov $sp, $17
|
mov $sp, $17
|
||||||
lda $18, -SWITCH_STACK_SIZE($sp)
|
lda $18, -SWITCH_STACK_SIZE($sp)
|
||||||
lda $sp, -SWITCH_STACK_SIZE($sp)
|
lda $sp, -SWITCH_STACK_SIZE($sp)
|
||||||
jsr $26, do_rt_sigreturn
|
jsr $26, do_rt_sigreturn
|
||||||
br $1, undo_switch_stack
|
bne $9, 1f
|
||||||
|
jsr $26, syscall_trace
|
||||||
|
1: br $1, undo_switch_stack
|
||||||
br ret_from_sys_call
|
br ret_from_sys_call
|
||||||
.end sys_rt_sigreturn
|
.end sys_rt_sigreturn
|
||||||
|
|
||||||
.align 4
|
|
||||||
.globl sys_sigsuspend
|
|
||||||
.ent sys_sigsuspend
|
|
||||||
sys_sigsuspend:
|
|
||||||
.prologue 0
|
|
||||||
mov $sp, $17
|
|
||||||
br $1, do_switch_stack
|
|
||||||
mov $sp, $18
|
|
||||||
subq $sp, 16, $sp
|
|
||||||
stq $26, 0($sp)
|
|
||||||
jsr $26, do_sigsuspend
|
|
||||||
ldq $26, 0($sp)
|
|
||||||
lda $sp, SWITCH_STACK_SIZE+16($sp)
|
|
||||||
ret
|
|
||||||
.end sys_sigsuspend
|
|
||||||
|
|
||||||
.align 4
|
|
||||||
.globl sys_rt_sigsuspend
|
|
||||||
.ent sys_rt_sigsuspend
|
|
||||||
sys_rt_sigsuspend:
|
|
||||||
.prologue 0
|
|
||||||
mov $sp, $18
|
|
||||||
br $1, do_switch_stack
|
|
||||||
mov $sp, $19
|
|
||||||
subq $sp, 16, $sp
|
|
||||||
stq $26, 0($sp)
|
|
||||||
jsr $26, do_rt_sigsuspend
|
|
||||||
ldq $26, 0($sp)
|
|
||||||
lda $sp, SWITCH_STACK_SIZE+16($sp)
|
|
||||||
ret
|
|
||||||
.end sys_rt_sigsuspend
|
|
||||||
|
|
||||||
.align 4
|
.align 4
|
||||||
.globl sys_sethae
|
.globl sys_sethae
|
||||||
.ent sys_sethae
|
.ent sys_sethae
|
||||||
|
@ -928,15 +914,6 @@ sys_execve:
|
||||||
jmp $31, do_sys_execve
|
jmp $31, do_sys_execve
|
||||||
.end sys_execve
|
.end sys_execve
|
||||||
|
|
||||||
.align 4
|
|
||||||
.globl osf_sigprocmask
|
|
||||||
.ent osf_sigprocmask
|
|
||||||
osf_sigprocmask:
|
|
||||||
.prologue 0
|
|
||||||
mov $sp, $18
|
|
||||||
jmp $31, sys_osf_sigprocmask
|
|
||||||
.end osf_sigprocmask
|
|
||||||
|
|
||||||
.align 4
|
.align 4
|
||||||
.globl alpha_ni_syscall
|
.globl alpha_ni_syscall
|
||||||
.ent alpha_ni_syscall
|
.ent alpha_ni_syscall
|
||||||
|
|
|
@ -90,11 +90,13 @@ static int
|
||||||
ev6_parse_cbox(u64 c_addr, u64 c1_syn, u64 c2_syn,
|
ev6_parse_cbox(u64 c_addr, u64 c1_syn, u64 c2_syn,
|
||||||
u64 c_stat, u64 c_sts, int print)
|
u64 c_stat, u64 c_sts, int print)
|
||||||
{
|
{
|
||||||
char *sourcename[] = { "UNKNOWN", "UNKNOWN", "UNKNOWN",
|
static const char * const sourcename[] = {
|
||||||
"MEMORY", "BCACHE", "DCACHE",
|
"UNKNOWN", "UNKNOWN", "UNKNOWN",
|
||||||
"BCACHE PROBE", "BCACHE PROBE" };
|
"MEMORY", "BCACHE", "DCACHE",
|
||||||
char *streamname[] = { "D", "I" };
|
"BCACHE PROBE", "BCACHE PROBE"
|
||||||
char *bitsname[] = { "SINGLE", "DOUBLE" };
|
};
|
||||||
|
static const char * const streamname[] = { "D", "I" };
|
||||||
|
static const char * const bitsname[] = { "SINGLE", "DOUBLE" };
|
||||||
int status = MCHK_DISPOSITION_REPORT;
|
int status = MCHK_DISPOSITION_REPORT;
|
||||||
int source = -1, stream = -1, bits = -1;
|
int source = -1, stream = -1, bits = -1;
|
||||||
|
|
||||||
|
|
|
@ -589,22 +589,23 @@ marvel_print_pox_spl_cmplt(u64 spl_cmplt)
|
||||||
static void
|
static void
|
||||||
marvel_print_pox_trans_sum(u64 trans_sum)
|
marvel_print_pox_trans_sum(u64 trans_sum)
|
||||||
{
|
{
|
||||||
char *pcix_cmd[] = { "Interrupt Acknowledge",
|
static const char * const pcix_cmd[] = {
|
||||||
"Special Cycle",
|
"Interrupt Acknowledge",
|
||||||
"I/O Read",
|
"Special Cycle",
|
||||||
"I/O Write",
|
"I/O Read",
|
||||||
"Reserved",
|
"I/O Write",
|
||||||
"Reserved / Device ID Message",
|
"Reserved",
|
||||||
"Memory Read",
|
"Reserved / Device ID Message",
|
||||||
"Memory Write",
|
"Memory Read",
|
||||||
"Reserved / Alias to Memory Read Block",
|
"Memory Write",
|
||||||
"Reserved / Alias to Memory Write Block",
|
"Reserved / Alias to Memory Read Block",
|
||||||
"Configuration Read",
|
"Reserved / Alias to Memory Write Block",
|
||||||
"Configuration Write",
|
"Configuration Read",
|
||||||
"Memory Read Multiple / Split Completion",
|
"Configuration Write",
|
||||||
"Dual Address Cycle",
|
"Memory Read Multiple / Split Completion",
|
||||||
"Memory Read Line / Memory Read Block",
|
"Dual Address Cycle",
|
||||||
"Memory Write and Invalidate / Memory Write Block"
|
"Memory Read Line / Memory Read Block",
|
||||||
|
"Memory Write and Invalidate / Memory Write Block"
|
||||||
};
|
};
|
||||||
|
|
||||||
#define IO7__POX_TRANSUM__PCI_ADDR__S (0)
|
#define IO7__POX_TRANSUM__PCI_ADDR__S (0)
|
||||||
|
|
|
@ -75,8 +75,12 @@ titan_parse_p_serror(int which, u64 serror, int print)
|
||||||
int status = MCHK_DISPOSITION_REPORT;
|
int status = MCHK_DISPOSITION_REPORT;
|
||||||
|
|
||||||
#ifdef CONFIG_VERBOSE_MCHECK
|
#ifdef CONFIG_VERBOSE_MCHECK
|
||||||
char *serror_src[] = {"GPCI", "APCI", "AGP HP", "AGP LP"};
|
static const char * const serror_src[] = {
|
||||||
char *serror_cmd[] = {"DMA Read", "DMA RMW", "SGTE Read", "Reserved"};
|
"GPCI", "APCI", "AGP HP", "AGP LP"
|
||||||
|
};
|
||||||
|
static const char * const serror_cmd[] = {
|
||||||
|
"DMA Read", "DMA RMW", "SGTE Read", "Reserved"
|
||||||
|
};
|
||||||
#endif /* CONFIG_VERBOSE_MCHECK */
|
#endif /* CONFIG_VERBOSE_MCHECK */
|
||||||
|
|
||||||
#define TITAN__PCHIP_SERROR__LOST_UECC (1UL << 0)
|
#define TITAN__PCHIP_SERROR__LOST_UECC (1UL << 0)
|
||||||
|
@ -140,14 +144,15 @@ titan_parse_p_perror(int which, int port, u64 perror, int print)
|
||||||
int status = MCHK_DISPOSITION_REPORT;
|
int status = MCHK_DISPOSITION_REPORT;
|
||||||
|
|
||||||
#ifdef CONFIG_VERBOSE_MCHECK
|
#ifdef CONFIG_VERBOSE_MCHECK
|
||||||
char *perror_cmd[] = { "Interrupt Acknowledge", "Special Cycle",
|
static const char * const perror_cmd[] = {
|
||||||
"I/O Read", "I/O Write",
|
"Interrupt Acknowledge", "Special Cycle",
|
||||||
"Reserved", "Reserved",
|
"I/O Read", "I/O Write",
|
||||||
"Memory Read", "Memory Write",
|
"Reserved", "Reserved",
|
||||||
"Reserved", "Reserved",
|
"Memory Read", "Memory Write",
|
||||||
"Configuration Read", "Configuration Write",
|
"Reserved", "Reserved",
|
||||||
"Memory Read Multiple", "Dual Address Cycle",
|
"Configuration Read", "Configuration Write",
|
||||||
"Memory Read Line","Memory Write and Invalidate"
|
"Memory Read Multiple", "Dual Address Cycle",
|
||||||
|
"Memory Read Line", "Memory Write and Invalidate"
|
||||||
};
|
};
|
||||||
#endif /* CONFIG_VERBOSE_MCHECK */
|
#endif /* CONFIG_VERBOSE_MCHECK */
|
||||||
|
|
||||||
|
@ -273,11 +278,11 @@ titan_parse_p_agperror(int which, u64 agperror, int print)
|
||||||
int cmd, len;
|
int cmd, len;
|
||||||
unsigned long addr;
|
unsigned long addr;
|
||||||
|
|
||||||
char *agperror_cmd[] = { "Read (low-priority)", "Read (high-priority)",
|
static const char * const agperror_cmd[] = {
|
||||||
"Write (low-priority)",
|
"Read (low-priority)", "Read (high-priority)",
|
||||||
"Write (high-priority)",
|
"Write (low-priority)", "Write (high-priority)",
|
||||||
"Reserved", "Reserved",
|
"Reserved", "Reserved",
|
||||||
"Flush", "Fence"
|
"Flush", "Fence"
|
||||||
};
|
};
|
||||||
#endif /* CONFIG_VERBOSE_MCHECK */
|
#endif /* CONFIG_VERBOSE_MCHECK */
|
||||||
|
|
||||||
|
|
|
@ -15,7 +15,6 @@
|
||||||
#include <linux/kernel.h>
|
#include <linux/kernel.h>
|
||||||
#include <linux/mm.h>
|
#include <linux/mm.h>
|
||||||
#include <linux/smp.h>
|
#include <linux/smp.h>
|
||||||
#include <linux/smp_lock.h>
|
|
||||||
#include <linux/stddef.h>
|
#include <linux/stddef.h>
|
||||||
#include <linux/syscalls.h>
|
#include <linux/syscalls.h>
|
||||||
#include <linux/unistd.h>
|
#include <linux/unistd.h>
|
||||||
|
@ -69,7 +68,6 @@ SYSCALL_DEFINE4(osf_set_program_attributes, unsigned long, text_start,
|
||||||
{
|
{
|
||||||
struct mm_struct *mm;
|
struct mm_struct *mm;
|
||||||
|
|
||||||
lock_kernel();
|
|
||||||
mm = current->mm;
|
mm = current->mm;
|
||||||
mm->end_code = bss_start + bss_len;
|
mm->end_code = bss_start + bss_len;
|
||||||
mm->start_brk = bss_start + bss_len;
|
mm->start_brk = bss_start + bss_len;
|
||||||
|
@ -78,7 +76,6 @@ SYSCALL_DEFINE4(osf_set_program_attributes, unsigned long, text_start,
|
||||||
printk("set_program_attributes(%lx %lx %lx %lx)\n",
|
printk("set_program_attributes(%lx %lx %lx %lx)\n",
|
||||||
text_start, text_len, bss_start, bss_len);
|
text_start, text_len, bss_start, bss_len);
|
||||||
#endif
|
#endif
|
||||||
unlock_kernel();
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -517,7 +514,6 @@ SYSCALL_DEFINE2(osf_proplist_syscall, enum pl_code, code,
|
||||||
long error;
|
long error;
|
||||||
int __user *min_buf_size_ptr;
|
int __user *min_buf_size_ptr;
|
||||||
|
|
||||||
lock_kernel();
|
|
||||||
switch (code) {
|
switch (code) {
|
||||||
case PL_SET:
|
case PL_SET:
|
||||||
if (get_user(error, &args->set.nbytes))
|
if (get_user(error, &args->set.nbytes))
|
||||||
|
@ -547,7 +543,6 @@ SYSCALL_DEFINE2(osf_proplist_syscall, enum pl_code, code,
|
||||||
error = -EOPNOTSUPP;
|
error = -EOPNOTSUPP;
|
||||||
break;
|
break;
|
||||||
};
|
};
|
||||||
unlock_kernel();
|
|
||||||
return error;
|
return error;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -594,7 +589,7 @@ SYSCALL_DEFINE2(osf_sigstack, struct sigstack __user *, uss,
|
||||||
|
|
||||||
SYSCALL_DEFINE3(osf_sysinfo, int, command, char __user *, buf, long, count)
|
SYSCALL_DEFINE3(osf_sysinfo, int, command, char __user *, buf, long, count)
|
||||||
{
|
{
|
||||||
char *sysinfo_table[] = {
|
const char *sysinfo_table[] = {
|
||||||
utsname()->sysname,
|
utsname()->sysname,
|
||||||
utsname()->nodename,
|
utsname()->nodename,
|
||||||
utsname()->release,
|
utsname()->release,
|
||||||
|
@ -606,7 +601,7 @@ SYSCALL_DEFINE3(osf_sysinfo, int, command, char __user *, buf, long, count)
|
||||||
"dummy", /* secure RPC domain */
|
"dummy", /* secure RPC domain */
|
||||||
};
|
};
|
||||||
unsigned long offset;
|
unsigned long offset;
|
||||||
char *res;
|
const char *res;
|
||||||
long len, err = -EINVAL;
|
long len, err = -EINVAL;
|
||||||
|
|
||||||
offset = command-1;
|
offset = command-1;
|
||||||
|
|
|
@ -66,7 +66,7 @@ static int pci_mmap_resource(struct kobject *kobj,
|
||||||
{
|
{
|
||||||
struct pci_dev *pdev = to_pci_dev(container_of(kobj,
|
struct pci_dev *pdev = to_pci_dev(container_of(kobj,
|
||||||
struct device, kobj));
|
struct device, kobj));
|
||||||
struct resource *res = (struct resource *)attr->private;
|
struct resource *res = attr->private;
|
||||||
enum pci_mmap_state mmap_type;
|
enum pci_mmap_state mmap_type;
|
||||||
struct pci_bus_region bar;
|
struct pci_bus_region bar;
|
||||||
int i;
|
int i;
|
||||||
|
|
|
@ -356,7 +356,7 @@ dump_elf_thread(elf_greg_t *dest, struct pt_regs *pt, struct thread_info *ti)
|
||||||
dest[27] = pt->r27;
|
dest[27] = pt->r27;
|
||||||
dest[28] = pt->r28;
|
dest[28] = pt->r28;
|
||||||
dest[29] = pt->gp;
|
dest[29] = pt->gp;
|
||||||
dest[30] = rdusp();
|
dest[30] = ti == current_thread_info() ? rdusp() : ti->pcb.usp;
|
||||||
dest[31] = pt->pc;
|
dest[31] = pt->pc;
|
||||||
|
|
||||||
/* Once upon a time this was the PS value. Which is stupid
|
/* Once upon a time this was the PS value. Which is stupid
|
||||||
|
|
|
@ -41,46 +41,20 @@ static void do_signal(struct pt_regs *, struct switch_stack *,
|
||||||
/*
|
/*
|
||||||
* The OSF/1 sigprocmask calling sequence is different from the
|
* The OSF/1 sigprocmask calling sequence is different from the
|
||||||
* C sigprocmask() sequence..
|
* C sigprocmask() sequence..
|
||||||
*
|
|
||||||
* how:
|
|
||||||
* 1 - SIG_BLOCK
|
|
||||||
* 2 - SIG_UNBLOCK
|
|
||||||
* 3 - SIG_SETMASK
|
|
||||||
*
|
|
||||||
* We change the range to -1 .. 1 in order to let gcc easily
|
|
||||||
* use the conditional move instructions.
|
|
||||||
*
|
|
||||||
* Note that we don't need to acquire the kernel lock for SMP
|
|
||||||
* operation, as all of this is local to this thread.
|
|
||||||
*/
|
*/
|
||||||
SYSCALL_DEFINE3(osf_sigprocmask, int, how, unsigned long, newmask,
|
SYSCALL_DEFINE2(osf_sigprocmask, int, how, unsigned long, newmask)
|
||||||
struct pt_regs *, regs)
|
|
||||||
{
|
{
|
||||||
unsigned long oldmask = -EINVAL;
|
sigset_t oldmask;
|
||||||
|
sigset_t mask;
|
||||||
|
unsigned long res;
|
||||||
|
|
||||||
if ((unsigned long)how-1 <= 2) {
|
siginitset(&mask, newmask & _BLOCKABLE);
|
||||||
long sign = how-2; /* -1 .. 1 */
|
res = sigprocmask(how, &mask, &oldmask);
|
||||||
unsigned long block, unblock;
|
if (!res) {
|
||||||
|
force_successful_syscall_return();
|
||||||
newmask &= _BLOCKABLE;
|
res = oldmask.sig[0];
|
||||||
spin_lock_irq(¤t->sighand->siglock);
|
|
||||||
oldmask = current->blocked.sig[0];
|
|
||||||
|
|
||||||
unblock = oldmask & ~newmask;
|
|
||||||
block = oldmask | newmask;
|
|
||||||
if (!sign)
|
|
||||||
block = unblock;
|
|
||||||
if (sign <= 0)
|
|
||||||
newmask = block;
|
|
||||||
if (_NSIG_WORDS > 1 && sign > 0)
|
|
||||||
sigemptyset(¤t->blocked);
|
|
||||||
current->blocked.sig[0] = newmask;
|
|
||||||
recalc_sigpending();
|
|
||||||
spin_unlock_irq(¤t->sighand->siglock);
|
|
||||||
|
|
||||||
regs->r0 = 0; /* special no error return */
|
|
||||||
}
|
}
|
||||||
return oldmask;
|
return res;
|
||||||
}
|
}
|
||||||
|
|
||||||
SYSCALL_DEFINE3(osf_sigaction, int, sig,
|
SYSCALL_DEFINE3(osf_sigaction, int, sig,
|
||||||
|
@ -94,9 +68,9 @@ SYSCALL_DEFINE3(osf_sigaction, int, sig,
|
||||||
old_sigset_t mask;
|
old_sigset_t mask;
|
||||||
if (!access_ok(VERIFY_READ, act, sizeof(*act)) ||
|
if (!access_ok(VERIFY_READ, act, sizeof(*act)) ||
|
||||||
__get_user(new_ka.sa.sa_handler, &act->sa_handler) ||
|
__get_user(new_ka.sa.sa_handler, &act->sa_handler) ||
|
||||||
__get_user(new_ka.sa.sa_flags, &act->sa_flags))
|
__get_user(new_ka.sa.sa_flags, &act->sa_flags) ||
|
||||||
|
__get_user(mask, &act->sa_mask))
|
||||||
return -EFAULT;
|
return -EFAULT;
|
||||||
__get_user(mask, &act->sa_mask);
|
|
||||||
siginitset(&new_ka.sa.sa_mask, mask);
|
siginitset(&new_ka.sa.sa_mask, mask);
|
||||||
new_ka.ka_restorer = NULL;
|
new_ka.ka_restorer = NULL;
|
||||||
}
|
}
|
||||||
|
@ -106,9 +80,9 @@ SYSCALL_DEFINE3(osf_sigaction, int, sig,
|
||||||
if (!ret && oact) {
|
if (!ret && oact) {
|
||||||
if (!access_ok(VERIFY_WRITE, oact, sizeof(*oact)) ||
|
if (!access_ok(VERIFY_WRITE, oact, sizeof(*oact)) ||
|
||||||
__put_user(old_ka.sa.sa_handler, &oact->sa_handler) ||
|
__put_user(old_ka.sa.sa_handler, &oact->sa_handler) ||
|
||||||
__put_user(old_ka.sa.sa_flags, &oact->sa_flags))
|
__put_user(old_ka.sa.sa_flags, &oact->sa_flags) ||
|
||||||
|
__put_user(old_ka.sa.sa_mask.sig[0], &oact->sa_mask))
|
||||||
return -EFAULT;
|
return -EFAULT;
|
||||||
__put_user(old_ka.sa.sa_mask.sig[0], &oact->sa_mask);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
|
@ -144,8 +118,7 @@ SYSCALL_DEFINE5(rt_sigaction, int, sig, const struct sigaction __user *, act,
|
||||||
/*
|
/*
|
||||||
* Atomically swap in the new signal mask, and wait for a signal.
|
* Atomically swap in the new signal mask, and wait for a signal.
|
||||||
*/
|
*/
|
||||||
asmlinkage int
|
SYSCALL_DEFINE1(sigsuspend, old_sigset_t, mask)
|
||||||
do_sigsuspend(old_sigset_t mask, struct pt_regs *regs, struct switch_stack *sw)
|
|
||||||
{
|
{
|
||||||
mask &= _BLOCKABLE;
|
mask &= _BLOCKABLE;
|
||||||
spin_lock_irq(¤t->sighand->siglock);
|
spin_lock_irq(¤t->sighand->siglock);
|
||||||
|
@ -154,41 +127,6 @@ do_sigsuspend(old_sigset_t mask, struct pt_regs *regs, struct switch_stack *sw)
|
||||||
recalc_sigpending();
|
recalc_sigpending();
|
||||||
spin_unlock_irq(¤t->sighand->siglock);
|
spin_unlock_irq(¤t->sighand->siglock);
|
||||||
|
|
||||||
/* Indicate EINTR on return from any possible signal handler,
|
|
||||||
which will not come back through here, but via sigreturn. */
|
|
||||||
regs->r0 = EINTR;
|
|
||||||
regs->r19 = 1;
|
|
||||||
|
|
||||||
current->state = TASK_INTERRUPTIBLE;
|
|
||||||
schedule();
|
|
||||||
set_thread_flag(TIF_RESTORE_SIGMASK);
|
|
||||||
return -ERESTARTNOHAND;
|
|
||||||
}
|
|
||||||
|
|
||||||
asmlinkage int
|
|
||||||
do_rt_sigsuspend(sigset_t __user *uset, size_t sigsetsize,
|
|
||||||
struct pt_regs *regs, struct switch_stack *sw)
|
|
||||||
{
|
|
||||||
sigset_t set;
|
|
||||||
|
|
||||||
/* XXX: Don't preclude handling different sized sigset_t's. */
|
|
||||||
if (sigsetsize != sizeof(sigset_t))
|
|
||||||
return -EINVAL;
|
|
||||||
if (copy_from_user(&set, uset, sizeof(set)))
|
|
||||||
return -EFAULT;
|
|
||||||
|
|
||||||
sigdelsetmask(&set, ~_BLOCKABLE);
|
|
||||||
spin_lock_irq(¤t->sighand->siglock);
|
|
||||||
current->saved_sigmask = current->blocked;
|
|
||||||
current->blocked = set;
|
|
||||||
recalc_sigpending();
|
|
||||||
spin_unlock_irq(¤t->sighand->siglock);
|
|
||||||
|
|
||||||
/* Indicate EINTR on return from any possible signal handler,
|
|
||||||
which will not come back through here, but via sigreturn. */
|
|
||||||
regs->r0 = EINTR;
|
|
||||||
regs->r19 = 1;
|
|
||||||
|
|
||||||
current->state = TASK_INTERRUPTIBLE;
|
current->state = TASK_INTERRUPTIBLE;
|
||||||
schedule();
|
schedule();
|
||||||
set_thread_flag(TIF_RESTORE_SIGMASK);
|
set_thread_flag(TIF_RESTORE_SIGMASK);
|
||||||
|
@ -239,6 +177,8 @@ restore_sigcontext(struct sigcontext __user *sc, struct pt_regs *regs,
|
||||||
unsigned long usp;
|
unsigned long usp;
|
||||||
long i, err = __get_user(regs->pc, &sc->sc_pc);
|
long i, err = __get_user(regs->pc, &sc->sc_pc);
|
||||||
|
|
||||||
|
current_thread_info()->restart_block.fn = do_no_restart_syscall;
|
||||||
|
|
||||||
sw->r26 = (unsigned long) ret_from_sys_call;
|
sw->r26 = (unsigned long) ret_from_sys_call;
|
||||||
|
|
||||||
err |= __get_user(regs->r0, sc->sc_regs+0);
|
err |= __get_user(regs->r0, sc->sc_regs+0);
|
||||||
|
@ -591,7 +531,6 @@ syscall_restart(unsigned long r0, unsigned long r19,
|
||||||
regs->pc -= 4;
|
regs->pc -= 4;
|
||||||
break;
|
break;
|
||||||
case ERESTART_RESTARTBLOCK:
|
case ERESTART_RESTARTBLOCK:
|
||||||
current_thread_info()->restart_block.fn = do_no_restart_syscall;
|
|
||||||
regs->r0 = EINTR;
|
regs->r0 = EINTR;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
|
@ -87,7 +87,7 @@ static int srm_env_proc_show(struct seq_file *m, void *v)
|
||||||
srm_env_t *entry;
|
srm_env_t *entry;
|
||||||
char *page;
|
char *page;
|
||||||
|
|
||||||
entry = (srm_env_t *)m->private;
|
entry = m->private;
|
||||||
page = (char *)__get_free_page(GFP_USER);
|
page = (char *)__get_free_page(GFP_USER);
|
||||||
if (!page)
|
if (!page)
|
||||||
return -ENOMEM;
|
return -ENOMEM;
|
||||||
|
|
|
@ -58,7 +58,7 @@ sys_call_table:
|
||||||
.quad sys_open /* 45 */
|
.quad sys_open /* 45 */
|
||||||
.quad alpha_ni_syscall
|
.quad alpha_ni_syscall
|
||||||
.quad sys_getxgid
|
.quad sys_getxgid
|
||||||
.quad osf_sigprocmask
|
.quad sys_osf_sigprocmask
|
||||||
.quad alpha_ni_syscall
|
.quad alpha_ni_syscall
|
||||||
.quad alpha_ni_syscall /* 50 */
|
.quad alpha_ni_syscall /* 50 */
|
||||||
.quad sys_acct
|
.quad sys_acct
|
||||||
|
@ -512,6 +512,9 @@ sys_call_table:
|
||||||
.quad sys_pwritev
|
.quad sys_pwritev
|
||||||
.quad sys_rt_tgsigqueueinfo
|
.quad sys_rt_tgsigqueueinfo
|
||||||
.quad sys_perf_event_open
|
.quad sys_perf_event_open
|
||||||
|
.quad sys_fanotify_init
|
||||||
|
.quad sys_fanotify_mark /* 495 */
|
||||||
|
.quad sys_prlimit64
|
||||||
|
|
||||||
.size sys_call_table, . - sys_call_table
|
.size sys_call_table, . - sys_call_table
|
||||||
.type sys_call_table, @object
|
.type sys_call_table, @object
|
||||||
|
|
|
@ -191,16 +191,16 @@ irqreturn_t timer_interrupt(int irq, void *dev)
|
||||||
|
|
||||||
write_sequnlock(&xtime_lock);
|
write_sequnlock(&xtime_lock);
|
||||||
|
|
||||||
#ifndef CONFIG_SMP
|
|
||||||
while (nticks--)
|
|
||||||
update_process_times(user_mode(get_irq_regs()));
|
|
||||||
#endif
|
|
||||||
|
|
||||||
if (test_perf_event_pending()) {
|
if (test_perf_event_pending()) {
|
||||||
clear_perf_event_pending();
|
clear_perf_event_pending();
|
||||||
perf_event_do_pending();
|
perf_event_do_pending();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifndef CONFIG_SMP
|
||||||
|
while (nticks--)
|
||||||
|
update_process_times(user_mode(get_irq_regs()));
|
||||||
|
#endif
|
||||||
|
|
||||||
return IRQ_HANDLED;
|
return IRQ_HANDLED;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -13,7 +13,6 @@
|
||||||
#include <linux/sched.h>
|
#include <linux/sched.h>
|
||||||
#include <linux/tty.h>
|
#include <linux/tty.h>
|
||||||
#include <linux/delay.h>
|
#include <linux/delay.h>
|
||||||
#include <linux/smp_lock.h>
|
|
||||||
#include <linux/module.h>
|
#include <linux/module.h>
|
||||||
#include <linux/init.h>
|
#include <linux/init.h>
|
||||||
#include <linux/kallsyms.h>
|
#include <linux/kallsyms.h>
|
||||||
|
@ -623,7 +622,6 @@ do_entUna(void * va, unsigned long opcode, unsigned long reg,
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
lock_kernel();
|
|
||||||
printk("Bad unaligned kernel access at %016lx: %p %lx %lu\n",
|
printk("Bad unaligned kernel access at %016lx: %p %lx %lu\n",
|
||||||
pc, va, opcode, reg);
|
pc, va, opcode, reg);
|
||||||
do_exit(SIGSEGV);
|
do_exit(SIGSEGV);
|
||||||
|
@ -646,7 +644,6 @@ do_entUna(void * va, unsigned long opcode, unsigned long reg,
|
||||||
* Yikes! No one to forward the exception to.
|
* Yikes! No one to forward the exception to.
|
||||||
* Since the registers are in a weird format, dump them ourselves.
|
* Since the registers are in a weird format, dump them ourselves.
|
||||||
*/
|
*/
|
||||||
lock_kernel();
|
|
||||||
|
|
||||||
printk("%s(%d): unhandled unaligned exception\n",
|
printk("%s(%d): unhandled unaligned exception\n",
|
||||||
current->comm, task_pid_nr(current));
|
current->comm, task_pid_nr(current));
|
||||||
|
|
|
@ -271,7 +271,6 @@ config ARCH_AT91
|
||||||
bool "Atmel AT91"
|
bool "Atmel AT91"
|
||||||
select ARCH_REQUIRE_GPIOLIB
|
select ARCH_REQUIRE_GPIOLIB
|
||||||
select HAVE_CLK
|
select HAVE_CLK
|
||||||
select ARCH_USES_GETTIMEOFFSET
|
|
||||||
help
|
help
|
||||||
This enables support for systems based on the Atmel AT91RM9200,
|
This enables support for systems based on the Atmel AT91RM9200,
|
||||||
AT91SAM9 and AT91CAP9 processors.
|
AT91SAM9 and AT91CAP9 processors.
|
||||||
|
@ -1051,6 +1050,32 @@ config ARM_ERRATA_460075
|
||||||
ACTLR register. Note that setting specific bits in the ACTLR register
|
ACTLR register. Note that setting specific bits in the ACTLR register
|
||||||
may not be available in non-secure mode.
|
may not be available in non-secure mode.
|
||||||
|
|
||||||
|
config ARM_ERRATA_742230
|
||||||
|
bool "ARM errata: DMB operation may be faulty"
|
||||||
|
depends on CPU_V7 && SMP
|
||||||
|
help
|
||||||
|
This option enables the workaround for the 742230 Cortex-A9
|
||||||
|
(r1p0..r2p2) erratum. Under rare circumstances, a DMB instruction
|
||||||
|
between two write operations may not ensure the correct visibility
|
||||||
|
ordering of the two writes. This workaround sets a specific bit in
|
||||||
|
the diagnostic register of the Cortex-A9 which causes the DMB
|
||||||
|
instruction to behave as a DSB, ensuring the correct behaviour of
|
||||||
|
the two writes.
|
||||||
|
|
||||||
|
config ARM_ERRATA_742231
|
||||||
|
bool "ARM errata: Incorrect hazard handling in the SCU may lead to data corruption"
|
||||||
|
depends on CPU_V7 && SMP
|
||||||
|
help
|
||||||
|
This option enables the workaround for the 742231 Cortex-A9
|
||||||
|
(r2p0..r2p2) erratum. Under certain conditions, specific to the
|
||||||
|
Cortex-A9 MPCore micro-architecture, two CPUs working in SMP mode,
|
||||||
|
accessing some data located in the same cache line, may get corrupted
|
||||||
|
data due to bad handling of the address hazard when the line gets
|
||||||
|
replaced from one of the CPUs at the same time as another CPU is
|
||||||
|
accessing it. This workaround sets specific bits in the diagnostic
|
||||||
|
register of the Cortex-A9 which reduces the linefill issuing
|
||||||
|
capabilities of the processor.
|
||||||
|
|
||||||
config PL310_ERRATA_588369
|
config PL310_ERRATA_588369
|
||||||
bool "Clean & Invalidate maintenance operations do not invalidate clean lines"
|
bool "Clean & Invalidate maintenance operations do not invalidate clean lines"
|
||||||
depends on CACHE_L2X0 && ARCH_OMAP4
|
depends on CACHE_L2X0 && ARCH_OMAP4
|
||||||
|
|
|
@ -116,5 +116,5 @@ CFLAGS_font.o := -Dstatic=
|
||||||
$(obj)/font.c: $(FONTC)
|
$(obj)/font.c: $(FONTC)
|
||||||
$(call cmd,shipped)
|
$(call cmd,shipped)
|
||||||
|
|
||||||
$(obj)/vmlinux.lds: $(obj)/vmlinux.lds.in arch/arm/boot/Makefile .config
|
$(obj)/vmlinux.lds: $(obj)/vmlinux.lds.in arch/arm/boot/Makefile $(KCONFIG_CONFIG)
|
||||||
@sed "$(SEDFLAGS)" < $< > $@
|
@sed "$(SEDFLAGS)" < $< > $@
|
||||||
|
|
|
@ -271,6 +271,14 @@ int dma_needs_bounce(struct device *dev, dma_addr_t dma_addr, size_t size)
|
||||||
((dma_addr + size - PHYS_OFFSET) >= SZ_64M);
|
((dma_addr + size - PHYS_OFFSET) >= SZ_64M);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int dma_set_coherent_mask(struct device *dev, u64 mask)
|
||||||
|
{
|
||||||
|
if (mask >= PHYS_OFFSET + SZ_64M - 1)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
return -EIO;
|
||||||
|
}
|
||||||
|
|
||||||
int __init it8152_pci_setup(int nr, struct pci_sys_data *sys)
|
int __init it8152_pci_setup(int nr, struct pci_sys_data *sys)
|
||||||
{
|
{
|
||||||
it8152_io.start = IT8152_IO_BASE + 0x12000;
|
it8152_io.start = IT8152_IO_BASE + 0x12000;
|
||||||
|
|
|
@ -317,6 +317,10 @@ static inline pte_t pte_mkspecial(pte_t pte) { return pte; }
|
||||||
#ifdef CONFIG_ARM_DMA_MEM_BUFFERABLE
|
#ifdef CONFIG_ARM_DMA_MEM_BUFFERABLE
|
||||||
#define pgprot_dmacoherent(prot) \
|
#define pgprot_dmacoherent(prot) \
|
||||||
__pgprot_modify(prot, L_PTE_MT_MASK|L_PTE_EXEC, L_PTE_MT_BUFFERABLE)
|
__pgprot_modify(prot, L_PTE_MT_MASK|L_PTE_EXEC, L_PTE_MT_BUFFERABLE)
|
||||||
|
#define __HAVE_PHYS_MEM_ACCESS_PROT
|
||||||
|
struct file;
|
||||||
|
extern pgprot_t phys_mem_access_prot(struct file *file, unsigned long pfn,
|
||||||
|
unsigned long size, pgprot_t vma_prot);
|
||||||
#else
|
#else
|
||||||
#define pgprot_dmacoherent(prot) \
|
#define pgprot_dmacoherent(prot) \
|
||||||
__pgprot_modify(prot, L_PTE_MT_MASK|L_PTE_EXEC, L_PTE_MT_UNCACHED)
|
__pgprot_modify(prot, L_PTE_MT_MASK|L_PTE_EXEC, L_PTE_MT_UNCACHED)
|
||||||
|
|
|
@ -48,6 +48,8 @@ work_pending:
|
||||||
beq no_work_pending
|
beq no_work_pending
|
||||||
mov r0, sp @ 'regs'
|
mov r0, sp @ 'regs'
|
||||||
mov r2, why @ 'syscall'
|
mov r2, why @ 'syscall'
|
||||||
|
tst r1, #_TIF_SIGPENDING @ delivering a signal?
|
||||||
|
movne why, #0 @ prevent further restarts
|
||||||
bl do_notify_resume
|
bl do_notify_resume
|
||||||
b ret_slow_syscall @ Check work again
|
b ret_slow_syscall @ Check work again
|
||||||
|
|
||||||
|
@ -418,11 +420,13 @@ ENDPROC(sys_clone_wrapper)
|
||||||
|
|
||||||
sys_sigreturn_wrapper:
|
sys_sigreturn_wrapper:
|
||||||
add r0, sp, #S_OFF
|
add r0, sp, #S_OFF
|
||||||
|
mov why, #0 @ prevent syscall restart handling
|
||||||
b sys_sigreturn
|
b sys_sigreturn
|
||||||
ENDPROC(sys_sigreturn_wrapper)
|
ENDPROC(sys_sigreturn_wrapper)
|
||||||
|
|
||||||
sys_rt_sigreturn_wrapper:
|
sys_rt_sigreturn_wrapper:
|
||||||
add r0, sp, #S_OFF
|
add r0, sp, #S_OFF
|
||||||
|
mov why, #0 @ prevent syscall restart handling
|
||||||
b sys_rt_sigreturn
|
b sys_rt_sigreturn
|
||||||
ENDPROC(sys_rt_sigreturn_wrapper)
|
ENDPROC(sys_rt_sigreturn_wrapper)
|
||||||
|
|
||||||
|
|
|
@ -121,8 +121,8 @@ static struct clk ssc1_clk = {
|
||||||
.pmc_mask = 1 << AT91SAM9G45_ID_SSC1,
|
.pmc_mask = 1 << AT91SAM9G45_ID_SSC1,
|
||||||
.type = CLK_TYPE_PERIPHERAL,
|
.type = CLK_TYPE_PERIPHERAL,
|
||||||
};
|
};
|
||||||
static struct clk tcb_clk = {
|
static struct clk tcb0_clk = {
|
||||||
.name = "tcb_clk",
|
.name = "tcb0_clk",
|
||||||
.pmc_mask = 1 << AT91SAM9G45_ID_TCB,
|
.pmc_mask = 1 << AT91SAM9G45_ID_TCB,
|
||||||
.type = CLK_TYPE_PERIPHERAL,
|
.type = CLK_TYPE_PERIPHERAL,
|
||||||
};
|
};
|
||||||
|
@ -192,6 +192,14 @@ static struct clk ohci_clk = {
|
||||||
.parent = &uhphs_clk,
|
.parent = &uhphs_clk,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/* One additional fake clock for second TC block */
|
||||||
|
static struct clk tcb1_clk = {
|
||||||
|
.name = "tcb1_clk",
|
||||||
|
.pmc_mask = 0,
|
||||||
|
.type = CLK_TYPE_PERIPHERAL,
|
||||||
|
.parent = &tcb0_clk,
|
||||||
|
};
|
||||||
|
|
||||||
static struct clk *periph_clocks[] __initdata = {
|
static struct clk *periph_clocks[] __initdata = {
|
||||||
&pioA_clk,
|
&pioA_clk,
|
||||||
&pioB_clk,
|
&pioB_clk,
|
||||||
|
@ -208,7 +216,7 @@ static struct clk *periph_clocks[] __initdata = {
|
||||||
&spi1_clk,
|
&spi1_clk,
|
||||||
&ssc0_clk,
|
&ssc0_clk,
|
||||||
&ssc1_clk,
|
&ssc1_clk,
|
||||||
&tcb_clk,
|
&tcb0_clk,
|
||||||
&pwm_clk,
|
&pwm_clk,
|
||||||
&tsc_clk,
|
&tsc_clk,
|
||||||
&dma_clk,
|
&dma_clk,
|
||||||
|
@ -221,6 +229,7 @@ static struct clk *periph_clocks[] __initdata = {
|
||||||
&mmc1_clk,
|
&mmc1_clk,
|
||||||
// irq0
|
// irq0
|
||||||
&ohci_clk,
|
&ohci_clk,
|
||||||
|
&tcb1_clk,
|
||||||
};
|
};
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
|
@ -46,7 +46,7 @@ static struct resource hdmac_resources[] = {
|
||||||
.end = AT91_BASE_SYS + AT91_DMA + SZ_512 - 1,
|
.end = AT91_BASE_SYS + AT91_DMA + SZ_512 - 1,
|
||||||
.flags = IORESOURCE_MEM,
|
.flags = IORESOURCE_MEM,
|
||||||
},
|
},
|
||||||
[2] = {
|
[1] = {
|
||||||
.start = AT91SAM9G45_ID_DMA,
|
.start = AT91SAM9G45_ID_DMA,
|
||||||
.end = AT91SAM9G45_ID_DMA,
|
.end = AT91SAM9G45_ID_DMA,
|
||||||
.flags = IORESOURCE_IRQ,
|
.flags = IORESOURCE_IRQ,
|
||||||
|
@ -426,7 +426,7 @@ static struct i2c_gpio_platform_data pdata_i2c0 = {
|
||||||
.sda_is_open_drain = 1,
|
.sda_is_open_drain = 1,
|
||||||
.scl_pin = AT91_PIN_PA21,
|
.scl_pin = AT91_PIN_PA21,
|
||||||
.scl_is_open_drain = 1,
|
.scl_is_open_drain = 1,
|
||||||
.udelay = 2, /* ~100 kHz */
|
.udelay = 5, /* ~100 kHz */
|
||||||
};
|
};
|
||||||
|
|
||||||
static struct platform_device at91sam9g45_twi0_device = {
|
static struct platform_device at91sam9g45_twi0_device = {
|
||||||
|
@ -440,7 +440,7 @@ static struct i2c_gpio_platform_data pdata_i2c1 = {
|
||||||
.sda_is_open_drain = 1,
|
.sda_is_open_drain = 1,
|
||||||
.scl_pin = AT91_PIN_PB11,
|
.scl_pin = AT91_PIN_PB11,
|
||||||
.scl_is_open_drain = 1,
|
.scl_is_open_drain = 1,
|
||||||
.udelay = 2, /* ~100 kHz */
|
.udelay = 5, /* ~100 kHz */
|
||||||
};
|
};
|
||||||
|
|
||||||
static struct platform_device at91sam9g45_twi1_device = {
|
static struct platform_device at91sam9g45_twi1_device = {
|
||||||
|
@ -835,9 +835,9 @@ static struct platform_device at91sam9g45_tcb1_device = {
|
||||||
static void __init at91_add_device_tc(void)
|
static void __init at91_add_device_tc(void)
|
||||||
{
|
{
|
||||||
/* this chip has one clock and irq for all six TC channels */
|
/* this chip has one clock and irq for all six TC channels */
|
||||||
at91_clock_associate("tcb_clk", &at91sam9g45_tcb0_device.dev, "t0_clk");
|
at91_clock_associate("tcb0_clk", &at91sam9g45_tcb0_device.dev, "t0_clk");
|
||||||
platform_device_register(&at91sam9g45_tcb0_device);
|
platform_device_register(&at91sam9g45_tcb0_device);
|
||||||
at91_clock_associate("tcb_clk", &at91sam9g45_tcb1_device.dev, "t0_clk");
|
at91_clock_associate("tcb1_clk", &at91sam9g45_tcb1_device.dev, "t0_clk");
|
||||||
platform_device_register(&at91sam9g45_tcb1_device);
|
platform_device_register(&at91sam9g45_tcb1_device);
|
||||||
}
|
}
|
||||||
#else
|
#else
|
||||||
|
|
|
@ -93,11 +93,12 @@ static struct resource dm9000_resource[] = {
|
||||||
.start = AT91_PIN_PC11,
|
.start = AT91_PIN_PC11,
|
||||||
.end = AT91_PIN_PC11,
|
.end = AT91_PIN_PC11,
|
||||||
.flags = IORESOURCE_IRQ
|
.flags = IORESOURCE_IRQ
|
||||||
|
| IORESOURCE_IRQ_LOWEDGE | IORESOURCE_IRQ_HIGHEDGE,
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
static struct dm9000_plat_data dm9000_platdata = {
|
static struct dm9000_plat_data dm9000_platdata = {
|
||||||
.flags = DM9000_PLATF_16BITONLY,
|
.flags = DM9000_PLATF_16BITONLY | DM9000_PLATF_NO_EEPROM,
|
||||||
};
|
};
|
||||||
|
|
||||||
static struct platform_device dm9000_device = {
|
static struct platform_device dm9000_device = {
|
||||||
|
@ -167,17 +168,6 @@ static struct at91_udc_data __initdata ek_udc_data = {
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
* MCI (SD/MMC)
|
|
||||||
*/
|
|
||||||
static struct at91_mmc_data __initdata ek_mmc_data = {
|
|
||||||
.wire4 = 1,
|
|
||||||
// .det_pin = ... not connected
|
|
||||||
// .wp_pin = ... not connected
|
|
||||||
// .vcc_pin = ... not connected
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* NAND flash
|
* NAND flash
|
||||||
*/
|
*/
|
||||||
|
@ -246,6 +236,10 @@ static void __init ek_add_device_nand(void)
|
||||||
at91_add_device_nand(&ek_nand_data);
|
at91_add_device_nand(&ek_nand_data);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* SPI related devices
|
||||||
|
*/
|
||||||
|
#if defined(CONFIG_SPI_ATMEL) || defined(CONFIG_SPI_ATMEL_MODULE)
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* ADS7846 Touchscreen
|
* ADS7846 Touchscreen
|
||||||
|
@ -356,6 +350,19 @@ static struct spi_board_info ek_spi_devices[] = {
|
||||||
#endif
|
#endif
|
||||||
};
|
};
|
||||||
|
|
||||||
|
#else /* CONFIG_SPI_ATMEL_* */
|
||||||
|
/* spi0 and mmc/sd share the same PIO pins: cannot be used at the same time */
|
||||||
|
|
||||||
|
/*
|
||||||
|
* MCI (SD/MMC)
|
||||||
|
* det_pin, wp_pin and vcc_pin are not connected
|
||||||
|
*/
|
||||||
|
static struct at91_mmc_data __initdata ek_mmc_data = {
|
||||||
|
.wire4 = 1,
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif /* CONFIG_SPI_ATMEL_* */
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* LCD Controller
|
* LCD Controller
|
||||||
|
|
|
@ -501,7 +501,8 @@ postcore_initcall(at91_clk_debugfs_init);
|
||||||
int __init clk_register(struct clk *clk)
|
int __init clk_register(struct clk *clk)
|
||||||
{
|
{
|
||||||
if (clk_is_peripheral(clk)) {
|
if (clk_is_peripheral(clk)) {
|
||||||
clk->parent = &mck;
|
if (!clk->parent)
|
||||||
|
clk->parent = &mck;
|
||||||
clk->mode = pmc_periph_mode;
|
clk->mode = pmc_periph_mode;
|
||||||
list_add_tail(&clk->node, &clocks);
|
list_add_tail(&clk->node, &clocks);
|
||||||
}
|
}
|
||||||
|
|
|
@ -769,8 +769,7 @@ static struct map_desc dm355_io_desc[] = {
|
||||||
.virtual = SRAM_VIRT,
|
.virtual = SRAM_VIRT,
|
||||||
.pfn = __phys_to_pfn(0x00010000),
|
.pfn = __phys_to_pfn(0x00010000),
|
||||||
.length = SZ_32K,
|
.length = SZ_32K,
|
||||||
/* MT_MEMORY_NONCACHED requires supersection alignment */
|
.type = MT_MEMORY_NONCACHED,
|
||||||
.type = MT_DEVICE,
|
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -969,8 +969,7 @@ static struct map_desc dm365_io_desc[] = {
|
||||||
.virtual = SRAM_VIRT,
|
.virtual = SRAM_VIRT,
|
||||||
.pfn = __phys_to_pfn(0x00010000),
|
.pfn = __phys_to_pfn(0x00010000),
|
||||||
.length = SZ_32K,
|
.length = SZ_32K,
|
||||||
/* MT_MEMORY_NONCACHED requires supersection alignment */
|
.type = MT_MEMORY_NONCACHED,
|
||||||
.type = MT_DEVICE,
|
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -653,8 +653,7 @@ static struct map_desc dm644x_io_desc[] = {
|
||||||
.virtual = SRAM_VIRT,
|
.virtual = SRAM_VIRT,
|
||||||
.pfn = __phys_to_pfn(0x00008000),
|
.pfn = __phys_to_pfn(0x00008000),
|
||||||
.length = SZ_16K,
|
.length = SZ_16K,
|
||||||
/* MT_MEMORY_NONCACHED requires supersection alignment */
|
.type = MT_MEMORY_NONCACHED,
|
||||||
.type = MT_DEVICE,
|
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -737,8 +737,7 @@ static struct map_desc dm646x_io_desc[] = {
|
||||||
.virtual = SRAM_VIRT,
|
.virtual = SRAM_VIRT,
|
||||||
.pfn = __phys_to_pfn(0x00010000),
|
.pfn = __phys_to_pfn(0x00010000),
|
||||||
.length = SZ_32K,
|
.length = SZ_32K,
|
||||||
/* MT_MEMORY_NONCACHED requires supersection alignment */
|
.type = MT_MEMORY_NONCACHED,
|
||||||
.type = MT_DEVICE,
|
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -13,8 +13,8 @@
|
||||||
|
|
||||||
#define IO_SPACE_LIMIT 0xffffffff
|
#define IO_SPACE_LIMIT 0xffffffff
|
||||||
|
|
||||||
#define __io(a) ((void __iomem *)(((a) - DOVE_PCIE0_IO_PHYS_BASE) +\
|
#define __io(a) ((void __iomem *)(((a) - DOVE_PCIE0_IO_BUS_BASE) + \
|
||||||
DOVE_PCIE0_IO_VIRT_BASE))
|
DOVE_PCIE0_IO_VIRT_BASE))
|
||||||
#define __mem_pci(a) (a)
|
#define __mem_pci(a) (a)
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -503,6 +503,14 @@ struct pci_bus * __devinit ixp4xx_scan_bus(int nr, struct pci_sys_data *sys)
|
||||||
return pci_scan_bus(sys->busnr, &ixp4xx_ops, sys);
|
return pci_scan_bus(sys->busnr, &ixp4xx_ops, sys);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int dma_set_coherent_mask(struct device *dev, u64 mask)
|
||||||
|
{
|
||||||
|
if (mask >= SZ_64M - 1)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
return -EIO;
|
||||||
|
}
|
||||||
|
|
||||||
EXPORT_SYMBOL(ixp4xx_pci_read);
|
EXPORT_SYMBOL(ixp4xx_pci_read);
|
||||||
EXPORT_SYMBOL(ixp4xx_pci_write);
|
EXPORT_SYMBOL(ixp4xx_pci_write);
|
||||||
|
|
||||||
|
|
|
@ -26,6 +26,8 @@
|
||||||
#define PCIBIOS_MAX_MEM 0x4BFFFFFF
|
#define PCIBIOS_MAX_MEM 0x4BFFFFFF
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#define ARCH_HAS_DMA_SET_COHERENT_MASK
|
||||||
|
|
||||||
#define pcibios_assign_all_busses() 1
|
#define pcibios_assign_all_busses() 1
|
||||||
|
|
||||||
/* Register locations and bits */
|
/* Register locations and bits */
|
||||||
|
|
|
@ -38,7 +38,7 @@
|
||||||
|
|
||||||
#define KIRKWOOD_PCIE1_IO_PHYS_BASE 0xf3000000
|
#define KIRKWOOD_PCIE1_IO_PHYS_BASE 0xf3000000
|
||||||
#define KIRKWOOD_PCIE1_IO_VIRT_BASE 0xfef00000
|
#define KIRKWOOD_PCIE1_IO_VIRT_BASE 0xfef00000
|
||||||
#define KIRKWOOD_PCIE1_IO_BUS_BASE 0x00000000
|
#define KIRKWOOD_PCIE1_IO_BUS_BASE 0x00100000
|
||||||
#define KIRKWOOD_PCIE1_IO_SIZE SZ_1M
|
#define KIRKWOOD_PCIE1_IO_SIZE SZ_1M
|
||||||
|
|
||||||
#define KIRKWOOD_PCIE_IO_PHYS_BASE 0xf2000000
|
#define KIRKWOOD_PCIE_IO_PHYS_BASE 0xf2000000
|
||||||
|
|
|
@ -117,7 +117,7 @@ static void __init pcie0_ioresources_init(struct pcie_port *pp)
|
||||||
* IORESOURCE_IO
|
* IORESOURCE_IO
|
||||||
*/
|
*/
|
||||||
pp->res[0].name = "PCIe 0 I/O Space";
|
pp->res[0].name = "PCIe 0 I/O Space";
|
||||||
pp->res[0].start = KIRKWOOD_PCIE_IO_PHYS_BASE;
|
pp->res[0].start = KIRKWOOD_PCIE_IO_BUS_BASE;
|
||||||
pp->res[0].end = pp->res[0].start + KIRKWOOD_PCIE_IO_SIZE - 1;
|
pp->res[0].end = pp->res[0].start + KIRKWOOD_PCIE_IO_SIZE - 1;
|
||||||
pp->res[0].flags = IORESOURCE_IO;
|
pp->res[0].flags = IORESOURCE_IO;
|
||||||
|
|
||||||
|
@ -139,7 +139,7 @@ static void __init pcie1_ioresources_init(struct pcie_port *pp)
|
||||||
* IORESOURCE_IO
|
* IORESOURCE_IO
|
||||||
*/
|
*/
|
||||||
pp->res[0].name = "PCIe 1 I/O Space";
|
pp->res[0].name = "PCIe 1 I/O Space";
|
||||||
pp->res[0].start = KIRKWOOD_PCIE1_IO_PHYS_BASE;
|
pp->res[0].start = KIRKWOOD_PCIE1_IO_BUS_BASE;
|
||||||
pp->res[0].end = pp->res[0].start + KIRKWOOD_PCIE1_IO_SIZE - 1;
|
pp->res[0].end = pp->res[0].start + KIRKWOOD_PCIE1_IO_SIZE - 1;
|
||||||
pp->res[0].flags = IORESOURCE_IO;
|
pp->res[0].flags = IORESOURCE_IO;
|
||||||
|
|
||||||
|
|
|
@ -9,6 +9,8 @@
|
||||||
#ifndef __ASM_MACH_SYSTEM_H
|
#ifndef __ASM_MACH_SYSTEM_H
|
||||||
#define __ASM_MACH_SYSTEM_H
|
#define __ASM_MACH_SYSTEM_H
|
||||||
|
|
||||||
|
#include <mach/cputype.h>
|
||||||
|
|
||||||
static inline void arch_idle(void)
|
static inline void arch_idle(void)
|
||||||
{
|
{
|
||||||
cpu_do_idle();
|
cpu_do_idle();
|
||||||
|
@ -16,6 +18,9 @@ static inline void arch_idle(void)
|
||||||
|
|
||||||
static inline void arch_reset(char mode, const char *cmd)
|
static inline void arch_reset(char mode, const char *cmd)
|
||||||
{
|
{
|
||||||
cpu_reset(0);
|
if (cpu_is_pxa168())
|
||||||
|
cpu_reset(0xffff0000);
|
||||||
|
else
|
||||||
|
cpu_reset(0);
|
||||||
}
|
}
|
||||||
#endif /* __ASM_MACH_SYSTEM_H */
|
#endif /* __ASM_MACH_SYSTEM_H */
|
||||||
|
|
|
@ -312,8 +312,7 @@ static int pxa_set_target(struct cpufreq_policy *policy,
|
||||||
freqs.cpu = policy->cpu;
|
freqs.cpu = policy->cpu;
|
||||||
|
|
||||||
if (freq_debug)
|
if (freq_debug)
|
||||||
pr_debug(KERN_INFO "Changing CPU frequency to %d Mhz, "
|
pr_debug("Changing CPU frequency to %d Mhz, (SDRAM %d Mhz)\n",
|
||||||
"(SDRAM %d Mhz)\n",
|
|
||||||
freqs.new / 1000, (pxa_freq_settings[idx].div2) ?
|
freqs.new / 1000, (pxa_freq_settings[idx].div2) ?
|
||||||
(new_freq_mem / 2000) : (new_freq_mem / 1000));
|
(new_freq_mem / 2000) : (new_freq_mem / 1000));
|
||||||
|
|
||||||
|
|
|
@ -264,23 +264,35 @@
|
||||||
* <= 0x2 for pxa21x/pxa25x/pxa26x/pxa27x
|
* <= 0x2 for pxa21x/pxa25x/pxa26x/pxa27x
|
||||||
* == 0x3 for pxa300/pxa310/pxa320
|
* == 0x3 for pxa300/pxa310/pxa320
|
||||||
*/
|
*/
|
||||||
|
#if defined(CONFIG_PXA25x) || defined(CONFIG_PXA27x)
|
||||||
#define __cpu_is_pxa2xx(id) \
|
#define __cpu_is_pxa2xx(id) \
|
||||||
({ \
|
({ \
|
||||||
unsigned int _id = (id) >> 13 & 0x7; \
|
unsigned int _id = (id) >> 13 & 0x7; \
|
||||||
_id <= 0x2; \
|
_id <= 0x2; \
|
||||||
})
|
})
|
||||||
|
#else
|
||||||
|
#define __cpu_is_pxa2xx(id) (0)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef CONFIG_PXA3xx
|
||||||
#define __cpu_is_pxa3xx(id) \
|
#define __cpu_is_pxa3xx(id) \
|
||||||
({ \
|
({ \
|
||||||
unsigned int _id = (id) >> 13 & 0x7; \
|
unsigned int _id = (id) >> 13 & 0x7; \
|
||||||
_id == 0x3; \
|
_id == 0x3; \
|
||||||
})
|
})
|
||||||
|
#else
|
||||||
|
#define __cpu_is_pxa3xx(id) (0)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined(CONFIG_CPU_PXA930) || defined(CONFIG_CPU_PXA935)
|
||||||
#define __cpu_is_pxa93x(id) \
|
#define __cpu_is_pxa93x(id) \
|
||||||
({ \
|
({ \
|
||||||
unsigned int _id = (id) >> 4 & 0xfff; \
|
unsigned int _id = (id) >> 4 & 0xfff; \
|
||||||
_id == 0x683 || _id == 0x693; \
|
_id == 0x683 || _id == 0x693; \
|
||||||
})
|
})
|
||||||
|
#else
|
||||||
|
#define __cpu_is_pxa93x(id) (0)
|
||||||
|
#endif
|
||||||
|
|
||||||
#define cpu_is_pxa2xx() \
|
#define cpu_is_pxa2xx() \
|
||||||
({ \
|
({ \
|
||||||
|
@ -309,7 +321,7 @@ extern unsigned long get_clock_tick_rate(void);
|
||||||
#define PCIBIOS_MIN_IO 0
|
#define PCIBIOS_MIN_IO 0
|
||||||
#define PCIBIOS_MIN_MEM 0
|
#define PCIBIOS_MIN_MEM 0
|
||||||
#define pcibios_assign_all_busses() 1
|
#define pcibios_assign_all_busses() 1
|
||||||
|
#define ARCH_HAS_DMA_SET_COHERENT_MASK
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
#endif /* _ASM_ARCH_HARDWARE_H */
|
#endif /* _ASM_ARCH_HARDWARE_H */
|
||||||
|
|
|
@ -6,6 +6,8 @@
|
||||||
#ifndef __ASM_ARM_ARCH_IO_H
|
#ifndef __ASM_ARM_ARCH_IO_H
|
||||||
#define __ASM_ARM_ARCH_IO_H
|
#define __ASM_ARM_ARCH_IO_H
|
||||||
|
|
||||||
|
#include <mach/hardware.h>
|
||||||
|
|
||||||
#define IO_SPACE_LIMIT 0xffffffff
|
#define IO_SPACE_LIMIT 0xffffffff
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
|
@ -469,9 +469,13 @@ static struct i2c_board_info __initdata palm27x_pi2c_board_info[] = {
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
|
static struct i2c_pxa_platform_data palm27x_i2c_power_info = {
|
||||||
|
.use_pio = 1,
|
||||||
|
};
|
||||||
|
|
||||||
void __init palm27x_pmic_init(void)
|
void __init palm27x_pmic_init(void)
|
||||||
{
|
{
|
||||||
i2c_register_board_info(1, ARRAY_AND_SIZE(palm27x_pi2c_board_info));
|
i2c_register_board_info(1, ARRAY_AND_SIZE(palm27x_pi2c_board_info));
|
||||||
pxa27x_set_i2c_power_info(NULL);
|
pxa27x_set_i2c_power_info(&palm27x_i2c_power_info);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -240,6 +240,7 @@ static void __init vpac270_onenand_init(void) {}
|
||||||
#if defined(CONFIG_MMC_PXA) || defined(CONFIG_MMC_PXA_MODULE)
|
#if defined(CONFIG_MMC_PXA) || defined(CONFIG_MMC_PXA_MODULE)
|
||||||
static struct pxamci_platform_data vpac270_mci_platform_data = {
|
static struct pxamci_platform_data vpac270_mci_platform_data = {
|
||||||
.ocr_mask = MMC_VDD_32_33 | MMC_VDD_33_34,
|
.ocr_mask = MMC_VDD_32_33 | MMC_VDD_33_34,
|
||||||
|
.gpio_power = -1,
|
||||||
.gpio_card_detect = GPIO53_VPAC270_SD_DETECT_N,
|
.gpio_card_detect = GPIO53_VPAC270_SD_DETECT_N,
|
||||||
.gpio_card_ro = GPIO52_VPAC270_SD_READONLY,
|
.gpio_card_ro = GPIO52_VPAC270_SD_READONLY,
|
||||||
.detect_delay_ms = 200,
|
.detect_delay_ms = 200,
|
||||||
|
|
|
@ -18,10 +18,11 @@
|
||||||
#include <mach/map.h>
|
#include <mach/map.h>
|
||||||
#include <mach/gpio-bank-c.h>
|
#include <mach/gpio-bank-c.h>
|
||||||
#include <mach/spi-clocks.h>
|
#include <mach/spi-clocks.h>
|
||||||
|
#include <mach/irqs.h>
|
||||||
|
|
||||||
#include <plat/s3c64xx-spi.h>
|
#include <plat/s3c64xx-spi.h>
|
||||||
#include <plat/gpio-cfg.h>
|
#include <plat/gpio-cfg.h>
|
||||||
#include <plat/irqs.h>
|
#include <plat/devs.h>
|
||||||
|
|
||||||
static char *spi_src_clks[] = {
|
static char *spi_src_clks[] = {
|
||||||
[S3C64XX_SPI_SRCCLK_PCLK] = "pclk",
|
[S3C64XX_SPI_SRCCLK_PCLK] = "pclk",
|
||||||
|
|
|
@ -30,73 +30,73 @@
|
||||||
#include <plat/devs.h>
|
#include <plat/devs.h>
|
||||||
#include <plat/regs-serial.h>
|
#include <plat/regs-serial.h>
|
||||||
|
|
||||||
#define UCON S3C2410_UCON_DEFAULT | S3C2410_UCON_UCLK
|
#define UCON (S3C2410_UCON_DEFAULT | S3C2410_UCON_UCLK)
|
||||||
#define ULCON S3C2410_LCON_CS8 | S3C2410_LCON_PNONE | S3C2410_LCON_STOPB
|
#define ULCON (S3C2410_LCON_CS8 | S3C2410_LCON_PNONE | S3C2410_LCON_STOPB)
|
||||||
#define UFCON S3C2410_UFCON_RXTRIG8 | S3C2410_UFCON_FIFOMODE
|
#define UFCON (S3C2410_UFCON_RXTRIG8 | S3C2410_UFCON_FIFOMODE)
|
||||||
|
|
||||||
static struct s3c2410_uartcfg real6410_uartcfgs[] __initdata = {
|
static struct s3c2410_uartcfg real6410_uartcfgs[] __initdata = {
|
||||||
[0] = {
|
[0] = {
|
||||||
.hwport = 0,
|
.hwport = 0,
|
||||||
.flags = 0,
|
.flags = 0,
|
||||||
.ucon = UCON,
|
.ucon = UCON,
|
||||||
.ulcon = ULCON,
|
.ulcon = ULCON,
|
||||||
.ufcon = UFCON,
|
.ufcon = UFCON,
|
||||||
},
|
},
|
||||||
[1] = {
|
[1] = {
|
||||||
.hwport = 1,
|
.hwport = 1,
|
||||||
.flags = 0,
|
.flags = 0,
|
||||||
.ucon = UCON,
|
.ucon = UCON,
|
||||||
.ulcon = ULCON,
|
.ulcon = ULCON,
|
||||||
.ufcon = UFCON,
|
.ufcon = UFCON,
|
||||||
},
|
},
|
||||||
[2] = {
|
[2] = {
|
||||||
.hwport = 2,
|
.hwport = 2,
|
||||||
.flags = 0,
|
.flags = 0,
|
||||||
.ucon = UCON,
|
.ucon = UCON,
|
||||||
.ulcon = ULCON,
|
.ulcon = ULCON,
|
||||||
.ufcon = UFCON,
|
.ufcon = UFCON,
|
||||||
},
|
},
|
||||||
[3] = {
|
[3] = {
|
||||||
.hwport = 3,
|
.hwport = 3,
|
||||||
.flags = 0,
|
.flags = 0,
|
||||||
.ucon = UCON,
|
.ucon = UCON,
|
||||||
.ulcon = ULCON,
|
.ulcon = ULCON,
|
||||||
.ufcon = UFCON,
|
.ufcon = UFCON,
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
/* DM9000AEP 10/100 ethernet controller */
|
/* DM9000AEP 10/100 ethernet controller */
|
||||||
|
|
||||||
static struct resource real6410_dm9k_resource[] = {
|
static struct resource real6410_dm9k_resource[] = {
|
||||||
[0] = {
|
[0] = {
|
||||||
.start = S3C64XX_PA_XM0CSN1,
|
.start = S3C64XX_PA_XM0CSN1,
|
||||||
.end = S3C64XX_PA_XM0CSN1 + 1,
|
.end = S3C64XX_PA_XM0CSN1 + 1,
|
||||||
.flags = IORESOURCE_MEM
|
.flags = IORESOURCE_MEM
|
||||||
},
|
},
|
||||||
[1] = {
|
[1] = {
|
||||||
.start = S3C64XX_PA_XM0CSN1 + 4,
|
.start = S3C64XX_PA_XM0CSN1 + 4,
|
||||||
.end = S3C64XX_PA_XM0CSN1 + 5,
|
.end = S3C64XX_PA_XM0CSN1 + 5,
|
||||||
.flags = IORESOURCE_MEM
|
.flags = IORESOURCE_MEM
|
||||||
},
|
},
|
||||||
[2] = {
|
[2] = {
|
||||||
.start = S3C_EINT(7),
|
.start = S3C_EINT(7),
|
||||||
.end = S3C_EINT(7),
|
.end = S3C_EINT(7),
|
||||||
.flags = IORESOURCE_IRQ,
|
.flags = IORESOURCE_IRQ | IORESOURCE_IRQ_HIGHLEVEL
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
static struct dm9000_plat_data real6410_dm9k_pdata = {
|
static struct dm9000_plat_data real6410_dm9k_pdata = {
|
||||||
.flags = (DM9000_PLATF_16BITONLY | DM9000_PLATF_NO_EEPROM),
|
.flags = (DM9000_PLATF_16BITONLY | DM9000_PLATF_NO_EEPROM),
|
||||||
};
|
};
|
||||||
|
|
||||||
static struct platform_device real6410_device_eth = {
|
static struct platform_device real6410_device_eth = {
|
||||||
.name = "dm9000",
|
.name = "dm9000",
|
||||||
.id = -1,
|
.id = -1,
|
||||||
.num_resources = ARRAY_SIZE(real6410_dm9k_resource),
|
.num_resources = ARRAY_SIZE(real6410_dm9k_resource),
|
||||||
.resource = real6410_dm9k_resource,
|
.resource = real6410_dm9k_resource,
|
||||||
.dev = {
|
.dev = {
|
||||||
.platform_data = &real6410_dm9k_pdata,
|
.platform_data = &real6410_dm9k_pdata,
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
static struct platform_device *real6410_devices[] __initdata = {
|
static struct platform_device *real6410_devices[] __initdata = {
|
||||||
|
@ -129,12 +129,12 @@ static void __init real6410_machine_init(void)
|
||||||
/* set timing for nCS1 suitable for ethernet chip */
|
/* set timing for nCS1 suitable for ethernet chip */
|
||||||
|
|
||||||
__raw_writel((0 << S3C64XX_SROM_BCX__PMC__SHIFT) |
|
__raw_writel((0 << S3C64XX_SROM_BCX__PMC__SHIFT) |
|
||||||
(6 << S3C64XX_SROM_BCX__TACP__SHIFT) |
|
(6 << S3C64XX_SROM_BCX__TACP__SHIFT) |
|
||||||
(4 << S3C64XX_SROM_BCX__TCAH__SHIFT) |
|
(4 << S3C64XX_SROM_BCX__TCAH__SHIFT) |
|
||||||
(1 << S3C64XX_SROM_BCX__TCOH__SHIFT) |
|
(1 << S3C64XX_SROM_BCX__TCOH__SHIFT) |
|
||||||
(13 << S3C64XX_SROM_BCX__TACC__SHIFT) |
|
(13 << S3C64XX_SROM_BCX__TACC__SHIFT) |
|
||||||
(4 << S3C64XX_SROM_BCX__TCOS__SHIFT) |
|
(4 << S3C64XX_SROM_BCX__TCOS__SHIFT) |
|
||||||
(0 << S3C64XX_SROM_BCX__TACS__SHIFT), S3C64XX_SROM_BC1);
|
(0 << S3C64XX_SROM_BCX__TACS__SHIFT), S3C64XX_SROM_BC1);
|
||||||
|
|
||||||
platform_add_devices(real6410_devices, ARRAY_SIZE(real6410_devices));
|
platform_add_devices(real6410_devices, ARRAY_SIZE(real6410_devices));
|
||||||
}
|
}
|
||||||
|
|
|
@ -280,6 +280,24 @@ static struct clk init_clocks_disable[] = {
|
||||||
.parent = &clk_hclk_dsys.clk,
|
.parent = &clk_hclk_dsys.clk,
|
||||||
.enable = s5pv210_clk_ip0_ctrl,
|
.enable = s5pv210_clk_ip0_ctrl,
|
||||||
.ctrlbit = (1<<29),
|
.ctrlbit = (1<<29),
|
||||||
|
}, {
|
||||||
|
.name = "fimc",
|
||||||
|
.id = 0,
|
||||||
|
.parent = &clk_hclk_dsys.clk,
|
||||||
|
.enable = s5pv210_clk_ip0_ctrl,
|
||||||
|
.ctrlbit = (1 << 24),
|
||||||
|
}, {
|
||||||
|
.name = "fimc",
|
||||||
|
.id = 1,
|
||||||
|
.parent = &clk_hclk_dsys.clk,
|
||||||
|
.enable = s5pv210_clk_ip0_ctrl,
|
||||||
|
.ctrlbit = (1 << 25),
|
||||||
|
}, {
|
||||||
|
.name = "fimc",
|
||||||
|
.id = 2,
|
||||||
|
.parent = &clk_hclk_dsys.clk,
|
||||||
|
.enable = s5pv210_clk_ip0_ctrl,
|
||||||
|
.ctrlbit = (1 << 26),
|
||||||
}, {
|
}, {
|
||||||
.name = "otg",
|
.name = "otg",
|
||||||
.id = -1,
|
.id = -1,
|
||||||
|
@ -357,7 +375,7 @@ static struct clk init_clocks_disable[] = {
|
||||||
.id = 1,
|
.id = 1,
|
||||||
.parent = &clk_pclk_psys.clk,
|
.parent = &clk_pclk_psys.clk,
|
||||||
.enable = s5pv210_clk_ip3_ctrl,
|
.enable = s5pv210_clk_ip3_ctrl,
|
||||||
.ctrlbit = (1<<8),
|
.ctrlbit = (1 << 10),
|
||||||
}, {
|
}, {
|
||||||
.name = "i2c",
|
.name = "i2c",
|
||||||
.id = 2,
|
.id = 2,
|
||||||
|
|
|
@ -47,7 +47,7 @@ static struct map_desc s5pv210_iodesc[] __initdata = {
|
||||||
{
|
{
|
||||||
.virtual = (unsigned long)S5P_VA_SYSTIMER,
|
.virtual = (unsigned long)S5P_VA_SYSTIMER,
|
||||||
.pfn = __phys_to_pfn(S5PV210_PA_SYSTIMER),
|
.pfn = __phys_to_pfn(S5PV210_PA_SYSTIMER),
|
||||||
.length = SZ_1M,
|
.length = SZ_4K,
|
||||||
.type = MT_DEVICE,
|
.type = MT_DEVICE,
|
||||||
}, {
|
}, {
|
||||||
.virtual = (unsigned long)VA_VIC2,
|
.virtual = (unsigned long)VA_VIC2,
|
||||||
|
|
|
@ -273,6 +273,9 @@ extern void gpio_pullup(unsigned gpio, int value);
|
||||||
extern int gpio_get_value(unsigned gpio);
|
extern int gpio_get_value(unsigned gpio);
|
||||||
extern void gpio_set_value(unsigned gpio, int value);
|
extern void gpio_set_value(unsigned gpio, int value);
|
||||||
|
|
||||||
|
#define gpio_get_value_cansleep gpio_get_value
|
||||||
|
#define gpio_set_value_cansleep gpio_set_value
|
||||||
|
|
||||||
/* wrappers to sleep-enable the previous two functions */
|
/* wrappers to sleep-enable the previous two functions */
|
||||||
static inline unsigned gpio_to_irq(unsigned gpio)
|
static inline unsigned gpio_to_irq(unsigned gpio)
|
||||||
{
|
{
|
||||||
|
|
|
@ -227,7 +227,13 @@ static void ct_ca9x4_init(void)
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
#ifdef CONFIG_CACHE_L2X0
|
#ifdef CONFIG_CACHE_L2X0
|
||||||
l2x0_init(MMIO_P2V(CT_CA9X4_L2CC), 0x00000000, 0xfe0fffff);
|
void __iomem *l2x0_base = MMIO_P2V(CT_CA9X4_L2CC);
|
||||||
|
|
||||||
|
/* set RAM latencies to 1 cycle for this core tile. */
|
||||||
|
writel(0, l2x0_base + L2X0_TAG_LATENCY_CTRL);
|
||||||
|
writel(0, l2x0_base + L2X0_DATA_LATENCY_CTRL);
|
||||||
|
|
||||||
|
l2x0_init(l2x0_base, 0x00400000, 0xfe0fffff);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
clkdev_add_table(lookups, ARRAY_SIZE(lookups));
|
clkdev_add_table(lookups, ARRAY_SIZE(lookups));
|
||||||
|
|
|
@ -885,8 +885,23 @@ do_alignment(unsigned long addr, unsigned int fsr, struct pt_regs *regs)
|
||||||
|
|
||||||
if (ai_usermode & UM_SIGNAL)
|
if (ai_usermode & UM_SIGNAL)
|
||||||
force_sig(SIGBUS, current);
|
force_sig(SIGBUS, current);
|
||||||
else
|
else {
|
||||||
set_cr(cr_no_alignment);
|
/*
|
||||||
|
* We're about to disable the alignment trap and return to
|
||||||
|
* user space. But if an interrupt occurs before actually
|
||||||
|
* reaching user space, then the IRQ vector entry code will
|
||||||
|
* notice that we were still in kernel space and therefore
|
||||||
|
* the alignment trap won't be re-enabled in that case as it
|
||||||
|
* is presumed to be always on from kernel space.
|
||||||
|
* Let's prevent that race by disabling interrupts here (they
|
||||||
|
* are disabled on the way back to user space anyway in
|
||||||
|
* entry-common.S) and disable the alignment trap only if
|
||||||
|
* there is no work pending for this thread.
|
||||||
|
*/
|
||||||
|
raw_local_irq_disable();
|
||||||
|
if (!(current_thread_info()->flags & _TIF_WORK_MASK))
|
||||||
|
set_cr(cr_no_alignment);
|
||||||
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
|
@ -15,6 +15,7 @@
|
||||||
#include <linux/nodemask.h>
|
#include <linux/nodemask.h>
|
||||||
#include <linux/memblock.h>
|
#include <linux/memblock.h>
|
||||||
#include <linux/sort.h>
|
#include <linux/sort.h>
|
||||||
|
#include <linux/fs.h>
|
||||||
|
|
||||||
#include <asm/cputype.h>
|
#include <asm/cputype.h>
|
||||||
#include <asm/sections.h>
|
#include <asm/sections.h>
|
||||||
|
@ -246,6 +247,9 @@ static struct mem_type mem_types[] = {
|
||||||
.domain = DOMAIN_USER,
|
.domain = DOMAIN_USER,
|
||||||
},
|
},
|
||||||
[MT_MEMORY] = {
|
[MT_MEMORY] = {
|
||||||
|
.prot_pte = L_PTE_PRESENT | L_PTE_YOUNG | L_PTE_DIRTY |
|
||||||
|
L_PTE_USER | L_PTE_EXEC,
|
||||||
|
.prot_l1 = PMD_TYPE_TABLE,
|
||||||
.prot_sect = PMD_TYPE_SECT | PMD_SECT_AP_WRITE,
|
.prot_sect = PMD_TYPE_SECT | PMD_SECT_AP_WRITE,
|
||||||
.domain = DOMAIN_KERNEL,
|
.domain = DOMAIN_KERNEL,
|
||||||
},
|
},
|
||||||
|
@ -254,6 +258,9 @@ static struct mem_type mem_types[] = {
|
||||||
.domain = DOMAIN_KERNEL,
|
.domain = DOMAIN_KERNEL,
|
||||||
},
|
},
|
||||||
[MT_MEMORY_NONCACHED] = {
|
[MT_MEMORY_NONCACHED] = {
|
||||||
|
.prot_pte = L_PTE_PRESENT | L_PTE_YOUNG | L_PTE_DIRTY |
|
||||||
|
L_PTE_USER | L_PTE_EXEC | L_PTE_MT_BUFFERABLE,
|
||||||
|
.prot_l1 = PMD_TYPE_TABLE,
|
||||||
.prot_sect = PMD_TYPE_SECT | PMD_SECT_AP_WRITE,
|
.prot_sect = PMD_TYPE_SECT | PMD_SECT_AP_WRITE,
|
||||||
.domain = DOMAIN_KERNEL,
|
.domain = DOMAIN_KERNEL,
|
||||||
},
|
},
|
||||||
|
@ -411,9 +418,12 @@ static void __init build_mem_type_table(void)
|
||||||
* Enable CPU-specific coherency if supported.
|
* Enable CPU-specific coherency if supported.
|
||||||
* (Only available on XSC3 at the moment.)
|
* (Only available on XSC3 at the moment.)
|
||||||
*/
|
*/
|
||||||
if (arch_is_coherent() && cpu_is_xsc3())
|
if (arch_is_coherent() && cpu_is_xsc3()) {
|
||||||
mem_types[MT_MEMORY].prot_sect |= PMD_SECT_S;
|
mem_types[MT_MEMORY].prot_sect |= PMD_SECT_S;
|
||||||
|
mem_types[MT_MEMORY].prot_pte |= L_PTE_SHARED;
|
||||||
|
mem_types[MT_MEMORY_NONCACHED].prot_sect |= PMD_SECT_S;
|
||||||
|
mem_types[MT_MEMORY_NONCACHED].prot_pte |= L_PTE_SHARED;
|
||||||
|
}
|
||||||
/*
|
/*
|
||||||
* ARMv6 and above have extended page tables.
|
* ARMv6 and above have extended page tables.
|
||||||
*/
|
*/
|
||||||
|
@ -438,7 +448,9 @@ static void __init build_mem_type_table(void)
|
||||||
mem_types[MT_DEVICE_CACHED].prot_sect |= PMD_SECT_S;
|
mem_types[MT_DEVICE_CACHED].prot_sect |= PMD_SECT_S;
|
||||||
mem_types[MT_DEVICE_CACHED].prot_pte |= L_PTE_SHARED;
|
mem_types[MT_DEVICE_CACHED].prot_pte |= L_PTE_SHARED;
|
||||||
mem_types[MT_MEMORY].prot_sect |= PMD_SECT_S;
|
mem_types[MT_MEMORY].prot_sect |= PMD_SECT_S;
|
||||||
|
mem_types[MT_MEMORY].prot_pte |= L_PTE_SHARED;
|
||||||
mem_types[MT_MEMORY_NONCACHED].prot_sect |= PMD_SECT_S;
|
mem_types[MT_MEMORY_NONCACHED].prot_sect |= PMD_SECT_S;
|
||||||
|
mem_types[MT_MEMORY_NONCACHED].prot_pte |= L_PTE_SHARED;
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -475,6 +487,8 @@ static void __init build_mem_type_table(void)
|
||||||
mem_types[MT_LOW_VECTORS].prot_l1 |= ecc_mask;
|
mem_types[MT_LOW_VECTORS].prot_l1 |= ecc_mask;
|
||||||
mem_types[MT_HIGH_VECTORS].prot_l1 |= ecc_mask;
|
mem_types[MT_HIGH_VECTORS].prot_l1 |= ecc_mask;
|
||||||
mem_types[MT_MEMORY].prot_sect |= ecc_mask | cp->pmd;
|
mem_types[MT_MEMORY].prot_sect |= ecc_mask | cp->pmd;
|
||||||
|
mem_types[MT_MEMORY].prot_pte |= kern_pgprot;
|
||||||
|
mem_types[MT_MEMORY_NONCACHED].prot_sect |= ecc_mask;
|
||||||
mem_types[MT_ROM].prot_sect |= cp->pmd;
|
mem_types[MT_ROM].prot_sect |= cp->pmd;
|
||||||
|
|
||||||
switch (cp->pmd) {
|
switch (cp->pmd) {
|
||||||
|
@ -498,6 +512,19 @@ static void __init build_mem_type_table(void)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef CONFIG_ARM_DMA_MEM_BUFFERABLE
|
||||||
|
pgprot_t phys_mem_access_prot(struct file *file, unsigned long pfn,
|
||||||
|
unsigned long size, pgprot_t vma_prot)
|
||||||
|
{
|
||||||
|
if (!pfn_valid(pfn))
|
||||||
|
return pgprot_noncached(vma_prot);
|
||||||
|
else if (file->f_flags & O_SYNC)
|
||||||
|
return pgprot_writecombine(vma_prot);
|
||||||
|
return vma_prot;
|
||||||
|
}
|
||||||
|
EXPORT_SYMBOL(phys_mem_access_prot);
|
||||||
|
#endif
|
||||||
|
|
||||||
#define vectors_base() (vectors_high() ? 0xffff0000 : 0)
|
#define vectors_base() (vectors_high() ? 0xffff0000 : 0)
|
||||||
|
|
||||||
static void __init *early_alloc(unsigned long sz)
|
static void __init *early_alloc(unsigned long sz)
|
||||||
|
|
|
@ -186,13 +186,14 @@ cpu_v7_name:
|
||||||
* It is assumed that:
|
* It is assumed that:
|
||||||
* - cache type register is implemented
|
* - cache type register is implemented
|
||||||
*/
|
*/
|
||||||
__v7_setup:
|
__v7_ca9mp_setup:
|
||||||
#ifdef CONFIG_SMP
|
#ifdef CONFIG_SMP
|
||||||
mrc p15, 0, r0, c1, c0, 1
|
mrc p15, 0, r0, c1, c0, 1
|
||||||
tst r0, #(1 << 6) @ SMP/nAMP mode enabled?
|
tst r0, #(1 << 6) @ SMP/nAMP mode enabled?
|
||||||
orreq r0, r0, #(1 << 6) | (1 << 0) @ Enable SMP/nAMP mode and
|
orreq r0, r0, #(1 << 6) | (1 << 0) @ Enable SMP/nAMP mode and
|
||||||
mcreq p15, 0, r0, c1, c0, 1 @ TLB ops broadcasting
|
mcreq p15, 0, r0, c1, c0, 1 @ TLB ops broadcasting
|
||||||
#endif
|
#endif
|
||||||
|
__v7_setup:
|
||||||
adr r12, __v7_setup_stack @ the local stack
|
adr r12, __v7_setup_stack @ the local stack
|
||||||
stmia r12, {r0-r5, r7, r9, r11, lr}
|
stmia r12, {r0-r5, r7, r9, r11, lr}
|
||||||
bl v7_flush_dcache_all
|
bl v7_flush_dcache_all
|
||||||
|
@ -201,11 +202,16 @@ __v7_setup:
|
||||||
mrc p15, 0, r0, c0, c0, 0 @ read main ID register
|
mrc p15, 0, r0, c0, c0, 0 @ read main ID register
|
||||||
and r10, r0, #0xff000000 @ ARM?
|
and r10, r0, #0xff000000 @ ARM?
|
||||||
teq r10, #0x41000000
|
teq r10, #0x41000000
|
||||||
bne 2f
|
bne 3f
|
||||||
and r5, r0, #0x00f00000 @ variant
|
and r5, r0, #0x00f00000 @ variant
|
||||||
and r6, r0, #0x0000000f @ revision
|
and r6, r0, #0x0000000f @ revision
|
||||||
orr r0, r6, r5, lsr #20-4 @ combine variant and revision
|
orr r6, r6, r5, lsr #20-4 @ combine variant and revision
|
||||||
|
ubfx r0, r0, #4, #12 @ primary part number
|
||||||
|
|
||||||
|
/* Cortex-A8 Errata */
|
||||||
|
ldr r10, =0x00000c08 @ Cortex-A8 primary part number
|
||||||
|
teq r0, r10
|
||||||
|
bne 2f
|
||||||
#ifdef CONFIG_ARM_ERRATA_430973
|
#ifdef CONFIG_ARM_ERRATA_430973
|
||||||
teq r5, #0x00100000 @ only present in r1p*
|
teq r5, #0x00100000 @ only present in r1p*
|
||||||
mrceq p15, 0, r10, c1, c0, 1 @ read aux control register
|
mrceq p15, 0, r10, c1, c0, 1 @ read aux control register
|
||||||
|
@ -213,21 +219,42 @@ __v7_setup:
|
||||||
mcreq p15, 0, r10, c1, c0, 1 @ write aux control register
|
mcreq p15, 0, r10, c1, c0, 1 @ write aux control register
|
||||||
#endif
|
#endif
|
||||||
#ifdef CONFIG_ARM_ERRATA_458693
|
#ifdef CONFIG_ARM_ERRATA_458693
|
||||||
teq r0, #0x20 @ only present in r2p0
|
teq r6, #0x20 @ only present in r2p0
|
||||||
mrceq p15, 0, r10, c1, c0, 1 @ read aux control register
|
mrceq p15, 0, r10, c1, c0, 1 @ read aux control register
|
||||||
orreq r10, r10, #(1 << 5) @ set L1NEON to 1
|
orreq r10, r10, #(1 << 5) @ set L1NEON to 1
|
||||||
orreq r10, r10, #(1 << 9) @ set PLDNOP to 1
|
orreq r10, r10, #(1 << 9) @ set PLDNOP to 1
|
||||||
mcreq p15, 0, r10, c1, c0, 1 @ write aux control register
|
mcreq p15, 0, r10, c1, c0, 1 @ write aux control register
|
||||||
#endif
|
#endif
|
||||||
#ifdef CONFIG_ARM_ERRATA_460075
|
#ifdef CONFIG_ARM_ERRATA_460075
|
||||||
teq r0, #0x20 @ only present in r2p0
|
teq r6, #0x20 @ only present in r2p0
|
||||||
mrceq p15, 1, r10, c9, c0, 2 @ read L2 cache aux ctrl register
|
mrceq p15, 1, r10, c9, c0, 2 @ read L2 cache aux ctrl register
|
||||||
tsteq r10, #1 << 22
|
tsteq r10, #1 << 22
|
||||||
orreq r10, r10, #(1 << 22) @ set the Write Allocate disable bit
|
orreq r10, r10, #(1 << 22) @ set the Write Allocate disable bit
|
||||||
mcreq p15, 1, r10, c9, c0, 2 @ write the L2 cache aux ctrl register
|
mcreq p15, 1, r10, c9, c0, 2 @ write the L2 cache aux ctrl register
|
||||||
#endif
|
#endif
|
||||||
|
b 3f
|
||||||
|
|
||||||
2: mov r10, #0
|
/* Cortex-A9 Errata */
|
||||||
|
2: ldr r10, =0x00000c09 @ Cortex-A9 primary part number
|
||||||
|
teq r0, r10
|
||||||
|
bne 3f
|
||||||
|
#ifdef CONFIG_ARM_ERRATA_742230
|
||||||
|
cmp r6, #0x22 @ only present up to r2p2
|
||||||
|
mrcle p15, 0, r10, c15, c0, 1 @ read diagnostic register
|
||||||
|
orrle r10, r10, #1 << 4 @ set bit #4
|
||||||
|
mcrle p15, 0, r10, c15, c0, 1 @ write diagnostic register
|
||||||
|
#endif
|
||||||
|
#ifdef CONFIG_ARM_ERRATA_742231
|
||||||
|
teq r6, #0x20 @ present in r2p0
|
||||||
|
teqne r6, #0x21 @ present in r2p1
|
||||||
|
teqne r6, #0x22 @ present in r2p2
|
||||||
|
mrceq p15, 0, r10, c15, c0, 1 @ read diagnostic register
|
||||||
|
orreq r10, r10, #1 << 12 @ set bit #12
|
||||||
|
orreq r10, r10, #1 << 22 @ set bit #22
|
||||||
|
mcreq p15, 0, r10, c15, c0, 1 @ write diagnostic register
|
||||||
|
#endif
|
||||||
|
|
||||||
|
3: mov r10, #0
|
||||||
#ifdef HARVARD_CACHE
|
#ifdef HARVARD_CACHE
|
||||||
mcr p15, 0, r10, c7, c5, 0 @ I+BTB cache invalidate
|
mcr p15, 0, r10, c7, c5, 0 @ I+BTB cache invalidate
|
||||||
#endif
|
#endif
|
||||||
|
@ -323,6 +350,29 @@ cpu_elf_name:
|
||||||
|
|
||||||
.section ".proc.info.init", #alloc, #execinstr
|
.section ".proc.info.init", #alloc, #execinstr
|
||||||
|
|
||||||
|
.type __v7_ca9mp_proc_info, #object
|
||||||
|
__v7_ca9mp_proc_info:
|
||||||
|
.long 0x410fc090 @ Required ID value
|
||||||
|
.long 0xff0ffff0 @ Mask for ID
|
||||||
|
.long PMD_TYPE_SECT | \
|
||||||
|
PMD_SECT_AP_WRITE | \
|
||||||
|
PMD_SECT_AP_READ | \
|
||||||
|
PMD_FLAGS
|
||||||
|
.long PMD_TYPE_SECT | \
|
||||||
|
PMD_SECT_XN | \
|
||||||
|
PMD_SECT_AP_WRITE | \
|
||||||
|
PMD_SECT_AP_READ
|
||||||
|
b __v7_ca9mp_setup
|
||||||
|
.long cpu_arch_name
|
||||||
|
.long cpu_elf_name
|
||||||
|
.long HWCAP_SWP|HWCAP_HALF|HWCAP_THUMB|HWCAP_FAST_MULT|HWCAP_EDSP
|
||||||
|
.long cpu_v7_name
|
||||||
|
.long v7_processor_functions
|
||||||
|
.long v7wbi_tlb_fns
|
||||||
|
.long v6_user_fns
|
||||||
|
.long v7_cache_fns
|
||||||
|
.size __v7_ca9mp_proc_info, . - __v7_ca9mp_proc_info
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Match any ARMv7 processor core.
|
* Match any ARMv7 processor core.
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -102,6 +102,7 @@ static int op_create_counter(int cpu, int event)
|
||||||
if (IS_ERR(pevent)) {
|
if (IS_ERR(pevent)) {
|
||||||
ret = PTR_ERR(pevent);
|
ret = PTR_ERR(pevent);
|
||||||
} else if (pevent->state != PERF_EVENT_STATE_ACTIVE) {
|
} else if (pevent->state != PERF_EVENT_STATE_ACTIVE) {
|
||||||
|
perf_event_release_kernel(pevent);
|
||||||
pr_warning("oprofile: failed to enable event %d "
|
pr_warning("oprofile: failed to enable event %d "
|
||||||
"on CPU %d\n", event, cpu);
|
"on CPU %d\n", event, cpu);
|
||||||
ret = -EBUSY;
|
ret = -EBUSY;
|
||||||
|
@ -365,6 +366,7 @@ int __init oprofile_arch_init(struct oprofile_operations *ops)
|
||||||
ret = init_driverfs();
|
ret = init_driverfs();
|
||||||
if (ret) {
|
if (ret) {
|
||||||
kfree(counter_config);
|
kfree(counter_config);
|
||||||
|
counter_config = NULL;
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -402,7 +404,6 @@ void oprofile_arch_exit(void)
|
||||||
struct perf_event *event;
|
struct perf_event *event;
|
||||||
|
|
||||||
if (*perf_events) {
|
if (*perf_events) {
|
||||||
exit_driverfs();
|
|
||||||
for_each_possible_cpu(cpu) {
|
for_each_possible_cpu(cpu) {
|
||||||
for (id = 0; id < perf_num_counters; ++id) {
|
for (id = 0; id < perf_num_counters; ++id) {
|
||||||
event = perf_events[cpu][id];
|
event = perf_events[cpu][id];
|
||||||
|
@ -413,8 +414,10 @@ void oprofile_arch_exit(void)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (counter_config)
|
if (counter_config) {
|
||||||
kfree(counter_config);
|
kfree(counter_config);
|
||||||
|
exit_driverfs();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
#else
|
#else
|
||||||
int __init oprofile_arch_init(struct oprofile_operations *ops)
|
int __init oprofile_arch_init(struct oprofile_operations *ops)
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
/*
|
/*
|
||||||
* linux/arch/arm/mach-nomadik/timer.c
|
* linux/arch/arm/plat-nomadik/timer.c
|
||||||
*
|
*
|
||||||
* Copyright (C) 2008 STMicroelectronics
|
* Copyright (C) 2008 STMicroelectronics
|
||||||
* Copyright (C) 2010 Alessandro Rubini
|
* Copyright (C) 2010 Alessandro Rubini
|
||||||
|
@ -75,7 +75,7 @@ static void nmdk_clkevt_mode(enum clock_event_mode mode,
|
||||||
cr = readl(mtu_base + MTU_CR(1));
|
cr = readl(mtu_base + MTU_CR(1));
|
||||||
writel(0, mtu_base + MTU_LR(1));
|
writel(0, mtu_base + MTU_LR(1));
|
||||||
writel(cr | MTU_CRn_ENA, mtu_base + MTU_CR(1));
|
writel(cr | MTU_CRn_ENA, mtu_base + MTU_CR(1));
|
||||||
writel(0x2, mtu_base + MTU_IMSC);
|
writel(1 << 1, mtu_base + MTU_IMSC);
|
||||||
break;
|
break;
|
||||||
case CLOCK_EVT_MODE_SHUTDOWN:
|
case CLOCK_EVT_MODE_SHUTDOWN:
|
||||||
case CLOCK_EVT_MODE_UNUSED:
|
case CLOCK_EVT_MODE_UNUSED:
|
||||||
|
@ -131,25 +131,23 @@ void __init nmdk_timer_init(void)
|
||||||
{
|
{
|
||||||
unsigned long rate;
|
unsigned long rate;
|
||||||
struct clk *clk0;
|
struct clk *clk0;
|
||||||
struct clk *clk1;
|
u32 cr = MTU_CRn_32BITS;
|
||||||
u32 cr;
|
|
||||||
|
|
||||||
clk0 = clk_get_sys("mtu0", NULL);
|
clk0 = clk_get_sys("mtu0", NULL);
|
||||||
BUG_ON(IS_ERR(clk0));
|
BUG_ON(IS_ERR(clk0));
|
||||||
|
|
||||||
clk1 = clk_get_sys("mtu1", NULL);
|
|
||||||
BUG_ON(IS_ERR(clk1));
|
|
||||||
|
|
||||||
clk_enable(clk0);
|
clk_enable(clk0);
|
||||||
clk_enable(clk1);
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Tick rate is 2.4MHz for Nomadik and 110MHz for ux500:
|
* Tick rate is 2.4MHz for Nomadik and 2.4Mhz, 100MHz or 133 MHz
|
||||||
* use a divide-by-16 counter if it's more than 16MHz
|
* for ux500.
|
||||||
|
* Use a divide-by-16 counter if the tick rate is more than 32MHz.
|
||||||
|
* At 32 MHz, the timer (with 32 bit counter) can be programmed
|
||||||
|
* to wake-up at a max 127s a head in time. Dividing a 2.4 MHz timer
|
||||||
|
* with 16 gives too low timer resolution.
|
||||||
*/
|
*/
|
||||||
cr = MTU_CRn_32BITS;;
|
|
||||||
rate = clk_get_rate(clk0);
|
rate = clk_get_rate(clk0);
|
||||||
if (rate > 16 << 20) {
|
if (rate > 32000000) {
|
||||||
rate /= 16;
|
rate /= 16;
|
||||||
cr |= MTU_CRn_PRESCALE_16;
|
cr |= MTU_CRn_PRESCALE_16;
|
||||||
} else {
|
} else {
|
||||||
|
@ -170,15 +168,8 @@ void __init nmdk_timer_init(void)
|
||||||
pr_err("timer: failed to initialize clock source %s\n",
|
pr_err("timer: failed to initialize clock source %s\n",
|
||||||
nmdk_clksrc.name);
|
nmdk_clksrc.name);
|
||||||
|
|
||||||
/* Timer 1 is used for events, fix according to rate */
|
/* Timer 1 is used for events */
|
||||||
cr = MTU_CRn_32BITS;
|
|
||||||
rate = clk_get_rate(clk1);
|
|
||||||
if (rate > 16 << 20) {
|
|
||||||
rate /= 16;
|
|
||||||
cr |= MTU_CRn_PRESCALE_16;
|
|
||||||
} else {
|
|
||||||
cr |= MTU_CRn_PRESCALE_1;
|
|
||||||
}
|
|
||||||
clockevents_calc_mult_shift(&nmdk_clkevt, rate, MTU_MIN_RANGE);
|
clockevents_calc_mult_shift(&nmdk_clkevt, rate, MTU_MIN_RANGE);
|
||||||
|
|
||||||
writel(cr | MTU_CRn_ONESHOT, mtu_base + MTU_CR(1)); /* off, currently */
|
writel(cr | MTU_CRn_ONESHOT, mtu_base + MTU_CR(1)); /* off, currently */
|
||||||
|
|
|
@ -33,7 +33,7 @@ config OMAP_DEBUG_DEVICES
|
||||||
config OMAP_DEBUG_LEDS
|
config OMAP_DEBUG_LEDS
|
||||||
bool
|
bool
|
||||||
depends on OMAP_DEBUG_DEVICES
|
depends on OMAP_DEBUG_DEVICES
|
||||||
default y if LEDS
|
default y if LEDS_CLASS
|
||||||
|
|
||||||
config OMAP_RESET_CLOCKS
|
config OMAP_RESET_CLOCKS
|
||||||
bool "Reset unused clocks during boot"
|
bool "Reset unused clocks during boot"
|
||||||
|
|
|
@ -156,7 +156,7 @@ static irqreturn_t omap_mcbsp_rx_irq_handler(int irq, void *dev_id)
|
||||||
/* Writing zero to RSYNC_ERR clears the IRQ */
|
/* Writing zero to RSYNC_ERR clears the IRQ */
|
||||||
MCBSP_WRITE(mcbsp_rx, SPCR1, MCBSP_READ_CACHE(mcbsp_rx, SPCR1));
|
MCBSP_WRITE(mcbsp_rx, SPCR1, MCBSP_READ_CACHE(mcbsp_rx, SPCR1));
|
||||||
} else {
|
} else {
|
||||||
complete(&mcbsp_rx->tx_irq_completion);
|
complete(&mcbsp_rx->rx_irq_completion);
|
||||||
}
|
}
|
||||||
|
|
||||||
return IRQ_HANDLED;
|
return IRQ_HANDLED;
|
||||||
|
|
|
@ -220,20 +220,7 @@ void __init omap_map_sram(void)
|
||||||
if (omap_sram_size == 0)
|
if (omap_sram_size == 0)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if (cpu_is_omap24xx()) {
|
|
||||||
omap_sram_io_desc[0].virtual = OMAP2_SRAM_VA;
|
|
||||||
|
|
||||||
base = OMAP2_SRAM_PA;
|
|
||||||
base = ROUND_DOWN(base, PAGE_SIZE);
|
|
||||||
omap_sram_io_desc[0].pfn = __phys_to_pfn(base);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (cpu_is_omap34xx()) {
|
if (cpu_is_omap34xx()) {
|
||||||
omap_sram_io_desc[0].virtual = OMAP3_SRAM_VA;
|
|
||||||
base = OMAP3_SRAM_PA;
|
|
||||||
base = ROUND_DOWN(base, PAGE_SIZE);
|
|
||||||
omap_sram_io_desc[0].pfn = __phys_to_pfn(base);
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* SRAM must be marked as non-cached on OMAP3 since the
|
* SRAM must be marked as non-cached on OMAP3 since the
|
||||||
* CORE DPLL M2 divider change code (in SRAM) runs with the
|
* CORE DPLL M2 divider change code (in SRAM) runs with the
|
||||||
|
@ -244,13 +231,11 @@ void __init omap_map_sram(void)
|
||||||
omap_sram_io_desc[0].type = MT_MEMORY_NONCACHED;
|
omap_sram_io_desc[0].type = MT_MEMORY_NONCACHED;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (cpu_is_omap44xx()) {
|
omap_sram_io_desc[0].virtual = omap_sram_base;
|
||||||
omap_sram_io_desc[0].virtual = OMAP4_SRAM_VA;
|
base = omap_sram_start;
|
||||||
base = OMAP4_SRAM_PA;
|
base = ROUND_DOWN(base, PAGE_SIZE);
|
||||||
base = ROUND_DOWN(base, PAGE_SIZE);
|
omap_sram_io_desc[0].pfn = __phys_to_pfn(base);
|
||||||
omap_sram_io_desc[0].pfn = __phys_to_pfn(base);
|
omap_sram_io_desc[0].length = ROUND_DOWN(omap_sram_size, PAGE_SIZE);
|
||||||
}
|
|
||||||
omap_sram_io_desc[0].length = 1024 * 1024; /* Use section desc */
|
|
||||||
iotable_init(omap_sram_io_desc, ARRAY_SIZE(omap_sram_io_desc));
|
iotable_init(omap_sram_io_desc, ARRAY_SIZE(omap_sram_io_desc));
|
||||||
|
|
||||||
printk(KERN_INFO "SRAM: Mapped pa 0x%08lx to va 0x%08lx size: 0x%lx\n",
|
printk(KERN_INFO "SRAM: Mapped pa 0x%08lx to va 0x%08lx size: 0x%lx\n",
|
||||||
|
|
|
@ -10,6 +10,7 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <linux/kernel.h>
|
#include <linux/kernel.h>
|
||||||
|
#include <linux/dma-mapping.h>
|
||||||
#include <linux/platform_device.h>
|
#include <linux/platform_device.h>
|
||||||
#include <linux/interrupt.h>
|
#include <linux/interrupt.h>
|
||||||
#include <linux/ioport.h>
|
#include <linux/ioport.h>
|
||||||
|
@ -18,7 +19,7 @@
|
||||||
static struct resource s5p_fimc0_resource[] = {
|
static struct resource s5p_fimc0_resource[] = {
|
||||||
[0] = {
|
[0] = {
|
||||||
.start = S5P_PA_FIMC0,
|
.start = S5P_PA_FIMC0,
|
||||||
.end = S5P_PA_FIMC0 + SZ_1M - 1,
|
.end = S5P_PA_FIMC0 + SZ_4K - 1,
|
||||||
.flags = IORESOURCE_MEM,
|
.flags = IORESOURCE_MEM,
|
||||||
},
|
},
|
||||||
[1] = {
|
[1] = {
|
||||||
|
@ -28,9 +29,15 @@ static struct resource s5p_fimc0_resource[] = {
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
|
static u64 s5p_fimc0_dma_mask = DMA_BIT_MASK(32);
|
||||||
|
|
||||||
struct platform_device s5p_device_fimc0 = {
|
struct platform_device s5p_device_fimc0 = {
|
||||||
.name = "s5p-fimc",
|
.name = "s5p-fimc",
|
||||||
.id = 0,
|
.id = 0,
|
||||||
.num_resources = ARRAY_SIZE(s5p_fimc0_resource),
|
.num_resources = ARRAY_SIZE(s5p_fimc0_resource),
|
||||||
.resource = s5p_fimc0_resource,
|
.resource = s5p_fimc0_resource,
|
||||||
|
.dev = {
|
||||||
|
.dma_mask = &s5p_fimc0_dma_mask,
|
||||||
|
.coherent_dma_mask = DMA_BIT_MASK(32),
|
||||||
|
},
|
||||||
};
|
};
|
||||||
|
|
|
@ -10,6 +10,7 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <linux/kernel.h>
|
#include <linux/kernel.h>
|
||||||
|
#include <linux/dma-mapping.h>
|
||||||
#include <linux/platform_device.h>
|
#include <linux/platform_device.h>
|
||||||
#include <linux/interrupt.h>
|
#include <linux/interrupt.h>
|
||||||
#include <linux/ioport.h>
|
#include <linux/ioport.h>
|
||||||
|
@ -18,7 +19,7 @@
|
||||||
static struct resource s5p_fimc1_resource[] = {
|
static struct resource s5p_fimc1_resource[] = {
|
||||||
[0] = {
|
[0] = {
|
||||||
.start = S5P_PA_FIMC1,
|
.start = S5P_PA_FIMC1,
|
||||||
.end = S5P_PA_FIMC1 + SZ_1M - 1,
|
.end = S5P_PA_FIMC1 + SZ_4K - 1,
|
||||||
.flags = IORESOURCE_MEM,
|
.flags = IORESOURCE_MEM,
|
||||||
},
|
},
|
||||||
[1] = {
|
[1] = {
|
||||||
|
@ -28,9 +29,15 @@ static struct resource s5p_fimc1_resource[] = {
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
|
static u64 s5p_fimc1_dma_mask = DMA_BIT_MASK(32);
|
||||||
|
|
||||||
struct platform_device s5p_device_fimc1 = {
|
struct platform_device s5p_device_fimc1 = {
|
||||||
.name = "s5p-fimc",
|
.name = "s5p-fimc",
|
||||||
.id = 1,
|
.id = 1,
|
||||||
.num_resources = ARRAY_SIZE(s5p_fimc1_resource),
|
.num_resources = ARRAY_SIZE(s5p_fimc1_resource),
|
||||||
.resource = s5p_fimc1_resource,
|
.resource = s5p_fimc1_resource,
|
||||||
|
.dev = {
|
||||||
|
.dma_mask = &s5p_fimc1_dma_mask,
|
||||||
|
.coherent_dma_mask = DMA_BIT_MASK(32),
|
||||||
|
},
|
||||||
};
|
};
|
||||||
|
|
|
@ -10,6 +10,7 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <linux/kernel.h>
|
#include <linux/kernel.h>
|
||||||
|
#include <linux/dma-mapping.h>
|
||||||
#include <linux/platform_device.h>
|
#include <linux/platform_device.h>
|
||||||
#include <linux/interrupt.h>
|
#include <linux/interrupt.h>
|
||||||
#include <linux/ioport.h>
|
#include <linux/ioport.h>
|
||||||
|
@ -18,7 +19,7 @@
|
||||||
static struct resource s5p_fimc2_resource[] = {
|
static struct resource s5p_fimc2_resource[] = {
|
||||||
[0] = {
|
[0] = {
|
||||||
.start = S5P_PA_FIMC2,
|
.start = S5P_PA_FIMC2,
|
||||||
.end = S5P_PA_FIMC2 + SZ_1M - 1,
|
.end = S5P_PA_FIMC2 + SZ_4K - 1,
|
||||||
.flags = IORESOURCE_MEM,
|
.flags = IORESOURCE_MEM,
|
||||||
},
|
},
|
||||||
[1] = {
|
[1] = {
|
||||||
|
@ -28,9 +29,15 @@ static struct resource s5p_fimc2_resource[] = {
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
|
static u64 s5p_fimc2_dma_mask = DMA_BIT_MASK(32);
|
||||||
|
|
||||||
struct platform_device s5p_device_fimc2 = {
|
struct platform_device s5p_device_fimc2 = {
|
||||||
.name = "s5p-fimc",
|
.name = "s5p-fimc",
|
||||||
.id = 2,
|
.id = 2,
|
||||||
.num_resources = ARRAY_SIZE(s5p_fimc2_resource),
|
.num_resources = ARRAY_SIZE(s5p_fimc2_resource),
|
||||||
.resource = s5p_fimc2_resource,
|
.resource = s5p_fimc2_resource,
|
||||||
|
.dev = {
|
||||||
|
.dma_mask = &s5p_fimc2_dma_mask,
|
||||||
|
.coherent_dma_mask = DMA_BIT_MASK(32),
|
||||||
|
},
|
||||||
};
|
};
|
||||||
|
|
|
@ -273,13 +273,13 @@ s5p_gpio_drvstr_t s5p_gpio_get_drvstr(unsigned int pin)
|
||||||
if (!chip)
|
if (!chip)
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
|
|
||||||
off = chip->chip.base - pin;
|
off = pin - chip->chip.base;
|
||||||
shift = off * 2;
|
shift = off * 2;
|
||||||
reg = chip->base + 0x0C;
|
reg = chip->base + 0x0C;
|
||||||
|
|
||||||
drvstr = __raw_readl(reg);
|
drvstr = __raw_readl(reg);
|
||||||
drvstr = 0xffff & (0x3 << shift);
|
|
||||||
drvstr = drvstr >> shift;
|
drvstr = drvstr >> shift;
|
||||||
|
drvstr &= 0x3;
|
||||||
|
|
||||||
return (__force s5p_gpio_drvstr_t)drvstr;
|
return (__force s5p_gpio_drvstr_t)drvstr;
|
||||||
}
|
}
|
||||||
|
@ -296,11 +296,12 @@ int s5p_gpio_set_drvstr(unsigned int pin, s5p_gpio_drvstr_t drvstr)
|
||||||
if (!chip)
|
if (!chip)
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
|
|
||||||
off = chip->chip.base - pin;
|
off = pin - chip->chip.base;
|
||||||
shift = off * 2;
|
shift = off * 2;
|
||||||
reg = chip->base + 0x0C;
|
reg = chip->base + 0x0C;
|
||||||
|
|
||||||
tmp = __raw_readl(reg);
|
tmp = __raw_readl(reg);
|
||||||
|
tmp &= ~(0x3 << shift);
|
||||||
tmp |= drvstr << shift;
|
tmp |= drvstr << shift;
|
||||||
|
|
||||||
__raw_writel(tmp, reg);
|
__raw_writel(tmp, reg);
|
||||||
|
|
|
@ -143,12 +143,12 @@ extern s3c_gpio_pull_t s3c_gpio_getpull(unsigned int pin);
|
||||||
/* Define values for the drvstr available for each gpio pin.
|
/* Define values for the drvstr available for each gpio pin.
|
||||||
*
|
*
|
||||||
* These values control the value of the output signal driver strength,
|
* These values control the value of the output signal driver strength,
|
||||||
* configurable on most pins on the S5C series.
|
* configurable on most pins on the S5P series.
|
||||||
*/
|
*/
|
||||||
#define S5P_GPIO_DRVSTR_LV1 ((__force s5p_gpio_drvstr_t)0x00)
|
#define S5P_GPIO_DRVSTR_LV1 ((__force s5p_gpio_drvstr_t)0x0)
|
||||||
#define S5P_GPIO_DRVSTR_LV2 ((__force s5p_gpio_drvstr_t)0x01)
|
#define S5P_GPIO_DRVSTR_LV2 ((__force s5p_gpio_drvstr_t)0x2)
|
||||||
#define S5P_GPIO_DRVSTR_LV3 ((__force s5p_gpio_drvstr_t)0x10)
|
#define S5P_GPIO_DRVSTR_LV3 ((__force s5p_gpio_drvstr_t)0x1)
|
||||||
#define S5P_GPIO_DRVSTR_LV4 ((__force s5p_gpio_drvstr_t)0x11)
|
#define S5P_GPIO_DRVSTR_LV4 ((__force s5p_gpio_drvstr_t)0x3)
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* s5c_gpio_get_drvstr() - get the driver streght value of a gpio pin
|
* s5c_gpio_get_drvstr() - get the driver streght value of a gpio pin
|
||||||
|
|
|
@ -314,10 +314,9 @@ int module_finalize(const Elf_Ehdr *hdr, const Elf_Shdr *sechdrs,
|
||||||
vfree(module->arch.syminfo);
|
vfree(module->arch.syminfo);
|
||||||
module->arch.syminfo = NULL;
|
module->arch.syminfo = NULL;
|
||||||
|
|
||||||
return module_bug_finalize(hdr, sechdrs, module);
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
void module_arch_cleanup(struct module *module)
|
void module_arch_cleanup(struct module *module)
|
||||||
{
|
{
|
||||||
module_bug_cleanup(module);
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -121,6 +121,9 @@ static int restore_sigcontext(struct sigcontext __user *sc, int *_gr8)
|
||||||
struct user_context *user = current->thread.user;
|
struct user_context *user = current->thread.user;
|
||||||
unsigned long tbr, psr;
|
unsigned long tbr, psr;
|
||||||
|
|
||||||
|
/* Always make any pending restarted system calls return -EINTR */
|
||||||
|
current_thread_info()->restart_block.fn = do_no_restart_syscall;
|
||||||
|
|
||||||
tbr = user->i.tbr;
|
tbr = user->i.tbr;
|
||||||
psr = user->i.psr;
|
psr = user->i.psr;
|
||||||
if (copy_from_user(user, &sc->sc_context, sizeof(sc->sc_context)))
|
if (copy_from_user(user, &sc->sc_context, sizeof(sc->sc_context)))
|
||||||
|
@ -250,6 +253,8 @@ static int setup_frame(int sig, struct k_sigaction *ka, sigset_t *set)
|
||||||
struct sigframe __user *frame;
|
struct sigframe __user *frame;
|
||||||
int rsig;
|
int rsig;
|
||||||
|
|
||||||
|
set_fs(USER_DS);
|
||||||
|
|
||||||
frame = get_sigframe(ka, sizeof(*frame));
|
frame = get_sigframe(ka, sizeof(*frame));
|
||||||
|
|
||||||
if (!access_ok(VERIFY_WRITE, frame, sizeof(*frame)))
|
if (!access_ok(VERIFY_WRITE, frame, sizeof(*frame)))
|
||||||
|
@ -293,22 +298,23 @@ static int setup_frame(int sig, struct k_sigaction *ka, sigset_t *set)
|
||||||
(unsigned long) (frame->retcode + 2));
|
(unsigned long) (frame->retcode + 2));
|
||||||
}
|
}
|
||||||
|
|
||||||
/* set up registers for signal handler */
|
/* Set up registers for the signal handler */
|
||||||
__frame->sp = (unsigned long) frame;
|
|
||||||
__frame->lr = (unsigned long) &frame->retcode;
|
|
||||||
__frame->gr8 = sig;
|
|
||||||
|
|
||||||
if (current->personality & FDPIC_FUNCPTRS) {
|
if (current->personality & FDPIC_FUNCPTRS) {
|
||||||
struct fdpic_func_descriptor __user *funcptr =
|
struct fdpic_func_descriptor __user *funcptr =
|
||||||
(struct fdpic_func_descriptor __user *) ka->sa.sa_handler;
|
(struct fdpic_func_descriptor __user *) ka->sa.sa_handler;
|
||||||
__get_user(__frame->pc, &funcptr->text);
|
struct fdpic_func_descriptor desc;
|
||||||
__get_user(__frame->gr15, &funcptr->GOT);
|
if (copy_from_user(&desc, funcptr, sizeof(desc)))
|
||||||
|
goto give_sigsegv;
|
||||||
|
__frame->pc = desc.text;
|
||||||
|
__frame->gr15 = desc.GOT;
|
||||||
} else {
|
} else {
|
||||||
__frame->pc = (unsigned long) ka->sa.sa_handler;
|
__frame->pc = (unsigned long) ka->sa.sa_handler;
|
||||||
__frame->gr15 = 0;
|
__frame->gr15 = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
set_fs(USER_DS);
|
__frame->sp = (unsigned long) frame;
|
||||||
|
__frame->lr = (unsigned long) &frame->retcode;
|
||||||
|
__frame->gr8 = sig;
|
||||||
|
|
||||||
/* the tracer may want to single-step inside the handler */
|
/* the tracer may want to single-step inside the handler */
|
||||||
if (test_thread_flag(TIF_SINGLESTEP))
|
if (test_thread_flag(TIF_SINGLESTEP))
|
||||||
|
@ -323,7 +329,7 @@ static int setup_frame(int sig, struct k_sigaction *ka, sigset_t *set)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
give_sigsegv:
|
give_sigsegv:
|
||||||
force_sig(SIGSEGV, current);
|
force_sigsegv(sig, current);
|
||||||
return -EFAULT;
|
return -EFAULT;
|
||||||
|
|
||||||
} /* end setup_frame() */
|
} /* end setup_frame() */
|
||||||
|
@ -338,6 +344,8 @@ static int setup_rt_frame(int sig, struct k_sigaction *ka, siginfo_t *info,
|
||||||
struct rt_sigframe __user *frame;
|
struct rt_sigframe __user *frame;
|
||||||
int rsig;
|
int rsig;
|
||||||
|
|
||||||
|
set_fs(USER_DS);
|
||||||
|
|
||||||
frame = get_sigframe(ka, sizeof(*frame));
|
frame = get_sigframe(ka, sizeof(*frame));
|
||||||
|
|
||||||
if (!access_ok(VERIFY_WRITE, frame, sizeof(*frame)))
|
if (!access_ok(VERIFY_WRITE, frame, sizeof(*frame)))
|
||||||
|
@ -392,22 +400,23 @@ static int setup_rt_frame(int sig, struct k_sigaction *ka, siginfo_t *info,
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Set up registers for signal handler */
|
/* Set up registers for signal handler */
|
||||||
__frame->sp = (unsigned long) frame;
|
|
||||||
__frame->lr = (unsigned long) &frame->retcode;
|
|
||||||
__frame->gr8 = sig;
|
|
||||||
__frame->gr9 = (unsigned long) &frame->info;
|
|
||||||
|
|
||||||
if (current->personality & FDPIC_FUNCPTRS) {
|
if (current->personality & FDPIC_FUNCPTRS) {
|
||||||
struct fdpic_func_descriptor __user *funcptr =
|
struct fdpic_func_descriptor __user *funcptr =
|
||||||
(struct fdpic_func_descriptor __user *) ka->sa.sa_handler;
|
(struct fdpic_func_descriptor __user *) ka->sa.sa_handler;
|
||||||
__get_user(__frame->pc, &funcptr->text);
|
struct fdpic_func_descriptor desc;
|
||||||
__get_user(__frame->gr15, &funcptr->GOT);
|
if (copy_from_user(&desc, funcptr, sizeof(desc)))
|
||||||
|
goto give_sigsegv;
|
||||||
|
__frame->pc = desc.text;
|
||||||
|
__frame->gr15 = desc.GOT;
|
||||||
} else {
|
} else {
|
||||||
__frame->pc = (unsigned long) ka->sa.sa_handler;
|
__frame->pc = (unsigned long) ka->sa.sa_handler;
|
||||||
__frame->gr15 = 0;
|
__frame->gr15 = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
set_fs(USER_DS);
|
__frame->sp = (unsigned long) frame;
|
||||||
|
__frame->lr = (unsigned long) &frame->retcode;
|
||||||
|
__frame->gr8 = sig;
|
||||||
|
__frame->gr9 = (unsigned long) &frame->info;
|
||||||
|
|
||||||
/* the tracer may want to single-step inside the handler */
|
/* the tracer may want to single-step inside the handler */
|
||||||
if (test_thread_flag(TIF_SINGLESTEP))
|
if (test_thread_flag(TIF_SINGLESTEP))
|
||||||
|
@ -422,7 +431,7 @@ static int setup_rt_frame(int sig, struct k_sigaction *ka, siginfo_t *info,
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
give_sigsegv:
|
give_sigsegv:
|
||||||
force_sig(SIGSEGV, current);
|
force_sigsegv(sig, current);
|
||||||
return -EFAULT;
|
return -EFAULT;
|
||||||
|
|
||||||
} /* end setup_rt_frame() */
|
} /* end setup_rt_frame() */
|
||||||
|
@ -437,7 +446,7 @@ static int handle_signal(unsigned long sig, siginfo_t *info,
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
/* Are we from a system call? */
|
/* Are we from a system call? */
|
||||||
if (in_syscall(__frame)) {
|
if (__frame->syscallno != -1) {
|
||||||
/* If so, check system call restarting.. */
|
/* If so, check system call restarting.. */
|
||||||
switch (__frame->gr8) {
|
switch (__frame->gr8) {
|
||||||
case -ERESTART_RESTARTBLOCK:
|
case -ERESTART_RESTARTBLOCK:
|
||||||
|
@ -456,6 +465,7 @@ static int handle_signal(unsigned long sig, siginfo_t *info,
|
||||||
__frame->gr8 = __frame->orig_gr8;
|
__frame->gr8 = __frame->orig_gr8;
|
||||||
__frame->pc -= 4;
|
__frame->pc -= 4;
|
||||||
}
|
}
|
||||||
|
__frame->syscallno = -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Set up the stack frame */
|
/* Set up the stack frame */
|
||||||
|
@ -538,10 +548,11 @@ static void do_signal(void)
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case -ERESTART_RESTARTBLOCK:
|
case -ERESTART_RESTARTBLOCK:
|
||||||
__frame->gr8 = __NR_restart_syscall;
|
__frame->gr7 = __NR_restart_syscall;
|
||||||
__frame->pc -= 4;
|
__frame->pc -= 4;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
__frame->syscallno = -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* if there's no signal to deliver, we just put the saved sigmask
|
/* if there's no signal to deliver, we just put the saved sigmask
|
||||||
|
|
|
@ -112,10 +112,9 @@ int module_finalize(const Elf_Ehdr *hdr,
|
||||||
const Elf_Shdr *sechdrs,
|
const Elf_Shdr *sechdrs,
|
||||||
struct module *me)
|
struct module *me)
|
||||||
{
|
{
|
||||||
return module_bug_finalize(hdr, sechdrs, me);
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
void module_arch_cleanup(struct module *mod)
|
void module_arch_cleanup(struct module *mod)
|
||||||
{
|
{
|
||||||
module_bug_cleanup(mod);
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -199,7 +199,7 @@ ptr_to_compat(void __user *uptr)
|
||||||
}
|
}
|
||||||
|
|
||||||
static __inline__ void __user *
|
static __inline__ void __user *
|
||||||
compat_alloc_user_space (long len)
|
arch_compat_alloc_user_space (long len)
|
||||||
{
|
{
|
||||||
struct pt_regs *regs = task_pt_regs(current);
|
struct pt_regs *regs = task_pt_regs(current);
|
||||||
return (void __user *) (((regs->r12 & 0xffffffff) & -16) - len);
|
return (void __user *) (((regs->r12 & 0xffffffff) & -16) - len);
|
||||||
|
|
|
@ -420,22 +420,31 @@ EX(.fail_efault, ld8 r14=[r33]) // r14 <- *set
|
||||||
;;
|
;;
|
||||||
|
|
||||||
RSM_PSR_I(p0, r18, r19) // mask interrupt delivery
|
RSM_PSR_I(p0, r18, r19) // mask interrupt delivery
|
||||||
mov ar.ccv=0
|
|
||||||
andcm r14=r14,r17 // filter out SIGKILL & SIGSTOP
|
andcm r14=r14,r17 // filter out SIGKILL & SIGSTOP
|
||||||
|
mov r8=EINVAL // default to EINVAL
|
||||||
|
|
||||||
#ifdef CONFIG_SMP
|
#ifdef CONFIG_SMP
|
||||||
mov r17=1
|
// __ticket_spin_trylock(r31)
|
||||||
|
ld4 r17=[r31]
|
||||||
;;
|
;;
|
||||||
cmpxchg4.acq r18=[r31],r17,ar.ccv // try to acquire the lock
|
mov.m ar.ccv=r17
|
||||||
mov r8=EINVAL // default to EINVAL
|
extr.u r9=r17,17,15
|
||||||
|
adds r19=1,r17
|
||||||
|
extr.u r18=r17,0,15
|
||||||
;;
|
;;
|
||||||
|
cmp.eq p6,p7=r9,r18
|
||||||
|
;;
|
||||||
|
(p6) cmpxchg4.acq r9=[r31],r19,ar.ccv
|
||||||
|
(p6) dep.z r20=r19,1,15 // next serving ticket for unlock
|
||||||
|
(p7) br.cond.spnt.many .lock_contention
|
||||||
|
;;
|
||||||
|
cmp4.eq p0,p7=r9,r17
|
||||||
|
adds r31=2,r31
|
||||||
|
(p7) br.cond.spnt.many .lock_contention
|
||||||
ld8 r3=[r2] // re-read current->blocked now that we hold the lock
|
ld8 r3=[r2] // re-read current->blocked now that we hold the lock
|
||||||
cmp4.ne p6,p0=r18,r0
|
|
||||||
(p6) br.cond.spnt.many .lock_contention
|
|
||||||
;;
|
;;
|
||||||
#else
|
#else
|
||||||
ld8 r3=[r2] // re-read current->blocked now that we hold the lock
|
ld8 r3=[r2] // re-read current->blocked now that we hold the lock
|
||||||
mov r8=EINVAL // default to EINVAL
|
|
||||||
#endif
|
#endif
|
||||||
add r18=IA64_TASK_PENDING_OFFSET+IA64_SIGPENDING_SIGNAL_OFFSET,r16
|
add r18=IA64_TASK_PENDING_OFFSET+IA64_SIGPENDING_SIGNAL_OFFSET,r16
|
||||||
add r19=IA64_TASK_SIGNAL_OFFSET,r16
|
add r19=IA64_TASK_SIGNAL_OFFSET,r16
|
||||||
|
@ -490,7 +499,9 @@ EX(.fail_efault, ld8 r14=[r33]) // r14 <- *set
|
||||||
(p6) br.cond.spnt.few 1b // yes -> retry
|
(p6) br.cond.spnt.few 1b // yes -> retry
|
||||||
|
|
||||||
#ifdef CONFIG_SMP
|
#ifdef CONFIG_SMP
|
||||||
st4.rel [r31]=r0 // release the lock
|
// __ticket_spin_unlock(r31)
|
||||||
|
st2.rel [r31]=r20
|
||||||
|
mov r20=0 // i must not leak kernel bits...
|
||||||
#endif
|
#endif
|
||||||
SSM_PSR_I(p0, p9, r31)
|
SSM_PSR_I(p0, p9, r31)
|
||||||
;;
|
;;
|
||||||
|
@ -512,7 +523,8 @@ EX(.fail_efault, (p15) st8 [r34]=r3)
|
||||||
|
|
||||||
.sig_pending:
|
.sig_pending:
|
||||||
#ifdef CONFIG_SMP
|
#ifdef CONFIG_SMP
|
||||||
st4.rel [r31]=r0 // release the lock
|
// __ticket_spin_unlock(r31)
|
||||||
|
st2.rel [r31]=r20 // release the lock
|
||||||
#endif
|
#endif
|
||||||
SSM_PSR_I(p0, p9, r17)
|
SSM_PSR_I(p0, p9, r17)
|
||||||
;;
|
;;
|
||||||
|
|
|
@ -157,7 +157,6 @@ typedef struct sigaltstack {
|
||||||
#undef __HAVE_ARCH_SIG_BITOPS
|
#undef __HAVE_ARCH_SIG_BITOPS
|
||||||
|
|
||||||
struct pt_regs;
|
struct pt_regs;
|
||||||
extern int do_signal(struct pt_regs *regs, sigset_t *oldset);
|
|
||||||
|
|
||||||
#define ptrace_signal_deliver(regs, cookie) do { } while (0)
|
#define ptrace_signal_deliver(regs, cookie) do { } while (0)
|
||||||
|
|
||||||
|
|
|
@ -351,6 +351,7 @@
|
||||||
#define __ARCH_WANT_SYS_OLD_GETRLIMIT /*will be unused*/
|
#define __ARCH_WANT_SYS_OLD_GETRLIMIT /*will be unused*/
|
||||||
#define __ARCH_WANT_SYS_OLDUMOUNT
|
#define __ARCH_WANT_SYS_OLDUMOUNT
|
||||||
#define __ARCH_WANT_SYS_RT_SIGACTION
|
#define __ARCH_WANT_SYS_RT_SIGACTION
|
||||||
|
#define __ARCH_WANT_SYS_RT_SIGSUSPEND
|
||||||
|
|
||||||
#define __IGNORE_lchown
|
#define __IGNORE_lchown
|
||||||
#define __IGNORE_setuid
|
#define __IGNORE_setuid
|
||||||
|
|
|
@ -235,10 +235,9 @@ work_resched:
|
||||||
work_notifysig: ; deal with pending signals and
|
work_notifysig: ; deal with pending signals and
|
||||||
; notify-resume requests
|
; notify-resume requests
|
||||||
mv r0, sp ; arg1 : struct pt_regs *regs
|
mv r0, sp ; arg1 : struct pt_regs *regs
|
||||||
ldi r1, #0 ; arg2 : sigset_t *oldset
|
mv r1, r9 ; arg2 : __u32 thread_info_flags
|
||||||
mv r2, r9 ; arg3 : __u32 thread_info_flags
|
|
||||||
bl do_notify_resume
|
bl do_notify_resume
|
||||||
bra restore_all
|
bra resume_userspace
|
||||||
|
|
||||||
; perform syscall exit tracing
|
; perform syscall exit tracing
|
||||||
ALIGN
|
ALIGN
|
||||||
|
|
|
@ -592,16 +592,17 @@ void user_enable_single_step(struct task_struct *child)
|
||||||
|
|
||||||
if (access_process_vm(child, pc&~3, &insn, sizeof(insn), 0)
|
if (access_process_vm(child, pc&~3, &insn, sizeof(insn), 0)
|
||||||
!= sizeof(insn))
|
!= sizeof(insn))
|
||||||
break;
|
return -EIO;
|
||||||
|
|
||||||
compute_next_pc(insn, pc, &next_pc, child);
|
compute_next_pc(insn, pc, &next_pc, child);
|
||||||
if (next_pc & 0x80000000)
|
if (next_pc & 0x80000000)
|
||||||
break;
|
return -EIO;
|
||||||
|
|
||||||
if (embed_debug_trap(child, next_pc))
|
if (embed_debug_trap(child, next_pc))
|
||||||
break;
|
return -EIO;
|
||||||
|
|
||||||
invalidate_cache();
|
invalidate_cache();
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
void user_disable_single_step(struct task_struct *child)
|
void user_disable_single_step(struct task_struct *child)
|
||||||
|
|
|
@ -28,37 +28,6 @@
|
||||||
|
|
||||||
#define DEBUG_SIG 0
|
#define DEBUG_SIG 0
|
||||||
|
|
||||||
#define _BLOCKABLE (~(sigmask(SIGKILL) | sigmask(SIGSTOP)))
|
|
||||||
|
|
||||||
int do_signal(struct pt_regs *, sigset_t *);
|
|
||||||
|
|
||||||
asmlinkage int
|
|
||||||
sys_rt_sigsuspend(sigset_t __user *unewset, size_t sigsetsize,
|
|
||||||
unsigned long r2, unsigned long r3, unsigned long r4,
|
|
||||||
unsigned long r5, unsigned long r6, struct pt_regs *regs)
|
|
||||||
{
|
|
||||||
sigset_t newset;
|
|
||||||
|
|
||||||
/* XXX: Don't preclude handling different sized sigset_t's. */
|
|
||||||
if (sigsetsize != sizeof(sigset_t))
|
|
||||||
return -EINVAL;
|
|
||||||
|
|
||||||
if (copy_from_user(&newset, unewset, sizeof(newset)))
|
|
||||||
return -EFAULT;
|
|
||||||
sigdelsetmask(&newset, sigmask(SIGKILL)|sigmask(SIGSTOP));
|
|
||||||
|
|
||||||
spin_lock_irq(¤t->sighand->siglock);
|
|
||||||
current->saved_sigmask = current->blocked;
|
|
||||||
current->blocked = newset;
|
|
||||||
recalc_sigpending();
|
|
||||||
spin_unlock_irq(¤t->sighand->siglock);
|
|
||||||
|
|
||||||
current->state = TASK_INTERRUPTIBLE;
|
|
||||||
schedule();
|
|
||||||
set_thread_flag(TIF_RESTORE_SIGMASK);
|
|
||||||
return -ERESTARTNOHAND;
|
|
||||||
}
|
|
||||||
|
|
||||||
asmlinkage int
|
asmlinkage int
|
||||||
sys_sigaltstack(const stack_t __user *uss, stack_t __user *uoss,
|
sys_sigaltstack(const stack_t __user *uss, stack_t __user *uoss,
|
||||||
unsigned long r2, unsigned long r3, unsigned long r4,
|
unsigned long r2, unsigned long r3, unsigned long r4,
|
||||||
|
@ -218,7 +187,7 @@ get_sigframe(struct k_sigaction *ka, unsigned long sp, size_t frame_size)
|
||||||
return (void __user *)((sp - frame_size) & -8ul);
|
return (void __user *)((sp - frame_size) & -8ul);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void setup_rt_frame(int sig, struct k_sigaction *ka, siginfo_t *info,
|
static int setup_rt_frame(int sig, struct k_sigaction *ka, siginfo_t *info,
|
||||||
sigset_t *set, struct pt_regs *regs)
|
sigset_t *set, struct pt_regs *regs)
|
||||||
{
|
{
|
||||||
struct rt_sigframe __user *frame;
|
struct rt_sigframe __user *frame;
|
||||||
|
@ -275,22 +244,34 @@ static void setup_rt_frame(int sig, struct k_sigaction *ka, siginfo_t *info,
|
||||||
current->comm, current->pid, frame, regs->pc);
|
current->comm, current->pid, frame, regs->pc);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
return;
|
return 0;
|
||||||
|
|
||||||
give_sigsegv:
|
give_sigsegv:
|
||||||
force_sigsegv(sig, current);
|
force_sigsegv(sig, current);
|
||||||
|
return -EFAULT;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int prev_insn(struct pt_regs *regs)
|
||||||
|
{
|
||||||
|
u16 inst;
|
||||||
|
if (get_user(&inst, (u16 __user *)(regs->bpc - 2)))
|
||||||
|
return -EFAULT;
|
||||||
|
if ((inst & 0xfff0) == 0x10f0) /* trap ? */
|
||||||
|
regs->bpc -= 2;
|
||||||
|
else
|
||||||
|
regs->bpc -= 4;
|
||||||
|
regs->syscall_nr = -1;
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* OK, we're invoking a handler
|
* OK, we're invoking a handler
|
||||||
*/
|
*/
|
||||||
|
|
||||||
static void
|
static int
|
||||||
handle_signal(unsigned long sig, struct k_sigaction *ka, siginfo_t *info,
|
handle_signal(unsigned long sig, struct k_sigaction *ka, siginfo_t *info,
|
||||||
sigset_t *oldset, struct pt_regs *regs)
|
sigset_t *oldset, struct pt_regs *regs)
|
||||||
{
|
{
|
||||||
unsigned short inst;
|
|
||||||
|
|
||||||
/* Are we from a system call? */
|
/* Are we from a system call? */
|
||||||
if (regs->syscall_nr >= 0) {
|
if (regs->syscall_nr >= 0) {
|
||||||
/* If so, check system call restarting.. */
|
/* If so, check system call restarting.. */
|
||||||
|
@ -308,16 +289,14 @@ handle_signal(unsigned long sig, struct k_sigaction *ka, siginfo_t *info,
|
||||||
/* fallthrough */
|
/* fallthrough */
|
||||||
case -ERESTARTNOINTR:
|
case -ERESTARTNOINTR:
|
||||||
regs->r0 = regs->orig_r0;
|
regs->r0 = regs->orig_r0;
|
||||||
inst = *(unsigned short *)(regs->bpc - 2);
|
if (prev_insn(regs) < 0)
|
||||||
if ((inst & 0xfff0) == 0x10f0) /* trap ? */
|
return -EFAULT;
|
||||||
regs->bpc -= 2;
|
|
||||||
else
|
|
||||||
regs->bpc -= 4;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Set up the stack frame */
|
/* Set up the stack frame */
|
||||||
setup_rt_frame(sig, ka, info, oldset, regs);
|
if (setup_rt_frame(sig, ka, info, oldset, regs))
|
||||||
|
return -EFAULT;
|
||||||
|
|
||||||
spin_lock_irq(¤t->sighand->siglock);
|
spin_lock_irq(¤t->sighand->siglock);
|
||||||
sigorsets(¤t->blocked,¤t->blocked,&ka->sa.sa_mask);
|
sigorsets(¤t->blocked,¤t->blocked,&ka->sa.sa_mask);
|
||||||
|
@ -325,6 +304,7 @@ handle_signal(unsigned long sig, struct k_sigaction *ka, siginfo_t *info,
|
||||||
sigaddset(¤t->blocked,sig);
|
sigaddset(¤t->blocked,sig);
|
||||||
recalc_sigpending();
|
recalc_sigpending();
|
||||||
spin_unlock_irq(¤t->sighand->siglock);
|
spin_unlock_irq(¤t->sighand->siglock);
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -332,12 +312,12 @@ handle_signal(unsigned long sig, struct k_sigaction *ka, siginfo_t *info,
|
||||||
* want to handle. Thus you cannot kill init even with a SIGKILL even by
|
* want to handle. Thus you cannot kill init even with a SIGKILL even by
|
||||||
* mistake.
|
* mistake.
|
||||||
*/
|
*/
|
||||||
int do_signal(struct pt_regs *regs, sigset_t *oldset)
|
static void do_signal(struct pt_regs *regs)
|
||||||
{
|
{
|
||||||
siginfo_t info;
|
siginfo_t info;
|
||||||
int signr;
|
int signr;
|
||||||
struct k_sigaction ka;
|
struct k_sigaction ka;
|
||||||
unsigned short inst;
|
sigset_t *oldset;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* We want the common case to go fast, which
|
* We want the common case to go fast, which
|
||||||
|
@ -346,12 +326,14 @@ int do_signal(struct pt_regs *regs, sigset_t *oldset)
|
||||||
* if so.
|
* if so.
|
||||||
*/
|
*/
|
||||||
if (!user_mode(regs))
|
if (!user_mode(regs))
|
||||||
return 1;
|
return;
|
||||||
|
|
||||||
if (try_to_freeze())
|
if (try_to_freeze())
|
||||||
goto no_signal;
|
goto no_signal;
|
||||||
|
|
||||||
if (!oldset)
|
if (test_thread_flag(TIF_RESTORE_SIGMASK))
|
||||||
|
oldset = ¤t->saved_sigmask;
|
||||||
|
else
|
||||||
oldset = ¤t->blocked;
|
oldset = ¤t->blocked;
|
||||||
|
|
||||||
signr = get_signal_to_deliver(&info, &ka, regs, NULL);
|
signr = get_signal_to_deliver(&info, &ka, regs, NULL);
|
||||||
|
@ -363,8 +345,10 @@ int do_signal(struct pt_regs *regs, sigset_t *oldset)
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/* Whee! Actually deliver the signal. */
|
/* Whee! Actually deliver the signal. */
|
||||||
handle_signal(signr, &ka, &info, oldset, regs);
|
if (handle_signal(signr, &ka, &info, oldset, regs) == 0)
|
||||||
return 1;
|
clear_thread_flag(TIF_RESTORE_SIGMASK);
|
||||||
|
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
no_signal:
|
no_signal:
|
||||||
|
@ -375,31 +359,24 @@ int do_signal(struct pt_regs *regs, sigset_t *oldset)
|
||||||
regs->r0 == -ERESTARTSYS ||
|
regs->r0 == -ERESTARTSYS ||
|
||||||
regs->r0 == -ERESTARTNOINTR) {
|
regs->r0 == -ERESTARTNOINTR) {
|
||||||
regs->r0 = regs->orig_r0;
|
regs->r0 = regs->orig_r0;
|
||||||
inst = *(unsigned short *)(regs->bpc - 2);
|
prev_insn(regs);
|
||||||
if ((inst & 0xfff0) == 0x10f0) /* trap ? */
|
} else if (regs->r0 == -ERESTART_RESTARTBLOCK){
|
||||||
regs->bpc -= 2;
|
|
||||||
else
|
|
||||||
regs->bpc -= 4;
|
|
||||||
}
|
|
||||||
if (regs->r0 == -ERESTART_RESTARTBLOCK){
|
|
||||||
regs->r0 = regs->orig_r0;
|
regs->r0 = regs->orig_r0;
|
||||||
regs->r7 = __NR_restart_syscall;
|
regs->r7 = __NR_restart_syscall;
|
||||||
inst = *(unsigned short *)(regs->bpc - 2);
|
prev_insn(regs);
|
||||||
if ((inst & 0xfff0) == 0x10f0) /* trap ? */
|
|
||||||
regs->bpc -= 2;
|
|
||||||
else
|
|
||||||
regs->bpc -= 4;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return 0;
|
if (test_thread_flag(TIF_RESTORE_SIGMASK)) {
|
||||||
|
clear_thread_flag(TIF_RESTORE_SIGMASK);
|
||||||
|
sigprocmask(SIG_SETMASK, ¤t->saved_sigmask, NULL);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* notification of userspace execution resumption
|
* notification of userspace execution resumption
|
||||||
* - triggered by current->work.notify_resume
|
* - triggered by current->work.notify_resume
|
||||||
*/
|
*/
|
||||||
void do_notify_resume(struct pt_regs *regs, sigset_t *oldset,
|
void do_notify_resume(struct pt_regs *regs, __u32 thread_info_flags)
|
||||||
__u32 thread_info_flags)
|
|
||||||
{
|
{
|
||||||
/* Pending single-step? */
|
/* Pending single-step? */
|
||||||
if (thread_info_flags & _TIF_SINGLESTEP)
|
if (thread_info_flags & _TIF_SINGLESTEP)
|
||||||
|
@ -407,7 +384,7 @@ void do_notify_resume(struct pt_regs *regs, sigset_t *oldset,
|
||||||
|
|
||||||
/* deal with pending signal delivery */
|
/* deal with pending signal delivery */
|
||||||
if (thread_info_flags & _TIF_SIGPENDING)
|
if (thread_info_flags & _TIF_SIGPENDING)
|
||||||
do_signal(regs,oldset);
|
do_signal(regs);
|
||||||
|
|
||||||
if (thread_info_flags & _TIF_NOTIFY_RESUME) {
|
if (thread_info_flags & _TIF_NOTIFY_RESUME) {
|
||||||
clear_thread_flag(TIF_NOTIFY_RESUME);
|
clear_thread_flag(TIF_NOTIFY_RESUME);
|
||||||
|
|
|
@ -340,10 +340,13 @@
|
||||||
#define __NR_set_thread_area 334
|
#define __NR_set_thread_area 334
|
||||||
#define __NR_atomic_cmpxchg_32 335
|
#define __NR_atomic_cmpxchg_32 335
|
||||||
#define __NR_atomic_barrier 336
|
#define __NR_atomic_barrier 336
|
||||||
|
#define __NR_fanotify_init 337
|
||||||
|
#define __NR_fanotify_mark 338
|
||||||
|
#define __NR_prlimit64 339
|
||||||
|
|
||||||
#ifdef __KERNEL__
|
#ifdef __KERNEL__
|
||||||
|
|
||||||
#define NR_syscalls 337
|
#define NR_syscalls 340
|
||||||
|
|
||||||
#define __ARCH_WANT_IPC_PARSE_VERSION
|
#define __ARCH_WANT_IPC_PARSE_VERSION
|
||||||
#define __ARCH_WANT_OLD_READDIR
|
#define __ARCH_WANT_OLD_READDIR
|
||||||
|
|
|
@ -765,4 +765,7 @@ sys_call_table:
|
||||||
.long sys_set_thread_area
|
.long sys_set_thread_area
|
||||||
.long sys_atomic_cmpxchg_32 /* 335 */
|
.long sys_atomic_cmpxchg_32 /* 335 */
|
||||||
.long sys_atomic_barrier
|
.long sys_atomic_barrier
|
||||||
|
.long sys_fanotify_init
|
||||||
|
.long sys_fanotify_mark
|
||||||
|
.long sys_prlimit64
|
||||||
|
|
||||||
|
|
|
@ -162,7 +162,7 @@ static void mac_init_asc( void )
|
||||||
void mac_mksound( unsigned int freq, unsigned int length )
|
void mac_mksound( unsigned int freq, unsigned int length )
|
||||||
{
|
{
|
||||||
__u32 cfreq = ( freq << 5 ) / 468;
|
__u32 cfreq = ( freq << 5 ) / 468;
|
||||||
__u32 flags;
|
unsigned long flags;
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
if ( mac_special_bell == NULL )
|
if ( mac_special_bell == NULL )
|
||||||
|
@ -224,7 +224,7 @@ static void mac_nosound( unsigned long ignored )
|
||||||
*/
|
*/
|
||||||
static void mac_quadra_start_bell( unsigned int freq, unsigned int length, unsigned int volume )
|
static void mac_quadra_start_bell( unsigned int freq, unsigned int length, unsigned int volume )
|
||||||
{
|
{
|
||||||
__u32 flags;
|
unsigned long flags;
|
||||||
|
|
||||||
/* if the bell is already ringing, ring longer */
|
/* if the bell is already ringing, ring longer */
|
||||||
if ( mac_bell_duration > 0 )
|
if ( mac_bell_duration > 0 )
|
||||||
|
@ -271,7 +271,7 @@ static void mac_quadra_start_bell( unsigned int freq, unsigned int length, unsig
|
||||||
static void mac_quadra_ring_bell( unsigned long ignored )
|
static void mac_quadra_ring_bell( unsigned long ignored )
|
||||||
{
|
{
|
||||||
int i, count = mac_asc_samplespersec / HZ;
|
int i, count = mac_asc_samplespersec / HZ;
|
||||||
__u32 flags;
|
unsigned long flags;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* we neither want a sound buffer overflow nor underflow, so we need to match
|
* we neither want a sound buffer overflow nor underflow, so we need to match
|
||||||
|
|
|
@ -355,6 +355,9 @@ ENTRY(sys_call_table)
|
||||||
.long sys_set_thread_area
|
.long sys_set_thread_area
|
||||||
.long sys_atomic_cmpxchg_32 /* 335 */
|
.long sys_atomic_cmpxchg_32 /* 335 */
|
||||||
.long sys_atomic_barrier
|
.long sys_atomic_barrier
|
||||||
|
.long sys_fanotify_init
|
||||||
|
.long sys_fanotify_mark
|
||||||
|
.long sys_prlimit64
|
||||||
|
|
||||||
.rept NR_syscalls-(.-sys_call_table)/4
|
.rept NR_syscalls-(.-sys_call_table)/4
|
||||||
.long sys_ni_syscall
|
.long sys_ni_syscall
|
||||||
|
|
|
@ -13,6 +13,7 @@ config MIPS
|
||||||
select HAVE_KPROBES
|
select HAVE_KPROBES
|
||||||
select HAVE_KRETPROBES
|
select HAVE_KRETPROBES
|
||||||
select RTC_LIB if !MACH_LOONGSON
|
select RTC_LIB if !MACH_LOONGSON
|
||||||
|
select GENERIC_ATOMIC64 if !64BIT
|
||||||
|
|
||||||
mainmenu "Linux/MIPS Kernel Configuration"
|
mainmenu "Linux/MIPS Kernel Configuration"
|
||||||
|
|
||||||
|
@ -1646,8 +1647,16 @@ config MIPS_MT_SMP
|
||||||
select SYS_SUPPORTS_SMP
|
select SYS_SUPPORTS_SMP
|
||||||
select SMP_UP
|
select SMP_UP
|
||||||
help
|
help
|
||||||
This is a kernel model which is also known a VSMP or lately
|
This is a kernel model which is known a VSMP but lately has been
|
||||||
has been marketesed into SMVP.
|
marketesed into SMVP.
|
||||||
|
Virtual SMP uses the processor's VPEs to implement virtual
|
||||||
|
processors. In currently available configuration of the 34K processor
|
||||||
|
this allows for a dual processor. Both processors will share the same
|
||||||
|
primary caches; each will obtain the half of the TLB for it's own
|
||||||
|
exclusive use. For a layman this model can be described as similar to
|
||||||
|
what Intel calls Hyperthreading.
|
||||||
|
|
||||||
|
For further information see http://www.linux-mips.org/wiki/34K#VSMP
|
||||||
|
|
||||||
config MIPS_MT_SMTC
|
config MIPS_MT_SMTC
|
||||||
bool "SMTC: Use all TCs on all VPEs for SMP"
|
bool "SMTC: Use all TCs on all VPEs for SMP"
|
||||||
|
@ -1664,6 +1673,14 @@ config MIPS_MT_SMTC
|
||||||
help
|
help
|
||||||
This is a kernel model which is known a SMTC or lately has been
|
This is a kernel model which is known a SMTC or lately has been
|
||||||
marketesed into SMVP.
|
marketesed into SMVP.
|
||||||
|
is presenting the available TC's of the core as processors to Linux.
|
||||||
|
On currently available 34K processors this means a Linux system will
|
||||||
|
see up to 5 processors. The implementation of the SMTC kernel differs
|
||||||
|
significantly from VSMP and cannot efficiently coexist in the same
|
||||||
|
kernel binary so the choice between VSMP and SMTC is a compile time
|
||||||
|
decision.
|
||||||
|
|
||||||
|
For further information see http://www.linux-mips.org/wiki/34K#SMTC
|
||||||
|
|
||||||
endchoice
|
endchoice
|
||||||
|
|
||||||
|
|
|
@ -43,7 +43,7 @@ int prom_argc;
|
||||||
char **prom_argv;
|
char **prom_argv;
|
||||||
char **prom_envp;
|
char **prom_envp;
|
||||||
|
|
||||||
void prom_init_cmdline(void)
|
void __init prom_init_cmdline(void)
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
|
@ -104,7 +104,7 @@ static inline void str2eaddr(unsigned char *ea, unsigned char *str)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
int prom_get_ethernet_addr(char *ethernet_addr)
|
int __init prom_get_ethernet_addr(char *ethernet_addr)
|
||||||
{
|
{
|
||||||
char *ethaddr_str;
|
char *ethaddr_str;
|
||||||
|
|
||||||
|
@ -123,7 +123,6 @@ int prom_get_ethernet_addr(char *ethernet_addr)
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL(prom_get_ethernet_addr);
|
|
||||||
|
|
||||||
void __init prom_free_prom_memory(void)
|
void __init prom_free_prom_memory(void)
|
||||||
{
|
{
|
||||||
|
|
|
@ -59,7 +59,7 @@ $(obj)/piggy.o: $(obj)/dummy.o $(obj)/vmlinux.bin.z FORCE
|
||||||
hostprogs-y := calc_vmlinuz_load_addr
|
hostprogs-y := calc_vmlinuz_load_addr
|
||||||
|
|
||||||
VMLINUZ_LOAD_ADDRESS = $(shell $(obj)/calc_vmlinuz_load_addr \
|
VMLINUZ_LOAD_ADDRESS = $(shell $(obj)/calc_vmlinuz_load_addr \
|
||||||
$(objtree)/$(KBUILD_IMAGE) $(VMLINUX_LOAD_ADDRESS))
|
$(obj)/vmlinux.bin $(VMLINUX_LOAD_ADDRESS))
|
||||||
|
|
||||||
vmlinuzobjs-y += $(obj)/piggy.o
|
vmlinuzobjs-y += $(obj)/piggy.o
|
||||||
|
|
||||||
|
|
|
@ -83,3 +83,7 @@ config ARCH_SPARSEMEM_ENABLE
|
||||||
def_bool y
|
def_bool y
|
||||||
select SPARSEMEM_STATIC
|
select SPARSEMEM_STATIC
|
||||||
depends on CPU_CAVIUM_OCTEON
|
depends on CPU_CAVIUM_OCTEON
|
||||||
|
|
||||||
|
config CAVIUM_OCTEON_HELPER
|
||||||
|
def_bool y
|
||||||
|
depends on OCTEON_ETHERNET || PCI
|
||||||
|
|
|
@ -41,7 +41,7 @@ static int cnmips_cu2_call(struct notifier_block *nfb, unsigned long action,
|
||||||
return NOTIFY_OK; /* Let default notifier send signals */
|
return NOTIFY_OK; /* Let default notifier send signals */
|
||||||
}
|
}
|
||||||
|
|
||||||
static int cnmips_cu2_setup(void)
|
static int __init cnmips_cu2_setup(void)
|
||||||
{
|
{
|
||||||
return cu2_notifier(cnmips_cu2_call, 0);
|
return cu2_notifier(cnmips_cu2_call, 0);
|
||||||
}
|
}
|
||||||
|
|
|
@ -11,4 +11,4 @@
|
||||||
|
|
||||||
obj-y += cvmx-bootmem.o cvmx-l2c.o cvmx-sysinfo.o octeon-model.o
|
obj-y += cvmx-bootmem.o cvmx-l2c.o cvmx-sysinfo.o octeon-model.o
|
||||||
|
|
||||||
obj-$(CONFIG_PCI) += cvmx-helper-errata.o cvmx-helper-jtag.o
|
obj-$(CONFIG_CAVIUM_OCTEON_HELPER) += cvmx-helper-errata.o cvmx-helper-jtag.o
|
||||||
|
|
|
@ -782,6 +782,10 @@ static __inline__ int atomic64_add_unless(atomic64_t *v, long a, long u)
|
||||||
*/
|
*/
|
||||||
#define atomic64_add_negative(i, v) (atomic64_add_return(i, (v)) < 0)
|
#define atomic64_add_negative(i, v) (atomic64_add_return(i, (v)) < 0)
|
||||||
|
|
||||||
|
#else /* !CONFIG_64BIT */
|
||||||
|
|
||||||
|
#include <asm-generic/atomic64.h>
|
||||||
|
|
||||||
#endif /* CONFIG_64BIT */
|
#endif /* CONFIG_64BIT */
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
|
@ -145,7 +145,7 @@ static inline compat_uptr_t ptr_to_compat(void __user *uptr)
|
||||||
return (u32)(unsigned long)uptr;
|
return (u32)(unsigned long)uptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline void __user *compat_alloc_user_space(long len)
|
static inline void __user *arch_compat_alloc_user_space(long len)
|
||||||
{
|
{
|
||||||
struct pt_regs *regs = (struct pt_regs *)
|
struct pt_regs *regs = (struct pt_regs *)
|
||||||
((unsigned long) current_thread_info() + THREAD_SIZE - 32) - 1;
|
((unsigned long) current_thread_info() + THREAD_SIZE - 32) - 1;
|
||||||
|
|
|
@ -24,7 +24,7 @@ extern int cu2_notifier_call_chain(unsigned long val, void *v);
|
||||||
|
|
||||||
#define cu2_notifier(fn, pri) \
|
#define cu2_notifier(fn, pri) \
|
||||||
({ \
|
({ \
|
||||||
static struct notifier_block fn##_nb __cpuinitdata = { \
|
static struct notifier_block fn##_nb = { \
|
||||||
.notifier_call = fn, \
|
.notifier_call = fn, \
|
||||||
.priority = pri \
|
.priority = pri \
|
||||||
}; \
|
}; \
|
||||||
|
|
|
@ -321,6 +321,7 @@ struct gic_intrmask_regs {
|
||||||
*/
|
*/
|
||||||
struct gic_intr_map {
|
struct gic_intr_map {
|
||||||
unsigned int cpunum; /* Directed to this CPU */
|
unsigned int cpunum; /* Directed to this CPU */
|
||||||
|
#define GIC_UNUSED 0xdead /* Dummy data */
|
||||||
unsigned int pin; /* Directed to this Pin */
|
unsigned int pin; /* Directed to this Pin */
|
||||||
unsigned int polarity; /* Polarity : +/- */
|
unsigned int polarity; /* Polarity : +/- */
|
||||||
unsigned int trigtype; /* Trigger : Edge/Levl */
|
unsigned int trigtype; /* Trigger : Edge/Levl */
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
#ifndef __ASM_MACH_TX49XX_KMALLOC_H
|
#ifndef __ASM_MACH_TX49XX_KMALLOC_H
|
||||||
#define __ASM_MACH_TX49XX_KMALLOC_H
|
#define __ASM_MACH_TX49XX_KMALLOC_H
|
||||||
|
|
||||||
#define ARCH_KMALLOC_MINALIGN L1_CACHE_BYTES
|
#define ARCH_DMA_MINALIGN L1_CACHE_BYTES
|
||||||
|
|
||||||
#endif /* __ASM_MACH_TX49XX_KMALLOC_H */
|
#endif /* __ASM_MACH_TX49XX_KMALLOC_H */
|
||||||
|
|
|
@ -88,9 +88,6 @@
|
||||||
|
|
||||||
#define GIC_EXT_INTR(x) x
|
#define GIC_EXT_INTR(x) x
|
||||||
|
|
||||||
/* Dummy data */
|
|
||||||
#define X 0xdead
|
|
||||||
|
|
||||||
/* External Interrupts used for IPI */
|
/* External Interrupts used for IPI */
|
||||||
#define GIC_IPI_EXT_INTR_RESCHED_VPE0 16
|
#define GIC_IPI_EXT_INTR_RESCHED_VPE0 16
|
||||||
#define GIC_IPI_EXT_INTR_CALLFNC_VPE0 17
|
#define GIC_IPI_EXT_INTR_CALLFNC_VPE0 17
|
||||||
|
|
|
@ -150,6 +150,20 @@ typedef struct { unsigned long pgprot; } pgprot_t;
|
||||||
((unsigned long)(x) - PAGE_OFFSET + PHYS_OFFSET)
|
((unsigned long)(x) - PAGE_OFFSET + PHYS_OFFSET)
|
||||||
#endif
|
#endif
|
||||||
#define __va(x) ((void *)((unsigned long)(x) + PAGE_OFFSET - PHYS_OFFSET))
|
#define __va(x) ((void *)((unsigned long)(x) + PAGE_OFFSET - PHYS_OFFSET))
|
||||||
|
|
||||||
|
/*
|
||||||
|
* RELOC_HIDE was originally added by 6007b903dfe5f1d13e0c711ac2894bdd4a61b1ad
|
||||||
|
* (lmo) rsp. 8431fd094d625b94d364fe393076ccef88e6ce18 (kernel.org). The
|
||||||
|
* discussion can be found in lkml posting
|
||||||
|
* <a2ebde260608230500o3407b108hc03debb9da6e62c@mail.gmail.com> which is
|
||||||
|
* archived at http://lists.linuxcoding.com/kernel/2006-q3/msg17360.html
|
||||||
|
*
|
||||||
|
* It is unclear if the misscompilations mentioned in
|
||||||
|
* http://lkml.org/lkml/2010/8/8/138 also affect MIPS so we keep this one
|
||||||
|
* until GCC 3.x has been retired before we can apply
|
||||||
|
* https://patchwork.linux-mips.org/patch/1541/
|
||||||
|
*/
|
||||||
|
|
||||||
#define __pa_symbol(x) __pa(RELOC_HIDE((unsigned long)(x), 0))
|
#define __pa_symbol(x) __pa(RELOC_HIDE((unsigned long)(x), 0))
|
||||||
|
|
||||||
#define pfn_to_kaddr(pfn) __va((pfn) << PAGE_SHIFT)
|
#define pfn_to_kaddr(pfn) __va((pfn) << PAGE_SHIFT)
|
||||||
|
|
|
@ -146,7 +146,8 @@ register struct thread_info *__current_thread_info __asm__("$28");
|
||||||
#define _TIF_LOAD_WATCH (1<<TIF_LOAD_WATCH)
|
#define _TIF_LOAD_WATCH (1<<TIF_LOAD_WATCH)
|
||||||
|
|
||||||
/* work to do on interrupt/exception return */
|
/* work to do on interrupt/exception return */
|
||||||
#define _TIF_WORK_MASK (0x0000ffef & ~_TIF_SECCOMP)
|
#define _TIF_WORK_MASK (0x0000ffef & \
|
||||||
|
~(_TIF_SECCOMP | _TIF_SYSCALL_AUDIT))
|
||||||
/* work to do on any return to u-space */
|
/* work to do on any return to u-space */
|
||||||
#define _TIF_ALLWORK_MASK (0x8000ffff & ~_TIF_SECCOMP)
|
#define _TIF_ALLWORK_MASK (0x8000ffff & ~_TIF_SECCOMP)
|
||||||
|
|
||||||
|
|
|
@ -356,16 +356,19 @@
|
||||||
#define __NR_perf_event_open (__NR_Linux + 333)
|
#define __NR_perf_event_open (__NR_Linux + 333)
|
||||||
#define __NR_accept4 (__NR_Linux + 334)
|
#define __NR_accept4 (__NR_Linux + 334)
|
||||||
#define __NR_recvmmsg (__NR_Linux + 335)
|
#define __NR_recvmmsg (__NR_Linux + 335)
|
||||||
|
#define __NR_fanotify_init (__NR_Linux + 336)
|
||||||
|
#define __NR_fanotify_mark (__NR_Linux + 337)
|
||||||
|
#define __NR_prlimit64 (__NR_Linux + 338)
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Offset of the last Linux o32 flavoured syscall
|
* Offset of the last Linux o32 flavoured syscall
|
||||||
*/
|
*/
|
||||||
#define __NR_Linux_syscalls 335
|
#define __NR_Linux_syscalls 338
|
||||||
|
|
||||||
#endif /* _MIPS_SIM == _MIPS_SIM_ABI32 */
|
#endif /* _MIPS_SIM == _MIPS_SIM_ABI32 */
|
||||||
|
|
||||||
#define __NR_O32_Linux 4000
|
#define __NR_O32_Linux 4000
|
||||||
#define __NR_O32_Linux_syscalls 335
|
#define __NR_O32_Linux_syscalls 338
|
||||||
|
|
||||||
#if _MIPS_SIM == _MIPS_SIM_ABI64
|
#if _MIPS_SIM == _MIPS_SIM_ABI64
|
||||||
|
|
||||||
|
@ -668,16 +671,19 @@
|
||||||
#define __NR_perf_event_open (__NR_Linux + 292)
|
#define __NR_perf_event_open (__NR_Linux + 292)
|
||||||
#define __NR_accept4 (__NR_Linux + 293)
|
#define __NR_accept4 (__NR_Linux + 293)
|
||||||
#define __NR_recvmmsg (__NR_Linux + 294)
|
#define __NR_recvmmsg (__NR_Linux + 294)
|
||||||
|
#define __NR_fanotify_init (__NR_Linux + 295)
|
||||||
|
#define __NR_fanotify_mark (__NR_Linux + 296)
|
||||||
|
#define __NR_prlimit64 (__NR_Linux + 297)
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Offset of the last Linux 64-bit flavoured syscall
|
* Offset of the last Linux 64-bit flavoured syscall
|
||||||
*/
|
*/
|
||||||
#define __NR_Linux_syscalls 294
|
#define __NR_Linux_syscalls 297
|
||||||
|
|
||||||
#endif /* _MIPS_SIM == _MIPS_SIM_ABI64 */
|
#endif /* _MIPS_SIM == _MIPS_SIM_ABI64 */
|
||||||
|
|
||||||
#define __NR_64_Linux 5000
|
#define __NR_64_Linux 5000
|
||||||
#define __NR_64_Linux_syscalls 294
|
#define __NR_64_Linux_syscalls 297
|
||||||
|
|
||||||
#if _MIPS_SIM == _MIPS_SIM_NABI32
|
#if _MIPS_SIM == _MIPS_SIM_NABI32
|
||||||
|
|
||||||
|
@ -985,16 +991,19 @@
|
||||||
#define __NR_accept4 (__NR_Linux + 297)
|
#define __NR_accept4 (__NR_Linux + 297)
|
||||||
#define __NR_recvmmsg (__NR_Linux + 298)
|
#define __NR_recvmmsg (__NR_Linux + 298)
|
||||||
#define __NR_getdents64 (__NR_Linux + 299)
|
#define __NR_getdents64 (__NR_Linux + 299)
|
||||||
|
#define __NR_fanotify_init (__NR_Linux + 300)
|
||||||
|
#define __NR_fanotify_mark (__NR_Linux + 301)
|
||||||
|
#define __NR_prlimit64 (__NR_Linux + 302)
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Offset of the last N32 flavoured syscall
|
* Offset of the last N32 flavoured syscall
|
||||||
*/
|
*/
|
||||||
#define __NR_Linux_syscalls 299
|
#define __NR_Linux_syscalls 302
|
||||||
|
|
||||||
#endif /* _MIPS_SIM == _MIPS_SIM_NABI32 */
|
#endif /* _MIPS_SIM == _MIPS_SIM_NABI32 */
|
||||||
|
|
||||||
#define __NR_N32_Linux 6000
|
#define __NR_N32_Linux 6000
|
||||||
#define __NR_N32_Linux_syscalls 299
|
#define __NR_N32_Linux_syscalls 302
|
||||||
|
|
||||||
#ifdef __KERNEL__
|
#ifdef __KERNEL__
|
||||||
|
|
||||||
|
|
|
@ -7,7 +7,6 @@
|
||||||
#include <asm/io.h>
|
#include <asm/io.h>
|
||||||
#include <asm/gic.h>
|
#include <asm/gic.h>
|
||||||
#include <asm/gcmpregs.h>
|
#include <asm/gcmpregs.h>
|
||||||
#include <asm/mips-boards/maltaint.h>
|
|
||||||
#include <asm/irq.h>
|
#include <asm/irq.h>
|
||||||
#include <linux/hardirq.h>
|
#include <linux/hardirq.h>
|
||||||
#include <asm-generic/bitops/find.h>
|
#include <asm-generic/bitops/find.h>
|
||||||
|
@ -131,7 +130,7 @@ static int gic_set_affinity(unsigned int irq, const struct cpumask *cpumask)
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
irq -= _irqbase;
|
irq -= _irqbase;
|
||||||
pr_debug(KERN_DEBUG "%s(%d) called\n", __func__, irq);
|
pr_debug("%s(%d) called\n", __func__, irq);
|
||||||
cpumask_and(&tmp, cpumask, cpu_online_mask);
|
cpumask_and(&tmp, cpumask, cpu_online_mask);
|
||||||
if (cpus_empty(tmp))
|
if (cpus_empty(tmp))
|
||||||
return -1;
|
return -1;
|
||||||
|
@ -222,7 +221,7 @@ static void __init gic_basic_init(int numintrs, int numvpes,
|
||||||
/* Setup specifics */
|
/* Setup specifics */
|
||||||
for (i = 0; i < mapsize; i++) {
|
for (i = 0; i < mapsize; i++) {
|
||||||
cpu = intrmap[i].cpunum;
|
cpu = intrmap[i].cpunum;
|
||||||
if (cpu == X)
|
if (cpu == GIC_UNUSED)
|
||||||
continue;
|
continue;
|
||||||
if (cpu == 0 && i != 0 && intrmap[i].flags == 0)
|
if (cpu == 0 && i != 0 && intrmap[i].flags == 0)
|
||||||
continue;
|
continue;
|
||||||
|
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue