Blame view

drivers/video/mb862xx.c 11.4 KB
bed53753d   Anatolij Gustschin   Add Fujitsu Coral...
1
2
3
4
  /*
   * (C) Copyright 2007
   * DENX Software Engineering, Anatolij Gustschin, agust@denx.de
   *
1a4596601   Wolfgang Denk   Add GPL-2.0+ SPDX...
5
   * SPDX-License-Identifier:	GPL-2.0+
bed53753d   Anatolij Gustschin   Add Fujitsu Coral...
6
7
8
9
10
11
12
13
   */
  
  /*
   * mb862xx.c - Graphic interface for Fujitsu CoralP/Lime
   * PCI and video mode code was derived from smiLynxEM driver.
   */
  
  #include <common.h>
bed53753d   Anatolij Gustschin   Add Fujitsu Coral...
14
15
16
17
18
  #include <asm/io.h>
  #include <pci.h>
  #include <video_fb.h>
  #include "videomodes.h"
  #include <mb862xx.h>
0d48926c8   Yuri Tikhonov   lwmon5 SYSMON POS...
19
20
21
  #if defined(CONFIG_POST)
  #include <post.h>
  #endif
e86528671   Anatolij Gustschin   video: mb862xx: f...
22

bed53753d   Anatolij Gustschin   Add Fujitsu Coral...
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
  /*
   * Graphic Device
   */
  GraphicDevice mb862xx;
  
  /*
   * 32MB external RAM - 256K Chip MMIO = 0x1FC0000 ;
   */
  #define VIDEO_MEM_SIZE	0x01FC0000
  
  #if defined(CONFIG_PCI)
  #if defined(CONFIG_VIDEO_CORALP)
  
  static struct pci_device_id supported[] = {
  	{ PCI_VENDOR_ID_FUJITSU, PCI_DEVICE_ID_CORAL_P },
  	{ PCI_VENDOR_ID_FUJITSU, PCI_DEVICE_ID_CORAL_PA },
  	{ }
  };
  
  /* Internal clock frequency divider table, index is mode number */
  unsigned int fr_div[] = { 0x00000f00, 0x00000900, 0x00000500 };
  #endif
  #endif
  
  #if defined(CONFIG_VIDEO_CORALP)
  #define	rd_io		in32r
  #define	wr_io		out32r
  #else
e86528671   Anatolij Gustschin   video: mb862xx: f...
51
52
  #define	rd_io(addr)	in_be32((volatile unsigned *)(addr))
  #define	wr_io(addr, val)	out_be32((volatile unsigned *)(addr), (val))
bed53753d   Anatolij Gustschin   Add Fujitsu Coral...
53
  #endif
cce99b2a7   Anatolij Gustschin   video: mb862xx: u...
54
55
  #define HOST_RD_REG(off)	rd_io((dev->frameAdrs + GC_HOST_BASE + (off)))
  #define HOST_WR_REG(off, val)	wr_io((dev->frameAdrs + GC_HOST_BASE + (off)), \
e86528671   Anatolij Gustschin   video: mb862xx: f...
56
  				      (val))
cce99b2a7   Anatolij Gustschin   video: mb862xx: u...
57
58
  #define DISP_RD_REG(off)	rd_io((dev->frameAdrs + GC_DISP_BASE + (off)))
  #define DISP_WR_REG(off, val)	wr_io((dev->frameAdrs + GC_DISP_BASE + (off)), \
e86528671   Anatolij Gustschin   video: mb862xx: f...
59
60
61
  				      (val))
  #define DE_RD_REG(off)		rd_io((dev->dprBase + (off)))
  #define DE_WR_REG(off, val)	wr_io((dev->dprBase + (off)), (val))
bed53753d   Anatolij Gustschin   Add Fujitsu Coral...
62
63
  
  #if defined(CONFIG_VIDEO_CORALP)
cce99b2a7   Anatolij Gustschin   video: mb862xx: u...
64
  #define DE_WR_FIFO(val)		wr_io((dev->dprBase + (GC_GEO_FIFO)), (val))
bed53753d   Anatolij Gustschin   Add Fujitsu Coral...
65
  #else
