accelerant: replace AreaCloner with AreaDeleter

Reduce code duplication.

Change-Id: Ice1a14fc7378382e89c3e5a1aea6fa21b903e436
Reviewed-on: https://review.haiku-os.org/c/haiku/+/3482
Reviewed-by: Axel Dörfler <axeld@pinc-software.de>
This commit is contained in:
X512 2020-12-09 16:06:53 +09:00 committed by Adrien Destugues
parent 553f3f2309
commit 47404f12f2
6 changed files with 38 additions and 178 deletions

View File

@ -3,6 +3,7 @@ SubDir HAIKU_TOP src add-ons accelerants intel_extreme ;
UsePrivateHeaders graphics ;
UsePrivateHeaders [ FDirName graphics intel_extreme ] ;
UsePrivateHeaders [ FDirName graphics common ] ;
UsePrivateHeaders shared ;
Addon intel_extreme.accelerant :
accelerant.cpp

View File

@ -22,6 +22,7 @@
#include <new>
#include <AGP.h>
#include <AutoDeleterOS.h>
#undef TRACE
@ -40,53 +41,6 @@ struct accelerant_info* gInfo;
uint32 gDumpCount;
class AreaCloner {
public:
AreaCloner();
~AreaCloner();
area_id Clone(const char* name, void** _address,
uint32 spec, uint32 protection,
area_id sourceArea);
status_t InitCheck()
{ return fArea < 0 ? (status_t)fArea : B_OK; }
void Keep();
private:
area_id fArea;
};
AreaCloner::AreaCloner()
:
fArea(-1)
{
}
AreaCloner::~AreaCloner()
{
if (fArea >= 0)
delete_area(fArea);
}
area_id
AreaCloner::Clone(const char* name, void** _address, uint32 spec,
uint32 protection, area_id sourceArea)
{
fArea = clone_area(name, _address, spec, protection, sourceArea);
return fArea;
}
void
AreaCloner::Keep()
{
fArea = -1;
}
// #pragma mark -
@ -134,6 +88,7 @@ init_common(int device, bool isClone)
gInfo = (accelerant_info*)malloc(sizeof(accelerant_info));
if (gInfo == NULL)
return B_NO_MEMORY;
MemoryDeleter infoDeleter(gInfo);
memset(gInfo, 0, sizeof(accelerant_info));
@ -146,33 +101,26 @@ init_common(int device, bool isClone)
data.magic = INTEL_PRIVATE_DATA_MAGIC;
if (ioctl(device, INTEL_GET_PRIVATE_DATA, &data,
sizeof(intel_get_private_data)) != 0) {
free(gInfo);
sizeof(intel_get_private_data)) != 0)
return B_ERROR;
}
AreaCloner sharedCloner;
gInfo->shared_info_area = sharedCloner.Clone("intel extreme shared info",
AreaDeleter sharedDeleter(clone_area("intel extreme shared info",
(void**)&gInfo->shared_info, B_ANY_ADDRESS, B_READ_AREA | B_WRITE_AREA,
data.shared_info_area);
status_t status = sharedCloner.InitCheck();
if (status < B_OK) {
free(gInfo);
data.shared_info_area));
status_t status = gInfo->shared_info_area = sharedDeleter.Get();
if (status < B_OK)
return status;
}
AreaCloner regsCloner;
gInfo->regs_area = regsCloner.Clone("intel extreme regs",
AreaDeleter regsDeleter(clone_area("intel extreme regs",
(void**)&gInfo->registers, B_ANY_ADDRESS, B_READ_AREA | B_WRITE_AREA,
gInfo->shared_info->registers_area);
status = regsCloner.InitCheck();
if (status < B_OK) {
free(gInfo);
gInfo->shared_info->registers_area));
status = gInfo->regs_area = regsDeleter.Get();
if (status < B_OK)
return status;
}
sharedCloner.Keep();
regsCloner.Keep();
infoDeleter.Detach();
sharedDeleter.Detach();
regsDeleter.Detach();
// The overlay registers, hardware status, and cursor memory share
// a single area with the shared_info

View File

@ -6,6 +6,7 @@ UseHeaders [ FDirName $(SUBDIR) atombios ] ;
UsePrivateHeaders graphics ;
UsePrivateHeaders [ FDirName graphics radeon_hd ] ;
UsePrivateHeaders [ FDirName graphics common ] ;
UsePrivateHeaders shared ;
Addon radeon_hd.accelerant :
accelerant.cpp

View File

