File Index
Files and directories
Sign in
FILE

pmc.h

File preview with syntax highlighting.

linux-6.19.14/drivers/platform/x86/amd/pmc/pmc.h C
  1/* SPDX-License-Identifier: GPL-2.0-or-later */
  2/*
  3 * AMD SoC Power Management Controller Driver
  4 *
  5 * Copyright (c) 2023, Advanced Micro Devices, Inc.
  6 * All Rights Reserved.
  7 *
  8 * Author: Mario Limonciello <mario.limonciello@amd.com>
  9 */
 10
 11#ifndef PMC_H
 12#define PMC_H
 13
 14#include <linux/types.h>
 15#include <linux/mutex.h>
 16
 17/* SMU communication registers */
 18#define AMD_PMC_REGISTER_RESPONSE	0x980
 19#define AMD_PMC_REGISTER_ARGUMENT	0x9BC
 20
 21/* PMC Scratch Registers */
 22#define AMD_PMC_SCRATCH_REG_CZN		0x94
 23#define AMD_PMC_SCRATCH_REG_YC		0xD14
 24#define AMD_PMC_SCRATCH_REG_1AH		0xF14
 25
 26/* STB Registers */
 27#define AMD_PMC_STB_S2IDLE_PREPARE	0xC6000001
 28#define AMD_PMC_STB_S2IDLE_RESTORE	0xC6000002
 29#define AMD_PMC_STB_S2IDLE_CHECK	0xC6000003
 30
 31/* Base address of SMU for mapping physical address to virtual address */
 32#define AMD_PMC_MAPPING_SIZE		0x01000
 33#define AMD_PMC_BASE_ADDR_OFFSET	0x10000
 34#define AMD_PMC_BASE_ADDR_LO		0x13B102E8
 35#define AMD_PMC_BASE_ADDR_HI		0x13B102EC
 36#define AMD_PMC_BASE_ADDR_LO_MASK	GENMASK(15, 0)
 37#define AMD_PMC_BASE_ADDR_HI_MASK	GENMASK(31, 20)
 38
 39/* SMU Response Codes */
 40#define AMD_PMC_RESULT_OK                    0x01
 41#define AMD_PMC_RESULT_CMD_REJECT_BUSY       0xFC
 42#define AMD_PMC_RESULT_CMD_REJECT_PREREQ     0xFD
 43#define AMD_PMC_RESULT_CMD_UNKNOWN           0xFE
 44#define AMD_PMC_RESULT_FAILED                0xFF
 45
 46/* FCH SSC Registers */
 47#define FCH_S0I3_ENTRY_TIME_L_OFFSET	0x30
 48#define FCH_S0I3_ENTRY_TIME_H_OFFSET	0x34
 49#define FCH_S0I3_EXIT_TIME_L_OFFSET	0x38
 50#define FCH_S0I3_EXIT_TIME_H_OFFSET	0x3C
 51#define FCH_SSC_MAPPING_SIZE		0x800
 52#define FCH_BASE_PHY_ADDR_LOW		0xFED81100
 53#define FCH_BASE_PHY_ADDR_HIGH		0x00000000
 54
 55/* SMU Message Definations */
 56#define SMU_MSG_GETSMUVERSION		0x02
 57#define SMU_MSG_LOG_GETDRAM_ADDR_HI	0x04
 58#define SMU_MSG_LOG_GETDRAM_ADDR_LO	0x05
 59#define SMU_MSG_LOG_START		0x06
 60#define SMU_MSG_LOG_RESET		0x07
 61#define SMU_MSG_LOG_DUMP_DATA		0x08
 62#define SMU_MSG_GET_SUP_CONSTRAINTS	0x09
 63
 64#define PMC_MSG_DELAY_MIN_US		50
 65#define RESPONSE_REGISTER_LOOP_MAX	20000
 66
 67#define DELAY_MIN_US		2000
 68#define DELAY_MAX_US		3000
 69
 70enum s2d_msg_port {
 71	MSG_PORT_PMC,
 72	MSG_PORT_S2D,
 73};
 74
 75struct amd_mp2_dev {
 76	void __iomem *mmio;
 77	void __iomem *vslbase;
 78	void *stbdata;
 79	void *devres_gid;
 80	struct pci_dev *pdev;
 81	dma_addr_t dma_addr;
 82	int stb_len;
 83	bool is_stb_data;
 84};
 85
 86struct stb_arg {
 87	u32 s2d_msg_id;
 88	u32 msg;
 89	u32 arg;
 90	u32 resp;
 91};
 92
 93struct amd_pmc_dev {
 94	void __iomem *regbase;
 95	void __iomem *smu_virt_addr;
 96	void __iomem *stb_virt_addr;
 97	void __iomem *fch_virt_addr;
 98	u32 base_addr;
 99	u32 cpu_id;
100	u32 dram_size;
101	u32 active_ips;
102	const struct amd_pmc_bit_map *ips_ptr;
103	u32 num_ips;
104	u32 smu_msg;
105/* SMU version information */
106	u8 smu_program;
107	u8 major;
108	u8 minor;
109	u8 rev;
110	u8 msg_port;
111	struct device *dev;
112	struct pci_dev *rdev;
113	struct mutex lock; /* generic mutex lock */
114	struct dentry *dbgfs_dir;
115	struct quirk_entry *quirks;
116	bool disable_8042_wakeup;
117	struct amd_mp2_dev *mp2;
118	struct stb_arg stb_arg;
119};
120
121struct amd_pmc_bit_map {
122	const char *name;
123	u32 bit_mask;
124};
125
126struct smu_metrics {
127	u32 table_version;
128	u32 hint_count;
129	u32 s0i3_last_entry_status;
130	u32 timein_s0i2;
131	u64 timeentering_s0i3_lastcapture;
132	u64 timeentering_s0i3_totaltime;
133	u64 timeto_resume_to_os_lastcapture;
134	u64 timeto_resume_to_os_totaltime;
135	u64 timein_s0i3_lastcapture;
136	u64 timein_s0i3_totaltime;
137	u64 timein_swdrips_lastcapture;
138	u64 timein_swdrips_totaltime;
139	u64 timecondition_notmet_lastcapture[32];
140	u64 timecondition_notmet_totaltime[32];
141} __packed;
142
143enum amd_pmc_def {
144	MSG_TEST = 0x01,
145	MSG_OS_HINT_PCO,
146	MSG_OS_HINT_RN,
147};
148
149void amd_pmc_process_restore_quirks(struct amd_pmc_dev *dev);
150void amd_pmc_quirks_init(struct amd_pmc_dev *dev);
151void amd_mp2_stb_init(struct amd_pmc_dev *dev);
152void amd_mp2_stb_deinit(struct amd_pmc_dev *dev);
153
154/* List of supported CPU ids */
155#define AMD_CPU_ID_RV			0x15D0
156#define AMD_CPU_ID_RN			0x1630
157#define AMD_CPU_ID_PCO			AMD_CPU_ID_RV
158#define AMD_CPU_ID_CZN			AMD_CPU_ID_RN
159#define AMD_CPU_ID_VG			0x1645
160#define AMD_CPU_ID_YC			0x14B5
161#define AMD_CPU_ID_CB			0x14D8
162#define AMD_CPU_ID_PS			0x14E8
163#define AMD_CPU_ID_SP			0x14A4
164#define AMD_CPU_ID_SHP			0x153A
165#define PCI_DEVICE_ID_AMD_1AH_M20H_ROOT 0x1507
166#define PCI_DEVICE_ID_AMD_1AH_M60H_ROOT 0x1122
167#define PCI_DEVICE_ID_AMD_MP2_STB	0x172c
168
169int amd_stb_s2d_init(struct amd_pmc_dev *dev);
170int amd_stb_read(struct amd_pmc_dev *dev, u32 *buf);
171int amd_stb_write(struct amd_pmc_dev *dev, u32 data);
172int amd_pmc_send_cmd(struct amd_pmc_dev *dev, u32 arg, u32 *data, u8 msg, bool ret);
173
174#endif /* PMC_H */
~/ Read-only file preview.