/*************************************************************************** * zion_edma_get_region * @func * Get EDMA buffer addresses * @args * zion_params_t *params [in]: parameters of ZION driver * int dma_ch [in]: channel * int num [in]: buffer number * unsigned long *lower [out]: lower address * unsigned long *upper [out]: upper address * @return * int * 0 : success * -EINVAL : invalid argument * @comment * static function * @author * H. Hoshino **************************************************************************/ static int zion_edma_get_region(zion_params_t * params, int dma_ch, int num, unsigned long *lower, unsigned long *upper) { unsigned short tlower = 0; /* Check channel number */ if (dma_ch >= ZION_EDMA_NR_CH) { PERROR("Invalid EDMA Channel.\n"); return (-EINVAL); } /* Get addresses */ tlower = mbus_readw(MBUS_ADDR(params, ZION_MBUS_EDMA_BUFF_LWR_ADRS(dma_ch, num))); *upper = mbus_readl(MBUS_ADDR(params, ZION_MBUS_EDMA_BUFF_UPR_ADRS(dma_ch, num))); *lower = (unsigned long)( (tlower << 16) & 0x07FF0000L ); /* for DEBUG */ PDEBUG( "[CH%d Buf%d] lower: 0x%08lX, tlower: 0x%04X, upper: 0x%08lX\n", dma_ch, num, *lower, tlower, *upper ); return (0); }
int init_zion_vga(void) { int ret; zion_params_t *params = find_zion(0); u32 off_addr; if(params == NULL){ return -ENODEV; } PINFO("ZION VGA Frame Buffer Driver Installed.\n"); PDEBUG("compiled "__DATE__" "__TIME__"\n"); //Check Fireball if((params->revision & 0xF000) == 0xF000){ PINFO("This is fireball! ZION VGA cannot be used!!\n"); return 0; } #ifdef CONFIG_ZION_FB_SETUP PINFO("Setting FB Address ... %p and %p\n", (void *)CONFIG_ZION_FB_FIRST_ADDR, (void *)CONFIG_ZION_FB_SECOND_ADDR); mbus_writel(CONFIG_ZION_FB_FIRST_ADDR, MBUS_ADDR(params,ZIONVGA_BUFFER_BASE_ADDRESS_0)); mbus_writel(CONFIG_ZION_FB_SECOND_ADDR, MBUS_ADDR(params,ZIONVGA_BUFFER_BASE_ADDRESS_1)); #endif //CONFIG_ZION_FB_SETUP //Get VGA FB Region off_addr = mbus_readl(MBUS_ADDR(params, ZIONVGA_BUFFER_BASE_ADDRESS_0)); dma_direction[0] = params->whole_sdram_addr + off_addr; PINFO("FB1_BUS_ADDR:%p\n",(void *)dma_direction[0]); off_addr = mbus_readl(MBUS_ADDR(params, ZIONVGA_BUFFER_BASE_ADDRESS_1)); dma_direction[1] = params->whole_sdram_addr + off_addr; PINFO("FB2_BUS_ADDR:%p\n",(void *)dma_direction[1]); memset(&zion_fb_info, 0, sizeof(struct zion_vga_info)); zion_fb_info.ram_address = (unsigned long)__get_free_pages(GFP_KERNEL | __GFP_DMA, ZIONVGA_VRAM_ORDER); if(!zion_fb_info.ram_address){ PERROR("failed get_free_pages(): ram_address\n"); ret = -ENOMEM; goto fail_gfp_fb; } memset((void *)zion_fb_info.ram_address, 0, ZIONVGA_VRAM_SIZE); PDEBUG("ram_address = 0x%08lx (virtual)\n", (unsigned long)zion_fb_info.ram_address); PDEBUG("ram_address = 0x%08lx (physical)\n", virt_to_bus((void *)zion_fb_info.ram_address)); zion_fb_info.fb_info.screen_base = (void __iomem *)zion_fb_info.ram_address; zion_fb_info.fb_info.fbops = &zion_vga_ops; //setup var_screen_info zionvga_encode_var(&default_var); zion_fb_info.fb_info.var = default_var; zionvga_encode_fix(&zion_fb_info.fb_info.fix); zion_fb_info.fb_info.par = &zion_current_par; // This should give a reasonable default video mode ret = fb_alloc_cmap(&zion_fb_info.fb_info.cmap, 256, 0); if(ret){ PERROR( "failed fb_alloc_cmap()\n" ); ret = -ENOMEM; goto fail_alloc_cmap; } if(register_framebuffer(&zion_fb_info.fb_info) < 0){ PERROR("failed register_framebuffer()\n"); ret = -EINVAL; goto fail_reg_fb; } PINFO("fb%d: %s frame buffer device\n", zion_fb_info.fb_info.node, zion_fb_info.fb_info.fix.id); return 0; fail_reg_fb: fb_dealloc_cmap( &zion_fb_info.fb_info.cmap); fail_alloc_cmap: free_pages(zion_fb_info.ram_address, ZIONVGA_VRAM_ORDER); fail_gfp_fb: return ret; }
static int zion_common_ioctl(zion_params_t *zion_params, struct inode *inode, struct file *filp, unsigned int function, unsigned long arg) { struct zion_config_byte zion_config_byte = {0}; struct zion_config_word zion_config_word = {0}; struct zion_config_dword zion_config_dword = {0}; struct zion_buf zion_buf; struct ZION_Interrupt_Bits zion_interrupt = {0}; u16 revision; switch(function) { case ZION_MBUS_READ_CONFIG_BYTE: if(copy_from_user((void *)&zion_config_byte, (void *)arg, sizeof(struct zion_config_byte))) return -EFAULT; zion_config_byte.val = (u8) mbus_readb( MBUS_ADDR(zion_params, zion_config_byte.where) ); if(copy_to_user((void *)arg, (void *)&zion_config_byte, sizeof(struct zion_config_byte))) return -EFAULT; break; case ZION_MBUS_READ_CONFIG_WORD: if(copy_from_user((void *)&zion_config_word, (void *)arg, sizeof(struct zion_config_word))) return -EFAULT; zion_config_word.val = (u16) mbus_readw( MBUS_ADDR(zion_params,zion_config_word.where) ); if(copy_to_user((void *)arg, (void *)&zion_config_word, sizeof(struct zion_config_word))) return -EFAULT; break; case ZION_MBUS_READ_CONFIG_DWORD: if(copy_from_user((void *)&zion_config_dword, (void *)arg, sizeof(struct zion_config_dword))) return -EFAULT; zion_config_dword.val = (u32) mbus_readl( MBUS_ADDR(zion_params,zion_config_dword.where) ); if(copy_to_user((void *)arg, (void *)&zion_config_dword, sizeof(struct zion_config_dword))) return -EFAULT; break; case ZION_MBUS_WRITE_CONFIG_BYTE: if(copy_from_user((void *)&zion_config_byte, (void *)arg, sizeof(struct zion_config_byte))) return -EFAULT; mbus_writeb(zion_config_byte.val, MBUS_ADDR(zion_params, zion_config_byte.where) ); if(copy_to_user((void *)arg, (void *)&zion_config_byte, sizeof(struct zion_config_byte))) return -EFAULT; break; case ZION_MBUS_WRITE_CONFIG_WORD: if(copy_from_user((void *)&zion_config_word, (void *)arg, sizeof(struct zion_config_word))) return -EFAULT; mbus_writew(zion_config_word.val, MBUS_ADDR(zion_params, zion_config_word.where) ); if(copy_to_user((void *)arg, (void *)&zion_config_word, sizeof(struct zion_config_word))) return -EFAULT; break; case ZION_MBUS_WRITE_CONFIG_DWORD: if(copy_from_user((void *)&zion_config_dword, (void *)arg, sizeof(struct zion_config_dword))) return -EFAULT; mbus_writel(zion_config_dword.val, MBUS_ADDR(zion_params, zion_config_dword.where) ); if(copy_to_user((void *)arg, (void *)&zion_config_dword, sizeof(struct zion_config_dword))) return -EFAULT; break; case ZION_WRAM_READ: if(copy_from_user((void *)&zion_buf, (void *)arg, sizeof(struct zion_buf))) return -EFAULT; if((zion_buf.size = neo_wram_pio_read(zion_params, zion_buf.addr, zion_buf.buf, zion_buf.size, zion_buf.access_type))==0) return -EINVAL; if(copy_to_user((void *)arg, (void *)&zion_buf, sizeof(struct zion_buf))) return -EFAULT; break; case ZION_WRAM_WRITE: if(copy_from_user((void *)&zion_buf, (void *)arg, sizeof(struct zion_buf))) return -EFAULT; if((zion_buf.size = neo_wram_pio_write(zion_params, zion_buf.addr, zion_buf.buf, zion_buf.size, zion_buf.access_type))==0) return -EINVAL; if(copy_to_user((void *)arg, (void *)&zion_buf, sizeof(struct zion_buf))) return -EFAULT; break; case ZION_WAIT_INTERRUPT: zion_goto_bed(zion_params, &zion_interrupt); /* zion_interrupt.c */ if(copy_to_user((void *)arg, (void *)&zion_interrupt, sizeof(struct ZION_Interrupt_Bits))) return -EFAULT; break; case ZION_WAKE_THREADS_UP: zion_rout_them_up(zion_params); /* zion_interrupt.c */ break; case ZION_SET_ENABLE_BITS: if(copy_from_user((void *)&zion_interrupt, (void *)arg, sizeof(struct ZION_Interrupt_Bits))) return -EFAULT; zion_set_enable_bits(zion_params, &zion_interrupt); /* zion_interrupt.c */ break; case ZION_GET_ENABLE_BITS: zion_get_enable_bits(zion_params, &zion_interrupt); /* zion_interrupt.c */ if(copy_to_user((void *)arg, (void *)&zion_interrupt, sizeof(struct ZION_Interrupt_Bits))) return -EFAULT; break; case ZION_SET_TIMEOUT: zion_params->wait_timeout = arg; /* by jiffies */ break; case ZION_GET_REVISION: revision = zion_params->revision; if(copy_to_user((void *)arg, (void *)&revision, sizeof(u16))) { return -EFAULT; } break; default: PERROR("No such IOCTL.\n"); return -EINVAL; } return 0; }