cce99b2a7   Anatolij Gustschin   video: mb862xx: u...
66
  #define DE_WR_FIFO(val)		wr_io((dev->dprBase + (GC_FIFO)), (val))
bed53753d   Anatolij Gustschin   Add Fujitsu Coral...
67
  #endif
cce99b2a7   Anatolij Gustschin   video: mb862xx: u...
68
69
  #define L0PAL_WR_REG(idx, val)	wr_io((dev->frameAdrs + \
  				       (GC_DISP_BASE | GC_L0PAL0) + \
e86528671   Anatolij Gustschin   video: mb862xx: f...
70
  				       ((idx) << 2)), (val))
bed53753d   Anatolij Gustschin   Add Fujitsu Coral...
71

5d16ca871   Anatolij Gustschin   video: mb862xx: a...
72
  #if defined(CONFIG_VIDEO_MB862xx_ACCEL)
e86528671   Anatolij Gustschin   video: mb862xx: f...
73
  static void gdc_sw_reset (void)
bed53753d   Anatolij Gustschin   Add Fujitsu Coral...
74
  {
e86528671   Anatolij Gustschin   video: mb862xx: f...
75
  	GraphicDevice *dev = &mb862xx;
cce99b2a7   Anatolij Gustschin   video: mb862xx: u...
76
  	HOST_WR_REG (GC_SRST, 0x1);
bed53753d   Anatolij Gustschin   Add Fujitsu Coral...
77
78
79
  	udelay (500);
  	video_hw_init ();
  }
e86528671   Anatolij Gustschin   video: mb862xx: f...
80
  static void de_wait (void)
