/* * Copyright (c) 2012 cparm . All rights reserved. * */ #include // Only use angled for Platform, else, xcode project won't compile #include "nvidia.h" /* injection for NVIDIA card usage e.g (to be placed in the config.plist, under graphics tag): Graphics NVIDIA Model Quadro FX 380 IOPCIPrimaryMatch 0x10DE0658 VRAM 256 VideoPorts 2 LoadVBios Model YOUR_SECOND_CARD_NAME IOPCIPrimaryMatch YOUR_SECOND_CARD_ID IOPCISubDevId YOUR_SECOND_CARD_SUB_ID(if necessary) VRAM YOUR_SECOND_CARD_VRAM_SIZE VideoPorts YOUR_SECOND_CARD_PORTS LoadVBios ATI Model ATI Radeon HD6670 IOPCIPrimaryMatch 0x6758 IOPCISubDevId 0x1342 VRAM 2048 */ #define DEBUG_CARD_VLIST 1 #if DEBUG_CARD_VLIST == 0 #define DBG(...) #else #define DBG(...) DebugLog(DEBUG_CARD_VLIST, __VA_ARGS__) #endif LIST_ENTRY gCardList = INITIALIZE_LIST_HEAD_VARIABLE (gCardList); void AddCard(CONST CHAR8* Model, UINT32 Id, UINT32 SubId, UINT64 VideoRam, UINTN VideoPorts, BOOLEAN LoadVBios) { CARDLIST* new_card; new_card = (__typeof__(new_card))AllocateZeroPool(sizeof(CARDLIST)); if (new_card) { new_card->Signature = CARDLIST_SIGNATURE; new_card->Id = Id; new_card->SubId = SubId; new_card->VideoRam = VideoRam; new_card->VideoPorts = VideoPorts; new_card->LoadVBios = LoadVBios; snprintf(new_card->Model, 64, "%s", Model); InsertTailList (&gCardList, (LIST_ENTRY *)(((UINT8 *)new_card) + OFFSET_OF(CARDLIST, Link))); } } CARDLIST* FindCardWithIds(UINT32 Id, UINT32 SubId) { LIST_ENTRY *Link; CARDLIST *entry; // FillCardList(); //moved to GetUserSettings if(!IsListEmpty(&gCardList)) { for (Link = gCardList.ForwardLink; Link != &gCardList; Link = Link->ForwardLink) { entry = CR(Link, CARDLIST, Link, CARDLIST_SIGNATURE); if(entry->Id == Id) { return entry; } } } return NULL; } void FillCardList(const TagDict* CfgDict) { if (IsListEmpty(&gCardList) && (CfgDict != NULL)) { CONST CHAR8 *VEN[] = { "NVIDIA", "ATI" }; size_t Count = sizeof(VEN) / sizeof(VEN[0]); for (size_t Index = 0; Index < Count; Index++) { CONST CHAR8 *key = VEN[Index]; const TagArray* prop = CfgDict->arrayPropertyForKey(key); if( prop && prop->isArray() ) { INTN i; INTN count; const TagStruct* prop2 = 0; const TagStruct* element = 0; count = prop->arrayContent().size(); for (i = 0; i < count; i++) { CONST CHAR8 *model_name = NULL; UINT32 dev_id = 0; UINT32 subdev_id = 0; UINT64 VramSize = 0; UINTN VideoPorts = 0; BOOLEAN LoadVBios = FALSE; element = &prop->arrayContent()[i]; if ( !element->isDict()) { MsgLog("MALFORMED PLIST in FillCardList() : element is not a dict"); continue; } const TagDict* dictElement = element->getDict(); prop2 = dictElement->propertyForKey("Model"); if ( prop2->isString() && prop2->getString()->stringValue().notEmpty() ) { model_name = prop2->getString()->stringValue().c_str(); } else { model_name = "VideoCard"; } prop2 = dictElement->propertyForKey("IOPCIPrimaryMatch"); dev_id = (UINT32)GetPropertyAsInteger(prop2, 0); prop2 = dictElement->propertyForKey("IOPCISubDevId"); subdev_id = (UINT32)GetPropertyAsInteger(prop2, 0); prop2 = dictElement->propertyForKey("VRAM"); VramSize = LShiftU64((UINTN)GetPropertyAsInteger(prop2, (INTN)VramSize), 20); //Mb -> bytes prop2 = dictElement->propertyForKey("VideoPorts"); VideoPorts = (UINT16)GetPropertyAsInteger(prop2, VideoPorts); prop2 = dictElement->propertyForKey("LoadVBios"); if (prop2 != NULL && IsPropertyNotNullAndTrue(prop2)) { LoadVBios = TRUE; } DBG("FillCardList :: %s : \"%s\" (%08X, %08X)\n", key, model_name, dev_id, subdev_id); AddCard(model_name, dev_id, subdev_id, VramSize, VideoPorts, LoadVBios); } } } } }