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:
		
							parent
							
								
									d1e562deb2
								
							
						
					
					
						commit
						d2f0ce2189
					
				| 
						 | 
				
			
			@ -54,6 +54,11 @@
 | 
			
		|||
/*
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
static DBDMAState *dbdma_from_ch(DBDMA_channel *ch)
 | 
			
		||||
{
 | 
			
		||||
    return container_of(ch, DBDMAState, channels[ch->channel]);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#ifdef DEBUG_DBDMA
 | 
			
		||||
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 dbdma_end(DBDMA_io *io)
 | 
			
		||||
| 
						 | 
				
			
			@ -365,7 +369,7 @@ static void load_word(DBDMA_channel *ch, int key, uint32_t addr,
 | 
			
		|||
    next(ch);
 | 
			
		||||
 | 
			
		||||
wait:
 | 
			
		||||
    qemu_bh_schedule(dbdma_bh);
 | 
			
		||||
    DBDMA_kick(dbdma_from_ch(ch));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
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);
 | 
			
		||||
 | 
			
		||||
wait:
 | 
			
		||||
    qemu_bh_schedule(dbdma_bh);
 | 
			
		||||
    DBDMA_kick(dbdma_from_ch(ch));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void nop(DBDMA_channel *ch)
 | 
			
		||||
| 
						 | 
				
			
			@ -420,7 +424,7 @@ static void nop(DBDMA_channel *ch)
 | 
			
		|||
    conditional_branch(ch);
 | 
			
		||||
 | 
			
		||||
wait:
 | 
			
		||||
    qemu_bh_schedule(dbdma_bh);
 | 
			
		||||
    DBDMA_kick(dbdma_from_ch(ch));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void stop(DBDMA_channel *ch)
 | 
			
		||||
| 
						 | 
				
			
			@ -538,7 +542,7 @@ static void DBDMA_run_bh(void *opaque)
 | 
			
		|||
 | 
			
		||||
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,
 | 
			
		||||
| 
						 | 
				
			
			@ -594,11 +598,13 @@ dbdma_control_write(DBDMA_channel *ch)
 | 
			
		|||
 | 
			
		||||
    ch->regs[DBDMA_STATUS] = status;
 | 
			
		||||
 | 
			
		||||
    if (status & ACTIVE)
 | 
			
		||||
        qemu_bh_schedule(dbdma_bh);
 | 
			
		||||
    if ((status & FLUSH) && ch->flush)
 | 
			
		||||
    if (status & ACTIVE) {
 | 
			
		||||
        DBDMA_kick(dbdma_from_ch(ch));
 | 
			
		||||
    }
 | 
			
		||||
    if ((status & FLUSH) && ch->flush) {
 | 
			
		||||
        ch->flush(&ch->io);
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void dbdma_write(void *opaque, hwaddr addr,
 | 
			
		||||
                        uint64_t value, unsigned size)
 | 
			
		||||
| 
						 | 
				
			
			@ -750,7 +756,7 @@ void* DBDMA_init (MemoryRegion **dbdma_mem)
 | 
			
		|||
    vmstate_register(NULL, -1, &vmstate_dbdma, 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;
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -154,6 +154,7 @@ typedef struct DBDMA_channel {
 | 
			
		|||
typedef struct {
 | 
			
		||||
    MemoryRegion mem;
 | 
			
		||||
    DBDMA_channel channels[DBDMA_CHANNELS];
 | 
			
		||||
    QEMUBH *bh;
 | 
			
		||||
} DBDMAState;
 | 
			
		||||
 | 
			
		||||
/* Externally callable functions */
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue