From 103d05f3c2db9203f8de61e744c99acc2be41141 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Axel=20D=C3=B6rfler?= Date: Thu, 31 Jan 2008 17:54:23 +0000 Subject: [PATCH] * Renamed GART's deallocate_memory() to free_memory(). * Removed "physical" parameter of GART's bind_aperture() - I don't think this be of use to anyone. * Fixed binding/unbinding pages in the Intel GART driver; I accidently shifted the page offset twice. * Actually forgot handling of allocated memory in Aperture::BindMemory(). * Minor cleanup. git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@23796 a95241bf-73f2-0310-859d-f6bbb57e9c96 --- headers/private/graphics/AGP.h | 6 +- .../kernel/bus_managers/agp_gart/agp_gart.cpp | 66 ++++++++++++++----- .../kernel/busses/agp_gart/intel_gart.cpp | 13 ++-- 3 files changed, 60 insertions(+), 25 deletions(-) diff --git a/headers/private/graphics/AGP.h b/headers/private/graphics/AGP.h index b78b301f3e..11b6486686 100644 --- a/headers/private/graphics/AGP.h +++ b/headers/private/graphics/AGP.h @@ -60,13 +60,13 @@ typedef struct agp_gart_module_info { status_t (*allocate_memory)(aperture_id id, size_t size, size_t alignment, uint32 flags, addr_t *_apertureBase, addr_t *_physicalBase); - status_t (*deallocate_memory)(aperture_id id, addr_t apertureBase); + status_t (*free_memory)(aperture_id id, addr_t apertureBase); status_t (*reserve_aperture)(aperture_id id, size_t size, addr_t *_apertureBase); status_t (*unreserve_aperture)(aperture_id id, addr_t apertureBase); status_t (*bind_aperture)(aperture_id id, area_id area, addr_t base, - size_t size, size_t alignment, bool physical, - addr_t reservedBase, addr_t *_apertureBase); + size_t size, size_t alignment, addr_t reservedBase, + addr_t *_apertureBase); status_t (*unbind_aperture)(aperture_id id, addr_t apertureBase); } agp_gart_module_info; diff --git a/src/add-ons/kernel/bus_managers/agp_gart/agp_gart.cpp b/src/add-ons/kernel/bus_managers/agp_gart/agp_gart.cpp index 48837bb7c7..6c05129df6 100644 --- a/src/add-ons/kernel/bus_managers/agp_gart/agp_gart.cpp +++ b/src/add-ons/kernel/bus_managers/agp_gart/agp_gart.cpp @@ -132,8 +132,7 @@ public: status_t AllocateMemory(aperture_memory *memory, uint32 flags); status_t UnbindMemory(aperture_memory *memory); - status_t BindMemory(aperture_memory *memory, addr_t base, size_t size, - bool physical); + status_t BindMemory(aperture_memory *memory, addr_t base, size_t size); status_t GetInfo(aperture_info *info); @@ -387,6 +386,20 @@ set_pci_mode() } +status_t +get_area_base_and_size(area_id area, addr_t base, size_t size) +{ + area_info info; + status_t status = get_area_info(area, &info); + if (status < B_OK) + return status; + + base = (addr_t)info.address; + size = info.size; + return B_OK; +} + + Aperture * get_aperture(aperture_id id) { @@ -568,6 +581,7 @@ Aperture::UnbindMemory(aperture_memory *memory) } addr_t start = base - Base(); + TRACE("unbind %ld bytes at %lx\n", size, start); for (addr_t offset = 0; offset < memory->size; offset += B_PAGE_SIZE) { status_t status = fModule->unbind_page(fPrivateAperture, start + offset); @@ -582,9 +596,21 @@ Aperture::UnbindMemory(aperture_memory *memory) status_t -Aperture::BindMemory(aperture_memory *memory, addr_t address, size_t size, - bool physical) +Aperture::BindMemory(aperture_memory *memory, addr_t address, size_t size) { + bool physical = false; + + if ((memory->flags & ALLOCATED_APERTURE) != 0) { + // We allocated this memory, get the base and size from there +#ifdef __HAIKU__ + physical = true; +#else + status_t status = get_area_base_and_size(memory->area, address, size); + if (status < B_OK) + return status; +#endif + } + // We don't need to bind reserved memory addr_t base = memory->base; int32 offset; @@ -613,8 +639,18 @@ Aperture::BindMemory(aperture_memory *memory, addr_t address, size_t size, return status; physicalAddress = (addr_t)entry.address; - } else - physicalAddress = address + offset; + } else { +#ifdef __HAIKU__ + uint32 index = offset >> PAGE_SHIFT; + vm_page *page; + if ((memory->flags & B_APERTURE_NEED_PHYSICAL) != 0) + page = memory->page + index; + else + page = memory->pages[index]; + + physicalAddress = page->physical_page_number << PAGE_SHIFT; +#endif + } status = fModule->bind_page(fPrivateAperture, start + offset, physicalAddress); @@ -971,7 +1007,7 @@ allocate_memory(aperture_id id, size_t size, size_t alignment, uint32 flags, status_t status = aperture->AllocateMemory(memory, flags); if (status == B_OK) - status = aperture->BindMemory(memory, memory->base, memory->size, false); + status = aperture->BindMemory(memory, 0, 0); if (status < B_OK) { aperture->DeleteMemory(memory); return status; @@ -998,7 +1034,7 @@ allocate_memory(aperture_id id, size_t size, size_t alignment, uint32 flags, static status_t -deallocate_memory(aperture_id id, addr_t base) +free_memory(aperture_id id, addr_t base) { Aperture *aperture = get_aperture(id); if (aperture == NULL) @@ -1038,7 +1074,7 @@ unreserve_aperture(aperture_id id, addr_t apertureBase) static status_t bind_aperture(aperture_id id, area_id area, addr_t base, size_t size, - size_t alignment, bool physical, addr_t reservedBase, addr_t *_apertureBase) + size_t alignment, addr_t reservedBase, addr_t *_apertureBase) { Aperture *aperture = get_aperture(id); if (aperture == NULL) @@ -1054,15 +1090,9 @@ bind_aperture(aperture_id id, area_id area, addr_t base, size_t size, } if (area >= 0) { - // get base and size from area - area_info info; - status_t status = get_area_info(area, &info); + status_t status = get_area_base_and_size(area, base, size); if (status < B_OK) return status; - - base = (addr_t)info.address; - size = info.size; - physical = false; } Autolock _(aperture->Lock()); @@ -1082,7 +1112,7 @@ bind_aperture(aperture_id id, area_id area, addr_t base, size_t size, // just bind the physical pages backing the memory into the GART - status_t status = aperture->BindMemory(memory, base, size, physical); + status_t status = aperture->BindMemory(memory, base, size); if (status < B_OK) { if (reservedBase < 0) aperture->DeleteMemory(memory); @@ -1202,7 +1232,7 @@ static struct agp_gart_module_info sAGPModuleInfo = { unmap_aperture, get_aperture_info, allocate_memory, - deallocate_memory, + free_memory, reserve_aperture, unreserve_aperture, bind_aperture, diff --git a/src/add-ons/kernel/busses/agp_gart/intel_gart.cpp b/src/add-ons/kernel/busses/agp_gart/intel_gart.cpp index 7f0aa7007b..0deaf20197 100644 --- a/src/add-ons/kernel/busses/agp_gart/intel_gart.cpp +++ b/src/add-ons/kernel/busses/agp_gart/intel_gart.cpp @@ -222,8 +222,9 @@ intel_map(intel_info &info) info.gtt_entries = gttSize / 4096; info.gtt_stolen_entries = stolenSize / 4096; -dprintf("GTT base %lx, size %lu, entries %lu, stolen %lu\n", info.gtt_physical_base, - gttSize, info.gtt_entries, stolenSize); + + TRACE("GTT base %lx, size %lu, entries %lu, stolen %lu\n", info.gtt_physical_base, + gttSize, info.gtt_entries, stolenSize); int fbIndex = 0; int mmioIndex = 1; @@ -379,7 +380,9 @@ intel_set_aperture_size(void *aperture, size_t size) static status_t intel_bind_page(void *aperture, uint32 offset, addr_t physicalAddress) { - set_gtt_entry(sInfo, offset << GTT_PAGE_SHIFT, physicalAddress); + TRACE("bind_page(offset %lx, physical %lx)\n", offset, physicalAddress); + + set_gtt_entry(sInfo, offset, physicalAddress); return B_OK; } @@ -387,8 +390,10 @@ intel_bind_page(void *aperture, uint32 offset, addr_t physicalAddress) static status_t intel_unbind_page(void *aperture, uint32 offset) { + TRACE("unbind_page(offset %lx)\n", offset); + if (sInfo.scratch_page != 0) - set_gtt_entry(sInfo, offset << GTT_PAGE_SHIFT, sInfo.scratch_page); + set_gtt_entry(sInfo, offset, sInfo.scratch_page); return B_OK; }