Merge branch 'globalheartbeat-2' of git://oss.oracle.com/git/smushran/linux-2.6 into ocfs2-merge-window
Conflicts: fs/ocfs2/ocfs2.h
This commit is contained in:
		
						commit
						fc3718918f
					
				
							
								
								
									
										8
									
								
								CREDITS
									
									
									
									
									
								
							
							
						
						
									
										8
									
								
								CREDITS
									
									
									
									
									
								
							| @ -3554,12 +3554,12 @@ E: cvance@nai.com | ||||
| D: portions of the Linux Security Module (LSM) framework and security modules | ||||
| 
 | ||||
| N: Petr Vandrovec | ||||
| E: vandrove@vc.cvut.cz | ||||
| E: petr@vandrovec.name | ||||
| D: Small contributions to ncpfs | ||||
| D: Matrox framebuffer driver | ||||
| S: Chudenicka 8 | ||||
| S: 10200 Prague 10, Hostivar | ||||
| S: Czech Republic | ||||
| S: 21513 Conradia Ct | ||||
| S: Cupertino, CA 95014 | ||||
| S: USA | ||||
| 
 | ||||
| N: Thibaut Varene | ||||
| E: T-Bone@parisc-linux.org | ||||
|  | ||||
| @ -46,7 +46,6 @@ | ||||
| 
 | ||||
|      <sect1><title>Atomic and pointer manipulation</title> | ||||
| !Iarch/x86/include/asm/atomic.h | ||||
| !Iarch/x86/include/asm/unaligned.h | ||||
|      </sect1> | ||||
| 
 | ||||
|      <sect1><title>Delaying, scheduling, and timer routines</title> | ||||
|  | ||||
| @ -57,7 +57,6 @@ | ||||
|      </para> | ||||
| 
 | ||||
|      <sect1><title>String Conversions</title> | ||||
| !Ilib/vsprintf.c | ||||
| !Elib/vsprintf.c | ||||
|      </sect1> | ||||
|      <sect1><title>String Manipulation</title> | ||||
|  | ||||
							
								
								
									
										45
									
								
								Documentation/block/cfq-iosched.txt
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										45
									
								
								Documentation/block/cfq-iosched.txt
									
									
									
									
									
										Normal file
									
								
							| @ -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 | ||||
| ================= | ||||
| /sys/block/<disk>/queue/iosched/group_isolation | ||||
| ----------------------------------------------- | ||||
| 
 | ||||
| If group_isolation=1, it provides stronger isolation between groups at the | ||||
| 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 | ||||
| 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 | ||||
| ========== | ||||
| - Currently only sync IO queues are support. All the buffered writes are | ||||
|  | ||||
| @ -109,17 +109,19 @@ use numbers 2000-2063 to identify GPIOs in a bank of I2C GPIO expanders. | ||||
| 
 | ||||
| If you want to initialize a structure with an invalid GPIO number, use | ||||
| some negative number (perhaps "-EINVAL"); that will never be valid.  To | ||||
| test if a number could reference a GPIO, you may use this predicate: | ||||
| test if such number from such a structure could reference a GPIO, you | ||||
| may use this predicate: | ||||
| 
 | ||||
| 	int gpio_is_valid(int number); | ||||
| 
 | ||||
| A number that's not valid will be rejected by calls which may request | ||||
| or free GPIOs (see below).  Other numbers may also be rejected; for | ||||
| example, a number might be valid but unused on a given board. | ||||
| 
 | ||||
| Whether a platform supports multiple GPIO controllers is currently a | ||||
| platform-specific implementation issue. | ||||
| example, a number might be valid but temporarily unused on a given board. | ||||
| 
 | ||||
| Whether a platform supports multiple GPIO controllers is a platform-specific | ||||
| implementation issue, as are whether that support can leave "holes" in the space | ||||
| of GPIO numbers, and whether new controllers can be added at runtime.  Such issues | ||||
| can affect things including whether adjacent GPIO numbers are both valid. | ||||
| 
 | ||||
| Using GPIOs | ||||
| ----------- | ||||
| @ -480,12 +482,16 @@ To support this framework, a platform's Kconfig will "select" either | ||||
| ARCH_REQUIRE_GPIOLIB or ARCH_WANT_OPTIONAL_GPIOLIB | ||||
| and arrange that its <asm/gpio.h> includes <asm-generic/gpio.h> and defines | ||||
| three functions: gpio_get_value(), gpio_set_value(), and gpio_cansleep(). | ||||
| They may also want to provide a custom value for ARCH_NR_GPIOS. | ||||
| 
 | ||||
