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); } }
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); } }