ALSA: hda/realtek: Enable internal speakers on Razer Blade 16 (2025)

On the Razer Blade 16 (2025) (Realtek ALC298, PCI SSID 1a58:300e) the
internal speakers are driven through an external smart amplifier whose
crossover, voicing and protection live in a DSP reached over a vendor
coef mailbox on NID 0x20.  Both speaker pins are fed from one DAC
through a mixer and the amplifier does the crossover.  The BIOS leaves
the tweeter pin (NID 0x14) disabled (default config 0x411111f0), so the
tweeters are not exposed and the amplifier is never programmed for this
machine under Linux.

Add a fixup for the machine that:

  - re-exposes the tweeter pin (NID 0x14) as an internal speaker in the
    same association (2) as the woofer (NID 0x17), so the controls come
    out as "Speaker"/"Bass Speaker", with auto-mute on headphone
    insertion;

  - pins every output to a fixed converter via preferred_dacs so the
    routing does not depend on the generic parser's DAC-allocation
    heuristics: both speaker pins share DAC 0x03 (the only converter
    that drives the woofer on this machine) through the mixer, while the
    headphone (NID 0x21) keeps DAC 0x02.  Without a fixed assignment the
    parser brings up only one speaker pin and leaves the other silent;

  - wakes the external amp, programs its DSP over the NID-0x20 mailbox
    at init (boot and resume) and parks it; it is woken again for
    playback and parked afterwards from a pcm_playback_hook, like the
    existing Samsung and LG Gram amplifier fixups.

The DSP sequence was obtained by capturing the Windows driver's HD-audio
traffic via QEMU/VFIO passthrough of the controller and reducing it to
the NID-0x20 writes this machine needs; everything else the parser
rebuilds.  The captured tables are large, so the programming and
the fixup live in a separate file under
sound/hda/codecs/helpers/ that the codec driver includes.

Signed-off-by: Christopher Höner <christopher-hoener@web.de>
Link: https://patch.msgid.link/20260623191436.6605-1-christopher-hoener@web.de
Signed-off-by: Takashi Iwai <tiwai@suse.de>
This commit is contained in:
Christopher Höner 2026-06-23 21:14:36 +02:00 committed by Takashi Iwai
parent f199040982
commit 961d9f98da
2 changed files with 841 additions and 0 deletions

View File

