xref: /aosp_15_r20/external/coreboot/util/autoport/azalia.go (revision b9411a12aaaa7e1e6a6fb7c5e057f44ee179a49c)
1package main
2
3import (
4	"fmt"
5	"sort"
6)
7
8type azalia struct {
9}
10
11func (i azalia) Scan(ctx Context, addr PCIDevData) {
12	az := Create(ctx, "hda_verb.c")
13	defer az.Close()
14
15	Add_gpl(az)
16	az.WriteString(
17		`#include <device/azalia_device.h>
18
19const u32 cim_verb_data[] = {
20`)
21
22	for _, codec := range ctx.InfoSource.GetAzaliaCodecs() {
23		fmt.Fprintf(az, "\t0x%08x,\t/* Codec Vendor / Device ID: %s */\n",
24			codec.VendorID, codec.Name)
25		fmt.Fprintf(az, "\t0x%08x,\t/* Subsystem ID */\n",
26			codec.SubsystemID)
27		fmt.Fprintf(az, "\t%d,\t\t/* Number of 4 dword sets */\n",
28			len(codec.PinConfig)+1)
29		fmt.Fprintf(az, "\tAZALIA_SUBVENDOR(%d, 0x%08x),\n",
30			codec.CodecNo, codec.SubsystemID)
31
32		keys := []int{}
33		for nid, _ := range codec.PinConfig {
34			keys = append(keys, nid)
35		}
36
37		sort.Ints(keys)
38
39		for _, nid := range keys {
40			fmt.Fprintf(az, "\tAZALIA_PIN_CFG(%d, 0x%02x, 0x%08x),\n",
41				codec.CodecNo, nid, codec.PinConfig[nid])
42		}
43		az.WriteString("\n");
44	}
45
46	az.WriteString(
47		`};
48
49const u32 pc_beep_verbs[0] = {};
50
51AZALIA_ARRAY_SIZES;
52`)
53
54	PutPCIDev(addr, "")
55}
56
57func init() {
58	/* I82801GX/I945 */
59	RegisterPCI(0x8086, 0x27d8, azalia{})
60	/* BD82X6X/sandybridge */
61	RegisterPCI(0x8086, 0x1c20, azalia{})
62	/* C216/ivybridge */
63	RegisterPCI(0x8086, 0x1e20, azalia{})
64	/* Lynx Point */
65	RegisterPCI(0x8086, 0x8c20, azalia{})
66	RegisterPCI(0x8086, 0x9c20, azalia{})
67}
68