Ejemplo n.º 1
0
static void
htif_handle_entry(struct htif_softc *sc)
{
    uint64_t entry;
    uint8_t devcmd;
    uint8_t devid;

    entry = machine_command(ECALL_HTIF_GET_ENTRY, 0);
    while (entry) {
        devid = HTIF_DEV_ID(entry);
        devcmd = HTIF_DEV_CMD(entry);

        if (devcmd == HTIF_CMD_IDENTIFY) {
            /* Enumeration interrupt */
            if (devid == sc->identify_id)
                sc->identify_done = 1;
        } else {
            /* Device interrupt */
            if (intrs[devid].func != NULL)
                intrs[devid].func(intrs[devid].arg, entry);
        }

        entry = machine_command(ECALL_HTIF_GET_ENTRY, 0);
    }
}
Ejemplo n.º 2
0
static void
htif_blk_intr(void *arg, uint64_t entry)
{
	struct htif_blk_softc *sc;
	uint64_t devcmd;
	uint64_t data;

	sc = arg;

	devcmd = HTIF_DEV_CMD(entry);
	data = HTIF_DEV_DATA(entry);

	if (sc->curtag == data) {
		wmb();
		sc->cmd_done = 1;
		wakeup(&sc->intr_chan);
	} else {
		device_printf(sc->dev, "Unexpected tag %d (should be %d)\n",
		    data, sc->curtag);
	}
}