Merge branch 'linus' into tracing/urgent
This commit is contained in:
Коммит
5177dc3f2b
|
@ -42,14 +42,8 @@ IRQ.txt
|
|||
- description of what an IRQ is.
|
||||
ManagementStyle
|
||||
- how to (attempt to) manage kernel hackers.
|
||||
MSI-HOWTO.txt
|
||||
- the Message Signaled Interrupts (MSI) Driver Guide HOWTO and FAQ.
|
||||
RCU/
|
||||
- directory with info on RCU (read-copy update).
|
||||
README.DAC960
|
||||
- info on Mylex DAC960/DAC1100 PCI RAID Controller Driver for Linux.
|
||||
README.cycladesZ
|
||||
- info on Cyclades-Z firmware loading.
|
||||
SAK.txt
|
||||
- info on Secure Attention Keys.
|
||||
SM501.txt
|
||||
|
@ -86,20 +80,16 @@ blackfin/
|
|||
- directory with documentation for the Blackfin arch.
|
||||
block/
|
||||
- info on the Block I/O (BIO) layer.
|
||||
blockdev/
|
||||
- info on block devices & drivers
|
||||
cachetlb.txt
|
||||
- describes the cache/TLB flushing interfaces Linux uses.
|
||||
cciss.txt
|
||||
- info, major/minor #'s for Compaq's SMART Array Controllers.
|
||||
cdrom/
|
||||
- directory with information on the CD-ROM drivers that Linux has.
|
||||
computone.txt
|
||||
- info on Computone Intelliport II/Plus Multiport Serial Driver.
|
||||
connector/
|
||||
- docs on the netlink based userspace<->kernel space communication mod.
|
||||
console/
|
||||
- documentation on Linux console drivers.
|
||||
cpqarray.txt
|
||||
- info on using Compaq's SMART2 Intelligent Disk Array Controllers.
|
||||
cpu-freq/
|
||||
- info on CPU frequency and voltage scaling.
|
||||
cpu-hotplug.txt
|
||||
|
@ -126,8 +116,6 @@ device-mapper/
|
|||
- directory with info on Device Mapper.
|
||||
devices.txt
|
||||
- plain ASCII listing of all the nodes in /dev/ with major minor #'s.
|
||||
digiepca.txt
|
||||
- info on Digi Intl. {PC,PCI,EISA}Xx and Xem series cards.
|
||||
dontdiff
|
||||
- file containing a list of files that should never be diff'ed.
|
||||
driver-model/
|
||||
|
@ -152,14 +140,10 @@ filesystems/
|
|||
- info on the vfs and the various filesystems that Linux supports.
|
||||
firmware_class/
|
||||
- request_firmware() hotplug interface info.
|
||||
floppy.txt
|
||||
- notes and driver options for the floppy disk driver.
|
||||
frv/
|
||||
- Fujitsu FR-V Linux documentation.
|
||||
gpio.txt
|
||||
- overview of GPIO (General Purpose Input/Output) access conventions.
|
||||
hayes-esp.txt
|
||||
- info on using the Hayes ESP serial driver.
|
||||
highuid.txt
|
||||
- notes on the change from 16 bit to 32 bit user/group IDs.
|
||||
timers/
|
||||
|
@ -186,8 +170,6 @@ io_ordering.txt
|
|||
- info on ordering I/O writes to memory-mapped addresses.
|
||||
ioctl/
|
||||
- directory with documents describing various IOCTL calls.
|
||||
ioctl-number.txt
|
||||
- how to implement and register device/driver ioctl calls.
|
||||
iostats.txt
|
||||
- info on I/O statistics Linux kernel provides.
|
||||
irqflags-tracing.txt
|
||||
|
@ -250,14 +232,10 @@ mips/
|
|||
- directory with info about Linux on MIPS architecture.
|
||||
mono.txt
|
||||
- how to execute Mono-based .NET binaries with the help of BINFMT_MISC.
|
||||
moxa-smartio
|
||||
- file with info on installing/using Moxa multiport serial driver.
|
||||
mutex-design.txt
|
||||
- info on the generic mutex subsystem.
|
||||
namespaces/
|
||||
- directory with various information about namespaces
|
||||
nbd.txt
|
||||
- info on a TCP implementation of a network block device.
|
||||
netlabel/
|
||||
- directory with information on the NetLabel subsystem.
|
||||
networking/
|
||||
|
@ -270,8 +248,6 @@ numastat.txt
|
|||
- info on how to read Numa policy hit/miss statistics in sysfs.
|
||||
oops-tracing.txt
|
||||
- how to decode those nasty internal kernel error dump messages.
|
||||
paride.txt
|
||||
- information about the parallel port IDE subsystem.
|
||||
parisc/
|
||||
- directory with info on using Linux on PA-RISC architecture.
|
||||
parport.txt
|
||||
|
@ -290,20 +266,16 @@ powerpc/
|
|||
- directory with info on using Linux with the PowerPC.
|
||||
preempt-locking.txt
|
||||
- info on locking under a preemptive kernel.
|
||||
printk-formats.txt
|
||||
- how to get printk format specifiers right
|
||||
prio_tree.txt
|
||||
- info on radix-priority-search-tree use for indexing vmas.
|
||||
ramdisk.txt
|
||||
- short guide on how to set up and use the RAM disk.
|
||||
rbtree.txt
|
||||
- info on what red-black trees are and what they are for.
|
||||
riscom8.txt
|
||||
- notes on using the RISCom/8 multi-port serial driver.
|
||||
robust-futex-ABI.txt
|
||||
- documentation of the robust futex ABI.
|
||||
robust-futexes.txt
|
||||
- a description of what robust futexes are.
|
||||
rocket.txt
|
||||
- info on the Comtrol RocketPort multiport serial driver.
|
||||
rt-mutex-design.txt
|
||||
- description of the RealTime mutex implementation design.
|
||||
rt-mutex.txt
|
||||
|
@ -332,8 +304,6 @@ sparc/
|
|||
- directory with info on using Linux on Sparc architecture.
|
||||
sparse.txt
|
||||
- info on how to obtain and use the sparse tool for typechecking.
|
||||
specialix.txt
|
||||
- info on hardware/driver for specialix IO8+ multiport serial card.
|
||||
spi/
|
||||
- overview of Linux kernel Serial Peripheral Interface (SPI) support.
|
||||
spinlocks.txt
|
||||
|
@ -342,14 +312,10 @@ stable_api_nonsense.txt
|
|||
- info on why the kernel does not have a stable in-kernel api or abi.
|
||||
stable_kernel_rules.txt
|
||||
- rules and procedures for the -stable kernel releases.
|
||||
stallion.txt
|
||||
- info on using the Stallion multiport serial driver.
|
||||
svga.txt
|
||||
- short guide on selecting video modes at boot via VGA BIOS.
|
||||
sysfs-rules.txt
|
||||
- How not to use sysfs.
|
||||
sx.txt
|
||||
- info on the Specialix SX/SI multiport serial driver.
|
||||
sysctl/
|
||||
- directory with info on the /proc/sys/* files.
|
||||
sysrq.txt
|
||||
|
@ -358,8 +324,6 @@ telephony/
|
|||
- directory with info on telephony (e.g. voice over IP) support.
|
||||
time_interpolators.txt
|
||||
- info on time interpolators.
|
||||
tty.txt
|
||||
- guide to the locking policies of the tty layer.
|
||||
uml/
|
||||
- directory with information about User Mode Linux.
|
||||
unicode.txt
|
||||
|
|
|
@ -0,0 +1,88 @@
|
|||
What: /sys/class/c2port/
|
||||
Date: October 2008
|
||||
Contact: Rodolfo Giometti <giometti@linux.it>
|
||||
Description:
|
||||
The /sys/class/c2port/ directory will contain files and
|
||||
directories that will provide a unified interface to
|
||||
the C2 port interface.
|
||||
|
||||
What: /sys/class/c2port/c2portX
|
||||
Date: October 2008
|
||||
Contact: Rodolfo Giometti <giometti@linux.it>
|
||||
Description:
|
||||
The /sys/class/c2port/c2portX/ directory is related to X-th
|
||||
C2 port into the system. Each directory will contain files to
|
||||
manage and control its C2 port.
|
||||
|
||||
What: /sys/class/c2port/c2portX/access
|
||||
Date: October 2008
|
||||
Contact: Rodolfo Giometti <giometti@linux.it>
|
||||
Description:
|
||||
The /sys/class/c2port/c2portX/access file enable the access
|
||||
to the C2 port from the system. No commands can be sent
|
||||
till this entry is set to 0.
|
||||
|
||||
What: /sys/class/c2port/c2portX/dev_id
|
||||
Date: October 2008
|
||||
Contact: Rodolfo Giometti <giometti@linux.it>
|
||||
Description:
|
||||
The /sys/class/c2port/c2portX/dev_id file show the device ID
|
||||
of the connected micro.
|
||||
|
||||
What: /sys/class/c2port/c2portX/flash_access
|
||||
Date: October 2008
|
||||
Contact: Rodolfo Giometti <giometti@linux.it>
|
||||
Description:
|
||||
The /sys/class/c2port/c2portX/flash_access file enable the
|
||||
access to the on-board flash of the connected micro.
|
||||
No commands can be sent till this entry is set to 0.
|
||||
|
||||
What: /sys/class/c2port/c2portX/flash_block_size
|
||||
Date: October 2008
|
||||
Contact: Rodolfo Giometti <giometti@linux.it>
|
||||
Description:
|
||||
The /sys/class/c2port/c2portX/flash_block_size file show
|
||||
the on-board flash block size of the connected micro.
|
||||
|
||||
What: /sys/class/c2port/c2portX/flash_blocks_num
|
||||
Date: October 2008
|
||||
Contact: Rodolfo Giometti <giometti@linux.it>
|
||||
Description:
|
||||
The /sys/class/c2port/c2portX/flash_blocks_num file show
|
||||
the on-board flash blocks number of the connected micro.
|
||||
|
||||
What: /sys/class/c2port/c2portX/flash_data
|
||||
Date: October 2008
|
||||
Contact: Rodolfo Giometti <giometti@linux.it>
|
||||
Description:
|
||||
The /sys/class/c2port/c2portX/flash_data file export
|
||||
the content of the on-board flash of the connected micro.
|
||||
|
||||
What: /sys/class/c2port/c2portX/flash_erase
|
||||
Date: October 2008
|
||||
Contact: Rodolfo Giometti <giometti@linux.it>
|
||||
Description:
|
||||
The /sys/class/c2port/c2portX/flash_erase file execute
|
||||
the "erase" command on the on-board flash of the connected
|
||||
micro.
|
||||
|
||||
What: /sys/class/c2port/c2portX/flash_erase
|
||||
Date: October 2008
|
||||
Contact: Rodolfo Giometti <giometti@linux.it>
|
||||
Description:
|
||||
The /sys/class/c2port/c2portX/flash_erase file show the
|
||||
on-board flash size of the connected micro.
|
||||
|
||||
What: /sys/class/c2port/c2portX/reset
|
||||
Date: October 2008
|
||||
Contact: Rodolfo Giometti <giometti@linux.it>
|
||||
Description:
|
||||
The /sys/class/c2port/c2portX/reset file execute a "reset"
|
||||
command on the connected micro.
|
||||
|
||||
What: /sys/class/c2port/c2portX/rev_id
|
||||
Date: October 2008
|
||||
Contact: Rodolfo Giometti <giometti@linux.it>
|
||||
Description:
|
||||
The /sys/class/c2port/c2portX/rev_id file show the revision ID
|
||||
of the connected micro.
|
|
@ -89,7 +89,7 @@ Description:
|
|||
|
||||
error - an interrupt that can't be accounted for above.
|
||||
|
||||
invalid: it's either a wakeup GPE or a GPE/Fixed Event that
|
||||
invalid: it's either a GPE or a Fixed Event that
|
||||
doesn't have an event handler.
|
||||
|
||||
disable: the GPE/Fixed Event is valid but disabled.
|
||||
|
@ -117,30 +117,30 @@ Description:
|
|||
and other user space applications so that the machine won't shutdown
|
||||
when pressing the power button.
|
||||
# cat ff_pwr_btn
|
||||
0
|
||||
0 enabled
|
||||
# press the power button for 3 times;
|
||||
# cat ff_pwr_btn
|
||||
3
|
||||
3 enabled
|
||||
# echo disable > ff_pwr_btn
|
||||
# cat ff_pwr_btn
|
||||
disable
|
||||
3 disabled
|
||||
# press the power button for 3 times;
|
||||
# cat ff_pwr_btn
|
||||
disable
|
||||
3 disabled
|
||||
# echo enable > ff_pwr_btn
|
||||
# cat ff_pwr_btn
|
||||
4
|
||||
4 enabled
|
||||
/*
|
||||
* this is because the status bit is set even if the enable bit is cleared,
|
||||
* and it triggers an ACPI fixed event when the enable bit is set again
|
||||
*/
|
||||
# press the power button for 3 times;
|
||||
# cat ff_pwr_btn
|
||||
7
|
||||
7 enabled
|
||||
# echo disable > ff_pwr_btn
|
||||
# press the power button for 3 times;
|
||||
# echo clear > ff_pwr_btn /* clear the status bit */
|
||||
# echo disable > ff_pwr_btn
|
||||
# cat ff_pwr_btn
|
||||
7
|
||||
7 enabled
|
||||
|
||||
|
|
|
@ -1,5 +1,7 @@
|
|||
00-INDEX
|
||||
- this file
|
||||
MSI-HOWTO.txt
|
||||
- the Message Signaled Interrupts (MSI) Driver Guide HOWTO and FAQ.
|
||||
PCI-DMA-mapping.txt
|
||||
- info for PCI drivers using DMA portably across all platforms
|
||||
PCIEBUS-HOWTO.txt
|
||||
|
|
|
@ -0,0 +1,148 @@
|
|||
ACPI Debug Output
|
||||
|
||||
|
||||
The ACPI CA, the Linux ACPI core, and some ACPI drivers can generate debug
|
||||
output. This document describes how to use this facility.
|
||||
|
||||
Compile-time configuration
|
||||
--------------------------
|
||||
|
||||
ACPI debug output is globally enabled by CONFIG_ACPI_DEBUG. If this config
|
||||
option is turned off, the debug messages are not even built into the
|
||||
kernel.
|
||||
|
||||
Boot- and run-time configuration
|
||||
--------------------------------
|
||||
|
||||
When CONFIG_ACPI_DEBUG=y, you can select the component and level of messages
|
||||
you're interested in. At boot-time, use the acpi.debug_layer and
|
||||
acpi.debug_level kernel command line options. After boot, you can use the
|
||||
debug_layer and debug_level files in /sys/module/acpi/parameters/ to control
|
||||
the debug messages.
|
||||
|
||||
debug_layer (component)
|
||||
-----------------------
|
||||
|
||||
The "debug_layer" is a mask that selects components of interest, e.g., a
|
||||
specific driver or part of the ACPI interpreter. To build the debug_layer
|
||||
bitmask, look for the "#define _COMPONENT" in an ACPI source file.
|
||||
|
||||
You can set the debug_layer mask at boot-time using the acpi.debug_layer
|
||||
command line argument, and you can change it after boot by writing values
|
||||
to /sys/module/acpi/parameters/debug_layer.
|
||||
|
||||
The possible components are defined in include/acpi/acoutput.h and
|
||||
include/acpi/acpi_drivers.h. Reading /sys/module/acpi/parameters/debug_layer
|
||||
shows the supported mask values, currently these:
|
||||
|
||||
ACPI_UTILITIES 0x00000001
|
||||
ACPI_HARDWARE 0x00000002
|
||||
ACPI_EVENTS 0x00000004
|
||||
ACPI_TABLES 0x00000008
|
||||
ACPI_NAMESPACE 0x00000010
|
||||
ACPI_PARSER 0x00000020
|
||||
ACPI_DISPATCHER 0x00000040
|
||||
ACPI_EXECUTER 0x00000080
|
||||
ACPI_RESOURCES 0x00000100
|
||||
ACPI_CA_DEBUGGER 0x00000200
|
||||
ACPI_OS_SERVICES 0x00000400
|
||||
ACPI_CA_DISASSEMBLER 0x00000800
|
||||
ACPI_COMPILER 0x00001000
|
||||
ACPI_TOOLS 0x00002000
|
||||
ACPI_BUS_COMPONENT 0x00010000
|
||||
ACPI_AC_COMPONENT 0x00020000
|
||||
ACPI_BATTERY_COMPONENT 0x00040000
|
||||
ACPI_BUTTON_COMPONENT 0x00080000
|
||||
ACPI_SBS_COMPONENT 0x00100000
|
||||
ACPI_FAN_COMPONENT 0x00200000
|
||||
ACPI_PCI_COMPONENT 0x00400000
|
||||
ACPI_POWER_COMPONENT 0x00800000
|
||||
ACPI_CONTAINER_COMPONENT 0x01000000
|
||||
ACPI_SYSTEM_COMPONENT 0x02000000
|
||||
ACPI_THERMAL_COMPONENT 0x04000000
|
||||
ACPI_MEMORY_DEVICE_COMPONENT 0x08000000
|
||||
ACPI_VIDEO_COMPONENT 0x10000000
|
||||
ACPI_PROCESSOR_COMPONENT 0x20000000
|
||||
|
||||
debug_level
|
||||
-----------
|
||||
|
||||
The "debug_level" is a mask that selects different types of messages, e.g.,
|
||||
those related to initialization, method execution, informational messages, etc.
|
||||
To build debug_level, look at the level specified in an ACPI_DEBUG_PRINT()
|
||||
statement.
|
||||
|
||||
The ACPI interpreter uses several different levels, but the Linux
|
||||
ACPI core and ACPI drivers generally only use ACPI_LV_INFO.
|
||||
|
||||
You can set the debug_level mask at boot-time using the acpi.debug_level
|
||||
command line argument, and you can change it after boot by writing values
|
||||
to /sys/module/acpi/parameters/debug_level.
|
||||
|
||||
The possible levels are defined in include/acpi/acoutput.h. Reading
|
||||
/sys/module/acpi/parameters/debug_level shows the supported mask values,
|
||||
currently these:
|
||||
|
||||
ACPI_LV_INIT 0x00000001
|
||||
ACPI_LV_DEBUG_OBJECT 0x00000002
|
||||
ACPI_LV_INFO 0x00000004
|
||||
ACPI_LV_INIT_NAMES 0x00000020
|
||||
ACPI_LV_PARSE 0x00000040
|
||||
ACPI_LV_LOAD 0x00000080
|
||||
ACPI_LV_DISPATCH 0x00000100
|
||||
ACPI_LV_EXEC 0x00000200
|
||||
ACPI_LV_NAMES 0x00000400
|
||||
ACPI_LV_OPREGION 0x00000800
|
||||
ACPI_LV_BFIELD 0x00001000
|
||||
ACPI_LV_TABLES 0x00002000
|
||||
ACPI_LV_VALUES 0x00004000
|
||||
ACPI_LV_OBJECTS 0x00008000
|
||||
ACPI_LV_RESOURCES 0x00010000
|
||||
ACPI_LV_USER_REQUESTS 0x00020000
|
||||
ACPI_LV_PACKAGE 0x00040000
|
||||
ACPI_LV_ALLOCATIONS 0x00100000
|
||||
ACPI_LV_FUNCTIONS 0x00200000
|
||||
ACPI_LV_OPTIMIZATIONS 0x00400000
|
||||
ACPI_LV_MUTEX 0x01000000
|
||||
ACPI_LV_THREADS 0x02000000
|
||||
ACPI_LV_IO 0x04000000
|
||||
ACPI_LV_INTERRUPTS 0x08000000
|
||||
ACPI_LV_AML_DISASSEMBLE 0x10000000
|
||||
ACPI_LV_VERBOSE_INFO 0x20000000
|
||||
ACPI_LV_FULL_TABLES 0x40000000
|
||||
ACPI_LV_EVENTS 0x80000000
|
||||
|
||||
Examples
|
||||
--------
|
||||
|
||||
For example, drivers/acpi/bus.c contains this:
|
||||
|
||||
#define _COMPONENT ACPI_BUS_COMPONENT
|
||||
...
|
||||
ACPI_DEBUG_PRINT((ACPI_DB_INFO, "Device insertion detected\n"));
|
||||
|
||||
To turn on this message, set the ACPI_BUS_COMPONENT bit in acpi.debug_layer
|
||||
and the ACPI_LV_INFO bit in acpi.debug_level. (The ACPI_DEBUG_PRINT
|
||||
statement uses ACPI_DB_INFO, which is macro based on the ACPI_LV_INFO
|
||||
definition.)
|
||||
|
||||
Enable all AML "Debug" output (stores to the Debug object while interpreting
|
||||
AML) during boot:
|
||||
|
||||
acpi.debug_layer=0xffffffff acpi.debug_level=0x2
|
||||
|
||||
Enable PCI and PCI interrupt routing debug messages:
|
||||
|
||||
acpi.debug_layer=0x400000 acpi.debug_level=0x4
|
||||
|
||||
Enable all ACPI hardware-related messages:
|
||||
|
||||
acpi.debug_layer=0x2 acpi.debug_level=0xffffffff
|
||||
|
||||
Enable all ACPI_DB_INFO messages after boot:
|
||||
|
||||
# echo 0x4 > /sys/module/acpi/parameters/debug_level
|
||||
|
||||
Show all valid component values:
|
||||
|
||||
# cat /sys/module/acpi/parameters/debug_layer
|
|
@ -0,0 +1,16 @@
|
|||
00-INDEX
|
||||
- this file
|
||||
README.DAC960
|
||||
- info on Mylex DAC960/DAC1100 PCI RAID Controller Driver for Linux.
|
||||
cciss.txt
|
||||
- info, major/minor #'s for Compaq's SMART Array Controllers.
|
||||
cpqarray.txt
|
||||
- info on using Compaq's SMART2 Intelligent Disk Array Controllers.
|
||||
floppy.txt
|
||||
- notes and driver options for the floppy disk driver.
|
||||
nbd.txt
|
||||
- info on a TCP implementation of a network block device.
|
||||
paride.txt
|
||||
- information about the parallel port IDE subsystem.
|
||||
ramdisk.txt
|
||||
- short guide on how to set up and use the RAM disk.
|
|
@ -0,0 +1,90 @@
|
|||
C2 port support
|
||||
---------------
|
||||
|
||||
(C) Copyright 2007 Rodolfo Giometti <giometti@enneenne.com>
|
||||
|
||||
This program is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation; either version 2 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
|
||||
|
||||
Overview
|
||||
--------
|
||||
|
||||
This driver implements the support for Linux of Silicon Labs (Silabs)
|
||||
C2 Interface used for in-system programming of micro controllers.
|
||||
|
||||
By using this driver you can reprogram the in-system flash without EC2
|
||||
or EC3 debug adapter. This solution is also useful in those systems
|
||||
where the micro controller is connected via special GPIOs pins.
|
||||
|
||||
References
|
||||
----------
|
||||
|
||||
The C2 Interface main references are at (http://www.silabs.com)
|
||||
Silicon Laboratories site], see:
|
||||
|
||||
- AN127: FLASH Programming via the C2 Interface at
|
||||
http://www.silabs.com/public/documents/tpub_doc/anote/Microcontrollers/Small_Form_Factor/en/an127.pdf, and
|
||||
|
||||
- C2 Specification at
|
||||
http://www.silabs.com/public/documents/tpub_doc/spec/Microcontrollers/en/C2spec.pdf,
|
||||
|
||||
however it implements a two wire serial communication protocol (bit
|
||||
banging) designed to enable in-system programming, debugging, and
|
||||
boundary-scan testing on low pin-count Silicon Labs devices. Currently
|
||||
this code supports only flash programming but extensions are easy to
|
||||
add.
|
||||
|
||||
Using the driver
|
||||
----------------
|
||||
|
||||
Once the driver is loaded you can use sysfs support to get C2port's
|
||||
info or read/write in-system flash.
|
||||
|
||||
# ls /sys/class/c2port/c2port0/
|
||||
access flash_block_size flash_erase rev_id
|
||||
dev_id flash_blocks_num flash_size subsystem/
|
||||
flash_access flash_data reset uevent
|
||||
|
||||
Initially the C2port access is disabled since you hardware may have
|
||||
such lines multiplexed with other devices so, to get access to the
|
||||
C2port, you need the command:
|
||||
|
||||
# echo 1 > /sys/class/c2port/c2port0/access
|
||||
|
||||
after that you should read the device ID and revision ID of the
|
||||
connected micro controller:
|
||||
|
||||
# cat /sys/class/c2port/c2port0/dev_id
|
||||
8
|
||||
# cat /sys/class/c2port/c2port0/rev_id
|
||||
1
|
||||
|
||||
However, for security reasons, the in-system flash access in not
|
||||
enabled yet, to do so you need the command:
|
||||
|
||||
# echo 1 > /sys/class/c2port/c2port0/flash_access
|
||||
|
||||
After that you can read the whole flash:
|
||||
|
||||
# cat /sys/class/c2port/c2port0/flash_data > image
|
||||
|
||||
erase it:
|
||||
|
||||
# echo 1 > /sys/class/c2port/c2port0/flash_erase
|
||||
|
||||
and write it:
|
||||
|
||||
# cat image > /sys/class/c2port/c2port0/flash_data
|
||||
|
||||
after writing you have to reset the device to execute the new code:
|
||||
|
||||
# echo 1 > /sys/class/c2port/c2port0/reset
|
|
@ -1,4 +1,4 @@
|
|||
The cgroup freezer is useful to batch job management system which start
|
||||
The cgroup freezer is useful to batch job management system which start
|
||||
and stop sets of tasks in order to schedule the resources of a machine
|
||||
according to the desires of a system administrator. This sort of program
|
||||
is often used on HPC clusters to schedule access to the cluster as a
|
||||
|
@ -6,7 +6,7 @@ whole. The cgroup freezer uses cgroups to describe the set of tasks to
|
|||
be started/stopped by the batch job management system. It also provides
|
||||
a means to start and stop the tasks composing the job.
|
||||
|
||||
The cgroup freezer will also be useful for checkpointing running groups
|
||||
The cgroup freezer will also be useful for checkpointing running groups
|
||||
of tasks. The freezer allows the checkpoint code to obtain a consistent
|
||||
image of the tasks by attempting to force the tasks in a cgroup into a
|
||||
quiescent state. Once the tasks are quiescent another task can
|
||||
|
@ -16,7 +16,7 @@ recoverable error occur. This also allows the checkpointed tasks to be
|
|||
migrated between nodes in a cluster by copying the gathered information
|
||||
to another node and restarting the tasks there.
|
||||
|
||||
Sequences of SIGSTOP and SIGCONT are not always sufficient for stopping
|
||||
Sequences of SIGSTOP and SIGCONT are not always sufficient for stopping
|
||||
and resuming tasks in userspace. Both of these signals are observable
|
||||
from within the tasks we wish to freeze. While SIGSTOP cannot be caught,
|
||||
blocked, or ignored it can be seen by waiting or ptracing parent tasks.
|
||||
|
@ -37,26 +37,29 @@ demonstrate this problem using nested bash shells:
|
|||
|
||||
<at this point 16990 exits and causes 16644 to exit too>
|
||||
|
||||
This happens because bash can observe both signals and choose how it
|
||||
This happens because bash can observe both signals and choose how it
|
||||
responds to them.
|
||||
|
||||
Another example of a program which catches and responds to these
|
||||
Another example of a program which catches and responds to these
|
||||
signals is gdb. In fact any program designed to use ptrace is likely to
|
||||
have a problem with this method of stopping and resuming tasks.
|
||||
|
||||
In contrast, the cgroup freezer uses the kernel freezer code to
|
||||
In contrast, the cgroup freezer uses the kernel freezer code to
|
||||
prevent the freeze/unfreeze cycle from becoming visible to the tasks
|
||||
being frozen. This allows the bash example above and gdb to run as
|
||||
expected.
|
||||
|
||||
The freezer subsystem in the container filesystem defines a file named
|
||||
The freezer subsystem in the container filesystem defines a file named
|
||||
freezer.state. Writing "FROZEN" to the state file will freeze all tasks in the
|
||||
cgroup. Subsequently writing "THAWED" will unfreeze the tasks in the cgroup.
|
||||
Reading will return the current state.
|
||||
|
||||
Note freezer.state doesn't exist in root cgroup, which means root cgroup
|
||||
is non-freezable.
|
||||
|
||||
* Examples of usage :
|
||||
|
||||
# mkdir /containers/freezer
|
||||
# mkdir /containers
|
||||
# mount -t cgroup -ofreezer freezer /containers
|
||||
# mkdir /containers/0
|
||||
# echo $some_pid > /containers/0/tasks
|
||||
|
@ -94,6 +97,6 @@ things happens:
|
|||
the freezer.state file
|
||||
2) Userspace retries the freezing operation by writing "FROZEN" to
|
||||
the freezer.state file (writing "FREEZING" is not legal
|
||||
and returns EIO)
|
||||
and returns EINVAL)
|
||||
3) The tasks that blocked the cgroup from entering the "FROZEN"
|
||||
state disappear from the cgroup's set of tasks.
|
||||
|
|
|
@ -39,10 +39,11 @@ The block device operation is optional, these block devices support it as of
|
|||
today:
|
||||
- dcssblk: s390 dcss block device driver
|
||||
|
||||
An address space operation named get_xip_page is used to retrieve reference
|
||||
to a struct page. To address the target page, a reference to an address_space,
|
||||
and a sector number is provided. A 3rd argument indicates whether the
|
||||
function should allocate blocks if needed.
|
||||
An address space operation named get_xip_mem is used to retrieve references
|
||||
to a page frame number and a kernel address. To obtain these values a reference
|
||||
to an address_space is provided. This function assigns values to the kmem and
|
||||
pfn parameters. The third argument indicates whether the function should allocate
|
||||
blocks if needed.
|
||||
|
||||
This address space operation is mutually exclusive with readpage&writepage that
|
||||
do page cache read/write operations.
|
||||
|
|
|
@ -0,0 +1,67 @@
|
|||
Kernel driver adt7462
|
||||
======================
|
||||
|
||||
Supported chips:
|
||||
* Analog Devices ADT7462
|
||||
Prefix: 'adt7462'
|
||||
Addresses scanned: I2C 0x58, 0x5C
|
||||
Datasheet: Publicly available at the Analog Devices website
|
||||
|
||||
Author: Darrick J. Wong
|
||||
|
||||
Description
|
||||
-----------
|
||||
|
||||
This driver implements support for the Analog Devices ADT7462 chip family.
|
||||
|
||||
This chip is a bit of a beast. It has 8 counters for measuring fan speed. It
|
||||
can also measure 13 voltages or 4 temperatures, or various combinations of the
|
||||
two. See the chip documentation for more details about the exact set of
|
||||
configurations. This driver does not allow one to configure the chip; that is
|
||||
left to the system designer.
|
||||
|
||||
A sophisticated control system for the PWM outputs is designed into the ADT7462
|
||||
that allows fan speed to be adjusted automatically based on any of the three
|
||||
temperature sensors. Each PWM output is individually adjustable and
|
||||
programmable. Once configured, the ADT7462 will adjust the PWM outputs in
|
||||
response to the measured temperatures without further host intervention. This
|
||||
feature can also be disabled for manual control of the PWM's.
|
||||
|
||||
Each of the measured inputs (voltage, temperature, fan speed) has
|
||||
corresponding high/low limit values. The ADT7462 will signal an ALARM if
|
||||
any measured value exceeds either limit.
|
||||
|
||||
The ADT7462 samples all inputs continuously. The driver will not read
|
||||
the registers more often than once every other second. Further,
|
||||
configuration data is only read once per minute.
|
||||
|
||||
Special Features
|
||||
----------------
|
||||
|
||||
The ADT7462 have a 10-bit ADC and can therefore measure temperatures
|
||||
with 0.25 degC resolution.
|
||||
|
||||
The Analog Devices datasheet is very detailed and describes a procedure for
|
||||
determining an optimal configuration for the automatic PWM control.
|
||||
|
||||
The driver will report sensor labels when it is able to determine that
|
||||
information from the configuration registers.
|
||||
|
||||
Configuration Notes
|
||||
-------------------
|
||||
|
||||
Besides standard interfaces driver adds the following:
|
||||
|
||||
* PWM Control
|
||||
|
||||
* pwm#_auto_point1_pwm and temp#_auto_point1_temp and
|
||||
* pwm#_auto_point2_pwm and temp#_auto_point2_temp -
|
||||
|
||||
point1: Set the pwm speed at a lower temperature bound.
|
||||
point2: Set the pwm speed at a higher temperature bound.
|
||||
|
||||
The ADT7462 will scale the pwm between the lower and higher pwm speed when
|
||||
the temperature is between the two temperature boundaries. PWM values range
|
||||
from 0 (off) to 255 (full speed). Fan speed will be set to maximum when the
|
||||
temperature sensor associated with the PWM control exceeds temp#_max.
|
||||
|
|
@ -0,0 +1,49 @@
|
|||
Kernel driver lis3lv02d
|
||||
==================
|
||||
|
||||
Supported chips:
|
||||
|
||||
* STMicroelectronics LIS3LV02DL and LIS3LV02DQ
|
||||
|
||||
Author:
|
||||
Yan Burman <burman.yan@gmail.com>
|
||||
Eric Piel <eric.piel@tremplin-utc.net>
|
||||
|
||||
|
||||
Description
|
||||
-----------
|
||||
|
||||
This driver provides support for the accelerometer found in various HP laptops
|
||||
sporting the feature officially called "HP Mobile Data Protection System 3D" or
|
||||
"HP 3D DriveGuard". It detect automatically laptops with this sensor. Known models
|
||||
(for now the HP 2133, nc6420, nc2510, nc8510, nc84x0, nw9440 and nx9420) will
|
||||
have their axis automatically oriented on standard way (eg: you can directly
|
||||
play neverball). The accelerometer data is readable via
|
||||
/sys/devices/platform/lis3lv02d.
|
||||
|
||||
Sysfs attributes under /sys/devices/platform/lis3lv02d/:
|
||||
position - 3D position that the accelerometer reports. Format: "(x,y,z)"
|
||||
calibrate - read: values (x, y, z) that are used as the base for input class device operation.
|
||||
write: forces the base to be recalibrated with the current position.
|
||||
rate - reports the sampling rate of the accelerometer device in HZ
|
||||
|
||||
This driver also provides an absolute input class device, allowing
|
||||
the laptop to act as a pinball machine-esque joystick.
|
||||
|
||||
Axes orientation
|
||||
----------------
|
||||
|
||||
For better compatibility between the various laptops. The values reported by
|
||||
the accelerometer are converted into a "standard" organisation of the axes
|
||||
(aka "can play neverball out of the box"):
|
||||
* When the laptop is horizontal the position reported is about 0 for X and Y
|
||||
and a positive value for Z
|
||||
* If the left side is elevated, X increases (becomes positive)
|
||||
* If the front side (where the touchpad is) is elevated, Y decreases (becomes negative)
|
||||
* If the laptop is put upside-down, Z becomes negative
|
||||
|
||||
If your laptop model is not recognized (cf "dmesg"), you can send an email to the
|
||||
authors to add it to the database. When reporting a new laptop, please include
|
||||
the output of "dmidecode" plus the value of /sys/devices/platform/lis3lv02d/position
|
||||
in these four cases.
|
||||
|
|
@ -0,0 +1,31 @@
|
|||
Kernel driver ics932s401
|
||||
======================
|
||||
|
||||
Supported chips:
|
||||
* IDT ICS932S401
|
||||
Prefix: 'ics932s401'
|
||||
Addresses scanned: I2C 0x69
|
||||
Datasheet: Publically available at the IDT website
|
||||
|
||||
Author: Darrick J. Wong
|
||||
|
||||
Description
|
||||
-----------
|
||||
|
||||
This driver implements support for the IDT ICS932S401 chip family.
|
||||
|
||||
This chip has 4 clock outputs--a base clock for the CPU (which is likely
|
||||
multiplied to get the real CPU clock), a system clock, a PCI clock, a USB
|
||||
clock, and a reference clock. The driver reports selected and actual
|
||||
frequency. If spread spectrum mode is enabled, the driver also reports by what
|
||||
percent the clock signal is being spread, which should be between 0 and -0.5%.
|
||||
All frequencies are reported in KHz.
|
||||
|
||||
The ICS932S401 monitors all inputs continuously. The driver will not read
|
||||
the registers more often than once every other second.
|
||||
|
||||
Special Features
|
||||
----------------
|
||||
|
||||
The clocks could be reprogrammed to increase system speed. I will not help you
|
||||
do this, as you risk damaging your system!
|
|
@ -0,0 +1,10 @@
|
|||
00-INDEX
|
||||
- this file
|
||||
cdrom.txt
|
||||
- summary of CDROM ioctl calls
|
||||
hdio.txt
|
||||
- summary of HDIO_ ioctl calls
|
||||
ioctl-decoding.txt
|
||||
- how to decode the bits of an IOCTL code
|
||||
ioctl-number.txt
|
||||
- how to implement and register device/driver ioctl calls
|
|
@ -198,59 +198,42 @@ and is between 256 and 4096 characters. It is defined in the file
|
|||
that require a timer override, but don't have
|
||||
HPET
|
||||
|
||||
acpi.debug_layer= [HW,ACPI]
|
||||
acpi_backlight= [HW,ACPI]
|
||||
acpi_backlight=vendor
|
||||
acpi_backlight=video
|
||||
If set to vendor, prefer vendor specific driver
|
||||
(e.g. thinkpad_acpi, sony_acpi, etc.) instead
|
||||
of the ACPI video.ko driver.
|
||||
|
||||
acpi_display_output= [HW,ACPI]
|
||||
acpi_display_output=vendor
|
||||
acpi_display_output=video
|
||||
See above.
|
||||
|
||||
acpi.debug_layer= [HW,ACPI,ACPI_DEBUG]
|
||||
acpi.debug_level= [HW,ACPI,ACPI_DEBUG]
|
||||
Format: <int>
|
||||
Each bit of the <int> indicates an ACPI debug layer,
|
||||
1: enable, 0: disable. It is useful for boot time
|
||||
debugging. After system has booted up, it can be set
|
||||
via /sys/module/acpi/parameters/debug_layer.
|
||||
CONFIG_ACPI_DEBUG must be enabled for this to produce any output.
|
||||
Available bits (add the numbers together) to enable debug output
|
||||
for specific parts of the ACPI subsystem:
|
||||
0x01 utilities 0x02 hardware 0x04 events 0x08 tables
|
||||
0x10 namespace 0x20 parser 0x40 dispatcher
|
||||
0x80 executer 0x100 resources 0x200 acpica debugger
|
||||
0x400 os services 0x800 acpica disassembler.
|
||||
The number can be in decimal or prefixed with 0x in hex.
|
||||
Warning: Many of these options can produce a lot of
|
||||
output and make your system unusable. Be very careful.
|
||||
CONFIG_ACPI_DEBUG must be enabled to produce any ACPI
|
||||
debug output. Bits in debug_layer correspond to a
|
||||
_COMPONENT in an ACPI source file, e.g.,
|
||||
#define _COMPONENT ACPI_PCI_COMPONENT
|
||||
Bits in debug_level correspond to a level in
|
||||
ACPI_DEBUG_PRINT statements, e.g.,
|
||||
ACPI_DEBUG_PRINT((ACPI_DB_INFO, ...
|
||||
See Documentation/acpi/debug.txt for more information
|
||||
about debug layers and levels.
|
||||
|
||||
acpi.debug_level= [HW,ACPI]
|
||||
Format: <int>
|
||||
Each bit of the <int> indicates an ACPI debug level,
|
||||
which corresponds to the level in an ACPI_DEBUG_PRINT
|
||||
statement. After system has booted up, this mask
|
||||
can be set via /sys/module/acpi/parameters/debug_level.
|
||||
Enable AML "Debug" output, i.e., stores to the Debug
|
||||
object while interpreting AML:
|
||||
acpi.debug_layer=0xffffffff acpi.debug_level=0x2
|
||||
Enable PCI/PCI interrupt routing info messages:
|
||||
acpi.debug_layer=0x400000 acpi.debug_level=0x4
|
||||
Enable all messages related to ACPI hardware:
|
||||
acpi.debug_layer=0x2 acpi.debug_level=0xffffffff
|
||||
|
||||
CONFIG_ACPI_DEBUG must be enabled for this to produce
|
||||
any output. The number can be in decimal or prefixed
|
||||
with 0x in hex. Some of these options produce so much
|
||||
output that the system is unusable.
|
||||
|
||||
The following global components are defined by the
|
||||
ACPI CA:
|
||||
0x01 error
|
||||
0x02 warn
|
||||
0x04 init
|
||||
0x08 debug object
|
||||
0x10 info
|
||||
0x20 init names
|
||||
0x40 parse
|
||||
0x80 load
|
||||
0x100 dispatch
|
||||
0x200 execute
|
||||
0x400 names
|
||||
0x800 operation region
|
||||
0x1000 bfield
|
||||
0x2000 tables
|
||||
0x4000 values
|
||||
0x8000 objects
|
||||
0x10000 resources
|
||||
0x20000 user requests
|
||||
0x40000 package
|
||||
The number can be in decimal or prefixed with 0x in hex.
|
||||
Warning: Many of these options can produce a lot of
|
||||
output and make your system unusable. Be very careful.
|
||||
Some values produce so much output that the system is
|
||||
unusable. The "log_buf_len" parameter may be useful
|
||||
if you need to capture more output.
|
||||
|
||||
acpi.power_nocheck= [HW,ACPI]
|
||||
Format: 1/0 enable/disable the check of power state.
|
||||
|
@ -646,7 +629,7 @@ and is between 256 and 4096 characters. It is defined in the file
|
|||
|
||||
digiepca= [HW,SERIAL]
|
||||
See drivers/char/README.epca and
|
||||
Documentation/digiepca.txt.
|
||||
Documentation/serial/digiepca.txt.
|
||||
|
||||
disable_mtrr_cleanup [X86]
|
||||
enable_mtrr_cleanup [X86]
|
||||
|
@ -757,7 +740,7 @@ and is between 256 and 4096 characters. It is defined in the file
|
|||
See header of drivers/scsi/fdomain.c.
|
||||
|
||||
floppy= [HW]
|
||||
See Documentation/floppy.txt.
|
||||
See Documentation/blockdev/floppy.txt.
|
||||
|
||||
force_pal_cache_flush
|
||||
[IA-64] Avoid check_sal_cache_flush which may hang on
|
||||
|
@ -1118,7 +1101,7 @@ and is between 256 and 4096 characters. It is defined in the file
|
|||
the same attribute, the last one is used.
|
||||
|
||||
load_ramdisk= [RAM] List of ramdisks to load from floppy
|
||||
See Documentation/ramdisk.txt.
|
||||
See Documentation/blockdev/ramdisk.txt.
|
||||
|
||||
lockd.nlm_grace_period=P [NFS] Assign grace period.
|
||||
Format: <integer>
|
||||
|
@ -1613,7 +1596,7 @@ and is between 256 and 4096 characters. It is defined in the file
|
|||
|
||||
pcd. [PARIDE]
|
||||
See header of drivers/block/paride/pcd.c.
|
||||
See also Documentation/paride.txt.
|
||||
See also Documentation/blockdev/paride.txt.
|
||||
|
||||
pci=option[,option...] [PCI] various PCI subsystem options:
|
||||
off [X86] don't probe for the PCI bus
|
||||
|
@ -1714,7 +1697,7 @@ and is between 256 and 4096 characters. It is defined in the file
|
|||
pcmv= [HW,PCMCIA] BadgePAD 4
|
||||
|
||||
pd. [PARIDE]
|
||||
See Documentation/paride.txt.
|
||||
See Documentation/blockdev/paride.txt.
|
||||
|
||||
pdcchassis= [PARISC,HW] Disable/Enable PDC Chassis Status codes at
|
||||
boot time.
|
||||
|
@ -1722,10 +1705,10 @@ and is between 256 and 4096 characters. It is defined in the file
|
|||
See arch/parisc/kernel/pdc_chassis.c
|
||||
|
||||
pf. [PARIDE]
|
||||
See Documentation/paride.txt.
|
||||
See Documentation/blockdev/paride.txt.
|
||||
|
||||
pg. [PARIDE]
|
||||
See Documentation/paride.txt.
|
||||
See Documentation/blockdev/paride.txt.
|
||||
|
||||
pirq= [SMP,APIC] Manual mp-table setup
|
||||
See Documentation/x86/i386/IO-APIC.txt.
|
||||
|
@ -1795,7 +1778,7 @@ and is between 256 and 4096 characters. It is defined in the file
|
|||
|
||||
prompt_ramdisk= [RAM] List of RAM disks to prompt for floppy disk
|
||||
before loading.
|
||||
See Documentation/ramdisk.txt.
|
||||
See Documentation/blockdev/ramdisk.txt.
|
||||
|
||||
psmouse.proto= [HW,MOUSE] Highest PS2 mouse protocol extension to
|
||||
probe for; one of (bare|imps|exps|lifebook|any).
|
||||
|
@ -1815,7 +1798,7 @@ and is between 256 and 4096 characters. It is defined in the file
|
|||
<io>,<mss_io>,<mss_irq>,<mss_dma>,<mpu_io>,<mpu_irq>
|
||||
|
||||
pt. [PARIDE]
|
||||
See Documentation/paride.txt.
|
||||
See Documentation/blockdev/paride.txt.
|
||||
|
||||
pty.legacy_count=
|
||||
[KNL] Number of legacy pty's. Overwrites compiled-in
|
||||
|
@ -1829,10 +1812,10 @@ and is between 256 and 4096 characters. It is defined in the file
|
|||
See Documentation/md.txt.
|
||||
|
||||
ramdisk_blocksize= [RAM]
|
||||
See Documentation/ramdisk.txt.
|
||||
See Documentation/blockdev/ramdisk.txt.
|
||||
|
||||
ramdisk_size= [RAM] Sizes of RAM disks in kilobytes
|
||||
See Documentation/ramdisk.txt.
|
||||
See Documentation/blockdev/ramdisk.txt.
|
||||
|
||||
rcupdate.blimit= [KNL,BOOT]
|
||||
Set maximum number of finished RCU callbacks to process
|
||||
|
@ -2164,7 +2147,7 @@ and is between 256 and 4096 characters. It is defined in the file
|
|||
See Documentation/sonypi.txt
|
||||
|
||||
specialix= [HW,SERIAL] Specialix multi-serial port adapter
|
||||
See Documentation/specialix.txt.
|
||||
See Documentation/serial/specialix.txt.
|
||||
|
||||
spia_io_base= [HW,MTD]
|
||||
spia_fio_base=
|
||||
|
|
|
@ -0,0 +1,35 @@
|
|||
If variable is of Type, use printk format specifier:
|
||||
---------------------------------------------------------
|
||||
int %d or %x
|
||||
unsigned int %u or %x
|
||||
long %ld or %lx
|
||||
unsigned long %lu or %lx
|
||||
long long %lld or %llx
|
||||
unsigned long long %llu or %llx
|
||||
size_t %zu or %zx
|
||||
ssize_t %zd or %zx
|
||||
|
||||
Raw pointer value SHOULD be printed with %p.
|
||||
|
||||
u64 SHOULD be printed with %llu/%llx, (unsigned long long):
|
||||
|
||||
printk("%llu", (unsigned long long)u64_var);
|
||||
|
||||
s64 SHOULD be printed with %lld/%llx, (long long):
|
||||
|
||||
printk("%lld", (long long)s64_var);
|
||||
|
||||
If <type> is dependent on a config option for its size (e.g., sector_t,
|
||||
blkcnt_t, phys_addr_t, resource_size_t) or is architecture-dependent
|
||||
for its size (e.g., tcflag_t), use a format specifier of its largest
|
||||
possible type and explicitly cast to it. Example:
|
||||
|
||||
printk("test: sector number/total blocks: %llu/%llu\n",
|
||||
(unsigned long long)sector, (unsigned long long)blockcount);
|
||||
|
||||
Reminder: sizeof() result is of type size_t.
|
||||
|
||||
Thank you for your cooperation and attention.
|
||||
|
||||
|
||||
By Randy Dunlap <rdunlap@xenotime.net>
|
|
@ -0,0 +1,24 @@
|
|||
00-INDEX
|
||||
- this file.
|
||||
README.cycladesZ
|
||||
- info on Cyclades-Z firmware loading.
|
||||
computone.txt
|
||||
- info on Computone Intelliport II/Plus Multiport Serial Driver.
|
||||
digiepca.txt
|
||||
- info on Digi Intl. {PC,PCI,EISA}Xx and Xem series cards.
|
||||
hayes-esp.txt
|
||||
- info on using the Hayes ESP serial driver.
|
||||
moxa-smartio
|
||||
- file with info on installing/using Moxa multiport serial driver.
|
||||
riscom8.txt
|
||||
- notes on using the RISCom/8 multi-port serial driver.
|
||||
rocket.txt
|
||||
- info on the Comtrol RocketPort multiport serial driver.
|
||||
specialix.txt
|
||||
- info on hardware/driver for specialix IO8+ multiport serial card.
|
||||
stallion.txt
|
||||
- info on using the Stallion multiport serial driver.
|
||||
sx.txt
|
||||
- info on the Specialix SX/SI multiport serial driver.
|
||||
tty.txt
|
||||
- guide to the locking policies of the tty layer.
|
|
@ -247,7 +247,7 @@ shar archive to make it easier to extract the script from the documentation.
|
|||
To create the ip2mkdev shell script change to a convenient directory (/tmp
|
||||
works just fine) and run the following command:
|
||||
|
||||
unshar Documentation/computone.txt
|
||||
unshar Documentation/serial/computone.txt
|
||||
(This file)
|
||||
|
||||
You should now have a file ip2mkdev in your current working directory with
|
|
@ -0,0 +1,46 @@
|
|||
Kernel driver for omap HDQ/1-wire module.
|
||||
========================================
|
||||
|
||||
Supported chips:
|
||||
================
|
||||
HDQ/1-wire controller on the TI OMAP 2430/3430 platforms.
|
||||
|
||||
A useful link about HDQ basics:
|
||||
===============================
|
||||
http://focus.ti.com/lit/an/slua408/slua408.pdf
|
||||
|
||||
Description:
|
||||
============
|
||||
The HDQ/1-Wire module of TI OMAP2430/3430 platforms implement the hardware
|
||||
protocol of the master functions of the Benchmark HDQ and the Dallas
|
||||
Semiconductor 1-Wire protocols. These protocols use a single wire for
|
||||
communication between the master (HDQ/1-Wire controller) and the slave
|
||||
(HDQ/1-Wire external compliant device).
|
||||
|
||||
A typical application of the HDQ/1-Wire module is the communication with battery
|
||||
monitor (gas gauge) integrated circuits.
|
||||
|
||||
The controller supports operation in both HDQ and 1-wire mode. The essential
|
||||
difference between the HDQ and 1-wire mode is how the slave device responds to
|
||||
initialization pulse.In HDQ mode, the firmware does not require the host to
|
||||
create an initialization pulse to the slave.However, the slave can be reset by
|
||||
using an initialization pulse (also referred to as a break pulse).The slave
|
||||
does not respond with a presence pulse as it does in the 1-Wire protocol.
|
||||
|
||||
Remarks:
|
||||
========
|
||||
The driver (drivers/w1/masters/omap_hdq.c) supports the HDQ mode of the
|
||||
controller. In this mode, as we can not read the ID which obeys the W1
|
||||
spec(family:id:crc), a module parameter can be passed to the driver which will
|
||||
be used to calculate the CRC and pass back an appropriate slave ID to the W1
|
||||
core.
|
||||
|
||||
By default the master driver and the BQ slave i/f
|
||||
driver(drivers/w1/slaves/w1_bq27000.c) sets the ID to 1.
|
||||
Please note to load both the modules with a different ID if required, but note
|
||||
that the ID used should be same for both master and slave driver loading.
|
||||
|
||||
e.g:
|
||||
insmod omap_hdq.ko W1_ID=2
|
||||
inamod w1_bq27000.ko F_ID=2
|
||||
|
18
MAINTAINERS
18
MAINTAINERS
|
@ -2216,6 +2216,13 @@ M: adaplas@gmail.com
|
|||
L: linux-fbdev-devel@lists.sourceforge.net (moderated for non-subscribers)
|
||||
S: Maintained
|
||||
|
||||
INTEL MENLOW THERMAL DRIVER
|
||||
P: Sujith Thomas
|
||||
M: sujith.thomas@intel.com
|
||||
L: linux-acpi@vger.kernel.org
|
||||
W: http://www.lesswatts.org/projects/acpi/
|
||||
S: Supported
|
||||
|
||||
INTEL IA32 MICROCODE UPDATE SUPPORT
|
||||
P: Tigran Aivazian
|
||||
M: tigran@aivazian.fsnet.co.uk
|
||||
|
@ -2696,6 +2703,11 @@ P: Arnaldo Carvalho de Melo
|
|||
M: acme@ghostprotocols.net
|
||||
S: Maintained
|
||||
|
||||
LIS3LV02D ACCELEROMETER DRIVER
|
||||
P: Eric Piel
|
||||
M: eric.piel@tremplin-utc.net
|
||||
S: Maintained
|
||||
|
||||
LM83 HARDWARE MONITOR DRIVER
|
||||
P: Jean Delvare
|
||||
M: khali@linux-fr.org
|
||||
|
@ -3377,7 +3389,9 @@ S: Maintained
|
|||
|
||||
PNP SUPPORT
|
||||
P: Adam Belay
|
||||
M: ambx1@neo.rr.com
|
||||
M: abelay@mit.edu
|
||||
P: Bjorn Helgaas
|
||||
M: bjorn.helgaas@hp.com
|
||||
S: Maintained
|
||||
|
||||
PNXxxxx I2C DRIVER
|
||||
|
@ -3914,8 +3928,6 @@ M: bootc@bootc.net
|
|||
S: Maintained
|
||||
|
||||
SOFTWARE RAID (Multiple Disks) SUPPORT
|
||||
P: Ingo Molnar
|
||||
M: mingo@redhat.com
|
||||
P: Neil Brown
|
||||
M: neilb@suse.de
|
||||
L: linux-raid@vger.kernel.org
|
||||
|
|
2
Makefile
2
Makefile
|
@ -1,7 +1,7 @@
|
|||
VERSION = 2
|
||||
PATCHLEVEL = 6
|
||||
SUBLEVEL = 28
|
||||
EXTRAVERSION = -rc4
|
||||
EXTRAVERSION = -rc5
|
||||
NAME = Killer Bat of Doom
|
||||
|
||||
# *DOCUMENTATION*
|
||||
|
|
|
@ -256,8 +256,17 @@ int dmabounce_sync_for_cpu(struct device *, dma_addr_t, unsigned long,
|
|||
int dmabounce_sync_for_device(struct device *, dma_addr_t, unsigned long,
|
||||
size_t, enum dma_data_direction);
|
||||
#else
|
||||
#define dmabounce_sync_for_cpu(dev,dma,off,sz,dir) (1)
|
||||
#define dmabounce_sync_for_device(dev,dma,off,sz,dir) (1)
|
||||
static inline int dmabounce_sync_for_cpu(struct device *d, dma_addr_t addr,
|
||||
unsigned long offset, size_t size, enum dma_data_direction dir)
|
||||
{
|
||||
return 1;
|
||||
}
|
||||
|
||||
static inline int dmabounce_sync_for_device(struct device *d, dma_addr_t addr,
|
||||
unsigned long offset, size_t size, enum dma_data_direction dir)
|
||||
{
|
||||
return 1;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
|
|
|
@ -730,7 +730,8 @@ static inline void iop_desc_set_next_desc(struct iop_adma_desc_slot *desc,
|
|||
{
|
||||
/* hw_desc->next_desc is the same location for all channels */
|
||||
union iop3xx_desc hw_desc = { .ptr = desc->hw_desc, };
|
||||
BUG_ON(hw_desc.dma->next_desc);
|
||||
|
||||
iop_paranoia(hw_desc.dma->next_desc);
|
||||
hw_desc.dma->next_desc = next_desc_addr;
|
||||
}
|
||||
|
||||
|
@ -760,7 +761,7 @@ static inline int iop_desc_get_zero_result(struct iop_adma_desc_slot *desc)
|
|||
struct iop3xx_desc_aau *hw_desc = desc->hw_desc;
|
||||
struct iop3xx_aau_desc_ctrl desc_ctrl = hw_desc->desc_ctrl_field;
|
||||
|
||||
BUG_ON(!(desc_ctrl.tx_complete && desc_ctrl.zero_result_en));
|
||||
iop_paranoia(!(desc_ctrl.tx_complete && desc_ctrl.zero_result_en));
|
||||
return desc_ctrl.zero_result_err;
|
||||
}
|
||||
|
||||
|
|
|
@ -23,6 +23,12 @@
|
|||
|
||||
#define IOP_ADMA_SLOT_SIZE 32
|
||||
#define IOP_ADMA_THRESHOLD 4
|
||||
#ifdef DEBUG
|
||||
#define IOP_PARANOIA 1
|
||||
#else
|
||||
#define IOP_PARANOIA 0
|
||||
#endif
|
||||
#define iop_paranoia(x) BUG_ON(IOP_PARANOIA && (x))
|
||||
|
||||
/**
|
||||
* struct iop_adma_device - internal representation of an ADMA device
|
||||
|
|
|
@ -19,12 +19,13 @@ struct map_desc {
|
|||
};
|
||||
|
||||
/* types 0-3 are defined in asm/io.h */
|
||||
#define MT_CACHECLEAN 4
|
||||
#define MT_MINICLEAN 5
|
||||
#define MT_LOW_VECTORS 6
|
||||
#define MT_HIGH_VECTORS 7
|
||||
#define MT_MEMORY 8
|
||||
#define MT_ROM 9
|
||||
#define MT_UNCACHED 4
|
||||
#define MT_CACHECLEAN 5
|
||||
#define MT_MINICLEAN 6
|
||||
#define MT_LOW_VECTORS 7
|
||||
#define MT_HIGH_VECTORS 8
|
||||
#define MT_MEMORY 9
|
||||
#define MT_ROM 10
|
||||
|
||||
#ifdef CONFIG_MMU
|
||||
extern void iotable_init(struct map_desc *, int);
|
||||
|
|
|
@ -94,20 +94,6 @@
|
|||
#include <asm/hardware/ep7212.h>
|
||||
#include <asm/hardware/cs89712.h>
|
||||
|
||||
/* dynamic ioremap() areas */
|
||||
#define FLASH_START 0x00000000
|
||||
#define FLASH_SIZE 0x800000
|
||||
#define FLASH_WIDTH 4
|
||||
|
||||
#define SRAM_START 0x60000000
|
||||
#define SRAM_SIZE 0xc000
|
||||
#define SRAM_WIDTH 4
|
||||
|
||||
#define BOOTROM_START 0x70000000
|
||||
#define BOOTROM_SIZE 0x80
|
||||
#define BOOTROM_WIDTH 4
|
||||
|
||||
|
||||
/* static cdb89712_map_io() areas */
|
||||
#define REGISTER_START 0x80000000
|
||||
#define REGISTER_SIZE 0x4000
|
||||
|
@ -198,14 +184,6 @@
|
|||
#define CEIVA_FLASH_SIZE 0x100000
|
||||
#define CEIVA_FLASH_WIDTH 2
|
||||
|
||||
#define SRAM_START 0x60000000
|
||||
#define SRAM_SIZE 0xc000
|
||||
#define SRAM_WIDTH 4
|
||||
|
||||
#define BOOTROM_START 0x70000000
|
||||
#define BOOTROM_SIZE 0x80
|
||||
#define BOOTROM_WIDTH 4
|
||||
|
||||
/*
|
||||
* SED1355 LCD controller
|
||||
*/
|
||||
|
|
|
@ -275,9 +275,9 @@ static struct map_desc cl7500_io_desc[] __initdata = {
|
|||
.length = ISA_SIZE,
|
||||
.type = MT_DEVICE
|
||||
}, { /* Flash */
|
||||
.virtual = FLASH_BASE,
|
||||
.pfn = __phys_to_pfn(FLASH_START),
|
||||
.length = FLASH_SIZE,
|
||||
.virtual = CLPS7500_FLASH_BASE,
|
||||
.pfn = __phys_to_pfn(CLPS7500_FLASH_START),
|
||||
.length = CLPS7500_FLASH_SIZE,
|
||||
.type = MT_DEVICE
|
||||
}, { /* LED */
|
||||
.virtual = LED_BASE,
|
||||
|
|
|
@ -39,9 +39,9 @@
|
|||
#define ISA_SIZE 0x00010000
|
||||
#define ISA_BASE 0xe1000000
|
||||
|
||||
#define FLASH_START 0x01000000 /* XXX */
|
||||
#define FLASH_SIZE 0x01000000
|
||||
#define FLASH_BASE 0xe2000000
|
||||
#define CLPS7500_FLASH_START 0x01000000 /* XXX */
|
||||
#define CLPS7500_FLASH_SIZE 0x01000000
|
||||
#define CLPS7500_FLASH_BASE 0xe2000000
|
||||
|
||||
#define LED_START 0x0302B000
|
||||
#define LED_SIZE 0x00001000
|
||||
|
|
|
@ -19,9 +19,9 @@
|
|||
#ifdef CONFIG_ARCH_H7202
|
||||
|
||||
/* FLASH */
|
||||
#define FLASH_VIRT 0xd0000000
|
||||
#define FLASH_PHYS 0x00000000
|
||||
#define FLASH_SIZE 0x02000000
|
||||
#define H720X_FLASH_VIRT 0xd0000000
|
||||
#define H720X_FLASH_PHYS 0x00000000
|
||||
#define H720X_FLASH_SIZE 0x02000000
|
||||
|
||||
/* onboard LAN controller */
|
||||
# define ETH0_PHYS 0x08000000
|
||||
|
|
|
@ -407,28 +407,11 @@
|
|||
*/
|
||||
#define uHAL_MEMORY_SIZE INTEGRATOR_SSRAM_SIZE
|
||||
|
||||
/*
|
||||
* Application Flash
|
||||
*
|
||||
*/
|
||||
#define FLASH_BASE INTEGRATOR_FLASH_BASE
|
||||
#define FLASH_SIZE INTEGRATOR_FLASH_SIZE
|
||||
#define FLASH_END (FLASH_BASE + FLASH_SIZE - 1)
|
||||
#define FLASH_BLOCK_SIZE SZ_128K
|
||||
|
||||
/*
|
||||
* Boot Flash
|
||||
*
|
||||
*/
|
||||
#define EPROM_BASE INTEGRATOR_BOOT_ROM_HI
|
||||
#define EPROM_SIZE INTEGRATOR_BOOT_ROM_SIZE
|
||||
#define EPROM_END (EPROM_BASE + EPROM_SIZE - 1)
|
||||
|
||||
/*
|
||||
* Clean base - dummy
|
||||
*
|
||||
*/
|
||||
#define CLEAN_BASE EPROM_BASE
|
||||
#define CLEAN_BASE INTEGRATOR_BOOT_ROM_HI
|
||||
|
||||
/*
|
||||
* Timer definitions
|
||||
|
|
|
@ -404,7 +404,8 @@ static inline void iop_desc_set_next_desc(struct iop_adma_desc_slot *desc,
|
|||
u32 next_desc_addr)
|
||||
{
|
||||
struct iop13xx_adma_desc_hw *hw_desc = desc->hw_desc;
|
||||
BUG_ON(hw_desc->next_desc);
|
||||
|
||||
iop_paranoia(hw_desc->next_desc);
|
||||
hw_desc->next_desc = next_desc_addr;
|
||||
}
|
||||
|
||||
|
|
|
@ -104,7 +104,7 @@ static struct clk uart_clk = {
|
|||
|
||||
static struct clk mmci_clk = {
|
||||
.name = "MCLK",
|
||||
.rate = 33000000,
|
||||
.rate = 24000000,
|
||||
};
|
||||
|
||||
int clk_register(struct clk *clk)
|
||||
|
|
|
@ -238,28 +238,11 @@
|
|||
#define REALVIEW_INTREG_OFFSET 0x8 /* Interrupt control */
|
||||
#define REALVIEW_DECODE_OFFSET 0xC /* Fitted logic modules */
|
||||
|
||||
/*
|
||||
* Application Flash
|
||||
*
|
||||
*/
|
||||
#define FLASH_BASE REALVIEW_FLASH_BASE
|
||||
#define FLASH_SIZE REALVIEW_FLASH_SIZE
|
||||
#define FLASH_END (FLASH_BASE + FLASH_SIZE - 1)
|
||||
#define FLASH_BLOCK_SIZE SZ_128K
|
||||
|
||||
/*
|
||||
* Boot Flash
|
||||
*
|
||||
*/
|
||||
#define EPROM_BASE REALVIEW_BOOT_ROM_HI
|
||||
#define EPROM_SIZE REALVIEW_BOOT_ROM_SIZE
|
||||
#define EPROM_END (EPROM_BASE + EPROM_SIZE - 1)
|
||||
|
||||
/*
|
||||
* Clean base - dummy
|
||||
*
|
||||
*/
|
||||
#define CLEAN_BASE EPROM_BASE
|
||||
#define CLEAN_BASE REALVIEW_BOOT_ROM_HI
|
||||
|
||||
/*
|
||||
* System controller bit assignment
|
||||
|
|
|
@ -105,7 +105,7 @@ static struct clk uart_clk = {
|
|||
|
||||
static struct clk mmci_clk = {
|
||||
.name = "MCLK",
|
||||
.rate = 33000000,
|
||||
.rate = 24000000,
|
||||
};
|
||||
|
||||
int clk_register(struct clk *clk)
|
||||
|
|
|
@ -436,28 +436,12 @@
|
|||
#define SIC_INTMASK_PCI1 (1 << SIC_INT_PCI1)
|
||||
#define SIC_INTMASK_PCI2 (1 << SIC_INT_PCI2)
|
||||
#define SIC_INTMASK_PCI3 (1 << SIC_INT_PCI3)
|
||||
/*
|
||||
* Application Flash
|
||||
*
|
||||
*/
|
||||
#define FLASH_BASE VERSATILE_FLASH_BASE
|
||||
#define FLASH_SIZE VERSATILE_FLASH_SIZE
|
||||
#define FLASH_END (FLASH_BASE + FLASH_SIZE - 1)
|
||||
#define FLASH_BLOCK_SIZE SZ_128K
|
||||
|
||||
/*
|
||||
* Boot Flash
|
||||
*
|
||||
*/
|
||||
#define EPROM_BASE VERSATILE_BOOT_ROM_HI
|
||||
#define EPROM_SIZE VERSATILE_BOOT_ROM_SIZE
|
||||
#define EPROM_END (EPROM_BASE + EPROM_SIZE - 1)
|
||||
|
||||
/*
|
||||
* Clean base - dummy
|
||||
*
|
||||
*/
|
||||
#define CLEAN_BASE EPROM_BASE
|
||||
#define CLEAN_BASE VERSATILE_BOOT_ROM_HI
|
||||
|
||||
/*
|
||||
* System controller bit assignment
|
||||
|
|
|
@ -150,7 +150,7 @@ static void feroceon_l2_inv_range(unsigned long start, unsigned long end)
|
|||
/*
|
||||
* Clean and invalidate partial last cache line.
|
||||
*/
|
||||
if (end & (CACHE_LINE_SIZE - 1)) {
|
||||
if (start < end && end & (CACHE_LINE_SIZE - 1)) {
|
||||
l2_clean_inv_pa(end & ~(CACHE_LINE_SIZE - 1));
|
||||
end &= ~(CACHE_LINE_SIZE - 1);
|
||||
}
|
||||
|
@ -158,7 +158,7 @@ static void feroceon_l2_inv_range(unsigned long start, unsigned long end)
|
|||
/*
|
||||
* Invalidate all full cache lines between 'start' and 'end'.
|
||||
*/
|
||||
while (start != end) {
|
||||
while (start < end) {
|
||||
unsigned long range_end = calc_range_end(start, end);
|
||||
l2_inv_pa_range(start, range_end - CACHE_LINE_SIZE);
|
||||
start = range_end;
|
||||
|
|
|
@ -208,6 +208,12 @@ static struct mem_type mem_types[] = {
|
|||
.prot_sect = PROT_SECT_DEVICE,
|
||||
.domain = DOMAIN_IO,
|
||||
},
|
||||
[MT_UNCACHED] = {
|
||||
.prot_pte = PROT_PTE_DEVICE,
|
||||
.prot_l1 = PMD_TYPE_TABLE,
|
||||
.prot_sect = PMD_TYPE_SECT | PMD_SECT_XN,
|
||||
.domain = DOMAIN_IO,
|
||||
},
|
||||
[MT_CACHECLEAN] = {
|
||||
.prot_sect = PMD_TYPE_SECT | PMD_SECT_XN,
|
||||
.domain = DOMAIN_KERNEL,
|
||||
|
|
|
@ -16,14 +16,15 @@
|
|||
#include <asm/hardware/iop3xx.h>
|
||||
|
||||
/*
|
||||
* Standard IO mapping for all IOP3xx based systems
|
||||
* Standard IO mapping for all IOP3xx based systems. Note that
|
||||
* the IOP3xx OCCDR must be mapped uncached and unbuffered.
|
||||
*/
|
||||
static struct map_desc iop3xx_std_desc[] __initdata = {
|
||||
{ /* mem mapped registers */
|
||||
.virtual = IOP3XX_PERIPHERAL_VIRT_BASE,
|
||||
.pfn = __phys_to_pfn(IOP3XX_PERIPHERAL_PHYS_BASE),
|
||||
.length = IOP3XX_PERIPHERAL_SIZE,
|
||||
.type = MT_DEVICE,
|
||||
.type = MT_UNCACHED,
|
||||
}, { /* PCI IO space */
|
||||
.virtual = IOP3XX_PCI_LOWER_IO_VA,
|
||||
.pfn = __phys_to_pfn(IOP3XX_PCI_LOWER_IO_PA),
|
||||
|
|
|
@ -101,7 +101,7 @@ extern u16 _bfin_swrst; /* shadow for Software Reset Register (SWRST) */
|
|||
extern unsigned long _ramstart, _ramend, _rambase;
|
||||
extern unsigned long memory_start, memory_end, physical_mem_end;
|
||||
extern char _stext_l1[], _etext_l1[], _sdata_l1[], _edata_l1[], _sbss_l1[],
|
||||
_ebss_l1[], _l1_lma_start[], _sdata_b_l1[], _ebss_b_l1[],
|
||||
_ebss_l1[], _l1_lma_start[], _sdata_b_l1[], _sbss_b_l1[], _ebss_b_l1[],
|
||||
_stext_l2[], _etext_l2[], _sdata_l2[], _edata_l2[], _sbss_l2[],
|
||||
_ebss_l2[], _l2_lma_start[];
|
||||
|
||||
|
|
|
@ -15,7 +15,11 @@ void dma_free_coherent(struct device *dev, size_t size, void *vaddr,
|
|||
#define dma_alloc_noncoherent(d, s, h, f) dma_alloc_coherent(d, s, h, f)
|
||||
#define dma_free_noncoherent(d, s, v, h) dma_free_coherent(d, s, v, h)
|
||||
|
||||
#define dma_mapping_error
|
||||
static inline
|
||||
int dma_mapping_error(struct device *dev, dma_addr_t dma_addr)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* Map a single buffer of the indicated size for DMA in streaming mode.
|
||||
|
|
|
@ -218,7 +218,7 @@ inline int check_gpio(unsigned gpio)
|
|||
if (gpio == GPIO_PB15 || gpio == GPIO_PC14 || gpio == GPIO_PC15
|
||||
|| gpio == GPIO_PH14 || gpio == GPIO_PH15
|
||||
|| gpio == GPIO_PJ14 || gpio == GPIO_PJ15
|
||||
|| gpio > MAX_BLACKFIN_GPIOS)
|
||||
|| gpio >= MAX_BLACKFIN_GPIOS)
|
||||
return -EINVAL;
|
||||
return 0;
|
||||
}
|
||||
|
|
|
@ -188,10 +188,11 @@ static struct cplb_desc cplb_data[] = {
|
|||
|
||||
static u16 __init lock_kernel_check(u32 start, u32 end)
|
||||
{
|
||||
if ((end <= (u32) _end && end >= (u32)_stext) ||
|
||||
(start <= (u32) _end && start >= (u32)_stext))
|
||||
return IN_KERNEL;
|
||||
return 0;
|
||||
if (start >= (u32)_end || end <= (u32)_stext)
|
||||
return 0;
|
||||
|
||||
/* This cplb block overlapped with kernel area. */
|
||||
return IN_KERNEL;
|
||||
}
|
||||
|
||||
static unsigned short __init
|
||||
|
|
|
@ -351,9 +351,14 @@ int _access_ok(unsigned long addr, unsigned long size)
|
|||
return 1;
|
||||
#endif
|
||||
#if L1_DATA_B_LENGTH != 0
|
||||
if (addr >= L1_DATA_B_START
|
||||
if (addr >= L1_DATA_B_START + (_ebss_b_l1 - _sdata_b_l1)
|
||||
&& addr + size <= L1_DATA_B_START + L1_DATA_B_LENGTH)
|
||||
return 1;
|
||||
#endif
|
||||
#if L2_LENGTH != 0
|
||||
if (addr >= L2_START + (_ebss_l2 - _stext_l2)
|
||||
&& addr + size <= L2_START + L2_LENGTH)
|
||||
return 1;
|
||||
#endif
|
||||
return 0;
|
||||
}
|
||||
|
|
|
@ -119,23 +119,23 @@ void __init bfin_relocate_l1_mem(void)
|
|||
/* Copy _stext_l1 to _etext_l1 to L1 instruction SRAM */
|
||||
dma_memcpy(_stext_l1, _l1_lma_start, l1_code_length);
|
||||
|
||||
l1_data_a_length = _ebss_l1 - _sdata_l1;
|
||||
l1_data_a_length = _sbss_l1 - _sdata_l1;
|
||||
if (l1_data_a_length > L1_DATA_A_LENGTH)
|
||||
panic("L1 Data SRAM Bank A Overflow\n");
|
||||
|
||||
/* Copy _sdata_l1 to _ebss_l1 to L1 data bank A SRAM */
|
||||
/* Copy _sdata_l1 to _sbss_l1 to L1 data bank A SRAM */
|
||||
dma_memcpy(_sdata_l1, _l1_lma_start + l1_code_length, l1_data_a_length);
|
||||
|
||||
l1_data_b_length = _ebss_b_l1 - _sdata_b_l1;
|
||||
l1_data_b_length = _sbss_b_l1 - _sdata_b_l1;
|
||||
if (l1_data_b_length > L1_DATA_B_LENGTH)
|
||||
panic("L1 Data SRAM Bank B Overflow\n");
|
||||
|
||||
/* Copy _sdata_b_l1 to _ebss_b_l1 to L1 data bank B SRAM */
|
||||
/* Copy _sdata_b_l1 to _sbss_b_l1 to L1 data bank B SRAM */
|
||||
dma_memcpy(_sdata_b_l1, _l1_lma_start + l1_code_length +
|
||||
l1_data_a_length, l1_data_b_length);
|
||||
|
||||
if (L2_LENGTH != 0) {
|
||||
l2_length = _ebss_l2 - _stext_l2;
|
||||
l2_length = _sbss_l2 - _stext_l2;
|
||||
if (l2_length > L2_LENGTH)
|
||||
panic("L2 SRAM Overflow\n");
|
||||
|
||||
|
@ -827,7 +827,7 @@ void __init setup_arch(char **cmdline_p)
|
|||
printk(KERN_ERR "Warning: Compiled for Rev %d, but running on Rev %d\n",
|
||||
bfin_compiled_revid(), bfin_revid());
|
||||
}
|
||||
if (bfin_revid() <= CONFIG_BF_REV_MIN || bfin_revid() > CONFIG_BF_REV_MAX)
|
||||
if (bfin_revid() < CONFIG_BF_REV_MIN || bfin_revid() > CONFIG_BF_REV_MAX)
|
||||
printk(KERN_ERR "Warning: Unsupported Chip Revision ADSP-%s Rev 0.%d detected\n",
|
||||
CPU, bfin_revid());
|
||||
}
|
||||
|
|
|
@ -59,7 +59,7 @@
|
|||
#endif
|
||||
|
||||
|
||||
#ifdef CONFIG_VERBOSE_DEBUG
|
||||
#ifdef CONFIG_DEBUG_VERBOSE
|
||||
#define verbose_printk(fmt, arg...) \
|
||||
printk(fmt, ##arg)
|
||||
#else
|
||||
|
@ -147,9 +147,12 @@ static void decode_address(char *buf, unsigned long address)
|
|||
char *name = p->comm;
|
||||
struct file *file = vma->vm_file;
|
||||
|
||||
if (file)
|
||||
name = d_path(&file->f_path, _tmpbuf,
|
||||
if (file) {
|
||||
char *d_name = d_path(&file->f_path, _tmpbuf,
|
||||
sizeof(_tmpbuf));
|
||||
if (!IS_ERR(d_name))
|
||||
name = d_name;
|
||||
}
|
||||
|
||||
/* FLAT does not have its text aligned to the start of
|
||||
* the map while FDPIC ELF does ...
|
||||
|
@ -571,7 +574,7 @@ asmlinkage void trap_c(struct pt_regs *fp)
|
|||
#endif
|
||||
panic("Kernel exception");
|
||||
} else {
|
||||
#ifdef CONFIG_VERBOSE_DEBUG
|
||||
#ifdef CONFIG_DEBUG_VERBOSE
|
||||
unsigned long *stack;
|
||||
/* Dump the user space stack */
|
||||
stack = (unsigned long *)rdusp();
|
||||
|
|
|
@ -25,9 +25,13 @@
|
|||
*/
|
||||
.macro do_flush flushins:req optflushins optnopins label
|
||||
|
||||
R2 = -L1_CACHE_BYTES;
|
||||
|
||||
/* start = (start & -L1_CACHE_BYTES) */
|
||||
R0 = R0 & R2;
|
||||
|
||||
/* end = ((end - 1) & -L1_CACHE_BYTES) + L1_CACHE_BYTES; */
|
||||
R1 += -1;
|
||||
R2 = -L1_CACHE_BYTES;
|
||||
R1 = R1 & R2;
|
||||
R1 += L1_CACHE_BYTES;
|
||||
|
||||
|
@ -63,7 +67,7 @@ ENDPROC(_blackfin_icache_flush_range)
|
|||
|
||||
/* Flush all cache lines assocoiated with this area of memory. */
|
||||
ENTRY(_blackfin_icache_dcache_flush_range)
|
||||
do_flush IFLUSH, FLUSH
|
||||
do_flush FLUSH, IFLUSH
|
||||
ENDPROC(_blackfin_icache_dcache_flush_range)
|
||||
|
||||
/* Throw away all D-cached data in specified region without any obligation to
|
||||
|
|
|
@ -72,13 +72,13 @@ unsigned int __bfin_cycles_mod;
|
|||
|
||||
/**************************************************************************/
|
||||
|
||||
static unsigned int bfin_getfreq(unsigned int cpu)
|
||||
static unsigned int bfin_getfreq_khz(unsigned int cpu)
|
||||
{
|
||||
/* The driver only support single cpu */
|
||||
if (cpu != 0)
|
||||
return -1;
|
||||
|
||||
return get_cclk();
|
||||
return get_cclk() / 1000;
|
||||
}
|
||||
|
||||
|
||||
|
@ -96,7 +96,7 @@ static int bfin_target(struct cpufreq_policy *policy,
|
|||
|
||||
cclk_hz = bfin_freq_table[index].frequency;
|
||||
|
||||
freqs.old = bfin_getfreq(0);
|
||||
freqs.old = bfin_getfreq_khz(0);
|
||||
freqs.new = cclk_hz;
|
||||
freqs.cpu = 0;
|
||||
|
||||
|
@ -137,8 +137,8 @@ static int __init __bfin_cpu_init(struct cpufreq_policy *policy)
|
|||
if (policy->cpu != 0)
|
||||
return -EINVAL;
|
||||
|
||||
cclk = get_cclk();
|
||||
sclk = get_sclk();
|
||||
cclk = get_cclk() / 1000;
|
||||
sclk = get_sclk() / 1000;
|
||||
|
||||
#if ANOMALY_05000273 || (!defined(CONFIG_BF54x) && defined(CONFIG_BFIN_DCACHE))
|
||||
min_cclk = sclk * 2;
|
||||
|
@ -152,7 +152,7 @@ static int __init __bfin_cpu_init(struct cpufreq_policy *policy)
|
|||
dpm_state_table[index].csel = csel << 4; /* Shift now into PLL_DIV bitpos */
|
||||
dpm_state_table[index].tscale = (TIME_SCALE / (1 << csel)) - 1;
|
||||
|
||||
pr_debug("cpufreq: freq:%d csel:%d tscale:%d\n",
|
||||
pr_debug("cpufreq: freq:%d csel:0x%x tscale:%d\n",
|
||||
bfin_freq_table[index].frequency,
|
||||
dpm_state_table[index].csel,
|
||||
dpm_state_table[index].tscale);
|
||||
|
@ -173,7 +173,7 @@ static struct freq_attr *bfin_freq_attr[] = {
|
|||
static struct cpufreq_driver bfin_driver = {
|
||||
.verify = bfin_verify_speed,
|
||||
.target = bfin_target,
|
||||
.get = bfin_getfreq,
|
||||
.get = bfin_getfreq_khz,
|
||||
.init = __bfin_cpu_init,
|
||||
.name = "bfin cpufreq",
|
||||
.owner = THIS_MODULE,
|
||||
|
|
|
@ -277,7 +277,7 @@ ENTRY(_bfin_return_from_exception)
|
|||
p5.h = hi(ILAT);
|
||||
r6 = [p5];
|
||||
r7 = 0x20; /* Did I just cause anther HW error? */
|
||||
r7 = r7 & r1;
|
||||
r6 = r7 & r6;
|
||||
CC = R7 == R6;
|
||||
if CC JUMP _double_fault;
|
||||
#endif
|
||||
|
|
|
@ -183,10 +183,10 @@ static void __init l2_sram_init(void)
|
|||
return;
|
||||
}
|
||||
|
||||
free_l2_sram_head.next->paddr = (void *)L2_START +
|
||||
(_etext_l2 - _stext_l2) + (_edata_l2 - _sdata_l2);
|
||||
free_l2_sram_head.next->size = L2_LENGTH -
|
||||
(_etext_l2 - _stext_l2) + (_edata_l2 - _sdata_l2);
|
||||
free_l2_sram_head.next->paddr =
|
||||
(void *)L2_START + (_ebss_l2 - _stext_l2);
|
||||
free_l2_sram_head.next->size =
|
||||
L2_LENGTH - (_ebss_l2 - _stext_l2);
|
||||
free_l2_sram_head.next->pid = 0;
|
||||
free_l2_sram_head.next->next = NULL;
|
||||
|
||||
|
|
|
@ -20,6 +20,8 @@ if VIRTUALIZATION
|
|||
config KVM
|
||||
tristate "Kernel-based Virtual Machine (KVM) support"
|
||||
depends on HAVE_KVM && EXPERIMENTAL
|
||||
# for device assignment:
|
||||
depends on PCI
|
||||
select PREEMPT_NOTIFIERS
|
||||
select ANON_INODES
|
||||
---help---
|
||||
|
|
|
@ -673,16 +673,16 @@ int kvm_arch_vcpu_ioctl_run(struct kvm_vcpu *vcpu, struct kvm_run *kvm_run)
|
|||
|
||||
vcpu_load(vcpu);
|
||||
|
||||
if (vcpu->sigset_active)
|
||||
sigprocmask(SIG_SETMASK, &vcpu->sigset, &sigsaved);
|
||||
|
||||
if (unlikely(vcpu->arch.mp_state == KVM_MP_STATE_UNINITIALIZED)) {
|
||||
kvm_vcpu_block(vcpu);
|
||||
clear_bit(KVM_REQ_UNHALT, &vcpu->requests);
|
||||
vcpu_put(vcpu);
|
||||
return -EAGAIN;
|
||||
r = -EAGAIN;
|
||||
goto out;
|
||||
}
|
||||
|
||||
if (vcpu->sigset_active)
|
||||
sigprocmask(SIG_SETMASK, &vcpu->sigset, &sigsaved);
|
||||
|
||||
if (vcpu->mmio_needed) {
|
||||
memcpy(vcpu->mmio_data, kvm_run->mmio.data, 8);
|
||||
kvm_set_mmio_data(vcpu);
|
||||
|
@ -690,7 +690,7 @@ int kvm_arch_vcpu_ioctl_run(struct kvm_vcpu *vcpu, struct kvm_run *kvm_run)
|
|||
vcpu->mmio_needed = 0;
|
||||
}
|
||||
r = __vcpu_run(vcpu, kvm_run);
|
||||
|
||||
out:
|
||||
if (vcpu->sigset_active)
|
||||
sigprocmask(SIG_SETMASK, &sigsaved, NULL);
|
||||
|
||||
|
|
|
@ -384,6 +384,10 @@ static inline u64 __gpfn_is_io(u64 gpfn)
|
|||
#define MODE_IND(psr) \
|
||||
(((psr).it << 2) + ((psr).dt << 1) + (psr).rt)
|
||||
|
||||
#ifndef CONFIG_SMP
|
||||
#define _vmm_raw_spin_lock(x) do {}while(0)
|
||||
#define _vmm_raw_spin_unlock(x) do {}while(0)
|
||||
#else
|
||||
#define _vmm_raw_spin_lock(x) \
|
||||
do { \
|
||||
__u32 *ia64_spinlock_ptr = (__u32 *) (x); \
|
||||
|
@ -403,6 +407,7 @@ static inline u64 __gpfn_is_io(u64 gpfn)
|
|||
do { barrier(); \
|
||||
((spinlock_t *)x)->raw_lock.lock = 0; } \
|
||||
while (0)
|
||||
#endif
|
||||
|
||||
void vmm_spin_lock(spinlock_t *lock);
|
||||
void vmm_spin_unlock(spinlock_t *lock);
|
||||
|
|
|
@ -133,7 +133,7 @@ void __init m68k_setup_user_interrupt(unsigned int vec, unsigned int cnt,
|
|||
{
|
||||
int i;
|
||||
|
||||
BUG_ON(IRQ_USER + cnt >= NR_IRQS);
|
||||
BUG_ON(IRQ_USER + cnt > NR_IRQS);
|
||||
m68k_first_user_vec = vec;
|
||||
for (i = 0; i < cnt; i++)
|
||||
irq_controller[IRQ_USER + i] = &user_irq_controller;
|
||||
|
|
|
@ -15,6 +15,15 @@ config DEBUG_DECOMPRESS_KERNEL
|
|||
decompressing Linux seeing "Uncompressing Linux... " and
|
||||
"Ok, booting the kernel.\n" on console.
|
||||
|
||||
config TEST_MISALIGNMENT_HANDLER
|
||||
bool "Run tests on the misalignment handler"
|
||||
depends on DEBUG_KERNEL
|
||||
default n
|
||||
help
|
||||
If you say Y here the kernel will execute a list of misaligned memory
|
||||
accesses to make sure the misalignment handler deals them with
|
||||
correctly. If it does not, the kernel will throw a BUG.
|
||||
|
||||
config KPROBES
|
||||
bool "Kprobes"
|
||||
depends on DEBUG_KERNEL
|
||||
|
|
|
@ -37,26 +37,22 @@
|
|||
#include <asm/asm-offsets.h>
|
||||
|
||||
#if 0
|
||||
#define kdebug(FMT, ...) printk(KERN_DEBUG FMT, ##__VA_ARGS__)
|
||||
#define kdebug(FMT, ...) printk(KERN_DEBUG "MISALIGN: "FMT"\n", ##__VA_ARGS__)
|
||||
#else
|
||||
#define kdebug(FMT, ...) do {} while (0)
|
||||
#endif
|
||||
|
||||
static int misalignment_addr(unsigned long *registers, unsigned params,
|
||||
unsigned opcode, unsigned disp,
|
||||
void **_address, unsigned long **_postinc);
|
||||
static int misalignment_addr(unsigned long *registers, unsigned long sp,
|
||||
unsigned params, unsigned opcode,
|
||||
unsigned long disp,
|
||||
void **_address, unsigned long **_postinc,
|
||||
unsigned long *_inc);
|
||||
|
||||
static int misalignment_reg(unsigned long *registers, unsigned params,
|
||||
unsigned opcode, unsigned disp,
|
||||
unsigned opcode, unsigned long disp,
|
||||
unsigned long **_register);
|
||||
|
||||
static inline unsigned int_log2(unsigned x)
|
||||
{
|
||||
unsigned y;
|
||||
asm("bsch %1,%0" : "=r"(y) : "r"(x), "0"(0));
|
||||
return y;
|
||||
}
|
||||
#define log2(x) int_log2(x)
|
||||
static void misalignment_MOV_Lcc(struct pt_regs *regs, uint32_t opcode);
|
||||
|
||||
static const unsigned Dreg_index[] = {
|
||||
REG_D0 >> 2, REG_D1 >> 2, REG_D2 >> 2, REG_D3 >> 2
|
||||
|
@ -86,9 +82,10 @@ enum format_id {
|
|||
FMT_D7,
|
||||
FMT_D8,
|
||||
FMT_D9,
|
||||
FMT_D10,
|
||||
};
|
||||
|
||||
struct {
|
||||
static const struct {
|
||||
u_int8_t opsz, dispsz;
|
||||
} format_tbl[16] = {
|
||||
[FMT_S0] = { 8, 0 },
|
||||
|
@ -103,6 +100,7 @@ struct {
|
|||
[FMT_D7] = { 24, 8 },
|
||||
[FMT_D8] = { 24, 24 },
|
||||
[FMT_D9] = { 24, 32 },
|
||||
[FMT_D10] = { 32, 0 },
|
||||
};
|
||||
|
||||
enum value_id {
|
||||
|
@ -128,9 +126,14 @@ enum value_id {
|
|||
SD24, /* 24-bit signed displacement */
|
||||
SIMM4_2, /* 4-bit signed displacement in opcode bits 4-7 */
|
||||
SIMM8, /* 8-bit signed immediate */
|
||||
IMM8, /* 8-bit unsigned immediate */
|
||||
IMM16, /* 16-bit unsigned immediate */
|
||||
IMM24, /* 24-bit unsigned immediate */
|
||||
IMM32, /* 32-bit unsigned immediate */
|
||||
IMM32_HIGH8, /* 32-bit unsigned immediate, high 8-bits in opcode */
|
||||
IMM32_HIGH8, /* 32-bit unsigned immediate, LSB in opcode */
|
||||
|
||||
IMM32_MEM, /* 32-bit unsigned displacement */
|
||||
IMM32_HIGH8_MEM, /* 32-bit unsigned displacement, LSB in opcode */
|
||||
|
||||
DN0 = DM0,
|
||||
DN1 = DM1,
|
||||
|
@ -149,7 +152,7 @@ enum value_id {
|
|||
};
|
||||
|
||||
struct mn10300_opcode {
|
||||
const char *name;
|
||||
const char name[8];
|
||||
u_int32_t opcode;
|
||||
u_int32_t opmask;
|
||||
unsigned exclusion;
|
||||
|
@ -185,6 +188,10 @@ struct mn10300_opcode {
|
|||
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||
*/
|
||||
static const struct mn10300_opcode mn10300_opcodes[] = {
|
||||
{ "mov", 0x4200, 0xf300, 0, FMT_S1, 0, {DM1, MEM2(IMM8, SP)}},
|
||||
{ "mov", 0x4300, 0xf300, 0, FMT_S1, 0, {AM1, MEM2(IMM8, SP)}},
|
||||
{ "mov", 0x5800, 0xfc00, 0, FMT_S1, 0, {MEM2(IMM8, SP), DN0}},
|
||||
{ "mov", 0x5c00, 0xfc00, 0, FMT_S1, 0, {MEM2(IMM8, SP), AN0}},
|
||||
{ "mov", 0x60, 0xf0, 0, FMT_S0, 0, {DM1, MEM(AN0)}},
|
||||
{ "mov", 0x70, 0xf0, 0, FMT_S0, 0, {MEM(AM0), DN1}},
|
||||
{ "mov", 0xf000, 0xfff0, 0, FMT_D0, 0, {MEM(AM0), AN1}},
|
||||
|
@ -197,8 +204,6 @@ static const struct mn10300_opcode mn10300_opcodes[] = {
|
|||
{ "mov", 0xf81000, 0xfff000, 0, FMT_D1, 0, {DM1, MEM2(SD8, AN0)}},
|
||||
{ "mov", 0xf82000, 0xfff000, 0, FMT_D1, 0, {MEM2(SD8,AM0), AN1}},
|
||||
{ "mov", 0xf83000, 0xfff000, 0, FMT_D1, 0, {AM1, MEM2(SD8, AN0)}},
|
||||
{ "mov", 0xf8f000, 0xfffc00, 0, FMT_D1, AM33, {MEM2(SD8, AM0), SP}},
|
||||
{ "mov", 0xf8f400, 0xfffc00, 0, FMT_D1, AM33, {SP, MEM2(SD8, AN0)}},
|
||||
{ "mov", 0xf90a00, 0xffff00, 0, FMT_D6, AM33, {MEM(RM0), RN2}},
|
||||
{ "mov", 0xf91a00, 0xffff00, 0, FMT_D6, AM33, {RM2, MEM(RN0)}},
|
||||
{ "mov", 0xf96a00, 0xffff00, 0x12, FMT_D6, AM33, {MEMINC(RM0), RN2}},
|
||||
|
@ -207,24 +212,46 @@ static const struct mn10300_opcode mn10300_opcodes[] = {
|
|||
{ "mov", 0xfa100000, 0xfff00000, 0, FMT_D2, 0, {DM1, MEM2(SD16, AN0)}},
|
||||
{ "mov", 0xfa200000, 0xfff00000, 0, FMT_D2, 0, {MEM2(SD16, AM0), AN1}},
|
||||
{ "mov", 0xfa300000, 0xfff00000, 0, FMT_D2, 0, {AM1, MEM2(SD16, AN0)}},
|
||||
{ "mov", 0xfa900000, 0xfff30000, 0, FMT_D2, 0, {AM1, MEM2(IMM16, SP)}},
|
||||
{ "mov", 0xfa910000, 0xfff30000, 0, FMT_D2, 0, {DM1, MEM2(IMM16, SP)}},
|
||||
{ "mov", 0xfab00000, 0xfffc0000, 0, FMT_D2, 0, {MEM2(IMM16, SP), AN0}},
|
||||
{ "mov", 0xfab40000, 0xfffc0000, 0, FMT_D2, 0, {MEM2(IMM16, SP), DN0}},
|
||||
{ "mov", 0xfb0a0000, 0xffff0000, 0, FMT_D7, AM33, {MEM2(SD8, RM0), RN2}},
|
||||
{ "mov", 0xfb1a0000, 0xffff0000, 0, FMT_D7, AM33, {RM2, MEM2(SD8, RN0)}},
|
||||
{ "mov", 0xfb6a0000, 0xffff0000, 0x22, FMT_D7, AM33, {MEMINC2 (RM0, SIMM8), RN2}},
|
||||
{ "mov", 0xfb7a0000, 0xffff0000, 0, FMT_D7, AM33, {RM2, MEMINC2 (RN0, SIMM8)}},
|
||||
{ "mov", 0xfb8a0000, 0xffff0f00, 0, FMT_D7, AM33, {MEM2(IMM8, SP), RN2}},
|
||||
{ "mov", 0xfb8e0000, 0xffff000f, 0, FMT_D7, AM33, {MEM2(RI, RM0), RD2}},
|
||||
{ "mov", 0xfb9a0000, 0xffff0f00, 0, FMT_D7, AM33, {RM2, MEM2(IMM8, SP)}},
|
||||
{ "mov", 0xfb9e0000, 0xffff000f, 0, FMT_D7, AM33, {RD2, MEM2(RI, RN0)}},
|
||||
{ "mov", 0xfc000000, 0xfff00000, 0, FMT_D4, 0, {MEM2(IMM32,AM0), DN1}},
|
||||
{ "mov", 0xfc100000, 0xfff00000, 0, FMT_D4, 0, {DM1, MEM2(IMM32,AN0)}},
|
||||
{ "mov", 0xfc200000, 0xfff00000, 0, FMT_D4, 0, {MEM2(IMM32,AM0), AN1}},
|
||||
{ "mov", 0xfc300000, 0xfff00000, 0, FMT_D4, 0, {AM1, MEM2(IMM32,AN0)}},
|
||||
{ "mov", 0xfc800000, 0xfff30000, 0, FMT_D4, 0, {AM1, MEM(IMM32_MEM)}},
|
||||
{ "mov", 0xfc810000, 0xfff30000, 0, FMT_D4, 0, {DM1, MEM(IMM32_MEM)}},
|
||||
{ "mov", 0xfc900000, 0xfff30000, 0, FMT_D4, 0, {AM1, MEM2(IMM32, SP)}},
|
||||
{ "mov", 0xfc910000, 0xfff30000, 0, FMT_D4, 0, {DM1, MEM2(IMM32, SP)}},
|
||||
{ "mov", 0xfca00000, 0xfffc0000, 0, FMT_D4, 0, {MEM(IMM32_MEM), AN0}},
|
||||
{ "mov", 0xfca40000, 0xfffc0000, 0, FMT_D4, 0, {MEM(IMM32_MEM), DN0}},
|
||||
{ "mov", 0xfcb00000, 0xfffc0000, 0, FMT_D4, 0, {MEM2(IMM32, SP), AN0}},
|
||||
{ "mov", 0xfcb40000, 0xfffc0000, 0, FMT_D4, 0, {MEM2(IMM32, SP), DN0}},
|
||||
{ "mov", 0xfd0a0000, 0xffff0000, 0, FMT_D8, AM33, {MEM2(SD24, RM0), RN2}},
|
||||
{ "mov", 0xfd1a0000, 0xffff0000, 0, FMT_D8, AM33, {RM2, MEM2(SD24, RN0)}},
|
||||
{ "mov", 0xfd6a0000, 0xffff0000, 0x22, FMT_D8, AM33, {MEMINC2 (RM0, IMM24), RN2}},
|
||||
{ "mov", 0xfd7a0000, 0xffff0000, 0, FMT_D8, AM33, {RM2, MEMINC2 (RN0, IMM24)}},
|
||||
{ "mov", 0xfd8a0000, 0xffff0f00, 0, FMT_D8, AM33, {MEM2(IMM24, SP), RN2}},
|
||||
{ "mov", 0xfd9a0000, 0xffff0f00, 0, FMT_D8, AM33, {RM2, MEM2(IMM24, SP)}},
|
||||
{ "mov", 0xfe0a0000, 0xffff0000, 0, FMT_D9, AM33, {MEM2(IMM32_HIGH8,RM0), RN2}},
|
||||
{ "mov", 0xfe0a0000, 0xffff0000, 0, FMT_D9, AM33, {MEM2(IMM32_HIGH8,RM0), RN2}},
|
||||
{ "mov", 0xfe0e0000, 0xffff0f00, 0, FMT_D9, AM33, {MEM(IMM32_HIGH8_MEM), RN2}},
|
||||
{ "mov", 0xfe1a0000, 0xffff0000, 0, FMT_D9, AM33, {RM2, MEM2(IMM32_HIGH8, RN0)}},
|
||||
{ "mov", 0xfe1a0000, 0xffff0000, 0, FMT_D9, AM33, {RM2, MEM2(IMM32_HIGH8, RN0)}},
|
||||
{ "mov", 0xfe1e0000, 0xffff0f00, 0, FMT_D9, AM33, {RM2, MEM(IMM32_HIGH8_MEM)}},
|
||||
{ "mov", 0xfe6a0000, 0xffff0000, 0x22, FMT_D9, AM33, {MEMINC2 (RM0, IMM32_HIGH8), RN2}},
|
||||
{ "mov", 0xfe7a0000, 0xffff0000, 0, FMT_D9, AM33, {RN2, MEMINC2 (RM0, IMM32_HIGH8)}},
|
||||
{ "mov", 0xfe8a0000, 0xffff0f00, 0, FMT_D9, AM33, {MEM2(IMM32_HIGH8, SP), RN2}},
|
||||
{ "mov", 0xfe9a0000, 0xffff0f00, 0, FMT_D9, AM33, {RM2, MEM2(IMM32_HIGH8, SP)}},
|
||||
|
||||
{ "movhu", 0xf060, 0xfff0, 0, FMT_D0, 0, {MEM(AM0), DN1}},
|
||||
{ "movhu", 0xf070, 0xfff0, 0, FMT_D0, 0, {DM1, MEM(AN0)}},
|
||||
|
@ -232,29 +259,58 @@ static const struct mn10300_opcode mn10300_opcodes[] = {
|
|||
{ "movhu", 0xf4c0, 0xffc0, 0, FMT_D0, 0, {DM2, MEM2(DI, AN0)}},
|
||||
{ "movhu", 0xf86000, 0xfff000, 0, FMT_D1, 0, {MEM2(SD8, AM0), DN1}},
|
||||
{ "movhu", 0xf87000, 0xfff000, 0, FMT_D1, 0, {DM1, MEM2(SD8, AN0)}},
|
||||
{ "movhu", 0xf89300, 0xfff300, 0, FMT_D1, 0, {DM1, MEM2(IMM8, SP)}},
|
||||
{ "movhu", 0xf8bc00, 0xfffc00, 0, FMT_D1, 0, {MEM2(IMM8, SP), DN0}},
|
||||
{ "movhu", 0xf94a00, 0xffff00, 0, FMT_D6, AM33, {MEM(RM0), RN2}},
|
||||
{ "movhu", 0xf95a00, 0xffff00, 0, FMT_D6, AM33, {RM2, MEM(RN0)}},
|
||||
{ "movhu", 0xf9ea00, 0xffff00, 0x12, FMT_D6, AM33, {MEMINC(RM0), RN2}},
|
||||
{ "movhu", 0xf9fa00, 0xffff00, 0, FMT_D6, AM33, {RM2, MEMINC(RN0)}},
|
||||
{ "movhu", 0xfa600000, 0xfff00000, 0, FMT_D2, 0, {MEM2(SD16, AM0), DN1}},
|
||||
{ "movhu", 0xfa700000, 0xfff00000, 0, FMT_D2, 0, {DM1, MEM2(SD16, AN0)}},
|
||||
{ "movhu", 0xfa930000, 0xfff30000, 0, FMT_D2, 0, {DM1, MEM2(IMM16, SP)}},
|
||||
{ "movhu", 0xfabc0000, 0xfffc0000, 0, FMT_D2, 0, {MEM2(IMM16, SP), DN0}},
|
||||
{ "movhu", 0xfb4a0000, 0xffff0000, 0, FMT_D7, AM33, {MEM2(SD8, RM0), RN2}},
|
||||
{ "movhu", 0xfb5a0000, 0xffff0000, 0, FMT_D7, AM33, {RM2, MEM2(SD8, RN0)}},
|
||||
{ "movhu", 0xfbca0000, 0xffff0f00, 0, FMT_D7, AM33, {MEM2(IMM8, SP), RN2}},
|
||||
{ "movhu", 0xfbce0000, 0xffff000f, 0, FMT_D7, AM33, {MEM2(RI, RM0), RD2}},
|
||||
{ "movhu", 0xfbda0000, 0xffff0f00, 0, FMT_D7, AM33, {RM2, MEM2(IMM8, SP)}},
|
||||
{ "movhu", 0xfbde0000, 0xffff000f, 0, FMT_D7, AM33, {RD2, MEM2(RI, RN0)}},
|
||||
{ "movhu", 0xfbea0000, 0xffff0000, 0x22, FMT_D7, AM33, {MEMINC2 (RM0, SIMM8), RN2}},
|
||||
{ "movhu", 0xfbfa0000, 0xffff0000, 0, FMT_D7, AM33, {RM2, MEMINC2 (RN0, SIMM8)}},
|
||||
{ "movhu", 0xfc600000, 0xfff00000, 0, FMT_D4, 0, {MEM2(IMM32,AM0), DN1}},
|
||||
{ "movhu", 0xfc700000, 0xfff00000, 0, FMT_D4, 0, {DM1, MEM2(IMM32,AN0)}},
|
||||
{ "movhu", 0xfc830000, 0xfff30000, 0, FMT_D4, 0, {DM1, MEM(IMM32_MEM)}},
|
||||
{ "movhu", 0xfc930000, 0xfff30000, 0, FMT_D4, 0, {DM1, MEM2(IMM32, SP)}},
|
||||
{ "movhu", 0xfcac0000, 0xfffc0000, 0, FMT_D4, 0, {MEM(IMM32_MEM), DN0}},
|
||||
{ "movhu", 0xfcbc0000, 0xfffc0000, 0, FMT_D4, 0, {MEM2(IMM32, SP), DN0}},
|
||||
{ "movhu", 0xfd4a0000, 0xffff0000, 0, FMT_D8, AM33, {MEM2(SD24, RM0), RN2}},
|
||||
{ "movhu", 0xfd5a0000, 0xffff0000, 0, FMT_D8, AM33, {RM2, MEM2(SD24, RN0)}},
|
||||
{ "movhu", 0xfdca0000, 0xffff0f00, 0, FMT_D8, AM33, {MEM2(IMM24, SP), RN2}},
|
||||
{ "movhu", 0xfdda0000, 0xffff0f00, 0, FMT_D8, AM33, {RM2, MEM2(IMM24, SP)}},
|
||||
{ "movhu", 0xfdea0000, 0xffff0000, 0x22, FMT_D8, AM33, {MEMINC2 (RM0, IMM24), RN2}},
|
||||
{ "movhu", 0xfdfa0000, 0xffff0000, 0, FMT_D8, AM33, {RM2, MEMINC2 (RN0, IMM24)}},
|
||||
{ "movhu", 0xfe4a0000, 0xffff0000, 0, FMT_D9, AM33, {MEM2(IMM32_HIGH8,RM0), RN2}},
|
||||
{ "movhu", 0xfe4e0000, 0xffff0f00, 0, FMT_D9, AM33, {MEM(IMM32_HIGH8_MEM), RN2}},
|
||||
{ "movhu", 0xfe5a0000, 0xffff0000, 0, FMT_D9, AM33, {RM2, MEM2(IMM32_HIGH8, RN0)}},
|
||||
{ "movhu", 0xfe5e0000, 0xffff0f00, 0, FMT_D9, AM33, {RM2, MEM(IMM32_HIGH8_MEM)}},
|
||||
{ "movhu", 0xfeca0000, 0xffff0f00, 0, FMT_D9, AM33, {MEM2(IMM32_HIGH8, SP), RN2}},
|
||||
{ "movhu", 0xfeda0000, 0xffff0f00, 0, FMT_D9, AM33, {RM2, MEM2(IMM32_HIGH8, SP)}},
|
||||
{ "movhu", 0xfeea0000, 0xffff0000, 0x22, FMT_D9, AM33, {MEMINC2 (RM0, IMM32_HIGH8), RN2}},
|
||||
{ "movhu", 0xfefa0000, 0xffff0000, 0, FMT_D9, AM33, {RN2, MEMINC2 (RM0, IMM32_HIGH8)}},
|
||||
{ 0, 0, 0, 0, 0, 0, {0}},
|
||||
|
||||
{ "mov_llt", 0xf7e00000, 0xffff000f, 0x22, FMT_D10, AM33, {MEMINC2 (RN4,SIMM4_2), RM6}},
|
||||
{ "mov_lgt", 0xf7e00001, 0xffff000f, 0x22, FMT_D10, AM33, {MEMINC2 (RN4,SIMM4_2), RM6}},
|
||||
{ "mov_lge", 0xf7e00002, 0xffff000f, 0x22, FMT_D10, AM33, {MEMINC2 (RN4,SIMM4_2), RM6}},
|
||||
{ "mov_lle", 0xf7e00003, 0xffff000f, 0x22, FMT_D10, AM33, {MEMINC2 (RN4,SIMM4_2), RM6}},
|
||||
{ "mov_lcs", 0xf7e00004, 0xffff000f, 0x22, FMT_D10, AM33, {MEMINC2 (RN4,SIMM4_2), RM6}},
|
||||
{ "mov_lhi", 0xf7e00005, 0xffff000f, 0x22, FMT_D10, AM33, {MEMINC2 (RN4,SIMM4_2), RM6}},
|
||||
{ "mov_lcc", 0xf7e00006, 0xffff000f, 0x22, FMT_D10, AM33, {MEMINC2 (RN4,SIMM4_2), RM6}},
|
||||
{ "mov_lls", 0xf7e00007, 0xffff000f, 0x22, FMT_D10, AM33, {MEMINC2 (RN4,SIMM4_2), RM6}},
|
||||
{ "mov_leq", 0xf7e00008, 0xffff000f, 0x22, FMT_D10, AM33, {MEMINC2 (RN4,SIMM4_2), RM6}},
|
||||
{ "mov_lne", 0xf7e00009, 0xffff000f, 0x22, FMT_D10, AM33, {MEMINC2 (RN4,SIMM4_2), RM6}},
|
||||
{ "mov_lra", 0xf7e0000a, 0xffff000f, 0x22, FMT_D10, AM33, {MEMINC2 (RN4,SIMM4_2), RM6}},
|
||||
|
||||
{ "", 0, 0, 0, 0, 0, {0}},
|
||||
};
|
||||
|
||||
/*
|
||||
|
@ -265,18 +321,21 @@ asmlinkage void misalignment(struct pt_regs *regs, enum exception_code code)
|
|||
const struct exception_table_entry *fixup;
|
||||
const struct mn10300_opcode *pop;
|
||||
unsigned long *registers = (unsigned long *) regs;
|
||||
unsigned long data, *store, *postinc;
|
||||
unsigned long data, *store, *postinc, disp, inc, sp;
|
||||
mm_segment_t seg;
|
||||
siginfo_t info;
|
||||
uint32_t opcode, disp, noc, xo, xm;
|
||||
uint8_t *pc, byte;
|
||||
uint32_t opcode, noc, xo, xm;
|
||||
uint8_t *pc, byte, datasz;
|
||||
void *address;
|
||||
unsigned tmp, npop;
|
||||
unsigned tmp, npop, dispsz, loop;
|
||||
|
||||
kdebug("MISALIGN at %lx\n", regs->pc);
|
||||
/* we don't fix up userspace misalignment faults */
|
||||
if (user_mode(regs))
|
||||
goto bus_error;
|
||||
|
||||
if (in_interrupt())
|
||||
die("Misalignment trap in interrupt context", regs, code);
|
||||
sp = (unsigned long) regs + sizeof(*regs);
|
||||
|
||||
kdebug("==>misalignment({pc=%lx,sp=%lx})", regs->pc, sp);
|
||||
|
||||
if (regs->epsw & EPSW_IE)
|
||||
asm volatile("or %0,epsw" : : "i"(EPSW_IE));
|
||||
|
@ -294,8 +353,8 @@ asmlinkage void misalignment(struct pt_regs *regs, enum exception_code code)
|
|||
opcode = byte;
|
||||
noc = 8;
|
||||
|
||||
for (pop = mn10300_opcodes; pop->name; pop++) {
|
||||
npop = log2(pop->opcode | pop->opmask);
|
||||
for (pop = mn10300_opcodes; pop->name[0]; pop++) {
|
||||
npop = ilog2(pop->opcode | pop->opmask);
|
||||
if (npop <= 0 || npop > 31)
|
||||
continue;
|
||||
npop = (npop + 8) & ~7;
|
||||
|
@ -328,15 +387,15 @@ asmlinkage void misalignment(struct pt_regs *regs, enum exception_code code)
|
|||
}
|
||||
|
||||
/* didn't manage to find a fixup */
|
||||
if (!user_mode(regs))
|
||||
printk(KERN_CRIT "MISALIGN: %lx: unsupported instruction %x\n",
|
||||
regs->pc, opcode);
|
||||
printk(KERN_CRIT "MISALIGN: %lx: unsupported instruction %x\n",
|
||||
regs->pc, opcode);
|
||||
|
||||
failed:
|
||||
set_fs(seg);
|
||||
if (die_if_no_fixup("misalignment error", regs, code))
|
||||
return;
|
||||
|
||||
bus_error:
|
||||
info.si_signo = SIGBUS;
|
||||
info.si_errno = 0;
|
||||
info.si_code = BUS_ADRALN;
|
||||
|
@ -346,31 +405,27 @@ failed:
|
|||
|
||||
/* error reading opcodes */
|
||||
fetch_error:
|
||||
if (!user_mode(regs))
|
||||
printk(KERN_CRIT
|
||||
"MISALIGN: %p: fault whilst reading instruction data\n",
|
||||
pc);
|
||||
printk(KERN_CRIT
|
||||
"MISALIGN: %p: fault whilst reading instruction data\n",
|
||||
pc);
|
||||
goto failed;
|
||||
|
||||
bad_addr_mode:
|
||||
if (!user_mode(regs))
|
||||
printk(KERN_CRIT
|
||||
"MISALIGN: %lx: unsupported addressing mode %x\n",
|
||||
regs->pc, opcode);
|
||||
printk(KERN_CRIT
|
||||
"MISALIGN: %lx: unsupported addressing mode %x\n",
|
||||
regs->pc, opcode);
|
||||
goto failed;
|
||||
|
||||
bad_reg_mode:
|
||||
if (!user_mode(regs))
|
||||
printk(KERN_CRIT
|
||||
"MISALIGN: %lx: unsupported register mode %x\n",
|
||||
regs->pc, opcode);
|
||||
printk(KERN_CRIT
|
||||
"MISALIGN: %lx: unsupported register mode %x\n",
|
||||
regs->pc, opcode);
|
||||
goto failed;
|
||||
|
||||
unsupported_instruction:
|
||||
if (!user_mode(regs))
|
||||
printk(KERN_CRIT
|
||||
"MISALIGN: %lx: unsupported instruction %x (%s)\n",
|
||||
regs->pc, opcode, pop->name);
|
||||
printk(KERN_CRIT
|
||||
"MISALIGN: %lx: unsupported instruction %x (%s)\n",
|
||||
regs->pc, opcode, pop->name);
|
||||
goto failed;
|
||||
|
||||
transfer_failed:
|
||||
|
@ -391,7 +446,7 @@ transfer_failed:
|
|||
|
||||
/* we matched the opcode */
|
||||
found_opcode:
|
||||
kdebug("MISALIGN: %lx: %x==%x { %x, %x }\n",
|
||||
kdebug("%lx: %x==%x { %x, %x }",
|
||||
regs->pc, opcode, pop->opcode, pop->params[0], pop->params[1]);
|
||||
|
||||
tmp = format_tbl[pop->format].opsz;
|
||||
|
@ -406,106 +461,108 @@ found_opcode:
|
|||
|
||||
/* grab the extra displacement (note it's LSB first) */
|
||||
disp = 0;
|
||||
tmp = format_tbl[pop->format].dispsz >> 3;
|
||||
while (tmp > 0) {
|
||||
tmp--;
|
||||
disp <<= 8;
|
||||
|
||||
dispsz = format_tbl[pop->format].dispsz;
|
||||
for (loop = 0; loop < dispsz; loop += 8) {
|
||||
pc++;
|
||||
if (__get_user(byte, pc) != 0)
|
||||
goto fetch_error;
|
||||
disp |= byte;
|
||||
disp |= byte << loop;
|
||||
kdebug("{%p} disp[%02x]=%02x", pc, loop, byte);
|
||||
}
|
||||
|
||||
kdebug("disp=%lx", disp);
|
||||
|
||||
set_fs(KERNEL_XDS);
|
||||
if (fixup || regs->epsw & EPSW_nSL)
|
||||
if (fixup)
|
||||
set_fs(seg);
|
||||
|
||||
tmp = (pop->params[0] ^ pop->params[1]) & 0x80000000;
|
||||
if (!tmp) {
|
||||
if (!user_mode(regs))
|
||||
printk(KERN_CRIT
|
||||
"MISALIGN: %lx:"
|
||||
" insn not move to/from memory %x\n",
|
||||
regs->pc, opcode);
|
||||
printk(KERN_CRIT
|
||||
"MISALIGN: %lx: insn not move to/from memory %x\n",
|
||||
regs->pc, opcode);
|
||||
goto failed;
|
||||
}
|
||||
|
||||
/* determine the data transfer size of the move */
|
||||
if (pop->name[3] == 0 || /* "mov" */
|
||||
pop->name[4] == 'l') /* mov_lcc */
|
||||
inc = datasz = 4;
|
||||
else if (pop->name[3] == 'h') /* movhu */
|
||||
inc = datasz = 2;
|
||||
else
|
||||
goto unsupported_instruction;
|
||||
|
||||
if (pop->params[0] & 0x80000000) {
|
||||
/* move memory to register */
|
||||
if (!misalignment_addr(registers, pop->params[0], opcode, disp,
|
||||
&address, &postinc))
|
||||
if (!misalignment_addr(registers, sp,
|
||||
pop->params[0], opcode, disp,
|
||||
&address, &postinc, &inc))
|
||||
goto bad_addr_mode;
|
||||
|
||||
if (!misalignment_reg(registers, pop->params[1], opcode, disp,
|
||||
&store))
|
||||
goto bad_reg_mode;
|
||||
|
||||
if (strcmp(pop->name, "mov") == 0) {
|
||||
kdebug("FIXUP: mov (%p),DARn\n", address);
|
||||
if (copy_from_user(&data, (void *) address, 4) != 0)
|
||||
goto transfer_failed;
|
||||
if (pop->params[0] & 0x1000000)
|
||||
*postinc += 4;
|
||||
} else if (strcmp(pop->name, "movhu") == 0) {
|
||||
kdebug("FIXUP: movhu (%p),DARn\n", address);
|
||||
data = 0;
|
||||
if (copy_from_user(&data, (void *) address, 2) != 0)
|
||||
goto transfer_failed;
|
||||
if (pop->params[0] & 0x1000000)
|
||||
*postinc += 2;
|
||||
} else {
|
||||
goto unsupported_instruction;
|
||||
kdebug("mov%u (%p),DARn", datasz, address);
|
||||
if (copy_from_user(&data, (void *) address, datasz) != 0)
|
||||
goto transfer_failed;
|
||||
if (pop->params[0] & 0x1000000) {
|
||||
kdebug("inc=%lx", inc);
|
||||
*postinc += inc;
|
||||
}
|
||||
|
||||
*store = data;
|
||||
kdebug("loaded %lx", data);
|
||||
} else {
|
||||
/* move register to memory */
|
||||
if (!misalignment_reg(registers, pop->params[0], opcode, disp,
|
||||
&store))
|
||||
goto bad_reg_mode;
|
||||
|
||||
if (!misalignment_addr(registers, pop->params[1], opcode, disp,
|
||||
&address, &postinc))
|
||||
if (!misalignment_addr(registers, sp,
|
||||
pop->params[1], opcode, disp,
|
||||
&address, &postinc, &inc))
|
||||
goto bad_addr_mode;
|
||||
|
||||
data = *store;
|
||||
|
||||
if (strcmp(pop->name, "mov") == 0) {
|
||||
kdebug("FIXUP: mov %lx,(%p)\n", data, address);
|
||||
if (copy_to_user((void *) address, &data, 4) != 0)
|
||||
goto transfer_failed;
|
||||
if (pop->params[1] & 0x1000000)
|
||||
*postinc += 4;
|
||||
} else if (strcmp(pop->name, "movhu") == 0) {
|
||||
kdebug("FIXUP: movhu %hx,(%p)\n",
|
||||
(uint16_t) data, address);
|
||||
if (copy_to_user((void *) address, &data, 2) != 0)
|
||||
goto transfer_failed;
|
||||
if (pop->params[1] & 0x1000000)
|
||||
*postinc += 2;
|
||||
} else {
|
||||
goto unsupported_instruction;
|
||||
}
|
||||
kdebug("mov%u %lx,(%p)", datasz, data, address);
|
||||
if (copy_to_user((void *) address, &data, datasz) != 0)
|
||||
goto transfer_failed;
|
||||
if (pop->params[1] & 0x1000000)
|
||||
*postinc += inc;
|
||||
}
|
||||
|
||||
tmp = format_tbl[pop->format].opsz + format_tbl[pop->format].dispsz;
|
||||
regs->pc += tmp >> 3;
|
||||
|
||||
/* handle MOV_Lcc, which are currently the only FMT_D10 insns that
|
||||
* access memory */
|
||||
if (pop->format == FMT_D10)
|
||||
misalignment_MOV_Lcc(regs, opcode);
|
||||
|
||||
set_fs(seg);
|
||||
return;
|
||||
}
|
||||
|
||||
/*
|
||||
* determine the address that was being accessed
|
||||
*/
|
||||
static int misalignment_addr(unsigned long *registers, unsigned params,
|
||||
unsigned opcode, unsigned disp,
|
||||
void **_address, unsigned long **_postinc)
|
||||
static int misalignment_addr(unsigned long *registers, unsigned long sp,
|
||||
unsigned params, unsigned opcode,
|
||||
unsigned long disp,
|
||||
void **_address, unsigned long **_postinc,
|
||||
unsigned long *_inc)
|
||||
{
|
||||
unsigned long *postinc = NULL, address = 0, tmp;
|
||||
|
||||
params &= 0x7fffffff;
|
||||
if (!(params & 0x1000000)) {
|
||||
kdebug("noinc");
|
||||
*_inc = 0;
|
||||
_inc = NULL;
|
||||
}
|
||||
|
||||
params &= 0x00ffffff;
|
||||
|
||||
do {
|
||||
switch (params & 0xff) {
|
||||
|
@ -514,11 +571,11 @@ static int misalignment_addr(unsigned long *registers, unsigned params,
|
|||
address += *postinc;
|
||||
break;
|
||||
case DM1:
|
||||
postinc = ®isters[Dreg_index[opcode >> 2 & 0x0c]];
|
||||
postinc = ®isters[Dreg_index[opcode >> 2 & 0x03]];
|
||||
address += *postinc;
|
||||
break;
|
||||
case DM2:
|
||||
postinc = ®isters[Dreg_index[opcode >> 4 & 0x30]];
|
||||
postinc = ®isters[Dreg_index[opcode >> 4 & 0x03]];
|
||||
address += *postinc;
|
||||
break;
|
||||
case AM0:
|
||||
|
@ -526,11 +583,11 @@ static int misalignment_addr(unsigned long *registers, unsigned params,
|
|||
address += *postinc;
|
||||
break;
|
||||
case AM1:
|
||||
postinc = ®isters[Areg_index[opcode >> 2 & 0x0c]];
|
||||
postinc = ®isters[Areg_index[opcode >> 2 & 0x03]];
|
||||
address += *postinc;
|
||||
break;
|
||||
case AM2:
|
||||
postinc = ®isters[Areg_index[opcode >> 4 & 0x30]];
|
||||
postinc = ®isters[Areg_index[opcode >> 4 & 0x03]];
|
||||
address += *postinc;
|
||||
break;
|
||||
case RM0:
|
||||
|
@ -561,33 +618,53 @@ static int misalignment_addr(unsigned long *registers, unsigned params,
|
|||
postinc = ®isters[Rreg_index[disp >> 4 & 0x0f]];
|
||||
address += *postinc;
|
||||
break;
|
||||
case SP:
|
||||
address += sp;
|
||||
break;
|
||||
|
||||
/* displacements are either to be added to the address
|
||||
* before use, or, in the case of post-inc addressing,
|
||||
* to be added into the base register after use */
|
||||
case SD8:
|
||||
case SIMM8:
|
||||
address += (int32_t) (int8_t) (disp & 0xff);
|
||||
break;
|
||||
disp = (long) (int8_t) (disp & 0xff);
|
||||
goto displace_or_inc;
|
||||
case SD16:
|
||||
address += (int32_t) (int16_t) (disp & 0xffff);
|
||||
break;
|
||||
disp = (long) (int16_t) (disp & 0xffff);
|
||||
goto displace_or_inc;
|
||||
case SD24:
|
||||
tmp = disp << 8;
|
||||
asm("asr 8,%0" : "=r"(tmp) : "0"(tmp));
|
||||
address += tmp;
|
||||
break;
|
||||
disp = (long) tmp;
|
||||
goto displace_or_inc;
|
||||
case SIMM4_2:
|
||||
tmp = opcode >> 4 & 0x0f;
|
||||
tmp <<= 28;
|
||||
asm("asr 28,%0" : "=r"(tmp) : "0"(tmp));
|
||||
address += tmp;
|
||||
break;
|
||||
disp = (long) tmp;
|
||||
goto displace_or_inc;
|
||||
case IMM8:
|
||||
disp &= 0x000000ff;
|
||||
goto displace_or_inc;
|
||||
case IMM16:
|
||||
disp &= 0x0000ffff;
|
||||
goto displace_or_inc;
|
||||
case IMM24:
|
||||
address += disp & 0x00ffffff;
|
||||
break;
|
||||
disp &= 0x00ffffff;
|
||||
goto displace_or_inc;
|
||||
case IMM32:
|
||||
case IMM32_MEM:
|
||||
case IMM32_HIGH8:
|
||||
address += disp;
|
||||
case IMM32_HIGH8_MEM:
|
||||
displace_or_inc:
|
||||
kdebug("%s %lx", _inc ? "incr" : "disp", disp);
|
||||
if (!_inc)
|
||||
address += disp;
|
||||
else
|
||||
*_inc = disp;
|
||||
break;
|
||||
default:
|
||||
BUG();
|
||||
return 0;
|
||||
}
|
||||
} while ((params >>= 8));
|
||||
|
@ -601,7 +678,7 @@ static int misalignment_addr(unsigned long *registers, unsigned params,
|
|||
* determine the register that is acting as source/dest
|
||||
*/
|
||||
static int misalignment_reg(unsigned long *registers, unsigned params,
|
||||
unsigned opcode, unsigned disp,
|
||||
unsigned opcode, unsigned long disp,
|
||||
unsigned long **_register)
|
||||
{
|
||||
params &= 0x7fffffff;
|
||||
|
@ -654,8 +731,239 @@ static int misalignment_reg(unsigned long *registers, unsigned params,
|
|||
break;
|
||||
|
||||
default:
|
||||
BUG();
|
||||
return 0;
|
||||
}
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
/*
|
||||
* handle the conditional loop part of the move-and-loop instructions
|
||||
*/
|
||||
static void misalignment_MOV_Lcc(struct pt_regs *regs, uint32_t opcode)
|
||||
{
|
||||
unsigned long epsw = regs->epsw;
|
||||
unsigned long NxorV;
|
||||
|
||||
kdebug("MOV_Lcc %x [flags=%lx]", opcode, epsw & 0xf);
|
||||
|
||||
/* calculate N^V and shift onto the same bit position as Z */
|
||||
NxorV = ((epsw >> 3) ^ epsw >> 1) & 1;
|
||||
|
||||
switch (opcode & 0xf) {
|
||||
case 0x0: /* MOV_LLT: N^V */
|
||||
if (NxorV)
|
||||
goto take_the_loop;
|
||||
return;
|
||||
case 0x1: /* MOV_LGT: ~(Z or (N^V))*/
|
||||
if (!((epsw & EPSW_FLAG_Z) | NxorV))
|
||||
goto take_the_loop;
|
||||
return;
|
||||
case 0x2: /* MOV_LGE: ~(N^V) */
|
||||
if (!NxorV)
|
||||
goto take_the_loop;
|
||||
return;
|
||||
case 0x3: /* MOV_LLE: Z or (N^V) */
|
||||
if ((epsw & EPSW_FLAG_Z) | NxorV)
|
||||
goto take_the_loop;
|
||||
return;
|
||||
|
||||
case 0x4: /* MOV_LCS: C */
|
||||
if (epsw & EPSW_FLAG_C)
|
||||
goto take_the_loop;
|
||||
return;
|
||||
case 0x5: /* MOV_LHI: ~(C or Z) */
|
||||
if (!(epsw & (EPSW_FLAG_C | EPSW_FLAG_Z)))
|
||||
goto take_the_loop;
|
||||
return;
|
||||
case 0x6: /* MOV_LCC: ~C */
|
||||
if (!(epsw & EPSW_FLAG_C))
|
||||
goto take_the_loop;
|
||||
return;
|
||||
case 0x7: /* MOV_LLS: C or Z */
|
||||
if (epsw & (EPSW_FLAG_C | EPSW_FLAG_Z))
|
||||
goto take_the_loop;
|
||||
return;
|
||||
|
||||
case 0x8: /* MOV_LEQ: Z */
|
||||
if (epsw & EPSW_FLAG_Z)
|
||||
goto take_the_loop;
|
||||
return;
|
||||
case 0x9: /* MOV_LNE: ~Z */
|
||||
if (!(epsw & EPSW_FLAG_Z))
|
||||
goto take_the_loop;
|
||||
return;
|
||||
case 0xa: /* MOV_LRA: always */
|
||||
goto take_the_loop;
|
||||
|
||||
default:
|
||||
BUG();
|
||||
}
|
||||
|
||||
take_the_loop:
|
||||
/* wind the PC back to just after the SETLB insn */
|
||||
kdebug("loop LAR=%lx", regs->lar);
|
||||
regs->pc = regs->lar - 4;
|
||||
}
|
||||
|
||||
/*
|
||||
* misalignment handler tests
|
||||
*/
|
||||
#ifdef CONFIG_TEST_MISALIGNMENT_HANDLER
|
||||
static u8 __initdata testbuf[512] __attribute__((aligned(16))) = {
|
||||
[257] = 0x11,
|
||||
[258] = 0x22,
|
||||
[259] = 0x33,
|
||||
[260] = 0x44,
|
||||
};
|
||||
|
||||
#define ASSERTCMP(X, OP, Y) \
|
||||
do { \
|
||||
if (unlikely(!((X) OP (Y)))) { \
|
||||
printk(KERN_ERR "\n"); \
|
||||
printk(KERN_ERR "MISALIGN: Assertion failed at line %u\n", \
|
||||
__LINE__); \
|
||||
printk(KERN_ERR "0x%lx " #OP " 0x%lx is false\n", \
|
||||
(unsigned long)(X), (unsigned long)(Y)); \
|
||||
BUG(); \
|
||||
} \
|
||||
} while(0)
|
||||
|
||||
static int __init test_misalignment(void)
|
||||
{
|
||||
register void *r asm("e0");
|
||||
register u32 y asm("e1");
|
||||
void *p = testbuf, *q;
|
||||
u32 tmp, tmp2, x;
|
||||
|
||||
printk(KERN_NOTICE "==>test_misalignment() [testbuf=%p]\n", p);
|
||||
p++;
|
||||
|
||||
printk(KERN_NOTICE "___ MOV (Am),Dn ___\n");
|
||||
q = p + 256;
|
||||
asm volatile("mov (%0),%1" : "+a"(q), "=d"(x));
|
||||
ASSERTCMP(q, ==, p + 256);
|
||||
ASSERTCMP(x, ==, 0x44332211);
|
||||
|
||||
printk(KERN_NOTICE "___ MOV (256,Am),Dn ___\n");
|
||||
q = p;
|
||||
asm volatile("mov (256,%0),%1" : "+a"(q), "=d"(x));
|
||||
ASSERTCMP(q, ==, p);
|
||||
ASSERTCMP(x, ==, 0x44332211);
|
||||
|
||||
printk(KERN_NOTICE "___ MOV (Di,Am),Dn ___\n");
|
||||
tmp = 256;
|
||||
q = p;
|
||||
asm volatile("mov (%2,%0),%1" : "+a"(q), "=d"(x), "+d"(tmp));
|
||||
ASSERTCMP(q, ==, p);
|
||||
ASSERTCMP(x, ==, 0x44332211);
|
||||
ASSERTCMP(tmp, ==, 256);
|
||||
|
||||
printk(KERN_NOTICE "___ MOV (256,Rm),Rn ___\n");
|
||||
r = p;
|
||||
asm volatile("mov (256,%0),%1" : "+r"(r), "=r"(y));
|
||||
ASSERTCMP(r, ==, p);
|
||||
ASSERTCMP(y, ==, 0x44332211);
|
||||
|
||||
printk(KERN_NOTICE "___ MOV (Rm+),Rn ___\n");
|
||||
r = p + 256;
|
||||
asm volatile("mov (%0+),%1" : "+r"(r), "=r"(y));
|
||||
ASSERTCMP(r, ==, p + 256 + 4);
|
||||
ASSERTCMP(y, ==, 0x44332211);
|
||||
|
||||
printk(KERN_NOTICE "___ MOV (Rm+,8),Rn ___\n");
|
||||
r = p + 256;
|
||||
asm volatile("mov (%0+,8),%1" : "+r"(r), "=r"(y));
|
||||
ASSERTCMP(r, ==, p + 256 + 8);
|
||||
ASSERTCMP(y, ==, 0x44332211);
|
||||
|
||||
printk(KERN_NOTICE "___ MOV (7,SP),Rn ___\n");
|
||||
asm volatile(
|
||||
"add -16,sp \n"
|
||||
"mov +0x11,%0 \n"
|
||||
"movbu %0,(7,sp) \n"
|
||||
"mov +0x22,%0 \n"
|
||||
"movbu %0,(8,sp) \n"
|
||||
"mov +0x33,%0 \n"
|
||||
"movbu %0,(9,sp) \n"
|
||||
"mov +0x44,%0 \n"
|
||||
"movbu %0,(10,sp) \n"
|
||||
"mov (7,sp),%1 \n"
|
||||
"add +16,sp \n"
|
||||
: "+a"(q), "=d"(x));
|
||||
ASSERTCMP(x, ==, 0x44332211);
|
||||
|
||||
printk(KERN_NOTICE "___ MOV (259,SP),Rn ___\n");
|
||||
asm volatile(
|
||||
"add -264,sp \n"
|
||||
"mov +0x11,%0 \n"
|
||||
"movbu %0,(259,sp) \n"
|
||||
"mov +0x22,%0 \n"
|
||||
"movbu %0,(260,sp) \n"
|
||||
"mov +0x33,%0 \n"
|
||||
"movbu %0,(261,sp) \n"
|
||||
"mov +0x55,%0 \n"
|
||||
"movbu %0,(262,sp) \n"
|
||||
"mov (259,sp),%1 \n"
|
||||
"add +264,sp \n"
|
||||
: "+d"(tmp), "=d"(x));
|
||||
ASSERTCMP(x, ==, 0x55332211);
|
||||
|
||||
printk(KERN_NOTICE "___ MOV (260,SP),Rn ___\n");
|
||||
asm volatile(
|
||||
"add -264,sp \n"
|
||||
"mov +0x11,%0 \n"
|
||||
"movbu %0,(260,sp) \n"
|
||||
"mov +0x22,%0 \n"
|
||||
"movbu %0,(261,sp) \n"
|
||||
"mov +0x33,%0 \n"
|
||||
"movbu %0,(262,sp) \n"
|
||||
"mov +0x55,%0 \n"
|
||||
"movbu %0,(263,sp) \n"
|
||||
"mov (260,sp),%1 \n"
|
||||
"add +264,sp \n"
|
||||
: "+d"(tmp), "=d"(x));
|
||||
ASSERTCMP(x, ==, 0x55332211);
|
||||
|
||||
|
||||
printk(KERN_NOTICE "___ MOV_LNE ___\n");
|
||||
tmp = 1;
|
||||
tmp2 = 2;
|
||||
q = p + 256;
|
||||
asm volatile(
|
||||
"setlb \n"
|
||||
"mov %2,%3 \n"
|
||||
"mov %1,%2 \n"
|
||||
"cmp +0,%1 \n"
|
||||
"mov_lne (%0+,4),%1"
|
||||
: "+r"(q), "+d"(tmp), "+d"(tmp2), "=d"(x)
|
||||
:
|
||||
: "cc");
|
||||
ASSERTCMP(q, ==, p + 256 + 12);
|
||||
ASSERTCMP(x, ==, 0x44332211);
|
||||
|
||||
printk(KERN_NOTICE "___ MOV in SETLB ___\n");
|
||||
tmp = 1;
|
||||
tmp2 = 2;
|
||||
q = p + 256;
|
||||
asm volatile(
|
||||
"setlb \n"
|
||||
"mov %1,%3 \n"
|
||||
"mov (%0+),%1 \n"
|
||||
"cmp +0,%1 \n"
|
||||
"lne "
|
||||
: "+a"(q), "+d"(tmp), "+d"(tmp2), "=d"(x)
|
||||
:
|
||||
: "cc");
|
||||
|
||||
ASSERTCMP(q, ==, p + 256 + 8);
|
||||
ASSERTCMP(x, ==, 0x44332211);
|
||||
|
||||
printk(KERN_NOTICE "<==test_misalignment()\n");
|
||||
return 0;
|
||||
}
|
||||
|
||||
arch_initcall(test_misalignment);
|
||||
|
||||
#endif /* CONFIG_TEST_MISALIGNMENT_HANDLER */
|
||||
|
|
|
@ -44,8 +44,6 @@ extern void arch_send_call_function_ipi(cpumask_t mask);
|
|||
|
||||
#define PROC_CHANGE_PENALTY 15 /* Schedule penalty */
|
||||
|
||||
extern unsigned long cpu_present_mask;
|
||||
|
||||
#define raw_smp_processor_id() (current_thread_info()->cpu)
|
||||
|
||||
#else /* CONFIG_SMP */
|
||||
|
|
|
@ -61,22 +61,25 @@ STACK_SIZE = 1 << STACK_SHIFT
|
|||
|
||||
#ifdef CONFIG_TRACE_IRQFLAGS
|
||||
.macro TRACE_IRQS_ON
|
||||
l %r1,BASED(.Ltrace_irq_on)
|
||||
basr %r2,%r0
|
||||
l %r1,BASED(.Ltrace_irq_on_caller)
|
||||
basr %r14,%r1
|
||||
.endm
|
||||
|
||||
.macro TRACE_IRQS_OFF
|
||||
l %r1,BASED(.Ltrace_irq_off)
|
||||
basr %r2,%r0
|
||||
l %r1,BASED(.Ltrace_irq_off_caller)
|
||||
basr %r14,%r1
|
||||
.endm
|
||||
|
||||
.macro TRACE_IRQS_CHECK
|
||||
basr %r2,%r0
|
||||
tm SP_PSW(%r15),0x03 # irqs enabled?
|
||||
jz 0f
|
||||
l %r1,BASED(.Ltrace_irq_on)
|
||||
l %r1,BASED(.Ltrace_irq_on_caller)
|
||||
basr %r14,%r1
|
||||
j 1f
|
||||
0: l %r1,BASED(.Ltrace_irq_off)
|
||||
0: l %r1,BASED(.Ltrace_irq_off_caller)
|
||||
basr %r14,%r1
|
||||
1:
|
||||
.endm
|
||||
|
@ -1113,9 +1116,12 @@ cleanup_io_leave_insn:
|
|||
.Lschedtail: .long schedule_tail
|
||||
.Lsysc_table: .long sys_call_table
|
||||
#ifdef CONFIG_TRACE_IRQFLAGS
|
||||
.Ltrace_irq_on: .long trace_hardirqs_on
|
||||
.Ltrace_irq_off:
|
||||
.long trace_hardirqs_off
|
||||
.Ltrace_irq_on_caller:
|
||||
.long trace_hardirqs_on_caller
|
||||
.Ltrace_irq_off_caller:
|
||||
.long trace_hardirqs_off_caller
|
||||
#endif
|
||||
#ifdef CONFIG_LOCKDEP
|
||||
.Llockdep_sys_exit:
|
||||
.long lockdep_sys_exit
|
||||
#endif
|
||||
|
|
|
@ -61,19 +61,22 @@ _TIF_WORK_INT = (_TIF_SIGPENDING | _TIF_NOTIFY_RESUME | _TIF_NEED_RESCHED | \
|
|||
|
||||
#ifdef CONFIG_TRACE_IRQFLAGS
|
||||
.macro TRACE_IRQS_ON
|
||||
brasl %r14,trace_hardirqs_on
|
||||
basr %r2,%r0
|
||||
brasl %r14,trace_hardirqs_on_caller
|
||||
.endm
|
||||
|
||||
.macro TRACE_IRQS_OFF
|
||||
brasl %r14,trace_hardirqs_off
|
||||
basr %r2,%r0
|
||||
brasl %r14,trace_hardirqs_off_caller
|
||||
.endm
|
||||
|
||||
.macro TRACE_IRQS_CHECK
|
||||
basr %r2,%r0
|
||||
tm SP_PSW(%r15),0x03 # irqs enabled?
|
||||
jz 0f
|
||||
brasl %r14,trace_hardirqs_on
|
||||
brasl %r14,trace_hardirqs_on_caller
|
||||
j 1f
|
||||
0: brasl %r14,trace_hardirqs_off
|
||||
0: brasl %r14,trace_hardirqs_off_caller
|
||||
1:
|
||||
.endm
|
||||
#else
|
||||
|
|
|
@ -136,9 +136,12 @@ static void default_idle(void)
|
|||
return;
|
||||
}
|
||||
trace_hardirqs_on();
|
||||
/* Don't trace preempt off for idle. */
|
||||
stop_critical_timings();
|
||||
/* Wait for external, I/O or machine check interrupt. */
|
||||
__load_psw_mask(psw_kernel_bits | PSW_MASK_WAIT |
|
||||
PSW_MASK_IO | PSW_MASK_EXT);
|
||||
start_critical_timings();
|
||||
}
|
||||
|
||||
void cpu_idle(void)
|
||||
|
|
|
@ -604,13 +604,13 @@ setup_memory(void)
|
|||
if (memory_chunk[i].type != CHUNK_READ_WRITE)
|
||||
continue;
|
||||
start_chunk = PFN_DOWN(memory_chunk[i].addr);
|
||||
end_chunk = start_chunk + PFN_DOWN(memory_chunk[i].size) - 1;
|
||||
end_chunk = start_chunk + PFN_DOWN(memory_chunk[i].size);
|
||||
end_chunk = min(end_chunk, end_pfn);
|
||||
if (start_chunk >= end_chunk)
|
||||
continue;
|
||||
add_active_range(0, start_chunk, end_chunk);
|
||||
pfn = max(start_chunk, start_pfn);
|
||||
for (; pfn <= end_chunk; pfn++)
|
||||
for (; pfn < end_chunk; pfn++)
|
||||
page_set_storage_key(PFN_PHYS(pfn), PAGE_DEFAULT_KEY);
|
||||
}
|
||||
|
||||
|
|
|
@ -198,7 +198,7 @@ asmlinkage long s390x_newuname(struct new_utsname __user *name)
|
|||
{
|
||||
int ret = sys_newuname(name);
|
||||
|
||||
if (current->personality == PER_LINUX32 && !ret) {
|
||||
if (personality(current->personality) == PER_LINUX32 && !ret) {
|
||||
ret = copy_to_user(name->machine, "s390\0\0\0\0", 8);
|
||||
if (ret) ret = -EFAULT;
|
||||
}
|
||||
|
|
|
@ -65,18 +65,21 @@ static int machine_has_topology_irq;
|
|||
static struct timer_list topology_timer;
|
||||
static void set_topology_timer(void);
|
||||
static DECLARE_WORK(topology_work, topology_work_fn);
|
||||
/* topology_lock protects the core linked list */
|
||||
static DEFINE_SPINLOCK(topology_lock);
|
||||
|
||||
cpumask_t cpu_core_map[NR_CPUS];
|
||||
|
||||
cpumask_t cpu_coregroup_map(unsigned int cpu)
|
||||
{
|
||||
struct core_info *core = &core_info;
|
||||
unsigned long flags;
|
||||
cpumask_t mask;
|
||||
|
||||
cpus_clear(mask);
|
||||
if (!machine_has_topology)
|
||||
return cpu_present_map;
|
||||
mutex_lock(&smp_cpu_state_mutex);
|
||||
spin_lock_irqsave(&topology_lock, flags);
|
||||
while (core) {
|
||||
if (cpu_isset(cpu, core->mask)) {
|
||||
mask = core->mask;
|
||||
|
@ -84,7 +87,7 @@ cpumask_t cpu_coregroup_map(unsigned int cpu)
|
|||
}
|
||||
core = core->next;
|
||||
}
|
||||
mutex_unlock(&smp_cpu_state_mutex);
|
||||
spin_unlock_irqrestore(&topology_lock, flags);
|
||||
if (cpus_empty(mask))
|
||||
mask = cpumask_of_cpu(cpu);
|
||||
return mask;
|
||||
|
@ -133,7 +136,7 @@ static void tl_to_cores(struct tl_info *info)
|
|||
union tl_entry *tle, *end;
|
||||
struct core_info *core = &core_info;
|
||||
|
||||
mutex_lock(&smp_cpu_state_mutex);
|
||||
spin_lock_irq(&topology_lock);
|
||||
clear_cores();
|
||||
tle = info->tle;
|
||||
end = (union tl_entry *)((unsigned long)info + info->length);
|
||||
|
@ -157,7 +160,7 @@ static void tl_to_cores(struct tl_info *info)
|
|||
}
|
||||
tle = next_tle(tle);
|
||||
}
|
||||
mutex_unlock(&smp_cpu_state_mutex);
|
||||
spin_unlock_irq(&topology_lock);
|
||||
}
|
||||
|
||||
static void topology_update_polarization_simple(void)
|
||||
|
|
|
@ -293,6 +293,10 @@ __ioremap_mode(unsigned long offset, unsigned long size, unsigned long flags)
|
|||
*/
|
||||
#define xlate_dev_kmem_ptr(p) p
|
||||
|
||||
#define ARCH_HAS_VALID_PHYS_ADDR_RANGE
|
||||
int valid_phys_addr_range(unsigned long addr, size_t size);
|
||||
int valid_mmap_phys_addr_range(unsigned long pfn, size_t size);
|
||||
|
||||
#endif /* __KERNEL__ */
|
||||
|
||||
#endif /* __ASM_SH_IO_H */
|
||||
|
|
|
@ -148,6 +148,12 @@ extern void paging_init(void);
|
|||
extern void page_table_range_init(unsigned long start, unsigned long end,
|
||||
pgd_t *pgd);
|
||||
|
||||
#if !defined(CONFIG_CACHE_OFF) && defined(CONFIG_CPU_SH4) && defined(CONFIG_MMU)
|
||||
extern void kmap_coherent_init(void);
|
||||
#else
|
||||
#define kmap_coherent_init() do { } while (0)
|
||||
#endif
|
||||
|
||||
#include <asm-generic/pgtable.h>
|
||||
|
||||
#endif /* __ASM_SH_PGTABLE_H */
|
||||
|
|
|
@ -119,17 +119,17 @@ static struct plat_sci_port sci_platform_data[] = {
|
|||
},{
|
||||
.mapbase = 0xa4e30000,
|
||||
.flags = UPF_BOOT_AUTOCONF,
|
||||
.type = PORT_SCI,
|
||||
.type = PORT_SCIFA,
|
||||
.irqs = { 56, 56, 56, 56 },
|
||||
},{
|
||||
.mapbase = 0xa4e40000,
|
||||
.flags = UPF_BOOT_AUTOCONF,
|
||||
.type = PORT_SCI,
|
||||
.type = PORT_SCIFA,
|
||||
.irqs = { 88, 88, 88, 88 },
|
||||
},{
|
||||
.mapbase = 0xa4e50000,
|
||||
.flags = UPF_BOOT_AUTOCONF,
|
||||
.type = PORT_SCI,
|
||||
.type = PORT_SCIFA,
|
||||
.irqs = { 109, 109, 109, 109 },
|
||||
}, {
|
||||
.flags = 0,
|
||||
|
|
|
@ -75,6 +75,7 @@ static struct console bios_console = {
|
|||
#endif
|
||||
|
||||
static struct uart_port scif_port = {
|
||||
.type = PORT_SCIF,
|
||||
.mapbase = CONFIG_EARLY_SCIF_CONSOLE_PORT,
|
||||
.membase = (char __iomem *)CONFIG_EARLY_SCIF_CONSOLE_PORT,
|
||||
};
|
||||
|
@ -84,9 +85,9 @@ static void scif_sercon_putc(int c)
|
|||
while (((sci_in(&scif_port, SCFDR) & EPK_FIFO_BITS) >= EPK_FIFO_SIZE))
|
||||
;
|
||||
|
||||
sci_out(&scif_port, SCxTDR, c);
|
||||
sci_in(&scif_port, SCxSR);
|
||||
sci_out(&scif_port, SCxSR, 0xf3 & ~(0x20 | 0x40));
|
||||
sci_out(&scif_port, SCxTDR, c);
|
||||
|
||||
while ((sci_in(&scif_port, SCxSR) & 0x40) == 0)
|
||||
;
|
||||
|
|
|
@ -120,7 +120,7 @@ static void tmu_set_mode(enum clock_event_mode mode,
|
|||
{
|
||||
switch (mode) {
|
||||
case CLOCK_EVT_MODE_PERIODIC:
|
||||
ctrl_outl(ctrl_inl(TMU0_TCNT), TMU0_TCOR);
|
||||
ctrl_outl(tmu_latest_interval[TMU0], TMU0_TCOR);
|
||||
break;
|
||||
case CLOCK_EVT_MODE_ONESHOT:
|
||||
ctrl_outl(0, TMU0_TCOR);
|
||||
|
|
|
@ -80,6 +80,11 @@ ENTRY(copy_page)
|
|||
.section __ex_table, "a"; \
|
||||
.long 9999b, 6000f ; \
|
||||
.previous
|
||||
#define EX_NO_POP(...) \
|
||||
9999: __VA_ARGS__ ; \
|
||||
.section __ex_table, "a"; \
|
||||
.long 9999b, 6005f ; \
|
||||
.previous
|
||||
ENTRY(__copy_user)
|
||||
! Check if small number of bytes
|
||||
mov #11,r0
|
||||
|
@ -139,9 +144,9 @@ EX( mov.b r1,@r4 )
|
|||
bt 1f
|
||||
|
||||
2:
|
||||
EX( mov.b @r5+,r0 )
|
||||
EX_NO_POP( mov.b @r5+,r0 )
|
||||
dt r6
|
||||
EX( mov.b r0,@r4 )
|
||||
EX_NO_POP( mov.b r0,@r4 )
|
||||
bf/s 2b
|
||||
add #1,r4
|
||||
|
||||
|
@ -150,7 +155,7 @@ EX( mov.b r0,@r4 )
|
|||
|
||||
# Exception handler:
|
||||
.section .fixup, "ax"
|
||||
6000:
|
||||
6005:
|
||||
mov.l 8000f,r1
|
||||
mov r3,r0
|
||||
jmp @r1
|
||||
|
|
|
@ -2,7 +2,7 @@
|
|||
# Makefile for the Linux SuperH-specific parts of the memory manager.
|
||||
#
|
||||
|
||||
obj-y := init.o extable_32.o consistent.o
|
||||
obj-y := init.o extable_32.o consistent.o mmap.o
|
||||
|
||||
ifndef CONFIG_CACHE_OFF
|
||||
cache-$(CONFIG_CPU_SH2) := cache-sh2.o
|
||||
|
|
|
@ -2,7 +2,7 @@
|
|||
# Makefile for the Linux SuperH-specific parts of the memory manager.
|
||||
#
|
||||
|
||||
obj-y := init.o consistent.o
|
||||
obj-y := init.o consistent.o mmap.o
|
||||
|
||||
mmu-y := tlb-nommu.o pg-nommu.o extable_32.o
|
||||
mmu-$(CONFIG_MMU) := fault_64.o ioremap_64.o tlbflush_64.o tlb-sh5.o \
|
||||
|
|
|
@ -137,6 +137,7 @@ void __init page_table_range_init(unsigned long start, unsigned long end,
|
|||
void __init paging_init(void)
|
||||
{
|
||||
unsigned long max_zone_pfns[MAX_NR_ZONES];
|
||||
unsigned long vaddr;
|
||||
int nid;
|
||||
|
||||
/* We don't need to map the kernel through the TLB, as
|
||||
|
@ -148,10 +149,15 @@ void __init paging_init(void)
|
|||
* check for a null value. */
|
||||
set_TTB(swapper_pg_dir);
|
||||
|
||||
/* Populate the relevant portions of swapper_pg_dir so that
|
||||
/*
|
||||
* Populate the relevant portions of swapper_pg_dir so that
|
||||
* we can use the fixmap entries without calling kmalloc.
|
||||
* pte's will be filled in by __set_fixmap(). */
|
||||
page_table_range_init(FIXADDR_START, FIXADDR_TOP, swapper_pg_dir);
|
||||
* pte's will be filled in by __set_fixmap().
|
||||
*/
|
||||
vaddr = __fix_to_virt(__end_of_fixed_addresses - 1) & PMD_MASK;
|
||||
page_table_range_init(vaddr, 0, swapper_pg_dir);
|
||||
|
||||
kmap_coherent_init();
|
||||
|
||||
memset(max_zone_pfns, 0, sizeof(max_zone_pfns));
|
||||
|
||||
|
|
|
@ -0,0 +1,31 @@
|
|||
/*
|
||||
* arch/sh/mm/mmap.c
|
||||
*
|
||||
* Copyright (C) 2008 Paul Mundt
|
||||
*
|
||||
* 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.
|
||||
*/
|
||||
#include <linux/io.h>
|
||||
#include <linux/mm.h>
|
||||
#include <asm/page.h>
|
||||
|
||||
/*
|
||||
* You really shouldn't be using read() or write() on /dev/mem. This
|
||||
* might go away in the future.
|
||||
*/
|
||||
int valid_phys_addr_range(unsigned long addr, size_t count)
|
||||
{
|
||||
if (addr < __MEMORY_START)
|
||||
return 0;
|
||||
if (addr + count > __pa(high_memory))
|
||||
return 0;
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
int valid_mmap_phys_addr_range(unsigned long pfn, size_t size)
|
||||
{
|
||||
return 1;
|
||||
}
|
|
@ -7,6 +7,7 @@
|
|||
* Released under the terms of the GNU GPL v2.0.
|
||||
*/
|
||||
#include <linux/mm.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/mutex.h>
|
||||
#include <linux/fs.h>
|
||||
#include <linux/highmem.h>
|
||||
|
@ -16,6 +17,20 @@
|
|||
|
||||
#define CACHE_ALIAS (current_cpu_data.dcache.alias_mask)
|
||||
|
||||
#define kmap_get_fixmap_pte(vaddr) \
|
||||
pte_offset_kernel(pmd_offset(pud_offset(pgd_offset_k(vaddr), (vaddr)), (vaddr)), (vaddr))
|
||||
|
||||
static pte_t *kmap_coherent_pte;
|
||||
|
||||
void __init kmap_coherent_init(void)
|
||||
{
|
||||
unsigned long vaddr;
|
||||
|
||||
/* cache the first coherent kmap pte */
|
||||
vaddr = __fix_to_virt(FIX_CMAP_BEGIN);
|
||||
kmap_coherent_pte = kmap_get_fixmap_pte(vaddr);
|
||||
}
|
||||
|
||||
static inline void *kmap_coherent(struct page *page, unsigned long addr)
|
||||
{
|
||||
enum fixed_addresses idx;
|
||||
|
@ -34,6 +49,8 @@ static inline void *kmap_coherent(struct page *page, unsigned long addr)
|
|||
|
||||
update_mmu_cache(NULL, vaddr, pte);
|
||||
|
||||
set_pte(kmap_coherent_pte - (FIX_CMAP_END - idx), pte);
|
||||
|
||||
return (void *)vaddr;
|
||||
}
|
||||
|
||||
|
|
|
@ -29,10 +29,11 @@ struct termios {
|
|||
tcflag_t c_cflag; /* control mode flags */
|
||||
tcflag_t c_lflag; /* local mode flags */
|
||||
cc_t c_line; /* line discipline */
|
||||
#ifndef __KERNEL__
|
||||
cc_t c_cc[NCCS]; /* control characters */
|
||||
#ifdef __KERNEL__
|
||||
#else
|
||||
cc_t c_cc[NCCS+2]; /* kernel needs 2 more to hold vmin/vtime */
|
||||
#define SIZEOF_USER_TERMIOS sizeof (struct termios) - (2*sizeof (cc_t))
|
||||
cc_t _x_cc[2]; /* We need them to hold vmin/vtime */
|
||||
#endif
|
||||
};
|
||||
|
||||
|
@ -42,8 +43,7 @@ struct termios2 {
|
|||
tcflag_t c_cflag; /* control mode flags */
|
||||
tcflag_t c_lflag; /* local mode flags */
|
||||
cc_t c_line; /* line discipline */
|
||||
cc_t c_cc[NCCS]; /* control characters */
|
||||
cc_t _x_cc[2]; /* padding to match ktermios */
|
||||
cc_t c_cc[NCCS+2]; /* control characters */
|
||||
speed_t c_ispeed; /* input speed */
|
||||
speed_t c_ospeed; /* output speed */
|
||||
};
|
||||
|
@ -54,8 +54,7 @@ struct ktermios {
|
|||
tcflag_t c_cflag; /* control mode flags */
|
||||
tcflag_t c_lflag; /* local mode flags */
|
||||
cc_t c_line; /* line discipline */
|
||||
cc_t c_cc[NCCS]; /* control characters */
|
||||
cc_t _x_cc[2]; /* We need them to hold vmin/vtime */
|
||||
cc_t c_cc[NCCS+2]; /* control characters */
|
||||
speed_t c_ispeed; /* input speed */
|
||||
speed_t c_ospeed; /* output speed */
|
||||
};
|
||||
|
|
|
@ -563,9 +563,9 @@ build_resources:
|
|||
op->dev.parent = parent;
|
||||
op->dev.bus = &of_platform_bus_type;
|
||||
if (!parent)
|
||||
strcpy(op->dev.bus_id, "root");
|
||||
dev_set_name(&op->dev, "root");
|
||||
else
|
||||
sprintf(op->dev.bus_id, "%08x", dp->node);
|
||||
dev_set_name(&op->dev, "%08x", dp->node);
|
||||
|
||||
if (of_device_register(op)) {
|
||||
printk("%s: Could not register of device.\n",
|
||||
|
|
|
@ -113,7 +113,6 @@ static inline void acpi_disable_pci(void)
|
|||
acpi_pci_disabled = 1;
|
||||
acpi_noirq_set();
|
||||
}
|
||||
extern int acpi_irq_balance_set(char *str);
|
||||
|
||||
/* routines for saving/restoring kernel state */
|
||||
extern int acpi_save_state_mem(void);
|
||||
|
|
|
@ -6,7 +6,6 @@ extern void no_iommu_init(void);
|
|||
extern struct dma_mapping_ops nommu_dma_ops;
|
||||
extern int force_iommu, no_iommu;
|
||||
extern int iommu_detected;
|
||||
extern int dmar_disabled;
|
||||
|
||||
extern unsigned long iommu_nr_pages(unsigned long addr, unsigned long len);
|
||||
|
||||
|
|
|
@ -1343,7 +1343,6 @@ static void __init acpi_process_madt(void)
|
|||
error = acpi_parse_madt_ioapic_entries();
|
||||
if (!error) {
|
||||
acpi_irq_model = ACPI_IRQ_MODEL_IOAPIC;
|
||||
acpi_irq_balance_set(NULL);
|
||||
acpi_ioapic = 1;
|
||||
|
||||
smp_found_config = 1;
|
||||
|
|
|
@ -188,20 +188,6 @@ static void __init ati_bugs_contd(int num, int slot, int func)
|
|||
}
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_DMAR
|
||||
static void __init intel_g33_dmar(int num, int slot, int func)
|
||||
{
|
||||
struct acpi_table_header *dmar_tbl;
|
||||
acpi_status status;
|
||||
|
||||
status = acpi_get_table(ACPI_SIG_DMAR, 0, &dmar_tbl);
|
||||
if (ACPI_SUCCESS(status)) {
|
||||
printk(KERN_INFO "BIOS BUG: DMAR advertised on Intel G31/G33 chipset -- ignoring\n");
|
||||
dmar_disabled = 1;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
#define QFLAG_APPLY_ONCE 0x1
|
||||
#define QFLAG_APPLIED 0x2
|
||||
#define QFLAG_DONE (QFLAG_APPLY_ONCE|QFLAG_APPLIED)
|
||||
|
@ -225,10 +211,6 @@ static struct chipset early_qrk[] __initdata = {
|
|||
PCI_CLASS_SERIAL_SMBUS, PCI_ANY_ID, 0, ati_bugs },
|
||||
{ PCI_VENDOR_ID_ATI, PCI_DEVICE_ID_ATI_SBX00_SMBUS,
|
||||
PCI_CLASS_SERIAL_SMBUS, PCI_ANY_ID, 0, ati_bugs_contd },
|
||||
#ifdef CONFIG_DMAR
|
||||
{ PCI_VENDOR_ID_INTEL, 0x29c0,
|
||||
PCI_CLASS_BRIDGE_HOST, PCI_ANY_ID, 0, intel_g33_dmar },
|
||||
#endif
|
||||
{}
|
||||
};
|
||||
|
||||
|
|
|
@ -128,7 +128,7 @@ static int kvm_register_clock(char *txt)
|
|||
}
|
||||
|
||||
#ifdef CONFIG_X86_LOCAL_APIC
|
||||
static void kvm_setup_secondary_clock(void)
|
||||
static void __devinit kvm_setup_secondary_clock(void)
|
||||
{
|
||||
/*
|
||||
* Now that the first cpu already had this clocksource initialized,
|
||||
|
|
|
@ -20,6 +20,8 @@ if VIRTUALIZATION
|
|||
config KVM
|
||||
tristate "Kernel-based Virtual Machine (KVM) support"
|
||||
depends on HAVE_KVM
|
||||
# for device assignment:
|
||||
depends on PCI
|
||||
select PREEMPT_NOTIFIERS
|
||||
select MMU_NOTIFIER
|
||||
select ANON_INODES
|
||||
|
|
|
@ -548,8 +548,10 @@ struct kvm_pit *kvm_create_pit(struct kvm *kvm)
|
|||
mutex_lock(&kvm->lock);
|
||||
pit->irq_source_id = kvm_request_irq_source_id(kvm);
|
||||
mutex_unlock(&kvm->lock);
|
||||
if (pit->irq_source_id < 0)
|
||||
if (pit->irq_source_id < 0) {
|
||||
kfree(pit);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
mutex_init(&pit->pit_state.lock);
|
||||
mutex_lock(&pit->pit_state.lock);
|
||||
|
|
Некоторые файлы не были показаны из-за слишком большого количества измененных файлов Показать больше
Загрузка…
Ссылка в новой задаче