PPC: dbdma: Move static bh variable to device struct

The DBDMA controller has a bottom half to asynchronously process DMA
request queues.

This bh was stored as a gross static variable. Move it into the device
struct instead.

While at it, move all users of it to the new generic kick function.

Signed-off-by: Alexander Graf <agraf@suse.de>
This commit is contained in:
Alexander Graf 2013-06-30 02:22:41 +02:00
parent d1e562deb2
commit d2f0ce2189
2 changed files with 16 additions and 9 deletions

View File

@ -54,6 +54,11 @@
/* /*
*/ */
static DBDMAState *dbdma_from_ch(DBDMA_channel *ch)
{
return container_of(ch, DBDMAState, channels[ch->channel]);
}
#ifdef DEBUG_DBDMA #ifdef DEBUG_DBDMA
static void dump_dbdma_cmd(dbdma_cmd *cmd) static void dump_dbdma_cmd(dbdma_cmd *cmd)
{ {
@ -248,7 +253,6 @@ static void conditional_branch(DBDMA_channel *ch)
} }
} }
static QEMUBH *dbdma_bh;
static void channel_run(DBDMA_channel *ch); static void channel_run(DBDMA_channel *ch);
static void dbdma_end(DBDMA_io *io) static void dbdma_end(DBDMA_io *io)
@ -365,7 +369,7 @@ static void load_word(DBDMA_channel *ch, int key, uint32_t addr,
next(ch); next(ch);
wait: wait:
qemu_bh_schedule(dbdma_bh); DBDMA_kick(dbdma_from_ch(ch));
} }
static void store_word(DBDMA_channel *ch, int key, uint32_t addr, static void store_word(DBDMA_channel *ch, int key, uint32_t addr,
@ -403,7 +407,7 @@ static void store_word(DBDMA_channel *ch, int key, uint32_t addr,
next(ch); next(ch);
wait: wait:
qemu_bh_schedule(dbdma_bh); DBDMA_kick(dbdma_from_ch(ch));
} }
static void nop(DBDMA_channel *ch) static void nop(DBDMA_channel *ch)
@ -420,7 +424,7 @@ static void nop(DBDMA_channel *ch)
conditional_branch(ch); conditional_branch(ch);
wait: wait:
qemu_bh_schedule(dbdma_bh); DBDMA_kick(dbdma_from_ch(ch));
} }
static void stop(DBDMA_channel *ch) static void stop(DBDMA_channel *ch)
@ -538,7 +542,7 @@ static void DBDMA_run_bh(void *opaque)
void DBDMA_kick(DBDMAState *dbdma) void DBDMA_kick(DBDMAState *dbdma)
{ {
qemu_bh_schedule(dbdma_bh); qemu_bh_schedule(dbdma->bh);
} }
void DBDMA_register_channel(void *dbdma, int nchan, qemu_irq irq, void DBDMA_register_channel(void *dbdma, int nchan, qemu_irq irq,
@ -594,10 +598,12 @@ dbdma_control_write(DBDMA_channel *ch)
ch->regs[DBDMA_STATUS] = status; ch->regs[DBDMA_STATUS] = status;
if (status & ACTIVE) if (status & ACTIVE) {
qemu_bh_schedule(dbdma_bh); DBDMA_kick(dbdma_from_ch(ch));
if ((status & FLUSH) && ch->flush) }
if ((status & FLUSH) && ch->flush) {
ch->flush(&ch->io); ch->flush(&ch->io);
}
} }
static void dbdma_write(void *opaque, hwaddr addr, static void dbdma_write(void *opaque, hwaddr addr,
@ -750,7 +756,7 @@ void* DBDMA_init (MemoryRegion **dbdma_mem)
vmstate_register(NULL, -1, &vmstate_dbdma, s); vmstate_register(NULL, -1, &vmstate_dbdma, s);
qemu_register_reset(dbdma_reset, s); qemu_register_reset(dbdma_reset, s);
dbdma_bh = qemu_bh_new(DBDMA_run_bh, s); s->bh = qemu_bh_new(DBDMA_run_bh, s);
return s; return s;
} }

View File

@ -154,6 +154,7 @@ typedef struct DBDMA_channel {
typedef struct { typedef struct {
MemoryRegion mem; MemoryRegion mem;
DBDMA_channel channels[DBDMA_CHANNELS]; DBDMA_channel channels[DBDMA_CHANNELS];
QEMUBH *bh;
} DBDMAState; } DBDMAState;
/* Externally callable functions */ /* Externally callable functions */