@ -227,6 +227,67 @@ static int spapr_fixup_cpu_numa_dt(void *fdt, int offset, CPUState *cs)
return ret ;
}
/* Populate the "ibm,pa-features" property */
static void spapr_populate_pa_features ( CPUPPCState * env , void * fdt , int offset )
{
uint8_t pa_features_206 [ ] = { 6 , 0 ,
0xf6 , 0x1f , 0xc7 , 0x00 , 0x80 , 0xc0 } ;
uint8_t pa_features_207 [ ] = { 24 , 0 ,
0xf6 , 0x1f , 0xc7 , 0xc0 , 0x80 , 0xf0 ,
0x80 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 ,
0x00 , 0x00 , 0x00 , 0x00 , 0x80 , 0x00 ,
0x80 , 0x00 , 0x80 , 0x00 , 0x00 , 0x00 } ;
/* Currently we don't advertise any of the "new" ISAv3.00 functionality */
uint8_t pa_features_300 [ ] = { 64 , 0 ,
0xf6 , 0x1f , 0xc7 , 0xc0 , 0x80 , 0xf0 , /* 0 - 5 */
0x80 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , /* 6 - 11 */
0x00 , 0x00 , 0x00 , 0x00 , 0x80 , 0x00 , /* 12 - 17 */
0x80 , 0x00 , 0x80 , 0x00 , 0x00 , 0x00 , /* 18 - 23 */
0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , /* 24 - 29 */
0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , /* 30 - 35 */
0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , /* 36 - 41 */
0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , /* 42 - 47 */
0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , /* 48 - 53 */
0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , /* 54 - 59 */
0x00 , 0x00 , 0x00 , 0x00 } ; /* 60 - 63 */
uint8_t * pa_features ;
size_t pa_size ;
switch ( POWERPC_MMU_VER ( env - > mmu_model ) ) {
case POWERPC_MMU_VER_2_06 :
pa_features = pa_features_206 ;
pa_size = sizeof ( pa_features_206 ) ;
break ;
case POWERPC_MMU_VER_2_07 :
pa_features = pa_features_207 ;
pa_size = sizeof ( pa_features_207 ) ;
break ;
case POWERPC_MMU_VER_3_00 :
pa_features = pa_features_300 ;
pa_size = sizeof ( pa_features_300 ) ;
break ;
default :
return ;
}
if ( env - > ci_large_pages ) {
/*
* Note : we keep CI large pages off by default because a 64 K capable
* guest provisioned with large pages might otherwise try to map a qemu
* framebuffer ( or other kind of memory mapped PCI BAR ) using 64 K pages
* even if that qemu runs on a 4 k host .
* We dd this bit back here if we are confident this is not an issue
*/
pa_features [ 3 ] | = 0x20 ;
}
if ( kvmppc_has_cap_htm ( ) & & pa_size > 24 ) {
pa_features [ 24 ] | = 0x80 ; /* Transactional memory support */
}
_FDT ( ( fdt_setprop ( fdt , offset , " ibm,pa-features " , pa_features , pa_size ) ) ) ;
}
static int spapr_fixup_cpu_dt ( void * fdt , sPAPRMachineState * spapr )
{
int ret = 0 , offset , cpus_offset ;
@ -379,67 +440,6 @@ static int spapr_populate_memory(sPAPRMachineState *spapr, void *fdt)
return 0 ;
}
/* Populate the "ibm,pa-features" property */
static void spapr_populate_pa_features ( CPUPPCState * env , void * fdt , int offset )
{
uint8_t pa_features_206 [ ] = { 6 , 0 ,
0xf6 , 0x1f , 0xc7 , 0x00 , 0x80 , 0xc0 } ;
uint8_t pa_features_207 [ ] = { 24 , 0 ,
0xf6 , 0x1f , 0xc7 , 0xc0 , 0x80 , 0xf0 ,
0x80 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 ,
0x00 , 0x00 , 0x00 , 0x00 , 0x80 , 0x00 ,
0x80 , 0x00 , 0x80 , 0x00 , 0x00 , 0x00 } ;
/* Currently we don't advertise any of the "new" ISAv3.00 functionality */
uint8_t pa_features_300 [ ] = { 64 , 0 ,
0xf6 , 0x1f , 0xc7 , 0xc0 , 0x80 , 0xf0 , /* 0 - 5 */
0x80 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , /* 6 - 11 */
0x00 , 0x00 , 0x00 , 0x00 , 0x80 , 0x00 , /* 12 - 17 */
0x80 , 0x00 , 0x80 , 0x00 , 0x00 , 0x00 , /* 18 - 23 */
0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , /* 24 - 29 */
0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , /* 30 - 35 */
0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , /* 36 - 41 */
0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , /* 42 - 47 */
0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , /* 48 - 53 */
0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , /* 54 - 59 */
0x00 , 0x00 , 0x00 , 0x00 } ; /* 60 - 63 */
uint8_t * pa_features ;
size_t pa_size ;
switch ( POWERPC_MMU_VER ( env - > mmu_model ) ) {
case POWERPC_MMU_VER_2_06 :
pa_features = pa_features_206 ;
pa_size = sizeof ( pa_features_206 ) ;
break ;
case POWERPC_MMU_VER_2_07 :
pa_features = pa_features_207 ;
pa_size = sizeof ( pa_features_207 ) ;
break ;
case POWERPC_MMU_VER_3_00 :
pa_features = pa_features_300 ;
pa_size = sizeof ( pa_features_300 ) ;
break ;
default :
return ;
}
if ( env - > ci_large_pages ) {
/*
* Note : we keep CI large pages off by default because a 64 K capable
* guest provisioned with large pages might otherwise try to map a qemu
* framebuffer ( or other kind of memory mapped PCI BAR ) using 64 K pages
* even if that qemu runs on a 4 k host .
* We dd this bit back here if we are confident this is not an issue
*/
pa_features [ 3 ] | = 0x20 ;
}
if ( kvmppc_has_cap_htm ( ) & & pa_size > 24 ) {
pa_features [ 24 ] | = 0x80 ; /* Transactional memory support */
}
_FDT ( ( fdt_setprop ( fdt , offset , " ibm,pa-features " , pa_features , pa_size ) ) ) ;
}
static void spapr_populate_cpu_dt ( CPUState * cs , void * fdt , int offset ,
sPAPRMachineState * spapr )
{