Files
my-kern/kernel/acpi/glue.c

343 lines
7.6 KiB
C

//
// Created by rick on 01-03-21.
//
#include <stdio.h>
#include <stdarg.h>
#include <stdlib.h>
#include <acpi.h>
#include <myke/acpi.h>
#include <myke/tasks/task.h>
#include <myke/tasks/locking.h>
#include <myke/libk/libk.h>
ACPI_STATUS AcpiOsInitialize() {
return AE_OK;
}
ACPI_STATUS AcpiOsTerminate() {
return AE_OK;
}
ACPI_PHYSICAL_ADDRESS AcpiOsGetRootPointer() {
ACPI_PHYSICAL_ADDRESS addr = 0;
AcpiFindRootPointer(&addr);
return addr;
}
ACPI_STATUS AcpiOsPredefinedOverride(const struct acpi_predefined_names *names, ACPI_STRING *newval) {
*newval = NULL;
return AE_OK;
}
ACPI_STATUS AcpiOsTableOverride(struct acpi_table_header *existingTable, struct acpi_table_header **newTable) {
*newTable = NULL;
return AE_OK;
}
void *AcpiOsMapMemory(ACPI_PHYSICAL_ADDRESS physicalAddress, ACPI_SIZE length) {
return ACPI_TO_POINTER(physicalAddress);
}
void AcpiOsUnmapMemory(void *logicalAddress, ACPI_SIZE size) {
}
void *AcpiOsAllocate(ACPI_SIZE size) {
return malloc(size);
}
void AcpiOsFree(void *mem) {
free(mem);
}
uint8_t AcpiOsReadable(void *mem, ACPI_SIZE len) {
return 1;
}
uint8_t AcpiOsWritable(void *mem, ACPI_SIZE len) {
return 1;
}
ACPI_THREAD_ID AcpiOsGetThreadId() {
return task_get_current_tid();
}
ACPI_STATUS AcpiOsExecute(ACPI_EXECUTE_TYPE type, ACPI_OSD_EXEC_CALLBACK func, void *context) {
task_spawn(func, context);
return AE_OK;
}
void AcpiOsSleep(uint64_t milliseconds) {
k_panics("not supported sleep");
// todo
}
void AcpiOsStall(uint32_t microseconds) {
k_panics("not supported stall");
// todo
}
ACPI_STATUS AcpiOsCreateMutex(ACPI_MUTEX*handle) {
*handle = mutex_create();
return AE_OK;
}
void AcpiOsDeleteMutex(ACPI_MUTEX handle) {
mutex_free(handle);
}
ACPI_STATUS AcpiOsAcquireMutex(ACPI_MUTEX mutex, uint16_t timeout) {
if (timeout != ACPI_WAIT_FOREVER) {
k_panics("sem timeout not supported");
}
mutex_acquire(mutex);
return AE_OK;
}
void AcpiOsReleaseMutex(ACPI_MUTEX mutex) {
mutex_release(mutex);
}
ACPI_STATUS AcpiOsCreateSemaphore(uint32_t maxUnits, uint32_t initialUnits, ACPI_SEMAPHORE*semaphore) {
*semaphore = semaphore_create(initialUnits);
// k_panics("semaphores don't work");
return AE_OK;
}
ACPI_STATUS AcpiOsDeleteSemaphore(ACPI_SEMAPHORE semaphore) {
semaphore_free(semaphore);
return AE_OK;
}
ACPI_STATUS AcpiOsWaitSemaphore(ACPI_SEMAPHORE semaphore, uint32_t units, uint16_t timeout) {
if (timeout != ACPI_WAIT_FOREVER) {
k_panics("sem timeout not supported");
}
for (int i = 0; i < units; ++i) {
semaphore_wait(semaphore);
}
return AE_OK;
}
ACPI_STATUS AcpiOsSignalSemaphore(ACPI_SEMAPHORE semaphore, uint32_t units) {
for (int i = 0; i < units; ++i) {
semaphore_signal(semaphore);
}
return AE_OK;
}
ACPI_STATUS AcpiOsCreateLock(ACPI_SPINLOCK*spinlock) {
*spinlock = spinlock_create();
return AE_OK;
}
void AcpiOsDeleteLock(ACPI_SPINLOCK spinlock) {
spinlock_free(spinlock);
}
ACPI_CPU_FLAGS AcpiOsAcquireLock(ACPI_SPINLOCK lock) {
spinlock_acquire(lock);
return 0;
}
void AcpiOsReleaseLock(ACPI_SPINLOCK lock, ACPI_CPU_FLAGS flags) {
spinlock_release(lock);
}
ACPI_STATUS AcpiOsInstallInterruptHandler(uint32_t interruptLevel, ACPI_OSD_HANDLER handler, void *context) {
k_panics("Interrupt not supported yet");
return AE_ERROR;
}
ACPI_STATUS AcpiOsRemoveInterruptHandler(uint32_t interruptNumber, ACPI_OSD_HANDLER handler) {
k_panics("Interrupt not supported yet (r)");
return AE_ERROR;
}
void AcpiOsPrintf(const char *format, ...) {
va_list args;
va_start(args, format);
printf(format, args);
va_end(args);
}
void AcpiOsVprintf(const char *format, va_list args) {
vprintf(format, args);
}
uint64_t AcpiOsGetTimer() {
k_panics("get timer not supported");
return 0;
}
ACPI_STATUS AcpiOsSignal(UINT32 Function, void *Info) {
return AE_OK;
}
void AcpiOsWaitEventsComplete(void) {}
ACPI_STATUS AcpiOsPhysicalTableOverride(ACPI_TABLE_HEADER *ExistingTable, ACPI_PHYSICAL_ADDRESS *NewAddress,
UINT32 *NewTableLength) {
*NewAddress = NULL;
*NewTableLength = 0;
return (AE_SUPPORT);
}
ACPI_STATUS AcpiOsReadPciConfiguration(
ACPI_PCI_ID *PciId,
UINT32 Register,
UINT64 *Value,
UINT32 Width) {
k_panics("pci read not supported");
*Value = 0;
return (AE_OK);
}
ACPI_STATUS AcpiOsWritePciConfiguration(
ACPI_PCI_ID *PciId,
UINT32 Register,
UINT64 Value,
UINT32 Width) {
k_panics("pci write not supported");
return (AE_OK);
}
ACPI_STATUS AcpiOsEnterSleep(
UINT8 SleepState,
UINT32 RegaValue,
UINT32 RegbValue) {
return (AE_OK);
}
ACPI_STATUS AcpiOsReadMemory(
ACPI_PHYSICAL_ADDRESS Address,
UINT64 *Value,
UINT32 Width) {
switch (Width) {
case 8:
*Value = ((uint8_t *) Address)[0];
break;
case 16:
*Value = ((uint16_t *) Address)[0];
break;
case 32:
*Value = ((uint32_t *) Address)[0];
break;
case 64:
*Value = ((uint64_t *) Address)[0];
break;
default:
return (AE_BAD_PARAMETER);
break;
}
return (AE_OK);
}
ACPI_STATUS AcpiOsWriteMemory(
ACPI_PHYSICAL_ADDRESS Address,
UINT64 Value,
UINT32 Width) {
switch (Width) {
case 8:
*((uint8_t *) Address) = Value;
break;
case 16:
*((uint16_t *) Address) = Value;
break;
case 32:
*((uint32_t *) Address) = Value;
break;
case 64:
*((uint64_t *) Address) = Value;
break;
default:
return (AE_BAD_PARAMETER);
break;
}
return (AE_OK);
}
ACPI_STATUS AcpiOsReadPort(
ACPI_IO_ADDRESS Address,
UINT32 *Value,
UINT32 Width) {
k_panics("unsupported read");
return AE_ERROR;
}
ACPI_STATUS AcpiOsWritePort(
ACPI_IO_ADDRESS Address,
UINT32 Value,
UINT32 Width) {
k_panics("unsupported write");
return AE_ERROR;
}
void att_noreturn acpi_init(void *data) {
ACPI_STATUS status;
status = AcpiInitializeSubsystem();
if (ACPI_FAILURE(status)) {
k_panics("Failed to init acpi");
}
status = AcpiInitializeTables(NULL, 16, true);
if (ACPI_FAILURE(status)) {
k_panics("Failed to init tables");
}
status = AcpiLoadTables();
if (ACPI_FAILURE(status)) {
k_panics("Failed to load tables");
}
status = AcpiEnableSubsystem(ACPI_FULL_INITIALIZATION);
if (ACPI_FAILURE(status)) {
k_panics("Failed to enable acpi");
}
printf("ACPI Initialized");
while (true) {
task_suspend();
}
}
void acpi_init_task() {
task_spawn(acpi_init, NULL);
}
void att_noreturn acpi_shutdown() {
ACPI_STATUS status;
status = AcpiEnterSleepStatePrep(5);
if (ACPI_FAILURE(status)) {
k_panics("failed to prep shutdown");
}
status = AcpiEnterSleepState(5);
if (ACPI_FAILURE(status)) {
k_panics("failed to shutdown");
}
k_panics("Failed");
}
void att_noreturn acpi_restart() {
ACPI_STATUS status;
if (!(AcpiGbl_FADT.Flags & ACPI_FADT_RESET_REGISTER)) {
k_panics("Could not restart, not available");
}
status = AcpiWrite(AcpiGbl_FADT.ResetValue, &AcpiGbl_FADT.ResetRegister);
if (ACPI_FAILURE(status)) {
k_panics("Failed with status");
}
k_panics("Failed");
}