Merge branch 'perf/urgent' into perf/core
Merge reason: we need to queue up dependent patch Signed-off-by: Ingo Molnar <mingo@elte.hu>
This commit is contained in:
commit
b00560f2d4
@ -73,8 +73,8 @@
|
||||
services.
|
||||
</para>
|
||||
<para>
|
||||
The core of every DRM driver is struct drm_device. Drivers
|
||||
will typically statically initialize a drm_device structure,
|
||||
The core of every DRM driver is struct drm_driver. Drivers
|
||||
will typically statically initialize a drm_driver structure,
|
||||
then pass it to drm_init() at load time.
|
||||
</para>
|
||||
|
||||
@ -84,7 +84,7 @@
|
||||
<title>Driver initialization</title>
|
||||
<para>
|
||||
Before calling the DRM initialization routines, the driver must
|
||||
first create and fill out a struct drm_device structure.
|
||||
first create and fill out a struct drm_driver structure.
|
||||
</para>
|
||||
<programlisting>
|
||||
static struct drm_driver driver = {
|
||||
|
@ -13,7 +13,6 @@ Table of Contents
|
||||
|
||||
I - Introduction
|
||||
1) Entry point for arch/powerpc
|
||||
2) Board support
|
||||
|
||||
II - The DT block format
|
||||
1) Header
|
||||
@ -41,13 +40,6 @@ Table of Contents
|
||||
VI - System-on-a-chip devices and nodes
|
||||
1) Defining child nodes of an SOC
|
||||
2) Representing devices without a current OF specification
|
||||
a) PHY nodes
|
||||
b) Interrupt controllers
|
||||
c) 4xx/Axon EMAC ethernet nodes
|
||||
d) Xilinx IP cores
|
||||
e) USB EHCI controllers
|
||||
f) MDIO on GPIOs
|
||||
g) SPI busses
|
||||
|
||||
VII - Specifying interrupt information for devices
|
||||
1) interrupts property
|
||||
@ -123,7 +115,7 @@ Revision Information
|
||||
I - Introduction
|
||||
================
|
||||
|
||||
During the recent development of the Linux/ppc64 kernel, and more
|
||||
During the development of the Linux/ppc64 kernel, and more
|
||||
specifically, the addition of new platform types outside of the old
|
||||
IBM pSeries/iSeries pair, it was decided to enforce some strict rules
|
||||
regarding the kernel entry and bootloader <-> kernel interfaces, in
|
||||
@ -146,7 +138,7 @@ section III, but, for example, the kernel does not require you to
|
||||
create a node for every PCI device in the system. It is a requirement
|
||||
to have a node for PCI host bridges in order to provide interrupt
|
||||
routing informations and memory/IO ranges, among others. It is also
|
||||
recommended to define nodes for on chip devices and other busses that
|
||||
recommended to define nodes for on chip devices and other buses that
|
||||
don't specifically fit in an existing OF specification. This creates a
|
||||
great flexibility in the way the kernel can then probe those and match
|
||||
drivers to device, without having to hard code all sorts of tables. It
|
||||
@ -158,7 +150,7 @@ it with special cases.
|
||||
1) Entry point for arch/powerpc
|
||||
-------------------------------
|
||||
|
||||
There is one and one single entry point to the kernel, at the start
|
||||
There is one single entry point to the kernel, at the start
|
||||
of the kernel image. That entry point supports two calling
|
||||
conventions:
|
||||
|
||||
@ -210,12 +202,6 @@ it with special cases.
|
||||
with all CPUs. The way to do that with method b) will be
|
||||
described in a later revision of this document.
|
||||
|
||||
|
||||
2) Board support
|
||||
----------------
|
||||
|
||||
64-bit kernels:
|
||||
|
||||
Board supports (platforms) are not exclusive config options. An
|
||||
arbitrary set of board supports can be built in a single kernel
|
||||
image. The kernel will "know" what set of functions to use for a
|
||||
@ -234,48 +220,11 @@ it with special cases.
|
||||
containing the various callbacks that the generic code will
|
||||
use to get to your platform specific code
|
||||
|
||||
c) Add a reference to your "ppc_md" structure in the
|
||||
"machines" table in arch/powerpc/kernel/setup_64.c if you are
|
||||
a 64-bit platform.
|
||||
|
||||
d) request and get assigned a platform number (see PLATFORM_*
|
||||
constants in arch/powerpc/include/asm/processor.h
|
||||
|
||||
32-bit embedded kernels:
|
||||
|
||||
Currently, board support is essentially an exclusive config option.
|
||||
The kernel is configured for a single platform. Part of the reason
|
||||
for this is to keep kernels on embedded systems small and efficient;
|
||||
part of this is due to the fact the code is already that way. In the
|
||||
future, a kernel may support multiple platforms, but only if the
|
||||
A kernel image may support multiple platforms, but only if the
|
||||
platforms feature the same core architecture. A single kernel build
|
||||
cannot support both configurations with Book E and configurations
|
||||
with classic Powerpc architectures.
|
||||
|
||||
32-bit embedded platforms that are moved into arch/powerpc using a
|
||||
flattened device tree should adopt the merged tree practice of
|
||||
setting ppc_md up dynamically, even though the kernel is currently
|
||||
built with support for only a single platform at a time. This allows
|
||||
unification of the setup code, and will make it easier to go to a
|
||||
multiple-platform-support model in the future.
|
||||
|
||||
NOTE: I believe the above will be true once Ben's done with the merge
|
||||
of the boot sequences.... someone speak up if this is wrong!
|
||||
|
||||
To add a 32-bit embedded platform support, follow the instructions
|
||||
for 64-bit platforms above, with the exception that the Kconfig
|
||||
option should be set up such that the kernel builds exclusively for
|
||||
the platform selected. The processor type for the platform should
|
||||
enable another config option to select the specific board
|
||||
supported.
|
||||
|
||||
NOTE: If Ben doesn't merge the setup files, may need to change this to
|
||||
point to setup_32.c
|
||||
|
||||
|
||||
I will describe later the boot process and various callbacks that
|
||||
your platform should implement.
|
||||
|
||||
|
||||
II - The DT block format
|
||||
========================
|
||||
@ -300,8 +249,8 @@ the block to RAM before passing it to the kernel.
|
||||
1) Header
|
||||
---------
|
||||
|
||||
The kernel is entered with r3 pointing to an area of memory that is
|
||||
roughly described in arch/powerpc/include/asm/prom.h by the structure
|
||||
The kernel is passed the physical address pointing to an area of memory
|
||||
that is roughly described in include/linux/of_fdt.h by the structure
|
||||
boot_param_header:
|
||||
|
||||
struct boot_param_header {
|
||||
@ -339,7 +288,7 @@ struct boot_param_header {
|
||||
All values in this header are in big endian format, the various
|
||||
fields in this header are defined more precisely below. All
|
||||
"offset" values are in bytes from the start of the header; that is
|
||||
from the value of r3.
|
||||
from the physical base address of the device tree block.
|
||||
|
||||
- magic
|
||||
|
||||
@ -437,7 +386,7 @@ struct boot_param_header {
|
||||
|
||||
|
||||
------------------------------
|
||||
r3 -> | struct boot_param_header |
|
||||
base -> | struct boot_param_header |
|
||||
------------------------------
|
||||
| (alignment gap) (*) |
|
||||
------------------------------
|
||||
@ -457,7 +406,7 @@ struct boot_param_header {
|
||||
-----> ------------------------------
|
||||
|
|
||||
|
|
||||
--- (r3 + totalsize)
|
||||
--- (base + totalsize)
|
||||
|
||||
(*) The alignment gaps are not necessarily present; their presence
|
||||
and size are dependent on the various alignment requirements of
|
||||
@ -500,7 +449,7 @@ the device-tree structure. It is typically used to represent "path" in
|
||||
the device-tree. More details about the actual format of these will be
|
||||
below.
|
||||
|
||||
The kernel powerpc generic code does not make any formal use of the
|
||||
The kernel generic code does not make any formal use of the
|
||||
unit address (though some board support code may do) so the only real
|
||||
requirement here for the unit address is to ensure uniqueness of
|
||||
the node unit name at a given level of the tree. Nodes with no notion
|
||||
@ -518,20 +467,21 @@ path to the root node is "/".
|
||||
|
||||
Every node which actually represents an actual device (that is, a node
|
||||
which isn't only a virtual "container" for more nodes, like "/cpus"
|
||||
is) is also required to have a "device_type" property indicating the
|
||||
type of node .
|
||||
is) is also required to have a "compatible" property indicating the
|
||||
specific hardware and an optional list of devices it is fully
|
||||
backwards compatible with.
|
||||
|
||||
Finally, every node that can be referenced from a property in another
|
||||
node is required to have a "linux,phandle" property. Real open
|
||||
firmware implementations provide a unique "phandle" value for every
|
||||
node that the "prom_init()" trampoline code turns into
|
||||
"linux,phandle" properties. However, this is made optional if the
|
||||
flattened device tree is used directly. An example of a node
|
||||
node is required to have either a "phandle" or a "linux,phandle"
|
||||
property. Real Open Firmware implementations provide a unique
|
||||
"phandle" value for every node that the "prom_init()" trampoline code
|
||||
turns into "linux,phandle" properties. However, this is made optional
|
||||
if the flattened device tree is used directly. An example of a node
|
||||
referencing another node via "phandle" is when laying out the
|
||||
interrupt tree which will be described in a further version of this
|
||||
document.
|
||||
|
||||
This "linux, phandle" property is a 32-bit value that uniquely
|
||||
The "phandle" property is a 32-bit value that uniquely
|
||||
identifies a node. You are free to use whatever values or system of
|
||||
values, internal pointers, or whatever to generate these, the only
|
||||
requirement is that every node for which you provide that property has
|
||||
@ -694,7 +644,7 @@ made of 3 cells, the bottom two containing the actual address itself
|
||||
while the top cell contains address space indication, flags, and pci
|
||||
bus & device numbers.
|
||||
|
||||
For busses that support dynamic allocation, it's the accepted practice
|
||||
For buses that support dynamic allocation, it's the accepted practice
|
||||
to then not provide the address in "reg" (keep it 0) though while
|
||||
providing a flag indicating the address is dynamically allocated, and
|
||||
then, to provide a separate "assigned-addresses" property that
|
||||
@ -711,7 +661,7 @@ prom_parse.c file of the recent kernels for your bus type.
|
||||
The "reg" property only defines addresses and sizes (if #size-cells is
|
||||
non-0) within a given bus. In order to translate addresses upward
|
||||
(that is into parent bus addresses, and possibly into CPU physical
|
||||
addresses), all busses must contain a "ranges" property. If the
|
||||
addresses), all buses must contain a "ranges" property. If the
|
||||
"ranges" property is missing at a given level, it's assumed that
|
||||
translation isn't possible, i.e., the registers are not visible on the
|
||||
parent bus. The format of the "ranges" property for a bus is a list
|
||||
@ -727,9 +677,9 @@ example, for a PCI host controller, that would be a CPU address. For a
|
||||
PCI<->ISA bridge, that would be a PCI address. It defines the base
|
||||
address in the parent bus where the beginning of that range is mapped.
|
||||
|
||||
For a new 64-bit powerpc board, I recommend either the 2/2 format or
|
||||
For new 64-bit board support, I recommend either the 2/2 format or
|
||||
Apple's 2/1 format which is slightly more compact since sizes usually
|
||||
fit in a single 32-bit word. New 32-bit powerpc boards should use a
|
||||
fit in a single 32-bit word. New 32-bit board support should use a
|
||||
1/1 format, unless the processor supports physical addresses greater
|
||||
than 32-bits, in which case a 2/1 format is recommended.
|
||||
|
||||
@ -754,7 +704,7 @@ of their actual names.
|
||||
While earlier users of Open Firmware like OldWorld macintoshes tended
|
||||
to use the actual device name for the "name" property, it's nowadays
|
||||
considered a good practice to use a name that is closer to the device
|
||||
class (often equal to device_type). For example, nowadays, ethernet
|
||||
class (often equal to device_type). For example, nowadays, Ethernet
|
||||
controllers are named "ethernet", an additional "model" property
|
||||
defining precisely the chip type/model, and "compatible" property
|
||||
defining the family in case a single driver can driver more than one
|
||||
@ -772,7 +722,7 @@ is present).
|
||||
4) Note about node and property names and character set
|
||||
-------------------------------------------------------
|
||||
|
||||
While open firmware provides more flexible usage of 8859-1, this
|
||||
While Open Firmware provides more flexible usage of 8859-1, this
|
||||
specification enforces more strict rules. Nodes and properties should
|
||||
be comprised only of ASCII characters 'a' to 'z', '0' to
|
||||
'9', ',', '.', '_', '+', '#', '?', and '-'. Node names additionally
|
||||
@ -792,7 +742,7 @@ address which can extend beyond that limit.
|
||||
--------------------------------
|
||||
These are all that are currently required. However, it is strongly
|
||||
recommended that you expose PCI host bridges as documented in the
|
||||
PCI binding to open firmware, and your interrupt tree as documented
|
||||
PCI binding to Open Firmware, and your interrupt tree as documented
|
||||
in OF interrupt tree specification.
|
||||
|
||||
a) The root node
|
||||
@ -802,20 +752,12 @@ address which can extend beyond that limit.
|
||||
- model : this is your board name/model
|
||||
- #address-cells : address representation for "root" devices
|
||||
- #size-cells: the size representation for "root" devices
|
||||
- device_type : This property shouldn't be necessary. However, if
|
||||
you decide to create a device_type for your root node, make sure it
|
||||
is _not_ "chrp" unless your platform is a pSeries or PAPR compliant
|
||||
one for 64-bit, or a CHRP-type machine for 32-bit as this will
|
||||
matched by the kernel this way.
|
||||
|
||||
Additionally, some recommended properties are:
|
||||
|
||||
- compatible : the board "family" generally finds its way here,
|
||||
for example, if you have 2 board models with a similar layout,
|
||||
that typically get driven by the same platform code in the
|
||||
kernel, you would use a different "model" property but put a
|
||||
value in "compatible". The kernel doesn't directly use that
|
||||
value but it is generally useful.
|
||||
kernel, you would specify the exact board model in the
|
||||
compatible property followed by an entry that represents the SoC
|
||||
model.
|
||||
|
||||
The root node is also generally where you add additional properties
|
||||
specific to your board like the serial number if any, that sort of
|
||||
@ -841,8 +783,11 @@ address which can extend beyond that limit.
|
||||
|
||||
So under /cpus, you are supposed to create a node for every CPU on
|
||||
the machine. There is no specific restriction on the name of the
|
||||
CPU, though It's common practice to call it PowerPC,<name>. For
|
||||
CPU, though it's common to call it <architecture>,<core>. For
|
||||
example, Apple uses PowerPC,G5 while IBM uses PowerPC,970FX.
|
||||
However, the Generic Names convention suggests that it would be
|
||||
better to simply use 'cpu' for each cpu node and use the compatible
|
||||
property to identify the specific cpu core.
|
||||
|
||||
Required properties:
|
||||
|
||||
@ -923,7 +868,7 @@ compatibility.
|
||||
|
||||
e) The /chosen node
|
||||
|
||||
This node is a bit "special". Normally, that's where open firmware
|
||||
This node is a bit "special". Normally, that's where Open Firmware
|
||||
puts some variable environment information, like the arguments, or
|
||||
the default input/output devices.
|
||||
|
||||
@ -940,11 +885,7 @@ compatibility.
|
||||
console device if any. Typically, if you have serial devices on
|
||||
your board, you may want to put the full path to the one set as
|
||||
the default console in the firmware here, for the kernel to pick
|
||||
it up as its own default console. If you look at the function
|
||||
set_preferred_console() in arch/ppc64/kernel/setup.c, you'll see
|
||||
that the kernel tries to find out the default console and has
|
||||
knowledge of various types like 8250 serial ports. You may want
|
||||
to extend this function to add your own.
|
||||
it up as its own default console.
|
||||
|
||||
Note that u-boot creates and fills in the chosen node for platforms
|
||||
that use it.
|
||||
@ -955,23 +896,23 @@ compatibility.
|
||||
|
||||
f) the /soc<SOCname> node
|
||||
|
||||
This node is used to represent a system-on-a-chip (SOC) and must be
|
||||
present if the processor is a SOC. The top-level soc node contains
|
||||
information that is global to all devices on the SOC. The node name
|
||||
should contain a unit address for the SOC, which is the base address
|
||||
of the memory-mapped register set for the SOC. The name of an soc
|
||||
This node is used to represent a system-on-a-chip (SoC) and must be
|
||||
present if the processor is a SoC. The top-level soc node contains
|
||||
information that is global to all devices on the SoC. The node name
|
||||
should contain a unit address for the SoC, which is the base address
|
||||
of the memory-mapped register set for the SoC. The name of an SoC
|
||||
node should start with "soc", and the remainder of the name should
|
||||
represent the part number for the soc. For example, the MPC8540's
|
||||
soc node would be called "soc8540".
|
||||
|
||||
Required properties:
|
||||
|
||||
- device_type : Should be "soc"
|
||||
- ranges : Should be defined as specified in 1) to describe the
|
||||
translation of SOC addresses for memory mapped SOC registers.
|
||||
- bus-frequency: Contains the bus frequency for the SOC node.
|
||||
translation of SoC addresses for memory mapped SoC registers.
|
||||
- bus-frequency: Contains the bus frequency for the SoC node.
|
||||
Typically, the value of this field is filled in by the boot
|
||||
loader.
|
||||
- compatible : Exact model of the SoC
|
||||
|
||||
|
||||
Recommended properties:
|
||||
@ -1155,12 +1096,13 @@ while all this has been defined and implemented.
|
||||
|
||||
- An example of code for iterating nodes & retrieving properties
|
||||
directly from the flattened tree format can be found in the kernel
|
||||
file arch/ppc64/kernel/prom.c, look at scan_flat_dt() function,
|
||||
file drivers/of/fdt.c. Look at the of_scan_flat_dt() function,
|
||||
its usage in early_init_devtree(), and the corresponding various
|
||||
early_init_dt_scan_*() callbacks. That code can be re-used in a
|
||||
GPL bootloader, and as the author of that code, I would be happy
|
||||
to discuss possible free licensing to any vendor who wishes to
|
||||
integrate all or part of this code into a non-GPL bootloader.
|
||||
(reference needed; who is 'I' here? ---gcl Jan 31, 2011)
|
||||
|
||||
|
||||
|
||||
@ -1203,18 +1145,19 @@ MPC8540.
|
||||
2) Representing devices without a current OF specification
|
||||
----------------------------------------------------------
|
||||
|
||||
Currently, there are many devices on SOCs that do not have a standard
|
||||
representation pre-defined as part of the open firmware
|
||||
specifications, mainly because the boards that contain these SOCs are
|
||||
not currently booted using open firmware. This section contains
|
||||
descriptions for the SOC devices for which new nodes have been
|
||||
defined; this list will expand as more and more SOC-containing
|
||||
platforms are moved over to use the flattened-device-tree model.
|
||||
Currently, there are many devices on SoCs that do not have a standard
|
||||
representation defined as part of the Open Firmware specifications,
|
||||
mainly because the boards that contain these SoCs are not currently
|
||||
booted using Open Firmware. Binding documentation for new devices
|
||||
should be added to the Documentation/devicetree/bindings directory.
|
||||
That directory will expand as device tree support is added to more and
|
||||
more SoCs.
|
||||
|
||||
|
||||
VII - Specifying interrupt information for devices
|
||||
===================================================
|
||||
|
||||
The device tree represents the busses and devices of a hardware
|
||||
The device tree represents the buses and devices of a hardware
|
||||
system in a form similar to the physical bus topology of the
|
||||
hardware.
|
||||
|
12
MAINTAINERS
12
MAINTAINERS
@ -2126,6 +2126,7 @@ S: Supported
|
||||
F: fs/dlm/
|
||||
|
||||
DMA GENERIC OFFLOAD ENGINE SUBSYSTEM
|
||||
M: Vinod Koul <vinod.koul@intel.com>
|
||||
M: Dan Williams <dan.j.williams@intel.com>
|
||||
S: Supported
|
||||
F: drivers/dma/
|
||||
@ -2774,6 +2775,15 @@ F: Documentation/isdn/README.gigaset
|
||||
F: drivers/isdn/gigaset/
|
||||
F: include/linux/gigaset_dev.h
|
||||
|
||||
GPIO SUBSYSTEM
|
||||
M: Grant Likely <grant.likely@secretlab.ca>
|
||||
L: linux-kernel@vger.kernel.org
|
||||
S: Maintained
|
||||
T: git git://git.secretlab.ca/git/linux-2.6.git
|
||||
F: Documentation/gpio/gpio.txt
|
||||
F: drivers/gpio/
|
||||
F: include/linux/gpio*
|
||||
|
||||
GRETH 10/100/1G Ethernet MAC device driver
|
||||
M: Kristoffer Glembo <kristoffer@gaisler.com>
|
||||
L: netdev@vger.kernel.org
|
||||
@ -4591,7 +4601,7 @@ F: drivers/i2c/busses/i2c-ocores.c
|
||||
|
||||
OPEN FIRMWARE AND FLATTENED DEVICE TREE
|
||||
M: Grant Likely <grant.likely@secretlab.ca>
|
||||
L: devicetree-discuss@lists.ozlabs.org
|
||||
L: devicetree-discuss@lists.ozlabs.org (moderated for non-subscribers)
|
||||
W: http://fdt.secretlab.ca
|
||||
T: git git://git.secretlab.ca/git/linux-2.6.git
|
||||
S: Maintained
|
||||
|
2
Makefile
2
Makefile
@ -1,7 +1,7 @@
|
||||
VERSION = 2
|
||||
PATCHLEVEL = 6
|
||||
SUBLEVEL = 38
|
||||
EXTRAVERSION = -rc4
|
||||
EXTRAVERSION = -rc5
|
||||
NAME = Flesh-Eating Bats with Fangs
|
||||
|
||||
# *DOCUMENTATION*
|
||||
|
@ -1391,7 +1391,7 @@ config AEABI
|
||||
|
||||
config OABI_COMPAT
|
||||
bool "Allow old ABI binaries to run with this kernel (EXPERIMENTAL)"
|
||||
depends on AEABI && EXPERIMENTAL
|
||||
depends on AEABI && EXPERIMENTAL && !THUMB2_KERNEL
|
||||
default y
|
||||
help
|
||||
This option preserves the old syscall interface along with the
|
||||
|
@ -391,6 +391,7 @@ ENDPROC(__turn_mmu_on)
|
||||
|
||||
|
||||
#ifdef CONFIG_SMP_ON_UP
|
||||
__INIT
|
||||
__fixup_smp:
|
||||
and r3, r9, #0x000f0000 @ architecture version
|
||||
teq r3, #0x000f0000 @ CPU ID supported?
|
||||
@ -415,18 +416,7 @@ __fixup_smp_on_up:
|
||||
sub r3, r0, r3
|
||||
add r4, r4, r3
|
||||
add r5, r5, r3
|
||||
2: cmp r4, r5
|
||||
movhs pc, lr
|
||||
ldmia r4!, {r0, r6}
|
||||
ARM( str r6, [r0, r3] )
|
||||
THUMB( add r0, r0, r3 )
|
||||
#ifdef __ARMEB__
|
||||
THUMB( mov r6, r6, ror #16 ) @ Convert word order for big-endian.
|
||||
#endif
|
||||
THUMB( strh r6, [r0], #2 ) @ For Thumb-2, store as two halfwords
|
||||
THUMB( mov r6, r6, lsr #16 ) @ to be robust against misaligned r3.
|
||||
THUMB( strh r6, [r0] )
|
||||
b 2b
|
||||
b __do_fixup_smp_on_up
|
||||
ENDPROC(__fixup_smp)
|
||||
|
||||
.align
|
||||
@ -440,7 +430,31 @@ smp_on_up:
|
||||
ALT_SMP(.long 1)
|
||||
ALT_UP(.long 0)
|
||||
.popsection
|
||||
|
||||
#endif
|
||||
|
||||
.text
|
||||
__do_fixup_smp_on_up:
|
||||
cmp r4, r5
|
||||
movhs pc, lr
|
||||
ldmia r4!, {r0, r6}
|
||||
ARM( str r6, [r0, r3] )
|
||||
THUMB( add r0, r0, r3 )
|
||||
#ifdef __ARMEB__
|
||||
THUMB( mov r6, r6, ror #16 ) @ Convert word order for big-endian.
|
||||
#endif
|
||||
THUMB( strh r6, [r0], #2 ) @ For Thumb-2, store as two halfwords
|
||||
THUMB( mov r6, r6, lsr #16 ) @ to be robust against misaligned r3.
|
||||
THUMB( strh r6, [r0] )
|
||||
b __do_fixup_smp_on_up
|
||||
ENDPROC(__do_fixup_smp_on_up)
|
||||
|
||||
ENTRY(fixup_smp)
|
||||
stmfd sp!, {r4 - r6, lr}
|
||||
mov r4, r0
|
||||
add r5, r0, r1
|
||||
mov r3, #0
|
||||
bl __do_fixup_smp_on_up
|
||||
ldmfd sp!, {r4 - r6, pc}
|
||||
ENDPROC(fixup_smp)
|
||||
|
||||
#include "head-common.S"
|
||||
|
@ -137,11 +137,10 @@ static u8 get_debug_arch(void)
|
||||
u32 didr;
|
||||
|
||||
/* Do we implement the extended CPUID interface? */
|
||||
if (((read_cpuid_id() >> 16) & 0xf) != 0xf) {
|
||||
pr_warning("CPUID feature registers not supported. "
|
||||
"Assuming v6 debug is present.\n");
|
||||
if (WARN_ONCE((((read_cpuid_id() >> 16) & 0xf) != 0xf),
|
||||
"CPUID feature registers not supported. "
|
||||
"Assuming v6 debug is present.\n"))
|
||||
return ARM_DEBUG_ARCH_V6;
|
||||
}
|
||||
|
||||
ARM_DBG_READ(c0, 0, didr);
|
||||
return (didr >> 16) & 0xf;
|
||||
@ -152,6 +151,12 @@ u8 arch_get_debug_arch(void)
|
||||
return debug_arch;
|
||||
}
|
||||
|
||||
static int debug_arch_supported(void)
|
||||
{
|
||||
u8 arch = get_debug_arch();
|
||||
return arch >= ARM_DEBUG_ARCH_V6 && arch <= ARM_DEBUG_ARCH_V7_ECP14;
|
||||
}
|
||||
|
||||
/* Determine number of BRP register available. */
|
||||
static int get_num_brp_resources(void)
|
||||
{
|
||||
@ -268,6 +273,9 @@ out:
|
||||
|
||||
int hw_breakpoint_slots(int type)
|
||||
{
|
||||
if (!debug_arch_supported())
|
||||
return 0;
|
||||
|
||||
/*
|
||||
* We can be called early, so don't rely on
|
||||
* our static variables being initialised.
|
||||
@ -834,11 +842,11 @@ static void reset_ctrl_regs(void *unused)
|
||||
|
||||
/*
|
||||
* v7 debug contains save and restore registers so that debug state
|
||||
* can be maintained across low-power modes without leaving
|
||||
* the debug logic powered up. It is IMPLEMENTATION DEFINED whether
|
||||
* we can write to the debug registers out of reset, so we must
|
||||
* unlock the OS Lock Access Register to avoid taking undefined
|
||||
* instruction exceptions later on.
|
||||
* can be maintained across low-power modes without leaving the debug
|
||||
* logic powered up. It is IMPLEMENTATION DEFINED whether we can access
|
||||
* the debug registers out of reset, so we must unlock the OS Lock
|
||||
* Access Register to avoid taking undefined instruction exceptions
|
||||
* later on.
|
||||
*/
|
||||
if (debug_arch >= ARM_DEBUG_ARCH_V7_ECP14) {
|
||||
/*
|
||||
@ -882,7 +890,7 @@ static int __init arch_hw_breakpoint_init(void)
|
||||
|
||||
debug_arch = get_debug_arch();
|
||||
|
||||
if (debug_arch > ARM_DEBUG_ARCH_V7_ECP14) {
|
||||
if (!debug_arch_supported()) {
|
||||
pr_info("debug architecture 0x%x unsupported.\n", debug_arch);
|
||||
return 0;
|
||||
}
|
||||
@ -899,18 +907,18 @@ static int __init arch_hw_breakpoint_init(void)
|
||||
pr_info("%d breakpoint(s) reserved for watchpoint "
|
||||
"single-step.\n", core_num_reserved_brps);
|
||||
|
||||
/*
|
||||
* Reset the breakpoint resources. We assume that a halting
|
||||
* debugger will leave the world in a nice state for us.
|
||||
*/
|
||||
on_each_cpu(reset_ctrl_regs, NULL, 1);
|
||||
|
||||
ARM_DBG_READ(c1, 0, dscr);
|
||||
if (dscr & ARM_DSCR_HDBGEN) {
|
||||
max_watchpoint_len = 4;
|
||||
pr_warning("halting debug mode enabled. Assuming maximum "
|
||||
"watchpoint size of 4 bytes.");
|
||||
"watchpoint size of %u bytes.", max_watchpoint_len);
|
||||
} else {
|
||||
/*
|
||||
* Reset the breakpoint resources. We assume that a halting
|
||||
* debugger will leave the world in a nice state for us.
|
||||
*/
|
||||
smp_call_function(reset_ctrl_regs, NULL, 1);
|
||||
reset_ctrl_regs(NULL);
|
||||
|
||||
/* Work out the maximum supported watchpoint length. */
|
||||
max_watchpoint_len = get_max_wp_len();
|
||||
pr_info("maximum watchpoint size is %u bytes.\n",
|
||||
|
@ -22,6 +22,7 @@
|
||||
|
||||
#include <asm/pgtable.h>
|
||||
#include <asm/sections.h>
|
||||
#include <asm/smp_plat.h>
|
||||
#include <asm/unwind.h>
|
||||
|
||||
#ifdef CONFIG_XIP_KERNEL
|
||||
@ -268,12 +269,28 @@ struct mod_unwind_map {
|
||||
const Elf_Shdr *txt_sec;
|
||||
};
|
||||
|
||||
static const Elf_Shdr *find_mod_section(const Elf32_Ehdr *hdr,
|
||||
const Elf_Shdr *sechdrs, const char *name)
|
||||
{
|
||||
const Elf_Shdr *s, *se;
|
||||
const char *secstrs = (void *)hdr + sechdrs[hdr->e_shstrndx].sh_offset;
|
||||
|
||||
for (s = sechdrs, se = sechdrs + hdr->e_shnum; s < se; s++)
|
||||
if (strcmp(name, secstrs + s->sh_name) == 0)
|
||||
return s;
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
extern void fixup_smp(const void *, unsigned long);
|
||||
|
||||
int module_finalize(const Elf32_Ehdr *hdr, const Elf_Shdr *sechdrs,
|
||||
struct module *mod)
|
||||
{
|
||||
const Elf_Shdr * __maybe_unused s = NULL;
|
||||
#ifdef CONFIG_ARM_UNWIND
|
||||
const char *secstrs = (void *)hdr + sechdrs[hdr->e_shstrndx].sh_offset;
|
||||
const Elf_Shdr *s, *sechdrs_end = sechdrs + hdr->e_shnum;
|
||||
const Elf_Shdr *sechdrs_end = sechdrs + hdr->e_shnum;
|
||||
struct mod_unwind_map maps[ARM_SEC_MAX];
|
||||
int i;
|
||||
|
||||
@ -315,6 +332,9 @@ int module_finalize(const Elf32_Ehdr *hdr, const Elf_Shdr *sechdrs,
|
||||
maps[i].txt_sec->sh_addr,
|
||||
maps[i].txt_sec->sh_size);
|
||||
#endif
|
||||
s = find_mod_section(hdr, sechdrs, ".alt.smp.init");
|
||||
if (s && !is_smp())
|
||||
fixup_smp((void *)s->sh_addr, s->sh_size);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -700,7 +700,7 @@ user_backtrace(struct frame_tail __user *tail,
|
||||
* Frame pointers should strictly progress back up the stack
|
||||
* (towards higher addresses).
|
||||
*/
|
||||
if (tail >= buftail.fp)
|
||||
if (tail + 1 >= buftail.fp)
|
||||
return NULL;
|
||||
|
||||
return buftail.fp - 1;
|
||||
|
@ -50,7 +50,7 @@ static void __init colibri_mmc_init(void)
|
||||
GPIO0_COLIBRI_PXA270_SD_DETECT;
|
||||
if (machine_is_colibri300()) /* PXA300 Colibri */
|
||||
colibri_mci_platform_data.gpio_card_detect =
|
||||
GPIO39_COLIBRI_PXA300_SD_DETECT;
|
||||
GPIO13_COLIBRI_PXA300_SD_DETECT;
|
||||
else /* PXA320 Colibri */
|
||||
colibri_mci_platform_data.gpio_card_detect =
|
||||
GPIO28_COLIBRI_PXA320_SD_DETECT;
|
||||
|
@ -41,7 +41,7 @@ static mfp_cfg_t colibri_pxa300_evalboard_pin_config[] __initdata = {
|
||||
GPIO4_MMC1_DAT1,
|
||||
GPIO5_MMC1_DAT2,
|
||||
GPIO6_MMC1_DAT3,
|
||||
GPIO39_GPIO, /* SD detect */
|
||||
GPIO13_GPIO, /* GPIO13_COLIBRI_PXA300_SD_DETECT */
|
||||
|
||||
/* UHC */
|
||||
GPIO0_2_USBH_PEN,
|
||||
|
@ -60,7 +60,7 @@ static inline void colibri_pxa3xx_init_nand(void) {}
|
||||
#define GPIO113_COLIBRI_PXA270_TS_IRQ 113
|
||||
|
||||
/* GPIO definitions for Colibri PXA300/310 */
|
||||
#define GPIO39_COLIBRI_PXA300_SD_DETECT 39
|
||||
#define GPIO13_COLIBRI_PXA300_SD_DETECT 13
|
||||
|
||||
/* GPIO definitions for Colibri PXA320 */
|
||||
#define GPIO28_COLIBRI_PXA320_SD_DETECT 28
|
||||
|
@ -323,7 +323,7 @@ static struct platform_pwm_backlight_data palm27x_backlight_data = {
|
||||
.pwm_id = 0,
|
||||
.max_brightness = 0xfe,
|
||||
.dft_brightness = 0x7e,
|
||||
.pwm_period_ns = 3500,
|
||||
.pwm_period_ns = 3500 * 1024,
|
||||
.init = palm27x_backlight_init,
|
||||
.notify = palm27x_backlight_notify,
|
||||
.exit = palm27x_backlight_exit,
|
||||
|
@ -33,7 +33,7 @@ int pxa_pm_enter(suspend_state_t state)
|
||||
#endif
|
||||
|
||||
/* skip registers saving for standby */
|
||||
if (state != PM_SUSPEND_STANDBY) {
|
||||
if (state != PM_SUSPEND_STANDBY && pxa_cpu_pm_fns->save) {
|
||||
pxa_cpu_pm_fns->save(sleep_save);
|
||||
/* before sleeping, calculate and save a checksum */
|
||||
for (i = 0; i < pxa_cpu_pm_fns->save_count - 1; i++)
|
||||
@ -44,7 +44,7 @@ int pxa_pm_enter(suspend_state_t state)
|
||||
pxa_cpu_pm_fns->enter(state);
|
||||
cpu_init();
|
||||
|
||||
if (state != PM_SUSPEND_STANDBY) {
|
||||
if (state != PM_SUSPEND_STANDBY && pxa_cpu_pm_fns->restore) {
|
||||
/* after sleeping, validate the checksum */
|
||||
for (i = 0; i < pxa_cpu_pm_fns->save_count - 1; i++)
|
||||
checksum += sleep_save[i];
|
||||
|
@ -122,6 +122,7 @@ config MACH_SMDKV310
|
||||
select S3C_DEV_HSMMC2
|
||||
select S3C_DEV_HSMMC3
|
||||
select S5PV310_DEV_PD
|
||||
select S5PV310_DEV_SYSMMU
|
||||
select S5PV310_SETUP_I2C1
|
||||
select S5PV310_SETUP_SDHCI
|
||||
help
|
||||
|
@ -124,8 +124,6 @@
|
||||
#define S5PV310_PA_SYSMMU_TV 0x12E20000
|
||||
#define S5PV310_PA_SYSMMU_MFC_L 0x13620000
|
||||
#define S5PV310_PA_SYSMMU_MFC_R 0x13630000
|
||||
#define S5PV310_SYSMMU_TOTAL_IPNUM 16
|
||||
#define S5P_SYSMMU_TOTAL_IPNUM S5PV310_SYSMMU_TOTAL_IPNUM
|
||||
|
||||
/* compatibiltiy defines. */
|
||||
#define S3C_PA_UART S5PV310_PA_UART
|
||||
|
@ -13,6 +13,9 @@
|
||||
#ifndef __ASM_ARM_ARCH_SYSMMU_H
|
||||
#define __ASM_ARM_ARCH_SYSMMU_H __FILE__
|
||||
|
||||
#define S5PV310_SYSMMU_TOTAL_IPNUM 16
|
||||
#define S5P_SYSMMU_TOTAL_IPNUM S5PV310_SYSMMU_TOTAL_IPNUM
|
||||
|
||||
enum s5pv310_sysmmu_ips {
|
||||
SYSMMU_MDMA,
|
||||
SYSMMU_SSS,
|
||||
@ -32,7 +35,7 @@ enum s5pv310_sysmmu_ips {
|
||||
SYSMMU_MFC_R,
|
||||
};
|
||||
|
||||
static char *sysmmu_ips_name[S5P_SYSMMU_TOTAL_IPNUM] = {
|
||||
static char *sysmmu_ips_name[S5PV310_SYSMMU_TOTAL_IPNUM] = {
|
||||
"SYSMMU_MDMA" ,
|
||||
"SYSMMU_SSS" ,
|
||||
"SYSMMU_FIMC0" ,
|
||||
|
@ -241,6 +241,9 @@ static struct locomo_platform_data locomo_info = {
|
||||
struct platform_device collie_locomo_device = {
|
||||
.name = "locomo",
|
||||
.id = 0,
|
||||
.dev = {
|
||||
.platform_data = &locomo_info,
|
||||
},
|
||||
.num_resources = ARRAY_SIZE(locomo_resources),
|
||||
.resource = locomo_resources,
|
||||
};
|
||||
|
@ -405,7 +405,7 @@ config CPU_V6
|
||||
config CPU_32v6K
|
||||
bool "Support ARM V6K processor extensions" if !SMP
|
||||
depends on CPU_V6 || CPU_V7
|
||||
default y if SMP && !(ARCH_MX3 || ARCH_OMAP2)
|
||||
default y if SMP
|
||||
help
|
||||
Say Y here if your ARMv6 processor supports the 'K' extension.
|
||||
This enables the kernel to use some instructions not present
|
||||
@ -416,7 +416,7 @@ config CPU_32v6K
|
||||
# ARMv7
|
||||
config CPU_V7
|
||||
bool "Support ARM V7 processor" if ARCH_INTEGRATOR || MACH_REALVIEW_EB || MACH_REALVIEW_PBX
|
||||
select CPU_32v6K if !ARCH_OMAP2
|
||||
select CPU_32v6K
|
||||
select CPU_32v7
|
||||
select CPU_ABRT_EV7
|
||||
select CPU_PABRT_V7
|
||||
@ -644,7 +644,7 @@ config ARM_THUMBEE
|
||||
|
||||
config SWP_EMULATE
|
||||
bool "Emulate SWP/SWPB instructions"
|
||||
depends on CPU_V7 && !CPU_V6
|
||||
depends on !CPU_USE_DOMAINS && CPU_V7 && !CPU_V6
|
||||
select HAVE_PROC_CPU if PROC_FS
|
||||
default y if SMP
|
||||
help
|
||||
|
@ -10,8 +10,6 @@
|
||||
*/
|
||||
|
||||
#include <linux/cpumask.h>
|
||||
#include <linux/err.h>
|
||||
#include <linux/errno.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/mutex.h>
|
||||
#include <linux/oprofile.h>
|
||||
@ -46,6 +44,7 @@ char *op_name_from_perf_id(void)
|
||||
return NULL;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
static int report_trace(struct stackframe *frame, void *d)
|
||||
{
|
||||
@ -85,7 +84,7 @@ static struct frame_tail* user_backtrace(struct frame_tail *tail)
|
||||
|
||||
/* frame pointers should strictly progress back up the stack
|
||||
* (towards higher addresses) */
|
||||
if (tail >= buftail[0].fp)
|
||||
if (tail + 1 >= buftail[0].fp)
|
||||
return NULL;
|
||||
|
||||
return buftail[0].fp-1;
|
||||
@ -111,6 +110,7 @@ static void arm_backtrace(struct pt_regs * const regs, unsigned int depth)
|
||||
|
||||
int __init oprofile_arch_init(struct oprofile_operations *ops)
|
||||
{
|
||||
/* provide backtrace support also in timer mode: */
|
||||
ops->backtrace = arm_backtrace;
|
||||
|
||||
return oprofile_perf_init(ops);
|
||||
@ -120,11 +120,3 @@ void __exit oprofile_arch_exit(void)
|
||||
{
|
||||
oprofile_perf_exit();
|
||||
}
|
||||
#else
|
||||
int __init oprofile_arch_init(struct oprofile_operations *ops)
|
||||
{
|
||||
pr_info("oprofile: hardware counters not available\n");
|
||||
return -ENODEV;
|
||||
}
|
||||
void __exit oprofile_arch_exit(void) {}
|
||||
#endif /* CONFIG_HW_PERF_EVENTS */
|
||||
|
@ -139,10 +139,11 @@ static const unsigned long mfpr_edge[] = {
|
||||
#define mfp_configured(p) ((p)->config != -1)
|
||||
|
||||
/*
|
||||
* perform a read-back of any MFPR register to make sure the
|
||||
* perform a read-back of any valid MFPR register to make sure the
|
||||
* previous writings are finished
|
||||
*/
|
||||
#define mfpr_sync() (void)__raw_readl(mfpr_mmio_base + 0)
|
||||
static unsigned long mfpr_off_readback;
|
||||
#define mfpr_sync() (void)__raw_readl(mfpr_mmio_base + mfpr_off_readback)
|
||||
|
||||
static inline void __mfp_config_run(struct mfp_pin *p)
|
||||
{
|
||||
@ -248,6 +249,9 @@ void __init mfp_init_addr(struct mfp_addr_map *map)
|
||||
|
||||
spin_lock_irqsave(&mfp_spin_lock, flags);
|
||||
|
||||
/* mfp offset for readback */
|
||||
mfpr_off_readback = map[0].offset;
|
||||
|
||||
for (p = map; p->start != MFP_PIN_INVALID; p++) {
|
||||
offset = p->offset;
|
||||
i = p->start;
|
||||
|
@ -37,6 +37,14 @@ config S5P_GPIO_INT
|
||||
help
|
||||
Common code for the GPIO interrupts (other than external interrupts.)
|
||||
|
||||
comment "System MMU"
|
||||
|
||||
config S5P_SYSTEM_MMU
|
||||
bool "S5P SYSTEM MMU"
|
||||
depends on ARCH_S5PV310
|
||||
help
|
||||
Say Y here if you want to enable System MMU
|
||||
|
||||
config S5P_DEV_FIMC0
|
||||
bool
|
||||
help
|
||||
@ -66,19 +74,3 @@ config S5P_DEV_CSIS1
|
||||
bool
|
||||
help
|
||||
Compile in platform device definitions for MIPI-CSIS channel 1
|
||||
|
||||
menuconfig S5P_SYSMMU
|
||||
bool "SYSMMU support"
|
||||
depends on ARCH_S5PV310
|
||||
help
|
||||
This is a System MMU driver for Samsung ARM based Soc.
|
||||
|
||||
if S5P_SYSMMU
|
||||
|
||||
config S5P_SYSMMU_DEBUG
|
||||
bool "Enables debug messages"
|
||||
depends on S5P_SYSMMU
|
||||
help
|
||||
This enables SYSMMU driver debug massages.
|
||||
|
||||
endif
|
||||
|
@ -19,6 +19,7 @@ obj-y += clock.o
|
||||
obj-y += irq.o
|
||||
obj-$(CONFIG_S5P_EXT_INT) += irq-eint.o
|
||||
obj-$(CONFIG_S5P_GPIO_INT) += irq-gpioint.o
|
||||
obj-$(CONFIG_S5P_SYSTEM_MMU) += sysmmu.o
|
||||
obj-$(CONFIG_PM) += pm.o
|
||||
obj-$(CONFIG_PM) += irq-pm.o
|
||||
|
||||
@ -30,4 +31,3 @@ obj-$(CONFIG_S5P_DEV_FIMC2) += dev-fimc2.o
|
||||
obj-$(CONFIG_S5P_DEV_ONENAND) += dev-onenand.o
|
||||
obj-$(CONFIG_S5P_DEV_CSIS0) += dev-csis0.o
|
||||
obj-$(CONFIG_S5P_DEV_CSIS1) += dev-csis1.o
|
||||
obj-$(CONFIG_S5P_SYSMMU) += sysmmu.o
|
||||
|
@ -1,23 +0,0 @@
|
||||
/* linux/arch/arm/plat-s5p/include/plat/sysmmu.h
|
||||
*
|
||||
* Copyright (c) 2010 Samsung Electronics Co., Ltd.
|
||||
* http://www.samsung.com/
|
||||
*
|
||||
* Samsung sysmmu driver
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License version 2 as
|
||||
* published by the Free Software Foundation.
|
||||
*/
|
||||
|
||||
#ifndef __ASM_PLAT_S5P_SYSMMU_H
|
||||
#define __ASM_PLAT_S5P_SYSMMU_H __FILE__
|
||||
|
||||
/* debug macro */
|
||||
#ifdef CONFIG_S5P_SYSMMU_DEBUG
|
||||
#define sysmmu_debug(fmt, arg...) printk(KERN_INFO "[%s] " fmt, __func__, ## arg)
|
||||
#else
|
||||
#define sysmmu_debug(fmt, arg...) do { } while (0)
|
||||
#endif
|
||||
|
||||
#endif /* __ASM_PLAT_S5P_SYSMMU_H */
|
@ -16,8 +16,6 @@
|
||||
#include <mach/regs-sysmmu.h>
|
||||
#include <mach/sysmmu.h>
|
||||
|
||||
#include <plat/sysmmu.h>
|
||||
|
||||
struct sysmmu_controller s5p_sysmmu_cntlrs[S5P_SYSMMU_TOTAL_IPNUM];
|
||||
|
||||
void s5p_sysmmu_register(struct sysmmu_controller *sysmmuconp)
|
||||
@ -123,7 +121,7 @@ static int s5p_sysmmu_set_tablebase(sysmmu_ips ips)
|
||||
: "=r" (pg) : : "cc"); \
|
||||
pg &= ~0x3fff;
|
||||
|
||||
sysmmu_debug("CP15 TTBR0 : 0x%x\n", pg);
|
||||
printk(KERN_INFO "%s: CP15 TTBR0 : 0x%x\n", __func__, pg);
|
||||
|
||||
/* Set sysmmu page table base address */
|
||||
__raw_writel(pg, sysmmuconp->regs + S5P_PT_BASE_ADDR);
|
||||
|
@ -17,6 +17,8 @@
|
||||
|
||||
#include <linux/irq.h>
|
||||
|
||||
struct sys_device;
|
||||
|
||||
#ifdef CONFIG_PM
|
||||
|
||||
extern __init int s3c_pm_init(void);
|
||||
|
@ -10,6 +10,7 @@
|
||||
#define __BFIN_ASM_SERIAL_H__
|
||||
|
||||
#include <linux/serial_core.h>
|
||||
#include <linux/spinlock.h>
|
||||
#include <mach/anomaly.h>
|
||||
#include <mach/bfin_serial.h>
|
||||
|
||||
@ -41,6 +42,7 @@ struct bfin_serial_port {
|
||||
struct circ_buf rx_dma_buf;
|
||||
struct timer_list rx_dma_timer;
|
||||
int rx_dma_nrows;
|
||||
spinlock_t rx_lock;
|
||||
unsigned int tx_dma_channel;
|
||||
unsigned int rx_dma_channel;
|
||||
struct work_struct tx_dma_workqueue;
|
||||
|
@ -99,14 +99,12 @@ static inline int strcmp(const char *cs, const char *ct)
|
||||
: "+a" (cs), "+a" (ct), "=d" (res));
|
||||
return res;
|
||||
}
|
||||
#endif /* CONFIG_COLDFIRE */
|
||||
|
||||
#define __HAVE_ARCH_MEMMOVE
|
||||
extern void *memmove(void *, const void *, __kernel_size_t);
|
||||
|
||||
#define __HAVE_ARCH_MEMCMP
|
||||
extern int memcmp(const void *, const void *, __kernel_size_t);
|
||||
#define memcmp(d, s, n) __builtin_memcmp(d, s, n)
|
||||
#endif /* CONFIG_COLDFIRE */
|
||||
|
||||
#define __HAVE_ARCH_MEMSET
|
||||
extern void *memset(void *, int, __kernel_size_t);
|
||||
|
@ -243,14 +243,3 @@ void *memmove(void *dest, const void *src, size_t n)
|
||||
return xdest;
|
||||
}
|
||||
EXPORT_SYMBOL(memmove);
|
||||
|
||||
int memcmp(const void *cs, const void *ct, size_t count)
|
||||
{
|
||||
const unsigned char *su1, *su2;
|
||||
|
||||
for (su1 = cs, su2 = ct; count > 0; ++su1, ++su2, count--)
|
||||
if (*su1 != *su2)
|
||||
return *su1 < *su2 ? -1 : +1;
|
||||
return 0;
|
||||
}
|
||||
EXPORT_SYMBOL(memcmp);
|
||||
|
@ -141,6 +141,12 @@ SECTIONS {
|
||||
*(__param)
|
||||
__stop___param = .;
|
||||
|
||||
/* Built-in module versions */
|
||||
. = ALIGN(4) ;
|
||||
__start___modver = .;
|
||||
*(__modver)
|
||||
__stop___modver = .;
|
||||
|
||||
. = ALIGN(4) ;
|
||||
_etext = . ;
|
||||
} > TEXT
|
||||
|
@ -4,4 +4,4 @@
|
||||
|
||||
lib-y := ashldi3.o ashrdi3.o lshrdi3.o \
|
||||
muldi3.o mulsi3.o divsi3.o udivsi3.o modsi3.o umodsi3.o \
|
||||
checksum.o memcpy.o memset.o delay.o
|
||||
checksum.o memcpy.o memmove.o memset.o delay.o
|
||||
|
105
arch/m68knommu/lib/memmove.c
Normal file
105
arch/m68knommu/lib/memmove.c
Normal file
@ -0,0 +1,105 @@
|
||||
/*
|
||||
* This file is subject to the terms and conditions of the GNU General Public
|
||||
* License. See the file COPYING in the main directory of this archive
|
||||
* for more details.
|
||||
*/
|
||||
|
||||
#define __IN_STRING_C
|
||||
|
||||
#include <linux/module.h>
|
||||
#include <linux/string.h>
|
||||
|
||||
void *memmove(void *dest, const void *src, size_t n)
|
||||
{
|
||||
void *xdest = dest;
|
||||
size_t temp;
|
||||
|
||||
if (!n)
|
||||
return xdest;
|
||||
|
||||
if (dest < src) {
|
||||
if ((long)dest & 1) {
|
||||
char *cdest = dest;
|
||||
const char *csrc = src;
|
||||
*cdest++ = *csrc++;
|
||||
dest = cdest;
|
||||
src = csrc;
|
||||
n--;
|
||||
}
|
||||
if (n > 2 && (long)dest & 2) {
|
||||
short *sdest = dest;
|
||||
const short *ssrc = src;
|
||||
*sdest++ = *ssrc++;
|
||||
dest = sdest;
|
||||
src = ssrc;
|
||||
n -= 2;
|
||||
}
|
||||
temp = n >> 2;
|
||||
if (temp) {
|
||||
long *ldest = dest;
|
||||
const long *lsrc = src;
|
||||
temp--;
|
||||
do
|
||||
*ldest++ = *lsrc++;
|
||||
while (temp--);
|
||||
dest = ldest;
|
||||
src = lsrc;
|
||||
}
|
||||
if (n & 2) {
|
||||
short *sdest = dest;
|
||||
const short *ssrc = src;
|
||||
*sdest++ = *ssrc++;
|
||||
dest = sdest;
|
||||
src = ssrc;
|
||||
}
|
||||
if (n & 1) {
|
||||
char *cdest = dest;
|
||||
const char *csrc = src;
|
||||
*cdest = *csrc;
|
||||
}
|
||||
} else {
|
||||
dest = (char *)dest + n;
|
||||
src = (const char *)src + n;
|
||||
if ((long)dest & 1) {
|
||||
char *cdest = dest;
|
||||
const char *csrc = src;
|
||||
*--cdest = *--csrc;
|
||||
dest = cdest;
|
||||
src = csrc;
|
||||
n--;
|
||||
}
|
||||
if (n > 2 && (long)dest & 2) {
|
||||
short *sdest = dest;
|
||||
const short *ssrc = src;
|
||||
*--sdest = *--ssrc;
|
||||
dest = sdest;
|
||||
src = ssrc;
|
||||
n -= 2;
|
||||
}
|
||||
temp = n >> 2;
|
||||
if (temp) {
|
||||
long *ldest = dest;
|
||||
const long *lsrc = src;
|
||||
temp--;
|
||||
do
|
||||
*--ldest = *--lsrc;
|
||||
while (temp--);
|
||||
dest = ldest;
|
||||
src = lsrc;
|
||||
}
|
||||
if (n & 2) {
|
||||
short *sdest = dest;
|
||||
const short *ssrc = src;
|
||||
*--sdest = *--ssrc;
|
||||
dest = sdest;
|
||||
src = ssrc;
|
||||
}
|
||||
if (n & 1) {
|
||||
char *cdest = dest;
|
||||
const char *csrc = src;
|
||||
*--cdest = *--csrc;
|
||||
}
|
||||
}
|
||||
return xdest;
|
||||
}
|
||||
EXPORT_SYMBOL(memmove);
|
@ -50,8 +50,10 @@ static int __init mcf_intc2_init(void)
|
||||
int irq;
|
||||
|
||||
/* GPIO interrupt sources */
|
||||
for (irq = MCFINTC2_GPIOIRQ0; (irq <= MCFINTC2_GPIOIRQ7); irq++)
|
||||
for (irq = MCFINTC2_GPIOIRQ0; (irq <= MCFINTC2_GPIOIRQ7); irq++) {
|
||||
irq_desc[irq].chip = &intc2_irq_gpio_chip;
|
||||
set_irq_handler(irq, handle_edge_irq);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
@ -108,7 +108,6 @@ Luser_return:
|
||||
movel %d1,%a2
|
||||
1:
|
||||
move %a2@(TI_FLAGS),%d1 /* thread_info->flags */
|
||||
andl #_TIF_WORK_MASK,%d1
|
||||
jne Lwork_to_do
|
||||
RESTORE_ALL
|
||||
|
||||
|
@ -210,7 +210,7 @@ void
|
||||
cpm_install_handler(int vec, void (*handler)(), void *dev_id)
|
||||
{
|
||||
|
||||
request_irq(vec, handler, IRQ_FLG_LOCK, "timer", dev_id);
|
||||
request_irq(vec, handler, 0, "timer", dev_id);
|
||||
|
||||
/* if (cpm_vecs[vec].handler != 0) */
|
||||
/* printk(KERN_INFO "CPM interrupt %x replacing %x\n", */
|
||||
|
@ -75,7 +75,7 @@ void hw_timer_init(void)
|
||||
/* Set compare register 32Khz / 32 / 10 = 100 */
|
||||
TCMP = 10;
|
||||
|
||||
request_irq(IRQ_MACHSPEC | 1, timer_routine, IRQ_FLG_LOCK, "timer", NULL);
|
||||
request_irq(IRQ_MACHSPEC | 1, timer_routine, 0, "timer", NULL);
|
||||
#endif
|
||||
|
||||
/* General purpose quicc timers: MC68360UM p7-20 */
|
||||
|
@ -104,7 +104,6 @@ Luser_return:
|
||||
movel %d1,%a2
|
||||
1:
|
||||
move %a2@(TI_FLAGS),%d1 /* thread_info->flags */
|
||||
andl #_TIF_WORK_MASK,%d1
|
||||
jne Lwork_to_do
|
||||
RESTORE_ALL
|
||||
|
||||
|
@ -132,8 +132,8 @@ void init_IRQ(void)
|
||||
pquicc->intr_cimr = 0x00000000;
|
||||
|
||||
for (i = 0; (i < NR_IRQS); i++) {
|
||||
set_irq_chip(irq, &intc_irq_chip);
|
||||
set_irq_handler(irq, handle_level_irq);
|
||||
set_irq_chip(i, &intc_irq_chip);
|
||||
set_irq_handler(i, handle_level_irq);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -138,7 +138,6 @@ Luser_return:
|
||||
andl #-THREAD_SIZE,%d1 /* at base of kernel stack */
|
||||
movel %d1,%a0
|
||||
movel %a0@(TI_FLAGS),%d1 /* get thread_info->flags */
|
||||
andl #0xefff,%d1
|
||||
jne Lwork_to_do /* still work to do */
|
||||
|
||||
Lreturn:
|
||||
|
@ -12,7 +12,7 @@
|
||||
#include <linux/types.h>
|
||||
#include <asm/registers.h>
|
||||
|
||||
#ifdef CONFIG_XILINX_MICROBLAZE0_USE_MSR_INSTR
|
||||
#if CONFIG_XILINX_MICROBLAZE0_USE_MSR_INSTR
|
||||
|
||||
static inline unsigned long arch_local_irq_save(void)
|
||||
{
|
||||
|
@ -411,20 +411,19 @@ static inline pte_t pte_modify(pte_t pte, pgprot_t newprot)
|
||||
static inline unsigned long pte_update(pte_t *p, unsigned long clr,
|
||||
unsigned long set)
|
||||
{
|
||||
unsigned long old, tmp, msr;
|
||||
unsigned long flags, old, tmp;
|
||||
|
||||
__asm__ __volatile__("\
|
||||
msrclr %2, 0x2\n\
|
||||
nop\n\
|
||||
lw %0, %4, r0\n\
|
||||
andn %1, %0, %5\n\
|
||||
or %1, %1, %6\n\
|
||||
sw %1, %4, r0\n\
|
||||
mts rmsr, %2\n\
|
||||
nop"
|
||||
: "=&r" (old), "=&r" (tmp), "=&r" (msr), "=m" (*p)
|
||||
: "r" ((unsigned long)(p + 1) - 4), "r" (clr), "r" (set), "m" (*p)
|
||||
: "cc");
|
||||
raw_local_irq_save(flags);
|
||||
|
||||
__asm__ __volatile__( "lw %0, %2, r0 \n"
|
||||
"andn %1, %0, %3 \n"
|
||||
"or %1, %1, %4 \n"
|
||||
"sw %1, %2, r0 \n"
|
||||
: "=&r" (old), "=&r" (tmp)
|
||||
: "r" ((unsigned long)(p + 1) - 4), "r" (clr), "r" (set)
|
||||
: "cc");
|
||||
|
||||
raw_local_irq_restore(flags);
|
||||
|
||||
return old;
|
||||
}
|
||||
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user