void gckIOMMU_Destory( IN gckOS Os, IN gckIOMMU Iommu ) { gcmkHEADER(); if (Iommu->domain && Iommu->device) { iommu_attach_device(Iommu->domain, Iommu->device); } if (Iommu->domain) { iommu_domain_free(Iommu->domain); } if (Iommu) { gcmkOS_SAFE_FREE(Os, Iommu); } gcmkFOOTER_NO(); }
gceSTATUS gckDVFS_Construct( IN gckHARDWARE Hardware, OUT gckDVFS * Dvfs ) { gceSTATUS status = gcvSTATUS_OK; gctPOINTER pointer; gckDVFS dvfs = gcvNULL; gckOS os = Hardware->os; gcmkHEADER_ARG("Hardware=0x%X", Hardware); gcmkVERIFY_OBJECT(Hardware, gcvOBJ_HARDWARE); gcmkVERIFY_ARGUMENT(Dvfs != gcvNULL); /* Allocate a gckDVFS manager. */ gcmkONERROR(gckOS_Allocate(os, gcmSIZEOF(struct _gckDVFS), &pointer)); gckOS_ZeroMemory(pointer, gcmSIZEOF(struct _gckDVFS)); dvfs = pointer; /* Initialization. */ dvfs->hardware = Hardware; dvfs->pollingTime = gcdDVFS_POLLING_TIME; dvfs->os = Hardware->os; dvfs->currentScale = 64; /* Create a polling timer. */ gcmkONERROR(gckOS_CreateTimer(os, _TimerFunction, pointer, &dvfs->timer)); /* Initialize frequency and voltage adjustment helper. */ gcmkONERROR(gckOS_PrepareGPUFrequency(os, Hardware->core)); /* Return result. */ *Dvfs = dvfs; gcmkFOOTER_NO(); return gcvSTATUS_OK; OnError: /* Roll back. */ if (dvfs) { if (dvfs->timer) { gcmkVERIFY_OK(gckOS_DestroyTimer(os, dvfs->timer)); } gcmkOS_SAFE_FREE(os, dvfs); } gcmkFOOTER(); return status; }
gceSTATUS gckDVFS_Destroy( IN gckDVFS Dvfs ) { gcmkHEADER_ARG("Dvfs=0x%X", Dvfs); gcmkVERIFY_ARGUMENT(Dvfs != gcvNULL); /* Deinitialize helper fuunction. */ gcmkVERIFY_OK(gckOS_FinishGPUFrequency(Dvfs->os, Dvfs->hardware->core)); /* DestroyTimer. */ gcmkVERIFY_OK(gckOS_DestroyTimer(Dvfs->os, Dvfs->timer)); gcmkOS_SAFE_FREE(Dvfs->os, Dvfs); gcmkFOOTER_NO(); return gcvSTATUS_OK; }
/******************************************************************************* ** gckKERNEL_NewRecord ** ** Create a new database record structure and insert it to the head of the ** database. ** ** INPUT: ** ** gckKERNEL Kernel ** Pointer to a gckKERNEL object. ** ** gcsDATABASE_PTR Database ** Pointer to a database structure. ** ** OUTPUT: ** ** gcsDATABASE_RECORD_PTR * Record ** Pointer to a variable receiving the database record structure ** pointer on success. */ static gceSTATUS gckKERNEL_NewRecord( IN gckKERNEL Kernel, IN gcsDATABASE_PTR Database, IN gctUINT32 Slot, OUT gcsDATABASE_RECORD_PTR * Record ) { gceSTATUS status; gctBOOL acquired = gcvFALSE; gcsDATABASE_RECORD_PTR record = gcvNULL; gcmkHEADER_ARG("Kernel=0x%x Database=0x%x", Kernel, Database); /* Acquire the database mutex. */ gcmkONERROR( gckOS_AcquireMutex(Kernel->os, Kernel->db->dbMutex, gcvINFINITE)); acquired = gcvTRUE; if (Kernel->db->freeRecord != gcvNULL) { /* Allocate the record from the free list. */ record = Kernel->db->freeRecord; Kernel->db->freeRecord = record->next; } else { gctPOINTER pointer = gcvNULL; /* Allocate the record from the heap. */ gcmkONERROR(gckOS_Allocate(Kernel->os, gcmSIZEOF(gcsDATABASE_RECORD), &pointer)); record = pointer; } /* Insert the record in the database. */ record->next = Database->list[Slot]; Database->list[Slot] = record; /* Release the database mutex. */ gcmkONERROR(gckOS_ReleaseMutex(Kernel->os, Kernel->db->dbMutex)); /* Return the record. */ *Record = record; /* Success. */ gcmkFOOTER_ARG("*Record=0x%x", *Record); return gcvSTATUS_OK; OnError: if (acquired) { /* Release the database mutex. */ gcmkVERIFY_OK(gckOS_ReleaseMutex(Kernel->os, Kernel->db->dbMutex)); } if (record != gcvNULL) { gcmkVERIFY_OK(gcmkOS_SAFE_FREE(Kernel->os, record)); } /* Return the status. */ gcmkFOOTER(); return status; }