@ -386,7 +386,9 @@ static void spapr_powerdown_req(Notifier *n, void *opaque)
qemu_irq_pulse ( xics_get_qirq ( spapr - > icp , spapr - > check_exception_irq ) ) ;
}
static void spapr_hotplug_req_event ( sPAPRDRConnector * drc , uint8_t hp_action )
static void spapr_hotplug_req_event ( uint8_t hp_id , uint8_t hp_action ,
sPAPRDRConnectorType drc_type ,
uint32_t drc )
{
sPAPRMachineState * spapr = SPAPR_MACHINE ( qdev_get_machine ( ) ) ;
struct hp_log_full * new_hp ;
@ -395,8 +397,6 @@ static void spapr_hotplug_req_event(sPAPRDRConnector *drc, uint8_t hp_action)
struct rtas_event_log_v6_maina * maina ;
struct rtas_event_log_v6_mainb * mainb ;
struct rtas_event_log_v6_hp * hp ;
sPAPRDRConnectorClass * drck = SPAPR_DR_CONNECTOR_GET_CLASS ( drc ) ;
sPAPRDRConnectorType drc_type = drck - > get_type ( drc ) ;
new_hp = g_malloc0 ( sizeof ( struct hp_log_full ) ) ;
hdr = & new_hp - > hdr ;
@ -427,8 +427,7 @@ static void spapr_hotplug_req_event(sPAPRDRConnector *drc, uint8_t hp_action)
hp - > hdr . section_length = cpu_to_be16 ( sizeof ( * hp ) ) ;
hp - > hdr . section_version = 1 ; /* includes extended modifier */
hp - > hotplug_action = hp_action ;
hp - > drc . index = cpu_to_be32 ( drck - > get_index ( drc ) ) ;
hp - > hotplug_identifier = RTAS_LOG_V6_HP_ID_DRC_INDEX ;
hp - > hotplug_identifier = hp_id ;
switch ( drc_type ) {
case SPAPR_DR_CONNECTOR_TYPE_PCI :
@ -445,19 +444,49 @@ static void spapr_hotplug_req_event(sPAPRDRConnector *drc, uint8_t hp_action)
return ;
}
if ( hp_id = = RTAS_LOG_V6_HP_ID_DRC_COUNT ) {
hp - > drc . count = cpu_to_be32 ( drc ) ;
} else if ( hp_id = = RTAS_LOG_V6_HP_ID_DRC_INDEX ) {
hp - > drc . index = cpu_to_be32 ( drc ) ;
}
rtas_event_log_queue ( RTAS_LOG_TYPE_HOTPLUG , new_hp , true ) ;
qemu_irq_pulse ( xics_get_qirq ( spapr - > icp , spapr - > check_exception_irq ) ) ;
}
void spapr_hotplug_req_add_event ( sPAPRDRConnector * drc )
void spapr_hotplug_req_add_by_index ( sPAPRDRConnector * drc )
{
sPAPRDRConnectorClass * drck = SPAPR_DR_CONNECTOR_GET_CLASS ( drc ) ;
sPAPRDRConnectorType drc_type = drck - > get_type ( drc ) ;
uint32 index = drck - > get_index ( drc ) ;
spapr_hotplug_req_event ( RTAS_LOG_V6_HP_ID_DRC_INDEX ,
RTAS_LOG_V6_HP_ACTION_ADD , drc_type , index ) ;
}
void spapr_hotplug_req_remove_by_index ( sPAPRDRConnector * drc )
{
sPAPRDRConnectorClass * drck = SPAPR_DR_CONNECTOR_GET_CLASS ( drc ) ;
sPAPRDRConnectorType drc_type = drck - > get_type ( drc ) ;
uint32 index = drck - > get_index ( drc ) ;
spapr_hotplug_req_event ( RTAS_LOG_V6_HP_ID_DRC_INDEX ,
RTAS_LOG_V6_HP_ACTION_REMOVE , drc_type , index ) ;
}
void spapr_hotplug_req_add_by_count ( sPAPRDRConnectorType drc_type ,
uint32_t count )
{
spapr_hotplug_req_event ( drc , RTAS_LOG_V6_HP_ACTION_ADD ) ;
spapr_hotplug_req_event ( RTAS_LOG_V6_HP_ID_DRC_COUNT ,
RTAS_LOG_V6_HP_ACTION_ADD , drc_type , count ) ;
}
void spapr_hotplug_req_remove_event ( sPAPRDRConnector * drc )
void spapr_hotplug_req_remove_by_count ( sPAPRDRConnectorType drc_type ,
uint32_t count )
{
spapr_hotplug_req_event ( drc , RTAS_LOG_V6_HP_ACTION_REMOVE ) ;
spapr_hotplug_req_event ( RTAS_LOG_V6_HP_ID_DRC_COUNT ,
RTAS_LOG_V6_HP_ACTION_REMOVE , drc_type , count ) ;
}
static void check_exception ( PowerPCCPU * cpu , sPAPRMachineState * spapr ,