#include "radeon_accelerant.h"
#include "GlobalData.h"
#include "generic.h"
#include <GraphicsDefs.h>
#include <string.h>
status_t
GET_DISPLAY_MODE(display_mode *mode)
{
virtual_card *vc = ai->vc;
*mode = vc->mode;
Radeon_HideMultiMode(vc, mode);
return B_OK;
}
status_t
GET_FRAME_BUFFER_CONFIG(frame_buffer_config *afb)
{
virtual_card *vc = ai->vc;
*afb = vc->fbc;
return B_OK;
}
status_t
GET_PIXEL_CLOCK_LIMITS(display_mode *dm, uint32 *low, uint32 *high)
{
uint32 total_pix = (uint32)dm->timing.h_total * (uint32)dm->timing.v_total;
uint32 clock_limit = ai->si->pll.max_pll_freq * 10;
*low = (total_pix * 48L) / 1000L;
if (*low > clock_limit)
return B_ERROR;
*high = clock_limit;
return B_OK;
}
#ifdef __HAIKU__
status_t
radeon_get_preferred_display_mode(display_mode* mode)
{
fp_info *fpInfo = &ai->si->flatpanels[0];
disp_entity* routes = &ai->si->routing;
uint32 i;
if (routes->port_info[0].edid_valid || routes->port_info[1].edid_valid) {
return B_ERROR;
}
if ((ai->vc->connected_displays & (dd_dvi | dd_dvi_ext | dd_lvds)) == 0)
return B_NOT_SUPPORTED;
for (i = 0; i < ai->si->mode_count; ++i) {
if (ai->mode_list[i].timing.h_display == fpInfo->panel_xres
&& ai->mode_list[i].timing.v_display == fpInfo->panel_yres
&& ai->mode_list[i].virtual_width == fpInfo->panel_xres
&& ai->mode_list[i].virtual_height == fpInfo->panel_yres
&& ai->mode_list[i].space == B_RGB32_LITTLE) {
memcpy(mode, &ai->mode_list[i], sizeof(display_mode));
return B_OK;
}
}
return B_ERROR;
}
status_t
radeon_get_edid_info(void* info, size_t size, uint32* _version)
{
disp_entity* routes = &ai->si->routing;
int32 index;
if (size < sizeof(struct edid1_info))
return B_BUFFER_OVERFLOW;
if (routes->port_info[0].edid_valid)
index = 0;
else if (routes->port_info[1].edid_valid)
index = 1;
else
return B_ERROR;
memcpy(info, &routes->port_info[index].edid, sizeof(struct edid1_info));
*_version = EDID_VERSION_1;
return B_OK;
}
#endif
sem_id
ACCELERANT_RETRACE_SEMAPHORE(void)
{
virtual_card *vc = ai->vc;
int crtcIndex;
if( vc->used_crtc[0] )
crtcIndex = 0;
else
crtcIndex = 1;
return ai->si->crtc[crtcIndex].vblank;
}