Quellcodebibliothek Statistik Leitseite products/Sources/formale Sprachen/C/Linux/drivers/platform/x86/amd/pmc/   (Open Source Betriebssystem Version 6.17.9©)  Datei vom 24.10.2025 mit Größe 4 kB image not shown  

Quelle  pmc.h   Sprache: 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 */

Messung V0.5
C=97 H=98 G=97

¤ Dauer der Verarbeitung: 0.2 Sekunden  ¤

*© Formatika GbR, Deutschland






Wurzel

Suchen

Beweissystem der NASA

Beweissystem Isabelle

NIST Cobol Testsuite

Cephes Mathematical Library

Wiener Entwicklungsmethode

Haftungshinweis

Die Informationen auf dieser Webseite wurden nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit, noch Qualität der bereit gestellten Informationen zugesichert.

Bemerkung:

Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.