Ticket #6202: intel_extreme_atom_20101128_1.patch
File intel_extreme_atom_20101128_1.patch, 10.7 KB (added by , 13 years ago) |
---|
-
src/add-ons/kernel/busses/agp_gart/intel_gart.cpp
71 71 72 72 {0x2e30, 0x2e32, INTEL_TYPE_GM45, "GMA_X4500_VGA"}, 73 73 {0x2a40, 0x2a42, INTEL_TYPE_GM45, "GM45"}, 74 75 {0xa000, 0xa001, INTEL_TYPE_IGDG, "Atom_Dx10"}, 76 {0xa010, 0xa011, INTEL_TYPE_IGDGM, "Atom_N4x0"}, 74 77 }; 75 78 76 79 struct intel_info { … … 140 143 gttSize = 512 << 10; 141 144 break; 142 145 } 143 } else if (info.type == INTEL_TYPE_G33) { 146 } else if (info.type == INTEL_TYPE_G33 147 || (info.type & INTEL_TYPE_GROUP_MASK) == INTEL_TYPE_IGD) { 144 148 switch (memoryConfig & G33_GTT_MASK) { 145 149 case G33_GTT_1M: 146 150 gttSize = 1 << 20; -
src/add-ons/kernel/drivers/graphics/intel_extreme/driver.cpp
59 59 60 60 {0x2e32, INTEL_TYPE_GM45, "GMA_X4500_VGA"}, 61 61 {0x2a42, INTEL_TYPE_GM45, "GM45"}, 62 63 {0xa001, INTEL_TYPE_IGDG, "Atom_Dx10"}, 64 {0xa011, INTEL_TYPE_IGDGM, "Atom_N4x0"}, 62 65 }; 63 66 64 67 int32 api_version = B_CUR_DRIVER_API_VERSION; -
src/add-ons/accelerants/intel_extreme/mode.cpp
243 243 200000, 1750000, 3500000 244 244 }; 245 245 limits = kLimits; 246 } else if (gInfo->shared_info->device_type.InGroup(INTEL_TYPE_IGD)) { 247 // TODO: support LVDS output limits as well 248 // M1 is reserved and must be 0 249 static const pll_limits kLimits = { 250 // p, p1, p2, high, n, m, m1, m2 251 { 5, 1, 10, false, 3, 2, 0, 0}, // min 252 { 80, 8, 5, true, 6, 256, 0, 254}, // max 253 200000, 1700000, 3500000 254 }; 255 limits = kLimits; 246 256 } else if (gInfo->shared_info->device_type.InFamily(INTEL_TYPE_9xx)) { 247 257 // TODO: support LVDS output limits as well 248 258 // (Update: Output limits are adjusted in the computation (post2=7/14)) … … 323 333 float best = requestedPixelClock; 324 334 pll_divisors bestDivisors; 325 335 336 bool is_igd = gInfo->shared_info->device_type.InGroup(INTEL_TYPE_IGD); 326 337 for (divisors.m1 = limits.min.m1; divisors.m1 <= limits.max.m1; divisors.m1++) { 327 for (divisors.m2 = limits.min.m2; divisors.m2 < divisors.m1328 && divisors.m2 <= limits.max.m2; divisors.m2++) {338 for (divisors.m2 = limits.min.m2; divisors.m2 <= limits.max.m2 339 && ((divisors.m2 < divisors.m1) || is_igd); divisors.m2++) { 329 340 for (divisors.n = limits.min.n; divisors.n <= limits.max.n; 330 341 divisors.n++) { 331 342 for (divisors.post1 = limits.min.post1; … … 397 408 } 398 409 399 410 pll_divisors divisors; 400 divisors.m1 = (pllDivisor & DISPLAY_PLL_M1_DIVISOR_MASK) 401 >> DISPLAY_PLL_M1_DIVISOR_SHIFT; 402 divisors.m2 = (pllDivisor & DISPLAY_PLL_M2_DIVISOR_MASK) 403 >> DISPLAY_PLL_M2_DIVISOR_SHIFT; 404 divisors.n = (pllDivisor & DISPLAY_PLL_N_DIVISOR_MASK) 405 >> DISPLAY_PLL_N_DIVISOR_SHIFT; 411 if (gInfo->shared_info->device_type.InGroup(INTEL_TYPE_IGD)) { 412 divisors.m1 = 0; 413 divisors.m2 = (pllDivisor & DISPLAY_PLL_M2_DIVISOR_MASK_IGD) 414 >> DISPLAY_PLL_M2_DIVISOR_SHIFT; 415 divisors.n = (pllDivisor & DISPLAY_PLL_N_DIVISOR_MASK_IGD) 416 >> DISPLAY_PLL_N_DIVISOR_SHIFT; 417 } else { 418 divisors.m1 = (pllDivisor & DISPLAY_PLL_M1_DIVISOR_MASK) 419 >> DISPLAY_PLL_M1_DIVISOR_SHIFT; 420 divisors.m2 = (pllDivisor & DISPLAY_PLL_M2_DIVISOR_MASK) 421 >> DISPLAY_PLL_M2_DIVISOR_SHIFT; 422 divisors.n = (pllDivisor & DISPLAY_PLL_N_DIVISOR_MASK) 423 >> DISPLAY_PLL_N_DIVISOR_SHIFT; 424 } 406 425 407 426 pll_limits limits; 408 427 get_pll_limits(limits); 409 428 410 429 if (gInfo->shared_info->device_type.InFamily(INTEL_TYPE_9xx)) { 411 divisors.post1 = (pll & DISPLAY_PLL_9xx_POST1_DIVISOR_MASK) 412 >> DISPLAY_PLL_POST1_DIVISOR_SHIFT; 430 if (gInfo->shared_info->device_type.InGroup(INTEL_TYPE_IGD)) { 431 divisors.post1 = (pll & DISPLAY_PLL_IGD_POST1_DIVISOR_MASK) 432 >> DISPLAY_PLL_POST1_DIVISOR_SHIFT_IGD; 433 } else { 434 divisors.post1 = (pll & DISPLAY_PLL_9xx_POST1_DIVISOR_MASK) 435 >> DISPLAY_PLL_POST1_DIVISOR_SHIFT; 436 } 413 437 414 438 if (pllRegister == INTEL_DISPLAY_B_PLL 415 439 && !gInfo->shared_info->device_type.InGroup(INTEL_TYPE_96x)) { … … 725 749 } 726 750 727 751 // Compute bitmask from p1 value 728 dpll |= (1 << (divisors.post1 - 1)) << DISPLAY_PLL_POST1_DIVISOR_SHIFT; 752 if (gInfo->shared_info->device_type.InGroup(INTEL_TYPE_IGD)) { 753 dpll |= (1 << (divisors.post1 - 1)) << DISPLAY_PLL_POST1_DIVISOR_SHIFT_IGD; 754 } else { 755 dpll |= (1 << (divisors.post1 - 1)) << DISPLAY_PLL_POST1_DIVISOR_SHIFT; 756 } 729 757 switch (divisors.post2) { 730 758 case 5: 731 759 case 7: … … 739 767 // (I don't know how to detect that) 740 768 741 769 if ((dpll & DISPLAY_PLL_ENABLED) != 0) { 742 write32(INTEL_DISPLAY_B_PLL_DIVISOR_0, 743 (((divisors.n - 2) << DISPLAY_PLL_N_DIVISOR_SHIFT) 744 & DISPLAY_PLL_N_DIVISOR_MASK) 745 | (((divisors.m1 - 2) << DISPLAY_PLL_M1_DIVISOR_SHIFT) 746 & DISPLAY_PLL_M1_DIVISOR_MASK) 747 | (((divisors.m2 - 2) << DISPLAY_PLL_M2_DIVISOR_SHIFT) 748 & DISPLAY_PLL_M2_DIVISOR_MASK)); 770 if (gInfo->shared_info->device_type.InGroup(INTEL_TYPE_IGD)) { 771 write32(INTEL_DISPLAY_B_PLL_DIVISOR_0, 772 (((1 << (divisors.n - 2)) << DISPLAY_PLL_N_DIVISOR_SHIFT) 773 & DISPLAY_PLL_N_DIVISOR_MASK_IGD) 774 | (((divisors.m2 - 2) << DISPLAY_PLL_M2_DIVISOR_SHIFT) 775 & DISPLAY_PLL_M2_DIVISOR_MASK_IGD)); 776 } else { 777 write32(INTEL_DISPLAY_B_PLL_DIVISOR_0, 778 (((divisors.n - 2) << DISPLAY_PLL_N_DIVISOR_SHIFT) 779 & DISPLAY_PLL_N_DIVISOR_MASK) 780 | (((divisors.m1 - 2) << DISPLAY_PLL_M1_DIVISOR_SHIFT) 781 & DISPLAY_PLL_M1_DIVISOR_MASK) 782 | (((divisors.m2 - 2) << DISPLAY_PLL_M2_DIVISOR_SHIFT) 783 & DISPLAY_PLL_M2_DIVISOR_MASK)); 784 } 749 785 write32(INTEL_DISPLAY_B_PLL, dpll & ~DISPLAY_PLL_ENABLED); 750 786 read32(INTEL_DISPLAY_B_PLL); 751 787 spin(150); … … 771 807 write32(INTEL_DISPLAY_LVDS_PORT, lvds); 772 808 read32(INTEL_DISPLAY_LVDS_PORT); 773 809 774 write32(INTEL_DISPLAY_B_PLL_DIVISOR_0, 775 (((divisors.n - 2) << DISPLAY_PLL_N_DIVISOR_SHIFT) 776 & DISPLAY_PLL_N_DIVISOR_MASK) 777 | (((divisors.m1 - 2) << DISPLAY_PLL_M1_DIVISOR_SHIFT) 778 & DISPLAY_PLL_M1_DIVISOR_MASK) 779 | (((divisors.m2 - 2) << DISPLAY_PLL_M2_DIVISOR_SHIFT) 780 & DISPLAY_PLL_M2_DIVISOR_MASK)); 810 if (gInfo->shared_info->device_type.InGroup(INTEL_TYPE_IGD)) { 811 write32(INTEL_DISPLAY_B_PLL_DIVISOR_0, 812 (((1 << (divisors.n - 2)) << DISPLAY_PLL_N_DIVISOR_SHIFT) 813 & DISPLAY_PLL_N_DIVISOR_MASK_IGD) 814 | (((divisors.m2 - 2) << DISPLAY_PLL_M2_DIVISOR_SHIFT) 815 & DISPLAY_PLL_M2_DIVISOR_MASK_IGD)); 816 } else { 817 write32(INTEL_DISPLAY_B_PLL_DIVISOR_0, 818 (((divisors.n - 2) << DISPLAY_PLL_N_DIVISOR_SHIFT) 819 & DISPLAY_PLL_N_DIVISOR_MASK) 820 | (((divisors.m1 - 2) << DISPLAY_PLL_M1_DIVISOR_SHIFT) 821 & DISPLAY_PLL_M1_DIVISOR_MASK) 822 | (((divisors.m2 - 2) << DISPLAY_PLL_M2_DIVISOR_SHIFT) 823 & DISPLAY_PLL_M2_DIVISOR_MASK)); 824 } 781 825 782 826 write32(INTEL_DISPLAY_B_PLL, dpll); 783 827 read32(INTEL_DISPLAY_B_PLL); … … 904 948 pll_divisors divisors; 905 949 compute_pll_divisors(target, divisors, false); 906 950 907 write32(INTEL_DISPLAY_A_PLL_DIVISOR_0, 908 (((divisors.n - 2) << DISPLAY_PLL_N_DIVISOR_SHIFT) 909 & DISPLAY_PLL_N_DIVISOR_MASK) 910 | (((divisors.m1 - 2) << DISPLAY_PLL_M1_DIVISOR_SHIFT) 911 & DISPLAY_PLL_M1_DIVISOR_MASK) 912 | (((divisors.m2 - 2) << DISPLAY_PLL_M2_DIVISOR_SHIFT) 913 & DISPLAY_PLL_M2_DIVISOR_MASK)); 951 if (gInfo->shared_info->device_type.InGroup(INTEL_TYPE_IGD)) { 952 write32(INTEL_DISPLAY_A_PLL_DIVISOR_0, 953 (((divisors.n - 2) << DISPLAY_PLL_N_DIVISOR_SHIFT) 954 & DISPLAY_PLL_N_DIVISOR_MASK_IGD) 955 | (((divisors.m2 - 2) << DISPLAY_PLL_M2_DIVISOR_SHIFT) 956 & DISPLAY_PLL_M2_DIVISOR_MASK_IGD)); 957 } else { 958 write32(INTEL_DISPLAY_A_PLL_DIVISOR_0, 959 (((divisors.n - 2) << DISPLAY_PLL_N_DIVISOR_SHIFT) 960 & DISPLAY_PLL_N_DIVISOR_MASK) 961 | (((divisors.m1 - 2) << DISPLAY_PLL_M1_DIVISOR_SHIFT) 962 & DISPLAY_PLL_M1_DIVISOR_MASK) 963 | (((divisors.m2 - 2) << DISPLAY_PLL_M2_DIVISOR_SHIFT) 964 & DISPLAY_PLL_M2_DIVISOR_MASK)); 965 } 914 966 915 967 uint32 pll = DISPLAY_PLL_ENABLED | DISPLAY_PLL_NO_VGA_CONTROL; 916 968 if (gInfo->shared_info->device_type.InFamily(INTEL_TYPE_9xx)) { 917 pll |= ((1 << (divisors.post1 - 1)) 918 << DISPLAY_PLL_POST1_DIVISOR_SHIFT) 919 & DISPLAY_PLL_9xx_POST1_DIVISOR_MASK; 920 // pll |= ((divisors.post1 - 1) << DISPLAY_PLL_POST1_DIVISOR_SHIFT) 921 // & DISPLAY_PLL_9xx_POST1_DIVISOR_MASK; 969 if (gInfo->shared_info->device_type.InGroup(INTEL_TYPE_IGD)) { 970 pll |= ((1 << (divisors.post1 - 1)) 971 << DISPLAY_PLL_POST1_DIVISOR_SHIFT_IGD) 972 & DISPLAY_PLL_IGD_POST1_DIVISOR_MASK; 973 } else { 974 pll |= ((1 << (divisors.post1 - 1)) 975 << DISPLAY_PLL_POST1_DIVISOR_SHIFT) 976 & DISPLAY_PLL_9xx_POST1_DIVISOR_MASK; 977 // pll |= ((divisors.post1 - 1) << DISPLAY_PLL_POST1_DIVISOR_SHIFT) 978 // & DISPLAY_PLL_9xx_POST1_DIVISOR_MASK; 979 } 922 980 if (divisors.post2_high) 923 981 pll |= DISPLAY_PLL_DIVIDE_HIGH; 924 982 -
headers/private/graphics/intel_extreme/intel_extreme.h
33 33 #define INTEL_TYPE_96x (INTEL_TYPE_9xx | 0x0100) 34 34 #define INTEL_TYPE_Gxx (INTEL_TYPE_9xx | 0x0200) 35 35 #define INTEL_TYPE_G4x (INTEL_TYPE_9xx | 0x0400) 36 #define INTEL_TYPE_IGD (INTEL_TYPE_9xx | 0x0800) 36 37 // models 37 38 #define INTEL_TYPE_MOBILE 0x0008 38 39 #define INTEL_TYPE_915 (INTEL_TYPE_91x) … … 43 44 #define INTEL_TYPE_G33 (INTEL_TYPE_Gxx) 44 45 #define INTEL_TYPE_G45 (INTEL_TYPE_G4x) 45 46 #define INTEL_TYPE_GM45 (INTEL_TYPE_G4x | INTEL_TYPE_MOBILE) 47 #define INTEL_TYPE_IGDG (INTEL_TYPE_IGD) 48 #define INTEL_TYPE_IGDGM (INTEL_TYPE_IGD | INTEL_TYPE_MOBILE) 46 49 47 50 #define DEVICE_NAME "intel_extreme" 48 51 #define INTEL_ACCELERANT_NAME "intel_extreme.accelerant" … … 300 303 #define DISPLAY_PLL_POST1_DIVIDE_2 (1UL << 21) 301 304 #define DISPLAY_PLL_POST1_DIVISOR_MASK 0x001f0000 302 305 #define DISPLAY_PLL_9xx_POST1_DIVISOR_MASK 0x00ff0000 306 #define DISPLAY_PLL_IGD_POST1_DIVISOR_MASK 0x00ff8000 303 307 #define DISPLAY_PLL_POST1_DIVISOR_SHIFT 16 308 #define DISPLAY_PLL_POST1_DIVISOR_SHIFT_IGD 15 304 309 #define DISPLAY_PLL_DIVISOR_1 (1UL << 8) 305 310 #define DISPLAY_PLL_N_DIVISOR_MASK 0x001f0000 311 #define DISPLAY_PLL_N_DIVISOR_MASK_IGD 0x00ff0000 306 312 #define DISPLAY_PLL_M1_DIVISOR_MASK 0x00001f00 307 313 #define DISPLAY_PLL_M2_DIVISOR_MASK 0x0000001f 314 #define DISPLAY_PLL_M2_DIVISOR_MASK_IGD 0x000000ff 308 315 #define DISPLAY_PLL_N_DIVISOR_SHIFT 16 309 316 #define DISPLAY_PLL_M1_DIVISOR_SHIFT 8 310 317 #define DISPLAY_PLL_M2_DIVISOR_SHIFT 0