aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/video/via/hw.c80
-rw-r--r--drivers/video/via/hw.h3
-rw-r--r--drivers/video/via/viafbdev.c15
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
632void viafb_set_start_addr(void) 632void 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(); 641void 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
698void viafb_set_output_path(int device, int set_iga, int output_interface) 651void 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
929void viafb_set_iga_path(void); 929void viafb_set_iga_path(void);
930void viafb_set_start_addr(void); 930void viafb_set_primary_address(u32 addr);
931void viafb_set_secondary_address(u32 addr);
931void viafb_get_fb_info(unsigned int *fb_base, unsigned int *fb_len); 932void 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;