mirror of https://gitee.com/openkylin/linux.git
Merge branch 'topic/restize-docs' into for-next
This commit is contained in:
commit
a04dae9eb1
|
@ -12,8 +12,7 @@ DOCBOOKS := z8530book.xml \
|
|||
kernel-api.xml filesystems.xml lsm.xml usb.xml kgdb.xml \
|
||||
gadget.xml libata.xml mtdnand.xml librs.xml rapidio.xml \
|
||||
genericirq.xml s390-drivers.xml uio-howto.xml scsi.xml \
|
||||
debugobjects.xml sh.xml regulator.xml \
|
||||
alsa-driver-api.xml writing-an-alsa-driver.xml \
|
||||
80211.xml debugobjects.xml sh.xml regulator.xml \
|
||||
tracepoint.xml w1.xml \
|
||||
writing_musb_glue_layer.xml crypto-API.xml iio.xml
|
||||
|
||||
|
|
|
@ -1,142 +0,0 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE book PUBLIC "-//OASIS//DTD DocBook XML V4.1.2//EN"
|
||||
"http://www.oasis-open.org/docbook/xml/4.1.2/docbookx.dtd" []>
|
||||
|
||||
<!-- ****************************************************** -->
|
||||
<!-- Header -->
|
||||
<!-- ****************************************************** -->
|
||||
<book id="ALSA-Driver-API">
|
||||
<bookinfo>
|
||||
<title>The ALSA Driver API</title>
|
||||
|
||||
<legalnotice>
|
||||
<para>
|
||||
This document is free; 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.
|
||||
</para>
|
||||
|
||||
<para>
|
||||
This document is distributed in the hope that it will be useful,
|
||||
but <emphasis>WITHOUT ANY WARRANTY</emphasis>; without even the
|
||||
implied warranty of <emphasis>MERCHANTABILITY or FITNESS FOR A
|
||||
PARTICULAR PURPOSE</emphasis>. See the GNU General Public License
|
||||
for more details.
|
||||
</para>
|
||||
|
||||
<para>
|
||||
You should have received a copy of the GNU General Public
|
||||
License along with this program; if not, write to the Free
|
||||
Software Foundation, Inc., 59 Temple Place, Suite 330, Boston,
|
||||
MA 02111-1307 USA
|
||||
</para>
|
||||
</legalnotice>
|
||||
|
||||
</bookinfo>
|
||||
|
||||
<toc></toc>
|
||||
|
||||
<chapter><title>Management of Cards and Devices</title>
|
||||
<sect1><title>Card Management</title>
|
||||
!Esound/core/init.c
|
||||
</sect1>
|
||||
<sect1><title>Device Components</title>
|
||||
!Esound/core/device.c
|
||||
</sect1>
|
||||
<sect1><title>Module requests and Device File Entries</title>
|
||||
!Esound/core/sound.c
|
||||
</sect1>
|
||||
<sect1><title>Memory Management Helpers</title>
|
||||
!Esound/core/memory.c
|
||||
!Esound/core/memalloc.c
|
||||
</sect1>
|
||||
</chapter>
|
||||
<chapter><title>PCM API</title>
|
||||
<sect1><title>PCM Core</title>
|
||||
!Esound/core/pcm.c
|
||||
!Esound/core/pcm_lib.c
|
||||
!Esound/core/pcm_native.c
|
||||
!Iinclude/sound/pcm.h
|
||||
</sect1>
|
||||
<sect1><title>PCM Format Helpers</title>
|
||||
!Esound/core/pcm_misc.c
|
||||
</sect1>
|
||||
<sect1><title>PCM Memory Management</title>
|
||||
!Esound/core/pcm_memory.c
|
||||
</sect1>
|
||||
<sect1><title>PCM DMA Engine API</title>
|
||||
!Esound/core/pcm_dmaengine.c
|
||||
!Iinclude/sound/dmaengine_pcm.h
|
||||
</sect1>
|
||||
</chapter>
|
||||
<chapter><title>Control/Mixer API</title>
|
||||
<sect1><title>General Control Interface</title>
|
||||
!Esound/core/control.c
|
||||
</sect1>
|
||||
<sect1><title>AC97 Codec API</title>
|
||||
!Esound/pci/ac97/ac97_codec.c
|
||||
!Esound/pci/ac97/ac97_pcm.c
|
||||
</sect1>
|
||||
<sect1><title>Virtual Master Control API</title>
|
||||
!Esound/core/vmaster.c
|
||||
!Iinclude/sound/control.h
|
||||
</sect1>
|
||||
</chapter>
|
||||
<chapter><title>MIDI API</title>
|
||||
<sect1><title>Raw MIDI API</title>
|
||||
!Esound/core/rawmidi.c
|
||||
</sect1>
|
||||
<sect1><title>MPU401-UART API</title>
|
||||
!Esound/drivers/mpu401/mpu401_uart.c
|
||||
</sect1>
|
||||
</chapter>
|
||||
<chapter><title>Proc Info API</title>
|
||||
<sect1><title>Proc Info Interface</title>
|
||||
!Esound/core/info.c
|
||||
</sect1>
|
||||
</chapter>
|
||||
<chapter><title>Compress Offload</title>
|
||||
<sect1><title>Compress Offload API</title>
|
||||
!Esound/core/compress_offload.c
|
||||
!Iinclude/uapi/sound/compress_offload.h
|
||||
!Iinclude/uapi/sound/compress_params.h
|
||||
!Iinclude/sound/compress_driver.h
|
||||
</sect1>
|
||||
</chapter>
|
||||
<chapter><title>ASoC</title>
|
||||
<sect1><title>ASoC Core API</title>
|
||||
!Iinclude/sound/soc.h
|
||||
!Esound/soc/soc-core.c
|
||||
<!-- !Esound/soc/soc-cache.c no docbook comments here -->
|
||||
!Esound/soc/soc-devres.c
|
||||
!Esound/soc/soc-io.c
|
||||
!Esound/soc/soc-pcm.c
|
||||
!Esound/soc/soc-ops.c
|
||||
!Esound/soc/soc-compress.c
|
||||
</sect1>
|
||||
<sect1><title>ASoC DAPM API</title>
|
||||
!Esound/soc/soc-dapm.c
|
||||
</sect1>
|
||||
<sect1><title>ASoC DMA Engine API</title>
|
||||
!Esound/soc/soc-generic-dmaengine-pcm.c
|
||||
</sect1>
|
||||
</chapter>
|
||||
<chapter><title>Miscellaneous Functions</title>
|
||||
<sect1><title>Hardware-Dependent Devices API</title>
|
||||
!Esound/core/hwdep.c
|
||||
</sect1>
|
||||
<sect1><title>Jack Abstraction Layer API</title>
|
||||
!Iinclude/sound/jack.h
|
||||
!Esound/core/jack.c
|
||||
!Esound/soc/soc-jack.c
|
||||
</sect1>
|
||||
<sect1><title>ISA DMA Helpers</title>
|
||||
!Esound/core/isadma.c
|
||||
</sect1>
|
||||
<sect1><title>Other Helper Macros</title>
|
||||
!Iinclude/sound/core.h
|
||||
</sect1>
|
||||
</chapter>
|
||||
|
||||
</book>
|
File diff suppressed because it is too large
Load Diff
|
@ -49,6 +49,7 @@ Optional port properties:
|
|||
and
|
||||
|
||||
- phy-handle: See ethernet.txt file in the same directory.
|
||||
- phy-mode: See ethernet.txt file in the same directory.
|
||||
|
||||
or
|
||||
|
||||
|
|
|
@ -18,6 +18,7 @@ Contents:
|
|||
media/index
|
||||
gpu/index
|
||||
80211/index
|
||||
sound/index
|
||||
|
||||
Indices and tables
|
||||
==================
|
||||
|
|
|
@ -29,8 +29,8 @@ A: There are always two trees (git repositories) in play. Both are driven
|
|||
Linus, and net-next is where the new code goes for the future release.
|
||||
You can find the trees here:
|
||||
|
||||
http://git.kernel.org/?p=linux/kernel/git/davem/net.git
|
||||
http://git.kernel.org/?p=linux/kernel/git/davem/net-next.git
|
||||
https://git.kernel.org/pub/scm/linux/kernel/git/davem/net.git
|
||||
https://git.kernel.org/pub/scm/linux/kernel/git/davem/net-next.git
|
||||
|
||||
Q: How often do changes from these trees make it to the mainline Linus tree?
|
||||
|
||||
|
@ -76,7 +76,7 @@ Q: So where are we now in this cycle?
|
|||
|
||||
A: Load the mainline (Linus) page here:
|
||||
|
||||
http://git.kernel.org/?p=linux/kernel/git/torvalds/linux.git
|
||||
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
|
||||
|
||||
and note the top of the "tags" section. If it is rc1, it is early
|
||||
in the dev cycle. If it was tagged rc7 a week ago, then a release
|
||||
|
@ -123,7 +123,7 @@ A: Normally Greg Kroah-Hartman collects stable commits himself, but
|
|||
|
||||
It contains the patches which Dave has selected, but not yet handed
|
||||
off to Greg. If Greg already has the patch, then it will be here:
|
||||
http://git.kernel.org/cgit/linux/kernel/git/stable/stable-queue.git
|
||||
https://git.kernel.org/pub/scm/linux/kernel/git/stable/stable-queue.git
|
||||
|
||||
A quick way to find whether the patch is in this stable-queue is
|
||||
to simply clone the repo, and then git grep the mainline commit ID, e.g.
|
||||
|
|
|
@ -33,24 +33,6 @@ nf_conntrack_events - BOOLEAN
|
|||
If this option is enabled, the connection tracking code will
|
||||
provide userspace with connection tracking events via ctnetlink.
|
||||
|
||||
nf_conntrack_events_retry_timeout - INTEGER (seconds)
|
||||
default 15
|
||||
|
||||
This option is only relevant when "reliable connection tracking
|
||||
events" are used. Normally, ctnetlink is "lossy", that is,
|
||||
events are normally dropped when userspace listeners can't keep up.
|
||||
|
||||
Userspace can request "reliable event mode". When this mode is
|
||||
active, the conntrack will only be destroyed after the event was
|
||||
delivered. If event delivery fails, the kernel periodically
|
||||
re-tries to send the event to userspace.
|
||||
|
||||
This is the maximum interval the kernel should use when re-trying
|
||||
to deliver the destroy event.
|
||||
|
||||
A higher number means there will be fewer delivery retries and it
|
||||
will take longer for a backlog to be processed.
|
||||
|
||||
nf_conntrack_expect_max - INTEGER
|
||||
Maximum size of expectation table. Default value is
|
||||
nf_conntrack_buckets / 256. Minimum is 1.
|
||||
|
|
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
|
@ -1,107 +0,0 @@
|
|||
This document describes standard names of mixer controls.
|
||||
|
||||
Syntax: [LOCATION] SOURCE [CHANNEL] [DIRECTION] FUNCTION
|
||||
|
||||
DIRECTION:
|
||||
<nothing> (both directions)
|
||||
Playback
|
||||
Capture
|
||||
Bypass Playback
|
||||
Bypass Capture
|
||||
|
||||
FUNCTION:
|
||||
Switch (on/off switch)
|
||||
Volume
|
||||
Route (route control, hardware specific)
|
||||
|
||||
CHANNEL:
|
||||
<nothing> (channel independent, or applies to all channels)
|
||||
Front
|
||||
Surround (rear left/right in 4.0/5.1 surround)
|
||||
CLFE
|
||||
Center
|
||||
LFE
|
||||
Side (side left/right for 7.1 surround)
|
||||
|
||||
LOCATION: (physical location of source)
|
||||
Front
|
||||
Rear
|
||||
Dock (docking station)
|
||||
Internal
|
||||
|
||||
SOURCE:
|
||||
Master
|
||||
Master Mono
|
||||
Hardware Master
|
||||
Speaker (internal speaker)
|
||||
Bass Speaker (internal LFE speaker)
|
||||
Headphone
|
||||
Line Out
|
||||
Beep (beep generator)
|
||||
Phone
|
||||
Phone Input
|
||||
Phone Output
|
||||
Synth
|
||||
FM
|
||||
Mic
|
||||
Headset Mic (mic part of combined headset jack - 4-pin headphone + mic)
|
||||
Headphone Mic (mic part of either/or - 3-pin headphone or mic)
|
||||
Line (input only, use "Line Out" for output)
|
||||
CD
|
||||
Video
|
||||
Zoom Video
|
||||
Aux
|
||||
PCM
|
||||
PCM Pan
|
||||
Loopback
|
||||
Analog Loopback (D/A -> A/D loopback)
|
||||
Digital Loopback (playback -> capture loopback - without analog path)
|
||||
Mono
|
||||
Mono Output
|
||||
Multi
|
||||
ADC
|
||||
Wave
|
||||
Music
|
||||
I2S
|
||||
IEC958
|
||||
HDMI
|
||||
SPDIF (output only)
|
||||
SPDIF In
|
||||
Digital In
|
||||
HDMI/DP (either HDMI or DisplayPort)
|
||||
|
||||
Exceptions (deprecated):
|
||||
[Analogue|Digital] Capture Source
|
||||
[Analogue|Digital] Capture Switch (aka input gain switch)
|
||||
[Analogue|Digital] Capture Volume (aka input gain volume)
|
||||
[Analogue|Digital] Playback Switch (aka output gain switch)
|
||||
[Analogue|Digital] Playback Volume (aka output gain volume)
|
||||
Tone Control - Switch
|
||||
Tone Control - Bass
|
||||
Tone Control - Treble
|
||||
3D Control - Switch
|
||||
3D Control - Center
|
||||
3D Control - Depth
|
||||
3D Control - Wide
|
||||
3D Control - Space
|
||||
3D Control - Level
|
||||
Mic Boost [(?dB)]
|
||||
|
||||
PCM interface:
|
||||
|
||||
Sample Clock Source { "Word", "Internal", "AutoSync" }
|
||||
Clock Sync Status { "Lock", "Sync", "No Lock" }
|
||||
External Rate /* external capture rate */
|
||||
Capture Rate /* capture rate taken from external source */
|
||||
|
||||
IEC958 (S/PDIF) interface:
|
||||
|
||||
IEC958 [...] [Playback|Capture] Switch /* turn on/off the IEC958 interface */
|
||||
IEC958 [...] [Playback|Capture] Volume /* digital volume control */
|
||||
IEC958 [...] [Playback|Capture] Default /* default or global value - read/write */
|
||||
IEC958 [...] [Playback|Capture] Mask /* consumer and professional mask */
|
||||
IEC958 [...] [Playback|Capture] Con Mask /* consumer mask */
|
||||
IEC958 [...] [Playback|Capture] Pro Mask /* professional mask */
|
||||
IEC958 [...] [Playback|Capture] PCM Stream /* the settings assigned to a PCM stream */
|
||||
IEC958 Q-subcode [Playback|Capture] Default /* Q-subcode bits */
|
||||
IEC958 Preamble [Playback|Capture] Default /* burst preamble words (4*16bits) */
|
|
@ -1,324 +0,0 @@
|
|||
Model name Description
|
||||
---------- -----------
|
||||
ALC880
|
||||
======
|
||||
3stack 3-jack in back and a headphone out
|
||||
3stack-digout 3-jack in back, a HP out and a SPDIF out
|
||||
5stack 5-jack in back, 2-jack in front
|
||||
5stack-digout 5-jack in back, 2-jack in front, a SPDIF out
|
||||
6stack 6-jack in back, 2-jack in front
|
||||
6stack-digout 6-jack with a SPDIF out
|
||||
|
||||
ALC260
|
||||
======
|
||||
gpio1 Enable GPIO1
|
||||
coef Enable EAPD via COEF table
|
||||
fujitsu Quirk for FSC S7020
|
||||
fujitsu-jwse Quirk for FSC S7020 with jack modes and HP mic support
|
||||
|
||||
ALC262
|
||||
======
|
||||
inv-dmic Inverted internal mic workaround
|
||||
|
||||
ALC267/268
|
||||
==========
|
||||
inv-dmic Inverted internal mic workaround
|
||||
hp-eapd Disable HP EAPD on NID 0x15
|
||||
|
||||
ALC22x/23x/25x/269/27x/28x/29x (and vendor-specific ALC3xxx models)
|
||||
======
|
||||
laptop-amic Laptops with analog-mic input
|
||||
laptop-dmic Laptops with digital-mic input
|
||||
alc269-dmic Enable ALC269(VA) digital mic workaround
|
||||
alc271-dmic Enable ALC271X digital mic workaround
|
||||
inv-dmic Inverted internal mic workaround
|
||||
headset-mic Indicates a combined headset (headphone+mic) jack
|
||||
headset-mode More comprehensive headset support for ALC269 & co
|
||||
headset-mode-no-hp-mic Headset mode support without headphone mic
|
||||
lenovo-dock Enables docking station I/O for some Lenovos
|
||||
hp-gpio-led GPIO LED support on HP laptops
|
||||
dell-headset-multi Headset jack, which can also be used as mic-in
|
||||
dell-headset-dock Headset jack (without mic-in), and also dock I/O
|
||||
alc283-dac-wcaps Fixups for Chromebook with ALC283
|
||||
alc283-sense-combo Combo jack sensing on ALC283
|
||||
tpt440-dock Pin configs for Lenovo Thinkpad Dock support
|
||||
|
||||
ALC66x/67x/892
|
||||
==============
|
||||
mario Chromebook mario model fixup
|
||||
asus-mode1 ASUS
|
||||
asus-mode2 ASUS
|
||||
asus-mode3 ASUS
|
||||
asus-mode4 ASUS
|
||||
asus-mode5 ASUS
|
||||
asus-mode6 ASUS
|
||||
asus-mode7 ASUS
|
||||
asus-mode8 ASUS
|
||||
inv-dmic Inverted internal mic workaround
|
||||
dell-headset-multi Headset jack, which can also be used as mic-in
|
||||
|
||||
ALC680
|
||||
======
|
||||
N/A
|
||||
|
||||
ALC88x/898/1150
|
||||
======================
|
||||
acer-aspire-4930g Acer Aspire 4930G/5930G/6530G/6930G/7730G
|
||||
acer-aspire-8930g Acer Aspire 8330G/6935G
|
||||
acer-aspire Acer Aspire others
|
||||
inv-dmic Inverted internal mic workaround
|
||||
no-primary-hp VAIO Z/VGC-LN51JGB workaround (for fixed speaker DAC)
|
||||
|
||||
ALC861/660
|
||||
==========
|
||||
N/A
|
||||
|
||||
ALC861VD/660VD
|
||||
==============
|
||||
N/A
|
||||
|
||||
CMI9880
|
||||
=======
|
||||
minimal 3-jack in back
|
||||
min_fp 3-jack in back, 2-jack in front
|
||||
full 6-jack in back, 2-jack in front
|
||||
full_dig 6-jack in back, 2-jack in front, SPDIF I/O
|
||||
allout 5-jack in back, 2-jack in front, SPDIF out
|
||||
auto auto-config reading BIOS (default)
|
||||
|
||||
AD1882 / AD1882A
|
||||
================
|
||||
3stack 3-stack mode
|
||||
3stack-automute 3-stack with automute front HP (default)
|
||||
6stack 6-stack mode
|
||||
|
||||
AD1884A / AD1883 / AD1984A / AD1984B
|
||||
====================================
|
||||
desktop 3-stack desktop (default)
|
||||
laptop laptop with HP jack sensing
|
||||
mobile mobile devices with HP jack sensing
|
||||
thinkpad Lenovo Thinkpad X300
|
||||
touchsmart HP Touchsmart
|
||||
|
||||
AD1884
|
||||
======
|
||||
N/A
|
||||
|
||||
AD1981
|
||||
======
|
||||
basic 3-jack (default)
|
||||
hp HP nx6320
|
||||
thinkpad Lenovo Thinkpad T60/X60/Z60
|
||||
toshiba Toshiba U205
|
||||
|
||||
AD1983
|
||||
======
|
||||
N/A
|
||||
|
||||
AD1984
|
||||
======
|
||||
basic default configuration
|
||||
thinkpad Lenovo Thinkpad T61/X61
|
||||
dell_desktop Dell T3400
|
||||
|
||||
AD1986A
|
||||
=======
|
||||
3stack 3-stack, shared surrounds
|
||||
laptop 2-channel only (FSC V2060, Samsung M50)
|
||||
laptop-imic 2-channel with built-in mic
|
||||
eapd Turn on EAPD constantly
|
||||
|
||||
AD1988/AD1988B/AD1989A/AD1989B
|
||||
==============================
|
||||
6stack 6-jack
|
||||
6stack-dig ditto with SPDIF
|
||||
3stack 3-jack
|
||||
3stack-dig ditto with SPDIF
|
||||
laptop 3-jack with hp-jack automute
|
||||
laptop-dig ditto with SPDIF
|
||||
auto auto-config reading BIOS (default)
|
||||
|
||||
Conexant 5045
|
||||
=============
|
||||
laptop-hpsense Laptop with HP sense (old model laptop)
|
||||
laptop-micsense Laptop with Mic sense (old model fujitsu)
|
||||
laptop-hpmicsense Laptop with HP and Mic senses
|
||||
benq Benq R55E
|
||||
laptop-hp530 HP 530 laptop
|
||||
test for testing/debugging purpose, almost all controls
|
||||
can be adjusted. Appearing only when compiled with
|
||||
$CONFIG_SND_DEBUG=y
|
||||
|
||||
Conexant 5047
|
||||
=============
|
||||
laptop Basic Laptop config
|
||||
laptop-hp Laptop config for some HP models (subdevice 30A5)
|
||||
laptop-eapd Laptop config with EAPD support
|
||||
test for testing/debugging purpose, almost all controls
|
||||
can be adjusted. Appearing only when compiled with
|
||||
$CONFIG_SND_DEBUG=y
|
||||
|
||||
Conexant 5051
|
||||
=============
|
||||
laptop Basic Laptop config (default)
|
||||
hp HP Spartan laptop
|
||||
hp-dv6736 HP dv6736
|
||||
hp-f700 HP Compaq Presario F700
|
||||
ideapad Lenovo IdeaPad laptop
|
||||
toshiba Toshiba Satellite M300
|
||||
|
||||
Conexant 5066
|
||||
=============
|
||||
laptop Basic Laptop config (default)
|
||||
hp-laptop HP laptops, e g G60
|
||||
asus Asus K52JU, Lenovo G560
|
||||
dell-laptop Dell laptops
|
||||
dell-vostro Dell Vostro
|
||||
olpc-xo-1_5 OLPC XO 1.5
|
||||
ideapad Lenovo IdeaPad U150
|
||||
thinkpad Lenovo Thinkpad
|
||||
|
||||
STAC9200
|
||||
========
|
||||
ref Reference board
|
||||
oqo OQO Model 2
|
||||
dell-d21 Dell (unknown)
|
||||
dell-d22 Dell (unknown)
|
||||
dell-d23 Dell (unknown)
|
||||
dell-m21 Dell Inspiron 630m, Dell Inspiron 640m
|
||||
dell-m22 Dell Latitude D620, Dell Latitude D820
|
||||
dell-m23 Dell XPS M1710, Dell Precision M90
|
||||
dell-m24 Dell Latitude 120L
|
||||
dell-m25 Dell Inspiron E1505n
|
||||
dell-m26 Dell Inspiron 1501
|
||||
dell-m27 Dell Inspiron E1705/9400
|
||||
gateway-m4 Gateway laptops with EAPD control
|
||||
gateway-m4-2 Gateway laptops with EAPD control
|
||||
panasonic Panasonic CF-74
|
||||
auto BIOS setup (default)
|
||||
|
||||
STAC9205/9254
|
||||
=============
|
||||
ref Reference board
|
||||
dell-m42 Dell (unknown)
|
||||
dell-m43 Dell Precision
|
||||
dell-m44 Dell Inspiron
|
||||
eapd Keep EAPD on (e.g. Gateway T1616)
|
||||
auto BIOS setup (default)
|
||||
|
||||
STAC9220/9221
|
||||
=============
|
||||
ref Reference board
|
||||
3stack D945 3stack
|
||||
5stack D945 5stack + SPDIF
|
||||
intel-mac-v1 Intel Mac Type 1
|
||||
intel-mac-v2 Intel Mac Type 2
|
||||
intel-mac-v3 Intel Mac Type 3
|
||||
intel-mac-v4 Intel Mac Type 4
|
||||
intel-mac-v5 Intel Mac Type 5
|
||||
intel-mac-auto Intel Mac (detect type according to subsystem id)
|
||||
macmini Intel Mac Mini (equivalent with type 3)
|
||||
macbook Intel Mac Book (eq. type 5)
|
||||
macbook-pro-v1 Intel Mac Book Pro 1st generation (eq. type 3)
|
||||
macbook-pro Intel Mac Book Pro 2nd generation (eq. type 3)
|
||||
imac-intel Intel iMac (eq. type 2)
|
||||
imac-intel-20 Intel iMac (newer version) (eq. type 3)
|
||||
ecs202 ECS/PC chips
|
||||
dell-d81 Dell (unknown)
|
||||
dell-d82 Dell (unknown)
|
||||
dell-m81 Dell (unknown)
|
||||
dell-m82 Dell XPS M1210
|
||||
auto BIOS setup (default)
|
||||
|
||||
STAC9202/9250/9251
|
||||
==================
|
||||
ref Reference board, base config
|
||||
m1 Some Gateway MX series laptops (NX560XL)
|
||||
m1-2 Some Gateway MX series laptops (MX6453)
|
||||
m2 Some Gateway MX series laptops (M255)
|
||||
m2-2 Some Gateway MX series laptops
|
||||
m3 Some Gateway MX series laptops
|
||||
m5 Some Gateway MX series laptops (MP6954)
|
||||
m6 Some Gateway NX series laptops
|
||||
auto BIOS setup (default)
|
||||
|
||||
STAC9227/9228/9229/927x
|
||||
=======================
|
||||
ref Reference board
|
||||
ref-no-jd Reference board without HP/Mic jack detection
|
||||
3stack D965 3stack
|
||||
5stack D965 5stack + SPDIF
|
||||
5stack-no-fp D965 5stack without front panel
|
||||
dell-3stack Dell Dimension E520
|
||||
dell-bios Fixes with Dell BIOS setup
|
||||
dell-bios-amic Fixes with Dell BIOS setup including analog mic
|
||||
volknob Fixes with volume-knob widget 0x24
|
||||
auto BIOS setup (default)
|
||||
|
||||
STAC92HD71B*
|
||||
============
|
||||
ref Reference board
|
||||
dell-m4-1 Dell desktops
|
||||
dell-m4-2 Dell desktops
|
||||
dell-m4-3 Dell desktops
|
||||
hp-m4 HP mini 1000
|
||||
hp-dv5 HP dv series
|
||||
hp-hdx HP HDX series
|
||||
hp-dv4-1222nr HP dv4-1222nr (with LED support)
|
||||
auto BIOS setup (default)
|
||||
|
||||
STAC92HD73*
|
||||
===========
|
||||
ref Reference board
|
||||
no-jd BIOS setup but without jack-detection
|
||||
intel Intel DG45* mobos
|
||||
dell-m6-amic Dell desktops/laptops with analog mics
|
||||
dell-m6-dmic Dell desktops/laptops with digital mics
|
||||
dell-m6 Dell desktops/laptops with both type of mics
|
||||
dell-eq Dell desktops/laptops
|
||||
alienware Alienware M17x
|
||||
auto BIOS setup (default)
|
||||
|
||||
STAC92HD83*
|
||||
===========
|
||||
ref Reference board
|
||||
mic-ref Reference board with power management for ports
|
||||
dell-s14 Dell laptop
|
||||
dell-vostro-3500 Dell Vostro 3500 laptop
|
||||
hp-dv7-4000 HP dv-7 4000
|
||||
hp_cNB11_intquad HP CNB models with 4 speakers
|
||||
hp-zephyr HP Zephyr
|
||||
hp-led HP with broken BIOS for mute LED
|
||||
hp-inv-led HP with broken BIOS for inverted mute LED
|
||||
hp-mic-led HP with mic-mute LED
|
||||
headset-jack Dell Latitude with a 4-pin headset jack
|
||||
hp-envy-bass Pin fixup for HP Envy bass speaker (NID 0x0f)
|
||||
hp-envy-ts-bass Pin fixup for HP Envy TS bass speaker (NID 0x10)
|
||||
hp-bnb13-eq Hardware equalizer setup for HP laptops
|
||||
auto BIOS setup (default)
|
||||
|
||||
STAC92HD95
|
||||
==========
|
||||
hp-led LED support for HP laptops
|
||||
hp-bass Bass HPF setup for HP Spectre 13
|
||||
|
||||
STAC9872
|
||||
========
|
||||
vaio VAIO laptop without SPDIF
|
||||
auto BIOS setup (default)
|
||||
|
||||
Cirrus Logic CS4206/4207
|
||||
========================
|
||||
mbp55 MacBook Pro 5,5
|
||||
imac27 IMac 27 Inch
|
||||
auto BIOS setup (default)
|
||||
|
||||
Cirrus Logic CS4208
|
||||
===================
|
||||
mba6 MacBook Air 6,1 and 6,2
|
||||
gpio0 Enable GPIO 0 amp
|
||||
auto BIOS setup (default)
|
||||
|
||||
VIA VT17xx/VT18xx/VT20xx
|
||||
========================
|
||||
auto BIOS setup (default)
|
|
@ -1,8 +0,0 @@
|
|||
|
||||
VIA82xx mixer
|
||||
=============
|
||||
|
||||
On many VIA82xx boards, the 'Input Source Select' mixer control does not work.
|
||||
Setting it to 'Input2' on such boards will cause recording to hang, or fail
|
||||
with EIO (input/output error) via OSS emulation. This control should be left
|
||||
at 'Input1' for such cards.
|
|
@ -1,135 +0,0 @@
|
|||
ALSA Kernel Parameters
|
||||
~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
See Documentation/kernel-parameters.txt for general information on
|
||||
specifying module parameters.
|
||||
|
||||
This document may not be entirely up to date and comprehensive. The command
|
||||
"modinfo -p ${modulename}" shows a current list of all parameters of a loadable
|
||||
module. Loadable modules, after being loaded into the running kernel, also
|
||||
reveal their parameters in /sys/module/${modulename}/parameters/. Some of these
|
||||
parameters may be changed at runtime by the command
|
||||
"echo -n ${value} > /sys/module/${modulename}/parameters/${parm}".
|
||||
|
||||
|
||||
snd-ad1816a= [HW,ALSA]
|
||||
|
||||
snd-ad1848= [HW,ALSA]
|
||||
|
||||
snd-ali5451= [HW,ALSA]
|
||||
|
||||
snd-als100= [HW,ALSA]
|
||||
|
||||
snd-als4000= [HW,ALSA]
|
||||
|
||||
snd-azt2320= [HW,ALSA]
|
||||
|
||||
snd-cmi8330= [HW,ALSA]
|
||||
|
||||
snd-cmipci= [HW,ALSA]
|
||||
|
||||
snd-cs4231= [HW,ALSA]
|
||||
|
||||
snd-cs4232= [HW,ALSA]
|
||||
|
||||
snd-cs4236= [HW,ALSA]
|
||||
|
||||
snd-cs4281= [HW,ALSA]
|
||||
|
||||
snd-cs46xx= [HW,ALSA]
|
||||
|
||||
snd-dt019x= [HW,ALSA]
|
||||
|
||||
snd-dummy= [HW,ALSA]
|
||||
|
||||
snd-emu10k1= [HW,ALSA]
|
||||
|
||||
snd-ens1370= [HW,ALSA]
|
||||
|
||||
snd-ens1371= [HW,ALSA]
|
||||
|
||||
snd-es968= [HW,ALSA]
|
||||
|
||||
snd-es1688= [HW,ALSA]
|
||||
|
||||
snd-es18xx= [HW,ALSA]
|
||||
|
||||
snd-es1938= [HW,ALSA]
|
||||
|
||||
snd-es1968= [HW,ALSA]
|
||||
|
||||
snd-fm801= [HW,ALSA]
|
||||
|
||||
snd-gusclassic= [HW,ALSA]
|
||||
|
||||
snd-gusextreme= [HW,ALSA]
|
||||
|
||||
snd-gusmax= [HW,ALSA]
|
||||
|
||||
snd-hdsp= [HW,ALSA]
|
||||
|
||||
snd-ice1712= [HW,ALSA]
|
||||
|
||||
snd-intel8x0= [HW,ALSA]
|
||||
|
||||
snd-interwave= [HW,ALSA]
|
||||
|
||||
snd-interwave-stb=
|
||||
[HW,ALSA]
|
||||
|
||||
snd-korg1212= [HW,ALSA]
|
||||
|
||||
snd-maestro3= [HW,ALSA]
|
||||
|
||||
snd-mpu401= [HW,ALSA]
|
||||
|
||||
snd-mtpav= [HW,ALSA]
|
||||
|
||||
snd-nm256= [HW,ALSA]
|
||||
|
||||
snd-opl3sa2= [HW,ALSA]
|
||||
|
||||
snd-opti92x-ad1848=
|
||||
[HW,ALSA]
|
||||
|
||||
snd-opti92x-cs4231=
|
||||
[HW,ALSA]
|
||||
|
||||
snd-opti93x= [HW,ALSA]
|
||||
|
||||
snd-pmac= [HW,ALSA]
|
||||
|
||||
snd-rme32= [HW,ALSA]
|
||||
|
||||
snd-rme96= [HW,ALSA]
|
||||
|
||||
snd-rme9652= [HW,ALSA]
|
||||
|
||||
snd-sb8= [HW,ALSA]
|
||||
|
||||
snd-sb16= [HW,ALSA]
|
||||
|
||||
snd-sbawe= [HW,ALSA]
|
||||
|
||||
snd-serial= [HW,ALSA]
|
||||
|
||||
snd-sgalaxy= [HW,ALSA]
|
||||
|
||||
snd-sonicvibes= [HW,ALSA]
|
||||
|
||||
snd-sun-amd7930=
|
||||
[HW,ALSA]
|
||||
|
||||
snd-sun-cs4231= [HW,ALSA]
|
||||
|
||||
snd-trident= [HW,ALSA]
|
||||
|
||||
snd-usb-audio= [HW,ALSA,USB]
|
||||
|
||||
snd-via82xx= [HW,ALSA]
|
||||
|
||||
snd-virmidi= [HW,ALSA]
|
||||
|
||||
snd-wavefront= [HW,ALSA]
|
||||
|
||||
snd-ymfpci= [HW,ALSA]
|
|
@ -1,409 +0,0 @@
|
|||
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
|
||||
<HTML>
|
||||
<HEAD>
|
||||
<TITLE>OSS Sequencer Emulation on ALSA</TITLE>
|
||||
</HEAD>
|
||||
<BODY>
|
||||
|
||||
<CENTER>
|
||||
<H1>
|
||||
|
||||
<HR WIDTH="100%"></H1></CENTER>
|
||||
|
||||
<CENTER>
|
||||
<H1>
|
||||
OSS Sequencer Emulation on ALSA</H1></CENTER>
|
||||
|
||||
<HR WIDTH="100%">
|
||||
<P>Copyright (c) 1998,1999 by Takashi Iwai
|
||||
<TT><A HREF="mailto:iwai@ww.uni-erlangen.de"><iwai@ww.uni-erlangen.de></A></TT>
|
||||
<P>ver.0.1.8; Nov. 16, 1999
|
||||
<H2>
|
||||
|
||||
<HR WIDTH="100%"></H2>
|
||||
|
||||
<H2>
|
||||
1. Description</H2>
|
||||
This directory contains the OSS sequencer emulation driver on ALSA. Note
|
||||
that this program is still in the development state.
|
||||
<P>What this does - it provides the emulation of the OSS sequencer, access
|
||||
via
|
||||
<TT>/dev/sequencer</TT> and <TT>/dev/music</TT> devices.
|
||||
The most of applications using OSS can run if the appropriate ALSA
|
||||
sequencer is prepared.
|
||||
<P>The following features are emulated by this driver:
|
||||
<UL>
|
||||
<LI>
|
||||
Normal sequencer and MIDI events:</LI>
|
||||
|
||||
<BR>They are converted to the ALSA sequencer events, and sent to the corresponding
|
||||
port.
|
||||
<LI>
|
||||
Timer events:</LI>
|
||||
|
||||
<BR>The timer is not selectable by ioctl. The control rate is fixed to
|
||||
100 regardless of HZ. That is, even on Alpha system, a tick is always
|
||||
1/100 second. The base rate and tempo can be changed in <TT>/dev/music</TT>.
|
||||
|
||||
<LI>
|
||||
Patch loading:</LI>
|
||||
|
||||
<BR>It purely depends on the synth drivers whether it's supported since
|
||||
the patch loading is realized by callback to the synth driver.
|
||||
<LI>
|
||||
I/O controls:</LI>
|
||||
|
||||
<BR>Most of controls are accepted. Some controls
|
||||
are dependent on the synth driver, as well as even on original OSS.</UL>
|
||||
Furthermore, you can find the following advanced features:
|
||||
<UL>
|
||||
<LI>
|
||||
Better queue mechanism:</LI>
|
||||
|
||||
<BR>The events are queued before processing them.
|
||||
<LI>
|
||||
Multiple applications:</LI>
|
||||
|
||||
<BR>You can run two or more applications simultaneously (even for OSS sequencer)!
|
||||
However, each MIDI device is exclusive - that is, if a MIDI device is opened
|
||||
once by some application, other applications can't use it. No such a restriction
|
||||
in synth devices.
|
||||
<LI>
|
||||
Real-time event processing:</LI>
|
||||
|
||||
<BR>The events can be processed in real time without using out of bound
|
||||
ioctl. To switch to real-time mode, send ABSTIME 0 event. The followed
|
||||
events will be processed in real-time without queued. To switch off the
|
||||
real-time mode, send RELTIME 0 event.
|
||||
<LI>
|
||||
<TT>/proc</TT> interface:</LI>
|
||||
|
||||
<BR>The status of applications and devices can be shown via <TT>/proc/asound/seq/oss</TT>
|
||||
at any time. In the later version, configuration will be changed via <TT>/proc</TT>
|
||||
interface, too.</UL>
|
||||
|
||||
<H2>
|
||||
2. Installation</H2>
|
||||
Run configure script with both sequencer support (<TT>--with-sequencer=yes</TT>)
|
||||
and OSS emulation (<TT>--with-oss=yes</TT>) options. A module <TT>snd-seq-oss.o</TT>
|
||||
will be created. If the synth module of your sound card supports for OSS
|
||||
emulation (so far, only Emu8000 driver), this module will be loaded automatically.
|
||||
Otherwise, you need to load this module manually.
|
||||
<P>At beginning, this module probes all the MIDI ports which have been
|
||||
already connected to the sequencer. Once after that, the creation and deletion
|
||||
of ports are watched by announcement mechanism of ALSA sequencer.
|
||||
<P>The available synth and MIDI devices can be found in proc interface.
|
||||
Run "<TT>cat /proc/asound/seq/oss</TT>", and check the devices. For example,
|
||||
if you use an AWE64 card, you'll see like the following:
|
||||
<PRE> OSS sequencer emulation version 0.1.8
|
||||
ALSA client number 63
|
||||
ALSA receiver port 0
|
||||
|
||||
Number of applications: 0
|
||||
|
||||
Number of synth devices: 1
|
||||
|
||||
synth 0: [EMU8000]
|
||||
type 0x1 : subtype 0x20 : voices 32
|
||||
capabilties : ioctl enabled / load_patch enabled
|
||||
|
||||
Number of MIDI devices: 3
|
||||
|
||||
midi 0: [Emu8000 Port-0] ALSA port 65:0
|
||||
capability write / opened none
|
||||
|
||||
midi 1: [Emu8000 Port-1] ALSA port 65:1
|
||||
capability write / opened none
|
||||
|
||||
midi 2: [0: MPU-401 (UART)] ALSA port 64:0
|
||||
capability read/write / opened none</PRE>
|
||||
Note that the device number may be different from the information of
|
||||
<TT>/proc/asound/oss-devices</TT>
|
||||
or ones of the original OSS driver. Use the device number listed in <TT>/proc/asound/seq/oss</TT>
|
||||
to play via OSS sequencer emulation.
|
||||
<H2>
|
||||
3. Using Synthesizer Devices</H2>
|
||||
Run your favorite program. I've tested playmidi-2.4, awemidi-0.4.3, gmod-3.1
|
||||
and xmp-1.1.5. You can load samples via <TT>/dev/sequencer</TT> like sfxload,
|
||||
too.
|
||||
<P>If the lowlevel driver supports multiple access to synth devices (like
|
||||
Emu8000 driver), two or more applications are allowed to run at the same
|
||||
time.
|
||||
<H2>
|
||||
4. Using MIDI Devices</H2>
|
||||
So far, only MIDI output was tested. MIDI input was not checked at all,
|
||||
but hopefully it will work. Use the device number listed in <TT>/proc/asound/seq/oss</TT>.
|
||||
Be aware that these numbers are mostly different from the list in
|
||||
<TT>/proc/asound/oss-devices</TT>.
|
||||
<H2>
|
||||
5. Module Options</H2>
|
||||
The following module options are available:
|
||||
<UL>
|
||||
<LI>
|
||||
<TT>maxqlen</TT></LI>
|
||||
|
||||
<BR>specifies the maximum read/write queue length. This queue is private
|
||||
for OSS sequencer, so that it is independent from the queue length of ALSA
|
||||
sequencer. Default value is 1024.
|
||||
<LI>
|
||||
<TT>seq_oss_debug</TT></LI>
|
||||
|
||||
<BR>specifies the debug level and accepts zero (= no debug message) or
|
||||
positive integer. Default value is 0.</UL>
|
||||
|
||||
<H2>
|
||||
6. Queue Mechanism</H2>
|
||||
OSS sequencer emulation uses an ALSA priority queue. The
|
||||
events from <TT>/dev/sequencer</TT> are processed and put onto the queue
|
||||
specified by module option.
|
||||
<P>All the events from <TT>/dev/sequencer</TT> are parsed at beginning.
|
||||
The timing events are also parsed at this moment, so that the events may
|
||||
be processed in real-time. Sending an event ABSTIME 0 switches the operation
|
||||
mode to real-time mode, and sending an event RELTIME 0 switches it off.
|
||||
In the real-time mode, all events are dispatched immediately.
|
||||
<P>The queued events are dispatched to the corresponding ALSA sequencer
|
||||
ports after scheduled time by ALSA sequencer dispatcher.
|
||||
<P>If the write-queue is full, the application sleeps until a certain amount
|
||||
(as default one half) becomes empty in blocking mode. The synchronization
|
||||
to write timing was implemented, too.
|
||||
<P>The input from MIDI devices or echo-back events are stored on read FIFO
|
||||
queue. If application reads <TT>/dev/sequencer</TT> in blocking mode, the
|
||||
process will be awaked.
|
||||
|
||||
<H2>
|
||||
7. Interface to Synthesizer Device</H2>
|
||||
|
||||
<H3>
|
||||
7.1. Registration</H3>
|
||||
To register an OSS synthesizer device, use <TT>snd_seq_oss_synth_register</TT>
|
||||
function.
|
||||
<PRE>int snd_seq_oss_synth_register(char *name, int type, int subtype, int nvoices,
|
||||
snd_seq_oss_callback_t *oper, void *private_data)</PRE>
|
||||
The arguments <TT>name</TT>, <TT>type</TT>, <TT>subtype</TT> and
|
||||
<TT>nvoices</TT>
|
||||
are used for making the appropriate synth_info structure for ioctl. The
|
||||
return value is an index number of this device. This index must be remembered
|
||||
for unregister. If registration is failed, -errno will be returned.
|
||||
<P>To release this device, call <TT>snd_seq_oss_synth_unregister function</TT>:
|
||||
<PRE>int snd_seq_oss_synth_unregister(int index),</PRE>
|
||||
where the <TT>index</TT> is the index number returned by register function.
|
||||
<H3>
|
||||
7.2. Callbacks</H3>
|
||||
OSS synthesizer devices have capability for sample downloading and ioctls
|
||||
like sample reset. In OSS emulation, these special features are realized
|
||||
by using callbacks. The registration argument oper is used to specify these
|
||||
callbacks. The following callback functions must be defined:
|
||||
<PRE>snd_seq_oss_callback_t:
|
||||
int (*open)(snd_seq_oss_arg_t *p, void *closure);
|
||||
int (*close)(snd_seq_oss_arg_t *p);
|
||||
int (*ioctl)(snd_seq_oss_arg_t *p, unsigned int cmd, unsigned long arg);
|
||||
int (*load_patch)(snd_seq_oss_arg_t *p, int format, const char *buf, int offs, int count);
|
||||
int (*reset)(snd_seq_oss_arg_t *p);
|
||||
Except for <TT>open</TT> and <TT>close</TT> callbacks, they are allowed
|
||||
to be NULL.
|
||||
<P>Each callback function takes the argument type snd_seq_oss_arg_t as the
|
||||
first argument.
|
||||
<PRE>struct snd_seq_oss_arg_t {
|
||||
int app_index;
|
||||
int file_mode;
|
||||
int seq_mode;
|
||||
snd_seq_addr_t addr;
|
||||
void *private_data;
|
||||
int event_passing;
|
||||
};</PRE>
|
||||
The first three fields, <TT>app_index</TT>, <TT>file_mode</TT> and
|
||||
<TT>seq_mode</TT>
|
||||
are initialized by OSS sequencer. The <TT>app_index</TT> is the application
|
||||
index which is unique to each application opening OSS sequencer. The
|
||||
<TT>file_mode</TT>
|
||||
is bit-flags indicating the file operation mode. See
|
||||
<TT>seq_oss.h</TT>
|
||||
for its meaning. The <TT>seq_mode</TT> is sequencer operation mode. In
|
||||
the current version, only <TT>SND_OSSSEQ_MODE_SYNTH</TT> is used.
|
||||
<P>The next two fields, <TT>addr</TT> and <TT>private_data</TT>, must be
|
||||
filled by the synth driver at open callback. The <TT>addr</TT> contains
|
||||
the address of ALSA sequencer port which is assigned to this device. If
|
||||
the driver allocates memory for <TT>private_data</TT>, it must be released
|
||||
in close callback by itself.
|
||||
<P>The last field, <TT>event_passing</TT>, indicates how to translate note-on
|
||||
/ off events. In <TT>PROCESS_EVENTS</TT> mode, the note 255 is regarded
|
||||
as velocity change, and key pressure event is passed to the port. In <TT>PASS_EVENTS</TT>
|
||||
mode, all note on/off events are passed to the port without modified. <TT>PROCESS_KEYPRESS</TT>
|
||||
mode checks the note above 128 and regards it as key pressure event (mainly
|
||||
for Emu8000 driver).
|
||||
<H4>
|
||||
7.2.1. Open Callback</H4>
|
||||
The <TT>open</TT> is called at each time this device is opened by an application
|
||||
using OSS sequencer. This must not be NULL. Typically, the open callback
|
||||
does the following procedure:
|
||||
<OL>
|
||||
<LI>
|
||||
Allocate private data record.</LI>
|
||||
|
||||
<LI>
|
||||
Create an ALSA sequencer port.</LI>
|
||||
|
||||
<LI>
|
||||
Set the new port address on arg->addr.</LI>
|
||||
|
||||
<LI>
|
||||
Set the private data record pointer on arg->private_data.</LI>
|
||||
</OL>
|
||||
Note that the type bit-flags in port_info of this synth port must NOT contain
|
||||
<TT>TYPE_MIDI_GENERIC</TT>
|
||||
bit. Instead, <TT>TYPE_SPECIFIC</TT> should be used. Also, <TT>CAP_SUBSCRIPTION</TT>
|
||||
bit should NOT be included, too. This is necessary to tell it from other
|
||||
normal MIDI devices. If the open procedure succeeded, return zero. Otherwise,
|
||||
return -errno.
|
||||
<H4>
|
||||
7.2.2 Ioctl Callback</H4>
|
||||
The <TT>ioctl</TT> callback is called when the sequencer receives device-specific
|
||||
ioctls. The following two ioctls should be processed by this callback:
|
||||
<UL>
|
||||
<LI>
|
||||
<TT>IOCTL_SEQ_RESET_SAMPLES</TT></LI>
|
||||
|
||||
<BR>reset all samples on memory -- return 0
|
||||
<LI>
|
||||
<TT>IOCTL_SYNTH_MEMAVL</TT></LI>
|
||||
|
||||
<BR>return the available memory size
|
||||
<LI>
|
||||
<TT>FM_4OP_ENABLE</TT></LI>
|
||||
|
||||
<BR>can be ignored usually</UL>
|
||||
The other ioctls are processed inside the sequencer without passing to
|
||||
the lowlevel driver.
|
||||
<H4>
|
||||
7.2.3 Load_Patch Callback</H4>
|
||||
The <TT>load_patch</TT> callback is used for sample-downloading. This callback
|
||||
must read the data on user-space and transfer to each device. Return 0
|
||||
if succeeded, and -errno if failed. The format argument is the patch key
|
||||
in patch_info record. The buf is user-space pointer where patch_info record
|
||||
is stored. The offs can be ignored. The count is total data size of this
|
||||
sample data.
|
||||
<H4>
|
||||
7.2.4 Close Callback</H4>
|
||||
The <TT>close</TT> callback is called when this device is closed by the
|
||||
application. If any private data was allocated in open callback, it must
|
||||
be released in the close callback. The deletion of ALSA port should be
|
||||
done here, too. This callback must not be NULL.
|
||||
<H4>
|
||||
7.2.5 Reset Callback</H4>
|
||||
The <TT>reset</TT> callback is called when sequencer device is reset or
|
||||
closed by applications. The callback should turn off the sounds on the
|
||||
relevant port immediately, and initialize the status of the port. If this
|
||||
callback is undefined, OSS seq sends a <TT>HEARTBEAT</TT> event to the
|
||||
port.
|
||||
<H3>
|
||||
7.3 Events</H3>
|
||||
Most of the events are processed by sequencer and translated to the adequate
|
||||
ALSA sequencer events, so that each synth device can receive by input_event
|
||||
callback of ALSA sequencer port. The following ALSA events should be implemented
|
||||
by the driver:
|
||||
<BR>
|
||||
<TABLE BORDER WIDTH="75%" NOSAVE >
|
||||
<TR NOSAVE>
|
||||
<TD NOSAVE><B>ALSA event</B></TD>
|
||||
|
||||
<TD><B>Original OSS events</B></TD>
|
||||
</TR>
|
||||
|
||||
<TR>
|
||||
<TD>NOTEON</TD>
|
||||
|
||||
<TD>SEQ_NOTEON
|
||||
<BR>MIDI_NOTEON</TD>
|
||||
</TR>
|
||||
|
||||
<TR>
|
||||
<TD>NOTE</TD>
|
||||
|
||||
<TD>SEQ_NOTEOFF
|
||||
<BR>MIDI_NOTEOFF</TD>
|
||||
</TR>
|
||||
|
||||
<TR NOSAVE>
|
||||
<TD NOSAVE>KEYPRESS</TD>
|
||||
|
||||
<TD>MIDI_KEY_PRESSURE</TD>
|
||||
</TR>
|
||||
|
||||
<TR NOSAVE>
|
||||
<TD>CHANPRESS</TD>
|
||||
|
||||
<TD NOSAVE>SEQ_AFTERTOUCH
|
||||
<BR>MIDI_CHN_PRESSURE</TD>
|
||||
</TR>
|
||||
|
||||
<TR NOSAVE>
|
||||
<TD NOSAVE>PGMCHANGE</TD>
|
||||
|
||||
<TD NOSAVE>SEQ_PGMCHANGE
|
||||
<BR>MIDI_PGM_CHANGE</TD>
|
||||
</TR>
|
||||
|
||||
<TR>
|
||||
<TD>PITCHBEND</TD>
|
||||
|
||||
<TD>SEQ_CONTROLLER(CTRL_PITCH_BENDER)
|
||||
<BR>MIDI_PITCH_BEND</TD>
|
||||
</TR>
|
||||
|
||||
<TR>
|
||||
<TD>CONTROLLER</TD>
|
||||
|
||||
<TD>MIDI_CTL_CHANGE
|
||||
<BR>SEQ_BALANCE (with CTL_PAN)</TD>
|
||||
</TR>
|
||||
|
||||
<TR>
|
||||
<TD>CONTROL14</TD>
|
||||
|
||||
<TD>SEQ_CONTROLLER</TD>
|
||||
</TR>
|
||||
|
||||
<TR>
|
||||
<TD>REGPARAM</TD>
|
||||
|
||||
<TD>SEQ_CONTROLLER(CTRL_PITCH_BENDER_RANGE)</TD>
|
||||
</TR>
|
||||
|
||||
<TR>
|
||||
<TD>SYSEX</TD>
|
||||
|
||||
<TD>SEQ_SYSEX</TD>
|
||||
</TR>
|
||||
</TABLE>
|
||||
|
||||
<P>The most of these behavior can be realized by MIDI emulation driver
|
||||
included in the Emu8000 lowlevel driver. In the future release, this module
|
||||
will be independent.
|
||||
<P>Some OSS events (<TT>SEQ_PRIVATE</TT> and <TT>SEQ_VOLUME</TT> events) are passed as event
|
||||
type SND_SEQ_OSS_PRIVATE. The OSS sequencer passes these event 8 byte
|
||||
packets without any modification. The lowlevel driver should process these
|
||||
events appropriately.
|
||||
<H2>
|
||||
8. Interface to MIDI Device</H2>
|
||||
Since the OSS emulation probes the creation and deletion of ALSA MIDI sequencer
|
||||
ports automatically by receiving announcement from ALSA sequencer, the
|
||||
MIDI devices don't need to be registered explicitly like synth devices.
|
||||
However, the MIDI port_info registered to ALSA sequencer must include a group
|
||||
name <TT>SND_SEQ_GROUP_DEVICE</TT> and a capability-bit <TT>CAP_READ</TT> or
|
||||
<TT>CAP_WRITE</TT>. Also, subscription capabilities, <TT>CAP_SUBS_READ</TT> or <TT>CAP_SUBS_WRITE</TT>,
|
||||
must be defined, too. If these conditions are not satisfied, the port is not
|
||||
registered as OSS sequencer MIDI device.
|
||||
<P>The events via MIDI devices are parsed in OSS sequencer and converted
|
||||
to the corresponding ALSA sequencer events. The input from MIDI sequencer
|
||||
is also converted to MIDI byte events by OSS sequencer. This works just
|
||||
a reverse way of seq_midi module.
|
||||
<H2>
|
||||
9. Known Problems / TODO's</H2>
|
||||
|
||||
<UL>
|
||||
<LI>
|
||||
Patch loading via ALSA instrument layer is not implemented yet.</LI>
|
||||
</UL>
|
||||
|
||||
</BODY>
|
||||
</HTML>
|
|
@ -1,8 +1,8 @@
|
|||
=============================================
|
||||
Sound Blaster Audigy mixer / default DSP code
|
||||
=============================================
|
||||
|
||||
Sound Blaster Audigy mixer / default DSP code
|
||||
===========================================
|
||||
|
||||
This is based on SB-Live-mixer.txt.
|
||||
This is based on sb-live-mixer.rst.
|
||||
|
||||
The EMU10K2 chips have a DSP part which can be programmed to support
|
||||
various ways of sample processing, which is described here.
|
||||
|
@ -13,8 +13,8 @@ The ALSA driver programs this portion of chip by default code
|
|||
(can be altered later) which offers the following functionality:
|
||||
|
||||
|
||||
1) Digital mixer controls
|
||||
-------------------------
|
||||
Digital mixer controls
|
||||
======================
|
||||
|
||||
These controls are built using the DSP instructions. They offer extended
|
||||
functionality. Only the default build-in code in the ALSA driver is described
|
||||
|
@ -26,320 +26,343 @@ is mentioned in multiple controls, the signal is accumulated and can be wrapped
|
|||
|
||||
Explanation of used abbreviations:
|
||||
|
||||
DAC - digital to analog converter
|
||||
ADC - analog to digital converter
|
||||
I2S - one-way three wire serial bus for digital sound by Philips Semiconductors
|
||||
(this standard is used for connecting standalone DAC and ADC converters)
|
||||
LFE - low frequency effects (subwoofer signal)
|
||||
AC97 - a chip containing an analog mixer, DAC and ADC converters
|
||||
IEC958 - S/PDIF
|
||||
FX-bus - the EMU10K2 chip has an effect bus containing 64 accumulators.
|
||||
Each of the synthesizer voices can feed its output to these accumulators
|
||||
and the DSP microcontroller can operate with the resulting sum.
|
||||
DAC
|
||||
digital to analog converter
|
||||
ADC
|
||||
analog to digital converter
|
||||
I2S
|
||||
one-way three wire serial bus for digital sound by Philips Semiconductors
|
||||
(this standard is used for connecting standalone DAC and ADC converters)
|
||||
LFE
|
||||
low frequency effects (subwoofer signal)
|
||||
AC97
|
||||
a chip containing an analog mixer, DAC and ADC converters
|
||||
IEC958
|
||||
S/PDIF
|
||||
FX-bus
|
||||
the EMU10K2 chip has an effect bus containing 64 accumulators.
|
||||
Each of the synthesizer voices can feed its output to these accumulators
|
||||
and the DSP microcontroller can operate with the resulting sum.
|
||||
|
||||
name='PCM Front Playback Volume',index=0
|
||||
|
||||
----------------------------------------
|
||||
This control is used to attenuate samples for left and right front PCM FX-bus
|
||||
accumulators. ALSA uses accumulators 8 and 9 for left and right front PCM
|
||||
samples for 5.1 playback. The result samples are forwarded to the front DAC PCM
|
||||
slots of the Philips DAC.
|
||||
|
||||
name='PCM Surround Playback Volume',index=0
|
||||
|
||||
-------------------------------------------
|
||||
This control is used to attenuate samples for left and right surround PCM FX-bus
|
||||
accumulators. ALSA uses accumulators 2 and 3 for left and right surround PCM
|
||||
samples for 5.1 playback. The result samples are forwarded to the surround DAC PCM
|
||||
slots of the Philips DAC.
|
||||
|
||||
name='PCM Center Playback Volume',index=0
|
||||
|
||||
-----------------------------------------
|
||||
This control is used to attenuate samples for center PCM FX-bus accumulator.
|
||||
ALSA uses accumulator 6 for center PCM sample for 5.1 playback. The result sample
|
||||
is forwarded to the center DAC PCM slot of the Philips DAC.
|
||||
|
||||
name='PCM LFE Playback Volume',index=0
|
||||
|
||||
--------------------------------------
|
||||
This control is used to attenuate sample for LFE PCM FX-bus accumulator.
|
||||
ALSA uses accumulator 7 for LFE PCM sample for 5.1 playback. The result sample
|
||||
is forwarded to the LFE DAC PCM slot of the Philips DAC.
|
||||
|
||||
name='PCM Playback Volume',index=0
|
||||
|
||||
----------------------------------
|
||||
This control is used to attenuate samples for left and right PCM FX-bus
|
||||
accumulators. ALSA uses accumulators 0 and 1 for left and right PCM samples for
|
||||
stereo playback. The result samples are forwarded to the front DAC PCM slots
|
||||
of the Philips DAC.
|
||||
|
||||
name='PCM Capture Volume',index=0
|
||||
|
||||
---------------------------------
|
||||
This control is used to attenuate samples for left and right PCM FX-bus
|
||||
accumulator. ALSA uses accumulators 0 and 1 for left and right PCM.
|
||||
The result is forwarded to the ADC capture FIFO (thus to the standard capture
|
||||
PCM device).
|
||||
|
||||
name='Music Playback Volume',index=0
|
||||
|
||||
------------------------------------
|
||||
This control is used to attenuate samples for left and right MIDI FX-bus
|
||||
accumulators. ALSA uses accumulators 4 and 5 for left and right MIDI samples.
|
||||
The result samples are forwarded to the front DAC PCM slots of the AC97 codec.
|
||||
|
||||
name='Music Capture Volume',index=0
|
||||
|
||||
-----------------------------------
|
||||
These controls are used to attenuate samples for left and right MIDI FX-bus
|
||||
accumulator. ALSA uses accumulators 4 and 5 for left and right PCM.
|
||||
The result is forwarded to the ADC capture FIFO (thus to the standard capture
|
||||
PCM device).
|
||||
|
||||
name='Mic Playback Volume',index=0
|
||||
|
||||
----------------------------------
|
||||
This control is used to attenuate samples for left and right Mic input.
|
||||
For Mic input is used AC97 codec. The result samples are forwarded to
|
||||
the front DAC PCM slots of the Philips DAC. Samples are forwarded to Mic
|
||||
capture FIFO (device 1 - 16bit/8KHz mono) too without volume control.
|
||||
|
||||
name='Mic Capture Volume',index=0
|
||||
|
||||
---------------------------------
|
||||
This control is used to attenuate samples for left and right Mic input.
|
||||
The result is forwarded to the ADC capture FIFO (thus to the standard capture
|
||||
PCM device).
|
||||
|
||||
name='Audigy CD Playback Volume',index=0
|
||||
|
||||
----------------------------------------
|
||||
This control is used to attenuate samples from left and right IEC958 TTL
|
||||
digital inputs (usually used by a CDROM drive). The result samples are
|
||||
forwarded to the front DAC PCM slots of the Philips DAC.
|
||||
|
||||
name='Audigy CD Capture Volume',index=0
|
||||
|
||||
---------------------------------------
|
||||
This control is used to attenuate samples from left and right IEC958 TTL
|
||||
digital inputs (usually used by a CDROM drive). The result samples are
|
||||
forwarded to the ADC capture FIFO (thus to the standard capture PCM device).
|
||||
|
||||
name='IEC958 Optical Playback Volume',index=0
|
||||
|
||||
---------------------------------------------
|
||||
This control is used to attenuate samples from left and right IEC958 optical
|
||||
digital input. The result samples are forwarded to the front DAC PCM slots
|
||||
of the Philips DAC.
|
||||
|
||||
name='IEC958 Optical Capture Volume',index=0
|
||||
|
||||
--------------------------------------------
|
||||
This control is used to attenuate samples from left and right IEC958 optical
|
||||
digital inputs. The result samples are forwarded to the ADC capture FIFO
|
||||
(thus to the standard capture PCM device).
|
||||
|
||||
name='Line2 Playback Volume',index=0
|
||||
|
||||
------------------------------------
|
||||
This control is used to attenuate samples from left and right I2S ADC
|
||||
inputs (on the AudigyDrive). The result samples are forwarded to the front
|
||||
DAC PCM slots of the Philips DAC.
|
||||
|
||||
name='Line2 Capture Volume',index=1
|
||||
|
||||
-----------------------------------
|
||||
This control is used to attenuate samples from left and right I2S ADC
|
||||
inputs (on the AudigyDrive). The result samples are forwarded to the ADC
|
||||
capture FIFO (thus to the standard capture PCM device).
|
||||
|
||||
name='Analog Mix Playback Volume',index=0
|
||||
|
||||
-----------------------------------------
|
||||
This control is used to attenuate samples from left and right I2S ADC
|
||||
inputs from Philips ADC. The result samples are forwarded to the front
|
||||
DAC PCM slots of the Philips DAC. This contains mix from analog sources
|
||||
like CD, Line In, Aux, ....
|
||||
|
||||
name='Analog Mix Capture Volume',index=1
|
||||
|
||||
----------------------------------------
|
||||
This control is used to attenuate samples from left and right I2S ADC
|
||||
inputs Philips ADC. The result samples are forwarded to the ADC
|
||||
capture FIFO (thus to the standard capture PCM device).
|
||||
|
||||
name='Aux2 Playback Volume',index=0
|
||||
|
||||
-----------------------------------
|
||||
This control is used to attenuate samples from left and right I2S ADC
|
||||
inputs (on the AudigyDrive). The result samples are forwarded to the front
|
||||
DAC PCM slots of the Philips DAC.
|
||||
|
||||
name='Aux2 Capture Volume',index=1
|
||||
|
||||
----------------------------------
|
||||
This control is used to attenuate samples from left and right I2S ADC
|
||||
inputs (on the AudigyDrive). The result samples are forwarded to the ADC
|
||||
capture FIFO (thus to the standard capture PCM device).
|
||||
|
||||
name='Front Playback Volume',index=0
|
||||
|
||||
------------------------------------
|
||||
All stereo signals are mixed together and mirrored to surround, center and LFE.
|
||||
This control is used to attenuate samples for left and right front speakers of
|
||||
this mix.
|
||||
|
||||
name='Surround Playback Volume',index=0
|
||||
|
||||
---------------------------------------
|
||||
All stereo signals are mixed together and mirrored to surround, center and LFE.
|
||||
This control is used to attenuate samples for left and right surround speakers of
|
||||
this mix.
|
||||
|
||||
name='Center Playback Volume',index=0
|
||||
|
||||
-------------------------------------
|
||||
All stereo signals are mixed together and mirrored to surround, center and LFE.
|
||||
This control is used to attenuate sample for center speaker of this mix.
|
||||
|
||||
name='LFE Playback Volume',index=0
|
||||
|
||||
----------------------------------
|
||||
All stereo signals are mixed together and mirrored to surround, center and LFE.
|
||||
This control is used to attenuate sample for LFE speaker of this mix.
|
||||
|
||||
name='Tone Control - Switch',index=0
|
||||
|
||||
------------------------------------
|
||||
This control turns the tone control on or off. The samples for front, rear
|
||||
and center / LFE outputs are affected.
|
||||
|
||||
name='Tone Control - Bass',index=0
|
||||
|
||||
----------------------------------
|
||||
This control sets the bass intensity. There is no neutral value!!
|
||||
When the tone control code is activated, the samples are always modified.
|
||||
The closest value to pure signal is 20.
|
||||
|
||||
name='Tone Control - Treble',index=0
|
||||
|
||||
------------------------------------
|
||||
This control sets the treble intensity. There is no neutral value!!
|
||||
When the tone control code is activated, the samples are always modified.
|
||||
The closest value to pure signal is 20.
|
||||
|
||||
name='Master Playback Volume',index=0
|
||||
|
||||
-------------------------------------
|
||||
This control is used to attenuate samples for front, surround, center and
|
||||
LFE outputs.
|
||||
|
||||
name='IEC958 Optical Raw Playback Switch',index=0
|
||||
|
||||
-------------------------------------------------
|
||||
If this switch is on, then the samples for the IEC958 (S/PDIF) digital
|
||||
output are taken only from the raw FX8010 PCM, otherwise standard front
|
||||
PCM samples are taken.
|
||||
|
||||
|
||||
2) PCM stream related controls
|
||||
------------------------------
|
||||
PCM stream related controls
|
||||
===========================
|
||||
|
||||
name='EMU10K1 PCM Volume',index 0-31
|
||||
|
||||
------------------------------------
|
||||
Channel volume attenuation in range 0-0xffff. The maximum value (no
|
||||
attenuation) is default. The channel mapping for three values is
|
||||
as follows:
|
||||
|
||||
0 - mono, default 0xffff (no attenuation)
|
||||
1 - left, default 0xffff (no attenuation)
|
||||
2 - right, default 0xffff (no attenuation)
|
||||
* 0 - mono, default 0xffff (no attenuation)
|
||||
* 1 - left, default 0xffff (no attenuation)
|
||||
* 2 - right, default 0xffff (no attenuation)
|
||||
|
||||
name='EMU10K1 PCM Send Routing',index 0-31
|
||||
|
||||
------------------------------------------
|
||||
This control specifies the destination - FX-bus accumulators. There 24
|
||||
values with this mapping:
|
||||
|
||||
0 - mono, A destination (FX-bus 0-63), default 0
|
||||
1 - mono, B destination (FX-bus 0-63), default 1
|
||||
2 - mono, C destination (FX-bus 0-63), default 2
|
||||
3 - mono, D destination (FX-bus 0-63), default 3
|
||||
4 - mono, E destination (FX-bus 0-63), default 0
|
||||
5 - mono, F destination (FX-bus 0-63), default 0
|
||||
6 - mono, G destination (FX-bus 0-63), default 0
|
||||
7 - mono, H destination (FX-bus 0-63), default 0
|
||||
8 - left, A destination (FX-bus 0-63), default 0
|
||||
9 - left, B destination (FX-bus 0-63), default 1
|
||||
10 - left, C destination (FX-bus 0-63), default 2
|
||||
11 - left, D destination (FX-bus 0-63), default 3
|
||||
12 - left, E destination (FX-bus 0-63), default 0
|
||||
13 - left, F destination (FX-bus 0-63), default 0
|
||||
14 - left, G destination (FX-bus 0-63), default 0
|
||||
15 - left, H destination (FX-bus 0-63), default 0
|
||||
16 - right, A destination (FX-bus 0-63), default 0
|
||||
17 - right, B destination (FX-bus 0-63), default 1
|
||||
18 - right, C destination (FX-bus 0-63), default 2
|
||||
19 - right, D destination (FX-bus 0-63), default 3
|
||||
20 - right, E destination (FX-bus 0-63), default 0
|
||||
21 - right, F destination (FX-bus 0-63), default 0
|
||||
22 - right, G destination (FX-bus 0-63), default 0
|
||||
23 - right, H destination (FX-bus 0-63), default 0
|
||||
* 0 - mono, A destination (FX-bus 0-63), default 0
|
||||
* 1 - mono, B destination (FX-bus 0-63), default 1
|
||||
* 2 - mono, C destination (FX-bus 0-63), default 2
|
||||
* 3 - mono, D destination (FX-bus 0-63), default 3
|
||||
* 4 - mono, E destination (FX-bus 0-63), default 0
|
||||
* 5 - mono, F destination (FX-bus 0-63), default 0
|
||||
* 6 - mono, G destination (FX-bus 0-63), default 0
|
||||
* 7 - mono, H destination (FX-bus 0-63), default 0
|
||||
* 8 - left, A destination (FX-bus 0-63), default 0
|
||||
* 9 - left, B destination (FX-bus 0-63), default 1
|
||||
* 10 - left, C destination (FX-bus 0-63), default 2
|
||||
* 11 - left, D destination (FX-bus 0-63), default 3
|
||||
* 12 - left, E destination (FX-bus 0-63), default 0
|
||||
* 13 - left, F destination (FX-bus 0-63), default 0
|
||||
* 14 - left, G destination (FX-bus 0-63), default 0
|
||||
* 15 - left, H destination (FX-bus 0-63), default 0
|
||||
* 16 - right, A destination (FX-bus 0-63), default 0
|
||||
* 17 - right, B destination (FX-bus 0-63), default 1
|
||||
* 18 - right, C destination (FX-bus 0-63), default 2
|
||||
* 19 - right, D destination (FX-bus 0-63), default 3
|
||||
* 20 - right, E destination (FX-bus 0-63), default 0
|
||||
* 21 - right, F destination (FX-bus 0-63), default 0
|
||||
* 22 - right, G destination (FX-bus 0-63), default 0
|
||||
* 23 - right, H destination (FX-bus 0-63), default 0
|
||||
|
||||
Don't forget that it's illegal to assign a channel to the same FX-bus accumulator
|
||||
more than once (it means 0=0 && 1=0 is an invalid combination).
|
||||
|
||||
name='EMU10K1 PCM Send Volume',index 0-31
|
||||
|
||||
-----------------------------------------
|
||||
It specifies the attenuation (amount) for given destination in range 0-255.
|
||||
The channel mapping is following:
|
||||
|
||||
0 - mono, A destination attn, default 255 (no attenuation)
|
||||
1 - mono, B destination attn, default 255 (no attenuation)
|
||||
2 - mono, C destination attn, default 0 (mute)
|
||||
3 - mono, D destination attn, default 0 (mute)
|
||||
4 - mono, E destination attn, default 0 (mute)
|
||||
5 - mono, F destination attn, default 0 (mute)
|
||||
6 - mono, G destination attn, default 0 (mute)
|
||||
7 - mono, H destination attn, default 0 (mute)
|
||||
8 - left, A destination attn, default 255 (no attenuation)
|
||||
9 - left, B destination attn, default 0 (mute)
|
||||
10 - left, C destination attn, default 0 (mute)
|
||||
11 - left, D destination attn, default 0 (mute)
|
||||
12 - left, E destination attn, default 0 (mute)
|
||||
13 - left, F destination attn, default 0 (mute)
|
||||
14 - left, G destination attn, default 0 (mute)
|
||||
15 - left, H destination attn, default 0 (mute)
|
||||
16 - right, A destination attn, default 0 (mute)
|
||||
17 - right, B destination attn, default 255 (no attenuation)
|
||||
18 - right, C destination attn, default 0 (mute)
|
||||
19 - right, D destination attn, default 0 (mute)
|
||||
20 - right, E destination attn, default 0 (mute)
|
||||
21 - right, F destination attn, default 0 (mute)
|
||||
22 - right, G destination attn, default 0 (mute)
|
||||
23 - right, H destination attn, default 0 (mute)
|
||||
* 0 - mono, A destination attn, default 255 (no attenuation)
|
||||
* 1 - mono, B destination attn, default 255 (no attenuation)
|
||||
* 2 - mono, C destination attn, default 0 (mute)
|
||||
* 3 - mono, D destination attn, default 0 (mute)
|
||||
* 4 - mono, E destination attn, default 0 (mute)
|
||||
* 5 - mono, F destination attn, default 0 (mute)
|
||||
* 6 - mono, G destination attn, default 0 (mute)
|
||||
* 7 - mono, H destination attn, default 0 (mute)
|
||||
* 8 - left, A destination attn, default 255 (no attenuation)
|
||||
* 9 - left, B destination attn, default 0 (mute)
|
||||
* 10 - left, C destination attn, default 0 (mute)
|
||||
* 11 - left, D destination attn, default 0 (mute)
|
||||
* 12 - left, E destination attn, default 0 (mute)
|
||||
* 13 - left, F destination attn, default 0 (mute)
|
||||
* 14 - left, G destination attn, default 0 (mute)
|
||||
* 15 - left, H destination attn, default 0 (mute)
|
||||
* 16 - right, A destination attn, default 0 (mute)
|
||||
* 17 - right, B destination attn, default 255 (no attenuation)
|
||||
* 18 - right, C destination attn, default 0 (mute)
|
||||
* 19 - right, D destination attn, default 0 (mute)
|
||||
* 20 - right, E destination attn, default 0 (mute)
|
||||
* 21 - right, F destination attn, default 0 (mute)
|
||||
* 22 - right, G destination attn, default 0 (mute)
|
||||
* 23 - right, H destination attn, default 0 (mute)
|
||||
|
||||
|
||||
|
||||
4) MANUALS/PATENTS:
|
||||
-------------------
|
||||
MANUALS/PATENTS
|
||||
===============
|
||||
|
||||
ftp://opensource.creative.com/pub/doc
|
||||
-------------------------------------
|
||||
|
||||
Files:
|
||||
LM4545.pdf AC97 Codec
|
||||
LM4545.pdf
|
||||
AC97 Codec
|
||||
|
||||
m2049.pdf The EMU10K1 Digital Audio Processor
|
||||
m2049.pdf
|
||||
The EMU10K1 Digital Audio Processor
|
||||
|
||||
hog63.ps FX8010 - A DSP Chip Architecture for Audio Effects
|
||||
hog63.ps
|
||||
FX8010 - A DSP Chip Architecture for Audio Effects
|
||||
|
||||
|
||||
WIPO Patents
|
||||
------------
|
||||
Patent numbers:
|
||||
WO 9901813 (A1) Audio Effects Processor with multiple asynchronous (Jan. 14, 1999)
|
||||
streams
|
||||
|
||||
WO 9901814 (A1) Processor with Instruction Set for Audio Effects (Jan. 14, 1999)
|
||||
WO 9901813 (A1)
|
||||
Audio Effects Processor with multiple asynchronous streams
|
||||
(Jan. 14, 1999)
|
||||
|
||||
WO 9901953 (A1) Audio Effects Processor having Decoupled Instruction
|
||||
Execution and Audio Data Sequencing (Jan. 14, 1999)
|
||||
WO 9901814 (A1)
|
||||
Processor with Instruction Set for Audio Effects (Jan. 14, 1999)
|
||||
|
||||
WO 9901953 (A1)
|
||||
Audio Effects Processor having Decoupled Instruction
|
||||
Execution and Audio Data Sequencing (Jan. 14, 1999)
|
||||
|
||||
|
||||
US Patents (http://www.uspto.gov/)
|
||||
----------------------------------
|
||||
|
||||
US 5925841 Digital Sampling Instrument employing cache memory (Jul. 20, 1999)
|
||||
US 5925841
|
||||
Digital Sampling Instrument employing cache memory (Jul. 20, 1999)
|
||||
|
||||
US 5928342 Audio Effects Processor integrated on a single chip (Jul. 27, 1999)
|
||||
with a multiport memory onto which multiple asynchronous
|
||||
digital sound samples can be concurrently loaded
|
||||
US 5928342
|
||||
Audio Effects Processor integrated on a single chip
|
||||
with a multiport memory onto which multiple asynchronous
|
||||
digital sound samples can be concurrently loaded
|
||||
(Jul. 27, 1999)
|
||||
|
||||
US 5930158 Processor with Instruction Set for Audio Effects (Jul. 27, 1999)
|
||||
US 5930158
|
||||
Processor with Instruction Set for Audio Effects (Jul. 27, 1999)
|
||||
|
||||
US 6032235 Memory initialization circuit (Tram) (Feb. 29, 2000)
|
||||
US 6032235
|
||||
Memory initialization circuit (Tram) (Feb. 29, 2000)
|
||||
|
||||
US 6138207 Interpolation looping of audio samples in cache connected to (Oct. 24, 2000)
|
||||
system bus with prioritization and modification of bus transfers
|
||||
in accordance with loop ends and minimum block sizes
|
||||
US 6138207
|
||||
Interpolation looping of audio samples in cache connected to
|
||||
system bus with prioritization and modification of bus transfers
|
||||
in accordance with loop ends and minimum block sizes
|
||||
(Oct. 24, 2000)
|
||||
|
||||
US 6151670 Method for conserving memory storage using a (Nov. 21, 2000)
|
||||
pool of short term memory registers
|
||||
US 6151670
|
||||
Method for conserving memory storage using a
|
||||
pool of short term memory registers
|
||||
(Nov. 21, 2000)
|
||||
|
||||
US 6195715 Interrupt control for multiple programs communicating with (Feb. 27, 2001)
|
||||
a common interrupt by associating programs to GP registers,
|
||||
defining interrupt register, polling GP registers, and invoking
|
||||
callback routine associated with defined interrupt register
|
||||
US 6195715
|
||||
Interrupt control for multiple programs communicating with
|
||||
a common interrupt by associating programs to GP registers,
|
||||
defining interrupt register, polling GP registers, and invoking
|
||||
callback routine associated with defined interrupt register
|
||||
(Feb. 27, 2001)
|
|
@ -1,32 +1,41 @@
|
|||
Guide to using M-Audio Audiophile USB with ALSA and Jack v1.5
|
||||
========================================================
|
||||
========================================================
|
||||
Guide to using M-Audio Audiophile USB with ALSA and Jack
|
||||
========================================================
|
||||
|
||||
Thibault Le Meur <Thibault.LeMeur@supelec.fr>
|
||||
v1.5
|
||||
|
||||
Thibault Le Meur <Thibault.LeMeur@supelec.fr>
|
||||
|
||||
This document is a guide to using the M-Audio Audiophile USB (tm) device with
|
||||
ALSA and JACK.
|
||||
|
||||
History
|
||||
=======
|
||||
|
||||
* v1.4 - Thibault Le Meur (2007-07-11)
|
||||
- Added Low Endianness nature of 16bits-modes
|
||||
found by Hakan Lennestal <Hakan.Lennestal@brfsodrahamn.se>
|
||||
- Modifying document structure
|
||||
|
||||
- Added Low Endianness nature of 16bits-modes
|
||||
found by Hakan Lennestal <Hakan.Lennestal@brfsodrahamn.se>
|
||||
- Modifying document structure
|
||||
|
||||
* v1.5 - Thibault Le Meur (2007-07-12)
|
||||
- Added AC3/DTS passthru info
|
||||
- Added AC3/DTS passthru info
|
||||
|
||||
|
||||
1 - Audiophile USB Specs and correct usage
|
||||
==========================================
|
||||
Audiophile USB Specs and correct usage
|
||||
======================================
|
||||
|
||||
This part is a reminder of important facts about the functions and limitations
|
||||
of the device.
|
||||
|
||||
The device has 4 audio interfaces, and 2 MIDI ports:
|
||||
|
||||
* Analog Stereo Input (Ai)
|
||||
|
||||
- This port supports 2 pairs of line-level audio inputs (1/4" TS and RCA)
|
||||
- When the 1/4" TS (jack) connectors are connected, the RCA connectors
|
||||
are disabled
|
||||
|
||||
* Analog Stereo Output (Ao)
|
||||
* Digital Stereo Input (Di)
|
||||
* Digital Stereo Output (Do)
|
||||
|
@ -34,56 +43,69 @@ The device has 4 audio interfaces, and 2 MIDI ports:
|
|||
* Midi Out (Mo)
|
||||
|
||||
The internal DAC/ADC has the following characteristics:
|
||||
|
||||
* sample depth of 16 or 24 bits
|
||||
* sample rate from 8kHz to 96kHz
|
||||
* Two interfaces can't use different sample depths at the same time.
|
||||
|
||||
Moreover, the Audiophile USB documentation gives the following Warning:
|
||||
"Please exit any audio application running before switching between bit depths"
|
||||
Please exit any audio application running before switching between bit depths
|
||||
|
||||
Due to the USB 1.1 bandwidth limitation, a limited number of interfaces can be
|
||||
activated at the same time depending on the audio mode selected:
|
||||
|
||||
* 16-bit/48kHz ==> 4 channels in + 4 channels out
|
||||
|
||||
- Ai+Ao+Di+Do
|
||||
|
||||
* 24-bit/48kHz ==> 4 channels in + 2 channels out,
|
||||
or 2 channels in + 4 channels out
|
||||
or 2 channels in + 4 channels out
|
||||
|
||||
- Ai+Ao+Do or Ai+Di+Ao or Ai+Di+Do or Di+Ao+Do
|
||||
|
||||
* 24-bit/96kHz ==> 2 channels in _or_ 2 channels out (half duplex only)
|
||||
|
||||
- Ai or Ao or Di or Do
|
||||
|
||||
Important facts about the Digital interface:
|
||||
--------------------------------------------
|
||||
|
||||
* The Do port additionally supports surround-encoded AC-3 and DTS passthrough,
|
||||
though I haven't tested it under Linux
|
||||
though I haven't tested it under Linux
|
||||
|
||||
- Note that in this setup only the Do interface can be enabled
|
||||
|
||||
* Apart from recording an audio digital stream, enabling the Di port is a way
|
||||
to synchronize the device to an external sample clock
|
||||
to synchronize the device to an external sample clock
|
||||
|
||||
- As a consequence, the Di port must be enable only if an active Digital
|
||||
source is connected
|
||||
source is connected
|
||||
- Enabling Di when no digital source is connected can result in a
|
||||
synchronization error (for instance sound played at an odd sample rate)
|
||||
synchronization error (for instance sound played at an odd sample rate)
|
||||
|
||||
|
||||
2 - Audiophile USB MIDI support in ALSA
|
||||
=======================================
|
||||
Audiophile USB MIDI support in ALSA
|
||||
===================================
|
||||
|
||||
The Audiophile USB MIDI ports will be automatically supported once the
|
||||
following modules have been loaded:
|
||||
|
||||
* snd-usb-audio
|
||||
* snd-seq-midi
|
||||
|
||||
No additional setting is required.
|
||||
|
||||
|
||||
3 - Audiophile USB Audio support in ALSA
|
||||
========================================
|
||||
Audiophile USB Audio support in ALSA
|
||||
====================================
|
||||
|
||||
Audio functions of the Audiophile USB device are handled by the snd-usb-audio
|
||||
module. This module can work in a default mode (without any device-specific
|
||||
parameter), or in an "advanced" mode with the device-specific parameter called
|
||||
"device_setup".
|
||||
``device_setup``.
|
||||
|
||||
3.1 - Default Alsa driver mode
|
||||
------------------------------
|
||||
Default Alsa driver mode
|
||||
------------------------
|
||||
|
||||
The default behavior of the snd-usb-audio driver is to list the device
|
||||
capabilities at startup and activate the required mode when required
|
||||
|
@ -101,6 +123,7 @@ Default Alsa driver mode can lead to device misconfigurations.
|
|||
Let's get back to the Default Alsa driver mode for now. In this case the
|
||||
Audiophile interfaces are mapped to alsa pcm devices in the following
|
||||
way (I suppose the device's index is 1):
|
||||
|
||||
* hw:1,0 is Ao in playback and Di in capture
|
||||
* hw:1,1 is Do in playback and Ai in capture
|
||||
* hw:1,2 is Do in AC3/DTS passthrough mode
|
||||
|
@ -115,20 +138,28 @@ This has been fixed in kernel 2.6.23 and above and now the hw:1,2 interface
|
|||
is reported to be big endian in this default driver mode.
|
||||
|
||||
Examples:
|
||||
* playing a S24_3BE encoded raw file to the Ao port
|
||||
|
||||
* playing a S24_3BE encoded raw file to the Ao port::
|
||||
|
||||
% aplay -D hw:1,0 -c2 -t raw -r48000 -fS24_3BE test.raw
|
||||
* recording a S24_3BE encoded raw file from the Ai port
|
||||
|
||||
* recording a S24_3BE encoded raw file from the Ai port::
|
||||
|
||||
% arecord -D hw:1,1 -c2 -t raw -r48000 -fS24_3BE test.raw
|
||||
* playing a S16_BE encoded raw file to the Do port
|
||||
|
||||
* playing a S16_BE encoded raw file to the Do port::
|
||||
|
||||
% aplay -D hw:1,1 -c2 -t raw -r48000 -fS16_BE test.raw
|
||||
* playing an ac3 sample file to the Do port
|
||||
|
||||
* playing an ac3 sample file to the Do port::
|
||||
|
||||
% aplay -D hw:1,2 --channels=6 ac3_S16_BE_encoded_file.raw
|
||||
|
||||
If you're happy with the default Alsa driver mode and don't experience any
|
||||
issue with this mode, then you can skip the following chapter.
|
||||
|
||||
3.2 - Advanced module setup
|
||||
---------------------------
|
||||
Advanced module setup
|
||||
---------------------
|
||||
|
||||
Due to the hardware constraints described above, the device initialization made
|
||||
by the Alsa driver in default mode may result in a corrupted state of the
|
||||
|
@ -137,34 +168,39 @@ from the Ai interface sounds distorted (as if boosted with an excessive high
|
|||
volume gain).
|
||||
|
||||
For people having this problem, the snd-usb-audio module has a new module
|
||||
parameter called "device_setup" (this parameter was introduced in kernel
|
||||
parameter called ``device_setup`` (this parameter was introduced in kernel
|
||||
release 2.6.17)
|
||||
|
||||
3.2.1 - Initializing the working mode of the Audiophile USB
|
||||
Initializing the working mode of the Audiophile USB
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
As far as the Audiophile USB device is concerned, this value let the user
|
||||
specify:
|
||||
|
||||
* the sample depth
|
||||
* the sample rate
|
||||
* whether the Di port is used or not
|
||||
|
||||
When initialized with "device_setup=0x00", the snd-usb-audio module has
|
||||
When initialized with ``device_setup=0x00``, the snd-usb-audio module has
|
||||
the same behaviour as when the parameter is omitted (see paragraph "Default
|
||||
Alsa driver mode" above)
|
||||
|
||||
Others modes are described in the following subsections.
|
||||
|
||||
3.2.1.1 - 16-bit modes
|
||||
16-bit modes
|
||||
~~~~~~~~~~~~
|
||||
|
||||
The two supported modes are:
|
||||
|
||||
* device_setup=0x01
|
||||
* ``device_setup=0x01``
|
||||
|
||||
- 16bits 48kHz mode with Di disabled
|
||||
- Ai,Ao,Do can be used at the same time
|
||||
- hw:1,0 is not available in capture mode
|
||||
- hw:1,2 is not available
|
||||
|
||||
* device_setup=0x11
|
||||
* ``device_setup=0x11``
|
||||
|
||||
- 16bits 48kHz mode with Di enabled
|
||||
- Ai,Ao,Di,Do can be used at the same time
|
||||
- hw:1,0 is available in capture mode
|
||||
|
@ -173,33 +209,43 @@ The two supported modes are:
|
|||
In this modes the device operates only at 16bits-modes. Before kernel 2.6.23,
|
||||
the devices where reported to be Big-Endian when in fact they were Little-Endian
|
||||
so that playing a file was a matter of using:
|
||||
::
|
||||
|
||||
% aplay -D hw:1,1 -c2 -t raw -r48000 -fS16_BE test_S16_LE.raw
|
||||
|
||||
where "test_S16_LE.raw" was in fact a little-endian sample file.
|
||||
|
||||
Thanks to Hakan Lennestal (who discovered the Little-Endiannes of the device in
|
||||
these modes) a fix has been committed (expected in kernel 2.6.23) and
|
||||
Alsa now reports Little-Endian interfaces. Thus playing a file now is as simple as
|
||||
using:
|
||||
::
|
||||
|
||||
% aplay -D hw:1,1 -c2 -t raw -r48000 -fS16_LE test_S16_LE.raw
|
||||
|
||||
3.2.1.2 - 24-bit modes
|
||||
|
||||
24-bit modes
|
||||
~~~~~~~~~~~~
|
||||
|
||||
The three supported modes are:
|
||||
|
||||
* device_setup=0x09
|
||||
* ``device_setup=0x09``
|
||||
|
||||
- 24bits 48kHz mode with Di disabled
|
||||
- Ai,Ao,Do can be used at the same time
|
||||
- hw:1,0 is not available in capture mode
|
||||
- hw:1,2 is not available
|
||||
|
||||
* device_setup=0x19
|
||||
* ``device_setup=0x19``
|
||||
|
||||
- 24bits 48kHz mode with Di enabled
|
||||
- 3 ports from {Ai,Ao,Di,Do} can be used at the same time
|
||||
- hw:1,0 is available in capture mode and an active digital source must be
|
||||
connected to Di
|
||||
- hw:1,2 is not available
|
||||
|
||||
* device_setup=0x0D or 0x10
|
||||
* ``device_setup=0x0D`` or ``0x10``
|
||||
|
||||
- 24bits 96kHz mode
|
||||
- Di is enabled by default for this mode but does not need to be connected
|
||||
to an active source
|
||||
|
@ -210,29 +256,35 @@ The three supported modes are:
|
|||
In these modes the device is only Big-Endian compliant (see "Default Alsa driver
|
||||
mode" above for an aplay command example)
|
||||
|
||||
3.2.1.3 - AC3 w/ DTS passthru mode
|
||||
AC3 w/ DTS passthru mode
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
Thanks to Hakan Lennestal, I now have a report saying that this mode works.
|
||||
|
||||
* device_setup=0x03
|
||||
* ``device_setup=0x03``
|
||||
|
||||
- 16bits 48kHz mode with only the Do port enabled
|
||||
- AC3 with DTS passthru
|
||||
- Caution with this setup the Do port is mapped to the pcm device hw:1,0
|
||||
|
||||
The command line used to playback the AC3/DTS encoded .wav-files in this mode:
|
||||
::
|
||||
|
||||
% aplay -D hw:1,0 --channels=6 ac3_S16_LE_encoded_file.raw
|
||||
|
||||
3.2.2 - How to use the device_setup parameter
|
||||
----------------------------------------------
|
||||
How to use the ``device_setup`` parameter
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
The parameter can be given:
|
||||
|
||||
* By manually probing the device (as root):
|
||||
* By manually probing the device (as root):::
|
||||
|
||||
# modprobe -r snd-usb-audio
|
||||
# modprobe snd-usb-audio index=1 device_setup=0x09
|
||||
|
||||
* Or while configuring the modules options in your modules configuration file
|
||||
(typically a .conf file in /etc/modprobe.d/ directory:
|
||||
(typically a .conf file in /etc/modprobe.d/ directory:::
|
||||
|
||||
alias snd-card-1 snd-usb-audio
|
||||
options snd-usb-audio index=1 device_setup=0x09
|
||||
|
||||
|
@ -250,26 +302,31 @@ CAUTION when initializing the device
|
|||
* If you've correctly initialized the device in a valid mode and then want to switch
|
||||
to another mode (possibly with another sample-depth), please use also the following
|
||||
procedure:
|
||||
|
||||
- first turn off the device
|
||||
- de-register the snd-usb-audio module (modprobe -r)
|
||||
- change the device_setup parameter by changing the device_setup
|
||||
option in /etc/modprobe.d/*.conf
|
||||
option in ``/etc/modprobe.d/*.conf``
|
||||
- turn on the device
|
||||
|
||||
* A workaround for this last issue has been applied to kernel 2.6.23, but it may not
|
||||
be enough to ensure the 'stability' of the device initialization.
|
||||
|
||||
3.2.3 - Technical details for hackers
|
||||
-------------------------------------
|
||||
Technical details for hackers
|
||||
-----------------------------
|
||||
|
||||
This section is for hackers, wanting to understand details about the device
|
||||
internals and how Alsa supports it.
|
||||
|
||||
3.2.3.1 - Audiophile USB's device_setup structure
|
||||
Audiophile USB's ``device_setup`` structure
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
If you want to understand the device_setup magic numbers for the Audiophile
|
||||
USB, you need some very basic understanding of binary computation. However,
|
||||
this is not required to use the parameter and you may skip this section.
|
||||
|
||||
The device_setup is one byte long and its structure is the following:
|
||||
::
|
||||
|
||||
+---+---+---+---+---+---+---+---+
|
||||
| b7| b6| b5| b4| b3| b2| b1| b0|
|
||||
|
@ -278,38 +335,55 @@ The device_setup is one byte long and its structure is the following:
|
|||
+---+---+---+---+---+---+---+---+
|
||||
|
||||
Where:
|
||||
* b0 is the "SET" bit
|
||||
|
||||
* b0 is the ``SET`` bit
|
||||
|
||||
- it MUST be set if device_setup is initialized
|
||||
* b1 is the "DTS" bit
|
||||
|
||||
* b1 is the ``DTS`` bit
|
||||
|
||||
- it is set only for Digital output with DTS/AC3
|
||||
- this setup is not tested
|
||||
|
||||
* b2 is the Rate selection flag
|
||||
- When set to "1" the rate range is 48.1-96kHz
|
||||
|
||||
- When set to ``1`` the rate range is 48.1-96kHz
|
||||
- Otherwise the sample rate range is 8-48kHz
|
||||
|
||||
* b3 is the bit depth selection flag
|
||||
- When set to "1" samples are 24bits long
|
||||
|
||||
- When set to ``1`` samples are 24bits long
|
||||
- Otherwise they are 16bits long
|
||||
- Note that b2 implies b3 as the 96kHz mode is only supported for 24 bits
|
||||
samples
|
||||
|
||||
* b4 is the Digital input flag
|
||||
- When set to "1" the device assumes that an active digital source is
|
||||
|
||||
- When set to ``1`` the device assumes that an active digital source is
|
||||
connected
|
||||
- You shouldn't enable Di if no source is seen on the port (this leads to
|
||||
synchronization issues)
|
||||
- b4 is implied by b2 (since only one port is enabled at a time no synch
|
||||
error can occur)
|
||||
* b5 to b7 are reserved for future uses, and must be set to "0"
|
||||
|
||||
* b5 to b7 are reserved for future uses, and must be set to ``0``
|
||||
|
||||
- might become Ao, Do, Ai, for b7, b6, b4 respectively
|
||||
|
||||
Caution:
|
||||
|
||||
* there is no check on the value you will give to device_setup
|
||||
|
||||
- for instance choosing 0x05 (16bits 96kHz) will fail back to 0x09 since
|
||||
b2 implies b3. But _there_will_be_no_warning_ in /var/log/messages
|
||||
|
||||
* Hardware constraints due to the USB bus limitation aren't checked
|
||||
|
||||
- choosing b2 will prepare all interfaces for 24bits/96kHz but you'll
|
||||
only be able to use one at the same time
|
||||
|
||||
3.2.3.2 - USB implementation details for this device
|
||||
USB implementation details for this device
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
You may safely skip this section if you're not interested in driver
|
||||
hacking.
|
||||
|
@ -319,46 +393,72 @@ data I got by usb-snooping the windows and Linux drivers.
|
|||
|
||||
The M-Audio Audiophile USB has 7 USB Interfaces:
|
||||
a "USB interface":
|
||||
|
||||
* USB Interface nb.0
|
||||
* USB Interface nb.1
|
||||
|
||||
- Audio Control function
|
||||
|
||||
* USB Interface nb.2
|
||||
|
||||
- Analog Output
|
||||
|
||||
* USB Interface nb.3
|
||||
|
||||
- Digital Output
|
||||
|
||||
* USB Interface nb.4
|
||||
|
||||
- Analog Input
|
||||
|
||||
* USB Interface nb.5
|
||||
|
||||
- Digital Input
|
||||
|
||||
* USB Interface nb.6
|
||||
|
||||
- MIDI interface compliant with the MIDIMAN quirk
|
||||
|
||||
Each interface has 5 altsettings (AltSet 1,2,3,4,5) except:
|
||||
|
||||
* Interface 3 (Digital Out) has an extra Alset nb.6
|
||||
* Interface 5 (Digital In) does not have Alset nb.3 and 5
|
||||
|
||||
Here is a short description of the AltSettings capabilities:
|
||||
* AltSettings 1 corresponds to
|
||||
|
||||
* AltSettings 1 corresponds to
|
||||
|
||||
- 24-bit depth, 48.1-96kHz sample mode
|
||||
- Adaptive playback (Ao and Do), Synch capture (Ai), or Asynch capture (Di)
|
||||
* AltSettings 2 corresponds to
|
||||
|
||||
* AltSettings 2 corresponds to
|
||||
|
||||
- 24-bit depth, 8-48kHz sample mode
|
||||
- Asynch capture and playback (Ao,Ai,Do,Di)
|
||||
* AltSettings 3 corresponds to
|
||||
|
||||
* AltSettings 3 corresponds to
|
||||
|
||||
- 24-bit depth, 8-48kHz sample mode
|
||||
- Synch capture (Ai) and Adaptive playback (Ao,Do)
|
||||
* AltSettings 4 corresponds to
|
||||
|
||||
* AltSettings 4 corresponds to
|
||||
|
||||
- 16-bit depth, 8-48kHz sample mode
|
||||
- Asynch capture and playback (Ao,Ai,Do,Di)
|
||||
* AltSettings 5 corresponds to
|
||||
|
||||
* AltSettings 5 corresponds to
|
||||
|
||||
- 16-bit depth, 8-48kHz sample mode
|
||||
- Synch capture (Ai) and Adaptive playback (Ao,Do)
|
||||
* AltSettings 6 corresponds to
|
||||
|
||||
* AltSettings 6 corresponds to
|
||||
|
||||
- 16-bit depth, 8-48kHz sample mode
|
||||
- Synch playback (Do), audio format type III IEC1937_AC-3
|
||||
|
||||
In order to ensure a correct initialization of the device, the driver
|
||||
_must_know_ how the device will be used:
|
||||
*must* *know* how the device will be used:
|
||||
|
||||
* if DTS is chosen, only Interface 2 with AltSet nb.6 must be
|
||||
registered
|
||||
* if 96KHz only AltSets nb.1 of each interface must be selected
|
||||
|
@ -371,20 +471,21 @@ _must_know_ how the device will be used:
|
|||
|
||||
When device_setup is given as a parameter to the snd-usb-audio module, the
|
||||
parse_audio_endpoints function uses a quirk called
|
||||
"audiophile_skip_setting_quirk" in order to prevent AltSettings not
|
||||
``audiophile_skip_setting_quirk`` in order to prevent AltSettings not
|
||||
corresponding to device_setup from being registered in the driver.
|
||||
|
||||
4 - Audiophile USB and Jack support
|
||||
===================================
|
||||
Audiophile USB and Jack support
|
||||
===============================
|
||||
|
||||
This section deals with support of the Audiophile USB device in Jack.
|
||||
|
||||
There are 2 main potential issues when using Jackd with the device:
|
||||
|
||||
* support for Big-Endian devices in 24-bit modes
|
||||
* support for 4-in / 4-out channels
|
||||
|
||||
4.1 - Direct support in Jackd
|
||||
-----------------------------
|
||||
Direct support in Jackd
|
||||
-----------------------
|
||||
|
||||
Jack supports big endian devices only in recent versions (thanks to
|
||||
Andreas Steinmetz for his first big-endian patch). I can't remember
|
||||
|
@ -396,29 +497,35 @@ are now Little Endians ;-) ).
|
|||
|
||||
You can run jackd with the following command for playback with Ao and
|
||||
record with Ai:
|
||||
::
|
||||
|
||||
% jackd -R -dalsa -Phw:1,0 -r48000 -p128 -n2 -D -Chw:1,1
|
||||
|
||||
4.2 - Using Alsa plughw
|
||||
-----------------------
|
||||
Using Alsa plughw
|
||||
-----------------
|
||||
|
||||
If you don't have a recent Jackd installed, you can downgrade to using
|
||||
the Alsa "plug" converter.
|
||||
the Alsa ``plug`` converter.
|
||||
|
||||
For instance here is one way to run Jack with 2 playback channels on Ao and 2
|
||||
capture channels from Ai:
|
||||
::
|
||||
|
||||
% jackd -R -dalsa -dplughw:1 -r48000 -p256 -n2 -D -Cplughw:1,1
|
||||
|
||||
However you may see the following warning message:
|
||||
"You appear to be using the ALSA software "plug" layer, probably a result of
|
||||
using the "default" ALSA device. This is less efficient than it could be.
|
||||
Consider using a hardware device instead rather than using the plug layer."
|
||||
You appear to be using the ALSA software "plug" layer, probably a result of
|
||||
using the "default" ALSA device. This is less efficient than it could be.
|
||||
Consider using a hardware device instead rather than using the plug layer.
|
||||
|
||||
4.3 - Getting 2 input and/or output interfaces in Jack
|
||||
------------------------------------------------------
|
||||
Getting 2 input and/or output interfaces in Jack
|
||||
------------------------------------------------
|
||||
|
||||
As you can see, starting the Jack server this way will only enable 1 stereo
|
||||
input (Di or Ai) and 1 stereo output (Ao or Do).
|
||||
|
||||
This is due to the following restrictions:
|
||||
|
||||
* Jack can only open one capture device and one playback device at a time
|
||||
* The Audiophile USB is seen as 2 (or three) Alsa devices: hw:1,0, hw:1,1
|
||||
(and optionally hw:1,2)
|
||||
|
@ -432,6 +539,7 @@ It is related to another device (ice1712) but can be adapted to suit
|
|||
the Audiophile USB.
|
||||
|
||||
Enabling multiple Audiophile USB interfaces for Jackd will certainly require:
|
||||
|
||||
* Making sure your Jackd version has the MMAP_COMPLEX patch (see the ice1712 page)
|
||||
* (maybe) patching the alsa-lib/src/pcm/pcm_multi.c file (see the ice1712 page)
|
||||
* define a multi device (combination of hw:1,0 and hw:1,1) in your .asoundrc
|
|
@ -1,18 +1,23 @@
|
|||
=================
|
||||
ALSA BT87x Driver
|
||||
=================
|
||||
|
||||
Intro
|
||||
=====
|
||||
|
||||
You might have noticed that the bt878 grabber cards have actually
|
||||
_two_ PCI functions:
|
||||
*two* PCI functions:
|
||||
::
|
||||
|
||||
$ lspci
|
||||
[ ... ]
|
||||
00:0a.0 Multimedia video controller: Brooktree Corporation Bt878 (rev 02)
|
||||
00:0a.1 Multimedia controller: Brooktree Corporation Bt878 (rev 02)
|
||||
[ ... ]
|
||||
$ lspci
|
||||
[ ... ]
|
||||
00:0a.0 Multimedia video controller: Brooktree Corporation Bt878 (rev 02)
|
||||
00:0a.1 Multimedia controller: Brooktree Corporation Bt878 (rev 02)
|
||||
[ ... ]
|
||||
|
||||
The first does video, it is backward compatible to the bt848. The second
|
||||
does audio. snd-bt87x is a driver for the second function. It's a sound
|
||||
driver which can be used for recording sound (and _only_ recording, no
|
||||
driver which can be used for recording sound (and *only* recording, no
|
||||
playback). As most TV cards come with a short cable which can be plugged
|
||||
into your sound card's line-in you probably don't need this driver if all
|
||||
you want to do is just watching TV...
|
||||
|
@ -30,9 +35,9 @@ The driver is now stable. However, it doesn't know about many TV cards,
|
|||
and it refuses to load for cards it doesn't know.
|
||||
|
||||
If the driver complains ("Unknown TV card found, the audio driver will
|
||||
not load"), you can specify the load_all=1 option to force the driver to
|
||||
not load"), you can specify the ``load_all=1`` option to force the driver to
|
||||
try to use the audio capture function of your card. If the frequency of
|
||||
recorded data is not right, try to specify the digital_rate option with
|
||||
recorded data is not right, try to specify the ``digital_rate`` option with
|
||||
other values than the default 32000 (often it's 44100 or 64000).
|
||||
|
||||
If you have an unknown card, please mail the ID and board name to
|
|
@ -1,7 +1,8 @@
|
|||
Brief Notes on C-Media 8338/8738/8768/8770 Driver
|
||||
=================================================
|
||||
=================================================
|
||||
Brief Notes on C-Media 8338/8738/8768/8770 Driver
|
||||
=================================================
|
||||
|
||||
Takashi Iwai <tiwai@suse.de>
|
||||
Takashi Iwai <tiwai@suse.de>
|
||||
|
||||
|
||||
Front/Rear Multi-channel Playback
|
||||
|
@ -30,19 +31,20 @@ The rear output can be heard only when "Four Channel Mode" switch is
|
|||
disabled. Otherwise no signal will be routed to the rear speakers.
|
||||
As default it's turned on.
|
||||
|
||||
*** WARNING ***
|
||||
When "Four Channel Mode" switch is off, the output from rear speakers
|
||||
will be FULL VOLUME regardless of Master and PCM volumes.
|
||||
This might damage your audio equipment. Please disconnect speakers
|
||||
before your turn off this switch.
|
||||
*** WARNING ***
|
||||
.. WARNING::
|
||||
When "Four Channel Mode" switch is off, the output from rear speakers
|
||||
will be FULL VOLUME regardless of Master and PCM volumes [#]_.
|
||||
This might damage your audio equipment. Please disconnect speakers
|
||||
before your turn off this switch.
|
||||
|
||||
[ Well.. I once got the output with correct volume (i.e. same with the
|
||||
|
||||
.. [#]
|
||||
Well.. I once got the output with correct volume (i.e. same with the
|
||||
front one) and was so excited. It was even with "Four Channel" bit
|
||||
on and "double DAC" mode. Actually I could hear separate 4 channels
|
||||
from front and rear speakers! But.. after reboot, all was gone.
|
||||
It's a very pity that I didn't save the register dump at that
|
||||
time.. Maybe there is an unknown register to achieve this... ]
|
||||
time.. Maybe there is an unknown register to achieve this...
|
||||
|
||||
If your card has an extra output jack for the rear output, the rear
|
||||
playback should be routed there as default. If not, there is a
|
||||
|
@ -73,12 +75,14 @@ cannot operate with full-duplex.
|
|||
|
||||
The 4.0 and 5.1 modes are defined as the pcm "surround40" and "surround51"
|
||||
in alsa-lib. For example, you can play a WAV file with 6 channels like
|
||||
::
|
||||
|
||||
% aplay -Dsurround51 sixchannels.wav
|
||||
|
||||
For programming the 4/6 channel playback, you need to specify the PCM
|
||||
channels as you like and set the format S16LE. For example, for playback
|
||||
with 4 channels,
|
||||
::
|
||||
|
||||
snd_pcm_hw_params_set_access(pcm, hw, SND_PCM_ACCESS_RW_INTERLEAVED);
|
||||
// or mmap if you like
|
||||
|
@ -89,13 +93,15 @@ and use the interleaved 4 channel data.
|
|||
|
||||
There are some control switches affecting to the speaker connections:
|
||||
|
||||
"Line-In Mode" - an enum control to change the behavior of line-in
|
||||
Line-In Mode
|
||||
an enum control to change the behavior of line-in
|
||||
jack. Either "Line-In", "Rear Output" or "Bass Output" can
|
||||
be selected. The last item is available only with model 039
|
||||
or newer.
|
||||
When "Rear Output" is chosen, the surround channels 3 and 4
|
||||
are output to line-in jack.
|
||||
"Mic-In Mode" - an enum control to change the behavior of mic-in
|
||||
Mic-In Mode
|
||||
an enum control to change the behavior of mic-in
|
||||
jack. Either "Mic-In" or "Center/LFE Output" can be
|
||||
selected.
|
||||
When "Center/LFE Output" is chosen, the center and bass
|
||||
|
@ -111,11 +117,14 @@ The SPDIF playback and capture are done via the third PCM device
|
|||
(hw:0,2). Usually this is assigned to the PCM device "spdif".
|
||||
The available rates are 44100 and 48000 Hz.
|
||||
For playback with aplay, you can run like below:
|
||||
::
|
||||
|
||||
% aplay -Dhw:0,2 foo.wav
|
||||
|
||||
or
|
||||
|
||||
::
|
||||
|
||||
% aplay -Dspdif foo.wav
|
||||
|
||||
24bit format is also supported experimentally.
|
||||
|
@ -140,31 +149,40 @@ off. (Also don't forget to turn on "IEC958 Output Switch", too.)
|
|||
|
||||
Additionally there are relevant control switches:
|
||||
|
||||
"IEC958 Mix Analog" - Mix analog PCM playback and FM-OPL/3 streams and
|
||||
IEC958 Mix Analog
|
||||
Mix analog PCM playback and FM-OPL/3 streams and
|
||||
output through SPDIF. This switch appears only on old chip
|
||||
models (CM8738 033 and 037).
|
||||
|
||||
Note: without this control you can output PCM to SPDIF.
|
||||
This is "mixing" of streams, so e.g. it's not for AC3 output
|
||||
(see the next section).
|
||||
|
||||
"IEC958 In Select" - Select SPDIF input, the internal CD-in (false)
|
||||
IEC958 In Select
|
||||
Select SPDIF input, the internal CD-in (false)
|
||||
and the external input (true).
|
||||
|
||||
"IEC958 Loop" - SPDIF input data is loop back into SPDIF
|
||||
IEC958 Loop
|
||||
SPDIF input data is loop back into SPDIF
|
||||
output (aka bypass)
|
||||
|
||||
"IEC958 Copyright" - Set the copyright bit.
|
||||
IEC958 Copyright
|
||||
Set the copyright bit.
|
||||
|
||||
"IEC958 5V" - Select 0.5V (coax) or 5V (optical) interface.
|
||||
IEC958 5V
|
||||
Select 0.5V (coax) or 5V (optical) interface.
|
||||
On some cards this doesn't work and you need to change the
|
||||
configuration with hardware dip-switch.
|
||||
|
||||
"IEC958 In Monitor" - SPDIF input is routed to DAC.
|
||||
IEC958 In Monitor
|
||||
SPDIF input is routed to DAC.
|
||||
|
||||
"IEC958 In Phase Inverse" - Set SPDIF input format as inverse.
|
||||
IEC958 In Phase Inverse
|
||||
Set SPDIF input format as inverse.
|
||||
[FIXME: this doesn't work on all chips..]
|
||||
|
||||
"IEC958 In Valid" - Set input validity flag detection.
|
||||
IEC958 In Valid
|
||||
Set input validity flag detection.
|
||||
|
||||
Note: When "PCM Playback Switch" is on, you'll hear the digital output
|
||||
stream through analog line-out.
|
||||
|
@ -217,7 +235,7 @@ to enable MIDI support. Valid I/O ports are 0x300, 0x310, 0x320 and
|
|||
With CMI8738 and newer chips, the MIDI interface is enabled by default
|
||||
and the driver automatically chooses a port address.
|
||||
|
||||
There is _no_ hardware wavetable function on this chip (except for
|
||||
There is *no* hardware wavetable function on this chip (except for
|
||||
OPL3 synth below).
|
||||
What's said as MIDI synth on Windows is a software synthesizer
|
||||
emulation. On Linux use TiMidity or other softsynth program for
|
|
@ -1,3 +1,7 @@
|
|||
=================================================================
|
||||
Low latency, multichannel audio with JACK and the emu10k1/emu10k2
|
||||
=================================================================
|
||||
|
||||
This document is a guide to using the emu10k1 based devices with JACK for low
|
||||
latency, multichannel recording functionality. All of my recent work to allow
|
||||
Linux users to use the full capabilities of their hardware has been inspired
|
||||
|
@ -7,8 +11,6 @@ power of this hardware.
|
|||
http://www.kxproject.com
|
||||
- Lee Revell, 2005.03.30
|
||||
|
||||
Low latency, multichannel audio with JACK and the emu10k1/emu10k2
|
||||
-----------------------------------------------------------------
|
||||
|
||||
Until recently, emu10k1 users on Linux did not have access to the same low
|
||||
latency, multichannel features offered by the "kX ASIO" feature of their
|
||||
|
@ -23,14 +25,15 @@ select the correct device for JACK to use. Actually, for qjackctl users it's
|
|||
fairly self explanatory - select Duplex, then for capture and playback select
|
||||
the multichannel devices, set the in and out channels to 16, and the sample
|
||||
rate to 48000Hz. The command line looks like this:
|
||||
::
|
||||
|
||||
/usr/local/bin/jackd -R -dalsa -r48000 -p64 -n2 -D -Chw:0,2 -Phw:0,3 -S
|
||||
/usr/local/bin/jackd -R -dalsa -r48000 -p64 -n2 -D -Chw:0,2 -Phw:0,3 -S
|
||||
|
||||
This will give you 16 input ports and 16 output ports.
|
||||
|
||||
The 16 output ports map onto the 16 FX buses (or the first 16 of 64, for the
|
||||
Audigy). The mapping from FX bus to physical output is described in
|
||||
SB-Live-mixer.txt (or Audigy-mixer.txt).
|
||||
sb-live-mixer.rst (or audigy-mixer.rst).
|
||||
|
||||
The 16 input ports are connected to the 16 physical inputs. Contrary to
|
||||
popular belief, all emu10k1 cards are multichannel cards. Which of these
|
||||
|
@ -49,10 +52,11 @@ This chart, borrowed from kxfxlib/da_asio51.cpp, describes the mapping of JACK
|
|||
ports to FXBUS2 (multitrack recording input) and EXTOUT (physical output)
|
||||
channels.
|
||||
|
||||
/*JACK (& ASIO) mappings on 10k1 5.1 SBLive cards:
|
||||
--------------------------------------------
|
||||
JACK (& ASIO) mappings on 10k1 5.1 SBLive cards:
|
||||
|
||||
============== ======== ============
|
||||
JACK Epilog FXBUS2(nr)
|
||||
--------------------------------------------
|
||||
============== ======== ============
|
||||
capture_1 asio14 FXBUS2(0xe)
|
||||
capture_2 asio15 FXBUS2(0xf)
|
||||
capture_3 asio0 FXBUS2(0x0)
|
||||
|
@ -69,6 +73,6 @@ capture_13 asio10 FXBUS2(0xa)
|
|||
capture_14 asio11 FXBUS2(0xb)
|
||||
capture_15 asio12 FXBUS2(0xc)
|
||||
capture_16 asio13 FXBUS2(0xd)
|
||||
*/
|
||||
============== ======== ============
|
||||
|
||||
TODO: describe use of ld10k1/qlo10k1 in conjunction with JACK
|
|
@ -1,21 +1,24 @@
|
|||
=======================================
|
||||
Software Interface ALSA-DSP MADI Driver
|
||||
=======================================
|
||||
|
||||
(translated from German, so no good English ;-),
|
||||
|
||||
2004 - winfried ritsch
|
||||
|
||||
|
||||
|
||||
Full functionality has been added to the driver. Since some of
|
||||
the Controls and startup-options are ALSA-Standard and only the
|
||||
special Controls are described and discussed below.
|
||||
Full functionality has been added to the driver. Since some of
|
||||
the Controls and startup-options are ALSA-Standard and only the
|
||||
special Controls are described and discussed below.
|
||||
|
||||
|
||||
hardware functionality:
|
||||
|
||||
Hardware functionality
|
||||
======================
|
||||
|
||||
Audio transmission:
|
||||
Audio transmission
|
||||
------------------
|
||||
|
||||
number of channels -- depends on transmission mode
|
||||
* number of channels -- depends on transmission mode
|
||||
|
||||
The number of channels chosen is from 1..Nmax. The reason to
|
||||
use for a lower number of channels is only resource allocation,
|
||||
|
@ -23,31 +26,34 @@ Software Interface ALSA-DSP MADI Driver
|
|||
allocated. So also the throughput of the PCI system can be
|
||||
scaled. (Only important for low performance boards).
|
||||
|
||||
Single Speed -- 1..64 channels
|
||||
* Single Speed -- 1..64 channels
|
||||
|
||||
.. note::
|
||||
(Note: Choosing the 56channel mode for transmission or as
|
||||
receiver, only 56 are transmitted/received over the MADI, but
|
||||
all 64 channels are available for the mixer, so channel count
|
||||
for the driver)
|
||||
|
||||
Double Speed -- 1..32 channels
|
||||
* Double Speed -- 1..32 channels
|
||||
|
||||
.. note::
|
||||
Note: Choosing the 56-channel mode for
|
||||
transmission/receive-mode , only 28 are transmitted/received
|
||||
over the MADI, but all 32 channels are available for the mixer,
|
||||
so channel count for the driver
|
||||
|
||||
|
||||
Quad Speed -- 1..16 channels
|
||||
* Quad Speed -- 1..16 channels
|
||||
|
||||
Note: Choosing the 56-channel mode for
|
||||
.. note::
|
||||
Choosing the 56-channel mode for
|
||||
transmission/receive-mode , only 14 are transmitted/received
|
||||
over the MADI, but all 16 channels are available for the mixer,
|
||||
so channel count for the driver
|
||||
|
||||
Format -- signed 32 Bit Little Endian (SNDRV_PCM_FMTBIT_S32_LE)
|
||||
* Format -- signed 32 Bit Little Endian (SNDRV_PCM_FMTBIT_S32_LE)
|
||||
|
||||
Sample Rates --
|
||||
* Sample Rates --
|
||||
|
||||
Single Speed -- 32000, 44100, 48000
|
||||
|
||||
|
@ -55,14 +61,13 @@ Software Interface ALSA-DSP MADI Driver
|
|||
|
||||
Quad Speed -- 128000, 176400, 192000 (untested)
|
||||
|
||||
access-mode -- MMAP (memory mapped), Not interleaved
|
||||
(PCM_NON-INTERLEAVED)
|
||||
* access-mode -- MMAP (memory mapped), Not interleaved (PCM_NON-INTERLEAVED)
|
||||
|
||||
buffer-sizes -- 64,128,256,512,1024,2048,8192 Samples
|
||||
* buffer-sizes -- 64,128,256,512,1024,2048,8192 Samples
|
||||
|
||||
fragments -- 2
|
||||
* fragments -- 2
|
||||
|
||||
Hardware-pointer -- 2 Modi
|
||||
* Hardware-pointer -- 2 Modi
|
||||
|
||||
|
||||
The Card supports the readout of the actual Buffer-pointer,
|
||||
|
@ -74,53 +79,54 @@ Software Interface ALSA-DSP MADI Driver
|
|||
precise-pointer.
|
||||
|
||||
|
||||
.. hint::
|
||||
(Hint: Experimenting I found that the pointer is maximum 64 to
|
||||
large never to small. So if you subtract 64 you always have a
|
||||
safe pointer for writing, which is used on this mode inside
|
||||
ALSA. In theory now you can get now a latency as low as 16
|
||||
Samples, which is a quarter of the interrupt possibilities.)
|
||||
|
||||
Precise Pointer -- off
|
||||
* Precise Pointer -- off
|
||||
interrupt used for pointer-calculation
|
||||
|
||||
Precise Pointer -- on
|
||||
|
||||
* Precise Pointer -- on
|
||||
hardware pointer used.
|
||||
|
||||
Controller:
|
||||
Controller
|
||||
----------
|
||||
|
||||
Since DSP-MADI-Mixer has 8152 Fader, it does not make sense to
|
||||
use the standard mixer-controls, since this would break most of
|
||||
(especially graphic) ALSA-Mixer GUIs. So Mixer control has be
|
||||
provided by a 2-dimensional controller using the
|
||||
hwdep-interface.
|
||||
|
||||
Since DSP-MADI-Mixer has 8152 Fader, it does not make sense to
|
||||
use the standard mixer-controls, since this would break most of
|
||||
(especially graphic) ALSA-Mixer GUIs. So Mixer control has be
|
||||
provided by a 2-dimensional controller using the
|
||||
hwdep-interface.
|
||||
|
||||
Also all 128+256 Peak and RMS-Meter can be accessed via the
|
||||
hwdep-interface. Since it could be a performance problem always
|
||||
copying and converting Peak and RMS-Levels even if you just need
|
||||
one, I decided to export the hardware structure, so that of
|
||||
needed some driver-guru can implement a memory-mapping of mixer
|
||||
or peak-meters over ioctl, or also to do only copying and no
|
||||
conversion. A test-application shows the usage of the controller.
|
||||
|
||||
Latency Controls --- not implemented !!!
|
||||
Also all 128+256 Peak and RMS-Meter can be accessed via the
|
||||
hwdep-interface. Since it could be a performance problem always
|
||||
copying and converting Peak and RMS-Levels even if you just need
|
||||
one, I decided to export the hardware structure, so that of
|
||||
needed some driver-guru can implement a memory-mapping of mixer
|
||||
or peak-meters over ioctl, or also to do only copying and no
|
||||
conversion. A test-application shows the usage of the controller.
|
||||
|
||||
* Latency Controls --- not implemented !!!
|
||||
|
||||
.. note::
|
||||
Note: Within the windows-driver the latency is accessible of a
|
||||
control-panel, but buffer-sizes are controlled with ALSA from
|
||||
hwparams-calls and should not be changed in run-state, I did not
|
||||
implement it here.
|
||||
|
||||
|
||||
System Clock -- suspended !!!!
|
||||
* System Clock -- suspended !!!!
|
||||
|
||||
Name -- "System Clock Mode"
|
||||
|
||||
Access -- Read Write
|
||||
|
||||
Values -- "Master" "Slave"
|
||||
* Name -- "System Clock Mode"
|
||||
|
||||
* Access -- Read Write
|
||||
|
||||
* Values -- "Master" "Slave"
|
||||
|
||||
.. note::
|
||||
!!!! This is a hardware-function but is in conflict with the
|
||||
Clock-source controller, which is a kind of ALSA-standard. I
|
||||
makes sense to set the card to a special mode (master at some
|
||||
|
@ -128,106 +134,107 @@ Software Interface ALSA-DSP MADI Driver
|
|||
a studio should have working synchronisations setup. So use
|
||||
Clock-source-controller instead !!!!
|
||||
|
||||
Clock Source
|
||||
* Clock Source
|
||||
|
||||
Name -- "Sample Clock Source"
|
||||
* Name -- "Sample Clock Source"
|
||||
|
||||
Access -- Read Write
|
||||
* Access -- Read Write
|
||||
|
||||
Values -- "AutoSync", "Internal 32.0 kHz", "Internal 44.1 kHz",
|
||||
"Internal 48.0 kHz", "Internal 64.0 kHz", "Internal 88.2 kHz",
|
||||
"Internal 96.0 kHz"
|
||||
* Values -- "AutoSync", "Internal 32.0 kHz", "Internal 44.1 kHz",
|
||||
"Internal 48.0 kHz", "Internal 64.0 kHz", "Internal 88.2 kHz",
|
||||
"Internal 96.0 kHz"
|
||||
|
||||
Choose between Master at a specific Frequency and so also the
|
||||
Speed-mode or Slave (Autosync). Also see "Preferred Sync Ref"
|
||||
|
||||
|
||||
.. warning::
|
||||
!!!! This is no pure hardware function but was implemented by
|
||||
ALSA by some ALSA-drivers before, so I use it also. !!!
|
||||
|
||||
|
||||
Preferred Sync Ref
|
||||
* Preferred Sync Ref
|
||||
|
||||
Name -- "Preferred Sync Reference"
|
||||
* Name -- "Preferred Sync Reference"
|
||||
|
||||
Access -- Read Write
|
||||
* Access -- Read Write
|
||||
|
||||
Values -- "Word" "MADI"
|
||||
* Values -- "Word" "MADI"
|
||||
|
||||
|
||||
Within the Auto-sync-Mode the preferred Sync Source can be
|
||||
chosen. If it is not available another is used if possible.
|
||||
|
||||
.. note::
|
||||
Note: Since MADI has a much higher bit-rate than word-clock, the
|
||||
card should synchronise better in MADI Mode. But since the
|
||||
RME-PLL is very good, there are almost no problems with
|
||||
word-clock too. I never found a difference.
|
||||
|
||||
|
||||
TX 64 channel ---
|
||||
* TX 64 channel
|
||||
|
||||
Name -- "TX 64 channels mode"
|
||||
* Name -- "TX 64 channels mode"
|
||||
|
||||
Access -- Read Write
|
||||
* Access -- Read Write
|
||||
|
||||
Values -- 0 1
|
||||
* Values -- 0 1
|
||||
|
||||
Using 64-channel-modus (1) or 56-channel-modus for
|
||||
MADI-transmission (0).
|
||||
|
||||
|
||||
.. note::
|
||||
Note: This control is for output only. Input-mode is detected
|
||||
automatically from hardware sending MADI.
|
||||
|
||||
|
||||
Clear TMS ---
|
||||
* Clear TMS
|
||||
|
||||
Name -- "Clear Track Marker"
|
||||
* Name -- "Clear Track Marker"
|
||||
|
||||
Access -- Read Write
|
||||
* Access -- Read Write
|
||||
|
||||
Values -- 0 1
|
||||
* Values -- 0 1
|
||||
|
||||
|
||||
Don't use to lower 5 Audio-bits on AES as additional Bits.
|
||||
|
||||
|
||||
Safe Mode oder Auto Input ---
|
||||
* Safe Mode oder Auto Input
|
||||
|
||||
Name -- "Safe Mode"
|
||||
* Name -- "Safe Mode"
|
||||
|
||||
Access -- Read Write
|
||||
* Access -- Read Write
|
||||
|
||||
Values -- 0 1
|
||||
|
||||
(default on)
|
||||
* Values -- 0 1 (default on)
|
||||
|
||||
If on (1), then if either the optical or coaxial connection
|
||||
has a failure, there is a takeover to the working one, with no
|
||||
sample failure. Its only useful if you use the second as a
|
||||
backup connection.
|
||||
|
||||
Input ---
|
||||
* Input
|
||||
|
||||
Name -- "Input Select"
|
||||
* Name -- "Input Select"
|
||||
|
||||
Access -- Read Write
|
||||
* Access -- Read Write
|
||||
|
||||
Values -- optical coaxial
|
||||
* Values -- optical coaxial
|
||||
|
||||
|
||||
Choosing the Input, optical or coaxial. If Safe-mode is active,
|
||||
this is the preferred Input.
|
||||
|
||||
-------------- Mixer ----------------------
|
||||
Mixer
|
||||
-----
|
||||
|
||||
Mixer
|
||||
* Mixer
|
||||
|
||||
Name -- "Mixer"
|
||||
* Name -- "Mixer"
|
||||
|
||||
Access -- Read Write
|
||||
* Access -- Read Write
|
||||
|
||||
Values - <channel-number 0-127> <Value 0-65535>
|
||||
* Values - <channel-number 0-127> <Value 0-65535>
|
||||
|
||||
|
||||
Here as a first value the channel-index is taken to get/set the
|
||||
|
@ -235,40 +242,41 @@ Software Interface ALSA-DSP MADI Driver
|
|||
fader and 64-127 the playback to outputs fader. Value 0
|
||||
is channel muted 0 and 32768 an amplification of 1.
|
||||
|
||||
Chn 1-64
|
||||
* Chn 1-64
|
||||
|
||||
fast mixer for the ALSA-mixer utils. The diagonal of the
|
||||
mixer-matrix is implemented from playback to output.
|
||||
|
||||
|
||||
Line Out
|
||||
* Line Out
|
||||
|
||||
Name -- "Line Out"
|
||||
* Name -- "Line Out"
|
||||
|
||||
Access -- Read Write
|
||||
* Access -- Read Write
|
||||
|
||||
Values -- 0 1
|
||||
* Values -- 0 1
|
||||
|
||||
Switching on and off the analog out, which has nothing to do
|
||||
with mixing or routing. the analog outs reflects channel 63,64.
|
||||
|
||||
|
||||
--- information (only read access):
|
||||
Information (only read access)
|
||||
------------------------------
|
||||
|
||||
Sample Rate
|
||||
* Sample Rate
|
||||
|
||||
Name -- "System Sample Rate"
|
||||
* Name -- "System Sample Rate"
|
||||
|
||||
Access -- Read-only
|
||||
* Access -- Read-only
|
||||
|
||||
getting the sample rate.
|
||||
|
||||
|
||||
External Rate measured
|
||||
* External Rate measured
|
||||
|
||||
Name -- "External Rate"
|
||||
* Name -- "External Rate"
|
||||
|
||||
Access -- Read only
|
||||
* Access -- Read only
|
||||
|
||||
|
||||
Should be "Autosync Rate", but Name used is
|
||||
|
@ -276,79 +284,86 @@ Software Interface ALSA-DSP MADI Driver
|
|||
reported.
|
||||
|
||||
|
||||
MADI Sync Status
|
||||
* MADI Sync Status
|
||||
|
||||
Name -- "MADI Sync Lock Status"
|
||||
* Name -- "MADI Sync Lock Status"
|
||||
|
||||
Access -- Read
|
||||
* Access -- Read
|
||||
|
||||
Values -- 0,1,2
|
||||
* Values -- 0,1,2
|
||||
|
||||
MADI-Input is 0=Unlocked, 1=Locked, or 2=Synced.
|
||||
|
||||
|
||||
Word Clock Sync Status
|
||||
* Word Clock Sync Status
|
||||
|
||||
Name -- "Word Clock Lock Status"
|
||||
* Name -- "Word Clock Lock Status"
|
||||
|
||||
Access -- Read
|
||||
* Access -- Read
|
||||
|
||||
Values -- 0,1,2
|
||||
* Values -- 0,1,2
|
||||
|
||||
Word Clock Input is 0=Unlocked, 1=Locked, or 2=Synced.
|
||||
|
||||
AutoSync
|
||||
* AutoSync
|
||||
|
||||
Name -- "AutoSync Reference"
|
||||
* Name -- "AutoSync Reference"
|
||||
|
||||
Access -- Read
|
||||
* Access -- Read
|
||||
|
||||
Values -- "WordClock", "MADI", "None"
|
||||
* Values -- "WordClock", "MADI", "None"
|
||||
|
||||
Sync-Reference is either "WordClock", "MADI" or none.
|
||||
|
||||
RX 64ch --- noch nicht implementiert
|
||||
* RX 64ch --- noch nicht implementiert
|
||||
|
||||
MADI-Receiver is in 64 channel mode oder 56 channel mode.
|
||||
|
||||
|
||||
AB_inp --- not tested
|
||||
* AB_inp --- not tested
|
||||
|
||||
Used input for Auto-Input.
|
||||
|
||||
|
||||
actual Buffer Position --- not implemented
|
||||
* actual Buffer Position --- not implemented
|
||||
|
||||
!!! this is a ALSA internal function, so no control is used !!!
|
||||
|
||||
|
||||
|
||||
Calling Parameter:
|
||||
Calling Parameter
|
||||
=================
|
||||
|
||||
index int array (min = 1, max = 8),
|
||||
"Index value for RME HDSPM interface." card-index within ALSA
|
||||
* index int array (min = 1, max = 8)
|
||||
|
||||
Index value for RME HDSPM interface. card-index within ALSA
|
||||
|
||||
note: ALSA-standard
|
||||
|
||||
id string array (min = 1, max = 8),
|
||||
"ID string for RME HDSPM interface."
|
||||
* id string array (min = 1, max = 8)
|
||||
|
||||
ID string for RME HDSPM interface.
|
||||
|
||||
note: ALSA-standard
|
||||
|
||||
enable int array (min = 1, max = 8),
|
||||
"Enable/disable specific HDSPM sound-cards."
|
||||
* enable int array (min = 1, max = 8)
|
||||
|
||||
Enable/disable specific HDSPM sound-cards.
|
||||
|
||||
note: ALSA-standard
|
||||
|
||||
precise_ptr int array (min = 1, max = 8),
|
||||
"Enable precise pointer, or disable."
|
||||
* precise_ptr int array (min = 1, max = 8)
|
||||
|
||||
Enable precise pointer, or disable.
|
||||
|
||||
.. note::
|
||||
note: Use only when the application supports this (which is a special case).
|
||||
|
||||
line_outs_monitor int array (min = 1, max = 8),
|
||||
"Send playback streams to analog outs by default."
|
||||
* line_outs_monitor int array (min = 1, max = 8)
|
||||
|
||||
Send playback streams to analog outs by default.
|
||||
|
||||
.. note::
|
||||
note: each playback channel is mixed to the same numbered output
|
||||
channel (routed). This is against the ALSA-convention, where all
|
||||
channels have to be muted on after loading the driver, but was
|
||||
|
@ -356,7 +371,9 @@ Calling Parameter:
|
|||
|
||||
|
||||
|
||||
enable_monitor int array (min = 1, max = 8),
|
||||
"Enable Analog Out on Channel 63/64 by default."
|
||||
* enable_monitor int array (min = 1, max = 8)
|
||||
|
||||
Enable Analog Out on Channel 63/64 by default.
|
||||
|
||||
.. note ::
|
||||
note: here the analog output is enabled (but not routed).
|
|
@ -1,21 +1,25 @@
|
|||
================================================
|
||||
Imagination Technologies SPDIF Input Controllers
|
||||
================================================
|
||||
|
||||
The Imagination Technologies SPDIF Input controller contains the following
|
||||
controls:
|
||||
|
||||
name='IEC958 Capture Mask',index=0
|
||||
* name='IEC958 Capture Mask',index=0
|
||||
|
||||
This control returns a mask that shows which of the IEC958 status bits
|
||||
can be read using the 'IEC958 Capture Default' control.
|
||||
|
||||
name='IEC958 Capture Default',index=0
|
||||
* name='IEC958 Capture Default',index=0
|
||||
|
||||
This control returns the status bits contained within the SPDIF stream that
|
||||
is being received. The 'IEC958 Capture Mask' shows which bits can be read
|
||||
from this control.
|
||||
|
||||
name='SPDIF In Multi Frequency Acquire',index=0
|
||||
name='SPDIF In Multi Frequency Acquire',index=1
|
||||
name='SPDIF In Multi Frequency Acquire',index=2
|
||||
name='SPDIF In Multi Frequency Acquire',index=3
|
||||
* name='SPDIF In Multi Frequency Acquire',index=0
|
||||
* name='SPDIF In Multi Frequency Acquire',index=1
|
||||
* name='SPDIF In Multi Frequency Acquire',index=2
|
||||
* name='SPDIF In Multi Frequency Acquire',index=3
|
||||
|
||||
This control is used to attempt acquisition of up to four different sample
|
||||
rates. The active rate can be obtained by reading the 'SPDIF In Lock Frequency'
|
||||
|
@ -29,21 +33,21 @@ four sample rates set here.
|
|||
If less than four rates are required, the same rate can be specified more than
|
||||
once
|
||||
|
||||
name='SPDIF In Lock Frequency',index=0
|
||||
* name='SPDIF In Lock Frequency',index=0
|
||||
|
||||
This control returns the active capture rate, or 0 if a lock has not been
|
||||
acquired
|
||||
|
||||
name='SPDIF In Lock TRK',index=0
|
||||
* name='SPDIF In Lock TRK',index=0
|
||||
|
||||
This control is used to modify the locking/jitter rejection characteristics
|
||||
of the block. Larger values increase the locking range, but reduce jitter
|
||||
rejection.
|
||||
|
||||
name='SPDIF In Lock Acquire Threshold',index=0
|
||||
* name='SPDIF In Lock Acquire Threshold',index=0
|
||||
|
||||
This control is used to change the threshold at which a lock is acquired.
|
||||
|
||||
name='SPDIF In Lock Release Threshold',index=0
|
||||
* name='SPDIF In Lock Release Threshold',index=0
|
||||
|
||||
This control is used to change the threshold at which a lock is released.
|
|
@ -0,0 +1,19 @@
|
|||
Card-Specific Information
|
||||
=========================
|
||||
|
||||
.. toctree::
|
||||
:maxdepth: 2
|
||||
|
||||
joystick
|
||||
cmipci
|
||||
sb-live-mixer
|
||||
audigy-mixer
|
||||
emu10k1-jack
|
||||
via82xx-mixer
|
||||
audiophile-usb
|
||||
mixart
|
||||
bt87x
|
||||
maya44
|
||||
hdspm
|
||||
serial-u16550
|
||||
img-spdif-in
|
|
@ -1,7 +1,10 @@
|
|||
=======================================
|
||||
Analog Joystick Support on ALSA Drivers
|
||||
=======================================
|
||||
Oct. 14, 2003
|
||||
Takashi Iwai <tiwai@suse.de>
|
||||
|
||||
Oct. 14, 2003
|
||||
|
||||
Takashi Iwai <tiwai@suse.de>
|
||||
|
||||
General
|
||||
-------
|
||||
|
@ -34,44 +37,46 @@ stability and the resource management.
|
|||
|
||||
The following PCI drivers support the joystick natively.
|
||||
|
||||
Driver Module Option Available Values
|
||||
---------------------------------------------------------------------------
|
||||
als4000 joystick_port 0 = disable (default), 1 = auto-detect,
|
||||
manual: any address (e.g. 0x200)
|
||||
au88x0 N/A N/A
|
||||
azf3328 joystick 0 = disable, 1 = enable, -1 = auto (default)
|
||||
ens1370 joystick 0 = disable (default), 1 = enable
|
||||
ens1371 joystick_port 0 = disable (default), 1 = auto-detect,
|
||||
manual: 0x200, 0x208, 0x210, 0x218
|
||||
cmipci joystick_port 0 = disable (default), 1 = auto-detect,
|
||||
manual: any address (e.g. 0x200)
|
||||
cs4281 N/A N/A
|
||||
cs46xx N/A N/A
|
||||
es1938 N/A N/A
|
||||
es1968 joystick 0 = disable (default), 1 = enable
|
||||
sonicvibes N/A N/A
|
||||
trident N/A N/A
|
||||
via82xx(*1) joystick 0 = disable (default), 1 = enable
|
||||
ymfpci joystick_port 0 = disable (default), 1 = auto-detect,
|
||||
manual: 0x201, 0x202, 0x204, 0x205(*2)
|
||||
---------------------------------------------------------------------------
|
||||
============== ============= ============================================
|
||||
Driver Module Option Available Values
|
||||
============== ============= ============================================
|
||||
als4000 joystick_port 0 = disable (default), 1 = auto-detect,
|
||||
manual: any address (e.g. 0x200)
|
||||
au88x0 N/A N/A
|
||||
azf3328 joystick 0 = disable, 1 = enable, -1 = auto (default)
|
||||
ens1370 joystick 0 = disable (default), 1 = enable
|
||||
ens1371 joystick_port 0 = disable (default), 1 = auto-detect,
|
||||
manual: 0x200, 0x208, 0x210, 0x218
|
||||
cmipci joystick_port 0 = disable (default), 1 = auto-detect,
|
||||
manual: any address (e.g. 0x200)
|
||||
cs4281 N/A N/A
|
||||
cs46xx N/A N/A
|
||||
es1938 N/A N/A
|
||||
es1968 joystick 0 = disable (default), 1 = enable
|
||||
sonicvibes N/A N/A
|
||||
trident N/A N/A
|
||||
via82xx [#f1]_ joystick 0 = disable (default), 1 = enable
|
||||
ymfpci joystick_port 0 = disable (default), 1 = auto-detect,
|
||||
manual: 0x201, 0x202, 0x204, 0x205 [#f2]_
|
||||
============== ============= ============================================
|
||||
|
||||
*1) VIA686A/B only
|
||||
*2) With YMF744/754 chips, the port address can be chosen arbitrarily
|
||||
.. [#f1] VIA686A/B only
|
||||
.. [#f2] With YMF744/754 chips, the port address can be chosen arbitrarily
|
||||
|
||||
The following drivers don't support gameport natively, but there are
|
||||
additional modules. Load the corresponding module to add the gameport
|
||||
support.
|
||||
|
||||
Driver Additional Module
|
||||
-----------------------------
|
||||
emu10k1 emu10k1-gp
|
||||
fm801 fm801-gp
|
||||
-----------------------------
|
||||
======= =================
|
||||
Driver Additional Module
|
||||
======= =================
|
||||
emu10k1 emu10k1-gp
|
||||
fm801 fm801-gp
|
||||
======= =================
|
||||
|
||||
Note: the "pcigame" and "cs461x" modules are for the OSS drivers only.
|
||||
These ALSA drivers (cs46xx, trident and au88x0) have the
|
||||
built-in gameport support.
|
||||
These ALSA drivers (cs46xx, trident and au88x0) have the
|
||||
built-in gameport support.
|
||||
|
||||
As mentioned above, ALSA PCI drivers have the built-in gameport
|
||||
support, so you don't have to load ns558 module. Just load "joydev"
|
|
@ -1,10 +1,18 @@
|
|||
NOTE: The following is the original document of Rainer's patch that the
|
||||
current maya44 code based on. Some contents might be obsoleted, but I
|
||||
keep here as reference -- tiwai
|
||||
=================================
|
||||
Notes on Maya44 USB Audio Support
|
||||
=================================
|
||||
|
||||
----------------------------------------------------------------
|
||||
.. note::
|
||||
The following is the original document of Rainer's patch that the
|
||||
current maya44 code based on. Some contents might be obsoleted, but I
|
||||
keep here as reference -- tiwai
|
||||
|
||||
Feb 14, 2008
|
||||
|
||||
Rainer Zimmermann <mail@lightshed.de>
|
||||
|
||||
STATE OF DEVELOPMENT:
|
||||
STATE OF DEVELOPMENT
|
||||
====================
|
||||
|
||||
This driver is being developed on the initiative of Piotr Makowski (oponek@gmail.com) and financed by Lars Bergmann.
|
||||
Development is carried out by Rainer Zimmermann (mail@lightshed.de).
|
||||
|
@ -44,16 +52,17 @@ Things that do not seem to work:
|
|||
- Ardour 2.1 seems to work only via JACK, not using ALSA directly or via OSS. This still needs to be tracked down.
|
||||
|
||||
|
||||
DRIVER DETAILS:
|
||||
DRIVER DETAILS
|
||||
==============
|
||||
|
||||
the following files were added:
|
||||
|
||||
pci/ice1724/maya44.c - Maya44 specific code
|
||||
pci/ice1724/maya44.h
|
||||
pci/ice1724/ice1724.patch
|
||||
pci/ice1724/ice1724.h.patch - PROPOSED patch to ice1724.h (see SAMPLING RATES)
|
||||
i2c/other/wm8776.c - low-level access routines for Wolfson WM8776 codecs
|
||||
include/wm8776.h
|
||||
* pci/ice1724/maya44.c - Maya44 specific code
|
||||
* pci/ice1724/maya44.h
|
||||
* pci/ice1724/ice1724.patch
|
||||
* pci/ice1724/ice1724.h.patch - PROPOSED patch to ice1724.h (see SAMPLING RATES)
|
||||
* i2c/other/wm8776.c - low-level access routines for Wolfson WM8776 codecs
|
||||
* include/wm8776.h
|
||||
|
||||
|
||||
Note that the wm8776.c code is meant to be card-independent and does not actually register the codec with the ALSA infrastructure.
|
||||
|
@ -62,25 +71,26 @@ This is done in maya44.c, mainly because some of the WM8776 controls are used in
|
|||
|
||||
the following files were created in pci/ice1724, simply #including the corresponding file from the alsa-kernel tree:
|
||||
|
||||
wtm.h
|
||||
vt1720_mobo.h
|
||||
revo.h
|
||||
prodigy192.h
|
||||
pontis.h
|
||||
phase.h
|
||||
maya44.h
|
||||
juli.h
|
||||
aureon.h
|
||||
amp.h
|
||||
envy24ht.h
|
||||
se.h
|
||||
prodigy_hifi.h
|
||||
* wtm.h
|
||||
* vt1720_mobo.h
|
||||
* revo.h
|
||||
* prodigy192.h
|
||||
* pontis.h
|
||||
* phase.h
|
||||
* maya44.h
|
||||
* juli.h
|
||||
* aureon.h
|
||||
* amp.h
|
||||
* envy24ht.h
|
||||
* se.h
|
||||
* prodigy_hifi.h
|
||||
|
||||
|
||||
*I hope this is the correct way to do things.*
|
||||
|
||||
|
||||
SAMPLING RATES:
|
||||
SAMPLING RATES
|
||||
==============
|
||||
|
||||
The Maya44 card (or more exactly, the Wolfson WM8776 codecs) allow a maximum sampling rate of 192 kHz for playback and 92 kHz for capture.
|
||||
|
||||
|
@ -98,66 +108,79 @@ I propose some additional code for limiting the sampling rate when setting on a
|
|||
The proposed code (currently deactivated) is in ice1712.h.patch, ice1724.c and maya44.c (in pci/ice1712).
|
||||
|
||||
|
||||
SOUND DEVICES:
|
||||
SOUND DEVICES
|
||||
=============
|
||||
|
||||
PCM devices correspond to inputs/outputs as follows (assuming Maya44 is card #0):
|
||||
|
||||
hw:0,0 input - stereo, analog input 1+2
|
||||
hw:0,0 output - stereo, analog output 1+2
|
||||
hw:0,1 input - stereo, analog input 3+4 OR S/PDIF input
|
||||
hw:0,1 output - stereo, analog output 3+4 (and SPDIF out)
|
||||
* hw:0,0 input - stereo, analog input 1+2
|
||||
* hw:0,0 output - stereo, analog output 1+2
|
||||
* hw:0,1 input - stereo, analog input 3+4 OR S/PDIF input
|
||||
* hw:0,1 output - stereo, analog output 3+4 (and SPDIF out)
|
||||
|
||||
|
||||
NAMING OF MIXER CONTROLS:
|
||||
NAMING OF MIXER CONTROLS
|
||||
========================
|
||||
|
||||
(for more information about the signal flow, please refer to the block diagram on p.24 of the ESI Maya44 manual, or in the ESI windows software).
|
||||
|
||||
|
||||
PCM: (digital) output level for channel 1+2
|
||||
PCM 1: same for channel 3+4
|
||||
PCM
|
||||
(digital) output level for channel 1+2
|
||||
PCM 1
|
||||
same for channel 3+4
|
||||
|
||||
Mic Phantom+48V
|
||||
switch for +48V phantom power for electrostatic microphones on input 1/2.
|
||||
|
||||
Mic Phantom+48V: switch for +48V phantom power for electrostatic microphones on input 1/2.
|
||||
Make sure this is not turned on while any other source is connected to input 1/2.
|
||||
It might damage the source and/or the maya44 card.
|
||||
|
||||
Mic/Line input: if switch is on, input jack 1/2 is microphone input (mono), otherwise line input (stereo).
|
||||
Mic/Line input
|
||||
if switch is on, input jack 1/2 is microphone input (mono), otherwise line input (stereo).
|
||||
|
||||
Bypass: analogue bypass from ADC input to output for channel 1+2. Same as "Monitor" in the windows driver.
|
||||
Bypass 1: same for channel 3+4.
|
||||
Bypass
|
||||
analogue bypass from ADC input to output for channel 1+2. Same as "Monitor" in the windows driver.
|
||||
Bypass 1
|
||||
same for channel 3+4.
|
||||
|
||||
Crossmix: cross-mixer from channels 1+2 to channels 3+4
|
||||
Crossmix 1: cross-mixer from channels 3+4 to channels 1+2
|
||||
Crossmix
|
||||
cross-mixer from channels 1+2 to channels 3+4
|
||||
Crossmix 1
|
||||
cross-mixer from channels 3+4 to channels 1+2
|
||||
|
||||
IEC958 Output
|
||||
switch for S/PDIF output.
|
||||
|
||||
IEC958 Output: switch for S/PDIF output.
|
||||
This is not supported by the ESI windows driver.
|
||||
S/PDIF should output the same signal as channel 3+4. [untested!]
|
||||
|
||||
|
||||
Digitial output selectors:
|
||||
|
||||
Digitial output selectors
|
||||
These switches allow a direct digital routing from the ADCs to the DACs.
|
||||
Each switch determines where the digital input data to one of the DACs comes from.
|
||||
They are not supported by the ESI windows driver.
|
||||
For normal operation, they should all be set to "PCM out".
|
||||
|
||||
H/W: Output source channel 1
|
||||
H/W 1: Output source channel 2
|
||||
H/W 2: Output source channel 3
|
||||
H/W 3: Output source channel 4
|
||||
H/W
|
||||
Output source channel 1
|
||||
H/W 1
|
||||
Output source channel 2
|
||||
H/W 2
|
||||
Output source channel 3
|
||||
H/W 3
|
||||
Output source channel 4
|
||||
|
||||
H/W 4 ... H/W 9
|
||||
unknown function, left in to enable testing.
|
||||
|
||||
H/W 4 ... H/W 9: unknown function, left in to enable testing.
|
||||
Possibly some of these control S/PDIF output(s).
|
||||
If these turn out to be unused, they will go away in later driver versions.
|
||||
|
||||
Selectable values for each of the digital output selectors are:
|
||||
"PCM out" -> DAC output of the corresponding channel (default setting)
|
||||
"Input 1"...
|
||||
"Input 4" -> direct routing from ADC output of the selected input channel
|
||||
|
||||
|
||||
--------
|
||||
|
||||
Feb 14, 2008
|
||||
Rainer Zimmermann
|
||||
mail@lightshed.de
|
||||
PCM out
|
||||
DAC output of the corresponding channel (default setting)
|
||||
Input 1 ... Input 4
|
||||
direct routing from ADC output of the selected input channel
|
||||
|
|
@ -1,5 +1,8 @@
|
|||
Alsa driver for Digigram miXart8 and miXart8AES/EBU soundcards
|
||||
Digigram <alsa@digigram.com>
|
||||
==============================================================
|
||||
Alsa driver for Digigram miXart8 and miXart8AES/EBU soundcards
|
||||
==============================================================
|
||||
|
||||
Digigram <alsa@digigram.com>
|
||||
|
||||
|
||||
GENERAL
|
||||
|
@ -48,11 +51,15 @@ formats are supported.
|
|||
|
||||
Mixer
|
||||
-----
|
||||
<Master> and <Master Capture> : analog volume control of playback and capture PCM.
|
||||
<PCM 0-3> and <PCM Capture> : digital volume control of each analog substream.
|
||||
<AES 0-3> and <AES Capture> : digital volume control of each AES/EBU substream.
|
||||
<Monitoring> : Loopback from 'pcm0c' to 'pcm0p' with digital volume
|
||||
and mute control.
|
||||
<Master> and <Master Capture>
|
||||
analog volume control of playback and capture PCM.
|
||||
<PCM 0-3> and <PCM Capture>
|
||||
digital volume control of each analog substream.
|
||||
<AES 0-3> and <AES Capture>
|
||||
digital volume control of each AES/EBU substream.
|
||||
<Monitoring>
|
||||
Loopback from 'pcm0c' to 'pcm0p' with digital volume
|
||||
and mute control.
|
||||
|
||||
Rem : for best audio quality try to keep a 0 attenuation on the PCM
|
||||
and AES volume controls which is set by 219 in the range from 0 to 255
|
||||
|
@ -79,11 +86,14 @@ FIRMWARE
|
|||
For loading the firmware automatically after the module is loaded, use a
|
||||
install command. For example, add the following entry to
|
||||
/etc/modprobe.d/mixart.conf for miXart driver:
|
||||
::
|
||||
|
||||
install snd-mixart /sbin/modprobe --first-time -i snd-mixart && \
|
||||
/usr/bin/mixartloader
|
||||
|
||||
|
||||
(for 2.2/2.4 kernels, add "post-install snd-mixart /usr/bin/vxloader" to
|
||||
/etc/modules.conf, instead.)
|
||||
/etc/modules.conf, instead.)
|
||||
|
||||
The firmware binaries are installed on /usr/share/alsa/firmware
|
||||
(or /usr/local/share/alsa/firmware, depending to the prefix option of
|
|
@ -1,6 +1,6 @@
|
|||
|
||||
Sound Blaster Live mixer / default DSP code
|
||||
===========================================
|
||||
===========================================
|
||||
Sound Blaster Live mixer / default DSP code
|
||||
===========================================
|
||||
|
||||
|
||||
The EMU10K1 chips have a DSP part which can be programmed to support
|
||||
|
@ -12,8 +12,8 @@ The ALSA driver programs this portion of chip by default code
|
|||
(can be altered later) which offers the following functionality:
|
||||
|
||||
|
||||
1) IEC958 (S/PDIF) raw PCM
|
||||
--------------------------
|
||||
IEC958 (S/PDIF) raw PCM
|
||||
=======================
|
||||
|
||||
This PCM device (it's the 4th PCM device (index 3!) and first subdevice
|
||||
(index 0) for a given card) allows to forward 48kHz, stereo, 16-bit
|
||||
|
@ -27,8 +27,8 @@ at the time.
|
|||
Look to tram_poke routines in lowlevel/emu10k1/emufx.c for more details.
|
||||
|
||||
|
||||
2) Digital mixer controls
|
||||
-------------------------
|
||||
Digital mixer controls
|
||||
======================
|
||||
|
||||
These controls are built using the DSP instructions. They offer extended
|
||||
functionality. Only the default build-in code in the ALSA driver is described
|
||||
|
@ -40,317 +40,334 @@ is mentioned in multiple controls, the signal is accumulated and can be wrapped
|
|||
|
||||
Explanation of used abbreviations:
|
||||
|
||||
DAC - digital to analog converter
|
||||
ADC - analog to digital converter
|
||||
I2S - one-way three wire serial bus for digital sound by Philips Semiconductors
|
||||
(this standard is used for connecting standalone DAC and ADC converters)
|
||||
LFE - low frequency effects (subwoofer signal)
|
||||
AC97 - a chip containing an analog mixer, DAC and ADC converters
|
||||
IEC958 - S/PDIF
|
||||
FX-bus - the EMU10K1 chip has an effect bus containing 16 accumulators.
|
||||
Each of the synthesizer voices can feed its output to these accumulators
|
||||
and the DSP microcontroller can operate with the resulting sum.
|
||||
DAC
|
||||
digital to analog converter
|
||||
ADC
|
||||
analog to digital converter
|
||||
I2S
|
||||
one-way three wire serial bus for digital sound by Philips Semiconductors
|
||||
(this standard is used for connecting standalone DAC and ADC converters)
|
||||
LFE
|
||||
low frequency effects (subwoofer signal)
|
||||
AC97
|
||||
a chip containing an analog mixer, DAC and ADC converters
|
||||
IEC958
|
||||
S/PDIF
|
||||
FX-bus
|
||||
the EMU10K1 chip has an effect bus containing 16 accumulators.
|
||||
Each of the synthesizer voices can feed its output to these accumulators
|
||||
and the DSP microcontroller can operate with the resulting sum.
|
||||
|
||||
|
||||
name='Wave Playback Volume',index=0
|
||||
|
||||
``name='Wave Playback Volume',index=0``
|
||||
---------------------------------------
|
||||
This control is used to attenuate samples for left and right PCM FX-bus
|
||||
accumulators. ALSA uses accumulators 0 and 1 for left and right PCM samples.
|
||||
The result samples are forwarded to the front DAC PCM slots of the AC97 codec.
|
||||
|
||||
name='Wave Surround Playback Volume',index=0
|
||||
|
||||
``name='Wave Surround Playback Volume',index=0``
|
||||
------------------------------------------------
|
||||
This control is used to attenuate samples for left and right PCM FX-bus
|
||||
accumulators. ALSA uses accumulators 0 and 1 for left and right PCM samples.
|
||||
The result samples are forwarded to the rear I2S DACs. These DACs operates
|
||||
separately (they are not inside the AC97 codec).
|
||||
|
||||
name='Wave Center Playback Volume',index=0
|
||||
|
||||
``name='Wave Center Playback Volume',index=0``
|
||||
----------------------------------------------
|
||||
This control is used to attenuate samples for left and right PCM FX-bus
|
||||
accumulators. ALSA uses accumulators 0 and 1 for left and right PCM samples.
|
||||
The result is mixed to mono signal (single channel) and forwarded to
|
||||
the ??rear?? right DAC PCM slot of the AC97 codec.
|
||||
|
||||
name='Wave LFE Playback Volume',index=0
|
||||
|
||||
``name='Wave LFE Playback Volume',index=0``
|
||||
-------------------------------------------
|
||||
This control is used to attenuate samples for left and right PCM FX-bus
|
||||
accumulators. ALSA uses accumulators 0 and 1 for left and right PCM.
|
||||
The result is mixed to mono signal (single channel) and forwarded to
|
||||
the ??rear?? left DAC PCM slot of the AC97 codec.
|
||||
|
||||
name='Wave Capture Volume',index=0
|
||||
name='Wave Capture Switch',index=0
|
||||
|
||||
``name='Wave Capture Volume',index=0``, ``name='Wave Capture Switch',index=0``
|
||||
------------------------------------------------------------------------------
|
||||
These controls are used to attenuate samples for left and right PCM FX-bus
|
||||
accumulator. ALSA uses accumulators 0 and 1 for left and right PCM.
|
||||
The result is forwarded to the ADC capture FIFO (thus to the standard capture
|
||||
PCM device).
|
||||
|
||||
name='Synth Playback Volume',index=0
|
||||
|
||||
``name='Synth Playback Volume',index=0``
|
||||
----------------------------------------
|
||||
This control is used to attenuate samples for left and right MIDI FX-bus
|
||||
accumulators. ALSA uses accumulators 4 and 5 for left and right MIDI samples.
|
||||
The result samples are forwarded to the front DAC PCM slots of the AC97 codec.
|
||||
|
||||
name='Synth Capture Volume',index=0
|
||||
name='Synth Capture Switch',index=0
|
||||
|
||||
``name='Synth Capture Volume',index=0``, ``name='Synth Capture Switch',index=0``
|
||||
--------------------------------------------------------------------------------
|
||||
These controls are used to attenuate samples for left and right MIDI FX-bus
|
||||
accumulator. ALSA uses accumulators 4 and 5 for left and right PCM.
|
||||
The result is forwarded to the ADC capture FIFO (thus to the standard capture
|
||||
PCM device).
|
||||
|
||||
name='Surround Playback Volume',index=0
|
||||
|
||||
``name='Surround Playback Volume',index=0``
|
||||
-------------------------------------------
|
||||
This control is used to attenuate samples for left and right rear PCM FX-bus
|
||||
accumulators. ALSA uses accumulators 2 and 3 for left and right rear PCM samples.
|
||||
The result samples are forwarded to the rear I2S DACs. These DACs operate
|
||||
separately (they are not inside the AC97 codec).
|
||||
|
||||
name='Surround Capture Volume',index=0
|
||||
name='Surround Capture Switch',index=0
|
||||
|
||||
``name='Surround Capture Volume',index=0``, ``name='Surround Capture Switch',index=0``
|
||||
--------------------------------------------------------------------------------------
|
||||
These controls are used to attenuate samples for left and right rear PCM FX-bus
|
||||
accumulators. ALSA uses accumulators 2 and 3 for left and right rear PCM samples.
|
||||
The result is forwarded to the ADC capture FIFO (thus to the standard capture
|
||||
PCM device).
|
||||
|
||||
name='Center Playback Volume',index=0
|
||||
|
||||
``name='Center Playback Volume',index=0``
|
||||
-----------------------------------------
|
||||
This control is used to attenuate sample for center PCM FX-bus accumulator.
|
||||
ALSA uses accumulator 6 for center PCM sample. The result sample is forwarded
|
||||
to the ??rear?? right DAC PCM slot of the AC97 codec.
|
||||
|
||||
name='LFE Playback Volume',index=0
|
||||
|
||||
``name='LFE Playback Volume',index=0``
|
||||
--------------------------------------
|
||||
This control is used to attenuate sample for center PCM FX-bus accumulator.
|
||||
ALSA uses accumulator 6 for center PCM sample. The result sample is forwarded
|
||||
to the ??rear?? left DAC PCM slot of the AC97 codec.
|
||||
|
||||
name='AC97 Playback Volume',index=0
|
||||
|
||||
``name='AC97 Playback Volume',index=0``
|
||||
---------------------------------------
|
||||
This control is used to attenuate samples for left and right front ADC PCM slots
|
||||
of the AC97 codec. The result samples are forwarded to the front DAC PCM
|
||||
slots of the AC97 codec.
|
||||
********************************************************************************
|
||||
*** Note: This control should be zero for the standard operations, otherwise ***
|
||||
*** a digital loopback is activated. ***
|
||||
********************************************************************************
|
||||
|
||||
name='AC97 Capture Volume',index=0
|
||||
.. note::
|
||||
This control should be zero for the standard operations, otherwise
|
||||
a digital loopback is activated.
|
||||
|
||||
|
||||
``name='AC97 Capture Volume',index=0``
|
||||
--------------------------------------
|
||||
This control is used to attenuate samples for left and right front ADC PCM slots
|
||||
of the AC97 codec. The result is forwarded to the ADC capture FIFO (thus to
|
||||
the standard capture PCM device).
|
||||
********************************************************************************
|
||||
*** Note: This control should be 100 (maximal value), otherwise no analog ***
|
||||
*** inputs of the AC97 codec can be captured (recorded). ***
|
||||
********************************************************************************
|
||||
|
||||
name='IEC958 TTL Playback Volume',index=0
|
||||
.. note::
|
||||
This control should be 100 (maximal value), otherwise no analog
|
||||
inputs of the AC97 codec can be captured (recorded).
|
||||
|
||||
``name='IEC958 TTL Playback Volume',index=0``
|
||||
---------------------------------------------
|
||||
This control is used to attenuate samples from left and right IEC958 TTL
|
||||
digital inputs (usually used by a CDROM drive). The result samples are
|
||||
forwarded to the front DAC PCM slots of the AC97 codec.
|
||||
|
||||
name='IEC958 TTL Capture Volume',index=0
|
||||
|
||||
``name='IEC958 TTL Capture Volume',index=0``
|
||||
--------------------------------------------
|
||||
This control is used to attenuate samples from left and right IEC958 TTL
|
||||
digital inputs (usually used by a CDROM drive). The result samples are
|
||||
forwarded to the ADC capture FIFO (thus to the standard capture PCM device).
|
||||
|
||||
name='Zoom Video Playback Volume',index=0
|
||||
|
||||
``name='Zoom Video Playback Volume',index=0``
|
||||
---------------------------------------------
|
||||
This control is used to attenuate samples from left and right zoom video
|
||||
digital inputs (usually used by a CDROM drive). The result samples are
|
||||
forwarded to the front DAC PCM slots of the AC97 codec.
|
||||
|
||||
name='Zoom Video Capture Volume',index=0
|
||||
|
||||
``name='Zoom Video Capture Volume',index=0``
|
||||
--------------------------------------------
|
||||
This control is used to attenuate samples from left and right zoom video
|
||||
digital inputs (usually used by a CDROM drive). The result samples are
|
||||
forwarded to the ADC capture FIFO (thus to the standard capture PCM device).
|
||||
|
||||
name='IEC958 LiveDrive Playback Volume',index=0
|
||||
|
||||
``name='IEC958 LiveDrive Playback Volume',index=0``
|
||||
---------------------------------------------------
|
||||
This control is used to attenuate samples from left and right IEC958 optical
|
||||
digital input. The result samples are forwarded to the front DAC PCM slots
|
||||
of the AC97 codec.
|
||||
|
||||
name='IEC958 LiveDrive Capture Volume',index=0
|
||||
|
||||
``name='IEC958 LiveDrive Capture Volume',index=0``
|
||||
--------------------------------------------------
|
||||
This control is used to attenuate samples from left and right IEC958 optical
|
||||
digital inputs. The result samples are forwarded to the ADC capture FIFO
|
||||
(thus to the standard capture PCM device).
|
||||
|
||||
name='IEC958 Coaxial Playback Volume',index=0
|
||||
|
||||
``name='IEC958 Coaxial Playback Volume',index=0``
|
||||
-------------------------------------------------
|
||||
This control is used to attenuate samples from left and right IEC958 coaxial
|
||||
digital inputs. The result samples are forwarded to the front DAC PCM slots
|
||||
of the AC97 codec.
|
||||
|
||||
name='IEC958 Coaxial Capture Volume',index=0
|
||||
|
||||
``name='IEC958 Coaxial Capture Volume',index=0``
|
||||
------------------------------------------------
|
||||
This control is used to attenuate samples from left and right IEC958 coaxial
|
||||
digital inputs. The result samples are forwarded to the ADC capture FIFO
|
||||
(thus to the standard capture PCM device).
|
||||
|
||||
name='Line LiveDrive Playback Volume',index=0
|
||||
name='Line LiveDrive Playback Volume',index=1
|
||||
|
||||
``name='Line LiveDrive Playback Volume',index=0``, ``name='Line LiveDrive Playback Volume',index=1``
|
||||
----------------------------------------------------------------------------------------------------
|
||||
This control is used to attenuate samples from left and right I2S ADC
|
||||
inputs (on the LiveDrive). The result samples are forwarded to the front
|
||||
DAC PCM slots of the AC97 codec.
|
||||
|
||||
name='Line LiveDrive Capture Volume',index=1
|
||||
name='Line LiveDrive Capture Volume',index=1
|
||||
|
||||
``name='Line LiveDrive Capture Volume',index=1``, ``name='Line LiveDrive Capture Volume',index=1``
|
||||
--------------------------------------------------------------------------------------------------
|
||||
This control is used to attenuate samples from left and right I2S ADC
|
||||
inputs (on the LiveDrive). The result samples are forwarded to the ADC
|
||||
capture FIFO (thus to the standard capture PCM device).
|
||||
|
||||
name='Tone Control - Switch',index=0
|
||||
|
||||
``name='Tone Control - Switch',index=0``
|
||||
----------------------------------------
|
||||
This control turns the tone control on or off. The samples for front, rear
|
||||
and center / LFE outputs are affected.
|
||||
|
||||
name='Tone Control - Bass',index=0
|
||||
|
||||
``name='Tone Control - Bass',index=0``
|
||||
--------------------------------------
|
||||
This control sets the bass intensity. There is no neutral value!!
|
||||
When the tone control code is activated, the samples are always modified.
|
||||
The closest value to pure signal is 20.
|
||||
|
||||
name='Tone Control - Treble',index=0
|
||||
|
||||
``name='Tone Control - Treble',index=0``
|
||||
----------------------------------------
|
||||
This control sets the treble intensity. There is no neutral value!!
|
||||
When the tone control code is activated, the samples are always modified.
|
||||
The closest value to pure signal is 20.
|
||||
|
||||
name='IEC958 Optical Raw Playback Switch',index=0
|
||||
|
||||
``name='IEC958 Optical Raw Playback Switch',index=0``
|
||||
-----------------------------------------------------
|
||||
If this switch is on, then the samples for the IEC958 (S/PDIF) digital
|
||||
output are taken only from the raw FX8010 PCM, otherwise standard front
|
||||
PCM samples are taken.
|
||||
|
||||
name='Headphone Playback Volume',index=1
|
||||
|
||||
``name='Headphone Playback Volume',index=1``
|
||||
--------------------------------------------
|
||||
This control attenuates the samples for the headphone output.
|
||||
|
||||
name='Headphone Center Playback Switch',index=1
|
||||
|
||||
``name='Headphone Center Playback Switch',index=1``
|
||||
---------------------------------------------------
|
||||
If this switch is on, then the sample for the center PCM is put to the
|
||||
left headphone output (useful for SB Live cards without separate center/LFE
|
||||
output).
|
||||
|
||||
name='Headphone LFE Playback Switch',index=1
|
||||
|
||||
``name='Headphone LFE Playback Switch',index=1``
|
||||
------------------------------------------------
|
||||
If this switch is on, then the sample for the center PCM is put to the
|
||||
right headphone output (useful for SB Live cards without separate center/LFE
|
||||
output).
|
||||
|
||||
|
||||
3) PCM stream related controls
|
||||
------------------------------
|
||||
|
||||
name='EMU10K1 PCM Volume',index 0-31
|
||||
PCM stream related controls
|
||||
===========================
|
||||
|
||||
``name='EMU10K1 PCM Volume',index 0-31``
|
||||
----------------------------------------
|
||||
Channel volume attenuation in range 0-0xffff. The maximum value (no
|
||||
attenuation) is default. The channel mapping for three values is
|
||||
as follows:
|
||||
|
||||
0 - mono, default 0xffff (no attenuation)
|
||||
1 - left, default 0xffff (no attenuation)
|
||||
2 - right, default 0xffff (no attenuation)
|
||||
|
||||
name='EMU10K1 PCM Send Routing',index 0-31
|
||||
* 0 - mono, default 0xffff (no attenuation)
|
||||
* 1 - left, default 0xffff (no attenuation)
|
||||
* 2 - right, default 0xffff (no attenuation)
|
||||
|
||||
``name='EMU10K1 PCM Send Routing',index 0-31``
|
||||
----------------------------------------------
|
||||
This control specifies the destination - FX-bus accumulators. There are
|
||||
twelve values with this mapping:
|
||||
|
||||
0 - mono, A destination (FX-bus 0-15), default 0
|
||||
1 - mono, B destination (FX-bus 0-15), default 1
|
||||
2 - mono, C destination (FX-bus 0-15), default 2
|
||||
3 - mono, D destination (FX-bus 0-15), default 3
|
||||
4 - left, A destination (FX-bus 0-15), default 0
|
||||
5 - left, B destination (FX-bus 0-15), default 1
|
||||
6 - left, C destination (FX-bus 0-15), default 2
|
||||
7 - left, D destination (FX-bus 0-15), default 3
|
||||
8 - right, A destination (FX-bus 0-15), default 0
|
||||
9 - right, B destination (FX-bus 0-15), default 1
|
||||
10 - right, C destination (FX-bus 0-15), default 2
|
||||
11 - right, D destination (FX-bus 0-15), default 3
|
||||
* 0 - mono, A destination (FX-bus 0-15), default 0
|
||||
* 1 - mono, B destination (FX-bus 0-15), default 1
|
||||
* 2 - mono, C destination (FX-bus 0-15), default 2
|
||||
* 3 - mono, D destination (FX-bus 0-15), default 3
|
||||
* 4 - left, A destination (FX-bus 0-15), default 0
|
||||
* 5 - left, B destination (FX-bus 0-15), default 1
|
||||
* 6 - left, C destination (FX-bus 0-15), default 2
|
||||
* 7 - left, D destination (FX-bus 0-15), default 3
|
||||
* 8 - right, A destination (FX-bus 0-15), default 0
|
||||
* 9 - right, B destination (FX-bus 0-15), default 1
|
||||
* 10 - right, C destination (FX-bus 0-15), default 2
|
||||
* 11 - right, D destination (FX-bus 0-15), default 3
|
||||
|
||||
Don't forget that it's illegal to assign a channel to the same FX-bus accumulator
|
||||
more than once (it means 0=0 && 1=0 is an invalid combination).
|
||||
|
||||
name='EMU10K1 PCM Send Volume',index 0-31
|
||||
|
||||
``name='EMU10K1 PCM Send Volume',index 0-31``
|
||||
---------------------------------------------
|
||||
It specifies the attenuation (amount) for given destination in range 0-255.
|
||||
The channel mapping is following:
|
||||
|
||||
0 - mono, A destination attn, default 255 (no attenuation)
|
||||
1 - mono, B destination attn, default 255 (no attenuation)
|
||||
2 - mono, C destination attn, default 0 (mute)
|
||||
3 - mono, D destination attn, default 0 (mute)
|
||||
4 - left, A destination attn, default 255 (no attenuation)
|
||||
5 - left, B destination attn, default 0 (mute)
|
||||
6 - left, C destination attn, default 0 (mute)
|
||||
7 - left, D destination attn, default 0 (mute)
|
||||
8 - right, A destination attn, default 0 (mute)
|
||||
9 - right, B destination attn, default 255 (no attenuation)
|
||||
10 - right, C destination attn, default 0 (mute)
|
||||
11 - right, D destination attn, default 0 (mute)
|
||||
* 0 - mono, A destination attn, default 255 (no attenuation)
|
||||
* 1 - mono, B destination attn, default 255 (no attenuation)
|
||||
* 2 - mono, C destination attn, default 0 (mute)
|
||||
* 3 - mono, D destination attn, default 0 (mute)
|
||||
* 4 - left, A destination attn, default 255 (no attenuation)
|
||||
* 5 - left, B destination attn, default 0 (mute)
|
||||
* 6 - left, C destination attn, default 0 (mute)
|
||||
* 7 - left, D destination attn, default 0 (mute)
|
||||
* 8 - right, A destination attn, default 0 (mute)
|
||||
* 9 - right, B destination attn, default 255 (no attenuation)
|
||||
* 10 - right, C destination attn, default 0 (mute)
|
||||
* 11 - right, D destination attn, default 0 (mute)
|
||||
|
||||
|
||||
|
||||
4) MANUALS/PATENTS:
|
||||
-------------------
|
||||
MANUALS/PATENTS
|
||||
===============
|
||||
|
||||
ftp://opensource.creative.com/pub/doc
|
||||
-------------------------------------
|
||||
|
||||
Files:
|
||||
LM4545.pdf AC97 Codec
|
||||
|
||||
m2049.pdf The EMU10K1 Digital Audio Processor
|
||||
|
||||
hog63.ps FX8010 - A DSP Chip Architecture for Audio Effects
|
||||
LM4545.pdf
|
||||
AC97 Codec
|
||||
m2049.pdf
|
||||
The EMU10K1 Digital Audio Processor
|
||||
hog63.ps
|
||||
FX8010 - A DSP Chip Architecture for Audio Effects
|
||||
|
||||
|
||||
WIPO Patents
|
||||
------------
|
||||
Patent numbers:
|
||||
WO 9901813 (A1) Audio Effects Processor with multiple asynchronous (Jan. 14, 1999)
|
||||
streams
|
||||
|
||||
WO 9901814 (A1) Processor with Instruction Set for Audio Effects (Jan. 14, 1999)
|
||||
WO 9901813 (A1)
|
||||
Audio Effects Processor with multiple asynchronous streams
|
||||
(Jan. 14, 1999)
|
||||
|
||||
WO 9901953 (A1) Audio Effects Processor having Decoupled Instruction
|
||||
Execution and Audio Data Sequencing (Jan. 14, 1999)
|
||||
WO 9901814 (A1)
|
||||
Processor with Instruction Set for Audio Effects (Jan. 14, 1999)
|
||||
|
||||
WO 9901953 (A1)
|
||||
Audio Effects Processor having Decoupled Instruction
|
||||
Execution and Audio Data Sequencing (Jan. 14, 1999)
|
||||
|
||||
|
||||
US Patents (http://www.uspto.gov/)
|
||||
----------------------------------
|
||||
|
||||
US 5925841 Digital Sampling Instrument employing cache memory (Jul. 20, 1999)
|
||||
US 5925841
|
||||
Digital Sampling Instrument employing cache memory (Jul. 20, 1999)
|
||||
|
||||
US 5928342 Audio Effects Processor integrated on a single chip (Jul. 27, 1999)
|
||||
with a multiport memory onto which multiple asynchronous
|
||||
digital sound samples can be concurrently loaded
|
||||
US 5928342
|
||||
Audio Effects Processor integrated on a single chip
|
||||
with a multiport memory onto which multiple asynchronous
|
||||
digital sound samples can be concurrently loaded
|
||||
(Jul. 27, 1999)
|
||||
|
||||
US 5930158 Processor with Instruction Set for Audio Effects (Jul. 27, 1999)
|
||||
US 5930158
|
||||
Processor with Instruction Set for Audio Effects (Jul. 27, 1999)
|
||||
|
||||
US 6032235 Memory initialization circuit (Tram) (Feb. 29, 2000)
|
||||
US 6032235
|
||||
Memory initialization circuit (Tram) (Feb. 29, 2000)
|
||||
|
||||
US 6138207 Interpolation looping of audio samples in cache connected to (Oct. 24, 2000)
|
||||
system bus with prioritization and modification of bus transfers
|
||||
in accordance with loop ends and minimum block sizes
|
||||
US 6138207
|
||||
Interpolation looping of audio samples in cache connected to
|
||||
system bus with prioritization and modification of bus transfers
|
||||
in accordance with loop ends and minimum block sizes
|
||||
(Oct. 24, 2000)
|
||||
|
||||
US 6151670 Method for conserving memory storage using a (Nov. 21, 2000)
|
||||
pool of short term memory registers
|
||||
US 6151670
|
||||
Method for conserving memory storage using a
|
||||
pool of short term memory registers
|
||||
(Nov. 21, 2000)
|
||||
|
||||
US 6195715 Interrupt control for multiple programs communicating with (Feb. 27, 2001)
|
||||
a common interrupt by associating programs to GP registers,
|
||||
defining interrupt register, polling GP registers, and invoking
|
||||
callback routine associated with defined interrupt register
|
||||
US 6195715
|
||||
Interrupt control for multiple programs communicating with
|
||||
a common interrupt by associating programs to GP registers,
|
||||
defining interrupt register, polling GP registers, and invoking
|
||||
callback routine associated with defined interrupt register
|
||||
(Feb. 27, 2001)
|
|
@ -1,14 +1,14 @@
|
|||
|
||||
Serial UART 16450/16550 MIDI driver
|
||||
===================================
|
||||
===================================
|
||||
Serial UART 16450/16550 MIDI driver
|
||||
===================================
|
||||
|
||||
The adaptor module parameter allows you to select either:
|
||||
|
||||
0 - Roland Soundcanvas support (default)
|
||||
1 - Midiator MS-124T support (1)
|
||||
2 - Midiator MS-124W S/A mode (2)
|
||||
3 - MS-124W M/B mode support (3)
|
||||
4 - Generic device with multiple input support (4)
|
||||
* 0 - Roland Soundcanvas support (default)
|
||||
* 1 - Midiator MS-124T support (1)
|
||||
* 2 - Midiator MS-124W S/A mode (2)
|
||||
* 3 - MS-124W M/B mode support (3)
|
||||
* 4 - Generic device with multiple input support (4)
|
||||
|
||||
For the Midiator MS-124W, you must set the physical M-S and A-B
|
||||
switches on the Midiator to match the driver mode you select.
|
||||
|
@ -22,11 +22,13 @@ substream. The driver provides no way to send F5 00 (no selection) or to not
|
|||
send the F5 NN command sequence at all; perhaps it ought to.
|
||||
|
||||
Usage example for simple serial converter:
|
||||
::
|
||||
|
||||
/sbin/setserial /dev/ttyS0 uart none
|
||||
/sbin/modprobe snd-serial-u16550 port=0x3f8 irq=4 speed=115200
|
||||
|
||||
Usage example for Roland SoundCanvas with 4 MIDI ports:
|
||||
::
|
||||
|
||||
/sbin/setserial /dev/ttyS0 uart none
|
||||
/sbin/modprobe snd-serial-u16550 port=0x3f8 irq=4 outs=4
|
||||
|
@ -37,6 +39,7 @@ all four MIDI Out connectors. Set the A-B switch and the speed module
|
|||
parameter to match (A=19200, B=9600).
|
||||
|
||||
Usage example for MS-124T, with A-B switch in A position:
|
||||
::
|
||||
|
||||
/sbin/setserial /dev/ttyS0 uart none
|
||||
/sbin/modprobe snd-serial-u16550 port=0x3f8 irq=4 adaptor=1 \
|
||||
|
@ -47,6 +50,7 @@ the outs module parameter is automatically set to 1. The driver sends
|
|||
the same data to all four MIDI Out connectors at full MIDI speed.
|
||||
|
||||
Usage example for S/A mode:
|
||||
::
|
||||
|
||||
/sbin/setserial /dev/ttyS0 uart none
|
||||
/sbin/modprobe snd-serial-u16550 port=0x3f8 irq=4 adaptor=2
|
||||
|
@ -63,6 +67,7 @@ at most one byte every 520 us, as compared with the full MIDI data rate of
|
|||
one byte every 320 us per port.
|
||||
|
||||
Usage example for M/B mode:
|
||||
::
|
||||
|
||||
/sbin/setserial /dev/ttyS0 uart none
|
||||
/sbin/modprobe snd-serial-u16550 port=0x3f8 irq=4 adaptor=3
|
|
@ -0,0 +1,8 @@
|
|||
=============
|
||||
VIA82xx mixer
|
||||
=============
|
||||
|
||||
On many VIA82xx boards, the ``Input Source Select`` mixer control does not work.
|
||||
Setting it to ``Input2`` on such boards will cause recording to hang, or fail
|
||||
with EIO (input/output error) via OSS emulation. This control should be left
|
||||
at ``Input1`` for such cards.
|
|
@ -1,9 +1,11 @@
|
|||
============================
|
||||
ALSA PCM channel-mapping API
|
||||
============================
|
||||
Takashi Iwai <tiwai@suse.de>
|
||||
|
||||
GENERAL
|
||||
-------
|
||||
Takashi Iwai <tiwai@suse.de>
|
||||
|
||||
General
|
||||
=======
|
||||
|
||||
The channel mapping API allows user to query the possible channel maps
|
||||
and the current channel map, also optionally to modify the channel map
|
||||
|
@ -11,9 +13,9 @@ of the current stream.
|
|||
|
||||
A channel map is an array of position for each PCM channel.
|
||||
Typically, a stereo PCM stream has a channel map of
|
||||
{ front_left, front_right }
|
||||
``{ front_left, front_right }``
|
||||
while a 4.0 surround PCM stream has a channel map of
|
||||
{ front left, front right, rear left, rear right }.
|
||||
``{ front left, front right, rear left, rear right }.``
|
||||
|
||||
The problem, so far, was that we had no standard channel map
|
||||
explicitly, and applications had no way to know which channel
|
||||
|
@ -29,8 +31,8 @@ specification. These are the main motivations for the new channel
|
|||
mapping API.
|
||||
|
||||
|
||||
DESIGN
|
||||
------
|
||||
Design
|
||||
======
|
||||
|
||||
Actually, "the channel mapping API" doesn't introduce anything new in
|
||||
the kernel/user-space ABI perspective. It uses only the existing
|
||||
|
@ -39,10 +41,11 @@ control element features.
|
|||
As a ground design, each PCM substream may contain a control element
|
||||
providing the channel mapping information and configuration. This
|
||||
element is specified by:
|
||||
iface = SNDRV_CTL_ELEM_IFACE_PCM
|
||||
name = "Playback Channel Map" or "Capture Channel Map"
|
||||
device = the same device number for the assigned PCM substream
|
||||
index = the same index number for the assigned PCM substream
|
||||
|
||||
* iface = SNDRV_CTL_ELEM_IFACE_PCM
|
||||
* name = "Playback Channel Map" or "Capture Channel Map"
|
||||
* device = the same device number for the assigned PCM substream
|
||||
* index = the same index number for the assigned PCM substream
|
||||
|
||||
Note the name is different depending on the PCM substream direction.
|
||||
|
||||
|
@ -50,32 +53,35 @@ Each control element provides at least the TLV read operation and the
|
|||
read operation. Optionally, the write operation can be provided to
|
||||
allow user to change the channel map dynamically.
|
||||
|
||||
* TLV
|
||||
TLV
|
||||
---
|
||||
|
||||
The TLV operation gives the list of available channel
|
||||
maps. A list item of a channel map is usually a TLV of
|
||||
type data-bytes ch0 ch1 ch2...
|
||||
``type data-bytes ch0 ch1 ch2...``
|
||||
where type is the TLV type value, the second argument is the total
|
||||
bytes (not the numbers) of channel values, and the rest are the
|
||||
position value for each channel.
|
||||
|
||||
As a TLV type, either SNDRV_CTL_TLVT_CHMAP_FIXED,
|
||||
SNDRV_CTL_TLV_CHMAP_VAR or SNDRV_CTL_TLVT_CHMAP_PAIRED can be used.
|
||||
The _FIXED type is for a channel map with the fixed channel position
|
||||
while the latter two are for flexible channel positions. _VAR type is
|
||||
for a channel map where all channels are freely swappable and _PAIRED
|
||||
As a TLV type, either ``SNDRV_CTL_TLVT_CHMAP_FIXED``,
|
||||
``SNDRV_CTL_TLV_CHMAP_VAR`` or ``SNDRV_CTL_TLVT_CHMAP_PAIRED`` can be used.
|
||||
The ``_FIXED`` type is for a channel map with the fixed channel position
|
||||
while the latter two are for flexible channel positions. ``_VAR`` type is
|
||||
for a channel map where all channels are freely swappable and ``_PAIRED``
|
||||
type is where pair-wise channels are swappable. For example, when you
|
||||
have {FL/FR/RL/RR} channel map, _PAIRED type would allow you to swap
|
||||
only {RL/RR/FL/FR} while _VAR type would allow even swapping FL and
|
||||
have {FL/FR/RL/RR} channel map, ``_PAIRED`` type would allow you to swap
|
||||
only {RL/RR/FL/FR} while ``_VAR`` type would allow even swapping FL and
|
||||
RR.
|
||||
|
||||
These new TLV types are defined in sound/tlv.h.
|
||||
These new TLV types are defined in ``sound/tlv.h``.
|
||||
|
||||
The available channel position values are defined in sound/asound.h,
|
||||
The available channel position values are defined in ``sound/asound.h``,
|
||||
here is a cut:
|
||||
|
||||
/* channel positions */
|
||||
enum {
|
||||
::
|
||||
|
||||
/* channel positions */
|
||||
enum {
|
||||
SNDRV_CHMAP_UNKNOWN = 0,
|
||||
SNDRV_CHMAP_NA, /* N/A, silent */
|
||||
SNDRV_CHMAP_MONO, /* mono stream */
|
||||
|
@ -107,11 +113,13 @@ enum {
|
|||
SNDRV_CHMAP_TRR, /* top rear right */
|
||||
SNDRV_CHMAP_TRC, /* top rear center */
|
||||
SNDRV_CHMAP_LAST = SNDRV_CHMAP_TRC,
|
||||
};
|
||||
};
|
||||
|
||||
When a PCM stream can provide more than one channel map, you can
|
||||
provide multiple channel maps in a TLV container type. The TLV data
|
||||
to be returned will contain such as:
|
||||
::
|
||||
|
||||
SNDRV_CTL_TLVT_CONTAINER 96
|
||||
SNDRV_CTL_TLVT_CHMAP_FIXED 4 SNDRV_CHMAP_FC
|
||||
SNDRV_CTL_TLVT_CHMAP_FIXED 8 SNDRV_CHMAP_FL SNDRV_CHMAP_FR
|
||||
|
@ -120,19 +128,21 @@ to be returned will contain such as:
|
|||
|
||||
The channel position is provided in LSB 16bits. The upper bits are
|
||||
used for bit flags.
|
||||
::
|
||||
|
||||
#define SNDRV_CHMAP_POSITION_MASK 0xffff
|
||||
#define SNDRV_CHMAP_PHASE_INVERSE (0x01 << 16)
|
||||
#define SNDRV_CHMAP_DRIVER_SPEC (0x02 << 16)
|
||||
#define SNDRV_CHMAP_POSITION_MASK 0xffff
|
||||
#define SNDRV_CHMAP_PHASE_INVERSE (0x01 << 16)
|
||||
#define SNDRV_CHMAP_DRIVER_SPEC (0x02 << 16)
|
||||
|
||||
SNDRV_CHMAP_PHASE_INVERSE indicates the channel is phase inverted,
|
||||
``SNDRV_CHMAP_PHASE_INVERSE`` indicates the channel is phase inverted,
|
||||
(thus summing left and right channels would result in almost silence).
|
||||
Some digital mic devices have this.
|
||||
|
||||
When SNDRV_CHMAP_DRIVER_SPEC is set, all the channel position values
|
||||
When ``SNDRV_CHMAP_DRIVER_SPEC`` is set, all the channel position values
|
||||
don't follow the standard definition above but driver-specific.
|
||||
|
||||
* READ OPERATION
|
||||
Read Operation
|
||||
--------------
|
||||
|
||||
The control read operation is for providing the current channel map of
|
||||
the given stream. The control element returns an integer array
|
||||
|
@ -140,9 +150,10 @@ containing the position of each channel.
|
|||
|
||||
When this is performed before the number of the channel is specified
|
||||
(i.e. hw_params is set), it should return all channels set to
|
||||
UNKNOWN.
|
||||
``UNKNOWN``.
|
||||
|
||||
* WRITE OPERATION
|
||||
Write Operation
|
||||
---------------
|
||||
|
||||
The control write operation is optional, and only for devices that can
|
||||
change the channel configuration on the fly, such as HDMI. User needs
|
|
@ -1,10 +1,14 @@
|
|||
compress_offload.txt
|
||||
=====================
|
||||
Pierre-Louis.Bossart <pierre-louis.bossart@linux.intel.com>
|
||||
Vinod Koul <vinod.koul@linux.intel.com>
|
||||
=========================
|
||||
ALSA Compress-Offload API
|
||||
=========================
|
||||
|
||||
Pierre-Louis.Bossart <pierre-louis.bossart@linux.intel.com>
|
||||
|
||||
Vinod Koul <vinod.koul@linux.intel.com>
|
||||
|
||||
|
||||
Overview
|
||||
|
||||
========
|
||||
Since its early days, the ALSA API was defined with PCM support or
|
||||
constant bitrates payloads such as IEC61937 in mind. Arguments and
|
||||
returned values in frames are the norm, making it a challenge to
|
||||
|
@ -27,8 +31,9 @@ Intel Moorestown SOC, with many corrections required to upstream the
|
|||
API in the mainline kernel instead of the staging tree and make it
|
||||
usable by others.
|
||||
|
||||
Requirements
|
||||
|
||||
Requirements
|
||||
============
|
||||
The main requirements are:
|
||||
|
||||
- separation between byte counts and time. Compressed formats may have
|
||||
|
@ -63,7 +68,7 @@ The main requirements are:
|
|||
streaming compressed data to a DSP, with the assumption that the
|
||||
decoded samples are routed to a physical output or logical back-end.
|
||||
|
||||
- Complexity hiding. Existing user-space multimedia frameworks all
|
||||
- Complexity hiding. Existing user-space multimedia frameworks all
|
||||
have existing enums/structures for each compressed format. This new
|
||||
API assumes the existence of a platform-specific compatibility layer
|
||||
to expose, translate and make use of the capabilities of the audio
|
||||
|
@ -72,7 +77,7 @@ The main requirements are:
|
|||
|
||||
|
||||
Design
|
||||
|
||||
======
|
||||
The new API shares a number of concepts with the PCM API for flow
|
||||
control. Start, pause, resume, drain and stop commands have the same
|
||||
semantics no matter what the content is.
|
||||
|
@ -95,43 +100,44 @@ mandatory routines and possibly make use of optional ones.
|
|||
|
||||
The main additions are
|
||||
|
||||
- get_caps
|
||||
This routine returns the list of audio formats supported. Querying the
|
||||
codecs on a capture stream will return encoders, decoders will be
|
||||
listed for playback streams.
|
||||
get_caps
|
||||
This routine returns the list of audio formats supported. Querying the
|
||||
codecs on a capture stream will return encoders, decoders will be
|
||||
listed for playback streams.
|
||||
|
||||
- get_codec_caps For each codec, this routine returns a list of
|
||||
capabilities. The intent is to make sure all the capabilities
|
||||
correspond to valid settings, and to minimize the risks of
|
||||
configuration failures. For example, for a complex codec such as AAC,
|
||||
the number of channels supported may depend on a specific profile. If
|
||||
the capabilities were exposed with a single descriptor, it may happen
|
||||
that a specific combination of profiles/channels/formats may not be
|
||||
supported. Likewise, embedded DSPs have limited memory and cpu cycles,
|
||||
it is likely that some implementations make the list of capabilities
|
||||
dynamic and dependent on existing workloads. In addition to codec
|
||||
settings, this routine returns the minimum buffer size handled by the
|
||||
implementation. This information can be a function of the DMA buffer
|
||||
sizes, the number of bytes required to synchronize, etc, and can be
|
||||
used by userspace to define how much needs to be written in the ring
|
||||
buffer before playback can start.
|
||||
get_codec_caps
|
||||
For each codec, this routine returns a list of
|
||||
capabilities. The intent is to make sure all the capabilities
|
||||
correspond to valid settings, and to minimize the risks of
|
||||
configuration failures. For example, for a complex codec such as AAC,
|
||||
the number of channels supported may depend on a specific profile. If
|
||||
the capabilities were exposed with a single descriptor, it may happen
|
||||
that a specific combination of profiles/channels/formats may not be
|
||||
supported. Likewise, embedded DSPs have limited memory and cpu cycles,
|
||||
it is likely that some implementations make the list of capabilities
|
||||
dynamic and dependent on existing workloads. In addition to codec
|
||||
settings, this routine returns the minimum buffer size handled by the
|
||||
implementation. This information can be a function of the DMA buffer
|
||||
sizes, the number of bytes required to synchronize, etc, and can be
|
||||
used by userspace to define how much needs to be written in the ring
|
||||
buffer before playback can start.
|
||||
|
||||
- set_params
|
||||
This routine sets the configuration chosen for a specific codec. The
|
||||
most important field in the parameters is the codec type; in most
|
||||
cases decoders will ignore other fields, while encoders will strictly
|
||||
comply to the settings
|
||||
set_params
|
||||
This routine sets the configuration chosen for a specific codec. The
|
||||
most important field in the parameters is the codec type; in most
|
||||
cases decoders will ignore other fields, while encoders will strictly
|
||||
comply to the settings
|
||||
|
||||
- get_params
|
||||
This routines returns the actual settings used by the DSP. Changes to
|
||||
the settings should remain the exception.
|
||||
get_params
|
||||
This routines returns the actual settings used by the DSP. Changes to
|
||||
the settings should remain the exception.
|
||||
|
||||
- get_timestamp
|
||||
The timestamp becomes a multiple field structure. It lists the number
|
||||
of bytes transferred, the number of samples processed and the number
|
||||
of samples rendered/grabbed. All these values can be used to determine
|
||||
the average bitrate, figure out if the ring buffer needs to be
|
||||
refilled or the delay due to decoding/encoding/io on the DSP.
|
||||
get_timestamp
|
||||
The timestamp becomes a multiple field structure. It lists the number
|
||||
of bytes transferred, the number of samples processed and the number
|
||||
of samples rendered/grabbed. All these values can be used to determine
|
||||
the average bitrate, figure out if the ring buffer needs to be
|
||||
refilled or the delay due to decoding/encoding/io on the DSP.
|
||||
|
||||
Note that the list of codecs/profiles/modes was derived from the
|
||||
OpenMAX AL specification instead of reinventing the wheel.
|
||||
|
@ -145,6 +151,7 @@ Modifications include:
|
|||
- Addition of encoding options when required (derived from OpenMAX IL)
|
||||
- Addition of rateControlSupported (missing in OpenMAX AL)
|
||||
|
||||
|
||||
Gapless Playback
|
||||
================
|
||||
When playing thru an album, the decoders have the ability to skip the encoder
|
||||
|
@ -162,19 +169,19 @@ switch from one track to another and start using data for second track.
|
|||
|
||||
The main additions are:
|
||||
|
||||
- set_metadata
|
||||
This routine sets the encoder delay and encoder padding. This can be used by
|
||||
decoder to strip the silence. This needs to be set before the data in the track
|
||||
is written.
|
||||
set_metadata
|
||||
This routine sets the encoder delay and encoder padding. This can be used by
|
||||
decoder to strip the silence. This needs to be set before the data in the track
|
||||
is written.
|
||||
|
||||
- set_next_track
|
||||
This routine tells DSP that metadata and write operation sent after this would
|
||||
correspond to subsequent track
|
||||
set_next_track
|
||||
This routine tells DSP that metadata and write operation sent after this would
|
||||
correspond to subsequent track
|
||||
|
||||
- partial drain
|
||||
This is called when end of file is reached. The userspace can inform DSP that
|
||||
EOF is reached and now DSP can start skipping padding delay. Also next write
|
||||
data would belong to next track
|
||||
partial drain
|
||||
This is called when end of file is reached. The userspace can inform DSP that
|
||||
EOF is reached and now DSP can start skipping padding delay. Also next write
|
||||
data would belong to next track
|
||||
|
||||
Sequence flow for gapless would be:
|
||||
- Open
|
||||
|
@ -189,10 +196,12 @@ Sequence flow for gapless would be:
|
|||
- then call partial_drain to flush most of buffer in DSP
|
||||
- Fill data of the next track
|
||||
- DSP switches to second track
|
||||
|
||||
(note: order for partial_drain and write for next track can be reversed as well)
|
||||
|
||||
Not supported:
|
||||
|
||||
Not supported
|
||||
=============
|
||||
- Support for VoIP/circuit-switched calls is not the target of this
|
||||
API. Support for dynamic bit-rate changes would require a tight
|
||||
coupling between the DSP and the host stack, limiting power savings.
|
||||
|
@ -225,7 +234,9 @@ Not supported:
|
|||
rendered output in time, this does not deal with underrun/overrun and
|
||||
maybe dealt in user-library
|
||||
|
||||
Credits:
|
||||
|
||||
Credits
|
||||
=======
|
||||
- Mark Brown and Liam Girdwood for discussions on the need for this API
|
||||
- Harsha Priya for her work on intel_sst compressed API
|
||||
- Rakesh Ughreja for valuable feedback
|
|
@ -0,0 +1,142 @@
|
|||
===========================
|
||||
Standard ALSA Control Names
|
||||
===========================
|
||||
|
||||
This document describes standard names of mixer controls.
|
||||
|
||||
Standard Syntax
|
||||
---------------
|
||||
Syntax: [LOCATION] SOURCE [CHANNEL] [DIRECTION] FUNCTION
|
||||
|
||||
|
||||
DIRECTION
|
||||
~~~~~~~~~
|
||||
================ ===============
|
||||
<nothing> both directions
|
||||
Playback one direction
|
||||
Capture one direction
|
||||
Bypass Playback one direction
|
||||
Bypass Capture one direction
|
||||
================ ===============
|
||||
|
||||
FUNCTION
|
||||
~~~~~~~~
|
||||
======== =================================
|
||||
Switch on/off switch
|
||||
Volume amplifier
|
||||
Route route control, hardware specific
|
||||
======== =================================
|
||||
|
||||
CHANNEL
|
||||
~~~~~~~
|
||||
============ ==================================================
|
||||
<nothing> channel independent, or applies to all channels
|
||||
Front front left/right channels
|
||||
Surround rear left/right in 4.0/5.1 surround
|
||||
CLFE C/LFE channels
|
||||
Center center cannel
|
||||
LFE LFE channel
|
||||
Side side left/right for 7.1 surround
|
||||
============ ==================================================
|
||||
|
||||
LOCATION (Physical location of source)
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
============ =====================
|
||||
Front front position
|
||||
Rear rear position
|
||||
Dock on docking station
|
||||
Internal internal
|
||||
============ =====================
|
||||
|
||||
SOURCE
|
||||
~~~~~~
|
||||
=================== =================================================
|
||||
Master
|
||||
Master Mono
|
||||
Hardware Master
|
||||
Speaker internal speaker
|
||||
Bass Speaker internal LFE speaker
|
||||
Headphone
|
||||
Line Out
|
||||
Beep beep generator
|
||||
Phone
|
||||
Phone Input
|
||||
Phone Output
|
||||
Synth
|
||||
FM
|
||||
Mic
|
||||
Headset Mic mic part of combined headset jack - 4-pin
|
||||
headphone + mic
|
||||
Headphone Mic mic part of either/or - 3-pin headphone or mic
|
||||
Line input only, use "Line Out" for output
|
||||
CD
|
||||
Video
|
||||
Zoom Video
|
||||
Aux
|
||||
PCM
|
||||
PCM Pan
|
||||
Loopback
|
||||
Analog Loopback D/A -> A/D loopback
|
||||
Digital Loopback playback -> capture loopback -
|
||||
without analog path
|
||||
Mono
|
||||
Mono Output
|
||||
Multi
|
||||
ADC
|
||||
Wave
|
||||
Music
|
||||
I2S
|
||||
IEC958
|
||||
HDMI
|
||||
SPDIF output only
|
||||
SPDIF In
|
||||
Digital In
|
||||
HDMI/DP either HDMI or DisplayPort
|
||||
=================== =================================================
|
||||
|
||||
Exceptions (deprecated)
|
||||
-----------------------
|
||||
|
||||
===================================== =======================
|
||||
[Analogue|Digital] Capture Source
|
||||
[Analogue|Digital] Capture Switch aka input gain switch
|
||||
[Analogue|Digital] Capture Volume aka input gain volume
|
||||
[Analogue|Digital] Playback Switch aka output gain switch
|
||||
[Analogue|Digital] Playback Volume aka output gain volume
|
||||
Tone Control - Switch
|
||||
Tone Control - Bass
|
||||
Tone Control - Treble
|
||||
3D Control - Switch
|
||||
3D Control - Center
|
||||
3D Control - Depth
|
||||
3D Control - Wide
|
||||
3D Control - Space
|
||||
3D Control - Level
|
||||
Mic Boost [(?dB)]
|
||||
===================================== =======================
|
||||
|
||||
PCM interface
|
||||
-------------
|
||||
|
||||
=================== ========================================
|
||||
Sample Clock Source { "Word", "Internal", "AutoSync" }
|
||||
Clock Sync Status { "Lock", "Sync", "No Lock" }
|
||||
External Rate external capture rate
|
||||
Capture Rate capture rate taken from external source
|
||||
=================== ========================================
|
||||
|
||||
IEC958 (S/PDIF) interface
|
||||
-------------------------
|
||||
|
||||
============================================ ======================================
|
||||
IEC958 [...] [Playback|Capture] Switch turn on/off the IEC958 interface
|
||||
IEC958 [...] [Playback|Capture] Volume digital volume control
|
||||
IEC958 [...] [Playback|Capture] Default default or global value - read/write
|
||||
IEC958 [...] [Playback|Capture] Mask consumer and professional mask
|
||||
IEC958 [...] [Playback|Capture] Con Mask consumer mask
|
||||
IEC958 [...] [Playback|Capture] Pro Mask professional mask
|
||||
IEC958 [...] [Playback|Capture] PCM Stream the settings assigned to a PCM stream
|
||||
IEC958 Q-subcode [Playback|Capture] Default Q-subcode bits
|
||||
|
||||
IEC958 Preamble [Playback|Capture] Default burst preamble words (4*16bits)
|
||||
============================================ ======================================
|
|
@ -0,0 +1,15 @@
|
|||
Designs and Implementations
|
||||
===========================
|
||||
|
||||
.. toctree::
|
||||
:maxdepth: 2
|
||||
|
||||
control-names
|
||||
channel-mapping-api
|
||||
compress-offload
|
||||
timestamping
|
||||
jack-controls
|
||||
procfile
|
||||
powersave
|
||||
oss-emulation
|
||||
seq-oss
|
|
@ -1,3 +1,7 @@
|
|||
==================
|
||||
ALSA Jack Controls
|
||||
==================
|
||||
|
||||
Why we need Jack kcontrols
|
||||
==========================
|
||||
|
||||
|
@ -29,11 +33,12 @@ How to use jack kcontrols
|
|||
=========================
|
||||
|
||||
In order to keep compatibility, snd_jack_new() has been modified by
|
||||
adding two params :-
|
||||
adding two params:
|
||||
|
||||
- @initial_kctl: if true, create a kcontrol and add it to the jack
|
||||
list.
|
||||
- @phantom_jack: Don't create a input device for phantom jacks.
|
||||
initial_kctl
|
||||
if true, create a kcontrol and add it to the jack list.
|
||||
phantom_jack
|
||||
Don't create a input device for phantom jacks.
|
||||
|
||||
HDA jacks can set phantom_jack to true in order to create a phantom
|
||||
jack and set initial_kctl to true to create an initial kcontrol with
|
|
@ -1,7 +1,8 @@
|
|||
NOTES ON KERNEL OSS-EMULATION
|
||||
=============================
|
||||
=============================
|
||||
Notes on Kernel OSS-Emulation
|
||||
=============================
|
||||
|
||||
Jan. 22, 2004 Takashi Iwai <tiwai@suse.de>
|
||||
Jan. 22, 2004 Takashi Iwai <tiwai@suse.de>
|
||||
|
||||
|
||||
Modules
|
||||
|
@ -14,18 +15,18 @@ When you need to access the OSS PCM, mixer or sequencer devices, the
|
|||
corresponding module has to be loaded.
|
||||
|
||||
These modules are loaded automatically when the corresponding service
|
||||
is called. The alias is defined sound-service-x-y, where x and y are
|
||||
is called. The alias is defined ``sound-service-x-y``, where x and y are
|
||||
the card number and the minor unit number. Usually you don't have to
|
||||
define these aliases by yourself.
|
||||
|
||||
Only necessary step for auto-loading of OSS modules is to define the
|
||||
card alias in /etc/modprobe.d/alsa.conf, such as
|
||||
card alias in ``/etc/modprobe.d/alsa.conf``, such as::
|
||||
|
||||
alias sound-slot-0 snd-emu10k1
|
||||
|
||||
As the second card, define sound-slot-1 as well.
|
||||
As the second card, define ``sound-slot-1`` as well.
|
||||
Note that you can't use the aliased name as the target name (i.e.
|
||||
"alias sound-slot-0 snd-card-0" doesn't work any more like the old
|
||||
``alias sound-slot-0 snd-card-0`` doesn't work any more like the old
|
||||
modutils).
|
||||
|
||||
The currently available OSS configuration is shown in
|
||||
|
@ -42,6 +43,7 @@ Device Mapping
|
|||
==============
|
||||
|
||||
ALSA supports the following OSS device files:
|
||||
::
|
||||
|
||||
PCM:
|
||||
/dev/dspX
|
||||
|
@ -61,48 +63,55 @@ ALSA supports the following OSS device files:
|
|||
where X is the card number from 0 to 7.
|
||||
|
||||
(NOTE: Some distributions have the device files like /dev/midi0 and
|
||||
/dev/midi1. They are NOT for OSS but for tclmidi, which is
|
||||
a totally different thing.)
|
||||
/dev/midi1. They are NOT for OSS but for tclmidi, which is
|
||||
a totally different thing.)
|
||||
|
||||
Unlike the real OSS, ALSA cannot use the device files more than the
|
||||
assigned ones. For example, the first card cannot use /dev/dsp1 or
|
||||
/dev/dsp2, but only /dev/dsp0 and /dev/adsp0.
|
||||
|
||||
As seen above, PCM and MIDI may have two devices. Usually, the first
|
||||
PCM device (hw:0,0 in ALSA) is mapped to /dev/dsp and the secondary
|
||||
device (hw:0,1) to /dev/adsp (if available). For MIDI, /dev/midi and
|
||||
PCM device (``hw:0,0`` in ALSA) is mapped to /dev/dsp and the secondary
|
||||
device (``hw:0,1``) to /dev/adsp (if available). For MIDI, /dev/midi and
|
||||
/dev/amidi, respectively.
|
||||
|
||||
You can change this device mapping via the module options of
|
||||
snd-pcm-oss and snd-rawmidi. In the case of PCM, the following
|
||||
options are available for snd-pcm-oss:
|
||||
|
||||
dsp_map PCM device number assigned to /dev/dspX
|
||||
(default = 0)
|
||||
adsp_map PCM device number assigned to /dev/adspX
|
||||
(default = 1)
|
||||
dsp_map
|
||||
PCM device number assigned to /dev/dspX
|
||||
(default = 0)
|
||||
adsp_map
|
||||
PCM device number assigned to /dev/adspX
|
||||
(default = 1)
|
||||
|
||||
For example, to map the third PCM device (hw:0,2) to /dev/adsp0,
|
||||
For example, to map the third PCM device (``hw:0,2``) to /dev/adsp0,
|
||||
define like this:
|
||||
::
|
||||
|
||||
options snd-pcm-oss adsp_map=2
|
||||
|
||||
The options take arrays. For configuring the second card, specify
|
||||
two entries separated by comma. For example, to map the third PCM
|
||||
device on the second card to /dev/adsp1, define like below:
|
||||
::
|
||||
|
||||
options snd-pcm-oss adsp_map=0,2
|
||||
|
||||
To change the mapping of MIDI devices, the following options are
|
||||
available for snd-rawmidi:
|
||||
|
||||
midi_map MIDI device number assigned to /dev/midi0X
|
||||
(default = 0)
|
||||
amidi_map MIDI device number assigned to /dev/amidi0X
|
||||
(default = 1)
|
||||
midi_map
|
||||
MIDI device number assigned to /dev/midi0X
|
||||
(default = 0)
|
||||
amidi_map
|
||||
MIDI device number assigned to /dev/amidi0X
|
||||
(default = 1)
|
||||
|
||||
For example, to assign the third MIDI device on the first card to
|
||||
/dev/midi00, define as follows:
|
||||
::
|
||||
|
||||
options snd-rawmidi midi_map=2
|
||||
|
||||
|
@ -118,43 +127,52 @@ wine, especially if they use the card only in the MMAP mode.
|
|||
|
||||
In such a case, you can change the behavior of PCM per application by
|
||||
writing a command to the proc file. There is a proc file for each PCM
|
||||
stream, /proc/asound/cardX/pcmY[cp]/oss, where X is the card number
|
||||
(zero-based), Y the PCM device number (zero-based), and 'p' is for
|
||||
playback and 'c' for capture, respectively. Note that this proc file
|
||||
stream, ``/proc/asound/cardX/pcmY[cp]/oss``, where X is the card number
|
||||
(zero-based), Y the PCM device number (zero-based), and ``p`` is for
|
||||
playback and ``c`` for capture, respectively. Note that this proc file
|
||||
exists only after snd-pcm-oss module is loaded.
|
||||
|
||||
The command sequence has the following syntax:
|
||||
::
|
||||
|
||||
app_name fragments fragment_size [options]
|
||||
|
||||
app_name is the name of application with (higher priority) or without
|
||||
``app_name`` is the name of application with (higher priority) or without
|
||||
path.
|
||||
fragments specifies the number of fragments or zero if no specific
|
||||
``fragments`` specifies the number of fragments or zero if no specific
|
||||
number is given.
|
||||
fragment_size is the size of fragment in bytes or zero if not given.
|
||||
options is the optional parameters. The following options are
|
||||
``fragment_size`` is the size of fragment in bytes or zero if not given.
|
||||
``options`` is the optional parameters. The following options are
|
||||
available:
|
||||
|
||||
disable the application tries to open a pcm device for
|
||||
this channel but does not want to use it.
|
||||
direct don't use plugins
|
||||
block force block open mode
|
||||
non-block force non-block open mode
|
||||
partial-frag write also partial fragments (affects playback only)
|
||||
no-silence do not fill silence ahead to avoid clicks
|
||||
disable
|
||||
the application tries to open a pcm device for
|
||||
this channel but does not want to use it.
|
||||
direct
|
||||
don't use plugins
|
||||
block
|
||||
force block open mode
|
||||
non-block
|
||||
force non-block open mode
|
||||
partial-frag
|
||||
write also partial fragments (affects playback only)
|
||||
no-silence
|
||||
do not fill silence ahead to avoid clicks
|
||||
|
||||
The disable option is useful when one stream direction (playback or
|
||||
The ``disable`` option is useful when one stream direction (playback or
|
||||
capture) is not handled correctly by the application although the
|
||||
hardware itself does support both directions.
|
||||
The direct option is used, as mentioned above, to bypass the automatic
|
||||
The ``direct`` option is used, as mentioned above, to bypass the automatic
|
||||
conversion and useful for MMAP-applications.
|
||||
For example, to playback the first PCM device without plugins for
|
||||
quake, send a command via echo like the following:
|
||||
::
|
||||
|
||||
% echo "quake 0 0 direct" > /proc/asound/card0/pcm0p/oss
|
||||
|
||||
While quake wants only playback, you may append the second command
|
||||
to notify driver that only this direction is about to be allocated:
|
||||
::
|
||||
|
||||
% echo "quake 0 0 disable" > /proc/asound/card0/pcm0c/oss
|
||||
|
||||
|
@ -171,10 +189,11 @@ the file when it's busy. The -EBUSY error is returned in this case.
|
|||
This blocking behavior can be changed globally via nonblock_open
|
||||
module option of snd-pcm-oss. For using the blocking mode as default
|
||||
for OSS devices, define like the following:
|
||||
::
|
||||
|
||||
options snd-pcm-oss nonblock_open=0
|
||||
|
||||
The partial-frag and no-silence commands have been added recently.
|
||||
The ``partial-frag`` and ``no-silence`` commands have been added recently.
|
||||
Both commands are for optimization use only. The former command
|
||||
specifies to invoke the write transfer only when the whole fragment is
|
||||
filled. The latter stops writing the silence data ahead
|
||||
|
@ -183,15 +202,18 @@ automatically. Both are disabled as default.
|
|||
You can check the currently defined configuration by reading the proc
|
||||
file. The read image can be sent to the proc file again, hence you
|
||||
can save the current configuration
|
||||
::
|
||||
|
||||
% cat /proc/asound/card0/pcm0p/oss > /somewhere/oss-cfg
|
||||
|
||||
and restore it like
|
||||
::
|
||||
|
||||
% cat /somewhere/oss-cfg > /proc/asound/card0/pcm0p/oss
|
||||
|
||||
Also, for clearing all the current configuration, send "erase" command
|
||||
Also, for clearing all the current configuration, send ``erase`` command
|
||||
as below:
|
||||
::
|
||||
|
||||
% echo "erase" > /proc/asound/card0/pcm0p/oss
|
||||
|
||||
|
@ -211,40 +233,43 @@ automatically.
|
|||
|
||||
As default, ALSA uses the following control for OSS volumes:
|
||||
|
||||
OSS volume ALSA control Index
|
||||
-----------------------------------------------------
|
||||
SOUND_MIXER_VOLUME Master 0
|
||||
SOUND_MIXER_BASS Tone Control - Bass 0
|
||||
SOUND_MIXER_TREBLE Tone Control - Treble 0
|
||||
SOUND_MIXER_SYNTH Synth 0
|
||||
SOUND_MIXER_PCM PCM 0
|
||||
SOUND_MIXER_SPEAKER PC Speaker 0
|
||||
SOUND_MIXER_LINE Line 0
|
||||
SOUND_MIXER_MIC Mic 0
|
||||
SOUND_MIXER_CD CD 0
|
||||
SOUND_MIXER_IMIX Monitor Mix 0
|
||||
SOUND_MIXER_ALTPCM PCM 1
|
||||
SOUND_MIXER_RECLEV (not assigned)
|
||||
SOUND_MIXER_IGAIN Capture 0
|
||||
SOUND_MIXER_OGAIN Playback 0
|
||||
SOUND_MIXER_LINE1 Aux 0
|
||||
SOUND_MIXER_LINE2 Aux 1
|
||||
SOUND_MIXER_LINE3 Aux 2
|
||||
SOUND_MIXER_DIGITAL1 Digital 0
|
||||
SOUND_MIXER_DIGITAL2 Digital 1
|
||||
SOUND_MIXER_DIGITAL3 Digital 2
|
||||
SOUND_MIXER_PHONEIN Phone 0
|
||||
SOUND_MIXER_PHONEOUT Phone 1
|
||||
SOUND_MIXER_VIDEO Video 0
|
||||
SOUND_MIXER_RADIO Radio 0
|
||||
SOUND_MIXER_MONITOR Monitor 0
|
||||
==================== ===================== =====
|
||||
OSS volume ALSA control Index
|
||||
==================== ===================== =====
|
||||
SOUND_MIXER_VOLUME Master 0
|
||||
SOUND_MIXER_BASS Tone Control - Bass 0
|
||||
SOUND_MIXER_TREBLE Tone Control - Treble 0
|
||||
SOUND_MIXER_SYNTH Synth 0
|
||||
SOUND_MIXER_PCM PCM 0
|
||||
SOUND_MIXER_SPEAKER PC Speaker 0
|
||||
SOUND_MIXER_LINE Line 0
|
||||
SOUND_MIXER_MIC Mic 0
|
||||
SOUND_MIXER_CD CD 0
|
||||
SOUND_MIXER_IMIX Monitor Mix 0
|
||||
SOUND_MIXER_ALTPCM PCM 1
|
||||
SOUND_MIXER_RECLEV (not assigned)
|
||||
SOUND_MIXER_IGAIN Capture 0
|
||||
SOUND_MIXER_OGAIN Playback 0
|
||||
SOUND_MIXER_LINE1 Aux 0
|
||||
SOUND_MIXER_LINE2 Aux 1
|
||||
SOUND_MIXER_LINE3 Aux 2
|
||||
SOUND_MIXER_DIGITAL1 Digital 0
|
||||
SOUND_MIXER_DIGITAL2 Digital 1
|
||||
SOUND_MIXER_DIGITAL3 Digital 2
|
||||
SOUND_MIXER_PHONEIN Phone 0
|
||||
SOUND_MIXER_PHONEOUT Phone 1
|
||||
SOUND_MIXER_VIDEO Video 0
|
||||
SOUND_MIXER_RADIO Radio 0
|
||||
SOUND_MIXER_MONITOR Monitor 0
|
||||
==================== ===================== =====
|
||||
|
||||
The second column is the base-string of the corresponding ALSA
|
||||
control. In fact, the controls with "XXX [Playback|Capture]
|
||||
[Volume|Switch]" will be checked in addition.
|
||||
control. In fact, the controls with ``XXX [Playback|Capture]
|
||||
[Volume|Switch]`` will be checked in addition.
|
||||
|
||||
The current assignment of these mixer elements is listed in the proc
|
||||
file, /proc/asound/cardX/oss_mixer, which will be like the following
|
||||
::
|
||||
|
||||
VOLUME "Master" 0
|
||||
BASS "" 0
|
||||
|
@ -261,6 +286,7 @@ corresponding OSS control is not available.
|
|||
For changing the assignment, you can write the configuration to this
|
||||
proc file. For example, to map "Wave Playback" to the PCM volume,
|
||||
send the command like the following:
|
||||
::
|
||||
|
||||
% echo 'VOLUME "Wave Playback" 0' > /proc/asound/card0/oss_mixer
|
||||
|
||||
|
@ -284,12 +310,18 @@ Duplex Streams
|
|||
Note that when attempting to use a single device file for playback and
|
||||
capture, the OSS API provides no way to set the format, sample rate or
|
||||
number of channels different in each direction. Thus
|
||||
::
|
||||
|
||||
io_handle = open("device", O_RDWR)
|
||||
|
||||
will only function correctly if the values are the same in each direction.
|
||||
|
||||
To use different values in the two directions, use both
|
||||
::
|
||||
|
||||
input_handle = open("device", O_RDONLY)
|
||||
output_handle = open("device", O_WRONLY)
|
||||
|
||||
and set the values for the corresponding handle.
|
||||
|
||||
|
||||
|
@ -302,4 +334,3 @@ ICE1712 supports only the unconventional format, interleaved
|
|||
10-channels 24bit (packed in 32bit) format. Therefore you cannot mmap
|
||||
the buffer as the conventional (mono or 2-channels, 8 or 16bit) format
|
||||
on OSS.
|
||||
|
|
@ -1,9 +1,10 @@
|
|||
==========================
|
||||
Notes on Power-Saving Mode
|
||||
==========================
|
||||
|
||||
AC97 and HD-audio drivers have the automatic power-saving mode.
|
||||
This feature is enabled via Kconfig CONFIG_SND_AC97_POWER_SAVE
|
||||
and CONFIG_SND_HDA_POWER_SAVE options, respectively.
|
||||
This feature is enabled via Kconfig ``CONFIG_SND_AC97_POWER_SAVE``
|
||||
and ``CONFIG_SND_HDA_POWER_SAVE`` options, respectively.
|
||||
|
||||
With the automatic power-saving, the driver turns off the codec power
|
||||
appropriately when no operation is required. When no applications use
|
||||
|
@ -11,20 +12,21 @@ the device and/or no analog loopback is set, the power disablement is
|
|||
done fully or partially. It'll save a certain power consumption, thus
|
||||
good for laptops (even for desktops).
|
||||
|
||||
The time-out for automatic power-off can be specified via power_save
|
||||
The time-out for automatic power-off can be specified via ``power_save``
|
||||
module option of snd-ac97-codec and snd-hda-intel modules. Specify
|
||||
the time-out value in seconds. 0 means to disable the automatic
|
||||
power-saving. The default value of timeout is given via
|
||||
CONFIG_SND_AC97_POWER_SAVE_DEFAULT and
|
||||
CONFIG_SND_HDA_POWER_SAVE_DEFAULT Kconfig options. Setting this to 1
|
||||
``CONFIG_SND_AC97_POWER_SAVE_DEFAULT`` and
|
||||
``CONFIG_SND_HDA_POWER_SAVE_DEFAULT`` Kconfig options. Setting this to 1
|
||||
(the minimum value) isn't recommended because many applications try to
|
||||
reopen the device frequently. 10 would be a good choice for normal
|
||||
operations.
|
||||
|
||||
The power_save option is exported as writable. This means you can
|
||||
The ``power_save`` option is exported as writable. This means you can
|
||||
adjust the value via sysfs on the fly. For example, to turn on the
|
||||
automatic power-save mode with 10 seconds, write to
|
||||
/sys/modules/snd_ac97_codec/parameters/power_save (usually as root):
|
||||
``/sys/modules/snd_ac97_codec/parameters/power_save`` (usually as root):
|
||||
::
|
||||
|
||||
# echo 10 > /sys/modules/snd_ac97_codec/parameters/power_save
|
||||
|
|
@ -1,20 +1,22 @@
|
|||
Proc Files of ALSA Drivers
|
||||
==========================
|
||||
Takashi Iwai <tiwai@suse.de>
|
||||
==========================
|
||||
Proc Files of ALSA Drivers
|
||||
==========================
|
||||
|
||||
Takashi Iwai <tiwai@suse.de>
|
||||
|
||||
General
|
||||
-------
|
||||
=======
|
||||
|
||||
ALSA has its own proc tree, /proc/asound. Many useful information are
|
||||
found in this tree. When you encounter a problem and need debugging,
|
||||
check the files listed in the following sections.
|
||||
|
||||
Each card has its subtree cardX, where X is from 0 to 7. The
|
||||
card-specific files are stored in the card* subdirectories.
|
||||
card-specific files are stored in the ``card*`` subdirectories.
|
||||
|
||||
|
||||
Global Information
|
||||
------------------
|
||||
==================
|
||||
|
||||
cards
|
||||
Shows the list of currently configured ALSA drivers,
|
||||
|
@ -31,15 +33,15 @@ devices
|
|||
|
||||
meminfo
|
||||
Shows the status of allocated pages via ALSA drivers.
|
||||
Appears only when CONFIG_SND_DEBUG=y.
|
||||
Appears only when ``CONFIG_SND_DEBUG=y``.
|
||||
|
||||
hwdep
|
||||
Lists the currently available hwdep devices in format of
|
||||
<card>-<device>: <name>
|
||||
``<card>-<device>: <name>``
|
||||
|
||||
pcm
|
||||
Lists the currently available PCM devices in format of
|
||||
<card>-<device>: <id>: <name> : <sub-streams>
|
||||
``<card>-<device>: <id>: <name> : <sub-streams>``
|
||||
|
||||
timer
|
||||
Lists the currently available timer devices
|
||||
|
@ -54,23 +56,23 @@ oss/sndstat
|
|||
|
||||
|
||||
Card Specific Files
|
||||
-------------------
|
||||
===================
|
||||
|
||||
The card-specific files are found in /proc/asound/card* directories.
|
||||
The card-specific files are found in ``/proc/asound/card*`` directories.
|
||||
Some drivers (e.g. cmipci) have their own proc entries for the
|
||||
register dump, etc (e.g. /proc/asound/card*/cmipci shows the register
|
||||
register dump, etc (e.g. ``/proc/asound/card*/cmipci`` shows the register
|
||||
dump). These files would be really helpful for debugging.
|
||||
|
||||
When PCM devices are available on this card, you can see directories
|
||||
like pcm0p or pcm1c. They hold the PCM information for each PCM
|
||||
stream. The number after 'pcm' is the PCM device number from 0, and
|
||||
the last 'p' or 'c' means playback or capture direction. The files in
|
||||
stream. The number after ``pcm`` is the PCM device number from 0, and
|
||||
the last ``p`` or ``c`` means playback or capture direction. The files in
|
||||
this subtree is described later.
|
||||
|
||||
The status of MIDI I/O is found in midi* files. It shows the device
|
||||
The status of MIDI I/O is found in ``midi*`` files. It shows the device
|
||||
name and the received/transmitted bytes through the MIDI device.
|
||||
|
||||
When the card is equipped with AC97 codecs, there are codec97#*
|
||||
When the card is equipped with AC97 codecs, there are ``codec97#*``
|
||||
subdirectories (described later).
|
||||
|
||||
When the OSS mixer emulation is enabled (and the module is loaded),
|
||||
|
@ -81,26 +83,27 @@ details.
|
|||
|
||||
|
||||
PCM Proc Files
|
||||
--------------
|
||||
==============
|
||||
|
||||
card*/pcm*/info
|
||||
``card*/pcm*/info``
|
||||
The general information of this PCM device: card #, device #,
|
||||
substreams, etc.
|
||||
|
||||
card*/pcm*/xrun_debug
|
||||
This file appears when CONFIG_SND_DEBUG=y and
|
||||
CONFIG_PCM_XRUN_DEBUG=y.
|
||||
``card*/pcm*/xrun_debug``
|
||||
This file appears when ``CONFIG_SND_DEBUG=y`` and
|
||||
``CONFIG_PCM_XRUN_DEBUG=y``.
|
||||
This shows the status of xrun (= buffer overrun/xrun) and
|
||||
invalid PCM position debug/check of ALSA PCM middle layer.
|
||||
It takes an integer value, can be changed by writing to this
|
||||
file, such as
|
||||
file, such as::
|
||||
|
||||
# echo 5 > /proc/asound/card0/pcm0p/xrun_debug
|
||||
|
||||
The value consists of the following bit flags:
|
||||
bit 0 = Enable XRUN/jiffies debug messages
|
||||
bit 1 = Show stack trace at XRUN / jiffies check
|
||||
bit 2 = Enable additional jiffies check
|
||||
|
||||
* bit 0 = Enable XRUN/jiffies debug messages
|
||||
* bit 1 = Show stack trace at XRUN / jiffies check
|
||||
* bit 2 = Enable additional jiffies check
|
||||
|
||||
When the bit 0 is set, the driver will show the messages to
|
||||
kernel log when an xrun is detected. The debug message is
|
||||
|
@ -117,72 +120,74 @@ card*/pcm*/xrun_debug
|
|||
buggy) hardware that doesn't give smooth pointer updates.
|
||||
This feature is enabled via the bit 2.
|
||||
|
||||
card*/pcm*/sub*/info
|
||||
``card*/pcm*/sub*/info``
|
||||
The general information of this PCM sub-stream.
|
||||
|
||||
card*/pcm*/sub*/status
|
||||
``card*/pcm*/sub*/status``
|
||||
The current status of this PCM sub-stream, elapsed time,
|
||||
H/W position, etc.
|
||||
|
||||
card*/pcm*/sub*/hw_params
|
||||
``card*/pcm*/sub*/hw_params``
|
||||
The hardware parameters set for this sub-stream.
|
||||
|
||||
card*/pcm*/sub*/sw_params
|
||||
``card*/pcm*/sub*/sw_params``
|
||||
The soft parameters set for this sub-stream.
|
||||
|
||||
card*/pcm*/sub*/prealloc
|
||||
``card*/pcm*/sub*/prealloc``
|
||||
The buffer pre-allocation information.
|
||||
|
||||
card*/pcm*/sub*/xrun_injection
|
||||
``card*/pcm*/sub*/xrun_injection``
|
||||
Triggers an XRUN to the running stream when any value is
|
||||
written to this proc file. Used for fault injection.
|
||||
This entry is write-only.
|
||||
|
||||
AC97 Codec Information
|
||||
----------------------
|
||||
======================
|
||||
|
||||
card*/codec97#*/ac97#?-?
|
||||
``card*/codec97#*/ac97#?-?``
|
||||
Shows the general information of this AC97 codec chip, such as
|
||||
name, capabilities, set up.
|
||||
|
||||
card*/codec97#0/ac97#?-?+regs
|
||||
``card*/codec97#0/ac97#?-?+regs``
|
||||
Shows the AC97 register dump. Useful for debugging.
|
||||
|
||||
When CONFIG_SND_DEBUG is enabled, you can write to this file for
|
||||
changing an AC97 register directly. Pass two hex numbers.
|
||||
For example,
|
||||
|
||||
::
|
||||
|
||||
# echo 02 9f1f > /proc/asound/card0/codec97#0/ac97#0-0+regs
|
||||
|
||||
|
||||
USB Audio Streams
|
||||
-----------------
|
||||
=================
|
||||
|
||||
card*/stream*
|
||||
``card*/stream*``
|
||||
Shows the assignment and the current status of each audio stream
|
||||
of the given card. This information is very useful for debugging.
|
||||
|
||||
|
||||
HD-Audio Codecs
|
||||
---------------
|
||||
===============
|
||||
|
||||
card*/codec#*
|
||||
``card*/codec#*``
|
||||
Shows the general codec information and the attribute of each
|
||||
widget node.
|
||||
|
||||
card*/eld#*
|
||||
``card*/eld#*``
|
||||
Available for HDMI or DisplayPort interfaces.
|
||||
Shows ELD(EDID Like Data) info retrieved from the attached HDMI sink,
|
||||
and describes its audio capabilities and configurations.
|
||||
|
||||
Some ELD fields may be modified by doing `echo name hex_value > eld#*`.
|
||||
Some ELD fields may be modified by doing ``echo name hex_value > eld#*``.
|
||||
Only do this if you are sure the HDMI sink provided value is wrong.
|
||||
And if that makes your HDMI audio work, please report to us so that we
|
||||
can fix it in future kernel releases.
|
||||
|
||||
|
||||
Sequencer Information
|
||||
---------------------
|
||||
=====================
|
||||
|
||||
seq/drivers
|
||||
Lists the currently available ALSA sequencer drivers.
|
||||
|
@ -203,7 +208,7 @@ seq/oss
|
|||
|
||||
|
||||
Help For Debugging?
|
||||
-------------------
|
||||
===================
|
||||
|
||||
When the problem is related with PCM, first try to turn on xrun_debug
|
||||
mode. This will give you the kernel messages when and where xrun
|
||||
|
@ -211,24 +216,23 @@ happened.
|
|||
|
||||
If it's really a bug, report it with the following information:
|
||||
|
||||
- the name of the driver/card, show in /proc/asound/cards
|
||||
- the register dump, if available (e.g. card*/cmipci)
|
||||
- the name of the driver/card, show in ``/proc/asound/cards``
|
||||
- the register dump, if available (e.g. ``card*/cmipci``)
|
||||
|
||||
when it's a PCM problem,
|
||||
|
||||
- set-up of PCM, shown in hw_parms, sw_params, and status in the PCM
|
||||
sub-stream directory
|
||||
- set-up of PCM, shown in hw_parms, sw_params, and status in the PCM
|
||||
sub-stream directory
|
||||
|
||||
when it's a mixer problem,
|
||||
|
||||
- AC97 proc files, codec97#*/* files
|
||||
- AC97 proc files, ``codec97#*/*`` files
|
||||
|
||||
for USB audio/midi,
|
||||
|
||||
- output of lsusb -v
|
||||
- stream* files in card directory
|
||||
- output of ``lsusb -v``
|
||||
- ``stream*`` files in card directory
|
||||
|
||||
|
||||
The ALSA bug-tracking system is found at:
|
||||
|
||||
https://bugtrack.alsa-project.org/alsa-bug/
|
||||
https://bugtrack.alsa-project.org/alsa-bug/
|
|
@ -0,0 +1,371 @@
|
|||
===============================
|
||||
OSS Sequencer Emulation on ALSA
|
||||
===============================
|
||||
|
||||
Copyright (c) 1998,1999 by Takashi Iwai
|
||||
|
||||
ver.0.1.8; Nov. 16, 1999
|
||||
|
||||
Description
|
||||
===========
|
||||
|
||||
This directory contains the OSS sequencer emulation driver on ALSA. Note
|
||||
that this program is still in the development state.
|
||||
|
||||
What this does - it provides the emulation of the OSS sequencer, access
|
||||
via ``/dev/sequencer`` and ``/dev/music`` devices.
|
||||
The most of applications using OSS can run if the appropriate ALSA
|
||||
sequencer is prepared.
|
||||
|
||||
The following features are emulated by this driver:
|
||||
|
||||
* Normal sequencer and MIDI events:
|
||||
|
||||
They are converted to the ALSA sequencer events, and sent to the
|
||||
corresponding port.
|
||||
|
||||
* Timer events:
|
||||
|
||||
The timer is not selectable by ioctl. The control rate is fixed to
|
||||
100 regardless of HZ. That is, even on Alpha system, a tick is always
|
||||
1/100 second. The base rate and tempo can be changed in ``/dev/music``.
|
||||
|
||||
* Patch loading:
|
||||
|
||||
It purely depends on the synth drivers whether it's supported since
|
||||
the patch loading is realized by callback to the synth driver.
|
||||
|
||||
* I/O controls:
|
||||
|
||||
Most of controls are accepted. Some controls
|
||||
are dependent on the synth driver, as well as even on original OSS.
|
||||
|
||||
Furthermore, you can find the following advanced features:
|
||||
|
||||
* Better queue mechanism:
|
||||
|
||||
The events are queued before processing them.
|
||||
|
||||
* Multiple applications:
|
||||
|
||||
You can run two or more applications simultaneously (even for OSS
|
||||
sequencer)!
|
||||
However, each MIDI device is exclusive - that is, if a MIDI device
|
||||
is opened once by some application, other applications can't use
|
||||
it. No such a restriction in synth devices.
|
||||
|
||||
* Real-time event processing:
|
||||
|
||||
The events can be processed in real time without using out of bound
|
||||
ioctl. To switch to real-time mode, send ABSTIME 0 event. The followed
|
||||
events will be processed in real-time without queued. To switch off the
|
||||
real-time mode, send RELTIME 0 event.
|
||||
|
||||
* ``/proc`` interface:
|
||||
|
||||
The status of applications and devices can be shown via
|
||||
``/proc/asound/seq/oss`` at any time. In the later version,
|
||||
configuration will be changed via ``/proc`` interface, too.
|
||||
|
||||
|
||||
Installation
|
||||
============
|
||||
|
||||
Run configure script with both sequencer support (``--with-sequencer=yes``)
|
||||
and OSS emulation (``--with-oss=yes``) options. A module ``snd-seq-oss.o``
|
||||
will be created. If the synth module of your sound card supports for OSS
|
||||
emulation (so far, only Emu8000 driver), this module will be loaded
|
||||
automatically.
|
||||
Otherwise, you need to load this module manually.
|
||||
|
||||
At beginning, this module probes all the MIDI ports which have been
|
||||
already connected to the sequencer. Once after that, the creation and deletion
|
||||
of ports are watched by announcement mechanism of ALSA sequencer.
|
||||
|
||||
The available synth and MIDI devices can be found in proc interface.
|
||||
Run ``cat /proc/asound/seq/oss``, and check the devices. For example,
|
||||
if you use an AWE64 card, you'll see like the following:
|
||||
::
|
||||
|
||||
OSS sequencer emulation version 0.1.8
|
||||
ALSA client number 63
|
||||
ALSA receiver port 0
|
||||
|
||||
Number of applications: 0
|
||||
|
||||
Number of synth devices: 1
|
||||
synth 0: [EMU8000]
|
||||
type 0x1 : subtype 0x20 : voices 32
|
||||
capabilties : ioctl enabled / load_patch enabled
|
||||
|
||||
Number of MIDI devices: 3
|
||||
midi 0: [Emu8000 Port-0] ALSA port 65:0
|
||||
capability write / opened none
|
||||
|
||||
midi 1: [Emu8000 Port-1] ALSA port 65:1
|
||||
capability write / opened none
|
||||
|
||||
midi 2: [0: MPU-401 (UART)] ALSA port 64:0
|
||||
capability read/write / opened none
|
||||
|
||||
Note that the device number may be different from the information of
|
||||
``/proc/asound/oss-devices`` or ones of the original OSS driver.
|
||||
Use the device number listed in ``/proc/asound/seq/oss``
|
||||
to play via OSS sequencer emulation.
|
||||
|
||||
Using Synthesizer Devices
|
||||
=========================
|
||||
|
||||
Run your favorite program. I've tested playmidi-2.4, awemidi-0.4.3, gmod-3.1
|
||||
and xmp-1.1.5. You can load samples via ``/dev/sequencer`` like sfxload,
|
||||
too.
|
||||
|
||||
If the lowlevel driver supports multiple access to synth devices (like
|
||||
Emu8000 driver), two or more applications are allowed to run at the same
|
||||
time.
|
||||
|
||||
Using MIDI Devices
|
||||
==================
|
||||
|
||||
So far, only MIDI output was tested. MIDI input was not checked at all,
|
||||
but hopefully it will work. Use the device number listed in
|
||||
``/proc/asound/seq/oss``.
|
||||
Be aware that these numbers are mostly different from the list in
|
||||
``/proc/asound/oss-devices``.
|
||||
|
||||
Module Options
|
||||
==============
|
||||
|
||||
The following module options are available:
|
||||
|
||||
maxqlen
|
||||
specifies the maximum read/write queue length. This queue is private
|
||||
for OSS sequencer, so that it is independent from the queue length of ALSA
|
||||
sequencer. Default value is 1024.
|
||||
|
||||
seq_oss_debug
|
||||
specifies the debug level and accepts zero (= no debug message) or
|
||||
positive integer. Default value is 0.
|
||||
|
||||
Queue Mechanism
|
||||
===============
|
||||
|
||||
OSS sequencer emulation uses an ALSA priority queue. The
|
||||
events from ``/dev/sequencer`` are processed and put onto the queue
|
||||
specified by module option.
|
||||
|
||||
All the events from ``/dev/sequencer`` are parsed at beginning.
|
||||
The timing events are also parsed at this moment, so that the events may
|
||||
be processed in real-time. Sending an event ABSTIME 0 switches the operation
|
||||
mode to real-time mode, and sending an event RELTIME 0 switches it off.
|
||||
In the real-time mode, all events are dispatched immediately.
|
||||
|
||||
The queued events are dispatched to the corresponding ALSA sequencer
|
||||
ports after scheduled time by ALSA sequencer dispatcher.
|
||||
|
||||
If the write-queue is full, the application sleeps until a certain amount
|
||||
(as default one half) becomes empty in blocking mode. The synchronization
|
||||
to write timing was implemented, too.
|
||||
|
||||
The input from MIDI devices or echo-back events are stored on read FIFO
|
||||
queue. If application reads ``/dev/sequencer`` in blocking mode, the
|
||||
process will be awaked.
|
||||
|
||||
Interface to Synthesizer Device
|
||||
===============================
|
||||
|
||||
Registration
|
||||
------------
|
||||
|
||||
To register an OSS synthesizer device, use snd_seq_oss_synth_register()
|
||||
function:
|
||||
::
|
||||
|
||||
int snd_seq_oss_synth_register(char *name, int type, int subtype, int nvoices,
|
||||
snd_seq_oss_callback_t *oper, void *private_data)
|
||||
|
||||
The arguments ``name``, ``type``, ``subtype`` and ``nvoices``
|
||||
are used for making the appropriate synth_info structure for ioctl. The
|
||||
return value is an index number of this device. This index must be remembered
|
||||
for unregister. If registration is failed, -errno will be returned.
|
||||
|
||||
To release this device, call snd_seq_oss_synth_unregister() function:
|
||||
::
|
||||
|
||||
int snd_seq_oss_synth_unregister(int index)
|
||||
|
||||
where the ``index`` is the index number returned by register function.
|
||||
|
||||
Callbacks
|
||||
---------
|
||||
|
||||
OSS synthesizer devices have capability for sample downloading and ioctls
|
||||
like sample reset. In OSS emulation, these special features are realized
|
||||
by using callbacks. The registration argument oper is used to specify these
|
||||
callbacks. The following callback functions must be defined:
|
||||
::
|
||||
|
||||
snd_seq_oss_callback_t:
|
||||
int (*open)(snd_seq_oss_arg_t *p, void *closure);
|
||||
int (*close)(snd_seq_oss_arg_t *p);
|
||||
int (*ioctl)(snd_seq_oss_arg_t *p, unsigned int cmd, unsigned long arg);
|
||||
int (*load_patch)(snd_seq_oss_arg_t *p, int format, const char *buf, int offs, int count);
|
||||
int (*reset)(snd_seq_oss_arg_t *p);
|
||||
|
||||
Except for ``open`` and ``close`` callbacks, they are allowed to be NULL.
|
||||
|
||||
Each callback function takes the argument type ``snd_seq_oss_arg_t`` as the
|
||||
first argument.
|
||||
::
|
||||
|
||||
struct snd_seq_oss_arg_t {
|
||||
int app_index;
|
||||
int file_mode;
|
||||
int seq_mode;
|
||||
snd_seq_addr_t addr;
|
||||
void *private_data;
|
||||
int event_passing;
|
||||
};
|
||||
|
||||
The first three fields, ``app_index``, ``file_mode`` and ``seq_mode``
|
||||
are initialized by OSS sequencer. The ``app_index`` is the application
|
||||
index which is unique to each application opening OSS sequencer. The
|
||||
``file_mode`` is bit-flags indicating the file operation mode. See
|
||||
``seq_oss.h`` for its meaning. The ``seq_mode`` is sequencer operation
|
||||
mode. In the current version, only ``SND_OSSSEQ_MODE_SYNTH`` is used.
|
||||
|
||||
The next two fields, ``addr`` and ``private_data``, must be
|
||||
filled by the synth driver at open callback. The ``addr`` contains
|
||||
the address of ALSA sequencer port which is assigned to this device. If
|
||||
the driver allocates memory for ``private_data``, it must be released
|
||||
in close callback by itself.
|
||||
|
||||
The last field, ``event_passing``, indicates how to translate note-on
|
||||
/ off events. In ``PROCESS_EVENTS`` mode, the note 255 is regarded
|
||||
as velocity change, and key pressure event is passed to the port. In
|
||||
``PASS_EVENTS`` mode, all note on/off events are passed to the port
|
||||
without modified. ``PROCESS_KEYPRESS`` mode checks the note above 128
|
||||
and regards it as key pressure event (mainly for Emu8000 driver).
|
||||
|
||||
Open Callback
|
||||
-------------
|
||||
|
||||
The ``open`` is called at each time this device is opened by an application
|
||||
using OSS sequencer. This must not be NULL. Typically, the open callback
|
||||
does the following procedure:
|
||||
|
||||
#. Allocate private data record.
|
||||
#. Create an ALSA sequencer port.
|
||||
#. Set the new port address on ``arg->addr``.
|
||||
#. Set the private data record pointer on ``arg->private_data``.
|
||||
|
||||
Note that the type bit-flags in port_info of this synth port must NOT contain
|
||||
``TYPE_MIDI_GENERIC``
|
||||
bit. Instead, ``TYPE_SPECIFIC`` should be used. Also, ``CAP_SUBSCRIPTION``
|
||||
bit should NOT be included, too. This is necessary to tell it from other
|
||||
normal MIDI devices. If the open procedure succeeded, return zero. Otherwise,
|
||||
return -errno.
|
||||
|
||||
Ioctl Callback
|
||||
--------------
|
||||
|
||||
The ``ioctl`` callback is called when the sequencer receives device-specific
|
||||
ioctls. The following two ioctls should be processed by this callback:
|
||||
|
||||
IOCTL_SEQ_RESET_SAMPLES
|
||||
reset all samples on memory -- return 0
|
||||
|
||||
IOCTL_SYNTH_MEMAVL
|
||||
return the available memory size
|
||||
|
||||
FM_4OP_ENABLE
|
||||
can be ignored usually
|
||||
|
||||
The other ioctls are processed inside the sequencer without passing to
|
||||
the lowlevel driver.
|
||||
|
||||
Load_Patch Callback
|
||||
-------------------
|
||||
|
||||
The ``load_patch`` callback is used for sample-downloading. This callback
|
||||
must read the data on user-space and transfer to each device. Return 0
|
||||
if succeeded, and -errno if failed. The format argument is the patch key
|
||||
in patch_info record. The buf is user-space pointer where patch_info record
|
||||
is stored. The offs can be ignored. The count is total data size of this
|
||||
sample data.
|
||||
|
||||
Close Callback
|
||||
--------------
|
||||
|
||||
The ``close`` callback is called when this device is closed by the
|
||||
application. If any private data was allocated in open callback, it must
|
||||
be released in the close callback. The deletion of ALSA port should be
|
||||
done here, too. This callback must not be NULL.
|
||||
|
||||
Reset Callback
|
||||
--------------
|
||||
|
||||
The ``reset`` callback is called when sequencer device is reset or
|
||||
closed by applications. The callback should turn off the sounds on the
|
||||
relevant port immediately, and initialize the status of the port. If this
|
||||
callback is undefined, OSS seq sends a ``HEARTBEAT`` event to the
|
||||
port.
|
||||
|
||||
Events
|
||||
======
|
||||
|
||||
Most of the events are processed by sequencer and translated to the adequate
|
||||
ALSA sequencer events, so that each synth device can receive by input_event
|
||||
callback of ALSA sequencer port. The following ALSA events should be
|
||||
implemented by the driver:
|
||||
|
||||
============= ===================
|
||||
ALSA event Original OSS events
|
||||
============= ===================
|
||||
NOTEON SEQ_NOTEON, MIDI_NOTEON
|
||||
NOTE SEQ_NOTEOFF, MIDI_NOTEOFF
|
||||
KEYPRESS MIDI_KEY_PRESSURE
|
||||
CHANPRESS SEQ_AFTERTOUCH, MIDI_CHN_PRESSURE
|
||||
PGMCHANGE SEQ_PGMCHANGE, MIDI_PGM_CHANGE
|
||||
PITCHBEND SEQ_CONTROLLER(CTRL_PITCH_BENDER),
|
||||
MIDI_PITCH_BEND
|
||||
CONTROLLER MIDI_CTL_CHANGE,
|
||||
SEQ_BALANCE (with CTL_PAN)
|
||||
CONTROL14 SEQ_CONTROLLER
|
||||
REGPARAM SEQ_CONTROLLER(CTRL_PITCH_BENDER_RANGE)
|
||||
SYSEX SEQ_SYSEX
|
||||
============= ===================
|
||||
|
||||
The most of these behavior can be realized by MIDI emulation driver
|
||||
included in the Emu8000 lowlevel driver. In the future release, this module
|
||||
will be independent.
|
||||
|
||||
Some OSS events (``SEQ_PRIVATE`` and ``SEQ_VOLUME`` events) are passed as event
|
||||
type SND_SEQ_OSS_PRIVATE. The OSS sequencer passes these event 8 byte
|
||||
packets without any modification. The lowlevel driver should process these
|
||||
events appropriately.
|
||||
|
||||
Interface to MIDI Device
|
||||
========================
|
||||
|
||||
Since the OSS emulation probes the creation and deletion of ALSA MIDI
|
||||
sequencer ports automatically by receiving announcement from ALSA
|
||||
sequencer, the MIDI devices don't need to be registered explicitly
|
||||
like synth devices.
|
||||
However, the MIDI port_info registered to ALSA sequencer must include
|
||||
a group name ``SND_SEQ_GROUP_DEVICE`` and a capability-bit
|
||||
``CAP_READ`` or ``CAP_WRITE``. Also, subscription capabilities,
|
||||
``CAP_SUBS_READ`` or ``CAP_SUBS_WRITE``, must be defined, too. If
|
||||
these conditions are not satisfied, the port is not registered as OSS
|
||||
sequencer MIDI device.
|
||||
|
||||
The events via MIDI devices are parsed in OSS sequencer and converted
|
||||
to the corresponding ALSA sequencer events. The input from MIDI sequencer
|
||||
is also converted to MIDI byte events by OSS sequencer. This works just
|
||||
a reverse way of seq_midi module.
|
||||
|
||||
Known Problems / TODO's
|
||||
=======================
|
||||
|
||||
* Patch loading via ALSA instrument layer is not implemented yet.
|
||||
|
|
@ -1,18 +1,22 @@
|
|||
=====================
|
||||
ALSA PCM Timestamping
|
||||
=====================
|
||||
|
||||
The ALSA API can provide two different system timestamps:
|
||||
|
||||
- Trigger_tstamp is the system time snapshot taken when the .trigger
|
||||
callback is invoked. This snapshot is taken by the ALSA core in the
|
||||
general case, but specific hardware may have synchronization
|
||||
capabilities or conversely may only be able to provide a correct
|
||||
estimate with a delay. In the latter two cases, the low-level driver
|
||||
is responsible for updating the trigger_tstamp at the most appropriate
|
||||
and precise moment. Applications should not rely solely on the first
|
||||
trigger_tstamp but update their internal calculations if the driver
|
||||
provides a refined estimate with a delay.
|
||||
callback is invoked. This snapshot is taken by the ALSA core in the
|
||||
general case, but specific hardware may have synchronization
|
||||
capabilities or conversely may only be able to provide a correct
|
||||
estimate with a delay. In the latter two cases, the low-level driver
|
||||
is responsible for updating the trigger_tstamp at the most appropriate
|
||||
and precise moment. Applications should not rely solely on the first
|
||||
trigger_tstamp but update their internal calculations if the driver
|
||||
provides a refined estimate with a delay.
|
||||
|
||||
- tstamp is the current system timestamp updated during the last
|
||||
event or application query.
|
||||
The difference (tstamp - trigger_tstamp) defines the elapsed time.
|
||||
event or application query.
|
||||
The difference (tstamp - trigger_tstamp) defines the elapsed time.
|
||||
|
||||
The ALSA API provides two basic pieces of information, avail
|
||||
and delay, which combined with the trigger and current system
|
||||
|
@ -22,15 +26,15 @@ the ring buffer and the amount of queued samples.
|
|||
The use of these different pointers and time information depends on
|
||||
the application needs:
|
||||
|
||||
- 'avail' reports how much can be written in the ring buffer
|
||||
- 'delay' reports the time it will take to hear a new sample after all
|
||||
queued samples have been played out.
|
||||
- ``avail`` reports how much can be written in the ring buffer
|
||||
- ``delay`` reports the time it will take to hear a new sample after all
|
||||
queued samples have been played out.
|
||||
|
||||
When timestamps are enabled, the avail/delay information is reported
|
||||
along with a snapshot of system time. Applications can select from
|
||||
CLOCK_REALTIME (NTP corrections including going backwards),
|
||||
CLOCK_MONOTONIC (NTP corrections but never going backwards),
|
||||
CLOCK_MONOTIC_RAW (without NTP corrections) and change the mode
|
||||
``CLOCK_REALTIME`` (NTP corrections including going backwards),
|
||||
``CLOCK_MONOTONIC`` (NTP corrections but never going backwards),
|
||||
``CLOCK_MONOTIC_RAW`` (without NTP corrections) and change the mode
|
||||
dynamically with sw_params
|
||||
|
||||
|
||||
|
@ -38,17 +42,18 @@ The ALSA API also provide an audio_tstamp which reflects the passage
|
|||
of time as measured by different components of audio hardware. In
|
||||
ascii-art, this could be represented as follows (for the playback
|
||||
case):
|
||||
::
|
||||
|
||||
--------------------------------------------------------------> time
|
||||
^ ^ ^ ^ ^
|
||||
| | | | |
|
||||
analog link dma app FullBuffer
|
||||
time time time time time
|
||||
| | | | |
|
||||
|< codec delay >|<--hw delay-->|<queued samples>|<---avail->|
|
||||
|<----------------- delay---------------------->| |
|
||||
|<----ring buffer length---->|
|
||||
|
||||
--------------------------------------------------------------> time
|
||||
^ ^ ^ ^ ^
|
||||
| | | | |
|
||||
analog link dma app FullBuffer
|
||||
time time time time time
|
||||
| | | | |
|
||||
|< codec delay >|<--hw delay-->|<queued samples>|<---avail->|
|
||||
|<----------------- delay---------------------->| |
|
||||
|<----ring buffer length---->|
|
||||
|
||||
The analog time is taken at the last stage of the playback, as close
|
||||
as possible to the actual transducer
|
||||
|
@ -113,11 +118,11 @@ audio applications...
|
|||
|
||||
Due to the varied nature of timestamping needs, even for a single
|
||||
application, the audio_tstamp_config can be changed dynamically. In
|
||||
the STATUS ioctl, the parameters are read-only and do not allow for
|
||||
the ``STATUS`` ioctl, the parameters are read-only and do not allow for
|
||||
any application selection. To work around this limitation without
|
||||
impacting legacy applications, a new STATUS_EXT ioctl is introduced
|
||||
impacting legacy applications, a new ``STATUS_EXT`` ioctl is introduced
|
||||
with read/write parameters. ALSA-lib will be modified to make use of
|
||||
STATUS_EXT and effectively deprecate STATUS.
|
||||
``STATUS_EXT`` and effectively deprecate ``STATUS``.
|
||||
|
||||
The ALSA API only allows for a single audio timestamp to be reported
|
||||
at a time. This is a conscious design decision, reading the audio
|
||||
|
@ -135,36 +140,42 @@ the hardware, there is a risk of misalignment with the avail and delay
|
|||
information. To make sure applications are not confused, a
|
||||
driver_timestamp field is added in the snd_pcm_status structure; this
|
||||
timestamp shows when the information is put together by the driver
|
||||
before returning from the STATUS and STATUS_EXT ioctl. in most cases
|
||||
before returning from the ``STATUS`` and ``STATUS_EXT`` ioctl. in most cases
|
||||
this driver_timestamp will be identical to the regular system tstamp.
|
||||
|
||||
Examples of typestamping with HDaudio:
|
||||
|
||||
1. DMA timestamp, no compensation for DMA+analog delay
|
||||
$ ./audio_time -p --ts_type=1
|
||||
playback: systime: 341121338 nsec, audio time 342000000 nsec, systime delta -878662
|
||||
playback: systime: 426236663 nsec, audio time 427187500 nsec, systime delta -950837
|
||||
playback: systime: 597080580 nsec, audio time 598000000 nsec, systime delta -919420
|
||||
playback: systime: 682059782 nsec, audio time 683020833 nsec, systime delta -961051
|
||||
playback: systime: 852896415 nsec, audio time 853854166 nsec, systime delta -957751
|
||||
playback: systime: 937903344 nsec, audio time 938854166 nsec, systime delta -950822
|
||||
::
|
||||
|
||||
$ ./audio_time -p --ts_type=1
|
||||
playback: systime: 341121338 nsec, audio time 342000000 nsec, systime delta -878662
|
||||
playback: systime: 426236663 nsec, audio time 427187500 nsec, systime delta -950837
|
||||
playback: systime: 597080580 nsec, audio time 598000000 nsec, systime delta -919420
|
||||
playback: systime: 682059782 nsec, audio time 683020833 nsec, systime delta -961051
|
||||
playback: systime: 852896415 nsec, audio time 853854166 nsec, systime delta -957751
|
||||
playback: systime: 937903344 nsec, audio time 938854166 nsec, systime delta -950822
|
||||
|
||||
2. DMA timestamp, compensation for DMA+analog delay
|
||||
$ ./audio_time -p --ts_type=1 -d
|
||||
playback: systime: 341053347 nsec, audio time 341062500 nsec, systime delta -9153
|
||||
playback: systime: 426072447 nsec, audio time 426062500 nsec, systime delta 9947
|
||||
playback: systime: 596899518 nsec, audio time 596895833 nsec, systime delta 3685
|
||||
playback: systime: 681915317 nsec, audio time 681916666 nsec, systime delta -1349
|
||||
playback: systime: 852741306 nsec, audio time 852750000 nsec, systime delta -8694
|
||||
::
|
||||
|
||||
$ ./audio_time -p --ts_type=1 -d
|
||||
playback: systime: 341053347 nsec, audio time 341062500 nsec, systime delta -9153
|
||||
playback: systime: 426072447 nsec, audio time 426062500 nsec, systime delta 9947
|
||||
playback: systime: 596899518 nsec, audio time 596895833 nsec, systime delta 3685
|
||||
playback: systime: 681915317 nsec, audio time 681916666 nsec, systime delta -1349
|
||||
playback: systime: 852741306 nsec, audio time 852750000 nsec, systime delta -8694
|
||||
|
||||
3. link timestamp, compensation for DMA+analog delay
|
||||
$ ./audio_time -p --ts_type=2 -d
|
||||
playback: systime: 341060004 nsec, audio time 341062791 nsec, systime delta -2787
|
||||
playback: systime: 426242074 nsec, audio time 426244875 nsec, systime delta -2801
|
||||
playback: systime: 597080992 nsec, audio time 597084583 nsec, systime delta -3591
|
||||
playback: systime: 682084512 nsec, audio time 682088291 nsec, systime delta -3779
|
||||
playback: systime: 852936229 nsec, audio time 852940916 nsec, systime delta -4687
|
||||
playback: systime: 938107562 nsec, audio time 938112708 nsec, systime delta -5146
|
||||
::
|
||||
|
||||
$ ./audio_time -p --ts_type=2 -d
|
||||
playback: systime: 341060004 nsec, audio time 341062791 nsec, systime delta -2787
|
||||
playback: systime: 426242074 nsec, audio time 426244875 nsec, systime delta -2801
|
||||
playback: systime: 597080992 nsec, audio time 597084583 nsec, systime delta -3591
|
||||
playback: systime: 682084512 nsec, audio time 682088291 nsec, systime delta -3779
|
||||
playback: systime: 852936229 nsec, audio time 852940916 nsec, systime delta -4687
|
||||
playback: systime: 938107562 nsec, audio time 938112708 nsec, systime delta -5146
|
||||
|
||||
Example 1 shows that the timestamp at the DMA level is close to 1ms
|
||||
ahead of the actual playback time (as a side time this sort of
|
||||
|
@ -181,20 +192,24 @@ shows how compensating for the delay exposes a 1ms accuracy (due to
|
|||
the use of the frame counter by the driver)
|
||||
|
||||
Example 3: DMA timestamp, no compensation for delay, delta of ~5ms
|
||||
$ ./audio_time -p -Dhw:1 -t1
|
||||
playback: systime: 120174019 nsec, audio time 125000000 nsec, systime delta -4825981
|
||||
playback: systime: 245041136 nsec, audio time 250000000 nsec, systime delta -4958864
|
||||
playback: systime: 370106088 nsec, audio time 375000000 nsec, systime delta -4893912
|
||||
playback: systime: 495040065 nsec, audio time 500000000 nsec, systime delta -4959935
|
||||
playback: systime: 620038179 nsec, audio time 625000000 nsec, systime delta -4961821
|
||||
playback: systime: 745087741 nsec, audio time 750000000 nsec, systime delta -4912259
|
||||
playback: systime: 870037336 nsec, audio time 875000000 nsec, systime delta -4962664
|
||||
::
|
||||
|
||||
$ ./audio_time -p -Dhw:1 -t1
|
||||
playback: systime: 120174019 nsec, audio time 125000000 nsec, systime delta -4825981
|
||||
playback: systime: 245041136 nsec, audio time 250000000 nsec, systime delta -4958864
|
||||
playback: systime: 370106088 nsec, audio time 375000000 nsec, systime delta -4893912
|
||||
playback: systime: 495040065 nsec, audio time 500000000 nsec, systime delta -4959935
|
||||
playback: systime: 620038179 nsec, audio time 625000000 nsec, systime delta -4961821
|
||||
playback: systime: 745087741 nsec, audio time 750000000 nsec, systime delta -4912259
|
||||
playback: systime: 870037336 nsec, audio time 875000000 nsec, systime delta -4962664
|
||||
|
||||
Example 4: DMA timestamp, compensation for delay, delay of ~1ms
|
||||
$ ./audio_time -p -Dhw:1 -t1 -d
|
||||
playback: systime: 120190520 nsec, audio time 120000000 nsec, systime delta 190520
|
||||
playback: systime: 245036740 nsec, audio time 244000000 nsec, systime delta 1036740
|
||||
playback: systime: 370034081 nsec, audio time 369000000 nsec, systime delta 1034081
|
||||
playback: systime: 495159907 nsec, audio time 494000000 nsec, systime delta 1159907
|
||||
playback: systime: 620098824 nsec, audio time 619000000 nsec, systime delta 1098824
|
||||
playback: systime: 745031847 nsec, audio time 744000000 nsec, systime delta 1031847
|
||||
::
|
||||
|
||||
$ ./audio_time -p -Dhw:1 -t1 -d
|
||||
playback: systime: 120190520 nsec, audio time 120000000 nsec, systime delta 190520
|
||||
playback: systime: 245036740 nsec, audio time 244000000 nsec, systime delta 1036740
|
||||
playback: systime: 370034081 nsec, audio time 369000000 nsec, systime delta 1034081
|
||||
playback: systime: 495159907 nsec, audio time 494000000 nsec, systime delta 1159907
|
||||
playback: systime: 620098824 nsec, audio time 619000000 nsec, systime delta 1098824
|
||||
playback: systime: 745031847 nsec, audio time 744000000 nsec, systime delta 1031847
|
|
@ -1,16 +1,21 @@
|
|||
======================================
|
||||
HD-Audio Codec-Specific Mixer Controls
|
||||
======================================
|
||||
|
||||
|
||||
This file explains the codec-specific mixer controls.
|
||||
|
||||
Realtek codecs
|
||||
--------------
|
||||
|
||||
* Channel Mode
|
||||
Channel Mode
|
||||
This is an enum control to change the surround-channel setup,
|
||||
appears only when the surround channels are available.
|
||||
It gives the number of channels to be used, "2ch", "4ch", "6ch",
|
||||
and "8ch". According to the configuration, this also controls the
|
||||
jack-retasking of multi-I/O jacks.
|
||||
|
||||
* Auto-Mute Mode
|
||||
Auto-Mute Mode
|
||||
This is an enum control to change the auto-mute behavior of the
|
||||
headphone and line-out jacks. If built-in speakers and headphone
|
||||
and/or line-out jacks are available on a machine, this controls
|
||||
|
@ -30,24 +35,24 @@ Realtek codecs
|
|||
IDT/Sigmatel codecs
|
||||
-------------------
|
||||
|
||||
* Analog Loopback
|
||||
Analog Loopback
|
||||
This control enables/disables the analog-loopback circuit. This
|
||||
appears only when "loopback" is set to true in a codec hint
|
||||
(see HD-Audio.txt). Note that on some codecs the analog-loopback
|
||||
and the normal PCM playback are exclusive, i.e. when this is on, you
|
||||
won't hear any PCM stream.
|
||||
|
||||
* Swap Center/LFE
|
||||
Swap Center/LFE
|
||||
Swaps the center and LFE channel order. Normally, the left
|
||||
corresponds to the center and the right to the LFE. When this is
|
||||
ON, the left to the LFE and the right to the center.
|
||||
|
||||
* Headphone as Line Out
|
||||
Headphone as Line Out
|
||||
When this control is ON, treat the headphone jacks as line-out
|
||||
jacks. That is, the headphone won't auto-mute the other line-outs,
|
||||
and no HP-amp is set to the pins.
|
||||
|
||||
* Mic Jack Mode, Line Jack Mode, etc
|
||||
Mic Jack Mode, Line Jack Mode, etc
|
||||
These enum controls the direction and the bias of the input jack
|
||||
pins. Depending on the jack type, it can set as "Mic In" and "Line
|
||||
In", for determining the input bias, or it can be set to "Line Out"
|
||||
|
@ -57,19 +62,19 @@ IDT/Sigmatel codecs
|
|||
VIA codecs
|
||||
----------
|
||||
|
||||
* Smart 5.1
|
||||
Smart 5.1
|
||||
An enum control to re-task the multi-I/O jacks for surround outputs.
|
||||
When it's ON, the corresponding input jacks (usually a line-in and a
|
||||
mic-in) are switched as the surround and the CLFE output jacks.
|
||||
|
||||
* Independent HP
|
||||
Independent HP
|
||||
When this enum control is enabled, the headphone output is routed
|
||||
from an individual stream (the third PCM such as hw:0,2) instead of
|
||||
the primary stream. In the case the headphone DAC is shared with a
|
||||
side or a CLFE-channel DAC, the DAC is switched to the headphone
|
||||
automatically.
|
||||
|
||||
* Loopback Mixing
|
||||
Loopback Mixing
|
||||
An enum control to determine whether the analog-loopback route is
|
||||
enabled or not. When it's enabled, the analog-loopback is mixed to
|
||||
the front-channel. Also, the same route is used for the headphone
|
||||
|
@ -78,7 +83,7 @@ VIA codecs
|
|||
headphones and speakers because there is only one DAC connected to a
|
||||
mixer widget.
|
||||
|
||||
* Dynamic Power-Control
|
||||
Dynamic Power-Control
|
||||
This control determines whether the dynamic power-control per jack
|
||||
detection is enabled or not. When enabled, the widgets power state
|
||||
(D0/D3) are changed dynamically depending on the jack plugging
|
||||
|
@ -86,7 +91,7 @@ VIA codecs
|
|||
doesn't provide a proper jack-detection, this won't work; in such a
|
||||
case, turn this control OFF.
|
||||
|
||||
* Jack Detect
|
||||
Jack Detect
|
||||
This control is provided only for VT1708 codec which gives no proper
|
||||
unsolicited event per jack plug. When this is on, the driver polls
|
||||
the jack detection so that the headphone auto-mute can work, while
|
||||
|
@ -96,21 +101,21 @@ VIA codecs
|
|||
Conexant codecs
|
||||
---------------
|
||||
|
||||
* Auto-Mute Mode
|
||||
Auto-Mute Mode
|
||||
See Reatek codecs.
|
||||
|
||||
|
||||
Analog codecs
|
||||
--------------
|
||||
|
||||
* Channel Mode
|
||||
Channel Mode
|
||||
This is an enum control to change the surround-channel setup,
|
||||
appears only when the surround channels are available.
|
||||
It gives the number of channels to be used, "2ch", "4ch" and "6ch".
|
||||
According to the configuration, this also controls the
|
||||
jack-retasking of multi-I/O jacks.
|
||||
|
||||
* Independent HP
|
||||
Independent HP
|
||||
When this enum control is enabled, the headphone output is routed
|
||||
from an individual stream (the third PCM such as hw:0,2) instead of
|
||||
the primary stream.
|
|
@ -1,3 +1,7 @@
|
|||
=======================
|
||||
HD-Audio DP-MST Support
|
||||
=======================
|
||||
|
||||
To support DP MST audio, HD Audio hdmi codec driver introduces virtual pin
|
||||
and dynamic pcm assignment.
|
||||
|
||||
|
@ -44,10 +48,12 @@ Build Jack
|
|||
----------
|
||||
|
||||
- dyn_pcm_assign
|
||||
Will not use hda_jack but use snd_jack in spec->pcm_rec[pcm_idx].jack directly.
|
||||
|
||||
Will not use hda_jack but use snd_jack in spec->pcm_rec[pcm_idx].jack directly.
|
||||
|
||||
- !dyn_pcm_assign
|
||||
Use hda_jack and assign spec->pcm_rec[pcm_idx].jack = jack->jack statically.
|
||||
|
||||
Use hda_jack and assign spec->pcm_rec[pcm_idx].jack = jack->jack statically.
|
||||
|
||||
|
||||
Unsolicited Event Enabling
|
||||
|
@ -58,16 +64,20 @@ Enable unsolicited event if !acomp.
|
|||
Monitor Hotplug Event Handling
|
||||
------------------------------
|
||||
- acomp
|
||||
pin_eld_notify() -> check_presence_and_report() -> hdmi_present_sense() ->
|
||||
sync_eld_via_acomp().
|
||||
Use directly snd_jack_report() on spec->pcm_rec[pcm_idx].jack for
|
||||
both dyn_pcm_assign and !dyn_pcm_assign
|
||||
|
||||
pin_eld_notify() -> check_presence_and_report() -> hdmi_present_sense() ->
|
||||
sync_eld_via_acomp().
|
||||
|
||||
Use directly snd_jack_report() on spec->pcm_rec[pcm_idx].jack for
|
||||
both dyn_pcm_assign and !dyn_pcm_assign
|
||||
|
||||
- !acomp
|
||||
Hdmi_unsol_event() -> hdmi_intrinsic_event() -> check_presence_and_report() ->
|
||||
hdmi_present_sense() -> hdmi_prepsent_sense_via_verbs()
|
||||
Use directly snd_jack_report() on spec->pcm_rec[pcm_idx].jack for dyn_pcm_assign.
|
||||
Use hda_jack mechanism to handle jack events.
|
||||
|
||||
hdmi_unsol_event() -> hdmi_intrinsic_event() -> check_presence_and_report() ->
|
||||
hdmi_present_sense() -> hdmi_prepsent_sense_via_verbs()
|
||||
|
||||
Use directly snd_jack_report() on spec->pcm_rec[pcm_idx].jack for dyn_pcm_assign.
|
||||
Use hda_jack mechanism to handle jack events.
|
||||
|
||||
|
||||
Others to be added later
|
|
@ -0,0 +1,10 @@
|
|||
HD-Audio
|
||||
========
|
||||
|
||||
.. toctree::
|
||||
:maxdepth: 2
|
||||
|
||||
notes
|
||||
models
|
||||
controls
|
||||
dp-mst
|
|
@ -0,0 +1,518 @@
|
|||
==============================
|
||||
HD-Audio Codec-Specific Models
|
||||
==============================
|
||||
|
||||
ALC880
|
||||
======
|
||||
3stack
|
||||
3-jack in back and a headphone out
|
||||
3stack-digout
|
||||
3-jack in back, a HP out and a SPDIF out
|
||||
5stack
|
||||
5-jack in back, 2-jack in front
|
||||
5stack-digout
|
||||
5-jack in back, 2-jack in front, a SPDIF out
|
||||
6stack
|
||||
6-jack in back, 2-jack in front
|
||||
6stack-digout
|
||||
6-jack with a SPDIF out
|
||||
|
||||
ALC260
|
||||
======
|
||||
gpio1
|
||||
Enable GPIO1
|
||||
coef
|
||||
Enable EAPD via COEF table
|
||||
fujitsu
|
||||
Quirk for FSC S7020
|
||||
fujitsu-jwse
|
||||
Quirk for FSC S7020 with jack modes and HP mic support
|
||||
|
||||
ALC262
|
||||
======
|
||||
inv-dmic
|
||||
Inverted internal mic workaround
|
||||
|
||||
ALC267/268
|
||||
==========
|
||||
inv-dmic
|
||||
Inverted internal mic workaround
|
||||
hp-eapd
|
||||
Disable HP EAPD on NID 0x15
|
||||
|
||||
ALC22x/23x/25x/269/27x/28x/29x (and vendor-specific ALC3xxx models)
|
||||
===================================================================
|
||||
laptop-amic
|
||||
Laptops with analog-mic input
|
||||
laptop-dmic
|
||||
Laptops with digital-mic input
|
||||
alc269-dmic
|
||||
Enable ALC269(VA) digital mic workaround
|
||||
alc271-dmic
|
||||
Enable ALC271X digital mic workaround
|
||||
inv-dmic
|
||||
Inverted internal mic workaround
|
||||
headset-mic
|
||||
Indicates a combined headset (headphone+mic) jack
|
||||
headset-mode
|
||||
More comprehensive headset support for ALC269 & co
|
||||
headset-mode-no-hp-mic
|
||||
Headset mode support without headphone mic
|
||||
lenovo-dock
|
||||
Enables docking station I/O for some Lenovos
|
||||
hp-gpio-led
|
||||
GPIO LED support on HP laptops
|
||||
dell-headset-multi
|
||||
Headset jack, which can also be used as mic-in
|
||||
dell-headset-dock
|
||||
Headset jack (without mic-in), and also dock I/O
|
||||
alc283-dac-wcaps
|
||||
Fixups for Chromebook with ALC283
|
||||
alc283-sense-combo
|
||||
Combo jack sensing on ALC283
|
||||
tpt440-dock
|
||||
Pin configs for Lenovo Thinkpad Dock support
|
||||
|
||||
ALC66x/67x/892
|
||||
==============
|
||||
mario
|
||||
Chromebook mario model fixup
|
||||
asus-mode1
|
||||
ASUS
|
||||
asus-mode2
|
||||
ASUS
|
||||
asus-mode3
|
||||
ASUS
|
||||
asus-mode4
|
||||
ASUS
|
||||
asus-mode5
|
||||
ASUS
|
||||
asus-mode6
|
||||
ASUS
|
||||
asus-mode7
|
||||
ASUS
|
||||
asus-mode8
|
||||
ASUS
|
||||
inv-dmic
|
||||
Inverted internal mic workaround
|
||||
dell-headset-multi
|
||||
Headset jack, which can also be used as mic-in
|
||||
|
||||
ALC680
|
||||
======
|
||||
N/A
|
||||
|
||||
ALC88x/898/1150
|
||||
======================
|
||||
acer-aspire-4930g
|
||||
Acer Aspire 4930G/5930G/6530G/6930G/7730G
|
||||
acer-aspire-8930g
|
||||
Acer Aspire 8330G/6935G
|
||||
acer-aspire
|
||||
Acer Aspire others
|
||||
inv-dmic
|
||||
Inverted internal mic workaround
|
||||
no-primary-hp
|
||||
VAIO Z/VGC-LN51JGB workaround (for fixed speaker DAC)
|
||||
|
||||
ALC861/660
|
||||
==========
|
||||
N/A
|
||||
|
||||
ALC861VD/660VD
|
||||
==============
|
||||
N/A
|
||||
|
||||
CMI9880
|
||||
=======
|
||||
minimal
|
||||
3-jack in back
|
||||
min_fp
|
||||
3-jack in back, 2-jack in front
|
||||
full
|
||||
6-jack in back, 2-jack in front
|
||||
full_dig
|
||||
6-jack in back, 2-jack in front, SPDIF I/O
|
||||
allout
|
||||
5-jack in back, 2-jack in front, SPDIF out
|
||||
auto
|
||||
auto-config reading BIOS (default)
|
||||
|
||||
AD1882 / AD1882A
|
||||
================
|
||||
3stack
|
||||
3-stack mode
|
||||
3stack-automute
|
||||
3-stack with automute front HP (default)
|
||||
6stack
|
||||
6-stack mode
|
||||
|
||||
AD1884A / AD1883 / AD1984A / AD1984B
|
||||
====================================
|
||||
desktop 3-stack desktop (default)
|
||||
laptop laptop with HP jack sensing
|
||||
mobile mobile devices with HP jack sensing
|
||||
thinkpad Lenovo Thinkpad X300
|
||||
touchsmart HP Touchsmart
|
||||
|
||||
AD1884
|
||||
======
|
||||
N/A
|
||||
|
||||
AD1981
|
||||
======
|
||||
basic 3-jack (default)
|
||||
hp HP nx6320
|
||||
thinkpad Lenovo Thinkpad T60/X60/Z60
|
||||
toshiba Toshiba U205
|
||||
|
||||
AD1983
|
||||
======
|
||||
N/A
|
||||
|
||||
AD1984
|
||||
======
|
||||
basic default configuration
|
||||
thinkpad Lenovo Thinkpad T61/X61
|
||||
dell_desktop Dell T3400
|
||||
|
||||
AD1986A
|
||||
=======
|
||||
3stack
|
||||
3-stack, shared surrounds
|
||||
laptop
|
||||
2-channel only (FSC V2060, Samsung M50)
|
||||
laptop-imic
|
||||
2-channel with built-in mic
|
||||
eapd
|
||||
Turn on EAPD constantly
|
||||
|
||||
AD1988/AD1988B/AD1989A/AD1989B
|
||||
==============================
|
||||
6stack
|
||||
6-jack
|
||||
6stack-dig
|
||||
ditto with SPDIF
|
||||
3stack
|
||||
3-jack
|
||||
3stack-dig
|
||||
ditto with SPDIF
|
||||
laptop
|
||||
3-jack with hp-jack automute
|
||||
laptop-dig
|
||||
ditto with SPDIF
|
||||
auto
|
||||
auto-config reading BIOS (default)
|
||||
|
||||
Conexant 5045
|
||||
=============
|
||||
laptop-hpsense
|
||||
Laptop with HP sense (old model laptop)
|
||||
laptop-micsense
|
||||
Laptop with Mic sense (old model fujitsu)
|
||||
laptop-hpmicsense
|
||||
Laptop with HP and Mic senses
|
||||
benq
|
||||
Benq R55E
|
||||
laptop-hp530
|
||||
HP 530 laptop
|
||||
test
|
||||
for testing/debugging purpose, almost all controls can be
|
||||
adjusted. Appearing only when compiled with $CONFIG_SND_DEBUG=y
|
||||
|
||||
Conexant 5047
|
||||
=============
|
||||
laptop
|
||||
Basic Laptop config
|
||||
laptop-hp
|
||||
Laptop config for some HP models (subdevice 30A5)
|
||||
laptop-eapd
|
||||
Laptop config with EAPD support
|
||||
test
|
||||
for testing/debugging purpose, almost all controls can be
|
||||
adjusted. Appearing only when compiled with $CONFIG_SND_DEBUG=y
|
||||
|
||||
Conexant 5051
|
||||
=============
|
||||
laptop
|
||||
Basic Laptop config (default)
|
||||
hp
|
||||
HP Spartan laptop
|
||||
hp-dv6736
|
||||
HP dv6736
|
||||
hp-f700
|
||||
HP Compaq Presario F700
|
||||
ideapad
|
||||
Lenovo IdeaPad laptop
|
||||
toshiba
|
||||
Toshiba Satellite M300
|
||||
|
||||
Conexant 5066
|
||||
=============
|
||||
laptop
|
||||
Basic Laptop config (default)
|
||||
hp-laptop
|
||||
HP laptops, e g G60
|
||||
asus
|
||||
Asus K52JU, Lenovo G560
|
||||
dell-laptop
|
||||
Dell laptops
|
||||
dell-vostro
|
||||
Dell Vostro
|
||||
olpc-xo-1_5
|
||||
OLPC XO 1.5
|
||||
ideapad
|
||||
Lenovo IdeaPad U150
|
||||
thinkpad
|
||||
Lenovo Thinkpad
|
||||
|
||||
STAC9200
|
||||
========
|
||||
ref
|
||||
Reference board
|
||||
oqo
|
||||
OQO Model 2
|
||||
dell-d21
|
||||
Dell (unknown)
|
||||
dell-d22
|
||||
Dell (unknown)
|
||||
dell-d23
|
||||
Dell (unknown)
|
||||
dell-m21
|
||||
Dell Inspiron 630m, Dell Inspiron 640m
|
||||
dell-m22
|
||||
Dell Latitude D620, Dell Latitude D820
|
||||
dell-m23
|
||||
Dell XPS M1710, Dell Precision M90
|
||||
dell-m24
|
||||
Dell Latitude 120L
|
||||
dell-m25
|
||||
Dell Inspiron E1505n
|
||||
dell-m26
|
||||
Dell Inspiron 1501
|
||||
dell-m27
|
||||
Dell Inspiron E1705/9400
|
||||
gateway-m4
|
||||
Gateway laptops with EAPD control
|
||||
gateway-m4-2
|
||||
Gateway laptops with EAPD control
|
||||
panasonic
|
||||
Panasonic CF-74
|
||||
auto
|
||||
BIOS setup (default)
|
||||
|
||||
STAC9205/9254
|
||||
=============
|
||||
ref
|
||||
Reference board
|
||||
dell-m42
|
||||
Dell (unknown)
|
||||
dell-m43
|
||||
Dell Precision
|
||||
dell-m44
|
||||
Dell Inspiron
|
||||
eapd
|
||||
Keep EAPD on (e.g. Gateway T1616)
|
||||
auto
|
||||
BIOS setup (default)
|
||||
|
||||
STAC9220/9221
|
||||
=============
|
||||
ref
|
||||
Reference board
|
||||
3stack
|
||||
D945 3stack
|
||||
5stack
|
||||
D945 5stack + SPDIF
|
||||
intel-mac-v1
|
||||
Intel Mac Type 1
|
||||
intel-mac-v2
|
||||
Intel Mac Type 2
|
||||
intel-mac-v3
|
||||
Intel Mac Type 3
|
||||
intel-mac-v4
|
||||
Intel Mac Type 4
|
||||
intel-mac-v5
|
||||
Intel Mac Type 5
|
||||
intel-mac-auto
|
||||
Intel Mac (detect type according to subsystem id)
|
||||
macmini
|
||||
Intel Mac Mini (equivalent with type 3)
|
||||
macbook
|
||||
Intel Mac Book (eq. type 5)
|
||||
macbook-pro-v1
|
||||
Intel Mac Book Pro 1st generation (eq. type 3)
|
||||
macbook-pro
|
||||
Intel Mac Book Pro 2nd generation (eq. type 3)
|
||||
imac-intel
|
||||
Intel iMac (eq. type 2)
|
||||
imac-intel-20
|
||||
Intel iMac (newer version) (eq. type 3)
|
||||
ecs202
|
||||
ECS/PC chips
|
||||
dell-d81
|
||||
Dell (unknown)
|
||||
dell-d82
|
||||
Dell (unknown)
|
||||
dell-m81
|
||||
Dell (unknown)
|
||||
dell-m82
|
||||
Dell XPS M1210
|
||||
auto
|
||||
BIOS setup (default)
|
||||
|
||||
STAC9202/9250/9251
|
||||
==================
|
||||
ref
|
||||
Reference board, base config
|
||||
m1
|
||||
Some Gateway MX series laptops (NX560XL)
|
||||
m1-2
|
||||
Some Gateway MX series laptops (MX6453)
|
||||
m2
|
||||
Some Gateway MX series laptops (M255)
|
||||
m2-2
|
||||
Some Gateway MX series laptops
|
||||
m3
|
||||
Some Gateway MX series laptops
|
||||
m5
|
||||
Some Gateway MX series laptops (MP6954)
|
||||
m6
|
||||
Some Gateway NX series laptops
|
||||
auto
|
||||
BIOS setup (default)
|
||||
|
||||
STAC9227/9228/9229/927x
|
||||
=======================
|
||||
ref
|
||||
Reference board
|
||||
ref-no-jd
|
||||
Reference board without HP/Mic jack detection
|
||||
3stack
|
||||
D965 3stack
|
||||
5stack
|
||||
D965 5stack + SPDIF
|
||||
5stack-no-fp
|
||||
D965 5stack without front panel
|
||||
dell-3stack
|
||||
Dell Dimension E520
|
||||
dell-bios
|
||||
Fixes with Dell BIOS setup
|
||||
dell-bios-amic
|
||||
Fixes with Dell BIOS setup including analog mic
|
||||
volknob
|
||||
Fixes with volume-knob widget 0x24
|
||||
auto
|
||||
BIOS setup (default)
|
||||
|
||||
STAC92HD71B*
|
||||
============
|
||||
ref
|
||||
Reference board
|
||||
dell-m4-1
|
||||
Dell desktops
|
||||
dell-m4-2
|
||||
Dell desktops
|
||||
dell-m4-3
|
||||
Dell desktops
|
||||
hp-m4
|
||||
HP mini 1000
|
||||
hp-dv5
|
||||
HP dv series
|
||||
hp-hdx
|
||||
HP HDX series
|
||||
hp-dv4-1222nr
|
||||
HP dv4-1222nr (with LED support)
|
||||
auto
|
||||
BIOS setup (default)
|
||||
|
||||
STAC92HD73*
|
||||
===========
|
||||
ref
|
||||
Reference board
|
||||
no-jd
|
||||
BIOS setup but without jack-detection
|
||||
intel
|
||||
Intel DG45* mobos
|
||||
dell-m6-amic
|
||||
Dell desktops/laptops with analog mics
|
||||
dell-m6-dmic
|
||||
Dell desktops/laptops with digital mics
|
||||
dell-m6
|
||||
Dell desktops/laptops with both type of mics
|
||||
dell-eq
|
||||
Dell desktops/laptops
|
||||
alienware
|
||||
Alienware M17x
|
||||
auto
|
||||
BIOS setup (default)
|
||||
|
||||
STAC92HD83*
|
||||
===========
|
||||
ref
|
||||
Reference board
|
||||
mic-ref
|
||||
Reference board with power management for ports
|
||||
dell-s14
|
||||
Dell laptop
|
||||
dell-vostro-3500
|
||||
Dell Vostro 3500 laptop
|
||||
hp-dv7-4000
|
||||
HP dv-7 4000
|
||||
hp_cNB11_intquad
|
||||
HP CNB models with 4 speakers
|
||||
hp-zephyr
|
||||
HP Zephyr
|
||||
hp-led
|
||||
HP with broken BIOS for mute LED
|
||||
hp-inv-led
|
||||
HP with broken BIOS for inverted mute LED
|
||||
hp-mic-led
|
||||
HP with mic-mute LED
|
||||
headset-jack
|
||||
Dell Latitude with a 4-pin headset jack
|
||||
hp-envy-bass
|
||||
Pin fixup for HP Envy bass speaker (NID 0x0f)
|
||||
hp-envy-ts-bass
|
||||
Pin fixup for HP Envy TS bass speaker (NID 0x10)
|
||||
hp-bnb13-eq
|
||||
Hardware equalizer setup for HP laptops
|
||||
auto
|
||||
BIOS setup (default)
|
||||
|
||||
STAC92HD95
|
||||
==========
|
||||
hp-led
|
||||
LED support for HP laptops
|
||||
hp-bass
|
||||
Bass HPF setup for HP Spectre 13
|
||||
|
||||
STAC9872
|
||||
========
|
||||
vaio
|
||||
VAIO laptop without SPDIF
|
||||
auto
|
||||
BIOS setup (default)
|
||||
|
||||
Cirrus Logic CS4206/4207
|
||||
========================
|
||||
mbp55
|
||||
MacBook Pro 5,5
|
||||
imac27
|
||||
IMac 27 Inch
|
||||
auto
|
||||
BIOS setup (default)
|
||||
|
||||
Cirrus Logic CS4208
|
||||
===================
|
||||
mba6
|
||||
MacBook Air 6,1 and 6,2
|
||||
gpio0
|
||||
Enable GPIO 0 amp
|
||||
auto
|
||||
BIOS setup (default)
|
||||
|
||||
VIA VT17xx/VT18xx/VT20xx
|
||||
========================
|
||||
auto
|
||||
BIOS setup (default)
|
File diff suppressed because it is too large
Load Diff
|
@ -0,0 +1,19 @@
|
|||
===================================
|
||||
Linux Sound Subsystem Documentation
|
||||
===================================
|
||||
|
||||
.. toctree::
|
||||
:maxdepth: 2
|
||||
|
||||
kernel-api/index
|
||||
designs/index
|
||||
alsa-configuration
|
||||
hd-audio/index
|
||||
cards/index
|
||||
|
||||
.. only:: subproject
|
||||
|
||||
Indices
|
||||
=======
|
||||
|
||||
* :ref:`genindex`
|
|
@ -0,0 +1,134 @@
|
|||
===================
|
||||
The ALSA Driver API
|
||||
===================
|
||||
|
||||
Management of Cards and Devices
|
||||
===============================
|
||||
|
||||
Card Management
|
||||
---------------
|
||||
.. kernel-doc:: sound/core/init.c
|
||||
|
||||
Device Components
|
||||
-----------------
|
||||
.. kernel-doc:: sound/core/device.c
|
||||
|
||||
Module requests and Device File Entries
|
||||
---------------------------------------
|
||||
.. kernel-doc:: sound/core/sound.c
|
||||
|
||||
Memory Management Helpers
|
||||
-------------------------
|
||||
.. kernel-doc:: sound/core/memory.c
|
||||
.. kernel-doc:: sound/core/memalloc.c
|
||||
|
||||
|
||||
PCM API
|
||||
=======
|
||||
|
||||
PCM Core
|
||||
--------
|
||||
.. kernel-doc:: sound/core/pcm.c
|
||||
.. kernel-doc:: sound/core/pcm_lib.c
|
||||
.. kernel-doc:: sound/core/pcm_native.c
|
||||
.. kernel-doc:: include/sound/pcm.h
|
||||
|
||||
PCM Format Helpers
|
||||
------------------
|
||||
.. kernel-doc:: sound/core/pcm_misc.c
|
||||
|
||||
PCM Memory Management
|
||||
---------------------
|
||||
.. kernel-doc:: sound/core/pcm_memory.c
|
||||
|
||||
PCM DMA Engine API
|
||||
------------------
|
||||
.. kernel-doc:: sound/core/pcm_dmaengine.c
|
||||
.. kernel-doc:: include/sound/dmaengine_pcm.h
|
||||
|
||||
Control/Mixer API
|
||||
=================
|
||||
|
||||
General Control Interface
|
||||
-------------------------
|
||||
.. kernel-doc:: sound/core/control.c
|
||||
|
||||
AC97 Codec API
|
||||
--------------
|
||||
.. kernel-doc:: sound/pci/ac97/ac97_codec.c
|
||||
.. kernel-doc:: sound/pci/ac97/ac97_pcm.c
|
||||
|
||||
Virtual Master Control API
|
||||
--------------------------
|
||||
.. kernel-doc:: sound/core/vmaster.c
|
||||
.. kernel-doc:: include/sound/control.h
|
||||
|
||||
MIDI API
|
||||
========
|
||||
|
||||
Raw MIDI API
|
||||
------------
|
||||
.. kernel-doc:: sound/core/rawmidi.c
|
||||
|
||||
MPU401-UART API
|
||||
---------------
|
||||
.. kernel-doc:: sound/drivers/mpu401/mpu401_uart.c
|
||||
|
||||
Proc Info API
|
||||
=============
|
||||
|
||||
Proc Info Interface
|
||||
-------------------
|
||||
.. kernel-doc:: sound/core/info.c
|
||||
|
||||
Compress Offload
|
||||
================
|
||||
|
||||
Compress Offload API
|
||||
--------------------
|
||||
.. kernel-doc:: sound/core/compress_offload.c
|
||||
.. kernel-doc:: include/uapi/sound/compress_offload.h
|
||||
.. kernel-doc:: include/uapi/sound/compress_params.h
|
||||
.. kernel-doc:: include/sound/compress_driver.h
|
||||
|
||||
ASoC
|
||||
====
|
||||
|
||||
ASoC Core API
|
||||
-------------
|
||||
.. kernel-doc:: include/sound/soc.h
|
||||
.. kernel-doc:: sound/soc/soc-core.c
|
||||
.. kernel-doc:: sound/soc/soc-devres.c
|
||||
.. kernel-doc:: sound/soc/soc-io.c
|
||||
.. kernel-doc:: sound/soc/soc-pcm.c
|
||||
.. kernel-doc:: sound/soc/soc-ops.c
|
||||
.. kernel-doc:: sound/soc/soc-compress.c
|
||||
|
||||
ASoC DAPM API
|
||||
-------------
|
||||
.. kernel-doc:: sound/soc/soc-dapm.c
|
||||
|
||||
ASoC DMA Engine API
|
||||
-------------------
|
||||
.. kernel-doc:: sound/soc/soc-generic-dmaengine-pcm.c
|
||||
|
||||
Miscellaneous Functions
|
||||
=======================
|
||||
|
||||
Hardware-Dependent Devices API
|
||||
------------------------------
|
||||
.. kernel-doc:: sound/core/hwdep.c
|
||||
|
||||
Jack Abstraction Layer API
|
||||
--------------------------
|
||||
.. kernel-doc:: include/sound/jack.h
|
||||
.. kernel-doc:: sound/core/jack.c
|
||||
.. kernel-doc:: sound/soc/soc-jack.c
|
||||
|
||||
ISA DMA Helpers
|
||||
---------------
|
||||
.. kernel-doc:: sound/core/isadma.c
|
||||
|
||||
Other Helper Macros
|
||||
-------------------
|
||||
.. kernel-doc:: include/sound/core.h
|
|
@ -0,0 +1,8 @@
|
|||
ALSA Kernel API Documentation
|
||||
=============================
|
||||
|
||||
.. toctree::
|
||||
:maxdepth: 2
|
||||
|
||||
alsa-driver-api
|
||||
writing-an-alsa-driver
|
File diff suppressed because it is too large
Load Diff
|
@ -4,7 +4,17 @@ KVM Lock Overview
|
|||
1. Acquisition Orders
|
||||
---------------------
|
||||
|
||||
(to be written)
|
||||
The acquisition orders for mutexes are as follows:
|
||||
|
||||
- kvm->lock is taken outside vcpu->mutex
|
||||
|
||||
- kvm->lock is taken outside kvm->slots_lock and kvm->irq_lock
|
||||
|
||||
- kvm->slots_lock is taken outside kvm->irq_lock, though acquiring
|
||||
them together is quite rare.
|
||||
|
||||
For spinlocks, kvm_lock is taken outside kvm->mmu_lock. Everything
|
||||
else is a leaf: no other lock is taken inside the critical sections.
|
||||
|
||||
2: Exception
|
||||
------------
|
||||
|
|
58
MAINTAINERS
58
MAINTAINERS
|
@ -2552,15 +2552,18 @@ S: Supported
|
|||
F: drivers/net/ethernet/broadcom/genet/
|
||||
|
||||
BROADCOM BNX2 GIGABIT ETHERNET DRIVER
|
||||
M: Sony Chacko <sony.chacko@qlogic.com>
|
||||
M: Dept-HSGLinuxNICDev@qlogic.com
|
||||
M: Rasesh Mody <rasesh.mody@cavium.com>
|
||||
M: Harish Patil <harish.patil@cavium.com>
|
||||
M: Dept-GELinuxNICDev@cavium.com
|
||||
L: netdev@vger.kernel.org
|
||||
S: Supported
|
||||
F: drivers/net/ethernet/broadcom/bnx2.*
|
||||
F: drivers/net/ethernet/broadcom/bnx2_*
|
||||
|
||||
BROADCOM BNX2X 10 GIGABIT ETHERNET DRIVER
|
||||
M: Ariel Elior <ariel.elior@qlogic.com>
|
||||
M: Yuval Mintz <Yuval.Mintz@cavium.com>
|
||||
M: Ariel Elior <ariel.elior@cavium.com>
|
||||
M: everest-linux-l2@cavium.com
|
||||
L: netdev@vger.kernel.org
|
||||
S: Supported
|
||||
F: drivers/net/ethernet/broadcom/bnx2x/
|
||||
|
@ -2767,7 +2770,9 @@ S: Supported
|
|||
F: drivers/scsi/bfa/
|
||||
|
||||
BROCADE BNA 10 GIGABIT ETHERNET DRIVER
|
||||
M: Rasesh Mody <rasesh.mody@qlogic.com>
|
||||
M: Rasesh Mody <rasesh.mody@cavium.com>
|
||||
M: Sudarsana Kalluru <sudarsana.kalluru@cavium.com>
|
||||
M: Dept-GELinuxNICDev@cavium.com
|
||||
L: netdev@vger.kernel.org
|
||||
S: Supported
|
||||
F: drivers/net/ethernet/brocade/bna/
|
||||
|
@ -7920,6 +7925,10 @@ F: mm/
|
|||
MEMORY TECHNOLOGY DEVICES (MTD)
|
||||
M: David Woodhouse <dwmw2@infradead.org>
|
||||
M: Brian Norris <computersforpeace@gmail.com>
|
||||
M: Boris Brezillon <boris.brezillon@free-electrons.com>
|
||||
M: Marek Vasut <marek.vasut@gmail.com>
|
||||
M: Richard Weinberger <richard@nod.at>
|
||||
M: Cyrille Pitchen <cyrille.pitchen@atmel.com>
|
||||
L: linux-mtd@lists.infradead.org
|
||||
W: http://www.linux-mtd.infradead.org/
|
||||
Q: http://patchwork.ozlabs.org/project/linux-mtd/list/
|
||||
|
@ -8517,11 +8526,10 @@ F: Documentation/devicetree/bindings/net/wireless/
|
|||
F: drivers/net/wireless/
|
||||
|
||||
NETXEN (1/10) GbE SUPPORT
|
||||
M: Manish Chopra <manish.chopra@qlogic.com>
|
||||
M: Sony Chacko <sony.chacko@qlogic.com>
|
||||
M: Rajesh Borundia <rajesh.borundia@qlogic.com>
|
||||
M: Manish Chopra <manish.chopra@cavium.com>
|
||||
M: Rahul Verma <rahul.verma@cavium.com>
|
||||
M: Dept-GELinuxNICDev@cavium.com
|
||||
L: netdev@vger.kernel.org
|
||||
W: http://www.qlogic.com
|
||||
S: Supported
|
||||
F: drivers/net/ethernet/qlogic/netxen/
|
||||
|
||||
|
@ -9897,33 +9905,32 @@ F: Documentation/scsi/LICENSE.qla4xxx
|
|||
F: drivers/scsi/qla4xxx/
|
||||
|
||||
QLOGIC QLA3XXX NETWORK DRIVER
|
||||
M: Jitendra Kalsaria <jitendra.kalsaria@qlogic.com>
|
||||
M: Ron Mercer <ron.mercer@qlogic.com>
|
||||
M: linux-driver@qlogic.com
|
||||
M: Dept-GELinuxNICDev@cavium.com
|
||||
L: netdev@vger.kernel.org
|
||||
S: Supported
|
||||
F: Documentation/networking/LICENSE.qla3xxx
|
||||
F: drivers/net/ethernet/qlogic/qla3xxx.*
|
||||
|
||||
QLOGIC QLCNIC (1/10)Gb ETHERNET DRIVER
|
||||
M: Dept-GELinuxNICDev@qlogic.com
|
||||
M: Harish Patil <harish.patil@cavium.com>
|
||||
M: Manish Chopra <manish.chopra@cavium.com>
|
||||
M: Dept-GELinuxNICDev@cavium.com
|
||||
L: netdev@vger.kernel.org
|
||||
S: Supported
|
||||
F: drivers/net/ethernet/qlogic/qlcnic/
|
||||
|
||||
QLOGIC QLGE 10Gb ETHERNET DRIVER
|
||||
M: Harish Patil <harish.patil@qlogic.com>
|
||||
M: Sudarsana Kalluru <sudarsana.kalluru@qlogic.com>
|
||||
M: Dept-GELinuxNICDev@qlogic.com
|
||||
M: linux-driver@qlogic.com
|
||||
M: Harish Patil <harish.patil@cavium.com>
|
||||
M: Manish Chopra <manish.chopra@cavium.com>
|
||||
M: Dept-GELinuxNICDev@cavium.com
|
||||
L: netdev@vger.kernel.org
|
||||
S: Supported
|
||||
F: drivers/net/ethernet/qlogic/qlge/
|
||||
|
||||
QLOGIC QL4xxx ETHERNET DRIVER
|
||||
M: Yuval Mintz <Yuval.Mintz@qlogic.com>
|
||||
M: Ariel Elior <Ariel.Elior@qlogic.com>
|
||||
M: everest-linux-l2@qlogic.com
|
||||
M: Yuval Mintz <Yuval.Mintz@cavium.com>
|
||||
M: Ariel Elior <Ariel.Elior@cavium.com>
|
||||
M: everest-linux-l2@cavium.com
|
||||
L: netdev@vger.kernel.org
|
||||
S: Supported
|
||||
F: drivers/net/ethernet/qlogic/qed/
|
||||
|
@ -11401,6 +11408,17 @@ W: http://www.st.com/spear
|
|||
S: Maintained
|
||||
F: drivers/clk/spear/
|
||||
|
||||
SPI NOR SUBSYSTEM
|
||||
M: Cyrille Pitchen <cyrille.pitchen@atmel.com>
|
||||
M: Marek Vasut <marek.vasut@gmail.com>
|
||||
L: linux-mtd@lists.infradead.org
|
||||
W: http://www.linux-mtd.infradead.org/
|
||||
Q: http://patchwork.ozlabs.org/project/linux-mtd/list/
|
||||
T: git git://github.com/spi-nor/linux.git
|
||||
S: Maintained
|
||||
F: drivers/mtd/spi-nor/
|
||||
F: include/linux/mtd/spi-nor.h
|
||||
|
||||
SPI SUBSYSTEM
|
||||
M: Mark Brown <broonie@kernel.org>
|
||||
L: linux-spi@vger.kernel.org
|
||||
|
@ -12780,6 +12798,7 @@ F: include/uapi/linux/virtio_console.h
|
|||
|
||||
VIRTIO CORE, NET AND BLOCK DRIVERS
|
||||
M: "Michael S. Tsirkin" <mst@redhat.com>
|
||||
M: Jason Wang <jasowang@redhat.com>
|
||||
L: virtualization@lists.linux-foundation.org
|
||||
S: Maintained
|
||||
F: Documentation/devicetree/bindings/virtio/
|
||||
|
@ -12810,6 +12829,7 @@ F: include/uapi/linux/virtio_gpu.h
|
|||
|
||||
VIRTIO HOST (VHOST)
|
||||
M: "Michael S. Tsirkin" <mst@redhat.com>
|
||||
M: Jason Wang <jasowang@redhat.com>
|
||||
L: kvm@vger.kernel.org
|
||||
L: virtualization@lists.linux-foundation.org
|
||||
L: netdev@vger.kernel.org
|
||||
|
|
2
Makefile
2
Makefile
|
@ -1,7 +1,7 @@
|
|||
VERSION = 4
|
||||
PATCHLEVEL = 9
|
||||
SUBLEVEL = 0
|
||||
EXTRAVERSION = -rc3
|
||||
EXTRAVERSION = -rc4
|
||||
NAME = Psychotic Stoned Sheep
|
||||
|
||||
# *DOCUMENTATION*
|
||||
|
|
|
@ -19,7 +19,7 @@
|
|||
* This may need to be greater than __NR_last_syscall+1 in order to
|
||||
* account for the padding in the syscall table
|
||||
*/
|
||||
#define __NR_syscalls (396)
|
||||
#define __NR_syscalls (400)
|
||||
|
||||
#define __ARCH_WANT_STAT64
|
||||
#define __ARCH_WANT_SYS_GETHOSTNAME
|
||||
|
|
|
@ -420,6 +420,9 @@
|
|||
#define __NR_copy_file_range (__NR_SYSCALL_BASE+391)
|
||||
#define __NR_preadv2 (__NR_SYSCALL_BASE+392)
|
||||
#define __NR_pwritev2 (__NR_SYSCALL_BASE+393)
|
||||
#define __NR_pkey_mprotect (__NR_SYSCALL_BASE+394)
|
||||
#define __NR_pkey_alloc (__NR_SYSCALL_BASE+395)
|
||||
#define __NR_pkey_free (__NR_SYSCALL_BASE+396)
|
||||
|
||||
/*
|
||||
* The following SWIs are ARM private.
|
||||
|
|
|
@ -403,6 +403,9 @@
|
|||
CALL(sys_copy_file_range)
|
||||
CALL(sys_preadv2)
|
||||
CALL(sys_pwritev2)
|
||||
CALL(sys_pkey_mprotect)
|
||||
/* 395 */ CALL(sys_pkey_alloc)
|
||||
CALL(sys_pkey_free)
|
||||
#ifndef syscalls_counted
|
||||
.equ syscalls_padding, ((NR_syscalls + 3) & ~3) - NR_syscalls
|
||||
#define syscalls_counted
|
||||
|
|
|
@ -7,7 +7,7 @@
|
|||
* : r4 = aborted context pc
|
||||
* : r5 = aborted context psr
|
||||
*
|
||||
* Returns : r4-r5, r10-r11, r13 preserved
|
||||
* Returns : r4-r5, r9-r11, r13 preserved
|
||||
*
|
||||
* Purpose : obtain information about current aborted instruction.
|
||||
* Note: we read user space. This means we might cause a data
|
||||
|
@ -48,7 +48,10 @@ ENTRY(v4t_late_abort)
|
|||
/* c */ b do_DataAbort @ ldc rd, [rn], #m @ Same as ldr rd, [rn], #m
|
||||
/* d */ b do_DataAbort @ ldc rd, [rn, #m]
|
||||
/* e */ b .data_unknown
|
||||
/* f */
|
||||
/* f */ b .data_unknown
|
||||
|
||||
.data_unknown_r9:
|
||||
ldr r9, [sp], #4
|
||||
.data_unknown: @ Part of jumptable
|
||||
mov r0, r4
|
||||
mov r1, r8
|
||||
|
@ -57,6 +60,7 @@ ENTRY(v4t_late_abort)
|
|||
.data_arm_ldmstm:
|
||||
tst r8, #1 << 21 @ check writeback bit
|
||||
beq do_DataAbort @ no writeback -> no fixup
|
||||
str r9, [sp, #-4]!
|
||||
mov r7, #0x11
|
||||
orr r7, r7, #0x1100
|
||||
and r6, r8, r7
|
||||
|
@ -75,12 +79,14 @@ ENTRY(v4t_late_abort)
|
|||
subne r7, r7, r6, lsl #2 @ Undo increment
|
||||
addeq r7, r7, r6, lsl #2 @ Undo decrement
|
||||
str r7, [r2, r9, lsr #14] @ Put register 'Rn'
|
||||
ldr r9, [sp], #4
|
||||
b do_DataAbort
|
||||
|
||||
.data_arm_lateldrhpre:
|
||||
tst r8, #1 << 21 @ Check writeback bit
|
||||
beq do_DataAbort @ No writeback -> no fixup
|
||||
.data_arm_lateldrhpost:
|
||||
str r9, [sp, #-4]!
|
||||
and r9, r8, #0x00f @ get Rm / low nibble of immediate value
|
||||
tst r8, #1 << 22 @ if (immediate offset)
|
||||
andne r6, r8, #0xf00 @ { immediate high nibble
|
||||
|
@ -93,6 +99,7 @@ ENTRY(v4t_late_abort)
|
|||
subne r7, r7, r6 @ Undo incrmenet
|
||||
addeq r7, r7, r6 @ Undo decrement
|
||||
str r7, [r2, r9, lsr #14] @ Put register 'Rn'
|
||||
ldr r9, [sp], #4
|
||||
b do_DataAbort
|
||||
|
||||
.data_arm_lateldrpreconst:
|
||||
|
@ -101,12 +108,14 @@ ENTRY(v4t_late_abort)
|
|||
.data_arm_lateldrpostconst:
|
||||
movs r6, r8, lsl #20 @ Get offset
|
||||
beq do_DataAbort @ zero -> no fixup
|
||||
str r9, [sp, #-4]!
|
||||
and r9, r8, #15 << 16 @ Extract 'n' from instruction
|
||||
ldr r7, [r2, r9, lsr #14] @ Get register 'Rn'
|
||||
tst r8, #1 << 23 @ Check U bit
|
||||
subne r7, r7, r6, lsr #20 @ Undo increment
|
||||
addeq r7, r7, r6, lsr #20 @ Undo decrement
|
||||
str r7, [r2, r9, lsr #14] @ Put register 'Rn'
|
||||
ldr r9, [sp], #4
|
||||
b do_DataAbort
|
||||
|
||||
.data_arm_lateldrprereg:
|
||||
|
@ -115,6 +124,7 @@ ENTRY(v4t_late_abort)
|
|||
.data_arm_lateldrpostreg:
|
||||
and r7, r8, #15 @ Extract 'm' from instruction
|
||||
ldr r6, [r2, r7, lsl #2] @ Get register 'Rm'
|
||||
str r9, [sp, #-4]!
|
||||
mov r9, r8, lsr #7 @ get shift count
|
||||
ands r9, r9, #31
|
||||
and r7, r8, #0x70 @ get shift type
|
||||
|
@ -126,33 +136,33 @@ ENTRY(v4t_late_abort)
|
|||
b .data_arm_apply_r6_and_rn
|
||||
b .data_arm_apply_r6_and_rn @ 1: LSL #0
|
||||
nop
|
||||
b .data_unknown @ 2: MUL?
|
||||
b .data_unknown_r9 @ 2: MUL?
|
||||
nop
|
||||
b .data_unknown @ 3: MUL?
|
||||
b .data_unknown_r9 @ 3: MUL?
|
||||
nop
|
||||
mov r6, r6, lsr r9 @ 4: LSR #!0
|
||||
b .data_arm_apply_r6_and_rn
|
||||
mov r6, r6, lsr #32 @ 5: LSR #32
|
||||
b .data_arm_apply_r6_and_rn
|
||||
b .data_unknown @ 6: MUL?
|
||||
b .data_unknown_r9 @ 6: MUL?
|
||||
nop
|
||||
b .data_unknown @ 7: MUL?
|
||||
b .data_unknown_r9 @ 7: MUL?
|
||||
nop
|
||||
mov r6, r6, asr r9 @ 8: ASR #!0
|
||||
b .data_arm_apply_r6_and_rn
|
||||
mov r6, r6, asr #32 @ 9: ASR #32
|
||||
b .data_arm_apply_r6_and_rn
|
||||
b .data_unknown @ A: MUL?
|
||||
b .data_unknown_r9 @ A: MUL?
|
||||
nop
|
||||
b .data_unknown @ B: MUL?
|
||||
b .data_unknown_r9 @ B: MUL?
|
||||
nop
|
||||
mov r6, r6, ror r9 @ C: ROR #!0
|
||||
b .data_arm_apply_r6_and_rn
|
||||
mov r6, r6, rrx @ D: RRX
|
||||
b .data_arm_apply_r6_and_rn
|
||||
b .data_unknown @ E: MUL?
|
||||
b .data_unknown_r9 @ E: MUL?
|
||||
nop
|
||||
b .data_unknown @ F: MUL?
|
||||
b .data_unknown_r9 @ F: MUL?
|
||||
|
||||
.data_thumb_abort:
|
||||
ldrh r8, [r4] @ read instruction
|
||||
|
@ -190,6 +200,7 @@ ENTRY(v4t_late_abort)
|
|||
.data_thumb_pushpop:
|
||||
tst r8, #1 << 10
|
||||
beq .data_unknown
|
||||
str r9, [sp, #-4]!
|
||||
and r6, r8, #0x55 @ hweight8(r8) + R bit
|
||||
and r9, r8, #0xaa
|
||||
add r6, r6, r9, lsr #1
|
||||
|
@ -204,9 +215,11 @@ ENTRY(v4t_late_abort)
|
|||
addeq r7, r7, r6, lsl #2 @ increment SP if PUSH
|
||||
subne r7, r7, r6, lsl #2 @ decrement SP if POP
|
||||
str r7, [r2, #13 << 2]
|
||||
ldr r9, [sp], #4
|
||||
b do_DataAbort
|
||||
|
||||
.data_thumb_ldmstm:
|
||||
str r9, [sp, #-4]!
|
||||
and r6, r8, #0x55 @ hweight8(r8)
|
||||
and r9, r8, #0xaa
|
||||
add r6, r6, r9, lsr #1
|
||||
|
@ -219,4 +232,5 @@ ENTRY(v4t_late_abort)
|
|||
and r6, r6, #15 @ number of regs to transfer
|
||||
sub r7, r7, r6, lsl #2 @ always decrement
|
||||
str r7, [r2, r9, lsr #6]
|
||||
ldr r9, [sp], #4
|
||||
b do_DataAbort
|
||||
|
|
|
@ -263,7 +263,7 @@ KBUILD_CPPFLAGS += -DDATAOFFSET=$(if $(dataoffset-y),$(dataoffset-y),0)
|
|||
|
||||
bootvars-y = VMLINUX_LOAD_ADDRESS=$(load-y) \
|
||||
VMLINUX_ENTRY_ADDRESS=$(entry-y) \
|
||||
PLATFORM=$(platform-y)
|
||||
PLATFORM="$(platform-y)"
|
||||
ifdef CONFIG_32BIT
|
||||
bootvars-y += ADDR_BITS=32
|
||||
endif
|
||||
|
|
|
@ -84,12 +84,13 @@ board-config@3e0000 {
|
|||
fpga_regs: system-controller@1f000000 {
|
||||
compatible = "mti,malta-fpga", "syscon", "simple-mfd";
|
||||
reg = <0x1f000000 0x1000>;
|
||||
native-endian;
|
||||
|
||||
reboot {
|
||||
compatible = "syscon-reboot";
|
||||
regmap = <&fpga_regs>;
|
||||
offset = <0x500>;
|
||||
mask = <0x4d>;
|
||||
mask = <0x42>;
|
||||
};
|
||||
};
|
||||
|
||||
|
|
|
@ -29,10 +29,20 @@ static __initdata const struct mips_machine *mach;
|
|||
static __initdata const void *mach_match_data;
|
||||
|
||||
void __init prom_init(void)
|
||||
{
|
||||
plat_get_fdt();
|
||||
BUG_ON(!fdt);
|
||||
}
|
||||
|
||||
void __init *plat_get_fdt(void)
|
||||
{
|
||||
const struct mips_machine *check_mach;
|
||||
const struct of_device_id *match;
|
||||
|
||||
if (fdt)
|
||||
/* Already set up */
|
||||
return (void *)fdt;
|
||||
|
||||
if ((fw_arg0 == -2) && !fdt_check_header((void *)fw_arg1)) {
|
||||
/*
|
||||
* We booted using the UHI boot protocol, so we have been
|
||||
|
@ -75,12 +85,6 @@ void __init prom_init(void)
|
|||
/* Retrieve the machine's FDT */
|
||||
fdt = mach->fdt;
|
||||
}
|
||||
|
||||
BUG_ON(!fdt);
|
||||
}
|
||||
|
||||
void __init *plat_get_fdt(void)
|
||||
{
|
||||
return (void *)fdt;
|
||||
}
|
||||
|
||||
|
|
|
@ -63,6 +63,8 @@ do { \
|
|||
extern int fpu_emulator_cop1Handler(struct pt_regs *xcp,
|
||||
struct mips_fpu_struct *ctx, int has_fpu,
|
||||
void *__user *fault_addr);
|
||||
void force_fcr31_sig(unsigned long fcr31, void __user *fault_addr,
|
||||
struct task_struct *tsk);
|
||||
int process_fpemu_return(int sig, void __user *fault_addr,
|
||||
unsigned long fcr31);
|
||||
int isBranchInstr(struct pt_regs *regs, struct mm_decoded_insn dec_insn,
|
||||
|
@ -81,4 +83,15 @@ static inline void fpu_emulator_init_fpu(void)
|
|||
set_fpr64(&t->thread.fpu.fpr[i], 0, SIGNALLING_NAN);
|
||||
}
|
||||
|
||||
/*
|
||||
* Mask the FCSR Cause bits according to the Enable bits, observing
|
||||
* that Unimplemented is always enabled.
|
||||
*/
|
||||
static inline unsigned long mask_fcr31_x(unsigned long fcr31)
|
||||
{
|
||||
return fcr31 & (FPU_CSR_UNI_X |
|
||||
((fcr31 & FPU_CSR_ALL_E) <<
|
||||
(ffs(FPU_CSR_ALL_X) - ffs(FPU_CSR_ALL_E))));
|
||||
}
|
||||
|
||||
#endif /* _ASM_FPU_EMULATOR_H */
|
||||
|
|
|
@ -293,7 +293,10 @@ struct kvm_vcpu_arch {
|
|||
/* Host KSEG0 address of the EI/DI offset */
|
||||
void *kseg0_commpage;
|
||||
|
||||
u32 io_gpr; /* GPR used as IO source/target */
|
||||
/* Resume PC after MMIO completion */
|
||||
unsigned long io_pc;
|
||||
/* GPR used as IO source/target */
|
||||
u32 io_gpr;
|
||||
|
||||
struct hrtimer comparecount_timer;
|
||||
/* Count timer control KVM register */
|
||||
|
@ -315,8 +318,6 @@ struct kvm_vcpu_arch {
|
|||
/* Bitmask of pending exceptions to be cleared */
|
||||
unsigned long pending_exceptions_clr;
|
||||
|
||||
u32 pending_load_cause;
|
||||
|
||||
/* Save/Restore the entryhi register when are are preempted/scheduled back in */
|
||||
unsigned long preempt_entryhi;
|
||||
|
||||
|
|
|
@ -75,6 +75,22 @@ do { if (cpu_has_rw_llb) { \
|
|||
} \
|
||||
} while (0)
|
||||
|
||||
/*
|
||||
* Check FCSR for any unmasked exceptions pending set with `ptrace',
|
||||
* clear them and send a signal.
|
||||
*/
|
||||
#define __sanitize_fcr31(next) \
|
||||
do { \
|
||||
unsigned long fcr31 = mask_fcr31_x(next->thread.fpu.fcr31); \
|
||||
void __user *pc; \
|
||||
\
|
||||
if (unlikely(fcr31)) { \
|
||||
pc = (void __user *)task_pt_regs(next)->cp0_epc; \
|
||||
next->thread.fpu.fcr31 &= ~fcr31; \
|
||||
force_fcr31_sig(fcr31, pc, next); \
|
||||
} \
|
||||
} while (0)
|
||||
|
||||
/*
|
||||
* For newly created kernel threads switch_to() will return to
|
||||
* ret_from_kernel_thread, newly created user threads to ret_from_fork.
|
||||
|
@ -85,6 +101,8 @@ do { if (cpu_has_rw_llb) { \
|
|||
do { \
|
||||
__mips_mt_fpaff_switch_to(prev); \
|
||||
lose_fpu_inatomic(1, prev); \
|
||||
if (tsk_used_math(next)) \
|
||||
__sanitize_fcr31(next); \
|
||||
if (cpu_has_dsp) { \
|
||||
__save_dsp(prev); \
|
||||
__restore_dsp(next); \
|
||||
|
|
|
@ -21,6 +21,11 @@ static DEFINE_PER_CPU_ALIGNED(spinlock_t, cpc_core_lock);
|
|||
|
||||
static DEFINE_PER_CPU_ALIGNED(unsigned long, cpc_core_lock_flags);
|
||||
|
||||
phys_addr_t __weak mips_cpc_default_phys_base(void)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* mips_cpc_phys_base - retrieve the physical base address of the CPC
|
||||
*
|
||||
|
@ -43,8 +48,12 @@ static phys_addr_t mips_cpc_phys_base(void)
|
|||
if (cpc_base & CM_GCR_CPC_BASE_CPCEN_MSK)
|
||||
return cpc_base & CM_GCR_CPC_BASE_CPCBASE_MSK;
|
||||
|
||||
/* Otherwise, give it the default address & enable it */
|
||||
/* Otherwise, use the default address */
|
||||
cpc_base = mips_cpc_default_phys_base();
|
||||
if (!cpc_base)
|
||||
return cpc_base;
|
||||
|
||||
/* Enable the CPC, mapped at the default address */
|
||||
write_gcr_cpc_base(cpc_base | CM_GCR_CPC_BASE_CPCEN_MSK);
|
||||
return cpc_base;
|
||||
}
|
||||
|
|
|
@ -899,7 +899,7 @@ static inline int mipsr2_find_op_func(struct pt_regs *regs, u32 inst,
|
|||
* mipsr2_decoder: Decode and emulate a MIPS R2 instruction
|
||||
* @regs: Process register set
|
||||
* @inst: Instruction to decode and emulate
|
||||
* @fcr31: Floating Point Control and Status Register returned
|
||||
* @fcr31: Floating Point Control and Status Register Cause bits returned
|
||||
*/
|
||||
int mipsr2_decoder(struct pt_regs *regs, u32 inst, unsigned long *fcr31)
|
||||
{
|
||||
|
@ -1172,13 +1172,13 @@ int mipsr2_decoder(struct pt_regs *regs, u32 inst, unsigned long *fcr31)
|
|||
|
||||
err = fpu_emulator_cop1Handler(regs, ¤t->thread.fpu, 0,
|
||||
&fault_addr);
|
||||
*fcr31 = current->thread.fpu.fcr31;
|
||||
|
||||
/*
|
||||
* We can't allow the emulated instruction to leave any of
|
||||
* the cause bits set in $fcr31.
|
||||
* We can't allow the emulated instruction to leave any
|
||||
* enabled Cause bits set in $fcr31.
|
||||
*/
|
||||
current->thread.fpu.fcr31 &= ~FPU_CSR_ALL_X;
|
||||
*fcr31 = res = mask_fcr31_x(current->thread.fpu.fcr31);
|
||||
current->thread.fpu.fcr31 &= ~res;
|
||||
|
||||
/*
|
||||
* this is a tricky issue - lose_fpu() uses LL/SC atomics
|
||||
|
|
|
@ -79,16 +79,15 @@ void ptrace_disable(struct task_struct *child)
|
|||
}
|
||||
|
||||
/*
|
||||
* Poke at FCSR according to its mask. Don't set the cause bits as
|
||||
* this is currently not handled correctly in FP context restoration
|
||||
* and will cause an oops if a corresponding enable bit is set.
|
||||
* Poke at FCSR according to its mask. Set the Cause bits even
|
||||
* if a corresponding Enable bit is set. This will be noticed at
|
||||
* the time the thread is switched to and SIGFPE thrown accordingly.
|
||||
*/
|
||||
static void ptrace_setfcr31(struct task_struct *child, u32 value)
|
||||
{
|
||||
u32 fcr31;
|
||||
u32 mask;
|
||||
|
||||
value &= ~FPU_CSR_ALL_X;
|
||||
fcr31 = child->thread.fpu.fcr31;
|
||||
mask = boot_cpu_data.fpu_msk31;
|
||||
child->thread.fpu.fcr31 = (value & ~mask) | (fcr31 & mask);
|
||||
|
@ -817,6 +816,7 @@ long arch_ptrace(struct task_struct *child, long request,
|
|||
break;
|
||||
#endif
|
||||
case FPC_CSR:
|
||||
init_fp_ctx(child);
|
||||
ptrace_setfcr31(child, data);
|
||||
break;
|
||||
case DSP_BASE ... DSP_BASE + 5: {
|
||||
|
|
|
@ -19,108 +19,86 @@
|
|||
#include <asm/regdef.h>
|
||||
|
||||
#define EX(a,b) \
|
||||
9: a,##b; \
|
||||
.section __ex_table,"a"; \
|
||||
PTR 9b,fault; \
|
||||
.previous
|
||||
|
||||
#define EX2(a,b) \
|
||||
9: a,##b; \
|
||||
.section __ex_table,"a"; \
|
||||
PTR 9b,bad_stack; \
|
||||
PTR 9b+4,bad_stack; \
|
||||
.previous
|
||||
|
||||
.set noreorder
|
||||
.set mips1
|
||||
/* Save floating point context */
|
||||
|
||||
/**
|
||||
* _save_fp_context() - save FP context from the FPU
|
||||
* @a0 - pointer to fpregs field of sigcontext
|
||||
* @a1 - pointer to fpc_csr field of sigcontext
|
||||
*
|
||||
* Save FP context, including the 32 FP data registers and the FP
|
||||
* control & status register, from the FPU to signal context.
|
||||
*/
|
||||
LEAF(_save_fp_context)
|
||||
.set push
|
||||
SET_HARDFLOAT
|
||||
li v0, 0 # assume success
|
||||
cfc1 t1,fcr31
|
||||
EX(swc1 $f0,(SC_FPREGS+0)(a0))
|
||||
EX(swc1 $f1,(SC_FPREGS+8)(a0))
|
||||
EX(swc1 $f2,(SC_FPREGS+16)(a0))
|
||||
EX(swc1 $f3,(SC_FPREGS+24)(a0))
|
||||
EX(swc1 $f4,(SC_FPREGS+32)(a0))
|
||||
EX(swc1 $f5,(SC_FPREGS+40)(a0))
|
||||
EX(swc1 $f6,(SC_FPREGS+48)(a0))
|
||||
EX(swc1 $f7,(SC_FPREGS+56)(a0))
|
||||
EX(swc1 $f8,(SC_FPREGS+64)(a0))
|
||||
EX(swc1 $f9,(SC_FPREGS+72)(a0))
|
||||
EX(swc1 $f10,(SC_FPREGS+80)(a0))
|
||||
EX(swc1 $f11,(SC_FPREGS+88)(a0))
|
||||
EX(swc1 $f12,(SC_FPREGS+96)(a0))
|
||||
EX(swc1 $f13,(SC_FPREGS+104)(a0))
|
||||
EX(swc1 $f14,(SC_FPREGS+112)(a0))
|
||||
EX(swc1 $f15,(SC_FPREGS+120)(a0))
|
||||
EX(swc1 $f16,(SC_FPREGS+128)(a0))
|
||||
EX(swc1 $f17,(SC_FPREGS+136)(a0))
|
||||
EX(swc1 $f18,(SC_FPREGS+144)(a0))
|
||||
EX(swc1 $f19,(SC_FPREGS+152)(a0))
|
||||
EX(swc1 $f20,(SC_FPREGS+160)(a0))
|
||||
EX(swc1 $f21,(SC_FPREGS+168)(a0))
|
||||
EX(swc1 $f22,(SC_FPREGS+176)(a0))
|
||||
EX(swc1 $f23,(SC_FPREGS+184)(a0))
|
||||
EX(swc1 $f24,(SC_FPREGS+192)(a0))
|
||||
EX(swc1 $f25,(SC_FPREGS+200)(a0))
|
||||
EX(swc1 $f26,(SC_FPREGS+208)(a0))
|
||||
EX(swc1 $f27,(SC_FPREGS+216)(a0))
|
||||
EX(swc1 $f28,(SC_FPREGS+224)(a0))
|
||||
EX(swc1 $f29,(SC_FPREGS+232)(a0))
|
||||
EX(swc1 $f30,(SC_FPREGS+240)(a0))
|
||||
EX(swc1 $f31,(SC_FPREGS+248)(a0))
|
||||
EX(sw t1,(SC_FPC_CSR)(a0))
|
||||
cfc1 t0,$0 # implementation/version
|
||||
cfc1 t1, fcr31
|
||||
EX2(s.d $f0, 0(a0))
|
||||
EX2(s.d $f2, 16(a0))
|
||||
EX2(s.d $f4, 32(a0))
|
||||
EX2(s.d $f6, 48(a0))
|
||||
EX2(s.d $f8, 64(a0))
|
||||
EX2(s.d $f10, 80(a0))
|
||||
EX2(s.d $f12, 96(a0))
|
||||
EX2(s.d $f14, 112(a0))
|
||||
EX2(s.d $f16, 128(a0))
|
||||
EX2(s.d $f18, 144(a0))
|
||||
EX2(s.d $f20, 160(a0))
|
||||
EX2(s.d $f22, 176(a0))
|
||||
EX2(s.d $f24, 192(a0))
|
||||
EX2(s.d $f26, 208(a0))
|
||||
EX2(s.d $f28, 224(a0))
|
||||
EX2(s.d $f30, 240(a0))
|
||||
jr ra
|
||||
EX(sw t1, (a1))
|
||||
.set pop
|
||||
.set nomacro
|
||||
EX(sw t0,(SC_FPC_EIR)(a0))
|
||||
.set macro
|
||||
END(_save_fp_context)
|
||||
|
||||
/*
|
||||
* Restore FPU state:
|
||||
* - fp gp registers
|
||||
* - cp1 status/control register
|
||||
/**
|
||||
* _restore_fp_context() - restore FP context to the FPU
|
||||
* @a0 - pointer to fpregs field of sigcontext
|
||||
* @a1 - pointer to fpc_csr field of sigcontext
|
||||
*
|
||||
* We base the decision which registers to restore from the signal stack
|
||||
* frame on the current content of c0_status, not on the content of the
|
||||
* stack frame which might have been changed by the user.
|
||||
* Restore FP context, including the 32 FP data registers and the FP
|
||||
* control & status register, from signal context to the FPU.
|
||||
*/
|
||||
LEAF(_restore_fp_context)
|
||||
.set push
|
||||
SET_HARDFLOAT
|
||||
li v0, 0 # assume success
|
||||
EX(lw t0,(SC_FPC_CSR)(a0))
|
||||
EX(lwc1 $f0,(SC_FPREGS+0)(a0))
|
||||
EX(lwc1 $f1,(SC_FPREGS+8)(a0))
|
||||
EX(lwc1 $f2,(SC_FPREGS+16)(a0))
|
||||
EX(lwc1 $f3,(SC_FPREGS+24)(a0))
|
||||
EX(lwc1 $f4,(SC_FPREGS+32)(a0))
|
||||
EX(lwc1 $f5,(SC_FPREGS+40)(a0))
|
||||
EX(lwc1 $f6,(SC_FPREGS+48)(a0))
|
||||
EX(lwc1 $f7,(SC_FPREGS+56)(a0))
|
||||
EX(lwc1 $f8,(SC_FPREGS+64)(a0))
|
||||
EX(lwc1 $f9,(SC_FPREGS+72)(a0))
|
||||
EX(lwc1 $f10,(SC_FPREGS+80)(a0))
|
||||
EX(lwc1 $f11,(SC_FPREGS+88)(a0))
|
||||
EX(lwc1 $f12,(SC_FPREGS+96)(a0))
|
||||
EX(lwc1 $f13,(SC_FPREGS+104)(a0))
|
||||
EX(lwc1 $f14,(SC_FPREGS+112)(a0))
|
||||
EX(lwc1 $f15,(SC_FPREGS+120)(a0))
|
||||
EX(lwc1 $f16,(SC_FPREGS+128)(a0))
|
||||
EX(lwc1 $f17,(SC_FPREGS+136)(a0))
|
||||
EX(lwc1 $f18,(SC_FPREGS+144)(a0))
|
||||
EX(lwc1 $f19,(SC_FPREGS+152)(a0))
|
||||
EX(lwc1 $f20,(SC_FPREGS+160)(a0))
|
||||
EX(lwc1 $f21,(SC_FPREGS+168)(a0))
|
||||
EX(lwc1 $f22,(SC_FPREGS+176)(a0))
|
||||
EX(lwc1 $f23,(SC_FPREGS+184)(a0))
|
||||
EX(lwc1 $f24,(SC_FPREGS+192)(a0))
|
||||
EX(lwc1 $f25,(SC_FPREGS+200)(a0))
|
||||
EX(lwc1 $f26,(SC_FPREGS+208)(a0))
|
||||
EX(lwc1 $f27,(SC_FPREGS+216)(a0))
|
||||
EX(lwc1 $f28,(SC_FPREGS+224)(a0))
|
||||
EX(lwc1 $f29,(SC_FPREGS+232)(a0))
|
||||
EX(lwc1 $f30,(SC_FPREGS+240)(a0))
|
||||
EX(lwc1 $f31,(SC_FPREGS+248)(a0))
|
||||
EX(lw t0, (a1))
|
||||
EX2(l.d $f0, 0(a0))
|
||||
EX2(l.d $f2, 16(a0))
|
||||
EX2(l.d $f4, 32(a0))
|
||||
EX2(l.d $f6, 48(a0))
|
||||
EX2(l.d $f8, 64(a0))
|
||||
EX2(l.d $f10, 80(a0))
|
||||
EX2(l.d $f12, 96(a0))
|
||||
EX2(l.d $f14, 112(a0))
|
||||
EX2(l.d $f16, 128(a0))
|
||||
EX2(l.d $f18, 144(a0))
|
||||
EX2(l.d $f20, 160(a0))
|
||||
EX2(l.d $f22, 176(a0))
|
||||
EX2(l.d $f24, 192(a0))
|
||||
EX2(l.d $f26, 208(a0))
|
||||
EX2(l.d $f28, 224(a0))
|
||||
EX2(l.d $f30, 240(a0))
|
||||
jr ra
|
||||
ctc1 t0,fcr31
|
||||
ctc1 t0, fcr31
|
||||
.set pop
|
||||
END(_restore_fp_context)
|
||||
.set reorder
|
||||
|
|
|
@ -21,7 +21,14 @@
|
|||
.set push
|
||||
SET_HARDFLOAT
|
||||
|
||||
/* Save floating point context */
|
||||
/**
|
||||
* _save_fp_context() - save FP context from the FPU
|
||||
* @a0 - pointer to fpregs field of sigcontext
|
||||
* @a1 - pointer to fpc_csr field of sigcontext
|
||||
*
|
||||
* Save FP context, including the 32 FP data registers and the FP
|
||||
* control & status register, from the FPU to signal context.
|
||||
*/
|
||||
LEAF(_save_fp_context)
|
||||
mfc0 t0,CP0_STATUS
|
||||
sll t0,t0,2
|
||||
|
@ -30,59 +37,59 @@
|
|||
|
||||
cfc1 t1,fcr31
|
||||
/* Store the 16 double precision registers */
|
||||
sdc1 $f0,(SC_FPREGS+0)(a0)
|
||||
sdc1 $f2,(SC_FPREGS+16)(a0)
|
||||
sdc1 $f4,(SC_FPREGS+32)(a0)
|
||||
sdc1 $f6,(SC_FPREGS+48)(a0)
|
||||
sdc1 $f8,(SC_FPREGS+64)(a0)
|
||||
sdc1 $f10,(SC_FPREGS+80)(a0)
|
||||
sdc1 $f12,(SC_FPREGS+96)(a0)
|
||||
sdc1 $f14,(SC_FPREGS+112)(a0)
|
||||
sdc1 $f16,(SC_FPREGS+128)(a0)
|
||||
sdc1 $f18,(SC_FPREGS+144)(a0)
|
||||
sdc1 $f20,(SC_FPREGS+160)(a0)
|
||||
sdc1 $f22,(SC_FPREGS+176)(a0)
|
||||
sdc1 $f24,(SC_FPREGS+192)(a0)
|
||||
sdc1 $f26,(SC_FPREGS+208)(a0)
|
||||
sdc1 $f28,(SC_FPREGS+224)(a0)
|
||||
sdc1 $f30,(SC_FPREGS+240)(a0)
|
||||
sdc1 $f0,0(a0)
|
||||
sdc1 $f2,16(a0)
|
||||
sdc1 $f4,32(a0)
|
||||
sdc1 $f6,48(a0)
|
||||
sdc1 $f8,64(a0)
|
||||
sdc1 $f10,80(a0)
|
||||
sdc1 $f12,96(a0)
|
||||
sdc1 $f14,112(a0)
|
||||
sdc1 $f16,128(a0)
|
||||
sdc1 $f18,144(a0)
|
||||
sdc1 $f20,160(a0)
|
||||
sdc1 $f22,176(a0)
|
||||
sdc1 $f24,192(a0)
|
||||
sdc1 $f26,208(a0)
|
||||
sdc1 $f28,224(a0)
|
||||
sdc1 $f30,240(a0)
|
||||
jr ra
|
||||
sw t0,SC_FPC_CSR(a0)
|
||||
sw t0,(a1)
|
||||
1: jr ra
|
||||
nop
|
||||
END(_save_fp_context)
|
||||
|
||||
/* Restore FPU state:
|
||||
* - fp gp registers
|
||||
* - cp1 status/control register
|
||||
/**
|
||||
* _restore_fp_context() - restore FP context to the FPU
|
||||
* @a0 - pointer to fpregs field of sigcontext
|
||||
* @a1 - pointer to fpc_csr field of sigcontext
|
||||
*
|
||||
* We base the decision which registers to restore from the signal stack
|
||||
* frame on the current content of c0_status, not on the content of the
|
||||
* stack frame which might have been changed by the user.
|
||||
* Restore FP context, including the 32 FP data registers and the FP
|
||||
* control & status register, from signal context to the FPU.
|
||||
*/
|
||||
LEAF(_restore_fp_context)
|
||||
mfc0 t0,CP0_STATUS
|
||||
sll t0,t0,2
|
||||
|
||||
bgez t0,1f
|
||||
lw t0,SC_FPC_CSR(a0)
|
||||
lw t0,(a1)
|
||||
/* Restore the 16 double precision registers */
|
||||
ldc1 $f0,(SC_FPREGS+0)(a0)
|
||||
ldc1 $f2,(SC_FPREGS+16)(a0)
|
||||
ldc1 $f4,(SC_FPREGS+32)(a0)
|
||||
ldc1 $f6,(SC_FPREGS+48)(a0)
|
||||
ldc1 $f8,(SC_FPREGS+64)(a0)
|
||||
ldc1 $f10,(SC_FPREGS+80)(a0)
|
||||
ldc1 $f12,(SC_FPREGS+96)(a0)
|
||||
ldc1 $f14,(SC_FPREGS+112)(a0)
|
||||
ldc1 $f16,(SC_FPREGS+128)(a0)
|
||||
ldc1 $f18,(SC_FPREGS+144)(a0)
|
||||
ldc1 $f20,(SC_FPREGS+160)(a0)
|
||||
ldc1 $f22,(SC_FPREGS+176)(a0)
|
||||
ldc1 $f24,(SC_FPREGS+192)(a0)
|
||||
ldc1 $f26,(SC_FPREGS+208)(a0)
|
||||
ldc1 $f28,(SC_FPREGS+224)(a0)
|
||||
ldc1 $f30,(SC_FPREGS+240)(a0)
|
||||
ldc1 $f0,0(a0)
|
||||
ldc1 $f2,16(a0)
|
||||
ldc1 $f4,32(a0)
|
||||
ldc1 $f6,48(a0)
|
||||
ldc1 $f8,64(a0)
|
||||
ldc1 $f10,80(a0)
|
||||
ldc1 $f12,96(a0)
|
||||
ldc1 $f14,112(a0)
|
||||
ldc1 $f16,128(a0)
|
||||
ldc1 $f18,144(a0)
|
||||
ldc1 $f20,160(a0)
|
||||
ldc1 $f22,176(a0)
|
||||
ldc1 $f24,192(a0)
|
||||
ldc1 $f26,208(a0)
|
||||
ldc1 $f28,224(a0)
|
||||
ldc1 $f30,240(a0)
|
||||
jr ra
|
||||
ctc1 t0,fcr31
|
||||
1: jr ra
|
||||
|
|
|
@ -200,7 +200,7 @@ static inline __init unsigned long get_random_boot(void)
|
|||
|
||||
#if defined(CONFIG_USE_OF)
|
||||
/* Get any additional entropy passed in device tree */
|
||||
{
|
||||
if (initial_boot_params) {
|
||||
int node, len;
|
||||
u64 *prop;
|
||||
|
||||
|
|
|
@ -368,6 +368,19 @@ static void __init bootmem_init(void)
|
|||
end = PFN_DOWN(boot_mem_map.map[i].addr
|
||||
+ boot_mem_map.map[i].size);
|
||||
|
||||
#ifndef CONFIG_HIGHMEM
|
||||
/*
|
||||
* Skip highmem here so we get an accurate max_low_pfn if low
|
||||
* memory stops short of high memory.
|
||||
* If the region overlaps HIGHMEM_START, end is clipped so
|
||||
* max_pfn excludes the highmem portion.
|
||||
*/
|
||||
if (start >= PFN_DOWN(HIGHMEM_START))
|
||||
continue;
|
||||
if (end > PFN_DOWN(HIGHMEM_START))
|
||||
end = PFN_DOWN(HIGHMEM_START);
|
||||
#endif
|
||||
|
||||
if (end > max_low_pfn)
|
||||
max_low_pfn = end;
|
||||
if (start < min_low_pfn)
|
||||
|
|
|
@ -156,7 +156,7 @@ static void show_backtrace(struct task_struct *task, const struct pt_regs *regs)
|
|||
print_ip_sym(pc);
|
||||
pc = unwind_stack(task, &sp, pc, &ra);
|
||||
} while (pc);
|
||||
printk("\n");
|
||||
pr_cont("\n");
|
||||
}
|
||||
|
||||
/*
|
||||
|
@ -174,22 +174,24 @@ static void show_stacktrace(struct task_struct *task,
|
|||
printk("Stack :");
|
||||
i = 0;
|
||||
while ((unsigned long) sp & (PAGE_SIZE - 1)) {
|
||||
if (i && ((i % (64 / field)) == 0))
|
||||
printk("\n ");
|
||||
if (i && ((i % (64 / field)) == 0)) {
|
||||
pr_cont("\n");
|
||||
printk(" ");
|
||||
}
|
||||
if (i > 39) {
|
||||
printk(" ...");
|
||||
pr_cont(" ...");
|
||||
break;
|
||||
}
|
||||
|
||||
if (__get_user(stackdata, sp++)) {
|
||||
printk(" (Bad stack address)");
|
||||
pr_cont(" (Bad stack address)");
|
||||
break;
|
||||
}
|
||||
|
||||
printk(" %0*lx", field, stackdata);
|
||||
pr_cont(" %0*lx", field, stackdata);
|
||||
i++;
|
||||
}
|
||||
printk("\n");
|
||||
pr_cont("\n");
|
||||
show_backtrace(task, regs);
|
||||
}
|
||||
|
||||
|
@ -229,18 +231,19 @@ static void show_code(unsigned int __user *pc)
|
|||
long i;
|
||||
unsigned short __user *pc16 = NULL;
|
||||
|
||||
printk("\nCode:");
|
||||
printk("Code:");
|
||||
|
||||
if ((unsigned long)pc & 1)
|
||||
pc16 = (unsigned short __user *)((unsigned long)pc & ~1);
|
||||
for(i = -3 ; i < 6 ; i++) {
|
||||
unsigned int insn;
|
||||
if (pc16 ? __get_user(insn, pc16 + i) : __get_user(insn, pc + i)) {
|
||||
printk(" (Bad address in epc)\n");
|
||||
pr_cont(" (Bad address in epc)\n");
|
||||
break;
|
||||
}
|
||||
printk("%c%0*x%c", (i?' ':'<'), pc16 ? 4 : 8, insn, (i?' ':'>'));
|
||||
pr_cont("%c%0*x%c", (i?' ':'<'), pc16 ? 4 : 8, insn, (i?' ':'>'));
|
||||
}
|
||||
pr_cont("\n");
|
||||
}
|
||||
|
||||
static void __show_regs(const struct pt_regs *regs)
|
||||
|
@ -259,15 +262,15 @@ static void __show_regs(const struct pt_regs *regs)
|
|||
if ((i % 4) == 0)
|
||||
printk("$%2d :", i);
|
||||
if (i == 0)
|
||||
printk(" %0*lx", field, 0UL);
|
||||
pr_cont(" %0*lx", field, 0UL);
|
||||
else if (i == 26 || i == 27)
|
||||
printk(" %*s", field, "");
|
||||
pr_cont(" %*s", field, "");
|
||||
else
|
||||
printk(" %0*lx", field, regs->regs[i]);
|
||||
pr_cont(" %0*lx", field, regs->regs[i]);
|
||||
|
||||
i++;
|
||||
if ((i % 4) == 0)
|
||||
printk("\n");
|
||||
pr_cont("\n");
|
||||
}
|
||||
|
||||
#ifdef CONFIG_CPU_HAS_SMARTMIPS
|
||||
|
@ -288,46 +291,46 @@ static void __show_regs(const struct pt_regs *regs)
|
|||
|
||||
if (cpu_has_3kex) {
|
||||
if (regs->cp0_status & ST0_KUO)
|
||||
printk("KUo ");
|
||||
pr_cont("KUo ");
|
||||
if (regs->cp0_status & ST0_IEO)
|
||||
printk("IEo ");
|
||||
pr_cont("IEo ");
|
||||
if (regs->cp0_status & ST0_KUP)
|
||||
printk("KUp ");
|
||||
pr_cont("KUp ");
|
||||
if (regs->cp0_status & ST0_IEP)
|
||||
printk("IEp ");
|
||||
pr_cont("IEp ");
|
||||
if (regs->cp0_status & ST0_KUC)
|
||||
printk("KUc ");
|
||||
pr_cont("KUc ");
|
||||
if (regs->cp0_status & ST0_IEC)
|
||||
printk("IEc ");
|
||||
pr_cont("IEc ");
|
||||
} else if (cpu_has_4kex) {
|
||||
if (regs->cp0_status & ST0_KX)
|
||||
printk("KX ");
|
||||
pr_cont("KX ");
|
||||
if (regs->cp0_status & ST0_SX)
|
||||
printk("SX ");
|
||||
pr_cont("SX ");
|
||||
if (regs->cp0_status & ST0_UX)
|
||||
printk("UX ");
|
||||
pr_cont("UX ");
|
||||
switch (regs->cp0_status & ST0_KSU) {
|
||||
case KSU_USER:
|
||||
printk("USER ");
|
||||
pr_cont("USER ");
|
||||
break;
|
||||
case KSU_SUPERVISOR:
|
||||
printk("SUPERVISOR ");
|
||||
pr_cont("SUPERVISOR ");
|
||||
break;
|
||||
case KSU_KERNEL:
|
||||
printk("KERNEL ");
|
||||
pr_cont("KERNEL ");
|
||||
break;
|
||||
default:
|
||||
printk("BAD_MODE ");
|
||||
pr_cont("BAD_MODE ");
|
||||
break;
|
||||
}
|
||||
if (regs->cp0_status & ST0_ERL)
|
||||
printk("ERL ");
|
||||
pr_cont("ERL ");
|
||||
if (regs->cp0_status & ST0_EXL)
|
||||
printk("EXL ");
|
||||
pr_cont("EXL ");
|
||||
if (regs->cp0_status & ST0_IE)
|
||||
printk("IE ");
|
||||
pr_cont("IE ");
|
||||
}
|
||||
printk("\n");
|
||||
pr_cont("\n");
|
||||
|
||||
exccode = (cause & CAUSEF_EXCCODE) >> CAUSEB_EXCCODE;
|
||||
printk("Cause : %08x (ExcCode %02x)\n", cause, exccode);
|
||||
|
@ -705,6 +708,32 @@ asmlinkage void do_ov(struct pt_regs *regs)
|
|||
exception_exit(prev_state);
|
||||
}
|
||||
|
||||
/*
|
||||
* Send SIGFPE according to FCSR Cause bits, which must have already
|
||||
* been masked against Enable bits. This is impotant as Inexact can
|
||||
* happen together with Overflow or Underflow, and `ptrace' can set
|
||||
* any bits.
|
||||
*/
|
||||
void force_fcr31_sig(unsigned long fcr31, void __user *fault_addr,
|
||||
struct task_struct *tsk)
|
||||
{
|
||||
struct siginfo si = { .si_addr = fault_addr, .si_signo = SIGFPE };
|
||||
|
||||
if (fcr31 & FPU_CSR_INV_X)
|
||||
si.si_code = FPE_FLTINV;
|
||||
else if (fcr31 & FPU_CSR_DIV_X)
|
||||
si.si_code = FPE_FLTDIV;
|
||||
else if (fcr31 & FPU_CSR_OVF_X)
|
||||
si.si_code = FPE_FLTOVF;
|
||||
else if (fcr31 & FPU_CSR_UDF_X)
|
||||
si.si_code = FPE_FLTUND;
|
||||
else if (fcr31 & FPU_CSR_INE_X)
|
||||
si.si_code = FPE_FLTRES;
|
||||
else
|
||||
si.si_code = __SI_FAULT;
|
||||
force_sig_info(SIGFPE, &si, tsk);
|
||||
}
|
||||
|
||||
int process_fpemu_return(int sig, void __user *fault_addr, unsigned long fcr31)
|
||||
{
|
||||
struct siginfo si = { 0 };
|
||||
|
@ -715,27 +744,7 @@ int process_fpemu_return(int sig, void __user *fault_addr, unsigned long fcr31)
|
|||
return 0;
|
||||
|
||||
case SIGFPE:
|
||||
si.si_addr = fault_addr;
|
||||
si.si_signo = sig;
|
||||
/*
|
||||
* Inexact can happen together with Overflow or Underflow.
|
||||
* Respect the mask to deliver the correct exception.
|
||||
*/
|
||||
fcr31 &= (fcr31 & FPU_CSR_ALL_E) <<
|
||||
(ffs(FPU_CSR_ALL_X) - ffs(FPU_CSR_ALL_E));
|
||||
if (fcr31 & FPU_CSR_INV_X)
|
||||
si.si_code = FPE_FLTINV;
|
||||
else if (fcr31 & FPU_CSR_DIV_X)
|
||||
si.si_code = FPE_FLTDIV;
|
||||
else if (fcr31 & FPU_CSR_OVF_X)
|
||||
si.si_code = FPE_FLTOVF;
|
||||
else if (fcr31 & FPU_CSR_UDF_X)
|
||||
si.si_code = FPE_FLTUND;
|
||||
else if (fcr31 & FPU_CSR_INE_X)
|
||||
si.si_code = FPE_FLTRES;
|
||||
else
|
||||
si.si_code = __SI_FAULT;
|
||||
force_sig_info(sig, &si, current);
|
||||
force_fcr31_sig(fcr31, fault_addr, current);
|
||||
return 1;
|
||||
|
||||
case SIGBUS:
|
||||
|
@ -799,13 +808,13 @@ static int simulate_fp(struct pt_regs *regs, unsigned int opcode,
|
|||
/* Run the emulator */
|
||||
sig = fpu_emulator_cop1Handler(regs, ¤t->thread.fpu, 1,
|
||||
&fault_addr);
|
||||
fcr31 = current->thread.fpu.fcr31;
|
||||
|
||||
/*
|
||||
* We can't allow the emulated instruction to leave any of
|
||||
* the cause bits set in $fcr31.
|
||||
* We can't allow the emulated instruction to leave any
|
||||
* enabled Cause bits set in $fcr31.
|
||||
*/
|
||||
current->thread.fpu.fcr31 &= ~FPU_CSR_ALL_X;
|
||||
fcr31 = mask_fcr31_x(current->thread.fpu.fcr31);
|
||||
current->thread.fpu.fcr31 &= ~fcr31;
|
||||
|
||||
/* Restore the hardware register state */
|
||||
own_fpu(1);
|
||||
|
@ -831,7 +840,7 @@ asmlinkage void do_fpe(struct pt_regs *regs, unsigned long fcr31)
|
|||
goto out;
|
||||
|
||||
/* Clear FCSR.Cause before enabling interrupts */
|
||||
write_32bit_cp1_register(CP1_STATUS, fcr31 & ~FPU_CSR_ALL_X);
|
||||
write_32bit_cp1_register(CP1_STATUS, fcr31 & ~mask_fcr31_x(fcr31));
|
||||
local_irq_enable();
|
||||
|
||||
die_if_kernel("FP exception in kernel code", regs);
|
||||
|
@ -853,13 +862,13 @@ asmlinkage void do_fpe(struct pt_regs *regs, unsigned long fcr31)
|
|||
/* Run the emulator */
|
||||
sig = fpu_emulator_cop1Handler(regs, ¤t->thread.fpu, 1,
|
||||
&fault_addr);
|
||||
fcr31 = current->thread.fpu.fcr31;
|
||||
|
||||
/*
|
||||
* We can't allow the emulated instruction to leave any of
|
||||
* the cause bits set in $fcr31.
|
||||
* We can't allow the emulated instruction to leave any
|
||||
* enabled Cause bits set in $fcr31.
|
||||
*/
|
||||
current->thread.fpu.fcr31 &= ~FPU_CSR_ALL_X;
|
||||
fcr31 = mask_fcr31_x(current->thread.fpu.fcr31);
|
||||
current->thread.fpu.fcr31 &= ~fcr31;
|
||||
|
||||
/* Restore the hardware register state */
|
||||
own_fpu(1); /* Using the FPU again. */
|
||||
|
@ -1424,13 +1433,13 @@ asmlinkage void do_cpu(struct pt_regs *regs)
|
|||
|
||||
sig = fpu_emulator_cop1Handler(regs, ¤t->thread.fpu, 0,
|
||||
&fault_addr);
|
||||
fcr31 = current->thread.fpu.fcr31;
|
||||
|
||||
/*
|
||||
* We can't allow the emulated instruction to leave
|
||||
* any of the cause bits set in $fcr31.
|
||||
* any enabled Cause bits set in $fcr31.
|
||||
*/
|
||||
current->thread.fpu.fcr31 &= ~FPU_CSR_ALL_X;
|
||||
fcr31 = mask_fcr31_x(current->thread.fpu.fcr31);
|
||||
current->thread.fpu.fcr31 &= ~fcr31;
|
||||
|
||||
/* Send a signal if required. */
|
||||
if (!process_fpemu_return(sig, fault_addr, fcr31) && !err)
|
||||
|
|
|
@ -790,15 +790,15 @@ enum emulation_result kvm_mips_emul_eret(struct kvm_vcpu *vcpu)
|
|||
struct mips_coproc *cop0 = vcpu->arch.cop0;
|
||||
enum emulation_result er = EMULATE_DONE;
|
||||
|
||||
if (kvm_read_c0_guest_status(cop0) & ST0_EXL) {
|
||||
if (kvm_read_c0_guest_status(cop0) & ST0_ERL) {
|
||||
kvm_clear_c0_guest_status(cop0, ST0_ERL);
|
||||
vcpu->arch.pc = kvm_read_c0_guest_errorepc(cop0);
|
||||
} else if (kvm_read_c0_guest_status(cop0) & ST0_EXL) {
|
||||
kvm_debug("[%#lx] ERET to %#lx\n", vcpu->arch.pc,
|
||||
kvm_read_c0_guest_epc(cop0));
|
||||
kvm_clear_c0_guest_status(cop0, ST0_EXL);
|
||||
vcpu->arch.pc = kvm_read_c0_guest_epc(cop0);
|
||||
|
||||
} else if (kvm_read_c0_guest_status(cop0) & ST0_ERL) {
|
||||
kvm_clear_c0_guest_status(cop0, ST0_ERL);
|
||||
vcpu->arch.pc = kvm_read_c0_guest_errorepc(cop0);
|
||||
} else {
|
||||
kvm_err("[%#lx] ERET when MIPS_SR_EXL|MIPS_SR_ERL == 0\n",
|
||||
vcpu->arch.pc);
|
||||
|
@ -1528,13 +1528,25 @@ enum emulation_result kvm_mips_emulate_load(union mips_instruction inst,
|
|||
struct kvm_vcpu *vcpu)
|
||||
{
|
||||
enum emulation_result er = EMULATE_DO_MMIO;
|
||||
unsigned long curr_pc;
|
||||
u32 op, rt;
|
||||
u32 bytes;
|
||||
|
||||
rt = inst.i_format.rt;
|
||||
op = inst.i_format.opcode;
|
||||
|
||||
vcpu->arch.pending_load_cause = cause;
|
||||
/*
|
||||
* Find the resume PC now while we have safe and easy access to the
|
||||
* prior branch instruction, and save it for
|
||||
* kvm_mips_complete_mmio_load() to restore later.
|
||||
*/
|
||||
curr_pc = vcpu->arch.pc;
|
||||
er = update_pc(vcpu, cause);
|
||||
if (er == EMULATE_FAIL)
|
||||
return er;
|
||||
vcpu->arch.io_pc = vcpu->arch.pc;
|
||||
vcpu->arch.pc = curr_pc;
|
||||
|
||||
vcpu->arch.io_gpr = rt;
|
||||
|
||||
switch (op) {
|
||||
|
@ -2494,9 +2506,8 @@ enum emulation_result kvm_mips_complete_mmio_load(struct kvm_vcpu *vcpu,
|
|||
goto done;
|
||||
}
|
||||
|
||||
er = update_pc(vcpu, vcpu->arch.pending_load_cause);
|
||||
if (er == EMULATE_FAIL)
|
||||
return er;
|
||||
/* Restore saved resume PC */
|
||||
vcpu->arch.pc = vcpu->arch.io_pc;
|
||||
|
||||
switch (run->mmio.len) {
|
||||
case 4:
|
||||
|
@ -2518,11 +2529,6 @@ enum emulation_result kvm_mips_complete_mmio_load(struct kvm_vcpu *vcpu,
|
|||
break;
|
||||
}
|
||||
|
||||
if (vcpu->arch.pending_load_cause & CAUSEF_BD)
|
||||
kvm_debug("[%#lx] Completing %d byte BD Load to gpr %d (0x%08lx) type %d\n",
|
||||
vcpu->arch.pc, run->mmio.len, vcpu->arch.io_gpr, *gpr,
|
||||
vcpu->mmio_needed);
|
||||
|
||||
done:
|
||||
return er;
|
||||
}
|
||||
|
|
|
@ -426,7 +426,7 @@ int kvm_arch_vcpu_ioctl_set_guest_debug(struct kvm_vcpu *vcpu,
|
|||
static void kvm_mips_check_asids(struct kvm_vcpu *vcpu)
|
||||
{
|
||||
struct mips_coproc *cop0 = vcpu->arch.cop0;
|
||||
int cpu = smp_processor_id();
|
||||
int i, cpu = smp_processor_id();
|
||||
unsigned int gasid;
|
||||
|
||||
/*
|
||||
|
@ -442,6 +442,9 @@ static void kvm_mips_check_asids(struct kvm_vcpu *vcpu)
|
|||
vcpu);
|
||||
vcpu->arch.guest_user_asid[cpu] =
|
||||
vcpu->arch.guest_user_mm.context.asid[cpu];
|
||||
for_each_possible_cpu(i)
|
||||
if (i != cpu)
|
||||
vcpu->arch.guest_user_asid[cpu] = 0;
|
||||
vcpu->arch.last_user_gasid = gasid;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -260,13 +260,9 @@ void kvm_arch_vcpu_load(struct kvm_vcpu *vcpu, int cpu)
|
|||
|
||||
if ((vcpu->arch.guest_user_asid[cpu] ^ asid_cache(cpu)) &
|
||||
asid_version_mask(cpu)) {
|
||||
u32 gasid = kvm_read_c0_guest_entryhi(vcpu->arch.cop0) &
|
||||
KVM_ENTRYHI_ASID;
|
||||
|
||||
kvm_get_new_mmu_context(&vcpu->arch.guest_user_mm, cpu, vcpu);
|
||||
vcpu->arch.guest_user_asid[cpu] =
|
||||
vcpu->arch.guest_user_mm.context.asid[cpu];
|
||||
vcpu->arch.last_user_gasid = gasid;
|
||||
newasid++;
|
||||
|
||||
kvm_debug("[%d]: cpu_context: %#lx\n", cpu,
|
||||
|
|
|
@ -135,42 +135,42 @@ static void dump_tlb(int first, int last)
|
|||
c0 = (entrylo0 & ENTRYLO_C) >> ENTRYLO_C_SHIFT;
|
||||
c1 = (entrylo1 & ENTRYLO_C) >> ENTRYLO_C_SHIFT;
|
||||
|
||||
printk("va=%0*lx asid=%0*lx",
|
||||
vwidth, (entryhi & ~0x1fffUL),
|
||||
asidwidth, entryhi & asidmask);
|
||||
pr_cont("va=%0*lx asid=%0*lx",
|
||||
vwidth, (entryhi & ~0x1fffUL),
|
||||
asidwidth, entryhi & asidmask);
|
||||
if (cpu_has_guestid)
|
||||
printk(" gid=%02lx",
|
||||
(guestctl1 & MIPS_GCTL1_RID)
|
||||
pr_cont(" gid=%02lx",
|
||||
(guestctl1 & MIPS_GCTL1_RID)
|
||||
>> MIPS_GCTL1_RID_SHIFT);
|
||||
/* RI/XI are in awkward places, so mask them off separately */
|
||||
pa = entrylo0 & ~(MIPS_ENTRYLO_RI | MIPS_ENTRYLO_XI);
|
||||
if (xpa)
|
||||
pa |= (unsigned long long)readx_c0_entrylo0() << 30;
|
||||
pa = (pa << 6) & PAGE_MASK;
|
||||
printk("\n\t[");
|
||||
pr_cont("\n\t[");
|
||||
if (cpu_has_rixi)
|
||||
printk("ri=%d xi=%d ",
|
||||
(entrylo0 & MIPS_ENTRYLO_RI) ? 1 : 0,
|
||||
(entrylo0 & MIPS_ENTRYLO_XI) ? 1 : 0);
|
||||
printk("pa=%0*llx c=%d d=%d v=%d g=%d] [",
|
||||
pwidth, pa, c0,
|
||||
(entrylo0 & ENTRYLO_D) ? 1 : 0,
|
||||
(entrylo0 & ENTRYLO_V) ? 1 : 0,
|
||||
(entrylo0 & ENTRYLO_G) ? 1 : 0);
|
||||
pr_cont("ri=%d xi=%d ",
|
||||
(entrylo0 & MIPS_ENTRYLO_RI) ? 1 : 0,
|
||||
(entrylo0 & MIPS_ENTRYLO_XI) ? 1 : 0);
|
||||
pr_cont("pa=%0*llx c=%d d=%d v=%d g=%d] [",
|
||||
pwidth, pa, c0,
|
||||
(entrylo0 & ENTRYLO_D) ? 1 : 0,
|
||||
(entrylo0 & ENTRYLO_V) ? 1 : 0,
|
||||
(entrylo0 & ENTRYLO_G) ? 1 : 0);
|
||||
/* RI/XI are in awkward places, so mask them off separately */
|
||||
pa = entrylo1 & ~(MIPS_ENTRYLO_RI | MIPS_ENTRYLO_XI);
|
||||
if (xpa)
|
||||
pa |= (unsigned long long)readx_c0_entrylo1() << 30;
|
||||
pa = (pa << 6) & PAGE_MASK;
|
||||
if (cpu_has_rixi)
|
||||
printk("ri=%d xi=%d ",
|
||||
(entrylo1 & MIPS_ENTRYLO_RI) ? 1 : 0,
|
||||
(entrylo1 & MIPS_ENTRYLO_XI) ? 1 : 0);
|
||||
printk("pa=%0*llx c=%d d=%d v=%d g=%d]\n",
|
||||
pwidth, pa, c1,
|
||||
(entrylo1 & ENTRYLO_D) ? 1 : 0,
|
||||
(entrylo1 & ENTRYLO_V) ? 1 : 0,
|
||||
(entrylo1 & ENTRYLO_G) ? 1 : 0);
|
||||
pr_cont("ri=%d xi=%d ",
|
||||
(entrylo1 & MIPS_ENTRYLO_RI) ? 1 : 0,
|
||||
(entrylo1 & MIPS_ENTRYLO_XI) ? 1 : 0);
|
||||
pr_cont("pa=%0*llx c=%d d=%d v=%d g=%d]\n",
|
||||
pwidth, pa, c1,
|
||||
(entrylo1 & ENTRYLO_D) ? 1 : 0,
|
||||
(entrylo1 & ENTRYLO_V) ? 1 : 0,
|
||||
(entrylo1 & ENTRYLO_G) ? 1 : 0);
|
||||
}
|
||||
printk("\n");
|
||||
|
||||
|
|
|
@ -53,15 +53,15 @@ static void dump_tlb(int first, int last)
|
|||
*/
|
||||
printk("Index: %2d ", i);
|
||||
|
||||
printk("va=%08lx asid=%08lx"
|
||||
" [pa=%06lx n=%d d=%d v=%d g=%d]",
|
||||
entryhi & PAGE_MASK,
|
||||
entryhi & asid_mask,
|
||||
entrylo0 & PAGE_MASK,
|
||||
(entrylo0 & R3K_ENTRYLO_N) ? 1 : 0,
|
||||
(entrylo0 & R3K_ENTRYLO_D) ? 1 : 0,
|
||||
(entrylo0 & R3K_ENTRYLO_V) ? 1 : 0,
|
||||
(entrylo0 & R3K_ENTRYLO_G) ? 1 : 0);
|
||||
pr_cont("va=%08lx asid=%08lx"
|
||||
" [pa=%06lx n=%d d=%d v=%d g=%d]",
|
||||
entryhi & PAGE_MASK,
|
||||
entryhi & asid_mask,
|
||||
entrylo0 & PAGE_MASK,
|
||||
(entrylo0 & R3K_ENTRYLO_N) ? 1 : 0,
|
||||
(entrylo0 & R3K_ENTRYLO_D) ? 1 : 0,
|
||||
(entrylo0 & R3K_ENTRYLO_V) ? 1 : 0,
|
||||
(entrylo0 & R3K_ENTRYLO_G) ? 1 : 0);
|
||||
}
|
||||
}
|
||||
printk("\n");
|
||||
|
|
|
@ -368,7 +368,9 @@
|
|||
|
||||
#define __IGNORE_select /* newselect */
|
||||
#define __IGNORE_fadvise64 /* fadvise64_64 */
|
||||
|
||||
#define __IGNORE_pkey_mprotect
|
||||
#define __IGNORE_pkey_alloc
|
||||
#define __IGNORE_pkey_free
|
||||
|
||||
#define LINUX_GATEWAY_ADDR 0x100
|
||||
|
||||
|
|
|
@ -873,11 +873,11 @@ static void print_parisc_device(struct parisc_device *dev)
|
|||
|
||||
if (dev->num_addrs) {
|
||||
int k;
|
||||
printk(", additional addresses: ");
|
||||
pr_cont(", additional addresses: ");
|
||||
for (k = 0; k < dev->num_addrs; k++)
|
||||
printk("0x%lx ", dev->addr[k]);
|
||||
pr_cont("0x%lx ", dev->addr[k]);
|
||||
}
|
||||
printk("\n");
|
||||
pr_cont("\n");
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
|
@ -100,14 +100,12 @@ set_thread_pointer:
|
|||
.endr
|
||||
|
||||
/* This address must remain fixed at 0x100 for glibc's syscalls to work */
|
||||
.align 256
|
||||
.align LINUX_GATEWAY_ADDR
|
||||
linux_gateway_entry:
|
||||
gate .+8, %r0 /* become privileged */
|
||||
mtsp %r0,%sr4 /* get kernel space into sr4 */
|
||||
mtsp %r0,%sr5 /* get kernel space into sr5 */
|
||||
mtsp %r0,%sr6 /* get kernel space into sr6 */
|
||||
mfsp %sr7,%r1 /* save user sr7 */
|
||||
mtsp %r1,%sr3 /* and store it in sr3 */
|
||||
|
||||
#ifdef CONFIG_64BIT
|
||||
/* for now we can *always* set the W bit on entry to the syscall
|
||||
|
@ -133,6 +131,14 @@ linux_gateway_entry:
|
|||
depdi 0, 31, 32, %r21
|
||||
1:
|
||||
#endif
|
||||
|
||||
/* We use a rsm/ssm pair to prevent sr3 from being clobbered
|
||||
* by external interrupts.
|
||||
*/
|
||||
mfsp %sr7,%r1 /* save user sr7 */
|
||||
rsm PSW_SM_I, %r0 /* disable interrupts */
|
||||
mtsp %r1,%sr3 /* and store it in sr3 */
|
||||
|
||||
mfctl %cr30,%r1
|
||||
xor %r1,%r30,%r30 /* ye olde xor trick */
|
||||
xor %r1,%r30,%r1
|
||||
|
@ -147,6 +153,7 @@ linux_gateway_entry:
|
|||
*/
|
||||
|
||||
mtsp %r0,%sr7 /* get kernel space into sr7 */
|
||||
ssm PSW_SM_I, %r0 /* enable interrupts */
|
||||
STREGM %r1,FRAME_SIZE(%r30) /* save r1 (usp) here for now */
|
||||
mfctl %cr30,%r1 /* get task ptr in %r1 */
|
||||
LDREG TI_TASK(%r1),%r1
|
||||
|
@ -474,11 +481,6 @@ lws_start:
|
|||
comiclr,>> __NR_lws_entries, %r20, %r0
|
||||
b,n lws_exit_nosys
|
||||
|
||||
/* WARNING: Trashing sr2 and sr3 */
|
||||
mfsp %sr7,%r1 /* get userspace into sr3 */
|
||||
mtsp %r1,%sr3
|
||||
mtsp %r0,%sr2 /* get kernel space into sr2 */
|
||||
|
||||
/* Load table start */
|
||||
ldil L%lws_table, %r1
|
||||
ldo R%lws_table(%r1), %r28 /* Scratch use of r28 */
|
||||
|
@ -627,9 +629,9 @@ cas_action:
|
|||
stw %r1, 4(%sr2,%r20)
|
||||
#endif
|
||||
/* The load and store could fail */
|
||||
1: ldw,ma 0(%sr3,%r26), %r28
|
||||
1: ldw,ma 0(%r26), %r28
|
||||
sub,<> %r28, %r25, %r0
|
||||
2: stw,ma %r24, 0(%sr3,%r26)
|
||||
2: stw,ma %r24, 0(%r26)
|
||||
/* Free lock */
|
||||
stw,ma %r20, 0(%sr2,%r20)
|
||||
#if ENABLE_LWS_DEBUG
|
||||
|
@ -706,9 +708,9 @@ lws_compare_and_swap_2:
|
|||
nop
|
||||
|
||||
/* 8bit load */
|
||||
4: ldb 0(%sr3,%r25), %r25
|
||||
4: ldb 0(%r25), %r25
|
||||
b cas2_lock_start
|
||||
5: ldb 0(%sr3,%r24), %r24
|
||||
5: ldb 0(%r24), %r24
|
||||
nop
|
||||
nop
|
||||
nop
|
||||
|
@ -716,9 +718,9 @@ lws_compare_and_swap_2:
|
|||
nop
|
||||
|
||||
/* 16bit load */
|
||||
6: ldh 0(%sr3,%r25), %r25
|
||||
6: ldh 0(%r25), %r25
|
||||
b cas2_lock_start
|
||||
7: ldh 0(%sr3,%r24), %r24
|
||||
7: ldh 0(%r24), %r24
|
||||
nop
|
||||
nop
|
||||
nop
|
||||
|
@ -726,9 +728,9 @@ lws_compare_and_swap_2:
|
|||
nop
|
||||
|
||||
/* 32bit load */
|
||||
8: ldw 0(%sr3,%r25), %r25
|
||||
8: ldw 0(%r25), %r25
|
||||
b cas2_lock_start
|
||||
9: ldw 0(%sr3,%r24), %r24
|
||||
9: ldw 0(%r24), %r24
|
||||
nop
|
||||
nop
|
||||
nop
|
||||
|
@ -737,14 +739,14 @@ lws_compare_and_swap_2:
|
|||
|
||||
/* 64bit load */
|
||||
#ifdef CONFIG_64BIT
|
||||
10: ldd 0(%sr3,%r25), %r25
|
||||
11: ldd 0(%sr3,%r24), %r24
|
||||
10: ldd 0(%r25), %r25
|
||||
11: ldd 0(%r24), %r24
|
||||
#else
|
||||
/* Load new value into r22/r23 - high/low */
|
||||
10: ldw 0(%sr3,%r25), %r22
|
||||
11: ldw 4(%sr3,%r25), %r23
|
||||
10: ldw 0(%r25), %r22
|
||||
11: ldw 4(%r25), %r23
|
||||
/* Load new value into fr4 for atomic store later */
|
||||
12: flddx 0(%sr3,%r24), %fr4
|
||||
12: flddx 0(%r24), %fr4
|
||||
#endif
|
||||
|
||||
cas2_lock_start:
|
||||
|
@ -794,30 +796,30 @@ cas2_action:
|
|||
ldo 1(%r0),%r28
|
||||
|
||||
/* 8bit CAS */
|
||||
13: ldb,ma 0(%sr3,%r26), %r29
|
||||
13: ldb,ma 0(%r26), %r29
|
||||
sub,= %r29, %r25, %r0
|
||||
b,n cas2_end
|
||||
14: stb,ma %r24, 0(%sr3,%r26)
|
||||
14: stb,ma %r24, 0(%r26)
|
||||
b cas2_end
|
||||
copy %r0, %r28
|
||||
nop
|
||||
nop
|
||||
|
||||
/* 16bit CAS */
|
||||
15: ldh,ma 0(%sr3,%r26), %r29
|
||||
15: ldh,ma 0(%r26), %r29
|
||||
sub,= %r29, %r25, %r0
|
||||
b,n cas2_end
|
||||
16: sth,ma %r24, 0(%sr3,%r26)
|
||||
16: sth,ma %r24, 0(%r26)
|
||||
b cas2_end
|
||||
copy %r0, %r28
|
||||
nop
|
||||
nop
|
||||
|
||||
/* 32bit CAS */
|
||||
17: ldw,ma 0(%sr3,%r26), %r29
|
||||
17: ldw,ma 0(%r26), %r29
|
||||
sub,= %r29, %r25, %r0
|
||||
b,n cas2_end
|
||||
18: stw,ma %r24, 0(%sr3,%r26)
|
||||
18: stw,ma %r24, 0(%r26)
|
||||
b cas2_end
|
||||
copy %r0, %r28
|
||||
nop
|
||||
|
@ -825,22 +827,22 @@ cas2_action:
|
|||
|
||||
/* 64bit CAS */
|
||||
#ifdef CONFIG_64BIT
|
||||
19: ldd,ma 0(%sr3,%r26), %r29
|
||||
19: ldd,ma 0(%r26), %r29
|
||||
sub,*= %r29, %r25, %r0
|
||||
b,n cas2_end
|
||||
20: std,ma %r24, 0(%sr3,%r26)
|
||||
20: std,ma %r24, 0(%r26)
|
||||
copy %r0, %r28
|
||||
#else
|
||||
/* Compare first word */
|
||||
19: ldw,ma 0(%sr3,%r26), %r29
|
||||
19: ldw,ma 0(%r26), %r29
|
||||
sub,= %r29, %r22, %r0
|
||||
b,n cas2_end
|
||||
/* Compare second word */
|
||||
20: ldw,ma 4(%sr3,%r26), %r29
|
||||
20: ldw,ma 4(%r26), %r29
|
||||
sub,= %r29, %r23, %r0
|
||||
b,n cas2_end
|
||||
/* Perform the store */
|
||||
21: fstdx %fr4, 0(%sr3,%r26)
|
||||
21: fstdx %fr4, 0(%r26)
|
||||
copy %r0, %r28
|
||||
#endif
|
||||
|
||||
|
|
|
@ -53,10 +53,8 @@ static inline __sum16 csum_fold(__wsum sum)
|
|||
return (__force __sum16)(~((__force u32)sum + tmp) >> 16);
|
||||
}
|
||||
|
||||
static inline __wsum csum_tcpudp_nofold(__be32 saddr, __be32 daddr,
|
||||
unsigned short len,
|
||||
unsigned short proto,
|
||||
__wsum sum)
|
||||
static inline __wsum csum_tcpudp_nofold(__be32 saddr, __be32 daddr, __u32 len,
|
||||
__u8 proto, __wsum sum)
|
||||
{
|
||||
#ifdef __powerpc64__
|
||||
unsigned long s = (__force u32)sum;
|
||||
|
@ -83,10 +81,8 @@ static inline __wsum csum_tcpudp_nofold(__be32 saddr, __be32 daddr,
|
|||
* computes the checksum of the TCP/UDP pseudo-header
|
||||
* returns a 16-bit checksum, already complemented
|
||||
*/
|
||||
static inline __sum16 csum_tcpudp_magic(__be32 saddr, __be32 daddr,
|
||||
unsigned short len,
|
||||
unsigned short proto,
|
||||
__wsum sum)
|
||||
static inline __sum16 csum_tcpudp_magic(__be32 saddr, __be32 daddr, __u32 len,
|
||||
__u8 proto, __wsum sum)
|
||||
{
|
||||
return csum_fold(csum_tcpudp_nofold(saddr, daddr, len, proto, sum));
|
||||
}
|
||||
|
|
|
@ -315,7 +315,7 @@ static void fill_diag(struct sthyi_sctns *sctns)
|
|||
if (r < 0)
|
||||
goto out;
|
||||
|
||||
diag224_buf = kmalloc(PAGE_SIZE, GFP_KERNEL | GFP_DMA);
|
||||
diag224_buf = (void *)__get_free_page(GFP_KERNEL | GFP_DMA);
|
||||
if (!diag224_buf || diag224(diag224_buf))
|
||||
goto out;
|
||||
|
||||
|
@ -378,7 +378,7 @@ static void fill_diag(struct sthyi_sctns *sctns)
|
|||
sctns->par.infpval1 |= PAR_WGHT_VLD;
|
||||
|
||||
out:
|
||||
kfree(diag224_buf);
|
||||
free_page((unsigned long)diag224_buf);
|
||||
vfree(diag204_buf);
|
||||
}
|
||||
|
||||
|
|
|
@ -24,9 +24,10 @@ typedef struct {
|
|||
unsigned int icache_line_size;
|
||||
unsigned int ecache_size;
|
||||
unsigned int ecache_line_size;
|
||||
unsigned short sock_id;
|
||||
unsigned short sock_id; /* physical package */
|
||||
unsigned short core_id;
|
||||
int proc_id;
|
||||
unsigned short max_cache_id; /* groupings of highest shared cache */
|
||||
unsigned short proc_id; /* strand (aka HW thread) id */
|
||||
} cpuinfo_sparc;
|
||||
|
||||
DECLARE_PER_CPU(cpuinfo_sparc, __cpu_data);
|
||||
|
|
|
@ -134,7 +134,7 @@ static inline void arch_write_lock(arch_rwlock_t *rw)
|
|||
*(volatile __u32 *)&lp->lock = ~0U;
|
||||
}
|
||||
|
||||
static void inline arch_write_unlock(arch_rwlock_t *lock)
|
||||
static inline void arch_write_unlock(arch_rwlock_t *lock)
|
||||
{
|
||||
__asm__ __volatile__(
|
||||
" st %%g0, [%0]"
|
||||
|
|
|
@ -96,7 +96,7 @@ static inline void arch_spin_lock_flags(arch_spinlock_t *lock, unsigned long fla
|
|||
|
||||
/* Multi-reader locks, these are much saner than the 32-bit Sparc ones... */
|
||||
|
||||
static void inline arch_read_lock(arch_rwlock_t *lock)
|
||||
static inline void arch_read_lock(arch_rwlock_t *lock)
|
||||
{
|
||||
unsigned long tmp1, tmp2;
|
||||
|
||||
|
@ -119,7 +119,7 @@ static void inline arch_read_lock(arch_rwlock_t *lock)
|
|||
: "memory");
|
||||
}
|
||||
|
||||
static int inline arch_read_trylock(arch_rwlock_t *lock)
|
||||
static inline int arch_read_trylock(arch_rwlock_t *lock)
|
||||
{
|
||||
int tmp1, tmp2;
|
||||
|
||||
|
@ -140,7 +140,7 @@ static int inline arch_read_trylock(arch_rwlock_t *lock)
|
|||
return tmp1;
|
||||
}
|
||||
|
||||
static void inline arch_read_unlock(arch_rwlock_t *lock)
|
||||
static inline void arch_read_unlock(arch_rwlock_t *lock)
|
||||
{
|
||||
unsigned long tmp1, tmp2;
|
||||
|
||||
|
@ -156,7 +156,7 @@ static void inline arch_read_unlock(arch_rwlock_t *lock)
|
|||
: "memory");
|
||||
}
|
||||
|
||||
static void inline arch_write_lock(arch_rwlock_t *lock)
|
||||
static inline void arch_write_lock(arch_rwlock_t *lock)
|
||||
{
|
||||
unsigned long mask, tmp1, tmp2;
|
||||
|
||||
|
@ -181,7 +181,7 @@ static void inline arch_write_lock(arch_rwlock_t *lock)
|
|||
: "memory");
|
||||
}
|
||||
|
||||
static void inline arch_write_unlock(arch_rwlock_t *lock)
|
||||
static inline void arch_write_unlock(arch_rwlock_t *lock)
|
||||
{
|
||||
__asm__ __volatile__(
|
||||
" stw %%g0, [%0]"
|
||||
|
@ -190,7 +190,7 @@ static void inline arch_write_unlock(arch_rwlock_t *lock)
|
|||
: "memory");
|
||||
}
|
||||
|
||||
static int inline arch_write_trylock(arch_rwlock_t *lock)
|
||||
static inline int arch_write_trylock(arch_rwlock_t *lock)
|
||||
{
|
||||
unsigned long mask, tmp1, tmp2, result;
|
||||
|
||||
|
|
|
@ -44,14 +44,20 @@ int __node_distance(int, int);
|
|||
#define topology_physical_package_id(cpu) (cpu_data(cpu).proc_id)
|
||||
#define topology_core_id(cpu) (cpu_data(cpu).core_id)
|
||||
#define topology_core_cpumask(cpu) (&cpu_core_sib_map[cpu])
|
||||
#define topology_core_cache_cpumask(cpu) (&cpu_core_sib_cache_map[cpu])
|
||||
#define topology_sibling_cpumask(cpu) (&per_cpu(cpu_sibling_map, cpu))
|
||||
#endif /* CONFIG_SMP */
|
||||
|
||||
extern cpumask_t cpu_core_map[NR_CPUS];
|
||||
extern cpumask_t cpu_core_sib_map[NR_CPUS];
|
||||
extern cpumask_t cpu_core_sib_cache_map[NR_CPUS];
|
||||
|
||||
/**
|
||||
* Return cores that shares the last level cache.
|
||||
*/
|
||||
static inline const struct cpumask *cpu_coregroup_mask(int cpu)
|
||||
{
|
||||
return &cpu_core_map[cpu];
|
||||
return &cpu_core_sib_cache_map[cpu];
|
||||
}
|
||||
|
||||
#endif /* _ASM_SPARC64_TOPOLOGY_H */
|
||||
|
|
|
@ -82,7 +82,6 @@ static inline int access_ok(int type, const void __user * addr, unsigned long si
|
|||
return 1;
|
||||
}
|
||||
|
||||
void __ret_efault(void);
|
||||
void __retl_efault(void);
|
||||
|
||||
/* Uh, these should become the main single-value transfer routines..
|
||||
|
@ -189,55 +188,34 @@ int __get_user_bad(void);
|
|||
unsigned long __must_check ___copy_from_user(void *to,
|
||||
const void __user *from,
|
||||
unsigned long size);
|
||||
unsigned long copy_from_user_fixup(void *to, const void __user *from,
|
||||
unsigned long size);
|
||||
static inline unsigned long __must_check
|
||||
copy_from_user(void *to, const void __user *from, unsigned long size)
|
||||
{
|
||||
unsigned long ret;
|
||||
|
||||
check_object_size(to, size, false);
|
||||
|
||||
ret = ___copy_from_user(to, from, size);
|
||||
if (unlikely(ret))
|
||||
ret = copy_from_user_fixup(to, from, size);
|
||||
|
||||
return ret;
|
||||
return ___copy_from_user(to, from, size);
|
||||
}
|
||||
#define __copy_from_user copy_from_user
|
||||
|
||||
unsigned long __must_check ___copy_to_user(void __user *to,
|
||||
const void *from,
|
||||
unsigned long size);
|
||||
unsigned long copy_to_user_fixup(void __user *to, const void *from,
|
||||
unsigned long size);
|
||||
static inline unsigned long __must_check
|
||||
copy_to_user(void __user *to, const void *from, unsigned long size)
|
||||
{
|
||||
unsigned long ret;
|
||||
|
||||
check_object_size(from, size, true);
|
||||
|
||||
ret = ___copy_to_user(to, from, size);
|
||||
if (unlikely(ret))
|
||||
ret = copy_to_user_fixup(to, from, size);
|
||||
return ret;
|
||||
return ___copy_to_user(to, from, size);
|
||||
}
|
||||
#define __copy_to_user copy_to_user
|
||||
|
||||
unsigned long __must_check ___copy_in_user(void __user *to,
|
||||
const void __user *from,
|
||||
unsigned long size);
|
||||
unsigned long copy_in_user_fixup(void __user *to, void __user *from,
|
||||
unsigned long size);
|
||||
static inline unsigned long __must_check
|
||||
copy_in_user(void __user *to, void __user *from, unsigned long size)
|
||||
{
|
||||
unsigned long ret = ___copy_in_user(to, from, size);
|
||||
|
||||
if (unlikely(ret))
|
||||
ret = copy_in_user_fixup(to, from, size);
|
||||
return ret;
|
||||
return ___copy_in_user(to, from, size);
|
||||
}
|
||||
#define __copy_in_user copy_in_user
|
||||
|
||||
|
|
|
@ -926,48 +926,11 @@ tlb_type: .word 0 /* Must NOT end up in BSS */
|
|||
EXPORT_SYMBOL(tlb_type)
|
||||
.section ".fixup",#alloc,#execinstr
|
||||
|
||||
.globl __ret_efault, __retl_efault, __ret_one, __retl_one
|
||||
ENTRY(__ret_efault)
|
||||
ret
|
||||
restore %g0, -EFAULT, %o0
|
||||
ENDPROC(__ret_efault)
|
||||
EXPORT_SYMBOL(__ret_efault)
|
||||
|
||||
ENTRY(__retl_efault)
|
||||
retl
|
||||
mov -EFAULT, %o0
|
||||
ENDPROC(__retl_efault)
|
||||
|
||||
ENTRY(__retl_one)
|
||||
retl
|
||||
mov 1, %o0
|
||||
ENDPROC(__retl_one)
|
||||
|
||||
ENTRY(__retl_one_fp)
|
||||
VISExitHalf
|
||||
retl
|
||||
mov 1, %o0
|
||||
ENDPROC(__retl_one_fp)
|
||||
|
||||
ENTRY(__ret_one_asi)
|
||||
wr %g0, ASI_AIUS, %asi
|
||||
ret
|
||||
restore %g0, 1, %o0
|
||||
ENDPROC(__ret_one_asi)
|
||||
|
||||
ENTRY(__retl_one_asi)
|
||||
wr %g0, ASI_AIUS, %asi
|
||||
retl
|
||||
mov 1, %o0
|
||||
ENDPROC(__retl_one_asi)
|
||||
|
||||
ENTRY(__retl_one_asi_fp)
|
||||
wr %g0, ASI_AIUS, %asi
|
||||
VISExitHalf
|
||||
retl
|
||||
mov 1, %o0
|
||||
ENDPROC(__retl_one_asi_fp)
|
||||
|
||||
ENTRY(__retl_o1)
|
||||
retl
|
||||
mov %o1, %o0
|
||||
|
|
|
@ -13,19 +13,30 @@
|
|||
void arch_jump_label_transform(struct jump_entry *entry,
|
||||
enum jump_label_type type)
|
||||
{
|
||||
u32 val;
|
||||
u32 *insn = (u32 *) (unsigned long) entry->code;
|
||||
u32 val;
|
||||
|
||||
if (type == JUMP_LABEL_JMP) {
|
||||
s32 off = (s32)entry->target - (s32)entry->code;
|
||||
bool use_v9_branch = false;
|
||||
|
||||
BUG_ON(off & 3);
|
||||
|
||||
#ifdef CONFIG_SPARC64
|
||||
/* ba,pt %xcc, . + (off << 2) */
|
||||
val = 0x10680000 | ((u32) off >> 2);
|
||||
#else
|
||||
/* ba . + (off << 2) */
|
||||
val = 0x10800000 | ((u32) off >> 2);
|
||||
if (off <= 0xfffff && off >= -0x100000)
|
||||
use_v9_branch = true;
|
||||
#endif
|
||||
if (use_v9_branch) {
|
||||
/* WDISP19 - target is . + immed << 2 */
|
||||
/* ba,pt %xcc, . + off */
|
||||
val = 0x10680000 | (((u32) off >> 2) & 0x7ffff);
|
||||
} else {
|
||||
/* WDISP22 - target is . + immed << 2 */
|
||||
BUG_ON(off > 0x7fffff);
|
||||
BUG_ON(off < -0x800000);
|
||||
/* ba . + off */
|
||||
val = 0x10800000 | (((u32) off >> 2) & 0x3fffff);
|
||||
}
|
||||
} else {
|
||||
val = 0x01000000;
|
||||
}
|
||||
|
|
|
@ -645,13 +645,20 @@ static void __mark_core_id(struct mdesc_handle *hp, u64 node,
|
|||
cpu_data(*id).core_id = core_id;
|
||||
}
|
||||
|
||||
static void __mark_sock_id(struct mdesc_handle *hp, u64 node,
|
||||
int sock_id)
|
||||
static void __mark_max_cache_id(struct mdesc_handle *hp, u64 node,
|
||||
int max_cache_id)
|
||||
{
|
||||
const u64 *id = mdesc_get_property(hp, node, "id", NULL);
|
||||
|
||||
if (*id < num_possible_cpus())
|
||||
cpu_data(*id).sock_id = sock_id;
|
||||
if (*id < num_possible_cpus()) {
|
||||
cpu_data(*id).max_cache_id = max_cache_id;
|
||||
|
||||
/**
|
||||
* On systems without explicit socket descriptions socket
|
||||
* is max_cache_id
|
||||
*/
|
||||
cpu_data(*id).sock_id = max_cache_id;
|
||||
}
|
||||
}
|
||||
|
||||
static void mark_core_ids(struct mdesc_handle *hp, u64 mp,
|
||||
|
@ -660,10 +667,11 @@ static void mark_core_ids(struct mdesc_handle *hp, u64 mp,
|
|||
find_back_node_value(hp, mp, "cpu", __mark_core_id, core_id, 10);
|
||||
}
|
||||
|
||||
static void mark_sock_ids(struct mdesc_handle *hp, u64 mp,
|
||||
int sock_id)
|
||||
static void mark_max_cache_ids(struct mdesc_handle *hp, u64 mp,
|
||||
int max_cache_id)
|
||||
{
|
||||
find_back_node_value(hp, mp, "cpu", __mark_sock_id, sock_id, 10);
|
||||
find_back_node_value(hp, mp, "cpu", __mark_max_cache_id,
|
||||
max_cache_id, 10);
|
||||
}
|
||||
|
||||
static void set_core_ids(struct mdesc_handle *hp)
|
||||
|
@ -694,14 +702,15 @@ static void set_core_ids(struct mdesc_handle *hp)
|
|||
}
|
||||
}
|
||||
|
||||
static int set_sock_ids_by_cache(struct mdesc_handle *hp, int level)
|
||||
static int set_max_cache_ids_by_cache(struct mdesc_handle *hp, int level)
|
||||
{
|
||||
u64 mp;
|
||||
int idx = 1;
|
||||
int fnd = 0;
|
||||
|
||||
/* Identify unique sockets by looking for cpus backpointed to by
|
||||
* shared level n caches.
|
||||
/**
|
||||
* Identify unique highest level of shared cache by looking for cpus
|
||||
* backpointed to by shared level N caches.
|
||||
*/
|
||||
mdesc_for_each_node_by_name(hp, mp, "cache") {
|
||||
const u64 *cur_lvl;
|
||||
|
@ -709,8 +718,7 @@ static int set_sock_ids_by_cache(struct mdesc_handle *hp, int level)
|
|||
cur_lvl = mdesc_get_property(hp, mp, "level", NULL);
|
||||
if (*cur_lvl != level)
|
||||
continue;
|
||||
|
||||
mark_sock_ids(hp, mp, idx);
|
||||
mark_max_cache_ids(hp, mp, idx);
|
||||
idx++;
|
||||
fnd = 1;
|
||||
}
|
||||
|
@ -745,15 +753,17 @@ static void set_sock_ids(struct mdesc_handle *hp)
|
|||
{
|
||||
u64 mp;
|
||||
|
||||
/* If machine description exposes sockets data use it.
|
||||
* Otherwise fallback to use shared L3 or L2 caches.
|
||||
/**
|
||||
* Find the highest level of shared cache which pre-T7 is also
|
||||
* the socket.
|
||||
*/
|
||||
if (!set_max_cache_ids_by_cache(hp, 3))
|
||||
set_max_cache_ids_by_cache(hp, 2);
|
||||
|
||||
/* If machine description exposes sockets data use it.*/
|
||||
mp = mdesc_node_by_name(hp, MDESC_NODE_NULL, "sockets");
|
||||
if (mp != MDESC_NODE_NULL)
|
||||
return set_sock_ids_by_socket(hp, mp);
|
||||
|
||||
if (!set_sock_ids_by_cache(hp, 3))
|
||||
set_sock_ids_by_cache(hp, 2);
|
||||
set_sock_ids_by_socket(hp, mp);
|
||||
}
|
||||
|
||||
static void mark_proc_ids(struct mdesc_handle *hp, u64 mp, int proc_id)
|
||||
|
|
|
@ -63,9 +63,13 @@ cpumask_t cpu_core_map[NR_CPUS] __read_mostly =
|
|||
cpumask_t cpu_core_sib_map[NR_CPUS] __read_mostly = {
|
||||
[0 ... NR_CPUS-1] = CPU_MASK_NONE };
|
||||
|
||||
cpumask_t cpu_core_sib_cache_map[NR_CPUS] __read_mostly = {
|
||||
[0 ... NR_CPUS - 1] = CPU_MASK_NONE };
|
||||
|
||||
EXPORT_PER_CPU_SYMBOL(cpu_sibling_map);
|
||||
EXPORT_SYMBOL(cpu_core_map);
|
||||
EXPORT_SYMBOL(cpu_core_sib_map);
|
||||
EXPORT_SYMBOL(cpu_core_sib_cache_map);
|
||||
|
||||
static cpumask_t smp_commenced_mask;
|
||||
|
||||
|
@ -1265,6 +1269,10 @@ void smp_fill_in_sib_core_maps(void)
|
|||
unsigned int j;
|
||||
|
||||
for_each_present_cpu(j) {
|
||||
if (cpu_data(i).max_cache_id ==
|
||||
cpu_data(j).max_cache_id)
|
||||
cpumask_set_cpu(j, &cpu_core_sib_cache_map[i]);
|
||||
|
||||
if (cpu_data(i).sock_id == cpu_data(j).sock_id)
|
||||
cpumask_set_cpu(j, &cpu_core_sib_map[i]);
|
||||
}
|
||||
|
|
|
@ -3,11 +3,11 @@
|
|||
* Copyright (C) 2007 David S. Miller (davem@davemloft.net)
|
||||
*/
|
||||
|
||||
#define EX_LD(x) \
|
||||
#define EX_LD(x,y) \
|
||||
98: x; \
|
||||
.section __ex_table,"a";\
|
||||
.align 4; \
|
||||
.word 98b, __retl_one; \
|
||||
.word 98b, y; \
|
||||
.text; \
|
||||
.align 4;
|
||||
|
||||
|
|
|
@ -3,11 +3,11 @@
|
|||
* Copyright (C) 2007 David S. Miller (davem@davemloft.net)
|
||||
*/
|
||||
|
||||
#define EX_ST(x) \
|
||||
#define EX_ST(x,y) \
|
||||
98: x; \
|
||||
.section __ex_table,"a";\
|
||||
.align 4; \
|
||||
.word 98b, __retl_one; \
|
||||
.word 98b, y; \
|
||||
.text; \
|
||||
.align 4;
|
||||
|
||||
|
|
|
@ -4,21 +4,18 @@
|
|||
*/
|
||||
|
||||
#ifdef __KERNEL__
|
||||
#include <linux/linkage.h>
|
||||
#define GLOBAL_SPARE %g7
|
||||
#else
|
||||
#define GLOBAL_SPARE %g5
|
||||
#endif
|
||||
|
||||
#ifndef EX_LD
|
||||
#define EX_LD(x) x
|
||||
#define EX_LD(x,y) x
|
||||
#endif
|
||||
|
||||
#ifndef EX_ST
|
||||
#define EX_ST(x) x
|
||||
#endif
|
||||
|
||||
#ifndef EX_RETVAL
|
||||
#define EX_RETVAL(x) x
|
||||
#define EX_ST(x,y) x
|
||||
#endif
|
||||
|
||||
#ifndef LOAD
|
||||
|
@ -45,6 +42,29 @@
|
|||
.register %g3,#scratch
|
||||
|
||||
.text
|
||||
|
||||
#ifndef EX_RETVAL
|
||||
#define EX_RETVAL(x) x
|
||||
ENTRY(GEN_retl_o4_1)
|
||||
add %o4, %o2, %o4
|
||||
retl
|
||||
add %o4, 1, %o0
|
||||
ENDPROC(GEN_retl_o4_1)
|
||||
ENTRY(GEN_retl_g1_8)
|
||||
add %g1, %o2, %g1
|
||||
retl
|
||||
add %g1, 8, %o0
|
||||
ENDPROC(GEN_retl_g1_8)
|
||||
ENTRY(GEN_retl_o2_4)
|
||||
retl
|
||||
add %o2, 4, %o0
|
||||
ENDPROC(GEN_retl_o2_4)
|
||||
ENTRY(GEN_retl_o2_1)
|
||||
retl
|
||||
add %o2, 1, %o0
|
||||
ENDPROC(GEN_retl_o2_1)
|
||||
#endif
|
||||
|
||||
.align 64
|
||||
|
||||
.globl FUNC_NAME
|
||||
|
@ -73,8 +93,8 @@ FUNC_NAME: /* %o0=dst, %o1=src, %o2=len */
|
|||
sub %g0, %o4, %o4
|
||||
sub %o2, %o4, %o2
|
||||
1: subcc %o4, 1, %o4
|
||||
EX_LD(LOAD(ldub, %o1, %g1))
|
||||
EX_ST(STORE(stb, %g1, %o0))
|
||||
EX_LD(LOAD(ldub, %o1, %g1),GEN_retl_o4_1)
|
||||
EX_ST(STORE(stb, %g1, %o0),GEN_retl_o4_1)
|
||||
add %o1, 1, %o1
|
||||
bne,pt %XCC, 1b
|
||||
add %o0, 1, %o0
|
||||
|
@ -82,8 +102,8 @@ FUNC_NAME: /* %o0=dst, %o1=src, %o2=len */
|
|||
andn %o2, 0x7, %g1
|
||||
sub %o2, %g1, %o2
|
||||
1: subcc %g1, 0x8, %g1
|
||||
EX_LD(LOAD(ldx, %o1, %g2))
|
||||
EX_ST(STORE(stx, %g2, %o0))
|
||||
EX_LD(LOAD(ldx, %o1, %g2),GEN_retl_g1_8)
|
||||
EX_ST(STORE(stx, %g2, %o0),GEN_retl_g1_8)
|
||||
add %o1, 0x8, %o1
|
||||
bne,pt %XCC, 1b
|
||||
add %o0, 0x8, %o0
|
||||
|
@ -100,8 +120,8 @@ FUNC_NAME: /* %o0=dst, %o1=src, %o2=len */
|
|||
|
||||
1:
|
||||
subcc %o2, 4, %o2
|
||||
EX_LD(LOAD(lduw, %o1, %g1))
|
||||
EX_ST(STORE(stw, %g1, %o1 + %o3))
|
||||
EX_LD(LOAD(lduw, %o1, %g1),GEN_retl_o2_4)
|
||||
EX_ST(STORE(stw, %g1, %o1 + %o3),GEN_retl_o2_4)
|
||||
bgu,pt %XCC, 1b
|
||||
add %o1, 4, %o1
|
||||
|
||||
|
@ -111,8 +131,8 @@ FUNC_NAME: /* %o0=dst, %o1=src, %o2=len */
|
|||
.align 32
|
||||
90:
|
||||
subcc %o2, 1, %o2
|
||||
EX_LD(LOAD(ldub, %o1, %g1))
|
||||
EX_ST(STORE(stb, %g1, %o1 + %o3))
|
||||
EX_LD(LOAD(ldub, %o1, %g1),GEN_retl_o2_1)
|
||||
EX_ST(STORE(stb, %g1, %o1 + %o3),GEN_retl_o2_1)
|
||||
bgu,pt %XCC, 90b
|
||||
add %o1, 1, %o1
|
||||
retl
|
||||
|
|
|
@ -38,7 +38,7 @@ lib-$(CONFIG_SPARC64) += NG4patch.o NG4copy_page.o NG4clear_page.o NG4memset.o
|
|||
lib-$(CONFIG_SPARC64) += GENmemcpy.o GENcopy_from_user.o GENcopy_to_user.o
|
||||
lib-$(CONFIG_SPARC64) += GENpatch.o GENpage.o GENbzero.o
|
||||
|
||||
lib-$(CONFIG_SPARC64) += copy_in_user.o user_fixup.o memmove.o
|
||||
lib-$(CONFIG_SPARC64) += copy_in_user.o memmove.o
|
||||
lib-$(CONFIG_SPARC64) += mcount.o ipcsum.o xor.o hweight.o ffs.o
|
||||
|
||||
obj-$(CONFIG_SPARC64) += iomap.o
|
||||
|
|
|
@ -3,19 +3,19 @@
|
|||
* Copyright (C) 2007 David S. Miller (davem@davemloft.net)
|
||||
*/
|
||||
|
||||
#define EX_LD(x) \
|
||||
#define EX_LD(x,y) \
|
||||
98: x; \
|
||||
.section __ex_table,"a";\
|
||||
.align 4; \
|
||||
.word 98b, __retl_one_asi;\
|
||||
.word 98b, y; \
|
||||
.text; \
|
||||
.align 4;
|
||||
|
||||
#define EX_LD_FP(x) \
|
||||
#define EX_LD_FP(x,y) \
|
||||
98: x; \
|
||||
.section __ex_table,"a";\
|
||||
.align 4; \
|
||||
.word 98b, __retl_one_asi_fp;\
|
||||
.word 98b, y##_fp; \
|
||||
.text; \
|
||||
.align 4;
|
||||
|
||||
|
|
|
@ -3,19 +3,19 @@
|
|||
* Copyright (C) 2007 David S. Miller (davem@davemloft.net)
|
||||
*/
|
||||
|
||||
#define EX_ST(x) \
|
||||
#define EX_ST(x,y) \
|
||||
98: x; \
|
||||
.section __ex_table,"a";\
|
||||
.align 4; \
|
||||
.word 98b, __retl_one_asi;\
|
||||
.word 98b, y; \
|
||||
.text; \
|
||||
.align 4;
|
||||
|
||||
#define EX_ST_FP(x) \
|
||||
#define EX_ST_FP(x,y) \
|
||||
98: x; \
|
||||
.section __ex_table,"a";\
|
||||
.align 4; \
|
||||
.word 98b, __retl_one_asi_fp;\
|
||||
.word 98b, y##_fp; \
|
||||
.text; \
|
||||
.align 4;
|
||||
|
||||
|
|
|
@ -4,6 +4,7 @@
|
|||
*/
|
||||
|
||||
#ifdef __KERNEL__
|
||||
#include <linux/linkage.h>
|
||||
#include <asm/visasm.h>
|
||||
#include <asm/asi.h>
|
||||
#define GLOBAL_SPARE %g7
|
||||
|
@ -32,21 +33,17 @@
|
|||
#endif
|
||||
|
||||
#ifndef EX_LD
|
||||
#define EX_LD(x) x
|
||||
#define EX_LD(x,y) x
|
||||
#endif
|
||||
#ifndef EX_LD_FP
|
||||
#define EX_LD_FP(x) x
|
||||
#define EX_LD_FP(x,y) x
|
||||
#endif
|
||||
|
||||
#ifndef EX_ST
|
||||
#define EX_ST(x) x
|
||||
#define EX_ST(x,y) x
|
||||
#endif
|
||||
#ifndef EX_ST_FP
|
||||
#define EX_ST_FP(x) x
|
||||
#endif
|
||||
|
||||
#ifndef EX_RETVAL
|
||||
#define EX_RETVAL(x) x
|
||||
#define EX_ST_FP(x,y) x
|
||||
#endif
|
||||
|
||||
#ifndef LOAD
|
||||
|
@ -140,45 +137,110 @@
|
|||
fsrc2 %x6, %f12; \
|
||||
fsrc2 %x7, %f14;
|
||||
#define FREG_LOAD_1(base, x0) \
|
||||
EX_LD_FP(LOAD(ldd, base + 0x00, %x0))
|
||||
EX_LD_FP(LOAD(ldd, base + 0x00, %x0), NG2_retl_o2_plus_g1)
|
||||
#define FREG_LOAD_2(base, x0, x1) \
|
||||
EX_LD_FP(LOAD(ldd, base + 0x00, %x0)); \
|
||||
EX_LD_FP(LOAD(ldd, base + 0x08, %x1));
|
||||
EX_LD_FP(LOAD(ldd, base + 0x00, %x0), NG2_retl_o2_plus_g1); \
|
||||
EX_LD_FP(LOAD(ldd, base + 0x08, %x1), NG2_retl_o2_plus_g1);
|
||||
#define FREG_LOAD_3(base, x0, x1, x2) \
|
||||
EX_LD_FP(LOAD(ldd, base + 0x00, %x0)); \
|
||||
EX_LD_FP(LOAD(ldd, base + 0x08, %x1)); \
|
||||
EX_LD_FP(LOAD(ldd, base + 0x10, %x2));
|
||||
EX_LD_FP(LOAD(ldd, base + 0x00, %x0), NG2_retl_o2_plus_g1); \
|
||||
EX_LD_FP(LOAD(ldd, base + 0x08, %x1), NG2_retl_o2_plus_g1); \
|
||||
EX_LD_FP(LOAD(ldd, base + 0x10, %x2), NG2_retl_o2_plus_g1);
|
||||
#define FREG_LOAD_4(base, x0, x1, x2, x3) \
|
||||
EX_LD_FP(LOAD(ldd, base + 0x00, %x0)); \
|
||||
EX_LD_FP(LOAD(ldd, base + 0x08, %x1)); \
|
||||
EX_LD_FP(LOAD(ldd, base + 0x10, %x2)); \
|
||||
EX_LD_FP(LOAD(ldd, base + 0x18, %x3));
|
||||
EX_LD_FP(LOAD(ldd, base + 0x00, %x0), NG2_retl_o2_plus_g1); \
|
||||
EX_LD_FP(LOAD(ldd, base + 0x08, %x1), NG2_retl_o2_plus_g1); \
|
||||
EX_LD_FP(LOAD(ldd, base + 0x10, %x2), NG2_retl_o2_plus_g1); \
|
||||
EX_LD_FP(LOAD(ldd, base + 0x18, %x3), NG2_retl_o2_plus_g1);
|
||||
#define FREG_LOAD_5(base, x0, x1, x2, x3, x4) \
|
||||
EX_LD_FP(LOAD(ldd, base + 0x00, %x0)); \
|
||||
EX_LD_FP(LOAD(ldd, base + 0x08, %x1)); \
|
||||
EX_LD_FP(LOAD(ldd, base + 0x10, %x2)); \
|
||||
EX_LD_FP(LOAD(ldd, base + 0x18, %x3)); \
|
||||
EX_LD_FP(LOAD(ldd, base + 0x20, %x4));
|
||||
EX_LD_FP(LOAD(ldd, base + 0x00, %x0), NG2_retl_o2_plus_g1); \
|
||||
EX_LD_FP(LOAD(ldd, base + 0x08, %x1), NG2_retl_o2_plus_g1); \
|
||||
EX_LD_FP(LOAD(ldd, base + 0x10, %x2), NG2_retl_o2_plus_g1); \
|
||||
EX_LD_FP(LOAD(ldd, base + 0x18, %x3), NG2_retl_o2_plus_g1); \
|
||||
EX_LD_FP(LOAD(ldd, base + 0x20, %x4), NG2_retl_o2_plus_g1);
|
||||
#define FREG_LOAD_6(base, x0, x1, x2, x3, x4, x5) \
|
||||
EX_LD_FP(LOAD(ldd, base + 0x00, %x0)); \
|
||||
EX_LD_FP(LOAD(ldd, base + 0x08, %x1)); \
|
||||
EX_LD_FP(LOAD(ldd, base + 0x10, %x2)); \
|
||||
EX_LD_FP(LOAD(ldd, base + 0x18, %x3)); \
|
||||
EX_LD_FP(LOAD(ldd, base + 0x20, %x4)); \
|
||||
EX_LD_FP(LOAD(ldd, base + 0x28, %x5));
|
||||
EX_LD_FP(LOAD(ldd, base + 0x00, %x0), NG2_retl_o2_plus_g1); \
|
||||
EX_LD_FP(LOAD(ldd, base + 0x08, %x1), NG2_retl_o2_plus_g1); \
|
||||
EX_LD_FP(LOAD(ldd, base + 0x10, %x2), NG2_retl_o2_plus_g1); \
|
||||
EX_LD_FP(LOAD(ldd, base + 0x18, %x3), NG2_retl_o2_plus_g1); \
|
||||
EX_LD_FP(LOAD(ldd, base + 0x20, %x4), NG2_retl_o2_plus_g1); \
|
||||
EX_LD_FP(LOAD(ldd, base + 0x28, %x5), NG2_retl_o2_plus_g1);
|
||||
#define FREG_LOAD_7(base, x0, x1, x2, x3, x4, x5, x6) \
|
||||
EX_LD_FP(LOAD(ldd, base + 0x00, %x0)); \
|
||||
EX_LD_FP(LOAD(ldd, base + 0x08, %x1)); \
|
||||
EX_LD_FP(LOAD(ldd, base + 0x10, %x2)); \
|
||||
EX_LD_FP(LOAD(ldd, base + 0x18, %x3)); \
|
||||
EX_LD_FP(LOAD(ldd, base + 0x20, %x4)); \
|
||||
EX_LD_FP(LOAD(ldd, base + 0x28, %x5)); \
|
||||
EX_LD_FP(LOAD(ldd, base + 0x30, %x6));
|
||||
EX_LD_FP(LOAD(ldd, base + 0x00, %x0), NG2_retl_o2_plus_g1); \
|
||||
EX_LD_FP(LOAD(ldd, base + 0x08, %x1), NG2_retl_o2_plus_g1); \
|
||||
EX_LD_FP(LOAD(ldd, base + 0x10, %x2), NG2_retl_o2_plus_g1); \
|
||||
EX_LD_FP(LOAD(ldd, base + 0x18, %x3), NG2_retl_o2_plus_g1); \
|
||||
EX_LD_FP(LOAD(ldd, base + 0x20, %x4), NG2_retl_o2_plus_g1); \
|
||||
EX_LD_FP(LOAD(ldd, base + 0x28, %x5), NG2_retl_o2_plus_g1); \
|
||||
EX_LD_FP(LOAD(ldd, base + 0x30, %x6), NG2_retl_o2_plus_g1);
|
||||
|
||||
.register %g2,#scratch
|
||||
.register %g3,#scratch
|
||||
|
||||
.text
|
||||
#ifndef EX_RETVAL
|
||||
#define EX_RETVAL(x) x
|
||||
__restore_fp:
|
||||
VISExitHalf
|
||||
__restore_asi:
|
||||
retl
|
||||
wr %g0, ASI_AIUS, %asi
|
||||
ENTRY(NG2_retl_o2)
|
||||
ba,pt %xcc, __restore_asi
|
||||
mov %o2, %o0
|
||||
ENDPROC(NG2_retl_o2)
|
||||
ENTRY(NG2_retl_o2_plus_1)
|
||||
ba,pt %xcc, __restore_asi
|
||||
add %o2, 1, %o0
|
||||
ENDPROC(NG2_retl_o2_plus_1)
|
||||
ENTRY(NG2_retl_o2_plus_4)
|
||||
ba,pt %xcc, __restore_asi
|
||||
add %o2, 4, %o0
|
||||
ENDPROC(NG2_retl_o2_plus_4)
|
||||
ENTRY(NG2_retl_o2_plus_8)
|
||||
ba,pt %xcc, __restore_asi
|
||||
add %o2, 8, %o0
|
||||
ENDPROC(NG2_retl_o2_plus_8)
|
||||
ENTRY(NG2_retl_o2_plus_o4_plus_1)
|
||||
add %o4, 1, %o4
|
||||
ba,pt %xcc, __restore_asi
|
||||
add %o2, %o4, %o0
|
||||
ENDPROC(NG2_retl_o2_plus_o4_plus_1)
|
||||
ENTRY(NG2_retl_o2_plus_o4_plus_8)
|
||||
add %o4, 8, %o4
|
||||
ba,pt %xcc, __restore_asi
|
||||
add %o2, %o4, %o0
|
||||
ENDPROC(NG2_retl_o2_plus_o4_plus_8)
|
||||
ENTRY(NG2_retl_o2_plus_o4_plus_16)
|
||||
add %o4, 16, %o4
|
||||
ba,pt %xcc, __restore_asi
|
||||
add %o2, %o4, %o0
|
||||
ENDPROC(NG2_retl_o2_plus_o4_plus_16)
|
||||
ENTRY(NG2_retl_o2_plus_g1_fp)
|
||||
ba,pt %xcc, __restore_fp
|
||||
add %o2, %g1, %o0
|
||||
ENDPROC(NG2_retl_o2_plus_g1_fp)
|
||||
ENTRY(NG2_retl_o2_plus_g1_plus_64_fp)
|
||||
add %g1, 64, %g1
|
||||
ba,pt %xcc, __restore_fp
|
||||
add %o2, %g1, %o0
|
||||
ENDPROC(NG2_retl_o2_plus_g1_plus_64_fp)
|
||||
ENTRY(NG2_retl_o2_plus_g1_plus_1)
|
||||
add %g1, 1, %g1
|
||||
ba,pt %xcc, __restore_asi
|
||||
add %o2, %g1, %o0
|
||||
ENDPROC(NG2_retl_o2_plus_g1_plus_1)
|
||||
ENTRY(NG2_retl_o2_and_7_plus_o4)
|
||||
and %o2, 7, %o2
|
||||
ba,pt %xcc, __restore_asi
|
||||
add %o2, %o4, %o0
|
||||
ENDPROC(NG2_retl_o2_and_7_plus_o4)
|
||||
ENTRY(NG2_retl_o2_and_7_plus_o4_plus_8)
|
||||
and %o2, 7, %o2
|
||||
add %o4, 8, %o4
|
||||
ba,pt %xcc, __restore_asi
|
||||
add %o2, %o4, %o0
|
||||
ENDPROC(NG2_retl_o2_and_7_plus_o4_plus_8)
|
||||
#endif
|
||||
|
||||
.align 64
|
||||
|
||||
.globl FUNC_NAME
|
||||
|
@ -230,8 +292,8 @@ FUNC_NAME: /* %o0=dst, %o1=src, %o2=len */
|
|||
sub %g0, %o4, %o4 ! bytes to align dst
|
||||
sub %o2, %o4, %o2
|
||||
1: subcc %o4, 1, %o4
|
||||
EX_LD(LOAD(ldub, %o1, %g1))
|
||||
EX_ST(STORE(stb, %g1, %o0))
|
||||
EX_LD(LOAD(ldub, %o1, %g1), NG2_retl_o2_plus_o4_plus_1)
|
||||
EX_ST(STORE(stb, %g1, %o0), NG2_retl_o2_plus_o4_plus_1)
|
||||
add %o1, 1, %o1
|
||||
bne,pt %XCC, 1b
|
||||
add %o0, 1, %o0
|
||||
|
@ -281,11 +343,11 @@ FUNC_NAME: /* %o0=dst, %o1=src, %o2=len */
|
|||
nop
|
||||
/* fall through for 0 < low bits < 8 */
|
||||
110: sub %o4, 64, %g2
|
||||
EX_LD_FP(LOAD_BLK(%g2, %f0))
|
||||
1: EX_ST_FP(STORE_INIT(%g0, %o4 + %g3))
|
||||
EX_LD_FP(LOAD_BLK(%o4, %f16))
|
||||
EX_LD_FP(LOAD_BLK(%g2, %f0), NG2_retl_o2_plus_g1)
|
||||
1: EX_ST_FP(STORE_INIT(%g0, %o4 + %g3), NG2_retl_o2_plus_g1)
|
||||
EX_LD_FP(LOAD_BLK(%o4, %f16), NG2_retl_o2_plus_g1)
|
||||
FREG_FROB(f0, f2, f4, f6, f8, f10, f12, f14, f16)
|
||||
EX_ST_FP(STORE_BLK(%f0, %o4 + %g3))
|
||||
EX_ST_FP(STORE_BLK(%f0, %o4 + %g3), NG2_retl_o2_plus_g1)
|
||||
FREG_MOVE_8(f16, f18, f20, f22, f24, f26, f28, f30)
|
||||
subcc %g1, 64, %g1
|
||||
add %o4, 64, %o4
|
||||
|
@ -296,10 +358,10 @@ FUNC_NAME: /* %o0=dst, %o1=src, %o2=len */
|
|||
|
||||
120: sub %o4, 56, %g2
|
||||
FREG_LOAD_7(%g2, f0, f2, f4, f6, f8, f10, f12)
|
||||
1: EX_ST_FP(STORE_INIT(%g0, %o4 + %g3))
|
||||
EX_LD_FP(LOAD_BLK(%o4, %f16))
|
||||
1: EX_ST_FP(STORE_INIT(%g0, %o4 + %g3), NG2_retl_o2_plus_g1)
|
||||
EX_LD_FP(LOAD_BLK(%o4, %f16), NG2_retl_o2_plus_g1)
|
||||
FREG_FROB(f0, f2, f4, f6, f8, f10, f12, f16, f18)
|
||||
EX_ST_FP(STORE_BLK(%f0, %o4 + %g3))
|
||||
EX_ST_FP(STORE_BLK(%f0, %o4 + %g3), NG2_retl_o2_plus_g1)
|
||||
FREG_MOVE_7(f18, f20, f22, f24, f26, f28, f30)
|
||||
subcc %g1, 64, %g1
|
||||
add %o4, 64, %o4
|
||||
|
@ -310,10 +372,10 @@ FUNC_NAME: /* %o0=dst, %o1=src, %o2=len */
|
|||
|
||||
130: sub %o4, 48, %g2
|
||||
FREG_LOAD_6(%g2, f0, f2, f4, f6, f8, f10)
|
||||
1: EX_ST_FP(STORE_INIT(%g0, %o4 + %g3))
|
||||
EX_LD_FP(LOAD_BLK(%o4, %f16))
|
||||
1: EX_ST_FP(STORE_INIT(%g0, %o4 + %g3), NG2_retl_o2_plus_g1)
|
||||
EX_LD_FP(LOAD_BLK(%o4, %f16), NG2_retl_o2_plus_g1)
|
||||
FREG_FROB(f0, f2, f4, f6, f8, f10, f16, f18, f20)
|
||||
EX_ST_FP(STORE_BLK(%f0, %o4 + %g3))
|
||||
EX_ST_FP(STORE_BLK(%f0, %o4 + %g3), NG2_retl_o2_plus_g1)
|
||||
FREG_MOVE_6(f20, f22, f24, f26, f28, f30)
|
||||
subcc %g1, 64, %g1
|
||||
add %o4, 64, %o4
|
||||
|
@ -324,10 +386,10 @@ FUNC_NAME: /* %o0=dst, %o1=src, %o2=len */
|
|||
|
||||
140: sub %o4, 40, %g2
|
||||
FREG_LOAD_5(%g2, f0, f2, f4, f6, f8)
|
||||
1: EX_ST_FP(STORE_INIT(%g0, %o4 + %g3))
|
||||
EX_LD_FP(LOAD_BLK(%o4, %f16))
|
||||
1: EX_ST_FP(STORE_INIT(%g0, %o4 + %g3), NG2_retl_o2_plus_g1)
|
||||
EX_LD_FP(LOAD_BLK(%o4, %f16), NG2_retl_o2_plus_g1)
|
||||
FREG_FROB(f0, f2, f4, f6, f8, f16, f18, f20, f22)
|
||||
EX_ST_FP(STORE_BLK(%f0, %o4 + %g3))
|
||||
EX_ST_FP(STORE_BLK(%f0, %o4 + %g3), NG2_retl_o2_plus_g1)
|
||||
FREG_MOVE_5(f22, f24, f26, f28, f30)
|
||||
subcc %g1, 64, %g1
|
||||
add %o4, 64, %o4
|
||||
|
@ -338,10 +400,10 @@ FUNC_NAME: /* %o0=dst, %o1=src, %o2=len */
|
|||
|
||||
150: sub %o4, 32, %g2
|
||||
FREG_LOAD_4(%g2, f0, f2, f4, f6)
|
||||
1: EX_ST_FP(STORE_INIT(%g0, %o4 + %g3))
|
||||
EX_LD_FP(LOAD_BLK(%o4, %f16))
|
||||
1: EX_ST_FP(STORE_INIT(%g0, %o4 + %g3), NG2_retl_o2_plus_g1)
|
||||
EX_LD_FP(LOAD_BLK(%o4, %f16), NG2_retl_o2_plus_g1)
|
||||
FREG_FROB(f0, f2, f4, f6, f16, f18, f20, f22, f24)
|
||||
EX_ST_FP(STORE_BLK(%f0, %o4 + %g3))
|
||||
EX_ST_FP(STORE_BLK(%f0, %o4 + %g3), NG2_retl_o2_plus_g1)
|
||||
FREG_MOVE_4(f24, f26, f28, f30)
|
||||
subcc %g1, 64, %g1
|
||||
add %o4, 64, %o4
|
||||
|
@ -352,10 +414,10 @@ FUNC_NAME: /* %o0=dst, %o1=src, %o2=len */
|
|||
|
||||
160: sub %o4, 24, %g2
|
||||
FREG_LOAD_3(%g2, f0, f2, f4)
|
||||
1: EX_ST_FP(STORE_INIT(%g0, %o4 + %g3))
|
||||
EX_LD_FP(LOAD_BLK(%o4, %f16))
|
||||
1: EX_ST_FP(STORE_INIT(%g0, %o4 + %g3), NG2_retl_o2_plus_g1)
|
||||
EX_LD_FP(LOAD_BLK(%o4, %f16), NG2_retl_o2_plus_g1)
|
||||
FREG_FROB(f0, f2, f4, f16, f18, f20, f22, f24, f26)
|
||||
EX_ST_FP(STORE_BLK(%f0, %o4 + %g3))
|
||||
EX_ST_FP(STORE_BLK(%f0, %o4 + %g3), NG2_retl_o2_plus_g1)
|
||||
FREG_MOVE_3(f26, f28, f30)
|
||||
subcc %g1, 64, %g1
|
||||
add %o4, 64, %o4
|
||||
|
@ -366,10 +428,10 @@ FUNC_NAME: /* %o0=dst, %o1=src, %o2=len */
|
|||
|
||||
170: sub %o4, 16, %g2
|
||||
FREG_LOAD_2(%g2, f0, f2)
|
||||
1: EX_ST_FP(STORE_INIT(%g0, %o4 + %g3))
|
||||
EX_LD_FP(LOAD_BLK(%o4, %f16))
|
||||
1: EX_ST_FP(STORE_INIT(%g0, %o4 + %g3), NG2_retl_o2_plus_g1)
|
||||
EX_LD_FP(LOAD_BLK(%o4, %f16), NG2_retl_o2_plus_g1)
|
||||
FREG_FROB(f0, f2, f16, f18, f20, f22, f24, f26, f28)
|
||||
EX_ST_FP(STORE_BLK(%f0, %o4 + %g3))
|
||||
EX_ST_FP(STORE_BLK(%f0, %o4 + %g3), NG2_retl_o2_plus_g1)
|
||||
FREG_MOVE_2(f28, f30)
|
||||
subcc %g1, 64, %g1
|
||||
add %o4, 64, %o4
|
||||
|
@ -380,10 +442,10 @@ FUNC_NAME: /* %o0=dst, %o1=src, %o2=len */
|
|||
|
||||
180: sub %o4, 8, %g2
|
||||
FREG_LOAD_1(%g2, f0)
|
||||
1: EX_ST_FP(STORE_INIT(%g0, %o4 + %g3))
|
||||
EX_LD_FP(LOAD_BLK(%o4, %f16))
|
||||
1: EX_ST_FP(STORE_INIT(%g0, %o4 + %g3), NG2_retl_o2_plus_g1)
|
||||
EX_LD_FP(LOAD_BLK(%o4, %f16), NG2_retl_o2_plus_g1)
|
||||
FREG_FROB(f0, f16, f18, f20, f22, f24, f26, f28, f30)
|
||||
EX_ST_FP(STORE_BLK(%f0, %o4 + %g3))
|
||||
EX_ST_FP(STORE_BLK(%f0, %o4 + %g3), NG2_retl_o2_plus_g1)
|
||||
FREG_MOVE_1(f30)
|
||||
subcc %g1, 64, %g1
|
||||
add %o4, 64, %o4
|
||||
|
@ -393,10 +455,10 @@ FUNC_NAME: /* %o0=dst, %o1=src, %o2=len */
|
|||
nop
|
||||
|
||||
190:
|
||||
1: EX_ST_FP(STORE_INIT(%g0, %o4 + %g3))
|
||||
1: EX_ST_FP(STORE_INIT(%g0, %o4 + %g3), NG2_retl_o2_plus_g1)
|
||||
subcc %g1, 64, %g1
|
||||
EX_LD_FP(LOAD_BLK(%o4, %f0))
|
||||
EX_ST_FP(STORE_BLK(%f0, %o4 + %g3))
|
||||
EX_LD_FP(LOAD_BLK(%o4, %f0), NG2_retl_o2_plus_g1_plus_64)
|
||||
EX_ST_FP(STORE_BLK(%f0, %o4 + %g3), NG2_retl_o2_plus_g1_plus_64)
|
||||
add %o4, 64, %o4
|
||||
bne,pt %xcc, 1b
|
||||
LOAD(prefetch, %o4 + 64, #one_read)
|
||||
|
@ -423,28 +485,28 @@ FUNC_NAME: /* %o0=dst, %o1=src, %o2=len */
|
|||
andn %o2, 0xf, %o4
|
||||
and %o2, 0xf, %o2
|
||||
1: subcc %o4, 0x10, %o4
|
||||
EX_LD(LOAD(ldx, %o1, %o5))
|
||||
EX_LD(LOAD(ldx, %o1, %o5), NG2_retl_o2_plus_o4_plus_16)
|
||||
add %o1, 0x08, %o1
|
||||
EX_LD(LOAD(ldx, %o1, %g1))
|
||||
EX_LD(LOAD(ldx, %o1, %g1), NG2_retl_o2_plus_o4_plus_16)
|
||||
sub %o1, 0x08, %o1
|
||||
EX_ST(STORE(stx, %o5, %o1 + GLOBAL_SPARE))
|
||||
EX_ST(STORE(stx, %o5, %o1 + GLOBAL_SPARE), NG2_retl_o2_plus_o4_plus_16)
|
||||
add %o1, 0x8, %o1
|
||||
EX_ST(STORE(stx, %g1, %o1 + GLOBAL_SPARE))
|
||||
EX_ST(STORE(stx, %g1, %o1 + GLOBAL_SPARE), NG2_retl_o2_plus_o4_plus_8)
|
||||
bgu,pt %XCC, 1b
|
||||
add %o1, 0x8, %o1
|
||||
73: andcc %o2, 0x8, %g0
|
||||
be,pt %XCC, 1f
|
||||
nop
|
||||
sub %o2, 0x8, %o2
|
||||
EX_LD(LOAD(ldx, %o1, %o5))
|
||||
EX_ST(STORE(stx, %o5, %o1 + GLOBAL_SPARE))
|
||||
EX_LD(LOAD(ldx, %o1, %o5), NG2_retl_o2_plus_8)
|
||||
EX_ST(STORE(stx, %o5, %o1 + GLOBAL_SPARE), NG2_retl_o2_plus_8)
|
||||
add %o1, 0x8, %o1
|
||||
1: andcc %o2, 0x4, %g0
|
||||
be,pt %XCC, 1f
|
||||
nop
|
||||
sub %o2, 0x4, %o2
|
||||
EX_LD(LOAD(lduw, %o1, %o5))
|
||||
EX_ST(STORE(stw, %o5, %o1 + GLOBAL_SPARE))
|
||||
EX_LD(LOAD(lduw, %o1, %o5), NG2_retl_o2_plus_4)
|
||||
EX_ST(STORE(stw, %o5, %o1 + GLOBAL_SPARE), NG2_retl_o2_plus_4)
|
||||
add %o1, 0x4, %o1
|
||||
1: cmp %o2, 0
|
||||
be,pt %XCC, 85f
|
||||
|
@ -460,8 +522,8 @@ FUNC_NAME: /* %o0=dst, %o1=src, %o2=len */
|
|||
sub %o2, %g1, %o2
|
||||
|
||||
1: subcc %g1, 1, %g1
|
||||
EX_LD(LOAD(ldub, %o1, %o5))
|
||||
EX_ST(STORE(stb, %o5, %o1 + GLOBAL_SPARE))
|
||||
EX_LD(LOAD(ldub, %o1, %o5), NG2_retl_o2_plus_g1_plus_1)
|
||||
EX_ST(STORE(stb, %o5, %o1 + GLOBAL_SPARE), NG2_retl_o2_plus_g1_plus_1)
|
||||
bgu,pt %icc, 1b
|
||||
add %o1, 1, %o1
|
||||
|
||||
|
@ -477,16 +539,16 @@ FUNC_NAME: /* %o0=dst, %o1=src, %o2=len */
|
|||
|
||||
8: mov 64, GLOBAL_SPARE
|
||||
andn %o1, 0x7, %o1
|
||||
EX_LD(LOAD(ldx, %o1, %g2))
|
||||
EX_LD(LOAD(ldx, %o1, %g2), NG2_retl_o2)
|
||||
sub GLOBAL_SPARE, %g1, GLOBAL_SPARE
|
||||
andn %o2, 0x7, %o4
|
||||
sllx %g2, %g1, %g2
|
||||
1: add %o1, 0x8, %o1
|
||||
EX_LD(LOAD(ldx, %o1, %g3))
|
||||
EX_LD(LOAD(ldx, %o1, %g3), NG2_retl_o2_and_7_plus_o4)
|
||||
subcc %o4, 0x8, %o4
|
||||
srlx %g3, GLOBAL_SPARE, %o5
|
||||
or %o5, %g2, %o5
|
||||
EX_ST(STORE(stx, %o5, %o0))
|
||||
EX_ST(STORE(stx, %o5, %o0), NG2_retl_o2_and_7_plus_o4_plus_8)
|
||||
add %o0, 0x8, %o0
|
||||
bgu,pt %icc, 1b
|
||||
sllx %g3, %g1, %g2
|
||||
|
@ -506,8 +568,8 @@ FUNC_NAME: /* %o0=dst, %o1=src, %o2=len */
|
|||
|
||||
1:
|
||||
subcc %o2, 4, %o2
|
||||
EX_LD(LOAD(lduw, %o1, %g1))
|
||||
EX_ST(STORE(stw, %g1, %o1 + GLOBAL_SPARE))
|
||||
EX_LD(LOAD(lduw, %o1, %g1), NG2_retl_o2_plus_4)
|
||||
EX_ST(STORE(stw, %g1, %o1 + GLOBAL_SPARE), NG2_retl_o2_plus_4)
|
||||
bgu,pt %XCC, 1b
|
||||
add %o1, 4, %o1
|
||||
|
||||
|
@ -517,8 +579,8 @@ FUNC_NAME: /* %o0=dst, %o1=src, %o2=len */
|
|||
.align 32
|
||||
90:
|
||||
subcc %o2, 1, %o2
|
||||
EX_LD(LOAD(ldub, %o1, %g1))
|
||||
EX_ST(STORE(stb, %g1, %o1 + GLOBAL_SPARE))
|
||||
EX_LD(LOAD(ldub, %o1, %g1), NG2_retl_o2_plus_1)
|
||||
EX_ST(STORE(stb, %g1, %o1 + GLOBAL_SPARE), NG2_retl_o2_plus_1)
|
||||
bgu,pt %XCC, 90b
|
||||
add %o1, 1, %o1
|
||||
retl
|
||||
|
|
|
@ -3,19 +3,19 @@
|
|||
* Copyright (C) 2012 David S. Miller (davem@davemloft.net)
|
||||
*/
|
||||
|
||||
#define EX_LD(x) \
|
||||
#define EX_LD(x, y) \
|
||||
98: x; \
|
||||
.section __ex_table,"a";\
|
||||
.align 4; \
|
||||
.word 98b, __retl_one_asi;\
|
||||
.word 98b, y; \
|
||||
.text; \
|
||||
.align 4;
|
||||
|
||||
#define EX_LD_FP(x) \
|
||||
#define EX_LD_FP(x,y) \
|
||||
98: x; \
|
||||
.section __ex_table,"a";\
|
||||
.align 4; \
|
||||
.word 98b, __retl_one_asi_fp;\
|
||||
.word 98b, y##_fp; \
|
||||
.text; \
|
||||
.align 4;
|
||||
|
||||
|
|
|
@ -3,19 +3,19 @@
|
|||
* Copyright (C) 2012 David S. Miller (davem@davemloft.net)
|
||||
*/
|
||||
|
||||
#define EX_ST(x) \
|
||||
#define EX_ST(x,y) \
|
||||
98: x; \
|
||||
.section __ex_table,"a";\
|
||||
.align 4; \
|
||||
.word 98b, __retl_one_asi;\
|
||||
.word 98b, y; \
|
||||
.text; \
|
||||
.align 4;
|
||||
|
||||
#define EX_ST_FP(x) \
|
||||
#define EX_ST_FP(x,y) \
|
||||
98: x; \
|
||||
.section __ex_table,"a";\
|
||||
.align 4; \
|
||||
.word 98b, __retl_one_asi_fp;\
|
||||
.word 98b, y##_fp; \
|
||||
.text; \
|
||||
.align 4;
|
||||
|
||||
|
|
|
@ -4,6 +4,7 @@
|
|||
*/
|
||||
|
||||
#ifdef __KERNEL__
|
||||
#include <linux/linkage.h>
|
||||
#include <asm/visasm.h>
|
||||
#include <asm/asi.h>
|
||||
#define GLOBAL_SPARE %g7
|
||||
|
@ -46,22 +47,19 @@
|
|||
#endif
|
||||
|
||||
#ifndef EX_LD
|
||||
#define EX_LD(x) x
|
||||
#define EX_LD(x,y) x
|
||||
#endif
|
||||
#ifndef EX_LD_FP
|
||||
#define EX_LD_FP(x) x
|
||||
#define EX_LD_FP(x,y) x
|
||||
#endif
|
||||
|
||||
#ifndef EX_ST
|
||||
#define EX_ST(x) x
|
||||
#define EX_ST(x,y) x
|
||||
#endif
|
||||
#ifndef EX_ST_FP
|
||||
#define EX_ST_FP(x) x
|
||||
#define EX_ST_FP(x,y) x
|
||||
#endif
|
||||
|
||||
#ifndef EX_RETVAL
|
||||
#define EX_RETVAL(x) x
|
||||
#endif
|
||||
|
||||
#ifndef LOAD
|
||||
#define LOAD(type,addr,dest) type [addr], dest
|
||||
|
@ -94,6 +92,158 @@
|
|||
.register %g3,#scratch
|
||||
|
||||
.text
|
||||
#ifndef EX_RETVAL
|
||||
#define EX_RETVAL(x) x
|
||||
__restore_asi_fp:
|
||||
VISExitHalf
|
||||
__restore_asi:
|
||||
retl
|
||||
wr %g0, ASI_AIUS, %asi
|
||||
|
||||
ENTRY(NG4_retl_o2)
|
||||
ba,pt %xcc, __restore_asi
|
||||
mov %o2, %o0
|
||||
ENDPROC(NG4_retl_o2)
|
||||
ENTRY(NG4_retl_o2_plus_1)
|
||||
ba,pt %xcc, __restore_asi
|
||||
add %o2, 1, %o0
|
||||
ENDPROC(NG4_retl_o2_plus_1)
|
||||
ENTRY(NG4_retl_o2_plus_4)
|
||||
ba,pt %xcc, __restore_asi
|
||||
add %o2, 4, %o0
|
||||
ENDPROC(NG4_retl_o2_plus_4)
|
||||
ENTRY(NG4_retl_o2_plus_o5)
|
||||
ba,pt %xcc, __restore_asi
|
||||
add %o2, %o5, %o0
|
||||
ENDPROC(NG4_retl_o2_plus_o5)
|
||||
ENTRY(NG4_retl_o2_plus_o5_plus_4)
|
||||
add %o5, 4, %o5
|
||||
ba,pt %xcc, __restore_asi
|
||||
add %o2, %o5, %o0
|
||||
ENDPROC(NG4_retl_o2_plus_o5_plus_4)
|
||||
ENTRY(NG4_retl_o2_plus_o5_plus_8)
|
||||
add %o5, 8, %o5
|
||||
ba,pt %xcc, __restore_asi
|
||||
add %o2, %o5, %o0
|
||||
ENDPROC(NG4_retl_o2_plus_o5_plus_8)
|
||||
ENTRY(NG4_retl_o2_plus_o5_plus_16)
|
||||
add %o5, 16, %o5
|
||||
ba,pt %xcc, __restore_asi
|
||||
add %o2, %o5, %o0
|
||||
ENDPROC(NG4_retl_o2_plus_o5_plus_16)
|
||||
ENTRY(NG4_retl_o2_plus_o5_plus_24)
|
||||
add %o5, 24, %o5
|
||||
ba,pt %xcc, __restore_asi
|
||||
add %o2, %o5, %o0
|
||||
ENDPROC(NG4_retl_o2_plus_o5_plus_24)
|
||||
ENTRY(NG4_retl_o2_plus_o5_plus_32)
|
||||
add %o5, 32, %o5
|
||||
ba,pt %xcc, __restore_asi
|
||||
add %o2, %o5, %o0
|
||||
ENDPROC(NG4_retl_o2_plus_o5_plus_32)
|
||||
ENTRY(NG4_retl_o2_plus_g1)
|
||||
ba,pt %xcc, __restore_asi
|
||||
add %o2, %g1, %o0
|
||||
ENDPROC(NG4_retl_o2_plus_g1)
|
||||
ENTRY(NG4_retl_o2_plus_g1_plus_1)
|
||||
add %g1, 1, %g1
|
||||
ba,pt %xcc, __restore_asi
|
||||
add %o2, %g1, %o0
|
||||
ENDPROC(NG4_retl_o2_plus_g1_plus_1)
|
||||
ENTRY(NG4_retl_o2_plus_g1_plus_8)
|
||||
add %g1, 8, %g1
|
||||
ba,pt %xcc, __restore_asi
|
||||
add %o2, %g1, %o0
|
||||
ENDPROC(NG4_retl_o2_plus_g1_plus_8)
|
||||
ENTRY(NG4_retl_o2_plus_o4)
|
||||
ba,pt %xcc, __restore_asi
|
||||
add %o2, %o4, %o0
|
||||
ENDPROC(NG4_retl_o2_plus_o4)
|
||||
ENTRY(NG4_retl_o2_plus_o4_plus_8)
|
||||
add %o4, 8, %o4
|
||||
ba,pt %xcc, __restore_asi
|
||||
add %o2, %o4, %o0
|
||||
ENDPROC(NG4_retl_o2_plus_o4_plus_8)
|
||||
ENTRY(NG4_retl_o2_plus_o4_plus_16)
|
||||
add %o4, 16, %o4
|
||||
ba,pt %xcc, __restore_asi
|
||||
add %o2, %o4, %o0
|
||||
ENDPROC(NG4_retl_o2_plus_o4_plus_16)
|
||||
ENTRY(NG4_retl_o2_plus_o4_plus_24)
|
||||
add %o4, 24, %o4
|
||||
ba,pt %xcc, __restore_asi
|
||||
add %o2, %o4, %o0
|
||||
ENDPROC(NG4_retl_o2_plus_o4_plus_24)
|
||||
ENTRY(NG4_retl_o2_plus_o4_plus_32)
|
||||
add %o4, 32, %o4
|
||||
ba,pt %xcc, __restore_asi
|
||||
add %o2, %o4, %o0
|
||||
ENDPROC(NG4_retl_o2_plus_o4_plus_32)
|
||||
ENTRY(NG4_retl_o2_plus_o4_plus_40)
|
||||
add %o4, 40, %o4
|
||||
ba,pt %xcc, __restore_asi
|
||||
add %o2, %o4, %o0
|
||||
ENDPROC(NG4_retl_o2_plus_o4_plus_40)
|
||||
ENTRY(NG4_retl_o2_plus_o4_plus_48)
|
||||
add %o4, 48, %o4
|
||||
ba,pt %xcc, __restore_asi
|
||||
add %o2, %o4, %o0
|
||||
ENDPROC(NG4_retl_o2_plus_o4_plus_48)
|
||||
ENTRY(NG4_retl_o2_plus_o4_plus_56)
|
||||
add %o4, 56, %o4
|
||||
ba,pt %xcc, __restore_asi
|
||||
add %o2, %o4, %o0
|
||||
ENDPROC(NG4_retl_o2_plus_o4_plus_56)
|
||||
ENTRY(NG4_retl_o2_plus_o4_plus_64)
|
||||
add %o4, 64, %o4
|
||||
ba,pt %xcc, __restore_asi
|
||||
add %o2, %o4, %o0
|
||||
ENDPROC(NG4_retl_o2_plus_o4_plus_64)
|
||||
ENTRY(NG4_retl_o2_plus_o4_fp)
|
||||
ba,pt %xcc, __restore_asi_fp
|
||||
add %o2, %o4, %o0
|
||||
ENDPROC(NG4_retl_o2_plus_o4_fp)
|
||||
ENTRY(NG4_retl_o2_plus_o4_plus_8_fp)
|
||||
add %o4, 8, %o4
|
||||
ba,pt %xcc, __restore_asi_fp
|
||||
add %o2, %o4, %o0
|
||||
ENDPROC(NG4_retl_o2_plus_o4_plus_8_fp)
|
||||
ENTRY(NG4_retl_o2_plus_o4_plus_16_fp)
|
||||
add %o4, 16, %o4
|
||||
ba,pt %xcc, __restore_asi_fp
|
||||
add %o2, %o4, %o0
|
||||
ENDPROC(NG4_retl_o2_plus_o4_plus_16_fp)
|
||||
ENTRY(NG4_retl_o2_plus_o4_plus_24_fp)
|
||||
add %o4, 24, %o4
|
||||
ba,pt %xcc, __restore_asi_fp
|
||||
add %o2, %o4, %o0
|
||||
ENDPROC(NG4_retl_o2_plus_o4_plus_24_fp)
|
||||
ENTRY(NG4_retl_o2_plus_o4_plus_32_fp)
|
||||
add %o4, 32, %o4
|
||||
ba,pt %xcc, __restore_asi_fp
|
||||
add %o2, %o4, %o0
|
||||
ENDPROC(NG4_retl_o2_plus_o4_plus_32_fp)
|
||||
ENTRY(NG4_retl_o2_plus_o4_plus_40_fp)
|
||||
add %o4, 40, %o4
|
||||
ba,pt %xcc, __restore_asi_fp
|
||||
add %o2, %o4, %o0
|
||||
ENDPROC(NG4_retl_o2_plus_o4_plus_40_fp)
|
||||
ENTRY(NG4_retl_o2_plus_o4_plus_48_fp)
|
||||
add %o4, 48, %o4
|
||||
ba,pt %xcc, __restore_asi_fp
|
||||
add %o2, %o4, %o0
|
||||
ENDPROC(NG4_retl_o2_plus_o4_plus_48_fp)
|
||||
ENTRY(NG4_retl_o2_plus_o4_plus_56_fp)
|
||||
add %o4, 56, %o4
|
||||
ba,pt %xcc, __restore_asi_fp
|
||||
add %o2, %o4, %o0
|
||||
ENDPROC(NG4_retl_o2_plus_o4_plus_56_fp)
|
||||
ENTRY(NG4_retl_o2_plus_o4_plus_64_fp)
|
||||
add %o4, 64, %o4
|
||||
ba,pt %xcc, __restore_asi_fp
|
||||
add %o2, %o4, %o0
|
||||
ENDPROC(NG4_retl_o2_plus_o4_plus_64_fp)
|
||||
#endif
|
||||
.align 64
|
||||
|
||||
.globl FUNC_NAME
|
||||
|
@ -124,12 +274,13 @@ FUNC_NAME: /* %o0=dst, %o1=src, %o2=len */
|
|||
brz,pt %g1, 51f
|
||||
sub %o2, %g1, %o2
|
||||
|
||||
1: EX_LD(LOAD(ldub, %o1 + 0x00, %g2))
|
||||
|
||||
1: EX_LD(LOAD(ldub, %o1 + 0x00, %g2), NG4_retl_o2_plus_g1)
|
||||
add %o1, 1, %o1
|
||||
subcc %g1, 1, %g1
|
||||
add %o0, 1, %o0
|
||||
bne,pt %icc, 1b
|
||||
EX_ST(STORE(stb, %g2, %o0 - 0x01))
|
||||
EX_ST(STORE(stb, %g2, %o0 - 0x01), NG4_retl_o2_plus_g1_plus_1)
|
||||
|
||||
51: LOAD(prefetch, %o1 + 0x040, #n_reads_strong)
|
||||
LOAD(prefetch, %o1 + 0x080, #n_reads_strong)
|
||||
|
@ -154,43 +305,43 @@ FUNC_NAME: /* %o0=dst, %o1=src, %o2=len */
|
|||
brz,pt %g1, .Llarge_aligned
|
||||
sub %o2, %g1, %o2
|
||||
|
||||
1: EX_LD(LOAD(ldx, %o1 + 0x00, %g2))
|
||||
1: EX_LD(LOAD(ldx, %o1 + 0x00, %g2), NG4_retl_o2_plus_g1)
|
||||
add %o1, 8, %o1
|
||||
subcc %g1, 8, %g1
|
||||
add %o0, 8, %o0
|
||||
bne,pt %icc, 1b
|
||||
EX_ST(STORE(stx, %g2, %o0 - 0x08))
|
||||
EX_ST(STORE(stx, %g2, %o0 - 0x08), NG4_retl_o2_plus_g1_plus_8)
|
||||
|
||||
.Llarge_aligned:
|
||||
/* len >= 0x80 && src 8-byte aligned && dest 8-byte aligned */
|
||||
andn %o2, 0x3f, %o4
|
||||
sub %o2, %o4, %o2
|
||||
|
||||
1: EX_LD(LOAD(ldx, %o1 + 0x00, %g1))
|
||||
1: EX_LD(LOAD(ldx, %o1 + 0x00, %g1), NG4_retl_o2_plus_o4)
|
||||
add %o1, 0x40, %o1
|
||||
EX_LD(LOAD(ldx, %o1 - 0x38, %g2))
|
||||
EX_LD(LOAD(ldx, %o1 - 0x38, %g2), NG4_retl_o2_plus_o4)
|
||||
subcc %o4, 0x40, %o4
|
||||
EX_LD(LOAD(ldx, %o1 - 0x30, %g3))
|
||||
EX_LD(LOAD(ldx, %o1 - 0x28, GLOBAL_SPARE))
|
||||
EX_LD(LOAD(ldx, %o1 - 0x20, %o5))
|
||||
EX_ST(STORE_INIT(%g1, %o0))
|
||||
EX_LD(LOAD(ldx, %o1 - 0x30, %g3), NG4_retl_o2_plus_o4_plus_64)
|
||||
EX_LD(LOAD(ldx, %o1 - 0x28, GLOBAL_SPARE), NG4_retl_o2_plus_o4_plus_64)
|
||||
EX_LD(LOAD(ldx, %o1 - 0x20, %o5), NG4_retl_o2_plus_o4_plus_64)
|
||||
EX_ST(STORE_INIT(%g1, %o0), NG4_retl_o2_plus_o4_plus_64)
|
||||
add %o0, 0x08, %o0
|
||||
EX_ST(STORE_INIT(%g2, %o0))
|
||||
EX_ST(STORE_INIT(%g2, %o0), NG4_retl_o2_plus_o4_plus_56)
|
||||
add %o0, 0x08, %o0
|
||||
EX_LD(LOAD(ldx, %o1 - 0x18, %g2))
|
||||
EX_ST(STORE_INIT(%g3, %o0))
|
||||
EX_LD(LOAD(ldx, %o1 - 0x18, %g2), NG4_retl_o2_plus_o4_plus_48)
|
||||
EX_ST(STORE_INIT(%g3, %o0), NG4_retl_o2_plus_o4_plus_48)
|
||||
add %o0, 0x08, %o0
|
||||
EX_LD(LOAD(ldx, %o1 - 0x10, %g3))
|
||||
EX_ST(STORE_INIT(GLOBAL_SPARE, %o0))
|
||||
EX_LD(LOAD(ldx, %o1 - 0x10, %g3), NG4_retl_o2_plus_o4_plus_40)
|
||||
EX_ST(STORE_INIT(GLOBAL_SPARE, %o0), NG4_retl_o2_plus_o4_plus_40)
|
||||
add %o0, 0x08, %o0
|
||||
EX_LD(LOAD(ldx, %o1 - 0x08, GLOBAL_SPARE))
|
||||
EX_ST(STORE_INIT(%o5, %o0))
|
||||
EX_LD(LOAD(ldx, %o1 - 0x08, GLOBAL_SPARE), NG4_retl_o2_plus_o4_plus_32)
|
||||
EX_ST(STORE_INIT(%o5, %o0), NG4_retl_o2_plus_o4_plus_32)
|
||||
add %o0, 0x08, %o0
|
||||
EX_ST(STORE_INIT(%g2, %o0))
|
||||
EX_ST(STORE_INIT(%g2, %o0), NG4_retl_o2_plus_o4_plus_24)
|
||||
add %o0, 0x08, %o0
|
||||
EX_ST(STORE_INIT(%g3, %o0))
|
||||
EX_ST(STORE_INIT(%g3, %o0), NG4_retl_o2_plus_o4_plus_16)
|
||||
add %o0, 0x08, %o0
|
||||
EX_ST(STORE_INIT(GLOBAL_SPARE, %o0))
|
||||
EX_ST(STORE_INIT(GLOBAL_SPARE, %o0), NG4_retl_o2_plus_o4_plus_8)
|
||||
add %o0, 0x08, %o0
|
||||
bne,pt %icc, 1b
|
||||
LOAD(prefetch, %o1 + 0x200, #n_reads_strong)
|
||||
|
@ -216,17 +367,17 @@ FUNC_NAME: /* %o0=dst, %o1=src, %o2=len */
|
|||
sub %o2, %o4, %o2
|
||||
alignaddr %o1, %g0, %g1
|
||||
add %o1, %o4, %o1
|
||||
EX_LD_FP(LOAD(ldd, %g1 + 0x00, %f0))
|
||||
1: EX_LD_FP(LOAD(ldd, %g1 + 0x08, %f2))
|
||||
EX_LD_FP(LOAD(ldd, %g1 + 0x00, %f0), NG4_retl_o2_plus_o4)
|
||||
1: EX_LD_FP(LOAD(ldd, %g1 + 0x08, %f2), NG4_retl_o2_plus_o4)
|
||||
subcc %o4, 0x40, %o4
|
||||
EX_LD_FP(LOAD(ldd, %g1 + 0x10, %f4))
|
||||
EX_LD_FP(LOAD(ldd, %g1 + 0x18, %f6))
|
||||
EX_LD_FP(LOAD(ldd, %g1 + 0x20, %f8))
|
||||
EX_LD_FP(LOAD(ldd, %g1 + 0x28, %f10))
|
||||
EX_LD_FP(LOAD(ldd, %g1 + 0x30, %f12))
|
||||
EX_LD_FP(LOAD(ldd, %g1 + 0x38, %f14))
|
||||
EX_LD_FP(LOAD(ldd, %g1 + 0x10, %f4), NG4_retl_o2_plus_o4_plus_64)
|
||||
EX_LD_FP(LOAD(ldd, %g1 + 0x18, %f6), NG4_retl_o2_plus_o4_plus_64)
|
||||
EX_LD_FP(LOAD(ldd, %g1 + 0x20, %f8), NG4_retl_o2_plus_o4_plus_64)
|
||||
EX_LD_FP(LOAD(ldd, %g1 + 0x28, %f10), NG4_retl_o2_plus_o4_plus_64)
|
||||
EX_LD_FP(LOAD(ldd, %g1 + 0x30, %f12), NG4_retl_o2_plus_o4_plus_64)
|
||||
EX_LD_FP(LOAD(ldd, %g1 + 0x38, %f14), NG4_retl_o2_plus_o4_plus_64)
|
||||
faligndata %f0, %f2, %f16
|
||||
EX_LD_FP(LOAD(ldd, %g1 + 0x40, %f0))
|
||||
EX_LD_FP(LOAD(ldd, %g1 + 0x40, %f0), NG4_retl_o2_plus_o4_plus_64)
|
||||
faligndata %f2, %f4, %f18
|
||||
add %g1, 0x40, %g1
|
||||
faligndata %f4, %f6, %f20
|
||||
|
@ -235,14 +386,14 @@ FUNC_NAME: /* %o0=dst, %o1=src, %o2=len */
|
|||
faligndata %f10, %f12, %f26
|
||||
faligndata %f12, %f14, %f28
|
||||
faligndata %f14, %f0, %f30
|
||||
EX_ST_FP(STORE(std, %f16, %o0 + 0x00))
|
||||
EX_ST_FP(STORE(std, %f18, %o0 + 0x08))
|
||||
EX_ST_FP(STORE(std, %f20, %o0 + 0x10))
|
||||
EX_ST_FP(STORE(std, %f22, %o0 + 0x18))
|
||||
EX_ST_FP(STORE(std, %f24, %o0 + 0x20))
|
||||
EX_ST_FP(STORE(std, %f26, %o0 + 0x28))
|
||||
EX_ST_FP(STORE(std, %f28, %o0 + 0x30))
|
||||
EX_ST_FP(STORE(std, %f30, %o0 + 0x38))
|
||||
EX_ST_FP(STORE(std, %f16, %o0 + 0x00), NG4_retl_o2_plus_o4_plus_64)
|
||||
EX_ST_FP(STORE(std, %f18, %o0 + 0x08), NG4_retl_o2_plus_o4_plus_56)
|
||||
EX_ST_FP(STORE(std, %f20, %o0 + 0x10), NG4_retl_o2_plus_o4_plus_48)
|
||||
EX_ST_FP(STORE(std, %f22, %o0 + 0x18), NG4_retl_o2_plus_o4_plus_40)
|
||||
EX_ST_FP(STORE(std, %f24, %o0 + 0x20), NG4_retl_o2_plus_o4_plus_32)
|
||||
EX_ST_FP(STORE(std, %f26, %o0 + 0x28), NG4_retl_o2_plus_o4_plus_24)
|
||||
EX_ST_FP(STORE(std, %f28, %o0 + 0x30), NG4_retl_o2_plus_o4_plus_16)
|
||||
EX_ST_FP(STORE(std, %f30, %o0 + 0x38), NG4_retl_o2_plus_o4_plus_8)
|
||||
add %o0, 0x40, %o0
|
||||
bne,pt %icc, 1b
|
||||
LOAD(prefetch, %g1 + 0x200, #n_reads_strong)
|
||||
|
@ -270,37 +421,38 @@ FUNC_NAME: /* %o0=dst, %o1=src, %o2=len */
|
|||
andncc %o2, 0x20 - 1, %o5
|
||||
be,pn %icc, 2f
|
||||
sub %o2, %o5, %o2
|
||||
1: EX_LD(LOAD(ldx, %o1 + 0x00, %g1))
|
||||
EX_LD(LOAD(ldx, %o1 + 0x08, %g2))
|
||||
EX_LD(LOAD(ldx, %o1 + 0x10, GLOBAL_SPARE))
|
||||
EX_LD(LOAD(ldx, %o1 + 0x18, %o4))
|
||||
1: EX_LD(LOAD(ldx, %o1 + 0x00, %g1), NG4_retl_o2_plus_o5)
|
||||
EX_LD(LOAD(ldx, %o1 + 0x08, %g2), NG4_retl_o2_plus_o5)
|
||||
EX_LD(LOAD(ldx, %o1 + 0x10, GLOBAL_SPARE), NG4_retl_o2_plus_o5)
|
||||
EX_LD(LOAD(ldx, %o1 + 0x18, %o4), NG4_retl_o2_plus_o5)
|
||||
add %o1, 0x20, %o1
|
||||
subcc %o5, 0x20, %o5
|
||||
EX_ST(STORE(stx, %g1, %o0 + 0x00))
|
||||
EX_ST(STORE(stx, %g2, %o0 + 0x08))
|
||||
EX_ST(STORE(stx, GLOBAL_SPARE, %o0 + 0x10))
|
||||
EX_ST(STORE(stx, %o4, %o0 + 0x18))
|
||||
EX_ST(STORE(stx, %g1, %o0 + 0x00), NG4_retl_o2_plus_o5_plus_32)
|
||||
EX_ST(STORE(stx, %g2, %o0 + 0x08), NG4_retl_o2_plus_o5_plus_24)
|
||||
EX_ST(STORE(stx, GLOBAL_SPARE, %o0 + 0x10), NG4_retl_o2_plus_o5_plus_24)
|
||||
EX_ST(STORE(stx, %o4, %o0 + 0x18), NG4_retl_o2_plus_o5_plus_8)
|
||||
bne,pt %icc, 1b
|
||||
add %o0, 0x20, %o0
|
||||
2: andcc %o2, 0x18, %o5
|
||||
be,pt %icc, 3f
|
||||
sub %o2, %o5, %o2
|
||||
1: EX_LD(LOAD(ldx, %o1 + 0x00, %g1))
|
||||
|
||||
1: EX_LD(LOAD(ldx, %o1 + 0x00, %g1), NG4_retl_o2_plus_o5)
|
||||
add %o1, 0x08, %o1
|
||||
add %o0, 0x08, %o0
|
||||
subcc %o5, 0x08, %o5
|
||||
bne,pt %icc, 1b
|
||||
EX_ST(STORE(stx, %g1, %o0 - 0x08))
|
||||
EX_ST(STORE(stx, %g1, %o0 - 0x08), NG4_retl_o2_plus_o5_plus_8)
|
||||
3: brz,pt %o2, .Lexit
|
||||
cmp %o2, 0x04
|
||||
bl,pn %icc, .Ltiny
|
||||
nop
|
||||
EX_LD(LOAD(lduw, %o1 + 0x00, %g1))
|
||||
EX_LD(LOAD(lduw, %o1 + 0x00, %g1), NG4_retl_o2)
|
||||
add %o1, 0x04, %o1
|
||||
add %o0, 0x04, %o0
|
||||
subcc %o2, 0x04, %o2
|
||||
bne,pn %icc, .Ltiny
|
||||
EX_ST(STORE(stw, %g1, %o0 - 0x04))
|
||||
EX_ST(STORE(stw, %g1, %o0 - 0x04), NG4_retl_o2_plus_4)
|
||||
ba,a,pt %icc, .Lexit
|
||||
.Lmedium_unaligned:
|
||||
/* First get dest 8 byte aligned. */
|
||||
|
@ -309,12 +461,12 @@ FUNC_NAME: /* %o0=dst, %o1=src, %o2=len */
|
|||
brz,pt %g1, 2f
|
||||
sub %o2, %g1, %o2
|
||||
|
||||
1: EX_LD(LOAD(ldub, %o1 + 0x00, %g2))
|
||||
1: EX_LD(LOAD(ldub, %o1 + 0x00, %g2), NG4_retl_o2_plus_g1)
|
||||
add %o1, 1, %o1
|
||||
subcc %g1, 1, %g1
|
||||
add %o0, 1, %o0
|
||||
bne,pt %icc, 1b
|
||||
EX_ST(STORE(stb, %g2, %o0 - 0x01))
|
||||
EX_ST(STORE(stb, %g2, %o0 - 0x01), NG4_retl_o2_plus_g1_plus_1)
|
||||
2:
|
||||
and %o1, 0x7, %g1
|
||||
brz,pn %g1, .Lmedium_noprefetch
|
||||
|
@ -322,16 +474,16 @@ FUNC_NAME: /* %o0=dst, %o1=src, %o2=len */
|
|||
mov 64, %g2
|
||||
sub %g2, %g1, %g2
|
||||
andn %o1, 0x7, %o1
|
||||
EX_LD(LOAD(ldx, %o1 + 0x00, %o4))
|
||||
EX_LD(LOAD(ldx, %o1 + 0x00, %o4), NG4_retl_o2)
|
||||
sllx %o4, %g1, %o4
|
||||
andn %o2, 0x08 - 1, %o5
|
||||
sub %o2, %o5, %o2
|
||||
1: EX_LD(LOAD(ldx, %o1 + 0x08, %g3))
|
||||
1: EX_LD(LOAD(ldx, %o1 + 0x08, %g3), NG4_retl_o2_plus_o5)
|
||||
add %o1, 0x08, %o1
|
||||
subcc %o5, 0x08, %o5
|
||||
srlx %g3, %g2, GLOBAL_SPARE
|
||||
or GLOBAL_SPARE, %o4, GLOBAL_SPARE
|
||||
EX_ST(STORE(stx, GLOBAL_SPARE, %o0 + 0x00))
|
||||
EX_ST(STORE(stx, GLOBAL_SPARE, %o0 + 0x00), NG4_retl_o2_plus_o5_plus_8)
|
||||
add %o0, 0x08, %o0
|
||||
bne,pt %icc, 1b
|
||||
sllx %g3, %g1, %o4
|
||||
|
@ -342,17 +494,17 @@ FUNC_NAME: /* %o0=dst, %o1=src, %o2=len */
|
|||
ba,pt %icc, .Lsmall_unaligned
|
||||
|
||||
.Ltiny:
|
||||
EX_LD(LOAD(ldub, %o1 + 0x00, %g1))
|
||||
EX_LD(LOAD(ldub, %o1 + 0x00, %g1), NG4_retl_o2)
|
||||
subcc %o2, 1, %o2
|
||||
be,pn %icc, .Lexit
|
||||
EX_ST(STORE(stb, %g1, %o0 + 0x00))
|
||||
EX_LD(LOAD(ldub, %o1 + 0x01, %g1))
|
||||
EX_ST(STORE(stb, %g1, %o0 + 0x00), NG4_retl_o2_plus_1)
|
||||
EX_LD(LOAD(ldub, %o1 + 0x01, %g1), NG4_retl_o2)
|
||||
subcc %o2, 1, %o2
|
||||
be,pn %icc, .Lexit
|
||||
EX_ST(STORE(stb, %g1, %o0 + 0x01))
|
||||
EX_LD(LOAD(ldub, %o1 + 0x02, %g1))
|
||||
EX_ST(STORE(stb, %g1, %o0 + 0x01), NG4_retl_o2_plus_1)
|
||||
EX_LD(LOAD(ldub, %o1 + 0x02, %g1), NG4_retl_o2)
|
||||
ba,pt %icc, .Lexit
|
||||
EX_ST(STORE(stb, %g1, %o0 + 0x02))
|
||||
EX_ST(STORE(stb, %g1, %o0 + 0x02), NG4_retl_o2)
|
||||
|
||||
.Lsmall:
|
||||
andcc %g2, 0x3, %g0
|
||||
|
@ -360,22 +512,22 @@ FUNC_NAME: /* %o0=dst, %o1=src, %o2=len */
|
|||
andn %o2, 0x4 - 1, %o5
|
||||
sub %o2, %o5, %o2
|
||||
1:
|
||||
EX_LD(LOAD(lduw, %o1 + 0x00, %g1))
|
||||
EX_LD(LOAD(lduw, %o1 + 0x00, %g1), NG4_retl_o2_plus_o5)
|
||||
add %o1, 0x04, %o1
|
||||
subcc %o5, 0x04, %o5
|
||||
add %o0, 0x04, %o0
|
||||
bne,pt %icc, 1b
|
||||
EX_ST(STORE(stw, %g1, %o0 - 0x04))
|
||||
EX_ST(STORE(stw, %g1, %o0 - 0x04), NG4_retl_o2_plus_o5_plus_4)
|
||||
brz,pt %o2, .Lexit
|
||||
nop
|
||||
ba,a,pt %icc, .Ltiny
|
||||
|
||||
.Lsmall_unaligned:
|
||||
1: EX_LD(LOAD(ldub, %o1 + 0x00, %g1))
|
||||
1: EX_LD(LOAD(ldub, %o1 + 0x00, %g1), NG4_retl_o2)
|
||||
add %o1, 1, %o1
|
||||
add %o0, 1, %o0
|
||||
subcc %o2, 1, %o2
|
||||
bne,pt %icc, 1b
|
||||
EX_ST(STORE(stb, %g1, %o0 - 0x01))
|
||||
EX_ST(STORE(stb, %g1, %o0 - 0x01), NG4_retl_o2_plus_1)
|
||||
ba,a,pt %icc, .Lexit
|
||||
.size FUNC_NAME, .-FUNC_NAME
|
||||
|
|
|
@ -3,11 +3,11 @@
|
|||
* Copyright (C) 2006, 2007 David S. Miller (davem@davemloft.net)
|
||||
*/
|
||||
|
||||
#define EX_LD(x) \
|
||||
#define EX_LD(x,y) \
|
||||
98: x; \
|
||||
.section __ex_table,"a";\
|
||||
.align 4; \
|
||||
.word 98b, __ret_one_asi;\
|
||||
.word 98b, y; \
|
||||
.text; \
|
||||
.align 4;
|
||||
|
||||
|
|
|
@ -3,11 +3,11 @@
|
|||
* Copyright (C) 2006, 2007 David S. Miller (davem@davemloft.net)
|
||||
*/
|
||||
|
||||
#define EX_ST(x) \
|
||||
#define EX_ST(x,y) \
|
||||
98: x; \
|
||||
.section __ex_table,"a";\
|
||||
.align 4; \
|
||||
.word 98b, __ret_one_asi;\
|
||||
.word 98b, y; \
|
||||
.text; \
|
||||
.align 4;
|
||||
|
||||
|
|
|
@ -4,6 +4,7 @@
|
|||
*/
|
||||
|
||||
#ifdef __KERNEL__
|
||||
#include <linux/linkage.h>
|
||||
#include <asm/asi.h>
|
||||
#include <asm/thread_info.h>
|
||||
#define GLOBAL_SPARE %g7
|
||||
|
@ -27,15 +28,11 @@
|
|||
#endif
|
||||
|
||||
#ifndef EX_LD
|
||||
#define EX_LD(x) x
|
||||
#define EX_LD(x,y) x
|
||||
#endif
|
||||
|
||||
#ifndef EX_ST
|
||||
#define EX_ST(x) x
|
||||
#endif
|
||||
|
||||
#ifndef EX_RETVAL
|
||||
#define EX_RETVAL(x) x
|
||||
#define EX_ST(x,y) x
|
||||
#endif
|
||||
|
||||
#ifndef LOAD
|
||||
|
@ -79,6 +76,92 @@
|
|||
.register %g3,#scratch
|
||||
|
||||
.text
|
||||
#ifndef EX_RETVAL
|
||||
#define EX_RETVAL(x) x
|
||||
__restore_asi:
|
||||
ret
|
||||
wr %g0, ASI_AIUS, %asi
|
||||
restore
|
||||
ENTRY(NG_ret_i2_plus_i4_plus_1)
|
||||
ba,pt %xcc, __restore_asi
|
||||
add %i2, %i5, %i0
|
||||
ENDPROC(NG_ret_i2_plus_i4_plus_1)
|
||||
ENTRY(NG_ret_i2_plus_g1)
|
||||
ba,pt %xcc, __restore_asi
|
||||
add %i2, %g1, %i0
|
||||
ENDPROC(NG_ret_i2_plus_g1)
|
||||
ENTRY(NG_ret_i2_plus_g1_minus_8)
|
||||
sub %g1, 8, %g1
|
||||
ba,pt %xcc, __restore_asi
|
||||
add %i2, %g1, %i0
|
||||
ENDPROC(NG_ret_i2_plus_g1_minus_8)
|
||||
ENTRY(NG_ret_i2_plus_g1_minus_16)
|
||||
sub %g1, 16, %g1
|
||||
ba,pt %xcc, __restore_asi
|
||||
add %i2, %g1, %i0
|
||||
ENDPROC(NG_ret_i2_plus_g1_minus_16)
|
||||
ENTRY(NG_ret_i2_plus_g1_minus_24)
|
||||
sub %g1, 24, %g1
|
||||
ba,pt %xcc, __restore_asi
|
||||
add %i2, %g1, %i0
|
||||
ENDPROC(NG_ret_i2_plus_g1_minus_24)
|
||||
ENTRY(NG_ret_i2_plus_g1_minus_32)
|
||||
sub %g1, 32, %g1
|
||||
ba,pt %xcc, __restore_asi
|
||||
add %i2, %g1, %i0
|
||||
ENDPROC(NG_ret_i2_plus_g1_minus_32)
|
||||
ENTRY(NG_ret_i2_plus_g1_minus_40)
|
||||
sub %g1, 40, %g1
|
||||
ba,pt %xcc, __restore_asi
|
||||
add %i2, %g1, %i0
|
||||
ENDPROC(NG_ret_i2_plus_g1_minus_40)
|
||||
ENTRY(NG_ret_i2_plus_g1_minus_48)
|
||||
sub %g1, 48, %g1
|
||||
ba,pt %xcc, __restore_asi
|
||||
add %i2, %g1, %i0
|
||||
ENDPROC(NG_ret_i2_plus_g1_minus_48)
|
||||
ENTRY(NG_ret_i2_plus_g1_minus_56)
|
||||
sub %g1, 56, %g1
|
||||
ba,pt %xcc, __restore_asi
|
||||
add %i2, %g1, %i0
|
||||
ENDPROC(NG_ret_i2_plus_g1_minus_56)
|
||||
ENTRY(NG_ret_i2_plus_i4)
|
||||
ba,pt %xcc, __restore_asi
|
||||
add %i2, %i4, %i0
|
||||
ENDPROC(NG_ret_i2_plus_i4)
|
||||
ENTRY(NG_ret_i2_plus_i4_minus_8)
|
||||
sub %i4, 8, %i4
|
||||
ba,pt %xcc, __restore_asi
|
||||
add %i2, %i4, %i0
|
||||
ENDPROC(NG_ret_i2_plus_i4_minus_8)
|
||||
ENTRY(NG_ret_i2_plus_8)
|
||||
ba,pt %xcc, __restore_asi
|
||||
add %i2, 8, %i0
|
||||
ENDPROC(NG_ret_i2_plus_8)
|
||||
ENTRY(NG_ret_i2_plus_4)
|
||||
ba,pt %xcc, __restore_asi
|
||||
add %i2, 4, %i0
|
||||
ENDPROC(NG_ret_i2_plus_4)
|
||||
ENTRY(NG_ret_i2_plus_1)
|
||||
ba,pt %xcc, __restore_asi
|
||||
add %i2, 1, %i0
|
||||
ENDPROC(NG_ret_i2_plus_1)
|
||||
ENTRY(NG_ret_i2_plus_g1_plus_1)
|
||||
add %g1, 1, %g1
|
||||
ba,pt %xcc, __restore_asi
|
||||
add %i2, %g1, %i0
|
||||
ENDPROC(NG_ret_i2_plus_g1_plus_1)
|
||||
ENTRY(NG_ret_i2)
|
||||
ba,pt %xcc, __restore_asi
|
||||
mov %i2, %i0
|
||||
ENDPROC(NG_ret_i2)
|
||||
ENTRY(NG_ret_i2_and_7_plus_i4)
|
||||
and %i2, 7, %i2
|
||||
ba,pt %xcc, __restore_asi
|
||||
add %i2, %i4, %i0
|
||||
ENDPROC(NG_ret_i2_and_7_plus_i4)
|
||||
#endif
|
||||
|
||||
.align 64
|
||||
|
||||
.globl FUNC_NAME
|
||||
|
@ -126,8 +209,8 @@ FUNC_NAME: /* %i0=dst, %i1=src, %i2=len */
|
|||
sub %g0, %i4, %i4 ! bytes to align dst
|
||||
sub %i2, %i4, %i2
|
||||
1: subcc %i4, 1, %i4
|
||||
EX_LD(LOAD(ldub, %i1, %g1))
|
||||
EX_ST(STORE(stb, %g1, %o0))
|
||||
EX_LD(LOAD(ldub, %i1, %g1), NG_ret_i2_plus_i4_plus_1)
|
||||
EX_ST(STORE(stb, %g1, %o0), NG_ret_i2_plus_i4_plus_1)
|
||||
add %i1, 1, %i1
|
||||
bne,pt %XCC, 1b
|
||||
add %o0, 1, %o0
|
||||
|
@ -160,7 +243,7 @@ FUNC_NAME: /* %i0=dst, %i1=src, %i2=len */
|
|||
and %i4, 0x7, GLOBAL_SPARE
|
||||
sll GLOBAL_SPARE, 3, GLOBAL_SPARE
|
||||
mov 64, %i5
|
||||
EX_LD(LOAD_TWIN(%i1, %g2, %g3))
|
||||
EX_LD(LOAD_TWIN(%i1, %g2, %g3), NG_ret_i2_plus_g1)
|
||||
sub %i5, GLOBAL_SPARE, %i5
|
||||
mov 16, %o4
|
||||
mov 32, %o5
|
||||
|
@ -178,31 +261,31 @@ FUNC_NAME: /* %i0=dst, %i1=src, %i2=len */
|
|||
srlx WORD3, PRE_SHIFT, TMP; \
|
||||
or WORD2, TMP, WORD2;
|
||||
|
||||
8: EX_LD(LOAD_TWIN(%i1 + %o4, %o2, %o3))
|
||||
8: EX_LD(LOAD_TWIN(%i1 + %o4, %o2, %o3), NG_ret_i2_plus_g1)
|
||||
MIX_THREE_WORDS(%g2, %g3, %o2, %i5, GLOBAL_SPARE, %o1)
|
||||
LOAD(prefetch, %i1 + %i3, #one_read)
|
||||
|
||||
EX_ST(STORE_INIT(%g2, %o0 + 0x00))
|
||||
EX_ST(STORE_INIT(%g3, %o0 + 0x08))
|
||||
EX_ST(STORE_INIT(%g2, %o0 + 0x00), NG_ret_i2_plus_g1)
|
||||
EX_ST(STORE_INIT(%g3, %o0 + 0x08), NG_ret_i2_plus_g1_minus_8)
|
||||
|
||||
EX_LD(LOAD_TWIN(%i1 + %o5, %g2, %g3))
|
||||
EX_LD(LOAD_TWIN(%i1 + %o5, %g2, %g3), NG_ret_i2_plus_g1_minus_16)
|
||||
MIX_THREE_WORDS(%o2, %o3, %g2, %i5, GLOBAL_SPARE, %o1)
|
||||
|
||||
EX_ST(STORE_INIT(%o2, %o0 + 0x10))
|
||||
EX_ST(STORE_INIT(%o3, %o0 + 0x18))
|
||||
EX_ST(STORE_INIT(%o2, %o0 + 0x10), NG_ret_i2_plus_g1_minus_16)
|
||||
EX_ST(STORE_INIT(%o3, %o0 + 0x18), NG_ret_i2_plus_g1_minus_24)
|
||||
|
||||
EX_LD(LOAD_TWIN(%i1 + %o7, %o2, %o3))
|
||||
EX_LD(LOAD_TWIN(%i1 + %o7, %o2, %o3), NG_ret_i2_plus_g1_minus_32)
|
||||
MIX_THREE_WORDS(%g2, %g3, %o2, %i5, GLOBAL_SPARE, %o1)
|
||||
|
||||
EX_ST(STORE_INIT(%g2, %o0 + 0x20))
|
||||
EX_ST(STORE_INIT(%g3, %o0 + 0x28))
|
||||
EX_ST(STORE_INIT(%g2, %o0 + 0x20), NG_ret_i2_plus_g1_minus_32)
|
||||
EX_ST(STORE_INIT(%g3, %o0 + 0x28), NG_ret_i2_plus_g1_minus_40)
|
||||
|
||||
EX_LD(LOAD_TWIN(%i1 + %i3, %g2, %g3))
|
||||
EX_LD(LOAD_TWIN(%i1 + %i3, %g2, %g3), NG_ret_i2_plus_g1_minus_48)
|
||||
add %i1, 64, %i1
|
||||
MIX_THREE_WORDS(%o2, %o3, %g2, %i5, GLOBAL_SPARE, %o1)
|
||||
|
||||
EX_ST(STORE_INIT(%o2, %o0 + 0x30))
|
||||
EX_ST(STORE_INIT(%o3, %o0 + 0x38))
|
||||
EX_ST(STORE_INIT(%o2, %o0 + 0x30), NG_ret_i2_plus_g1_minus_48)
|
||||
EX_ST(STORE_INIT(%o3, %o0 + 0x38), NG_ret_i2_plus_g1_minus_56)
|
||||
|
||||
subcc %g1, 64, %g1
|
||||
bne,pt %XCC, 8b
|
||||
|
@ -211,31 +294,31 @@ FUNC_NAME: /* %i0=dst, %i1=src, %i2=len */
|
|||
ba,pt %XCC, 60f
|
||||
add %i1, %i4, %i1
|
||||
|
||||
9: EX_LD(LOAD_TWIN(%i1 + %o4, %o2, %o3))
|
||||
9: EX_LD(LOAD_TWIN(%i1 + %o4, %o2, %o3), NG_ret_i2_plus_g1)
|
||||
MIX_THREE_WORDS(%g3, %o2, %o3, %i5, GLOBAL_SPARE, %o1)
|
||||
LOAD(prefetch, %i1 + %i3, #one_read)
|
||||
|
||||
EX_ST(STORE_INIT(%g3, %o0 + 0x00))
|
||||
EX_ST(STORE_INIT(%o2, %o0 + 0x08))
|
||||
EX_ST(STORE_INIT(%g3, %o0 + 0x00), NG_ret_i2_plus_g1)
|
||||
EX_ST(STORE_INIT(%o2, %o0 + 0x08), NG_ret_i2_plus_g1_minus_8)
|
||||
|
||||
EX_LD(LOAD_TWIN(%i1 + %o5, %g2, %g3))
|
||||
EX_LD(LOAD_TWIN(%i1 + %o5, %g2, %g3), NG_ret_i2_plus_g1_minus_16)
|
||||
MIX_THREE_WORDS(%o3, %g2, %g3, %i5, GLOBAL_SPARE, %o1)
|
||||
|
||||
EX_ST(STORE_INIT(%o3, %o0 + 0x10))
|
||||
EX_ST(STORE_INIT(%g2, %o0 + 0x18))
|
||||
EX_ST(STORE_INIT(%o3, %o0 + 0x10), NG_ret_i2_plus_g1_minus_16)
|
||||
EX_ST(STORE_INIT(%g2, %o0 + 0x18), NG_ret_i2_plus_g1_minus_24)
|
||||
|
||||
EX_LD(LOAD_TWIN(%i1 + %o7, %o2, %o3))
|
||||
EX_LD(LOAD_TWIN(%i1 + %o7, %o2, %o3), NG_ret_i2_plus_g1_minus_32)
|
||||
MIX_THREE_WORDS(%g3, %o2, %o3, %i5, GLOBAL_SPARE, %o1)
|
||||
|
||||
EX_ST(STORE_INIT(%g3, %o0 + 0x20))
|
||||
EX_ST(STORE_INIT(%o2, %o0 + 0x28))
|
||||
EX_ST(STORE_INIT(%g3, %o0 + 0x20), NG_ret_i2_plus_g1_minus_32)
|
||||
EX_ST(STORE_INIT(%o2, %o0 + 0x28), NG_ret_i2_plus_g1_minus_40)
|
||||
|
||||
EX_LD(LOAD_TWIN(%i1 + %i3, %g2, %g3))
|
||||
EX_LD(LOAD_TWIN(%i1 + %i3, %g2, %g3), NG_ret_i2_plus_g1_minus_48)
|
||||
add %i1, 64, %i1
|
||||
MIX_THREE_WORDS(%o3, %g2, %g3, %i5, GLOBAL_SPARE, %o1)
|
||||
|
||||
EX_ST(STORE_INIT(%o3, %o0 + 0x30))
|
||||
EX_ST(STORE_INIT(%g2, %o0 + 0x38))
|
||||
EX_ST(STORE_INIT(%o3, %o0 + 0x30), NG_ret_i2_plus_g1_minus_48)
|
||||
EX_ST(STORE_INIT(%g2, %o0 + 0x38), NG_ret_i2_plus_g1_minus_56)
|
||||
|
||||
subcc %g1, 64, %g1
|
||||
bne,pt %XCC, 9b
|
||||
|
@ -249,25 +332,25 @@ FUNC_NAME: /* %i0=dst, %i1=src, %i2=len */
|
|||
* one twin load ahead, then add 8 back into source when
|
||||
* we finish the loop.
|
||||
*/
|
||||
EX_LD(LOAD_TWIN(%i1, %o4, %o5))
|
||||
EX_LD(LOAD_TWIN(%i1, %o4, %o5), NG_ret_i2_plus_g1)
|
||||
mov 16, %o7
|
||||
mov 32, %g2
|
||||
mov 48, %g3
|
||||
mov 64, %o1
|
||||
1: EX_LD(LOAD_TWIN(%i1 + %o7, %o2, %o3))
|
||||
1: EX_LD(LOAD_TWIN(%i1 + %o7, %o2, %o3), NG_ret_i2_plus_g1)
|
||||
LOAD(prefetch, %i1 + %o1, #one_read)
|
||||
EX_ST(STORE_INIT(%o5, %o0 + 0x00)) ! initializes cache line
|
||||
EX_ST(STORE_INIT(%o2, %o0 + 0x08))
|
||||
EX_LD(LOAD_TWIN(%i1 + %g2, %o4, %o5))
|
||||
EX_ST(STORE_INIT(%o3, %o0 + 0x10))
|
||||
EX_ST(STORE_INIT(%o4, %o0 + 0x18))
|
||||
EX_LD(LOAD_TWIN(%i1 + %g3, %o2, %o3))
|
||||
EX_ST(STORE_INIT(%o5, %o0 + 0x20))
|
||||
EX_ST(STORE_INIT(%o2, %o0 + 0x28))
|
||||
EX_LD(LOAD_TWIN(%i1 + %o1, %o4, %o5))
|
||||
EX_ST(STORE_INIT(%o5, %o0 + 0x00), NG_ret_i2_plus_g1) ! initializes cache line
|
||||
EX_ST(STORE_INIT(%o2, %o0 + 0x08), NG_ret_i2_plus_g1_minus_8)
|
||||
EX_LD(LOAD_TWIN(%i1 + %g2, %o4, %o5), NG_ret_i2_plus_g1_minus_16)
|
||||
EX_ST(STORE_INIT(%o3, %o0 + 0x10), NG_ret_i2_plus_g1_minus_16)
|
||||
EX_ST(STORE_INIT(%o4, %o0 + 0x18), NG_ret_i2_plus_g1_minus_24)
|
||||
EX_LD(LOAD_TWIN(%i1 + %g3, %o2, %o3), NG_ret_i2_plus_g1_minus_32)
|
||||
EX_ST(STORE_INIT(%o5, %o0 + 0x20), NG_ret_i2_plus_g1_minus_32)
|
||||
EX_ST(STORE_INIT(%o2, %o0 + 0x28), NG_ret_i2_plus_g1_minus_40)
|
||||
EX_LD(LOAD_TWIN(%i1 + %o1, %o4, %o5), NG_ret_i2_plus_g1_minus_48)
|
||||
add %i1, 64, %i1
|
||||
EX_ST(STORE_INIT(%o3, %o0 + 0x30))
|
||||
EX_ST(STORE_INIT(%o4, %o0 + 0x38))
|
||||
EX_ST(STORE_INIT(%o3, %o0 + 0x30), NG_ret_i2_plus_g1_minus_48)
|
||||
EX_ST(STORE_INIT(%o4, %o0 + 0x38), NG_ret_i2_plus_g1_minus_56)
|
||||
subcc %g1, 64, %g1
|
||||
bne,pt %XCC, 1b
|
||||
add %o0, 64, %o0
|
||||
|
@ -282,20 +365,20 @@ FUNC_NAME: /* %i0=dst, %i1=src, %i2=len */
|
|||
mov 32, %g2
|
||||
mov 48, %g3
|
||||
mov 64, %o1
|
||||
1: EX_LD(LOAD_TWIN(%i1 + %g0, %o4, %o5))
|
||||
EX_LD(LOAD_TWIN(%i1 + %o7, %o2, %o3))
|
||||
1: EX_LD(LOAD_TWIN(%i1 + %g0, %o4, %o5), NG_ret_i2_plus_g1)
|
||||
EX_LD(LOAD_TWIN(%i1 + %o7, %o2, %o3), NG_ret_i2_plus_g1)
|
||||
LOAD(prefetch, %i1 + %o1, #one_read)
|
||||
EX_ST(STORE_INIT(%o4, %o0 + 0x00)) ! initializes cache line
|
||||
EX_ST(STORE_INIT(%o5, %o0 + 0x08))
|
||||
EX_LD(LOAD_TWIN(%i1 + %g2, %o4, %o5))
|
||||
EX_ST(STORE_INIT(%o2, %o0 + 0x10))
|
||||
EX_ST(STORE_INIT(%o3, %o0 + 0x18))
|
||||
EX_LD(LOAD_TWIN(%i1 + %g3, %o2, %o3))
|
||||
EX_ST(STORE_INIT(%o4, %o0 + 0x00), NG_ret_i2_plus_g1) ! initializes cache line
|
||||
EX_ST(STORE_INIT(%o5, %o0 + 0x08), NG_ret_i2_plus_g1_minus_8)
|
||||
EX_LD(LOAD_TWIN(%i1 + %g2, %o4, %o5), NG_ret_i2_plus_g1_minus_16)
|
||||
EX_ST(STORE_INIT(%o2, %o0 + 0x10), NG_ret_i2_plus_g1_minus_16)
|
||||
EX_ST(STORE_INIT(%o3, %o0 + 0x18), NG_ret_i2_plus_g1_minus_24)
|
||||
EX_LD(LOAD_TWIN(%i1 + %g3, %o2, %o3), NG_ret_i2_plus_g1_minus_32)
|
||||
add %i1, 64, %i1
|
||||
EX_ST(STORE_INIT(%o4, %o0 + 0x20))
|
||||
EX_ST(STORE_INIT(%o5, %o0 + 0x28))
|
||||
EX_ST(STORE_INIT(%o2, %o0 + 0x30))
|
||||
EX_ST(STORE_INIT(%o3, %o0 + 0x38))
|
||||
EX_ST(STORE_INIT(%o4, %o0 + 0x20), NG_ret_i2_plus_g1_minus_32)
|
||||
EX_ST(STORE_INIT(%o5, %o0 + 0x28), NG_ret_i2_plus_g1_minus_40)
|
||||
EX_ST(STORE_INIT(%o2, %o0 + 0x30), NG_ret_i2_plus_g1_minus_48)
|
||||
EX_ST(STORE_INIT(%o3, %o0 + 0x38), NG_ret_i2_plus_g1_minus_56)
|
||||
subcc %g1, 64, %g1
|
||||
bne,pt %XCC, 1b
|
||||
add %o0, 64, %o0
|
||||
|
@ -321,28 +404,28 @@ FUNC_NAME: /* %i0=dst, %i1=src, %i2=len */
|
|||
andn %i2, 0xf, %i4
|
||||
and %i2, 0xf, %i2
|
||||
1: subcc %i4, 0x10, %i4
|
||||
EX_LD(LOAD(ldx, %i1, %o4))
|
||||
EX_LD(LOAD(ldx, %i1, %o4), NG_ret_i2_plus_i4)
|
||||
add %i1, 0x08, %i1
|
||||
EX_LD(LOAD(ldx, %i1, %g1))
|
||||
EX_LD(LOAD(ldx, %i1, %g1), NG_ret_i2_plus_i4)
|
||||
sub %i1, 0x08, %i1
|
||||
EX_ST(STORE(stx, %o4, %i1 + %i3))
|
||||
EX_ST(STORE(stx, %o4, %i1 + %i3), NG_ret_i2_plus_i4)
|
||||
add %i1, 0x8, %i1
|
||||
EX_ST(STORE(stx, %g1, %i1 + %i3))
|
||||
EX_ST(STORE(stx, %g1, %i1 + %i3), NG_ret_i2_plus_i4_minus_8)
|
||||
bgu,pt %XCC, 1b
|
||||
add %i1, 0x8, %i1
|
||||
73: andcc %i2, 0x8, %g0
|
||||
be,pt %XCC, 1f
|
||||
nop
|
||||
sub %i2, 0x8, %i2
|
||||
EX_LD(LOAD(ldx, %i1, %o4))
|
||||
EX_ST(STORE(stx, %o4, %i1 + %i3))
|
||||
EX_LD(LOAD(ldx, %i1, %o4), NG_ret_i2_plus_8)
|
||||
EX_ST(STORE(stx, %o4, %i1 + %i3), NG_ret_i2_plus_8)
|
||||
add %i1, 0x8, %i1
|
||||
1: andcc %i2, 0x4, %g0
|
||||
be,pt %XCC, 1f
|
||||
nop
|
||||
sub %i2, 0x4, %i2
|
||||
EX_LD(LOAD(lduw, %i1, %i5))
|
||||
EX_ST(STORE(stw, %i5, %i1 + %i3))
|
||||
EX_LD(LOAD(lduw, %i1, %i5), NG_ret_i2_plus_4)
|
||||
EX_ST(STORE(stw, %i5, %i1 + %i3), NG_ret_i2_plus_4)
|
||||
add %i1, 0x4, %i1
|
||||
1: cmp %i2, 0
|
||||
be,pt %XCC, 85f
|
||||
|
@ -358,8 +441,8 @@ FUNC_NAME: /* %i0=dst, %i1=src, %i2=len */
|
|||
sub %i2, %g1, %i2
|
||||
|
||||
1: subcc %g1, 1, %g1
|
||||
EX_LD(LOAD(ldub, %i1, %i5))
|
||||
EX_ST(STORE(stb, %i5, %i1 + %i3))
|
||||
EX_LD(LOAD(ldub, %i1, %i5), NG_ret_i2_plus_g1_plus_1)
|
||||
EX_ST(STORE(stb, %i5, %i1 + %i3), NG_ret_i2_plus_g1_plus_1)
|
||||
bgu,pt %icc, 1b
|
||||
add %i1, 1, %i1
|
||||
|
||||
|
@ -375,16 +458,16 @@ FUNC_NAME: /* %i0=dst, %i1=src, %i2=len */
|
|||
|
||||
8: mov 64, %i3
|
||||
andn %i1, 0x7, %i1
|
||||
EX_LD(LOAD(ldx, %i1, %g2))
|
||||
EX_LD(LOAD(ldx, %i1, %g2), NG_ret_i2)
|
||||
sub %i3, %g1, %i3
|
||||
andn %i2, 0x7, %i4
|
||||
sllx %g2, %g1, %g2
|
||||
1: add %i1, 0x8, %i1
|
||||
EX_LD(LOAD(ldx, %i1, %g3))
|
||||
EX_LD(LOAD(ldx, %i1, %g3), NG_ret_i2_and_7_plus_i4)
|
||||
subcc %i4, 0x8, %i4
|
||||
srlx %g3, %i3, %i5
|
||||
or %i5, %g2, %i5
|
||||
EX_ST(STORE(stx, %i5, %o0))
|
||||
EX_ST(STORE(stx, %i5, %o0), NG_ret_i2_and_7_plus_i4)
|
||||
add %o0, 0x8, %o0
|
||||
bgu,pt %icc, 1b
|
||||
sllx %g3, %g1, %g2
|
||||
|
@ -404,8 +487,8 @@ FUNC_NAME: /* %i0=dst, %i1=src, %i2=len */
|
|||
|
||||
1:
|
||||
subcc %i2, 4, %i2
|
||||
EX_LD(LOAD(lduw, %i1, %g1))
|
||||
EX_ST(STORE(stw, %g1, %i1 + %i3))
|
||||
EX_LD(LOAD(lduw, %i1, %g1), NG_ret_i2_plus_4)
|
||||
EX_ST(STORE(stw, %g1, %i1 + %i3), NG_ret_i2_plus_4)
|
||||
bgu,pt %XCC, 1b
|
||||
add %i1, 4, %i1
|
||||
|
||||
|
@ -415,8 +498,8 @@ FUNC_NAME: /* %i0=dst, %i1=src, %i2=len */
|
|||
.align 32
|
||||
90:
|
||||
subcc %i2, 1, %i2
|
||||
EX_LD(LOAD(ldub, %i1, %g1))
|
||||
EX_ST(STORE(stb, %g1, %i1 + %i3))
|
||||
EX_LD(LOAD(ldub, %i1, %g1), NG_ret_i2_plus_1)
|
||||
EX_ST(STORE(stb, %g1, %i1 + %i3), NG_ret_i2_plus_1)
|
||||
bgu,pt %XCC, 90b
|
||||
add %i1, 1, %i1
|
||||
ret
|
||||
|
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue