/** * radeon_atpx_verify_interface - verify ATPX * * @atpx: radeon atpx struct * * Execute the ATPX_FUNCTION_VERIFY_INTERFACE ATPX function * to initialize ATPX and determine what features are supported * (all asics). * returns 0 on success, error on failure. */ static int radeon_atpx_verify_interface(struct radeon_atpx *atpx) { union acpi_object *info; struct atpx_verify_interface output; size_t size; int err = 0; info = radeon_atpx_call(atpx->handle, ATPX_FUNCTION_VERIFY_INTERFACE, NULL); if (!info) return -EIO; memset(&output, 0, sizeof(output)); size = *(u16 *) info->buffer.pointer; if (size < 8) { printk("ATPX buffer is too small: %zu\n", size); err = -EINVAL; goto out; } size = min(sizeof(output), size); memcpy(&output, info->buffer.pointer, size); /* TODO: check version? */ printk("ATPX version %u, functions 0x%08x\n", output.version, output.function_bits); radeon_atpx_parse_functions(&atpx->functions, output.function_bits); out: kfree(info); return err; }
/** * radeon_atpx_verify_interface - verify ATPX * * @handle: acpi handle * @atpx: radeon atpx struct * * Execute the ATPX_FUNCTION_VERIFY_INTERFACE ATPX function * to initialize ATPX and determine what features are supported * (all asics). * returns 0 on success, error on failure. */ static int radeon_atpx_verify_interface(struct radeon_atpx *atpx) { ACPI_OBJECT *info; struct atpx_verify_interface output; size_t size; int err = 0; info = radeon_atpx_call(atpx->handle, ATPX_FUNCTION_VERIFY_INTERFACE, NULL); if (!info) return -EIO; memset(&output, 0, sizeof(output)); size = *(u16 *) info->Buffer.Pointer; if (size < 8) { DRM_ERROR("ATPX buffer is too small: %zu\n", size); err = -EINVAL; goto out; } size = min(sizeof(output), size); memcpy(&output, info->Buffer.Pointer, size); /* TODO: check version? */ DRM_INFO("ATPX version %u\n", output.version); radeon_atpx_parse_functions(&atpx->functions, output.function_bits); out: AcpiOsFree(info); return err; }