[haiku-commits] Change in haiku[master]: radeon: fix computing difference
- From: Gerrit <review@xxxxxxxxxxxxxxxxxxx>
- To: waddlesplash <waddlesplash@xxxxxxxxx>, haiku-commits@xxxxxxxxxxxxx
- Date: Mon, 23 Mar 2020 01:10:36 +0000
From X512 <danger_mail@xxxxxxx>:
X512 has uploaded this change for review. (
https://review.haiku-os.org/c/haiku/+/2401 ;)
Change subject: radeon: fix computing difference
......................................................................
radeon: fix computing difference
Pointed by clang.
Change-Id: I0e104420414fecece87015a0af9a4535ccfc8263
---
M src/add-ons/accelerants/radeon/Acceleration.c
M src/add-ons/accelerants/radeon/pll.c
2 files changed, 202 insertions(+), 202 deletions(-)
git pull ssh://git.haiku-os.org:22/haiku refs/changes/01/2401/1
diff --git a/src/add-ons/accelerants/radeon/Acceleration.c
b/src/add-ons/accelerants/radeon/Acceleration.c
index 8c118a1..7c8b642 100644
--- a/src/add-ons/accelerants/radeon/Acceleration.c
+++ b/src/add-ons/accelerants/radeon/Acceleration.c
@@ -3,7 +3,7 @@
Part of Radeon accelerant
-
+
Public functions to provide 2D hardware acceleration
*/
@@ -22,12 +22,12 @@
// et - ignored
// list - list of rectangles
// count - number of rectangles
-void SCREEN_TO_SCREEN_BLIT_DMA(engine_token *et, blit_params *list, uint32
count)
+void SCREEN_TO_SCREEN_BLIT_DMA(engine_token *et, blit_params *list, uint32
count)
{
virtual_card *vc = ai->vc;
-
+
SHOW_FLOW0( 4, "" );
-
+
(void)et;
while( count > 0 ) {
@@ -35,15 +35,15 @@
START_IB();
- WRITE_IB_PACKET3_HEAD( RADEON_CP_PACKET3_CNTL_BITBLT_MULTI,
count,
+ WRITE_IB_PACKET3_HEAD( RADEON_CP_PACKET3_CNTL_BITBLT_MULTI,
count,
INDIRECT_BUFFER_SIZE, 3, 2 );
-
+
*buffer++ = RADEON_GMC_BRUSH_NONE
| (vc->datatype << RADEON_GMC_DST_DATATYPE_SHIFT)
| RADEON_GMC_SRC_DATATYPE_COLOR
| RADEON_ROP3_S
| RADEON_DP_SRC_SOURCE_MEMORY;
-
+
for( ; sub_count > 0; --sub_count, ++list ) {
*buffer++ = (list->src_left << 16) | list->src_top;
*buffer++ = (list->dest_left << 16) | list->dest_top;
@@ -52,7 +52,7 @@
SUBMIT_IB_VC();
}
-
+
++ai->si->engine.count;
}
@@ -64,9 +64,9 @@
int xdir;
int ydir;
virtual_card *vc = ai->vc;
-
+
SHOW_FLOW0( 4, "" );
-
+
Radeon_WaitForFifo ( ai , 1 );
// Setup for Screen to screen blit
@@ -76,33 +76,33 @@
| RADEON_ROP3_S
|
RADEON_DP_SRC_SOURCE_MEMORY
|
RADEON_GMC_SRC_PITCH_OFFSET_CNTL));
-
-
+
+
for( ; count > 0; --count, ++list ) {
-
+
// make sure there is space in the FIFO for 4 register writes
Radeon_WaitForFifo ( ai , 4 );
-
+
xdir = ((list->src_left < list->dest_left) && (list->src_top ==
list->dest_top)) ? -1 : 1;
ydir = (list->src_top < list->dest_top) ? -1 : 1;
if (xdir < 0) list->src_left += list->width , list->dest_left
+= list->width ;
if (ydir < 0) list->src_top += list->height , list->dest_top +=
list->height ;
-
- OUTREG(ai->regs, RADEON_DP_CNTL, ((xdir >= 0 ?
RADEON_DST_X_LEFT_TO_RIGHT : 0)
+
+ OUTREG(ai->regs, RADEON_DP_CNTL, ((xdir >= 0 ?
RADEON_DST_X_LEFT_TO_RIGHT : 0)
| (ydir >= 0 ? RADEON_DST_Y_TOP_TO_BOTTOM : 0)));
-
+
// Tell the engine where the source data resides.
OUTREG( ai->regs, RADEON_SRC_Y_X, (list->src_top << 16 ) |
list->src_left);
OUTREG( ai->regs, RADEON_DST_Y_X, (list->dest_top << 16 ) |
list->dest_left);
// this is the blt initiator.
OUTREG( ai->regs, RADEON_DST_HEIGHT_WIDTH, ((list->height + 1)
<< 16 ) | (list->width + 1));
-
+
}
-
+
++ai->si->engine.count;
- et = et;
+ (void)et;
}
@@ -112,21 +112,21 @@
// colorIndex - fill colour
// list - list of rectangles
// count - number of rectangles
-void FILL_RECTANGLE_DMA(engine_token *et, uint32 colorIndex,
- fill_rect_params *list, uint32 count)
+void FILL_RECTANGLE_DMA(engine_token *et, uint32 colorIndex,
+ fill_rect_params *list, uint32 count)
{
virtual_card *vc = ai->vc;
-
+
SHOW_FLOW0( 4, "" );
-
+
(void)et;
while( count > 0 ) {
uint32 sub_count;
-
+
START_IB();
- WRITE_IB_PACKET3_HEAD( RADEON_CP_PACKET3_CNTL_PAINT_MULTI,
count,
+ WRITE_IB_PACKET3_HEAD( RADEON_CP_PACKET3_CNTL_PAINT_MULTI,
count,
INDIRECT_BUFFER_SIZE, 2, 3 );
*buffer++ = RADEON_GMC_BRUSH_SOLID_COLOR
@@ -137,11 +137,11 @@
for( ; sub_count > 0; --sub_count, ++list ) {
*buffer++ = (list->left << 16) | list->top;
- *buffer++ =
- ((list->right - list->left + 1) << 16) |
+ *buffer++ =
+ ((list->right - list->left + 1) << 16) |
(list->bottom - list->top + 1);
}
-
+
SUBMIT_IB_VC();
}
@@ -156,31 +156,31 @@
// count - number of rectangles
#define BRUSH_SOLIDCOLOR 0x00000d00
-void FILL_RECTANGLE_PIO(engine_token *et, uint32 colorIndex, fill_rect_params
*list, uint32 count)
+void FILL_RECTANGLE_PIO(engine_token *et, uint32 colorIndex, fill_rect_params
*list, uint32 count)
{
virtual_card *vc = ai->vc;
-
+
SHOW_FLOW( 4, "colorIndex", colorIndex);
-
+
Radeon_WaitForFifo(ai, 3);
OUTREG(ai->regs, RADEON_DP_GUI_MASTER_CNTL, ((vc->datatype <<
RADEON_GMC_DST_DATATYPE_SHIFT)
|
RADEON_GMC_BRUSH_SOLID_COLOR
|
RADEON_GMC_SRC_DATATYPE_COLOR
|
RADEON_ROP3_P));
- // Set brush colour
+ // Set brush colour
OUTREG(ai->regs, RADEON_DP_BRUSH_FRGD_CLR, colorIndex);
OUTREG(ai->regs, RADEON_DP_CNTL, (RADEON_DST_X_LEFT_TO_RIGHT |
RADEON_DST_Y_TOP_TO_BOTTOM));
- for( ; count > 0; --count, ++list )
+ for( ; count > 0; --count, ++list )
{
-
+
Radeon_WaitForFifo(ai, 2);
OUTREG(ai->regs, RADEON_DST_Y_X, (list->top << 16) |
list->left);
OUTREG(ai->regs, RADEON_DST_WIDTH_HEIGHT, ((list->right -
list->left + 1) << 16) | (list->bottom - list->top + 1));
}
++ai->si->engine.count;
- et = et;
+ (void)et;
}
@@ -189,23 +189,23 @@
// et - ignored
// list - list of rectangles
// count - number of rectangles
-void INVERT_RECTANGLE_DMA(engine_token *et, fill_rect_params *list, uint32
count)
+void INVERT_RECTANGLE_DMA(engine_token *et, fill_rect_params *list, uint32
count)
{
virtual_card *vc = ai->vc;
-
+
SHOW_FLOW0( 4, "" );
-
+
(void)et;
while( count > 0 ) {
uint32 sub_count;
-
+
START_IB();
-
+
// take core to leave space for ROP reset!
- WRITE_IB_PACKET3_HEAD( RADEON_CP_PACKET3_CNTL_PAINT_MULTI,
count,
+ WRITE_IB_PACKET3_HEAD( RADEON_CP_PACKET3_CNTL_PAINT_MULTI,
count,
INDIRECT_BUFFER_SIZE - 2, 2, 2 );
-
+
*buffer++ = RADEON_GMC_BRUSH_NONE
| (vc->datatype << RADEON_GMC_DST_DATATYPE_SHIFT)
| RADEON_GMC_SRC_DATATYPE_COLOR
@@ -213,11 +213,11 @@
for( ; sub_count > 0; --sub_count, ++list ) {
*buffer++ = (list->left << 16) | list->top;
- *buffer++ =
- ((list->right - list->left + 1) << 16) |
+ *buffer++ =
+ ((list->right - list->left + 1) << 16) |
(list->bottom - list->top + 1);
}
-
+
// we have to reset ROP, else we get garbage during next
// CPU access; it looks like some cache coherency/forwarding
// problem as it goes away later on; things like flushing the
@@ -239,12 +239,12 @@
}
-void INVERT_RECTANGLE_PIO(engine_token *et, fill_rect_params *list, uint32
count)
+void INVERT_RECTANGLE_PIO(engine_token *et, fill_rect_params *list, uint32
count)
{
virtual_card *vc = ai->vc;
-
+
SHOW_FLOW0( 4, "" );
-
+
Radeon_WaitForFifo(ai, 3);
OUTREG(ai->regs, RADEON_DP_GUI_MASTER_CNTL, ((vc->datatype <<
RADEON_GMC_DST_DATATYPE_SHIFT)
|
RADEON_GMC_BRUSH_NONE
@@ -254,17 +254,17 @@
OUTREG(ai->regs, RADEON_DP_CNTL, (RADEON_DST_X_LEFT_TO_RIGHT |
RADEON_DST_Y_TOP_TO_BOTTOM));
- for( ; count > 0; --count, ++list )
+ for( ; count > 0; --count, ++list )
{
-
+
Radeon_WaitForFifo(ai, 2);
OUTREG(ai->regs, RADEON_DST_Y_X, (list->top << 16) |
list->left);
OUTREG(ai->regs, RADEON_DST_WIDTH_HEIGHT, ((list->right -
list->left + 1) << 16) | (list->bottom - list->top + 1));
}
-
+
++ai->si->engine.count;
- et = et;
-
+ (void)et;
+
}
// fill horizontal spans on screen
@@ -272,39 +272,39 @@
// colorIndex - fill colour
// list - list of spans
// count - number of spans
-void FILL_SPAN_DMA(engine_token *et, uint32 colorIndex, uint16 *list, uint32
count)
+void FILL_SPAN_DMA(engine_token *et, uint32 colorIndex, uint16 *list, uint32
count)
{
virtual_card *vc = ai->vc;
-
+
SHOW_FLOW0( 4, "" );
-
+
(void)et;
while( count > 0 ) {
uint32 sub_count;
-
+
START_IB();
- WRITE_IB_PACKET3_HEAD( RADEON_CP_PACKET3_CNTL_PAINT_MULTI,
count,
+ WRITE_IB_PACKET3_HEAD( RADEON_CP_PACKET3_CNTL_PAINT_MULTI,
count,
INDIRECT_BUFFER_SIZE , 2, 3 );
-
+
*buffer++ = RADEON_GMC_BRUSH_SOLID_COLOR
| (vc->datatype << RADEON_GMC_DST_DATATYPE_SHIFT)
| RADEON_GMC_SRC_DATATYPE_COLOR
| RADEON_ROP3_P;
*buffer++ = colorIndex;
-
+
for( ; sub_count > 0; --sub_count ) {
uint16 y, x, width;
-
+
y = *list++;
x = *list++;
width = *list++ - x + 1;
-
+
*buffer++ = (x << 16) | y;
*buffer++ = (width << 16) | 1;
}
-
+
SUBMIT_IB_VC();
}
@@ -317,45 +317,45 @@
// colorIndex - fill colour
// list - list of spans
// count - number of spans
-void FILL_SPAN_PIO(engine_token *et, uint32 colorIndex, uint16 *list, uint32
count)
+void FILL_SPAN_PIO(engine_token *et, uint32 colorIndex, uint16 *list, uint32
count)
{
virtual_card *vc = ai->vc;
//int offset = 0;
uint16 y, x, width;
-
+
SHOW_FLOW0( 4, "" );
-
+
Radeon_WaitForFifo( ai , 1);
OUTREG( ai->regs, RADEON_DP_GUI_MASTER_CNTL, 0
|
RADEON_GMC_BRUSH_SOLID_COLOR
|
(vc->datatype << RADEON_GMC_DST_DATATYPE_SHIFT)
|
RADEON_GMC_SRC_DATATYPE_COLOR
|
RADEON_ROP3_P);
-
+
if ( ai->si->asic >= rt_rv200 ) {
Radeon_WaitForFifo( ai , 1);
OUTREG( ai->regs, RADEON_DST_LINE_PATCOUNT, 0x55 <<
RADEON_BRES_CNTL_SHIFT);
}
Radeon_WaitForFifo( ai , 1);
- OUTREG( ai->regs, RADEON_DP_BRUSH_FRGD_CLR, colorIndex);
-
+ OUTREG( ai->regs, RADEON_DP_BRUSH_FRGD_CLR, colorIndex);
+
for( ; count > 0; --count ) {
-
+
Radeon_WaitForFifo( ai , 2);
-
+
y = *list++;
x = *list++;
width = *list++ - x + 1;
OUTREG( ai->regs, RADEON_DST_LINE_START, (y << 16) | x);
OUTREG( ai->regs, RADEON_DST_LINE_END, ((y) << 16) | (x +
width));
-
+
}
-
+
++ai->si->engine.count;
- et = et;
+ (void)et;
}
@@ -398,7 +398,7 @@
{
SHOW_FLOW0( 3, "" );
- // forget about 3D
+ // forget about 3D
if ( ai->si->acc_dma ) {
START_IB();
WRITE_IB_REG( RADEON_RB3D_CNTL, 0 );
@@ -415,38 +415,38 @@
virtual_card *vc = ai->vc;
uint32 pitch_offset;
uint32 *buffer = NULL, *buffer_start = NULL;
-
+
SHOW_FLOW0( 4, "" );
// set offset of frame buffer and pitch
- pitch_offset =
- ((ai->si->memory[mt_local].virtual_addr_start + vc->fb_offset)
10) |
+ pitch_offset =
+ ((ai->si->memory[mt_local].virtual_addr_start + vc->fb_offset)
10) |
((vc->pitch >> 6) << 22);
-
+
if ( ai->si->acc_dma ) {
// make sure buffer is not used
Radeon_InvalidateStateBuffer( ai, vc->state_buffer_idx );
buffer = buffer_start = Radeon_GetIndirectBufferPtr( ai,
vc->state_buffer_idx );
-
+
WRITE_IB_REG( RADEON_DEFAULT_OFFSET, pitch_offset );
WRITE_IB_REG( RADEON_DST_PITCH_OFFSET, pitch_offset );
WRITE_IB_REG( RADEON_SRC_PITCH_OFFSET, pitch_offset );
- // no sissors
- WRITE_IB_REG( RADEON_DEFAULT_SC_BOTTOM_RIGHT,
+ // no sissors
+ WRITE_IB_REG( RADEON_DEFAULT_SC_BOTTOM_RIGHT,
(RADEON_DEFAULT_SC_RIGHT_MAX |
RADEON_DEFAULT_SC_BOTTOM_MAX));
// general fluff
- WRITE_IB_REG( RADEON_DP_GUI_MASTER_CNTL,
+ WRITE_IB_REG( RADEON_DP_GUI_MASTER_CNTL,
(datatype << RADEON_GMC_DST_DATATYPE_SHIFT)
| RADEON_GMC_CLR_CMP_CNTL_DIS
-
- | RADEON_GMC_BRUSH_SOLID_COLOR
+
+ | RADEON_GMC_BRUSH_SOLID_COLOR
| RADEON_GMC_SRC_DATATYPE_COLOR
-
+
| RADEON_ROP3_P
| RADEON_DP_SRC_SOURCE_MEMORY
| RADEON_GMC_WR_MSK_DIS );
-
+
// most of this init is probably not necessary
// as we neither draw lines nor use brushes
WRITE_IB_REG( RADEON_DP_BRUSH_FRGD_CLR, 0xffffffff);
@@ -454,7 +454,7 @@
WRITE_IB_REG( RADEON_DP_SRC_FRGD_CLR, 0xffffffff);
WRITE_IB_REG( RADEON_DP_SRC_BKGD_CLR, 0x00000000);
WRITE_IB_REG( RADEON_DP_WRITE_MASK, 0xffffffff);
-
+
// this is required
vc->state_buffer_size = buffer - buffer_start;
@@ -463,21 +463,21 @@
OUTREG( ai->regs, RADEON_DEFAULT_OFFSET, pitch_offset );
OUTREG( ai->regs, RADEON_DST_PITCH_OFFSET, pitch_offset );
OUTREG( ai->regs, RADEON_SRC_PITCH_OFFSET, pitch_offset );
- // no sissors
+ // no sissors
OUTREG( ai->regs, RADEON_DEFAULT_SC_BOTTOM_RIGHT,
(RADEON_DEFAULT_SC_RIGHT_MAX
| RADEON_DEFAULT_SC_BOTTOM_MAX));
// general fluff
- OUTREG( ai->regs, RADEON_DP_GUI_MASTER_CNTL,
+ OUTREG( ai->regs, RADEON_DP_GUI_MASTER_CNTL,
(datatype << RADEON_GMC_DST_DATATYPE_SHIFT)
| RADEON_GMC_CLR_CMP_CNTL_DIS
-
- | RADEON_GMC_BRUSH_SOLID_COLOR
+
+ | RADEON_GMC_BRUSH_SOLID_COLOR
| RADEON_GMC_SRC_DATATYPE_COLOR
-
+
| RADEON_ROP3_P
| RADEON_DP_SRC_SOURCE_MEMORY
| RADEON_GMC_WR_MSK_DIS );
-
+
// most of this init is probably not necessary
// as we neither draw lines nor use brushes
OUTREG( ai->regs, RADEON_DP_BRUSH_FRGD_CLR, 0xffffffff);
@@ -487,7 +487,7 @@
OUTREG( ai->regs, RADEON_DP_WRITE_MASK, 0xffffffff);
}
-
+
ai->si->active_vc = vc->id;
}
@@ -496,7 +496,7 @@
void Radeon_AllocateVirtualCardStateBuffer( accelerator_info *ai )
{
virtual_card *vc = ai->vc;
-
+
vc->state_buffer_idx = Radeon_AllocIndirectBuffer( ai, false );
// mark as being unused
vc->state_buffer_size = -1;
diff --git a/src/add-ons/accelerants/radeon/pll.c
b/src/add-ons/accelerants/radeon/pll.c
index 1dc57ae..80543d8 100644
--- a/src/add-ons/accelerants/radeon/pll.c
+++ b/src/add-ons/accelerants/radeon/pll.c
@@ -1,9 +1,9 @@
/*
Copyright (c) 2002-2004, Thomas Kurschel
-
+
Part of Radeon accelerant
-
+
Takes care of PLL
*/
@@ -17,29 +17,29 @@
#include "set_mode.h"
-static void Radeon_PLLWaitForReadUpdateComplete(
+static void Radeon_PLLWaitForReadUpdateComplete(
accelerator_info *ai, int crtc_idx )
{
int i;
-
+
// we should wait forever, but
// 1. this is unsafe
// 2. some r300 loop forever (reported by XFree86)
for( i = 0; i < 10000; ++i ) {
- if( (Radeon_INPLL( ai->regs, ai->si->asic, crtc_idx == 0 ?
RADEON_PPLL_REF_DIV : RADEON_P2PLL_REF_DIV )
+ if( (Radeon_INPLL( ai->regs, ai->si->asic, crtc_idx == 0 ?
RADEON_PPLL_REF_DIV : RADEON_P2PLL_REF_DIV )
& RADEON_PPLL_ATOMIC_UPDATE_R) == 0 )
return;
}
}
-static void Radeon_PLLWriteUpdate(
+static void Radeon_PLLWriteUpdate(
accelerator_info *ai, int crtc_idx )
{
Radeon_PLLWaitForReadUpdateComplete( ai, crtc_idx );
-
- Radeon_OUTPLLP( ai->regs, ai->si->asic,
+
+ Radeon_OUTPLLP( ai->regs, ai->si->asic,
crtc_idx == 0 ? RADEON_PPLL_REF_DIV : RADEON_P2PLL_REF_DIV,
- RADEON_PPLL_ATOMIC_UPDATE_W,
+ RADEON_PPLL_ATOMIC_UPDATE_W,
~RADEON_PPLL_ATOMIC_UPDATE_W );
}
@@ -48,7 +48,7 @@
// freq - whished frequency in Hz
// fixed_post_div - if != 0, fixed divider to be used
// dividers - filled with proper dividers
-void Radeon_CalcPLLDividers(
+void Radeon_CalcPLLDividers(
const pll_info *pll, uint32 freq, uint fixed_post_div, pll_dividers
*dividers )
{
// the PLL gets the reference
@@ -63,24 +63,24 @@
// pll_out = vco / post_div / extra_post_div
// = ref_freq * feedback_div * extra_feedback_div
/ (ref_div * post_div * extra_post_div)
// where extra_post_div _may_ be choosable between 1 and 2
-
+
// synonyms are:
// ref_div = M
// feedback_div = N
// post_div = P
-
- int
+
+ int
min_post_div_idx, max_post_div_idx,
post_div_idx, extra_post_div_idx,
best_post_div_idx, best_extra_post_div_idx;
-
+
uint32
best_ref_div, best_feedback_div, best_freq;
int32
best_error, best_vco_dev;
-
+
best_error = 999999999;
-
+
// make compiler happy
best_post_div_idx = 0;
best_extra_post_div_idx = 0;
@@ -91,42 +91,42 @@
if( fixed_post_div == 0 ) {
min_post_div_idx = 0;
- for(
- max_post_div_idx = 0;
- pll->post_divs[max_post_div_idx].divider != 0;
+ for(
+ max_post_div_idx = 0;
+ pll->post_divs[max_post_div_idx].divider != 0;
++max_post_div_idx )
;
--max_post_div_idx;
} else {
- for(
- min_post_div_idx = 0;
- pll->post_divs[min_post_div_idx].divider !=
fixed_post_div;
+ for(
+ min_post_div_idx = 0;
+ pll->post_divs[min_post_div_idx].divider !=
fixed_post_div;
++min_post_div_idx )
;
max_post_div_idx = min_post_div_idx;
-
+
//SHOW_FLOW( 2, "idx of fixed post divider: %d",
min_post_div_idx );
}
-
+
// post dividers are quite restrictive, so they provide little search
space only
for( extra_post_div_idx = 0;
pll->extra_post_divs[extra_post_div_idx].divider != 0; ++extra_post_div_idx ) {
for( post_div_idx = min_post_div_idx; post_div_idx <=
max_post_div_idx; ++post_div_idx ) {
uint32 ref_div;
- uint32 post_div =
- pll->post_divs[post_div_idx].divider
+ uint32 post_div =
+ pll->post_divs[post_div_idx].divider
*
pll->extra_post_divs[extra_post_div_idx].divider;
-
+
// post devider determines VCO frequency, so determine
and verify it;
// freq is in Hz, everything else is in 10 kHz units
// we use 10 kHz units as long as possible to avoid
uint32 overflows
uint32 vco = (freq / 10000) * post_div;
-
+
//SHOW_FLOW( 2, "post_div=%d, vco=%d", post_div, vco );
-
+
if( vco < pll->vco_min || vco > pll->vco_max )
continue;
-
+
//SHOW_FLOW0( 2, "jau" );
// we can either iterate through feedback or reference
dividers;
@@ -134,40 +134,40 @@
for( ref_div = pll->min_ref_div; ref_div <=
pll->max_ref_div; ++ref_div ) {
uint32 feedback_div, cur_freq;
int32 error, vco_dev;
-
+
// this implies the frequency of the lock unit
uint32 pll_in = pll->ref_freq / ref_div;
-
+
if( pll_in < pll->pll_in_min || pll_in >
pll->pll_in_max )
continue;
-
- // well, only one variable is left
+
+ // well, only one variable is left
// timing is almost certainly valid, time to
use Hz units
- feedback_div = RoundDiv64(
- (int64)freq * ref_div * post_div,
+ feedback_div = RoundDiv64(
+ (int64)freq * ref_div * post_div,
pll->ref_freq * 10000 *
pll->extra_feedback_div);
-
+
if( feedback_div < pll->min_feedback_div ||
feedback_div > pll->max_feedback_div )
continue;
-
+
// let's see what we've got
- cur_freq = RoundDiv64(
- (int64)pll->ref_freq * 10000 *
feedback_div * pll->extra_feedback_div,
+ cur_freq = RoundDiv64(
+ (int64)pll->ref_freq * 10000 *
feedback_div * pll->extra_feedback_div,
ref_div * post_div );
-
- // absolute error in terms of output clock
- error = abs( cur_freq - freq );
+
+ // absolute error in terms of output clock
+ error = abs( (int32)cur_freq - (int32)freq );
// deviation from perfect VCO clock
- vco_dev = abs( vco - pll->best_vco );
-
+ vco_dev = abs( (int32)vco -
(int32)(pll->best_vco) );
+
// if there is no optimal VCO frequency, choose
setting with less error;
// if there is an optimal VCO frequency, choose
new settings if
// - error is reduced significantly (100 Hz or
more), or
// - output frequency is almost the same (less
then 100 Hz difference) but
- // VCO frequency is closer to best
frequency
+ // VCO frequency is closer to best
frequency
if( (pll->best_vco == 0 && error < best_error)
||
- (pll->best_vco != 0 &&
+ (pll->best_vco != 0 &&
(error < best_error - 100 ||
(abs( error - best_error ) < 100 &&
vco_dev < best_vco_dev ))))
{
@@ -193,57 +193,57 @@
dividers->freq = best_freq;
/*SHOW_FLOW( 2, "post_code=%d, post=%d, extra_post_code=%d,
extra_post=%d, ref=%d, feedback=%d, freq=%d",
- dividers->post_code, dividers->post, dividers->extra_post_code,
+ dividers->post_code, dividers->post, dividers->extra_post_code,
dividers->extra_post, dividers->ref, dividers->feedback,
dividers->freq );*/
}
// with a TV timing given, find a corresponding CRT timing.
-// both timing must meet at the end of a frame, but as the PLL has a
-// limited frequency granularity, you don't really get a CRT timing
+// both timing must meet at the end of a frame, but as the PLL has a
+// limited frequency granularity, you don't really get a CRT timing
// with precisely the same frame rate; the solution is to tweak the CRT
// image a bit by making it wider/taller/smaller until the frame rate
-// drift is under a given threshold;
+// drift is under a given threshold;
// we follow two aims:
// - primary, keep frame rate in sync
// - secondary, only tweak as much as unavoidable
-void Radeon_MatchCRTPLL(
- const pll_info *pll,
- uint32 tv_v_total, uint32 tv_h_total, uint32 tv_frame_size_adjust,
uint32 freq,
- const display_mode *mode, uint32 max_v_tweak, uint32 max_h_tweak,
- uint32 max_frame_rate_drift, uint32 fixed_post_div,
+void Radeon_MatchCRTPLL(
+ const pll_info *pll,
+ uint32 tv_v_total, uint32 tv_h_total, uint32 tv_frame_size_adjust,
uint32 freq,
+ const display_mode *mode, uint32 max_v_tweak, uint32 max_h_tweak,
+ uint32 max_frame_rate_drift, uint32 fixed_post_div,
pll_dividers *dividers,
display_mode *tweaked_mode )
{
uint32 v_tweak;
int32 v_tweak_dir;
uint32 pix_per_tv_frame;
-
+
SHOW_FLOW( 2, "fixed post divider: %d", fixed_post_div );
-
+
// number of TV pixels per frame
pix_per_tv_frame = tv_v_total * tv_h_total + tv_frame_size_adjust;
-
+
// starting with original data we tweak total horizontal and vertical
size
// more and more until we find a proper CRT clock frequency
for( v_tweak = 0; v_tweak <= max_v_tweak; ++v_tweak ) {
for( v_tweak_dir = -1; v_tweak_dir <= 1; v_tweak_dir += 2 ) {
uint32 h_tweak;
int32 h_tweak_dir;
-
+
uint32 v_total = mode->timing.v_total + v_tweak *
v_tweak_dir;
-
+
for( h_tweak = 0; h_tweak <= max_h_tweak; ++h_tweak ) {
for( h_tweak_dir = -1; h_tweak_dir <= 1;
h_tweak_dir += 2 ) {
uint32 pix_per_crt_frame,
frame_rate_drift;
uint32 crt_freq;
uint32 abs_crt_error;
-
+
uint32 h_total = mode->timing.h_total +
h_tweak * h_tweak_dir;
-
+
// number of CRT pixels per frame
pix_per_crt_frame = v_total * h_total;
-
+
// frame rate must be:
// frame_rate = freq /
pix_per_tv_half_frame
// because of interlace, we must use
half frames
@@ -253,14 +253,14 @@
// = freq /
(pix_per_tv_frame / 2) * pix_per_crt_frame
// formula is reordered as usual to
improve accuracy
crt_freq = (uint64)freq *
pix_per_crt_frame * 2 / pix_per_tv_frame;
-
+
Radeon_CalcPLLDividers( pll, crt_freq,
fixed_post_div, dividers );
-
+
// get absolute CRT clock error per
second
- abs_crt_error = abs( dividers->freq -
crt_freq );
-
+ abs_crt_error = abs(
(int32)(dividers->freq) - (int32)crt_freq );
+
//SHOW_INFO( 2, "whished=%d, is=%d",
crt_freq, dividers->freq );
-
+
// convert it to relative CRT clock
error:
// rel_error = abs_crt_error /
crt_freq
// now to absolute TV clock error per
second:
@@ -274,14 +274,14 @@
// frame_rate_drift =
abs_crt_error / crt_freq * pix_per_tv_frame * frame_rate / frame_rate
// =
abs_crt_error / crt_freq * pix_per_tv_frame
frame_rate_drift =
(uint64)abs_crt_error * pix_per_tv_frame / freq;
-
+
// if drift is within threshold, we
take this setting and stop
// searching (later iteration will
increasingly tweak screen size,
// and we don't really want that)
if( frame_rate_drift <=
max_frame_rate_drift ) {
- SHOW_INFO( 2,
"frame_rate_drift=%d, crt_freq=%d, v_total=%d, h_total=%d",
+ SHOW_INFO( 2,
"frame_rate_drift=%d, crt_freq=%d, v_total=%d, h_total=%d",
frame_rate_drift,
crt_freq, v_total, h_total );
-
+
tweaked_mode->timing.pixel_clock = crt_freq;
tweaked_mode->timing.v_total =
v_total;
tweaked_mode->timing.h_total =
h_total;
@@ -345,7 +345,7 @@
// get PLL parameters of TV PLL
-void Radeon_GetTVPLLConfiguration( const general_pll_info *general_pll,
pll_info *pll,
+void Radeon_GetTVPLLConfiguration( const general_pll_info *general_pll,
pll_info *pll,
bool internal_encoder )
{
pll->post_divs = tv_post_divs;
@@ -376,16 +376,16 @@
pll->post_divs = post_divs;
pll->extra_post_divs = extra_post_divs;
pll->ref_freq = general_pll->ref_freq;
-
+
// in sample code, these limits are set in a strange way;
// as a first shot, I use the BIOS provided limits
/*pll->vco_min = general_pll->min_pll_freq;
pll->vco_max = general_pll->max_pll_freq;*/
-
+
// in sample code, they use a variable post divider during calculation,
but
// use a fixed post divider for programming - the variable post divider
is
- // multiplied to the feedback divider;
- // because of the fixed post divider (3), the VCO always runs far out of
+ // multiplied to the feedback divider;
+ // because of the fixed post divider (3), the VCO always runs far out of
// its stable frequency range, so we have hack the limits
pll->vco_min = 4000;
pll->vco_max = general_pll->max_pll_freq;
@@ -404,11 +404,11 @@
// calc PLL dividers for CRT
// mode->timing.pixel_clock must be in Hz because required accuracy in TV-Out
mode
-void Radeon_CalcCRTPLLDividers(
+void Radeon_CalcCRTPLLDividers(
const general_pll_info *general_pll, const display_mode *mode,
pll_dividers *dividers )
{
- pll_info pll;
-
+ pll_info pll;
+
pll.post_divs = post_divs;
pll.extra_post_divs = extra_post_divs;
pll.ref_freq = general_pll->ref_freq;
@@ -429,17 +429,17 @@
}
-// calculate PLL registers
+// calculate PLL registers
// mode->timing.pixel_clock must be in Hz because required accuracy in TV-Out
mode
// (old: freq is in 10kHz)
-void Radeon_CalcPLLRegisters(
+void Radeon_CalcPLLRegisters(
const display_mode *mode, const pll_dividers *dividers, pll_regs
*values )
{
values->dot_clock_freq = dividers->freq;
values->feedback_div = dividers->feedback;
values->post_div = dividers->post;
values->pll_output_freq = dividers->freq * dividers->post;
-
+
values->ppll_ref_div = dividers->ref;
values->ppll_div_3 = (dividers->feedback | (dividers->post_code <<
16));
// this is mad: the PLL controls the horizontal length in sub-byte
precision!
@@ -451,17 +451,17 @@
}
// write values into PLL registers
-void Radeon_ProgramPLL(
+void Radeon_ProgramPLL(
accelerator_info *ai, int crtc_idx, pll_regs *values )
{
vuint8 *regs = ai->regs;
radeon_type asic = ai->si->asic;
-
+
SHOW_FLOW0( 2, "" );
-
+
// use some other PLL for pixel clock source to not fiddling with PLL
// while somebody is using it
- Radeon_OUTPLLP( regs, asic, crtc_idx == 0 ? RADEON_VCLK_ECP_CNTL :
RADEON_PIXCLKS_CNTL,
+ Radeon_OUTPLLP( regs, asic, crtc_idx == 0 ? RADEON_VCLK_ECP_CNTL :
RADEON_PIXCLKS_CNTL,
RADEON_VCLK_SRC_CPU_CLK, ~RADEON_VCLK_SRC_SEL_MASK );
Radeon_OUTPLLP( regs, asic,
@@ -472,48 +472,48 @@
~(RADEON_PPLL_RESET
| RADEON_PPLL_ATOMIC_UPDATE_EN
| RADEON_PPLL_VGA_ATOMIC_UPDATE_EN) );
-
+
// select divider 3 (well, only required for first PLL)
OUTREGP( regs, RADEON_CLOCK_CNTL_INDEX,
RADEON_PLL_DIV_SEL_DIV3,
~RADEON_PLL_DIV_SEL_MASK );
-
+
RADEONPllErrataAfterIndex(regs, asic);
if( ai->si->new_pll && crtc_idx == 0 ) {
- // starting with r300, the reference divider of the first PLL
was
- // moved to another bit position; at the old location, you only
+ // starting with r300, the reference divider of the first PLL
was
+ // moved to another bit position; at the old location, you only
// find the "BIOS suggested divider"; no clue why they did that
Radeon_OUTPLLP( regs, asic,
- RADEON_PPLL_REF_DIV,
- values->ppll_ref_div << RADEON_PPLL_REF_DIV_ACC_SHIFT,
+ RADEON_PPLL_REF_DIV,
+ values->ppll_ref_div << RADEON_PPLL_REF_DIV_ACC_SHIFT,
~RADEON_PPLL_REF_DIV_ACC_MASK );
} else {
Radeon_OUTPLLP( regs, asic,
- crtc_idx == 0 ? RADEON_PPLL_REF_DIV : RADEON_P2PLL_REF_DIV,
- values->ppll_ref_div,
+ crtc_idx == 0 ? RADEON_PPLL_REF_DIV : RADEON_P2PLL_REF_DIV,
+ values->ppll_ref_div,
~RADEON_PPLL_REF_DIV_MASK );
}
-
+
Radeon_OUTPLLP( regs, asic,
- crtc_idx == 0 ? RADEON_PPLL_DIV_3 : RADEON_P2PLL_DIV_0,
- values->ppll_div_3,
+ crtc_idx == 0 ? RADEON_PPLL_DIV_3 : RADEON_P2PLL_DIV_0,
+ values->ppll_div_3,
~RADEON_PPLL_FB3_DIV_MASK );
Radeon_OUTPLLP( regs, asic,
- crtc_idx == 0 ? RADEON_PPLL_DIV_3 : RADEON_P2PLL_DIV_0,
- values->ppll_div_3,
+ crtc_idx == 0 ? RADEON_PPLL_DIV_3 : RADEON_P2PLL_DIV_0,
+ values->ppll_div_3,
~RADEON_PPLL_POST3_DIV_MASK );
Radeon_PLLWriteUpdate( ai, crtc_idx );
Radeon_PLLWaitForReadUpdateComplete( ai, crtc_idx );
-
+
Radeon_OUTPLL( regs, asic,
- crtc_idx == 0 ? RADEON_HTOTAL_CNTL : RADEON_HTOTAL2_CNTL,
+ crtc_idx == 0 ? RADEON_HTOTAL_CNTL : RADEON_HTOTAL2_CNTL,
values->htotal_cntl );
- Radeon_OUTPLLP( regs, asic,
- crtc_idx == 0 ? RADEON_PPLL_CNTL : RADEON_P2PLL_CNTL, 0,
+ Radeon_OUTPLLP( regs, asic,
+ crtc_idx == 0 ? RADEON_PPLL_CNTL : RADEON_P2PLL_CNTL, 0,
~(RADEON_PPLL_RESET
| RADEON_PPLL_SLEEP
| RADEON_PPLL_ATOMIC_UPDATE_EN
@@ -524,6 +524,6 @@
// use PLL for pixel clock again
Radeon_OUTPLLP( regs, asic,
- crtc_idx == 0 ? RADEON_VCLK_ECP_CNTL : RADEON_PIXCLKS_CNTL,
+ crtc_idx == 0 ? RADEON_VCLK_ECP_CNTL : RADEON_PIXCLKS_CNTL,
RADEON_VCLK_SRC_PPLL_CLK, ~RADEON_VCLK_SRC_SEL_MASK );
}
--
To view, visit
https://review.haiku-os.org/c/haiku/+/2401
To unsubscribe, or for help writing mail filters, visit
https://review.haiku-os.org/settings
Gerrit-Project: haiku
Gerrit-Branch: master
Gerrit-Change-Id: I0e104420414fecece87015a0af9a4535ccfc8263
Gerrit-Change-Number: 2401
Gerrit-PatchSet: 1
Gerrit-Owner: X512 <danger_mail@xxxxxxx>
Gerrit-MessageType: newchange
Other related posts:
- » [haiku-commits] Change in haiku[master]: radeon: fix computing difference - Gerrit