struct nhlt_acpi_table *skl_nhlt_init(struct device *dev) { acpi_handle handle; union acpi_object *obj; struct nhlt_resource_desc *nhlt_ptr = NULL; struct nhlt_acpi_table *nhlt_table = NULL; handle = ACPI_HANDLE(dev); if (!handle) { dev_err(dev, "Didn't find ACPI_HANDLE\n"); return NULL; } obj = acpi_evaluate_dsm(handle, &osc_guid, 1, 1, NULL); if (obj && obj->type == ACPI_TYPE_BUFFER) { nhlt_ptr = (struct nhlt_resource_desc *)obj->buffer.pointer; nhlt_table = (struct nhlt_acpi_table *) memremap(nhlt_ptr->min_addr, nhlt_ptr->length, MEMREMAP_WB); ACPI_FREE(obj); if (nhlt_table && (strncmp(nhlt_table->header.signature, NHLT_ACPI_HEADER_SIG, strlen(NHLT_ACPI_HEADER_SIG)) != 0)) { memunmap(nhlt_table); dev_err(dev, "NHLT ACPI header signature incorrect\n"); return NULL; } return nhlt_table; } dev_err(dev, "device specific method to extract NHLT blob failed\n"); return NULL; }
struct nhlt_acpi_table *skl_nhlt_init(struct device *dev) { acpi_handle handle; union acpi_object *obj; struct nhlt_resource_desc *nhlt_ptr = NULL; struct nhlt_acpi_table *nhlt_table = NULL; if (ACPI_FAILURE(acpi_get_handle(NULL, DSDT_NHLT_PATH, &handle))) { dev_err(dev, "Requested NHLT device not found\n"); return NULL; } obj = acpi_evaluate_dsm(handle, OSC_UUID, 1, 1, NULL); if (obj && obj->type == ACPI_TYPE_BUFFER) { nhlt_ptr = (struct nhlt_resource_desc *)obj->buffer.pointer; nhlt_table = (struct nhlt_acpi_table *) memremap(nhlt_ptr->min_addr, nhlt_ptr->length, MEMREMAP_WB); ACPI_FREE(obj); return nhlt_table; } dev_err(dev, "device specific method to extract NHLT blob failed\n"); return NULL; }
static void xhci_pme_acpi_rtd3_enable(struct pci_dev *dev) { static const u8 intel_dsm_uuid[] = { 0xb7, 0x0c, 0x34, 0xac, 0x01, 0xe9, 0xbf, 0x45, 0xb7, 0xe6, 0x2b, 0x34, 0xec, 0x93, 0x1e, 0x23, }; acpi_evaluate_dsm(ACPI_HANDLE(&dev->dev), intel_dsm_uuid, 3, 1, NULL); }
static void xhci_pme_acpi_rtd3_enable(struct pci_dev *dev) { static const guid_t intel_dsm_guid = GUID_INIT(0xac340cb7, 0xe901, 0x45bf, 0xb7, 0xe6, 0x2b, 0x34, 0xec, 0x93, 0x1e, 0x23); union acpi_object *obj; obj = acpi_evaluate_dsm(ACPI_HANDLE(&dev->dev), &intel_dsm_guid, 3, 1, NULL); ACPI_FREE(obj); }
static int crb_do_acpi_start(struct tpm_chip *chip) { union acpi_object *obj; int rc; obj = acpi_evaluate_dsm(chip->acpi_dev_handle, CRB_ACPI_START_UUID, CRB_ACPI_START_REVISION_ID, CRB_ACPI_START_INDEX, NULL); if (!obj) return -ENXIO; rc = obj->integer.value == 0 ? 0 : -ENXIO; ACPI_FREE(obj); return rc; }
static int ucsi_acpi_cmd(struct ucsi *ucsi, struct ucsi_control *ctrl) { uuid_le uuid = UUID_LE(0x6f8398c2, 0x7ca4, 0x11e4, 0xad, 0x36, 0x63, 0x10, 0x42, 0xb5, 0x00, 0x8f); union acpi_object *obj; ucsi->data->ctrl.raw_cmd = ctrl->raw_cmd; obj = acpi_evaluate_dsm(ACPI_HANDLE(ucsi->dev), uuid.b, 1, 1, NULL); if (!obj) { dev_err(ucsi->dev, "%s: failed to evaluate _DSM\n", __func__); return -EIO; } ACPI_FREE(obj); return 0; }
static int dsm_get_label(struct device *dev, char *buf, enum acpi_attr_enum attr) { acpi_handle handle; union acpi_object *obj, *tmp; int len = -1; handle = ACPI_HANDLE(dev); if (!handle) return -1; obj = acpi_evaluate_dsm(handle, device_label_dsm_uuid, 0x2, DEVICE_LABEL_DSM, NULL); if (!obj) return -1; tmp = obj->package.elements; if (obj->type == ACPI_TYPE_PACKAGE && obj->package.count == 2 && tmp[0].type == ACPI_TYPE_INTEGER && (tmp[1].type == ACPI_TYPE_STRING || tmp[1].type == ACPI_TYPE_BUFFER)) { /* * The second string element is optional even when * this _DSM is implemented; when not implemented, * this entry must return a null string. */ if (attr == ACPI_ATTR_INDEX_SHOW) { scnprintf(buf, PAGE_SIZE, "%llu\n", tmp->integer.value); } else if (attr == ACPI_ATTR_LABEL_SHOW) { if (tmp[1].type == ACPI_TYPE_STRING) scnprintf(buf, PAGE_SIZE, "%s\n", tmp[1].string.pointer); else if (tmp[1].type == ACPI_TYPE_BUFFER) dsm_label_utf16s_to_utf8s(tmp + 1, buf); } len = strlen(buf) > 0 ? strlen(buf) : -1; } ACPI_FREE(obj); return len; }
static bool intel_hid_execute_method(acpi_handle handle, enum intel_hid_dsm_fn_codes fn_index, unsigned long long arg) { union acpi_object *obj, argv4, req; acpi_status status; char *method_name; if (fn_index <= INTEL_HID_DSM_FN_INVALID || fn_index >= INTEL_HID_DSM_FN_MAX) return false; method_name = (char *)intel_hid_dsm_fn_to_method[fn_index]; if (!(intel_hid_dsm_fn_mask & fn_index)) goto skip_dsm_exec; /* All methods expects a package with one integer element */ req.type = ACPI_TYPE_INTEGER; req.integer.value = arg; argv4.type = ACPI_TYPE_PACKAGE; argv4.package.count = 1; argv4.package.elements = &req; obj = acpi_evaluate_dsm(handle, &intel_dsm_guid, 1, fn_index, &argv4); if (obj) { acpi_handle_debug(handle, "Exec DSM Fn code: %d[%s] success\n", fn_index, method_name); ACPI_FREE(obj); return true; } skip_dsm_exec: status = acpi_execute_simple_method(handle, method_name, arg); if (ACPI_SUCCESS(status)) return true; return false; }
static int dwc3_pci_dsm(struct dwc3_pci *dwc, int param) { union acpi_object *obj; union acpi_object tmp; union acpi_object argv4 = ACPI_INIT_DSM_ARGV4(1, &tmp); if (!dwc->has_dsm_for_pm) return 0; tmp.type = ACPI_TYPE_INTEGER; tmp.integer.value = param; obj = acpi_evaluate_dsm(ACPI_HANDLE(&dwc->pci->dev), &dwc->guid, 1, PCI_INTEL_BXT_FUNC_PMU_PWR, &argv4); if (!obj) { dev_err(&dwc->pci->dev, "failed to evaluate _DSM\n"); return -EIO; } ACPI_FREE(obj); return 0; }