Author: kallisti5 Date: 2011-10-03 02:15:04 +0200 (Mon, 03 Oct 2011) New Revision: 42796 Changeset: https://dev.haiku-os.org/changeset/42796 Modified: haiku/trunk/src/add-ons/accelerants/radeon_hd/display.cpp haiku/trunk/src/add-ons/accelerants/radeon_hd/display.h haiku/trunk/src/add-ons/accelerants/radeon_hd/mode.cpp Log: * use bit-banged edid for monitor ranges * add function to set encoder to crtc * clean up some comments Modified: haiku/trunk/src/add-ons/accelerants/radeon_hd/display.cpp =================================================================== --- haiku/trunk/src/add-ons/accelerants/radeon_hd/display.cpp 2011-10-02 21:25:15 UTC (rev 42795) +++ haiku/trunk/src/add-ons/accelerants/radeon_hd/display.cpp 2011-10-03 00:15:04 UTC (rev 42796) @@ -195,10 +195,8 @@ status_t detect_crt_ranges(uint32 crtid) { - edid1_info *edid = &gInfo->shared_info->edid_info; + edid1_info *edid = &gDisplay[crtid]->edid_info; - // TODO : use radeon ddc to get to connector EDID instead of VESA - // Scan each VESA EDID description for monitor ranges for (uint32 index = 0; index < EDID1_NUM_DETAILED_MONITOR_DESC; index++) { @@ -325,7 +323,6 @@ detect_connectors() { int index = GetIndexIntoMasterTable(DATA, Object_Header); - uint8 frev; uint8 crev; uint16 size; @@ -423,9 +420,9 @@ int32 j; for (j = 0; j < ((B_LENDIAN_TO_HOST_INT16(path->usSize) - 8) / 2); j++) { - uint16 grph_obj_id - = (B_LENDIAN_TO_HOST_INT16(path->usGraphicObjIds[j]) - & OBJECT_ID_MASK) >> OBJECT_ID_SHIFT; + //uint16 grph_obj_id + // = (B_LENDIAN_TO_HOST_INT16(path->usGraphicObjIds[j]) + // & OBJECT_ID_MASK) >> OBJECT_ID_SHIFT; //uint8 grph_obj_num // = (B_LENDIAN_TO_HOST_INT16(path->usGraphicObjIds[j]) & // ENUM_ID_MASK) >> ENUM_ID_SHIFT; @@ -529,7 +526,8 @@ // drm_encoder_helper_add break; } - encoder_object_id = grph_obj_id; + //encoder_object_id = grph_obj_id; + encoder_object_id = encoder_id; } } } else if (grph_obj_type == GRAPH_OBJECT_TYPE_ROUTER) { @@ -1092,3 +1090,143 @@ } +union crtc_source_param { + SELECT_CRTC_SOURCE_PS_ALLOCATION v1; + SELECT_CRTC_SOURCE_PARAMETERS_V2 v2; +}; + + +void +display_crtc_assign_encoder(uint8 crtc_id) +{ + int index = GetIndexIntoMasterTable(COMMAND, SelectCRTC_Source); + union crtc_source_param args; + uint8 frev; + uint8 crev; + + memset(&args, 0, sizeof(args)); + + if (atom_parse_cmd_header(gAtomContext, index, &frev, &crev) + != B_OK) + return; + + uint16 connector_index = gDisplay[crtc_id]->connector_index; + uint16 encoder_id = gConnector[connector_index]->encoder_object_id; + + switch (frev) { + case 1: + switch (crev) { + case 1: + default: + args.v1.ucCRTC = crtc_id; + switch (encoder_id) { + case ENCODER_OBJECT_ID_INTERNAL_TMDS1: + case ENCODER_OBJECT_ID_INTERNAL_KLDSCP_TMDS1: + args.v1.ucDevice = ATOM_DEVICE_DFP1_INDEX; + break; + case ENCODER_OBJECT_ID_INTERNAL_LVDS: + case ENCODER_OBJECT_ID_INTERNAL_LVTM1: + //if (radeon_encoder->devices + // & ATOM_DEVICE_LCD1_SUPPORT) + // args.v1.ucDevice = ATOM_DEVICE_LCD1_INDEX; + //else + args.v1.ucDevice = ATOM_DEVICE_DFP3_INDEX; + break; + case ENCODER_OBJECT_ID_INTERNAL_DVO1: + case ENCODER_OBJECT_ID_INTERNAL_DDI: + case ENCODER_OBJECT_ID_INTERNAL_KLDSCP_DVO1: + args.v1.ucDevice = ATOM_DEVICE_DFP2_INDEX; + break; + case ENCODER_OBJECT_ID_INTERNAL_DAC1: + case ENCODER_OBJECT_ID_INTERNAL_KLDSCP_DAC1: + //if (radeon_encoder->active_device + // & (ATOM_DEVICE_TV_SUPPORT)) + // args.v1.ucDevice = ATOM_DEVICE_TV1_INDEX; + //else if (radeon_encoder->active_device + // & (ATOM_DEVICE_CV_SUPPORT)) + // args.v1.ucDevice = ATOM_DEVICE_CV_INDEX; + //else + args.v1.ucDevice = ATOM_DEVICE_CRT1_INDEX; + break; + case ENCODER_OBJECT_ID_INTERNAL_DAC2: + case ENCODER_OBJECT_ID_INTERNAL_KLDSCP_DAC2: + //if (radeon_encoder->active_device + // & (ATOM_DEVICE_TV_SUPPORT)) + // args.v1.ucDevice = ATOM_DEVICE_TV1_INDEX; + //else if (radeon_encoder->active_device + // & (ATOM_DEVICE_CV_SUPPORT)) + // args.v1.ucDevice = ATOM_DEVICE_CV_INDEX; + //else + args.v1.ucDevice = ATOM_DEVICE_CRT2_INDEX; + break; + } + break; + case 2: + args.v2.ucCRTC = crtc_id; + args.v2.ucEncodeMode + = display_get_encoder_mode(connector_index); + switch (encoder_id) { + case ENCODER_OBJECT_ID_INTERNAL_UNIPHY: + case ENCODER_OBJECT_ID_INTERNAL_UNIPHY1: + case ENCODER_OBJECT_ID_INTERNAL_UNIPHY2: + case ENCODER_OBJECT_ID_INTERNAL_KLDSCP_LVTMA: + ERROR("%s: DIG encoder not yet supported!\n", + __func__); + //dig = radeon_encoder->enc_priv; + //switch (dig->dig_encoder) { + // case 0: + // args.v2.ucEncoderID = ASIC_INT_DIG1_ENCODER_ID; + // break; + // case 1: + // args.v2.ucEncoderID = ASIC_INT_DIG2_ENCODER_ID; + // break; + // case 2: + // args.v2.ucEncoderID = ASIC_INT_DIG3_ENCODER_ID; + // break; + // case 3: + // args.v2.ucEncoderID = ASIC_INT_DIG4_ENCODER_ID; + // break; + // case 4: + // args.v2.ucEncoderID = ASIC_INT_DIG5_ENCODER_ID; + // break; + // case 5: + // args.v2.ucEncoderID = ASIC_INT_DIG6_ENCODER_ID; + // break; + //} + break; + case ENCODER_OBJECT_ID_INTERNAL_KLDSCP_DVO1: + args.v2.ucEncoderID = ASIC_INT_DVO_ENCODER_ID; + break; + case ENCODER_OBJECT_ID_INTERNAL_KLDSCP_DAC1: + //if (radeon_encoder->active_device + // & (ATOM_DEVICE_TV_SUPPORT)) + // args.v2.ucEncoderID = ASIC_INT_TV_ENCODER_ID; + //else if (radeon_encoder->active_device + // & (ATOM_DEVICE_CV_SUPPORT)) + // args.v2.ucEncoderID = ASIC_INT_TV_ENCODER_ID; + //else + args.v2.ucEncoderID = ASIC_INT_DAC1_ENCODER_ID; + break; + case ENCODER_OBJECT_ID_INTERNAL_KLDSCP_DAC2: + //if (radeon_encoder->active_device + // & (ATOM_DEVICE_TV_SUPPORT)) + // args.v2.ucEncoderID = ASIC_INT_TV_ENCODER_ID; + //else if (radeon_encoder->active_device + // & (ATOM_DEVICE_CV_SUPPORT)) + // args.v2.ucEncoderID = ASIC_INT_TV_ENCODER_ID; + //else + args.v2.ucEncoderID = ASIC_INT_DAC2_ENCODER_ID; + break; + } + break; + } + break; + default: + ERROR("%s: Unknown table version: %d, %d\n", __func__, frev, crev); + return; + } + + atom_execute_table(gAtomContext, index, (uint32*)&args); + + // TODO : encoder_crtc_scratch_regs? +} Modified: haiku/trunk/src/add-ons/accelerants/radeon_hd/display.h =================================================================== --- haiku/trunk/src/add-ons/accelerants/radeon_hd/display.h 2011-10-02 21:25:15 UTC (rev 42795) +++ haiku/trunk/src/add-ons/accelerants/radeon_hd/display.h 2011-10-03 00:15:04 UTC (rev 42796) @@ -74,6 +74,7 @@ void display_crtc_set(uint8 crtc_id, display_mode *mode); void display_crtc_set_dtd(uint8 crtc_id, display_mode *mode); void display_crtc_power(uint8 crt_id, int command); +void display_crtc_assign_encoder(uint8 crt_id); #endif /* RADEON_HD_DISPLAY_H */ Modified: haiku/trunk/src/add-ons/accelerants/radeon_hd/mode.cpp =================================================================== --- haiku/trunk/src/add-ons/accelerants/radeon_hd/mode.cpp 2011-10-02 21:25:15 UTC (rev 42795) +++ haiku/trunk/src/add-ons/accelerants/radeon_hd/mode.cpp 2011-10-03 00:15:04 UTC (rev 42796) @@ -38,6 +38,8 @@ status_t create_mode_list(void) { + // TODO : multi-monitor? for now we use VESA and not gDisplay edid + const color_space kRadeonHDSpaces[] = {B_RGB32_LITTLE, B_RGB24_LITTLE, B_RGB16_LITTLE, B_RGB15_LITTLE, B_CMAP8}; @@ -80,6 +82,8 @@ status_t radeon_get_edid_info(void* info, size_t size, uint32* edid_version) { + // TODO : multi-monitor? for now we use VESA and not gDisplay edid + TRACE("%s\n", __func__); if (!gInfo->shared_info->has_edid) return B_ERROR; @@ -96,7 +100,7 @@ status_t radeon_set_display_mode(display_mode *mode) { - // TODO : We set the same VESA EDID mode on each display + // TODO : multi-monitor? for now we use VESA and not gDisplay edid // Set mode on each display for (uint8 id = 0; id < MAX_DISPLAY; id++) { @@ -113,6 +117,8 @@ // uint32 connector_type = gConnector[connector_index]->connector_type; uint32 encoder_type = gConnector[connector_index]->encoder_type; + display_crtc_assign_encoder(id); + // TODO : the first id is the pll we use... this won't work for // more then two monitors pll_set(id, mode->timing.pixel_clock, id);