| ARCH_REQUIRE_GPIOLIB means that the gpio-lib code will always get compiled | ||||
| It may also provide a custom value for ARCH_NR_GPIOS, so that it better | ||||
| reflects the number of GPIOs in actual use on that platform, without | ||||
| wasting static table space.  (It should count both built-in/SoC GPIOs and | ||||
| also ones on GPIO expanders. | ||||
| 
 | ||||
| ARCH_REQUIRE_GPIOLIB means that the gpiolib code will always get compiled | ||||
| into the kernel on that architecture. | ||||
| 
 | ||||
| ARCH_WANT_OPTIONAL_GPIOLIB means the gpio-lib code defaults to off and the user | ||||
| ARCH_WANT_OPTIONAL_GPIOLIB means the gpiolib code defaults to off and the user | ||||
| can enable it and build it into the kernel optionally. | ||||
| 
 | ||||
| If neither of these options are selected, the platform does not support | ||||
|  | ||||
| @ -91,12 +91,11 @@ name		The chip name. | ||||
| 		I2C devices get this attribute created automatically. | ||||
| 		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 | ||||
| 		RW | ||||
| 		Some devices have a variable update rate. This attribute | ||||
| 		can be used to change the update rate to the desired | ||||
| 		frequency. | ||||
| 		Some devices have a variable update rate or interval. | ||||
| 		This attribute can be used to change it to the desired value. | ||||
| 
 | ||||
| 
 | ||||
| ************ | ||||
|  | ||||
| @ -345,5 +345,10 @@ documentation, in <filename>, for the functions listed. | ||||
| section titled <section title> from <filename>. | ||||
| 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. | ||||
| */ <twaugh@redhat.com> | ||||
|  | ||||
| @ -13,7 +13,7 @@ regulators (where voltage output is controllable) and current sinks (where | ||||
| current limit is controllable). | ||||
| 
 | ||||
| (C) 2008  Wolfson Microelectronics PLC. | ||||
| Author: Liam Girdwood <lg@opensource.wolfsonmicro.com> | ||||
| Author: Liam Girdwood <lrg@slimlogic.co.uk> | ||||
| 
 | ||||
| 
 | ||||
| Nomenclature | ||||
|  | ||||
| @ -296,6 +296,7 @@ Conexant 5051 | ||||
| Conexant 5066 | ||||
| ============= | ||||
|   laptop	Basic Laptop config (default) | ||||
|   hp-laptop	HP laptops, e g G60 | ||||
|   dell-laptop	Dell laptops | ||||
|   dell-vostro	Dell Vostro | ||||
|   olpc-xo-1_5	OLPC XO 1.5 | ||||
|  | ||||
							
								
								
									
										380
									
								
								Documentation/workqueue.txt
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										380
									
								
								Documentation/workqueue.txt
									
									
									
									
									
										Normal file
									
								
							| @ -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. | ||||
							
								
								
									
										72
									
								
								MAINTAINERS
									
									
									
									
									
								
							
							
						
						
									
										72
									
								
								MAINTAINERS
									
									
									
									
									
								
							| @ -962,6 +962,13 @@ W:	http://www.fluff.org/ben/linux/ | ||||
| S:	Maintained | ||||
| 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 | ||||
| M:	Paul Mundt <lethal@linux-sh.org> | ||||
| M:	Magnus Damm <magnus.damm@gmail.com> | ||||
| @ -1135,7 +1142,7 @@ ATLX ETHERNET DRIVERS | ||||
| M:	Jay Cliburn <jcliburn@gmail.com> | ||||
| M:	Chris Snook <chris.snook@gmail.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://atl1.sourceforge.net | ||||
| S:	Maintained | ||||
| @ -1220,7 +1227,7 @@ F:	drivers/auxdisplay/ | ||||
| F:	include/linux/cfag12864b.h | ||||
| 
 | ||||
| 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://avr32linux.org/ | ||||
| W:	http://avrfreaks.net/ | ||||
| @ -1228,7 +1235,7 @@ S:	Supported | ||||
| F:	arch/avr32/ | ||||
| 
 | ||||
| AVR32/AT32AP MACHINE SUPPORT | ||||
| M:	Haavard Skinnemoen <hskinnemoen@atmel.com> | ||||
| M:	Hans-Christian Egtvedt <hans-christian.egtvedt@atmel.com> | ||||
| S:	Supported | ||||
| F:	arch/avr32/mach-at32ap/ | ||||
| 
 | ||||
| @ -1445,6 +1452,16 @@ S:	Maintained | ||||
| F:	Documentation/video4linux/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 | ||||
| M:	Muli Ben-Yehuda <muli@il.ibm.com> | ||||
| M:	"Jon D. Mason" <jdmason@kudzu.us> | ||||
| @ -2189,6 +2206,12 @@ W:	http://acpi4asus.sf.net | ||||
| S:	Maintained | ||||
| 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 | ||||
| W:	http://aeschi.ch.eu.org/efs/ | ||||
| S:	Orphan | ||||
| @ -2647,9 +2670,14 @@ S:	Maintained | ||||
| F:	drivers/media/video/gspca/ | ||||
| 
 | ||||
| HARDWARE MONITORING | ||||
| M:	Jean Delvare <khali@linux-fr.org> | ||||
| M:	Guenter Roeck <guenter.roeck@ericsson.com> | ||||
| L:	lm-sensors@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:	drivers/hwmon/ | ||||
| F:	include/linux/hwmon*.h | ||||
| @ -2787,11 +2815,6 @@ S:	Maintained | ||||
| F:	arch/x86/kernel/hpet.c | ||||
| F:	arch/x86/include/asm/hpet.h | ||||
| 
 | ||||
| HPET:	ACPI | ||||
| M:	Bob Picco <bob.picco@hp.com> | ||||
| S:	Maintained | ||||
| F:	drivers/char/hpet.c | ||||
| 
 | ||||
| HPFS FILESYSTEM | ||||
| M:	Mikulas Patocka <mikulas@artax.karlin.mff.cuni.cz> | ||||
| W:	http://artax.karlin.mff.cuni.cz/~mikulas/vyplody/hpfs/index-e.cgi | ||||
| @ -3404,7 +3427,7 @@ F:	drivers/s390/kvm/ | ||||
| 
 | ||||
| KEXEC | ||||
| M:	Eric Biederman <ebiederm@xmission.com> | ||||
| W:	http://ftp.kernel.org/pub/linux/kernel/people/horms/kexec-tools/ | ||||
| W:	http://kernel.org/pub/linux/utils/kernel/kexec/ | ||||
| L:	kexec@lists.infradead.org | ||||
| S:	Maintained | ||||
| F:	include/linux/kexec.h | ||||
| @ -3765,9 +3788,8 @@ W:	http://www.syskonnect.com | ||||
| S:	Supported | ||||
| 
 | ||||
| MATROX FRAMEBUFFER DRIVER | ||||
| M:	Petr Vandrovec <vandrove@vc.cvut.cz> | ||||
| L:	linux-fbdev@vger.kernel.org | ||||
| S:	Maintained | ||||
| S:	Orphan | ||||
| F:	drivers/video/matrox/matroxfb_* | ||||
| F:	include/linux/matroxfb.h | ||||
| 
 | ||||
| @ -3891,10 +3913,8 @@ F:	Documentation/serial/moxa-smartio | ||||
| F:	drivers/char/mxser.* | ||||
| 
 | ||||
| MSI LAPTOP SUPPORT | ||||
| M:	Lennart Poettering <mzxreary@0pointer.de> | ||||
| M:	Lee, Chun-Yi <jlee@novell.com> | ||||
| 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 | ||||
| F:	drivers/platform/x86/msi-laptop.c | ||||
| 
 | ||||
| @ -3911,8 +3931,10 @@ S:	Supported | ||||
| F:	drivers/mfd/ | ||||
| 
 | ||||
| MULTIMEDIA CARD (MMC), SECURE DIGITAL (SD) AND SDIO SUBSYSTEM | ||||
| S:	Orphan | ||||
| M:	Chris Ball <cjb@laptop.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:	include/linux/mmc/ | ||||
| 
 | ||||
| @ -3934,7 +3956,7 @@ F:	drivers/char/isicom.c | ||||
| F:	include/linux/isicom.h | ||||
| 
 | ||||
| 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 | ||||
| T:	git git://gitorious.org/usb/usb.git | ||||
| S:	Maintained | ||||
| @ -3954,8 +3976,8 @@ S:	Maintained | ||||
| F:	drivers/net/natsemi.c | ||||
| 
 | ||||
| NCP FILESYSTEM | ||||
| M:	Petr Vandrovec <vandrove@vc.cvut.cz> | ||||
| S:	Maintained | ||||
| M:	Petr Vandrovec <petr@vandrovec.name> | ||||
| S:	Odd Fixes | ||||
| F:	fs/ncpfs/ | ||||
| 
 | ||||
| NCR DUAL 700 SCSI DRIVER (MICROCHANNEL) | ||||
| @ -4232,7 +4254,7 @@ S:	Maintained | ||||
| F:	drivers/char/hw_random/omap-rng.c | ||||
| 
 | ||||
| OMAP USB SUPPORT | ||||
| M:	Felipe Balbi <felipe.balbi@nokia.com> | ||||
| M:	Felipe Balbi <balbi@ti.com> | ||||
| M:	David Brownell <dbrownell@users.sourceforge.net> | ||||
| L:	linux-usb@vger.kernel.org | ||||
| L:	linux-omap@vger.kernel.org | ||||
| @ -4843,12 +4865,10 @@ F:	kernel/rcu* | ||||
| F:	kernel/srcu* | ||||
| X:	kernel/rcutorture.c | ||||
| 
 | ||||
| REAL TIME CLOCK DRIVER | ||||
| REAL TIME CLOCK DRIVER (LEGACY) | ||||
| M:	Paul Gortmaker <p_gortmaker@yahoo.com> | ||||
| S:	Maintained | ||||
| F:	Documentation/rtc.txt | ||||
| F:	drivers/rtc/ | ||||
| F:	include/linux/rtc.h | ||||
| F:	drivers/char/rtc.c | ||||
| 
 | ||||
| REAL TIME CLOCK (RTC) SUBSYSTEM | ||||
| M:	Alessandro Zummo <a.zummo@towertech.it> | ||||
| @ -5085,8 +5105,10 @@ S:	Maintained | ||||
| F:	drivers/mmc/host/sdricoh_cs.c | ||||
| 
 | ||||
| SECURE DIGITAL HOST CONTROLLER INTERFACE (SDHCI) DRIVER | ||||
| S:	Orphan | ||||
| M:	Chris Ball <cjb@laptop.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.* | ||||
| 
 | ||||
| SECURE DIGITAL HOST CONTROLLER INTERFACE, OPEN FIRMWARE BINDINGS (SDHCI-OF) | ||||
|  | ||||
							
								
								
									
										2
									
								
								Makefile
									
									
									
									
									
								
							
							
						
						
									
										2
									
								
								Makefile
									
									
									
									
									
								
							| @ -1,7 +1,7 @@ | ||||
| VERSION = 2 | ||||
| PATCHLEVEL = 6 | ||||
| SUBLEVEL = 36 | ||||
| EXTRAVERSION = -rc3 | ||||
| EXTRAVERSION = -rc7 | ||||
| NAME = Sheep on Meth | ||||
| 
 | ||||
| # *DOCUMENTATION*
 | ||||
|  | ||||
| @ -32,8 +32,9 @@ config HAVE_OPROFILE | ||||
| 
 | ||||
| config KPROBES | ||||
| 	bool "Kprobes" | ||||
| 	depends on KALLSYMS && MODULES | ||||
| 	depends on MODULES | ||||
| 	depends on HAVE_KPROBES | ||||
| 	select KALLSYMS | ||||
| 	help | ||||
| 	  Kprobes allows you to trap at almost any kernel address and | ||||
| 	  execute a callback function.  register_kprobe() establishes | ||||
| @ -45,7 +46,6 @@ config OPTPROBES | ||||
| 	def_bool y | ||||
| 	depends on KPROBES && HAVE_OPTPROBES | ||||
| 	depends on !PREEMPT | ||||
| 	select KALLSYMS_ALL | ||||
| 
 | ||||
| config HAVE_EFFICIENT_UNALIGNED_ACCESS | ||||
| 	bool | ||||
|  | ||||
| @ -43,6 +43,8 @@ extern void smp_imb(void); | ||||
| /* ??? Ought to use this in arch/alpha/kernel/signal.c too.  */ | ||||
| 
 | ||||
| #ifndef CONFIG_SMP | ||||
| #include <linux/sched.h> | ||||
| 
 | ||||
| extern void __load_new_mm_context(struct mm_struct *); | ||||
| static inline void | ||||
| flush_icache_user_range(struct vm_area_struct *vma, struct page *page, | ||||
|  | ||||
| @ -449,10 +449,13 @@ | ||||
| #define __NR_pwritev			491 | ||||
| #define __NR_rt_tgsigqueueinfo		492 | ||||
| #define __NR_perf_event_open		493 | ||||
| #define __NR_fanotify_init		494 | ||||
| #define __NR_fanotify_mark		495 | ||||
| #define __NR_prlimit64			496 | ||||
| 
 | ||||
| #ifdef __KERNEL__ | ||||
| 
 | ||||
| #define NR_SYSCALLS			494 | ||||
| #define NR_SYSCALLS			497 | ||||
| 
 | ||||
| #define __ARCH_WANT_IPC_PARSE_VERSION | ||||
| #define __ARCH_WANT_OLD_READDIR | ||||
| @ -463,6 +466,7 @@ | ||||
| #define __ARCH_WANT_SYS_OLD_GETRLIMIT | ||||
| #define __ARCH_WANT_SYS_OLDUMOUNT | ||||
| #define __ARCH_WANT_SYS_SIGPENDING | ||||
| #define __ARCH_WANT_SYS_RT_SIGSUSPEND | ||||
| 
 | ||||
| /* "Conditional" syscalls.  What we want is
 | ||||
| 
 | ||||
|  | ||||
| @ -73,8 +73,6 @@ | ||||
| 	ldq	$20, HAE_REG($19);	\
 | ||||
| 	stq	$21, HAE_CACHE($19);	\
 | ||||
| 	stq	$21, 0($20);		\
 | ||||
| 	ldq	$0, 0($sp);		\
 | ||||
| 	ldq	$1, 8($sp);		\
 | ||||
| 99:;					\
 | ||||
| 	ldq	$19, 72($sp);		\
 | ||||
| 	ldq	$20, 80($sp);		\
 | ||||
| @ -316,19 +314,24 @@ ret_from_sys_call: | ||||
| 	cmovne	$26, 0, $19		/* $19 = 0 => non-restartable */ | ||||
| 	ldq	$0, SP_OFF($sp) | ||||
| 	and	$0, 8, $0 | ||||
| 	beq	$0, restore_all | ||||
| ret_from_reschedule: | ||||
| 	beq	$0, ret_to_kernel | ||||
| ret_to_user: | ||||
| 	/* Make sure need_resched and sigpending don't change between | ||||
| 		sampling and the rti.  */ | ||||
| 	lda	$16, 7 | ||||
| 	call_pal PAL_swpipl | ||||
| 	ldl	$5, TI_FLAGS($8) | ||||
| 	and	$5, _TIF_WORK_MASK, $2 | ||||
| 	bne	$5, work_pending | ||||
| 	bne	$2, work_pending | ||||
| restore_all: | ||||
| 	RESTORE_ALL | ||||
| 	call_pal PAL_rti | ||||
| 
 | ||||
| ret_to_kernel: | ||||
| 	lda	$16, 7 | ||||
| 	call_pal PAL_swpipl | ||||
| 	br restore_all | ||||
| 
 | ||||
| 	.align 3
 | ||||
| $syscall_error: | ||||
| 	/* | ||||
| @ -363,7 +366,7 @@ $ret_success: | ||||
|  *       $8: current. | ||||
|  *      $19: The old syscall number, or zero if this is not a return | ||||
|  *           from a syscall that errored and is possibly restartable. | ||||
|  *      $20: Error indication. | ||||
|  *      $20: The old a3 value | ||||
|  */ | ||||
| 
 | ||||
| 	.align	4
 | ||||
| @ -392,12 +395,18 @@ $work_resched: | ||||
| 
 | ||||
| $work_notifysig: | ||||
| 	mov	$sp, $16 | ||||
| 	br	$1, do_switch_stack | ||||
| 	bsr	$1, do_switch_stack | ||||
| 	mov	$sp, $17 | ||||
| 	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 | ||||
| 	mov	$9, $19 | ||||
| 	mov	$10, $20 | ||||
| 	bsr	$1, undo_switch_stack | ||||
| 	br	restore_all | ||||
| 	br	ret_to_user | ||||
| .end work_pending
 | ||||
| 
 | ||||
| /* | ||||
| @ -430,6 +439,7 @@ strace: | ||||
| 	beq	$1, 1f | ||||
| 	ldq	$27, 0($2) | ||||
| 1:	jsr	$26, ($27), sys_gettimeofday | ||||
| ret_from_straced: | ||||
| 	ldgp	$gp, 0($26) | ||||
| 
 | ||||
| 	/* check return.. */ | ||||
| @ -650,7 +660,7 @@ kernel_thread: | ||||
| 	/* We don't actually care for a3 success widgetry in the kernel. | ||||
| 	   Not for positive errno values.  */ | ||||
| 	stq	$0, 0($sp)		/* $0 */ | ||||
| 	br	restore_all | ||||
| 	br	ret_to_kernel | ||||
| .end kernel_thread
 | ||||
| 
 | ||||
| /* | ||||
| @ -757,11 +767,15 @@ sys_vfork: | ||||
| 	.ent	sys_sigreturn
 | ||||
| sys_sigreturn: | ||||
| 	.prologue 0
 | ||||
| 	lda	$9, ret_from_straced | ||||
| 	cmpult	$26, $9, $9 | ||||
| 	mov	$sp, $17 | ||||
| 	lda	$18, -SWITCH_STACK_SIZE($sp) | ||||
| 	lda	$sp, -SWITCH_STACK_SIZE($sp) | ||||
| 	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 | ||||
| .end sys_sigreturn
 | ||||
| 
 | ||||
| @ -770,46 +784,18 @@ sys_sigreturn: | ||||
| 	.ent	sys_rt_sigreturn
 | ||||
| sys_rt_sigreturn: | ||||
| 	.prologue 0
 | ||||
| 	lda	$9, ret_from_straced | ||||
| 	cmpult	$26, $9, $9 | ||||
| 	mov	$sp, $17 | ||||
| 	lda	$18, -SWITCH_STACK_SIZE($sp) | ||||
| 	lda	$sp, -SWITCH_STACK_SIZE($sp) | ||||
| 	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 | ||||
| .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
 | ||||
| 	.globl	sys_sethae
 | ||||
| 	.ent	sys_sethae
 | ||||
| @ -928,15 +914,6 @@ sys_execve: | ||||
| 	jmp	$31, do_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
 | ||||
| 	.globl	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,  | ||||
| 	       u64 c_stat, u64 c_sts, int print) | ||||
| { | ||||
| 	char *sourcename[] = { "UNKNOWN", "UNKNOWN", "UNKNOWN", | ||||
| 			       "MEMORY", "BCACHE", "DCACHE",  | ||||
| 			       "BCACHE PROBE", "BCACHE PROBE" }; | ||||
| 	char *streamname[] = { "D", "I" }; | ||||
| 	char *bitsname[] = { "SINGLE", "DOUBLE" }; | ||||
| 	static const char * const sourcename[] = { | ||||
| 		"UNKNOWN", "UNKNOWN", "UNKNOWN", | ||||
| 		"MEMORY", "BCACHE", "DCACHE", | ||||
| 		"BCACHE PROBE", "BCACHE PROBE" | ||||
| 	}; | ||||
| 	static const char * const streamname[] = { "D", "I" }; | ||||
| 	static const char * const bitsname[] = { "SINGLE", "DOUBLE" }; | ||||
| 	int status = MCHK_DISPOSITION_REPORT; | ||||
| 	int source = -1, stream = -1, bits = -1; | ||||
| 
 | ||||
|  | ||||
| @ -589,22 +589,23 @@ marvel_print_pox_spl_cmplt(u64 spl_cmplt) | ||||
| static void | ||||
| marvel_print_pox_trans_sum(u64 trans_sum) | ||||
| { | ||||
| 	char *pcix_cmd[] = { "Interrupt Acknowledge", | ||||
| 			     "Special Cycle", | ||||
| 			     "I/O Read", | ||||
| 			     "I/O Write", | ||||
| 			     "Reserved", | ||||
| 			     "Reserved / Device ID Message", | ||||
| 			     "Memory Read", | ||||
| 			     "Memory Write", | ||||
| 			     "Reserved / Alias to Memory Read Block", | ||||
| 			     "Reserved / Alias to Memory Write Block", | ||||
| 			     "Configuration Read", | ||||
| 			     "Configuration Write", | ||||
| 			     "Memory Read Multiple / Split Completion", | ||||
| 			     "Dual Address Cycle", | ||||
| 			     "Memory Read Line / Memory Read Block", | ||||
| 			     "Memory Write and Invalidate / Memory Write Block" | ||||
| 	static const char * const pcix_cmd[] = { | ||||
| 		"Interrupt Acknowledge", | ||||
| 		"Special Cycle", | ||||
| 		"I/O Read", | ||||
| 		"I/O Write", | ||||
| 		"Reserved", | ||||
| 		"Reserved / Device ID Message", | ||||
| 		"Memory Read", | ||||
| 		"Memory Write", | ||||
| 		"Reserved / Alias to Memory Read Block", | ||||
| 		"Reserved / Alias to Memory Write Block", | ||||
| 		"Configuration Read", | ||||
| 		"Configuration Write", | ||||
| 		"Memory Read Multiple / Split Completion", | ||||
| 		"Dual Address Cycle", | ||||
| 		"Memory Read Line / Memory Read Block", | ||||
| 		"Memory Write and Invalidate / Memory Write Block" | ||||
| 	}; | ||||
| 
 | ||||
| #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; | ||||
| 
 | ||||
| #ifdef CONFIG_VERBOSE_MCHECK | ||||
| 	char *serror_src[] = {"GPCI", "APCI", "AGP HP", "AGP LP"}; | ||||
| 	char *serror_cmd[] = {"DMA Read", "DMA RMW", "SGTE Read", "Reserved"}; | ||||
| 	static const char * const serror_src[] = { | ||||
| 		"GPCI", "APCI", "AGP HP", "AGP LP" | ||||
| 	}; | ||||
| 	static const char * const serror_cmd[] = { | ||||
| 		"DMA Read", "DMA RMW", "SGTE Read", "Reserved" | ||||
| 	}; | ||||
| #endif /* CONFIG_VERBOSE_MCHECK */ | ||||
| 
 | ||||
| #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; | ||||
| 
 | ||||
| #ifdef CONFIG_VERBOSE_MCHECK | ||||
| 	char *perror_cmd[] = { "Interrupt Acknowledge", "Special Cycle", | ||||
| 			       "I/O Read",	       	"I/O Write", | ||||
| 			       "Reserved",	       	"Reserved", | ||||
| 			       "Memory Read",		"Memory Write", | ||||
| 			       "Reserved",		"Reserved", | ||||
| 			       "Configuration Read",	"Configuration Write", | ||||
| 			       "Memory Read Multiple",	"Dual Address Cycle", | ||||
| 			       "Memory Read Line","Memory Write and Invalidate" | ||||
| 	static const char * const perror_cmd[] = { | ||||
| 		"Interrupt Acknowledge", "Special Cycle", | ||||
| 		"I/O Read",		"I/O Write", | ||||
| 		"Reserved",		"Reserved", | ||||
| 		"Memory Read",		"Memory Write", | ||||
| 		"Reserved",		"Reserved", | ||||
| 		"Configuration Read",	"Configuration Write", | ||||
| 		"Memory Read Multiple",	"Dual Address Cycle", | ||||
| 		"Memory Read Line",	"Memory Write and Invalidate" | ||||
| 	}; | ||||
| #endif /* CONFIG_VERBOSE_MCHECK */ | ||||
| 
 | ||||
| @ -273,11 +278,11 @@ titan_parse_p_agperror(int which, u64 agperror, int print) | ||||
| 	int cmd, len; | ||||
| 	unsigned long addr; | ||||
| 
 | ||||
| 	char *agperror_cmd[] = { "Read (low-priority)",	"Read (high-priority)", | ||||
| 				 "Write (low-priority)", | ||||
| 				 "Write (high-priority)", | ||||
| 				 "Reserved",		"Reserved", | ||||
| 				 "Flush",		"Fence" | ||||
| 	static const char * const agperror_cmd[] = { | ||||
| 		"Read (low-priority)",	"Read (high-priority)", | ||||
| 		"Write (low-priority)",	"Write (high-priority)", | ||||
| 		"Reserved",		"Reserved", | ||||
| 		"Flush",		"Fence" | ||||
| 	}; | ||||
| #endif /* CONFIG_VERBOSE_MCHECK */ | ||||
| 
 | ||||
|  | ||||
| @ -15,7 +15,6 @@ | ||||
| #include <linux/kernel.h> | ||||
| #include <linux/mm.h> | ||||
| #include <linux/smp.h> | ||||
| #include <linux/smp_lock.h> | ||||
| #include <linux/stddef.h> | ||||
| #include <linux/syscalls.h> | ||||
| #include <linux/unistd.h> | ||||
| @ -69,7 +68,6 @@ SYSCALL_DEFINE4(osf_set_program_attributes, unsigned long, text_start, | ||||
| { | ||||
| 	struct mm_struct *mm; | ||||
| 
 | ||||
| 	lock_kernel(); | ||||
| 	mm = current->mm; | ||||
| 	mm->end_code = 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", | ||||
| 		text_start, text_len, bss_start, bss_len); | ||||
| #endif | ||||
| 	unlock_kernel(); | ||||
| 	return 0; | ||||
| } | ||||
| 
 | ||||
| @ -517,7 +514,6 @@ SYSCALL_DEFINE2(osf_proplist_syscall, enum pl_code, code, | ||||
| 	long error; | ||||
| 	int __user *min_buf_size_ptr; | ||||
| 
 | ||||
| 	lock_kernel(); | ||||
| 	switch (code) { | ||||
| 	case PL_SET: | ||||
| 		if (get_user(error, &args->set.nbytes)) | ||||
| @ -547,7 +543,6 @@ SYSCALL_DEFINE2(osf_proplist_syscall, enum pl_code, code, | ||||
| 		error = -EOPNOTSUPP; | ||||
| 		break; | ||||
| 	}; | ||||
| 	unlock_kernel(); | ||||
| 	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) | ||||
| { | ||||
| 	char *sysinfo_table[] = { | ||||
| 	const char *sysinfo_table[] = { | ||||
| 		utsname()->sysname, | ||||
| 		utsname()->nodename, | ||||
| 		utsname()->release, | ||||
| @ -606,7 +601,7 @@ SYSCALL_DEFINE3(osf_sysinfo, int, command, char __user *, buf, long, count) | ||||
| 		"dummy",	/* secure RPC domain */ | ||||
| 	}; | ||||
| 	unsigned long offset; | ||||
| 	char *res; | ||||
| 	const char *res; | ||||
| 	long len, err = -EINVAL; | ||||
| 
 | ||||
| 	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 device, kobj)); | ||||
| 	struct resource *res = (struct resource *)attr->private; | ||||
| 	struct resource *res = attr->private; | ||||
| 	enum pci_mmap_state mmap_type; | ||||
| 	struct pci_bus_region bar; | ||||
| 	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[28] = pt->r28; | ||||
| 	dest[29] = pt->gp; | ||||
| 	dest[30] = rdusp(); | ||||
| 	dest[30] = ti == current_thread_info() ? rdusp() : ti->pcb.usp; | ||||
| 	dest[31] = pt->pc; | ||||
| 
 | ||||
| 	/* 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 | ||||
|  * 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, | ||||
| 		struct pt_regs *, regs) | ||||
| SYSCALL_DEFINE2(osf_sigprocmask, int, how, unsigned long, newmask) | ||||
| { | ||||
| 	unsigned long oldmask = -EINVAL; | ||||
| 	sigset_t oldmask; | ||||
| 	sigset_t mask; | ||||
| 	unsigned long res; | ||||
| 
 | ||||
| 	if ((unsigned long)how-1 <= 2) { | ||||
| 		long sign = how-2;		/* -1 .. 1 */ | ||||
| 		unsigned long block, unblock; | ||||
| 
 | ||||
| 		newmask &= _BLOCKABLE; | ||||
| 		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 */ | ||||
| 	siginitset(&mask, newmask & _BLOCKABLE); | ||||
| 	res = sigprocmask(how, &mask, &oldmask); | ||||
| 	if (!res) { | ||||
| 		force_successful_syscall_return(); | ||||
| 		res = oldmask.sig[0]; | ||||
| 	} | ||||
| 	return oldmask; | ||||
| 	return res; | ||||
| } | ||||
| 
 | ||||
| SYSCALL_DEFINE3(osf_sigaction, int, sig, | ||||
| @ -94,9 +68,9 @@ SYSCALL_DEFINE3(osf_sigaction, int, sig, | ||||
| 		old_sigset_t mask; | ||||
| 		if (!access_ok(VERIFY_READ, act, sizeof(*act)) || | ||||
| 		    __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; | ||||
| 		__get_user(mask, &act->sa_mask); | ||||
| 		siginitset(&new_ka.sa.sa_mask, mask); | ||||
| 		new_ka.ka_restorer = NULL; | ||||
| 	} | ||||
| @ -106,9 +80,9 @@ SYSCALL_DEFINE3(osf_sigaction, int, sig, | ||||
| 	if (!ret && 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_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; | ||||
| 		__put_user(old_ka.sa.sa_mask.sig[0], &oact->sa_mask); | ||||
| 	} | ||||
| 
 | ||||
| 	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. | ||||
|  */ | ||||
| asmlinkage int | ||||
| do_sigsuspend(old_sigset_t mask, struct pt_regs *regs, struct switch_stack *sw) | ||||
| SYSCALL_DEFINE1(sigsuspend, old_sigset_t, mask) | ||||
| { | ||||
| 	mask &= _BLOCKABLE; | ||||
| 	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(); | ||||
| 	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; | ||||
| 	schedule(); | ||||
| 	set_thread_flag(TIF_RESTORE_SIGMASK); | ||||
| @ -239,6 +177,8 @@ restore_sigcontext(struct sigcontext __user *sc, struct pt_regs *regs, | ||||
| 	unsigned long usp; | ||||
| 	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; | ||||
| 
 | ||||
| 	err |= __get_user(regs->r0, sc->sc_regs+0); | ||||
| @ -591,7 +531,6 @@ syscall_restart(unsigned long r0, unsigned long r19, | ||||
| 		regs->pc -= 4; | ||||
| 		break; | ||||
| 	case ERESTART_RESTARTBLOCK: | ||||
| 		current_thread_info()->restart_block.fn = do_no_restart_syscall; | ||||
| 		regs->r0 = EINTR; | ||||
| 		break; | ||||
| 	} | ||||
|  | ||||
| @ -87,7 +87,7 @@ static int srm_env_proc_show(struct seq_file *m, void *v) | ||||
| 	srm_env_t	*entry; | ||||
| 	char		*page; | ||||
| 
 | ||||
| 	entry = (srm_env_t *)m->private; | ||||
| 	entry = m->private; | ||||
| 	page = (char *)__get_free_page(GFP_USER); | ||||
| 	if (!page) | ||||
| 		return -ENOMEM; | ||||
|  | ||||
| @ -58,7 +58,7 @@ sys_call_table: | ||||
| 	.quad sys_open				/* 45 */ | ||||
| 	.quad alpha_ni_syscall
 | ||||
| 	.quad sys_getxgid
 | ||||
| 	.quad osf_sigprocmask
 | ||||
| 	.quad sys_osf_sigprocmask
 | ||||
| 	.quad alpha_ni_syscall
 | ||||
| 	.quad alpha_ni_syscall			/* 50 */ | ||||
| 	.quad sys_acct
 | ||||
| @ -512,6 +512,9 @@ sys_call_table: | ||||
| 	.quad sys_pwritev
 | ||||
| 	.quad sys_rt_tgsigqueueinfo
 | ||||
| 	.quad sys_perf_event_open
 | ||||
| 	.quad sys_fanotify_init
 | ||||
| 	.quad sys_fanotify_mark				/* 495 */ | ||||
| 	.quad sys_prlimit64
 | ||||
| 
 | ||||
| 	.size sys_call_table, . - sys_call_table | ||||
| 	.type sys_call_table, @object
 | ||||
|  | ||||
| @ -191,16 +191,16 @@ irqreturn_t timer_interrupt(int irq, void *dev) | ||||
| 
 | ||||
| 	write_sequnlock(&xtime_lock); | ||||
| 
 | ||||
| #ifndef CONFIG_SMP | ||||
| 	while (nticks--) | ||||
| 		update_process_times(user_mode(get_irq_regs())); | ||||
| #endif | ||||
| 
 | ||||
| 	if (test_perf_event_pending()) { | ||||
| 		clear_perf_event_pending(); | ||||
| 		perf_event_do_pending(); | ||||
| 	} | ||||
| 
 | ||||
| #ifndef CONFIG_SMP | ||||
| 	while (nticks--) | ||||
| 		update_process_times(user_mode(get_irq_regs())); | ||||
| #endif | ||||
| 
 | ||||
| 	return IRQ_HANDLED; | ||||
| } | ||||
| 
 | ||||
|  | ||||
| @ -13,7 +13,6 @@ | ||||
| #include <linux/sched.h> | ||||
| #include <linux/tty.h> | ||||
| #include <linux/delay.h> | ||||
| #include <linux/smp_lock.h> | ||||
| #include <linux/module.h> | ||||
| #include <linux/init.h> | ||||
| #include <linux/kallsyms.h> | ||||
| @ -623,7 +622,6 @@ do_entUna(void * va, unsigned long opcode, unsigned long reg, | ||||
| 		return; | ||||
| 	} | ||||
| 
 | ||||
| 	lock_kernel(); | ||||
| 	printk("Bad unaligned kernel access at %016lx: %p %lx %lu\n", | ||||
| 		pc, va, opcode, reg); | ||||
| 	do_exit(SIGSEGV); | ||||
| @ -646,7 +644,6 @@ got_exception: | ||||
| 	 * Yikes!  No one to forward the exception to. | ||||
| 	 * Since the registers are in a weird format, dump them ourselves. | ||||
|  	 */ | ||||
| 	lock_kernel(); | ||||
| 
 | ||||
| 	printk("%s(%d): unhandled unaligned exception\n", | ||||
| 	       current->comm, task_pid_nr(current)); | ||||
|  | ||||
| @ -271,7 +271,6 @@ config ARCH_AT91 | ||||
| 	bool "Atmel AT91" | ||||
| 	select ARCH_REQUIRE_GPIOLIB | ||||
| 	select HAVE_CLK | ||||
| 	select ARCH_USES_GETTIMEOFFSET | ||||
| 	help | ||||
| 	  This enables support for systems based on the Atmel AT91RM9200, | ||||
| 	  AT91SAM9 and AT91CAP9 processors. | ||||
| @ -1051,6 +1050,32 @@ config ARM_ERRATA_460075 | ||||
| 	  ACTLR register. Note that setting specific bits in the ACTLR register | ||||
| 	  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 | ||||
| 	bool "Clean & Invalidate maintenance operations do not invalidate clean lines" | ||||
| 	depends on CACHE_L2X0 && ARCH_OMAP4 | ||||
|  | ||||
| @ -116,5 +116,5 @@ CFLAGS_font.o := -Dstatic= | ||||
| $(obj)/font.c: $(FONTC) | ||||
| 	$(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)" < $< > $@ | ||||
|  | ||||
| @ -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); | ||||
| } | ||||
| 
 | ||||
| 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) | ||||
| { | ||||
| 	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 | ||||
| #define pgprot_dmacoherent(prot) \ | ||||
| 	__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 | ||||
| #define pgprot_dmacoherent(prot) \ | ||||
| 	__pgprot_modify(prot, L_PTE_MT_MASK|L_PTE_EXEC, L_PTE_MT_UNCACHED) | ||||
|  | ||||
| @ -48,6 +48,8 @@ work_pending: | ||||
| 	beq	no_work_pending | ||||
| 	mov	r0, sp				@ 'regs'
 | ||||
| 	mov	r2, why				@ 'syscall'
 | ||||
| 	tst	r1, #_TIF_SIGPENDING		@ delivering a signal? | ||||
| 	movne	why, #0				@ prevent further restarts
 | ||||
| 	bl	do_notify_resume | ||||
| 	b	ret_slow_syscall		@ Check work again
 | ||||
| 
 | ||||
| @ -418,11 +420,13 @@ ENDPROC(sys_clone_wrapper) | ||||
| 
 | ||||
| sys_sigreturn_wrapper: | ||||
| 		add	r0, sp, #S_OFF | ||||
| 		mov	why, #0		@ prevent syscall restart handling
 | ||||
| 		b	sys_sigreturn | ||||
| ENDPROC(sys_sigreturn_wrapper) | ||||
| 
 | ||||
| sys_rt_sigreturn_wrapper: | ||||
| 		add	r0, sp, #S_OFF | ||||
| 		mov	why, #0		@ prevent syscall restart handling
 | ||||
| 		b	sys_rt_sigreturn | ||||
| ENDPROC(sys_rt_sigreturn_wrapper) | ||||
| 
 | ||||
|  | ||||
| @ -121,8 +121,8 @@ static struct clk ssc1_clk = { | ||||
| 	.pmc_mask	= 1 << AT91SAM9G45_ID_SSC1, | ||||
| 	.type		= CLK_TYPE_PERIPHERAL, | ||||
| }; | ||||
| static struct clk tcb_clk = { | ||||
| 	.name		= "tcb_clk", | ||||
| static struct clk tcb0_clk = { | ||||
| 	.name		= "tcb0_clk", | ||||
| 	.pmc_mask	= 1 << AT91SAM9G45_ID_TCB, | ||||
| 	.type		= CLK_TYPE_PERIPHERAL, | ||||
| }; | ||||
| @ -192,6 +192,14 @@ static struct clk ohci_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 = { | ||||
| 	&pioA_clk, | ||||
| 	&pioB_clk, | ||||
| @ -208,7 +216,7 @@ static struct clk *periph_clocks[] __initdata = { | ||||
| 	&spi1_clk, | ||||
| 	&ssc0_clk, | ||||
| 	&ssc1_clk, | ||||
| 	&tcb_clk, | ||||
| 	&tcb0_clk, | ||||
| 	&pwm_clk, | ||||
| 	&tsc_clk, | ||||
| 	&dma_clk, | ||||
| @ -221,6 +229,7 @@ static struct clk *periph_clocks[] __initdata = { | ||||
| 	&mmc1_clk, | ||||
| 	// irq0
 | ||||
| 	&ohci_clk, | ||||
| 	&tcb1_clk, | ||||
| }; | ||||
| 
 | ||||
| /*
 | ||||
|  | ||||
| @ -46,7 +46,7 @@ static struct resource hdmac_resources[] = { | ||||
| 		.end	= AT91_BASE_SYS + AT91_DMA + SZ_512 - 1, | ||||
| 		.flags	= IORESOURCE_MEM, | ||||
| 	}, | ||||
| 	[2] = { | ||||
| 	[1] = { | ||||
| 		.start	= AT91SAM9G45_ID_DMA, | ||||
| 		.end	= AT91SAM9G45_ID_DMA, | ||||
| 		.flags	= IORESOURCE_IRQ, | ||||
| @ -426,7 +426,7 @@ static struct i2c_gpio_platform_data pdata_i2c0 = { | ||||
| 	.sda_is_open_drain	= 1, | ||||
| 	.scl_pin		= AT91_PIN_PA21, | ||||
| 	.scl_is_open_drain	= 1, | ||||
| 	.udelay			= 2,		/* ~100 kHz */ | ||||
| 	.udelay			= 5,		/* ~100 kHz */ | ||||
| }; | ||||
| 
 | ||||
| static struct platform_device at91sam9g45_twi0_device = { | ||||
| @ -440,7 +440,7 @@ static struct i2c_gpio_platform_data pdata_i2c1 = { | ||||
| 	.sda_is_open_drain	= 1, | ||||
| 	.scl_pin		= AT91_PIN_PB11, | ||||
| 	.scl_is_open_drain	= 1, | ||||
| 	.udelay			= 2,		/* ~100 kHz */ | ||||
| 	.udelay			= 5,		/* ~100 kHz */ | ||||
| }; | ||||
| 
 | ||||
| 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) | ||||
| { | ||||
| 	/* 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); | ||||
| 	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); | ||||
| } | ||||
| #else | ||||
|  | ||||
| @ -93,11 +93,12 @@ static struct resource dm9000_resource[] = { | ||||
| 		.start	= AT91_PIN_PC11, | ||||
| 		.end	= AT91_PIN_PC11, | ||||
| 		.flags	= IORESOURCE_IRQ | ||||
| 			| IORESOURCE_IRQ_LOWEDGE | IORESOURCE_IRQ_HIGHEDGE, | ||||
| 	} | ||||
| }; | ||||
| 
 | ||||
| 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 = { | ||||
| @ -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 | ||||
|  */ | ||||
| @ -246,6 +236,10 @@ static void __init ek_add_device_nand(void) | ||||
| 	at91_add_device_nand(&ek_nand_data); | ||||
| } | ||||
| 
 | ||||
| /*
 | ||||
|  * SPI related devices | ||||
|  */ | ||||
| #if defined(CONFIG_SPI_ATMEL) || defined(CONFIG_SPI_ATMEL_MODULE) | ||||
| 
 | ||||
| /*
 | ||||
|  * ADS7846 Touchscreen | ||||
| @ -356,6 +350,19 @@ static struct spi_board_info ek_spi_devices[] = { | ||||
| #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 | ||||
|  | ||||
| @ -501,7 +501,8 @@ postcore_initcall(at91_clk_debugfs_init); | ||||
| int __init clk_register(struct clk *clk) | ||||
| { | ||||
| 	if (clk_is_peripheral(clk)) { | ||||
| 		clk->parent = &mck; | ||||
| 		if (!clk->parent) | ||||
| 			clk->parent = &mck; | ||||
| 		clk->mode = pmc_periph_mode; | ||||
| 		list_add_tail(&clk->node, &clocks); | ||||
| 	} | ||||
|  | ||||
| @ -769,8 +769,7 @@ static struct map_desc dm355_io_desc[] = { | ||||
| 		.virtual	= SRAM_VIRT, | ||||
| 		.pfn		= __phys_to_pfn(0x00010000), | ||||
| 		.length		= SZ_32K, | ||||
| 		/* MT_MEMORY_NONCACHED requires supersection alignment */ | ||||
| 		.type		= MT_DEVICE, | ||||
| 		.type		= MT_MEMORY_NONCACHED, | ||||
| 	}, | ||||
| }; | ||||
| 
 | ||||
|  | ||||
| @ -969,8 +969,7 @@ static struct map_desc dm365_io_desc[] = { | ||||
| 		.virtual	= SRAM_VIRT, | ||||
| 		.pfn		= __phys_to_pfn(0x00010000), | ||||
| 		.length		= SZ_32K, | ||||
| 		/* MT_MEMORY_NONCACHED requires supersection alignment */ | ||||
| 		.type		= MT_DEVICE, | ||||
| 		.type		= MT_MEMORY_NONCACHED, | ||||
| 	}, | ||||
| }; | ||||
| 
 | ||||
|  | ||||
| @ -653,8 +653,7 @@ static struct map_desc dm644x_io_desc[] = { | ||||
| 		.virtual	= SRAM_VIRT, | ||||
| 		.pfn		= __phys_to_pfn(0x00008000), | ||||
| 		.length		= SZ_16K, | ||||
| 		/* MT_MEMORY_NONCACHED requires supersection alignment */ | ||||
| 		.type		= MT_DEVICE, | ||||
| 		.type		= MT_MEMORY_NONCACHED, | ||||
| 	}, | ||||
| }; | ||||
| 
 | ||||
|  | ||||
| @ -737,8 +737,7 @@ static struct map_desc dm646x_io_desc[] = { | ||||
| 		.virtual	= SRAM_VIRT, | ||||
| 		.pfn		= __phys_to_pfn(0x00010000), | ||||
| 		.length		= SZ_32K, | ||||
| 		/* MT_MEMORY_NONCACHED requires supersection alignment */ | ||||
| 		.type		= MT_DEVICE, | ||||
| 		.type		= MT_MEMORY_NONCACHED, | ||||
| 	}, | ||||
| }; | ||||
| 
 | ||||
|  | ||||
| @ -13,8 +13,8 @@ | ||||
| 
 | ||||
| #define IO_SPACE_LIMIT		0xffffffff | ||||
| 
 | ||||
| #define __io(a)  ((void __iomem *)(((a) - DOVE_PCIE0_IO_PHYS_BASE) +\ | ||||
| 				   DOVE_PCIE0_IO_VIRT_BASE)) | ||||
| #define __mem_pci(a)		(a) | ||||
| #define __io(a)  	((void __iomem *)(((a) - DOVE_PCIE0_IO_BUS_BASE) + \ | ||||
| 						 DOVE_PCIE0_IO_VIRT_BASE)) | ||||
| #define __mem_pci(a)	(a) | ||||
| 
 | ||||
