Changeset View
Changeset View
Standalone View
Standalone View
sys/dev/acpica/acpi.c
Show First 20 Lines • Show All 138 Lines • ▼ Show 20 Lines | |||||
static int acpi_adjust_resource(device_t bus, device_t child, int type, | static int acpi_adjust_resource(device_t bus, device_t child, int type, | ||||
struct resource *r, rman_res_t start, rman_res_t end); | struct resource *r, rman_res_t start, rman_res_t end); | ||||
static int acpi_release_resource(device_t bus, device_t child, int type, | static int acpi_release_resource(device_t bus, device_t child, int type, | ||||
int rid, struct resource *r); | int rid, struct resource *r); | ||||
static void acpi_delete_resource(device_t bus, device_t child, int type, | static void acpi_delete_resource(device_t bus, device_t child, int type, | ||||
int rid); | int rid); | ||||
static uint32_t acpi_isa_get_logicalid(device_t dev); | static uint32_t acpi_isa_get_logicalid(device_t dev); | ||||
static int acpi_isa_get_compatid(device_t dev, uint32_t *cids, int count); | static int acpi_isa_get_compatid(device_t dev, uint32_t *cids, int count); | ||||
static ssize_t acpi_bus_get_prop(device_t bus, device_t child, const char *propname, | static bus_get_property_t acpi_bus_get_prop; | ||||
andrew: I would keep the signature as it was (with the new argument) for consistancy. | |||||
void *propvalue, size_t size); | |||||
static int acpi_device_id_probe(device_t bus, device_t dev, char **ids, char **match); | static int acpi_device_id_probe(device_t bus, device_t dev, char **ids, char **match); | ||||
static ACPI_STATUS acpi_device_eval_obj(device_t bus, device_t dev, | static ACPI_STATUS acpi_device_eval_obj(device_t bus, device_t dev, | ||||
ACPI_STRING pathname, ACPI_OBJECT_LIST *parameters, | ACPI_STRING pathname, ACPI_OBJECT_LIST *parameters, | ||||
ACPI_BUFFER *ret); | ACPI_BUFFER *ret); | ||||
static ACPI_STATUS acpi_device_get_prop(device_t bus, device_t dev, | static ACPI_STATUS acpi_device_get_prop(device_t bus, device_t dev, | ||||
ACPI_STRING propname, const ACPI_OBJECT **value); | ACPI_STRING propname, const ACPI_OBJECT **value); | ||||
static ACPI_STATUS acpi_device_scan_cb(ACPI_HANDLE h, UINT32 level, | static ACPI_STATUS acpi_device_scan_cb(ACPI_HANDLE h, UINT32 level, | ||||
void *context, void **retval); | void *context, void **retval); | ||||
▲ Show 20 Lines • Show All 1,660 Lines • ▼ Show 20 Lines | if (memcmp(guid->Buffer.Pointer, &acpi_dsd_uuid, | ||||
return (AE_OK); | return (AE_OK); | ||||
} | } | ||||
return (AE_NOT_FOUND); | return (AE_NOT_FOUND); | ||||
} | } | ||||
static ssize_t | static ssize_t | ||||
acpi_bus_get_prop(device_t bus, device_t child, const char *propname, | acpi_bus_get_prop(device_t bus, device_t child, const char *propname, | ||||
void *propvalue, size_t size) | void *propvalue, size_t size, device_property_type_t type) | ||||
{ | { | ||||
ACPI_STATUS status; | ACPI_STATUS status; | ||||
const ACPI_OBJECT *obj; | const ACPI_OBJECT *obj; | ||||
status = acpi_device_get_prop(bus, child, __DECONST(char *, propname), | status = acpi_device_get_prop(bus, child, __DECONST(char *, propname), | ||||
&obj); | &obj); | ||||
if (ACPI_FAILURE(status)) | if (ACPI_FAILURE(status)) | ||||
return (-1); | return (-1); | ||||
switch (type) { | |||||
case DEVICE_PROP_ANY: | |||||
case DEVICE_PROP_BUFFER: | |||||
case DEVICE_PROP_UINT32: | |||||
case DEVICE_PROP_UINT64: | |||||
break; | |||||
default: | |||||
return (-1); | |||||
} | |||||
switch (obj->Type) { | switch (obj->Type) { | ||||
case ACPI_TYPE_INTEGER: | case ACPI_TYPE_INTEGER: | ||||
if (type == DEVICE_PROP_UINT32) { | |||||
if (propvalue != NULL && size >= sizeof(uint32_t)) | |||||
*((uint32_t *)propvalue) = obj->Integer.Value; | |||||
return (sizeof(uint32_t)); | |||||
} | |||||
if (propvalue != NULL && size >= sizeof(uint64_t)) | if (propvalue != NULL && size >= sizeof(uint64_t)) | ||||
*((uint64_t *) propvalue) = obj->Integer.Value; | *((uint64_t *) propvalue) = obj->Integer.Value; | ||||
return (sizeof(uint64_t)); | return (sizeof(uint64_t)); | ||||
case ACPI_TYPE_STRING: | case ACPI_TYPE_STRING: | ||||
andrewUnsubmitted Not Done Inline ActionsWhat should happen if we ask for an integer type, but the data is a string or vice versa? andrew: What should happen if we ask for an integer type, but the data is a string or vice versa? | |||||
kdAuthorUnsubmitted Done Inline ActionsInitially I wanted to be as lax as possible with type checking in order no to break poorly written firmware. kd: Initially I wanted to be as lax as possible with type checking in order no to break poorly… | |||||
if (propvalue != NULL && size > 0) | if (propvalue != NULL && size > 0) | ||||
memcpy(propvalue, obj->String.Pointer, | memcpy(propvalue, obj->String.Pointer, | ||||
MIN(size, obj->String.Length)); | MIN(size, obj->String.Length)); | ||||
return (obj->String.Length); | return (obj->String.Length); | ||||
case ACPI_TYPE_BUFFER: | case ACPI_TYPE_BUFFER: | ||||
if (propvalue != NULL && size > 0) | if (propvalue != NULL && size > 0) | ||||
memcpy(propvalue, obj->Buffer.Pointer, | memcpy(propvalue, obj->Buffer.Pointer, | ||||
▲ Show 20 Lines • Show All 2,656 Lines • Show Last 20 Lines |
I would keep the signature as it was (with the new argument) for consistancy.