/***************************************************************************** * FUNCTION * smi_probe * DESCRIPTION * 1. Call smi_register to register SMI Device Number, allocate and Initial SMI cdev struct, call cdev_add. * 2. Call class_create and device_create to add SMI device to kerne. * 3. Call smi_common_init. * 4. Call mau_init. * PARAMETERS * param1 : [IN] struct platform_device *pdev * No used in this function. * RETURNS * Type: Integer. 0 mean success and others mean fail. ****************************************************************************/ static int smi_probe(struct platform_device *pdev) { struct device* smiDevice = NULL; if (NULL == pdev) { SMIERR("platform data missed"); return -ENXIO; } if (smi_register()) { dev_err(&pdev->dev,"register char failed\n"); return -EAGAIN; } pSmiClass = class_create(THIS_MODULE, "MTK_SMI"); if (IS_ERR(pSmiClass)) { int ret = PTR_ERR(pSmiClass); SMIERR("Unable to create class, err = %d", ret); return ret; } smiDevice = device_create(pSmiClass, NULL, smiDevNo, NULL, "MTK_SMI"); smi_common_init(); mau_init(); { MTK_MAU_CONFIG mau_disp; mau_disp.entry = 0; mau_disp.larb = 0; mau_disp.start = 0x20000000; mau_disp.end = 0xFFFFFFFF; mau_disp.virt = 1; mau_disp.port_msk = 0xFFFF; mau_disp.monitor_read = 1; mau_disp.monitor_write = 1; mau_config(&mau_disp); } #ifdef SMI_DEFAULT_VR { MTK_SMI_BWC_CONFIG p_conf; p_conf.b_reduce_command_buffer = 1; p_conf.scenario = SMI_BWC_SCEN_VR1066; smi_bwc_config(&p_conf); } #endif //dump_smi_register(); return 0; }
/***************************************************************************** * FUNCTION * smi_ioctl * DESCRIPTION * File operations - unlocked_ioctl * 1. call copy_from_user to get user space parameter * 2. call internal function by operation. * PARAMETERS * param1 : [IN] struct file * pFile * file structure*. * param2 : [IN] unsigned int cmd * operation command. * param3 : [IN] unsigned long param * parameter of ioctl. * RETURNS * Type: Integer. zero means success and others mean error. ****************************************************************************/ static long smi_ioctl(struct file * pFile, unsigned int cmd, unsigned long param) { int ret = 0; switch (cmd) { case MTK_CONFIG_MM_MAU: { MTK_MAU_CONFIG b; if(copy_from_user(&b, (void __user *)param, sizeof(b))) { SMIERR("copy_from_user failed!"); ret = -EFAULT; } else { mau_config(&b); } return ret; } case MTK_IOC_SMI_BWC_CONFIG: { MTK_SMI_BWC_CONFIG cfg; ret = copy_from_user(&cfg, (void*)param , sizeof(MTK_SMI_BWC_CONFIG)); if(ret) { SMIMSG(" SMI_BWC_CONFIG, copy_from_user failed: %d\n", ret); return -EFAULT; } smi_bwc_config( &cfg ); } break; default: return -1; } return ret; }
static void process_dbg_opt(const char *opt) { //m4u log if (0 == strncmp(opt, "m4u_log:", 8)) { if (0 == strncmp(opt + 8, "on", 2)) m4u_log_on(); else if (0 == strncmp(opt + 8, "off", 3)) m4u_log_off(); else goto Error; } //m4u debug if (0 == strncmp(opt, "m4u_debug:", 10)) { unsigned int command; char *p = (char *)opt + 10; command = (unsigned int) simple_strtoul(p, &p, 10); SMIMSG("m4u_debug_command, command=%d ", command); m4u_debug_command(command); } //mau dump if (0 == strncmp(opt, "mau_stat:", 9)) { char *p = (char *)opt + 9; unsigned int larb=(unsigned int)simple_strtoul(p, &p, 16); if(larb>SMI_LARB_NR) SMIERR("debug error: larb=%d\n", larb); mau_dump_status(larb); } if (0 == strncmp(opt, "mau_config:", 11 )) { MTK_MAU_CONFIG MauConf; unsigned int larb,entry, rd, wt, vir, start, end, port_msk; char *p = (char *)opt + 11; larb = (unsigned int) simple_strtoul(p, &p, 16); p++; entry = (unsigned int) simple_strtoul(p, &p, 16); p++; rd = (unsigned int) simple_strtoul(p, &p, 16); p++; wt = (unsigned int) simple_strtoul(p, &p, 16); p++; vir = (unsigned int) simple_strtoul(p, &p, 16); p++; start = (unsigned int) simple_strtoul(p, &p, 16); p++; end = (unsigned int) simple_strtoul(p, &p, 16); p++; port_msk = (unsigned int) simple_strtoul(p, &p, 16); SMIMSG("larb=%d,entry=%d,rd=%d wt=%d vir=%d \n" "start=0x%x end=0x%x msk=0x%x \n", larb, entry, rd, wt, vir, start, end, port_msk); MauConf.larb = larb; MauConf.entry = entry; MauConf.monitor_read = rd; MauConf.monitor_write = wt; MauConf.virt = vir; MauConf.start = start; MauConf.end = end; MauConf.port_msk = port_msk; mau_config(&MauConf); } if (0 == strncmp(opt, "spc_config:", 11 )) { MTK_SPC_CONFIG pCfg; char *p = (char *)opt + 11; SMIMSG("%s", p); //0-no protect; 1-sec rw; 2-sec_rw nonsec_r; 3-no access pCfg.domain_0_prot = (unsigned int) simple_strtoul(p, &p, 16); SMIMSG("%d,%s", pCfg.domain_0_prot, p); p++; pCfg.domain_1_prot = (unsigned int) simple_strtoul(p, &p, 16); p++; SMIMSG("%d", pCfg.domain_1_prot); pCfg.domain_2_prot = (unsigned int) simple_strtoul(p, &p, 16); p++; SMIMSG("%d", pCfg.domain_2_prot); pCfg.domain_3_prot = (unsigned int) simple_strtoul(p, &p, 16); p++; SMIMSG("%d", pCfg.domain_3_prot); pCfg.start = (unsigned int) simple_strtoul(p, &p, 16); p++; SMIMSG("%d", pCfg.domain_0_prot); pCfg.end = (unsigned int) simple_strtoul(p, &p, 16); SMIMSG("prot=(%d,%d,%d,%d), start=0x%x, end=0x%x\n", pCfg.domain_0_prot,pCfg.domain_1_prot, pCfg.domain_2_prot,pCfg.domain_3_prot, pCfg.start,pCfg.end); spc_config(&pCfg); } if (0 == strncmp(opt, "spc_status", 10 )) { spc_status_check(); } if (0 == strncmp(opt, "spc_dump_reg", 12 )) { spc_dump_reg(); } if (0 == strncmp(opt, "touch_sysram", 10 )) { volatile unsigned int *va; unsigned int i; //va = ioremap_nocache(0x1200C000, 1024*80); va=(volatile unsigned int *)0xf2000000; for(i=0; i<1024*80/4; i++) { va[i] = i; } SMIMSG("cpu read sysram: 0x%x,0x%x,0x%x,0x%x,0x%x,0x%x,0x%x", va[0],va[1],va[2],va[3],va[100],va[222],va[444]); } if (0 == strncmp(opt, "set_reg:", 8 )) { unsigned int addr, val; char *p = (char *)opt + 8; addr = (unsigned int) simple_strtoul(p, &p, 16); p++; val = (unsigned int) simple_strtoul(p, &p, 16); SMIMSG("set register: 0x%x = 0x%x\n", addr, val); COM_WriteReg32(addr, val); } if (0 == strncmp(opt, "get_reg:", 8 )) { unsigned int addr; char *p = (char *)opt + 8; addr = (unsigned int) simple_strtoul(p, &p, 16); SMIMSG("get register: 0x%x = 0x%x \n", addr, COM_ReadReg32(addr)); } return; Error: SMIERR("parse command error!\n"); SMIMSG("%s", STR_HELP); }
static int smi_probe(struct platform_device *pdev) { struct device* smiDevice = NULL; if (NULL == pdev) { SMIERR("platform data missed"); return -ENXIO; } if (smi_register()) { dev_err(&pdev->dev,"register char failed\n"); return -EAGAIN; } pSmiClass = class_create(THIS_MODULE, "MTK_SMI"); if (IS_ERR(pSmiClass)) { int ret = PTR_ERR(pSmiClass); SMIERR("Unable to create class, err = %d", ret); return ret; } smiDevice = device_create(pSmiClass, NULL, smiDevNo, NULL, "MTK_SMI"); smi_common_init(); #ifdef __MAU_SPC_ENABLE__ mau_init(); MTK_SPC_Init(&(pdev->dev)); #endif SMI_DBG_Init(); #ifdef __MAU_SPC_ENABLE__ //init mau to monitor mva 0~0x2ffff & 0x40000000~0xffffffff #if 0 { MTK_MAU_CONFIG cfg; int i; for( i=0 ; i < SMI_LARB_NR ; i++) { cfg.larb = i; cfg.entry = 0; cfg.port_msk = 0xffffffff; cfg.virt = 1; cfg.monitor_read = 1; cfg.monitor_write = 1; cfg.start = 0; cfg.end = 0x2ffff; mau_config(&cfg); cfg.entry = 1; cfg.start = 0x40000000; cfg.end = 0xffffffff; mau_config(&cfg); } } #endif #endif return 0; }
static long smi_ioctl( struct file * pFile, unsigned int cmd, unsigned long param) { int ret = 0; // unsigned long * pu4Cnt = (unsigned long *)pFile->private_data; switch (cmd) { #ifdef __MAU_SPC_ENABLE__ case MTK_CONFIG_MM_MAU: { MTK_MAU_CONFIG b; if(copy_from_user(&b, (void __user *)param, sizeof(b))) { SMIERR("copy_from_user failed!"); ret = -EFAULT; } else { mau_config(&b); } return ret; } case MTK_IOC_SPC_CONFIG : { MTK_SPC_CONFIG cfg; ret = copy_from_user(&cfg, (void*)param , sizeof(MTK_SPC_CONFIG)); if(ret) { SMIMSG(" SPC_CONFIG, copy_from_user failed: %d\n", ret); return -EFAULT; } spc_config(&cfg); } break; case MTK_IOC_SPC_DUMP_REG : spc_dump_reg(); break; case MTK_IOC_SPC_DUMP_STA : spc_status_check(); break; case MTK_IOC_SPC_CMD : spc_test(param); break; #endif case MTK_IOC_SMI_BWC_CONFIG: { MTK_SMI_BWC_CONFIG cfg; ret = copy_from_user(&cfg, (void*)param , sizeof(MTK_SMI_BWC_CONFIG)); if(ret) { SMIMSG(" SMI_BWC_CONFIG, copy_from_user failed: %d\n", ret); return -EFAULT; } // ret = smi_bwc_config( &cfg , pu4Cnt); ret = smi_bwc_config( &cfg , NULL); } break; // GMP start case MTK_IOC_SMI_BWC_INFO_SET: { MTK_SMI_BWC_INFO_SET cfg; SMIMSG("Handle MTK_IOC_SMI_BWC_INFO_SET request... start"); ret = copy_from_user(&cfg, (void*)param , sizeof(MTK_SMI_BWC_INFO_SET)); if(ret) { SMIMSG(" MTK_IOC_SMI_BWC_INFO_SET, copy_to_user failed: %d\n", ret); return -EFAULT; } // Set the address to the value assigned by user space program smi_bwc_mm_info_set(cfg.property, cfg.value1, cfg.value2); SMIMSG("Handle MTK_IOC_SMI_BWC_INFO_SET request... finish"); break; } case MTK_IOC_SMI_BWC_INFO_GET: { MTK_SMI_BWC_INFO_GET cfg; MTK_SMI_BWC_MM_INFO * return_address = NULL; SMIMSG("Handle MTK_IOC_SMI_BWC_INFO_GET request... start"); ret = copy_from_user(&cfg, (void*)param , sizeof(MTK_SMI_BWC_INFO_GET)); if(ret) { SMIMSG(" MTK_IOC_SMI_BWC_INFO_GET, copy_to_user failed: %d\n", ret); return -EFAULT; } return_address = (MTK_SMI_BWC_MM_INFO *)cfg.return_address; if( return_address != NULL){ ret = copy_to_user((void*) return_address, (void*)&g_smi_bwc_mm_info, sizeof(MTK_SMI_BWC_MM_INFO)); if(ret) { SMIMSG(" MTK_IOC_SMI_BWC_INFO_GET, copy_to_user failed: %d\n", ret); return -EFAULT; } } SMIMSG("Handle MTK_IOC_SMI_BWC_INFO_GET request... finish"); break; } // GMP end default: return -1; } return ret; }
static long smi_ioctl( struct file * pFile, unsigned int cmd, unsigned long param) { int ret = 0; // unsigned long * pu4Cnt = (unsigned long *)pFile->private_data; switch (cmd) { #ifdef __MAU_SPC_ENABLE__ case MTK_CONFIG_MM_MAU: { MTK_MAU_CONFIG b; if(copy_from_user(&b, (void __user *)param, sizeof(b))) { SMIERR("copy_from_user failed!"); ret = -EFAULT; } else { mau_config(&b); } return ret; } case MTK_IOC_SPC_CONFIG : { MTK_SPC_CONFIG cfg; ret = copy_from_user(&cfg, (void*)param , sizeof(MTK_SPC_CONFIG)); if(ret) { SMIMSG(" SPC_CONFIG, copy_from_user failed: %d\n", ret); return -EFAULT; } spc_config(&cfg); } break; case MTK_IOC_SPC_DUMP_REG : spc_dump_reg(); break; case MTK_IOC_SPC_DUMP_STA : spc_status_check(); break; case MTK_IOC_SPC_CMD : spc_test(param); break; #endif case MTK_IOC_SMI_BWC_CONFIG: { MTK_SMI_BWC_CONFIG cfg; ret = copy_from_user(&cfg, (void*)param , sizeof(MTK_SMI_BWC_CONFIG)); if(ret) { SMIMSG(" SMI_BWC_CONFIG, copy_from_user failed: %d\n", ret); return -EFAULT; } // ret = smi_bwc_config( &cfg , pu4Cnt); ret = smi_bwc_config( &cfg , NULL); } break; default: return -1; } return ret; }