From bad46dca35b2ea11e4ca2c7cd4fffa5d4a718c26 Mon Sep 17 00:00:00 2001 From: Hartmut Birr Date: Sun, 7 Aug 2005 23:08:07 +0000 Subject: [PATCH] Allocate the map registers according to the dma controllers properties (boundary and highest possible address). svn path=/trunk/; revision=17186 --- reactos/hal/halx86/generic/adapter.c | 62 +++++++++++++++++++++------- reactos/hal/halx86/generic/dma.c | 23 +++++++---- 2 files changed, 64 insertions(+), 21 deletions(-) diff --git a/reactos/hal/halx86/generic/adapter.c b/reactos/hal/halx86/generic/adapter.c index 00c77931d3d..135d2da8b86 100644 --- a/reactos/hal/halx86/generic/adapter.c +++ b/reactos/hal/halx86/generic/adapter.c @@ -68,11 +68,6 @@ HalAllocateAdapterChannel( if(KeInsertDeviceQueue(&AdapterObject->ChannelWaitQueue, &WaitContextBlock->WaitQueueEntry)) return STATUS_SUCCESS; - /* 24-bit max address due to 16-bit dma controllers */ - MinAddress.QuadPart = 0x0000000; - MaxAddress.QuadPart = 0x1000000; - BoundryAddressMultiple.QuadPart = 0; - /* why 64K alignment? */ /* * X86 lacks map registers, so for now, we allocate a contiguous @@ -83,13 +78,35 @@ HalAllocateAdapterChannel( * buffer transfers. See a comment in IoMapTransfer about common buffer * support. */ - AdapterObject->MapRegisterBase = MmAllocateContiguousAlignedMemory( + + MinAddress.QuadPart = 0; + BoundryAddressMultiple.QuadPart = 0; + if ((AdapterObject->Dma64BitAddresses) && (AdapterObject->MasterDevice)) + { + MaxAddress.QuadPart = 0xFFFFFFFFFFFFFFFFLL; /* 64Bit: >4GB address range */ + } + else if ((AdapterObject->Dma32BitAddresses) && (AdapterObject->MasterDevice)) + { + MaxAddress.QuadPart = 0xFFFFFFFF; /* 32Bit: 4GB address range */ + } + else + { + MaxAddress.QuadPart = 0x00FFFFFF; /* 24Bit: 16MB address range */ + if (AdapterObject->Width16Bits) + { + BoundryAddressMultiple.QuadPart = 0x20000; /* 128k boundary */ + } + else + { + BoundryAddressMultiple.QuadPart = 0x10000; /* 64k boundary */ + } + } + AdapterObject->MapRegisterBase = MmAllocateContiguousMemorySpecifyCache( NumberOfMapRegisters * PAGE_SIZE, MinAddress, MaxAddress, BoundryAddressMultiple, - MmCached, - 0x10000 ); + MmCached); if(!AdapterObject->MapRegisterBase) return STATUS_INSUFFICIENT_RESOURCES; @@ -387,18 +404,35 @@ IoFreeAdapterChannel (PADAPTER_OBJECT AdapterObject) * function really can't return an error code. FIXME. */ - /* 24-bit max address due to 16-bit dma controllers */ - MinAddress.QuadPart = 0x0000000; - MaxAddress.QuadPart = 0x1000000; + MinAddress.QuadPart = 0; BoundryAddressMultiple.QuadPart = 0; + if ((AdapterObject->Dma64BitAddresses) && (AdapterObject->MasterDevice)) + { + MaxAddress.QuadPart = 0xFFFFFFFFFFFFFFFFLL; /* 64Bit: >4GB address range */ + } + else if ((AdapterObject->Dma32BitAddresses) && (AdapterObject->MasterDevice)) + { + MaxAddress.QuadPart = 0xFFFFFFFF; /* 32Bit: 4GB address range */ + } + else + { + MaxAddress.QuadPart = 0x00FFFFFF; /* 24Bit: 16MB address range */ + if (AdapterObject->Width16Bits) + { + BoundryAddressMultiple.QuadPart = 0x20000; /* 128k boundary */ + } + else + { + BoundryAddressMultiple.QuadPart = 0x10000; /* 64k boundary */ + } + } - AdapterObject->MapRegisterBase = MmAllocateContiguousAlignedMemory( + AdapterObject->MapRegisterBase = MmAllocateContiguousMemorySpecifyCache( WaitContextBlock->NumberOfMapRegisters * PAGE_SIZE, MinAddress, MaxAddress, BoundryAddressMultiple, - MmCached, - 0x10000 ); + MmCached); if(!AdapterObject->MapRegisterBase) return; diff --git a/reactos/hal/halx86/generic/dma.c b/reactos/hal/halx86/generic/dma.c index 7abee565652..2011eb14618 100644 --- a/reactos/hal/halx86/generic/dma.c +++ b/reactos/hal/halx86/generic/dma.c @@ -54,20 +54,29 @@ HalAllocateCommonBuffer (PADAPTER_OBJECT AdapterObject, LowestAddress.QuadPart = 0; BoundryAddressMultiple.QuadPart = 0; - HighestAddress.u.HighPart = 0; - if ((AdapterObject->Dma32BitAddresses) && (AdapterObject->MasterDevice)) { - HighestAddress.u.LowPart = 0xFFFFFFFF; /* 32Bit: 4GB address range */ + if ((AdapterObject->Dma64BitAddresses) && (AdapterObject->MasterDevice)) { + HighestAddress.QuadPart = 0xFFFFFFFFFFFFFFFFLL; /* 64Bit: >4GB address range */ + + } else if ((AdapterObject->Dma32BitAddresses) && (AdapterObject->MasterDevice)) { + HighestAddress.QuadPart = 0xFFFFFFFF; /* 32Bit: 4GB address range */ } else { - HighestAddress.u.LowPart = 0x00FFFFFF; /* 24Bit: 16MB address range */ + HighestAddress.QuadPart = 0x00FFFFFF; /* 24Bit: 16MB address range */ + if (AdapterObject->Width16Bits) + { + BoundryAddressMultiple.QuadPart = 0x20000; /* 128k boundary */ + } + else + { + BoundryAddressMultiple.QuadPart = 0x10000; /* 64k boundary */ + } } - BaseAddress = MmAllocateContiguousAlignedMemory( + BaseAddress = MmAllocateContiguousMemorySpecifyCache( Length, LowestAddress, HighestAddress, BoundryAddressMultiple, - CacheEnabled ? MmCached : MmNonCached, - 0x10000 ); + CacheEnabled ? MmCached : MmNonCached); if (!BaseAddress) return 0;