| #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); | ||||
| } | ||||
| 
 | ||||
| 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_write); | ||||
| 
 | ||||
|  | ||||
| @ -26,6 +26,8 @@ | ||||
| #define PCIBIOS_MAX_MEM		0x4BFFFFFF | ||||
| #endif | ||||
| 
 | ||||
| #define ARCH_HAS_DMA_SET_COHERENT_MASK | ||||
| 
 | ||||
| #define pcibios_assign_all_busses()	1 | ||||
| 
 | ||||
| /* Register locations and bits */ | ||||
|  | ||||
| @ -38,7 +38,7 @@ | ||||
| 
 | ||||
| #define KIRKWOOD_PCIE1_IO_PHYS_BASE	0xf3000000 | ||||
| #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_PCIE_IO_PHYS_BASE	0xf2000000 | ||||
|  | ||||
| @ -117,7 +117,7 @@ static void __init pcie0_ioresources_init(struct pcie_port *pp) | ||||
| 	 * IORESOURCE_IO | ||||
| 	 */ | ||||
| 	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].flags = IORESOURCE_IO; | ||||
| 
 | ||||
| @ -139,7 +139,7 @@ static void __init pcie1_ioresources_init(struct pcie_port *pp) | ||||
| 	 * IORESOURCE_IO | ||||
| 	 */ | ||||
| 	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].flags = IORESOURCE_IO; | ||||
| 
 | ||||
