Compare commits

..

2 Commits

Author SHA1 Message Date
Andy Nguyen
d44cfeb934 linux: add spcie and tpcie shutdown 2026-05-18 20:37:16 +02:00
Andy Nguyen
99e816eccb linux: use bapm param set 2 2026-05-18 20:33:52 +02:00

View File

@@ -2386,10 +2386,10 @@ index 000000000000..78ffc4f80a6d
+EXPORT_SYMBOL(hdmi_notification_handler);
diff --git a/drivers/ps5/mp1.c b/drivers/ps5/mp1.c
new file mode 100644
index 000000000000..73bb7ca5d1d9
index 000000000000..4af890c842a7
--- /dev/null
+++ b/drivers/ps5/mp1.c
@@ -0,0 +1,366 @@
@@ -0,0 +1,488 @@
+#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
+
+#include <linux/module.h>
@@ -2421,9 +2421,12 @@ index 000000000000..73bb7ca5d1d9
+#define MP1_C2PMSG_58 0x3b109e8
+#define MP1_C2PMSG_59 0x3b109ec
+#define MP1_C2PMSG_66 0x3b10a08
+#define MP1_C2PMSG_72 0x3b10a20
+#define MP1_C2PMSG_81 0x3b10a44
+#define MP1_C2PMSG_82 0x3b10a48
+#define MP1_C2PMSG_90 0x3b10a68
+#define MP1_C2PMSG_96 0x3b10a80
+#define MP1_C2PMSG_98 0x3b10a88
+
+#define PPSMC_MSG_ConfigureS3PwrOffRegisterAddressHigh 0x16
+#define PPSMC_MSG_ConfigureS3PwrOffRegisterAddressLow 0x17
@@ -2518,6 +2521,78 @@ index 000000000000..73bb7ca5d1d9
+ }
+};
+
+static const struct bapm_param_set bapm_param_set_2 = {
+ .dpm_wac = {
+ 0x0000c3adb08d0000, 0x00a800008d000000, 0xa000008e000000a6,
+ 0x00000000c900a500, 0xc8d000d3b8daea00, 0x0000d000a3d200dc,
+ 0x00bfc80000c6f100, 0x00fe00000000ad00, 0x0000abb300000000,
+ 0x00008600000000cf, 0x00ae0095ff000000, 0x000000000000ac00,
+ 0x00b00000008500ad, 0x0098849600b18000, 0xa2a38bac00b00000,
+ 0x97007479000092ab, 0x0095a30000008f00, 0x000000b5000000a0,
+ 0x0000c200a80000bd, 0x0000bcc1c4b2a300, 0xa700000000000000
+ },
+ .l3_cacw = {
+ [71] = 0x3ff80000,
+ },
+ .gfx_cacw = {
+ [2] = 0xefa,
+ [6] = 0x7bf,
+ [12] = 0x14d10000,
+ [14] = 0x287b0000,
+ [20] = 0x2f2,
+ [22] = 0x1085ffff, 0xcd80e51, 0x4b86145a,
+ [27] = 0x15a7,
+ [29] = 0x13c2, 0x2d02,
+ [34] = 0x78ad0000, 0x2ea0,
+ [54] = 0x257d, 0x8c8,
+ [58] = 0x799e,
+ [63] = 0x152,
+ },
+ .gfx_cacw_len = 64,
+ .bapm_param = {
+ {1, 0xbc22f028}, {1, 0x3e113314}, {1, 0xbe8d0750}, {1, 0x3e16ae78},
+ {1, 0xbe4d4746}, {1, 0x3f34470b}, {1, 0x3704564c}, {1, 0x3f516a34},
+ {1, 0x3f3fdd1c}, {1, 0x3f74f5de}, {1, 0x3dec9763}, {1, 0xbc2c0ab6},
+ {1, 0x3d1582c2}, {1, 0x367468e6}, {1, 0x3f059935}, {1, 0x3ef4cd95},
+ {1, 0x3f74f5de}, {1, 0x3d524dae}, {1, 0xbc2c0ab6}, {1, 0x3d1582c2},
+ {1, 0x357db71b}, {1, 0x40b1089a}, {1, 0x41751b15}, {1, 0x4287d1bc},
+ {1, 0x3fb89949}, {1, 0x411eefdf}, {1, 0xbc816b59}, {1, 0x3d41513a},
+ [49] =
+ {1, 0x41751b15}, {1, 0x4287d1bc}, {1, 0x3fb89949}, {1, 0x412d973c},
+ {1, 0xbc816b59}, {1, 0x3d41513a}, {1, 0x3e0654c8}, {1, 0xbe27b465},
+ {1, 0x3f2d3daa}, {1, 0x41751b15}, {1, 0x4287d1bc}, {1, 0x3fb89949},
+ {1, 0x4061d4cc}, {1, 0xbc816b59}, {1, 0x3d41513a}, {1, 0x3e97c980},
+ {1, 0xbf1d9856}, {1, 0x3f828e45}, {1, 0x41751b15}, {1, 0x4287d1bc},
+ {1, 0x3fb89949}, {1, 0x409c4b3c}, {1, 0xbc816b59}, {1, 0x3d41513a},
+ {1, 0x3e7a6107}, {1, 0xbeedd766}, {1, 0x3f67aa70}, {1, 0x41751b15},
+ {1, 0x4287d1bc}, {1, 0x3fb89949}, {1, 0x40ccf558}, {1, 0xbc816b59},
+ {1, 0x3d41513a}, {1, 0x3e600a8a}, {1, 0xbecbe79c}, {1, 0x3f5b627c},
+ {1, 0x41751b15}, {1, 0x4287d1bc}, {1, 0x3fb89949}, {1, 0x41050555},
+ {1, 0xbc816b59}, {1, 0x3d41513a}, {1, 0x3e379205}, {1, 0xbe94367e},
+ {1, 0x3f46233f}, {1, 0x3f96c5af}, {1, 0x3eb99add}, {1, 0x3f85bb54},
+ {1, 0x3e6a30f6}, {1, 0xbc2c0ab6}, {1, 0x3d1582c2}, {1, 0xbbda394d},
+ {1, 0x3dff4eb1}, {1, 0xbe8b186c}, {1, 0x3f8fbf3f}, {1, 0x3ee87500},
+ {1, 0x3f7c5aff}, {1, 0x3e92470e}, {1, 0xbc2c0ab6}, {1, 0x3d1582c2},
+ {1, 0x396640ab}, {1, 0x3dad4b04}, {1, 0xbe6283c5}, {1, 0x3f8051ba},
+ {1, 0x3f13f766}, {1, 0x3f87a42b}, {1, 0x3e52acf5}, {1, 0xbc2c0ab6},
+ {1, 0x3d1582c2}, {1, 0xbbd8e837}, {1, 0x3e005ec6}, {1, 0xbe8c6197},
+ {1, 0x3f61d86e}, {1, 0x3f276f79}, {1, 0x3f7b0bf0}, {1, 0x3e25ca59},
+ {1, 0xbc2c0ab6}, {1, 0x3d1582c2}, {1, 0xbbc01a0e}, {1, 0x3dfb13b3},
+ {1, 0xbe84dd83}, {1, 0x3fa32142}, {1, 0x3ea341fd}, {1, 0x3f85d724},
+ {1, 0x3e8c3c1d}, {1, 0xbc2c0ab6}, {1, 0x3d1582c2}, {1, 0xbaa01624},
+ {1, 0x3dbebfaf}, {1, 0xbe6f57f4}, {1, 0x3f43c147}, {1, 0x3e70fae5},
+ {1, 0x3f85bb54}, {1, 0x3dd02b85}, {1, 0xbc2c0ab6}, {1, 0x3d1582c2},
+ {1, 0x3f364cb6}, {1, 0x3e936695}, {1, 0x3f7c5aff}, {1, 0x3e020645},
+ {1, 0xbc2c0ab6}, {1, 0x3d1582c2}, {1, 0x3f226119}, {1, 0x3ebb3dcd},
+ {1, 0x3f87a42b}, {1, 0x3dbb4468}, {1, 0xbc2c0ab6}, {1, 0x3d1582c2},
+ {1, 0x3f1302b3}, {1, 0x3ed9fa9b}, {1, 0x3f7b0bf0}, {1, 0x3d935e88},
+ {1, 0xbc2c0ab6}, {1, 0x3d1582c2}, {1, 0x3f4cc495}, {1, 0x3e4cedab},
+ {1, 0x3f85d724}, {1, 0x3df94e6d}, {1, 0xbc2c0ab6}, {1, 0x3d1582c2},
+ {1, 0x3c437be5}, {1, 0x3f3de47f}, {1, 0x3f40c129}, {1, 0x3f3cc9e7},
+ {1, 0x3f41350f}, {1, 0x3f3dcec6}, {1, 0x3f3e1c51}
+ }
+};
+
+static u32 pcirc_smn_read(u32 reg)
+{
+ u32 val = 0;
@@ -2584,6 +2659,48 @@ index 000000000000..73bb7ca5d1d9
+ return 0;
+}
+
+static int mp1fw_test_sendmsg(struct mp1_msg *msg, uint8_t msgid)
+{
+ if (mp1fw_waitmsg(MP1_C2PMSG_96, msgid)) {
+ printk("[MP1ERROR] : %s: Error : busy msgid=0x%X, arg=0x%08X\n", __func__, msgid, msg->arg);
+ return -EBUSY;
+ }
+ pcirc_smn_write(MP1_C2PMSG_96, 0);
+ pcirc_smn_write(MP1_C2PMSG_98, msg->arg);
+ pcirc_smn_write(MP1_C2PMSG_72, msgid);
+ if (mp1fw_waitmsg(MP1_C2PMSG_96, msgid)) {
+ printk("[MP1ERROR] : %s: retry over msgid=0x%X, arg=0x%08X\n", __func__, msgid, msg->arg);
+ return -EBUSY;
+ }
+ u32 resp = pcirc_smn_read(MP1_C2PMSG_96);
+ u32 resp_val = pcirc_smn_read(MP1_C2PMSG_98);
+ if ((msgid != 0x75 && resp != 1) || (msgid == 0x75 && resp != 1 && resp != 0xf8)) {
+ printk("[MP1ERROR] : %s: invalid response msgid=0x%X, resp=0x%08X\n", __func__, msgid, resp);
+ return -EINVAL;
+ }
+
+ msg->resp = resp;
+ msg->resp_val = resp_val;
+
+ return 0;
+}
+
+static int mp1_set_wc_cpu(int mode)
+{
+ struct mp1_msg msg = {};
+ msg.arg = mode;
+ return mp1fw_test_sendmsg(&msg, 0x9b);
+}
+
+static int mp1_get_wc_cpu(int *mode)
+{
+ struct mp1_msg msg = {};
+ int ret;
+ ret = mp1fw_test_sendmsg(&msg, 0x9c);
+ *mode = msg.resp_val;
+ return ret;
+}
+
+static int mp1_configure_s3_pwr_off_reg_addr_high(u64 addr)
+{
+ struct mp1_msg msg = {};
@@ -2669,7 +2786,7 @@ index 000000000000..73bb7ca5d1d9
+
+ for (i = 0; i < 21; i++) {
+ wrmsrq(MSR_DPM_WAC_ACC_INDEX, i);
+ wrmsrq(MSR_DPM_WAC_DATA, bapm_param_set_1.dpm_wac[i]);
+ wrmsrq(MSR_DPM_WAC_DATA, bapm_param_set_2.dpm_wac[i]);
+ }
+
+ wrmsrq(MSR_DPM_CFG, msr_dpm_cfg);
@@ -2682,16 +2799,16 @@ index 000000000000..73bb7ca5d1d9
+ on_each_cpu(update_bapm_weights_smp, NULL, 1);
+
+ for (i = 0; i < 80; i++) {
+ mp1_bapm_set_l3_cacw(i, bapm_param_set_1.l3_cacw[i]);
+ mp1_bapm_set_l3_cacw(i, bapm_param_set_2.l3_cacw[i]);
+ }
+
+ for (i = 0; i < bapm_param_set_1.gfx_cacw_len; i++) {
+ mp1_bapm_set_gfx_cacw(i, bapm_param_set_1.gfx_cacw[i]);
+ for (i = 0; i < bapm_param_set_2.gfx_cacw_len; i++) {
+ mp1_bapm_set_gfx_cacw(i, bapm_param_set_2.gfx_cacw[i]);
+ }
+
+ for (i = 0; i < 176; i++) {
+ if (bapm_param_set_1.bapm_param[i][0])
+ mp1_bapm_write_param(i, bapm_param_set_1.bapm_param[i][1]);
+ if (bapm_param_set_2.bapm_param[i][0])
+ mp1_bapm_write_param(i, bapm_param_set_2.bapm_param[i][1]);
+ }
+}
+
@@ -2731,10 +2848,15 @@ index 000000000000..73bb7ca5d1d9
+static int __init mp1_init(void)
+{
+ int ret;
+ int mode = 0;
+
+ mp1_universal_mode_exit();
+
+ pr_info("Set BAPM params\n");
+ mp1_get_wc_cpu(&mode);
+ if (mode != 1) {
+ mp1_set_wc_cpu(1);
+ }
+ mp1_set_bapm_param_set_all();
+
+ ret = misc_register(&mp1_misc_device);
@@ -2758,10 +2880,10 @@ index 000000000000..73bb7ca5d1d9
+MODULE_LICENSE("GPL");
diff --git a/drivers/ps5/spcie.c b/drivers/ps5/spcie.c
new file mode 100644
index 000000000000..ecec0d6623b1
index 000000000000..d13dc14c0a14
--- /dev/null
+++ b/drivers/ps5/spcie.c
@@ -0,0 +1,879 @@
@@ -0,0 +1,898 @@
+#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
+
+#include <linux/module.h>
@@ -3378,6 +3500,16 @@ index 000000000000..ecec0d6623b1
+ return 0;
+}
+
+static int spcie_icc_shutdown(struct spcie_dev *sdev)
+{
+ icc_fan_change_servo_pattern(0);
+
+ /* Disable IRQs */
+ writel(0, icc_dev->icc_doorbell_base + ICC_REG_INTR_MASK);
+
+ return 0;
+}
+
+u32 spcie_get_chip_id(void)
+{
+ return spcie_chip_revision_id & 0xff0000;
@@ -3623,6 +3755,14 @@ index 000000000000..ecec0d6623b1
+ }
+}
+
+static void spcie_shutdown(struct pci_dev *pdev)
+{
+ struct spcie_dev *sdev = pci_get_drvdata(pdev);
+ if (sdev) {
+ spcie_icc_shutdown(sdev);
+ }
+}
+
+static const struct pci_device_id spcie_ids[] = {
+ { PCI_DEVICE(PCI_VENDOR_ID_SONY, PCI_DEVICE_ID_SPCIE) },
+ { 0, }
@@ -3634,6 +3774,7 @@ index 000000000000..ecec0d6623b1
+ .id_table = spcie_ids,
+ .probe = spcie_probe,
+ .remove = spcie_remove,
+ .shutdown = spcie_shutdown,
+};
+
+module_pci_driver(spcie_driver);
@@ -3643,10 +3784,10 @@ index 000000000000..ecec0d6623b1
+MODULE_LICENSE("GPL");
diff --git a/drivers/ps5/tpcie.c b/drivers/ps5/tpcie.c
new file mode 100644
index 000000000000..cfe53c9861c1
index 000000000000..23de43ea4b00
--- /dev/null
+++ b/drivers/ps5/tpcie.c
@@ -0,0 +1,294 @@
@@ -0,0 +1,303 @@
+#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
+
+#include <linux/console.h>
@@ -3861,12 +4002,6 @@ index 000000000000..cfe53c9861c1
+
+static void tpcie_uart_remove(struct tpcie_dev *tdev)
+{
+ if (!uart_dev)
+ return;
+
+ /* Disable IRQs */
+ writel(0, uart_dev->uart_base + 0x8);
+
+ unregister_console(&tpcie_uart_console);
+
+ if (uart_dev->tty_drv) {
@@ -3877,6 +4012,12 @@ index 000000000000..cfe53c9861c1
+ tty_port_destroy(&uart_dev->tty_port);
+}
+
+static void tpcie_uart_shutdown(struct tpcie_dev *tdev)
+{
+ /* Disable IRQs */
+ writel(0, uart_dev->uart_base + 0x8);
+}
+
+static int tpcie_probe(struct pci_dev *pdev, const struct pci_device_id *id)
+{
+ struct tpcie_dev *tdev;
@@ -3923,6 +4064,14 @@ index 000000000000..cfe53c9861c1
+ }
+}
+
+static void tpcie_shutdown(struct pci_dev *pdev)
+{
+ struct tpcie_dev *tdev = pci_get_drvdata(pdev);
+ if (tdev) {
+ tpcie_uart_shutdown(tdev);
+ }
+}
+
+static const struct pci_device_id tpcie_ids[] = {
+ { PCI_DEVICE(PCI_VENDOR_ID_SONY, PCI_DEVICE_ID_TPCIE) },
+ { 0, }
@@ -3934,6 +4083,7 @@ index 000000000000..cfe53c9861c1
+ .id_table = tpcie_ids,
+ .probe = tpcie_probe,
+ .remove = tpcie_remove,
+ .shutdown = tpcie_shutdown,
+};
+
+module_pci_driver(tpcie_driver);