omap_dma.c

来自「xen虚拟机源代码安装包」· C语言 代码 · 共 1,842 行 · 第 1/4 页

C
1,842
字号
                uint16_t *ret){    switch (offset) {    case 0xbc0:	/* DMA_LCD_CSDP */        *ret = (s->brust_f2 << 14) |            (s->pack_f2 << 13) |            ((s->data_type_f2 >> 1) << 11) |            (s->brust_f1 << 7) |            (s->pack_f1 << 6) |            ((s->data_type_f1 >> 1) << 0);        break;    case 0xbc2:	/* DMA_LCD_CCR */        *ret = (s->mode_f2 << 14) |            (s->mode_f1 << 12) |            (s->end_prog << 11) |            (s->omap_3_1_compatible_disable << 10) |            (s->repeat << 9) |            (s->auto_init << 8) |            (s->running << 7) |            (s->priority << 6) |            (s->bs << 4);        break;    case 0xbc4:	/* DMA_LCD_CTRL */        qemu_irq_lower(s->irq);        *ret = (s->dst << 8) |            ((s->src & 0x6) << 5) |            (s->condition << 3) |            (s->interrupts << 1) |            s->dual;        break;    case 0xbc8:	/* TOP_B1_L */        *ret = s->src_f1_top & 0xffff;        break;    case 0xbca:	/* TOP_B1_U */        *ret = s->src_f1_top >> 16;        break;    case 0xbcc:	/* BOT_B1_L */        *ret = s->src_f1_bottom & 0xffff;        break;    case 0xbce:	/* BOT_B1_U */        *ret = s->src_f1_bottom >> 16;        break;    case 0xbd0:	/* TOP_B2_L */        *ret = s->src_f2_top & 0xffff;        break;    case 0xbd2:	/* TOP_B2_U */        *ret = s->src_f2_top >> 16;        break;    case 0xbd4:	/* BOT_B2_L */        *ret = s->src_f2_bottom & 0xffff;        break;    case 0xbd6:	/* BOT_B2_U */        *ret = s->src_f2_bottom >> 16;        break;    case 0xbd8:	/* DMA_LCD_SRC_EI_B1 */        *ret = s->element_index_f1;        break;    case 0xbda:	/* DMA_LCD_SRC_FI_B1_L */        *ret = s->frame_index_f1 & 0xffff;        break;    case 0xbf4:	/* DMA_LCD_SRC_FI_B1_U */        *ret = s->frame_index_f1 >> 16;        break;    case 0xbdc:	/* DMA_LCD_SRC_EI_B2 */        *ret = s->element_index_f2;        break;    case 0xbde:	/* DMA_LCD_SRC_FI_B2_L */        *ret = s->frame_index_f2 & 0xffff;        break;    case 0xbf6:	/* DMA_LCD_SRC_FI_B2_U */        *ret = s->frame_index_f2 >> 16;        break;    case 0xbe0:	/* DMA_LCD_SRC_EN_B1 */        *ret = s->elements_f1;        break;    case 0xbe4:	/* DMA_LCD_SRC_FN_B1 */        *ret = s->frames_f1;        break;    case 0xbe2:	/* DMA_LCD_SRC_EN_B2 */        *ret = s->elements_f2;        break;    case 0xbe6:	/* DMA_LCD_SRC_FN_B2 */        *ret = s->frames_f2;        break;    case 0xbea:	/* DMA_LCD_LCH_CTRL */        *ret = s->lch_type;        break;    default:        return 1;    }    return 0;}static int omap_dma_3_1_lcd_write(struct omap_dma_lcd_channel_s *s, int offset,                uint16_t value){    switch (offset) {    case 0x300:	/* SYS_DMA_LCD_CTRL */        s->src = (value & 0x40) ? imif : emiff;        s->condition = 0;        /* Assume no bus errors and thus no BUS_ERROR irq bits.  */        s->interrupts = (value >> 1) & 1;        s->dual = value & 1;        break;    case 0x302:	/* SYS_DMA_LCD_TOP_F1_L */        s->src_f1_top &= 0xffff0000;        s->src_f1_top |= 0x0000ffff & value;        break;    case 0x304:	/* SYS_DMA_LCD_TOP_F1_U */        s->src_f1_top &= 0x0000ffff;        s->src_f1_top |= value << 16;        break;    case 0x306:	/* SYS_DMA_LCD_BOT_F1_L */        s->src_f1_bottom &= 0xffff0000;        s->src_f1_bottom |= 0x0000ffff & value;        break;    case 0x308:	/* SYS_DMA_LCD_BOT_F1_U */        s->src_f1_bottom &= 0x0000ffff;        s->src_f1_bottom |= value << 16;        break;    case 0x30a:	/* SYS_DMA_LCD_TOP_F2_L */        s->src_f2_top &= 0xffff0000;        s->src_f2_top |= 0x0000ffff & value;        break;    case 0x30c:	/* SYS_DMA_LCD_TOP_F2_U */        s->src_f2_top &= 0x0000ffff;        s->src_f2_top |= value << 16;        break;    case 0x30e:	/* SYS_DMA_LCD_BOT_F2_L */        s->src_f2_bottom &= 0xffff0000;        s->src_f2_bottom |= 0x0000ffff & value;        break;    case 0x310:	/* SYS_DMA_LCD_BOT_F2_U */        s->src_f2_bottom &= 0x0000ffff;        s->src_f2_bottom |= value << 16;        break;    default:        return 1;    }    return 0;}static int omap_dma_3_1_lcd_read(struct omap_dma_lcd_channel_s *s, int offset,                uint16_t *ret){    int i;    switch (offset) {    case 0x300:	/* SYS_DMA_LCD_CTRL */        i = s->condition;        s->condition = 0;        qemu_irq_lower(s->irq);        *ret = ((s->src == imif) << 6) | (i << 3) |                (s->interrupts << 1) | s->dual;        break;    case 0x302:	/* SYS_DMA_LCD_TOP_F1_L */        *ret = s->src_f1_top & 0xffff;        break;    case 0x304:	/* SYS_DMA_LCD_TOP_F1_U */        *ret = s->src_f1_top >> 16;        break;    case 0x306:	/* SYS_DMA_LCD_BOT_F1_L */        *ret = s->src_f1_bottom & 0xffff;        break;    case 0x308:	/* SYS_DMA_LCD_BOT_F1_U */        *ret = s->src_f1_bottom >> 16;        break;    case 0x30a:	/* SYS_DMA_LCD_TOP_F2_L */        *ret = s->src_f2_top & 0xffff;        break;    case 0x30c:	/* SYS_DMA_LCD_TOP_F2_U */        *ret = s->src_f2_top >> 16;        break;    case 0x30e:	/* SYS_DMA_LCD_BOT_F2_L */        *ret = s->src_f2_bottom & 0xffff;        break;    case 0x310:	/* SYS_DMA_LCD_BOT_F2_U */        *ret = s->src_f2_bottom >> 16;        break;    default:        return 1;    }    return 0;}static int omap_dma_sys_write(struct omap_dma_s *s, int offset, uint16_t value){    switch (offset) {    case 0x400:	/* SYS_DMA_GCR */        s->gcr = value;        break;    case 0x404:	/* DMA_GSCR */        if (value & 0x8)            omap_dma_disable_3_1_mapping(s);        else            omap_dma_enable_3_1_mapping(s);        break;    case 0x408:	/* DMA_GRST */        if (value & 0x1)            omap_dma_reset(s);        break;    default:        return 1;    }    return 0;}static int omap_dma_sys_read(struct omap_dma_s *s, int offset,                uint16_t *ret){    switch (offset) {    case 0x400:	/* SYS_DMA_GCR */        *ret = s->gcr;        break;    case 0x404:	/* DMA_GSCR */        *ret = s->omap_3_1_mapping_disabled << 3;        break;    case 0x408:	/* DMA_GRST */        *ret = 0;        break;    case 0x442:	/* DMA_HW_ID */    case 0x444:	/* DMA_PCh2_ID */    case 0x446:	/* DMA_PCh0_ID */    case 0x448:	/* DMA_PCh1_ID */    case 0x44a:	/* DMA_PChG_ID */    case 0x44c:	/* DMA_PChD_ID */        *ret = 1;        break;    case 0x44e:	/* DMA_CAPS_0_U */        *ret = (s->caps[0] >> 16) & 0xffff;        break;    case 0x450:	/* DMA_CAPS_0_L */        *ret = (s->caps[0] >>  0) & 0xffff;        break;    case 0x452:	/* DMA_CAPS_1_U */        *ret = (s->caps[1] >> 16) & 0xffff;        break;    case 0x454:	/* DMA_CAPS_1_L */        *ret = (s->caps[1] >>  0) & 0xffff;        break;    case 0x456:	/* DMA_CAPS_2 */        *ret = s->caps[2];        break;    case 0x458:	/* DMA_CAPS_3 */        *ret = s->caps[3];        break;    case 0x45a:	/* DMA_CAPS_4 */        *ret = s->caps[4];        break;    case 0x460:	/* DMA_PCh2_SR */    case 0x480:	/* DMA_PCh0_SR */    case 0x482:	/* DMA_PCh1_SR */    case 0x4c0:	/* DMA_PChD_SR_0 */        printf("%s: Physical Channel Status Registers not implemented.\n",               __FUNCTION__);        *ret = 0xff;        break;    default:        return 1;    }    return 0;}static uint32_t omap_dma_read(void *opaque, target_phys_addr_t addr){    struct omap_dma_s *s = (struct omap_dma_s *) opaque;    int reg, ch, offset = addr - s->base;    uint16_t ret;    switch (offset) {    case 0x300 ... 0x3fe:        if (s->model <= omap_dma_3_1 || !s->omap_3_1_mapping_disabled) {            if (omap_dma_3_1_lcd_read(&s->lcd_ch, offset, &ret))                break;            return ret;        }        /* Fall through. */    case 0x000 ... 0x2fe:        reg = offset & 0x3f;        ch = (offset >> 6) & 0x0f;        if (omap_dma_ch_reg_read(s, &s->ch[ch], reg, &ret))            break;        return ret;    case 0x404 ... 0x4fe:        if (s->model <= omap_dma_3_1)            break;        /* Fall through. */    case 0x400:        if (omap_dma_sys_read(s, offset, &ret))            break;        return ret;    case 0xb00 ... 0xbfe:        if (s->model == omap_dma_3_2 && s->omap_3_1_mapping_disabled) {            if (omap_dma_3_2_lcd_read(&s->lcd_ch, offset, &ret))                break;            return ret;        }        break;    }    OMAP_BAD_REG(addr);    return 0;}static void omap_dma_write(void *opaque, target_phys_addr_t addr,                uint32_t value){    struct omap_dma_s *s = (struct omap_dma_s *) opaque;    int reg, ch, offset = addr - s->base;    switch (offset) {    case 0x300 ... 0x3fe:        if (s->model <= omap_dma_3_1 || !s->omap_3_1_mapping_disabled) {            if (omap_dma_3_1_lcd_write(&s->lcd_ch, offset, value))                break;            return;        }        /* Fall through.  */    case 0x000 ... 0x2fe:        reg = offset & 0x3f;        ch = (offset >> 6) & 0x0f;        if (omap_dma_ch_reg_write(s, &s->ch[ch], reg, value))            break;        return;    case 0x404 ... 0x4fe:        if (s->model <= omap_dma_3_1)            break;    case 0x400:        /* Fall through. */        if (omap_dma_sys_write(s, offset, value))            break;        return;    case 0xb00 ... 0xbfe:        if (s->model == omap_dma_3_2 && s->omap_3_1_mapping_disabled) {            if (omap_dma_3_2_lcd_write(&s->lcd_ch, offset, value))                break;            return;        }        break;    }    OMAP_BAD_REG(addr);}static CPUReadMemoryFunc *omap_dma_readfn[] = {    omap_badwidth_read16,    omap_dma_read,    omap_badwidth_read16,};static CPUWriteMemoryFunc *omap_dma_writefn[] = {    omap_badwidth_write16,    omap_dma_write,    omap_badwidth_write16,};static void omap_dma_request(void *opaque, int drq, int req){    struct omap_dma_s *s = (struct omap_dma_s *) opaque;    /* The request pins are level triggered in QEMU.  */    if (req) {        if (~s->drq & (1 << drq)) {            s->drq |= 1 << drq;            omap_dma_process_request(s, drq);        }    } else        s->drq &= ~(1 << drq);}static void omap_dma_clk_update(void *opaque, int line, int on){    struct omap_dma_s *s = (struct omap_dma_s *) opaque;    if (on) {        /* TODO: make a clever calculation */        s->delay = ticks_per_sec >> 8;        if (s->run_count)            qemu_mod_timer(s->tm, qemu_get_clock(vm_clock) + s->delay);    } else {        s->delay = 0;        qemu_del_timer(s->tm);    }}static void omap_dma_setcaps(struct omap_dma_s *s){    switch (s->model) {    default:    case omap_dma_3_1:        break;    case omap_dma_3_2:    case omap_dma_4:        /* XXX Only available for sDMA */        s->caps[0] =                (1 << 19) |	/* Constant Fill Capability */                (1 << 18);	/* Transparent BLT Capability */        s->caps[1] =                (1 << 1);	/* 1-bit palettized capability (DMA 3.2 only) */        s->caps[2] =                (1 << 8) |	/* SEPARATE_SRC_AND_DST_INDEX_CPBLTY */                (1 << 7) |	/* DST_DOUBLE_INDEX_ADRS_CPBLTY */                (1 << 6) |	/* DST_SINGLE_INDEX_ADRS_CPBLTY */                (1 << 5) |	/* DST_POST_INCRMNT_ADRS_CPBLTY */                (1 << 4) |	/* DST_CONST_ADRS_CPBLTY */

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?