@ -19,6 +19,8 @@
#include <syslog.h>
#include <unistd.h>
#include <AutoDeleterOS.h>
#include "accelerant_protos.h"
#include "bios.h"
@ -46,53 +48,6 @@ connector_info* gConnector[ATOM_MAX_SUPPORTED_DEVICE];
gpio_info* gGPIOInfo[MAX_GPIO_PINS];
class AreaCloner {
public:
AreaCloner();
~AreaCloner();
area_id Clone(const char* name, void** _address,
uint32 spec, uint32 protection,
area_id sourceArea);
status_t InitCheck()
{return fArea < 0 ? (status_t)fArea : B_OK;}
void Keep();
private:
area_id fArea;
};
AreaCloner::AreaCloner()
:
fArea(-1)
{
}
AreaCloner::~AreaCloner()
{
if (fArea >= 0)
delete_area(fArea);
}
area_id
AreaCloner::Clone(const char* name, void** _address, uint32 spec,
uint32 protection, area_id sourceArea)
{
fArea = clone_area(name, _address, spec, protection, sourceArea);
return fArea;
}
void
AreaCloner::Keep()
{
fArea = -1;
}
// #pragma mark -
@ -105,6 +60,7 @@ init_common(int device, bool isClone)
// initialize global accelerant info structure
gInfo = (accelerant_info*)malloc(sizeof(accelerant_info));
MemoryDeleter infoDeleter(gInfo);
if (gInfo == NULL)
return B_NO_MEMORY;
@ -161,24 +117,20 @@ init_common(int device, bool isClone)
return B_ERROR;
}
AreaCloner sharedCloner;
gInfo->shared_info_area = sharedCloner.Clone("radeon hd shared info",
AreaDeleter sharedDeleter(clone_area("radeon hd shared info",
(void**)&gInfo->shared_info, B_ANY_ADDRESS, B_READ_AREA | B_WRITE_AREA,
data.shared_info_area);
status_t status = sharedCloner.InitCheck();
data.shared_info_area));
status_t status = gInfo->shared_info_area = sharedDeleter.Get();
if (status < B_OK) {
free(gInfo);
TRACE("%s, failed to create shared area\n", __func__);
return status;
}
AreaCloner regsCloner;
gInfo->regs_area = regsCloner.Clone("radeon hd regs",
AreaDeleter regsDeleter(clone_area("radeon hd regs",
(void**)&gInfo->regs, B_ANY_ADDRESS, B_READ_AREA | B_WRITE_AREA,
gInfo->shared_info->registers_area);
status = regsCloner.InitCheck();
gInfo->shared_info->registers_area));
status = gInfo->regs_area = regsDeleter.Get();
if (status < B_OK) {
free(gInfo);
TRACE("%s, failed to create mmio area\n", __func__);
return status;
}
@ -195,8 +147,9 @@ init_common(int device, bool isClone)
if (gInfo->rom[0] != 0x55 || gInfo->rom[1] != 0xAA)
TRACE("%s: didn't find a VGA bios in cloned region!\n", __func__);
sharedCloner.Keep();
regsCloner.Keep();
infoDeleter.Detach();
sharedDeleter.Detach();
regsDeleter.Detach();
return B_OK;
}

View File

@ -3,6 +3,7 @@ SubDir HAIKU_TOP src add-ons accelerants vesa ;
UsePrivateHeaders graphics ;
UsePrivateHeaders [ FDirName graphics vesa ] ;
UsePrivateHeaders [ FDirName graphics common ] ;
UsePrivateHeaders shared ;
#AddResources vesa.accelerant : vesa.accelerant.rdef ;

View File

@ -14,6 +14,8 @@
#include <errno.h>
#include <syslog.h>
#include <AutoDeleterOS.h>
//#define TRACE_ACCELERANT
#ifdef TRACE_ACCELERANT
@ -27,51 +29,6 @@ extern "C" void _sPrintf(const char *format, ...);
struct accelerant_info *gInfo;
class AreaCloner {
public:
AreaCloner();
~AreaCloner();
area_id Clone(const char *name, void **_address, uint32 spec,
uint32 protection, area_id sourceArea);
status_t InitCheck() { return fArea < B_OK ? (status_t)fArea : B_OK; }
void Keep();
private:
area_id fArea;
};
AreaCloner::AreaCloner()
:
fArea(-1)
{
}
AreaCloner::~AreaCloner()
{
if (fArea >= B_OK)
delete_area(fArea);
}
area_id
AreaCloner::Clone(const char *name, void **_address, uint32 spec,
uint32 protection, area_id sourceArea)
{
fArea = clone_area(name, _address, spec, protection, sourceArea);
return fArea;
}
void
AreaCloner::Keep()
{
fArea = -1;
}
// #pragma mark -
@ -84,6 +41,7 @@ init_common(int device, bool isClone)
// initialize global accelerant info structure
gInfo = (accelerant_info *)malloc(sizeof(accelerant_info));
MemoryDeleter infoDeleter(gInfo);
if (gInfo == NULL)
return B_NO_MEMORY;
@ -102,15 +60,12 @@ init_common(int device, bool isClone)
return B_ERROR;
}
AreaCloner sharedCloner;
gInfo->shared_info_area = sharedCloner.Clone("vesa shared info",
AreaDeleter sharedDeleter(clone_area("vesa shared info",
(void **)&gInfo->shared_info, B_ANY_ADDRESS,
B_READ_AREA | B_WRITE_AREA, sharedArea);
status_t status = sharedCloner.InitCheck();
if (status < B_OK) {
free(gInfo);
B_READ_AREA | B_WRITE_AREA, sharedArea));
status_t status = gInfo->shared_info_area = sharedDeleter.Get();
if (status < B_OK)
return status;
}
if (gInfo->shared_info->vesa_mode_count == 0)
gInfo->vesa_modes = NULL;
@ -118,7 +73,8 @@ init_common(int device, bool isClone)
gInfo->vesa_modes = (vesa_mode *)((uint8 *)gInfo->shared_info
+ gInfo->shared_info->vesa_mode_offset);
sharedCloner.Keep();
infoDeleter.Detach();
sharedDeleter.Detach();
return B_OK;
}