mirror of
git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2025-08-05 16:54:27 +00:00

To improve the code organization and readability, move the macros and structures from the AMD PMC driver to the PMC header file. Co-developed-by: Sanket Goswami <Sanket.Goswami@amd.com> Signed-off-by: Sanket Goswami <Sanket.Goswami@amd.com> Signed-off-by: Shyam Sundar S K <Shyam-sundar.S-k@amd.com> Link: https://lore.kernel.org/r/20250305142615.410178-2-Shyam-sundar.S-k@amd.com Reviewed-by: Ilpo Järvinen <ilpo.jarvinen@linux.intel.com> Signed-off-by: Ilpo Järvinen <ilpo.jarvinen@linux.intel.com>
173 lines
4.4 KiB
C
173 lines
4.4 KiB
C
/* SPDX-License-Identifier: GPL-2.0-or-later */
|
|
/*
|
|
* AMD SoC Power Management Controller Driver
|
|
*
|
|
* Copyright (c) 2023, Advanced Micro Devices, Inc.
|
|
* All Rights Reserved.
|
|
*
|
|
* Author: Mario Limonciello <mario.limonciello@amd.com>
|
|
*/
|
|
|
|
#ifndef PMC_H
|
|
#define PMC_H
|
|
|
|
#include <linux/types.h>
|
|
#include <linux/mutex.h>
|
|
|
|
/* SMU communication registers */
|
|
#define AMD_PMC_REGISTER_RESPONSE 0x980
|
|
#define AMD_PMC_REGISTER_ARGUMENT 0x9BC
|
|
|
|
/* PMC Scratch Registers */
|
|
#define AMD_PMC_SCRATCH_REG_CZN 0x94
|
|
#define AMD_PMC_SCRATCH_REG_YC 0xD14
|
|
#define AMD_PMC_SCRATCH_REG_1AH 0xF14
|
|
|
|
/* STB Registers */
|
|
#define AMD_PMC_STB_S2IDLE_PREPARE 0xC6000001
|
|
#define AMD_PMC_STB_S2IDLE_RESTORE 0xC6000002
|
|
#define AMD_PMC_STB_S2IDLE_CHECK 0xC6000003
|
|
|
|
/* Base address of SMU for mapping physical address to virtual address */
|
|
#define AMD_PMC_MAPPING_SIZE 0x01000
|
|
#define AMD_PMC_BASE_ADDR_OFFSET 0x10000
|
|
#define AMD_PMC_BASE_ADDR_LO 0x13B102E8
|
|
#define AMD_PMC_BASE_ADDR_HI 0x13B102EC
|
|
#define AMD_PMC_BASE_ADDR_LO_MASK GENMASK(15, 0)
|
|
#define AMD_PMC_BASE_ADDR_HI_MASK GENMASK(31, 20)
|
|
|
|
/* SMU Response Codes */
|
|
#define AMD_PMC_RESULT_OK 0x01
|
|
#define AMD_PMC_RESULT_CMD_REJECT_BUSY 0xFC
|
|
#define AMD_PMC_RESULT_CMD_REJECT_PREREQ 0xFD
|
|
#define AMD_PMC_RESULT_CMD_UNKNOWN 0xFE
|
|
#define AMD_PMC_RESULT_FAILED 0xFF
|
|
|
|
/* FCH SSC Registers */
|
|
#define FCH_S0I3_ENTRY_TIME_L_OFFSET 0x30
|
|
#define FCH_S0I3_ENTRY_TIME_H_OFFSET 0x34
|
|
#define FCH_S0I3_EXIT_TIME_L_OFFSET 0x38
|
|
#define FCH_S0I3_EXIT_TIME_H_OFFSET 0x3C
|
|
#define FCH_SSC_MAPPING_SIZE 0x800
|
|
#define FCH_BASE_PHY_ADDR_LOW 0xFED81100
|
|
#define FCH_BASE_PHY_ADDR_HIGH 0x00000000
|
|
|
|
/* SMU Message Definations */
|
|
#define SMU_MSG_GETSMUVERSION 0x02
|
|
#define SMU_MSG_LOG_GETDRAM_ADDR_HI 0x04
|
|
#define SMU_MSG_LOG_GETDRAM_ADDR_LO 0x05
|
|
#define SMU_MSG_LOG_START 0x06
|
|
#define SMU_MSG_LOG_RESET 0x07
|
|
#define SMU_MSG_LOG_DUMP_DATA 0x08
|
|
#define SMU_MSG_GET_SUP_CONSTRAINTS 0x09
|
|
|
|
#define PMC_MSG_DELAY_MIN_US 50
|
|
#define RESPONSE_REGISTER_LOOP_MAX 20000
|
|
|
|
#define DELAY_MIN_US 2000
|
|
#define DELAY_MAX_US 3000
|
|
|
|
enum s2d_msg_port {
|
|
MSG_PORT_PMC,
|
|
MSG_PORT_S2D,
|
|
};
|
|
|
|
struct amd_mp2_dev {
|
|
void __iomem *mmio;
|
|
void __iomem *vslbase;
|
|
void *stbdata;
|
|
void *devres_gid;
|
|
struct pci_dev *pdev;
|
|
dma_addr_t dma_addr;
|
|
int stb_len;
|
|
bool is_stb_data;
|
|
};
|
|
|
|
struct stb_arg {
|
|
u32 s2d_msg_id;
|
|
u32 msg;
|
|
u32 arg;
|
|
u32 resp;
|
|
};
|
|
|
|
struct amd_pmc_dev {
|
|
void __iomem *regbase;
|
|
void __iomem *smu_virt_addr;
|
|
void __iomem *stb_virt_addr;
|
|
void __iomem *fch_virt_addr;
|
|
u32 base_addr;
|
|
u32 cpu_id;
|
|
u32 dram_size;
|
|
u32 active_ips;
|
|
const struct amd_pmc_bit_map *ips_ptr;
|
|
u32 num_ips;
|
|
u32 smu_msg;
|
|
/* SMU version information */
|
|
u8 smu_program;
|
|
u8 major;
|
|
u8 minor;
|
|
u8 rev;
|
|
u8 msg_port;
|
|
struct device *dev;
|
|
struct pci_dev *rdev;
|
|
struct mutex lock; /* generic mutex lock */
|
|
struct dentry *dbgfs_dir;
|
|
struct quirk_entry *quirks;
|
|
bool disable_8042_wakeup;
|
|
struct amd_mp2_dev *mp2;
|
|
struct stb_arg stb_arg;
|
|
};
|
|
|
|
struct amd_pmc_bit_map {
|
|
const char *name;
|
|
u32 bit_mask;
|
|
};
|
|
|
|
struct smu_metrics {
|
|
u32 table_version;
|
|
u32 hint_count;
|
|
u32 s0i3_last_entry_status;
|
|
u32 timein_s0i2;
|
|
u64 timeentering_s0i3_lastcapture;
|
|
u64 timeentering_s0i3_totaltime;
|
|
u64 timeto_resume_to_os_lastcapture;
|
|
u64 timeto_resume_to_os_totaltime;
|
|
u64 timein_s0i3_lastcapture;
|
|
u64 timein_s0i3_totaltime;
|
|
u64 timein_swdrips_lastcapture;
|
|
u64 timein_swdrips_totaltime;
|
|
u64 timecondition_notmet_lastcapture[32];
|
|
u64 timecondition_notmet_totaltime[32];
|
|
} __packed;
|
|
|
|
enum amd_pmc_def {
|
|
MSG_TEST = 0x01,
|
|
MSG_OS_HINT_PCO,
|
|
MSG_OS_HINT_RN,
|
|
};
|
|
|
|
void amd_pmc_process_restore_quirks(struct amd_pmc_dev *dev);
|
|
void amd_pmc_quirks_init(struct amd_pmc_dev *dev);
|
|
void amd_mp2_stb_init(struct amd_pmc_dev *dev);
|
|
void amd_mp2_stb_deinit(struct amd_pmc_dev *dev);
|
|
|
|
/* List of supported CPU ids */
|
|
#define AMD_CPU_ID_RV 0x15D0
|
|
#define AMD_CPU_ID_RN 0x1630
|
|
#define AMD_CPU_ID_PCO AMD_CPU_ID_RV
|
|
#define AMD_CPU_ID_CZN AMD_CPU_ID_RN
|
|
#define AMD_CPU_ID_YC 0x14B5
|
|
#define AMD_CPU_ID_CB 0x14D8
|
|
#define AMD_CPU_ID_PS 0x14E8
|
|
#define AMD_CPU_ID_SP 0x14A4
|
|
#define AMD_CPU_ID_SHP 0x153A
|
|
#define PCI_DEVICE_ID_AMD_1AH_M20H_ROOT 0x1507
|
|
#define PCI_DEVICE_ID_AMD_1AH_M60H_ROOT 0x1122
|
|
#define PCI_DEVICE_ID_AMD_MP2_STB 0x172c
|
|
|
|
int amd_stb_s2d_init(struct amd_pmc_dev *dev);
|
|
int amd_stb_read(struct amd_pmc_dev *dev, u32 *buf);
|
|
int amd_stb_write(struct amd_pmc_dev *dev, u32 data);
|
|
int amd_pmc_send_cmd(struct amd_pmc_dev *dev, u32 arg, u32 *data, u8 msg, bool ret);
|
|
|
|
#endif /* PMC_H */
|