1*4882a593Smuzhiyun /*
2*4882a593Smuzhiyun * From coreboot src/soc/intel/broadwell/igd.c
3*4882a593Smuzhiyun *
4*4882a593Smuzhiyun * Copyright (C) 2016 Google, Inc
5*4882a593Smuzhiyun *
6*4882a593Smuzhiyun * SPDX-License-Identifier: GPL-2.0
7*4882a593Smuzhiyun */
8*4882a593Smuzhiyun
9*4882a593Smuzhiyun #include <common.h>
10*4882a593Smuzhiyun #include <bios_emul.h>
11*4882a593Smuzhiyun #include <dm.h>
12*4882a593Smuzhiyun #include <vbe.h>
13*4882a593Smuzhiyun #include <video.h>
14*4882a593Smuzhiyun #include <asm/cpu.h>
15*4882a593Smuzhiyun #include <asm/intel_regs.h>
16*4882a593Smuzhiyun #include <asm/io.h>
17*4882a593Smuzhiyun #include <asm/mtrr.h>
18*4882a593Smuzhiyun #include <asm/arch/cpu.h>
19*4882a593Smuzhiyun #include <asm/arch/iomap.h>
20*4882a593Smuzhiyun #include <asm/arch/pch.h>
21*4882a593Smuzhiyun #include "i915_reg.h"
22*4882a593Smuzhiyun
23*4882a593Smuzhiyun struct broadwell_igd_priv {
24*4882a593Smuzhiyun u8 *regs;
25*4882a593Smuzhiyun };
26*4882a593Smuzhiyun
27*4882a593Smuzhiyun struct broadwell_igd_plat {
28*4882a593Smuzhiyun u32 dp_hotplug[3];
29*4882a593Smuzhiyun
30*4882a593Smuzhiyun int port_select;
31*4882a593Smuzhiyun int power_up_delay;
32*4882a593Smuzhiyun int power_backlight_on_delay;
33*4882a593Smuzhiyun int power_down_delay;
34*4882a593Smuzhiyun int power_backlight_off_delay;
35*4882a593Smuzhiyun int power_cycle_delay;
36*4882a593Smuzhiyun int cpu_backlight;
37*4882a593Smuzhiyun int pch_backlight;
38*4882a593Smuzhiyun int cdclk;
39*4882a593Smuzhiyun int pre_graphics_delay;
40*4882a593Smuzhiyun };
41*4882a593Smuzhiyun
42*4882a593Smuzhiyun #define GT_RETRY 1000
43*4882a593Smuzhiyun #define GT_CDCLK_337 0
44*4882a593Smuzhiyun #define GT_CDCLK_450 1
45*4882a593Smuzhiyun #define GT_CDCLK_540 2
46*4882a593Smuzhiyun #define GT_CDCLK_675 3
47*4882a593Smuzhiyun
board_map_oprom_vendev(u32 vendev)48*4882a593Smuzhiyun u32 board_map_oprom_vendev(u32 vendev)
49*4882a593Smuzhiyun {
50*4882a593Smuzhiyun return SA_IGD_OPROM_VENDEV;
51*4882a593Smuzhiyun }
52*4882a593Smuzhiyun
poll32(u8 * addr,uint mask,uint value)53*4882a593Smuzhiyun static int poll32(u8 *addr, uint mask, uint value)
54*4882a593Smuzhiyun {
55*4882a593Smuzhiyun ulong start;
56*4882a593Smuzhiyun
57*4882a593Smuzhiyun start = get_timer(0);
58*4882a593Smuzhiyun debug("%s: addr %p = %x\n", __func__, addr, readl(addr));
59*4882a593Smuzhiyun while ((readl(addr) & mask) != value) {
60*4882a593Smuzhiyun if (get_timer(start) > GT_RETRY) {
61*4882a593Smuzhiyun debug("poll32: timeout: %x\n", readl(addr));
62*4882a593Smuzhiyun return -ETIMEDOUT;
63*4882a593Smuzhiyun }
64*4882a593Smuzhiyun }
65*4882a593Smuzhiyun
66*4882a593Smuzhiyun return 0;
67*4882a593Smuzhiyun }
68*4882a593Smuzhiyun
haswell_early_init(struct udevice * dev)69*4882a593Smuzhiyun static int haswell_early_init(struct udevice *dev)
70*4882a593Smuzhiyun {
71*4882a593Smuzhiyun struct broadwell_igd_priv *priv = dev_get_priv(dev);
72*4882a593Smuzhiyun u8 *regs = priv->regs;
73*4882a593Smuzhiyun int ret;
74*4882a593Smuzhiyun
75*4882a593Smuzhiyun /* Enable Force Wake */
76*4882a593Smuzhiyun writel(0x00000020, regs + 0xa180);
77*4882a593Smuzhiyun writel(0x00010001, regs + 0xa188);
78*4882a593Smuzhiyun ret = poll32(regs + 0x130044, 1, 1);
79*4882a593Smuzhiyun if (ret)
80*4882a593Smuzhiyun goto err;
81*4882a593Smuzhiyun
82*4882a593Smuzhiyun /* Enable Counters */
83*4882a593Smuzhiyun setbits_le32(regs + 0xa248, 0x00000016);
84*4882a593Smuzhiyun
85*4882a593Smuzhiyun /* GFXPAUSE settings */
86*4882a593Smuzhiyun writel(0x00070020, regs + 0xa000);
87*4882a593Smuzhiyun
88*4882a593Smuzhiyun /* ECO Settings */
89*4882a593Smuzhiyun clrsetbits_le32(regs + 0xa180, ~0xff3fffff, 0x15000000);
90*4882a593Smuzhiyun
91*4882a593Smuzhiyun /* Enable DOP Clock Gating */
92*4882a593Smuzhiyun writel(0x000003fd, regs + 0x9424);
93*4882a593Smuzhiyun
94*4882a593Smuzhiyun /* Enable Unit Level Clock Gating */
95*4882a593Smuzhiyun writel(0x00000080, regs + 0x9400);
96*4882a593Smuzhiyun writel(0x40401000, regs + 0x9404);
97*4882a593Smuzhiyun writel(0x00000000, regs + 0x9408);
98*4882a593Smuzhiyun writel(0x02000001, regs + 0x940c);
99*4882a593Smuzhiyun
100*4882a593Smuzhiyun /*
101*4882a593Smuzhiyun * RC6 Settings
102*4882a593Smuzhiyun */
103*4882a593Smuzhiyun
104*4882a593Smuzhiyun /* Wake Rate Limits */
105*4882a593Smuzhiyun setbits_le32(regs + 0xa090, 0x00000000);
106*4882a593Smuzhiyun setbits_le32(regs + 0xa098, 0x03e80000);
107*4882a593Smuzhiyun setbits_le32(regs + 0xa09c, 0x00280000);
108*4882a593Smuzhiyun setbits_le32(regs + 0xa0a8, 0x0001e848);
109*4882a593Smuzhiyun setbits_le32(regs + 0xa0ac, 0x00000019);
110*4882a593Smuzhiyun
111*4882a593Smuzhiyun /* Render/Video/Blitter Idle Max Count */
112*4882a593Smuzhiyun writel(0x0000000a, regs + 0x02054);
113*4882a593Smuzhiyun writel(0x0000000a, regs + 0x12054);
114*4882a593Smuzhiyun writel(0x0000000a, regs + 0x22054);
115*4882a593Smuzhiyun writel(0x0000000a, regs + 0x1a054);
116*4882a593Smuzhiyun
117*4882a593Smuzhiyun /* RC Sleep / RCx Thresholds */
118*4882a593Smuzhiyun setbits_le32(regs + 0xa0b0, 0x00000000);
119*4882a593Smuzhiyun setbits_le32(regs + 0xa0b4, 0x000003e8);
120*4882a593Smuzhiyun setbits_le32(regs + 0xa0b8, 0x0000c350);
121*4882a593Smuzhiyun
122*4882a593Smuzhiyun /* RP Settings */
123*4882a593Smuzhiyun setbits_le32(regs + 0xa010, 0x000f4240);
124*4882a593Smuzhiyun setbits_le32(regs + 0xa014, 0x12060000);
125*4882a593Smuzhiyun setbits_le32(regs + 0xa02c, 0x0000e808);
126*4882a593Smuzhiyun setbits_le32(regs + 0xa030, 0x0003bd08);
127*4882a593Smuzhiyun setbits_le32(regs + 0xa068, 0x000101d0);
128*4882a593Smuzhiyun setbits_le32(regs + 0xa06c, 0x00055730);
129*4882a593Smuzhiyun setbits_le32(regs + 0xa070, 0x0000000a);
130*4882a593Smuzhiyun
131*4882a593Smuzhiyun /* RP Control */
132*4882a593Smuzhiyun writel(0x00000b92, regs + 0xa024);
133*4882a593Smuzhiyun
134*4882a593Smuzhiyun /* HW RC6 Control */
135*4882a593Smuzhiyun writel(0x88040000, regs + 0xa090);
136*4882a593Smuzhiyun
137*4882a593Smuzhiyun /* Video Frequency Request */
138*4882a593Smuzhiyun writel(0x08000000, regs + 0xa00c);
139*4882a593Smuzhiyun
140*4882a593Smuzhiyun /* Set RC6 VIDs */
141*4882a593Smuzhiyun ret = poll32(regs + 0x138124, (1 << 31), 0);
142*4882a593Smuzhiyun if (ret)
143*4882a593Smuzhiyun goto err;
144*4882a593Smuzhiyun writel(0, regs + 0x138128);
145*4882a593Smuzhiyun writel(0x80000004, regs + 0x138124);
146*4882a593Smuzhiyun ret = poll32(regs + 0x138124, (1 << 31), 0);
147*4882a593Smuzhiyun if (ret)
148*4882a593Smuzhiyun goto err;
149*4882a593Smuzhiyun
150*4882a593Smuzhiyun /* Enable PM Interrupts */
151*4882a593Smuzhiyun writel(0x03000076, regs + 0x4402c);
152*4882a593Smuzhiyun
153*4882a593Smuzhiyun /* Enable RC6 in idle */
154*4882a593Smuzhiyun writel(0x00040000, regs + 0xa094);
155*4882a593Smuzhiyun
156*4882a593Smuzhiyun return 0;
157*4882a593Smuzhiyun err:
158*4882a593Smuzhiyun debug("%s: ret=%d\n", __func__, ret);
159*4882a593Smuzhiyun return ret;
160*4882a593Smuzhiyun };
161*4882a593Smuzhiyun
haswell_late_init(struct udevice * dev)162*4882a593Smuzhiyun static int haswell_late_init(struct udevice *dev)
163*4882a593Smuzhiyun {
164*4882a593Smuzhiyun struct broadwell_igd_priv *priv = dev_get_priv(dev);
165*4882a593Smuzhiyun u8 *regs = priv->regs;
166*4882a593Smuzhiyun int ret;
167*4882a593Smuzhiyun
168*4882a593Smuzhiyun /* Lock settings */
169*4882a593Smuzhiyun setbits_le32(regs + 0x0a248, (1 << 31));
170*4882a593Smuzhiyun setbits_le32(regs + 0x0a004, (1 << 4));
171*4882a593Smuzhiyun setbits_le32(regs + 0x0a080, (1 << 2));
172*4882a593Smuzhiyun setbits_le32(regs + 0x0a180, (1 << 31));
173*4882a593Smuzhiyun
174*4882a593Smuzhiyun /* Disable Force Wake */
175*4882a593Smuzhiyun writel(0x00010000, regs + 0xa188);
176*4882a593Smuzhiyun ret = poll32(regs + 0x130044, 1, 0);
177*4882a593Smuzhiyun if (ret)
178*4882a593Smuzhiyun goto err;
179*4882a593Smuzhiyun writel(0x00000001, regs + 0xa188);
180*4882a593Smuzhiyun
181*4882a593Smuzhiyun /* Enable power well for DP and Audio */
182*4882a593Smuzhiyun setbits_le32(regs + 0x45400, (1 << 31));
183*4882a593Smuzhiyun ret = poll32(regs + 0x45400, 1 << 30, 1 << 30);
184*4882a593Smuzhiyun if (ret)
185*4882a593Smuzhiyun goto err;
186*4882a593Smuzhiyun
187*4882a593Smuzhiyun return 0;
188*4882a593Smuzhiyun err:
189*4882a593Smuzhiyun debug("%s: ret=%d\n", __func__, ret);
190*4882a593Smuzhiyun return ret;
191*4882a593Smuzhiyun };
192*4882a593Smuzhiyun
broadwell_early_init(struct udevice * dev)193*4882a593Smuzhiyun static int broadwell_early_init(struct udevice *dev)
194*4882a593Smuzhiyun {
195*4882a593Smuzhiyun struct broadwell_igd_priv *priv = dev_get_priv(dev);
196*4882a593Smuzhiyun u8 *regs = priv->regs;
197*4882a593Smuzhiyun int ret;
198*4882a593Smuzhiyun
199*4882a593Smuzhiyun /* Enable Force Wake */
200*4882a593Smuzhiyun writel(0x00010001, regs + 0xa188);
201*4882a593Smuzhiyun ret = poll32(regs + 0x130044, 1, 1);
202*4882a593Smuzhiyun if (ret)
203*4882a593Smuzhiyun goto err;
204*4882a593Smuzhiyun
205*4882a593Smuzhiyun /* Enable push bus metric control and shift */
206*4882a593Smuzhiyun writel(0x00000004, regs + 0xa248);
207*4882a593Smuzhiyun writel(0x000000ff, regs + 0xa250);
208*4882a593Smuzhiyun writel(0x00000010, regs + 0xa25c);
209*4882a593Smuzhiyun
210*4882a593Smuzhiyun /* GFXPAUSE settings (set based on stepping) */
211*4882a593Smuzhiyun
212*4882a593Smuzhiyun /* ECO Settings */
213*4882a593Smuzhiyun writel(0x45200000, regs + 0xa180);
214*4882a593Smuzhiyun
215*4882a593Smuzhiyun /* Enable DOP Clock Gating */
216*4882a593Smuzhiyun writel(0x000000fd, regs + 0x9424);
217*4882a593Smuzhiyun
218*4882a593Smuzhiyun /* Enable Unit Level Clock Gating */
219*4882a593Smuzhiyun writel(0x00000000, regs + 0x9400);
220*4882a593Smuzhiyun writel(0x40401000, regs + 0x9404);
221*4882a593Smuzhiyun writel(0x00000000, regs + 0x9408);
222*4882a593Smuzhiyun writel(0x02000001, regs + 0x940c);
223*4882a593Smuzhiyun writel(0x0000000a, regs + 0x1a054);
224*4882a593Smuzhiyun
225*4882a593Smuzhiyun /* Video Frequency Request */
226*4882a593Smuzhiyun writel(0x08000000, regs + 0xa00c);
227*4882a593Smuzhiyun
228*4882a593Smuzhiyun writel(0x00000009, regs + 0x138158);
229*4882a593Smuzhiyun writel(0x0000000d, regs + 0x13815c);
230*4882a593Smuzhiyun
231*4882a593Smuzhiyun /*
232*4882a593Smuzhiyun * RC6 Settings
233*4882a593Smuzhiyun */
234*4882a593Smuzhiyun
235*4882a593Smuzhiyun /* Wake Rate Limits */
236*4882a593Smuzhiyun clrsetbits_le32(regs + 0x0a090, ~0, 0);
237*4882a593Smuzhiyun setbits_le32(regs + 0x0a098, 0x03e80000);
238*4882a593Smuzhiyun setbits_le32(regs + 0x0a09c, 0x00280000);
239*4882a593Smuzhiyun setbits_le32(regs + 0x0a0a8, 0x0001e848);
240*4882a593Smuzhiyun setbits_le32(regs + 0x0a0ac, 0x00000019);
241*4882a593Smuzhiyun
242*4882a593Smuzhiyun /* Render/Video/Blitter Idle Max Count */
243*4882a593Smuzhiyun writel(0x0000000a, regs + 0x02054);
244*4882a593Smuzhiyun writel(0x0000000a, regs + 0x12054);
245*4882a593Smuzhiyun writel(0x0000000a, regs + 0x22054);
246*4882a593Smuzhiyun
247*4882a593Smuzhiyun /* RC Sleep / RCx Thresholds */
248*4882a593Smuzhiyun setbits_le32(regs + 0x0a0b0, 0x00000000);
249*4882a593Smuzhiyun setbits_le32(regs + 0x0a0b8, 0x00000271);
250*4882a593Smuzhiyun
251*4882a593Smuzhiyun /* RP Settings */
252*4882a593Smuzhiyun setbits_le32(regs + 0x0a010, 0x000f4240);
253*4882a593Smuzhiyun setbits_le32(regs + 0x0a014, 0x12060000);
254*4882a593Smuzhiyun setbits_le32(regs + 0x0a02c, 0x0000e808);
255*4882a593Smuzhiyun setbits_le32(regs + 0x0a030, 0x0003bd08);
256*4882a593Smuzhiyun setbits_le32(regs + 0x0a068, 0x000101d0);
257*4882a593Smuzhiyun setbits_le32(regs + 0x0a06c, 0x00055730);
258*4882a593Smuzhiyun setbits_le32(regs + 0x0a070, 0x0000000a);
259*4882a593Smuzhiyun setbits_le32(regs + 0x0a168, 0x00000006);
260*4882a593Smuzhiyun
261*4882a593Smuzhiyun /* RP Control */
262*4882a593Smuzhiyun writel(0x00000b92, regs + 0xa024);
263*4882a593Smuzhiyun
264*4882a593Smuzhiyun /* HW RC6 Control */
265*4882a593Smuzhiyun writel(0x90040000, regs + 0xa090);
266*4882a593Smuzhiyun
267*4882a593Smuzhiyun /* Set RC6 VIDs */
268*4882a593Smuzhiyun ret = poll32(regs + 0x138124, (1 << 31), 0);
269*4882a593Smuzhiyun if (ret)
270*4882a593Smuzhiyun goto err;
271*4882a593Smuzhiyun writel(0, regs + 0x138128);
272*4882a593Smuzhiyun writel(0x80000004, regs + 0x138124);
273*4882a593Smuzhiyun ret = poll32(regs + 0x138124, (1 << 31), 0);
274*4882a593Smuzhiyun if (ret)
275*4882a593Smuzhiyun goto err;
276*4882a593Smuzhiyun
277*4882a593Smuzhiyun /* Enable PM Interrupts */
278*4882a593Smuzhiyun writel(0x03000076, regs + 0x4402c);
279*4882a593Smuzhiyun
280*4882a593Smuzhiyun /* Enable RC6 in idle */
281*4882a593Smuzhiyun writel(0x00040000, regs + 0xa094);
282*4882a593Smuzhiyun
283*4882a593Smuzhiyun return 0;
284*4882a593Smuzhiyun err:
285*4882a593Smuzhiyun debug("%s: ret=%d\n", __func__, ret);
286*4882a593Smuzhiyun return ret;
287*4882a593Smuzhiyun }
288*4882a593Smuzhiyun
broadwell_late_init(struct udevice * dev)289*4882a593Smuzhiyun static int broadwell_late_init(struct udevice *dev)
290*4882a593Smuzhiyun {
291*4882a593Smuzhiyun struct broadwell_igd_priv *priv = dev_get_priv(dev);
292*4882a593Smuzhiyun u8 *regs = priv->regs;
293*4882a593Smuzhiyun int ret;
294*4882a593Smuzhiyun
295*4882a593Smuzhiyun /* Lock settings */
296*4882a593Smuzhiyun setbits_le32(regs + 0x0a248, 1 << 31);
297*4882a593Smuzhiyun setbits_le32(regs + 0x0a000, 1 << 18);
298*4882a593Smuzhiyun setbits_le32(regs + 0x0a180, 1 << 31);
299*4882a593Smuzhiyun
300*4882a593Smuzhiyun /* Disable Force Wake */
301*4882a593Smuzhiyun writel(0x00010000, regs + 0xa188);
302*4882a593Smuzhiyun ret = poll32(regs + 0x130044, 1, 0);
303*4882a593Smuzhiyun if (ret)
304*4882a593Smuzhiyun goto err;
305*4882a593Smuzhiyun
306*4882a593Smuzhiyun /* Enable power well for DP and Audio */
307*4882a593Smuzhiyun setbits_le32(regs + 0x45400, 1 << 31);
308*4882a593Smuzhiyun ret = poll32(regs + 0x45400, 1 << 30, 1 << 30);
309*4882a593Smuzhiyun if (ret)
310*4882a593Smuzhiyun goto err;
311*4882a593Smuzhiyun
312*4882a593Smuzhiyun return 0;
313*4882a593Smuzhiyun err:
314*4882a593Smuzhiyun debug("%s: ret=%d\n", __func__, ret);
315*4882a593Smuzhiyun return ret;
316*4882a593Smuzhiyun };
317*4882a593Smuzhiyun
318*4882a593Smuzhiyun
gtt_read(struct broadwell_igd_priv * priv,unsigned long reg)319*4882a593Smuzhiyun static unsigned long gtt_read(struct broadwell_igd_priv *priv,
320*4882a593Smuzhiyun unsigned long reg)
321*4882a593Smuzhiyun {
322*4882a593Smuzhiyun return readl(priv->regs + reg);
323*4882a593Smuzhiyun }
324*4882a593Smuzhiyun
gtt_write(struct broadwell_igd_priv * priv,unsigned long reg,unsigned long data)325*4882a593Smuzhiyun static void gtt_write(struct broadwell_igd_priv *priv, unsigned long reg,
326*4882a593Smuzhiyun unsigned long data)
327*4882a593Smuzhiyun {
328*4882a593Smuzhiyun writel(data, priv->regs + reg);
329*4882a593Smuzhiyun }
330*4882a593Smuzhiyun
gtt_clrsetbits(struct broadwell_igd_priv * priv,u32 reg,u32 bic,u32 or)331*4882a593Smuzhiyun static inline void gtt_clrsetbits(struct broadwell_igd_priv *priv, u32 reg,
332*4882a593Smuzhiyun u32 bic, u32 or)
333*4882a593Smuzhiyun {
334*4882a593Smuzhiyun clrsetbits_le32(priv->regs + reg, bic, or);
335*4882a593Smuzhiyun }
336*4882a593Smuzhiyun
gtt_poll(struct broadwell_igd_priv * priv,u32 reg,u32 mask,u32 value)337*4882a593Smuzhiyun static int gtt_poll(struct broadwell_igd_priv *priv, u32 reg, u32 mask,
338*4882a593Smuzhiyun u32 value)
339*4882a593Smuzhiyun {
340*4882a593Smuzhiyun unsigned try = GT_RETRY;
341*4882a593Smuzhiyun u32 data;
342*4882a593Smuzhiyun
343*4882a593Smuzhiyun while (try--) {
344*4882a593Smuzhiyun data = gtt_read(priv, reg);
345*4882a593Smuzhiyun if ((data & mask) == value)
346*4882a593Smuzhiyun return 0;
347*4882a593Smuzhiyun udelay(10);
348*4882a593Smuzhiyun }
349*4882a593Smuzhiyun
350*4882a593Smuzhiyun debug("GT init timeout\n");
351*4882a593Smuzhiyun return -ETIMEDOUT;
352*4882a593Smuzhiyun }
353*4882a593Smuzhiyun
igd_setup_panel(struct udevice * dev)354*4882a593Smuzhiyun static void igd_setup_panel(struct udevice *dev)
355*4882a593Smuzhiyun {
356*4882a593Smuzhiyun struct broadwell_igd_plat *plat = dev_get_platdata(dev);
357*4882a593Smuzhiyun struct broadwell_igd_priv *priv = dev_get_priv(dev);
358*4882a593Smuzhiyun u32 reg32;
359*4882a593Smuzhiyun
360*4882a593Smuzhiyun /* Setup Digital Port Hotplug */
361*4882a593Smuzhiyun reg32 = (plat->dp_hotplug[0] & 0x7) << 2;
362*4882a593Smuzhiyun reg32 |= (plat->dp_hotplug[1] & 0x7) << 10;
363*4882a593Smuzhiyun reg32 |= (plat->dp_hotplug[2] & 0x7) << 18;
364*4882a593Smuzhiyun gtt_write(priv, PCH_PORT_HOTPLUG, reg32);
365*4882a593Smuzhiyun
366*4882a593Smuzhiyun /* Setup Panel Power On Delays */
367*4882a593Smuzhiyun reg32 = (plat->port_select & 0x3) << 30;
368*4882a593Smuzhiyun reg32 |= (plat->power_up_delay & 0x1fff) << 16;
369*4882a593Smuzhiyun reg32 |= (plat->power_backlight_on_delay & 0x1fff);
370*4882a593Smuzhiyun gtt_write(priv, PCH_PP_ON_DELAYS, reg32);
371*4882a593Smuzhiyun
372*4882a593Smuzhiyun /* Setup Panel Power Off Delays */
373*4882a593Smuzhiyun reg32 = (plat->power_down_delay & 0x1fff) << 16;
374*4882a593Smuzhiyun reg32 |= (plat->power_backlight_off_delay & 0x1fff);
375*4882a593Smuzhiyun gtt_write(priv, PCH_PP_OFF_DELAYS, reg32);
376*4882a593Smuzhiyun
377*4882a593Smuzhiyun /* Setup Panel Power Cycle Delay */
378*4882a593Smuzhiyun if (plat->power_cycle_delay) {
379*4882a593Smuzhiyun reg32 = gtt_read(priv, PCH_PP_DIVISOR);
380*4882a593Smuzhiyun reg32 &= ~0xff;
381*4882a593Smuzhiyun reg32 |= plat->power_cycle_delay & 0xff;
382*4882a593Smuzhiyun gtt_write(priv, PCH_PP_DIVISOR, reg32);
383*4882a593Smuzhiyun }
384*4882a593Smuzhiyun
385*4882a593Smuzhiyun /* Enable Backlight if needed */
386*4882a593Smuzhiyun if (plat->cpu_backlight) {
387*4882a593Smuzhiyun gtt_write(priv, BLC_PWM_CPU_CTL2, BLC_PWM2_ENABLE);
388*4882a593Smuzhiyun gtt_write(priv, BLC_PWM_CPU_CTL, plat->cpu_backlight);
389*4882a593Smuzhiyun }
390*4882a593Smuzhiyun if (plat->pch_backlight) {
391*4882a593Smuzhiyun gtt_write(priv, BLC_PWM_PCH_CTL1, BLM_PCH_PWM_ENABLE);
392*4882a593Smuzhiyun gtt_write(priv, BLC_PWM_PCH_CTL2, plat->pch_backlight);
393*4882a593Smuzhiyun }
394*4882a593Smuzhiyun }
395*4882a593Smuzhiyun
igd_cdclk_init_haswell(struct udevice * dev)396*4882a593Smuzhiyun static int igd_cdclk_init_haswell(struct udevice *dev)
397*4882a593Smuzhiyun {
398*4882a593Smuzhiyun struct broadwell_igd_plat *plat = dev_get_platdata(dev);
399*4882a593Smuzhiyun struct broadwell_igd_priv *priv = dev_get_priv(dev);
400*4882a593Smuzhiyun int cdclk = plat->cdclk;
401*4882a593Smuzhiyun u16 devid;
402*4882a593Smuzhiyun int gpu_is_ulx = 0;
403*4882a593Smuzhiyun u32 dpdiv, lpcll;
404*4882a593Smuzhiyun int ret;
405*4882a593Smuzhiyun
406*4882a593Smuzhiyun dm_pci_read_config16(dev, PCI_DEVICE_ID, &devid);
407*4882a593Smuzhiyun
408*4882a593Smuzhiyun /* Check for ULX GT1 or GT2 */
409*4882a593Smuzhiyun if (devid == 0x0a0e || devid == 0x0a1e)
410*4882a593Smuzhiyun gpu_is_ulx = 1;
411*4882a593Smuzhiyun
412*4882a593Smuzhiyun /* 675MHz is not supported on haswell */
413*4882a593Smuzhiyun if (cdclk == GT_CDCLK_675)
414*4882a593Smuzhiyun cdclk = GT_CDCLK_337;
415*4882a593Smuzhiyun
416*4882a593Smuzhiyun /* If CD clock is fixed or ULT then set to 450MHz */
417*4882a593Smuzhiyun if ((gtt_read(priv, 0x42014) & 0x1000000) || cpu_is_ult())
418*4882a593Smuzhiyun cdclk = GT_CDCLK_450;
419*4882a593Smuzhiyun
420*4882a593Smuzhiyun /* 540MHz is not supported on ULX */
421*4882a593Smuzhiyun if (gpu_is_ulx && cdclk == GT_CDCLK_540)
422*4882a593Smuzhiyun cdclk = GT_CDCLK_337;
423*4882a593Smuzhiyun
424*4882a593Smuzhiyun /* 337.5MHz is not supported on non-ULT/ULX */
425*4882a593Smuzhiyun if (!gpu_is_ulx && !cpu_is_ult() && cdclk == GT_CDCLK_337)
426*4882a593Smuzhiyun cdclk = GT_CDCLK_450;
427*4882a593Smuzhiyun
428*4882a593Smuzhiyun /* Set variables based on CD Clock setting */
429*4882a593Smuzhiyun switch (cdclk) {
430*4882a593Smuzhiyun case GT_CDCLK_337:
431*4882a593Smuzhiyun dpdiv = 169;
432*4882a593Smuzhiyun lpcll = (1 << 26);
433*4882a593Smuzhiyun break;
434*4882a593Smuzhiyun case GT_CDCLK_450:
435*4882a593Smuzhiyun dpdiv = 225;
436*4882a593Smuzhiyun lpcll = 0;
437*4882a593Smuzhiyun break;
438*4882a593Smuzhiyun case GT_CDCLK_540:
439*4882a593Smuzhiyun dpdiv = 270;
440*4882a593Smuzhiyun lpcll = (1 << 26);
441*4882a593Smuzhiyun break;
442*4882a593Smuzhiyun default:
443*4882a593Smuzhiyun ret = -EDOM;
444*4882a593Smuzhiyun goto err;
445*4882a593Smuzhiyun }
446*4882a593Smuzhiyun
447*4882a593Smuzhiyun /* Set LPCLL_CTL CD Clock Frequency Select */
448*4882a593Smuzhiyun gtt_clrsetbits(priv, 0x130040, ~0xf3ffffff, lpcll);
449*4882a593Smuzhiyun
450*4882a593Smuzhiyun /* ULX: Inform power controller of selected frequency */
451*4882a593Smuzhiyun if (gpu_is_ulx) {
452*4882a593Smuzhiyun if (cdclk == GT_CDCLK_450)
453*4882a593Smuzhiyun gtt_write(priv, 0x138128, 0x00000000); /* 450MHz */
454*4882a593Smuzhiyun else
455*4882a593Smuzhiyun gtt_write(priv, 0x138128, 0x00000001); /* 337.5MHz */
456*4882a593Smuzhiyun gtt_write(priv, 0x13812c, 0x00000000);
457*4882a593Smuzhiyun gtt_write(priv, 0x138124, 0x80000017);
458*4882a593Smuzhiyun }
459*4882a593Smuzhiyun
460*4882a593Smuzhiyun /* Set CPU DP AUX 2X bit clock dividers */
461*4882a593Smuzhiyun gtt_clrsetbits(priv, 0x64010, ~0xfffff800, dpdiv);
462*4882a593Smuzhiyun gtt_clrsetbits(priv, 0x64810, ~0xfffff800, dpdiv);
463*4882a593Smuzhiyun
464*4882a593Smuzhiyun return 0;
465*4882a593Smuzhiyun err:
466*4882a593Smuzhiyun debug("%s: ret=%d\n", __func__, ret);
467*4882a593Smuzhiyun return ret;
468*4882a593Smuzhiyun }
469*4882a593Smuzhiyun
igd_cdclk_init_broadwell(struct udevice * dev)470*4882a593Smuzhiyun static int igd_cdclk_init_broadwell(struct udevice *dev)
471*4882a593Smuzhiyun {
472*4882a593Smuzhiyun struct broadwell_igd_plat *plat = dev_get_platdata(dev);
473*4882a593Smuzhiyun struct broadwell_igd_priv *priv = dev_get_priv(dev);
474*4882a593Smuzhiyun int cdclk = plat->cdclk;
475*4882a593Smuzhiyun u32 dpdiv, lpcll, pwctl, cdset;
476*4882a593Smuzhiyun int ret;
477*4882a593Smuzhiyun
478*4882a593Smuzhiyun /* Inform power controller of upcoming frequency change */
479*4882a593Smuzhiyun gtt_write(priv, 0x138128, 0);
480*4882a593Smuzhiyun gtt_write(priv, 0x13812c, 0);
481*4882a593Smuzhiyun gtt_write(priv, 0x138124, 0x80000018);
482*4882a593Smuzhiyun
483*4882a593Smuzhiyun /* Poll GT driver mailbox for run/busy clear */
484*4882a593Smuzhiyun if (gtt_poll(priv, 0x138124, 1 << 31, 0 << 31))
485*4882a593Smuzhiyun cdclk = GT_CDCLK_450;
486*4882a593Smuzhiyun
487*4882a593Smuzhiyun if (gtt_read(priv, 0x42014) & 0x1000000) {
488*4882a593Smuzhiyun /* If CD clock is fixed then set to 450MHz */
489*4882a593Smuzhiyun cdclk = GT_CDCLK_450;
490*4882a593Smuzhiyun } else {
491*4882a593Smuzhiyun /* Program CD clock to highest supported freq */
492*4882a593Smuzhiyun if (cpu_is_ult())
493*4882a593Smuzhiyun cdclk = GT_CDCLK_540;
494*4882a593Smuzhiyun else
495*4882a593Smuzhiyun cdclk = GT_CDCLK_675;
496*4882a593Smuzhiyun }
497*4882a593Smuzhiyun
498*4882a593Smuzhiyun /* CD clock frequency 675MHz not supported on ULT */
499*4882a593Smuzhiyun if (cpu_is_ult() && cdclk == GT_CDCLK_675)
500*4882a593Smuzhiyun cdclk = GT_CDCLK_540;
501*4882a593Smuzhiyun
502*4882a593Smuzhiyun /* Set variables based on CD Clock setting */
503*4882a593Smuzhiyun switch (cdclk) {
504*4882a593Smuzhiyun case GT_CDCLK_337:
505*4882a593Smuzhiyun cdset = 337;
506*4882a593Smuzhiyun lpcll = (1 << 27);
507*4882a593Smuzhiyun pwctl = 2;
508*4882a593Smuzhiyun dpdiv = 169;
509*4882a593Smuzhiyun break;
510*4882a593Smuzhiyun case GT_CDCLK_450:
511*4882a593Smuzhiyun cdset = 449;
512*4882a593Smuzhiyun lpcll = 0;
513*4882a593Smuzhiyun pwctl = 0;
514*4882a593Smuzhiyun dpdiv = 225;
515*4882a593Smuzhiyun break;
516*4882a593Smuzhiyun case GT_CDCLK_540:
517*4882a593Smuzhiyun cdset = 539;
518*4882a593Smuzhiyun lpcll = (1 << 26);
519*4882a593Smuzhiyun pwctl = 1;
520*4882a593Smuzhiyun dpdiv = 270;
521*4882a593Smuzhiyun break;
522*4882a593Smuzhiyun case GT_CDCLK_675:
523*4882a593Smuzhiyun cdset = 674;
524*4882a593Smuzhiyun lpcll = (1 << 26) | (1 << 27);
525*4882a593Smuzhiyun pwctl = 3;
526*4882a593Smuzhiyun dpdiv = 338;
527*4882a593Smuzhiyun break;
528*4882a593Smuzhiyun default:
529*4882a593Smuzhiyun ret = -EDOM;
530*4882a593Smuzhiyun goto err;
531*4882a593Smuzhiyun }
532*4882a593Smuzhiyun debug("%s: frequency = %d\n", __func__, cdclk);
533*4882a593Smuzhiyun
534*4882a593Smuzhiyun /* Set LPCLL_CTL CD Clock Frequency Select */
535*4882a593Smuzhiyun gtt_clrsetbits(priv, 0x130040, ~0xf3ffffff, lpcll);
536*4882a593Smuzhiyun
537*4882a593Smuzhiyun /* Inform power controller of selected frequency */
538*4882a593Smuzhiyun gtt_write(priv, 0x138128, pwctl);
539*4882a593Smuzhiyun gtt_write(priv, 0x13812c, 0);
540*4882a593Smuzhiyun gtt_write(priv, 0x138124, 0x80000017);
541*4882a593Smuzhiyun
542*4882a593Smuzhiyun /* Program CD Clock Frequency */
543*4882a593Smuzhiyun gtt_clrsetbits(priv, 0x46200, ~0xfffffc00, cdset);
544*4882a593Smuzhiyun
545*4882a593Smuzhiyun /* Set CPU DP AUX 2X bit clock dividers */
546*4882a593Smuzhiyun gtt_clrsetbits(priv, 0x64010, ~0xfffff800, dpdiv);
547*4882a593Smuzhiyun gtt_clrsetbits(priv, 0x64810, ~0xfffff800, dpdiv);
548*4882a593Smuzhiyun
549*4882a593Smuzhiyun return 0;
550*4882a593Smuzhiyun err:
551*4882a593Smuzhiyun debug("%s: ret=%d\n", __func__, ret);
552*4882a593Smuzhiyun return ret;
553*4882a593Smuzhiyun }
554*4882a593Smuzhiyun
systemagent_revision(struct udevice * bus)555*4882a593Smuzhiyun u8 systemagent_revision(struct udevice *bus)
556*4882a593Smuzhiyun {
557*4882a593Smuzhiyun ulong val;
558*4882a593Smuzhiyun
559*4882a593Smuzhiyun pci_bus_read_config(bus, PCI_BDF(0, 0, 0), PCI_REVISION_ID, &val,
560*4882a593Smuzhiyun PCI_SIZE_32);
561*4882a593Smuzhiyun
562*4882a593Smuzhiyun return val;
563*4882a593Smuzhiyun }
564*4882a593Smuzhiyun
igd_pre_init(struct udevice * dev,bool is_broadwell)565*4882a593Smuzhiyun static int igd_pre_init(struct udevice *dev, bool is_broadwell)
566*4882a593Smuzhiyun {
567*4882a593Smuzhiyun struct broadwell_igd_plat *plat = dev_get_platdata(dev);
568*4882a593Smuzhiyun struct broadwell_igd_priv *priv = dev_get_priv(dev);
569*4882a593Smuzhiyun u32 rp1_gfx_freq;
570*4882a593Smuzhiyun int ret;
571*4882a593Smuzhiyun
572*4882a593Smuzhiyun mdelay(plat->pre_graphics_delay);
573*4882a593Smuzhiyun
574*4882a593Smuzhiyun /* Early init steps */
575*4882a593Smuzhiyun if (is_broadwell) {
576*4882a593Smuzhiyun ret = broadwell_early_init(dev);
577*4882a593Smuzhiyun if (ret)
578*4882a593Smuzhiyun goto err;
579*4882a593Smuzhiyun
580*4882a593Smuzhiyun /* Set GFXPAUSE based on stepping */
581*4882a593Smuzhiyun if (cpu_get_stepping() <= (CPUID_BROADWELL_E0 & 0xf) &&
582*4882a593Smuzhiyun systemagent_revision(pci_get_controller(dev)) <= 9) {
583*4882a593Smuzhiyun gtt_write(priv, 0xa000, 0x300ff);
584*4882a593Smuzhiyun } else {
585*4882a593Smuzhiyun gtt_write(priv, 0xa000, 0x30020);
586*4882a593Smuzhiyun }
587*4882a593Smuzhiyun } else {
588*4882a593Smuzhiyun ret = haswell_early_init(dev);
589*4882a593Smuzhiyun if (ret)
590*4882a593Smuzhiyun goto err;
591*4882a593Smuzhiyun }
592*4882a593Smuzhiyun
593*4882a593Smuzhiyun /* Set RP1 graphics frequency */
594*4882a593Smuzhiyun rp1_gfx_freq = (readl(MCHBAR_REG(0x5998)) >> 8) & 0xff;
595*4882a593Smuzhiyun gtt_write(priv, 0xa008, rp1_gfx_freq << 24);
596*4882a593Smuzhiyun
597*4882a593Smuzhiyun /* Post VBIOS panel setup */
598*4882a593Smuzhiyun igd_setup_panel(dev);
599*4882a593Smuzhiyun
600*4882a593Smuzhiyun return 0;
601*4882a593Smuzhiyun err:
602*4882a593Smuzhiyun debug("%s: ret=%d\n", __func__, ret);
603*4882a593Smuzhiyun return ret;
604*4882a593Smuzhiyun }
605*4882a593Smuzhiyun
igd_post_init(struct udevice * dev,bool is_broadwell)606*4882a593Smuzhiyun static int igd_post_init(struct udevice *dev, bool is_broadwell)
607*4882a593Smuzhiyun {
608*4882a593Smuzhiyun int ret;
609*4882a593Smuzhiyun
610*4882a593Smuzhiyun /* Late init steps */
611*4882a593Smuzhiyun if (is_broadwell) {
612*4882a593Smuzhiyun ret = igd_cdclk_init_broadwell(dev);
613*4882a593Smuzhiyun if (ret)
614*4882a593Smuzhiyun return ret;
615*4882a593Smuzhiyun ret = broadwell_late_init(dev);
616*4882a593Smuzhiyun if (ret)
617*4882a593Smuzhiyun return ret;
618*4882a593Smuzhiyun } else {
619*4882a593Smuzhiyun igd_cdclk_init_haswell(dev);
620*4882a593Smuzhiyun ret = haswell_late_init(dev);
621*4882a593Smuzhiyun if (ret)
622*4882a593Smuzhiyun return ret;
623*4882a593Smuzhiyun }
624*4882a593Smuzhiyun
625*4882a593Smuzhiyun return 0;
626*4882a593Smuzhiyun }
627*4882a593Smuzhiyun
broadwell_igd_int15_handler(void)628*4882a593Smuzhiyun static int broadwell_igd_int15_handler(void)
629*4882a593Smuzhiyun {
630*4882a593Smuzhiyun int res = 0;
631*4882a593Smuzhiyun
632*4882a593Smuzhiyun debug("%s: INT15 function %04x!\n", __func__, M.x86.R_AX);
633*4882a593Smuzhiyun
634*4882a593Smuzhiyun switch (M.x86.R_AX) {
635*4882a593Smuzhiyun case 0x5f35:
636*4882a593Smuzhiyun /*
637*4882a593Smuzhiyun * Boot Display Device Hook:
638*4882a593Smuzhiyun * bit 0 = CRT
639*4882a593Smuzhiyun * bit 1 = TV (eDP)
640*4882a593Smuzhiyun * bit 2 = EFP
641*4882a593Smuzhiyun * bit 3 = LFP
642*4882a593Smuzhiyun * bit 4 = CRT2
643*4882a593Smuzhiyun * bit 5 = TV2 (eDP)
644*4882a593Smuzhiyun * bit 6 = EFP2
645*4882a593Smuzhiyun * bit 7 = LFP2
646*4882a593Smuzhiyun */
647*4882a593Smuzhiyun M.x86.R_AX = 0x005f;
648*4882a593Smuzhiyun M.x86.R_CX = 0x0000; /* Use video bios default */
649*4882a593Smuzhiyun res = 1;
650*4882a593Smuzhiyun break;
651*4882a593Smuzhiyun default:
652*4882a593Smuzhiyun debug("Unknown INT15 function %04x!\n", M.x86.R_AX);
653*4882a593Smuzhiyun break;
654*4882a593Smuzhiyun }
655*4882a593Smuzhiyun
656*4882a593Smuzhiyun return res;
657*4882a593Smuzhiyun }
658*4882a593Smuzhiyun
broadwell_igd_probe(struct udevice * dev)659*4882a593Smuzhiyun static int broadwell_igd_probe(struct udevice *dev)
660*4882a593Smuzhiyun {
661*4882a593Smuzhiyun struct video_uc_platdata *plat = dev_get_uclass_platdata(dev);
662*4882a593Smuzhiyun struct video_priv *uc_priv = dev_get_uclass_priv(dev);
663*4882a593Smuzhiyun bool is_broadwell;
664*4882a593Smuzhiyun int ret;
665*4882a593Smuzhiyun
666*4882a593Smuzhiyun if (!ll_boot_init()) {
667*4882a593Smuzhiyun /*
668*4882a593Smuzhiyun * If we are running from EFI or coreboot, this driver can't
669*4882a593Smuzhiyun * work.
670*4882a593Smuzhiyun */
671*4882a593Smuzhiyun printf("Not available (previous bootloader prevents it)\n");
672*4882a593Smuzhiyun return -EPERM;
673*4882a593Smuzhiyun }
674*4882a593Smuzhiyun is_broadwell = cpu_get_family_model() == BROADWELL_FAMILY_ULT;
675*4882a593Smuzhiyun bootstage_start(BOOTSTAGE_ID_ACCUM_LCD, "vesa display");
676*4882a593Smuzhiyun debug("%s: is_broadwell=%d\n", __func__, is_broadwell);
677*4882a593Smuzhiyun ret = igd_pre_init(dev, is_broadwell);
678*4882a593Smuzhiyun if (!ret) {
679*4882a593Smuzhiyun ret = vbe_setup_video(dev, broadwell_igd_int15_handler);
680*4882a593Smuzhiyun if (ret)
681*4882a593Smuzhiyun debug("failed to run video BIOS: %d\n", ret);
682*4882a593Smuzhiyun }
683*4882a593Smuzhiyun if (!ret)
684*4882a593Smuzhiyun ret = igd_post_init(dev, is_broadwell);
685*4882a593Smuzhiyun bootstage_accum(BOOTSTAGE_ID_ACCUM_LCD);
686*4882a593Smuzhiyun if (ret)
687*4882a593Smuzhiyun return ret;
688*4882a593Smuzhiyun
689*4882a593Smuzhiyun /* Use write-combining for the graphics memory, 256MB */
690*4882a593Smuzhiyun ret = mtrr_add_request(MTRR_TYPE_WRCOMB, plat->base, 256 << 20);
691*4882a593Smuzhiyun if (!ret)
692*4882a593Smuzhiyun ret = mtrr_commit(true);
693*4882a593Smuzhiyun if (ret && ret != -ENOSYS) {
694*4882a593Smuzhiyun printf("Failed to add MTRR: Display will be slow (err %d)\n",
695*4882a593Smuzhiyun ret);
696*4882a593Smuzhiyun }
697*4882a593Smuzhiyun
698*4882a593Smuzhiyun debug("fb=%lx, size %x, display size=%d %d %d\n", plat->base,
699*4882a593Smuzhiyun plat->size, uc_priv->xsize, uc_priv->ysize, uc_priv->bpix);
700*4882a593Smuzhiyun
701*4882a593Smuzhiyun return 0;
702*4882a593Smuzhiyun }
703*4882a593Smuzhiyun
broadwell_igd_ofdata_to_platdata(struct udevice * dev)704*4882a593Smuzhiyun static int broadwell_igd_ofdata_to_platdata(struct udevice *dev)
705*4882a593Smuzhiyun {
706*4882a593Smuzhiyun struct broadwell_igd_plat *plat = dev_get_platdata(dev);
707*4882a593Smuzhiyun struct broadwell_igd_priv *priv = dev_get_priv(dev);
708*4882a593Smuzhiyun int node = dev_of_offset(dev);
709*4882a593Smuzhiyun const void *blob = gd->fdt_blob;
710*4882a593Smuzhiyun
711*4882a593Smuzhiyun if (fdtdec_get_int_array(blob, node, "intel,dp-hotplug",
712*4882a593Smuzhiyun plat->dp_hotplug,
713*4882a593Smuzhiyun ARRAY_SIZE(plat->dp_hotplug)))
714*4882a593Smuzhiyun return -EINVAL;
715*4882a593Smuzhiyun plat->port_select = fdtdec_get_int(blob, node, "intel,port-select", 0);
716*4882a593Smuzhiyun plat->power_cycle_delay = fdtdec_get_int(blob, node,
717*4882a593Smuzhiyun "intel,power-cycle-delay", 0);
718*4882a593Smuzhiyun plat->power_up_delay = fdtdec_get_int(blob, node,
719*4882a593Smuzhiyun "intel,power-up-delay", 0);
720*4882a593Smuzhiyun plat->power_down_delay = fdtdec_get_int(blob, node,
721*4882a593Smuzhiyun "intel,power-down-delay", 0);
722*4882a593Smuzhiyun plat->power_backlight_on_delay = fdtdec_get_int(blob, node,
723*4882a593Smuzhiyun "intel,power-backlight-on-delay", 0);
724*4882a593Smuzhiyun plat->power_backlight_off_delay = fdtdec_get_int(blob, node,
725*4882a593Smuzhiyun "intel,power-backlight-off-delay", 0);
726*4882a593Smuzhiyun plat->cpu_backlight = fdtdec_get_int(blob, node,
727*4882a593Smuzhiyun "intel,cpu-backlight", 0);
728*4882a593Smuzhiyun plat->pch_backlight = fdtdec_get_int(blob, node,
729*4882a593Smuzhiyun "intel,pch-backlight", 0);
730*4882a593Smuzhiyun plat->pre_graphics_delay = fdtdec_get_int(blob, node,
731*4882a593Smuzhiyun "intel,pre-graphics-delay", 0);
732*4882a593Smuzhiyun priv->regs = (u8 *)dm_pci_read_bar32(dev, 0);
733*4882a593Smuzhiyun debug("%s: regs at %p\n", __func__, priv->regs);
734*4882a593Smuzhiyun debug("dp_hotplug %d %d %d\n", plat->dp_hotplug[0], plat->dp_hotplug[1],
735*4882a593Smuzhiyun plat->dp_hotplug[2]);
736*4882a593Smuzhiyun debug("port_select = %d\n", plat->port_select);
737*4882a593Smuzhiyun debug("power_up_delay = %d\n", plat->power_up_delay);
738*4882a593Smuzhiyun debug("power_backlight_on_delay = %d\n",
739*4882a593Smuzhiyun plat->power_backlight_on_delay);
740*4882a593Smuzhiyun debug("power_down_delay = %d\n", plat->power_down_delay);
741*4882a593Smuzhiyun debug("power_backlight_off_delay = %d\n",
742*4882a593Smuzhiyun plat->power_backlight_off_delay);
743*4882a593Smuzhiyun debug("power_cycle_delay = %d\n", plat->power_cycle_delay);
744*4882a593Smuzhiyun debug("cpu_backlight = %x\n", plat->cpu_backlight);
745*4882a593Smuzhiyun debug("pch_backlight = %x\n", plat->pch_backlight);
746*4882a593Smuzhiyun debug("cdclk = %d\n", plat->cdclk);
747*4882a593Smuzhiyun debug("pre_graphics_delay = %d\n", plat->pre_graphics_delay);
748*4882a593Smuzhiyun
749*4882a593Smuzhiyun return 0;
750*4882a593Smuzhiyun }
751*4882a593Smuzhiyun
752*4882a593Smuzhiyun static const struct video_ops broadwell_igd_ops = {
753*4882a593Smuzhiyun };
754*4882a593Smuzhiyun
755*4882a593Smuzhiyun static const struct udevice_id broadwell_igd_ids[] = {
756*4882a593Smuzhiyun { .compatible = "intel,broadwell-igd" },
757*4882a593Smuzhiyun { }
758*4882a593Smuzhiyun };
759*4882a593Smuzhiyun
760*4882a593Smuzhiyun U_BOOT_DRIVER(broadwell_igd) = {
761*4882a593Smuzhiyun .name = "broadwell_igd",
762*4882a593Smuzhiyun .id = UCLASS_VIDEO,
763*4882a593Smuzhiyun .of_match = broadwell_igd_ids,
764*4882a593Smuzhiyun .ops = &broadwell_igd_ops,
765*4882a593Smuzhiyun .ofdata_to_platdata = broadwell_igd_ofdata_to_platdata,
766*4882a593Smuzhiyun .probe = broadwell_igd_probe,
767*4882a593Smuzhiyun .priv_auto_alloc_size = sizeof(struct broadwell_igd_priv),
768*4882a593Smuzhiyun .platdata_auto_alloc_size = sizeof(struct broadwell_igd_plat),
769*4882a593Smuzhiyun };
770