diff options
-rw-r--r-- | drivers/video/via/hw.c | 80 | ||||
-rw-r--r-- | drivers/video/via/hw.h | 3 | ||||
-rw-r--r-- | drivers/video/via/viafbdev.c | 15 |
3 files changed, 26 insertions, 72 deletions
diff --git a/drivers/video/via/hw.c b/drivers/video/via/hw.c index 64a820c6d494..5be4a670596f 100644 --- a/drivers/video/via/hw.c +++ b/drivers/video/via/hw.c | |||
@@ -629,70 +629,23 @@ void viafb_set_iga_path(void) | |||
629 | } | 629 | } |
630 | } | 630 | } |
631 | 631 | ||
632 | void viafb_set_start_addr(void) | 632 | void viafb_set_primary_address(u32 addr) |
633 | { | 633 | { |
634 | unsigned long offset = 0, tmp = 0, size = 0; | 634 | DEBUG_MSG(KERN_DEBUG "viafb_set_primary_address(0x%08X)\n", addr); |
635 | unsigned long length; | 635 | viafb_write_reg(CR0D, VIACR, addr & 0xFF); |
636 | 636 | viafb_write_reg(CR0C, VIACR, (addr >> 8) & 0xFF); | |
637 | DEBUG_MSG(KERN_INFO "viafb_set_start_addr!\n"); | 637 | viafb_write_reg(CR34, VIACR, (addr >> 16) & 0xFF); |
638 | viafb_unlock_crt(); | 638 | viafb_write_reg_mask(CR48, VIACR, (addr >> 24) & 0x1F, 0x1F); |
639 | /* update starting address of IGA1 */ | 639 | } |
640 | viafb_write_reg(CR0C, VIACR, 0x00); /*initial starting address */ | ||
641 | viafb_write_reg(CR0D, VIACR, 0x00); | ||
642 | viafb_write_reg(CR34, VIACR, 0x00); | ||
643 | viafb_write_reg_mask(CR48, VIACR, 0x00, 0x1F); | ||
644 | |||
645 | if (viafb_dual_fb) { | ||
646 | viaparinfo->iga_path = IGA1; | ||
647 | viaparinfo1->iga_path = IGA2; | ||
648 | } | ||
649 | |||
650 | if (viafb_SAMM_ON == 1) { | ||
651 | if (!viafb_dual_fb) { | ||
652 | if (viafb_second_size) | ||
653 | size = viafb_second_size * 1024 * 1024; | ||
654 | else | ||
655 | size = 8 * 1024 * 1024; | ||
656 | } else { | ||
657 | |||
658 | size = viaparinfo1->memsize; | ||
659 | } | ||
660 | offset = viafb_second_offset; | ||
661 | DEBUG_MSG(KERN_INFO | ||
662 | "viafb_second_size=%lx, second start_adddress=%lx\n", | ||
663 | size, offset); | ||
664 | } | ||
665 | if (viafb_SAMM_ON == 1) { | ||
666 | offset = offset >> 3; | ||
667 | |||
668 | tmp = viafb_read_reg(VIACR, 0x62) & 0x01; | ||
669 | tmp |= (offset & 0x7F) << 1; | ||
670 | viafb_write_reg(CR62, VIACR, tmp); | ||
671 | viafb_write_reg(CR63, VIACR, ((offset & 0x7F80) >> 7)); | ||
672 | viafb_write_reg(CR64, VIACR, ((offset & 0x7F8000) >> 15)); | ||
673 | viafb_write_reg(CRA3, VIACR, ((offset & 0x3800000) >> 23)); | ||
674 | } else { | ||
675 | /* update starting address */ | ||
676 | viafb_write_reg(CR62, VIACR, 0x00); | ||
677 | viafb_write_reg(CR63, VIACR, 0x00); | ||
678 | viafb_write_reg(CR64, VIACR, 0x00); | ||
679 | viafb_write_reg(CRA3, VIACR, 0x00); | ||
680 | } | ||
681 | |||
682 | if (viafb_SAMM_ON == 1) { | ||
683 | if (viafb_accel) { | ||
684 | if (!viafb_dual_fb) | ||
685 | length = size - viaparinfo->fbmem_used; | ||
686 | else | ||
687 | length = size - viaparinfo1->fbmem_used; | ||
688 | } else | ||
689 | length = size; | ||
690 | offset = (unsigned long)(void *)viafb_FB_MM + | ||
691 | viafb_second_offset; | ||
692 | memset((void *)offset, 0, length); | ||
693 | } | ||
694 | 640 | ||
695 | viafb_lock_crt(); | 641 | void viafb_set_secondary_address(u32 addr) |
642 | { | ||
643 | DEBUG_MSG(KERN_DEBUG "viafb_set_secondary_address(0x%08X)\n", addr); | ||
644 | /* secondary display supports only quadword aligned memory */ | ||
645 | viafb_write_reg_mask(CR62, VIACR, (addr >> 2) & 0xFE, 0xFE); | ||
646 | viafb_write_reg(CR63, VIACR, (addr >> 10) & 0xFF); | ||
647 | viafb_write_reg(CR64, VIACR, (addr >> 18) & 0xFF); | ||
648 | viafb_write_reg_mask(CRA3, VIACR, (addr >> 26) & 0x07, 0x07); | ||
696 | } | 649 | } |
697 | 650 | ||
698 | void viafb_set_output_path(int device, int set_iga, int output_interface) | 651 | void viafb_set_output_path(int device, int set_iga, int output_interface) |
@@ -2288,7 +2241,8 @@ int viafb_setmode(int vmode_index, int hor_res, int ver_res, int video_bpp, | |||
2288 | outb(VPIT.SR[i - 1], VIASR + 1); | 2241 | outb(VPIT.SR[i - 1], VIASR + 1); |
2289 | } | 2242 | } |
2290 | 2243 | ||
2291 | viafb_set_start_addr(); | 2244 | viafb_set_primary_address(0); |
2245 | viafb_set_secondary_address(viafb_SAMM_ON ? viafb_second_offset : 0); | ||
2292 | viafb_set_iga_path(); | 2246 | viafb_set_iga_path(); |
2293 | 2247 | ||
2294 | /* Write CRTC */ | 2248 | /* Write CRTC */ |
diff --git a/drivers/video/via/hw.h b/drivers/video/via/hw.h index 6ff38fa8569a..874ea3fc290d 100644 --- a/drivers/video/via/hw.h +++ b/drivers/video/via/hw.h | |||
@@ -927,7 +927,8 @@ void viafb_get_mmio_info(unsigned long *mmio_base, | |||
927 | unsigned long *mmio_len); | 927 | unsigned long *mmio_len); |
928 | 928 | ||
929 | void viafb_set_iga_path(void); | 929 | void viafb_set_iga_path(void); |
930 | void viafb_set_start_addr(void); | 930 | void viafb_set_primary_address(u32 addr); |
931 | void viafb_set_secondary_address(u32 addr); | ||
931 | void viafb_get_fb_info(unsigned int *fb_base, unsigned int *fb_len); | 932 | void viafb_get_fb_info(unsigned int *fb_base, unsigned int *fb_len); |
932 | 933 | ||
933 | #endif /* __HW_H__ */ | 934 | #endif /* __HW_H__ */ |
diff --git a/drivers/video/via/viafbdev.c b/drivers/video/via/viafbdev.c index 6612ddc2dcd9..743eed48a5f7 100644 --- a/drivers/video/via/viafbdev.c +++ b/drivers/video/via/viafbdev.c | |||
@@ -481,12 +481,7 @@ static int viafb_pan_display(struct fb_var_screeninfo *var, | |||
481 | var->bits_per_pixel / 16; | 481 | var->bits_per_pixel / 16; |
482 | 482 | ||
483 | DEBUG_MSG(KERN_INFO "\nviafb_pan_display,offset =%d ", offset); | 483 | DEBUG_MSG(KERN_INFO "\nviafb_pan_display,offset =%d ", offset); |
484 | 484 | viafb_set_primary_address(offset); | |
485 | viafb_write_reg_mask(0x48, 0x3d4, ((offset >> 24) & 0x3), 0x3); | ||
486 | viafb_write_reg_mask(0x34, 0x3d4, ((offset >> 16) & 0xff), 0xff); | ||
487 | viafb_write_reg_mask(0x0c, 0x3d4, ((offset >> 8) & 0xff), 0xff); | ||
488 | viafb_write_reg_mask(0x0d, 0x3d4, (offset & 0xff), 0xff); | ||
489 | |||
490 | return 0; | 485 | return 0; |
491 | } | 486 | } |
492 | 487 | ||
@@ -1353,7 +1348,8 @@ static void viafb_set_device(struct device_t active_dev) | |||
1353 | viafb_SAMM_ON = active_dev.samm; | 1348 | viafb_SAMM_ON = active_dev.samm; |
1354 | viafb_primary_dev = active_dev.primary_dev; | 1349 | viafb_primary_dev = active_dev.primary_dev; |
1355 | 1350 | ||
1356 | viafb_set_start_addr(); | 1351 | viafb_set_primary_address(0); |
1352 | viafb_set_secondary_address(viafb_SAMM_ON ? viafb_second_offset : 0); | ||
1357 | viafb_set_iga_path(); | 1353 | viafb_set_iga_path(); |
1358 | } | 1354 | } |
1359 | 1355 | ||
@@ -1537,7 +1533,8 @@ static int apply_device_setting(struct viafb_ioctl_setting setting_info, | |||
1537 | if (viafb_SAMM_ON) | 1533 | if (viafb_SAMM_ON) |
1538 | viafb_primary_dev = setting_info.primary_device; | 1534 | viafb_primary_dev = setting_info.primary_device; |
1539 | 1535 | ||
1540 | viafb_set_start_addr(); | 1536 | viafb_set_primary_address(0); |
1537 | viafb_set_secondary_address(viafb_SAMM_ON ? viafb_second_offset : 0); | ||
1541 | viafb_set_iga_path(); | 1538 | viafb_set_iga_path(); |
1542 | } | 1539 | } |
1543 | need_set_mode = 1; | 1540 | need_set_mode = 1; |
@@ -2275,6 +2272,8 @@ static int __devinit via_pci_probe(void) | |||
2275 | viafb_second_offset; | 2272 | viafb_second_offset; |
2276 | } | 2273 | } |
2277 | 2274 | ||
2275 | viaparinfo->iga_path = IGA1; | ||
2276 | viaparinfo1->iga_path = IGA2; | ||
2278 | memcpy(viafbinfo1, viafbinfo, sizeof(struct fb_info)); | 2277 | memcpy(viafbinfo1, viafbinfo, sizeof(struct fb_info)); |
2279 | viafbinfo1->screen_base = viafbinfo->screen_base + | 2278 | viafbinfo1->screen_base = viafbinfo->screen_base + |
2280 | viafb_second_offset; | 2279 | viafb_second_offset; |