|  | ||||
| @ -9,6 +9,8 @@ | ||||
| #ifndef __ASM_MACH_SYSTEM_H | ||||
| #define __ASM_MACH_SYSTEM_H | ||||
| 
 | ||||
| #include <mach/cputype.h> | ||||
| 
 | ||||
| static inline void arch_idle(void) | ||||
| { | ||||
| 	cpu_do_idle(); | ||||
| @ -16,6 +18,9 @@ static inline void arch_idle(void) | ||||
| 
 | ||||
| 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 */ | ||||
|  | ||||
| @ -312,8 +312,7 @@ static int pxa_set_target(struct cpufreq_policy *policy, | ||||
| 	freqs.cpu = policy->cpu; | ||||
| 
 | ||||
| 	if (freq_debug) | ||||
| 		pr_debug(KERN_INFO "Changing CPU frequency to %d Mhz, " | ||||
| 			 "(SDRAM %d Mhz)\n", | ||||
| 		pr_debug("Changing CPU frequency to %d Mhz, (SDRAM %d Mhz)\n", | ||||
| 			 freqs.new / 1000, (pxa_freq_settings[idx].div2) ? | ||||
| 			 (new_freq_mem / 2000) : (new_freq_mem / 1000)); | ||||
| 
 | ||||
|  | ||||
| @ -264,23 +264,35 @@ | ||||
|  * <= 0x2 for pxa21x/pxa25x/pxa26x/pxa27x | ||||
|  * == 0x3 for pxa300/pxa310/pxa320 | ||||
|  */ | ||||
| #if defined(CONFIG_PXA25x) || defined(CONFIG_PXA27x) | ||||
| #define __cpu_is_pxa2xx(id)				\ | ||||
| 	({						\ | ||||
| 		unsigned int _id = (id) >> 13 & 0x7;	\ | ||||
| 		_id <= 0x2;				\ | ||||
| 	 }) | ||||
| #else | ||||
| #define __cpu_is_pxa2xx(id)	(0) | ||||
| #endif | ||||
| 
 | ||||
| #ifdef CONFIG_PXA3xx | ||||
| #define __cpu_is_pxa3xx(id)				\ | ||||
| 	({						\ | ||||
| 		unsigned int _id = (id) >> 13 & 0x7;	\ | ||||
| 		_id == 0x3;				\ | ||||
| 	 }) | ||||
| #else | ||||
| #define __cpu_is_pxa3xx(id)	(0) | ||||
| #endif | ||||
| 
 | ||||
| #if defined(CONFIG_CPU_PXA930) || defined(CONFIG_CPU_PXA935) | ||||
| #define __cpu_is_pxa93x(id)				\ | ||||
| 	({						\ | ||||
| 		unsigned int _id = (id) >> 4 & 0xfff;	\ | ||||
| 		_id == 0x683 || _id == 0x693;		\ | ||||
| 	 }) | ||||
| #else | ||||
| #define __cpu_is_pxa93x(id)	(0) | ||||
| #endif | ||||
| 
 | ||||
| #define cpu_is_pxa2xx()					\ | ||||
| 	({						\ | ||||
| @ -309,7 +321,7 @@ extern unsigned long get_clock_tick_rate(void); | ||||
| #define PCIBIOS_MIN_IO		0 | ||||
| #define PCIBIOS_MIN_MEM		0 | ||||
| #define pcibios_assign_all_busses()	1 | ||||
| #define ARCH_HAS_DMA_SET_COHERENT_MASK | ||||
| #endif | ||||
| 
 | ||||
| 
 | ||||
| #endif  /* _ASM_ARCH_HARDWARE_H */ | ||||
|  | ||||
| @ -6,6 +6,8 @@ | ||||
| #ifndef __ASM_ARM_ARCH_IO_H | ||||
| #define __ASM_ARM_ARCH_IO_H | ||||
| 
 | ||||
| #include <mach/hardware.h> | ||||
| 
 | ||||
| #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) | ||||
| { | ||||
| 	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 | ||||
|  | ||||
| @ -240,6 +240,7 @@ static void __init vpac270_onenand_init(void) {} | ||||
| #if defined(CONFIG_MMC_PXA) || defined(CONFIG_MMC_PXA_MODULE) | ||||
| static struct pxamci_platform_data vpac270_mci_platform_data = { | ||||
| 	.ocr_mask		= MMC_VDD_32_33 | MMC_VDD_33_34, | ||||
| 	.gpio_power		= -1, | ||||
| 	.gpio_card_detect	= GPIO53_VPAC270_SD_DETECT_N, | ||||
| 	.gpio_card_ro		= GPIO52_VPAC270_SD_READONLY, | ||||
| 	.detect_delay_ms	= 200, | ||||
|  | ||||
| @ -18,10 +18,11 @@ | ||||
| #include <mach/map.h> | ||||
| #include <mach/gpio-bank-c.h> | ||||
| #include <mach/spi-clocks.h> | ||||
| #include <mach/irqs.h> | ||||
| 
 | ||||
| #include <plat/s3c64xx-spi.h> | ||||
| #include <plat/gpio-cfg.h> | ||||
| #include <plat/irqs.h> | ||||
| #include <plat/devs.h> | ||||
| 
 | ||||
| static char *spi_src_clks[] = { | ||||
| 	[S3C64XX_SPI_SRCCLK_PCLK] = "pclk", | ||||
|  | ||||
| @ -30,73 +30,73 @@ | ||||
| #include <plat/devs.h> | ||||
| #include <plat/regs-serial.h> | ||||
| 
 | ||||
| #define UCON S3C2410_UCON_DEFAULT | S3C2410_UCON_UCLK | ||||
| #define ULCON S3C2410_LCON_CS8 | S3C2410_LCON_PNONE | S3C2410_LCON_STOPB | ||||
| #define UFCON S3C2410_UFCON_RXTRIG8 | S3C2410_UFCON_FIFOMODE | ||||
| #define UCON (S3C2410_UCON_DEFAULT | S3C2410_UCON_UCLK) | ||||
| #define ULCON (S3C2410_LCON_CS8 | S3C2410_LCON_PNONE | S3C2410_LCON_STOPB) | ||||
| #define UFCON (S3C2410_UFCON_RXTRIG8 | S3C2410_UFCON_FIFOMODE) | ||||
| 
 | ||||
| static struct s3c2410_uartcfg real6410_uartcfgs[] __initdata = { | ||||
| 	[0] = { | ||||
| 		.hwport	     = 0, | ||||
| 		.flags	     = 0, | ||||
| 		.ucon	     = UCON, | ||||
| 		.ulcon	     = ULCON, | ||||
| 		.ufcon	     = UFCON, | ||||
| 		.hwport	= 0, | ||||
| 		.flags	= 0, | ||||
| 		.ucon	= UCON, | ||||
| 		.ulcon	= ULCON, | ||||
| 		.ufcon	= UFCON, | ||||
| 	}, | ||||
| 	[1] = { | ||||
| 		.hwport	     = 1, | ||||
| 		.flags	     = 0, | ||||
| 		.ucon	     = UCON, | ||||
| 		.ulcon	     = ULCON, | ||||
| 		.ufcon	     = UFCON, | ||||
| 		.hwport	= 1, | ||||
| 		.flags	= 0, | ||||
| 		.ucon	= UCON, | ||||
| 		.ulcon	= ULCON, | ||||
| 		.ufcon	= UFCON, | ||||
| 	}, | ||||
| 	[2] = { | ||||
| 		.hwport	     = 2, | ||||
| 		.flags	     = 0, | ||||
| 		.ucon	     = UCON, | ||||
| 		.ulcon	     = ULCON, | ||||
| 		.ufcon	     = UFCON, | ||||
| 		.hwport	= 2, | ||||
| 		.flags	= 0, | ||||
| 		.ucon	= UCON, | ||||
| 		.ulcon	= ULCON, | ||||
| 		.ufcon	= UFCON, | ||||
| 	}, | ||||
| 	[3] = { | ||||
| 		.hwport	     = 3, | ||||
| 		.flags	     = 0, | ||||
| 		.ucon	     = UCON, | ||||
| 		.ulcon	     = ULCON, | ||||
| 		.ufcon	     = UFCON, | ||||
| 		.hwport	= 3, | ||||
| 		.flags	= 0, | ||||
| 		.ucon	= UCON, | ||||
| 		.ulcon	= ULCON, | ||||
| 		.ufcon	= UFCON, | ||||
| 	}, | ||||
| }; | ||||
| 
 | ||||
| /* DM9000AEP 10/100 ethernet controller */ | ||||
| 
 | ||||
| static struct resource real6410_dm9k_resource[] = { | ||||
|         [0] = { | ||||
|                 .start = S3C64XX_PA_XM0CSN1, | ||||
|                 .end   = S3C64XX_PA_XM0CSN1 + 1, | ||||
|                 .flags = IORESOURCE_MEM | ||||
|         }, | ||||
|         [1] = { | ||||
|                 .start = S3C64XX_PA_XM0CSN1 + 4, | ||||
|                 .end   = S3C64XX_PA_XM0CSN1 + 5, | ||||
|                 .flags = IORESOURCE_MEM | ||||
|         }, | ||||
|         [2] = { | ||||
|                 .start = S3C_EINT(7), | ||||
|                 .end   = S3C_EINT(7), | ||||
|                 .flags = IORESOURCE_IRQ, | ||||
|         } | ||||
| 	[0] = { | ||||
| 		.start	= S3C64XX_PA_XM0CSN1, | ||||
| 		.end	= S3C64XX_PA_XM0CSN1 + 1, | ||||
| 		.flags	= IORESOURCE_MEM | ||||
| 	}, | ||||
| 	[1] = { | ||||
| 		.start	= S3C64XX_PA_XM0CSN1 + 4, | ||||
| 		.end	= S3C64XX_PA_XM0CSN1 + 5, | ||||
| 		.flags	= IORESOURCE_MEM | ||||
| 	}, | ||||
| 	[2] = { | ||||
| 		.start	= S3C_EINT(7), | ||||
| 		.end	= S3C_EINT(7), | ||||
| 		.flags	= IORESOURCE_IRQ | IORESOURCE_IRQ_HIGHLEVEL | ||||
| 	} | ||||
| }; | ||||
| 
 | ||||
| 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 = { | ||||
|         .name           = "dm9000", | ||||
|         .id             = -1, | ||||
|         .num_resources  = ARRAY_SIZE(real6410_dm9k_resource), | ||||
|         .resource       = real6410_dm9k_resource, | ||||
|         .dev            = { | ||||
|                 .platform_data  = &real6410_dm9k_pdata, | ||||
|         }, | ||||
| 	.name		= "dm9000", | ||||
| 	.id		= -1, | ||||
| 	.num_resources	= ARRAY_SIZE(real6410_dm9k_resource), | ||||
| 	.resource	= real6410_dm9k_resource, | ||||
| 	.dev		= { | ||||
| 		.platform_data	= &real6410_dm9k_pdata, | ||||
| 	}, | ||||
| }; | ||||
| 
 | ||||
| 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 */ | ||||
| 
 | ||||
| 	__raw_writel((0 << S3C64XX_SROM_BCX__PMC__SHIFT) | | ||||
| 			(6 << S3C64XX_SROM_BCX__TACP__SHIFT) | | ||||
| 			(4 << S3C64XX_SROM_BCX__TCAH__SHIFT) | | ||||
| 			(1 << S3C64XX_SROM_BCX__TCOH__SHIFT) | | ||||
| 			(13 << S3C64XX_SROM_BCX__TACC__SHIFT) | | ||||
| 			(4 << S3C64XX_SROM_BCX__TCOS__SHIFT) | | ||||
| 			(0 << S3C64XX_SROM_BCX__TACS__SHIFT), S3C64XX_SROM_BC1); | ||||
| 		(6 << S3C64XX_SROM_BCX__TACP__SHIFT) | | ||||
| 		(4 << S3C64XX_SROM_BCX__TCAH__SHIFT) | | ||||
| 		(1 << S3C64XX_SROM_BCX__TCOH__SHIFT) | | ||||
| 		(13 << S3C64XX_SROM_BCX__TACC__SHIFT) | | ||||
| 		(4 << S3C64XX_SROM_BCX__TCOS__SHIFT) | | ||||
| 		(0 << S3C64XX_SROM_BCX__TACS__SHIFT), S3C64XX_SROM_BC1); | ||||
| 
 | ||||
| 	platform_add_devices(real6410_devices, ARRAY_SIZE(real6410_devices)); | ||||
| } | ||||
|  | ||||
| @ -280,6 +280,24 @@ static struct clk init_clocks_disable[] = { | ||||
| 		.parent		= &clk_hclk_dsys.clk, | ||||
| 		.enable		= s5pv210_clk_ip0_ctrl, | ||||
| 		.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", | ||||
| 		.id		= -1, | ||||
| @ -357,7 +375,7 @@ static struct clk init_clocks_disable[] = { | ||||
| 		.id		= 1, | ||||
| 		.parent		= &clk_pclk_psys.clk, | ||||
| 		.enable		= s5pv210_clk_ip3_ctrl, | ||||
| 		.ctrlbit	= (1<<8), | ||||
| 		.ctrlbit	= (1 << 10), | ||||
| 	}, { | ||||
| 		.name		= "i2c", | ||||
| 		.id		= 2, | ||||
|  | ||||
| @ -47,7 +47,7 @@ static struct map_desc s5pv210_iodesc[] __initdata = { | ||||
| 	{ | ||||
| 		.virtual	= (unsigned long)S5P_VA_SYSTIMER, | ||||
| 		.pfn		= __phys_to_pfn(S5PV210_PA_SYSTIMER), | ||||
| 		.length		= SZ_1M, | ||||
| 		.length		= SZ_4K, | ||||
| 		.type		= MT_DEVICE, | ||||
| 	}, { | ||||
| 		.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 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 */ | ||||
| static inline unsigned gpio_to_irq(unsigned gpio) | ||||
| { | ||||
|  | ||||
| @ -227,7 +227,13 @@ static void ct_ca9x4_init(void) | ||||
| 	int i; | ||||
| 
 | ||||
| #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 | ||||
| 
 | ||||
| 	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) | ||||
| 		force_sig(SIGBUS, current); | ||||
| 	else | ||||
| 		set_cr(cr_no_alignment); | ||||
| 	else { | ||||
| 		/*
 | ||||
| 		 * 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; | ||||
| } | ||||
|  | ||||
| @ -15,6 +15,7 @@ | ||||
| #include <linux/nodemask.h> | ||||
| #include <linux/memblock.h> | ||||
| #include <linux/sort.h> | ||||
| #include <linux/fs.h> | ||||
| 
 | ||||
| #include <asm/cputype.h> | ||||
| #include <asm/sections.h> | ||||
| @ -246,6 +247,9 @@ static struct mem_type mem_types[] = { | ||||
| 		.domain    = DOMAIN_USER, | ||||
| 	}, | ||||
| 	[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, | ||||
| 		.domain    = DOMAIN_KERNEL, | ||||
| 	}, | ||||
| @ -254,6 +258,9 @@ static struct mem_type mem_types[] = { | ||||
| 		.domain    = DOMAIN_KERNEL, | ||||
| 	}, | ||||
| 	[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, | ||||
| 		.domain    = DOMAIN_KERNEL, | ||||
| 	}, | ||||
| @ -411,9 +418,12 @@ static void __init build_mem_type_table(void) | ||||
| 	 * Enable CPU-specific coherency if supported. | ||||
| 	 * (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_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. | ||||
| 	 */ | ||||
| @ -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_pte |= L_PTE_SHARED; | ||||
| 		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; | ||||
| #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_HIGH_VECTORS].prot_l1 |= ecc_mask; | ||||
| 	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; | ||||
| 
 | ||||
| 	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) | ||||
| 
 | ||||
| static void __init *early_alloc(unsigned long sz) | ||||
|  | ||||
| @ -186,13 +186,14 @@ cpu_v7_name: | ||||
|  *	It is assumed that: | ||||
|  *	- cache type register is implemented | ||||
|  */ | ||||
| __v7_setup: | ||||
| __v7_ca9mp_setup: | ||||
| #ifdef CONFIG_SMP | ||||
| 	mrc	p15, 0, r0, c1, c0, 1 | ||||
| 	tst	r0, #(1 << 6)			@ SMP/nAMP mode enabled?
 | ||||
| 	orreq	r0, r0, #(1 << 6) | (1 << 0)	@ Enable SMP/nAMP mode and
 | ||||
| 	mcreq	p15, 0, r0, c1, c0, 1		@ TLB ops broadcasting
 | ||||
| #endif | ||||
| __v7_setup: | ||||
| 	adr	r12, __v7_setup_stack		@ the local stack
 | ||||
| 	stmia	r12, {r0-r5, r7, r9, r11, lr} | ||||
| 	bl	v7_flush_dcache_all | ||||
| @ -201,11 +202,16 @@ __v7_setup: | ||||
| 	mrc	p15, 0, r0, c0, c0, 0		@ read main ID register
 | ||||
| 	and	r10, r0, #0xff000000		@ ARM?
 | ||||
| 	teq	r10, #0x41000000 | ||||
| 	bne	2f | ||||
| 	bne	3f | ||||
| 	and	r5, r0, #0x00f00000		@ variant
 | ||||
| 	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 | ||||
| 	teq	r5, #0x00100000			@ only present in r1p*
 | ||||
| 	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
 | ||||
| #endif | ||||
| #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
 | ||||
| 	orreq	r10, r10, #(1 << 5)		@ set L1NEON to 1
 | ||||
| 	orreq	r10, r10, #(1 << 9)		@ set PLDNOP to 1
 | ||||
| 	mcreq	p15, 0, r10, c1, c0, 1		@ write aux control register
 | ||||
| #endif | ||||
| #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
 | ||||
| 	tsteq	r10, #1 << 22 | ||||
| 	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
 | ||||
| #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 | ||||
| 	mcr	p15, 0, r10, c7, c5, 0		@ I+BTB cache invalidate
 | ||||
| #endif | ||||
| @ -323,6 +350,29 @@ cpu_elf_name: | ||||
| 
 | ||||
| 	.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. | ||||
| 	 */ | ||||
|  | ||||
| @ -102,6 +102,7 @@ static int op_create_counter(int cpu, int event) | ||||
| 	if (IS_ERR(pevent)) { | ||||
| 		ret = PTR_ERR(pevent); | ||||
| 	} else if (pevent->state != PERF_EVENT_STATE_ACTIVE) { | ||||
| 		perf_event_release_kernel(pevent); | ||||
| 		pr_warning("oprofile: failed to enable event %d " | ||||
| 				"on CPU %d\n", event, cpu); | ||||
| 		ret = -EBUSY; | ||||
| @ -365,6 +366,7 @@ int __init oprofile_arch_init(struct oprofile_operations *ops) | ||||
| 	ret = init_driverfs(); | ||||
| 	if (ret) { | ||||
| 		kfree(counter_config); | ||||
| 		counter_config = NULL; | ||||
| 		return ret; | ||||
| 	} | ||||
| 
 | ||||
| @ -402,7 +404,6 @@ void oprofile_arch_exit(void) | ||||
| 	struct perf_event *event; | ||||
| 
 | ||||
| 	if (*perf_events) { | ||||
| 		exit_driverfs(); | ||||
| 		for_each_possible_cpu(cpu) { | ||||
| 			for (id = 0; id < perf_num_counters; ++id) { | ||||
| 				event = perf_events[cpu][id]; | ||||
| @ -413,8 +414,10 @@ void oprofile_arch_exit(void) | ||||
| 		} | ||||
| 	} | ||||
| 
 | ||||
| 	if (counter_config) | ||||
| 	if (counter_config) { | ||||
| 		kfree(counter_config); | ||||
| 		exit_driverfs(); | ||||
| 	} | ||||
| } | ||||
| #else | ||||
| 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) 2010 Alessandro Rubini | ||||
| @ -75,7 +75,7 @@ static void nmdk_clkevt_mode(enum clock_event_mode mode, | ||||
| 		cr = readl(mtu_base + MTU_CR(1)); | ||||
| 		writel(0, mtu_base + MTU_LR(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; | ||||
| 	case CLOCK_EVT_MODE_SHUTDOWN: | ||||
| 	case CLOCK_EVT_MODE_UNUSED: | ||||
| @ -131,25 +131,23 @@ void __init nmdk_timer_init(void) | ||||
| { | ||||
| 	unsigned long rate; | ||||
| 	struct clk *clk0; | ||||
| 	struct clk *clk1; | ||||
| 	u32 cr; | ||||
| 	u32 cr = MTU_CRn_32BITS; | ||||
| 
 | ||||
| 	clk0 = clk_get_sys("mtu0", NULL); | ||||
| 	BUG_ON(IS_ERR(clk0)); | ||||
| 
 | ||||
| 	clk1 = clk_get_sys("mtu1", NULL); | ||||
| 	BUG_ON(IS_ERR(clk1)); | ||||
| 
 | ||||
| 	clk_enable(clk0); | ||||
| 	clk_enable(clk1); | ||||
| 
 | ||||
| 	/*
 | ||||
| 	 * Tick rate is 2.4MHz for Nomadik and 110MHz for ux500: | ||||
| 	 * use a divide-by-16 counter if it's more than 16MHz | ||||
| 	 * Tick rate is 2.4MHz for Nomadik and 2.4Mhz, 100MHz or 133 MHz | ||||
| 	 * 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); | ||||
| 	if (rate > 16 << 20) { | ||||
| 	if (rate > 32000000) { | ||||
| 		rate /= 16; | ||||
| 		cr |= MTU_CRn_PRESCALE_16; | ||||
| 	} else { | ||||
| @ -170,15 +168,8 @@ void __init nmdk_timer_init(void) | ||||
| 		pr_err("timer: failed to initialize clock source %s\n", | ||||
| 		       nmdk_clksrc.name); | ||||
| 
 | ||||
| 	/* Timer 1 is used for events, fix according to rate */ | ||||
| 	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; | ||||
| 	} | ||||
| 	/* Timer 1 is used for events */ | ||||
| 
 | ||||
| 	clockevents_calc_mult_shift(&nmdk_clkevt, rate, MTU_MIN_RANGE); | ||||
| 
 | ||||
| 	writel(cr | MTU_CRn_ONESHOT, mtu_base + MTU_CR(1)); /* off, currently */ | ||||
|  | ||||
| @ -33,7 +33,7 @@ config OMAP_DEBUG_DEVICES | ||||
| config OMAP_DEBUG_LEDS | ||||
| 	bool | ||||
| 	depends on OMAP_DEBUG_DEVICES | ||||
| 	default y if LEDS | ||||
| 	default y if LEDS_CLASS | ||||
| 
 | ||||
| config OMAP_RESET_CLOCKS | ||||
| 	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 */ | ||||
| 		MCBSP_WRITE(mcbsp_rx, SPCR1, MCBSP_READ_CACHE(mcbsp_rx, SPCR1)); | ||||
| 	} else { | ||||
| 		complete(&mcbsp_rx->tx_irq_completion); | ||||
| 		complete(&mcbsp_rx->rx_irq_completion); | ||||
| 	} | ||||
| 
 | ||||
| 	return IRQ_HANDLED; | ||||
|  | ||||
| @ -220,20 +220,7 @@ void __init omap_map_sram(void) | ||||
| 	if (omap_sram_size == 0) | ||||
| 		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()) { | ||||
| 		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 | ||||
| 		 * 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; | ||||
| 	} | ||||
| 
 | ||||
| 	if (cpu_is_omap44xx()) { | ||||
| 		omap_sram_io_desc[0].virtual = OMAP4_SRAM_VA; | ||||
| 		base = OMAP4_SRAM_PA; | ||||
| 		base = ROUND_DOWN(base, PAGE_SIZE); | ||||
| 		omap_sram_io_desc[0].pfn = __phys_to_pfn(base); | ||||
| 	} | ||||
| 	omap_sram_io_desc[0].length = 1024 * 1024;	/* Use section desc */ | ||||
| 	omap_sram_io_desc[0].virtual = omap_sram_base; | ||||
| 	base = omap_sram_start; | ||||
| 	base = ROUND_DOWN(base, PAGE_SIZE); | ||||
| 	omap_sram_io_desc[0].pfn = __phys_to_pfn(base); | ||||
| 	omap_sram_io_desc[0].length = ROUND_DOWN(omap_sram_size, PAGE_SIZE); | ||||
| 	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", | ||||
|  | ||||
| @ -10,6 +10,7 @@ | ||||
|  */ | ||||
| 
 | ||||
| #include <linux/kernel.h> | ||||
| #include <linux/dma-mapping.h> | ||||
| #include <linux/platform_device.h> | ||||
| #include <linux/interrupt.h> | ||||
| #include <linux/ioport.h> | ||||
| @ -18,7 +19,7 @@ | ||||
| static struct resource s5p_fimc0_resource[] = { | ||||
| 	[0] = { | ||||
| 		.start	= S5P_PA_FIMC0, | ||||
| 		.end	= S5P_PA_FIMC0 + SZ_1M - 1, | ||||
| 		.end	= S5P_PA_FIMC0 + SZ_4K - 1, | ||||
| 		.flags	= IORESOURCE_MEM, | ||||
| 	}, | ||||
| 	[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 = { | ||||
| 	.name		= "s5p-fimc", | ||||
| 	.id		= 0, | ||||
| 	.num_resources	= ARRAY_SIZE(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/dma-mapping.h> | ||||
| #include <linux/platform_device.h> | ||||
| #include <linux/interrupt.h> | ||||
| #include <linux/ioport.h> | ||||
| @ -18,7 +19,7 @@ | ||||
| static struct resource s5p_fimc1_resource[] = { | ||||
| 	[0] = { | ||||
| 		.start	= S5P_PA_FIMC1, | ||||
| 		.end	= S5P_PA_FIMC1 + SZ_1M - 1, | ||||
| 		.end	= S5P_PA_FIMC1 + SZ_4K - 1, | ||||
| 		.flags	= IORESOURCE_MEM, | ||||
| 	}, | ||||
| 	[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 = { | ||||
| 	.name		= "s5p-fimc", | ||||
| 	.id		= 1, | ||||
| 	.num_resources	= ARRAY_SIZE(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/dma-mapping.h> | ||||
| #include <linux/platform_device.h> | ||||
| #include <linux/interrupt.h> | ||||
| #include <linux/ioport.h> | ||||
| @ -18,7 +19,7 @@ | ||||
| static struct resource s5p_fimc2_resource[] = { | ||||
| 	[0] = { | ||||
| 		.start	= S5P_PA_FIMC2, | ||||
| 		.end	= S5P_PA_FIMC2 + SZ_1M - 1, | ||||
| 		.end	= S5P_PA_FIMC2 + SZ_4K - 1, | ||||
| 		.flags	= IORESOURCE_MEM, | ||||
| 	}, | ||||
| 	[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 = { | ||||
| 	.name		= "s5p-fimc", | ||||
| 	.id		= 2, | ||||
| 	.num_resources	= ARRAY_SIZE(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) | ||||
| 		return -EINVAL; | ||||
| 
 | ||||
| 	off = chip->chip.base - pin; | ||||
| 	off = pin - chip->chip.base; | ||||
| 	shift = off * 2; | ||||
| 	reg = chip->base + 0x0C; | ||||
| 
 | ||||
| 	drvstr = __raw_readl(reg); | ||||
| 	drvstr = 0xffff & (0x3 << shift); | ||||
| 	drvstr = drvstr >> shift; | ||||
| 	drvstr &= 0x3; | ||||
| 
 | ||||
| 	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) | ||||
| 		return -EINVAL; | ||||
| 
 | ||||
| 	off = chip->chip.base - pin; | ||||
| 	off = pin - chip->chip.base; | ||||
| 	shift = off * 2; | ||||
| 	reg = chip->base + 0x0C; | ||||
| 
 | ||||
| 	tmp = __raw_readl(reg); | ||||
| 	tmp &= ~(0x3 << shift); | ||||
| 	tmp |= drvstr << shift; | ||||
| 
 | ||||
| 	__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.
 | ||||
|  * | ||||
|  * 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_LV2	((__force s5p_gpio_drvstr_t)0x01) | ||||
| #define S5P_GPIO_DRVSTR_LV3	((__force s5p_gpio_drvstr_t)0x10) | ||||
| #define S5P_GPIO_DRVSTR_LV4	((__force s5p_gpio_drvstr_t)0x11) | ||||
| #define S5P_GPIO_DRVSTR_LV1	((__force s5p_gpio_drvstr_t)0x0) | ||||
| #define S5P_GPIO_DRVSTR_LV2	((__force s5p_gpio_drvstr_t)0x2) | ||||
| #define S5P_GPIO_DRVSTR_LV3	((__force s5p_gpio_drvstr_t)0x1) | ||||
| #define S5P_GPIO_DRVSTR_LV4	((__force s5p_gpio_drvstr_t)0x3) | ||||
| 
 | ||||
| /**
 | ||||
|  * 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); | ||||
| 	module->arch.syminfo = NULL; | ||||
| 
 | ||||
| 	return module_bug_finalize(hdr, sechdrs, module); | ||||
| 	return 0; | ||||
| } | ||||
| 
 | ||||
| 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; | ||||
| 	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; | ||||
| 	psr = user->i.psr; | ||||
| 	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; | ||||
| 	int rsig; | ||||
| 
 | ||||
| 	set_fs(USER_DS); | ||||
| 
 | ||||
| 	frame = get_sigframe(ka, 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)); | ||||
| 	} | ||||
| 
 | ||||
| 	/* set up registers for signal handler */ | ||||
| 	__frame->sp   = (unsigned long) frame; | ||||
| 	__frame->lr   = (unsigned long) &frame->retcode; | ||||
| 	__frame->gr8  = sig; | ||||
| 
 | ||||
| 	/* Set up registers for the signal handler */ | ||||
| 	if (current->personality & FDPIC_FUNCPTRS) { | ||||
| 		struct fdpic_func_descriptor __user *funcptr = | ||||
| 			(struct fdpic_func_descriptor __user *) ka->sa.sa_handler; | ||||
| 		__get_user(__frame->pc, &funcptr->text); | ||||
| 		__get_user(__frame->gr15, &funcptr->GOT); | ||||
| 		struct fdpic_func_descriptor desc; | ||||
| 		if (copy_from_user(&desc, funcptr, sizeof(desc))) | ||||
| 			goto give_sigsegv; | ||||
| 		__frame->pc = desc.text; | ||||
| 		__frame->gr15 = desc.GOT; | ||||
| 	} else { | ||||
| 		__frame->pc   = (unsigned long) ka->sa.sa_handler; | ||||
| 		__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 */ | ||||
| 	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; | ||||
| 
 | ||||
| give_sigsegv: | ||||
| 	force_sig(SIGSEGV, current); | ||||
| 	force_sigsegv(sig, current); | ||||
| 	return -EFAULT; | ||||
| 
 | ||||
| } /* 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; | ||||
| 	int rsig; | ||||
| 
 | ||||
| 	set_fs(USER_DS); | ||||
| 
 | ||||
| 	frame = get_sigframe(ka, 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 */ | ||||
| 	__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) { | ||||
| 		struct fdpic_func_descriptor __user *funcptr = | ||||
| 			(struct fdpic_func_descriptor __user *) ka->sa.sa_handler; | ||||
| 		__get_user(__frame->pc, &funcptr->text); | ||||
| 		__get_user(__frame->gr15, &funcptr->GOT); | ||||
| 		struct fdpic_func_descriptor desc; | ||||
| 		if (copy_from_user(&desc, funcptr, sizeof(desc))) | ||||
| 			goto give_sigsegv; | ||||
| 		__frame->pc = desc.text; | ||||
| 		__frame->gr15 = desc.GOT; | ||||
| 	} else { | ||||
| 		__frame->pc   = (unsigned long) ka->sa.sa_handler; | ||||
| 		__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 */ | ||||
| 	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; | ||||
| 
 | ||||
| give_sigsegv: | ||||
| 	force_sig(SIGSEGV, current); | ||||
| 	force_sigsegv(sig, current); | ||||
| 	return -EFAULT; | ||||
| 
 | ||||
| } /* end setup_rt_frame() */ | ||||
| @ -437,7 +446,7 @@ static int handle_signal(unsigned long sig, siginfo_t *info, | ||||
| 	int ret; | ||||
| 
 | ||||
| 	/* Are we from a system call? */ | ||||
| 	if (in_syscall(__frame)) { | ||||
| 	if (__frame->syscallno != -1) { | ||||
| 		/* If so, check system call restarting.. */ | ||||
| 		switch (__frame->gr8) { | ||||
| 		case -ERESTART_RESTARTBLOCK: | ||||
| @ -456,6 +465,7 @@ static int handle_signal(unsigned long sig, siginfo_t *info, | ||||
| 			__frame->gr8 = __frame->orig_gr8; | ||||
| 			__frame->pc -= 4; | ||||
| 		} | ||||
| 		__frame->syscallno = -1; | ||||
| 	} | ||||
| 
 | ||||
| 	/* Set up the stack frame */ | ||||
| @ -538,10 +548,11 @@ no_signal: | ||||
| 			break; | ||||
| 
 | ||||
| 		case -ERESTART_RESTARTBLOCK: | ||||
| 			__frame->gr8 = __NR_restart_syscall; | ||||
| 			__frame->gr7 = __NR_restart_syscall; | ||||
| 			__frame->pc -= 4; | ||||
| 			break; | ||||
| 		} | ||||
| 		__frame->syscallno = -1; | ||||
| 	} | ||||
| 
 | ||||
| 	/* 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, | ||||
| 		    struct module *me) | ||||
| { | ||||
| 	return module_bug_finalize(hdr, sechdrs, me); | ||||
| 	return 0; | ||||
| } | ||||
| 
 | ||||
| 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 * | ||||
| compat_alloc_user_space (long len) | ||||
| arch_compat_alloc_user_space (long len) | ||||
| { | ||||
| 	struct pt_regs *regs = task_pt_regs(current); | ||||
| 	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 | ||||
| 	mov ar.ccv=0 | ||||
| 	andcm r14=r14,r17			// filter out SIGKILL & SIGSTOP | ||||
| 	mov r8=EINVAL			// default to EINVAL | ||||
| 
 | ||||
| #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 r8=EINVAL			// default to EINVAL | ||||
| 	mov.m ar.ccv=r17 | ||||
| 	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 | ||||
| 	cmp4.ne p6,p0=r18,r0 | ||||
| (p6)	br.cond.spnt.many .lock_contention | ||||
| 	;;
 | ||||
| #else | ||||
| 	ld8 r3=[r2]			// re-read current->blocked now that we hold the lock | ||||
| 	mov r8=EINVAL			// default to EINVAL | ||||
| #endif | ||||
| 	add r18=IA64_TASK_PENDING_OFFSET+IA64_SIGPENDING_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 | ||||
| 
 | ||||
| #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 | ||||
| 	SSM_PSR_I(p0, p9, r31) | ||||
| 	;;
 | ||||
| @ -512,7 +523,8 @@ EX(.fail_efault, (p15) st8 [r34]=r3) | ||||
| 
 | ||||
| .sig_pending: | ||||
| #ifdef CONFIG_SMP | ||||
| 	st4.rel [r31]=r0			// release the lock | ||||
| 	// __ticket_spin_unlock(r31) | ||||
| 	st2.rel [r31]=r20			// release the lock | ||||
| #endif | ||||
| 	SSM_PSR_I(p0, p9, r17) | ||||
| 	;;
 | ||||
|  | ||||
| @ -157,7 +157,6 @@ typedef struct sigaltstack { | ||||
| #undef __HAVE_ARCH_SIG_BITOPS | ||||
| 
 | ||||
| struct pt_regs; | ||||
| extern int do_signal(struct pt_regs *regs, sigset_t *oldset); | ||||
| 
 | ||||
| #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_OLDUMOUNT | ||||
| #define __ARCH_WANT_SYS_RT_SIGACTION | ||||
| #define __ARCH_WANT_SYS_RT_SIGSUSPEND | ||||
| 
 | ||||
| #define __IGNORE_lchown | ||||
| #define __IGNORE_setuid | ||||
|  | ||||
| @ -235,10 +235,9 @@ work_resched: | ||||
| work_notifysig:				; deal with pending signals and
 | ||||
| 					; notify-resume requests
 | ||||
| 	mv	r0, sp			; arg1 : struct pt_regs *regs
 | ||||
| 	ldi	r1, #0			; arg2 : sigset_t *oldset
 | ||||
| 	mv	r2, r9			; arg3 : __u32 thread_info_flags
 | ||||
| 	mv	r1, r9			; arg2 : __u32 thread_info_flags
 | ||||
| 	bl	do_notify_resume | ||||
| 	bra	restore_all | ||||
| 	bra	resume_userspace | ||||
| 
 | ||||
| 	; perform syscall exit tracing
 | ||||
| 	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) | ||||
| 	    != sizeof(insn)) | ||||
| 		break; | ||||
| 		return -EIO; | ||||
| 
 | ||||
| 	compute_next_pc(insn, pc, &next_pc, child); | ||||
| 	if (next_pc & 0x80000000) | ||||
| 		break; | ||||
| 		return -EIO; | ||||
| 
 | ||||
| 	if (embed_debug_trap(child, next_pc)) | ||||
| 		break; | ||||
| 		return -EIO; | ||||
| 
 | ||||
| 	invalidate_cache(); | ||||
| 	return 0; | ||||
| } | ||||
| 
 | ||||
| void user_disable_single_step(struct task_struct *child) | ||||
|  | ||||
| @ -28,37 +28,6 @@ | ||||
| 
 | ||||
| #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 | ||||
| sys_sigaltstack(const stack_t __user *uss, stack_t __user *uoss, | ||||
| 		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); | ||||
| } | ||||
| 
 | ||||
| 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) | ||||
| { | ||||
| 	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); | ||||
| #endif | ||||
| 
 | ||||
| 	return; | ||||
| 	return 0; | ||||
| 
 | ||||
| give_sigsegv: | ||||
| 	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 | ||||
|  */ | ||||
| 
 | ||||
| static void | ||||
| static int | ||||
| handle_signal(unsigned long sig, struct k_sigaction *ka, siginfo_t *info, | ||||
| 	      sigset_t *oldset, struct pt_regs *regs) | ||||
| { | ||||
| 	unsigned short inst; | ||||
| 
 | ||||
| 	/* Are we from a system call? */ | ||||
| 	if (regs->syscall_nr >= 0) { | ||||
| 		/* If so, check system call restarting.. */ | ||||
| @ -308,16 +289,14 @@ handle_signal(unsigned long sig, struct k_sigaction *ka, siginfo_t *info, | ||||
| 			/* fallthrough */ | ||||
| 			case -ERESTARTNOINTR: | ||||
| 				regs->r0 = regs->orig_r0; | ||||
| 				inst = *(unsigned short *)(regs->bpc - 2); | ||||
| 				if ((inst & 0xfff0) == 0x10f0)	/* trap ? */ | ||||
| 					regs->bpc -= 2; | ||||
| 				else | ||||
| 					regs->bpc -= 4; | ||||
| 				if (prev_insn(regs) < 0) | ||||
| 					return -EFAULT; | ||||
| 		} | ||||
| 	} | ||||
| 
 | ||||
| 	/* 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); | ||||
| 	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); | ||||
| 	recalc_sigpending(); | ||||
| 	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 | ||||
|  * mistake. | ||||
|  */ | ||||
| int do_signal(struct pt_regs *regs, sigset_t *oldset) | ||||
| static void do_signal(struct pt_regs *regs) | ||||
| { | ||||
| 	siginfo_t info; | ||||
| 	int signr; | ||||
| 	struct k_sigaction ka; | ||||
| 	unsigned short inst; | ||||
| 	sigset_t *oldset; | ||||
| 
 | ||||
| 	/*
 | ||||
| 	 * 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 (!user_mode(regs)) | ||||
| 		return 1; | ||||
| 		return; | ||||
| 
 | ||||
| 	if (try_to_freeze())  | ||||
| 		goto no_signal; | ||||
| 
 | ||||
| 	if (!oldset) | ||||
| 	if (test_thread_flag(TIF_RESTORE_SIGMASK)) | ||||
| 		oldset = ¤t->saved_sigmask; | ||||
| 	else | ||||
| 		oldset = ¤t->blocked; | ||||
| 
 | ||||
| 	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.  */ | ||||
| 		handle_signal(signr, &ka, &info, oldset, regs); | ||||
| 		return 1; | ||||
| 		if (handle_signal(signr, &ka, &info, oldset, regs) == 0) | ||||
| 			clear_thread_flag(TIF_RESTORE_SIGMASK); | ||||
| 
 | ||||
| 		return; | ||||
| 	} | ||||
| 
 | ||||
|  no_signal: | ||||
| @ -375,31 +359,24 @@ int do_signal(struct pt_regs *regs, sigset_t *oldset) | ||||
| 		    regs->r0 == -ERESTARTSYS || | ||||
| 		    regs->r0 == -ERESTARTNOINTR) { | ||||
| 			regs->r0 = regs->orig_r0; | ||||
| 			inst = *(unsigned short *)(regs->bpc - 2); | ||||
| 			if ((inst & 0xfff0) == 0x10f0)	/* trap ? */ | ||||
| 				regs->bpc -= 2; | ||||
| 			else | ||||
| 				regs->bpc -= 4; | ||||
| 		} | ||||
| 		if (regs->r0 == -ERESTART_RESTARTBLOCK){ | ||||
| 			prev_insn(regs); | ||||
| 		} else if (regs->r0 == -ERESTART_RESTARTBLOCK){ | ||||
| 			regs->r0 = regs->orig_r0; | ||||
| 			regs->r7 = __NR_restart_syscall; | ||||
| 			inst = *(unsigned short *)(regs->bpc - 2); | ||||
| 			if ((inst & 0xfff0) == 0x10f0)	/* trap ? */ | ||||
| 				regs->bpc -= 2; | ||||
| 			else | ||||
| 				regs->bpc -= 4; | ||||
| 			prev_insn(regs); | ||||
| 		} | ||||
| 	} | ||||
| 	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 | ||||
|  * - triggered by current->work.notify_resume | ||||
|  */ | ||||
| void do_notify_resume(struct pt_regs *regs, sigset_t *oldset, | ||||
| 		      __u32 thread_info_flags) | ||||
| void do_notify_resume(struct pt_regs *regs, __u32 thread_info_flags) | ||||
| { | ||||
| 	/* Pending single-step? */ | ||||
| 	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 */ | ||||
| 	if (thread_info_flags & _TIF_SIGPENDING) | ||||
| 		do_signal(regs,oldset); | ||||
| 		do_signal(regs); | ||||
| 
 | ||||
| 	if (thread_info_flags & _TIF_NOTIFY_RESUME) { | ||||
| 		clear_thread_flag(TIF_NOTIFY_RESUME); | ||||
|  | ||||
| @ -340,10 +340,13 @@ | ||||
| #define __NR_set_thread_area	334 | ||||
| #define __NR_atomic_cmpxchg_32	335 | ||||
| #define __NR_atomic_barrier	336 | ||||
| #define __NR_fanotify_init	337 | ||||
| #define __NR_fanotify_mark	338 | ||||
| #define __NR_prlimit64		339 | ||||
| 
 | ||||
| #ifdef __KERNEL__ | ||||
| 
 | ||||
| #define NR_syscalls		337 | ||||
| #define NR_syscalls		340 | ||||
| 
 | ||||
| #define __ARCH_WANT_IPC_PARSE_VERSION | ||||
| #define __ARCH_WANT_OLD_READDIR | ||||
|  | ||||
| @ -765,4 +765,7 @@ sys_call_table: | ||||
| 	.long sys_set_thread_area
 | ||||
| 	.long sys_atomic_cmpxchg_32	/* 335 */ | ||||
| 	.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 ) | ||||
| { | ||||
| 	__u32 cfreq = ( freq << 5 ) / 468; | ||||
| 	__u32 flags; | ||||
| 	unsigned long flags; | ||||
| 	int i; | ||||
| 
 | ||||
| 	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 ) | ||||
| { | ||||
| 	__u32 flags; | ||||
| 	unsigned long flags; | ||||
| 
 | ||||
| 	/* if the bell is already ringing, ring longer */ | ||||
| 	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 ) | ||||
| { | ||||
| 	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 | ||||
|  | ||||
| @ -355,6 +355,9 @@ ENTRY(sys_call_table) | ||||
| 	.long sys_set_thread_area
 | ||||
| 	.long sys_atomic_cmpxchg_32	/* 335 */ | ||||
| 	.long sys_atomic_barrier
 | ||||
| 	.long sys_fanotify_init
 | ||||
| 	.long sys_fanotify_mark
 | ||||
| 	.long sys_prlimit64
 | ||||
| 
 | ||||
| 	.rept NR_syscalls-(.-sys_call_table)/4 | ||||
| 		.long sys_ni_syscall
 | ||||
|  | ||||
| @ -13,6 +13,7 @@ config MIPS | ||||
| 	select HAVE_KPROBES | ||||
| 	select HAVE_KRETPROBES | ||||
| 	select RTC_LIB if !MACH_LOONGSON | ||||
| 	select GENERIC_ATOMIC64 if !64BIT | ||||
| 
 | ||||
| mainmenu "Linux/MIPS Kernel Configuration" | ||||
| 
 | ||||
| @ -1646,8 +1647,16 @@ config MIPS_MT_SMP | ||||
| 	select SYS_SUPPORTS_SMP | ||||
| 	select SMP_UP | ||||
| 	help | ||||
| 	  This is a kernel model which is also known a VSMP or lately | ||||
| 	  has been marketesed into SMVP. | ||||
| 	  This is a kernel model which is known a VSMP but lately has been | ||||
| 	  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 | ||||
| 	bool "SMTC: Use all TCs on all VPEs for SMP" | ||||
| @ -1664,6 +1673,14 @@ config MIPS_MT_SMTC | ||||
| 	help | ||||
| 	  This is a kernel model which is known a SMTC or lately has been | ||||
| 	  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 | ||||
| 
 | ||||
|  | ||||
| @ -43,7 +43,7 @@ int prom_argc; | ||||
| char **prom_argv; | ||||
| char **prom_envp; | ||||
| 
 | ||||
| void prom_init_cmdline(void) | ||||
| void __init prom_init_cmdline(void) | ||||
| { | ||||
| 	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; | ||||
| 
 | ||||
| @ -123,7 +123,6 @@ int prom_get_ethernet_addr(char *ethernet_addr) | ||||
| 
 | ||||
| 	return 0; | ||||
| } | ||||
| EXPORT_SYMBOL(prom_get_ethernet_addr); | ||||
| 
 | ||||
| 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 | ||||
| 
 | ||||
| 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 | ||||
| 
 | ||||
|  | ||||
| @ -83,3 +83,7 @@ config ARCH_SPARSEMEM_ENABLE | ||||
| 	def_bool y | ||||
| 	select SPARSEMEM_STATIC | ||||
| 	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 */ | ||||
| } | ||||
| 
 | ||||
| static int cnmips_cu2_setup(void) | ||||
| static int __init cnmips_cu2_setup(void) | ||||
| { | ||||
| 	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-$(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) | ||||
| 
 | ||||
| #else /* !CONFIG_64BIT */ | ||||
| 
 | ||||
| #include <asm-generic/atomic64.h> | ||||
| 
 | ||||
| #endif /* CONFIG_64BIT */ | ||||
| 
 | ||||
| /*
 | ||||
|  | ||||
| @ -145,7 +145,7 @@ static inline compat_uptr_t ptr_to_compat(void __user *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 *) | ||||
| 		((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)						\ | ||||
| ({									\ | ||||
| 	static struct notifier_block fn##_nb __cpuinitdata = {		\ | ||||
| 	static struct notifier_block fn##_nb = {			\ | ||||
| 		.notifier_call = fn,					\ | ||||
| 		.priority = pri						\ | ||||
| 	};								\ | ||||
|  | ||||
| @ -321,6 +321,7 @@ struct gic_intrmask_regs { | ||||
|  */ | ||||
| struct gic_intr_map { | ||||
| 	unsigned int cpunum;	/* Directed to this CPU */ | ||||
| #define GIC_UNUSED		0xdead			/* Dummy data */ | ||||
| 	unsigned int pin;	/* Directed to this Pin */ | ||||
| 	unsigned int polarity;	/* Polarity : +/-	*/ | ||||
| 	unsigned int trigtype;	/* Trigger  : Edge/Levl */ | ||||
|  | ||||
| @ -1,6 +1,6 @@ | ||||
| #ifndef __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 */ | ||||
|  | ||||
| @ -88,9 +88,6 @@ | ||||
| 
 | ||||
| #define GIC_EXT_INTR(x)		x | ||||
| 
 | ||||
| /* Dummy data */ | ||||
| #define X			0xdead | ||||
| 
 | ||||
| /* External Interrupts used for IPI */ | ||||
| #define GIC_IPI_EXT_INTR_RESCHED_VPE0	16 | ||||
| #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) | ||||
| #endif | ||||
| #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 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) | ||||
| 
 | ||||
| /* 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 */ | ||||
| #define _TIF_ALLWORK_MASK	(0x8000ffff & ~_TIF_SECCOMP) | ||||
| 
 | ||||
|  | ||||
| @ -356,16 +356,19 @@ | ||||
| #define __NR_perf_event_open		(__NR_Linux + 333) | ||||
| #define __NR_accept4			(__NR_Linux + 334) | ||||
| #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 | ||||
|  */ | ||||
| #define __NR_Linux_syscalls		335 | ||||
| #define __NR_Linux_syscalls		338 | ||||
| 
 | ||||
| #endif /* _MIPS_SIM == _MIPS_SIM_ABI32 */ | ||||
| 
 | ||||
| #define __NR_O32_Linux			4000 | ||||
| #define __NR_O32_Linux_syscalls		335 | ||||
| #define __NR_O32_Linux_syscalls		338 | ||||
| 
 | ||||
| #if _MIPS_SIM == _MIPS_SIM_ABI64 | ||||
| 
 | ||||
| @ -668,16 +671,19 @@ | ||||
| #define __NR_perf_event_open		(__NR_Linux + 292) | ||||
| #define __NR_accept4			(__NR_Linux + 293) | ||||
| #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 | ||||
|  */ | ||||
| #define __NR_Linux_syscalls		294 | ||||
| #define __NR_Linux_syscalls		297 | ||||
| 
 | ||||
| #endif /* _MIPS_SIM == _MIPS_SIM_ABI64 */ | ||||
| 
 | ||||
| #define __NR_64_Linux			5000 | ||||
| #define __NR_64_Linux_syscalls		294 | ||||
| #define __NR_64_Linux_syscalls		297 | ||||
| 
 | ||||
| #if _MIPS_SIM == _MIPS_SIM_NABI32 | ||||
| 
 | ||||
| @ -985,16 +991,19 @@ | ||||
| #define __NR_accept4			(__NR_Linux + 297) | ||||
| #define __NR_recvmmsg			(__NR_Linux + 298) | ||||
| #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 | ||||
|  */ | ||||
| #define __NR_Linux_syscalls		299 | ||||
| #define __NR_Linux_syscalls		302 | ||||
| 
 | ||||
| #endif /* _MIPS_SIM == _MIPS_SIM_NABI32 */ | ||||
| 
 | ||||
| #define __NR_N32_Linux			6000 | ||||
| #define __NR_N32_Linux_syscalls		299 | ||||
| #define __NR_N32_Linux_syscalls		302 | ||||
| 
 | ||||
| #ifdef __KERNEL__ | ||||
| 
 | ||||
|  | ||||
Some files were not shown because too many files have changed in this diff Show More
		Loading…
	
		Reference in New Issue
	
	Block a user