Lines Matching refs:dev

151 static int amd_pmc_send_cmd(struct amd_pmc_dev *dev, u32 arg, u32 *data, u8 msg, bool ret);
152 static int amd_pmc_read_stb(struct amd_pmc_dev *dev, u32 *buf);
153 static int amd_pmc_write_stb(struct amd_pmc_dev *dev, u32 data);
155 static inline u32 amd_pmc_reg_read(struct amd_pmc_dev *dev, int reg_offset) in amd_pmc_reg_read() argument
157 return ioread32(dev->regbase + reg_offset); in amd_pmc_reg_read()
160 static inline void amd_pmc_reg_write(struct amd_pmc_dev *dev, int reg_offset, u32 val) in amd_pmc_reg_write() argument
162 iowrite32(val, dev->regbase + reg_offset); in amd_pmc_reg_write()
184 struct amd_pmc_dev *dev = filp->f_inode->i_private; in amd_pmc_stb_debugfs_open() local
193 rc = amd_pmc_read_stb(dev, buf); in amd_pmc_stb_debugfs_open()
228 struct amd_pmc_dev *dev = filp->f_inode->i_private; in amd_pmc_stb_debugfs_open_v2() local
233 ret = amd_pmc_write_stb(dev, AMD_PMC_STB_DUMMY_PC); in amd_pmc_stb_debugfs_open_v2()
235 dev_err(dev->dev, "error writing to STB: %d\n", ret); in amd_pmc_stb_debugfs_open_v2()
242 dev->msg_port = 1; in amd_pmc_stb_debugfs_open_v2()
245 ret = amd_pmc_send_cmd(dev, S2D_NUM_SAMPLES, &num_samples, dev->s2d_msg_id, true); in amd_pmc_stb_debugfs_open_v2()
247 dev->msg_port = 0; in amd_pmc_stb_debugfs_open_v2()
249 dev_err(dev->dev, "error: S2D_NUM_SAMPLES not supported : %d\n", ret); in amd_pmc_stb_debugfs_open_v2()
263 memcpy_fromio(buf, dev->stb_virt_addr + stb_rdptr_offset, fsize); in amd_pmc_stb_debugfs_open_v2()
292 static void amd_pmc_get_ip_info(struct amd_pmc_dev *dev) in amd_pmc_get_ip_info() argument
294 switch (dev->cpu_id) { in amd_pmc_get_ip_info()
299 dev->num_ips = 12; in amd_pmc_get_ip_info()
300 dev->s2d_msg_id = 0xBE; in amd_pmc_get_ip_info()
303 dev->num_ips = 21; in amd_pmc_get_ip_info()
304 dev->s2d_msg_id = 0x85; in amd_pmc_get_ip_info()
309 static int amd_pmc_setup_smu_logging(struct amd_pmc_dev *dev) in amd_pmc_setup_smu_logging() argument
311 if (dev->cpu_id == AMD_CPU_ID_PCO) { in amd_pmc_setup_smu_logging()
312 dev_warn_once(dev->dev, "SMU debugging info not supported on this platform\n"); in amd_pmc_setup_smu_logging()
317 if (!dev->active_ips) in amd_pmc_setup_smu_logging()
318 amd_pmc_send_cmd(dev, 0, &dev->active_ips, SMU_MSG_GET_SUP_CONSTRAINTS, true); in amd_pmc_setup_smu_logging()
321 if (!dev->smu_virt_addr) { in amd_pmc_setup_smu_logging()
325 amd_pmc_send_cmd(dev, 0, &phys_addr_low, SMU_MSG_LOG_GETDRAM_ADDR_LO, true); in amd_pmc_setup_smu_logging()
326 amd_pmc_send_cmd(dev, 0, &phys_addr_hi, SMU_MSG_LOG_GETDRAM_ADDR_HI, true); in amd_pmc_setup_smu_logging()
329 dev->smu_virt_addr = devm_ioremap(dev->dev, smu_phys_addr, in amd_pmc_setup_smu_logging()
331 if (!dev->smu_virt_addr) in amd_pmc_setup_smu_logging()
336 amd_pmc_send_cmd(dev, 0, NULL, SMU_MSG_LOG_RESET, false); in amd_pmc_setup_smu_logging()
337 amd_pmc_send_cmd(dev, 0, NULL, SMU_MSG_LOG_START, false); in amd_pmc_setup_smu_logging()
365 dev_warn(pdev->dev, "Last suspend didn't reach deepest state\n"); in amd_pmc_validate_deepest()
370 static int amd_pmc_get_smu_version(struct amd_pmc_dev *dev) in amd_pmc_get_smu_version() argument
375 if (dev->cpu_id == AMD_CPU_ID_PCO) in amd_pmc_get_smu_version()
378 rc = amd_pmc_send_cmd(dev, 0, &val, SMU_MSG_GETSMUVERSION, true); in amd_pmc_get_smu_version()
382 dev->smu_program = (val >> 24) & GENMASK(7, 0); in amd_pmc_get_smu_version()
383 dev->major = (val >> 16) & GENMASK(7, 0); in amd_pmc_get_smu_version()
384 dev->minor = (val >> 8) & GENMASK(7, 0); in amd_pmc_get_smu_version()
385 dev->rev = (val >> 0) & GENMASK(7, 0); in amd_pmc_get_smu_version()
387 dev_dbg(dev->dev, "SMU program %u version is %u.%u.%u\n", in amd_pmc_get_smu_version()
388 dev->smu_program, dev->major, dev->minor, dev->rev); in amd_pmc_get_smu_version()
396 struct amd_pmc_dev *dev = dev_get_drvdata(d); in smu_fw_version_show() local
398 if (!dev->major) { in smu_fw_version_show()
399 int rc = amd_pmc_get_smu_version(dev); in smu_fw_version_show()
404 return sysfs_emit(buf, "%u.%u.%u\n", dev->major, dev->minor, dev->rev); in smu_fw_version_show()
410 struct amd_pmc_dev *dev = dev_get_drvdata(d); in smu_program_show() local
412 if (!dev->major) { in smu_program_show()
413 int rc = amd_pmc_get_smu_version(dev); in smu_program_show()
418 return sysfs_emit(buf, "%u\n", dev->smu_program); in smu_program_show()
426 struct device *dev = kobj_to_dev(kobj); in pmc_attr_is_visible() local
427 struct amd_pmc_dev *pdev = dev_get_drvdata(dev); in pmc_attr_is_visible()
452 struct amd_pmc_dev *dev = s->private; in smu_fw_info_show() local
456 if (get_metrics_table(dev, &table)) in smu_fw_info_show()
470 for (idx = 0 ; idx < dev->num_ips ; idx++) { in smu_fw_info_show()
471 if (soc15_ip_blk[idx].bit_mask & dev->active_ips) in smu_fw_info_show()
482 struct amd_pmc_dev *dev = s->private; in s0ix_stats_show() local
486 if (!dev->fch_virt_addr) { in s0ix_stats_show()
491 dev->fch_virt_addr = devm_ioremap(dev->dev, fch_phys_addr, FCH_SSC_MAPPING_SIZE); in s0ix_stats_show()
492 if (!dev->fch_virt_addr) in s0ix_stats_show()
496 entry_time = ioread32(dev->fch_virt_addr + FCH_S0I3_ENTRY_TIME_H_OFFSET); in s0ix_stats_show()
497 entry_time = entry_time << 32 | ioread32(dev->fch_virt_addr + FCH_S0I3_ENTRY_TIME_L_OFFSET); in s0ix_stats_show()
499 exit_time = ioread32(dev->fch_virt_addr + FCH_S0I3_EXIT_TIME_H_OFFSET); in s0ix_stats_show()
500 exit_time = exit_time << 32 | ioread32(dev->fch_virt_addr + FCH_S0I3_EXIT_TIME_L_OFFSET); in s0ix_stats_show()
515 static int amd_pmc_idlemask_read(struct amd_pmc_dev *pdev, struct device *dev, in amd_pmc_idlemask_read() argument
543 if (dev) in amd_pmc_idlemask_read()
558 static void amd_pmc_dbgfs_unregister(struct amd_pmc_dev *dev) in amd_pmc_dbgfs_unregister() argument
560 debugfs_remove_recursive(dev->dbgfs_dir); in amd_pmc_dbgfs_unregister()
563 static bool amd_pmc_is_stb_supported(struct amd_pmc_dev *dev) in amd_pmc_is_stb_supported() argument
565 switch (dev->cpu_id) { in amd_pmc_is_stb_supported()
575 static void amd_pmc_dbgfs_register(struct amd_pmc_dev *dev) in amd_pmc_dbgfs_register() argument
577 dev->dbgfs_dir = debugfs_create_dir("amd_pmc", NULL); in amd_pmc_dbgfs_register()
578 debugfs_create_file("smu_fw_info", 0644, dev->dbgfs_dir, dev, in amd_pmc_dbgfs_register()
580 debugfs_create_file("s0ix_stats", 0644, dev->dbgfs_dir, dev, in amd_pmc_dbgfs_register()
582 debugfs_create_file("amd_pmc_idlemask", 0644, dev->dbgfs_dir, dev, in amd_pmc_dbgfs_register()
586 if (amd_pmc_is_stb_supported(dev)) in amd_pmc_dbgfs_register()
587 debugfs_create_file("stb_read", 0644, dev->dbgfs_dir, dev, in amd_pmc_dbgfs_register()
590 debugfs_create_file("stb_read", 0644, dev->dbgfs_dir, dev, in amd_pmc_dbgfs_register()
595 static void amd_pmc_dump_registers(struct amd_pmc_dev *dev) in amd_pmc_dump_registers() argument
599 if (dev->msg_port) { in amd_pmc_dump_registers()
609 value = amd_pmc_reg_read(dev, response); in amd_pmc_dump_registers()
610 dev_dbg(dev->dev, "AMD_%s_REGISTER_RESPONSE:%x\n", dev->msg_port ? "S2D" : "PMC", value); in amd_pmc_dump_registers()
612 value = amd_pmc_reg_read(dev, argument); in amd_pmc_dump_registers()
613 dev_dbg(dev->dev, "AMD_%s_REGISTER_ARGUMENT:%x\n", dev->msg_port ? "S2D" : "PMC", value); in amd_pmc_dump_registers()
615 value = amd_pmc_reg_read(dev, message); in amd_pmc_dump_registers()
616 dev_dbg(dev->dev, "AMD_%s_REGISTER_MESSAGE:%x\n", dev->msg_port ? "S2D" : "PMC", value); in amd_pmc_dump_registers()
619 static int amd_pmc_send_cmd(struct amd_pmc_dev *dev, u32 arg, u32 *data, u8 msg, bool ret) in amd_pmc_send_cmd() argument
624 mutex_lock(&dev->lock); in amd_pmc_send_cmd()
626 if (dev->msg_port) { in amd_pmc_send_cmd()
637 rc = readx_poll_timeout(ioread32, dev->regbase + response, in amd_pmc_send_cmd()
641 dev_err(dev->dev, "failed to talk to SMU\n"); in amd_pmc_send_cmd()
646 amd_pmc_reg_write(dev, response, 0); in amd_pmc_send_cmd()
649 amd_pmc_reg_write(dev, argument, arg); in amd_pmc_send_cmd()
652 amd_pmc_reg_write(dev, message, msg); in amd_pmc_send_cmd()
655 rc = readx_poll_timeout(ioread32, dev->regbase + response, in amd_pmc_send_cmd()
659 dev_err(dev->dev, "SMU response timed out\n"); in amd_pmc_send_cmd()
668 *data = amd_pmc_reg_read(dev, argument); in amd_pmc_send_cmd()
672 dev_err(dev->dev, "SMU not ready. err: 0x%x\n", val); in amd_pmc_send_cmd()
676 dev_err(dev->dev, "SMU cmd unknown. err: 0x%x\n", val); in amd_pmc_send_cmd()
682 dev_err(dev->dev, "SMU cmd failed. err: 0x%x\n", val); in amd_pmc_send_cmd()
688 mutex_unlock(&dev->lock); in amd_pmc_send_cmd()
689 amd_pmc_dump_registers(dev); in amd_pmc_send_cmd()
693 static int amd_pmc_get_os_hint(struct amd_pmc_dev *dev) in amd_pmc_get_os_hint() argument
695 switch (dev->cpu_id) { in amd_pmc_get_os_hint()
762 dev_dbg(pdev->dev, "alarm not enabled\n"); in amd_pmc_verify_czn_rtc()
803 dev_err(pdev->dev, "failed to set RTC: %d\n", rc); in amd_pmc_s2idle_prepare()
811 dev_err(pdev->dev, "suspend failed: %d\n", rc); in amd_pmc_s2idle_prepare()
817 dev_err(pdev->dev, "error writing to STB: %d\n", rc); in amd_pmc_s2idle_prepare()
832 amd_pmc_idlemask_read(pdev, pdev->dev, NULL); in amd_pmc_s2idle_check()
836 dev_err(pdev->dev, "error writing to STB: %d\n", rc); in amd_pmc_s2idle_check()
856 dev_err(pdev->dev, "resume failed: %d\n", rc); in amd_pmc_s2idle_restore()
863 dev_err(pdev->dev, "error writing to STB: %d\n", rc); in amd_pmc_s2idle_restore()
877 static int amd_pmc_suspend_handler(struct device *dev) in amd_pmc_suspend_handler() argument
879 struct amd_pmc_dev *pdev = dev_get_drvdata(dev); in amd_pmc_suspend_handler()
885 dev_err(pdev->dev, "failed to adjust keyboard wakeup: %d\n", rc); in amd_pmc_suspend_handler()
908 static int amd_pmc_s2d_init(struct amd_pmc_dev *dev) in amd_pmc_s2d_init() argument
916 dev->msg_port = 1; in amd_pmc_s2d_init()
919 amd_pmc_get_ip_info(dev); in amd_pmc_s2d_init()
921 amd_pmc_send_cmd(dev, S2D_TELEMETRY_SIZE, &size, dev->s2d_msg_id, true); in amd_pmc_s2d_init()
926 ret = amd_pmc_send_cmd(dev, S2D_DRAM_SIZE, &dev->dram_size, dev->s2d_msg_id, true); in amd_pmc_s2d_init()
927 if (ret || !dev->dram_size) in amd_pmc_s2d_init()
928 dev->dram_size = S2D_TELEMETRY_DRAMBYTES_MAX; in amd_pmc_s2d_init()
931 amd_pmc_send_cmd(dev, S2D_PHYS_ADDR_LOW, &phys_addr_low, dev->s2d_msg_id, true); in amd_pmc_s2d_init()
932 amd_pmc_send_cmd(dev, S2D_PHYS_ADDR_HIGH, &phys_addr_hi, dev->s2d_msg_id, true); in amd_pmc_s2d_init()
937 dev->msg_port = 0; in amd_pmc_s2d_init()
939 dev->stb_virt_addr = devm_ioremap(dev->dev, stb_phys_addr, dev->dram_size); in amd_pmc_s2d_init()
940 if (!dev->stb_virt_addr) in amd_pmc_s2d_init()
946 static int amd_pmc_write_stb(struct amd_pmc_dev *dev, u32 data) in amd_pmc_write_stb() argument
952 dev_err(dev->dev, "failed to write data in stb: 0x%X\n", AMD_PMC_STB_PMI_0); in amd_pmc_write_stb()
959 static int amd_pmc_read_stb(struct amd_pmc_dev *dev, u32 *buf) in amd_pmc_read_stb() argument
966 dev_err(dev->dev, "error reading data from stb: 0x%X\n", AMD_PMC_STB_PMI_0); in amd_pmc_read_stb()
976 struct amd_pmc_dev *dev = &pmc; in amd_pmc_probe() local
983 dev->dev = &pdev->dev; in amd_pmc_probe()
991 dev->cpu_id = rdev->device; in amd_pmc_probe()
993 if (dev->cpu_id == AMD_CPU_ID_SP) { in amd_pmc_probe()
994 dev_warn_once(dev->dev, "S0i3 is not supported on this hardware\n"); in amd_pmc_probe()
999 dev->rdev = rdev; in amd_pmc_probe()
1002 dev_err(dev->dev, "error reading 0x%x\n", AMD_PMC_BASE_ADDR_LO); in amd_pmc_probe()
1011 dev_err(dev->dev, "error reading 0x%x\n", AMD_PMC_BASE_ADDR_HI); in amd_pmc_probe()
1019 dev->regbase = devm_ioremap(dev->dev, base_addr + AMD_PMC_BASE_ADDR_OFFSET, in amd_pmc_probe()
1021 if (!dev->regbase) { in amd_pmc_probe()
1026 mutex_init(&dev->lock); in amd_pmc_probe()
1028 if (enable_stb && amd_pmc_is_stb_supported(dev)) { in amd_pmc_probe()
1029 err = amd_pmc_s2d_init(dev); in amd_pmc_probe()
1034 platform_set_drvdata(pdev, dev); in amd_pmc_probe()
1038 … dev_warn(dev->dev, "failed to register LPS0 sleep handler, expect increased power consumption\n"); in amd_pmc_probe()
1040 amd_pmc_quirks_init(dev); in amd_pmc_probe()
1043 amd_pmc_dbgfs_register(dev); in amd_pmc_probe()
1054 struct amd_pmc_dev *dev = platform_get_drvdata(pdev); in amd_pmc_remove() local
1058 amd_pmc_dbgfs_unregister(dev); in amd_pmc_remove()
1059 pci_dev_put(dev->rdev); in amd_pmc_remove()
1060 mutex_destroy(&dev->lock); in amd_pmc_remove()