/*------------------------------------------------------------------ * 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; }
/* * 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 */ }
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; }