extractedLnx/linux/drivers/video/atyfb.c_aty_init.c
static int __init aty_init(struct fb_info_aty *info, const char *name)
{
u32 chip_id;
u32 i;
int j, k;
struct fb_var_screeninfo var;
struct display *disp;
const char *chipname = NULL, *ramname = NULL, *xtal;
int pll, mclk, gtb_memsize;
#if defined(CONFIG_PPC)
int sense;
#endif
u8 pll_ref_div;
info->aty_cmap_regs = (struct aty_cmap_regs *)(info->ati_regbase+0xc0);
chip_id = aty_ld_le32(CONFIG_CHIP_ID, info);
Gx = chip_id & CFG_CHIP_TYPE;
Rev = (chip_id & CFG_CHIP_REV)>>24;
for (j = 0; j < (sizeof(aty_features)/sizeof(*aty_features)); j++)
if (aty_features[j].chip_type == Gx) {
chipname = aty_features[j].name;
info->dac_type = (aty_ld_le32(DAC_CNTL, info) >> 16) & 0x07;
break;
}
if (!chipname) {
printk("atyfb: Unknown mach64 0x%04x\n", Gx);
return 0;
} else
printk("atyfb: %s [0x%04x rev 0x%02x] ", chipname, Gx, Rev);
if ((Gx == GX_CHIP_ID) || (Gx == CX_CHIP_ID)) {
info->bus_type = (aty_ld_le32(CONFIG_STAT0, info) >> 0) & 0x07;
info->ram_type = (aty_ld_le32(CONFIG_STAT0, info) >> 3) & 0x07;
ramname = aty_gx_ram[info->ram_type];
/* FIXME: clockchip/RAMDAC probing? */
#ifdef CONFIG_ATARI
info->clk_type = CLK_ATI18818_1;
info->dac_type = (aty_ld_le32(CONFIG_STAT0, info) >> 9) & 0x07;
if (info->dac_type == 0x07)
info->dac_subtype = DAC_ATT20C408;
else
info->dac_subtype = (aty_ld_8(SCRATCH_REG1 + 1, info) & 0xF0) |
info->dac_type;
#else
info->dac_type = DAC_IBMRGB514;
info->dac_subtype = DAC_IBMRGB514;
info->clk_type = CLK_IBMRGB514;
#endif
/* FIXME */
pll = 135;
mclk = 50;
} else {
info->bus_type = PCI;
info->ram_type = (aty_ld_le32(CONFIG_STAT0, info) & 0x07);
ramname = aty_ct_ram[info->ram_type];
info->dac_type = DAC_INTERNAL;
info->dac_subtype = DAC_INTERNAL;
info->clk_type = CLK_INTERNAL;
if ((Gx == CT_CHIP_ID) || (Gx == ET_CHIP_ID)) {
pll = 135;
mclk = 60;
} else {
mclk = info->ram_type >= SDRAM ? 67 : 63;
if ((Gx == VT_CHIP_ID) && (Rev == 0x08)) {
/* VTA3 */
pll = 170;
} else if (((Gx == VT_CHIP_ID) && ((Rev == 0x40) ||
(Rev == 0x48))) ||
((Gx == VT_CHIP_ID) && ((Rev == 0x01) ||
(Rev == 0x9a))) ||
Gx == VU_CHIP_ID) {
/* VTA4 or VTB */
pll = 200;
} else if (Gx == VV_CHIP_ID) {
/* VT4 */
pll = 230;
mclk = 83;
} else if (Gx == VT_CHIP_ID) {
/* other VT */
pll = 135;
mclk = 63;
} else if ((Gx == GT_CHIP_ID) && (Rev & 0x01)) {
/* RAGE II */
pll = 170;
} else if (((Gx == GT_CHIP_ID) && (Rev & 0x02)) ||
(Gx == GU_CHIP_ID)) {
/* RAGE II+ */
pll = 200;
} else if (Gx == GV_CHIP_ID || Gx == GW_CHIP_ID ||
Gx == GZ_CHIP_ID) {
/* RAGE IIC */
pll = 230;
mclk = 83;
} else if (Gx == GB_CHIP_ID || Gx == GD_CHIP_ID ||
Gx == GI_CHIP_ID || Gx == GP_CHIP_ID ||
Gx == GQ_CHIP_ID || Gx == LB_CHIP_ID ||
Gx == LD_CHIP_ID ||
Gx == LI_CHIP_ID || Gx == LP_CHIP_ID) {
/* RAGE PRO or LT PRO */
pll = 230;
mclk = 100;
} else if (Gx == XL_CHIP_ID) {
pll = 230;
mclk = 120;
} else if (Gx == LG_CHIP_ID) {
/* Rage LT */
pll = 230;
mclk = 63;
} else if ((Gx == LN_CHIP_ID) || (Gx == LM_CHIP_ID)) {
/* Rage mobility M1 */
pll = 230;
mclk = 50;
} else {
/* other RAGE */
pll = 135;
mclk = 63;
}
}
}
info->ref_clk_per = 1000000000000ULL/14318180;
xtal = "14.31818";
if (!(Gx == GX_CHIP_ID || Gx == CX_CHIP_ID || Gx == CT_CHIP_ID ||
Gx == ET_CHIP_ID ||
((Gx == VT_CHIP_ID || Gx == GT_CHIP_ID) && !(Rev & 0x07))) &&
(pll_ref_div = aty_ld_pll(PLL_REF_DIV, info))) {
int diff1, diff2;
diff1 = 510*14/pll_ref_div-pll;
diff2 = 510*29/pll_ref_div-pll;
if (diff1 < 0)
diff1 = -diff1;
if (diff2 < 0)
diff2 = -diff2;
if (diff2 < diff1) {
info->ref_clk_per = 1000000000000ULL/29498928;
xtal = "29.498928";
}
}
i = aty_ld_le32(MEM_CNTL, info);
gtb_memsize = !(Gx == GX_CHIP_ID || Gx == CX_CHIP_ID || Gx == CT_CHIP_ID ||
Gx == ET_CHIP_ID ||
((Gx == VT_CHIP_ID || Gx == GT_CHIP_ID) && !(Rev & 0x07)));
if (gtb_memsize)
switch (i & 0xF) { /* 0xF used instead of MEM_SIZE_ALIAS */
case MEM_SIZE_512K:
info->total_vram = 0x80000;
break;
case MEM_SIZE_1M:
info->total_vram = 0x100000;
break;
case MEM_SIZE_2M_GTB:
info->total_vram = 0x200000;
break;
case MEM_SIZE_4M_GTB:
info->total_vram = 0x400000;
break;
case MEM_SIZE_6M_GTB:
info->total_vram = 0x600000;
break;
case MEM_SIZE_8M_GTB:
info->total_vram = 0x800000;
break;
default:
info->total_vram = 0x80000;
}
else
switch (i & MEM_SIZE_ALIAS) {
case MEM_SIZE_512K:
info->total_vram = 0x80000;
break;
case MEM_SIZE_1M:
info->total_vram = 0x100000;
break;
case MEM_SIZE_2M:
info->total_vram = 0x200000;
break;
case MEM_SIZE_4M:
info->total_vram = 0x400000;
break;
case MEM_SIZE_6M:
info->total_vram = 0x600000;
break;
case MEM_SIZE_8M:
info->total_vram = 0x800000;
break;
default:
info->total_vram = 0x80000;
}
if (Gx == GI_CHIP_ID) {
if (aty_ld_le32(CONFIG_STAT1, info) & 0x40000000)
info->total_vram += 0x400000;
}
if (default_vram) {
info->total_vram = default_vram*1024;
i = i & ~(gtb_memsize ? 0xF : MEM_SIZE_ALIAS);
if (info->total_vram <= 0x80000)
i |= MEM_SIZE_512K;
else if (info->total_vram <= 0x100000)
i |= MEM_SIZE_1M;
else if (info->total_vram <= 0x200000)
i |= gtb_memsize ? MEM_SIZE_2M_GTB : MEM_SIZE_2M;
else if (info->total_vram <= 0x400000)
i |= gtb_memsize ? MEM_SIZE_4M_GTB : MEM_SIZE_4M;
else if (info->total_vram <= 0x600000)
i |= gtb_memsize ? MEM_SIZE_6M_GTB : MEM_SIZE_6M;
else
i |= gtb_memsize ? MEM_SIZE_8M_GTB : MEM_SIZE_8M;
aty_st_le32(MEM_CNTL, i, info);
}
if (default_pll)
pll = default_pll;
if (default_mclk)
mclk = default_mclk;
printk("%d%c %s, %s MHz XTAL, %d MHz PLL, %d Mhz MCLK\n",
info->total_vram == 0x80000 ? 512 : (info->total_vram >> 20),
info->total_vram == 0x80000 ? 'K' : 'M', ramname, xtal, pll, mclk);
if (mclk < 44)
info->mem_refresh_rate = 0; /* 000 = 10 Mhz - 43 Mhz */
else if (mclk < 50)
info->mem_refresh_rate = 1; /* 001 = 44 Mhz - 49 Mhz */
else if (mclk < 55)
info->mem_refresh_rate = 2; /* 010 = 50 Mhz - 54 Mhz */
else if (mclk < 66)
info->mem_refresh_rate = 3; /* 011 = 55 Mhz - 65 Mhz */
else if (mclk < 75)
info->mem_refresh_rate = 4; /* 100 = 66 Mhz - 74 Mhz */
else if (mclk < 80)
info->mem_refresh_rate = 5; /* 101 = 75 Mhz - 79 Mhz */
else if (mclk < 100)
info->mem_refresh_rate = 6; /* 110 = 80 Mhz - 100 Mhz */
else
info->mem_refresh_rate = 7; /* 111 = 100 Mhz and above */
info->pll_per = 1000000/pll;
info->mclk_per = 1000000/mclk;
#ifdef DEBUG
if ((Gx != GX_CHIP_ID) && (Gx != CX_CHIP_ID)) {
int i;
printk("BUS_CNTL DAC_CNTL MEM_CNTL EXT_MEM_CNTL CRTC_GEN_CNTL "
"DSP_CONFIG DSP_ON_OFF\n"
"%08x %08x %08x %08x %08x %08x %08x\n"
"PLL",
aty_ld_le32(BUS_CNTL, info), aty_ld_le32(DAC_CNTL, info),
aty_ld_le32(MEM_CNTL, info), aty_ld_le32(EXT_MEM_CNTL, info),
aty_ld_le32(CRTC_GEN_CNTL, info), aty_ld_le32(DSP_CONFIG, info),
aty_ld_le32(DSP_ON_OFF, info));
for (i = 0; i < 16; i++)
printk(" %02x", aty_ld_pll(i, info));
printk("\n");
}
#endif
/*
* Last page of 8 MB (4 MB on ISA) aperture is MMIO
* FIXME: we should use the auxiliary aperture instead so we can acces the
* full 8 MB of video RAM on 8 MB boards
*/
if (info->total_vram == 0x800000 ||
(info->bus_type == ISA && info->total_vram == 0x400000))
info->total_vram -= GUI_RESERVE;
/* Clear the video memory */
fb_memset((void *)info->frame_buffer, 0, info->total_vram);
disp = &info->disp;
strcpy(info->fb_info.modename, atyfb_name);
info->fb_info.node = -1;
info->fb_info.fbops = &atyfb_ops;
info->fb_info.disp = disp;
strcpy(info->fb_info.fontname, fontname);
info->fb_info.changevar = NULL;
info->fb_info.switch_con = &atyfbcon_switch;
info->fb_info.updatevar = &atyfbcon_updatevar;
info->fb_info.blank = &atyfbcon_blank;
info->fb_info.flags = FBINFO_FLAG_DEFAULT;
#ifdef CONFIG_PMAC_BACKLIGHT
if (Gx == LI_CHIP_ID && machine_is_compatible("PowerBook1,1")) {
/* these bits let the 101 powerbook wake up from sleep -- paulus */
aty_st_lcd(LCD_POWER_MANAGEMENT, aty_ld_lcd(LCD_POWER_MANAGEMENT, info)
| (USE_F32KHZ | TRISTATE_MEM_EN), info);
}
if ((Gx == LN_CHIP_ID) || (Gx == LM_CHIP_ID))
register_backlight_controller(&aty_backlight_controller, info, "ati");
#endif /* CONFIG_PMAC_BACKLIGHT */
#ifdef MODULE
var = default_var;
#else /* !MODULE */
memset(&var, 0, sizeof(var));
#ifdef CONFIG_PPC
if (_machine == _MACH_Pmac) {
/*
* FIXME: The NVRAM stuff should be put in a Mac-specific file, as it
* applies to all Mac video cards
*/
if (mode_option) {
if (!mac_find_mode(&var, &info->fb_info, mode_option, 8))
var = default_var;
} else {
#ifdef CONFIG_NVRAM
if (default_vmode == VMODE_NVRAM) {
default_vmode = nvram_read_byte(NV_VMODE);
if (default_vmode <= 0 || default_vmode > VMODE_MAX)
default_vmode = VMODE_CHOOSE;
}
#endif
if (default_vmode == VMODE_CHOOSE) {
if (Gx == LG_CHIP_ID || Gx == LI_CHIP_ID)
/* G3 PowerBook with 1024x768 LCD */
default_vmode = VMODE_1024_768_60;
else if (machine_is_compatible("iMac"))
default_vmode = VMODE_1024_768_75;
else if (machine_is_compatible("PowerBook2,1"))
/* iBook with 800x600 LCD */
default_vmode = VMODE_800_600_60;
else
default_vmode = VMODE_640_480_67;
sense = read_aty_sense(info);
printk(KERN_INFO "atyfb: monitor sense=%x, mode %d\n",
sense, mac_map_monitor_sense(sense));
}
if (default_vmode <= 0 || default_vmode > VMODE_MAX)
default_vmode = VMODE_640_480_60;
#ifdef CONFIG_NVRAM
if (default_cmode == CMODE_NVRAM)
default_cmode = nvram_read_byte(NV_CMODE);
#endif
if (default_cmode < CMODE_8 || default_cmode > CMODE_32)
default_cmode = CMODE_8;
if (mac_vmode_to_var(default_vmode, default_cmode, &var))
var = default_var;
}
}
else if (!fb_find_mode(&var, &info->fb_info, mode_option, NULL, 0, NULL, 8))
var = default_var;
#else /* !CONFIG_PPC */
#ifdef __sparc__
if (mode_option) {
if (!fb_find_mode(&var, &info->fb_info, mode_option, NULL, 0, NULL, 8))
var = default_var;
} else
var = default_var;
#else
if (!fb_find_mode(&var, &info->fb_info, mode_option, NULL, 0, NULL, 8))
var = default_var;
#endif /* !__sparc__ */
#endif /* !CONFIG_PPC */
#endif /* !MODULE */
if (noaccel)
var.accel_flags &= ~FB_ACCELF_TEXT;
else
var.accel_flags |= FB_ACCELF_TEXT;
if (var.yres == var.yres_virtual) {
u32 vram = (info->total_vram - (PAGE_SIZE << 2));
var.yres_virtual = ((vram * 8) / var.bits_per_pixel) / var.xres_virtual;
if (var.yres_virtual < var.yres)
var.yres_virtual = var.yres;
}
if (atyfb_decode_var(&var, &info->default_par, info)) {
printk("atyfb: can't set default video mode\n");
return 0;
}
#ifdef __sparc__
atyfb_save_palette(&info->fb_info, 0);
#endif
for (j = 0; j < 16; j++) {
k = color_table[j];
info->palette[j].red = default_red[k];
info->palette[j].green = default_grn[k];
info->palette[j].blue = default_blu[k];
}
if (Gx != GX_CHIP_ID && Gx != CX_CHIP_ID) {
info->cursor = aty_init_cursor(info);
if (info->cursor) {
info->dispsw.cursor = atyfb_cursor;
info->dispsw.set_font = atyfb_set_font;
}
}
atyfb_set_var(&var, -1, &info->fb_info);
if (register_framebuffer(&info->fb_info) < 0)
return 0;
info->next = fb_list;
fb_list = info;
printk("fb%d: %s frame buffer device on %s\n",
GET_FB_IDX(info->fb_info.node), atyfb_name, name);
return 1;
}
Generated by GNU enscript 1.6.4.