mirror of
https://github.com/torvalds/linux
synced 2024-10-06 19:34:19 +00:00
ALSA: emu10k1: improve cache behavior documentation
Resulting from more reverse engineering in the course of debugging. Signed-off-by: Oswald Buddenhagen <oswald.buddenhagen@gmx.de> Message-ID: <20240406064830.1029573-15-oswald.buddenhagen@gmx.de> Signed-off-by: Takashi Iwai <tiwai@suse.de>
This commit is contained in:
parent
80d7c3cccd
commit
65db949667
|
@ -598,17 +598,25 @@ SUB_REG(PEFE, FILTERAMOUNT, 0x000000ff) /* Filter envlope amount */
|
|||
// In stereo mode, the two channels' caches are concatenated into one,
|
||||
// and hold the interleaved frames.
|
||||
// The cache holds 64 frames, so the upper half is not used in 8-bit mode.
|
||||
// All registers mentioned below count in frames.
|
||||
// The cache is a ring buffer; CCR_READADDRESS operates modulo 64.
|
||||
// The cache is filled from (CCCA_CURRADDR - CCR_CACHEINVALIDSIZE)
|
||||
// into (CCR_READADDRESS - CCR_CACHEINVALIDSIZE).
|
||||
// All registers mentioned below count in frames. Shortcuts:
|
||||
// CA = CCCA_CURRADDR, CRA = CCR_READADDRESS,
|
||||
// CLA = CCR_CACHELOOPADDRHI:CLP_CACHELOOPADDR,
|
||||
// CIS = CCR_CACHEINVALIDSIZE, LIS = CCR_LOOPINVALSIZE,
|
||||
// CLF = CCR_CACHELOOPFLAG, LF = CCR_LOOPFLAG
|
||||
// The cache is a ring buffer; CRA operates modulo 64.
|
||||
// The cache is filled from (CA - CIS) into (CRA - CIS).
|
||||
// The engine has a fetch threshold of 32 bytes, so it tries to keep
|
||||
// CCR_CACHEINVALIDSIZE below 8 (16-bit stereo), 16 (16-bit mono,
|
||||
// 8-bit stereo), or 32 (8-bit mono). The actual transfers are pretty
|
||||
// unpredictable, especially if several voices are running.
|
||||
// Frames are consumed at CCR_READADDRESS, which is incremented afterwards,
|
||||
// along with CCCA_CURRADDR and CCR_CACHEINVALIDSIZE. This implies that the
|
||||
// actual playback position always lags CCCA_CURRADDR by exactly 64 frames.
|
||||
// CIS below 8 (16-bit stereo), 16 (16-bit mono, 8-bit stereo), or
|
||||
// 32 (8-bit mono). The actual transfers are pretty unpredictable,
|
||||
// especially if several voices are running.
|
||||
// Frames are consumed at CRA, which is incremented afterwards,
|
||||
// along with CA and CIS. This implies that the actual playback
|
||||
// position always lags CA by exactly 64 frames.
|
||||
// When CA reaches DSL_LOOPENDADDR, LF is set for one frame's time.
|
||||
// LF's rising edge causes the current values of CA and CIS to be
|
||||
// copied into CLA and LIS, resp., and CLF to be set.
|
||||
// If CLF is set, the first LIS of the CIS frames are instead
|
||||
// filled from (CLA - LIS), and CLF is subsequently reset.
|
||||
#define CD0 0x20 /* Cache data registers 0 .. 0x1f */
|
||||
|
||||
#define PTB 0x40 /* Page table base register */
|
||||
|
|
Loading…
Reference in a new issue