提交 d2f0ce21 编写于 作者: A Alexander Graf

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: NAlexander Graf <agraf@suse.de>
上级 d1e562de
...@@ -54,6 +54,11 @@ ...@@ -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) ...@@ -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, ...@@ -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, ...@@ -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) ...@@ -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) ...@@ -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) ...@@ -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) ...@@ -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;
} }
...@@ -154,6 +154,7 @@ typedef struct DBDMA_channel { ...@@ -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 */
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册