* Fix syslog output, dprintf doesn't take a va_list. This caused junk to be
written on load of the ACPI module. * Fix waiting for a semaphore. It didn't ever use the timeout because it missed the B_RELATIVE_TIMEOUT and the timeout value would've been wrong as well since it didn't convert from milli- to microseconds. * Do away with the hack of not actually using spinlocks because it apparently didn't work on Dano. Now normal spinlocks are used. * Also remove the atomic test and set function that was used for locking. * Panic in case an interrupt handler is removed, because it cannot (yet) work. * Use system_time() to instead of using gettimeofday() and converting. * Fix reading PCI config, the width was used wrongly so nothing was returned. * The physical memory read/write function didn't actually do anything or would at worst have accessed unmapped memory. It now uses a bit of private VM functionallity to actually implement reading and writing physical memory. * Some style cleanup, more to come in the next commit. git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@28090 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
@@ -128,6 +128,7 @@
|
|||||||
|
|
||||||
#ifdef _KERNEL_MODE
|
#ifdef _KERNEL_MODE
|
||||||
# include <KernelExport.h>
|
# include <KernelExport.h>
|
||||||
|
# include <vm.h>
|
||||||
#include <PCI.h>
|
#include <PCI.h>
|
||||||
extern pci_module_info *gPCIManager;
|
extern pci_module_info *gPCIManager;
|
||||||
#include <dpc.h>
|
#include <dpc.h>
|
||||||
@@ -209,7 +210,6 @@ AcpiOsGetRootPointer (void)
|
|||||||
dprintf("AcpiOsGetRootPointer returning %p\n", (void *)acpi_root);
|
dprintf("AcpiOsGetRootPointer returning %p\n", (void *)acpi_root);
|
||||||
return acpi_root;
|
return acpi_root;
|
||||||
#else
|
#else
|
||||||
|
|
||||||
return (AeLocalGetRootPointer());
|
return (AeLocalGetRootPointer());
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
@@ -234,7 +234,6 @@ AcpiOsPredefinedOverride (
|
|||||||
const ACPI_PREDEFINED_NAMES *InitVal,
|
const ACPI_PREDEFINED_NAMES *InitVal,
|
||||||
ACPI_STRING *NewVal)
|
ACPI_STRING *NewVal)
|
||||||
{
|
{
|
||||||
|
|
||||||
if (!InitVal || !NewVal)
|
if (!InitVal || !NewVal)
|
||||||
{
|
{
|
||||||
return (AE_BAD_PARAMETER);
|
return (AE_BAD_PARAMETER);
|
||||||
@@ -264,7 +263,6 @@ AcpiOsTableOverride (
|
|||||||
ACPI_TABLE_HEADER *ExistingTable,
|
ACPI_TABLE_HEADER *ExistingTable,
|
||||||
ACPI_TABLE_HEADER **NewTable)
|
ACPI_TABLE_HEADER **NewTable)
|
||||||
{
|
{
|
||||||
|
|
||||||
if (!ExistingTable || !NewTable)
|
if (!ExistingTable || !NewTable)
|
||||||
{
|
{
|
||||||
return (AE_BAD_PARAMETER);
|
return (AE_BAD_PARAMETER);
|
||||||
@@ -307,8 +305,7 @@ AcpiOsReadable (
|
|||||||
void *Pointer,
|
void *Pointer,
|
||||||
ACPI_SIZE Length)
|
ACPI_SIZE Length)
|
||||||
{
|
{
|
||||||
|
return TRUE;
|
||||||
return (TRUE);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -330,8 +327,7 @@ AcpiOsWritable (
|
|||||||
void *Pointer,
|
void *Pointer,
|
||||||
ACPI_SIZE Length)
|
ACPI_SIZE Length)
|
||||||
{
|
{
|
||||||
|
return TRUE;
|
||||||
return (TRUE);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -351,7 +347,6 @@ void
|
|||||||
AcpiOsRedirectOutput (
|
AcpiOsRedirectOutput (
|
||||||
void *Destination)
|
void *Destination)
|
||||||
{
|
{
|
||||||
|
|
||||||
AcpiGbl_OutputFile = Destination;
|
AcpiGbl_OutputFile = Destination;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -373,14 +368,11 @@ AcpiOsPrintf (
|
|||||||
const char *Fmt,
|
const char *Fmt,
|
||||||
...)
|
...)
|
||||||
{
|
{
|
||||||
va_list Args;
|
va_list Args;
|
||||||
|
|
||||||
|
va_start(Args, Fmt);
|
||||||
va_start (Args, Fmt);
|
AcpiOsVprintf(Fmt, Args);
|
||||||
|
va_end(Args);
|
||||||
AcpiOsVprintf (Fmt, Args);
|
|
||||||
|
|
||||||
va_end (Args);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -432,7 +424,9 @@ AcpiOsVprintf (
|
|||||||
}
|
}
|
||||||
|
|
||||||
#else
|
#else
|
||||||
dprintf(Fmt, Args);
|
static char outputBuffer[1024];
|
||||||
|
vsnprintf(outputBuffer, 1024, Fmt, Args);
|
||||||
|
dprintf("%s", outputBuffer);
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -501,7 +495,6 @@ AcpiOsMapMemory (
|
|||||||
ACPI_PHYSICAL_ADDRESS where,
|
ACPI_PHYSICAL_ADDRESS where,
|
||||||
ACPI_SIZE length)
|
ACPI_SIZE length)
|
||||||
{
|
{
|
||||||
|
|
||||||
#ifdef _KERNEL_MODE
|
#ifdef _KERNEL_MODE
|
||||||
uint32 page_offset = ACPI_TO_INTEGER(where) % B_PAGE_SIZE;
|
uint32 page_offset = ACPI_TO_INTEGER(where) % B_PAGE_SIZE;
|
||||||
void *map_base = ACPI_ADD_PTR(void,where,0L - page_offset);
|
void *map_base = ACPI_ADD_PTR(void,where,0L - page_offset);
|
||||||
@@ -509,13 +502,14 @@ AcpiOsMapMemory (
|
|||||||
void *there;
|
void *there;
|
||||||
|
|
||||||
area = map_physical_memory("acpi_physical_mem_area", map_base,
|
area = map_physical_memory("acpi_physical_mem_area", map_base,
|
||||||
ROUNDUP(length + page_offset,B_PAGE_SIZE),B_ANY_KERNEL_ADDRESS,0,&there);
|
ROUNDUP(length + page_offset,B_PAGE_SIZE),B_ANY_KERNEL_ADDRESS, 0,
|
||||||
|
&there);
|
||||||
if (area < 0) {
|
if (area < 0) {
|
||||||
dprintf("ACPI: cannot map memory at %p, length %ld\n", map_base, length);
|
dprintf("ACPI: cannot map memory at %p, length %d\n", map_base, length);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
there += page_offset;
|
|
||||||
|
|
||||||
|
there += page_offset;
|
||||||
return there;
|
return there;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@@ -542,7 +536,6 @@ AcpiOsUnmapMemory (
|
|||||||
void *where,
|
void *where,
|
||||||
ACPI_SIZE length)
|
ACPI_SIZE length)
|
||||||
{
|
{
|
||||||
|
|
||||||
delete_area(area_for(where));
|
delete_area(area_for(where));
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -564,12 +557,7 @@ void *
|
|||||||
AcpiOsAllocate (
|
AcpiOsAllocate (
|
||||||
ACPI_SIZE size)
|
ACPI_SIZE size)
|
||||||
{
|
{
|
||||||
void *Mem;
|
return (void *)malloc((size_t)size);
|
||||||
|
|
||||||
|
|
||||||
Mem = (void *) malloc ((size_t) size);
|
|
||||||
|
|
||||||
return Mem;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -589,9 +577,7 @@ void
|
|||||||
AcpiOsFree (
|
AcpiOsFree (
|
||||||
void *mem)
|
void *mem)
|
||||||
{
|
{
|
||||||
|
free(mem);
|
||||||
|
|
||||||
free (mem);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -614,7 +600,7 @@ AcpiOsCreateSemaphore (
|
|||||||
UINT32 InitialUnits,
|
UINT32 InitialUnits,
|
||||||
ACPI_HANDLE *OutHandle)
|
ACPI_HANDLE *OutHandle)
|
||||||
{
|
{
|
||||||
*OutHandle = (ACPI_HANDLE)(create_sem(InitialUnits,"acpi_sem"));
|
*OutHandle = (ACPI_HANDLE)create_sem(InitialUnits, "acpi_sem");
|
||||||
return AE_OK;
|
return AE_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -634,14 +620,7 @@ ACPI_STATUS
|
|||||||
AcpiOsDeleteSemaphore (
|
AcpiOsDeleteSemaphore (
|
||||||
ACPI_HANDLE Handle)
|
ACPI_HANDLE Handle)
|
||||||
{
|
{
|
||||||
|
delete_sem((sem_id)Handle);
|
||||||
if (!Handle)
|
|
||||||
{
|
|
||||||
return AE_BAD_PARAMETER;
|
|
||||||
}
|
|
||||||
|
|
||||||
delete_sem((sem_id)(Handle));
|
|
||||||
|
|
||||||
return AE_OK;
|
return AE_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -666,8 +645,22 @@ AcpiOsWaitSemaphore (
|
|||||||
UINT32 Units,
|
UINT32 Units,
|
||||||
UINT16 Timeout)
|
UINT16 Timeout)
|
||||||
{
|
{
|
||||||
|
if (Timeout != ACPI_WAIT_FOREVER) {
|
||||||
|
switch (acquire_sem_etc((sem_id)Handle, Units, B_RELATIVE_TIMEOUT,
|
||||||
|
(bigtime_t)Timeout * 1000)) {
|
||||||
|
case B_TIMED_OUT:
|
||||||
|
return AE_TIME;
|
||||||
|
case B_BAD_VALUE:
|
||||||
|
return AE_BAD_PARAMETER;
|
||||||
|
case B_OK:
|
||||||
|
return AE_OK;
|
||||||
|
default:
|
||||||
|
return AE_ERROR;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
return (acquire_sem_etc((sem_id)(Handle),Units,0,Timeout) == B_OK ? AE_OK : AE_BAD_PARAMETER);
|
return acquire_sem_etc((sem_id)Handle, Units, 0, 0)
|
||||||
|
== B_OK ? AE_OK : AE_BAD_PARAMETER;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -689,30 +682,20 @@ AcpiOsSignalSemaphore (
|
|||||||
ACPI_HANDLE Handle,
|
ACPI_HANDLE Handle,
|
||||||
UINT32 Units)
|
UINT32 Units)
|
||||||
{
|
{
|
||||||
release_sem_etc((sem_id)(Handle),Units,0);
|
release_sem_etc((sem_id)Handle, Units, 0);
|
||||||
|
|
||||||
return AE_OK;
|
return AE_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* For R5 compatibility */
|
|
||||||
|
|
||||||
inline int32
|
|
||||||
_atomic_test_and_set(volatile int32 *value, int32 newValue, int32 testAgainst)
|
|
||||||
{
|
|
||||||
int32 oldValue;
|
|
||||||
asm volatile("lock; cmpxchg %%ecx, (%%edx)"
|
|
||||||
: "=a" (oldValue) : "a" (testAgainst), "c" (newValue), "d" (value));
|
|
||||||
return oldValue;
|
|
||||||
}
|
|
||||||
|
|
||||||
ACPI_STATUS
|
ACPI_STATUS
|
||||||
AcpiOsCreateLock (
|
AcpiOsCreateLock (
|
||||||
ACPI_HANDLE *OutHandle)
|
ACPI_HANDLE *OutHandle)
|
||||||
{
|
{
|
||||||
|
|
||||||
*OutHandle = (ACPI_HANDLE)malloc(sizeof(spinlock));
|
*OutHandle = (ACPI_HANDLE)malloc(sizeof(spinlock));
|
||||||
*((spinlock *)(*OutHandle)) = 1;
|
if (OutHandle == NULL)
|
||||||
|
return AE_NO_MEMORY;
|
||||||
|
|
||||||
|
*((spinlock *)(*OutHandle)) = 0;
|
||||||
return AE_OK;
|
return AE_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -728,25 +711,9 @@ ACPI_CPU_FLAGS
|
|||||||
AcpiOsAcquireLock (
|
AcpiOsAcquireLock (
|
||||||
ACPI_HANDLE Handle)
|
ACPI_HANDLE Handle)
|
||||||
{
|
{
|
||||||
/*cpu_status cpu;
|
cpu_status cpu = disable_interrupts();
|
||||||
|
acquire_spinlock((spinlock *)Handle);
|
||||||
if (Flags == ACPI_NOT_ISR)
|
return cpu;
|
||||||
cpu = disable_interrupts();
|
|
||||||
|
|
||||||
acquire_spinlock ((spinlock *)(Handle));
|
|
||||||
|
|
||||||
if (Flags == ACPI_NOT_ISR)
|
|
||||||
restore_interrupts(cpu);*/
|
|
||||||
|
|
||||||
/* Why aren't we using real spinlocks? Well, they seem to cause
|
|
||||||
kernel hangs at boot, at least on Dano. I don't really know
|
|
||||||
why, as they should be equivalent to this. Maybe in sysinit2
|
|
||||||
interrupts are already off, and the double disable interrupts
|
|
||||||
call is hanging the system? I'm not sure how to detect that
|
|
||||||
though. Anyway, this works, even if it's stupid. */
|
|
||||||
|
|
||||||
while (_atomic_test_and_set(((spinlock *)(Handle)),0,1) <= 0);
|
|
||||||
return (0);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -755,17 +722,8 @@ AcpiOsReleaseLock (
|
|||||||
ACPI_HANDLE Handle,
|
ACPI_HANDLE Handle,
|
||||||
ACPI_CPU_FLAGS Flags)
|
ACPI_CPU_FLAGS Flags)
|
||||||
{
|
{
|
||||||
/*cpu_status cpu;
|
release_spinlock((spinlock *)Handle);
|
||||||
|
restore_interrupts((cpu_status)Flags);
|
||||||
if (Flags == ACPI_NOT_ISR)
|
|
||||||
cpu = disable_interrupts();
|
|
||||||
|
|
||||||
release_spinlock ((spinlock *)(Handle));
|
|
||||||
|
|
||||||
if (Flags == ACPI_NOT_ISR)
|
|
||||||
restore_interrupts(cpu);*/
|
|
||||||
|
|
||||||
atomic_add(((spinlock *)(Handle)),1);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -790,10 +748,9 @@ AcpiOsInstallInterruptHandler (
|
|||||||
ACPI_OSD_HANDLER ServiceRoutine,
|
ACPI_OSD_HANDLER ServiceRoutine,
|
||||||
void *Context)
|
void *Context)
|
||||||
{
|
{
|
||||||
|
|
||||||
#ifdef _KERNEL_MODE
|
#ifdef _KERNEL_MODE
|
||||||
|
install_io_interrupt_handler(InterruptNumber,
|
||||||
install_io_interrupt_handler(InterruptNumber,(interrupt_handler)ServiceRoutine,Context,0);
|
(interrupt_handler)ServiceRoutine, Context, 0);
|
||||||
/* It so happens that the Haiku and ACPI-CA interrupt handler routines
|
/* It so happens that the Haiku and ACPI-CA interrupt handler routines
|
||||||
return the same values with the same meanings */
|
return the same values with the same meanings */
|
||||||
#endif
|
#endif
|
||||||
@@ -819,16 +776,16 @@ AcpiOsRemoveInterruptHandler (
|
|||||||
UINT32 InterruptNumber,
|
UINT32 InterruptNumber,
|
||||||
ACPI_OSD_HANDLER ServiceRoutine)
|
ACPI_OSD_HANDLER ServiceRoutine)
|
||||||
{
|
{
|
||||||
|
|
||||||
#ifdef _KERNEL_MODE
|
#ifdef _KERNEL_MODE
|
||||||
dprintf("AcpiOsRemoveInterruptHandler()\n");
|
panic("AcpiOsRemoveInterruptHandler()\n");
|
||||||
remove_io_interrupt_handler(InterruptNumber,(interrupt_handler)ServiceRoutine,NULL);
|
/*remove_io_interrupt_handler(InterruptNumber,
|
||||||
|
(interrupt_handler)ServiceRoutine, NULL);*/
|
||||||
/* Crap. We don't get the Context argument back. */
|
/* Crap. We don't get the Context argument back. */
|
||||||
#warning Sketchy code!
|
#warning Sketchy code!
|
||||||
|
return AE_OK;
|
||||||
|
#else
|
||||||
|
return AE_ERROR;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
return AE_OK;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -852,8 +809,6 @@ AcpiOsExecute (
|
|||||||
ACPI_OSD_EXEC_CALLBACK Function,
|
ACPI_OSD_EXEC_CALLBACK Function,
|
||||||
void *Context)
|
void *Context)
|
||||||
{
|
{
|
||||||
status_t err;
|
|
||||||
|
|
||||||
switch (Type) {
|
switch (Type) {
|
||||||
case OSL_GLOBAL_LOCK_HANDLER:
|
case OSL_GLOBAL_LOCK_HANDLER:
|
||||||
case OSL_NOTIFY_HANDLER:
|
case OSL_NOTIFY_HANDLER:
|
||||||
@@ -864,10 +819,9 @@ AcpiOsExecute (
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
err = gDPC->queue_dpc(gDPCHandle, Function, Context);
|
if (gDPC->queue_dpc(gDPCHandle, Function, Context) != B_OK)
|
||||||
|
|
||||||
if (err != B_OK)
|
|
||||||
return AE_ERROR;
|
return AE_ERROR;
|
||||||
|
|
||||||
return AE_OK;
|
return AE_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -922,12 +876,7 @@ void
|
|||||||
AcpiOsStall (
|
AcpiOsStall (
|
||||||
UINT32 microseconds)
|
UINT32 microseconds)
|
||||||
{
|
{
|
||||||
|
spin(microseconds);
|
||||||
if (microseconds)
|
|
||||||
{
|
|
||||||
spin (microseconds);
|
|
||||||
}
|
|
||||||
return;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -947,10 +896,7 @@ void
|
|||||||
AcpiOsSleep (
|
AcpiOsSleep (
|
||||||
ACPI_INTEGER milliseconds)
|
ACPI_INTEGER milliseconds)
|
||||||
{
|
{
|
||||||
|
snooze(milliseconds * 1000); /* Sleep for micro seconds */
|
||||||
snooze (milliseconds * 1000); /* Sleep for micro seconds */
|
|
||||||
|
|
||||||
return;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/******************************************************************************
|
/******************************************************************************
|
||||||
@@ -968,13 +914,7 @@ AcpiOsSleep (
|
|||||||
UINT64
|
UINT64
|
||||||
AcpiOsGetTimer (void)
|
AcpiOsGetTimer (void)
|
||||||
{
|
{
|
||||||
struct timeval time;
|
return system_time() * 10;
|
||||||
|
|
||||||
gettimeofday(&time, NULL);
|
|
||||||
|
|
||||||
/* Seconds * 10^7 = 100ns(10^-7), Microseconds(10^-6) * 10^1 = 100ns */
|
|
||||||
|
|
||||||
return (((UINT64) time.tv_sec * 10000000) + ((UINT64) time.tv_usec * 10));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -995,8 +935,7 @@ ACPI_STATUS
|
|||||||
AcpiOsValidateInterface (
|
AcpiOsValidateInterface (
|
||||||
char *Interface)
|
char *Interface)
|
||||||
{
|
{
|
||||||
|
return AE_SUPPORT;
|
||||||
return (AE_SUPPORT);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -1022,8 +961,7 @@ AcpiOsValidateAddress (
|
|||||||
ACPI_PHYSICAL_ADDRESS Address,
|
ACPI_PHYSICAL_ADDRESS Address,
|
||||||
ACPI_SIZE Length)
|
ACPI_SIZE Length)
|
||||||
{
|
{
|
||||||
|
return AE_OK;
|
||||||
return (AE_OK);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -1049,18 +987,23 @@ AcpiOsReadPciConfiguration (
|
|||||||
void *Value,
|
void *Value,
|
||||||
UINT32 Width)
|
UINT32 Width)
|
||||||
{
|
{
|
||||||
|
|
||||||
#ifdef _KERNEL_MODE
|
#ifdef _KERNEL_MODE
|
||||||
UINT32 val = gPCIManager->read_pci_config(
|
UINT32 val = gPCIManager->read_pci_config(
|
||||||
PciId->Bus, PciId->Device, PciId->Function, Register, Width/8);
|
PciId->Bus, PciId->Device, PciId->Function, Register, Width / 8);
|
||||||
switch (Width) {
|
switch (Width) {
|
||||||
case 1: *(UINT8*)Value = val;
|
case 8: *(UINT8 *)Value = val;
|
||||||
case 2: *(UINT16*)Value = val;
|
case 16: *(UINT16 *)Value = val;
|
||||||
case 4: *(UINT32*)Value = val;
|
case 32: *(UINT32 *)Value = val;
|
||||||
|
default:
|
||||||
|
dprintf("AcpiOsReadPciConfiguration unhandled value width: %u\n",
|
||||||
|
Width);
|
||||||
|
return AE_ERROR;
|
||||||
}
|
}
|
||||||
#endif
|
|
||||||
|
|
||||||
return (AE_OK);
|
return AE_OK;
|
||||||
|
#else
|
||||||
|
return AE_ERROR;
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -1086,13 +1029,13 @@ AcpiOsWritePciConfiguration (
|
|||||||
ACPI_INTEGER Value,
|
ACPI_INTEGER Value,
|
||||||
UINT32 Width)
|
UINT32 Width)
|
||||||
{
|
{
|
||||||
|
|
||||||
#ifdef _KERNEL_MODE
|
#ifdef _KERNEL_MODE
|
||||||
gPCIManager->write_pci_config(
|
gPCIManager->write_pci_config(
|
||||||
PciId->Bus, PciId->Device, PciId->Function, Register, Width/8, Value);
|
PciId->Bus, PciId->Device, PciId->Function, Register, Width / 8, Value);
|
||||||
|
return AE_OK;
|
||||||
|
#else
|
||||||
|
return AE_ERROR;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
return (AE_OK);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* TEMPORARY STUB FUNCTION */
|
/* TEMPORARY STUB FUNCTION */
|
||||||
@@ -1102,7 +1045,6 @@ AcpiOsDerivePciId(
|
|||||||
ACPI_HANDLE chandle,
|
ACPI_HANDLE chandle,
|
||||||
ACPI_PCI_ID **PciId)
|
ACPI_PCI_ID **PciId)
|
||||||
{
|
{
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -1126,27 +1068,29 @@ AcpiOsReadPort (
|
|||||||
UINT32 *Value,
|
UINT32 *Value,
|
||||||
UINT32 Width)
|
UINT32 Width)
|
||||||
{
|
{
|
||||||
|
|
||||||
#ifdef _KERNEL_MODE
|
#ifdef _KERNEL_MODE
|
||||||
|
switch (Width) {
|
||||||
|
case 8:
|
||||||
|
*Value = gPCIManager->read_io_8(Address);
|
||||||
|
break;
|
||||||
|
|
||||||
switch (Width)
|
case 16:
|
||||||
{
|
*Value = gPCIManager->read_io_16(Address);
|
||||||
case 8:
|
break;
|
||||||
*Value = gPCIManager->read_io_8(Address);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case 16:
|
case 32:
|
||||||
*Value = gPCIManager->read_io_16(Address);
|
*Value = gPCIManager->read_io_32(Address);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 32:
|
default:
|
||||||
*Value = gPCIManager->read_io_32(Address);
|
dprintf("AcpiOsReadPort: unhandeld width: %u\n", Width);
|
||||||
break;
|
return AE_ERROR;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return AE_OK;
|
||||||
|
#else
|
||||||
|
return AE_ERROR;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
return (AE_OK);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -1170,26 +1114,29 @@ AcpiOsWritePort (
|
|||||||
UINT32 Value,
|
UINT32 Value,
|
||||||
UINT32 Width)
|
UINT32 Width)
|
||||||
{
|
{
|
||||||
|
|
||||||
#ifdef _KERNEL_MODE
|
#ifdef _KERNEL_MODE
|
||||||
|
|
||||||
switch (Width) {
|
switch (Width) {
|
||||||
case 8:
|
case 8:
|
||||||
gPCIManager->write_io_8(Address,Value);
|
gPCIManager->write_io_8(Address, Value);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 16:
|
case 16:
|
||||||
gPCIManager->write_io_16(Address,Value);
|
gPCIManager->write_io_16(Address,Value);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 32:
|
case 32:
|
||||||
gPCIManager->write_io_32(Address,Value);
|
gPCIManager->write_io_32(Address,Value);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
dprintf("AcpiOsWritePort: unhandeld width: %u\n", Width);
|
||||||
|
return AE_ERROR;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return AE_OK;
|
||||||
|
#else
|
||||||
|
return AE_ERROR;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
return (AE_OK);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -1213,14 +1160,20 @@ AcpiOsReadMemory (
|
|||||||
UINT32 *Value,
|
UINT32 *Value,
|
||||||
UINT32 Width)
|
UINT32 Width)
|
||||||
{
|
{
|
||||||
|
|
||||||
#ifdef _KERNEL_MODE
|
#ifdef _KERNEL_MODE
|
||||||
|
addr_t pageOffset = Address % B_PAGE_SIZE;
|
||||||
|
addr_t virtualAddress;
|
||||||
|
status_t error = vm_get_physical_page(Address - pageOffset,
|
||||||
|
&virtualAddress, 0);
|
||||||
|
if (error != B_OK)
|
||||||
|
return AE_ERROR;
|
||||||
|
|
||||||
memcpy(Value, gPCIManager->ram_address(ACPI_TO_POINTER(Address)), Width/8);
|
memcpy(Value, (void*)(virtualAddress + pageOffset), Width / 8);
|
||||||
|
vm_put_physical_page(virtualAddress);
|
||||||
|
return AE_OK;
|
||||||
|
#else
|
||||||
|
return AE_ERROR;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
return (AE_OK);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -1244,14 +1197,20 @@ AcpiOsWriteMemory (
|
|||||||
UINT32 Value,
|
UINT32 Value,
|
||||||
UINT32 Width)
|
UINT32 Width)
|
||||||
{
|
{
|
||||||
|
|
||||||
#ifdef _KERNEL_MODE
|
#ifdef _KERNEL_MODE
|
||||||
|
addr_t pageOffset = Address % B_PAGE_SIZE;
|
||||||
|
addr_t virtualAddress;
|
||||||
|
status_t error = vm_get_physical_page(Address - pageOffset,
|
||||||
|
&virtualAddress, 0);
|
||||||
|
if (error != B_OK)
|
||||||
|
return AE_ERROR;
|
||||||
|
|
||||||
memcpy(gPCIManager->ram_address(ACPI_TO_POINTER(Address)), &Value, Width/8);
|
memcpy((void*)(virtualAddress + pageOffset), &Value, Width / 8);
|
||||||
|
vm_put_physical_page(virtualAddress);
|
||||||
|
return AE_OK;
|
||||||
|
#else
|
||||||
|
return AE_ERROR;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
return (AE_OK);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -1280,27 +1239,21 @@ AcpiOsSignal (
|
|||||||
UINT32 Function,
|
UINT32 Function,
|
||||||
void *Info)
|
void *Info)
|
||||||
{
|
{
|
||||||
|
switch (Function) {
|
||||||
|
case ACPI_SIGNAL_FATAL:
|
||||||
|
if (Info != NULL)
|
||||||
|
panic(Info);
|
||||||
|
else
|
||||||
|
panic("AcpiOsSignal: fatal");
|
||||||
|
break;
|
||||||
|
|
||||||
switch (Function)
|
case ACPI_SIGNAL_BREAKPOINT:
|
||||||
{
|
if (Info != NULL)
|
||||||
case ACPI_SIGNAL_FATAL:
|
AcpiOsPrintf ("AcpiOsBreakpoint: %s ****\n", Info);
|
||||||
break;
|
else
|
||||||
|
AcpiOsPrintf ("At AcpiOsBreakpoint ****\n");
|
||||||
case ACPI_SIGNAL_BREAKPOINT:
|
break;
|
||||||
|
|
||||||
if (Info)
|
|
||||||
{
|
|
||||||
AcpiOsPrintf ("AcpiOsBreakpoint: %s ****\n", Info);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
AcpiOsPrintf ("At AcpiOsBreakpoint ****\n");
|
|
||||||
}
|
|
||||||
|
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return AE_OK;
|
||||||
return (AE_OK);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user