1 #include <linux/errno.h>
2 #include "linux/delay.h"
6 bool acpi_atcs_functions_supported(void *device
, uint32_t index
)
9 struct atcs_verify_interface output_buf
= {0};
11 int32_t temp_buffer
= 1;
13 result
= cgs_call_acpi_method(device
, CGS_ACPI_METHOD_ATCS
,
14 ATCS_FUNCTION_VERIFY_INTERFACE
,
21 return result
== 0 ? (output_buf
.function_bits
& (1 << (index
- 1))) != 0 : false;
24 int acpi_pcie_perf_request(void *device
, uint8_t perf_req
, bool advertise
)
26 struct atcs_pref_req_input atcs_input
;
27 struct atcs_pref_req_output atcs_output
;
30 struct cgs_system_info info
= {0};
32 if (!acpi_atcs_functions_supported(device
, ATCS_FUNCTION_PCIE_PERFORMANCE_REQUEST
))
35 info
.size
= sizeof(struct cgs_system_info
);
36 info
.info_id
= CGS_SYSTEM_INFO_ADAPTER_BDF_ID
;
37 result
= cgs_query_system_info(device
, &info
);
40 atcs_input
.client_id
= (uint16_t)info
.value
;
41 atcs_input
.size
= sizeof(struct atcs_pref_req_input
);
42 atcs_input
.valid_flags_mask
= ATCS_VALID_FLAGS_MASK
;
43 atcs_input
.flags
= ATCS_WAIT_FOR_COMPLETION
;
45 atcs_input
.flags
|= ATCS_ADVERTISE_CAPS
;
46 atcs_input
.req_type
= ATCS_PCIE_LINK_SPEED
;
47 atcs_input
.perf_req
= perf_req
;
49 atcs_output
.size
= sizeof(struct atcs_pref_req_input
);
52 result
= cgs_call_acpi_method(device
,
54 ATCS_FUNCTION_PCIE_PERFORMANCE_REQUEST
,
63 switch (atcs_output
.ret_val
) {
64 case ATCS_REQUEST_REFUSED
:
67 case ATCS_REQUEST_COMPLETE
:
69 case ATCS_REQUEST_IN_PROGRESS
: