-static void
-cirrus_switch_mode_setregs(u16 *data, u16 port)
-{
- for (;;) {
- u16 val = GET_GLOBAL(*data);
- if (val == 0xffff)
- return;
- outw(val, port);
- data++;
- }
-}
-
-static void
-cirrus_switch_mode(struct cirrus_mode_s *table)
-{
- // Unlock cirrus special
- stdvga_sequ_write(0x06, 0x12);
- cirrus_switch_mode_setregs(GET_GLOBAL(table->seq), VGAREG_SEQU_ADDRESS);
- cirrus_switch_mode_setregs(GET_GLOBAL(table->graph), VGAREG_GRDC_ADDRESS);
- cirrus_switch_mode_setregs(GET_GLOBAL(table->crtc), stdvga_get_crtc());
-
- stdvga_pelmask_write(0x00);
- stdvga_pelmask_read();
- stdvga_pelmask_read();
- stdvga_pelmask_read();
- stdvga_pelmask_read();
- stdvga_pelmask_write(GET_GLOBAL(table->hidden_dac));
- stdvga_pelmask_write(0xff);
-
- u8 memmodel = GET_GLOBAL(table->info.memmodel);
- u8 on = 0;
- if (memmodel == MM_PLANAR)
- on = 0x41;
- else if (memmodel != MM_TEXT)
- on = 0x01;
- stdvga_attr_mask(0x10, 0x01, on);
-}
-
-static u8
-cirrus_get_memsize(void)
-{
- // get DRAM band width
- u8 v = stdvga_sequ_read(0x0f);
- u8 x = (v >> 3) & 0x03;
- if (x == 0x03 && v & 0x80)
- // 4MB
- return 0x40;
- return 0x04 << x;
-}
-