blob: 191c69f9e31befa649b11b71b540fdfbd3737785 [file] [log] [blame]
Vladimir Serbinenko3129f792014-10-15 21:51:47 +02001package main
2
3type sandybridgemc struct {
4 variant string
5}
6
7func (i sandybridgemc) Scan(ctx Context, addr PCIDevData) {
8 inteltool := ctx.InfoSource.GetInteltool()
9
10 /* FIXME:XX Move this somewhere else. */
11 MainboardIncludes = append(MainboardIncludes, "drivers/intel/gma/int15.h")
12 MainboardEnable += (` /* FIXME: fix those values*/
13 install_intel_vga_int15_handler(GMA_INT15_ACTIVE_LFP_INT_LVDS, GMA_INT15_PANEL_FIT_DEFAULT, GMA_INT15_BOOT_DISPLAY_DEFAULT, 0);
14`)
15
16 pchLVDS := inteltool.IGD[0xe1180]
17 dualChannel := pchLVDS&(3<<2) == (3 << 2)
18 pipe := (pchLVDS >> 30) & 1
Vladimir Serbinenko3129f792014-10-15 21:51:47 +020019 link_m1 := inteltool.IGD[0x60040+0x1000*pipe]
20 link_n1 := inteltool.IGD[0x60044+0x1000*pipe]
Vladimir Serbinenko3129f792014-10-15 21:51:47 +020021 link_factor := float32(link_m1) / float32(link_n1)
Vladimir Serbinenko3129f792014-10-15 21:51:47 +020022 fp0 := inteltool.IGD[0xc6040+8*pipe]
23 dpll := inteltool.IGD[0xc6014+4*pipe]
24 pixel_m2 := fp0 & 0xff
25 pixel_m1 := (fp0>>8)&0xff + 2
26 pixel_p1 := uint32(1)
27 for i := dpll & 0x1ffff; i != 0 && i&1 == 0; i >>= 1 {
28 pixel_p1++
29 }
30 pixel_n := ((fp0 >> 16) & 0xff) + 2
31 pixel_frequency := float32(120000*(5*pixel_m1+pixel_m2)) / float32(pixel_n*pixel_p1*7.0)
32 if !dualChannel {
33 pixel_frequency /= 2
34 }
35 link_frequency := pixel_frequency / link_factor
36 DevTree = DevTreeNode{
37 Chip: "northbridge/intel/sandybridge",
38 MissingParent: "northbridge",
39 Comment: "FIXME: check gfx.ndid and gfx.did",
40 Registers: map[string]string{
41 "gpu_dp_b_hotplug": FormatInt32((inteltool.IGD[0xc4030] >> 2) & 7),
42 "gpu_dp_c_hotplug": FormatInt32((inteltool.IGD[0xc4030] >> 10) & 7),
43 "gpu_dp_d_hotplug": FormatInt32((inteltool.IGD[0xc4030] >> 18) & 7),
44 "gpu_panel_port_select": FormatInt32((inteltool.IGD[0xc7208] >> 30) & 3),
45 "gpu_panel_power_up_delay": FormatInt32((inteltool.IGD[0xc7208] >> 16) & 0x1fff),
46 "gpu_panel_power_backlight_on_delay": FormatInt32(inteltool.IGD[0xc7208] & 0x1fff),
47 "gpu_panel_power_down_delay": FormatInt32((inteltool.IGD[0xc720c] >> 16) & 0x1fff),
48 "gpu_panel_power_backlight_off_delay": FormatInt32(inteltool.IGD[0xc720c] & 0x1fff),
49 "gpu_panel_power_cycle_delay": FormatInt32(inteltool.IGD[0xc7210] & 0xff),
50 "gpu_cpu_backlight": FormatHex32(inteltool.IGD[0x48254]),
51 "gpu_pch_backlight": FormatHex32((inteltool.IGD[0xc8254] >> 16) * 0x10001),
52 "gfx.use_spread_spectrum_clock": FormatBool((inteltool.IGD[0xc6200]>>12)&1 != 0),
Vladimir Serbinenko3129f792014-10-15 21:51:47 +020053 "gfx.link_frequency_270_mhz": FormatBool(link_frequency > 200000),
54 /* FIXME:XX hardcoded. */
55 "gfx.ndid": "3",
56 "gfx.did": "{ 0x80000100, 0x80000240, 0x80000410, 0x80000410, 0x00000005 }",
57 },
58 Children: []DevTreeNode{
59 {
60 Chip: "cpu_cluster",
61 Dev: 0,
62 Children: []DevTreeNode{
63 {
64 Chip: "cpu/intel/socket_rPGA989",
65 Children: []DevTreeNode{
66 {
67 Chip: "lapic",
68 Dev: 0,
69 },
70 },
71 },
72
73 {
74 Chip: "cpu/intel/model_206ax",
75 Comment: "FIXME: check all registers",
76 Registers: map[string]string{
77 /* FIXME:XX hardcoded. */
78 "c1_acpower": "1",
79 "c2_acpower": "3",
80 "c3_acpower": "5",
81 "c1_battery": "1",
82 "c2_battery": "3",
83 "c3_battery": "5",
84 },
85 Children: []DevTreeNode{
86 {
87 Chip: "lapic",
88 Dev: 0xacac,
89 Disabled: true,
90 },
91 },
92 },
93 },
94 },
95
96 {
97 Chip: "domain",
98 Dev: 0,
99 PCIController: true,
100 ChildPCIBus: 0,
101 PCISlots: []PCISlot{
102 PCISlot{PCIAddr: PCIAddr{Dev: 0x0, Func: 0}, writeEmpty: true, additionalComment: "Host bridge"},
103 PCISlot{PCIAddr: PCIAddr{Dev: 0x1, Func: 0}, writeEmpty: true, additionalComment: "PCIe Bridge for discrete graphics"},
104 PCISlot{PCIAddr: PCIAddr{Dev: 0x2, Func: 0}, writeEmpty: true, additionalComment: "Internal graphics"},
105 },
106 },
107 },
108 }
109
110 PutPCIDev(addr, "Host bridge")
111
112 /* FIXME:XX Move part to northbridge? */
113 /* FIXME:XX some configs are unsupported. */
114 KconfigBool["MAINBOARD_HAS_NATIVE_VGA_INIT"] = true
115 KconfigBool["MAINBOARD_HAS_NATIVE_VGA_INIT_TEXTMODECFG"] = true
116 KconfigBool[i.variant+"BRIDGE_LVDS"] = true
117
118 KconfigBool["VGA"] = true
119 KconfigBool["INTEL_EDID"] = true
120 KconfigBool["CPU_INTEL_SOCKET_RPGA989"] = true
Alexandru Gagniucecf2eb42015-09-28 21:39:12 -0700121 KconfigBool["NORTHBRIDGE_INTEL_"+i.variant+"BRIDGE"] = true
Vladimir Serbinenko3129f792014-10-15 21:51:47 +0200122 KconfigBool["INTEL_INT15"] = true
123 KconfigBool["HAVE_ACPI_TABLES"] = true
124 KconfigBool["HAVE_ACPI_RESUME"] = true
125
126 KconfigBool["HAVE_IFD_BIN"] = false
127 KconfigBool["HAVE_ME_BIN"] = false
128
129 KconfigHex["MMCONF_BASE_ADDRESS"] = 0xf0000000
130 KconfigInt["MAX_CPUS"] = 8
131
132 DSDTIncludes = append(DSDTIncludes, DSDTInclude{
133 File: "cpu/intel/model_206ax/acpi/cpu.asl",
134 })
135
136 DSDTPCI0Includes = append(DSDTPCI0Includes, DSDTInclude{
137 File: "northbridge/intel/sandybridge/acpi/sandybridge.asl",
Nico Huber954a55b2015-08-27 13:31:46 +0200138 }, DSDTInclude{
139 File: "drivers/intel/gma/acpi/default_brightness_levels.asl",
Vladimir Serbinenko3129f792014-10-15 21:51:47 +0200140 })
141}
142
143func init() {
144 RegisterPCI(0x8086, 0x0100, sandybridgemc{variant: "SANDY"})
145 RegisterPCI(0x8086, 0x0104, sandybridgemc{variant: "SANDY"})
146 RegisterPCI(0x8086, 0x0150, sandybridgemc{variant: "IVY"})
147 RegisterPCI(0x8086, 0x0154, sandybridgemc{variant: "IVY"})
148 for _, id := range []uint16{
149 0x0102, 0x0106, 0x010a, 0x0112,
150 0x0116, 0x0122, 0x0126, 0x0156,
151 0x0166,
152 } {
153 RegisterPCI(0x8086, id, GenericVGA{GenericPCI{Comment: "VGA controller"}})
154 }
155}