]>
Commit | Line | Data |
---|---|---|
bed53753 AG |
1 | /* |
2 | * (C) Copyright 2007 | |
3 | * DENX Software Engineering, Anatolij Gustschin, [email protected] | |
4 | * | |
1a459660 | 5 | * SPDX-License-Identifier: GPL-2.0+ |
bed53753 AG |
6 | */ |
7 | ||
8 | /* | |
9 | * mb862xx.c - Graphic interface for Fujitsu CoralP/Lime | |
10 | * PCI and video mode code was derived from smiLynxEM driver. | |
11 | */ | |
12 | ||
13 | #include <common.h> | |
14 | ||
bed53753 AG |
15 | #include <asm/io.h> |
16 | #include <pci.h> | |
17 | #include <video_fb.h> | |
18 | #include "videomodes.h" | |
19 | #include <mb862xx.h> | |
20 | ||
0d48926c YT |
21 | #if defined(CONFIG_POST) |
22 | #include <post.h> | |
23 | #endif | |
e8652867 | 24 | |
bed53753 AG |
25 | /* |
26 | * Graphic Device | |
27 | */ | |
28 | GraphicDevice mb862xx; | |
29 | ||
30 | /* | |
31 | * 32MB external RAM - 256K Chip MMIO = 0x1FC0000 ; | |
32 | */ | |
33 | #define VIDEO_MEM_SIZE 0x01FC0000 | |
34 | ||
35 | #if defined(CONFIG_PCI) | |
36 | #if defined(CONFIG_VIDEO_CORALP) | |
37 | ||
38 | static struct pci_device_id supported[] = { | |
39 | { PCI_VENDOR_ID_FUJITSU, PCI_DEVICE_ID_CORAL_P }, | |
40 | { PCI_VENDOR_ID_FUJITSU, PCI_DEVICE_ID_CORAL_PA }, | |
41 | { } | |
42 | }; | |
43 | ||
44 | /* Internal clock frequency divider table, index is mode number */ | |
45 | unsigned int fr_div[] = { 0x00000f00, 0x00000900, 0x00000500 }; | |
46 | #endif | |
47 | #endif | |
48 | ||
49 | #if defined(CONFIG_VIDEO_CORALP) | |
50 | #define rd_io in32r | |
51 | #define wr_io out32r | |
52 | #else | |
e8652867 AG |
53 | #define rd_io(addr) in_be32((volatile unsigned *)(addr)) |
54 | #define wr_io(addr, val) out_be32((volatile unsigned *)(addr), (val)) | |
bed53753 AG |
55 | #endif |
56 | ||
cce99b2a AG |
57 | #define HOST_RD_REG(off) rd_io((dev->frameAdrs + GC_HOST_BASE + (off))) |
58 | #define HOST_WR_REG(off, val) wr_io((dev->frameAdrs + GC_HOST_BASE + (off)), \ | |
e8652867 | 59 | (val)) |
cce99b2a AG |
60 | #define DISP_RD_REG(off) rd_io((dev->frameAdrs + GC_DISP_BASE + (off))) |
61 | #define DISP_WR_REG(off, val) wr_io((dev->frameAdrs + GC_DISP_BASE + (off)), \ | |
e8652867 AG |
62 | (val)) |
63 | #define DE_RD_REG(off) rd_io((dev->dprBase + (off))) | |
64 | #define DE_WR_REG(off, val) wr_io((dev->dprBase + (off)), (val)) | |
bed53753 AG |
65 | |
66 | #if defined(CONFIG_VIDEO_CORALP) | |
cce99b2a | 67 | #define DE_WR_FIFO(val) wr_io((dev->dprBase + (GC_GEO_FIFO)), (val)) |
bed53753 | 68 | #else |
cce99b2a | 69 | #define DE_WR_FIFO(val) wr_io((dev->dprBase + (GC_FIFO)), (val)) |
bed53753 AG |
70 | #endif |
71 | ||
cce99b2a AG |
72 | #define L0PAL_WR_REG(idx, val) wr_io((dev->frameAdrs + \ |
73 | (GC_DISP_BASE | GC_L0PAL0) + \ | |
e8652867 | 74 | ((idx) << 2)), (val)) |
bed53753 | 75 | |
5d16ca87 | 76 | #if defined(CONFIG_VIDEO_MB862xx_ACCEL) |
e8652867 | 77 | static void gdc_sw_reset (void) |
bed53753 | 78 | { |
e8652867 AG |
79 | GraphicDevice *dev = &mb862xx; |
80 | ||
cce99b2a | 81 | HOST_WR_REG (GC_SRST, 0x1); |
bed53753 AG |
82 | udelay (500); |
83 | video_hw_init (); | |
84 | } | |
85 | ||
86 | ||
e8652867 | 87 | static void de_wait (void) |
bed53753 | 88 | { |
e8652867 | 89 | GraphicDevice *dev = &mb862xx; |
bed53753 AG |
90 | int lc = 0x10000; |
91 | ||
e8652867 AG |
92 | /* |
93 | * Sync with software writes to framebuffer, | |
94 | * try to reset if engine locked | |
95 | */ | |
cce99b2a | 96 | while (DE_RD_REG (GC_CTR) & 0x00000131) |
bed53753 AG |
97 | if (lc-- < 0) { |
98 | gdc_sw_reset (); | |
9d173e02 | 99 | puts ("gdc reset done after drawing engine lock.\n"); |
bed53753 AG |
100 | break; |
101 | } | |
102 | } | |
103 | ||
e8652867 | 104 | static void de_wait_slots (int slots) |
bed53753 | 105 | { |
e8652867 | 106 | GraphicDevice *dev = &mb862xx; |
bed53753 AG |
107 | int lc = 0x10000; |
108 | ||
109 | /* Wait for free fifo slots */ | |
cce99b2a | 110 | while (DE_RD_REG (GC_IFCNT) < slots) |
bed53753 AG |
111 | if (lc-- < 0) { |
112 | gdc_sw_reset (); | |
9d173e02 | 113 | puts ("gdc reset done after drawing engine lock.\n"); |
bed53753 AG |
114 | break; |
115 | } | |
116 | } | |
5d16ca87 | 117 | #endif |
bed53753 AG |
118 | |
119 | #if !defined(CONFIG_VIDEO_CORALP) | |
e8652867 | 120 | static void board_disp_init (void) |
bed53753 | 121 | { |
e8652867 | 122 | GraphicDevice *dev = &mb862xx; |
bed53753 AG |
123 | const gdc_regs *regs = board_get_regs (); |
124 | ||
125 | while (regs->index) { | |
126 | DISP_WR_REG (regs->index, regs->value); | |
127 | regs++; | |
128 | } | |
129 | } | |
130 | #endif | |
131 | ||
132 | /* | |
5d16ca87 AG |
133 | * Init drawing engine if accel enabled. |
134 | * Also clears visible framebuffer. | |
bed53753 AG |
135 | */ |
136 | static void de_init (void) | |
137 | { | |
e8652867 | 138 | GraphicDevice *dev = &mb862xx; |
5d16ca87 | 139 | #if defined(CONFIG_VIDEO_MB862xx_ACCEL) |
e8652867 | 140 | int cf = (dev->gdfBytesPP == 1) ? 0x0000 : 0x8000; |
bed53753 | 141 | |
cce99b2a | 142 | dev->dprBase = dev->frameAdrs + GC_DRAW_BASE; |
bed53753 AG |
143 | |
144 | /* Setup mode and fbbase, xres, fg, bg */ | |
145 | de_wait_slots (2); | |
146 | DE_WR_FIFO (0xf1010108); | |
147 | DE_WR_FIFO (cf | 0x0300); | |
cce99b2a AG |
148 | DE_WR_REG (GC_FBR, 0x0); |
149 | DE_WR_REG (GC_XRES, dev->winSizeX); | |
150 | DE_WR_REG (GC_FC, 0x0); | |
151 | DE_WR_REG (GC_BC, 0x0); | |
bed53753 | 152 | /* Reset clipping */ |
cce99b2a AG |
153 | DE_WR_REG (GC_CXMIN, 0x0); |
154 | DE_WR_REG (GC_CXMAX, dev->winSizeX); | |
155 | DE_WR_REG (GC_CYMIN, 0x0); | |
156 | DE_WR_REG (GC_CYMAX, dev->winSizeY); | |
bed53753 AG |
157 | |
158 | /* Clear framebuffer using drawing engine */ | |
159 | de_wait_slots (3); | |
160 | DE_WR_FIFO (0x09410000); | |
161 | DE_WR_FIFO (0x00000000); | |
e8652867 | 162 | DE_WR_FIFO (dev->winSizeY << 16 | dev->winSizeX); |
322716a1 AG |
163 | /* sync with SW access to framebuffer */ |
164 | de_wait (); | |
5d16ca87 AG |
165 | #else |
166 | unsigned int i, *p; | |
167 | ||
168 | i = dev->winSizeX * dev->winSizeY; | |
169 | p = (unsigned int *)dev->frameAdrs; | |
170 | while (i--) | |
171 | *p++ = 0; | |
172 | #endif | |
bed53753 AG |
173 | } |
174 | ||
175 | #if defined(CONFIG_VIDEO_CORALP) | |
d7ffd27a AG |
176 | /* use CCF and MMR parameters for Coral-P Eval. Board as default */ |
177 | #ifndef CONFIG_SYS_MB862xx_CCF | |
178 | #define CONFIG_SYS_MB862xx_CCF 0x00090000 | |
179 | #endif | |
180 | #ifndef CONFIG_SYS_MB862xx_MMR | |
181 | #define CONFIG_SYS_MB862xx_MMR 0x11d7fa13 | |
182 | #endif | |
183 | ||
e8652867 | 184 | unsigned int pci_video_init (void) |
bed53753 | 185 | { |
e8652867 | 186 | GraphicDevice *dev = &mb862xx; |
bed53753 | 187 | pci_dev_t devbusfn; |
d7ffd27a | 188 | u16 device; |
bed53753 | 189 | |
e8652867 | 190 | if ((devbusfn = pci_find_devices (supported, 0)) < 0) { |
01b0f500 | 191 | puts("controller not present\n"); |
bed53753 AG |
192 | return 0; |
193 | } | |
194 | ||
195 | /* PCI setup */ | |
e8652867 AG |
196 | pci_write_config_dword (devbusfn, PCI_COMMAND, |
197 | (PCI_COMMAND_MEMORY | PCI_COMMAND_IO)); | |
198 | pci_read_config_dword (devbusfn, PCI_BASE_ADDRESS_0, &dev->frameAdrs); | |
199 | dev->frameAdrs = pci_mem_to_phys (devbusfn, dev->frameAdrs); | |
bed53753 | 200 | |
e8652867 | 201 | if (dev->frameAdrs == 0) { |
9d173e02 | 202 | puts ("PCI config: failed to get base address\n"); |
bed53753 AG |
203 | return 0; |
204 | } | |
205 | ||
e8652867 | 206 | dev->pciBase = dev->frameAdrs; |
bed53753 | 207 | |
d7ffd27a AG |
208 | puts("Coral-"); |
209 | ||
210 | pci_read_config_word(devbusfn, PCI_DEVICE_ID, &device); | |
211 | switch (device) { | |
212 | case PCI_DEVICE_ID_CORAL_P: | |
213 | puts("P\n"); | |
214 | break; | |
215 | case PCI_DEVICE_ID_CORAL_PA: | |
216 | puts("PA\n"); | |
217 | break; | |
218 | default: | |
219 | puts("Unknown\n"); | |
220 | return 0; | |
221 | } | |
222 | ||
223 | /* Setup clocks and memory mode for Coral-P(A) */ | |
224 | HOST_WR_REG(GC_CCF, CONFIG_SYS_MB862xx_CCF); | |
bed53753 | 225 | udelay (200); |
d7ffd27a | 226 | HOST_WR_REG(GC_MMR, CONFIG_SYS_MB862xx_MMR); |
bed53753 | 227 | udelay (100); |
e8652867 | 228 | return dev->frameAdrs; |
bed53753 AG |
229 | } |
230 | ||
231 | unsigned int card_init (void) | |
232 | { | |
e8652867 | 233 | GraphicDevice *dev = &mb862xx; |
bed53753 AG |
234 | unsigned int cf, videomode, div = 0; |
235 | unsigned long t1, hsync, vsync; | |
236 | char *penv; | |
237 | int tmp, i, bpp; | |
238 | struct ctfb_res_modes *res_mode; | |
239 | struct ctfb_res_modes var_mode; | |
240 | ||
e8652867 | 241 | memset (dev, 0, sizeof (GraphicDevice)); |
bed53753 | 242 | |
e8652867 | 243 | if (!pci_video_init ()) |
bed53753 | 244 | return 0; |
bed53753 | 245 | |
bed53753 AG |
246 | tmp = 0; |
247 | videomode = 0x310; | |
248 | /* get video mode via environment */ | |
249 | if ((penv = getenv ("videomode")) != NULL) { | |
e8652867 | 250 | /* decide if it is a string */ |
bed53753 AG |
251 | if (penv[0] <= '9') { |
252 | videomode = (int) simple_strtoul (penv, NULL, 16); | |
253 | tmp = 1; | |
254 | } | |
255 | } else { | |
256 | tmp = 1; | |
257 | } | |
e8652867 | 258 | |
bed53753 | 259 | if (tmp) { |
e8652867 | 260 | /* parameter are vesa modes, search params */ |
bed53753 AG |
261 | for (i = 0; i < VESA_MODES_COUNT; i++) { |
262 | if (vesa_modes[i].vesanr == videomode) | |
263 | break; | |
264 | } | |
265 | if (i == VESA_MODES_COUNT) { | |
e8652867 AG |
266 | printf ("\tno VESA Mode found, fallback to mode 0x%x\n", |
267 | videomode); | |
bed53753 AG |
268 | i = 0; |
269 | } | |
e8652867 AG |
270 | res_mode = (struct ctfb_res_modes *) |
271 | &res_mode_init[vesa_modes[i].resindex]; | |
bed53753 | 272 | if (vesa_modes[i].resindex > 2) { |
9d173e02 | 273 | puts ("\tUnsupported resolution, using default\n"); |
bed53753 AG |
274 | bpp = vesa_modes[1].bits_per_pixel; |
275 | div = fr_div[1]; | |
276 | } | |
277 | bpp = vesa_modes[i].bits_per_pixel; | |
278 | div = fr_div[vesa_modes[i].resindex]; | |
279 | } else { | |
bed53753 AG |
280 | res_mode = (struct ctfb_res_modes *) &var_mode; |
281 | bpp = video_get_params (res_mode, penv); | |
282 | } | |
283 | ||
284 | /* calculate hsync and vsync freq (info only) */ | |
285 | t1 = (res_mode->left_margin + res_mode->xres + | |
286 | res_mode->right_margin + res_mode->hsync_len) / 8; | |
287 | t1 *= 8; | |
288 | t1 *= res_mode->pixclock; | |
289 | t1 /= 1000; | |
290 | hsync = 1000000000L / t1; | |
291 | t1 *= (res_mode->upper_margin + res_mode->yres + | |
292 | res_mode->lower_margin + res_mode->vsync_len); | |
293 | t1 /= 1000; | |
294 | vsync = 1000000000L / t1; | |
295 | ||
296 | /* fill in Graphic device struct */ | |
e8652867 | 297 | sprintf (dev->modeIdent, "%dx%dx%d %ldkHz %ldHz", res_mode->xres, |
bed53753 | 298 | res_mode->yres, bpp, (hsync / 1000), (vsync / 1000)); |
e8652867 AG |
299 | printf ("\t%s\n", dev->modeIdent); |
300 | dev->winSizeX = res_mode->xres; | |
301 | dev->winSizeY = res_mode->yres; | |
302 | dev->memSize = VIDEO_MEM_SIZE; | |
bed53753 AG |
303 | |
304 | switch (bpp) { | |
305 | case 8: | |
e8652867 AG |
306 | dev->gdfIndex = GDF__8BIT_INDEX; |
307 | dev->gdfBytesPP = 1; | |
bed53753 AG |
308 | break; |
309 | case 15: | |
310 | case 16: | |
e8652867 AG |
311 | dev->gdfIndex = GDF_15BIT_555RGB; |
312 | dev->gdfBytesPP = 2; | |
bed53753 AG |
313 | break; |
314 | default: | |
e8652867 AG |
315 | printf ("\t%d bpp configured, but only 8,15 and 16 supported\n", |
316 | bpp); | |
9d173e02 | 317 | puts ("\tfallback to 15bpp\n"); |
e8652867 AG |
318 | dev->gdfIndex = GDF_15BIT_555RGB; |
319 | dev->gdfBytesPP = 2; | |
bed53753 AG |
320 | } |
321 | ||
322 | /* Setup dot clock (internal pll, division rate) */ | |
cce99b2a | 323 | DISP_WR_REG (GC_DCM1, div); |
bed53753 | 324 | /* L0 init */ |
e8652867 | 325 | cf = (dev->gdfBytesPP == 1) ? 0x00000000 : 0x80000000; |
cce99b2a | 326 | DISP_WR_REG (GC_L0M, ((dev->winSizeX * dev->gdfBytesPP) / 64) << 16 | |
e8652867 | 327 | (dev->winSizeY - 1) | cf); |
cce99b2a AG |
328 | DISP_WR_REG (GC_L0OA0, 0x0); |
329 | DISP_WR_REG (GC_L0DA0, 0x0); | |
330 | DISP_WR_REG (GC_L0DY_L0DX, 0x0); | |
331 | DISP_WR_REG (GC_L0EM, 0x0); | |
332 | DISP_WR_REG (GC_L0WY_L0WX, 0x0); | |
333 | DISP_WR_REG (GC_L0WH_L0WW, (dev->winSizeY - 1) << 16 | dev->winSizeX); | |
bed53753 AG |
334 | |
335 | /* Display timing init */ | |
cce99b2a AG |
336 | DISP_WR_REG (GC_HTP_A, (dev->winSizeX + |
337 | res_mode->left_margin + | |
338 | res_mode->right_margin + | |
339 | res_mode->hsync_len - 1) << 16); | |
340 | DISP_WR_REG (GC_HDB_HDP_A, (dev->winSizeX - 1) << 16 | | |
341 | (dev->winSizeX - 1)); | |
342 | DISP_WR_REG (GC_VSW_HSW_HSP_A, (res_mode->vsync_len - 1) << 24 | | |
343 | (res_mode->hsync_len - 1) << 16 | | |
344 | (dev->winSizeX + | |
345 | res_mode->right_margin - 1)); | |
346 | DISP_WR_REG (GC_VTR_A, (dev->winSizeY + res_mode->lower_margin + | |
347 | res_mode->upper_margin + | |
348 | res_mode->vsync_len - 1) << 16); | |
349 | DISP_WR_REG (GC_VDP_VSP_A, (dev->winSizeY-1) << 16 | | |
350 | (dev->winSizeY + | |
351 | res_mode->lower_margin - 1)); | |
352 | DISP_WR_REG (GC_WY_WX, 0x0); | |
353 | DISP_WR_REG (GC_WH_WW, dev->winSizeY << 16 | dev->winSizeX); | |
bed53753 | 354 | /* Display enable, L0 layer */ |
cce99b2a | 355 | DISP_WR_REG (GC_DCM1, 0x80010000 | div); |
bed53753 | 356 | |
e8652867 | 357 | return dev->frameAdrs; |
bed53753 AG |
358 | } |
359 | #endif | |
360 | ||
c28d3bbe WG |
361 | |
362 | #if !defined(CONFIG_VIDEO_CORALP) | |
363 | int mb862xx_probe(unsigned int addr) | |
364 | { | |
365 | GraphicDevice *dev = &mb862xx; | |
366 | unsigned int reg; | |
367 | ||
368 | dev->frameAdrs = addr; | |
369 | dev->dprBase = dev->frameAdrs + GC_DRAW_BASE; | |
370 | ||
371 | /* Try to access GDC ID/Revision registers */ | |
372 | reg = HOST_RD_REG (GC_CID); | |
373 | reg = HOST_RD_REG (GC_CID); | |
374 | if (reg == 0x303) { | |
375 | reg = DE_RD_REG(GC_REV); | |
376 | reg = DE_RD_REG(GC_REV); | |
377 | if ((reg & ~0xff) == 0x20050100) | |
378 | return MB862XX_TYPE_LIME; | |
379 | } | |
380 | ||
381 | return 0; | |
382 | } | |
383 | #endif | |
384 | ||
bed53753 AG |
385 | void *video_hw_init (void) |
386 | { | |
e8652867 | 387 | GraphicDevice *dev = &mb862xx; |
bed53753 | 388 | |
9d173e02 | 389 | puts ("Video: Fujitsu "); |
bed53753 | 390 | |
e8652867 | 391 | memset (dev, 0, sizeof (GraphicDevice)); |
bed53753 AG |
392 | |
393 | #if defined(CONFIG_VIDEO_CORALP) | |
e8652867 AG |
394 | if (card_init () == 0) |
395 | return NULL; | |
bed53753 | 396 | #else |
e8652867 AG |
397 | /* |
398 | * Preliminary init of the onboard graphic controller, | |
399 | * retrieve base address | |
400 | */ | |
401 | if ((dev->frameAdrs = board_video_init ()) == 0) { | |
9d173e02 | 402 | puts ("Controller not found!\n"); |
e8652867 | 403 | return NULL; |
c28d3bbe | 404 | } else { |
9d173e02 | 405 | puts ("Lime\n"); |
c28d3bbe WG |
406 | |
407 | /* Set Change of Clock Frequency Register */ | |
408 | HOST_WR_REG (GC_CCF, CONFIG_SYS_MB862xx_CCF); | |
409 | /* Delay required */ | |
410 | udelay(300); | |
411 | /* Set Memory I/F Mode Register) */ | |
412 | HOST_WR_REG (GC_MMR, CONFIG_SYS_MB862xx_MMR); | |
413 | } | |
bed53753 AG |
414 | #endif |
415 | ||
416 | de_init (); | |
417 | ||
418 | #if !defined(CONFIG_VIDEO_CORALP) | |
e8652867 | 419 | board_disp_init (); |
bed53753 AG |
420 | #endif |
421 | ||
04386f65 SR |
422 | #if (defined(CONFIG_LWMON5) || \ |
423 | defined(CONFIG_SOCRATES)) && !(CONFIG_POST & CONFIG_SYS_POST_SYSMON) | |
bed53753 AG |
424 | /* Lamp on */ |
425 | board_backlight_switch (1); | |
426 | #endif | |
427 | ||
e8652867 | 428 | return dev; |
bed53753 AG |
429 | } |
430 | ||
431 | /* | |
432 | * Set a RGB color in the LUT | |
433 | */ | |
e8652867 AG |
434 | void video_set_lut (unsigned int index, unsigned char r, |
435 | unsigned char g, unsigned char b) | |
bed53753 | 436 | { |
e8652867 | 437 | GraphicDevice *dev = &mb862xx; |
bed53753 AG |
438 | |
439 | L0PAL_WR_REG (index, (r << 16) | (g << 8) | (b)); | |
440 | } | |
441 | ||
5d16ca87 | 442 | #if defined(CONFIG_VIDEO_MB862xx_ACCEL) |
bed53753 AG |
443 | /* |
444 | * Drawing engine Fill and BitBlt screen region | |
445 | */ | |
e8652867 AG |
446 | void video_hw_rectfill (unsigned int bpp, unsigned int dst_x, |
447 | unsigned int dst_y, unsigned int dim_x, | |
448 | unsigned int dim_y, unsigned int color) | |
bed53753 | 449 | { |
e8652867 | 450 | GraphicDevice *dev = &mb862xx; |
bed53753 AG |
451 | |
452 | de_wait_slots (3); | |
cce99b2a | 453 | DE_WR_REG (GC_FC, color); |
bed53753 AG |
454 | DE_WR_FIFO (0x09410000); |
455 | DE_WR_FIFO ((dst_y << 16) | dst_x); | |
456 | DE_WR_FIFO ((dim_y << 16) | dim_x); | |
457 | de_wait (); | |
458 | } | |
459 | ||
e8652867 AG |
460 | void video_hw_bitblt (unsigned int bpp, unsigned int src_x, |
461 | unsigned int src_y, unsigned int dst_x, | |
462 | unsigned int dst_y, unsigned int width, | |
bed53753 AG |
463 | unsigned int height) |
464 | { | |
e8652867 | 465 | GraphicDevice *dev = &mb862xx; |
bed53753 AG |
466 | unsigned int ctrl = 0x0d000000L; |
467 | ||
468 | if (src_x >= dst_x && src_y >= dst_y) | |
469 | ctrl |= 0x00440000L; | |
470 | else if (src_x >= dst_x && src_y <= dst_y) | |
471 | ctrl |= 0x00460000L; | |
472 | else if (src_x <= dst_x && src_y >= dst_y) | |
473 | ctrl |= 0x00450000L; | |
474 | else | |
475 | ctrl |= 0x00470000L; | |
476 | ||
477 | de_wait_slots (4); | |
478 | DE_WR_FIFO (ctrl); | |
479 | DE_WR_FIFO ((src_y << 16) | src_x); | |
480 | DE_WR_FIFO ((dst_y << 16) | dst_x); | |
481 | DE_WR_FIFO ((height << 16) | width); | |
482 | de_wait (); /* sync */ | |
483 | } | |
5d16ca87 | 484 | #endif |