pseries: Remove hcalls callback
For forgotten historical reasons, PAPR hypercalls for specific virtual IO devices (oh which there are quite a number) are registered via a callback in the VIOsPAPRDeviceInfo structure. This is kind of ugly, so this patch instead registers hypercalls from device_init() functions for each device type. This works just as well, and is cleaner. Signed-off-by: David Gibson <david@gibson.dropbear.id.au> Signed-off-by: Alexander Graf <agraf@suse.de>
This commit is contained in:
parent
157feeadba
commit
1fc02533e7
@ -474,16 +474,6 @@ static target_ulong h_multicast_ctrl(CPUState *env, sPAPREnvironment *spapr,
|
||||
return H_SUCCESS;
|
||||
}
|
||||
|
||||
static void vlan_hcalls(VIOsPAPRBus *bus)
|
||||
{
|
||||
spapr_register_hypercall(H_REGISTER_LOGICAL_LAN, h_register_logical_lan);
|
||||
spapr_register_hypercall(H_FREE_LOGICAL_LAN, h_free_logical_lan);
|
||||
spapr_register_hypercall(H_SEND_LOGICAL_LAN, h_send_logical_lan);
|
||||
spapr_register_hypercall(H_ADD_LOGICAL_LAN_BUFFER,
|
||||
h_add_logical_lan_buffer);
|
||||
spapr_register_hypercall(H_MULTICAST_CTRL, h_multicast_ctrl);
|
||||
}
|
||||
|
||||
static VIOsPAPRDeviceInfo spapr_vlan = {
|
||||
.init = spapr_vlan_init,
|
||||
.devnode = spapr_vlan_devnode,
|
||||
@ -491,7 +481,6 @@ static VIOsPAPRDeviceInfo spapr_vlan = {
|
||||
.dt_type = "network",
|
||||
.dt_compatible = "IBM,l-lan",
|
||||
.signal_mask = 0x1,
|
||||
.hcalls = vlan_hcalls,
|
||||
.qdev.name = "spapr-vlan",
|
||||
.qdev.size = sizeof(VIOsPAPRVLANDevice),
|
||||
.qdev.props = (Property[]) {
|
||||
@ -504,5 +493,11 @@ static VIOsPAPRDeviceInfo spapr_vlan = {
|
||||
static void spapr_vlan_register(void)
|
||||
{
|
||||
spapr_vio_bus_register_withprop(&spapr_vlan);
|
||||
spapr_register_hypercall(H_REGISTER_LOGICAL_LAN, h_register_logical_lan);
|
||||
spapr_register_hypercall(H_FREE_LOGICAL_LAN, h_free_logical_lan);
|
||||
spapr_register_hypercall(H_SEND_LOGICAL_LAN, h_send_logical_lan);
|
||||
spapr_register_hypercall(H_ADD_LOGICAL_LAN_BUFFER,
|
||||
h_add_logical_lan_buffer);
|
||||
spapr_register_hypercall(H_MULTICAST_CTRL, h_multicast_ctrl);
|
||||
}
|
||||
device_init(spapr_vlan_register);
|
||||
|
@ -684,7 +684,6 @@ VIOsPAPRBus *spapr_vio_bus_init(void)
|
||||
VIOsPAPRBus *bus;
|
||||
BusState *qbus;
|
||||
DeviceState *dev;
|
||||
DeviceInfo *qinfo;
|
||||
|
||||
/* Create bridge device */
|
||||
dev = qdev_create(NULL, "spapr-vio-bridge");
|
||||
@ -711,18 +710,6 @@ VIOsPAPRBus *spapr_vio_bus_init(void)
|
||||
spapr_rtas_register("ibm,set-tce-bypass", rtas_set_tce_bypass);
|
||||
spapr_rtas_register("quiesce", rtas_quiesce);
|
||||
|
||||
for (qinfo = device_info_list; qinfo; qinfo = qinfo->next) {
|
||||
VIOsPAPRDeviceInfo *info = (VIOsPAPRDeviceInfo *)qinfo;
|
||||
|
||||
if (qinfo->bus_info != &spapr_vio_bus_info) {
|
||||
continue;
|
||||
}
|
||||
|
||||
if (info->hcalls) {
|
||||
info->hcalls(bus);
|
||||
}
|
||||
}
|
||||
|
||||
return bus;
|
||||
}
|
||||
|
||||
|
@ -75,7 +75,6 @@ typedef struct {
|
||||
const char *dt_name, *dt_type, *dt_compatible;
|
||||
target_ulong signal_mask;
|
||||
int (*init)(VIOsPAPRDevice *dev);
|
||||
void (*hcalls)(VIOsPAPRBus *bus);
|
||||
int (*devnode)(VIOsPAPRDevice *dev, void *fdt, int node_off);
|
||||
} VIOsPAPRDeviceInfo;
|
||||
|
||||
|
@ -135,18 +135,11 @@ void spapr_vty_create(VIOsPAPRBus *bus, uint32_t reg, CharDriverState *chardev)
|
||||
qdev_init_nofail(dev);
|
||||
}
|
||||
|
||||
static void vty_hcalls(VIOsPAPRBus *bus)
|
||||
{
|
||||
spapr_register_hypercall(H_PUT_TERM_CHAR, h_put_term_char);
|
||||
spapr_register_hypercall(H_GET_TERM_CHAR, h_get_term_char);
|
||||
}
|
||||
|
||||
static VIOsPAPRDeviceInfo spapr_vty = {
|
||||
.init = spapr_vty_init,
|
||||
.dt_name = "vty",
|
||||
.dt_type = "serial",
|
||||
.dt_compatible = "hvterm1",
|
||||
.hcalls = vty_hcalls,
|
||||
.qdev.name = "spapr-vty",
|
||||
.qdev.size = sizeof(VIOsPAPRVTYDevice),
|
||||
.qdev.props = (Property[]) {
|
||||
@ -182,5 +175,7 @@ static VIOsPAPRDevice *vty_lookup(sPAPREnvironment *spapr, target_ulong reg)
|
||||
static void spapr_vty_register(void)
|
||||
{
|
||||
spapr_vio_bus_register_withprop(&spapr_vty);
|
||||
spapr_register_hypercall(H_PUT_TERM_CHAR, h_put_term_char);
|
||||
spapr_register_hypercall(H_GET_TERM_CHAR, h_get_term_char);
|
||||
}
|
||||
device_init(spapr_vty_register);
|
||||
|
Loading…
Reference in New Issue
Block a user