vfio-ccw: Register a chp_event callback for vfio-ccw
Register the chp_event callback to receive channel path related events for the subchannels managed by vfio-ccw. Signed-off-by: Farhan Ali <alifm@linux.ibm.com> Signed-off-by: Eric Farman <farman@linux.ibm.com> Reviewed-by: Cornelia Huck <cohuck@redhat.com> Message-Id: <20200505122745.53208-3-farman@linux.ibm.com> Signed-off-by: Cornelia Huck <cohuck@redhat.com>
This commit is contained in:
Родитель
9a44ce6c9b
Коммит
b7701dfbf9
|
@ -19,6 +19,7 @@
|
||||||
|
|
||||||
#include <asm/isc.h>
|
#include <asm/isc.h>
|
||||||
|
|
||||||
|
#include "chp.h"
|
||||||
#include "ioasm.h"
|
#include "ioasm.h"
|
||||||
#include "css.h"
|
#include "css.h"
|
||||||
#include "vfio_ccw_private.h"
|
#include "vfio_ccw_private.h"
|
||||||
|
@ -262,6 +263,51 @@ out_unlock:
|
||||||
return rc;
|
return rc;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int vfio_ccw_chp_event(struct subchannel *sch,
|
||||||
|
struct chp_link *link, int event)
|
||||||
|
{
|
||||||
|
struct vfio_ccw_private *private = dev_get_drvdata(&sch->dev);
|
||||||
|
int mask = chp_ssd_get_mask(&sch->ssd_info, link);
|
||||||
|
int retry = 255;
|
||||||
|
|
||||||
|
if (!private || !mask)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
VFIO_CCW_MSG_EVENT(2, "%pUl (%x.%x.%04x): mask=0x%x event=%d\n",
|
||||||
|
mdev_uuid(private->mdev), sch->schid.cssid,
|
||||||
|
sch->schid.ssid, sch->schid.sch_no,
|
||||||
|
mask, event);
|
||||||
|
|
||||||
|
if (cio_update_schib(sch))
|
||||||
|
return -ENODEV;
|
||||||
|
|
||||||
|
switch (event) {
|
||||||
|
case CHP_VARY_OFF:
|
||||||
|
/* Path logically turned off */
|
||||||
|
sch->opm &= ~mask;
|
||||||
|
sch->lpm &= ~mask;
|
||||||
|
if (sch->schib.pmcw.lpum & mask)
|
||||||
|
cio_cancel_halt_clear(sch, &retry);
|
||||||
|
break;
|
||||||
|
case CHP_OFFLINE:
|
||||||
|
/* Path is gone */
|
||||||
|
if (sch->schib.pmcw.lpum & mask)
|
||||||
|
cio_cancel_halt_clear(sch, &retry);
|
||||||
|
break;
|
||||||
|
case CHP_VARY_ON:
|
||||||
|
/* Path logically turned on */
|
||||||
|
sch->opm |= mask;
|
||||||
|
sch->lpm |= mask;
|
||||||
|
break;
|
||||||
|
case CHP_ONLINE:
|
||||||
|
/* Path became available */
|
||||||
|
sch->lpm |= mask & sch->opm;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
static struct css_device_id vfio_ccw_sch_ids[] = {
|
static struct css_device_id vfio_ccw_sch_ids[] = {
|
||||||
{ .match_flags = 0x1, .type = SUBCHANNEL_TYPE_IO, },
|
{ .match_flags = 0x1, .type = SUBCHANNEL_TYPE_IO, },
|
||||||
{ /* end of list */ },
|
{ /* end of list */ },
|
||||||
|
@ -279,6 +325,7 @@ static struct css_driver vfio_ccw_sch_driver = {
|
||||||
.remove = vfio_ccw_sch_remove,
|
.remove = vfio_ccw_sch_remove,
|
||||||
.shutdown = vfio_ccw_sch_shutdown,
|
.shutdown = vfio_ccw_sch_shutdown,
|
||||||
.sch_event = vfio_ccw_sch_event,
|
.sch_event = vfio_ccw_sch_event,
|
||||||
|
.chp_event = vfio_ccw_chp_event,
|
||||||
};
|
};
|
||||||
|
|
||||||
static int __init vfio_ccw_debug_init(void)
|
static int __init vfio_ccw_debug_init(void)
|
||||||
|
|
Загрузка…
Ссылка в новой задаче