bed53753d   Anatolij Gustschin   Add Fujitsu Coral...
81
  {
e86528671   Anatolij Gustschin   video: mb862xx: f...
82
  	GraphicDevice *dev = &mb862xx;
bed53753d   Anatolij Gustschin   Add Fujitsu Coral...
83
  	int lc = 0x10000;
e86528671   Anatolij Gustschin   video: mb862xx: f...
84
85
86
87
  	/*
  	 * Sync with software writes to framebuffer,
  	 * try to reset if engine locked
  	 */
cce99b2a7   Anatolij Gustschin   video: mb862xx: u...
88
  	while (DE_RD_REG (GC_CTR) & 0x00000131)
bed53753d   Anatolij Gustschin   Add Fujitsu Coral...
89
90
  		if (lc-- < 0) {
  			gdc_sw_reset ();
9d173e023   Anatolij Gustschin   video: mb862xx: r...
91
92
  			puts ("gdc reset done after drawing engine lock.
  ");
bed53753d   Anatolij Gustschin   Add Fujitsu Coral...
93
94
95
  			break;
  		}
  }
e86528671   Anatolij Gustschin   video: mb862xx: f...
96
  static void de_wait_slots (int slots)
bed53753d   Anatolij Gustschin   Add Fujitsu Coral...
97
  {
e86528671   Anatolij Gustschin   video: mb862xx: f...
98
  	GraphicDevice *dev = &mb862xx;
bed53753d   Anatolij Gustschin   Add Fujitsu Coral...
99
100
101
  	int lc = 0x10000;
  
  	/* Wait for free fifo slots */
cce99b2a7   Anatolij Gustschin   video: mb862xx: u...
102
  	while (DE_RD_REG (GC_IFCNT) < slots)
bed53753d   Anatolij Gustschin   Add Fujitsu Coral...
103
104
  		if (lc-- < 0) {
  			gdc_sw_reset ();
9d173e023   Anatolij Gustschin   video: mb862xx: r...
105
106
  			puts ("gdc reset done after drawing engine lock.
  ");
bed53753d   Anatolij Gustschin   Add Fujitsu Coral...
107
108
109
  			break;
  		}
  }
5d16ca871   Anatolij Gustschin   video: mb862xx: a...
110
  #endif
bed53753d   Anatolij Gustschin   Add Fujitsu Coral...
111
112
  
  #if !defined(CONFIG_VIDEO_CORALP)
e86528671   Anatolij Gustschin   video: mb862xx: f...
113
  static void board_disp_init (void)
bed53753d   Anatolij Gustschin   Add Fujitsu Coral...
114
  {
e86528671   Anatolij Gustschin   video: mb862xx: f...
115
  	GraphicDevice *dev = &mb862xx;
bed53753d   Anatolij Gustschin   Add Fujitsu Coral...
116
117
118
119
120
121
122
123
124
125
  	const gdc_regs *regs = board_get_regs ();
  
  	while (regs->index) {
  		DISP_WR_REG (regs->index, regs->value);
  		regs++;
  	}
  }
  #endif
  
  /*
5d16ca871   Anatolij Gustschin   video: mb862xx: a...
126
127
   * Init drawing engine if accel enabled.
   * Also clears visible framebuffer.
bed53753d   Anatolij Gustschin   Add Fujitsu Coral...
128
129
130
   */
  static void de_init (void)
  {
e86528671   Anatolij Gustschin   video: mb862xx: f...
131
  	GraphicDevice *dev = &mb862xx;
5d16ca871   Anatolij Gustschin   video: mb862xx: a...
132
  #if defined(CONFIG_VIDEO_MB862xx_ACCEL)
e86528671   Anatolij Gustschin   video: mb862xx: f...
133
  	int cf = (dev->gdfBytesPP == 1) ? 0x0000 : 0x8000;
bed53753d   Anatolij Gustschin   Add Fujitsu Coral...
134

cce99b2a7   Anatolij Gustschin   video: mb862xx: u...
135
  	dev->dprBase = dev->frameAdrs + GC_DRAW_BASE;
bed53753d   Anatolij Gustschin   Add Fujitsu Coral...
136
137
138
139
140
  
  	/* Setup mode and fbbase, xres, fg, bg */
  	de_wait_slots (2);
  	DE_WR_FIFO (0xf1010108);
  	DE_WR_FIFO (cf | 0x0300);
cce99b2a7   Anatolij Gustschin   video: mb862xx: u...
141
142
143
144
  	DE_WR_REG (GC_FBR, 0x0);
  	DE_WR_REG (GC_XRES, dev->winSizeX);
  	DE_WR_REG (GC_FC, 0x0);
  	DE_WR_REG (GC_BC, 0x0);
bed53753d   Anatolij Gustschin   Add Fujitsu Coral...
145
  	/* Reset clipping */
cce99b2a7   Anatolij Gustschin   video: mb862xx: u...
146
147
148
149
  	DE_WR_REG (GC_CXMIN, 0x0);
  	DE_WR_REG (GC_CXMAX, dev->winSizeX);
  	DE_WR_REG (GC_CYMIN, 0x0);
  	DE_WR_REG (GC_CYMAX, dev->winSizeY);
bed53753d   Anatolij Gustschin   Add Fujitsu Coral...
150
151
152
153
154
  
  	/* Clear framebuffer using drawing engine */
  	de_wait_slots (3);
  	DE_WR_FIFO (0x09410000);
  	DE_WR_FIFO (0x00000000);
e86528671   Anatolij Gustschin   video: mb862xx: f...
155
  	DE_WR_FIFO (dev->winSizeY << 16 | dev->winSizeX);
322716a1d   Anatolij Gustschin   Fix bug in Lime v...
156
157
  	/* sync with SW access to framebuffer */
  	de_wait ();
5d16ca871   Anatolij Gustschin   video: mb862xx: a...
158
159
160
161
162
163
164
165
  #else
  	unsigned int i, *p;
  
  	i = dev->winSizeX * dev->winSizeY;
  	p = (unsigned int *)dev->frameAdrs;
  	while (i--)
  		*p++ = 0;
  #endif
bed53753d   Anatolij Gustschin   Add Fujitsu Coral...
166
167
168
  }
  
  #if defined(CONFIG_VIDEO_CORALP)
d7ffd27a6   Anatolij Gustschin   video: mb862xx: s...
169
170
171
172
173
174
175
  /* use CCF and MMR parameters for Coral-P Eval. Board as default */
  #ifndef CONFIG_SYS_MB862xx_CCF
  #define CONFIG_SYS_MB862xx_CCF	0x00090000
  #endif
  #ifndef CONFIG_SYS_MB862xx_MMR
  #define CONFIG_SYS_MB862xx_MMR	0x11d7fa13
  #endif
e86528671   Anatolij Gustschin   video: mb862xx: f...
176
  unsigned int pci_video_init (void)
bed53753d   Anatolij Gustschin   Add Fujitsu Coral...
177
  {
e86528671   Anatolij Gustschin   video: mb862xx: f...
178
  	GraphicDevice *dev = &mb862xx;
bed53753d   Anatolij Gustschin   Add Fujitsu Coral...
179
  	pci_dev_t devbusfn;
d7ffd27a6   Anatolij Gustschin   video: mb862xx: s...
180
  	u16 device;
bed53753d   Anatolij Gustschin   Add Fujitsu Coral...
181

e86528671   Anatolij Gustschin   video: mb862xx: f...
182
  	if ((devbusfn = pci_find_devices (supported, 0)) < 0) {
01b0f5006   Anatolij Gustschin   video: mb862xx: c...
183
184
  		puts("controller not present
  ");
bed53753d   Anatolij Gustschin   Add Fujitsu Coral...
185
186
187
188
  		return 0;
  	}
  
  	/* PCI setup */
e86528671   Anatolij Gustschin   video: mb862xx: f...
189
190
191
192
  	pci_write_config_dword (devbusfn, PCI_COMMAND,
  				(PCI_COMMAND_MEMORY | PCI_COMMAND_IO));
  	pci_read_config_dword (devbusfn, PCI_BASE_ADDRESS_0, &dev->frameAdrs);
  	dev->frameAdrs = pci_mem_to_phys (devbusfn, dev->frameAdrs);
bed53753d   Anatolij Gustschin   Add Fujitsu Coral...
193

e86528671   Anatolij Gustschin   video: mb862xx: f...
194
  	if (dev->frameAdrs == 0) {
9d173e023   Anatolij Gustschin   video: mb862xx: r...
195
196
  		puts ("PCI config: failed to get base address
  ");
bed53753d   Anatolij Gustschin   Add Fujitsu Coral...
197
198
  		return 0;
  	}
e86528671   Anatolij Gustschin   video: mb862xx: f...
199
  	dev->pciBase = dev->frameAdrs;
bed53753d   Anatolij Gustschin   Add Fujitsu Coral...
200

d7ffd27a6   Anatolij Gustschin   video: mb862xx: s...
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
  	puts("Coral-");
  
  	pci_read_config_word(devbusfn, PCI_DEVICE_ID, &device);
  	switch (device) {
  	case PCI_DEVICE_ID_CORAL_P:
  		puts("P
  ");
  		break;
  	case PCI_DEVICE_ID_CORAL_PA:
  		puts("PA
  ");
  		break;
  	default:
  		puts("Unknown
  ");
  		return 0;
  	}
  
  	/* Setup clocks and memory mode for Coral-P(A) */
  	HOST_WR_REG(GC_CCF, CONFIG_SYS_MB862xx_CCF);
bed53753d   Anatolij Gustschin   Add Fujitsu Coral...
221
  	udelay (200);
d7ffd27a6   Anatolij Gustschin   video: mb862xx: s...
222
  	HOST_WR_REG(GC_MMR, CONFIG_SYS_MB862xx_MMR);
bed53753d   Anatolij Gustschin   Add Fujitsu Coral...
223
  	udelay (100);
e86528671   Anatolij Gustschin   video: mb862xx: f...
224
  	return dev->frameAdrs;
bed53753d   Anatolij Gustschin   Add Fujitsu Coral...
225
226
227
228
  }
  
  unsigned int card_init (void)
  {
e86528671   Anatolij Gustschin   video: mb862xx: f...
229
  	GraphicDevice *dev = &mb862xx;
bed53753d   Anatolij Gustschin   Add Fujitsu Coral...
230
231
232
233
234
235
  	unsigned int cf, videomode, div = 0;
  	unsigned long t1, hsync, vsync;
  	char *penv;
  	int tmp, i, bpp;
  	struct ctfb_res_modes *res_mode;
  	struct ctfb_res_modes var_mode;
e86528671   Anatolij Gustschin   video: mb862xx: f...
236
  	memset (dev, 0, sizeof (GraphicDevice));
bed53753d   Anatolij Gustschin   Add Fujitsu Coral...
237

e86528671   Anatolij Gustschin   video: mb862xx: f...
238
  	if (!pci_video_init ())
bed53753d   Anatolij Gustschin   Add Fujitsu Coral...
239
  		return 0;
bed53753d   Anatolij Gustschin   Add Fujitsu Coral...
240

bed53753d   Anatolij Gustschin   Add Fujitsu Coral...
241
242
243
244
  	tmp = 0;
  	videomode = 0x310;
  	/* get video mode via environment */
  	if ((penv = getenv ("videomode")) != NULL) {
e86528671   Anatolij Gustschin   video: mb862xx: f...
245
  		/* decide if it is a string */
bed53753d   Anatolij Gustschin   Add Fujitsu Coral...
246
247
248
249
250
251
252
  		if (penv[0] <= '9') {
  			videomode = (int) simple_strtoul (penv, NULL, 16);
  			tmp = 1;
  		}
  	} else {
  		tmp = 1;
  	}
e86528671   Anatolij Gustschin   video: mb862xx: f...
253

bed53753d   Anatolij Gustschin   Add Fujitsu Coral...
254
  	if (tmp) {
e86528671   Anatolij Gustschin   video: mb862xx: f...
255
  		/* parameter are vesa modes, search params */
bed53753d   Anatolij Gustschin   Add Fujitsu Coral...
256
257
258
259
260
  		for (i = 0; i < VESA_MODES_COUNT; i++) {
  			if (vesa_modes[i].vesanr == videomode)
  				break;
  		}
  		if (i == VESA_MODES_COUNT) {
e86528671   Anatolij Gustschin   video: mb862xx: f...
261
262
263
  			printf ("\tno VESA Mode found, fallback to mode 0x%x
  ",
  				videomode);
bed53753d   Anatolij Gustschin   Add Fujitsu Coral...
264
265
  			i = 0;
  		}
e86528671   Anatolij Gustschin   video: mb862xx: f...
266
267
  		res_mode = (struct ctfb_res_modes *)
  			   &res_mode_init[vesa_modes[i].resindex];
bed53753d   Anatolij Gustschin   Add Fujitsu Coral...
268
  		if (vesa_modes[i].resindex > 2) {
9d173e023   Anatolij Gustschin   video: mb862xx: r...
269
270
  			puts ("\tUnsupported resolution, using default
  ");
bed53753d   Anatolij Gustschin   Add Fujitsu Coral...
271
272
273
274
275
276
  			bpp = vesa_modes[1].bits_per_pixel;
  			div = fr_div[1];
  		}
  		bpp = vesa_modes[i].bits_per_pixel;
  		div = fr_div[vesa_modes[i].resindex];
  	} else {
bed53753d   Anatolij Gustschin   Add Fujitsu Coral...
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
  		res_mode = (struct ctfb_res_modes *) &var_mode;
  		bpp = video_get_params (res_mode, penv);
  	}
  
  	/* calculate hsync and vsync freq (info only) */
  	t1 = (res_mode->left_margin + res_mode->xres +
  	      res_mode->right_margin + res_mode->hsync_len) / 8;
  	t1 *= 8;
  	t1 *= res_mode->pixclock;
  	t1 /= 1000;
  	hsync = 1000000000L / t1;
  	t1 *= (res_mode->upper_margin + res_mode->yres +
  	       res_mode->lower_margin + res_mode->vsync_len);
  	t1 /= 1000;
  	vsync = 1000000000L / t1;
  
  	/* fill in Graphic device struct */
e86528671   Anatolij Gustschin   video: mb862xx: f...
294
  	sprintf (dev->modeIdent, "%dx%dx%d %ldkHz %ldHz", res_mode->xres,
bed53753d   Anatolij Gustschin   Add Fujitsu Coral...
295
  		 res_mode->yres, bpp, (hsync / 1000), (vsync / 1000));
e86528671   Anatolij Gustschin   video: mb862xx: f...
296
297
298
299
300
  	printf ("\t%s
  ", dev->modeIdent);
  	dev->winSizeX = res_mode->xres;
  	dev->winSizeY = res_mode->yres;
  	dev->memSize = VIDEO_MEM_SIZE;
bed53753d   Anatolij Gustschin   Add Fujitsu Coral...
301
302
303
  
  	switch (bpp) {
  	case 8:
e86528671   Anatolij Gustschin   video: mb862xx: f...
304
305
  		dev->gdfIndex = GDF__8BIT_INDEX;
  		dev->gdfBytesPP = 1;
bed53753d   Anatolij Gustschin   Add Fujitsu Coral...
306
307
308
  		break;
  	case 15:
  	case 16:
e86528671   Anatolij Gustschin   video: mb862xx: f...
309
310
  		dev->gdfIndex = GDF_15BIT_555RGB;
  		dev->gdfBytesPP = 2;
bed53753d   Anatolij Gustschin   Add Fujitsu Coral...
311
312
  		break;
  	default:
e86528671   Anatolij Gustschin   video: mb862xx: f...
313
314
315
  		printf ("\t%d bpp configured, but only 8,15 and 16 supported
  ",
  			bpp);
9d173e023   Anatolij Gustschin   video: mb862xx: r...
316
317
  		puts ("\tfallback to 15bpp
  ");
e86528671   Anatolij Gustschin   video: mb862xx: f...
318
319
  		dev->gdfIndex = GDF_15BIT_555RGB;
  		dev->gdfBytesPP = 2;
bed53753d   Anatolij Gustschin   Add Fujitsu Coral...
320
321
322
  	}
  
  	/* Setup dot clock (internal pll, division rate) */
cce99b2a7   Anatolij Gustschin   video: mb862xx: u...
323
  	DISP_WR_REG (GC_DCM1, div);
bed53753d   Anatolij Gustschin   Add Fujitsu Coral...
324
  	/* L0 init */
e86528671   Anatolij Gustschin   video: mb862xx: f...
325
  	cf = (dev->gdfBytesPP == 1) ? 0x00000000 : 0x80000000;
cce99b2a7   Anatolij Gustschin   video: mb862xx: u...
326
  	DISP_WR_REG (GC_L0M, ((dev->winSizeX * dev->gdfBytesPP) / 64) << 16 |
e86528671   Anatolij Gustschin   video: mb862xx: f...
327
  			     (dev->winSizeY - 1) | cf);
cce99b2a7   Anatolij Gustschin   video: mb862xx: u...
328
329
330
331
332
333
  	DISP_WR_REG (GC_L0OA0, 0x0);
  	DISP_WR_REG (GC_L0DA0, 0x0);
  	DISP_WR_REG (GC_L0DY_L0DX, 0x0);
  	DISP_WR_REG (GC_L0EM, 0x0);
  	DISP_WR_REG (GC_L0WY_L0WX, 0x0);
  	DISP_WR_REG (GC_L0WH_L0WW, (dev->winSizeY - 1) << 16 | dev->winSizeX);
bed53753d   Anatolij Gustschin   Add Fujitsu Coral...
334
335
  
  	/* Display timing init */
cce99b2a7   Anatolij Gustschin   video: mb862xx: u...
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
  	DISP_WR_REG (GC_HTP_A, (dev->winSizeX +
  				res_mode->left_margin +
  				res_mode->right_margin +
  				res_mode->hsync_len - 1) << 16);
  	DISP_WR_REG (GC_HDB_HDP_A, (dev->winSizeX - 1) << 16 |
  				   (dev->winSizeX - 1));
  	DISP_WR_REG (GC_VSW_HSW_HSP_A,  (res_mode->vsync_len - 1) << 24 |
  					(res_mode->hsync_len - 1) << 16 |
  					(dev->winSizeX +
  					 res_mode->right_margin - 1));
  	DISP_WR_REG (GC_VTR_A, (dev->winSizeY + res_mode->lower_margin +
  				res_mode->upper_margin +
  				res_mode->vsync_len - 1) << 16);
  	DISP_WR_REG (GC_VDP_VSP_A, (dev->winSizeY-1) << 16 |
  				   (dev->winSizeY +
  				    res_mode->lower_margin - 1));
  	DISP_WR_REG (GC_WY_WX, 0x0);
  	DISP_WR_REG (GC_WH_WW, dev->winSizeY << 16 | dev->winSizeX);
bed53753d   Anatolij Gustschin   Add Fujitsu Coral...
354
  	/* Display enable, L0 layer */
cce99b2a7   Anatolij Gustschin   video: mb862xx: u...
355
  	DISP_WR_REG (GC_DCM1, 0x80010000 | div);
bed53753d   Anatolij Gustschin   Add Fujitsu Coral...
356

e86528671   Anatolij Gustschin   video: mb862xx: f...
357
  	return dev->frameAdrs;
bed53753d   Anatolij Gustschin   Add Fujitsu Coral...
358
359
  }
  #endif
c28d3bbe9   Wolfgang Grandegger   video: mb862xx: i...
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
  
  #if !defined(CONFIG_VIDEO_CORALP)
  int mb862xx_probe(unsigned int addr)
  {
  	GraphicDevice *dev = &mb862xx;
  	unsigned int reg;
  
  	dev->frameAdrs = addr;
  	dev->dprBase = dev->frameAdrs + GC_DRAW_BASE;
  
  	/* Try to access GDC ID/Revision registers */
  	reg = HOST_RD_REG (GC_CID);
  	reg = HOST_RD_REG (GC_CID);
  	if (reg == 0x303) {
  		reg = DE_RD_REG(GC_REV);
  		reg = DE_RD_REG(GC_REV);
  		if ((reg & ~0xff) == 0x20050100)
  			return MB862XX_TYPE_LIME;
  	}
  
  	return 0;
  }
  #endif
bed53753d   Anatolij Gustschin   Add Fujitsu Coral...
383
384
  void *video_hw_init (void)
  {
e86528671   Anatolij Gustschin   video: mb862xx: f...
385
  	GraphicDevice *dev = &mb862xx;
bed53753d   Anatolij Gustschin   Add Fujitsu Coral...
386

9d173e023   Anatolij Gustschin   video: mb862xx: r...
387
  	puts ("Video: Fujitsu ");
bed53753d   Anatolij Gustschin   Add Fujitsu Coral...
388

e86528671   Anatolij Gustschin   video: mb862xx: f...
389
  	memset (dev, 0, sizeof (GraphicDevice));
bed53753d   Anatolij Gustschin   Add Fujitsu Coral...
390
391
  
  #if defined(CONFIG_VIDEO_CORALP)
e86528671   Anatolij Gustschin   video: mb862xx: f...
392
393
  	if (card_init () == 0)
  		return NULL;
bed53753d   Anatolij Gustschin   Add Fujitsu Coral...
394
  #else
e86528671   Anatolij Gustschin   video: mb862xx: f...
395
396
397
398
399
  	/*
  	 * Preliminary init of the onboard graphic controller,
  	 * retrieve base address
  	 */
  	if ((dev->frameAdrs = board_video_init ()) == 0) {
9d173e023   Anatolij Gustschin   video: mb862xx: r...
400
401
  		puts ("Controller not found!
  ");
e86528671   Anatolij Gustschin   video: mb862xx: f...
402
  		return NULL;
c28d3bbe9   Wolfgang Grandegger   video: mb862xx: i...
403
  	} else {
9d173e023   Anatolij Gustschin   video: mb862xx: r...
404
405
  		puts ("Lime
  ");
c28d3bbe9   Wolfgang Grandegger   video: mb862xx: i...
406
407
408
409
410
411
412
413
  
  		/* Set Change of Clock Frequency Register */
  		HOST_WR_REG (GC_CCF, CONFIG_SYS_MB862xx_CCF);
  		/* Delay required */
  		udelay(300);
  		/* Set Memory I/F Mode Register) */
  		HOST_WR_REG (GC_MMR, CONFIG_SYS_MB862xx_MMR);
  	}
bed53753d   Anatolij Gustschin   Add Fujitsu Coral...
414
415
416
417
418
  #endif
  
  	de_init ();
  
  #if !defined(CONFIG_VIDEO_CORALP)
e86528671   Anatolij Gustschin   video: mb862xx: f...
419
  	board_disp_init ();
bed53753d   Anatolij Gustschin   Add Fujitsu Coral...
420
  #endif
e64987a89   Anatolij Gustschin   85xx: socrates: E...
421
  #if (defined(CONFIG_LWMON5) || \
6d0f6bcf3   Jean-Christophe PLAGNIOL-VILLARD   rename CFG_ macro...
422
       defined(CONFIG_SOCRATES)) && !(CONFIG_POST & CONFIG_SYS_POST_SYSMON)
bed53753d   Anatolij Gustschin   Add Fujitsu Coral...
423
424
425
  	/* Lamp on */
  	board_backlight_switch (1);
  #endif
e86528671   Anatolij Gustschin   video: mb862xx: f...
426
  	return dev;
bed53753d   Anatolij Gustschin   Add Fujitsu Coral...
427
428
429
430
431
  }
  
  /*
   * Set a RGB color in the LUT
   */
e86528671   Anatolij Gustschin   video: mb862xx: f...
432
433
  void video_set_lut (unsigned int index, unsigned char r,
  		    unsigned char g, unsigned char b)
bed53753d   Anatolij Gustschin   Add Fujitsu Coral...
434
  {
e86528671   Anatolij Gustschin   video: mb862xx: f...
435
  	GraphicDevice *dev = &mb862xx;
bed53753d   Anatolij Gustschin   Add Fujitsu Coral...
436
437
438
  
  	L0PAL_WR_REG (index, (r << 16) | (g << 8) | (b));
  }
5d16ca871   Anatolij Gustschin   video: mb862xx: a...
439
  #if defined(CONFIG_VIDEO_MB862xx_ACCEL)
bed53753d   Anatolij Gustschin   Add Fujitsu Coral...
440
441
442
  /*
   * Drawing engine Fill and BitBlt screen region
   */
e86528671   Anatolij Gustschin   video: mb862xx: f...
443
444
445
  void video_hw_rectfill (unsigned int bpp, unsigned int dst_x,
  			unsigned int dst_y, unsigned int dim_x,
  			unsigned int dim_y, unsigned int color)
bed53753d   Anatolij Gustschin   Add Fujitsu Coral...
446
  {
e86528671   Anatolij Gustschin   video: mb862xx: f...
447
  	GraphicDevice *dev = &mb862xx;
bed53753d   Anatolij Gustschin   Add Fujitsu Coral...
448
449
  
  	de_wait_slots (3);
cce99b2a7   Anatolij Gustschin   video: mb862xx: u...
450
  	DE_WR_REG (GC_FC, color);
bed53753d   Anatolij Gustschin   Add Fujitsu Coral...
451
452
453
454
455
  	DE_WR_FIFO (0x09410000);
  	DE_WR_FIFO ((dst_y << 16) | dst_x);
  	DE_WR_FIFO ((dim_y << 16) | dim_x);
  	de_wait ();
  }
e86528671   Anatolij Gustschin   video: mb862xx: f...
456
457
458
  void video_hw_bitblt (unsigned int bpp, unsigned int src_x,
  		      unsigned int src_y, unsigned int dst_x,
  		      unsigned int dst_y, unsigned int width,
bed53753d   Anatolij Gustschin   Add Fujitsu Coral...
459
460
  		      unsigned int height)
  {
e86528671   Anatolij Gustschin   video: mb862xx: f...
461
  	GraphicDevice *dev = &mb862xx;
bed53753d   Anatolij Gustschin   Add Fujitsu Coral...
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
  	unsigned int ctrl = 0x0d000000L;
  
  	if (src_x >= dst_x && src_y >= dst_y)
  		ctrl |= 0x00440000L;
  	else if (src_x >= dst_x && src_y <= dst_y)
  		ctrl |= 0x00460000L;
  	else if (src_x <= dst_x && src_y >= dst_y)
  		ctrl |= 0x00450000L;
  	else
  		ctrl |= 0x00470000L;
  
  	de_wait_slots (4);
  	DE_WR_FIFO (ctrl);
  	DE_WR_FIFO ((src_y << 16) | src_x);
  	DE_WR_FIFO ((dst_y << 16) | dst_x);
  	DE_WR_FIFO ((height << 16) | width);
  	de_wait (); /* sync */
  }
5d16ca871   Anatolij Gustschin   video: mb862xx: a...
480
  #endif