| /* SPDX-License-Identifier: GPL-2.0 OR MIT |
| * |
| * Copyright 2026 Advanced Micro Devices, Inc. |
| * |
| * Permission is hereby granted, free of charge, to any person obtaining a |
| * copy of this software and associated documentation files (the "Software"), |
| * to deal in the Software without restriction, including without limitation |
| * the rights to use, copy, modify, merge, publish, distribute, sublicense, |
| * and/or sell copies of the Software, and to permit persons to whom the |
| * Software is furnished to do so, subject to the following conditions: |
| * |
| * The above copyright notice and this permission notice shall be included in |
| * all copies or substantial portions of the Software. |
| * |
| * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR |
| * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, |
| * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL |
| * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR |
| * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, |
| * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR |
| * OTHER DEALINGS IN THE SOFTWARE. |
| */ |
| #ifndef __AMDGPU_ACPI_H__ |
| #define __AMDGPU_ACPI_H__ |
| |
| #include <linux/types.h> |
| #include <linux/mutex_types.h> |
| |
| struct amdgpu_device; |
| struct acpi_device; |
| struct amdgpu_dm_backlight_caps; |
| |
| #define MAX_UMA_OPTION_NAME 28 |
| #define MAX_UMA_OPTION_ENTRIES 19 |
| |
| #define AMDGPU_UMA_FLAG_AUTO BIT(1) |
| #define AMDGPU_UMA_FLAG_CUSTOM BIT(0) |
| |
| /* ATCS Device/Driver State */ |
| #define AMDGPU_ATCS_PSC_DEV_STATE_D0 0 |
| #define AMDGPU_ATCS_PSC_DEV_STATE_D3_HOT 3 |
| #define AMDGPU_ATCS_PSC_DRV_STATE_OPR 0 |
| #define AMDGPU_ATCS_PSC_DRV_STATE_NOT_OPR 1 |
| |
| enum amdgpu_ss { |
| AMDGPU_SS_DRV_LOAD, |
| AMDGPU_SS_DEV_D0, |
| AMDGPU_SS_DEV_D3, |
| AMDGPU_SS_DRV_UNLOAD |
| }; |
| |
| /** |
| * struct amdgpu_uma_carveout_option - single UMA carveout option |
| * @name: Name of the carveout option |
| * @memory_carved_mb: Amount of memory carved in MB |
| * @flags: ATCS flags supported by this option |
| */ |
| struct amdgpu_uma_carveout_option { |
| char name[MAX_UMA_OPTION_NAME]; |
| uint32_t memory_carved_mb; |
| uint8_t flags; |
| }; |
| |
| /** |
| * struct amdgpu_uma_carveout_info - table of available UMA carveout options |
| * @num_entries: Number of available options |
| * @uma_option_index: The index of the option currently applied |
| * @update_lock: Lock to serialize changes to the option |
| * @entries: The array of carveout options |
| */ |
| struct amdgpu_uma_carveout_info { |
| uint8_t num_entries; |
| uint8_t uma_option_index; |
| struct mutex update_lock; |
| struct amdgpu_uma_carveout_option entries[MAX_UMA_OPTION_ENTRIES]; |
| }; |
| |
| struct amdgpu_numa_info { |
| uint64_t size; |
| int pxm; |
| int nid; |
| }; |
| |
| #if defined(CONFIG_ACPI) |
| int amdgpu_acpi_init(struct amdgpu_device *adev); |
| void amdgpu_acpi_fini(struct amdgpu_device *adev); |
| bool amdgpu_acpi_is_pcie_performance_request_supported(struct amdgpu_device *adev); |
| bool amdgpu_acpi_is_power_shift_control_supported(void); |
| bool amdgpu_acpi_is_set_uma_allocation_size_supported(void); |
| int amdgpu_acpi_pcie_performance_request(struct amdgpu_device *adev, |
| u8 perf_req, bool advertise); |
| int amdgpu_acpi_power_shift_control(struct amdgpu_device *adev, |
| u8 dev_state, bool drv_state); |
| int amdgpu_acpi_smart_shift_update(struct amdgpu_device *adev, |
| enum amdgpu_ss ss_state); |
| int amdgpu_acpi_set_uma_allocation_size(struct amdgpu_device *adev, u8 index, u8 type); |
| int amdgpu_acpi_pcie_notify_device_ready(struct amdgpu_device *adev); |
| int amdgpu_acpi_get_tmr_info(struct amdgpu_device *adev, u64 *tmr_offset, |
| u64 *tmr_size); |
| int amdgpu_acpi_get_mem_info(struct amdgpu_device *adev, int xcc_id, |
| struct amdgpu_numa_info *numa_info); |
| |
| void amdgpu_acpi_get_backlight_caps(struct amdgpu_dm_backlight_caps *caps); |
| bool amdgpu_acpi_should_gpu_reset(struct amdgpu_device *adev); |
| void amdgpu_acpi_detect(void); |
| void amdgpu_acpi_release(void); |
| #else |
| static inline int amdgpu_acpi_init(struct amdgpu_device *adev) { return 0; } |
| static inline int amdgpu_acpi_get_tmr_info(struct amdgpu_device *adev, |
| u64 *tmr_offset, u64 *tmr_size) |
| { |
| return -EINVAL; |
| } |
| static inline int amdgpu_acpi_get_mem_info(struct amdgpu_device *adev, |
| int xcc_id, |
| struct amdgpu_numa_info *numa_info) |
| { |
| return -EINVAL; |
| } |
| static inline void amdgpu_acpi_fini(struct amdgpu_device *adev) { } |
| static inline bool amdgpu_acpi_should_gpu_reset(struct amdgpu_device *adev) { return false; } |
| static inline void amdgpu_acpi_detect(void) { } |
| static inline void amdgpu_acpi_release(void) { } |
| static inline bool amdgpu_acpi_is_power_shift_control_supported(void) { return false; } |
| static inline bool amdgpu_acpi_is_set_uma_allocation_size_supported(void) { return false; } |
| static inline int amdgpu_acpi_power_shift_control(struct amdgpu_device *adev, |
| u8 dev_state, bool drv_state) { return 0; } |
| static inline int amdgpu_acpi_smart_shift_update(struct amdgpu_device *adev, |
| enum amdgpu_ss ss_state) |
| { |
| return 0; |
| } |
| static inline int amdgpu_acpi_set_uma_allocation_size(struct amdgpu_device *adev, u8 index, u8 type) |
| { |
| return -EINVAL; |
| } |
| static inline void amdgpu_acpi_get_backlight_caps(struct amdgpu_dm_backlight_caps *caps) { } |
| #endif |
| |
| #if defined(CONFIG_ACPI) && defined(CONFIG_SUSPEND) |
| bool amdgpu_acpi_is_s3_active(struct amdgpu_device *adev); |
| bool amdgpu_acpi_is_s0ix_active(struct amdgpu_device *adev); |
| #else |
| static inline bool amdgpu_acpi_is_s0ix_active(struct amdgpu_device *adev) { return false; } |
| static inline bool amdgpu_acpi_is_s3_active(struct amdgpu_device *adev) { return false; } |
| #endif |
| |
| #if defined(CONFIG_DRM_AMD_ISP) |
| int amdgpu_acpi_get_isp4_dev(struct acpi_device **dev); |
| #endif |
| #endif /* __AMDGPU_ACPI_H__ */ |