@ -438,6 +438,12 @@
# define SM501_HWC_WIDTH 64
# define SM501_HWC_HEIGHT 64
# ifdef CONFIG_PIXMAN
# define DEFAULT_X_PIXMAN 7
# else
# define DEFAULT_X_PIXMAN 0
# endif
/* SM501 local memory size taken from "linux/drivers/mfd/sm501.c" */
static const uint32_t sm501_mem_local_size [ ] = {
[ 0 ] = 4 * MiB ,
@ -730,7 +736,6 @@ static void sm501_2d_operation(SM501State *s)
switch ( cmd ) {
case 0 : /* BitBlt */
{
static uint32_t tmp_buf [ 16384 ] ;
unsigned int src_x = ( s - > twoD_source > > 16 ) & 0x01FFF ;
unsigned int src_y = s - > twoD_source & 0xFFFF ;
uint32_t src_base = s - > twoD_source_base & 0x03FFFFFF ;
@ -828,9 +833,11 @@ static void sm501_2d_operation(SM501State *s)
de = db + ( width + ( height - 1 ) * dst_pitch ) * bypp ;
overlap = ( db < se & & sb < de ) ;
}
# ifdef CONFIG_PIXMAN
if ( overlap & & ( s - > use_pixman & BIT ( 2 ) ) ) {
/* pixman can't do reverse blit: copy via temporary */
int tmp_stride = DIV_ROUND_UP ( width * bypp , sizeof ( uint32_t ) ) ;
static uint32_t tmp_buf [ 16384 ] ;
uint32_t * tmp = tmp_buf ;
if ( tmp_stride * sizeof ( uint32_t ) * height > sizeof ( tmp_buf ) ) {
@ -860,7 +867,9 @@ static void sm501_2d_operation(SM501State *s)
dst_pitch * bypp / sizeof ( uint32_t ) ,
8 * bypp , 8 * bypp , src_x , src_y ,
dst_x , dst_y , width , height ) ;
} else {
} else
# endif
{
fallback = true ;
}
if ( fallback ) {
@ -894,20 +903,23 @@ static void sm501_2d_operation(SM501State *s)
color = cpu_to_le16 ( color ) ;
}
# ifdef CONFIG_PIXMAN
if ( ! ( s - > use_pixman & BIT ( 0 ) ) | | ( width = = 1 & & height = = 1 ) | |
! pixman_fill ( ( uint32_t * ) & s - > local_mem [ dst_base ] ,
dst_pitch * bypp / sizeof ( uint32_t ) , 8 * bypp ,
dst_x , dst_y , width , height , color ) ) {
/* fallback when pixman failed or we don't want to call it */
uint8_t * d = s - > local_mem + dst_base ;
unsigned int x , y , i ;
for ( y = 0 ; y < height ; y + + ) {
i = ( dst_x + ( dst_y + y ) * dst_pitch ) * bypp ;
for ( x = 0 ; x < width ; x + + , i + = bypp ) {
stn_he_p ( & d [ i ] , bypp , color ) ;
dst_x , dst_y , width , height , color ) )
# endif
{
/* fallback when pixman failed or we don't want to call it */
uint8_t * d = s - > local_mem + dst_base ;
unsigned int x , y , i ;
for ( y = 0 ; y < height ; y + + ) {
i = ( dst_x + ( dst_y + y ) * dst_pitch ) * bypp ;
for ( x = 0 ; x < width ; x + + , i + = bypp ) {
stn_he_p ( & d [ i ] , bypp , color ) ;
}
}
}
}
break ;
}
default :
@ -1878,6 +1890,12 @@ static void sm501_reset(SM501State *s)
static void sm501_init ( SM501State * s , DeviceState * dev ,
uint32_t local_mem_bytes )
{
# ifndef CONFIG_PIXMAN
if ( s - > use_pixman ! = 0 ) {
warn_report ( " x-pixman != 0, not effective without PIXMAN " ) ;
}
# endif
s - > local_mem_size_index = get_local_mem_size_index ( local_mem_bytes ) ;
/* local memory */
@ -2038,7 +2056,8 @@ static void sm501_realize_sysbus(DeviceState *dev, Error **errp)
static Property sm501_sysbus_properties [ ] = {
DEFINE_PROP_UINT32 ( " vram-size " , SM501SysBusState , vram_size , 0 ) ,
DEFINE_PROP_UINT8 ( " x-pixman " , SM501SysBusState , state . use_pixman , 7 ) ,
/* this a debug option, prefer PROP_UINT over PROP_BIT for simplicity */
DEFINE_PROP_UINT8 ( " x-pixman " , SM501SysBusState , state . use_pixman , DEFAULT_X_PIXMAN ) ,
DEFINE_PROP_END_OF_LIST ( ) ,
} ;
@ -2126,7 +2145,7 @@ static void sm501_realize_pci(PCIDevice *dev, Error **errp)
static Property sm501_pci_properties [ ] = {
DEFINE_PROP_UINT32 ( " vram-size " , SM501PCIState , vram_size , 64 * MiB ) ,
DEFINE_PROP_UINT8 ( " x-pixman " , SM501PCIState , state . use_pixman , 7 ) ,
DEFINE_PROP_UINT8 ( " x-pixman " , SM501PCIState , state . use_pixman , DEFAULT_X_PIXMAN ) ,
DEFINE_PROP_END_OF_LIST ( ) ,
} ;