From 34a662eda707be254c24129da6821851b78a7701 Mon Sep 17 00:00:00 2001 From: Ingo Weinhold Date: Mon, 21 Jun 2010 22:02:31 +0000 Subject: [PATCH] Force 32 bit physical addresses. Added TODOs. git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@37215 a95241bf-73f2-0310-859d-f6bbb57e9c96 --- src/add-ons/kernel/drivers/graphics/nvidia/driver.c | 4 +++- .../kernel/drivers/graphics/nvidia_gpgpu/driver.c | 4 +++- .../kernel/drivers/graphics/radeon/PCI_GART.c | 13 ++++++++++--- 3 files changed, 16 insertions(+), 5 deletions(-) diff --git a/src/add-ons/kernel/drivers/graphics/nvidia/driver.c b/src/add-ons/kernel/drivers/graphics/nvidia/driver.c index 9f844e9c12..d204d21f6e 100644 --- a/src/add-ons/kernel/drivers/graphics/nvidia/driver.c +++ b/src/add-ons/kernel/drivers/graphics/nvidia/driver.c @@ -906,8 +906,10 @@ open_hook(const char* name, uint32 flags, void** cookie) (void **)&unaligned_dma_buffer, B_ANY_KERNEL_ADDRESS, 2 * net_buf_size, /* take twice the net size so we can have MTRR-WC even on old systems */ - B_CONTIGUOUS, /* GPU always needs access */ + B_32_BIT_MEMORY, /* GPU always needs access */ B_USER_CLONEABLE_AREA | B_READ_AREA | B_WRITE_AREA); + // TODO: Physical aligning can be done without waste using the + // private create_area_etc(). /* on error, abort */ if (si->unaligned_dma_area < 0) { diff --git a/src/add-ons/kernel/drivers/graphics/nvidia_gpgpu/driver.c b/src/add-ons/kernel/drivers/graphics/nvidia_gpgpu/driver.c index 7d7f1c9200..63da857b24 100644 --- a/src/add-ons/kernel/drivers/graphics/nvidia_gpgpu/driver.c +++ b/src/add-ons/kernel/drivers/graphics/nvidia_gpgpu/driver.c @@ -662,8 +662,10 @@ open_hook(const char* name, uint32 flags, void** cookie) (void **)&unaligned_dma_buffer, B_ANY_KERNEL_ADDRESS, 2 * net_buf_size, /* take twice the net size so we can have MTRR-WC even on old systems */ - B_CONTIGUOUS, /* GPU always needs access */ + B_32_BIT_MEMORY, /* GPU always needs access */ B_USER_CLONEABLE_AREA | B_READ_AREA | B_WRITE_AREA); + // TODO: Physical aligning can be done without waste using the + // private create_area_etc(). /* on error, abort */ if (si->unaligned_dma_area < 0) { diff --git a/src/add-ons/kernel/drivers/graphics/radeon/PCI_GART.c b/src/add-ons/kernel/drivers/graphics/radeon/PCI_GART.c index 3287dee142..713a1ff014 100644 --- a/src/add-ons/kernel/drivers/graphics/radeon/PCI_GART.c +++ b/src/add-ons/kernel/drivers/graphics/radeon/PCI_GART.c @@ -90,6 +90,8 @@ static status_t createGARTBuffer( GART_info *gart, size_t size ) gart->buffer.unaligned_area = create_area( "Radeon PCI GART buffer", &unaligned_addr, B_ANY_KERNEL_ADDRESS, 2 * size, B_CONTIGUOUS/*B_FULL_LOCK*/, B_READ_AREA | B_WRITE_AREA | B_USER_CLONEABLE_AREA ); + // TODO: Physical aligning can be done without waste using the + // private create_area_etc(). if (gart->buffer.unaligned_area < 0) { SHOW_ERROR( 1, "cannot create PCI GART buffer (%s)", strerror( gart->buffer.unaligned_area )); @@ -146,11 +148,13 @@ static status_t initGATT( GART_info *gart ) num_pages = (gart->buffer.size + B_PAGE_SIZE - 1) & ~(B_PAGE_SIZE - 1); - // GART must be contignuous + // GART must be contiguous gart->GATT.area = create_area("Radeon GATT", (void **)&gart->GATT.ptr, B_ANY_KERNEL_ADDRESS, (num_pages * sizeof( uint32 ) + B_PAGE_SIZE - 1) & ~(B_PAGE_SIZE - 1), - B_CONTIGUOUS, + B_32_BIT_MEMORY, + // TODO: Physical address is cast to 32 bit below! Use B_CONTIGUOUS, + // when that is (/can be) fixed! #ifdef HAIKU_TARGET_PLATFORM_HAIKU // TODO: really user read/write? B_READ_AREA | B_WRITE_AREA | B_USER_CLONEABLE_AREA @@ -182,7 +186,10 @@ static status_t initGATT( GART_info *gart ) map_area_size = ((map_area_size / B_PAGE_SIZE) + 1) * B_PAGE_SIZE; // temporary area where we fill in the memory map (deleted below) - map_area = create_area("pci_gart_map_area", (void **)&map, B_ANY_ADDRESS, map_area_size, B_FULL_LOCK, B_READ_AREA | B_WRITE_AREA); + map_area = create_area("pci_gart_map_area", (void **)&map, B_ANY_ADDRESS, + map_area_size, B_32_BIT_MEMORY, B_READ_AREA | B_WRITE_AREA); + // TODO: Physical addresses are cast to 32 bit below! Use B_FULL_LOCK, + // when that is (/can be) fixed! dprintf("pci_gart_map_area: %ld\n", map_area); get_memory_map( gart->buffer.ptr, gart->buffer.size, map, map_count );