- OSData *dmaParentData;
- const OSSymbol *dmaParentName;
- IODMAController *dmaController;
-
- // Find the name of the parent dma controller
- dmaParentData = OSDynamicCast(OSData, provider->getProperty("dma-parent"));
- if (dmaParentData == 0) return false;
- dmaParentName = createControllerName(*(UInt32 *)dmaParentData->getBytesNoCopy());
- if (dmaParentName == 0) return false;
-
- // Wait for the parent dma controller
- dmaController = OSDynamicCast(IODMAController, IOService::waitForService(IOService::nameMatching(dmaParentName)));
-
- return dmaController;
+ OSData *dmaParentData;
+ const OSSymbol *dmaParentName;
+ IODMAController *dmaController;
+
+ // Find the name of the parent dma controller
+ dmaParentData = OSDynamicCast(OSData, provider->getProperty("dma-parent"));
+ if (dmaParentData == NULL) {
+ return NULL;
+ }
+
+ if (dmaParentData->getLength() == sizeof(UInt32)) {
+ dmaParentName = createControllerName(*(UInt32 *)dmaParentData->getBytesNoCopy());
+ } else {
+ if (dmaIndex >= dmaParentData->getLength() / sizeof(UInt32)) {
+ panic("dmaIndex out of range");
+ }
+ dmaParentName = createControllerName(*(UInt32 *)dmaParentData->getBytesNoCopy(dmaIndex * sizeof(UInt32), sizeof(UInt32)));
+ }
+ if (dmaParentName == NULL) {
+ return NULL;
+ }
+
+ // Wait for the parent dma controller
+ dmaController = OSDynamicCast(IODMAController, IOService::waitForService(IOService::nameMatching(dmaParentName)));
+
+ return dmaController;