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