/* 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 0 x980
#define AMD_PMC_REGISTER_ARGUMENT 0 x9BC
/* PMC Scratch Registers */
#define AMD_PMC_SCRATCH_REG_CZN 0 x94
#define AMD_PMC_SCRATCH_REG_YC 0 xD14
#define AMD_PMC_SCRATCH_REG_1AH 0 xF14
/* STB Registers */
#define AMD_PMC_STB_S2IDLE_PREPARE 0 xC6000001
#define AMD_PMC_STB_S2IDLE_RESTORE 0 xC6000002
#define AMD_PMC_STB_S2IDLE_CHECK 0 xC6000003
/* Base address of SMU for mapping physical address to virtual address */
#define AMD_PMC_MAPPING_SIZE 0 x01000
#define AMD_PMC_BASE_ADDR_OFFSET 0 x10000
#define AMD_PMC_BASE_ADDR_LO 0 x13B102E8
#define AMD_PMC_BASE_ADDR_HI 0 x13B102EC
#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 0 x01
#define AMD_PMC_RESULT_CMD_REJECT_BUSY 0 xFC
#define AMD_PMC_RESULT_CMD_REJECT_PREREQ 0 xFD
#define AMD_PMC_RESULT_CMD_UNKNOWN 0 xFE
#define AMD_PMC_RESULT_FAILED 0 xFF
/* FCH SSC Registers */
#define FCH_S0I3_ENTRY_TIME_L_OFFSET 0 x30
#define FCH_S0I3_ENTRY_TIME_H_OFFSET 0 x34
#define FCH_S0I3_EXIT_TIME_L_OFFSET 0 x38
#define FCH_S0I3_EXIT_TIME_H_OFFSET 0 x3C
#define FCH_SSC_MAPPING_SIZE 0 x800
#define FCH_BASE_PHY_ADDR_LOW 0 xFED81100
#define FCH_BASE_PHY_ADDR_HIGH 0 x00000000
/* SMU Message Definations */
#define SMU_MSG_GETSMUVERSION 0 x02
#define SMU_MSG_LOG_GETDRAM_ADDR_HI 0 x04
#define SMU_MSG_LOG_GETDRAM_ADDR_LO 0 x05
#define SMU_MSG_LOG_START 0 x06
#define SMU_MSG_LOG_RESET 0 x07
#define SMU_MSG_LOG_DUMP_DATA 0 x08
#define SMU_MSG_GET_SUP_CONSTRAINTS 0 x09
#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 = 0 x01,
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 0 x15D0
#define AMD_CPU_ID_RN 0 x1630
#define AMD_CPU_ID_PCO AMD_CPU_ID_RV
#define AMD_CPU_ID_CZN AMD_CPU_ID_RN
#define AMD_CPU_ID_YC 0 x14B5
#define AMD_CPU_ID_CB 0 x14D8
#define AMD_CPU_ID_PS 0 x14E8
#define AMD_CPU_ID_SP 0 x14A4
#define AMD_CPU_ID_SHP 0 x153A
#define PCI_DEVICE_ID_AMD_1AH_M20H_ROOT 0 x1507
#define PCI_DEVICE_ID_AMD_1AH_M60H_ROOT 0 x1122
#define PCI_DEVICE_ID_AMD_MP2_STB 0 x172c
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 */
Messung V0.5 in Prozent C=94 H=93 G=93
¤ Dauer der Verarbeitung: 0.11 Sekunden
(vorverarbeitet am 2026-06-05)
¤
*© Formatika GbR, Deutschland