示例#1
0
文件: mcp.c 项目: berte/mediaplayer
/*------------------------------------------------------------------
 * Func : mcp_init
 *
 * Desc : init mcp engine
 *
 * Parm : N/A
 *         
 * Retn : N/A
 *------------------------------------------------------------------*/
static int mcp_init(void)
{                   
    if (is_mars_cpu() || is_jupiter_cpu())
    {           
        SET_MCP_CTRL(MCP_GO);       // dessert go bit		                 
        SET_MCP_EN(0xFE);           // disable all interrupts
        SET_MCP_STATUS(0xFE);       // clear interrupts status        
        SET_MCP_BASE (0);
        SET_MCP_LIMIT(0);
        SET_MCP_RDPTR(0);
        SET_MCP_WRPTR(0);        
        
        if (is_jupiter_cpu())
        {                        
            SET_MCP_CTRL(MCP_ARB_MODE(1) | MCP_WRITE_DATA);     // set arbitraction mode to mode 1
        
            SET_MCP_CTRL1(MCP_AES_PAD_OFF(1) |                  // disable AES_H auto padding
                          MCP_CSA_ENTROPY(ORIGIONAL_MODE) |     // setup csa mode
                          MCP_ROUND_NO(0));                     // set round number of multi-2 to 1
        }                    
        
#ifdef MCP_INTERRUPT_ENABLE
        if (request_irq(MCP_IRQ, mcp_isr, SA_INTERRUPT | SA_SHIRQ, "MCP", &mcp_complete) < 0) 
        {
            printk("MCP : Request irq %d failed\n", MCP_IRQ);	    		
            return -ENODEV;
        }            
#endif    
        return 0;
    }
    
    printk("[MCP] Init MCP failed - invalid CPU\n");
    return -1;    
}
示例#2
0
/*
* Module Functions
*/
static int venus_ir_wo_init(void) {
    unsigned long* vop = NULL;
    int offset;

    if (!is_mars_cpu())
        return -EFAULT;

    /* find the address of 'venus_ir_fifo' from the disassembly of venus_ir_open() */
    vop = (unsigned long*)kallsyms_lookup_name("venus_ir_open");
    if (vop == NULL) {
        printk(KERN_WARNING "venus_ir_wo: failed to locate 'venus_ir_open'");
        return -EFAULT;
    }
    dbg("venus_ir_open = %p\n", vop);
    //        printk("%lx %lx %lx %lx\n", vop[0], vop[1], vop[2], vop[3]);
    offset = 2;
    /*
    * look for the following MIPS asm code:
    *      lui     $v0, 0xAAAA	; 0x3c02AAAA
    *      lw      $a0, 0xBBBB	; 0x8c44BBBB
    * where 0xAAAA is page_nr+1 (msw) and 0xBBBB is the lsw
    */
    if ( ((vop[offset]&0xFFFF0000)!=0x3c020000) || ((vop[offset+1]&0xFFFF0000)!=0x8c440000) ) {
        printk(KERN_WARNING "venus_ir_wo: asm code does not match\n");
        return -EFAULT;
    }
    /* Friggin' -1 offset on pages!! */
    p_venus_ir_fifo = (void*)(((vop[offset]&0xFFFF)-1)<<16) + (vop[offset+1] & 0xFFFF);
    dbg("&venus_ir_fifo = %p\n", p_venus_ir_fifo);

    /* find the address of 'venus_ir_read_wait' from the disassembly of venus_ir_poll() */
    vop = (unsigned long*)kallsyms_lookup_name("venus_ir_poll");
    if (vop == NULL) {
        printk(KERN_WARNING "venus_ir_wo: failed to locate 'venus_ir_poll'");
        return -EFAULT;
    }
    dbg("venus_ir_poll = %p\n", vop);
    //        printk("%0lx %0lx %0lx %0lx %0lx %0lx\n", vop[0], vop[1], vop[2], vop[3], vop[4], vop[5]);
    offset = 3;
    /*
    * look for the following MIPS asm code:
    *      lui     $v0, 0xAAAA	; 0x3c02AAAA
    *      <conditional branch>
    *      addiu   $a1, $v0, 0xBBBB; 0x2445BBBB
    * where 0xAAAA is page_nr+1 (msw) and 0xBBBB is the lsw
    */
    if ( ((vop[offset]&0xFFFF0000)!=0x3c020000) || ((vop[offset+2]&0xFFFF0000)!=0x24450000) ) {
        printk(KERN_WARNING "venus_ir_wo: asm code does not match!\n");
        return -EFAULT;
    }
    p_venus_ir_read_wait = (void*)(((vop[offset]&0xFFFF)-1)<<16) + (vop[offset+2] & 0xFFFF);
    dbg("&venus_ir_read_wait = %p\n", p_venus_ir_read_wait);

    return 0;	/* success */
}
示例#3
0
unsigned long __init prom_free_prom_memory(void)
{
    unsigned long freed = 0;
    unsigned long addr;
    int i;
#ifdef	CONFIG_REALTEK_RECLAIM_BOOT_MEM
    unsigned long dest;
    struct page *page;
    int count;
#endif

    for (i = 0; i < boot_mem_map.nr_map; i++) {
        if (boot_mem_map.map[i].type != BOOT_MEM_ROM_DATA)
            continue;

        addr = boot_mem_map.map[i].addr;
        while (addr < boot_mem_map.map[i].addr
                + boot_mem_map.map[i].size) {
            ClearPageReserved(virt_to_page(__va(addr)));
            set_page_count(virt_to_page(__va(addr)), 1);
            free_page((unsigned long)__va(addr));
            addr += PAGE_SIZE;
            freed += PAGE_SIZE;
        }
    }
    printk("Freeing prom memory: %ldkb freed\n", freed >> 10);
#ifdef	CONFIG_REALTEK_RECLAIM_BOOT_MEM
    if (!is_mars_cpu()) {
        // venus or neptune
        addr = F_ADDR1;
        if (debug_flag)
            dest = T_ADDR1;
        else
            dest = T_ADDR2;
    } else {
        // mars
        addr = F_ADDR2;
        if (debug_flag)
            dest = T_ADDR1;
        else
            dest = T_ADDR3;
    }
    printk("Reclaim bootloader memory from %x to %x\n", addr, dest);
    count = 0;
    while (addr < dest) {
        page = virt_to_page(addr);
        /*
        		printk("mem_map: %x, page: %x, size: %d \n", (int)mem_map, (int)page, sizeof(struct page));
        		if (PageReserved(page) != 1)
        			BUG();
        		if (page->_count.counter != -1)
        			BUG();
        */
        count++;

        __ClearPageReserved(page);
        set_page_count(page, 1);
        __free_page(page);

        addr += 0x1000; // 4KB
    }
    totalram_pages += count;
#endif
    return freed;
}