graphics/s3: Fixes for 64-bit.
Untested as I don't have this hardware, but relatively straightforward. Part of #20112.
This commit is contained in:
@@ -148,7 +148,7 @@ struct SharedInfo {
|
|||||||
// be cloned into accelerant's address space.
|
// be cloned into accelerant's address space.
|
||||||
area_id videoMemArea; // video memory area_id. The addresses are shared with all teams.
|
area_id videoMemArea; // video memory area_id. The addresses are shared with all teams.
|
||||||
void* videoMemAddr; // video memory addr as viewed from virtual memory
|
void* videoMemAddr; // video memory addr as viewed from virtual memory
|
||||||
void* videoMemPCI; // video memory addr as viewed from the PCI bus (for DMA)
|
phys_addr_t videoMemPCI; // video memory addr as viewed from the PCI bus (for DMA)
|
||||||
uint32 videoMemSize; // video memory size in bytes.
|
uint32 videoMemSize; // video memory size in bytes.
|
||||||
|
|
||||||
uint32 cursorOffset; // offset of cursor in video memory
|
uint32 cursorOffset; // offset of cursor in video memory
|
||||||
|
|||||||
@@ -215,7 +215,7 @@ MapDevice(DeviceInfo& di)
|
|||||||
|
|
||||||
videoRamAddr = pciInfo.u.h0.base_registers[0];
|
videoRamAddr = pciInfo.u.h0.base_registers[0];
|
||||||
videoRamSize = 16 * 1024 * 1024; // 16 MB is max for 3D series
|
videoRamSize = 16 * 1024 * 1024; // 16 MB is max for 3D series
|
||||||
si.videoMemPCI = (void *)(pciInfo.u.h0.base_registers_pci[0]);
|
si.videoMemPCI = pciInfo.u.h0.base_registers_pci[0];
|
||||||
} else {
|
} else {
|
||||||
// All other Savage chips.
|
// All other Savage chips.
|
||||||
|
|
||||||
@@ -224,7 +224,7 @@ MapDevice(DeviceInfo& di)
|
|||||||
|
|
||||||
videoRamAddr = pciInfo.u.h0.base_registers[1];
|
videoRamAddr = pciInfo.u.h0.base_registers[1];
|
||||||
videoRamSize = pciInfo.u.h0.base_register_sizes[1];
|
videoRamSize = pciInfo.u.h0.base_register_sizes[1];
|
||||||
si.videoMemPCI = (void *)(pciInfo.u.h0.base_registers_pci[1]);
|
si.videoMemPCI = pciInfo.u.h0.base_registers_pci[1];
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
// Trio/Virge chips.
|
// Trio/Virge chips.
|
||||||
@@ -234,7 +234,7 @@ MapDevice(DeviceInfo& di)
|
|||||||
|
|
||||||
videoRamAddr = pciInfo.u.h0.base_registers[0];
|
videoRamAddr = pciInfo.u.h0.base_registers[0];
|
||||||
videoRamSize = 8 * 1024 * 1024; // 8 MB is max for Trio/Virge chips
|
videoRamSize = 8 * 1024 * 1024; // 8 MB is max for Trio/Virge chips
|
||||||
si.videoMemPCI = (void *)(pciInfo.u.h0.base_registers_pci[0]);
|
si.videoMemPCI = pciInfo.u.h0.base_registers_pci[0];
|
||||||
}
|
}
|
||||||
|
|
||||||
// Map the MMIO register area.
|
// Map the MMIO register area.
|
||||||
@@ -810,106 +810,114 @@ device_free(void* dev)
|
|||||||
|
|
||||||
|
|
||||||
static status_t
|
static status_t
|
||||||
device_ioctl(void* dev, uint32 msg, void* buf, size_t len)
|
device_ioctl(void* dev, uint32 msg, void* buffer, size_t bufferLength)
|
||||||
{
|
{
|
||||||
DeviceInfo& di = *((DeviceInfo*)dev);
|
DeviceInfo& di = *((DeviceInfo*)dev);
|
||||||
|
|
||||||
(void)len; // avoid compiler warning for unused arg
|
|
||||||
|
|
||||||
// TRACE("device_ioctl(); ioctl: %lu, buf: 0x%08lx, len: %lu\n", msg, (uint32)buf, len);
|
// TRACE("device_ioctl(); ioctl: %lu, buf: 0x%08lx, len: %lu\n", msg, (uint32)buf, len);
|
||||||
|
|
||||||
switch (msg) {
|
switch (msg) {
|
||||||
case B_GET_ACCELERANT_SIGNATURE:
|
case B_GET_ACCELERANT_SIGNATURE:
|
||||||
strcpy((char*)buf, "s3.accelerant");
|
if (user_strlcpy((char*)buffer, "s3.accelerant",
|
||||||
|
bufferLength) < B_OK)
|
||||||
|
return B_BAD_ADDRESS;
|
||||||
return B_OK;
|
return B_OK;
|
||||||
|
|
||||||
case S3_DEVICE_NAME:
|
case S3_DEVICE_NAME:
|
||||||
strncpy((char*)buf, di.name, B_OS_NAME_LENGTH);
|
return user_strlcpy((char*)buffer, di.name, B_OS_NAME_LENGTH);
|
||||||
((char*)buf)[B_OS_NAME_LENGTH -1] = '\0';
|
|
||||||
return B_OK;
|
|
||||||
|
|
||||||
case S3_GET_PRIVATE_DATA:
|
case S3_GET_PRIVATE_DATA:
|
||||||
{
|
{
|
||||||
S3GetPrivateData* gpd = (S3GetPrivateData*)buf;
|
S3GetPrivateData data;
|
||||||
if (gpd->magic == S3_PRIVATE_DATA_MAGIC) {
|
if (user_memcpy(&data, buffer, sizeof(uint32)) != B_OK)
|
||||||
gpd->sharedInfoArea = di.sharedArea;
|
return B_BAD_ADDRESS;
|
||||||
return B_OK;
|
if (data.magic != S3_PRIVATE_DATA_MAGIC)
|
||||||
}
|
return B_BAD_VALUE;
|
||||||
break;
|
|
||||||
|
data.sharedInfoArea = di.sharedArea;
|
||||||
|
return user_memcpy(buffer, &data, sizeof(S3GetPrivateData));
|
||||||
}
|
}
|
||||||
|
|
||||||
case S3_GET_EDID:
|
case S3_GET_EDID:
|
||||||
{
|
{
|
||||||
#ifdef __HAIKU__
|
S3GetEDID data;
|
||||||
S3GetEDID* ged = (S3GetEDID*)buf;
|
if (user_memcpy(&data, buffer, sizeof(uint32)) != B_OK)
|
||||||
if (ged->magic == S3_PRIVATE_DATA_MAGIC) {
|
return B_BAD_ADDRESS;
|
||||||
edid1_raw rawEdid;
|
if (data.magic != S3_PRIVATE_DATA_MAGIC)
|
||||||
status_t status = GetEdidFromBIOS(rawEdid);
|
return B_BAD_VALUE;
|
||||||
if (status == B_OK)
|
|
||||||
user_memcpy(&ged->rawEdid, &rawEdid, sizeof(rawEdid));
|
status_t status = GetEdidFromBIOS(data.rawEdid);
|
||||||
return status;
|
if (status == B_OK) {
|
||||||
|
status = user_memcpy(&((S3GetEDID*)buffer)->rawEdid, &data.rawEdid,
|
||||||
|
sizeof(data.rawEdid));
|
||||||
}
|
}
|
||||||
#else
|
return status;
|
||||||
return B_UNSUPPORTED;
|
|
||||||
#endif
|
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
case S3_GET_PIO:
|
case S3_GET_PIO:
|
||||||
{
|
{
|
||||||
S3GetSetPIO* gsp = (S3GetSetPIO*)buf;
|
S3GetSetPIO data;
|
||||||
if (gsp->magic == S3_PRIVATE_DATA_MAGIC) {
|
if (user_memcpy(&data, buffer, sizeof(data)) != B_OK)
|
||||||
switch (gsp->size) {
|
return B_BAD_ADDRESS;
|
||||||
case 1:
|
if (data.magic != S3_PRIVATE_DATA_MAGIC)
|
||||||
gsp->value = gPCI->read_io_8(gsp->offset);
|
return B_BAD_VALUE;
|
||||||
break;
|
|
||||||
case 2:
|
switch (data.size) {
|
||||||
gsp->value = gPCI->read_io_16(gsp->offset);
|
case 1:
|
||||||
break;
|
data.value = gPCI->read_io_8(data.offset);
|
||||||
case 4:
|
break;
|
||||||
gsp->value = gPCI->read_io_32(gsp->offset);
|
case 2:
|
||||||
break;
|
data.value = gPCI->read_io_16(data.offset);
|
||||||
default:
|
break;
|
||||||
TRACE("device_ioctl() S3_GET_PIO invalid size: %" B_PRIu32 "\n", gsp->size);
|
case 4:
|
||||||
return B_ERROR;
|
data.value = gPCI->read_io_32(data.offset);
|
||||||
}
|
break;
|
||||||
return B_OK;
|
default:
|
||||||
|
TRACE("device_ioctl() S3_GET_PIO invalid size: %" B_PRIu32 "\n", data.size);
|
||||||
|
return B_ERROR;
|
||||||
}
|
}
|
||||||
break;
|
|
||||||
|
return user_memcpy(buffer, &data, sizeof(data));
|
||||||
}
|
}
|
||||||
|
|
||||||
case S3_SET_PIO:
|
case S3_SET_PIO:
|
||||||
{
|
{
|
||||||
S3GetSetPIO* gsp = (S3GetSetPIO*)buf;
|
S3GetSetPIO data;
|
||||||
if (gsp->magic == S3_PRIVATE_DATA_MAGIC) {
|
if (user_memcpy(&data, buffer, sizeof(data)) != B_OK)
|
||||||
switch (gsp->size) {
|
return B_BAD_ADDRESS;
|
||||||
case 1:
|
if (data.magic != S3_PRIVATE_DATA_MAGIC)
|
||||||
gPCI->write_io_8(gsp->offset, gsp->value);
|
return B_BAD_VALUE;
|
||||||
break;
|
|
||||||
case 2:
|
switch (data.size) {
|
||||||
gPCI->write_io_16(gsp->offset, gsp->value);
|
case 1:
|
||||||
break;
|
gPCI->write_io_8(data.offset, data.value);
|
||||||
case 4:
|
break;
|
||||||
gPCI->write_io_32(gsp->offset, gsp->value);
|
case 2:
|
||||||
break;
|
gPCI->write_io_16(data.offset, data.value);
|
||||||
default:
|
break;
|
||||||
TRACE("device_ioctl() S3_SET_PIO invalid size: %" B_PRIu32 "\n", gsp->size);
|
case 4:
|
||||||
return B_ERROR;
|
gPCI->write_io_32(data.offset, data.value);
|
||||||
}
|
break;
|
||||||
return B_OK;
|
default:
|
||||||
|
TRACE("device_ioctl() S3_SET_PIO invalid size: %" B_PRIu32 "\n", data.size);
|
||||||
|
return B_ERROR;
|
||||||
}
|
}
|
||||||
break;
|
|
||||||
|
return user_memcpy(buffer, &data, sizeof(data));
|
||||||
}
|
}
|
||||||
|
|
||||||
case S3_RUN_INTERRUPTS:
|
case S3_RUN_INTERRUPTS:
|
||||||
{
|
{
|
||||||
S3SetBoolState* ri = (S3SetBoolState*)buf;
|
S3SetBoolState data;
|
||||||
if (ri->magic == S3_PRIVATE_DATA_MAGIC) {
|
if (user_memcpy(&data, buffer, sizeof(data)) != B_OK)
|
||||||
if (ri->bEnable)
|
return B_BAD_ADDRESS;
|
||||||
EnableVBI();
|
if (data.magic != S3_PRIVATE_DATA_MAGIC)
|
||||||
else
|
return B_BAD_VALUE;
|
||||||
DisableVBI();
|
|
||||||
}
|
if (data.bEnable)
|
||||||
|
EnableVBI();
|
||||||
|
else
|
||||||
|
DisableVBI();
|
||||||
return B_OK;
|
return B_OK;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user