gceSTATUS gckIOMMU_Construct( IN gckOS Os, OUT gckIOMMU * Iommu ) { gceSTATUS status; gckIOMMU iommu = gcvNULL; struct device *dev; int ret; gcmkHEADER(); dev = &Os->device->platform->device->dev; gcmkONERROR(gckOS_Allocate(Os, gcmSIZEOF(gcsIOMMU), (gctPOINTER *)&iommu)); gckOS_ZeroMemory(iommu, gcmSIZEOF(gcsIOMMU)); iommu->domain = iommu_domain_alloc(&platform_bus_type); if (!iommu->domain) { gcmkTRACE_ZONE(gcvLEVEL_INFO, gcvZONE_OS, "iommu_domain_alloc() fail"); gcmkONERROR(gcvSTATUS_NOT_SUPPORTED); } iommu_set_fault_handler(iommu->domain, _IOMMU_Fault_Handler, dev); ret = iommu_attach_device(iommu->domain, dev); if (ret) { gcmkTRACE_ZONE( gcvLEVEL_INFO, gcvZONE_OS, "iommu_attach_device() fail %d", ret); gcmkONERROR(gcvSTATUS_NOT_SUPPORTED); } iommu->device = dev; _FlatMapping(iommu); *Iommu = iommu; gcmkFOOTER_NO(); return gcvSTATUS_OK; OnError: gckIOMMU_Destory(Os, iommu); gcmkFOOTER(); return status; }
gceSTATUS gckKERNEL_DumpProcessDB( IN gckKERNEL Kernel ) { gcsDATABASE_PTR database; gctINT i, pid; gctUINT8 name[24]; gcmkHEADER_ARG("Kernel=0x%x", Kernel); /* Acquire the database mutex. */ gcmkVERIFY_OK( gckOS_AcquireMutex(Kernel->os, Kernel->db->dbMutex, gcvINFINITE)); gcmkPRINT("**************************\n"); gcmkPRINT("*** PROCESS DB DUMP ***\n"); gcmkPRINT("**************************\n"); gcmkPRINT_N(8, "%-8s%s\n", "PID", "NAME"); /* Walk the databases. */ for (i = 0; i < gcmCOUNTOF(Kernel->db->db); ++i) { for (database = Kernel->db->db[i]; database != gcvNULL; database = database->next) { pid = database->processID; gcmkVERIFY_OK(gckOS_ZeroMemory(name, gcmSIZEOF(name))); gcmkVERIFY_OK(gckOS_GetProcessNameByPid(pid, gcmSIZEOF(name), name)); gcmkPRINT_N(8, "%-8d%s\n", pid, name); } } /* Release the database mutex. */ gcmkVERIFY_OK(gckOS_ReleaseMutex(Kernel->os, Kernel->db->dbMutex)); /* Success. */ gcmkFOOTER_NO(); return gcvSTATUS_OK; }
static ssize_t gc_proc_write( struct file *file, const char *buff, size_t len, loff_t *off) { char messages[256]; if(len > 256) len = 256; if(copy_from_user(messages, buff, len)) return -EFAULT; printk("\n"); if(strncmp(messages, "dutycycle", 9) == 0) { gctINT32 option; gcuDATABASE_INFO gpuIdle; static gctUINT64 startTime = 0; static gctUINT64 endTime = 0; gcmkVERIFY_OK(gckOS_ZeroMemory((gctPOINTER)&gpuIdle, gcmSIZEOF(gcuDATABASE_INFO))); sscanf(messages+9, "%d", &option); switch(option) { case 0: gcmkVERIFY_OK(gckOS_GetProfileTick(&startTime)); gcmkVERIFY_OK(gckKERNEL_QueryDutyCycleDB(galDevice->kernels[gcvCORE_MAJOR], gcvTRUE, &gpuIdle)); gpuIdle.time = 0; endTime = 0; break; case 1: gcmkVERIFY_OK(gckKERNEL_QueryDutyCycleDB(galDevice->kernels[gcvCORE_MAJOR], gcvFALSE, &gpuIdle)); gcmkVERIFY_OK(gckOS_GetProfileTick(&endTime)); break; default: printk(KERN_INFO "usage: echo dutycycle [0|1] > /proc/driver/gc\n"); } if(startTime != 0 && endTime != 0) { gctUINT64 delta = endTime - startTime; gctUINT32 per = 100 - 100 * gckOS_ProfileToMS(gpuIdle.time) / gckOS_ProfileToMS(delta); printk(KERN_INFO "\n %%GPU START END DELTA IDLE\n"); printk(KERN_INFO "%5u%% %8u %8u %8u %8u\n\n", per, gckOS_ProfileToMS(startTime), gckOS_ProfileToMS(endTime), gckOS_ProfileToMS(delta), gckOS_ProfileToMS(gpuIdle.time)); } } else if(strncmp(messages, "reg", 3) == 0) { gctINT32 option; gctUINT32 idle, address, clockControl; sscanf(messages+3, "%d", &option); switch(option) { case 1: /* Read the current FE address. */ gckOS_ReadRegisterEx(galDevice->os, galDevice->kernels[0]->hardware->core, 0x00664, &address); gcmkPRINT("address: 0x%2x\n", address); break; case 2: /* Read idle register. */ gckOS_ReadRegisterEx(galDevice->os, galDevice->kernels[0]->hardware->core, 0x00004, &idle); gcmkPRINT("idle: 0x%2x\n", idle); break; case 3: gckOS_ReadRegisterEx(galDevice->os, gcvCORE_MAJOR, 0x00000, &clockControl); gcmkPRINT("clockControl: 0x%2x\n", clockControl); break; default: printk(KERN_INFO "usage: echo reg [1|2|3] > /proc/driver/gc\n"); } } else if(strncmp(messages, "help", 4) == 0) { printk("Supported options:\n" "dutycycle measure dutycycle in a period\n" "reg enable debugging for register reading\n" "help show this help page\n" "\n"); } else { gcmkPRINT("unknown echo\n"); } printk("\n"); return len; }