@ -0,0 +1,820 @@
// SPDX-License-Identifier: GPL-2.0-or-later
/*
* Razer Blade 16 (2025) external smart-amplifier programming and fixup,
* to be included from the codec driver.
*
* The internal speakers are driven by an external smart amplifier whose
* crossover, voicing and protection live in a DSP reached over a vendor
* coef mailbox on NID 0x20. These tables hold the programming captured
* from the Windows driver, reduced to the NID-0x20 traffic this machine
* needs (everything else the HDA parser rebuilds).
*
* Each entry is either a plain codec coef write or a mailbox write:
* strobe == 0: coef[addr] = lo
* strobe != 0: amp[addr] = (hi << 16) | lo, with the bank selected on
* port 0x89 and the write committed by the strobe opcode.
*/
struct alc298_razer_blade16_2025_op {
u16 bank; /* mailbox bank (port 0x89); unused for a plain coef */
u16 addr; /* mailbox register, or plain coef index */
u16 hi; /* mailbox high word; unused for a plain coef */
u16 lo; /* mailbox low word, or plain coef value */
u16 strobe; /* mailbox commit opcode; 0 marks a plain coef write */
};
/* program the external DSP at init; the amp is woken/parked separately */
static const struct alc298_razer_blade16_2025_op alc298_razer_blade16_2025_amp_init[] = {
{ 0x0000, 0xf102, 0x0000, 0x0000, 0xb031 },
{ 0x0000, 0xf103, 0x0000, 0x0000, 0xb031 },
{ 0x0000, 0xc000, 0x0000, 0x0001, 0xb031 },
{ 0x0000, 0xea00, 0x0000, 0x0047, 0xb031 },
{ 0x0000, 0xf20d, 0x0000, 0x0000, 0xb031 },
{ 0x0000, 0xf212, 0x0000, 0x003e, 0xb031 },
{ 0x0000, 0xc001, 0x0000, 0x0002, 0xb031 },
{ 0x0000, 0xc003, 0x0000, 0x0022, 0xb031 },
{ 0x0000, 0xc004, 0x0000, 0x0044, 0xb031 },
{ 0x0000, 0xc005, 0x0000, 0x0044, 0xb031 },
{ 0x0000, 0xc007, 0x0000, 0x0064, 0xb031 },
{ 0x0000, 0xc00e, 0x0000, 0x00e7, 0xb031 },
{ 0x0000, 0xf223, 0x0000, 0x007f, 0xb031 },
{ 0x0000, 0xf224, 0x0000, 0x00db, 0xb031 },
{ 0x0000, 0xf225, 0x0000, 0x00ee, 0xb031 },
{ 0x0000, 0xf226, 0x0000, 0x003f, 0xb031 },
{ 0x0000, 0xf227, 0x0000, 0x000f, 0xb031 },
{ 0x0000, 0xf21a, 0x0000, 0x0078, 0xb031 },
{ 0x0000, 0xf242, 0x0000, 0x003c, 0xb031 },
{ 0x0000, 0xc120, 0x0000, 0x0040, 0xb031 },
{ 0x0000, 0xc125, 0x0000, 0x0003, 0xb031 },
{ 0x0000, 0xc321, 0x0000, 0x000b, 0xb031 },
{ 0x0000, 0xc200, 0x0000, 0x00d8, 0xb031 },
{ 0x0000, 0xc201, 0x0000, 0x0027, 0xb031 },
{ 0x0000, 0xc202, 0x0000, 0x000f, 0xb031 },
{ 0x0000, 0xc400, 0x0000, 0x000e, 0xb031 },
{ 0x0000, 0xc401, 0x0000, 0x0043, 0xb031 },
{ 0x0000, 0xc402, 0x0000, 0x00e0, 0xb031 },
{ 0x0000, 0xc403, 0x0000, 0x0000, 0xb031 },
{ 0x0000, 0xc404, 0x0000, 0x004c, 0xb031 },
{ 0x0000, 0xc406, 0x0000, 0x0040, 0xb031 },
{ 0x0000, 0xc407, 0x0000, 0x0002, 0xb031 },
{ 0x0000, 0xc408, 0x0000, 0x003f, 0xb031 },
{ 0x0000, 0xc300, 0x0000, 0x0001, 0xb031 },
{ 0x0000, 0xc125, 0x0000, 0x0003, 0xb031 },
{ 0x0000, 0xdf00, 0x0000, 0x0010, 0xb031 },
{ 0x0000, 0xdf5f, 0x0000, 0x0001, 0xb031 },
{ 0x0000, 0xdf60, 0x0000, 0x00a7, 0xb031 },
{ 0x0000, 0xc203, 0x0000, 0x0084, 0xb031 },
{ 0x0000, 0xc206, 0x0000, 0x0078, 0xb031 },
{ 0x0000, 0xf10a, 0x0000, 0x000b, 0xb031 },
{ 0x0000, 0xf10b, 0x0000, 0x004c, 0xb031 },
{ 0x0000, 0xf104, 0x0000, 0x00f4, 0xb031 },
{ 0x0000, 0xf105, 0x0000, 0x0003, 0xb031 },
{ 0x0000, 0xf109, 0x0000, 0x00e0, 0xb031 },
{ 0x0000, 0xf10b, 0x0000, 0x005c, 0xb031 },
{ 0x0000, 0xf104, 0x0000, 0x00f4, 0xb031 },
{ 0x0000, 0xf105, 0x0000, 0x0004, 0xb031 },
{ 0x0000, 0xf109, 0x0000, 0x0065, 0xb031 },
{ 0x0000, 0xf10b, 0x0000, 0x005c, 0xb031 },
{ 0x0000, 0xf104, 0x0000, 0x00f7, 0xb031 },
{ 0x0000, 0xf105, 0x0000, 0x0030, 0xb031 },
{ 0x0000, 0xf109, 0x0000, 0x0006, 0xb031 },
{ 0x0000, 0xf10b, 0x0000, 0x005c, 0xb031 },
{ 0x0000, 0xf104, 0x0000, 0x00f7, 0xb031 },
{ 0x0000, 0xf105, 0x0000, 0x0031, 0xb031 },
{ 0x0000, 0xf109, 0x0000, 0x0003, 0xb031 },
{ 0x0000, 0xf10b, 0x0000, 0x005c, 0xb031 },
{ 0x0000, 0xe706, 0x0000, 0x000f, 0xb031 },
{ 0x0000, 0xe707, 0x0000, 0x0030, 0xb031 },
{ 0x0000, 0xe806, 0x0000, 0x000f, 0xb031 },
{ 0x0000, 0xe807, 0x0000, 0x0030, 0xb031 },
{ 0x0000, 0xce04, 0x0000, 0x0002, 0xb031 },
{ 0x0000, 0xce05, 0x0000, 0x00f0, 0xb031 },
{ 0x0000, 0xce06, 0x0000, 0x0031, 0xb031 },
{ 0x0000, 0xce07, 0x0000, 0x00b4, 0xb031 },
{ 0x0000, 0xcf04, 0x0000, 0x0002, 0xb031 },
{ 0x0000, 0xcf05, 0x0000, 0x00f0, 0xb031 },
{ 0x0000, 0xcf06, 0x0000, 0x0031, 0xb031 },
{ 0x0000, 0xcf07, 0x0000, 0x00b4, 0xb031 },
{ 0x0000, 0xce60, 0x0000, 0x00e3, 0xb031 },
{ 0x0000, 0xc130, 0x0000, 0x0051, 0xb031 },
{ 0x0000, 0xe000, 0x0000, 0x00a8, 0xb031 },
{ 0x4100, 0x1888, 0x0000, 0x0000, 0xb031 },
{ 0x0000, 0xc121, 0x0000, 0x000b, 0xb031 },
{ 0x0000, 0xea00, 0x0000, 0x0040, 0xb031 },
{ 0x0000, 0xf800, 0x0000, 0x0020, 0xb031 },
{ 0x0000, 0xca00, 0x0000, 0x0080, 0xb031 },
{ 0x0000, 0xca10, 0x0000, 0x0000, 0xb031 },
{ 0x0000, 0xca02, 0x0000, 0x0078, 0xb031 },
{ 0x0000, 0xca12, 0x0000, 0x0078, 0xb031 },
{ 0x0000, 0xed00, 0x0000, 0x0090, 0xb031 },
{ 0x0000, 0xcc2c, 0x0000, 0x0000, 0xb031 },
{ 0x0000, 0xcc2d, 0x0000, 0x000e, 0xb031 },
{ 0x0000, 0xcc2e, 0x0000, 0x0076, 0xb031 },
{ 0x0000, 0xcc2f, 0x0000, 0x0043, 0xb031 },
{ 0x0000, 0xcd2c, 0x0000, 0x0000, 0xb031 },
{ 0x0000, 0xcd2d, 0x0000, 0x000e, 0xb031 },
{ 0x0000, 0xcd2e, 0x0000, 0x0076, 0xb031 },
{ 0x0000, 0xcd2f, 0x0000, 0x0043, 0xb031 },
{ 0x0000, 0xcc24, 0x0000, 0x0000, 0xb031 },
{ 0x0000, 0xcc25, 0x0000, 0x0051, 0xb031 },
{ 0x0000, 0xcc26, 0x0000, 0x00eb, 0xb031 },
{ 0x0000, 0xcc27, 0x0000, 0x0085, 0xb031 },
{ 0x0000, 0xcd24, 0x0000, 0x0000, 0xb031 },
{ 0x0000, 0xcd25, 0x0000, 0x0051, 0xb031 },
{ 0x0000, 0xcd26, 0x0000, 0x00eb, 0xb031 },
{ 0x0000, 0xcd27, 0x0000, 0x0085, 0xb031 },
{ 0x0000, 0xcc20, 0x0000, 0x0000, 0xb031 },
{ 0x0000, 0xcc21, 0x0000, 0x0000, 0xb031 },
{ 0x0000, 0xcc22, 0x0000, 0x0043, 0xb031 },
{ 0x0000, 0xcd20, 0x0000, 0x0000, 0xb031 },
{ 0x0000, 0xcd21, 0x0000, 0x0000, 0xb031 },
{ 0x0000, 0xcd22, 0x0000, 0x0043, 0xb031 },
{ 0x0000, 0xcc16, 0x0000, 0x000f, 0xb031 },
{ 0x0000, 0xcc17, 0x0000, 0x0000, 0xb031 },
{ 0x0000, 0xcd16, 0x0000, 0x000f, 0xb031 },
{ 0x0000, 0xcd17, 0x0000, 0x0000, 0xb031 },
{ 0x0000, 0xcc29, 0x0000, 0x005d, 0xb031 },
{ 0x0000, 0xcc2a, 0x0000, 0x00c0, 0xb031 },
{ 0x0000, 0xcd29, 0x0000, 0x005d, 0xb031 },
{ 0x0000, 0xcd2a, 0x0000, 0x00c0, 0xb031 },
{ 0x0000, 0xcc31, 0x0000, 0x0020, 0xb031 },
{ 0x0000, 0xcc32, 0x0000, 0x0000, 0xb031 },
{ 0x0000, 0xcc33, 0x0000, 0x0000, 0xb031 },
{ 0x0000, 0xcc34, 0x0000, 0x0000, 0xb031 },
{ 0x0000, 0xcd31, 0x0000, 0x0020, 0xb031 },
{ 0x0000, 0xcd32, 0x0000, 0x0000, 0xb031 },
{ 0x0000, 0xcd33, 0x0000, 0x0000, 0xb031 },
{ 0x0000, 0xcd34, 0x0000, 0x0000, 0xb031 },
{ 0x0000, 0xcc36, 0x0000, 0x0079, 0xb031 },
{ 0x0000, 0xcc37, 0x0000, 0x0099, 0xb031 },
{ 0x0000, 0xcc38, 0x0000, 0x0099, 0xb031 },
{ 0x0000, 0xcc39, 0x0000, 0x0099, 0xb031 },
{ 0x0000, 0xcd36, 0x0000, 0x0079, 0xb031 },
{ 0x0000, 0xcd37, 0x0000, 0x0099, 0xb031 },
{ 0x0000, 0xcd38, 0x0000, 0x0099, 0xb031 },
{ 0x0000, 0xcd39, 0x0000, 0x0099, 0xb031 },
{ 0x0000, 0xcc09, 0x0000, 0x0000, 0xb031 },
{ 0x0000, 0xcc0a, 0x0000, 0x000a, 0xb031 },
{ 0x0000, 0xcc0b, 0x0000, 0x007c, 0xb031 },
{ 0x0000, 0xcc0c, 0x0000, 0x005b, 0xb031 },
{ 0x0000, 0xcd09, 0x0000, 0x0000, 0xb031 },
{ 0x0000, 0xcd0a, 0x0000, 0x000a, 0xb031 },
{ 0x0000, 0xcd0b, 0x0000, 0x007c, 0xb031 },
{ 0x0000, 0xcd0c, 0x0000, 0x005b, 0xb031 },
{ 0x0000, 0xcc0e, 0x0000, 0x0000, 0xb031 },
{ 0x0000, 0xcc0f, 0x0000, 0x0005, 0xb031 },
{ 0x0000, 0xcc10, 0x0000, 0x003e, 0xb031 },
{ 0x0000, 0xcc11, 0x0000, 0x002d, 0xb031 },
{ 0x0000, 0xcd0e, 0x0000, 0x0000, 0xb031 },
{ 0x0000, 0xcd0f, 0x0000, 0x0005, 0xb031 },
{ 0x0000, 0xcd10, 0x0000, 0x003e, 0xb031 },
{ 0x0000, 0xcd11, 0x0000, 0x002d, 0xb031 },
{ 0x0000, 0xccd6, 0x0000, 0x0000, 0xb031 },
{ 0x0000, 0xccd7, 0x0000, 0x0003, 0xb031 },
{ 0x0000, 0xcdd6, 0x0000, 0x0000, 0xb031 },
{ 0x0000, 0xcdd7, 0x0000, 0x0003, 0xb031 },
{ 0x0000, 0xccd8, 0x0000, 0x0000, 0xb031 },
{ 0x0000, 0xccd9, 0x0000, 0x0003, 0xb031 },
{ 0x0000, 0xcdd8, 0x0000, 0x0000, 0xb031 },
{ 0x0000, 0xcdd9, 0x0000, 0x0003, 0xb031 },
{ 0x0000, 0xccda, 0x0000, 0x0000, 0xb031 },
{ 0x0000, 0xccdb, 0x0000, 0x0003, 0xb031 },
{ 0x0000, 0xcdda, 0x0000, 0x0000, 0xb031 },
{ 0x0000, 0xcddb, 0x0000, 0x0003, 0xb031 },
{ 0x0000, 0xc320, 0x0000, 0x0020, 0xb031 },
{ 0x0000, 0xc321, 0x0000, 0x000a, 0xb031 },
{ 0x0000, 0xe604, 0x0000, 0x0000, 0xb031 },
{ 0x0000, 0xdb00, 0x0000, 0x000c, 0xb031 },
{ 0x0000, 0xdd00, 0x0000, 0x000c, 0xb031 },
{ 0x0000, 0xdc19, 0x0000, 0x0000, 0xb031 },
{ 0x0000, 0xdc1a, 0x0000, 0x006a, 0xb031 },
{ 0x0000, 0xdc1b, 0x0000, 0x00aa, 0xb031 },
{ 0x0000, 0xdc1c, 0x0000, 0x00ab, 0xb031 },
{ 0x0000, 0xdc1d, 0x0000, 0x0000, 0xb031 },
{ 0x0000, 0xdc1e, 0x0000, 0x0027, 0xb031 },
{ 0x0000, 0xdc1f, 0x0000, 0x0062, 0xb031 },
{ 0x0000, 0xdc20, 0x0000, 0x0076, 0xb031 },
{ 0x0000, 0xde19, 0x0000, 0x0000, 0xb031 },
{ 0x0000, 0xde1a, 0x0000, 0x006a, 0xb031 },
{ 0x0000, 0xde1b, 0x0000, 0x00aa, 0xb031 },
{ 0x0000, 0xde1c, 0x0000, 0x00ab, 0xb031 },
{ 0x0000, 0xde1d, 0x0000, 0x0000, 0xb031 },
{ 0x0000, 0xde1e, 0x0000, 0x0027, 0xb031 },
{ 0x0000, 0xde1f, 0x0000, 0x0062, 0xb031 },
{ 0x0000, 0xde20, 0x0000, 0x0076, 0xb031 },
{ 0x0000, 0xdb32, 0x0000, 0x0000, 0xb031 },
{ 0x0000, 0xdd32, 0x0000, 0x0000, 0xb031 },
{ 0x0000, 0xdb33, 0x0000, 0x000a, 0xb031 },
{ 0x0000, 0xdd33, 0x0000, 0x000a, 0xb031 },
{ 0x0000, 0xdb34, 0x0000, 0x001a, 0xb031 },
{ 0x0000, 0xdd34, 0x0000, 0x001a, 0xb031 },
{ 0x0000, 0xdb15, 0x0000, 0x00ef, 0xb031 },
{ 0x0000, 0xdd15, 0x0000, 0x00ef, 0xb031 },
{ 0x0000, 0xdb17, 0x0000, 0x003f, 0xb031 },
{ 0x0000, 0xdd17, 0x0000, 0x003f, 0xb031 },
{ 0x0000, 0xdb94, 0x0000, 0x0070, 0xb031 },
{ 0x0000, 0xdd94, 0x0000, 0x0070, 0xb031 },
{ 0x0000, 0xdb19, 0x0000, 0x0040, 0xb031 },
{ 0x0000, 0xdd19, 0x0000, 0x0040, 0xb031 },
{ 0x0000, 0xc203, 0x0000, 0x001c, 0xb031 },
{ 0x0000, 0xdb00, 0x0000, 0x004c, 0xb031 },
{ 0x0000, 0xdb04, 0x0000, 0x0005, 0xb031 },
{ 0x0000, 0xdb05, 0x0000, 0x0003, 0xb031 },
{ 0x0000, 0xdd04, 0x0000, 0x0005, 0xb031 },
{ 0x0000, 0xdd05, 0x0000, 0x0003, 0xb031 },
{ 0x0000, 0xdbbb, 0x0000, 0x0009, 0xb031 },
{ 0x0000, 0xdbbc, 0x0000, 0x004c, 0xb031 },
{ 0x0000, 0xdbbd, 0x0000, 0x00f3, 0xb031 },
{ 0x0000, 0xdbbe, 0x0000, 0x00cf, 0xb031 },
{ 0x0000, 0xddbb, 0x0000, 0x0009, 0xb031 },
{ 0x0000, 0xddbc, 0x0000, 0x004c, 0xb031 },
{ 0x0000, 0xddbd, 0x0000, 0x00f3, 0xb031 },
{ 0x0000, 0xddbe, 0x0000, 0x00cf, 0xb031 },
{ 0x0000, 0xdb01, 0x0000, 0x0079, 0xb031 },
{ 0x0000, 0xdd01, 0x0000, 0x0079, 0xb031 },
{ 0x0000, 0xdb08, 0x0000, 0x0040, 0xb031 },
{ 0x0000, 0xdd08, 0x0000, 0x0040, 0xb031 },
{ 0x0000, 0xdc52, 0x0000, 0x00ef, 0xb031 },
{ 0x0000, 0xde52, 0x0000, 0x00ef, 0xb031 },
{ 0x0000, 0xdb00, 0x0000, 0x00cc, 0xb031 },
{ 0x0000, 0xc203, 0x0000, 0x009c, 0xb031 },
{ 0x0000, 0xdf0a, 0x0000, 0x0000, 0xb031 },
{ 0x0000, 0xdf0b, 0x0000, 0x007f, 0xb031 },
{ 0x0000, 0xc851, 0x0000, 0x0080, 0xb031 },
{ 0x0000, 0xc951, 0x0000, 0x0080, 0xb031 },
{ 0x0000, 0xdf01, 0x0000, 0x0073, 0xb031 },
{ 0x0000, 0xc203, 0x0000, 0x009c, 0xb031 },
{ 0x0000, 0xf800, 0x0000, 0x0020, 0xb031 },
{ 0x0000, 0xebcb, 0x0000, 0x0080, 0xb031 },
{ 0x0000, 0xeb10, 0x0000, 0x00f0, 0xb031 },
{ 0x0000, 0xeb11, 0x0000, 0x00bb, 0xb031 },
{ 0x0000, 0xeb12, 0x0000, 0x00ab, 0xb031 },
{ 0x0000, 0xeb13, 0x0000, 0x0030, 0xb031 },
{ 0x0000, 0xeb14, 0x0000, 0x0007, 0xb031 },
{ 0x0000, 0xeb15, 0x0000, 0x004c, 0xb031 },
{ 0x0000, 0xeb16, 0x0000, 0x0069, 0xb031 },
{ 0x0000, 0xeb21, 0x0000, 0x0011, 0xb031 },
{ 0x0000, 0xeb22, 0x0000, 0x00c2, 0xb031 },
{ 0x0000, 0xeb23, 0x0000, 0x0080, 0xb031 },
{ 0x0000, 0xeb24, 0x0000, 0x00f0, 0xb031 },
{ 0x0000, 0xeb25, 0x0000, 0x00bd, 0xb031 },
{ 0x0000, 0xeb26, 0x0000, 0x0055, 0xb031 },
{ 0x0000, 0xeb27, 0x0000, 0x00d0, 0xb031 },
{ 0x0000, 0xeb28, 0x0000, 0x0007, 0xb031 },
{ 0x0000, 0xeb29, 0x0000, 0x003c, 0xb031 },
{ 0x0000, 0xeb2a, 0x0000, 0x0051, 0xb031 },
{ 0x0000, 0xeb2b, 0x0000, 0x0018, 0xb031 },
{ 0x0000, 0xeb30, 0x0000, 0x00f0, 0xb031 },
{ 0x0000, 0xeb31, 0x0000, 0x004f, 0xb031 },
{ 0x0000, 0xeb32, 0x0000, 0x004a, 0xb031 },
{ 0x0000, 0xeb33, 0x0000, 0x0040, 0xb031 },
{ 0x0000, 0xeb34, 0x0000, 0x0007, 0xb031 },
{ 0x0000, 0xeb35, 0x0000, 0x00bb, 0xb031 },
{ 0x0000, 0xeb36, 0x0000, 0x0024, 0xb031 },
{ 0x0000, 0xeb37, 0x0000, 0x0068, 0xb031 },
{ 0x0000, 0xeb40, 0x0000, 0x0007, 0xb031 },
{ 0x0000, 0xeb41, 0x0000, 0x00f5, 0xb031 },
{ 0x0000, 0xeb42, 0x0000, 0x00f1, 0xb031 },
{ 0x0000, 0xeb43, 0x0000, 0x00e8, 0xb031 },
{ 0x0000, 0xeb44, 0x0000, 0x00f0, 0xb031 },
{ 0x0000, 0xeb45, 0x0000, 0x004f, 0xb031 },
{ 0x0000, 0xeb46, 0x0000, 0x004a, 0xb031 },
{ 0x0000, 0xeb47, 0x0000, 0x0040, 0xb031 },
{ 0x0000, 0xeb48, 0x0000, 0x0007, 0xb031 },
{ 0x0000, 0xeb49, 0x0000, 0x00c5, 0xb031 },
{ 0x0000, 0xeb4a, 0x0000, 0x0032, 0xb031 },
{ 0x0000, 0xeb4b, 0x0000, 0x0080, 0xb031 },
{ 0x0000, 0xeb50, 0x0000, 0x00f0, 0xb031 },
{ 0x0000, 0xeb51, 0x0000, 0x008a, 0xb031 },
{ 0x0000, 0xeb52, 0x0000, 0x00b4, 0xb031 },
{ 0x0000, 0xeb53, 0x0000, 0x0040, 0xb031 },
{ 0x0000, 0xeb54, 0x0000, 0x0007, 0xb031 },
{ 0x0000, 0xeb55, 0x0000, 0x007d, 0xb031 },
{ 0x0000, 0xeb56, 0x0000, 0x00d9, 0xb031 },
{ 0x0000, 0xeb57, 0x0000, 0x0008, 0xb031 },
{ 0x0000, 0xeb60, 0x0000, 0x0002, 0xb031 },
{ 0x0000, 0xeb61, 0x0000, 0x00e7, 0xb031 },
{ 0x0000, 0xeb62, 0x0000, 0x00b5, 0xb031 },
{ 0x0000, 0xeb63, 0x0000, 0x00f0, 0xb031 },
{ 0x0000, 0xeb64, 0x0000, 0x00fa, 0xb031 },
{ 0x0000, 0xeb65, 0x0000, 0x0086, 0xb031 },
{ 0x0000, 0xeb66, 0x0000, 0x00a8, 0xb031 },
{ 0x0000, 0xeb67, 0x0000, 0x0040, 0xb031 },
{ 0x0000, 0xeb68, 0x0000, 0x0002, 0xb031 },
{ 0x0000, 0xeb69, 0x0000, 0x009a, 0xb031 },
{ 0x0000, 0xeb6a, 0x0000, 0x002f, 0xb031 },
{ 0x0000, 0xeb6b, 0x0000, 0x0018, 0xb031 },
{ 0x0000, 0xebb6, 0x0000, 0x000c, 0xb031 },
{ 0x0000, 0xeb70, 0x0000, 0x00f5, 0xb031 },
{ 0x0000, 0xeb71, 0x0000, 0x00e1, 0xb031 },
{ 0x0000, 0xeb72, 0x0000, 0x0009, 0xb031 },
{ 0x0000, 0xeb73, 0x0000, 0x00d0, 0xb031 },
{ 0x0000, 0xeb74, 0x0000, 0x0006, 0xb031 },
{ 0x0000, 0xeb75, 0x0000, 0x0050, 0xb031 },
{ 0x0000, 0xeb76, 0x0000, 0x002c, 0xb031 },
{ 0x0000, 0xeb77, 0x0000, 0x0050, 0xb031 },
{ 0x0000, 0xeb80, 0x0000, 0x0007, 0xb031 },
{ 0x0000, 0xeb81, 0x0000, 0x0028, 0xb031 },
{ 0x0000, 0xeb82, 0x0000, 0x0016, 0xb031 },
{ 0x0000, 0xeb83, 0x0000, 0x0028, 0xb031 },
{ 0x0000, 0xeb84, 0x0000, 0x00f5, 0xb031 },
{ 0x0000, 0xeb85, 0x0000, 0x00e1, 0xb031 },
{ 0x0000, 0xeb86, 0x0000, 0x0009, 0xb031 },
{ 0x0000, 0xeb87, 0x0000, 0x00d0, 0xb031 },
{ 0x0000, 0xeb88, 0x0000, 0x0007, 0xb031 },
{ 0x0000, 0xeb89, 0x0000, 0x0028, 0xb031 },
{ 0x0000, 0xeb8a, 0x0000, 0x0016, 0xb031 },
{ 0x0000, 0xeb8b, 0x0000, 0x0028, 0xb031 },
{ 0x0000, 0xebb8, 0x0000, 0x000c, 0xb031 },
{ 0x0000, 0xeb90, 0x0000, 0x00fc, 0xb031 },
{ 0x0000, 0xeb91, 0x0000, 0x008b, 0xb031 },
{ 0x0000, 0xeb92, 0x0000, 0x00bd, 0xb031 },
{ 0x0000, 0xeb93, 0x0000, 0x0064, 0xb031 },
{ 0x0000, 0xeb94, 0x0000, 0x0001, 0xb031 },
{ 0x0000, 0xeb95, 0x0000, 0x0099, 0xb031 },
{ 0x0000, 0xeb96, 0x0000, 0x00e7, 0xb031 },
{ 0x0000, 0xeb97, 0x0000, 0x0094, 0xb031 },
{ 0x0000, 0xeba0, 0x0000, 0x000c, 0xb031 },
{ 0x0000, 0xeba1, 0x0000, 0x0091, 0xb031 },
{ 0x0000, 0xeba2, 0x0000, 0x0078, 0xb031 },
{ 0x0000, 0xeba3, 0x0000, 0x0080, 0xb031 },
{ 0x0000, 0xeba4, 0x0000, 0x00f6, 0xb031 },
{ 0x0000, 0xeba5, 0x0000, 0x000c, 0xb031 },
{ 0x0000, 0xeba6, 0x0000, 0x0093, 0xb031 },
{ 0x0000, 0xeba7, 0x0000, 0x0010, 0xb031 },
{ 0x0000, 0xeba8, 0x0000, 0x0003, 0xb031 },
{ 0x0000, 0xeba9, 0x0000, 0x0087, 0xb031 },
{ 0x0000, 0xebaa, 0x0000, 0x0099, 0xb031 },
{ 0x0000, 0xebab, 0x0000, 0x006c, 0xb031 },
{ 0x0000, 0xebc3, 0x0000, 0x00ff, 0xb031 },
{ 0x0000, 0xebc4, 0x0000, 0x00fc, 0xb031 },
{ 0x0000, 0xeb00, 0x0000, 0x0005, 0xb031 },
{ 0x0000, 0xeb01, 0x0000, 0x00a9, 0xb031 },
{ 0x0000, 0xeb02, 0x0000, 0x00df, 0xb031 },
{ 0x0000, 0xeb03, 0x0000, 0x007b, 0xb031 },
{ 0x0000, 0xeb05, 0x0000, 0x0079, 0xb031 },
{ 0x0000, 0xeb06, 0x0000, 0x005a, 0xb031 },
{ 0x0000, 0xeb07, 0x0000, 0x0004, 0xb031 },
{ 0x0000, 0xebc0, 0x0000, 0x00e3, 0xb031 },
{ 0x0000, 0xd0cb, 0x0000, 0x0080, 0xb031 },
{ 0x0000, 0xd0b0, 0x0000, 0x000c, 0xb031 },
{ 0x0000, 0xd010, 0x0000, 0x00f0, 0xb031 },
{ 0x0000, 0xd011, 0x0000, 0x0009, 0xb031 },
{ 0x0000, 0xd012, 0x0000, 0x0092, 0xb031 },
{ 0x0000, 0xd013, 0x0000, 0x00f0, 0xb031 },
{ 0x0000, 0xd014, 0x0000, 0x0007, 0xb031 },
{ 0x0000, 0xd015, 0x0000, 0x00f6, 0xb031 },
{ 0x0000, 0xd016, 0x0000, 0x0072, 0xb031 },
{ 0x0000, 0xd017, 0x0000, 0x00b0, 0xb031 },
{ 0x0000, 0xd020, 0x0000, 0x0007, 0xb031 },
{ 0x0000, 0xd021, 0x0000, 0x00fb, 0xb031 },
{ 0x0000, 0xd022, 0x0000, 0x0037, 0xb031 },
{ 0x0000, 0xd023, 0x0000, 0x00f0, 0xb031 },
{ 0x0000, 0xd024, 0x0000, 0x00f0, 0xb031 },
{ 0x0000, 0xd025, 0x0000, 0x0009, 0xb031 },
{ 0x0000, 0xd026, 0x0000, 0x0090, 0xb031 },
{ 0x0000, 0xd027, 0x0000, 0x0020, 0xb031 },
{ 0x0000, 0xd028, 0x0000, 0x0007, 0xb031 },
{ 0x0000, 0xd029, 0x0000, 0x00fb, 0xb031 },
{ 0x0000, 0xd02a, 0x0000, 0x0037, 0xb031 },
{ 0x0000, 0xd02b, 0x0000, 0x00f0, 0xb031 },
{ 0x0000, 0xd0c3, 0x0000, 0x00f0, 0xb031 },
{ 0x0000, 0xd0c4, 0x0000, 0x000c, 0xb031 },
{ 0x0000, 0xd0c0, 0x0000, 0x00e3, 0xb031 },
{ 0x0000, 0xce6a, 0x0000, 0x0080, 0xb031 },
{ 0x0000, 0xce63, 0x0000, 0x00f0, 0xb031 },
{ 0x0000, 0xce64, 0x0000, 0x0000, 0xb031 },
{ 0x0000, 0xce60, 0x0000, 0x00e3, 0xb031 },
{ 0x0000, 0xdb00, 0x0000, 0x00cc, 0xb031 },
{ 0x0000, 0xdb04, 0x0000, 0x0008, 0xb031 },
{ 0x0000, 0xdb05, 0x0000, 0x0006, 0xb031 },
{ 0x0000, 0xcc00, 0x0000, 0x00c1, 0xb031 },
{ 0x0000, 0xca02, 0x0000, 0x000f, 0xb031 },
{ 0x0000, 0xca00, 0x0000, 0x0000, 0xb031 },
{ 0x0000, 0xca62, 0x0000, 0x0077, 0xb031 },
{ 0x0000, 0xca65, 0x0000, 0x0082, 0xb031 },
{ 0x0000, 0xca68, 0x0000, 0x00c2, 0xb031 },
{ 0x0000, 0xca75, 0x0000, 0x003a, 0xb031 },
{ 0x0000, 0xca7b, 0x0000, 0x006f, 0xb031 },
{ 0x0000, 0xca00, 0x0000, 0x0080, 0xb031 },
{ 0x0000, 0xca02, 0x0000, 0x0078, 0xb031 },
{ 0x0000, 0xc860, 0x0000, 0x0078, 0xb031 },
{ 0x0000, 0xc861, 0x0000, 0x00e5, 0xb031 },
{ 0x0000, 0xc862, 0x0000, 0x00eb, 0xb031 },
{ 0x0000, 0xc863, 0x0000, 0x00c6, 0xb031 },
{ 0x0000, 0xc864, 0x0000, 0x00ba, 0xb031 },
{ 0x0000, 0xc865, 0x0000, 0x0061, 0xb031 },
{ 0x0000, 0xc867, 0x0000, 0x0017, 0xb031 },
{ 0x0000, 0xc868, 0x0000, 0x00ed, 0xb031 },
{ 0x0000, 0xc869, 0x0000, 0x003c, 0xb031 },
{ 0x0000, 0xc86a, 0x0000, 0x008a, 0xb031 },
{ 0x0000, 0xc86b, 0x0000, 0x00e2, 0xb031 },
{ 0x0000, 0xc875, 0x0000, 0x003a, 0xb031 },
{ 0x0000, 0xc87b, 0x0000, 0x006f, 0xb031 },
{ 0x0000, 0xc836, 0x0000, 0x00f9, 0xb031 },
{ 0x0000, 0xc8a0, 0x0000, 0x00f1, 0xb031 },
{ 0x0000, 0xc833, 0x0000, 0x000b, 0xb031 },
{ 0x0000, 0xc834, 0x0000, 0x0002, 0xb031 },
{ 0x0000, 0xc83f, 0x0000, 0x0014, 0xb031 },
{ 0x0000, 0xc83e, 0x0000, 0x0094, 0xb031 },
{ 0x0000, 0xc83a, 0x0000, 0x0076, 0xb031 },
{ 0x0000, 0xc83b, 0x0000, 0x0089, 0xb031 },
{ 0x0000, 0xc830, 0x0000, 0x0013, 0xb031 },
{ 0x0000, 0xc826, 0x0000, 0x00d1, 0xb031 },
{ 0x0000, 0xc890, 0x0000, 0x00f1, 0xb031 },
{ 0x0000, 0xc823, 0x0000, 0x0010, 0xb031 },
{ 0x0000, 0xc824, 0x0000, 0x0004, 0xb031 },
{ 0x0000, 0xc82f, 0x0000, 0x0018, 0xb031 },
{ 0x0000, 0xc82e, 0x0000, 0x0094, 0xb031 },
{ 0x0000, 0xc820, 0x0000, 0x0008, 0xb031 },
{ 0x0000, 0xc816, 0x0000, 0x00f9, 0xb031 },
{ 0x0000, 0xc880, 0x0000, 0x00e1, 0xb031 },
{ 0x0000, 0xc813, 0x0000, 0x0000, 0xb031 },
{ 0x0000, 0xc814, 0x0000, 0x0001, 0xb031 },
{ 0x0000, 0xc81f, 0x0000, 0x0014, 0xb031 },
{ 0x0000, 0xc81e, 0x0000, 0x0094, 0xb031 },
{ 0x0000, 0xc81a, 0x0000, 0x0066, 0xb031 },
{ 0x0000, 0xc81b, 0x0000, 0x0078, 0xb031 },
{ 0x0000, 0xc810, 0x0000, 0x000d, 0xb031 },
{ 0x0000, 0xc846, 0x0000, 0x00f9, 0xb031 },
{ 0x0000, 0xc8d0, 0x0000, 0x00f1, 0xb031 },
{ 0x0000, 0xc844, 0x0000, 0x0001, 0xb031 },
{ 0x0000, 0xc84f, 0x0000, 0x0014, 0xb031 },
{ 0x0000, 0xc84e, 0x0000, 0x0094, 0xb031 },
{ 0x0000, 0xc84a, 0x0000, 0x0026, 0xb031 },
{ 0x0000, 0xc84b, 0x0000, 0x0056, 0xb031 },
{ 0x0000, 0xc800, 0x0000, 0x00b0, 0xb031 },
{ 0x0000, 0xc851, 0x0000, 0x0080, 0xb031 },
{ 0x0000, 0xc500, 0x0000, 0x00f0, 0xb031 },
{ 0x0000, 0xc501, 0x0000, 0x0026, 0xb031 },
{ 0x0000, 0xc502, 0x0000, 0x004a, 0xb031 },
{ 0x0000, 0xc503, 0x0000, 0x0010, 0xb031 },
{ 0x0000, 0xc504, 0x0000, 0x0007, 0xb031 },
{ 0x0000, 0xc505, 0x0000, 0x00da, 0xb031 },
{ 0x0000, 0xc506, 0x0000, 0x000e, 0xb031 },
{ 0x0000, 0xc507, 0x0000, 0x00f0, 0xb031 },
{ 0x0000, 0xc510, 0x0000, 0x0007, 0xb031 },
{ 0x0000, 0xc511, 0x0000, 0x00da, 0xb031 },
{ 0x0000, 0xc512, 0x0000, 0x000e, 0xb031 },
{ 0x0000, 0xc513, 0x0000, 0x00f0, 0xb031 },
{ 0x0000, 0xc514, 0x0000, 0x00f0, 0xb031 },
{ 0x0000, 0xc515, 0x0000, 0x0026, 0xb031 },
{ 0x0000, 0xc516, 0x0000, 0x004a, 0xb031 },
{ 0x0000, 0xc517, 0x0000, 0x0010, 0xb031 },
{ 0x0000, 0xc518, 0x0000, 0x0008, 0xb031 },
{ 0x0000, 0xc541, 0x0000, 0x0030, 0xb031 },
{ 0x0000, 0xd250, 0x0000, 0x0087, 0xb031 },
{ 0x0000, 0xd251, 0x0000, 0x0030, 0xb031 },
{ 0x0000, 0xd264, 0x0000, 0x00c0, 0xb031 },
{ 0x0000, 0xc203, 0x0000, 0x009c, 0xb031 },
{ 0x0000, 0xf800, 0x0000, 0x0020, 0xb031 },
{ 0x0000, 0xecb0, 0x0000, 0x0008, 0xb031 },
{ 0x0000, 0xec10, 0x0000, 0x00f0, 0xb031 },
{ 0x0000, 0xec11, 0x0000, 0x00bb, 0xb031 },
{ 0x0000, 0xec12, 0x0000, 0x00ab, 0xb031 },
{ 0x0000, 0xec13, 0x0000, 0x0030, 0xb031 },
{ 0x0000, 0xec14, 0x0000, 0x0007, 0xb031 },
{ 0x0000, 0xec15, 0x0000, 0x004c, 0xb031 },
{ 0x0000, 0xec16, 0x0000, 0x0069, 0xb031 },
{ 0x0000, 0xec21, 0x0000, 0x0011, 0xb031 },
{ 0x0000, 0xec22, 0x0000, 0x00c2, 0xb031 },
{ 0x0000, 0xec23, 0x0000, 0x0080, 0xb031 },
{ 0x0000, 0xec24, 0x0000, 0x00f0, 0xb031 },
{ 0x0000, 0xec25, 0x0000, 0x00bd, 0xb031 },
{ 0x0000, 0xec26, 0x0000, 0x0055, 0xb031 },
{ 0x0000, 0xec27, 0x0000, 0x00d0, 0xb031 },
{ 0x0000, 0xec28, 0x0000, 0x0007, 0xb031 },
{ 0x0000, 0xec29, 0x0000, 0x003c, 0xb031 },
{ 0x0000, 0xec2a, 0x0000, 0x0051, 0xb031 },
{ 0x0000, 0xec2b, 0x0000, 0x0018, 0xb031 },
{ 0x0000, 0xecb2, 0x0000, 0x0008, 0xb031 },
{ 0x0000, 0xec30, 0x0000, 0x00f0, 0xb031 },
{ 0x0000, 0xec31, 0x0000, 0x004f, 0xb031 },
{ 0x0000, 0xec32, 0x0000, 0x004a, 0xb031 },
{ 0x0000, 0xec33, 0x0000, 0x0040, 0xb031 },
{ 0x0000, 0xec34, 0x0000, 0x0007, 0xb031 },
{ 0x0000, 0xec35, 0x0000, 0x00bb, 0xb031 },
{ 0x0000, 0xec36, 0x0000, 0x0024, 0xb031 },
{ 0x0000, 0xec37, 0x0000, 0x0068, 0xb031 },
{ 0x0000, 0xec40, 0x0000, 0x0007, 0xb031 },
{ 0x0000, 0xec41, 0x0000, 0x00f5, 0xb031 },
{ 0x0000, 0xec42, 0x0000, 0x00f1, 0xb031 },
{ 0x0000, 0xec43, 0x0000, 0x00e8, 0xb031 },
{ 0x0000, 0xec44, 0x0000, 0x00f0, 0xb031 },
{ 0x0000, 0xec45, 0x0000, 0x004f, 0xb031 },
{ 0x0000, 0xec46, 0x0000, 0x004a, 0xb031 },
{ 0x0000, 0xec47, 0x0000, 0x0040, 0xb031 },
{ 0x0000, 0xec48, 0x0000, 0x0007, 0xb031 },
{ 0x0000, 0xec49, 0x0000, 0x00c5, 0xb031 },
{ 0x0000, 0xec4a, 0x0000, 0x0032, 0xb031 },
{ 0x0000, 0xec4b, 0x0000, 0x0080, 0xb031 },
{ 0x0000, 0xecb4, 0x0000, 0x0008, 0xb031 },
{ 0x0000, 0xec50, 0x0000, 0x00f0, 0xb031 },
{ 0x0000, 0xec51, 0x0000, 0x008a, 0xb031 },
{ 0x0000, 0xec52, 0x0000, 0x00b4, 0xb031 },
{ 0x0000, 0xec53, 0x0000, 0x0040, 0xb031 },
{ 0x0000, 0xec54, 0x0000, 0x0007, 0xb031 },
{ 0x0000, 0xec55, 0x0000, 0x007d, 0xb031 },
{ 0x0000, 0xec56, 0x0000, 0x00d9, 0xb031 },
{ 0x0000, 0xec57, 0x0000, 0x0008, 0xb031 },
{ 0x0000, 0xec60, 0x0000, 0x0002, 0xb031 },
{ 0x0000, 0xec61, 0x0000, 0x00e7, 0xb031 },
{ 0x0000, 0xec62, 0x0000, 0x00b5, 0xb031 },
{ 0x0000, 0xec63, 0x0000, 0x00f0, 0xb031 },
{ 0x0000, 0xec64, 0x0000, 0x00fa, 0xb031 },
{ 0x0000, 0xec65, 0x0000, 0x0086, 0xb031 },
{ 0x0000, 0xec66, 0x0000, 0x00a8, 0xb031 },
{ 0x0000, 0xec67, 0x0000, 0x0040, 0xb031 },
{ 0x0000, 0xec68, 0x0000, 0x0002, 0xb031 },
{ 0x0000, 0xec69, 0x0000, 0x009a, 0xb031 },
{ 0x0000, 0xec6a, 0x0000, 0x002f, 0xb031 },
{ 0x0000, 0xec6b, 0x0000, 0x0018, 0xb031 },
{ 0x0000, 0xecb6, 0x0000, 0x000c, 0xb031 },
{ 0x0000, 0xec70, 0x0000, 0x00f5, 0xb031 },
{ 0x0000, 0xec71, 0x0000, 0x00e1, 0xb031 },
{ 0x0000, 0xec72, 0x0000, 0x0009, 0xb031 },
{ 0x0000, 0xec73, 0x0000, 0x00d0, 0xb031 },
{ 0x0000, 0xec74, 0x0000, 0x0006, 0xb031 },
{ 0x0000, 0xec75, 0x0000, 0x0050, 0xb031 },
{ 0x0000, 0xec76, 0x0000, 0x002c, 0xb031 },
{ 0x0000, 0xec77, 0x0000, 0x0050, 0xb031 },
{ 0x0000, 0xec80, 0x0000, 0x0007, 0xb031 },
{ 0x0000, 0xec81, 0x0000, 0x0028, 0xb031 },
{ 0x0000, 0xec82, 0x0000, 0x0016, 0xb031 },
{ 0x0000, 0xec83, 0x0000, 0x0028, 0xb031 },
{ 0x0000, 0xec84, 0x0000, 0x00f5, 0xb031 },
{ 0x0000, 0xec85, 0x0000, 0x00e1, 0xb031 },
{ 0x0000, 0xec86, 0x0000, 0x0009, 0xb031 },
{ 0x0000, 0xec87, 0x0000, 0x00d0, 0xb031 },
{ 0x0000, 0xec88, 0x0000, 0x0007, 0xb031 },
{ 0x0000, 0xec89, 0x0000, 0x0028, 0xb031 },
{ 0x0000, 0xec8a, 0x0000, 0x0016, 0xb031 },
{ 0x0000, 0xec8b, 0x0000, 0x0028, 0xb031 },
{ 0x0000, 0xecb8, 0x0000, 0x000c, 0xb031 },
{ 0x0000, 0xec90, 0x0000, 0x00fc, 0xb031 },
{ 0x0000, 0xec91, 0x0000, 0x008b, 0xb031 },
{ 0x0000, 0xec92, 0x0000, 0x00bd, 0xb031 },
{ 0x0000, 0xec93, 0x0000, 0x0064, 0xb031 },
{ 0x0000, 0xec94, 0x0000, 0x0001, 0xb031 },
{ 0x0000, 0xec95, 0x0000, 0x0099, 0xb031 },
{ 0x0000, 0xec96, 0x0000, 0x00e7, 0xb031 },
{ 0x0000, 0xec97, 0x0000, 0x0094, 0xb031 },
{ 0x0000, 0xeca0, 0x0000, 0x000c, 0xb031 },
{ 0x0000, 0xeca1, 0x0000, 0x0091, 0xb031 },
{ 0x0000, 0xeca2, 0x0000, 0x0078, 0xb031 },
{ 0x0000, 0xeca3, 0x0000, 0x0080, 0xb031 },
{ 0x0000, 0xeca4, 0x0000, 0x00f6, 0xb031 },
{ 0x0000, 0xeca5, 0x0000, 0x000c, 0xb031 },
{ 0x0000, 0xeca6, 0x0000, 0x0093, 0xb031 },
{ 0x0000, 0xeca7, 0x0000, 0x0010, 0xb031 },
{ 0x0000, 0xeca8, 0x0000, 0x0003, 0xb031 },
{ 0x0000, 0xeca9, 0x0000, 0x0087, 0xb031 },
{ 0x0000, 0xecaa, 0x0000, 0x0099, 0xb031 },
{ 0x0000, 0xecab, 0x0000, 0x006c, 0xb031 },
{ 0x0000, 0xebc3, 0x0000, 0x00ff, 0xb031 },
{ 0x0000, 0xebc4, 0x0000, 0x00fc, 0xb031 },
{ 0x0000, 0xec00, 0x0000, 0x0005, 0xb031 },
{ 0x0000, 0xec01, 0x0000, 0x00a9, 0xb031 },
{ 0x0000, 0xec02, 0x0000, 0x00df, 0xb031 },
{ 0x0000, 0xec03, 0x0000, 0x007b, 0xb031 },
{ 0x0000, 0xec05, 0x0000, 0x0079, 0xb031 },
{ 0x0000, 0xec06, 0x0000, 0x005a, 0xb031 },
{ 0x0000, 0xec07, 0x0000, 0x0004, 0xb031 },
{ 0x0000, 0xebc0, 0x0000, 0x00e3, 0xb031 },
{ 0x0000, 0xd1b0, 0x0000, 0x000c, 0xb031 },
{ 0x0000, 0xd110, 0x0000, 0x00f0, 0xb031 },
{ 0x0000, 0xd111, 0x0000, 0x0009, 0xb031 },
{ 0x0000, 0xd112, 0x0000, 0x0092, 0xb031 },
{ 0x0000, 0xd113, 0x0000, 0x00f0, 0xb031 },
{ 0x0000, 0xd114, 0x0000, 0x0007, 0xb031 },
{ 0x0000, 0xd115, 0x0000, 0x00f6, 0xb031 },
{ 0x0000, 0xd116, 0x0000, 0x0072, 0xb031 },
{ 0x0000, 0xd117, 0x0000, 0x00b0, 0xb031 },
{ 0x0000, 0xd120, 0x0000, 0x0007, 0xb031 },
{ 0x0000, 0xd121, 0x0000, 0x00fb, 0xb031 },
{ 0x0000, 0xd122, 0x0000, 0x0037, 0xb031 },
{ 0x0000, 0xd123, 0x0000, 0x00f0, 0xb031 },
{ 0x0000, 0xd124, 0x0000, 0x00f0, 0xb031 },
{ 0x0000, 0xd125, 0x0000, 0x0009, 0xb031 },
{ 0x0000, 0xd126, 0x0000, 0x0090, 0xb031 },
{ 0x0000, 0xd127, 0x0000, 0x0020, 0xb031 },
{ 0x0000, 0xd128, 0x0000, 0x0007, 0xb031 },
{ 0x0000, 0xd129, 0x0000, 0x00fb, 0xb031 },
{ 0x0000, 0xd12a, 0x0000, 0x0037, 0xb031 },
{ 0x0000, 0xd12b, 0x0000, 0x00f0, 0xb031 },
{ 0x0000, 0xd0c3, 0x0000, 0x00f0, 0xb031 },
{ 0x0000, 0xd0c4, 0x0000, 0x000c, 0xb031 },
{ 0x0000, 0xd0c0, 0x0000, 0x00e3, 0xb031 },
{ 0x0000, 0xce63, 0x0000, 0x00f0, 0xb031 },
{ 0x0000, 0xce64, 0x0000, 0x0000, 0xb031 },
{ 0x0000, 0xce60, 0x0000, 0x00e3, 0xb031 },
{ 0x0000, 0xdb00, 0x0000, 0x00cc, 0xb031 },
{ 0x0000, 0xdd04, 0x0000, 0x0008, 0xb031 },
{ 0x0000, 0xdd05, 0x0000, 0x0006, 0xb031 },
{ 0x0000, 0xca12, 0x0000, 0x000f, 0xb031 },
{ 0x0000, 0xca10, 0x0000, 0x0000, 0xb031 },
{ 0x0000, 0xca82, 0x0000, 0x0077, 0xb031 },
{ 0x0000, 0xca85, 0x0000, 0x0082, 0xb031 },
{ 0x0000, 0xca88, 0x0000, 0x00c2, 0xb031 },
{ 0x0000, 0xca95, 0x0000, 0x003a, 0xb031 },
{ 0x0000, 0xca9b, 0x0000, 0x006f, 0xb031 },
{ 0x0000, 0xca10, 0x0000, 0x0000, 0xb031 },
{ 0x0000, 0xca12, 0x0000, 0x0078, 0xb031 },
{ 0x0000, 0xc960, 0x0000, 0x0078, 0xb031 },
{ 0x0000, 0xc961, 0x0000, 0x00e5, 0xb031 },
{ 0x0000, 0xc962, 0x0000, 0x00eb, 0xb031 },
{ 0x0000, 0xc963, 0x0000, 0x00c6, 0xb031 },
{ 0x0000, 0xc964, 0x0000, 0x00ba, 0xb031 },
{ 0x0000, 0xc965, 0x0000, 0x0061, 0xb031 },
{ 0x0000, 0xc967, 0x0000, 0x0017, 0xb031 },
{ 0x0000, 0xc968, 0x0000, 0x00ed, 0xb031 },
{ 0x0000, 0xc969, 0x0000, 0x003c, 0xb031 },
{ 0x0000, 0xc96a, 0x0000, 0x008a, 0xb031 },
{ 0x0000, 0xc96b, 0x0000, 0x00e2, 0xb031 },
{ 0x0000, 0xc975, 0x0000, 0x003a, 0xb031 },
{ 0x0000, 0xc97b, 0x0000, 0x006f, 0xb031 },
{ 0x0000, 0xc936, 0x0000, 0x00f9, 0xb031 },
{ 0x0000, 0xc9a0, 0x0000, 0x00f1, 0xb031 },
{ 0x0000, 0xc933, 0x0000, 0x000b, 0xb031 },
{ 0x0000, 0xc934, 0x0000, 0x0002, 0xb031 },
{ 0x0000, 0xc93f, 0x0000, 0x0014, 0xb031 },
{ 0x0000, 0xc93e, 0x0000, 0x0094, 0xb031 },
{ 0x0000, 0xc93a, 0x0000, 0x0076, 0xb031 },
{ 0x0000, 0xc93b, 0x0000, 0x0089, 0xb031 },
{ 0x0000, 0xc930, 0x0000, 0x0013, 0xb031 },
{ 0x0000, 0xc926, 0x0000, 0x00d1, 0xb031 },
{ 0x0000, 0xc990, 0x0000, 0x00f1, 0xb031 },
{ 0x0000, 0xc923, 0x0000, 0x0010, 0xb031 },
{ 0x0000, 0xc924, 0x0000, 0x0004, 0xb031 },
{ 0x0000, 0xc92f, 0x0000, 0x0018, 0xb031 },
{ 0x0000, 0xc92e, 0x0000, 0x0094, 0xb031 },
{ 0x0000, 0xc920, 0x0000, 0x0008, 0xb031 },
{ 0x0000, 0xc916, 0x0000, 0x00f9, 0xb031 },
{ 0x0000, 0xc980, 0x0000, 0x00e1, 0xb031 },
{ 0x0000, 0xc913, 0x0000, 0x0000, 0xb031 },
{ 0x0000, 0xc914, 0x0000, 0x0001, 0xb031 },
{ 0x0000, 0xc91f, 0x0000, 0x0014, 0xb031 },
{ 0x0000, 0xc91e, 0x0000, 0x0094, 0xb031 },
{ 0x0000, 0xc91a, 0x0000, 0x0066, 0xb031 },
{ 0x0000, 0xc91b, 0x0000, 0x0078, 0xb031 },
{ 0x0000, 0xc910, 0x0000, 0x000d, 0xb031 },
{ 0x0000, 0xc946, 0x0000, 0x00f9, 0xb031 },
{ 0x0000, 0xc9d0, 0x0000, 0x00f1, 0xb031 },
{ 0x0000, 0xc944, 0x0000, 0x0001, 0xb031 },
{ 0x0000, 0xc94f, 0x0000, 0x0014, 0xb031 },
{ 0x0000, 0xc94e, 0x0000, 0x0094, 0xb031 },
{ 0x0000, 0xc94a, 0x0000, 0x0026, 0xb031 },
{ 0x0000, 0xc94b, 0x0000, 0x0056, 0xb031 },
{ 0x0000, 0xc951, 0x0000, 0x0080, 0xb031 },
{ 0x0000, 0xc600, 0x0000, 0x00f0, 0xb031 },
{ 0x0000, 0xc601, 0x0000, 0x0026, 0xb031 },
{ 0x0000, 0xc602, 0x0000, 0x004a, 0xb031 },
{ 0x0000, 0xc603, 0x0000, 0x0010, 0xb031 },
{ 0x0000, 0xc604, 0x0000, 0x0007, 0xb031 },
{ 0x0000, 0xc605, 0x0000, 0x00da, 0xb031 },
{ 0x0000, 0xc606, 0x0000, 0x000e, 0xb031 },
{ 0x0000, 0xc607, 0x0000, 0x00f0, 0xb031 },
{ 0x0000, 0xc610, 0x0000, 0x0007, 0xb031 },
{ 0x0000, 0xc611, 0x0000, 0x00da, 0xb031 },
{ 0x0000, 0xc612, 0x0000, 0x000e, 0xb031 },
{ 0x0000, 0xc613, 0x0000, 0x00f0, 0xb031 },
{ 0x0000, 0xc614, 0x0000, 0x00f0, 0xb031 },
{ 0x0000, 0xc615, 0x0000, 0x0026, 0xb031 },
{ 0x0000, 0xc616, 0x0000, 0x004a, 0xb031 },
{ 0x0000, 0xc617, 0x0000, 0x0010, 0xb031 },
{ 0x0000, 0xc618, 0x0000, 0x0008, 0xb031 },
{ 0x0000, 0xc541, 0x0000, 0x0030, 0xb031 },
{ 0x0000, 0xc802, 0x0000, 0x00d2, 0xb031 },
{ 0x0000, 0xc902, 0x0000, 0x00d2, 0xb031 },
{ 0x0000, 0xc800, 0x0000, 0x00f0, 0xb031 },
{ 0x0000, 0xd250, 0x0000, 0x0087, 0xb031 },
{ 0x0000, 0xd252, 0x0000, 0x0030, 0xb031 },
{ 0x0000, 0xd264, 0x0000, 0x00c0, 0xb031 },
{ 0x0000, 0xce60, 0x0000, 0x00e3, 0xb031 },
{ 0x0000, 0xdf00, 0x0000, 0x0010, 0xb031 },
{ 0x0000, 0xdbb5, 0x0041, 0xd27f, 0xb037 },
{ 0x0000, 0xddb5, 0x0040, 0x6e3b, 0xb037 },
{ 0x0000, 0xdb93, 0x0000, 0x009e, 0xb033 },
{ 0x0000, 0xdd93, 0x0000, 0x009e, 0xb033 },
{ 0x0000, 0xdb12, 0x0000, 0x00c0, 0xb031 },
{ 0x0000, 0xdd12, 0x0000, 0x00c0, 0xb031 },
{ 0x0000, 0xdb08, 0x0000, 0x0080, 0xb031 },
{ 0x0000, 0xdd08, 0x0000, 0x0080, 0xb031 },
{ 0x0000, 0xdb00, 0x0000, 0x00cc, 0xb031 },
{ 0x0000, 0xc203, 0x0000, 0x009c, 0xb031 },
{ 0x0000, 0x0010, 0x0000, 0x0f21, 0x0000 },
};
/* wake the amp (ea00=0x43, c121=0x0b, f109=0xe0) */
static const struct alc298_razer_blade16_2025_op alc298_razer_blade16_2025_amp_wake[] = {
{ 0x0000, 0xea00, 0x0000, 0x0043, 0xb031 },
{ 0x0000, 0xc121, 0x0000, 0x000b, 0xb031 },
{ 0x0000, 0xf109, 0x0000, 0x00e0, 0xb031 },
};
/* park the amp (ea00=0x47, c121=0x0a, f109=0xa0) */
static const struct alc298_razer_blade16_2025_op alc298_razer_blade16_2025_amp_sleep[] = {
{ 0x0000, 0xea00, 0x0000, 0x0047, 0xb031 },
{ 0x0000, 0xc121, 0x0000, 0x000a, 0xb031 },
{ 0x0000, 0xf109, 0x0000, 0x00a0, 0xb031 },
};
/*
* Razer Blade 16 (2025): Realtek ALC298 driving an external smart amp.
* Crossover, voicing and speaker protection live in an external DSP
* reached over a vendor-coef mailbox on NID 0x20; the captured DSP
* programming is in the tables above. NID 0x14, the BIOS-disabled
* tweeter pin, is re-exposed via a pin-config override so the parser
* drives it as a normal internal speaker (shared volume/mute, auto-mute
* on headphone insertion).
*
* alc298_razer_blade16_2025_apply() runs one op-table: a plain coef write
* (strobe == 0) goes through alc_write_coef_idx(), while a mailbox op
* selects a bank and streams four PROC_COEF words (addr/hi/lo/commit)
* into a single coef index (0x23) on NID 0x20 to reach the external DSP
* -- that one-index/many-words form is why it cannot be expressed as an
* alc_process_coef_fw() table (one value per index).
*/
static void alc298_razer_blade16_2025_apply(struct hda_codec *codec,
const struct alc298_razer_blade16_2025_op *seq,
int num)
{
int i;
for (i = 0; i < num; i++) {
if (!seq[i].strobe) {
alc_write_coef_idx(codec, seq[i].addr, seq[i].lo);
continue;
}
alc_write_coef_idx(codec, 0x89, seq[i].bank);
snd_hda_codec_write(codec, 0x20, 0, AC_VERB_SET_COEF_INDEX, 0x23);
snd_hda_codec_write(codec, 0x20, 0, AC_VERB_SET_PROC_COEF, seq[i].addr);
snd_hda_codec_write(codec, 0x20, 0, AC_VERB_SET_PROC_COEF, seq[i].hi);
snd_hda_codec_write(codec, 0x20, 0, AC_VERB_SET_PROC_COEF, seq[i].lo);
snd_hda_codec_write(codec, 0x20, 0, AC_VERB_SET_PROC_COEF, seq[i].strobe);
}
}
static void alc298_razer_blade16_2025_pcm_hook(struct hda_pcm_stream *hinfo,
struct hda_codec *codec,
struct snd_pcm_substream *substream,
int action)
{
/* power the external amp only while a stream is running */
switch (action) {
case HDA_GEN_PCM_ACT_PREPARE:
alc298_razer_blade16_2025_apply(codec, alc298_razer_blade16_2025_amp_wake,
ARRAY_SIZE(alc298_razer_blade16_2025_amp_wake));
break;
case HDA_GEN_PCM_ACT_CLEANUP:
alc298_razer_blade16_2025_apply(codec, alc298_razer_blade16_2025_amp_sleep,
ARRAY_SIZE(alc298_razer_blade16_2025_amp_sleep));
break;
}
}
static void alc298_fixup_razer_blade16_2025(struct hda_codec *codec,
const struct hda_fixup *fix, int action)
{
/*
* Pin every output to a fixed converter so the routing does not
* rely on the generic parser's DAC-allocation heuristics: without
* a fixed assignment the parser brings up only one speaker pin and
* leaves the other silent, and the allocation could change between
* kernel versions. Both speaker pins share DAC 0x03 through mixer
* 0x0d: that is the only converter that drives the woofer (NID
* 0x17) on this machine -- feeding it from DAC 0x02 or the digital
* converter 0x06 leaves the woofer silent. Both pins carry the
* same stereo stream and the external amp does the crossover.
* Headphone NID 0x21 keeps DAC 0x02.
*/
static const hda_nid_t preferred_pairs[] = {
0x21, 0x02,
0x14, 0x03,
0x17, 0x03,
0
};
struct alc_spec *spec = codec->spec;
switch (action) {
case HDA_FIXUP_ACT_PRE_PROBE:
spec->gen.preferred_dacs = preferred_pairs;
break;
case HDA_FIXUP_ACT_PROBE:
spec->gen.pcm_playback_hook = alc298_razer_blade16_2025_pcm_hook;
break;
case HDA_FIXUP_ACT_INIT:
/*
* Wake the amp, program its DSP at boot and on resume, then
* park it. It is woken again for playback and parked
* afterwards from the pcm_playback_hook.
*/
alc298_razer_blade16_2025_apply(codec, alc298_razer_blade16_2025_amp_wake,
ARRAY_SIZE(alc298_razer_blade16_2025_amp_wake));
alc298_razer_blade16_2025_apply(codec, alc298_razer_blade16_2025_amp_init,
ARRAY_SIZE(alc298_razer_blade16_2025_amp_init));
alc298_razer_blade16_2025_apply(codec, alc298_razer_blade16_2025_amp_sleep,
ARRAY_SIZE(alc298_razer_blade16_2025_amp_sleep));
break;
}
}

