mirror of
git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2026-03-22 07:27:12 +08:00
drm/amdgpu: add UMA allocation setting helpers
On some platforms, UMA allocation size can be set using the ATCS methods. Add helper functions to interact with this functionality. Co-developed-by: Mario Limonciello (AMD) <superm1@kernel.org> Signed-off-by: Mario Limonciello (AMD) <superm1@kernel.org> Reviewed-by: Alex Deucher <alexander.deucher@amd.com> Signed-off-by: Yo-Jung Leo Lin (AMD) <Leo.Lin@amd.com> Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
This commit is contained in:
committed by
Alex Deucher
parent
685b7113e0
commit
379a316063
@@ -1603,12 +1603,14 @@ 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);
|
||||
@@ -1637,6 +1639,7 @@ static inline bool amdgpu_acpi_should_gpu_reset(struct amdgpu_device *adev) { re
|
||||
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,
|
||||
@@ -1644,6 +1647,10 @@ static inline int amdgpu_acpi_smart_shift_update(struct amdgpu_device *adev,
|
||||
{
|
||||
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
|
||||
|
||||
|
||||
@@ -672,6 +672,11 @@ bool amdgpu_acpi_is_power_shift_control_supported(void)
|
||||
return amdgpu_acpi_priv.atcs.functions.power_shift_control;
|
||||
}
|
||||
|
||||
bool amdgpu_acpi_is_set_uma_allocation_size_supported(void)
|
||||
{
|
||||
return amdgpu_acpi_priv.atcs.functions.set_uma_allocation_size;
|
||||
}
|
||||
|
||||
/**
|
||||
* amdgpu_acpi_pcie_notify_device_ready
|
||||
*
|
||||
@@ -913,6 +918,44 @@ static struct amdgpu_numa_info *amdgpu_acpi_get_numa_info(uint32_t pxm)
|
||||
}
|
||||
#endif
|
||||
|
||||
/**
|
||||
* amdgpu_acpi_set_uma_allocation_size - Set Unified Memory Architecture allocation size via ACPI
|
||||
* @adev: Pointer to the amdgpu_device structure
|
||||
* @index: Index specifying the UMA allocation
|
||||
* @type: Type of UMA allocation
|
||||
*
|
||||
* This function configures the UMA allocation size for the specified device
|
||||
* using ACPI methods. The allocation is determined by the provided index and type.
|
||||
* Returns 0 on success or a negative error code on failure.
|
||||
*/
|
||||
int amdgpu_acpi_set_uma_allocation_size(struct amdgpu_device *adev, u8 index, u8 type)
|
||||
{
|
||||
struct atcs_set_uma_allocation_size_input atcs_input;
|
||||
struct amdgpu_atcs *atcs = &amdgpu_acpi_priv.atcs;
|
||||
struct acpi_buffer params;
|
||||
union acpi_object *info;
|
||||
|
||||
if (!amdgpu_acpi_is_set_uma_allocation_size_supported())
|
||||
return -EINVAL;
|
||||
|
||||
atcs_input.size = sizeof(struct atcs_set_uma_allocation_size_input);
|
||||
atcs_input.uma_size_index = index;
|
||||
atcs_input.uma_size_type = type;
|
||||
|
||||
params.length = sizeof(struct atcs_set_uma_allocation_size_input);
|
||||
params.pointer = &atcs_input;
|
||||
|
||||
info = amdgpu_atcs_call(atcs, ATCS_FUNCTION_SET_UMA_ALLOCATION_SIZE, ¶ms);
|
||||
if (!info) {
|
||||
drm_err(adev_to_drm(adev), "ATCS UMA allocation size update failed\n");
|
||||
return -EIO;
|
||||
}
|
||||
|
||||
kfree(info);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* amdgpu_acpi_get_node_id - obtain the NUMA node id for corresponding amdgpu
|
||||
* acpi device handle
|
||||
|
||||
@@ -24,6 +24,8 @@
|
||||
#ifndef AMD_ACPI_H
|
||||
#define AMD_ACPI_H
|
||||
|
||||
#include <linux/types.h>
|
||||
|
||||
#define ACPI_AC_CLASS "ac_adapter"
|
||||
|
||||
struct atif_verify_interface {
|
||||
@@ -112,6 +114,17 @@ struct atcs_pwr_shift_input {
|
||||
u8 drv_state; /* 0 = operational, 1 = not operational */
|
||||
} __packed;
|
||||
|
||||
struct atcs_get_uma_size_output {
|
||||
u16 size; /* structure size in bytes (includes size field) */
|
||||
u32 uma_size_mb; /* allocated UMA size in MB */
|
||||
} __packed;
|
||||
|
||||
struct atcs_set_uma_allocation_size_input {
|
||||
u16 size; /* structure size in bytes (includes size field) */
|
||||
u8 uma_size_index; /* UMA size index */
|
||||
u8 uma_size_type; /* UMA size type */
|
||||
} __packed;
|
||||
|
||||
/* AMD hw uses four ACPI control methods:
|
||||
* 1. ATIF
|
||||
* ARG0: (ACPI_INTEGER) function code
|
||||
@@ -494,4 +507,21 @@ struct atcs_pwr_shift_input {
|
||||
* OUTPUT: none
|
||||
*/
|
||||
|
||||
#define ATCS_FUNCTION_GET_UMA_SIZE 0x6
|
||||
/* ARG0: ATCS_FUNCTION_GET_UMA_SIZE
|
||||
* ARG1: none
|
||||
* OUTPUT:
|
||||
* WORD - structure size in bytes (includes size field)
|
||||
* DWORD - allocated UMA size in MB
|
||||
*/
|
||||
|
||||
#define ATCS_FUNCTION_SET_UMA_ALLOCATION_SIZE 0xA
|
||||
/* ARG0: ATCS_FUNCTION_SET_UMA_ALLOCATION_SIZE
|
||||
* ARG1:
|
||||
* WORD - structure size in bytes (includes size field)
|
||||
* BYTE - UMA size index
|
||||
* BYTE - UMA size type
|
||||
* OUTPUT: none
|
||||
*/
|
||||
|
||||
#endif
|
||||
|
||||
Reference in New Issue
Block a user