Merge commit 'v2.6.32-rc4' into perf/core
Merge reason: we were on an -rc1 base, merge up to -rc4. Signed-off-by: Ingo Molnar <mingo@elte.hu>
This commit is contained in:
commit
9dbdd6c41c
|
@ -31,3 +31,31 @@ Date: March 2009
|
|||
Kernel Version: 2.6.30
|
||||
Contact: iss_storagedev@hp.com
|
||||
Description: A symbolic link to /sys/block/cciss!cXdY
|
||||
|
||||
Where: /sys/bus/pci/devices/<dev>/ccissX/rescan
|
||||
Date: August 2009
|
||||
Kernel Version: 2.6.31
|
||||
Contact: iss_storagedev@hp.com
|
||||
Description: Kicks of a rescan of the controller to discover logical
|
||||
drive topology changes.
|
||||
|
||||
Where: /sys/bus/pci/devices/<dev>/ccissX/cXdY/lunid
|
||||
Date: August 2009
|
||||
Kernel Version: 2.6.31
|
||||
Contact: iss_storagedev@hp.com
|
||||
Description: Displays the 8-byte LUN ID used to address logical
|
||||
drive Y of controller X.
|
||||
|
||||
Where: /sys/bus/pci/devices/<dev>/ccissX/cXdY/raid_level
|
||||
Date: August 2009
|
||||
Kernel Version: 2.6.31
|
||||
Contact: iss_storagedev@hp.com
|
||||
Description: Displays the RAID level of logical drive Y of
|
||||
controller X.
|
||||
|
||||
Where: /sys/bus/pci/devices/<dev>/ccissX/cXdY/usage_count
|
||||
Date: August 2009
|
||||
Kernel Version: 2.6.31
|
||||
Contact: iss_storagedev@hp.com
|
||||
Description: Displays the usage count (number of opens) of logical drive Y
|
||||
of controller X.
|
||||
|
|
|
@ -232,7 +232,7 @@ your e-mail client so that it sends your patches untouched.
|
|||
When sending patches to Linus, always follow step #7.
|
||||
|
||||
Large changes are not appropriate for mailing lists, and some
|
||||
maintainers. If your patch, uncompressed, exceeds 40 kB in size,
|
||||
maintainers. If your patch, uncompressed, exceeds 300 kB in size,
|
||||
it is preferred that you store your patch on an Internet-accessible
|
||||
server, and provide instead a URL (link) pointing to your patch.
|
||||
|
||||
|
|
|
@ -29,11 +29,13 @@ TCM location and size. Notice that this is not a MMU table: you
|
|||
actually move the physical location of the TCM around. At the
|
||||
place you put it, it will mask any underlying RAM from the
|
||||
CPU so it is usually wise not to overlap any physical RAM with
|
||||
the TCM. The TCM memory exists totally outside the MMU and will
|
||||
override any MMU mappings.
|
||||
the TCM.
|
||||
|
||||
Code executing inside the ITCM does not "see" any MMU mappings
|
||||
and e.g. register accesses must be made to physical addresses.
|
||||
The TCM memory can then be remapped to another address again using
|
||||
the MMU, but notice that the TCM if often used in situations where
|
||||
the MMU is turned off. To avoid confusion the current Linux
|
||||
implementation will map the TCM 1 to 1 from physical to virtual
|
||||
memory in the location specified by the machine.
|
||||
|
||||
TCM is used for a few things:
|
||||
|
||||
|
|
|
@ -227,7 +227,14 @@ as the path relative to the root of the cgroup file system.
|
|||
Each cgroup is represented by a directory in the cgroup file system
|
||||
containing the following files describing that cgroup:
|
||||
|
||||
- tasks: list of tasks (by pid) attached to that cgroup
|
||||
- tasks: list of tasks (by pid) attached to that cgroup. This list
|
||||
is not guaranteed to be sorted. Writing a thread id into this file
|
||||
moves the thread into this cgroup.
|
||||
- cgroup.procs: list of tgids in the cgroup. This list is not
|
||||
guaranteed to be sorted or free of duplicate tgids, and userspace
|
||||
should sort/uniquify the list if this property is required.
|
||||
Writing a tgid into this file moves all threads with that tgid into
|
||||
this cgroup.
|
||||
- notify_on_release flag: run the release agent on exit?
|
||||
- release_agent: the path to use for release notifications (this file
|
||||
exists in the top cgroup only)
|
||||
|
@ -374,7 +381,7 @@ Now you want to do something with this cgroup.
|
|||
|
||||
In this directory you can find several files:
|
||||
# ls
|
||||
notify_on_release tasks
|
||||
cgroup.procs notify_on_release tasks
|
||||
(plus whatever files added by the attached subsystems)
|
||||
|
||||
Now attach your shell to this cgroup:
|
||||
|
|
|
@ -34,7 +34,7 @@ static char cn_test_name[] = "cn_test";
|
|||
static struct sock *nls;
|
||||
static struct timer_list cn_test_timer;
|
||||
|
||||
static void cn_test_callback(struct cn_msg *msg)
|
||||
static void cn_test_callback(struct cn_msg *msg, struct netlink_skb_parms *nsp)
|
||||
{
|
||||
pr_info("%s: %lu: idx=%x, val=%x, seq=%u, ack=%u, len=%d: %s.\n",
|
||||
__func__, jiffies, msg->id.idx, msg->id.val,
|
||||
|
|
|
@ -23,7 +23,7 @@ handling, etc... The Connector driver allows any kernelspace agents to use
|
|||
netlink based networking for inter-process communication in a significantly
|
||||
easier way:
|
||||
|
||||
int cn_add_callback(struct cb_id *id, char *name, void (*callback) (void *));
|
||||
int cn_add_callback(struct cb_id *id, char *name, void (*callback) (struct cn_msg *, struct netlink_skb_parms *));
|
||||
void cn_netlink_send(struct cn_msg *msg, u32 __group, int gfp_mask);
|
||||
|
||||
struct cb_id
|
||||
|
@ -53,15 +53,15 @@ struct cn_msg
|
|||
Connector interfaces.
|
||||
/*****************************************/
|
||||
|
||||
int cn_add_callback(struct cb_id *id, char *name, void (*callback) (void *));
|
||||
int cn_add_callback(struct cb_id *id, char *name, void (*callback) (struct cn_msg *, struct netlink_skb_parms *));
|
||||
|
||||
Registers new callback with connector core.
|
||||
|
||||
struct cb_id *id - unique connector's user identifier.
|
||||
It must be registered in connector.h for legal in-kernel users.
|
||||
char *name - connector's callback symbolic name.
|
||||
void (*callback) (void *) - connector's callback.
|
||||
Argument must be dereferenced to struct cn_msg *.
|
||||
void (*callback) (struct cn..) - connector's callback.
|
||||
cn_msg and the sender's credentials
|
||||
|
||||
|
||||
void cn_del_callback(struct cb_id *id);
|
||||
|
|
|
@ -282,9 +282,16 @@ stripe=n Number of filesystem blocks that mballoc will try
|
|||
to use for allocation size and alignment. For RAID5/6
|
||||
systems this should be the number of data
|
||||
disks * RAID chunk size in file system blocks.
|
||||
delalloc (*) Deferring block allocation until write-out time.
|
||||
nodelalloc Disable delayed allocation. Blocks are allocation
|
||||
when data is copied from user to page cache.
|
||||
|
||||
delalloc (*) Defer block allocation until just before ext4
|
||||
writes out the block(s) in question. This
|
||||
allows ext4 to better allocation decisions
|
||||
more efficiently.
|
||||
nodelalloc Disable delayed allocation. Blocks are allocated
|
||||
when the data is copied from userspace to the
|
||||
page cache, either via the write(2) system call
|
||||
or when an mmap'ed page which was previously
|
||||
unallocated is written for the first time.
|
||||
|
||||
max_batch_time=usec Maximum amount of time ext4 should wait for
|
||||
additional filesystem operations to be batch
|
||||
|
|
|
@ -1113,7 +1113,6 @@ Table 1-12: Files in /proc/fs/ext4/<devname>
|
|||
..............................................................................
|
||||
File Content
|
||||
mb_groups details of multiblock allocator buddy cache of free blocks
|
||||
mb_history multiblock allocation history
|
||||
..............................................................................
|
||||
|
||||
|
||||
|
|
|
@ -102,7 +102,7 @@ shortname=lower|win95|winnt|mixed
|
|||
winnt: emulate the Windows NT rule for display/create.
|
||||
mixed: emulate the Windows NT rule for display,
|
||||
emulate the Windows 95 rule for create.
|
||||
Default setting is `lower'.
|
||||
Default setting is `mixed'.
|
||||
|
||||
tz=UTC -- Interpret timestamps as UTC rather than local time.
|
||||
This option disables the conversion of timestamps
|
||||
|
|
|
@ -22,12 +22,13 @@ Usage Notes
|
|||
-----------
|
||||
|
||||
This driver does not probe for LTC4215 devices, due to the fact that some
|
||||
of the possible addresses are unfriendly to probing. You will need to use
|
||||
the "force" parameter to tell the driver where to find the device.
|
||||
of the possible addresses are unfriendly to probing. You will have to
|
||||
instantiate the devices explicitly.
|
||||
|
||||
Example: the following will load the driver for an LTC4215 at address 0x44
|
||||
on I2C bus #0:
|
||||
$ modprobe ltc4215 force=0,0x44
|
||||
$ modprobe ltc4215
|
||||
$ echo ltc4215 0x44 > /sys/bus/i2c/devices/i2c-0/new_device
|
||||
|
||||
|
||||
Sysfs entries
|
||||
|
|
|
@ -23,12 +23,13 @@ Usage Notes
|
|||
-----------
|
||||
|
||||
This driver does not probe for LTC4245 devices, due to the fact that some
|
||||
of the possible addresses are unfriendly to probing. You will need to use
|
||||
the "force" parameter to tell the driver where to find the device.
|
||||
of the possible addresses are unfriendly to probing. You will have to
|
||||
instantiate the devices explicitly.
|
||||
|
||||
Example: the following will load the driver for an LTC4245 at address 0x23
|
||||
on I2C bus #1:
|
||||
$ modprobe ltc4245 force=1,0x23
|
||||
$ modprobe ltc4245
|
||||
$ echo ltc4245 0x23 > /sys/bus/i2c/devices/i2c-1/new_device
|
||||
|
||||
|
||||
Sysfs entries
|
||||
|
|
|
@ -188,7 +188,7 @@ segment, the address is sufficient to uniquely identify the device to be
|
|||
deleted.
|
||||
|
||||
Example:
|
||||
# echo eeprom 0x50 > /sys/class/i2c-adapter/i2c-3/new_device
|
||||
# echo eeprom 0x50 > /sys/bus/i2c/devices/i2c-3/new_device
|
||||
|
||||
While this interface should only be used when in-kernel device declaration
|
||||
can't be done, there is a variety of cases where it can be helpful:
|
||||
|
|
|
@ -128,8 +128,8 @@ Setting IsSM Capability Bit
|
|||
To create the appropriate character device files automatically with
|
||||
udev, a rule like
|
||||
|
||||
KERNEL="umad*", NAME="infiniband/%k"
|
||||
KERNEL="issm*", NAME="infiniband/%k"
|
||||
KERNEL=="umad*", NAME="infiniband/%k"
|
||||
KERNEL=="issm*", NAME="infiniband/%k"
|
||||
|
||||
can be used. This will create device nodes named
|
||||
|
||||
|
|
|
@ -58,7 +58,7 @@ Memory pinning
|
|||
To create the appropriate character device files automatically with
|
||||
udev, a rule like
|
||||
|
||||
KERNEL="uverbs*", NAME="infiniband/%k"
|
||||
KERNEL=="uverbs*", NAME="infiniband/%k"
|
||||
|
||||
can be used. This will create device nodes named
|
||||
|
||||
|
|
|
@ -60,10 +60,9 @@ open() operation on regular files or character devices.
|
|||
|
||||
After a successful return from register_appl(), CAPI messages from the
|
||||
application may be passed to the driver for the device via calls to the
|
||||
send_message() callback function. The CAPI message to send is stored in the
|
||||
data portion of an skb. Conversely, the driver may call Kernel CAPI's
|
||||
capi_ctr_handle_message() function to pass a received CAPI message to Kernel
|
||||
CAPI for forwarding to an application, specifying its ApplID.
|
||||
send_message() callback function. Conversely, the driver may call Kernel
|
||||
CAPI's capi_ctr_handle_message() function to pass a received CAPI message to
|
||||
Kernel CAPI for forwarding to an application, specifying its ApplID.
|
||||
|
||||
Deregistration requests (CAPI operation CAPI_RELEASE) from applications are
|
||||
forwarded as calls to the release_appl() callback function, passing the same
|
||||
|
@ -142,6 +141,7 @@ u16 (*send_message)(struct capi_ctr *ctrlr, struct sk_buff *skb)
|
|||
to accepting or queueing the message. Errors occurring during the
|
||||
actual processing of the message should be signaled with an
|
||||
appropriate reply message.
|
||||
May be called in process or interrupt context.
|
||||
Calls to this function are not serialized by Kernel CAPI, ie. it must
|
||||
be prepared to be re-entered.
|
||||
|
||||
|
@ -154,7 +154,8 @@ read_proc_t *ctr_read_proc
|
|||
system entry, /proc/capi/controllers/<n>; will be called with a
|
||||
pointer to the device's capi_ctr structure as the last (data) argument
|
||||
|
||||
Note: Callback functions are never called in interrupt context.
|
||||
Note: Callback functions except send_message() are never called in interrupt
|
||||
context.
|
||||
|
||||
- to be filled in before calling capi_ctr_ready():
|
||||
|
||||
|
@ -171,14 +172,40 @@ u8 serial[CAPI_SERIAL_LEN]
|
|||
value to return for CAPI_GET_SERIAL
|
||||
|
||||
|
||||
4.3 The _cmsg Structure
|
||||
4.3 SKBs
|
||||
|
||||
CAPI messages are passed between Kernel CAPI and the driver via send_message()
|
||||
and capi_ctr_handle_message(), stored in the data portion of a socket buffer
|
||||
(skb). Each skb contains a single CAPI message coded according to the CAPI 2.0
|
||||
standard.
|
||||
|
||||
For the data transfer messages, DATA_B3_REQ and DATA_B3_IND, the actual
|
||||
payload data immediately follows the CAPI message itself within the same skb.
|
||||
The Data and Data64 parameters are not used for processing. The Data64
|
||||
parameter may be omitted by setting the length field of the CAPI message to 22
|
||||
instead of 30.
|
||||
|
||||
|
||||
4.4 The _cmsg Structure
|
||||
|
||||
(declared in <linux/isdn/capiutil.h>)
|
||||
|
||||
The _cmsg structure stores the contents of a CAPI 2.0 message in an easily
|
||||
accessible form. It contains members for all possible CAPI 2.0 parameters, of
|
||||
which only those appearing in the message type currently being processed are
|
||||
actually used. Unused members should be set to zero.
|
||||
accessible form. It contains members for all possible CAPI 2.0 parameters,
|
||||
including subparameters of the Additional Info and B Protocol structured
|
||||
parameters, with the following exceptions:
|
||||
|
||||
* second Calling party number (CONNECT_IND)
|
||||
|
||||
* Data64 (DATA_B3_REQ and DATA_B3_IND)
|
||||
|
||||
* Sending complete (subparameter of Additional Info, CONNECT_REQ and INFO_REQ)
|
||||
|
||||
* Global Configuration (subparameter of B Protocol, CONNECT_REQ, CONNECT_RESP
|
||||
and SELECT_B_PROTOCOL_REQ)
|
||||
|
||||
Only those parameters appearing in the message type currently being processed
|
||||
are actually used. Unused members should be set to zero.
|
||||
|
||||
Members are named after the CAPI 2.0 standard names of the parameters they
|
||||
represent. See <linux/isdn/capiutil.h> for the exact spelling. Member data
|
||||
|
@ -190,18 +217,19 @@ u16 for CAPI parameters of type 'word'
|
|||
|
||||
u32 for CAPI parameters of type 'dword'
|
||||
|
||||
_cstruct for CAPI parameters of type 'struct' not containing any
|
||||
variably-sized (struct) subparameters (eg. 'Called Party Number')
|
||||
_cstruct for CAPI parameters of type 'struct'
|
||||
The member is a pointer to a buffer containing the parameter in
|
||||
CAPI encoding (length + content). It may also be NULL, which will
|
||||
be taken to represent an empty (zero length) parameter.
|
||||
Subparameters are stored in encoded form within the content part.
|
||||
|
||||
_cmstruct for CAPI parameters of type 'struct' containing 'struct'
|
||||
subparameters ('Additional Info' and 'B Protocol')
|
||||
_cmstruct alternative representation for CAPI parameters of type 'struct'
|
||||
(used only for the 'Additional Info' and 'B Protocol' parameters)
|
||||
The representation is a single byte containing one of the values:
|
||||
CAPI_DEFAULT: the parameter is empty
|
||||
CAPI_COMPOSE: the values of the subparameters are stored
|
||||
individually in the corresponding _cmsg structure members
|
||||
CAPI_DEFAULT: The parameter is empty/absent.
|
||||
CAPI_COMPOSE: The parameter is present.
|
||||
Subparameter values are stored individually in the corresponding
|
||||
_cmsg structure members.
|
||||
|
||||
Functions capi_cmsg2message() and capi_message2cmsg() are provided to convert
|
||||
messages between their transport encoding described in the CAPI 2.0 standard
|
||||
|
@ -297,3 +325,26 @@ char *capi_cmd2str(u8 Command, u8 Subcommand)
|
|||
be NULL if the command/subcommand is not one of those defined in the
|
||||
CAPI 2.0 standard.
|
||||
|
||||
|
||||
7. Debugging
|
||||
|
||||
The module kernelcapi has a module parameter showcapimsgs controlling some
|
||||
debugging output produced by the module. It can only be set when the module is
|
||||
loaded, via a parameter "showcapimsgs=<n>" to the modprobe command, either on
|
||||
the command line or in the configuration file.
|
||||
|
||||
If the lowest bit of showcapimsgs is set, kernelcapi logs controller and
|
||||
application up and down events.
|
||||
|
||||
In addition, every registered CAPI controller has an associated traceflag
|
||||
parameter controlling how CAPI messages sent from and to tha controller are
|
||||
logged. The traceflag parameter is initialized with the value of the
|
||||
showcapimsgs parameter when the controller is registered, but can later be
|
||||
changed via the MANUFACTURER_REQ command KCAPI_CMD_TRACE.
|
||||
|
||||
If the value of traceflag is non-zero, CAPI messages are logged.
|
||||
DATA_B3 messages are only logged if the value of traceflag is > 2.
|
||||
|
||||
If the lowest bit of traceflag is set, only the command/subcommand and message
|
||||
length are logged. Otherwise, kernelcapi logs a readable representation of
|
||||
the entire message.
|
||||
|
|
|
@ -671,6 +671,7 @@ and is between 256 and 4096 characters. It is defined in the file
|
|||
earlyprintk= [X86,SH,BLACKFIN]
|
||||
earlyprintk=vga
|
||||
earlyprintk=serial[,ttySn[,baudrate]]
|
||||
earlyprintk=ttySn[,baudrate]
|
||||
earlyprintk=dbgp[debugController#]
|
||||
|
||||
Append ",keep" to not disable it when the real console
|
||||
|
|
|
@ -42,10 +42,12 @@ General Remarks
|
|||
|
||||
Valid addresses for the MAX6875 are 0x50 and 0x52.
|
||||
Valid addresses for the MAX6874 are 0x50, 0x52, 0x54 and 0x56.
|
||||
The driver does not probe any address, so you must force the address.
|
||||
The driver does not probe any address, so you explicitly instantiate the
|
||||
devices.
|
||||
|
||||
Example:
|
||||
$ modprobe max6875 force=0,0x50
|
||||
$ modprobe max6875
|
||||
$ echo max6875 0x50 > /sys/bus/i2c/devices/i2c-0/new_device
|
||||
|
||||
The MAX6874/MAX6875 ignores address bit 0, so this driver attaches to multiple
|
||||
addresses. For example, for address 0x50, it also reserves 0x51.
|
|
@ -90,6 +90,11 @@ Examples:
|
|||
pgset "dstmac 00:00:00:00:00:00" sets MAC destination address
|
||||
pgset "srcmac 00:00:00:00:00:00" sets MAC source address
|
||||
|
||||
pgset "queue_map_min 0" Sets the min value of tx queue interval
|
||||
pgset "queue_map_max 7" Sets the max value of tx queue interval, for multiqueue devices
|
||||
To select queue 1 of a given device,
|
||||
use queue_map_min=1 and queue_map_max=1
|
||||
|
||||
pgset "src_mac_count 1" Sets the number of MACs we'll range through.
|
||||
The 'minimum' MAC is what you set with srcmac.
|
||||
|
||||
|
@ -101,6 +106,9 @@ Examples:
|
|||
IPDST_RND, UDPSRC_RND,
|
||||
UDPDST_RND, MACSRC_RND, MACDST_RND
|
||||
MPLS_RND, VID_RND, SVID_RND
|
||||
QUEUE_MAP_RND # queue map random
|
||||
QUEUE_MAP_CPU # queue map mirrors smp_processor_id()
|
||||
|
||||
|
||||
pgset "udp_src_min 9" set UDP source port min, If < udp_src_max, then
|
||||
cycle through the port range.
|
||||
|
|
|
@ -381,7 +381,7 @@ int main(int argc, char **argv)
|
|||
memset(&hwtstamp, 0, sizeof(hwtstamp));
|
||||
strncpy(hwtstamp.ifr_name, interface, sizeof(hwtstamp.ifr_name));
|
||||
hwtstamp.ifr_data = (void *)&hwconfig;
|
||||
memset(&hwconfig, 0, sizeof(&hwconfig));
|
||||
memset(&hwconfig, 0, sizeof(hwconfig));
|
||||
hwconfig.tx_type =
|
||||
(so_timestamping_flags & SOF_TIMESTAMPING_TX_HARDWARE) ?
|
||||
HWTSTAMP_TX_ON : HWTSTAMP_TX_OFF;
|
||||
|
|
|
@ -3,6 +3,25 @@ HIGHPOINT ROCKETRAID 3xxx/4xxx ADAPTER DRIVER (hptiop)
|
|||
Controller Register Map
|
||||
-------------------------
|
||||
|
||||
For RR44xx Intel IOP based adapters, the controller IOP is accessed via PCI BAR0 and BAR2:
|
||||
|
||||
BAR0 offset Register
|
||||
0x11C5C Link Interface IRQ Set
|
||||
0x11C60 Link Interface IRQ Clear
|
||||
|
||||
BAR2 offset Register
|
||||
0x10 Inbound Message Register 0
|
||||
0x14 Inbound Message Register 1
|
||||
0x18 Outbound Message Register 0
|
||||
0x1C Outbound Message Register 1
|
||||
0x20 Inbound Doorbell Register
|
||||
0x24 Inbound Interrupt Status Register
|
||||
0x28 Inbound Interrupt Mask Register
|
||||
0x30 Outbound Interrupt Status Register
|
||||
0x34 Outbound Interrupt Mask Register
|
||||
0x40 Inbound Queue Port
|
||||
0x44 Outbound Queue Port
|
||||
|
||||
For Intel IOP based adapters, the controller IOP is accessed via PCI BAR0:
|
||||
|
||||
BAR0 offset Register
|
||||
|
@ -93,7 +112,7 @@ The driver exposes following sysfs attributes:
|
|||
|
||||
|
||||
-----------------------------------------------------------------------------
|
||||
Copyright (C) 2006-2007 HighPoint Technologies, Inc. All Rights Reserved.
|
||||
Copyright (C) 2006-2009 HighPoint Technologies, Inc. All Rights Reserved.
|
||||
|
||||
This file is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
|
|
|
@ -209,6 +209,7 @@ AD1884A / AD1883 / AD1984A / AD1984B
|
|||
laptop laptop with HP jack sensing
|
||||
mobile mobile devices with HP jack sensing
|
||||
thinkpad Lenovo Thinkpad X300
|
||||
touchsmart HP Touchsmart
|
||||
|
||||
AD1884
|
||||
======
|
||||
|
|
|
@ -52,15 +52,15 @@ The KSM daemon is controlled by sysfs files in /sys/kernel/mm/ksm/,
|
|||
readable by all but writable only by root:
|
||||
|
||||
max_kernel_pages - set to maximum number of kernel pages that KSM may use
|
||||
e.g. "echo 2000 > /sys/kernel/mm/ksm/max_kernel_pages"
|
||||
e.g. "echo 100000 > /sys/kernel/mm/ksm/max_kernel_pages"
|
||||
Value 0 imposes no limit on the kernel pages KSM may use;
|
||||
but note that any process using MADV_MERGEABLE can cause
|
||||
KSM to allocate these pages, unswappable until it exits.
|
||||
Default: 2000 (chosen for demonstration purposes)
|
||||
Default: quarter of memory (chosen to not pin too much)
|
||||
|
||||
pages_to_scan - how many present pages to scan before ksmd goes to sleep
|
||||
e.g. "echo 200 > /sys/kernel/mm/ksm/pages_to_scan"
|
||||
Default: 200 (chosen for demonstration purposes)
|
||||
e.g. "echo 100 > /sys/kernel/mm/ksm/pages_to_scan"
|
||||
Default: 100 (chosen for demonstration purposes)
|
||||
|
||||
sleep_millisecs - how many milliseconds ksmd should sleep before next scan
|
||||
e.g. "echo 20 > /sys/kernel/mm/ksm/sleep_millisecs"
|
||||
|
@ -70,7 +70,8 @@ run - set 0 to stop ksmd from running but keep merged pages,
|
|||
set 1 to run ksmd e.g. "echo 1 > /sys/kernel/mm/ksm/run",
|
||||
set 2 to stop ksmd and unmerge all pages currently merged,
|
||||
but leave mergeable areas registered for next run
|
||||
Default: 1 (for immediate use by apps which register)
|
||||
Default: 0 (must be changed to 1 to activate KSM,
|
||||
except if CONFIG_SYSFS is disabled)
|
||||
|
||||
The effectiveness of KSM and MADV_MERGEABLE is shown in /sys/kernel/mm/ksm/:
|
||||
|
||||
|
@ -86,4 +87,4 @@ pages_volatile embraces several different kinds of activity, but a high
|
|||
proportion there would also indicate poor use of madvise MADV_MERGEABLE.
|
||||
|
||||
Izik Eidus,
|
||||
Hugh Dickins, 30 July 2009
|
||||
Hugh Dickins, 24 Sept 2009
|
||||
|
|
|
@ -2,7 +2,10 @@
|
|||
* page-types: Tool for querying page flags
|
||||
*
|
||||
* Copyright (C) 2009 Intel corporation
|
||||
* Copyright (C) 2009 Wu Fengguang <fengguang.wu@intel.com>
|
||||
*
|
||||
* Authors: Wu Fengguang <fengguang.wu@intel.com>
|
||||
*
|
||||
* Released under the General Public License (GPL).
|
||||
*/
|
||||
|
||||
#define _LARGEFILE64_SOURCE
|
||||
|
@ -69,7 +72,9 @@
|
|||
#define KPF_COMPOUND_TAIL 16
|
||||
#define KPF_HUGE 17
|
||||
#define KPF_UNEVICTABLE 18
|
||||
#define KPF_HWPOISON 19
|
||||
#define KPF_NOPAGE 20
|
||||
#define KPF_KSM 21
|
||||
|
||||
/* [32-] kernel hacking assistances */
|
||||
#define KPF_RESERVED 32
|
||||
|
@ -116,7 +121,9 @@ static char *page_flag_names[] = {
|
|||
[KPF_COMPOUND_TAIL] = "T:compound_tail",
|
||||
[KPF_HUGE] = "G:huge",
|
||||
[KPF_UNEVICTABLE] = "u:unevictable",
|
||||
[KPF_HWPOISON] = "X:hwpoison",
|
||||
[KPF_NOPAGE] = "n:nopage",
|
||||
[KPF_KSM] = "x:ksm",
|
||||
|
||||
[KPF_RESERVED] = "r:reserved",
|
||||
[KPF_MLOCKED] = "m:mlocked",
|
||||
|
@ -152,9 +159,6 @@ static unsigned long opt_size[MAX_ADDR_RANGES];
|
|||
static int nr_vmas;
|
||||
static unsigned long pg_start[MAX_VMAS];
|
||||
static unsigned long pg_end[MAX_VMAS];
|
||||
static unsigned long voffset;
|
||||
|
||||
static int pagemap_fd;
|
||||
|
||||
#define MAX_BIT_FILTERS 64
|
||||
static int nr_bit_filters;
|
||||
|
@ -163,9 +167,16 @@ static uint64_t opt_bits[MAX_BIT_FILTERS];
|
|||
|
||||
static int page_size;
|
||||
|
||||
#define PAGES_BATCH (64 << 10) /* 64k pages */
|
||||
static int pagemap_fd;
|
||||
static int kpageflags_fd;
|
||||
|
||||
static int opt_hwpoison;
|
||||
static int opt_unpoison;
|
||||
|
||||
static char *hwpoison_debug_fs = "/debug/hwpoison";
|
||||
static int hwpoison_inject_fd;
|
||||
static int hwpoison_forget_fd;
|
||||
|
||||
#define HASH_SHIFT 13
|
||||
#define HASH_SIZE (1 << HASH_SHIFT)
|
||||
#define HASH_MASK (HASH_SIZE - 1)
|
||||
|
@ -207,6 +218,74 @@ static void fatal(const char *x, ...)
|
|||
exit(EXIT_FAILURE);
|
||||
}
|
||||
|
||||
int checked_open(const char *pathname, int flags)
|
||||
{
|
||||
int fd = open(pathname, flags);
|
||||
|
||||
if (fd < 0) {
|
||||
perror(pathname);
|
||||
exit(EXIT_FAILURE);
|
||||
}
|
||||
|
||||
return fd;
|
||||
}
|
||||
|
||||
/*
|
||||
* pagemap/kpageflags routines
|
||||
*/
|
||||
|
||||
static unsigned long do_u64_read(int fd, char *name,
|
||||
uint64_t *buf,
|
||||
unsigned long index,
|
||||
unsigned long count)
|
||||
{
|
||||
long bytes;
|
||||
|
||||
if (index > ULONG_MAX / 8)
|
||||
fatal("index overflow: %lu\n", index);
|
||||
|
||||
if (lseek(fd, index * 8, SEEK_SET) < 0) {
|
||||
perror(name);
|
||||
exit(EXIT_FAILURE);
|
||||
}
|
||||
|
||||
bytes = read(fd, buf, count * 8);
|
||||
if (bytes < 0) {
|
||||
perror(name);
|
||||
exit(EXIT_FAILURE);
|
||||
}
|
||||
if (bytes % 8)
|
||||
fatal("partial read: %lu bytes\n", bytes);
|
||||
|
||||
return bytes / 8;
|
||||
}
|
||||
|
||||
static unsigned long kpageflags_read(uint64_t *buf,
|
||||
unsigned long index,
|
||||
unsigned long pages)
|
||||
{
|
||||
return do_u64_read(kpageflags_fd, PROC_KPAGEFLAGS, buf, index, pages);
|
||||
}
|
||||
|
||||
static unsigned long pagemap_read(uint64_t *buf,
|
||||
unsigned long index,
|
||||
unsigned long pages)
|
||||
{
|
||||
return do_u64_read(pagemap_fd, "/proc/pid/pagemap", buf, index, pages);
|
||||
}
|
||||
|
||||
static unsigned long pagemap_pfn(uint64_t val)
|
||||
{
|
||||
unsigned long pfn;
|
||||
|
||||
if (val & PM_PRESENT)
|
||||
pfn = PM_PFRAME(val);
|
||||
else
|
||||
pfn = 0;
|
||||
|
||||
return pfn;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* page flag names
|
||||
|
@ -255,7 +334,8 @@ static char *page_flag_longname(uint64_t flags)
|
|||
* page list and summary
|
||||
*/
|
||||
|
||||
static void show_page_range(unsigned long offset, uint64_t flags)
|
||||
static void show_page_range(unsigned long voffset,
|
||||
unsigned long offset, uint64_t flags)
|
||||
{
|
||||
static uint64_t flags0;
|
||||
static unsigned long voff;
|
||||
|
@ -281,7 +361,8 @@ static void show_page_range(unsigned long offset, uint64_t flags)
|
|||
count = 1;
|
||||
}
|
||||
|
||||
static void show_page(unsigned long offset, uint64_t flags)
|
||||
static void show_page(unsigned long voffset,
|
||||
unsigned long offset, uint64_t flags)
|
||||
{
|
||||
if (opt_pid)
|
||||
printf("%lx\t", voffset);
|
||||
|
@ -362,6 +443,62 @@ static uint64_t well_known_flags(uint64_t flags)
|
|||
return flags;
|
||||
}
|
||||
|
||||
static uint64_t kpageflags_flags(uint64_t flags)
|
||||
{
|
||||
flags = expand_overloaded_flags(flags);
|
||||
|
||||
if (!opt_raw)
|
||||
flags = well_known_flags(flags);
|
||||
|
||||
return flags;
|
||||
}
|
||||
|
||||
/*
|
||||
* page actions
|
||||
*/
|
||||
|
||||
static void prepare_hwpoison_fd(void)
|
||||
{
|
||||
char buf[100];
|
||||
|
||||
if (opt_hwpoison && !hwpoison_inject_fd) {
|
||||
sprintf(buf, "%s/corrupt-pfn", hwpoison_debug_fs);
|
||||
hwpoison_inject_fd = checked_open(buf, O_WRONLY);
|
||||
}
|
||||
|
||||
if (opt_unpoison && !hwpoison_forget_fd) {
|
||||
sprintf(buf, "%s/renew-pfn", hwpoison_debug_fs);
|
||||
hwpoison_forget_fd = checked_open(buf, O_WRONLY);
|
||||
}
|
||||
}
|
||||
|
||||
static int hwpoison_page(unsigned long offset)
|
||||
{
|
||||
char buf[100];
|
||||
int len;
|
||||
|
||||
len = sprintf(buf, "0x%lx\n", offset);
|
||||
len = write(hwpoison_inject_fd, buf, len);
|
||||
if (len < 0) {
|
||||
perror("hwpoison inject");
|
||||
return len;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int unpoison_page(unsigned long offset)
|
||||
{
|
||||
char buf[100];
|
||||
int len;
|
||||
|
||||
len = sprintf(buf, "0x%lx\n", offset);
|
||||
len = write(hwpoison_forget_fd, buf, len);
|
||||
if (len < 0) {
|
||||
perror("hwpoison forget");
|
||||
return len;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* page frame walker
|
||||
|
@ -394,104 +531,83 @@ static int hash_slot(uint64_t flags)
|
|||
exit(EXIT_FAILURE);
|
||||
}
|
||||
|
||||
static void add_page(unsigned long offset, uint64_t flags)
|
||||
static void add_page(unsigned long voffset,
|
||||
unsigned long offset, uint64_t flags)
|
||||
{
|
||||
flags = expand_overloaded_flags(flags);
|
||||
|
||||
if (!opt_raw)
|
||||
flags = well_known_flags(flags);
|
||||
flags = kpageflags_flags(flags);
|
||||
|
||||
if (!bit_mask_ok(flags))
|
||||
return;
|
||||
|
||||
if (opt_hwpoison)
|
||||
hwpoison_page(offset);
|
||||
if (opt_unpoison)
|
||||
unpoison_page(offset);
|
||||
|
||||
if (opt_list == 1)
|
||||
show_page_range(offset, flags);
|
||||
show_page_range(voffset, offset, flags);
|
||||
else if (opt_list == 2)
|
||||
show_page(offset, flags);
|
||||
show_page(voffset, offset, flags);
|
||||
|
||||
nr_pages[hash_slot(flags)]++;
|
||||
total_pages++;
|
||||
}
|
||||
|
||||
static void walk_pfn(unsigned long index, unsigned long count)
|
||||
#define KPAGEFLAGS_BATCH (64 << 10) /* 64k pages */
|
||||
static void walk_pfn(unsigned long voffset,
|
||||
unsigned long index,
|
||||
unsigned long count)
|
||||
{
|
||||
uint64_t buf[KPAGEFLAGS_BATCH];
|
||||
unsigned long batch;
|
||||
unsigned long n;
|
||||
unsigned long pages;
|
||||
unsigned long i;
|
||||
|
||||
if (index > ULONG_MAX / KPF_BYTES)
|
||||
fatal("index overflow: %lu\n", index);
|
||||
|
||||
lseek(kpageflags_fd, index * KPF_BYTES, SEEK_SET);
|
||||
|
||||
while (count) {
|
||||
uint64_t kpageflags_buf[KPF_BYTES * PAGES_BATCH];
|
||||
|
||||
batch = min_t(unsigned long, count, PAGES_BATCH);
|
||||
n = read(kpageflags_fd, kpageflags_buf, batch * KPF_BYTES);
|
||||
if (n == 0)
|
||||
batch = min_t(unsigned long, count, KPAGEFLAGS_BATCH);
|
||||
pages = kpageflags_read(buf, index, batch);
|
||||
if (pages == 0)
|
||||
break;
|
||||
if (n < 0) {
|
||||
perror(PROC_KPAGEFLAGS);
|
||||
exit(EXIT_FAILURE);
|
||||
}
|
||||
|
||||
if (n % KPF_BYTES != 0)
|
||||
fatal("partial read: %lu bytes\n", n);
|
||||
n = n / KPF_BYTES;
|
||||
for (i = 0; i < pages; i++)
|
||||
add_page(voffset + i, index + i, buf[i]);
|
||||
|
||||
for (i = 0; i < n; i++)
|
||||
add_page(index + i, kpageflags_buf[i]);
|
||||
|
||||
index += batch;
|
||||
count -= batch;
|
||||
index += pages;
|
||||
count -= pages;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
#define PAGEMAP_BATCH 4096
|
||||
static unsigned long task_pfn(unsigned long pgoff)
|
||||
#define PAGEMAP_BATCH (64 << 10)
|
||||
static void walk_vma(unsigned long index, unsigned long count)
|
||||
{
|
||||
static uint64_t buf[PAGEMAP_BATCH];
|
||||
static unsigned long start;
|
||||
static long count;
|
||||
uint64_t pfn;
|
||||
uint64_t buf[PAGEMAP_BATCH];
|
||||
unsigned long batch;
|
||||
unsigned long pages;
|
||||
unsigned long pfn;
|
||||
unsigned long i;
|
||||
|
||||
if (pgoff < start || pgoff >= start + count) {
|
||||
if (lseek64(pagemap_fd,
|
||||
(uint64_t)pgoff * PM_ENTRY_BYTES,
|
||||
SEEK_SET) < 0) {
|
||||
perror("pagemap seek");
|
||||
exit(EXIT_FAILURE);
|
||||
while (count) {
|
||||
batch = min_t(unsigned long, count, PAGEMAP_BATCH);
|
||||
pages = pagemap_read(buf, index, batch);
|
||||
if (pages == 0)
|
||||
break;
|
||||
|
||||
for (i = 0; i < pages; i++) {
|
||||
pfn = pagemap_pfn(buf[i]);
|
||||
if (pfn)
|
||||
walk_pfn(index + i, pfn, 1);
|
||||
}
|
||||
count = read(pagemap_fd, buf, sizeof(buf));
|
||||
if (count == 0)
|
||||
return 0;
|
||||
if (count < 0) {
|
||||
perror("pagemap read");
|
||||
exit(EXIT_FAILURE);
|
||||
}
|
||||
if (count % PM_ENTRY_BYTES) {
|
||||
fatal("pagemap read not aligned.\n");
|
||||
exit(EXIT_FAILURE);
|
||||
}
|
||||
count /= PM_ENTRY_BYTES;
|
||||
start = pgoff;
|
||||
|
||||
index += pages;
|
||||
count -= pages;
|
||||
}
|
||||
|
||||
pfn = buf[pgoff - start];
|
||||
if (pfn & PM_PRESENT)
|
||||
pfn = PM_PFRAME(pfn);
|
||||
else
|
||||
pfn = 0;
|
||||
|
||||
return pfn;
|
||||
}
|
||||
|
||||
static void walk_task(unsigned long index, unsigned long count)
|
||||
{
|
||||
int i = 0;
|
||||
const unsigned long end = index + count;
|
||||
unsigned long start;
|
||||
int i = 0;
|
||||
|
||||
while (index < end) {
|
||||
|
||||
|
@ -501,15 +617,11 @@ static void walk_task(unsigned long index, unsigned long count)
|
|||
if (pg_start[i] >= end)
|
||||
return;
|
||||
|
||||
voffset = max_t(unsigned long, pg_start[i], index);
|
||||
index = min_t(unsigned long, pg_end[i], end);
|
||||
start = max_t(unsigned long, pg_start[i], index);
|
||||
index = min_t(unsigned long, pg_end[i], end);
|
||||
|
||||
assert(voffset < index);
|
||||
for (; voffset < index; voffset++) {
|
||||
unsigned long pfn = task_pfn(voffset);
|
||||
if (pfn)
|
||||
walk_pfn(pfn, 1);
|
||||
}
|
||||
assert(start < index);
|
||||
walk_vma(start, index - start);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -527,18 +639,14 @@ static void walk_addr_ranges(void)
|
|||
{
|
||||
int i;
|
||||
|
||||
kpageflags_fd = open(PROC_KPAGEFLAGS, O_RDONLY);
|
||||
if (kpageflags_fd < 0) {
|
||||
perror(PROC_KPAGEFLAGS);
|
||||
exit(EXIT_FAILURE);
|
||||
}
|
||||
kpageflags_fd = checked_open(PROC_KPAGEFLAGS, O_RDONLY);
|
||||
|
||||
if (!nr_addr_ranges)
|
||||
add_addr_range(0, ULONG_MAX);
|
||||
|
||||
for (i = 0; i < nr_addr_ranges; i++)
|
||||
if (!opt_pid)
|
||||
walk_pfn(opt_offset[i], opt_size[i]);
|
||||
walk_pfn(0, opt_offset[i], opt_size[i]);
|
||||
else
|
||||
walk_task(opt_offset[i], opt_size[i]);
|
||||
|
||||
|
@ -575,6 +683,8 @@ static void usage(void)
|
|||
" -l|--list Show page details in ranges\n"
|
||||
" -L|--list-each Show page details one by one\n"
|
||||
" -N|--no-summary Don't show summay info\n"
|
||||
" -X|--hwpoison hwpoison pages\n"
|
||||
" -x|--unpoison unpoison pages\n"
|
||||
" -h|--help Show this usage message\n"
|
||||
"addr-spec:\n"
|
||||
" N one page at offset N (unit: pages)\n"
|
||||
|
@ -624,11 +734,7 @@ static void parse_pid(const char *str)
|
|||
opt_pid = parse_number(str);
|
||||
|
||||
sprintf(buf, "/proc/%d/pagemap", opt_pid);
|
||||
pagemap_fd = open(buf, O_RDONLY);
|
||||
if (pagemap_fd < 0) {
|
||||
perror(buf);
|
||||
exit(EXIT_FAILURE);
|
||||
}
|
||||
pagemap_fd = checked_open(buf, O_RDONLY);
|
||||
|
||||
sprintf(buf, "/proc/%d/maps", opt_pid);
|
||||
file = fopen(buf, "r");
|
||||
|
@ -788,6 +894,8 @@ static struct option opts[] = {
|
|||
{ "list" , 0, NULL, 'l' },
|
||||
{ "list-each" , 0, NULL, 'L' },
|
||||
{ "no-summary", 0, NULL, 'N' },
|
||||
{ "hwpoison" , 0, NULL, 'X' },
|
||||
{ "unpoison" , 0, NULL, 'x' },
|
||||
{ "help" , 0, NULL, 'h' },
|
||||
{ NULL , 0, NULL, 0 }
|
||||
};
|
||||
|
@ -799,7 +907,7 @@ int main(int argc, char *argv[])
|
|||
page_size = getpagesize();
|
||||
|
||||
while ((c = getopt_long(argc, argv,
|
||||
"rp:f:a:b:lLNh", opts, NULL)) != -1) {
|
||||
"rp:f:a:b:lLNXxh", opts, NULL)) != -1) {
|
||||
switch (c) {
|
||||
case 'r':
|
||||
opt_raw = 1;
|
||||
|
@ -825,6 +933,14 @@ int main(int argc, char *argv[])
|
|||
case 'N':
|
||||
opt_no_summary = 1;
|
||||
break;
|
||||
case 'X':
|
||||
opt_hwpoison = 1;
|
||||
prepare_hwpoison_fd();
|
||||
break;
|
||||
case 'x':
|
||||
opt_unpoison = 1;
|
||||
prepare_hwpoison_fd();
|
||||
break;
|
||||
case 'h':
|
||||
usage();
|
||||
exit(0);
|
||||
|
@ -844,7 +960,7 @@ int main(int argc, char *argv[])
|
|||
walk_addr_ranges();
|
||||
|
||||
if (opt_list == 1)
|
||||
show_page_range(0, 0); /* drain the buffer */
|
||||
show_page_range(0, 0, 0); /* drain the buffer */
|
||||
|
||||
if (opt_no_summary)
|
||||
return 0;
|
||||
|
|
|
@ -57,7 +57,9 @@ There are three components to pagemap:
|
|||
16. COMPOUND_TAIL
|
||||
16. HUGE
|
||||
18. UNEVICTABLE
|
||||
19. HWPOISON
|
||||
20. NOPAGE
|
||||
21. KSM
|
||||
|
||||
Short descriptions to the page flags:
|
||||
|
||||
|
@ -86,9 +88,15 @@ Short descriptions to the page flags:
|
|||
17. HUGE
|
||||
this is an integral part of a HugeTLB page
|
||||
|
||||
19. HWPOISON
|
||||
hardware detected memory corruption on this page: don't touch the data!
|
||||
|
||||
20. NOPAGE
|
||||
no page frame exists at the requested address
|
||||
|
||||
21. KSM
|
||||
identical memory pages dynamically shared between one or more processes
|
||||
|
||||
[IO related page flags]
|
||||
1. ERROR IO error occurred
|
||||
3. UPTODATE page has up-to-date data
|
||||
|
|
|
@ -24,8 +24,8 @@ General Remarks
|
|||
|
||||
Valid addresses are 0x18, 0x19, 0x1a, and 0x1b.
|
||||
However, the device cannot be detected without writing to the i2c bus, so no
|
||||
detection is done.
|
||||
You should force the device address.
|
||||
detection is done. You should instantiate the device explicitly.
|
||||
|
||||
$ modprobe ds2482 force=0,0x18
|
||||
$ modprobe ds2482
|
||||
$ echo ds2482 0x18 > /sys/bus/i2c/devices/i2c-0/new_device
|
||||
|
||||
|
|
61
MAINTAINERS
61
MAINTAINERS
|
@ -257,6 +257,13 @@ W: http://www.lesswatts.org/projects/acpi/
|
|||
S: Supported
|
||||
F: drivers/acpi/fan.c
|
||||
|
||||
ACPI PROCESSOR AGGREGATOR DRIVER
|
||||
M: Shaohua Li <shaohua.li@intel.com>
|
||||
L: linux-acpi@vger.kernel.org
|
||||
W: http://www.lesswatts.org/projects/acpi/
|
||||
S: Supported
|
||||
F: drivers/acpi/acpi_pad.c
|
||||
|
||||
ACPI THERMAL DRIVER
|
||||
M: Zhang Rui <rui.zhang@intel.com>
|
||||
L: linux-acpi@vger.kernel.org
|
||||
|
@ -646,24 +653,24 @@ ARM/INTEL IOP32X ARM ARCHITECTURE
|
|||
M: Lennert Buytenhek <kernel@wantstofly.org>
|
||||
M: Dan Williams <dan.j.williams@intel.com>
|
||||
L: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
|
||||
S: Supported
|
||||
S: Maintained
|
||||
|
||||
ARM/INTEL IOP33X ARM ARCHITECTURE
|
||||
M: Dan Williams <dan.j.williams@intel.com>
|
||||
L: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
|
||||
S: Supported
|
||||
S: Maintained
|
||||
|
||||
ARM/INTEL IOP13XX ARM ARCHITECTURE
|
||||
M: Lennert Buytenhek <kernel@wantstofly.org>
|
||||
M: Dan Williams <dan.j.williams@intel.com>
|
||||
L: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
|
||||
S: Supported
|
||||
S: Maintained
|
||||
|
||||
ARM/INTEL IQ81342EX MACHINE SUPPORT
|
||||
M: Lennert Buytenhek <kernel@wantstofly.org>
|
||||
M: Dan Williams <dan.j.williams@intel.com>
|
||||
L: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
|
||||
S: Supported
|
||||
S: Maintained
|
||||
|
||||
ARM/INTEL IXP2000 ARM ARCHITECTURE
|
||||
M: Lennert Buytenhek <kernel@wantstofly.org>
|
||||
|
@ -691,7 +698,7 @@ ARM/INTEL XSC3 (MANZANO) ARM CORE
|
|||
M: Lennert Buytenhek <kernel@wantstofly.org>
|
||||
M: Dan Williams <dan.j.williams@intel.com>
|
||||
L: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
|
||||
S: Supported
|
||||
S: Maintained
|
||||
|
||||
ARM/IP FABRICS DOUBLE ESPRESSO MACHINE SUPPORT
|
||||
M: Lennert Buytenhek <kernel@wantstofly.org>
|
||||
|
@ -741,23 +748,36 @@ M: Dirk Opfer <dirk@opfer-online.de>
|
|||
S: Maintained
|
||||
|
||||
ARM/PALMTX,PALMT5,PALMLD,PALMTE2,PALMTC SUPPORT
|
||||
P: Marek Vasut
|
||||
M: marek.vasut@gmail.com
|
||||
M: Marek Vasut <marek.vasut@gmail.com>
|
||||
L: linux-arm-kernel@lists.infradead.org
|
||||
W: http://hackndev.com
|
||||
S: Maintained
|
||||
F: arch/arm/mach-pxa/include/mach/palmtx.h
|
||||
F: arch/arm/mach-pxa/palmtx.c
|
||||
F: arch/arm/mach-pxa/include/mach/palmt5.h
|
||||
F: arch/arm/mach-pxa/palmt5.c
|
||||
F: arch/arm/mach-pxa/include/mach/palmld.h
|
||||
F: arch/arm/mach-pxa/palmld.c
|
||||
F: arch/arm/mach-pxa/include/mach/palmte2.h
|
||||
F: arch/arm/mach-pxa/palmte2.c
|
||||
F: arch/arm/mach-pxa/include/mach/palmtc.h
|
||||
F: arch/arm/mach-pxa/palmtc.c
|
||||
|
||||
ARM/PALM TREO 680 SUPPORT
|
||||
M: Tomas Cech <sleep_walker@suse.cz>
|
||||
L: linux-arm-kernel@lists.infradead.org
|
||||
W: http://hackndev.com
|
||||
S: Maintained
|
||||
F: arch/arm/mach-pxa/include/mach/treo680.h
|
||||
F: arch/arm/mach-pxa/treo680.c
|
||||
|
||||
ARM/PALMZ72 SUPPORT
|
||||
M: Sergey Lapin <slapin@ossfans.org>
|
||||
L: linux-arm-kernel@lists.infradead.org
|
||||
W: http://hackndev.com
|
||||
S: Maintained
|
||||
F: arch/arm/mach-pxa/include/mach/palmz72.h
|
||||
F: arch/arm/mach-pxa/palmz72.c
|
||||
|
||||
ARM/PLEB SUPPORT
|
||||
M: Peter Chubb <pleb@gelato.unsw.edu.au>
|
||||
|
@ -1211,6 +1231,13 @@ L: netdev@vger.kernel.org
|
|||
S: Supported
|
||||
F: drivers/net/tg3.*
|
||||
|
||||
BROCADE BFA FC SCSI DRIVER
|
||||
P: Jing Huang
|
||||
M: huangj@brocade.com
|
||||
L: linux-scsi@vger.kernel.org
|
||||
S: Supported
|
||||
F: drivers/scsi/bfa/
|
||||
|
||||
BSG (block layer generic sg v4 driver)
|
||||
M: FUJITA Tomonori <fujita.tomonori@lab.ntt.co.jp>
|
||||
L: linux-scsi@vger.kernel.org
|
||||
|
@ -2038,7 +2065,7 @@ S: Maintained
|
|||
F: fs/*
|
||||
|
||||
FINTEK F75375S HARDWARE MONITOR AND FAN CONTROLLER DRIVER
|
||||
M: Riku Voipio <riku.vipio@iki.fi>
|
||||
M: Riku Voipio <riku.voipio@iki.fi>
|
||||
L: lm-sensors@lm-sensors.org
|
||||
S: Maintained
|
||||
F: drivers/hwmon/f75375s.c
|
||||
|
@ -2682,7 +2709,7 @@ F: include/linux/intel-iommu.h
|
|||
|
||||
INTEL IOP-ADMA DMA DRIVER
|
||||
M: Dan Williams <dan.j.williams@intel.com>
|
||||
S: Supported
|
||||
S: Maintained
|
||||
F: drivers/dma/iop-adma.c
|
||||
|
||||
INTEL IXP4XX QMGR, NPE, ETHERNET and HSS SUPPORT
|
||||
|
@ -3623,6 +3650,13 @@ F: Documentation/blockdev/nbd.txt
|
|||
F: drivers/block/nbd.c
|
||||
F: include/linux/nbd.h
|
||||
|
||||
NETWORK DROP MONITOR
|
||||
M: Neil Horman <nhorman@tuxdriver.com>
|
||||
L: netdev@vger.kernel.org
|
||||
S: Maintained
|
||||
W: https://fedorahosted.org/dropwatch/
|
||||
F: net/core/drop_monitor.c
|
||||
|
||||
NETWORKING [GENERAL]
|
||||
M: "David S. Miller" <davem@davemloft.net>
|
||||
L: netdev@vger.kernel.org
|
||||
|
@ -3953,6 +3987,7 @@ F: drivers/block/paride/
|
|||
PARISC ARCHITECTURE
|
||||
M: Kyle McMartin <kyle@mcmartin.ca>
|
||||
M: Helge Deller <deller@gmx.de>
|
||||
M: "James E.J. Bottomley" <jejb@parisc-linux.org>
|
||||
L: linux-parisc@vger.kernel.org
|
||||
W: http://www.parisc-linux.org/
|
||||
T: git git://git.kernel.org/pub/scm/linux/kernel/git/kyle/parisc-2.6.git
|
||||
|
@ -4618,6 +4653,14 @@ F: drivers/ata/
|
|||
F: include/linux/ata.h
|
||||
F: include/linux/libata.h
|
||||
|
||||
SERVER ENGINES 10Gbps iSCSI - BladeEngine 2 DRIVER
|
||||
P: Jayamohan Kallickal
|
||||
M: jayamohank@serverengines.com
|
||||
L: linux-scsi@vger.kernel.org
|
||||
W: http://www.serverengines.com
|
||||
S: Supported
|
||||
F: drivers/scsi/be2iscsi/
|
||||
|
||||
SERVER ENGINES 10Gbps NIC - BladeEngine 2 DRIVER
|
||||
M: Sathya Perla <sathyap@serverengines.com>
|
||||
M: Subbu Seetharaman <subbus@serverengines.com>
|
||||
|
|
2
Makefile
2
Makefile
|
@ -1,7 +1,7 @@
|
|||
VERSION = 2
|
||||
PATCHLEVEL = 6
|
||||
SUBLEVEL = 32
|
||||
EXTRAVERSION = -rc2
|
||||
EXTRAVERSION = -rc4
|
||||
NAME = Man-Eating Seals of Antiquity
|
||||
|
||||
# *DOCUMENTATION*
|
||||
|
|
|
@ -1032,6 +1032,7 @@ unsigned int sa1111_pll_clock(struct sa1111_dev *sadev)
|
|||
|
||||
return __sa1111_pll_clock(sachip);
|
||||
}
|
||||
EXPORT_SYMBOL(sa1111_pll_clock);
|
||||
|
||||
/**
|
||||
* sa1111_select_audio_mode - select I2S or AC link mode
|
||||
|
@ -1059,6 +1060,7 @@ void sa1111_select_audio_mode(struct sa1111_dev *sadev, int mode)
|
|||
|
||||
spin_unlock_irqrestore(&sachip->lock, flags);
|
||||
}
|
||||
EXPORT_SYMBOL(sa1111_select_audio_mode);
|
||||
|
||||
/**
|
||||
* sa1111_set_audio_rate - set the audio sample rate
|
||||
|
@ -1083,6 +1085,7 @@ int sa1111_set_audio_rate(struct sa1111_dev *sadev, int rate)
|
|||
|
||||
return 0;
|
||||
}
|
||||
EXPORT_SYMBOL(sa1111_set_audio_rate);
|
||||
|
||||
/**
|
||||
* sa1111_get_audio_rate - get the audio sample rate
|
||||
|
@ -1100,6 +1103,7 @@ int sa1111_get_audio_rate(struct sa1111_dev *sadev)
|
|||
|
||||
return __sa1111_pll_clock(sachip) / (256 * div);
|
||||
}
|
||||
EXPORT_SYMBOL(sa1111_get_audio_rate);
|
||||
|
||||
void sa1111_set_io_dir(struct sa1111_dev *sadev,
|
||||
unsigned int bits, unsigned int dir,
|
||||
|
@ -1128,6 +1132,7 @@ void sa1111_set_io_dir(struct sa1111_dev *sadev,
|
|||
MODIFY_BITS(gpio + SA1111_GPIO_PCSDR, (bits >> 16) & 255, sleep_dir >> 16);
|
||||
spin_unlock_irqrestore(&sachip->lock, flags);
|
||||
}
|
||||
EXPORT_SYMBOL(sa1111_set_io_dir);
|
||||
|
||||
void sa1111_set_io(struct sa1111_dev *sadev, unsigned int bits, unsigned int v)
|
||||
{
|
||||
|
@ -1142,6 +1147,7 @@ void sa1111_set_io(struct sa1111_dev *sadev, unsigned int bits, unsigned int v)
|
|||
MODIFY_BITS(gpio + SA1111_GPIO_PCDWR, (bits >> 16) & 255, v >> 16);
|
||||
spin_unlock_irqrestore(&sachip->lock, flags);
|
||||
}
|
||||
EXPORT_SYMBOL(sa1111_set_io);
|
||||
|
||||
void sa1111_set_sleep_io(struct sa1111_dev *sadev, unsigned int bits, unsigned int v)
|
||||
{
|
||||
|
@ -1156,6 +1162,7 @@ void sa1111_set_sleep_io(struct sa1111_dev *sadev, unsigned int bits, unsigned i
|
|||
MODIFY_BITS(gpio + SA1111_GPIO_PCSSR, (bits >> 16) & 255, v >> 16);
|
||||
spin_unlock_irqrestore(&sachip->lock, flags);
|
||||
}
|
||||
EXPORT_SYMBOL(sa1111_set_sleep_io);
|
||||
|
||||
/*
|
||||
* Individual device operations.
|
||||
|
@ -1176,6 +1183,7 @@ void sa1111_enable_device(struct sa1111_dev *sadev)
|
|||
sa1111_writel(val | sadev->skpcr_mask, sachip->base + SA1111_SKPCR);
|
||||
spin_unlock_irqrestore(&sachip->lock, flags);
|
||||
}
|
||||
EXPORT_SYMBOL(sa1111_enable_device);
|
||||
|
||||
/**
|
||||
* sa1111_disable_device - disable an on-chip SA1111 function block
|
||||
|
@ -1192,6 +1200,7 @@ void sa1111_disable_device(struct sa1111_dev *sadev)
|
|||
sa1111_writel(val & ~sadev->skpcr_mask, sachip->base + SA1111_SKPCR);
|
||||
spin_unlock_irqrestore(&sachip->lock, flags);
|
||||
}
|
||||
EXPORT_SYMBOL(sa1111_disable_device);
|
||||
|
||||
/*
|
||||
* SA1111 "Register Access Bus."
|
||||
|
@ -1259,17 +1268,20 @@ struct bus_type sa1111_bus_type = {
|
|||
.suspend = sa1111_bus_suspend,
|
||||
.resume = sa1111_bus_resume,
|
||||
};
|
||||
EXPORT_SYMBOL(sa1111_bus_type);
|
||||
|
||||
int sa1111_driver_register(struct sa1111_driver *driver)
|
||||
{
|
||||
driver->drv.bus = &sa1111_bus_type;
|
||||
return driver_register(&driver->drv);
|
||||
}
|
||||
EXPORT_SYMBOL(sa1111_driver_register);
|
||||
|
||||
void sa1111_driver_unregister(struct sa1111_driver *driver)
|
||||
{
|
||||
driver_unregister(&driver->drv);
|
||||
}
|
||||
EXPORT_SYMBOL(sa1111_driver_unregister);
|
||||
|
||||
static int __init sa1111_init(void)
|
||||
{
|
||||
|
@ -1290,16 +1302,3 @@ module_exit(sa1111_exit);
|
|||
|
||||
MODULE_DESCRIPTION("Intel Corporation SA1111 core driver");
|
||||
MODULE_LICENSE("GPL");
|
||||
|
||||
EXPORT_SYMBOL(sa1111_select_audio_mode);
|
||||
EXPORT_SYMBOL(sa1111_set_audio_rate);
|
||||
EXPORT_SYMBOL(sa1111_get_audio_rate);
|
||||
EXPORT_SYMBOL(sa1111_set_io_dir);
|
||||
EXPORT_SYMBOL(sa1111_set_io);
|
||||
EXPORT_SYMBOL(sa1111_set_sleep_io);
|
||||
EXPORT_SYMBOL(sa1111_enable_device);
|
||||
EXPORT_SYMBOL(sa1111_disable_device);
|
||||
EXPORT_SYMBOL(sa1111_pll_clock);
|
||||
EXPORT_SYMBOL(sa1111_bus_type);
|
||||
EXPORT_SYMBOL(sa1111_driver_register);
|
||||
EXPORT_SYMBOL(sa1111_driver_unregister);
|
||||
|
|
|
@ -90,7 +90,6 @@ CONFIG_ARCH_SA1100=y
|
|||
# CONFIG_SA1100_COLLIE is not set
|
||||
# CONFIG_SA1100_H3100 is not set
|
||||
CONFIG_SA1100_H3600=y
|
||||
CONFIG_SA1100_H3XXX=y
|
||||
# CONFIG_SA1100_BADGE4 is not set
|
||||
# CONFIG_SA1100_JORNADA720 is not set
|
||||
# CONFIG_SA1100_HACKKIT is not set
|
||||
|
|
File diff suppressed because it is too large
Load Diff
|
@ -120,25 +120,39 @@
|
|||
#endif
|
||||
|
||||
/*
|
||||
* Prefetch abort handler. If the CPU has an IFAR use that, otherwise
|
||||
* use the address of the aborted instruction
|
||||
* Prefetch Abort Model
|
||||
* ================
|
||||
*
|
||||
* We have the following to choose from:
|
||||
* legacy - no IFSR, no IFAR
|
||||
* v6 - ARMv6: IFSR, no IFAR
|
||||
* v7 - ARMv7: IFSR and IFAR
|
||||
*/
|
||||
|
||||
#undef CPU_PABORT_HANDLER
|
||||
#undef MULTI_PABORT
|
||||
|
||||
#ifdef CONFIG_CPU_PABRT_IFAR
|
||||
#ifdef CONFIG_CPU_PABRT_LEGACY
|
||||
# ifdef CPU_PABORT_HANDLER
|
||||
# define MULTI_PABORT 1
|
||||
# else
|
||||
# define CPU_PABORT_HANDLER(reg, insn) mrc p15, 0, reg, cr6, cr0, 2
|
||||
# define CPU_PABORT_HANDLER legacy_pabort
|
||||
# endif
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_CPU_PABRT_NOIFAR
|
||||
#ifdef CONFIG_CPU_PABRT_V6
|
||||
# ifdef CPU_PABORT_HANDLER
|
||||
# define MULTI_PABORT 1
|
||||
# else
|
||||
# define CPU_PABORT_HANDLER(reg, insn) mov reg, insn
|
||||
# define CPU_PABORT_HANDLER v6_pabort
|
||||
# endif
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_CPU_PABRT_V7
|
||||
# ifdef CPU_PABORT_HANDLER
|
||||
# define MULTI_PABORT 1
|
||||
# else
|
||||
# define CPU_PABORT_HANDLER v7_pabort
|
||||
# endif
|
||||
#endif
|
||||
|
||||
|
|
|
@ -215,6 +215,7 @@ extern int iop3xx_get_init_atu(void);
|
|||
* IOP3XX I/O and Mem space regions for PCI autoconfiguration
|
||||
*/
|
||||
#define IOP3XX_PCI_LOWER_MEM_PA 0x80000000
|
||||
#define IOP3XX_PCI_MEM_WINDOW_SIZE 0x08000000
|
||||
|
||||
#define IOP3XX_PCI_IO_WINDOW_SIZE 0x00010000
|
||||
#define IOP3XX_PCI_LOWER_IO_PA 0x90000000
|
||||
|
|
|
@ -0,0 +1,16 @@
|
|||
/*
|
||||
* ARM specific SMP header, this contains our implementation
|
||||
* details.
|
||||
*/
|
||||
#ifndef __ASMARM_SMP_PLAT_H
|
||||
#define __ASMARM_SMP_PLAT_H
|
||||
|
||||
#include <asm/cputype.h>
|
||||
|
||||
/* all SMP configurations have the extended CPUID registers */
|
||||
static inline int tlb_ops_need_broadcast(void)
|
||||
{
|
||||
return ((read_cpuid_ext(CPUID_EXT_MMFR3) >> 12) & 0xf) < 2;
|
||||
}
|
||||
|
||||
#endif
|
|
@ -456,6 +456,7 @@
|
|||
* Unimplemented (or alternatively implemented) syscalls
|
||||
*/
|
||||
#define __IGNORE_fadvise64_64 1
|
||||
#define __IGNORE_migrate_pages 1
|
||||
|
||||
#endif /* __KERNEL__ */
|
||||
#endif /* __ASM_ARM_UNISTD_H */
|
||||
|
|
|
@ -311,22 +311,16 @@ __pabt_svc:
|
|||
tst r3, #PSR_I_BIT
|
||||
biceq r9, r9, #PSR_I_BIT
|
||||
|
||||
@
|
||||
@ set args, then call main handler
|
||||
@
|
||||
@ r0 - address of faulting instruction
|
||||
@ r1 - pointer to registers on stack
|
||||
@
|
||||
#ifdef MULTI_PABORT
|
||||
mov r0, r2 @ pass address of aborted instruction.
|
||||
#ifdef MULTI_PABORT
|
||||
ldr r4, .LCprocfns
|
||||
mov lr, pc
|
||||
ldr pc, [r4, #PROCESSOR_PABT_FUNC]
|
||||
#else
|
||||
CPU_PABORT_HANDLER(r0, r2)
|
||||
bl CPU_PABORT_HANDLER
|
||||
#endif
|
||||
msr cpsr_c, r9 @ Maybe enable interrupts
|
||||
mov r1, sp @ regs
|
||||
mov r2, sp @ regs
|
||||
bl do_PrefetchAbort @ call abort handler
|
||||
|
||||
@
|
||||
|
@ -701,16 +695,16 @@ ENDPROC(__und_usr_unknown)
|
|||
__pabt_usr:
|
||||
usr_entry
|
||||
|
||||
#ifdef MULTI_PABORT
|
||||
mov r0, r2 @ pass address of aborted instruction.
|
||||
#ifdef MULTI_PABORT
|
||||
ldr r4, .LCprocfns
|
||||
mov lr, pc
|
||||
ldr pc, [r4, #PROCESSOR_PABT_FUNC]
|
||||
#else
|
||||
CPU_PABORT_HANDLER(r0, r2)
|
||||
bl CPU_PABORT_HANDLER
|
||||
#endif
|
||||
enable_irq @ Enable interrupts
|
||||
mov r1, sp @ regs
|
||||
mov r2, sp @ regs
|
||||
bl do_PrefetchAbort @ call abort handler
|
||||
UNWIND(.fnend )
|
||||
/* fall through */
|
||||
|
|
|
@ -126,7 +126,7 @@ ENTRY(__gnu_mcount_nc)
|
|||
cmp r0, r2
|
||||
bne gnu_trace
|
||||
ldmia sp!, {r0-r3, ip, lr}
|
||||
bx ip
|
||||
mov pc, ip
|
||||
|
||||
gnu_trace:
|
||||
ldr r1, [sp, #20] @ lr of instrumented routine
|
||||
|
@ -135,7 +135,7 @@ gnu_trace:
|
|||
mov lr, pc
|
||||
mov pc, r2
|
||||
ldmia sp!, {r0-r3, ip, lr}
|
||||
bx ip
|
||||
mov pc, ip
|
||||
|
||||
ENTRY(mcount)
|
||||
stmdb sp!, {r0-r3, lr}
|
||||
|
@ -425,13 +425,6 @@ sys_mmap2:
|
|||
#endif
|
||||
ENDPROC(sys_mmap2)
|
||||
|
||||
ENTRY(pabort_ifar)
|
||||
mrc p15, 0, r0, cr6, cr0, 2
|
||||
ENTRY(pabort_noifar)
|
||||
mov pc, lr
|
||||
ENDPROC(pabort_ifar)
|
||||
ENDPROC(pabort_noifar)
|
||||
|
||||
#ifdef CONFIG_OABI_COMPAT
|
||||
|
||||
/*
|
||||
|
|
|
@ -13,6 +13,7 @@
|
|||
|
||||
#define ATAG_CORE 0x54410001
|
||||
#define ATAG_CORE_SIZE ((2*4 + 3*4) >> 2)
|
||||
#define ATAG_CORE_SIZE_EMPTY ((2*4) >> 2)
|
||||
|
||||
.align 2
|
||||
.type __switch_data, %object
|
||||
|
@ -251,7 +252,8 @@ __vet_atags:
|
|||
bne 1f
|
||||
|
||||
ldr r5, [r2, #0] @ is first tag ATAG_CORE?
|
||||
subs r5, r5, #ATAG_CORE_SIZE
|
||||
cmp r5, #ATAG_CORE_SIZE
|
||||
cmpne r5, #ATAG_CORE_SIZE_EMPTY
|
||||
bne 1f
|
||||
ldr r5, [r2, #4]
|
||||
ldr r6, =ATAG_CORE
|
||||
|
|
|
@ -36,6 +36,7 @@
|
|||
#include <asm/tlbflush.h>
|
||||
#include <asm/ptrace.h>
|
||||
#include <asm/localtimer.h>
|
||||
#include <asm/smp_plat.h>
|
||||
|
||||
/*
|
||||
* as from 2.5, kernels no longer have an init_tasks structure
|
||||
|
@ -153,7 +154,7 @@ int __cpuinit __cpu_up(unsigned int cpu)
|
|||
/*
|
||||
* __cpu_disable runs on the processor to be shutdown.
|
||||
*/
|
||||
int __cpuexit __cpu_disable(void)
|
||||
int __cpu_disable(void)
|
||||
{
|
||||
unsigned int cpu = smp_processor_id();
|
||||
struct task_struct *p;
|
||||
|
@ -200,7 +201,7 @@ int __cpuexit __cpu_disable(void)
|
|||
* called on the thread which is asking for a CPU to be shutdown -
|
||||
* waits until shutdown has completed, or it is timed out.
|
||||
*/
|
||||
void __cpuexit __cpu_die(unsigned int cpu)
|
||||
void __cpu_die(unsigned int cpu)
|
||||
{
|
||||
if (!platform_cpu_kill(cpu))
|
||||
printk("CPU%u: unable to kill\n", cpu);
|
||||
|
@ -214,7 +215,7 @@ void __cpuexit __cpu_die(unsigned int cpu)
|
|||
* of the other hotplug-cpu capable cores, so presumably coming
|
||||
* out of idle fixes this.
|
||||
*/
|
||||
void __cpuexit cpu_die(void)
|
||||
void __ref cpu_die(void)
|
||||
{
|
||||
unsigned int cpu = smp_processor_id();
|
||||
|
||||
|
@ -586,12 +587,6 @@ struct tlb_args {
|
|||
unsigned long ta_end;
|
||||
};
|
||||
|
||||
/* all SMP configurations have the extended CPUID registers */
|
||||
static inline int tlb_ops_need_broadcast(void)
|
||||
{
|
||||
return ((read_cpuid_ext(CPUID_EXT_MMFR3) >> 12) & 0xf) < 2;
|
||||
}
|
||||
|
||||
static inline void ipi_flush_tlb_all(void *ignored)
|
||||
{
|
||||
local_flush_tlb_all();
|
||||
|
|
|
@ -166,10 +166,12 @@ void __cpuinit twd_timer_setup(struct clock_event_device *clk)
|
|||
clockevents_register_device(clk);
|
||||
}
|
||||
|
||||
#ifdef CONFIG_HOTPLUG_CPU
|
||||
/*
|
||||
* take a local timer down
|
||||
*/
|
||||
void __cpuexit twd_timer_stop(void)
|
||||
void twd_timer_stop(void)
|
||||
{
|
||||
__raw_writel(0, twd_base + TWD_TIMER_CONTROL);
|
||||
}
|
||||
#endif
|
||||
|
|
|
@ -21,6 +21,7 @@
|
|||
#include <linux/interrupt.h>
|
||||
#include <linux/time.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/sched.h>
|
||||
#include <linux/smp.h>
|
||||
#include <linux/timex.h>
|
||||
#include <linux/errno.h>
|
||||
|
|
|
@ -418,12 +418,14 @@ static int bad_syscall(int n, struct pt_regs *regs)
|
|||
static inline void
|
||||
do_cache_op(unsigned long start, unsigned long end, int flags)
|
||||
{
|
||||
struct mm_struct *mm = current->active_mm;
|
||||
struct vm_area_struct *vma;
|
||||
|
||||
if (end < start || flags)
|
||||
return;
|
||||
|
||||
vma = find_vma(current->active_mm, start);
|
||||
down_read(&mm->mmap_sem);
|
||||
vma = find_vma(mm, start);
|
||||
if (vma && vma->vm_start < end) {
|
||||
if (start < vma->vm_start)
|
||||
start = vma->vm_start;
|
||||
|
@ -432,6 +434,7 @@ do_cache_op(unsigned long start, unsigned long end, int flags)
|
|||
|
||||
flush_cache_user_range(vma, start, end);
|
||||
}
|
||||
up_read(&mm->mmap_sem);
|
||||
}
|
||||
|
||||
/*
|
||||
|
|
|
@ -31,7 +31,6 @@
|
|||
#include <linux/clocksource.h>
|
||||
#include <linux/clockchips.h>
|
||||
|
||||
#include <linux/amba/bus.h>
|
||||
#include <mach/csp/mm_addr.h>
|
||||
#include <mach/hardware.h>
|
||||
#include <asm/clkdev.h>
|
||||
|
@ -45,7 +44,6 @@
|
|||
#include <asm/mach/irq.h>
|
||||
#include <asm/mach/time.h>
|
||||
#include <asm/mach/map.h>
|
||||
#include <asm/mach/mmc.h>
|
||||
|
||||
#include <cfg_global.h>
|
||||
|
||||
|
|
|
@ -35,7 +35,6 @@
|
|||
#include <mach/common.h>
|
||||
#include <mach/i2c.h>
|
||||
#include <mach/serial.h>
|
||||
#include <mach/common.h>
|
||||
#include <mach/mmc.h>
|
||||
#include <mach/nand.h>
|
||||
|
||||
|
|
|
@ -31,6 +31,7 @@
|
|||
|
||||
#include <mach/hardware.h>
|
||||
#include <asm/irq.h>
|
||||
#include <asm/signal.h>
|
||||
#include <asm/system.h>
|
||||
#include <asm/mach/pci.h>
|
||||
#include <asm/irq_regs.h>
|
||||
|
@ -486,7 +487,7 @@ int __init pci_v3_setup(int nr, struct pci_sys_data *sys)
|
|||
return ret;
|
||||
}
|
||||
|
||||
struct pci_bus *pci_v3_scan_bus(int nr, struct pci_sys_data *sys)
|
||||
struct pci_bus * __init pci_v3_scan_bus(int nr, struct pci_sys_data *sys)
|
||||
{
|
||||
return pci_scan_bus(sys->busnr, &pci_v3_ops, sys);
|
||||
}
|
||||
|
|
|
@ -31,7 +31,5 @@
|
|||
#define IOP32X_MAX_RAM_SIZE 0x40000000UL
|
||||
#define IOP3XX_MAX_RAM_SIZE IOP32X_MAX_RAM_SIZE
|
||||
#define IOP3XX_PCI_LOWER_MEM_BA 0x80000000
|
||||
#define IOP32X_PCI_MEM_WINDOW_SIZE 0x04000000
|
||||
#define IOP3XX_PCI_MEM_WINDOW_SIZE IOP32X_PCI_MEM_WINDOW_SIZE
|
||||
|
||||
#endif
|
||||
|
|
|
@ -36,8 +36,6 @@
|
|||
#define IOP33X_MAX_RAM_SIZE 0x80000000UL
|
||||
#define IOP3XX_MAX_RAM_SIZE IOP33X_MAX_RAM_SIZE
|
||||
#define IOP3XX_PCI_LOWER_MEM_BA (PHYS_OFFSET + IOP33X_MAX_RAM_SIZE)
|
||||
#define IOP33X_PCI_MEM_WINDOW_SIZE 0x08000000
|
||||
#define IOP3XX_PCI_MEM_WINDOW_SIZE IOP33X_PCI_MEM_WINDOW_SIZE
|
||||
|
||||
|
||||
#endif
|
||||
|
|
|
@ -195,7 +195,7 @@ static int clk_debugfs_open(struct inode *inode, struct file *file)
|
|||
return single_open(file, clk_debugfs_show, NULL);
|
||||
}
|
||||
|
||||
static struct file_operations clk_debugfs_operations = {
|
||||
static const struct file_operations clk_debugfs_operations = {
|
||||
.open = clk_debugfs_open,
|
||||
.read = seq_read,
|
||||
.llseek = seq_lseek,
|
||||
|
|
|
@ -38,7 +38,7 @@ static struct omap_id omap_ids[] __initdata = {
|
|||
{ .jtag_id = 0xb574, .die_rev = 0x2, .omap_id = 0x03310315, .type = 0x03100000},
|
||||
{ .jtag_id = 0x355f, .die_rev = 0x0, .omap_id = 0x03320000, .type = 0x07300100},
|
||||
{ .jtag_id = 0xb55f, .die_rev = 0x0, .omap_id = 0x03320000, .type = 0x07300300},
|
||||
{ .jtag_id = 0xb55f, .die_rev = 0x0, .omap_id = 0x03320500, .type = 0x08500000},
|
||||
{ .jtag_id = 0xb62c, .die_rev = 0x1, .omap_id = 0x03320500, .type = 0x08500000},
|
||||
{ .jtag_id = 0xb470, .die_rev = 0x0, .omap_id = 0x03310100, .type = 0x15100000},
|
||||
{ .jtag_id = 0xb576, .die_rev = 0x0, .omap_id = 0x03320000, .type = 0x16100000},
|
||||
{ .jtag_id = 0xb576, .die_rev = 0x2, .omap_id = 0x03320100, .type = 0x16110000},
|
||||
|
|
|
@ -54,7 +54,7 @@
|
|||
|
||||
#define TWL4030_MSECURE_GPIO 22
|
||||
|
||||
static int sdp3430_keymap[] = {
|
||||
static int board_keymap[] = {
|
||||
KEY(0, 0, KEY_LEFT),
|
||||
KEY(0, 1, KEY_RIGHT),
|
||||
KEY(0, 2, KEY_A),
|
||||
|
@ -88,11 +88,15 @@ static int sdp3430_keymap[] = {
|
|||
0
|
||||
};
|
||||
|
||||
static struct matrix_keymap_data board_map_data = {
|
||||
.keymap = board_keymap,
|
||||
.keymap_size = ARRAY_SIZE(board_keymap),
|
||||
};
|
||||
|
||||
static struct twl4030_keypad_data sdp3430_kp_data = {
|
||||
.keymap_data = &board_map_data,
|
||||
.rows = 5,
|
||||
.cols = 6,
|
||||
.keymap = sdp3430_keymap,
|
||||
.keymapsize = ARRAY_SIZE(sdp3430_keymap),
|
||||
.rep = 1,
|
||||
};
|
||||
|
||||
|
|
|
@ -80,7 +80,7 @@ static struct platform_device ldp_smsc911x_device = {
|
|||
},
|
||||
};
|
||||
|
||||
static int ldp_twl4030_keymap[] = {
|
||||
static int board_keymap[] = {
|
||||
KEY(0, 0, KEY_1),
|
||||
KEY(1, 0, KEY_2),
|
||||
KEY(2, 0, KEY_3),
|
||||
|
@ -101,11 +101,15 @@ static int ldp_twl4030_keymap[] = {
|
|||
0
|
||||
};
|
||||
|
||||
static struct matrix_keymap_data board_map_data = {
|
||||
.keymap = board_keymap,
|
||||
.keymap_size = ARRAY_SIZE(board_keymap),
|
||||
};
|
||||
|
||||
static struct twl4030_keypad_data ldp_kp_twl4030_data = {
|
||||
.keymap_data = &board_map_data,
|
||||
.rows = 6,
|
||||
.cols = 6,
|
||||
.keymap = ldp_twl4030_keymap,
|
||||
.keymapsize = ARRAY_SIZE(ldp_twl4030_keymap),
|
||||
.rep = 1,
|
||||
};
|
||||
|
||||
|
|
|
@ -139,8 +139,13 @@ static struct gpio_led gpio_leds[];
|
|||
static int beagle_twl_gpio_setup(struct device *dev,
|
||||
unsigned gpio, unsigned ngpio)
|
||||
{
|
||||
if (system_rev >= 0x20 && system_rev <= 0x34301000) {
|
||||
omap_cfg_reg(AG9_34XX_GPIO23);
|
||||
mmc[0].gpio_wp = 23;
|
||||
} else {
|
||||
omap_cfg_reg(AH8_34XX_GPIO29);
|
||||
}
|
||||
/* gpio + 0 is "mmc0_cd" (input/IRQ) */
|
||||
omap_cfg_reg(AH8_34XX_GPIO29);
|
||||
mmc[0].gpio_cd = gpio + 0;
|
||||
twl4030_mmc_init(mmc);
|
||||
|
||||
|
|
|
@ -159,7 +159,7 @@ static struct twl4030_usb_data omap3evm_usb_data = {
|
|||
.usb_mode = T2_USB_MODE_ULPI,
|
||||
};
|
||||
|
||||
static int omap3evm_keymap[] = {
|
||||
static int board_keymap[] = {
|
||||
KEY(0, 0, KEY_LEFT),
|
||||
KEY(0, 1, KEY_RIGHT),
|
||||
KEY(0, 2, KEY_A),
|
||||
|
@ -178,11 +178,15 @@ static int omap3evm_keymap[] = {
|
|||
KEY(3, 3, KEY_P)
|
||||
};
|
||||
|
||||
static struct matrix_keymap_data board_map_data = {
|
||||
.keymap = board_keymap,
|
||||
.keymap_size = ARRAY_SIZE(board_keymap),
|
||||
};
|
||||
|
||||
static struct twl4030_keypad_data omap3evm_kp_data = {
|
||||
.keymap_data = &board_map_data,
|
||||
.rows = 4,
|
||||
.cols = 4,
|
||||
.keymap = omap3evm_keymap,
|
||||
.keymapsize = ARRAY_SIZE(omap3evm_keymap),
|
||||
.rep = 1,
|
||||
};
|
||||
|
||||
|
|
|
@ -133,7 +133,7 @@ static void __init pandora_keys_gpio_init(void)
|
|||
omap_set_gpio_debounce_time(32 * 5, GPIO_DEBOUNCE_TIME);
|
||||
}
|
||||
|
||||
static int pandora_keypad_map[] = {
|
||||
static int board_keymap[] = {
|
||||
/* col, row, code */
|
||||
KEY(0, 0, KEY_9),
|
||||
KEY(0, 1, KEY_0),
|
||||
|
@ -180,11 +180,15 @@ static int pandora_keypad_map[] = {
|
|||
KEY(5, 2, KEY_FN),
|
||||
};
|
||||
|
||||
static struct matrix_keymap_data board_map_data = {
|
||||
.keymap = board_keymap,
|
||||
.keymap_size = ARRAY_SIZE(board_keymap),
|
||||
};
|
||||
|
||||
static struct twl4030_keypad_data pandora_kp_data = {
|
||||
.keymap_data = &board_map_data,
|
||||
.rows = 8,
|
||||
.cols = 6,
|
||||
.keymap = pandora_keypad_map,
|
||||
.keymapsize = ARRAY_SIZE(pandora_keypad_map),
|
||||
.rep = 1,
|
||||
};
|
||||
|
||||
|
|
|
@ -36,58 +36,62 @@
|
|||
#define SYSTEM_REV_B_USES_VAUX3 0x1699
|
||||
#define SYSTEM_REV_S_USES_VAUX3 0x8
|
||||
|
||||
static int rx51_keymap[] = {
|
||||
static int board_keymap[] = {
|
||||
KEY(0, 0, KEY_Q),
|
||||
KEY(0, 1, KEY_W),
|
||||
KEY(0, 2, KEY_E),
|
||||
KEY(0, 3, KEY_R),
|
||||
KEY(0, 4, KEY_T),
|
||||
KEY(0, 5, KEY_Y),
|
||||
KEY(0, 6, KEY_U),
|
||||
KEY(0, 7, KEY_I),
|
||||
KEY(1, 0, KEY_O),
|
||||
KEY(0, 1, KEY_O),
|
||||
KEY(0, 2, KEY_P),
|
||||
KEY(0, 3, KEY_COMMA),
|
||||
KEY(0, 4, KEY_BACKSPACE),
|
||||
KEY(0, 6, KEY_A),
|
||||
KEY(0, 7, KEY_S),
|
||||
KEY(1, 0, KEY_W),
|
||||
KEY(1, 1, KEY_D),
|
||||
KEY(1, 2, KEY_DOT),
|
||||
KEY(1, 3, KEY_V),
|
||||
KEY(1, 4, KEY_DOWN),
|
||||
KEY(2, 0, KEY_P),
|
||||
KEY(2, 1, KEY_F),
|
||||
KEY(1, 2, KEY_F),
|
||||
KEY(1, 3, KEY_G),
|
||||
KEY(1, 4, KEY_H),
|
||||
KEY(1, 5, KEY_J),
|
||||
KEY(1, 6, KEY_K),
|
||||
KEY(1, 7, KEY_L),
|
||||
KEY(2, 0, KEY_E),
|
||||
KEY(2, 1, KEY_DOT),
|
||||
KEY(2, 2, KEY_UP),
|
||||
KEY(2, 3, KEY_B),
|
||||
KEY(2, 4, KEY_RIGHT),
|
||||
KEY(3, 0, KEY_COMMA),
|
||||
KEY(3, 1, KEY_G),
|
||||
KEY(3, 2, KEY_ENTER),
|
||||
KEY(2, 3, KEY_ENTER),
|
||||
KEY(2, 5, KEY_Z),
|
||||
KEY(2, 6, KEY_X),
|
||||
KEY(2, 7, KEY_C),
|
||||
KEY(3, 0, KEY_R),
|
||||
KEY(3, 1, KEY_V),
|
||||
KEY(3, 2, KEY_B),
|
||||
KEY(3, 3, KEY_N),
|
||||
KEY(4, 0, KEY_BACKSPACE),
|
||||
KEY(4, 1, KEY_H),
|
||||
KEY(4, 3, KEY_M),
|
||||
KEY(3, 4, KEY_M),
|
||||
KEY(3, 5, KEY_SPACE),
|
||||
KEY(3, 6, KEY_SPACE),
|
||||
KEY(3, 7, KEY_LEFT),
|
||||
KEY(4, 0, KEY_T),
|
||||
KEY(4, 1, KEY_DOWN),
|
||||
KEY(4, 2, KEY_RIGHT),
|
||||
KEY(4, 4, KEY_LEFTCTRL),
|
||||
KEY(5, 1, KEY_J),
|
||||
KEY(5, 2, KEY_Z),
|
||||
KEY(5, 3, KEY_SPACE),
|
||||
KEY(5, 4, KEY_LEFTSHIFT),
|
||||
KEY(6, 0, KEY_A),
|
||||
KEY(6, 1, KEY_K),
|
||||
KEY(6, 2, KEY_X),
|
||||
KEY(6, 3, KEY_SPACE),
|
||||
KEY(6, 4, KEY_FN),
|
||||
KEY(7, 0, KEY_S),
|
||||
KEY(7, 1, KEY_L),
|
||||
KEY(7, 2, KEY_C),
|
||||
KEY(7, 3, KEY_LEFT),
|
||||
KEY(0xff, 0, KEY_F6),
|
||||
KEY(0xff, 1, KEY_F7),
|
||||
KEY(0xff, 2, KEY_F8),
|
||||
KEY(0xff, 4, KEY_F9),
|
||||
KEY(0xff, 5, KEY_F10),
|
||||
KEY(4, 5, KEY_RIGHTALT),
|
||||
KEY(4, 6, KEY_LEFTSHIFT),
|
||||
KEY(5, 0, KEY_Y),
|
||||
KEY(6, 0, KEY_U),
|
||||
KEY(7, 0, KEY_I),
|
||||
KEY(7, 1, KEY_F7),
|
||||
KEY(7, 2, KEY_F8),
|
||||
KEY(0xff, 2, KEY_F9),
|
||||
KEY(0xff, 4, KEY_F10),
|
||||
KEY(0xff, 5, KEY_F11),
|
||||
};
|
||||
|
||||
static struct matrix_keymap_data board_map_data = {
|
||||
.keymap = board_keymap,
|
||||
.keymap_size = ARRAY_SIZE(board_keymap),
|
||||
};
|
||||
|
||||
static struct twl4030_keypad_data rx51_kp_data = {
|
||||
.keymap_data = &board_map_data,
|
||||
.rows = 8,
|
||||
.cols = 8,
|
||||
.keymap = rx51_keymap,
|
||||
.keymapsize = ARRAY_SIZE(rx51_keymap),
|
||||
.rep = 1,
|
||||
};
|
||||
|
||||
|
|
|
@ -27,7 +27,7 @@
|
|||
#include "mmc-twl4030.h"
|
||||
|
||||
/* Zoom2 has Qwerty keyboard*/
|
||||
static int zoom2_twl4030_keymap[] = {
|
||||
static int board_keymap[] = {
|
||||
KEY(0, 0, KEY_E),
|
||||
KEY(1, 0, KEY_R),
|
||||
KEY(2, 0, KEY_T),
|
||||
|
@ -82,11 +82,15 @@ static int zoom2_twl4030_keymap[] = {
|
|||
0
|
||||
};
|
||||
|
||||
static struct matrix_keymap_data board_map_data = {
|
||||
.keymap = board_keymap,
|
||||
.keymap_size = ARRAY_SIZE(board_keymap),
|
||||
};
|
||||
|
||||
static struct twl4030_keypad_data zoom2_kp_twl4030_data = {
|
||||
.keymap_data = &board_map_data,
|
||||
.rows = 8,
|
||||
.cols = 8,
|
||||
.keymap = zoom2_twl4030_keymap,
|
||||
.keymapsize = ARRAY_SIZE(zoom2_twl4030_keymap),
|
||||
.rep = 1,
|
||||
};
|
||||
|
||||
|
|
|
@ -338,6 +338,13 @@ static struct omap_clk omap34xx_clks[] = {
|
|||
*/
|
||||
#define SDRC_MPURATE_LOOPS 96
|
||||
|
||||
/*
|
||||
* DPLL5_FREQ_FOR_USBHOST: USBHOST and USBTLL are the only clocks
|
||||
* that are sourced by DPLL5, and both of these require this clock
|
||||
* to be at 120 MHz for proper operation.
|
||||
*/
|
||||
#define DPLL5_FREQ_FOR_USBHOST 120000000
|
||||
|
||||
/**
|
||||
* omap3430es2_clk_ssi_find_idlest - return CM_IDLEST info for SSI
|
||||
* @clk: struct clk * being enabled
|
||||
|
@ -1056,6 +1063,28 @@ void omap2_clk_prepare_for_reboot(void)
|
|||
#endif
|
||||
}
|
||||
|
||||
static void omap3_clk_lock_dpll5(void)
|
||||
{
|
||||
struct clk *dpll5_clk;
|
||||
struct clk *dpll5_m2_clk;
|
||||
|
||||
dpll5_clk = clk_get(NULL, "dpll5_ck");
|
||||
clk_set_rate(dpll5_clk, DPLL5_FREQ_FOR_USBHOST);
|
||||
clk_enable(dpll5_clk);
|
||||
|
||||
/* Enable autoidle to allow it to enter low power bypass */
|
||||
omap3_dpll_allow_idle(dpll5_clk);
|
||||
|
||||
/* Program dpll5_m2_clk divider for no division */
|
||||
dpll5_m2_clk = clk_get(NULL, "dpll5_m2_ck");
|
||||
clk_enable(dpll5_m2_clk);
|
||||
clk_set_rate(dpll5_m2_clk, DPLL5_FREQ_FOR_USBHOST);
|
||||
|
||||
clk_disable(dpll5_m2_clk);
|
||||
clk_disable(dpll5_clk);
|
||||
return;
|
||||
}
|
||||
|
||||
/* REVISIT: Move this init stuff out into clock.c */
|
||||
|
||||
/*
|
||||
|
@ -1148,6 +1177,12 @@ int __init omap2_clk_init(void)
|
|||
*/
|
||||
clk_enable_init_clocks();
|
||||
|
||||
/*
|
||||
* Lock DPLL5 and put it in autoidle.
|
||||
*/
|
||||
if (omap_rev() >= OMAP3430_REV_ES2_0)
|
||||
omap3_clk_lock_dpll5();
|
||||
|
||||
/* Avoid sleeping during omap2_clk_prepare_for_reboot() */
|
||||
/* REVISIT: not yet ready for 343x */
|
||||
#if 0
|
||||
|
|
|
@ -22,7 +22,6 @@
|
|||
#include <asm/atomic.h>
|
||||
|
||||
#include "cm.h"
|
||||
#include "cm-regbits-4xxx.h"
|
||||
|
||||
/* XXX move this to cm.h */
|
||||
/* MAX_MODULE_READY_TIME: max milliseconds for module to leave idle */
|
||||
|
@ -50,19 +49,7 @@
|
|||
*/
|
||||
int omap4_cm_wait_idlest_ready(u32 prcm_mod, u8 prcm_dev_offs)
|
||||
{
|
||||
int i = 0;
|
||||
u8 cm_id;
|
||||
u16 prcm_mod_offs;
|
||||
u32 mask = OMAP4_PRCM_CM_CLKCTRL_IDLEST_MASK;
|
||||
|
||||
cm_id = prcm_mod >> OMAP4_PRCM_MOD_CM_ID_SHIFT;
|
||||
prcm_mod_offs = prcm_mod & OMAP4_PRCM_MOD_OFFS_MASK;
|
||||
|
||||
while (((omap4_cm_read_mod_reg(cm_id, prcm_mod_offs, prcm_dev_offs,
|
||||
OMAP4_CM_CLKCTRL_DREG) & mask) != 0) &&
|
||||
(i++ < MAX_MODULE_READY_TIME))
|
||||
udelay(1);
|
||||
|
||||
return (i < MAX_MODULE_READY_TIME) ? 0 : -EBUSY;
|
||||
/* FIXME: Add clock manager related code */
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
|
@ -355,29 +355,60 @@ static struct platform_device omap2_mcspi4 = {
|
|||
};
|
||||
#endif
|
||||
|
||||
static void omap_init_mcspi(void)
|
||||
#ifdef CONFIG_ARCH_OMAP4
|
||||
static inline void omap4_mcspi_fixup(void)
|
||||
{
|
||||
if (cpu_is_omap44xx()) {
|
||||
omap2_mcspi1_resources[0].start = OMAP4_MCSPI1_BASE;
|
||||
omap2_mcspi1_resources[0].end = OMAP4_MCSPI1_BASE + 0xff;
|
||||
omap2_mcspi2_resources[0].start = OMAP4_MCSPI2_BASE;
|
||||
omap2_mcspi2_resources[0].end = OMAP4_MCSPI2_BASE + 0xff;
|
||||
omap2_mcspi3_resources[0].start = OMAP4_MCSPI3_BASE;
|
||||
omap2_mcspi3_resources[0].end = OMAP4_MCSPI3_BASE + 0xff;
|
||||
omap2_mcspi4_resources[0].start = OMAP4_MCSPI4_BASE;
|
||||
omap2_mcspi4_resources[0].end = OMAP4_MCSPI4_BASE + 0xff;
|
||||
}
|
||||
platform_device_register(&omap2_mcspi1);
|
||||
platform_device_register(&omap2_mcspi2);
|
||||
omap2_mcspi1_resources[0].start = OMAP4_MCSPI1_BASE;
|
||||
omap2_mcspi1_resources[0].end = OMAP4_MCSPI1_BASE + 0xff;
|
||||
omap2_mcspi2_resources[0].start = OMAP4_MCSPI2_BASE;
|
||||
omap2_mcspi2_resources[0].end = OMAP4_MCSPI2_BASE + 0xff;
|
||||
omap2_mcspi3_resources[0].start = OMAP4_MCSPI3_BASE;
|
||||
omap2_mcspi3_resources[0].end = OMAP4_MCSPI3_BASE + 0xff;
|
||||
omap2_mcspi4_resources[0].start = OMAP4_MCSPI4_BASE;
|
||||
omap2_mcspi4_resources[0].end = OMAP4_MCSPI4_BASE + 0xff;
|
||||
}
|
||||
#else
|
||||
static inline void omap4_mcspi_fixup(void)
|
||||
{
|
||||
}
|
||||
#endif
|
||||
|
||||
#if defined(CONFIG_ARCH_OMAP2430) || defined(CONFIG_ARCH_OMAP3) || \
|
||||
defined(CONFIG_ARCH_OMAP4)
|
||||
if (cpu_is_omap2430() || cpu_is_omap343x() || cpu_is_omap44xx())
|
||||
platform_device_register(&omap2_mcspi3);
|
||||
static inline void omap2_mcspi3_init(void)
|
||||
{
|
||||
platform_device_register(&omap2_mcspi3);
|
||||
}
|
||||
#else
|
||||
static inline void omap2_mcspi3_init(void)
|
||||
{
|
||||
}
|
||||
#endif
|
||||
|
||||
#if defined(CONFIG_ARCH_OMAP3) || defined(CONFIG_ARCH_OMAP4)
|
||||
if (cpu_is_omap343x() || cpu_is_omap44xx())
|
||||
platform_device_register(&omap2_mcspi4);
|
||||
static inline void omap2_mcspi4_init(void)
|
||||
{
|
||||
platform_device_register(&omap2_mcspi4);
|
||||
}
|
||||
#else
|
||||
static inline void omap2_mcspi4_init(void)
|
||||
{
|
||||
}
|
||||
#endif
|
||||
|
||||
static void omap_init_mcspi(void)
|
||||
{
|
||||
if (cpu_is_omap44xx())
|
||||
omap4_mcspi_fixup();
|
||||
|
||||
platform_device_register(&omap2_mcspi1);
|
||||
platform_device_register(&omap2_mcspi2);
|
||||
|
||||
if (cpu_is_omap2430() || cpu_is_omap343x() || cpu_is_omap44xx())
|
||||
omap2_mcspi3_init();
|
||||
|
||||
if (cpu_is_omap343x() || cpu_is_omap44xx())
|
||||
omap2_mcspi4_init();
|
||||
}
|
||||
|
||||
#else
|
||||
|
|
|
@ -294,10 +294,10 @@ void __init omap2_init_common_hw(struct omap_sdrc_params *sdrc_cs0,
|
|||
else if (cpu_is_omap34xx())
|
||||
hwmods = omap34xx_hwmods;
|
||||
|
||||
omap_hwmod_init(hwmods);
|
||||
omap2_mux_init();
|
||||
#ifndef CONFIG_ARCH_OMAP4 /* FIXME: Remove this once the clkdev is ready */
|
||||
/* The OPP tables have to be registered before a clk init */
|
||||
omap_hwmod_init(hwmods);
|
||||
omap2_mux_init();
|
||||
omap_pm_if_early_init(mpu_opps, dsp_opps, l3_opps);
|
||||
pwrdm_init(powerdomains_omap);
|
||||
clkdm_init(clockdomains_omap, clkdm_pwrdm_autodeps);
|
||||
|
|
|
@ -79,7 +79,7 @@ static int omap2_iommu_enable(struct iommu *obj)
|
|||
l = iommu_read_reg(obj, MMU_SYSSTATUS);
|
||||
if (l & MMU_SYS_RESETDONE)
|
||||
break;
|
||||
} while (time_after(jiffies, timeout));
|
||||
} while (!time_after(jiffies, timeout));
|
||||
|
||||
if (!(l & MMU_SYS_RESETDONE)) {
|
||||
dev_err(obj->dev, "can't take mmu out of reset\n");
|
||||
|
|
|
@ -30,6 +30,14 @@
|
|||
#define MAILBOX_IRQ_NEWMSG(u) (1 << (2 * (u)))
|
||||
#define MAILBOX_IRQ_NOTFULL(u) (1 << (2 * (u) + 1))
|
||||
|
||||
/* SYSCONFIG: register bit definition */
|
||||
#define AUTOIDLE (1 << 0)
|
||||
#define SOFTRESET (1 << 1)
|
||||
#define SMARTIDLE (2 << 3)
|
||||
|
||||
/* SYSSTATUS: register bit definition */
|
||||
#define RESETDONE (1 << 0)
|
||||
|
||||
#define MBOX_REG_SIZE 0x120
|
||||
#define MBOX_NR_REGS (MBOX_REG_SIZE / sizeof(u32))
|
||||
|
||||
|
@ -69,21 +77,33 @@ static inline void mbox_write_reg(u32 val, size_t ofs)
|
|||
/* Mailbox H/W preparations */
|
||||
static int omap2_mbox_startup(struct omap_mbox *mbox)
|
||||
{
|
||||
unsigned int l;
|
||||
u32 l;
|
||||
unsigned long timeout;
|
||||
|
||||
mbox_ick_handle = clk_get(NULL, "mailboxes_ick");
|
||||
if (IS_ERR(mbox_ick_handle)) {
|
||||
printk("Could not get mailboxes_ick\n");
|
||||
pr_err("Can't get mailboxes_ick\n");
|
||||
return -ENODEV;
|
||||
}
|
||||
clk_enable(mbox_ick_handle);
|
||||
|
||||
mbox_write_reg(SOFTRESET, MAILBOX_SYSCONFIG);
|
||||
timeout = jiffies + msecs_to_jiffies(20);
|
||||
do {
|
||||
l = mbox_read_reg(MAILBOX_SYSSTATUS);
|
||||
if (l & RESETDONE)
|
||||
break;
|
||||
} while (!time_after(jiffies, timeout));
|
||||
|
||||
if (!(l & RESETDONE)) {
|
||||
pr_err("Can't take mmu out of reset\n");
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
l = mbox_read_reg(MAILBOX_REVISION);
|
||||
pr_info("omap mailbox rev %d.%d\n", (l & 0xf0) >> 4, (l & 0x0f));
|
||||
|
||||
/* set smart-idle & autoidle */
|
||||
l = mbox_read_reg(MAILBOX_SYSCONFIG);
|
||||
l |= 0x00000011;
|
||||
l = SMARTIDLE | AUTOIDLE;
|
||||
mbox_write_reg(l, MAILBOX_SYSCONFIG);
|
||||
|
||||
omap2_mbox_enable_irq(mbox, IRQ_RX);
|
||||
|
@ -156,6 +176,9 @@ static void omap2_mbox_ack_irq(struct omap_mbox *mbox,
|
|||
u32 bit = (irq == IRQ_TX) ? p->notfull_bit : p->newmsg_bit;
|
||||
|
||||
mbox_write_reg(bit, p->irqstatus);
|
||||
|
||||
/* Flush posted write for irq status to avoid spurious interrupts */
|
||||
mbox_read_reg(p->irqstatus);
|
||||
}
|
||||
|
||||
static int omap2_mbox_is_irq(struct omap_mbox *mbox,
|
||||
|
|
|
@ -460,6 +460,8 @@ MUX_CFG_34XX("AF26_34XX_GPIO0", 0x1e0,
|
|||
OMAP34XX_MUX_MODE4 | OMAP34XX_PIN_INPUT)
|
||||
MUX_CFG_34XX("AF22_34XX_GPIO9", 0xa18,
|
||||
OMAP34XX_MUX_MODE4 | OMAP34XX_PIN_INPUT)
|
||||
MUX_CFG_34XX("AG9_34XX_GPIO23", 0x5ee,
|
||||
OMAP34XX_MUX_MODE4 | OMAP34XX_PIN_INPUT)
|
||||
MUX_CFG_34XX("AH8_34XX_GPIO29", 0x5fa,
|
||||
OMAP34XX_MUX_MODE4 | OMAP34XX_PIN_INPUT)
|
||||
MUX_CFG_34XX("U8_34XX_GPIO54_OUT", 0x0b4,
|
||||
|
@ -472,6 +474,8 @@ MUX_CFG_34XX("G25_34XX_GPIO86_OUT", 0x0fc,
|
|||
OMAP34XX_MUX_MODE4 | OMAP34XX_PIN_OUTPUT)
|
||||
MUX_CFG_34XX("AG4_34XX_GPIO134_OUT", 0x160,
|
||||
OMAP34XX_MUX_MODE4 | OMAP34XX_PIN_OUTPUT)
|
||||
MUX_CFG_34XX("AF4_34XX_GPIO135_OUT", 0x162,
|
||||
OMAP34XX_MUX_MODE4 | OMAP34XX_PIN_OUTPUT)
|
||||
MUX_CFG_34XX("AE4_34XX_GPIO136_OUT", 0x164,
|
||||
OMAP34XX_MUX_MODE4 | OMAP34XX_PIN_OUTPUT)
|
||||
MUX_CFG_34XX("AF6_34XX_GPIO140_UP", 0x16c,
|
||||
|
|
|
@ -541,7 +541,7 @@ static int __init pm_dbg_init(void)
|
|||
printk(KERN_ERR "%s: only OMAP3 supported\n", __func__);
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
|
||||
d = debugfs_create_dir("pm_debug", NULL);
|
||||
if (IS_ERR(d))
|
||||
return PTR_ERR(d);
|
||||
|
@ -551,7 +551,7 @@ static int __init pm_dbg_init(void)
|
|||
(void) debugfs_create_file("time", S_IRUGO,
|
||||
d, (void *)DEBUG_FILE_TIMERS, &debug_fops);
|
||||
|
||||
pwrdm_for_each(pwrdms_setup, (void *)d);
|
||||
pwrdm_for_each_nolock(pwrdms_setup, (void *)d);
|
||||
|
||||
pm_dbg_dir = debugfs_create_dir("registers", d);
|
||||
if (IS_ERR(pm_dbg_dir))
|
||||
|
|
|
@ -51,97 +51,112 @@ static void (*_omap_sram_idle)(u32 *addr, int save_state);
|
|||
|
||||
static struct powerdomain *mpu_pwrdm;
|
||||
|
||||
/* PRCM Interrupt Handler for wakeups */
|
||||
/*
|
||||
* PRCM Interrupt Handler Helper Function
|
||||
*
|
||||
* The purpose of this function is to clear any wake-up events latched
|
||||
* in the PRCM PM_WKST_x registers. It is possible that a wake-up event
|
||||
* may occur whilst attempting to clear a PM_WKST_x register and thus
|
||||
* set another bit in this register. A while loop is used to ensure
|
||||
* that any peripheral wake-up events occurring while attempting to
|
||||
* clear the PM_WKST_x are detected and cleared.
|
||||
*/
|
||||
static int prcm_clear_mod_irqs(s16 module, u8 regs)
|
||||
{
|
||||
u32 wkst, fclk, iclk, clken;
|
||||
u16 wkst_off = (regs == 3) ? OMAP3430ES2_PM_WKST3 : PM_WKST1;
|
||||
u16 fclk_off = (regs == 3) ? OMAP3430ES2_CM_FCLKEN3 : CM_FCLKEN1;
|
||||
u16 iclk_off = (regs == 3) ? CM_ICLKEN3 : CM_ICLKEN1;
|
||||
u16 grpsel_off = (regs == 3) ?
|
||||
OMAP3430ES2_PM_MPUGRPSEL3 : OMAP3430_PM_MPUGRPSEL;
|
||||
int c = 0;
|
||||
|
||||
wkst = prm_read_mod_reg(module, wkst_off);
|
||||
wkst &= prm_read_mod_reg(module, grpsel_off);
|
||||
if (wkst) {
|
||||
iclk = cm_read_mod_reg(module, iclk_off);
|
||||
fclk = cm_read_mod_reg(module, fclk_off);
|
||||
while (wkst) {
|
||||
clken = wkst;
|
||||
cm_set_mod_reg_bits(clken, module, iclk_off);
|
||||
/*
|
||||
* For USBHOST, we don't know whether HOST1 or
|
||||
* HOST2 woke us up, so enable both f-clocks
|
||||
*/
|
||||
if (module == OMAP3430ES2_USBHOST_MOD)
|
||||
clken |= 1 << OMAP3430ES2_EN_USBHOST2_SHIFT;
|
||||
cm_set_mod_reg_bits(clken, module, fclk_off);
|
||||
prm_write_mod_reg(wkst, module, wkst_off);
|
||||
wkst = prm_read_mod_reg(module, wkst_off);
|
||||
c++;
|
||||
}
|
||||
cm_write_mod_reg(iclk, module, iclk_off);
|
||||
cm_write_mod_reg(fclk, module, fclk_off);
|
||||
}
|
||||
|
||||
return c;
|
||||
}
|
||||
|
||||
static int _prcm_int_handle_wakeup(void)
|
||||
{
|
||||
int c;
|
||||
|
||||
c = prcm_clear_mod_irqs(WKUP_MOD, 1);
|
||||
c += prcm_clear_mod_irqs(CORE_MOD, 1);
|
||||
c += prcm_clear_mod_irqs(OMAP3430_PER_MOD, 1);
|
||||
if (omap_rev() > OMAP3430_REV_ES1_0) {
|
||||
c += prcm_clear_mod_irqs(CORE_MOD, 3);
|
||||
c += prcm_clear_mod_irqs(OMAP3430ES2_USBHOST_MOD, 1);
|
||||
}
|
||||
|
||||
return c;
|
||||
}
|
||||
|
||||
/*
|
||||
* PRCM Interrupt Handler
|
||||
*
|
||||
* The PRM_IRQSTATUS_MPU register indicates if there are any pending
|
||||
* interrupts from the PRCM for the MPU. These bits must be cleared in
|
||||
* order to clear the PRCM interrupt. The PRCM interrupt handler is
|
||||
* implemented to simply clear the PRM_IRQSTATUS_MPU in order to clear
|
||||
* the PRCM interrupt. Please note that bit 0 of the PRM_IRQSTATUS_MPU
|
||||
* register indicates that a wake-up event is pending for the MPU and
|
||||
* this bit can only be cleared if the all the wake-up events latched
|
||||
* in the various PM_WKST_x registers have been cleared. The interrupt
|
||||
* handler is implemented using a do-while loop so that if a wake-up
|
||||
* event occurred during the processing of the prcm interrupt handler
|
||||
* (setting a bit in the corresponding PM_WKST_x register and thus
|
||||
* preventing us from clearing bit 0 of the PRM_IRQSTATUS_MPU register)
|
||||
* this would be handled.
|
||||
*/
|
||||
static irqreturn_t prcm_interrupt_handler (int irq, void *dev_id)
|
||||
{
|
||||
u32 wkst, irqstatus_mpu;
|
||||
u32 fclk, iclk;
|
||||
u32 irqstatus_mpu;
|
||||
int c = 0;
|
||||
|
||||
/* WKUP */
|
||||
wkst = prm_read_mod_reg(WKUP_MOD, PM_WKST);
|
||||
if (wkst) {
|
||||
iclk = cm_read_mod_reg(WKUP_MOD, CM_ICLKEN);
|
||||
fclk = cm_read_mod_reg(WKUP_MOD, CM_FCLKEN);
|
||||
cm_set_mod_reg_bits(wkst, WKUP_MOD, CM_ICLKEN);
|
||||
cm_set_mod_reg_bits(wkst, WKUP_MOD, CM_FCLKEN);
|
||||
prm_write_mod_reg(wkst, WKUP_MOD, PM_WKST);
|
||||
while (prm_read_mod_reg(WKUP_MOD, PM_WKST))
|
||||
cpu_relax();
|
||||
cm_write_mod_reg(iclk, WKUP_MOD, CM_ICLKEN);
|
||||
cm_write_mod_reg(fclk, WKUP_MOD, CM_FCLKEN);
|
||||
}
|
||||
do {
|
||||
irqstatus_mpu = prm_read_mod_reg(OCP_MOD,
|
||||
OMAP3_PRM_IRQSTATUS_MPU_OFFSET);
|
||||
|
||||
/* CORE */
|
||||
wkst = prm_read_mod_reg(CORE_MOD, PM_WKST1);
|
||||
if (wkst) {
|
||||
iclk = cm_read_mod_reg(CORE_MOD, CM_ICLKEN1);
|
||||
fclk = cm_read_mod_reg(CORE_MOD, CM_FCLKEN1);
|
||||
cm_set_mod_reg_bits(wkst, CORE_MOD, CM_ICLKEN1);
|
||||
cm_set_mod_reg_bits(wkst, CORE_MOD, CM_FCLKEN1);
|
||||
prm_write_mod_reg(wkst, CORE_MOD, PM_WKST1);
|
||||
while (prm_read_mod_reg(CORE_MOD, PM_WKST1))
|
||||
cpu_relax();
|
||||
cm_write_mod_reg(iclk, CORE_MOD, CM_ICLKEN1);
|
||||
cm_write_mod_reg(fclk, CORE_MOD, CM_FCLKEN1);
|
||||
}
|
||||
wkst = prm_read_mod_reg(CORE_MOD, OMAP3430ES2_PM_WKST3);
|
||||
if (wkst) {
|
||||
iclk = cm_read_mod_reg(CORE_MOD, CM_ICLKEN3);
|
||||
fclk = cm_read_mod_reg(CORE_MOD, OMAP3430ES2_CM_FCLKEN3);
|
||||
cm_set_mod_reg_bits(wkst, CORE_MOD, CM_ICLKEN3);
|
||||
cm_set_mod_reg_bits(wkst, CORE_MOD, OMAP3430ES2_CM_FCLKEN3);
|
||||
prm_write_mod_reg(wkst, CORE_MOD, OMAP3430ES2_PM_WKST3);
|
||||
while (prm_read_mod_reg(CORE_MOD, OMAP3430ES2_PM_WKST3))
|
||||
cpu_relax();
|
||||
cm_write_mod_reg(iclk, CORE_MOD, CM_ICLKEN3);
|
||||
cm_write_mod_reg(fclk, CORE_MOD, OMAP3430ES2_CM_FCLKEN3);
|
||||
}
|
||||
if (irqstatus_mpu & (OMAP3430_WKUP_ST | OMAP3430_IO_ST)) {
|
||||
c = _prcm_int_handle_wakeup();
|
||||
|
||||
/* PER */
|
||||
wkst = prm_read_mod_reg(OMAP3430_PER_MOD, PM_WKST);
|
||||
if (wkst) {
|
||||
iclk = cm_read_mod_reg(OMAP3430_PER_MOD, CM_ICLKEN);
|
||||
fclk = cm_read_mod_reg(OMAP3430_PER_MOD, CM_FCLKEN);
|
||||
cm_set_mod_reg_bits(wkst, OMAP3430_PER_MOD, CM_ICLKEN);
|
||||
cm_set_mod_reg_bits(wkst, OMAP3430_PER_MOD, CM_FCLKEN);
|
||||
prm_write_mod_reg(wkst, OMAP3430_PER_MOD, PM_WKST);
|
||||
while (prm_read_mod_reg(OMAP3430_PER_MOD, PM_WKST))
|
||||
cpu_relax();
|
||||
cm_write_mod_reg(iclk, OMAP3430_PER_MOD, CM_ICLKEN);
|
||||
cm_write_mod_reg(fclk, OMAP3430_PER_MOD, CM_FCLKEN);
|
||||
}
|
||||
|
||||
if (omap_rev() > OMAP3430_REV_ES1_0) {
|
||||
/* USBHOST */
|
||||
wkst = prm_read_mod_reg(OMAP3430ES2_USBHOST_MOD, PM_WKST);
|
||||
if (wkst) {
|
||||
iclk = cm_read_mod_reg(OMAP3430ES2_USBHOST_MOD,
|
||||
CM_ICLKEN);
|
||||
fclk = cm_read_mod_reg(OMAP3430ES2_USBHOST_MOD,
|
||||
CM_FCLKEN);
|
||||
cm_set_mod_reg_bits(wkst, OMAP3430ES2_USBHOST_MOD,
|
||||
CM_ICLKEN);
|
||||
cm_set_mod_reg_bits(wkst, OMAP3430ES2_USBHOST_MOD,
|
||||
CM_FCLKEN);
|
||||
prm_write_mod_reg(wkst, OMAP3430ES2_USBHOST_MOD,
|
||||
PM_WKST);
|
||||
while (prm_read_mod_reg(OMAP3430ES2_USBHOST_MOD,
|
||||
PM_WKST))
|
||||
cpu_relax();
|
||||
cm_write_mod_reg(iclk, OMAP3430ES2_USBHOST_MOD,
|
||||
CM_ICLKEN);
|
||||
cm_write_mod_reg(fclk, OMAP3430ES2_USBHOST_MOD,
|
||||
CM_FCLKEN);
|
||||
/*
|
||||
* Is the MPU PRCM interrupt handler racing with the
|
||||
* IVA2 PRCM interrupt handler ?
|
||||
*/
|
||||
WARN(c == 0, "prcm: WARNING: PRCM indicated MPU wakeup "
|
||||
"but no wakeup sources are marked\n");
|
||||
} else {
|
||||
/* XXX we need to expand our PRCM interrupt handler */
|
||||
WARN(1, "prcm: WARNING: PRCM interrupt received, but "
|
||||
"no code to handle it (%08x)\n", irqstatus_mpu);
|
||||
}
|
||||
}
|
||||
|
||||
irqstatus_mpu = prm_read_mod_reg(OCP_MOD,
|
||||
OMAP3_PRM_IRQSTATUS_MPU_OFFSET);
|
||||
prm_write_mod_reg(irqstatus_mpu, OCP_MOD,
|
||||
OMAP3_PRM_IRQSTATUS_MPU_OFFSET);
|
||||
prm_write_mod_reg(irqstatus_mpu, OCP_MOD,
|
||||
OMAP3_PRM_IRQSTATUS_MPU_OFFSET);
|
||||
|
||||
while (prm_read_mod_reg(OCP_MOD, OMAP3_PRM_IRQSTATUS_MPU_OFFSET))
|
||||
cpu_relax();
|
||||
} while (prm_read_mod_reg(OCP_MOD, OMAP3_PRM_IRQSTATUS_MPU_OFFSET));
|
||||
|
||||
return IRQ_HANDLED;
|
||||
}
|
||||
|
@ -624,6 +639,16 @@ static void __init prcm_setup_regs(void)
|
|||
prm_write_mod_reg(OMAP3430_IO_EN | OMAP3430_WKUP_EN,
|
||||
OCP_MOD, OMAP3_PRM_IRQENABLE_MPU_OFFSET);
|
||||
|
||||
/* Enable GPIO wakeups in PER */
|
||||
prm_write_mod_reg(OMAP3430_EN_GPIO2 | OMAP3430_EN_GPIO3 |
|
||||
OMAP3430_EN_GPIO4 | OMAP3430_EN_GPIO5 |
|
||||
OMAP3430_EN_GPIO6, OMAP3430_PER_MOD, PM_WKEN);
|
||||
/* and allow them to wake up MPU */
|
||||
prm_write_mod_reg(OMAP3430_GRPSEL_GPIO2 | OMAP3430_EN_GPIO3 |
|
||||
OMAP3430_GRPSEL_GPIO4 | OMAP3430_EN_GPIO5 |
|
||||
OMAP3430_GRPSEL_GPIO6,
|
||||
OMAP3430_PER_MOD, OMAP3430_PM_MPUGRPSEL);
|
||||
|
||||
/* Don't attach IVA interrupts */
|
||||
prm_write_mod_reg(0, WKUP_MOD, OMAP3430_PM_IVAGRPSEL);
|
||||
prm_write_mod_reg(0, CORE_MOD, OMAP3430_PM_IVAGRPSEL1);
|
||||
|
|
|
@ -273,35 +273,50 @@ struct powerdomain *pwrdm_lookup(const char *name)
|
|||
}
|
||||
|
||||
/**
|
||||
* pwrdm_for_each - call function on each registered clockdomain
|
||||
* pwrdm_for_each_nolock - call function on each registered clockdomain
|
||||
* @fn: callback function *
|
||||
*
|
||||
* Call the supplied function for each registered powerdomain. The
|
||||
* callback function can return anything but 0 to bail out early from
|
||||
* the iterator. The callback function is called with the pwrdm_rwlock
|
||||
* held for reading, so no powerdomain structure manipulation
|
||||
* functions should be called from the callback, although hardware
|
||||
* powerdomain control functions are fine. Returns the last return
|
||||
* value of the callback function, which should be 0 for success or
|
||||
* anything else to indicate failure; or -EINVAL if the function
|
||||
* pointer is null.
|
||||
* the iterator. Returns the last return value of the callback function, which
|
||||
* should be 0 for success or anything else to indicate failure; or -EINVAL if
|
||||
* the function pointer is null.
|
||||
*/
|
||||
int pwrdm_for_each(int (*fn)(struct powerdomain *pwrdm, void *user),
|
||||
void *user)
|
||||
int pwrdm_for_each_nolock(int (*fn)(struct powerdomain *pwrdm, void *user),
|
||||
void *user)
|
||||
{
|
||||
struct powerdomain *temp_pwrdm;
|
||||
unsigned long flags;
|
||||
int ret = 0;
|
||||
|
||||
if (!fn)
|
||||
return -EINVAL;
|
||||
|
||||
read_lock_irqsave(&pwrdm_rwlock, flags);
|
||||
list_for_each_entry(temp_pwrdm, &pwrdm_list, node) {
|
||||
ret = (*fn)(temp_pwrdm, user);
|
||||
if (ret)
|
||||
break;
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
/**
|
||||
* pwrdm_for_each - call function on each registered clockdomain
|
||||
* @fn: callback function *
|
||||
*
|
||||
* This function is the same as 'pwrdm_for_each_nolock()', but keeps the
|
||||
* &pwrdm_rwlock locked for reading, so no powerdomain structure manipulation
|
||||
* functions should be called from the callback, although hardware powerdomain
|
||||
* control functions are fine.
|
||||
*/
|
||||
int pwrdm_for_each(int (*fn)(struct powerdomain *pwrdm, void *user),
|
||||
void *user)
|
||||
{
|
||||
unsigned long flags;
|
||||
int ret;
|
||||
|
||||
read_lock_irqsave(&pwrdm_rwlock, flags);
|
||||
ret = pwrdm_for_each_nolock(fn, user);
|
||||
read_unlock_irqrestore(&pwrdm_rwlock, flags);
|
||||
|
||||
return ret;
|
||||
|
|
|
@ -110,7 +110,7 @@ static struct plat_serial8250_port serial_platform_data2[] = {
|
|||
.uartclk = OMAP24XX_BASE_BAUD * 16,
|
||||
}, {
|
||||
#ifdef CONFIG_ARCH_OMAP4
|
||||
.membase = IO_ADDRESS(OMAP_UART4_BASE),
|
||||
.membase = OMAP2_IO_ADDRESS(OMAP_UART4_BASE),
|
||||
.mapbase = OMAP_UART4_BASE,
|
||||
.irq = 70,
|
||||
.flags = UPF_BOOT_AUTOCONF,
|
||||
|
@ -126,7 +126,7 @@ static struct plat_serial8250_port serial_platform_data2[] = {
|
|||
#ifdef CONFIG_ARCH_OMAP4
|
||||
static struct plat_serial8250_port serial_platform_data3[] = {
|
||||
{
|
||||
.membase = IO_ADDRESS(OMAP_UART4_BASE),
|
||||
.membase = OMAP2_IO_ADDRESS(OMAP_UART4_BASE),
|
||||
.mapbase = OMAP_UART4_BASE,
|
||||
.irq = 70,
|
||||
.flags = UPF_BOOT_AUTOCONF,
|
||||
|
@ -579,7 +579,7 @@ static struct omap_uart_state omap_uart[OMAP_MAX_NR_PORTS] = {
|
|||
{
|
||||
.pdev = {
|
||||
.name = "serial8250",
|
||||
.id = 3
|
||||
.id = 3,
|
||||
.dev = {
|
||||
.platform_data = serial_platform_data3,
|
||||
},
|
||||
|
|
|
@ -71,11 +71,6 @@ config SA1100_H3600
|
|||
<http://www.handhelds.org/Compaq/index.html#iPAQ_H3600>
|
||||
<http://www.compaq.com/products/handhelds/pocketpc/>
|
||||
|
||||
config SA1100_H3XXX
|
||||
bool
|
||||
depends on SA1100_H3100 || SA1100_H3600
|
||||
default y
|
||||
|
||||
config SA1100_BADGE4
|
||||
bool "HP Labs BadgePAD 4"
|
||||
select SA1111
|
||||
|
|
|
@ -77,7 +77,7 @@ static struct clock_event_device ckevt_sa1100_osmr0 = {
|
|||
.set_mode = sa1100_osmr0_set_mode,
|
||||
};
|
||||
|
||||
static cycle_t sa1100_read_oscr(void)
|
||||
static cycle_t sa1100_read_oscr(struct clocksource *s)
|
||||
{
|
||||
return OSCR;
|
||||
}
|
||||
|
|
|
@ -281,6 +281,16 @@ int gpio_unregister_callback(unsigned gpio)
|
|||
}
|
||||
EXPORT_SYMBOL(gpio_unregister_callback);
|
||||
|
||||
/* Non-zero means valid */
|
||||
int gpio_is_valid(int number)
|
||||
{
|
||||
if (number >= 0 &&
|
||||
number < (U300_GPIO_NUM_PORTS * U300_GPIO_PINS_PER_PORT))
|
||||
return 1;
|
||||
return 0;
|
||||
}
|
||||
EXPORT_SYMBOL(gpio_is_valid);
|
||||
|
||||
int gpio_request(unsigned gpio, const char *label)
|
||||
{
|
||||
if (gpio_pin[gpio].users)
|
||||
|
|
|
@ -258,6 +258,7 @@
|
|||
#define PIN_TO_PORT(val) (val >> 3)
|
||||
|
||||
/* These can be found in arch/arm/mach-u300/gpio.c */
|
||||
extern int gpio_is_valid(int number);
|
||||
extern int gpio_request(unsigned gpio, const char *label);
|
||||
extern void gpio_free(unsigned gpio);
|
||||
extern int gpio_direction_input(unsigned gpio);
|
||||
|
|
|
@ -17,7 +17,7 @@ config CPU_ARM610
|
|||
select CPU_CP15_MMU
|
||||
select CPU_COPY_V3 if MMU
|
||||
select CPU_TLB_V3 if MMU
|
||||
select CPU_PABRT_NOIFAR
|
||||
select CPU_PABRT_LEGACY
|
||||
help
|
||||
The ARM610 is the successor to the ARM3 processor
|
||||
and was produced by VLSI Technology Inc.
|
||||
|
@ -31,7 +31,7 @@ config CPU_ARM7TDMI
|
|||
depends on !MMU
|
||||
select CPU_32v4T
|
||||
select CPU_ABRT_LV4T
|
||||
select CPU_PABRT_NOIFAR
|
||||
select CPU_PABRT_LEGACY
|
||||
select CPU_CACHE_V4
|
||||
help
|
||||
A 32-bit RISC microprocessor based on the ARM7 processor core
|
||||
|
@ -49,7 +49,7 @@ config CPU_ARM710
|
|||
select CPU_CP15_MMU
|
||||
select CPU_COPY_V3 if MMU
|
||||
select CPU_TLB_V3 if MMU
|
||||
select CPU_PABRT_NOIFAR
|
||||
select CPU_PABRT_LEGACY
|
||||
help
|
||||
A 32-bit RISC microprocessor based on the ARM7 processor core
|
||||
designed by Advanced RISC Machines Ltd. The ARM710 is the
|
||||
|
@ -64,7 +64,7 @@ config CPU_ARM720T
|
|||
bool "Support ARM720T processor" if ARCH_INTEGRATOR
|
||||
select CPU_32v4T
|
||||
select CPU_ABRT_LV4T
|
||||
select CPU_PABRT_NOIFAR
|
||||
select CPU_PABRT_LEGACY
|
||||
select CPU_CACHE_V4
|
||||
select CPU_CACHE_VIVT
|
||||
select CPU_CP15_MMU
|
||||
|
@ -83,7 +83,7 @@ config CPU_ARM740T
|
|||
depends on !MMU
|
||||
select CPU_32v4T
|
||||
select CPU_ABRT_LV4T
|
||||
select CPU_PABRT_NOIFAR
|
||||
select CPU_PABRT_LEGACY
|
||||
select CPU_CACHE_V3 # although the core is v4t
|
||||
select CPU_CP15_MPU
|
||||
help
|
||||
|
@ -100,7 +100,7 @@ config CPU_ARM9TDMI
|
|||
depends on !MMU
|
||||
select CPU_32v4T
|
||||
select CPU_ABRT_NOMMU
|
||||
select CPU_PABRT_NOIFAR
|
||||
select CPU_PABRT_LEGACY
|
||||
select CPU_CACHE_V4
|
||||
help
|
||||
A 32-bit RISC microprocessor based on the ARM9 processor core
|
||||
|
@ -114,7 +114,7 @@ config CPU_ARM920T
|
|||
bool "Support ARM920T processor" if ARCH_INTEGRATOR
|
||||
select CPU_32v4T
|
||||
select CPU_ABRT_EV4T
|
||||
select CPU_PABRT_NOIFAR
|
||||
select CPU_PABRT_LEGACY
|
||||
select CPU_CACHE_V4WT
|
||||
select CPU_CACHE_VIVT
|
||||
select CPU_CP15_MMU
|
||||
|
@ -135,7 +135,7 @@ config CPU_ARM922T
|
|||
bool "Support ARM922T processor" if ARCH_INTEGRATOR
|
||||
select CPU_32v4T
|
||||
select CPU_ABRT_EV4T
|
||||
select CPU_PABRT_NOIFAR
|
||||
select CPU_PABRT_LEGACY
|
||||
select CPU_CACHE_V4WT
|
||||
select CPU_CACHE_VIVT
|
||||
select CPU_CP15_MMU
|
||||
|
@ -154,7 +154,7 @@ config CPU_ARM925T
|
|||
bool "Support ARM925T processor" if ARCH_OMAP1
|
||||
select CPU_32v4T
|
||||
select CPU_ABRT_EV4T
|
||||
select CPU_PABRT_NOIFAR
|
||||
select CPU_PABRT_LEGACY
|
||||
select CPU_CACHE_V4WT
|
||||
select CPU_CACHE_VIVT
|
||||
select CPU_CP15_MMU
|
||||
|
@ -173,7 +173,7 @@ config CPU_ARM926T
|
|||
bool "Support ARM926T processor" if ARCH_INTEGRATOR || MACH_REALVIEW_EB
|
||||
select CPU_32v5
|
||||
select CPU_ABRT_EV5TJ
|
||||
select CPU_PABRT_NOIFAR
|
||||
select CPU_PABRT_LEGACY
|
||||
select CPU_CACHE_VIVT
|
||||
select CPU_CP15_MMU
|
||||
select CPU_COPY_V4WB if MMU
|
||||
|
@ -191,7 +191,7 @@ config CPU_FA526
|
|||
bool
|
||||
select CPU_32v4
|
||||
select CPU_ABRT_EV4
|
||||
select CPU_PABRT_NOIFAR
|
||||
select CPU_PABRT_LEGACY
|
||||
select CPU_CACHE_VIVT
|
||||
select CPU_CP15_MMU
|
||||
select CPU_CACHE_FA
|
||||
|
@ -210,7 +210,7 @@ config CPU_ARM940T
|
|||
depends on !MMU
|
||||
select CPU_32v4T
|
||||
select CPU_ABRT_NOMMU
|
||||
select CPU_PABRT_NOIFAR
|
||||
select CPU_PABRT_LEGACY
|
||||
select CPU_CACHE_VIVT
|
||||
select CPU_CP15_MPU
|
||||
help
|
||||
|
@ -228,7 +228,7 @@ config CPU_ARM946E
|
|||
depends on !MMU
|
||||
select CPU_32v5
|
||||
select CPU_ABRT_NOMMU
|
||||
select CPU_PABRT_NOIFAR
|
||||
select CPU_PABRT_LEGACY
|
||||
select CPU_CACHE_VIVT
|
||||
select CPU_CP15_MPU
|
||||
help
|
||||
|
@ -244,7 +244,7 @@ config CPU_ARM1020
|
|||
bool "Support ARM1020T (rev 0) processor" if ARCH_INTEGRATOR
|
||||
select CPU_32v5
|
||||
select CPU_ABRT_EV4T
|
||||
select CPU_PABRT_NOIFAR
|
||||
select CPU_PABRT_LEGACY
|
||||
select CPU_CACHE_V4WT
|
||||
select CPU_CACHE_VIVT
|
||||
select CPU_CP15_MMU
|
||||
|
@ -262,7 +262,7 @@ config CPU_ARM1020E
|
|||
bool "Support ARM1020E processor" if ARCH_INTEGRATOR
|
||||
select CPU_32v5
|
||||
select CPU_ABRT_EV4T
|
||||
select CPU_PABRT_NOIFAR
|
||||
select CPU_PABRT_LEGACY
|
||||
select CPU_CACHE_V4WT
|
||||
select CPU_CACHE_VIVT
|
||||
select CPU_CP15_MMU
|
||||
|
@ -275,7 +275,7 @@ config CPU_ARM1022
|
|||
bool "Support ARM1022E processor" if ARCH_INTEGRATOR
|
||||
select CPU_32v5
|
||||
select CPU_ABRT_EV4T
|
||||
select CPU_PABRT_NOIFAR
|
||||
select CPU_PABRT_LEGACY
|
||||
select CPU_CACHE_VIVT
|
||||
select CPU_CP15_MMU
|
||||
select CPU_COPY_V4WB if MMU # can probably do better
|
||||
|
@ -293,7 +293,7 @@ config CPU_ARM1026
|
|||
bool "Support ARM1026EJ-S processor" if ARCH_INTEGRATOR
|
||||
select CPU_32v5
|
||||
select CPU_ABRT_EV5T # But need Jazelle, but EV5TJ ignores bit 10
|
||||
select CPU_PABRT_NOIFAR
|
||||
select CPU_PABRT_LEGACY
|
||||
select CPU_CACHE_VIVT
|
||||
select CPU_CP15_MMU
|
||||
select CPU_COPY_V4WB if MMU # can probably do better
|
||||
|
@ -311,7 +311,7 @@ config CPU_SA110
|
|||
select CPU_32v3 if ARCH_RPC
|
||||
select CPU_32v4 if !ARCH_RPC
|
||||
select CPU_ABRT_EV4
|
||||
select CPU_PABRT_NOIFAR
|
||||
select CPU_PABRT_LEGACY
|
||||
select CPU_CACHE_V4WB
|
||||
select CPU_CACHE_VIVT
|
||||
select CPU_CP15_MMU
|
||||
|
@ -331,7 +331,7 @@ config CPU_SA1100
|
|||
bool
|
||||
select CPU_32v4
|
||||
select CPU_ABRT_EV4
|
||||
select CPU_PABRT_NOIFAR
|
||||
select CPU_PABRT_LEGACY
|
||||
select CPU_CACHE_V4WB
|
||||
select CPU_CACHE_VIVT
|
||||
select CPU_CP15_MMU
|
||||
|
@ -342,7 +342,7 @@ config CPU_XSCALE
|
|||
bool
|
||||
select CPU_32v5
|
||||
select CPU_ABRT_EV5T
|
||||
select CPU_PABRT_NOIFAR
|
||||
select CPU_PABRT_LEGACY
|
||||
select CPU_CACHE_VIVT
|
||||
select CPU_CP15_MMU
|
||||
select CPU_TLB_V4WBI if MMU
|
||||
|
@ -352,7 +352,7 @@ config CPU_XSC3
|
|||
bool
|
||||
select CPU_32v5
|
||||
select CPU_ABRT_EV5T
|
||||
select CPU_PABRT_NOIFAR
|
||||
select CPU_PABRT_LEGACY
|
||||
select CPU_CACHE_VIVT
|
||||
select CPU_CP15_MMU
|
||||
select CPU_TLB_V4WBI if MMU
|
||||
|
@ -363,7 +363,7 @@ config CPU_MOHAWK
|
|||
bool
|
||||
select CPU_32v5
|
||||
select CPU_ABRT_EV5T
|
||||
select CPU_PABRT_NOIFAR
|
||||
select CPU_PABRT_LEGACY
|
||||
select CPU_CACHE_VIVT
|
||||
select CPU_CP15_MMU
|
||||
select CPU_TLB_V4WBI if MMU
|
||||
|
@ -374,7 +374,7 @@ config CPU_FEROCEON
|
|||
bool
|
||||
select CPU_32v5
|
||||
select CPU_ABRT_EV5T
|
||||
select CPU_PABRT_NOIFAR
|
||||
select CPU_PABRT_LEGACY
|
||||
select CPU_CACHE_VIVT
|
||||
select CPU_CP15_MMU
|
||||
select CPU_COPY_FEROCEON if MMU
|
||||
|
@ -394,7 +394,7 @@ config CPU_V6
|
|||
bool "Support ARM V6 processor" if ARCH_INTEGRATOR || MACH_REALVIEW_EB || MACH_REALVIEW_PBX
|
||||
select CPU_32v6
|
||||
select CPU_ABRT_EV6
|
||||
select CPU_PABRT_NOIFAR
|
||||
select CPU_PABRT_V6
|
||||
select CPU_CACHE_V6
|
||||
select CPU_CACHE_VIPT
|
||||
select CPU_CP15_MMU
|
||||
|
@ -420,7 +420,7 @@ config CPU_V7
|
|||
select CPU_32v6K
|
||||
select CPU_32v7
|
||||
select CPU_ABRT_EV7
|
||||
select CPU_PABRT_IFAR
|
||||
select CPU_PABRT_V7
|
||||
select CPU_CACHE_V7
|
||||
select CPU_CACHE_VIPT
|
||||
select CPU_CP15_MMU
|
||||
|
@ -482,10 +482,13 @@ config CPU_ABRT_EV6
|
|||
config CPU_ABRT_EV7
|
||||
bool
|
||||
|
||||
config CPU_PABRT_IFAR
|
||||
config CPU_PABRT_LEGACY
|
||||
bool
|
||||
|
||||
config CPU_PABRT_NOIFAR
|
||||
config CPU_PABRT_V6
|
||||
bool
|
||||
|
||||
config CPU_PABRT_V7
|
||||
bool
|
||||
|
||||
# The cache model
|
||||
|
|
|
@ -27,6 +27,10 @@ obj-$(CONFIG_CPU_ABRT_EV5TJ) += abort-ev5tj.o
|
|||
obj-$(CONFIG_CPU_ABRT_EV6) += abort-ev6.o
|
||||
obj-$(CONFIG_CPU_ABRT_EV7) += abort-ev7.o
|
||||
|
||||
obj-$(CONFIG_CPU_PABRT_LEGACY) += pabort-legacy.o
|
||||
obj-$(CONFIG_CPU_PABRT_V6) += pabort-v6.o
|
||||
obj-$(CONFIG_CPU_PABRT_V7) += pabort-v7.o
|
||||
|
||||
obj-$(CONFIG_CPU_CACHE_V3) += cache-v3.o
|
||||
obj-$(CONFIG_CPU_CACHE_V4) += cache-v4.o
|
||||
obj-$(CONFIG_CPU_CACHE_V4WT) += cache-v4wt.o
|
||||
|
|
|
@ -519,9 +519,58 @@ do_DataAbort(unsigned long addr, unsigned int fsr, struct pt_regs *regs)
|
|||
arm_notify_die("", regs, &info, fsr, 0);
|
||||
}
|
||||
|
||||
|
||||
static struct fsr_info ifsr_info[] = {
|
||||
{ do_bad, SIGBUS, 0, "unknown 0" },
|
||||
{ do_bad, SIGBUS, 0, "unknown 1" },
|
||||
{ do_bad, SIGBUS, 0, "debug event" },
|
||||
{ do_bad, SIGSEGV, SEGV_ACCERR, "section access flag fault" },
|
||||
{ do_bad, SIGBUS, 0, "unknown 4" },
|
||||
{ do_translation_fault, SIGSEGV, SEGV_MAPERR, "section translation fault" },
|
||||
{ do_bad, SIGSEGV, SEGV_ACCERR, "page access flag fault" },
|
||||
{ do_page_fault, SIGSEGV, SEGV_MAPERR, "page translation fault" },
|
||||
{ do_bad, SIGBUS, 0, "external abort on non-linefetch" },
|
||||
{ do_bad, SIGSEGV, SEGV_ACCERR, "section domain fault" },
|
||||
{ do_bad, SIGBUS, 0, "unknown 10" },
|
||||
{ do_bad, SIGSEGV, SEGV_ACCERR, "page domain fault" },
|
||||
{ do_bad, SIGBUS, 0, "external abort on translation" },
|
||||
{ do_sect_fault, SIGSEGV, SEGV_ACCERR, "section permission fault" },
|
||||
{ do_bad, SIGBUS, 0, "external abort on translation" },
|
||||
{ do_page_fault, SIGSEGV, SEGV_ACCERR, "page permission fault" },
|
||||
{ do_bad, SIGBUS, 0, "unknown 16" },
|
||||
{ do_bad, SIGBUS, 0, "unknown 17" },
|
||||
{ do_bad, SIGBUS, 0, "unknown 18" },
|
||||
{ do_bad, SIGBUS, 0, "unknown 19" },
|
||||
{ do_bad, SIGBUS, 0, "unknown 20" },
|
||||
{ do_bad, SIGBUS, 0, "unknown 21" },
|
||||
{ do_bad, SIGBUS, 0, "unknown 22" },
|
||||
{ do_bad, SIGBUS, 0, "unknown 23" },
|
||||
{ do_bad, SIGBUS, 0, "unknown 24" },
|
||||
{ do_bad, SIGBUS, 0, "unknown 25" },
|
||||
{ do_bad, SIGBUS, 0, "unknown 26" },
|
||||
{ do_bad, SIGBUS, 0, "unknown 27" },
|
||||
{ do_bad, SIGBUS, 0, "unknown 28" },
|
||||
{ do_bad, SIGBUS, 0, "unknown 29" },
|
||||
{ do_bad, SIGBUS, 0, "unknown 30" },
|
||||
{ do_bad, SIGBUS, 0, "unknown 31" },
|
||||
};
|
||||
|
||||
asmlinkage void __exception
|
||||
do_PrefetchAbort(unsigned long addr, struct pt_regs *regs)
|
||||
do_PrefetchAbort(unsigned long addr, unsigned int ifsr, struct pt_regs *regs)
|
||||
{
|
||||
do_translation_fault(addr, FSR_LNX_PF, regs);
|
||||
const struct fsr_info *inf = ifsr_info + fsr_fs(ifsr);
|
||||
struct siginfo info;
|
||||
|
||||
if (!inf->fn(addr, ifsr | FSR_LNX_PF, regs))
|
||||
return;
|
||||
|
||||
printk(KERN_ALERT "Unhandled prefetch abort: %s (0x%03x) at 0x%08lx\n",
|
||||
inf->name, ifsr, addr);
|
||||
|
||||
info.si_signo = inf->sig;
|
||||
info.si_errno = 0;
|
||||
info.si_code = inf->code;
|
||||
info.si_addr = (void __user *)addr;
|
||||
arm_notify_die("", regs, &info, ifsr, 0);
|
||||
}
|
||||
|
||||
|
|
|
@ -124,7 +124,7 @@ int valid_phys_addr_range(unsigned long addr, size_t size)
|
|||
{
|
||||
if (addr < PHYS_OFFSET)
|
||||
return 0;
|
||||
if (addr + size >= __pa(high_memory - 1))
|
||||
if (addr + size > __pa(high_memory - 1) + 1)
|
||||
return 0;
|
||||
|
||||
return 1;
|
||||
|
|
|
@ -21,6 +21,7 @@
|
|||
#include <asm/cachetype.h>
|
||||
#include <asm/setup.h>
|
||||
#include <asm/sizes.h>
|
||||
#include <asm/smp_plat.h>
|
||||
#include <asm/tlb.h>
|
||||
#include <asm/highmem.h>
|
||||
|
||||
|
@ -709,10 +710,6 @@ static void __init sanity_check_meminfo(void)
|
|||
if (meminfo.nr_banks >= NR_BANKS) {
|
||||
printk(KERN_CRIT "NR_BANKS too low, "
|
||||
"ignoring high memory\n");
|
||||
} else if (cache_is_vipt_aliasing()) {
|
||||
printk(KERN_CRIT "HIGHMEM is not yet supported "
|
||||
"with VIPT aliasing cache, "
|
||||
"ignoring high memory\n");
|
||||
} else {
|
||||
memmove(bank + 1, bank,
|
||||
(meminfo.nr_banks - i) * sizeof(*bank));
|
||||
|
@ -726,6 +723,8 @@ static void __init sanity_check_meminfo(void)
|
|||
bank->size = VMALLOC_MIN - __va(bank->start);
|
||||
}
|
||||
#else
|
||||
bank->highmem = highmem;
|
||||
|
||||
/*
|
||||
* Check whether this memory bank would entirely overlap
|
||||
* the vmalloc area.
|
||||
|
@ -754,6 +753,38 @@ static void __init sanity_check_meminfo(void)
|
|||
#endif
|
||||
j++;
|
||||
}
|
||||
#ifdef CONFIG_HIGHMEM
|
||||
if (highmem) {
|
||||
const char *reason = NULL;
|
||||
|
||||
if (cache_is_vipt_aliasing()) {
|
||||
/*
|
||||
* Interactions between kmap and other mappings
|
||||
* make highmem support with aliasing VIPT caches
|
||||
* rather difficult.
|
||||
*/
|
||||
reason = "with VIPT aliasing cache";
|
||||
#ifdef CONFIG_SMP
|
||||
} else if (tlb_ops_need_broadcast()) {
|
||||
/*
|
||||
* kmap_high needs to occasionally flush TLB entries,
|
||||
* however, if the TLB entries need to be broadcast
|
||||
* we may deadlock:
|
||||
* kmap_high(irqs off)->flush_all_zero_pkmaps->
|
||||
* flush_tlb_kernel_range->smp_call_function_many
|
||||
* (must not be called with irqs off)
|
||||
*/
|
||||
reason = "without hardware TLB ops broadcasting";
|
||||
#endif
|
||||
}
|
||||
if (reason) {
|
||||
printk(KERN_CRIT "HIGHMEM is not supported %s, ignoring high memory\n",
|
||||
reason);
|
||||
while (j > 0 && meminfo.bank[j - 1].highmem)
|
||||
j--;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
meminfo.nr_banks = j;
|
||||
}
|
||||
|
||||
|
|
|
@ -0,0 +1,19 @@
|
|||
#include <linux/linkage.h>
|
||||
#include <asm/assembler.h>
|
||||
|
||||
/*
|
||||
* Function: legacy_pabort
|
||||
*
|
||||
* Params : r0 = address of aborted instruction
|
||||
*
|
||||
* Returns : r0 = address of abort
|
||||
* : r1 = Simulated IFSR with section translation fault status
|
||||
*
|
||||
* Purpose : obtain information about current prefetch abort.
|
||||
*/
|
||||
|
||||
.align 5
|
||||
ENTRY(legacy_pabort)
|
||||
mov r1, #5
|
||||
mov pc, lr
|
||||
ENDPROC(legacy_pabort)
|
|
@ -0,0 +1,19 @@
|
|||
#include <linux/linkage.h>
|
||||
#include <asm/assembler.h>
|
||||
|
||||
/*
|
||||
* Function: v6_pabort
|
||||
*
|
||||
* Params : r0 = address of aborted instruction
|
||||
*
|
||||
* Returns : r0 = address of abort
|
||||
* : r1 = IFSR
|
||||
*
|
||||
* Purpose : obtain information about current prefetch abort.
|
||||
*/
|
||||
|
||||
.align 5
|
||||
ENTRY(v6_pabort)
|
||||
mrc p15, 0, r1, c5, c0, 1 @ get IFSR
|
||||
mov pc, lr
|
||||
ENDPROC(v6_pabort)
|
|
@ -0,0 +1,20 @@
|
|||
#include <linux/linkage.h>
|
||||
#include <asm/assembler.h>
|
||||
|
||||
/*
|
||||
* Function: v6_pabort
|
||||
*
|
||||
* Params : r0 = address of aborted instruction
|
||||
*
|
||||
* Returns : r0 = address of abort
|
||||
* : r1 = IFSR
|
||||
*
|
||||
* Purpose : obtain information about current prefetch abort.
|
||||
*/
|
||||
|
||||
.align 5
|
||||
ENTRY(v7_pabort)
|
||||
mrc p15, 0, r0, c6, c0, 2 @ get IFAR
|
||||
mrc p15, 0, r1, c5, c0, 1 @ get IFSR
|
||||
mov pc, lr
|
||||
ENDPROC(v7_pabort)
|
|
@ -449,7 +449,7 @@ arm1020_crval:
|
|||
.type arm1020_processor_functions, #object
|
||||
arm1020_processor_functions:
|
||||
.word v4t_early_abort
|
||||
.word pabort_noifar
|
||||
.word legacy_pabort
|
||||
.word cpu_arm1020_proc_init
|
||||
.word cpu_arm1020_proc_fin
|
||||
.word cpu_arm1020_reset
|
||||
|
|
|
@ -430,7 +430,7 @@ arm1020e_crval:
|
|||
.type arm1020e_processor_functions, #object
|
||||
arm1020e_processor_functions:
|
||||
.word v4t_early_abort
|
||||
.word pabort_noifar
|
||||
.word legacy_pabort
|
||||
.word cpu_arm1020e_proc_init
|
||||
.word cpu_arm1020e_proc_fin
|
||||
.word cpu_arm1020e_reset
|
||||
|
|
|
@ -413,7 +413,7 @@ arm1022_crval:
|
|||
.type arm1022_processor_functions, #object
|
||||
arm1022_processor_functions:
|
||||
.word v4t_early_abort
|
||||
.word pabort_noifar
|
||||
.word legacy_pabort
|
||||
.word cpu_arm1022_proc_init
|
||||
.word cpu_arm1022_proc_fin
|
||||
.word cpu_arm1022_reset
|
||||
|
|
|
@ -408,7 +408,7 @@ arm1026_crval:
|
|||
.type arm1026_processor_functions, #object
|
||||
arm1026_processor_functions:
|
||||
.word v5t_early_abort
|
||||
.word pabort_noifar
|
||||
.word legacy_pabort
|
||||
.word cpu_arm1026_proc_init
|
||||
.word cpu_arm1026_proc_fin
|
||||
.word cpu_arm1026_reset
|
||||
|
|
|
@ -278,7 +278,7 @@ __arm7_setup: mov r0, #0
|
|||
.type arm6_processor_functions, #object
|
||||
ENTRY(arm6_processor_functions)
|
||||
.word cpu_arm6_data_abort
|
||||
.word pabort_noifar
|
||||
.word legacy_pabort
|
||||
.word cpu_arm6_proc_init
|
||||
.word cpu_arm6_proc_fin
|
||||
.word cpu_arm6_reset
|
||||
|
@ -295,7 +295,7 @@ ENTRY(arm6_processor_functions)
|
|||
.type arm7_processor_functions, #object
|
||||
ENTRY(arm7_processor_functions)
|
||||
.word cpu_arm7_data_abort
|
||||
.word pabort_noifar
|
||||
.word legacy_pabort
|
||||
.word cpu_arm7_proc_init
|
||||
.word cpu_arm7_proc_fin
|
||||
.word cpu_arm7_reset
|
||||
|
|
|
@ -181,7 +181,7 @@ arm720_crval:
|
|||
.type arm720_processor_functions, #object
|
||||
ENTRY(arm720_processor_functions)
|
||||
.word v4t_late_abort
|
||||
.word pabort_noifar
|
||||
.word legacy_pabort
|
||||
.word cpu_arm720_proc_init
|
||||
.word cpu_arm720_proc_fin
|
||||
.word cpu_arm720_reset
|
||||
|
|
|
@ -126,7 +126,7 @@ __arm740_setup:
|
|||
.type arm740_processor_functions, #object
|
||||
ENTRY(arm740_processor_functions)
|
||||
.word v4t_late_abort
|
||||
.word pabort_noifar
|
||||
.word legacy_pabort
|
||||
.word cpu_arm740_proc_init
|
||||
.word cpu_arm740_proc_fin
|
||||
.word cpu_arm740_reset
|
||||
|
|
|
@ -64,7 +64,7 @@ __arm7tdmi_setup:
|
|||
.type arm7tdmi_processor_functions, #object
|
||||
ENTRY(arm7tdmi_processor_functions)
|
||||
.word v4t_late_abort
|
||||
.word pabort_noifar
|
||||
.word legacy_pabort
|
||||
.word cpu_arm7tdmi_proc_init
|
||||
.word cpu_arm7tdmi_proc_fin
|
||||
.word cpu_arm7tdmi_reset
|
||||
|
|
|
@ -395,7 +395,7 @@ arm920_crval:
|
|||
.type arm920_processor_functions, #object
|
||||
arm920_processor_functions:
|
||||
.word v4t_early_abort
|
||||
.word pabort_noifar
|
||||
.word legacy_pabort
|
||||
.word cpu_arm920_proc_init
|
||||
.word cpu_arm920_proc_fin
|
||||
.word cpu_arm920_reset
|
||||
|
|
|
@ -399,7 +399,7 @@ arm922_crval:
|
|||
.type arm922_processor_functions, #object
|
||||
arm922_processor_functions:
|
||||
.word v4t_early_abort
|
||||
.word pabort_noifar
|
||||
.word legacy_pabort
|
||||
.word cpu_arm922_proc_init
|
||||
.word cpu_arm922_proc_fin
|
||||
.word cpu_arm922_reset
|
||||
|
|
|
@ -462,7 +462,7 @@ arm925_crval:
|
|||
.type arm925_processor_functions, #object
|
||||
arm925_processor_functions:
|
||||
.word v4t_early_abort
|
||||
.word pabort_noifar
|
||||
.word legacy_pabort
|
||||
.word cpu_arm925_proc_init
|
||||
.word cpu_arm925_proc_fin
|
||||
.word cpu_arm925_reset
|
||||
|
|
|
@ -415,7 +415,7 @@ arm926_crval:
|
|||
.type arm926_processor_functions, #object
|
||||
arm926_processor_functions:
|
||||
.word v5tj_early_abort
|
||||
.word pabort_noifar
|
||||
.word legacy_pabort
|
||||
.word cpu_arm926_proc_init
|
||||
.word cpu_arm926_proc_fin
|
||||
.word cpu_arm926_reset
|
||||
|
|
|
@ -322,7 +322,7 @@ __arm940_setup:
|
|||
.type arm940_processor_functions, #object
|
||||
ENTRY(arm940_processor_functions)
|
||||
.word nommu_early_abort
|
||||
.word pabort_noifar
|
||||
.word legacy_pabort
|
||||
.word cpu_arm940_proc_init
|
||||
.word cpu_arm940_proc_fin
|
||||
.word cpu_arm940_reset
|
||||
|
|
|
@ -377,7 +377,7 @@ __arm946_setup:
|
|||
.type arm946_processor_functions, #object
|
||||
ENTRY(arm946_processor_functions)
|
||||
.word nommu_early_abort
|
||||
.word pabort_noifar
|
||||
.word legacy_pabort
|
||||
.word cpu_arm946_proc_init
|
||||
.word cpu_arm946_proc_fin
|
||||
.word cpu_arm946_reset
|
||||
|
|
|
@ -64,7 +64,7 @@ __arm9tdmi_setup:
|
|||
.type arm9tdmi_processor_functions, #object
|
||||
ENTRY(arm9tdmi_processor_functions)
|
||||
.word nommu_early_abort
|
||||
.word pabort_noifar
|
||||
.word legacy_pabort
|
||||
.word cpu_arm9tdmi_proc_init
|
||||
.word cpu_arm9tdmi_proc_fin
|
||||
.word cpu_arm9tdmi_reset
|
||||
|
|
|
@ -191,7 +191,7 @@ fa526_cr1_set:
|
|||
.type fa526_processor_functions, #object
|
||||
fa526_processor_functions:
|
||||
.word v4_early_abort
|
||||
.word pabort_noifar
|
||||
.word legacy_pabort
|
||||
.word cpu_fa526_proc_init
|
||||
.word cpu_fa526_proc_fin
|
||||
.word cpu_fa526_reset
|
||||
|
|
|
@ -499,7 +499,7 @@ feroceon_crval:
|
|||
.type feroceon_processor_functions, #object
|
||||
feroceon_processor_functions:
|
||||
.word v5t_early_abort
|
||||
.word pabort_noifar
|
||||
.word legacy_pabort
|
||||
.word cpu_feroceon_proc_init
|
||||
.word cpu_feroceon_proc_fin
|
||||
.word cpu_feroceon_reset
|
||||
|
|
|
@ -359,7 +359,7 @@ mohawk_crval:
|
|||
.type mohawk_processor_functions, #object
|
||||
mohawk_processor_functions:
|
||||
.word v5t_early_abort
|
||||
.word pabort_noifar
|
||||
.word legacy_pabort
|
||||
.word cpu_mohawk_proc_init
|
||||
.word cpu_mohawk_proc_fin
|
||||
.word cpu_mohawk_reset
|
||||
|
|
|
@ -199,7 +199,7 @@ sa110_crval:
|
|||
.type sa110_processor_functions, #object
|
||||
ENTRY(sa110_processor_functions)
|
||||
.word v4_early_abort
|
||||
.word pabort_noifar
|
||||
.word legacy_pabort
|
||||
.word cpu_sa110_proc_init
|
||||
.word cpu_sa110_proc_fin
|
||||
.word cpu_sa110_reset
|
||||
|
|
|
@ -214,7 +214,7 @@ sa1100_crval:
|
|||
.type sa1100_processor_functions, #object
|
||||
ENTRY(sa1100_processor_functions)
|
||||
.word v4_early_abort
|
||||
.word pabort_noifar
|
||||
.word legacy_pabort
|
||||
.word cpu_sa1100_proc_init
|
||||
.word cpu_sa1100_proc_fin
|
||||
.word cpu_sa1100_reset
|
||||
|
|
|
@ -191,7 +191,7 @@ v6_crval:
|
|||
.type v6_processor_functions, #object
|
||||
ENTRY(v6_processor_functions)
|
||||
.word v6_early_abort
|
||||
.word pabort_noifar
|
||||
.word v6_pabort
|
||||
.word cpu_v6_proc_init
|
||||
.word cpu_v6_proc_fin
|
||||
.word cpu_v6_reset
|
||||
|
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue