* 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
This commit is contained in:
Axel Dörfler 2008-01-31 17:54:23 +00:00
parent 2697202858
commit 103d05f3c2
3 changed files with 60 additions and 25 deletions

View File

@ -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;

View File

@ -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,

View File

@ -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;
}