Author: kallisti5 Date: 2011-10-10 00:04:07 +0200 (Mon, 10 Oct 2011) New Revision: 42817 Changeset: https://dev.haiku-os.org/changeset/42817 Modified: haiku/trunk/src/add-ons/accelerants/radeon_hd/bios.cpp 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/encoder.cpp haiku/trunk/src/add-ons/accelerants/radeon_hd/mode.cpp Log: * remove some legacy code * don't init asic unless needed * do dpms by hand on mode set * detect tv and skip during detection for now Modified: haiku/trunk/src/add-ons/accelerants/radeon_hd/bios.cpp =================================================================== --- haiku/trunk/src/add-ons/accelerants/radeon_hd/bios.cpp 2011-10-09 19:56:19 UTC (rev 42816) +++ haiku/trunk/src/add-ons/accelerants/radeon_hd/bios.cpp 2011-10-09 22:04:07 UTC (rev 42817) @@ -159,13 +159,8 @@ radeon_bios_init_scratch(); atom_allocate_fb_scratch(gAtomContext); - // TODO : Always post bios for now... not doing this - // at a later date may save boot time - atom_asic_init(gAtomContext); - - #if 0 // post card atombios if needed - if (!radeon_bios_isposted()) { + if (radeon_bios_isposted() == false) { TRACE("%s: init AtomBIOS for this card as it is not not posted\n", __func__); // radeon_gpu_reset(); // <= r500 only? @@ -174,7 +169,6 @@ TRACE("%s: AtomBIOS is already posted\n", __func__); } - #endif return B_OK; } Modified: haiku/trunk/src/add-ons/accelerants/radeon_hd/display.cpp =================================================================== --- haiku/trunk/src/add-ons/accelerants/radeon_hd/display.cpp 2011-10-09 19:56:19 UTC (rev 42816) +++ haiku/trunk/src/add-ons/accelerants/radeon_hd/display.cpp 2011-10-09 22:04:07 UTC (rev 42817) @@ -282,7 +282,6 @@ gConnector[i]->line_mux = ci.sucI2cId.ucAccess; // TODO : give tv unique connector ids - // TODO : ddc bus // Always set CRT1 and CRT2 as VGA, some cards incorrectly set // VGA ports as DVI @@ -603,6 +602,15 @@ gConnector[connector_index]->type = connector_type; gConnector[connector_index]->object_id = connector_object_id; + + if (connector_type == VIDEO_CONNECTOR_COMPOSITE + || connector_type == VIDEO_CONNECTOR_SVIDEO + || connector_type == VIDEO_CONNECTOR_9DIN) { + gConnector[connector_index]->encoder.is_tv = true; + } else { + gConnector[connector_index]->encoder.is_tv = false; + } + connector_index++; } } // end for each display path @@ -624,6 +632,9 @@ for (uint32 id = 0; id < ATOM_MAX_SUPPORTED_DEVICE; id++) { if (gConnector[id]->valid == false) continue; + // TODO : currently we skip TV connectors during detection + if (gConnector[id]->encoder.is_tv == true) + continue; if (displayIndex >= MAX_DISPLAY) continue; @@ -760,6 +771,7 @@ void display_crtc_lock(uint8 crtc_id, int command) { + TRACE("%s\n", __func__); ENABLE_CRTC_PS_ALLOCATION args; int index = GetIndexIntoMasterTable(COMMAND, UpdateCRTC_DoubleBufferRegisters); @@ -776,8 +788,9 @@ void display_crtc_blank(uint8 crtc_id, int command) { - int index = GetIndexIntoMasterTable(COMMAND, BlankCRTC); + TRACE("%s\n", __func__); BLANK_CRTC_PS_ALLOCATION args; + int index = GetIndexIntoMasterTable(COMMAND, BlankCRTC); memset(&args, 0, sizeof(args)); @@ -791,6 +804,7 @@ void display_crtc_scale(uint8 crtc_id, display_mode *mode) { + TRACE("%s\n", __func__); ENABLE_SCALER_PS_ALLOCATION args; int index = GetIndexIntoMasterTable(COMMAND, EnableScaler); @@ -875,17 +889,19 @@ Write32(CRT, regs->grphYStart, 0); Write32(CRT, regs->grphXEnd, mode->virtual_width); Write32(CRT, regs->grphYEnd, mode->virtual_height); - Write32(CRT, regs->grphPitch, bytesPerRow / 4); + Write32(CRT, regs->grphPitch, (bytesPerRow / 4)); Write32(CRT, regs->grphEnable, 1); // Enable Frame buffer Write32(CRT, regs->modeDesktopHeight, mode->virtual_height); - Write32(CRT, regs->viewportStart, 0); + uint32 viewport_w = mode->timing.h_display; + uint32 viewport_h = (mode->timing.v_display + 1) & ~1; + Write32(CRT, regs->viewportStart, 0); Write32(CRT, regs->viewportSize, - mode->timing.v_display | (mode->timing.h_display << 16)); + (viewport_w << 16) | viewport_h); uint32 tmp = Read32(CRT, AVIVO_D1GRPH_FLIP_CONTROL + regs->crtcOffset); tmp &= ~AVIVO_D1GRPH_SURFACE_UPDATE_H_RETRACE_EN; @@ -893,91 +909,12 @@ Write32(OUT, AVIVO_D1MODE_MASTER_UPDATE_MODE + regs->crtcOffset, 0); // Pageflip to happen anywhere in vblank -} - -void -display_crtc_fb_set_legacy(uint8 crtc_id, display_mode *mode) -{ - register_info* regs = gDisplay[crtc_id]->regs; - - uint64 fbAddressInt = gInfo->shared_info->frame_buffer_int; - - Write32(CRT, regs->grphUpdate, (1<<16)); - // Lock for update (isn't this normally the other way around on VGA? - - Write32Mask(CRT, regs->grphEnable, 1, 0x00000001); - // Enable Frame buffer - - Write32(CRT, regs->grphControl, 0); - // Reset stored depth, format, etc - - uint32 bytesPerPixel; - uint32 bitsPerPixel; - - // set color mode on video card - switch (mode->space) { - case B_CMAP8: - bytesPerPixel = 1; - bitsPerPixel = 8; - Write32Mask(CRT, regs->grphControl, - 0, 0x00000703); - break; - case B_RGB15_LITTLE: - bytesPerPixel = 2; - bitsPerPixel = 15; - Write32Mask(CRT, regs->grphControl, - 0x000001, 0x00000703); - break; - case B_RGB16_LITTLE: - bytesPerPixel = 2; - bitsPerPixel = 16; - Write32Mask(CRT, regs->grphControl, - 0x000101, 0x00000703); - break; - case B_RGB24_LITTLE: - bytesPerPixel = 4; - bitsPerPixel = 24; - Write32Mask(CRT, regs->grphControl, - 0x000002, 0x00000703); - break; - case B_RGB32_LITTLE: - default: - bytesPerPixel = 4; - bitsPerPixel = 32; - Write32Mask(CRT, regs->grphControl, - 0x000002, 0x00000703); - break; - } - - uint32 bytesPerRow = mode->virtual_width * bytesPerPixel; - - Write32(CRT, regs->grphSwapControl, 0); - // only for chipsets > r600 - - // Tell GPU which frame buffer address to draw from - Write32(CRT, regs->grphPrimarySurfaceAddr, fbAddressInt & 0xFFFFFFFF); - Write32(CRT, regs->grphSecondarySurfaceAddr, fbAddressInt & 0xFFFFFFFF); - - Write32(CRT, regs->grphSurfaceOffsetX, 0); - Write32(CRT, regs->grphSurfaceOffsetY, 0); - Write32(CRT, regs->grphXStart, 0); - Write32(CRT, regs->grphYStart, 0); - Write32(CRT, regs->grphXEnd, mode->virtual_width); - Write32(CRT, regs->grphYEnd, mode->virtual_height); - Write32(CRT, regs->grphPitch, bytesPerRow / 4); - - Write32(CRT, regs->modeDesktopHeight, mode->virtual_height); - - Write32(CRT, regs->grphUpdate, 0); - // Unlock changed registers - // update shared info gInfo->shared_info->bytes_per_row = bytesPerRow; gInfo->shared_info->current_mode = *mode; gInfo->shared_info->bits_per_pixel = bitsPerPixel; - // TODO : recompute bandwidth via rv515_bandwidth_avivo_update } @@ -1078,6 +1015,7 @@ void display_crtc_power(uint8 crtc_id, int command) { + TRACE("%s\n", __func__); int index = GetIndexIntoMasterTable(COMMAND, EnableCRTC); ENABLE_CRTC_PS_ALLOCATION args; @@ -1093,6 +1031,7 @@ void display_crtc_memreq(uint8 crtc_id, int command) { + TRACE("%s\n", __func__); int index = GetIndexIntoMasterTable(COMMAND, EnableCRTCMemReq); ENABLE_CRTC_PS_ALLOCATION args; Modified: haiku/trunk/src/add-ons/accelerants/radeon_hd/display.h =================================================================== --- haiku/trunk/src/add-ons/accelerants/radeon_hd/display.h 2011-10-09 19:56:19 UTC (rev 42816) +++ haiku/trunk/src/add-ons/accelerants/radeon_hd/display.h 2011-10-09 22:04:07 UTC (rev 42817) @@ -69,7 +69,6 @@ void display_crtc_lock(uint8 crtc_id, int command); void display_crtc_blank(uint8 crtc_id, int command); void display_crtc_scale(uint8 crtc_id, display_mode *mode); -void display_crtc_fb_set_legacy(uint8 crtc_id, display_mode *mode); void display_crtc_fb_set_dce1(uint8 crtc_id, display_mode *mode); void display_crtc_set(uint8 crtc_id, display_mode *mode); void display_crtc_set_dtd(uint8 crtc_id, display_mode *mode); Modified: haiku/trunk/src/add-ons/accelerants/radeon_hd/encoder.cpp =================================================================== --- haiku/trunk/src/add-ons/accelerants/radeon_hd/encoder.cpp 2011-10-09 19:56:19 UTC (rev 42816) +++ haiku/trunk/src/add-ons/accelerants/radeon_hd/encoder.cpp 2011-10-09 22:04:07 UTC (rev 42817) @@ -66,10 +66,10 @@ 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 + if (gConnector[connector_index]->flags + & 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: Modified: haiku/trunk/src/add-ons/accelerants/radeon_hd/mode.cpp =================================================================== --- haiku/trunk/src/add-ons/accelerants/radeon_hd/mode.cpp 2011-10-09 19:56:19 UTC (rev 42816) +++ haiku/trunk/src/add-ons/accelerants/radeon_hd/mode.cpp 2011-10-09 22:04:07 UTC (rev 42817) @@ -102,23 +102,29 @@ { switch(mode) { case B_DPMS_ON: + TRACE("%s: ON\n", __func__); for (uint8 id = 0; id < MAX_DISPLAY; id++) { if (gDisplay[id]->active == false) continue; + display_crtc_lock(id, ATOM_ENABLE); display_crtc_power(id, ATOM_ENABLE); display_crtc_memreq(id, ATOM_ENABLE); display_crtc_blank(id, ATOM_DISABLE); + display_crtc_lock(id, ATOM_DISABLE); } break; case B_DPMS_STAND_BY: case B_DPMS_SUSPEND: case B_DPMS_OFF: + TRACE("%s: OFF\n", __func__); for (uint8 id = 0; id < MAX_DISPLAY; id++) { if (gDisplay[id]->active == false) continue; + display_crtc_lock(id, ATOM_ENABLE); display_crtc_blank(id, ATOM_ENABLE); display_crtc_memreq(id, ATOM_DISABLE); display_crtc_power(id, ATOM_DISABLE); + display_crtc_lock(id, ATOM_DISABLE); } break; } @@ -129,8 +135,6 @@ radeon_set_display_mode(display_mode *mode) { // TODO : multi-monitor? for now we use VESA and not gDisplay edid - radeon_dpms_set(B_DPMS_OFF); - // Set mode on each display for (uint8 id = 0; id < MAX_DISPLAY; id++) { if (gDisplay[id]->active == false) @@ -146,6 +150,9 @@ // *** CRT controler prep display_crtc_lock(id, ATOM_ENABLE); + display_crtc_blank(id, ATOM_ENABLE); + display_crtc_memreq(id, ATOM_DISABLE); + display_crtc_power(id, ATOM_DISABLE); // *** CRT controler mode set // TODO : program SS @@ -155,7 +162,6 @@ // TODO : vvvv : atombios_crtc_set_base display_crtc_fb_set_dce1(id, mode); - // display_crtc_fb_set_legacy(id, mode); // atombios_overscan_setup display_crtc_scale(id, mode); @@ -163,6 +169,9 @@ encoder_mode_set(id, mode->timing.pixel_clock); // *** CRT controler commit + display_crtc_blank(id, ATOM_DISABLE); + display_crtc_memreq(id, ATOM_ENABLE); + display_crtc_power(id, ATOM_ENABLE); display_crtc_lock(id, ATOM_DISABLE); // *** encoder commit @@ -171,8 +180,6 @@ encoder_output_lock(false); } - radeon_dpms_set(B_DPMS_ON); - int32 crtstatus = Read32(CRT, D1CRTC_STATUS); TRACE("CRT0 Status: 0x%X\n", crtstatus); crtstatus = Read32(CRT, D2CRTC_STATUS);