View File

@ -3357,6 +3357,9 @@ static void alc287_fixup_acer_micmute_led(struct hda_codec *codec,
/* for alc285_fixup_ideapad_s740_coef() */ /* for alc285_fixup_ideapad_s740_coef() */
#include "../helpers/ideapad_s740.c" #include "../helpers/ideapad_s740.c"
/* for alc298_fixup_razer_blade16_2025() */
#include "../helpers/razer_blade16_2025.c"
static const struct coef_fw alc256_fixup_set_coef_defaults_coefs[] = { static const struct coef_fw alc256_fixup_set_coef_defaults_coefs[] = {
WRITE_COEF(0x10, 0x0020), WRITE_COEF(0x24, 0x0000), WRITE_COEF(0x10, 0x0020), WRITE_COEF(0x24, 0x0000),
WRITE_COEF(0x26, 0x0000), WRITE_COEF(0x29, 0x3000), WRITE_COEF(0x26, 0x0000), WRITE_COEF(0x29, 0x3000),
@ -4041,6 +4044,8 @@ enum {
ALC298_FIXUP_SAMSUNG_AMP_V2_2_AMPS, ALC298_FIXUP_SAMSUNG_AMP_V2_2_AMPS,
ALC298_FIXUP_SAMSUNG_AMP_V2_4_AMPS, ALC298_FIXUP_SAMSUNG_AMP_V2_4_AMPS,
ALC298_FIXUP_LG_GRAM_STYLE_14, ALC298_FIXUP_LG_GRAM_STYLE_14,
ALC298_FIXUP_RAZER_BLADE16_2025_PINS,
ALC298_FIXUP_RAZER_BLADE16_2025,
ALC298_FIXUP_SAMSUNG_HEADPHONE_VERY_QUIET, ALC298_FIXUP_SAMSUNG_HEADPHONE_VERY_QUIET,
ALC256_FIXUP_SAMSUNG_HEADPHONE_VERY_QUIET, ALC256_FIXUP_SAMSUNG_HEADPHONE_VERY_QUIET,
ALC295_FIXUP_ASUS_MIC_NO_PRESENCE, ALC295_FIXUP_ASUS_MIC_NO_PRESENCE,
@ -4206,6 +4211,20 @@ static void alc287_fixup_lenovo_yoga_book_9i(struct hda_codec *codec,
} }
static const struct hda_fixup alc269_fixups[] = { static const struct hda_fixup alc269_fixups[] = {
[ALC298_FIXUP_RAZER_BLADE16_2025_PINS] = {
.type = HDA_FIXUP_PINS,
.v.pins = (const struct hda_pintbl[]) {
{ 0x14, 0x90170121 }, /* tweeter as internal speaker, seq 1 */
{ 0x17, 0x90170120 }, /* woofer as internal speaker, seq 0 */
{ }
},
.chained = true,
.chain_id = ALC298_FIXUP_RAZER_BLADE16_2025,
},
[ALC298_FIXUP_RAZER_BLADE16_2025] = {
.type = HDA_FIXUP_FUNC,
.v.func = alc298_fixup_razer_blade16_2025,
},
[ALC269_FIXUP_GPIO2] = { [ALC269_FIXUP_GPIO2] = {
.type = HDA_FIXUP_FUNC, .type = HDA_FIXUP_FUNC,
.v.func = alc_fixup_gpio2, .v.func = alc_fixup_gpio2,
@ -7862,6 +7881,8 @@ static const struct hda_quirk alc269_fixup_tbl[] = {
SND_PCI_QUIRK(0x19e5, 0x3204, "Huawei MACH-WX9", ALC256_FIXUP_HUAWEI_MACH_WX9_PINS), SND_PCI_QUIRK(0x19e5, 0x3204, "Huawei MACH-WX9", ALC256_FIXUP_HUAWEI_MACH_WX9_PINS),
SND_PCI_QUIRK(0x19e5, 0x320f, "Huawei WRT-WX9 ", ALC256_FIXUP_ASUS_MIC_NO_PRESENCE), SND_PCI_QUIRK(0x19e5, 0x320f, "Huawei WRT-WX9 ", ALC256_FIXUP_ASUS_MIC_NO_PRESENCE),
SND_PCI_QUIRK(0x19e5, 0x3212, "Huawei KLV-WX9 ", ALC256_FIXUP_ACER_HEADSET_MIC), SND_PCI_QUIRK(0x19e5, 0x3212, "Huawei KLV-WX9 ", ALC256_FIXUP_ACER_HEADSET_MIC),
SND_PCI_QUIRK(0x1a58, 0x300e, "Razer Blade 16 (2025)",
ALC298_FIXUP_RAZER_BLADE16_2025_PINS),
SND_PCI_QUIRK(0x1b35, 0x1235, "CZC B20", ALC269_FIXUP_CZC_B20), SND_PCI_QUIRK(0x1b35, 0x1235, "CZC B20", ALC269_FIXUP_CZC_B20),
SND_PCI_QUIRK(0x1b35, 0x1236, "CZC TMI", ALC269_FIXUP_CZC_TMI), SND_PCI_QUIRK(0x1b35, 0x1236, "CZC TMI", ALC269_FIXUP_CZC_TMI),
SND_PCI_QUIRK(0x1b35, 0x1237, "CZC L101", ALC269_FIXUP_CZC_L101), SND_PCI_QUIRK(0x1b35, 0x1237, "CZC L101", ALC269_FIXUP_CZC_L101),