diff --git a/headers/private/graphics/radeon/radeon_bios.h b/headers/private/graphics/radeon/radeon_bios.h index 3170874816..1597462eb1 100644 --- a/headers/private/graphics/radeon/radeon_bios.h +++ b/headers/private/graphics/radeon/radeon_bios.h @@ -44,8 +44,10 @@ typedef struct { uint8 dummy[15]; uint16 panel_pwr_delay; // 44 - - uint8 dummy2[18]; + uint16 ref_div; // 46 + uint8 post_div; // 48 + uint8 feedback_div; // 49 + uint8 dummy2[14]; uint16 fpi_timing_ofs[20]; // 64 } __attribute__ ((packed)) FPI_BLOCK; diff --git a/headers/private/graphics/radeon/radeon_interface.h b/headers/private/graphics/radeon/radeon_interface.h index 6bd95870ab..edc78da171 100644 --- a/headers/private/graphics/radeon/radeon_interface.h +++ b/headers/private/graphics/radeon/radeon_interface.h @@ -114,7 +114,8 @@ typedef enum { rt_m10, // mobile Radeon 9600 rt_rv360, // Radeon 9600 rt_r350, // Radeon 9800 - rt_r360 // Radeon 9800 + rt_r360, // Radeon 9800 + rt_m11 // Radeon 9700 Mobility } radeon_type; @@ -166,6 +167,10 @@ typedef struct { bool is_fp2; // true, if second flat panel // display_type_e disp_type; + uint16 ref_div; + uint8 post_div; + uint8 feedback_div; + bool fixed_dividers; uint64 h_ratio; // current stretch ratio, needed for overlays uint64 v_ratio; // (mode_res/native_res; 32.32) diff --git a/src/add-ons/accelerants/radeon/SetDisplayMode.c b/src/add-ons/accelerants/radeon/SetDisplayMode.c index e838372265..84e1777f9c 100644 --- a/src/add-ons/accelerants/radeon/SetDisplayMode.c +++ b/src/add-ons/accelerants/radeon/SetDisplayMode.c @@ -204,6 +204,13 @@ void Radeon_SetMode( Radeon_CalcCRTPLLDividers( &si->pll, mode, ÷rs ); else dividers = tv_params->crt_dividers; + + if( (disp_devices & dd_lvds) != 0 && si->flatpanels[0].fixed_dividers ) { + SHOW_FLOW0( 0, "Using fixed dividers for laptop panel" ); + dividers.feedback = si->flatpanels[0].feedback_div; + dividers.post_code = si->flatpanels[0].post_div; + dividers.ref = si->flatpanels[0].ref_div; + } Radeon_CalcPLLRegisters( mode, ÷rs, &pll_values ); diff --git a/src/add-ons/accelerants/radeon/monitor_detection.c b/src/add-ons/accelerants/radeon/monitor_detection.c index 03e7075098..8b11525d8a 100644 --- a/src/add-ons/accelerants/radeon/monitor_detection.c +++ b/src/add-ons/accelerants/radeon/monitor_detection.c @@ -321,6 +321,7 @@ static bool Radeon_DetectTVCRT( accelerator_info *ai ) case rt_rv360: case rt_r350: case rt_r360: + case rt_m11: return Radeon_DetectTVCRT_R300( ai ); case rt_r200: @@ -679,6 +680,7 @@ static display_device_e Radeon_DetectTV( accelerator_info *ai, bool tv_crt_found case rt_rv350: case rt_rv360: case rt_m10: + case rt_m11: case rt_r350: case rt_r360: return Radeon_DetectTV_R300( ai ); diff --git a/src/add-ons/accelerants/radeon/monitor_routing.c b/src/add-ons/accelerants/radeon/monitor_routing.c index ce40b84ff3..7b21753bb6 100644 --- a/src/add-ons/accelerants/radeon/monitor_routing.c +++ b/src/add-ons/accelerants/radeon/monitor_routing.c @@ -61,6 +61,7 @@ void Radeon_ReadMonitorRoutingRegs( case rt_rv360: case rt_r350: case rt_r360: + case rt_m11: values->gpiopad_a = INREG( regs, RADEON_GPIOPAD_A ); break; @@ -155,6 +156,7 @@ void Radeon_CalcMonitorRouting( case rt_r300_4p: case rt_rv350: case rt_m10: + case rt_m11: case rt_rv360: case rt_r350: case rt_r360: @@ -207,6 +209,7 @@ void Radeon_CalcMonitorRouting( case rt_r300_4p: case rt_rv350: case rt_m10: + case rt_m11: case rt_rv360: case rt_r350: case rt_r360: @@ -243,6 +246,7 @@ void Radeon_CalcMonitorRouting( case rt_rv350: case rt_rv360: case rt_m10: + case rt_m11: case rt_r350: case rt_r360: values->gpiopad_a &= ~1; @@ -353,6 +357,7 @@ void Radeon_CalcMonitorRouting( case rt_r300_4p: case rt_rv350: case rt_m10: + case rt_m11: case rt_rv360: case rt_r350: case rt_r360: @@ -486,6 +491,7 @@ void Radeon_ProgramMonitorRouting( case rt_r300_4p: case rt_rv350: case rt_m10: + case rt_m11: case rt_rv360: case rt_r350: case rt_r360: diff --git a/src/add-ons/kernel/drivers/graphics/radeon/CP_setup.c b/src/add-ons/kernel/drivers/graphics/radeon/CP_setup.c index 3586f8e3b3..fe285961dd 100644 --- a/src/add-ons/kernel/drivers/graphics/radeon/CP_setup.c +++ b/src/add-ons/kernel/drivers/graphics/radeon/CP_setup.c @@ -326,6 +326,7 @@ static void loadMicroEngineRAMData( device_info *di ) case rt_r300_4p: case rt_rv350: case rt_rv360: + case rt_m11: case rt_r350: case rt_r360: microcode = r300_cp_microcode; diff --git a/src/add-ons/kernel/drivers/graphics/radeon/bios.c b/src/add-ons/kernel/drivers/graphics/radeon/bios.c index d689dbc5b5..fc1f629645 100644 --- a/src/add-ons/kernel/drivers/graphics/radeon/bios.c +++ b/src/add-ons/kernel/drivers/graphics/radeon/bios.c @@ -278,6 +278,14 @@ static bool Radeon_GetBIOSDFPInfo( device_info *di ) if( di->fp_info.panel_pwr_delay > 2000 || di->fp_info.panel_pwr_delay < 0 ) di->fp_info.panel_pwr_delay = 2000; + di->fp_info.ref_div = fpi.ref_div; + di->fp_info.post_div = fpi.post_div; + di->fp_info.feedback_div = fpi.feedback_div; + + di->fp_info.fixed_dividers = + di->fp_info.ref_div != 0 && di->fp_info.feedback_div > 3; + + // there might be multiple supported resolutions stored; // we are looking for native resolution for( i = 0; i < 20; ++i ) { diff --git a/src/add-ons/kernel/drivers/graphics/radeon/detect.c b/src/add-ons/kernel/drivers/graphics/radeon/detect.c index 4d1376b721..0cff965d70 100644 --- a/src/add-ons/kernel/drivers/graphics/radeon/detect.c +++ b/src/add-ons/kernel/drivers/graphics/radeon/detect.c @@ -79,6 +79,10 @@ #define DEVICE_ID_RADEON_NF 0x4e46 #define DEVICE_ID_RADEON_NG 0x4e47 +// m11 +#define DEVICE_ID_RADEON_NP 0x4e50 // Mobility 9700 +#define DEVICE_ID_RADEON_SE 0x4e52 // Mobility 9700 SE + // r300-4P #define DEVICE_ID_RADEON_AD 0x4144 #define DEVICE_ID_RADEON_AE 0x4145 @@ -91,7 +95,7 @@ #define DEVICE_ID_RADEON_AS 0x4153 // m10 -#define DEVICE_ID_RADEON_NP 0x4e50 +//#define DEVICE_ID_RADEON_NP 0x4e50 // Mobility Fire GL T2 - any idea about the chip? #define DEVICE_ID_RADEON_NT 0x4e54 @@ -198,7 +202,12 @@ RadeonDevice radeon_device_list[] = { { DEVICE_ID_RADEON_AS, rt_rv350, "Radeon 9600 AS" }, // M10 (based on rv350) - { DEVICE_ID_RADEON_NP, rt_m10, "Radeon Mobility 9600 NP" }, +// { DEVICE_ID_RADEON_NP, rt_m10, "Radeon Mobility 9600 NP" }, + + // M11 (based on rv360) + { DEVICE_ID_RADEON_NP, rt_m11, "Radeon 9700 Mobility" }, + { DEVICE_ID_RADEON_SE, rt_m11, "Radeon 9700 Mobility SE" }, + // not sure about that: ROM signature is "RADEON" which means r100 { DEVICE_ID_RADEON_NT, rt_m10, "Radeon Mobility FireGL T2" }, @@ -308,7 +317,8 @@ static struct { { "m10", tc_internal_rt2, true, true, false, true, false }, { "rv360", tc_internal_rt2, true, false, true, true, false }, { "r350", tc_internal_rt2, true, false, true, true, false }, - { "r360", tc_internal_rt2, true, false, true, true, false } + { "r360", tc_internal_rt2, true, false, true, true, false }, + { "m11", tc_internal_rt2, true, true, false, true, false } };