mirror of
https://github.com/ps5-linux/ps5-linux-patches.git
synced 2026-07-16 10:10:38 +00:00
Compare commits
15 Commits
kernel-7.1
...
main
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
dc1a568126 | ||
|
|
c363690546 | ||
|
|
5236127a9e | ||
|
|
c404a24cbf | ||
|
|
cb839ab600 | ||
|
|
1926418e4e | ||
|
|
c445e9adf3 | ||
|
|
e81e281f38 | ||
|
|
050704a2f5 | ||
|
|
bf16f7e8b7 | ||
|
|
8fbb1b2057 | ||
|
|
935dc3e322 | ||
|
|
9ee33721e4 | ||
|
|
a57d783d89 | ||
|
|
07f9d7f847 |
116
.config
116
.config
@@ -1,6 +1,6 @@
|
||||
#
|
||||
# Automatically generated file; DO NOT EDIT.
|
||||
# Linux/x86 7.1.1 Kernel Configuration
|
||||
# Linux/x86 7.1.3 Kernel Configuration
|
||||
#
|
||||
CONFIG_CC_VERSION_TEXT="gcc (Ubuntu 15.2.0-16ubuntu1) 15.2.0"
|
||||
CONFIG_CC_IS_GCC=y
|
||||
@@ -11,9 +11,9 @@ CONFIG_AS_VERSION=24600
|
||||
CONFIG_LD_IS_BFD=y
|
||||
CONFIG_LD_VERSION=24600
|
||||
CONFIG_LLD_VERSION=0
|
||||
CONFIG_RUSTC_VERSION=0
|
||||
CONFIG_RUSTC_LLVM_VERSION=0
|
||||
CONFIG_RUSTC_LLVM_MAJOR_VERSION=0
|
||||
CONFIG_RUSTC_VERSION=109600
|
||||
CONFIG_RUSTC_LLVM_VERSION=220102
|
||||
CONFIG_RUSTC_LLVM_MAJOR_VERSION=22
|
||||
CONFIG_CC_CAN_LINK=y
|
||||
CONFIG_CC_HAS_ASM_GOTO_OUTPUT=y
|
||||
CONFIG_CC_HAS_ASM_GOTO_TIED_OUTPUT=y
|
||||
@@ -24,6 +24,10 @@ CONFIG_CC_HAS_NO_PROFILE_FN_ATTR=y
|
||||
CONFIG_CC_HAS_COUNTED_BY=y
|
||||
CONFIG_CC_HAS_MULTIDIMENSIONAL_NONSTRING=y
|
||||
CONFIG_LD_CAN_USE_KEEP_IN_OVERLAY=y
|
||||
CONFIG_RUSTC_HAS_SPAN_FILE=y
|
||||
CONFIG_RUSTC_HAS_UNNECESSARY_TRANSMUTES=y
|
||||
CONFIG_RUSTC_HAS_FILE_WITH_NUL=y
|
||||
CONFIG_RUSTC_HAS_FILE_AS_C_STR=y
|
||||
CONFIG_PAHOLE_VERSION=131
|
||||
CONFIG_IRQ_WORK=y
|
||||
CONFIG_BUILDTIME_TABLE_SORT=y
|
||||
@@ -357,7 +361,12 @@ CONFIG_CRASH_MAX_MEMORY_RANGES=8192
|
||||
#
|
||||
# Live Update and Kexec HandOver
|
||||
#
|
||||
# CONFIG_KEXEC_HANDOVER is not set
|
||||
CONFIG_KEXEC_HANDOVER=y
|
||||
# CONFIG_KEXEC_HANDOVER_DEBUG is not set
|
||||
CONFIG_KEXEC_HANDOVER_DEBUGFS=y
|
||||
CONFIG_KEXEC_HANDOVER_ENABLE_DEFAULT=y
|
||||
CONFIG_LIVEUPDATE=y
|
||||
CONFIG_LIVEUPDATE_MEMFD=y
|
||||
# end of Live Update and Kexec HandOver
|
||||
# end of General setup
|
||||
|
||||
@@ -536,8 +545,9 @@ CONFIG_LEGACY_VSYSCALL_XONLY=y
|
||||
CONFIG_MODIFY_LDT_SYSCALL=y
|
||||
# CONFIG_STRICT_SIGALTSTACK_SIZE is not set
|
||||
CONFIG_HAVE_LIVEPATCH=y
|
||||
# CONFIG_LIVEPATCH is not set
|
||||
CONFIG_LIVEPATCH=y
|
||||
CONFIG_HAVE_KLP_BUILD=y
|
||||
CONFIG_KLP_BUILD=y
|
||||
CONFIG_X86_BUS_LOCK_DETECT=y
|
||||
# end of Processor type and features
|
||||
|
||||
@@ -965,7 +975,12 @@ CONFIG_MODULES=y
|
||||
CONFIG_MODULE_UNLOAD=y
|
||||
# CONFIG_MODULE_FORCE_UNLOAD is not set
|
||||
# CONFIG_MODULE_UNLOAD_TAINT_TRACKING is not set
|
||||
# CONFIG_MODVERSIONS is not set
|
||||
CONFIG_MODVERSIONS=y
|
||||
# CONFIG_GENKSYMS is not set
|
||||
CONFIG_GENDWARFKSYMS=y
|
||||
CONFIG_ASM_MODVERSIONS=y
|
||||
CONFIG_EXTENDED_MODVERSIONS=y
|
||||
CONFIG_BASIC_MODVERSIONS=y
|
||||
# CONFIG_MODULE_SRCVERSION_ALL is not set
|
||||
# CONFIG_MODULE_SIG is not set
|
||||
CONFIG_MODULE_COMPRESS=y
|
||||
@@ -985,8 +1000,8 @@ CONFIG_BLK_CGROUP_RWSTAT=y
|
||||
CONFIG_BLK_CGROUP_PUNT_BIO=y
|
||||
CONFIG_BLK_DEV_BSG_COMMON=y
|
||||
CONFIG_BLK_ICQ=y
|
||||
# CONFIG_BLK_DEV_BSGLIB is not set
|
||||
# CONFIG_BLK_DEV_INTEGRITY is not set
|
||||
CONFIG_BLK_DEV_BSGLIB=y
|
||||
CONFIG_BLK_DEV_INTEGRITY=y
|
||||
CONFIG_BLK_DEV_WRITE_MOUNTED=y
|
||||
CONFIG_BLK_DEV_ZONED=y
|
||||
CONFIG_BLK_DEV_THROTTLING=y
|
||||
@@ -996,8 +1011,9 @@ CONFIG_BLK_WBT_MQ=y
|
||||
CONFIG_BLK_CGROUP_IOCOST=y
|
||||
CONFIG_BLK_CGROUP_IOPRIO=y
|
||||
CONFIG_BLK_DEBUG_FS=y
|
||||
# CONFIG_BLK_SED_OPAL is not set
|
||||
# CONFIG_BLK_INLINE_ENCRYPTION is not set
|
||||
CONFIG_BLK_SED_OPAL=y
|
||||
CONFIG_BLK_INLINE_ENCRYPTION=y
|
||||
CONFIG_BLK_INLINE_ENCRYPTION_FALLBACK=y
|
||||
|
||||
#
|
||||
# Partition Types
|
||||
@@ -1102,6 +1118,7 @@ CONFIG_ARCH_WANT_OPTIMIZE_DAX_VMEMMAP=y
|
||||
CONFIG_ARCH_WANT_OPTIMIZE_HUGETLB_VMEMMAP=y
|
||||
CONFIG_ARCH_WANT_HUGETLB_VMEMMAP_PREINIT=y
|
||||
CONFIG_HAVE_GUP_FAST=y
|
||||
CONFIG_MEMBLOCK_KHO_SCRATCH=y
|
||||
CONFIG_NUMA_KEEP_MEMINFO=y
|
||||
CONFIG_MEMORY_ISOLATION=y
|
||||
CONFIG_EXCLUSIVE_SYSTEM_RAM=y
|
||||
@@ -1259,6 +1276,7 @@ CONFIG_XFRM_ESPINTCP=y
|
||||
# CONFIG_DIBS is not set
|
||||
CONFIG_XDP_SOCKETS=y
|
||||
CONFIG_XDP_SOCKETS_DIAG=m
|
||||
CONFIG_NET_HANDSHAKE=y
|
||||
CONFIG_INET=y
|
||||
CONFIG_IP_MULTICAST=y
|
||||
CONFIG_IP_ADVANCED_ROUTER=y
|
||||
@@ -1806,7 +1824,7 @@ CONFIG_SOCK_VALIDATE_XMIT=y
|
||||
CONFIG_NET_SELFTESTS=y
|
||||
CONFIG_NET_SOCK_MSG=y
|
||||
CONFIG_PAGE_POOL=y
|
||||
# CONFIG_PAGE_POOL_STATS is not set
|
||||
CONFIG_PAGE_POOL_STATS=y
|
||||
CONFIG_FAILOVER=y
|
||||
CONFIG_ETHTOOL_NETLINK=y
|
||||
|
||||
@@ -2334,7 +2352,7 @@ CONFIG_VXLAN=m
|
||||
# CONFIG_AMT is not set
|
||||
# CONFIG_MACSEC is not set
|
||||
CONFIG_NETCONSOLE=m
|
||||
# CONFIG_NETCONSOLE_DYNAMIC is not set
|
||||
CONFIG_NETCONSOLE_DYNAMIC=y
|
||||
# CONFIG_NETCONSOLE_EXTENDED_LOG is not set
|
||||
CONFIG_NETPOLL=y
|
||||
CONFIG_NET_POLL_CONTROLLER=y
|
||||
@@ -4108,7 +4126,7 @@ CONFIG_USB_DYNAMIC_MINORS=y
|
||||
# CONFIG_USB_OTG is not set
|
||||
# CONFIG_USB_OTG_PRODUCTLIST is not set
|
||||
# CONFIG_USB_OTG_DISABLE_EXTERNAL_HUB is not set
|
||||
# CONFIG_USB_LEDS_TRIGGER_USBPORT is not set
|
||||
CONFIG_USB_LEDS_TRIGGER_USBPORT=m
|
||||
CONFIG_USB_AUTOSUSPEND_DELAY=2
|
||||
CONFIG_USB_DEFAULT_AUTHORIZATION_MODE=1
|
||||
CONFIG_USB_MON=m
|
||||
@@ -4869,9 +4887,11 @@ CONFIG_ZONEFS_FS=m
|
||||
# CONFIG_FS_DAX is not set
|
||||
CONFIG_FS_POSIX_ACL=y
|
||||
CONFIG_EXPORTFS=y
|
||||
# CONFIG_EXPORTFS_BLOCK_OPS is not set
|
||||
CONFIG_EXPORTFS_BLOCK_OPS=y
|
||||
CONFIG_FILE_LOCKING=y
|
||||
# CONFIG_FS_ENCRYPTION is not set
|
||||
CONFIG_FS_ENCRYPTION=y
|
||||
CONFIG_FS_ENCRYPTION_ALGS=y
|
||||
CONFIG_FS_ENCRYPTION_INLINE_CRYPT=y
|
||||
# CONFIG_FS_VERITY is not set
|
||||
CONFIG_FSNOTIFY=y
|
||||
CONFIG_DNOTIFY=y
|
||||
@@ -5014,8 +5034,52 @@ CONFIG_RESCTRL_FS_PSEUDO_LOCK=y
|
||||
# CONFIG_UFS_FS is not set
|
||||
# CONFIG_EROFS_FS is not set
|
||||
CONFIG_NETWORK_FILESYSTEMS=y
|
||||
# CONFIG_NFS_FS is not set
|
||||
# CONFIG_NFSD is not set
|
||||
CONFIG_NFS_FS=m
|
||||
CONFIG_NFS_V2=m
|
||||
CONFIG_NFS_V3=m
|
||||
CONFIG_NFS_V3_ACL=y
|
||||
CONFIG_NFS_V4=m
|
||||
CONFIG_NFS_SWAP=y
|
||||
CONFIG_NFS_V4_0=y
|
||||
CONFIG_NFS_V4_2=y
|
||||
CONFIG_PNFS_FILE_LAYOUT=m
|
||||
CONFIG_PNFS_BLOCK=m
|
||||
CONFIG_PNFS_FLEXFILE_LAYOUT=m
|
||||
CONFIG_NFS_V4_1_IMPLEMENTATION_ID_DOMAIN="kernel.org"
|
||||
CONFIG_NFS_V4_1_MIGRATION=y
|
||||
CONFIG_NFS_V4_SECURITY_LABEL=y
|
||||
CONFIG_NFS_FSCACHE=y
|
||||
# CONFIG_NFS_USE_LEGACY_DNS is not set
|
||||
CONFIG_NFS_USE_KERNEL_DNS=y
|
||||
CONFIG_NFS_DISABLE_UDP_SUPPORT=y
|
||||
# CONFIG_NFS_V4_2_READ_PLUS is not set
|
||||
CONFIG_NFSD=m
|
||||
# CONFIG_NFSD_V2 is not set
|
||||
CONFIG_NFSD_V3_ACL=y
|
||||
CONFIG_NFSD_V4=y
|
||||
CONFIG_NFSD_PNFS=y
|
||||
CONFIG_NFSD_BLOCKLAYOUT=y
|
||||
CONFIG_NFSD_SCSILAYOUT=y
|
||||
CONFIG_NFSD_FLEXFILELAYOUT=y
|
||||
CONFIG_NFSD_V4_2_INTER_SSC=y
|
||||
CONFIG_NFSD_V4_SECURITY_LABEL=y
|
||||
# CONFIG_NFSD_LEGACY_CLIENT_TRACKING is not set
|
||||
# CONFIG_NFSD_V4_POSIX_ACLS is not set
|
||||
CONFIG_GRACE_PERIOD=m
|
||||
CONFIG_LOCKD=m
|
||||
CONFIG_LOCKD_V4=y
|
||||
CONFIG_NFS_ACL_SUPPORT=m
|
||||
CONFIG_NFS_COMMON=y
|
||||
# CONFIG_NFS_LOCALIO is not set
|
||||
CONFIG_NFS_V4_2_SSC_HELPER=y
|
||||
CONFIG_SUNRPC=m
|
||||
CONFIG_SUNRPC_GSS=m
|
||||
CONFIG_SUNRPC_BACKCHANNEL=y
|
||||
CONFIG_SUNRPC_SWAP=y
|
||||
CONFIG_RPCSEC_GSS_KRB5=m
|
||||
CONFIG_RPCSEC_GSS_KRB5_ENCTYPES_AES_SHA1=y
|
||||
# CONFIG_RPCSEC_GSS_KRB5_ENCTYPES_AES_SHA2 is not set
|
||||
# CONFIG_SUNRPC_DEBUG is not set
|
||||
# CONFIG_CEPH_FS is not set
|
||||
CONFIG_CIFS=m
|
||||
# CONFIG_CIFS_STATS2 is not set
|
||||
@@ -5450,8 +5514,12 @@ CONFIG_ARCH_USE_SYM_ANNOTATIONS=y
|
||||
CONFIG_CRC16=y
|
||||
CONFIG_CRC_CCITT=y
|
||||
CONFIG_CRC_ITU_T=m
|
||||
CONFIG_CRC_T10DIF=y
|
||||
CONFIG_CRC_T10DIF_ARCH=y
|
||||
CONFIG_CRC32=y
|
||||
CONFIG_CRC32_ARCH=y
|
||||
CONFIG_CRC64=y
|
||||
CONFIG_CRC64_ARCH=y
|
||||
CONFIG_CRC_OPTIMIZATIONS=y
|
||||
CONFIG_CRYPTO_HASH_INFO=y
|
||||
CONFIG_CRYPTO_LIB_UTILS=y
|
||||
@@ -5559,6 +5627,7 @@ CONFIG_CLZ_TAB=y
|
||||
CONFIG_IRQ_POLL=y
|
||||
CONFIG_MPILIB=y
|
||||
CONFIG_DIMLIB=y
|
||||
CONFIG_LIBFDT=y
|
||||
CONFIG_OID_REGISTRY=y
|
||||
CONFIG_UCS2_STRING=y
|
||||
CONFIG_HAVE_GENERIC_VDSO=y
|
||||
@@ -5605,6 +5674,7 @@ CONFIG_UNION_FIND=y
|
||||
#
|
||||
CONFIG_PRINTK_TIME=y
|
||||
# CONFIG_PRINTK_CALLER is not set
|
||||
CONFIG_PRINTK_EXECUTION_CTX=y
|
||||
# CONFIG_STACKTRACE_BUILD_ID is not set
|
||||
CONFIG_CONSOLE_LOGLEVEL_DEFAULT=7
|
||||
CONFIG_CONSOLE_LOGLEVEL_QUIET=3
|
||||
@@ -5637,7 +5707,7 @@ CONFIG_DEBUG_INFO_COMPRESSED_NONE=y
|
||||
CONFIG_DEBUG_INFO_BTF=y
|
||||
CONFIG_PAHOLE_HAS_LANG_EXCLUDE=y
|
||||
CONFIG_DEBUG_INFO_BTF_MODULES=y
|
||||
# CONFIG_MODULE_ALLOW_BTF_MISMATCH is not set
|
||||
CONFIG_MODULE_ALLOW_BTF_MISMATCH=y
|
||||
CONFIG_GDB_SCRIPTS=y
|
||||
CONFIG_FRAME_WARN=2048
|
||||
# CONFIG_STRIP_ASM_SYMS is not set
|
||||
@@ -5914,7 +5984,7 @@ CONFIG_BPF_KPROBE_OVERRIDE=y
|
||||
CONFIG_FTRACE_MCOUNT_USE_CC=y
|
||||
CONFIG_TRACING_MAP=y
|
||||
CONFIG_SYNTH_EVENTS=y
|
||||
# CONFIG_USER_EVENTS is not set
|
||||
CONFIG_USER_EVENTS=y
|
||||
CONFIG_HIST_TRIGGERS=y
|
||||
CONFIG_TRACE_EVENT_INJECT=y
|
||||
# CONFIG_TRACEPOINT_BENCHMARK is not set
|
||||
@@ -5953,8 +6023,8 @@ CONFIG_EARLY_PRINTK_DBGP=y
|
||||
# CONFIG_DEBUG_TLBFLUSH is not set
|
||||
CONFIG_HAVE_MMIOTRACE_SUPPORT=y
|
||||
# CONFIG_X86_DECODER_SELFTEST is not set
|
||||
CONFIG_IO_DELAY_0X80=y
|
||||
# CONFIG_IO_DELAY_0XED is not set
|
||||
# CONFIG_IO_DELAY_0X80 is not set
|
||||
CONFIG_IO_DELAY_0XED=y
|
||||
# CONFIG_IO_DELAY_UDELAY is not set
|
||||
# CONFIG_IO_DELAY_NONE is not set
|
||||
# CONFIG_DEBUG_BOOT_PARAMS is not set
|
||||
@@ -6006,6 +6076,7 @@ CONFIG_RUNTIME_TESTING_MENU=y
|
||||
# CONFIG_TEST_FIRMWARE is not set
|
||||
# CONFIG_TEST_SYSCTL is not set
|
||||
# CONFIG_CONTEXT_ANALYSIS_TEST is not set
|
||||
# CONFIG_LIVEUPDATE_TEST is not set
|
||||
# CONFIG_TEST_UDELAY is not set
|
||||
# CONFIG_TEST_STATIC_KEYS is not set
|
||||
# CONFIG_TEST_DYNAMIC_DEBUG is not set
|
||||
@@ -6018,6 +6089,7 @@ CONFIG_RUNTIME_TESTING_MENU=y
|
||||
# CONFIG_TEST_FPU is not set
|
||||
# CONFIG_TEST_CLOCKSOURCE_WATCHDOG is not set
|
||||
# CONFIG_TEST_OBJPOOL is not set
|
||||
# CONFIG_TEST_KEXEC_HANDOVER is not set
|
||||
CONFIG_ARCH_USE_MEMTEST=y
|
||||
CONFIG_MEMTEST=y
|
||||
# end of Kernel Testing and Coverage
|
||||
|
||||
21
.github/workflows/build-kernel.yml
vendored
21
.github/workflows/build-kernel.yml
vendored
@@ -8,7 +8,7 @@ on:
|
||||
description: 'Package format'
|
||||
default: 'all'
|
||||
type: choice
|
||||
options: [deb, arch, all]
|
||||
options: [deb, arch, rpm, all]
|
||||
patches_ref:
|
||||
description: 'Patches branch/tag/SHA (empty = default)'
|
||||
default: ''
|
||||
@@ -29,6 +29,11 @@ jobs:
|
||||
CCACHE_DIR: /home/opc/ccache
|
||||
|
||||
steps:
|
||||
- name: Clean image workspace
|
||||
# Docker containers write to image/linux-bin/ as root; actions/checkout's
|
||||
# git clean runs as the runner user and skips root-owned files, so stale
|
||||
# .deb / .pkg.tar.zst from prior kernel versions leak into the release.
|
||||
run: sudo rm -rf image
|
||||
- name: Checkout image builder
|
||||
uses: actions/checkout@v6
|
||||
with:
|
||||
@@ -43,6 +48,16 @@ jobs:
|
||||
bash image/build_image.sh --kernel-only \
|
||||
--distro "$FORMAT" \
|
||||
--patches-ref "$PATCHES_REF"
|
||||
# --distro all skips the rpm packager. Call the packager container
|
||||
# directly against the already-staged kernel (image/linux-bin/staging/)
|
||||
# instead of re-running build_image.sh, which wipes outputs and
|
||||
# rebuilds the kernel — that doubled CI time. This step is ~1 minute.
|
||||
if [ "$FORMAT" = "all" ]; then
|
||||
docker build -t ps5-kernel-packager-rpm \
|
||||
-f image/docker/kernel-builder-rpm/Dockerfile image/
|
||||
docker run --rm -v "$PWD/image/linux-bin":/out \
|
||||
ps5-kernel-packager-rpm
|
||||
fi
|
||||
|
||||
- name: Read kernel and patches version
|
||||
id: version
|
||||
@@ -61,6 +76,7 @@ jobs:
|
||||
path: |
|
||||
image/linux-bin/*.deb
|
||||
image/linux-bin/*.pkg.tar.zst
|
||||
image/linux-bin/*.rpm
|
||||
retention-days: 7
|
||||
|
||||
- name: Compute checksums
|
||||
@@ -68,7 +84,7 @@ jobs:
|
||||
run: |
|
||||
{
|
||||
echo 'sums<<SHAEOF'
|
||||
sha256sum image/linux-bin/*.deb image/linux-bin/*.pkg.tar.zst | sed 's|image/linux-bin/||'
|
||||
sha256sum image/linux-bin/*.deb image/linux-bin/*.pkg.tar.zst image/linux-bin/*.rpm 2>/dev/null | sed 's|image/linux-bin/||'
|
||||
echo 'SHAEOF'
|
||||
} >> "$GITHUB_OUTPUT"
|
||||
|
||||
@@ -90,4 +106,5 @@ jobs:
|
||||
files: |
|
||||
image/linux-bin/*.deb
|
||||
image/linux-bin/*.pkg.tar.zst
|
||||
image/linux-bin/*.rpm
|
||||
make_latest: true
|
||||
|
||||
@@ -24,7 +24,6 @@ sudo make install
|
||||
## TODO
|
||||
|
||||
- amdgpu smu driver to show correct gpu frequency and temperature
|
||||
- xhci driver adjustment for 0x104d:0x9108 to enable bluetooth
|
||||
- hdmi converter improvments: hdr, rgb range, 120hz
|
||||
|
||||
## Bugs
|
||||
|
||||
701
linux.patch
701
linux.patch
@@ -106,6 +106,21 @@ index dafbf581c515..791687363cbf 100644
|
||||
X86_NR_SUBARCHS,
|
||||
};
|
||||
|
||||
diff --git a/arch/x86/kernel/cpu/amd.c b/arch/x86/kernel/cpu/amd.c
|
||||
index 31f01e9c7114..ec3c32893cca 100644
|
||||
--- a/arch/x86/kernel/cpu/amd.c
|
||||
+++ b/arch/x86/kernel/cpu/amd.c
|
||||
@@ -1163,6 +1163,10 @@ static void init_amd(struct cpuinfo_x86 *c)
|
||||
/* AMD CPUs don't need fencing after x2APIC/TSC_DEADLINE MSR writes. */
|
||||
clear_cpu_cap(c, X86_FEATURE_APIC_MSRS_FENCE);
|
||||
|
||||
+ if (c->x86 == 0x17 && c->x86_model == 0x46)
|
||||
+ strscpy(c->x86_model_id, "AMD Custom Zen 2 (Oberon)",
|
||||
+ sizeof(c->x86_model_id));
|
||||
+
|
||||
/* Enable Translation Cache Extension */
|
||||
if (cpu_has(c, X86_FEATURE_TCE))
|
||||
msr_set_bit(MSR_EFER, _EFER_TCE);
|
||||
diff --git a/arch/x86/kernel/head64.c b/arch/x86/kernel/head64.c
|
||||
index fd28b53dbac5..569fc764d267 100644
|
||||
--- a/arch/x86/kernel/head64.c
|
||||
@@ -336,10 +351,12 @@ index 000000000000..5263181876f8
|
||||
+obj-$(CONFIG_X86_PS5) += ps5.o
|
||||
diff --git a/arch/x86/platform/ps5/ps5.c b/arch/x86/platform/ps5/ps5.c
|
||||
new file mode 100644
|
||||
index 000000000000..731fed163a83
|
||||
index 000000000000..acfbaf873315
|
||||
--- /dev/null
|
||||
+++ b/arch/x86/platform/ps5/ps5.c
|
||||
@@ -0,0 +1,51 @@
|
||||
@@ -0,0 +1,53 @@
|
||||
+// SPDX-License-Identifier: GPL-2.0-only
|
||||
+
|
||||
+#include <linux/module.h>
|
||||
+#include <linux/ps5.h>
|
||||
+
|
||||
@@ -1091,7 +1108,7 @@ index 000000000000..39cc76f39e06
|
||||
+
|
||||
+#endif
|
||||
diff --git a/drivers/bluetooth/btusb.c b/drivers/bluetooth/btusb.c
|
||||
index 830fefb342c6..f13155f049c4 100644
|
||||
index 830fefb342c6..380bc421583d 100644
|
||||
--- a/drivers/bluetooth/btusb.c
|
||||
+++ b/drivers/bluetooth/btusb.c
|
||||
@@ -67,6 +67,10 @@ static struct usb_driver btusb_driver;
|
||||
@@ -1112,10 +1129,10 @@ index 830fefb342c6..f13155f049c4 100644
|
||||
+ /* PS5 IW620 Bluetooth device */
|
||||
+ { USB_DEVICE(0x1286, 0x2059),
|
||||
+ .driver_info = BTUSB_MARVELL |
|
||||
+ BTUSB_IFNUM_0 |
|
||||
+ BTUSB_BROKEN_LE_DEFAULT_PHY |
|
||||
+ BTUSB_BROKEN_READ_LOCAL_NAME |
|
||||
+ BTUSB_NO_AUTOSUSPEND },
|
||||
+ BTUSB_IFNUM_0 |
|
||||
+ BTUSB_BROKEN_LE_DEFAULT_PHY |
|
||||
+ BTUSB_BROKEN_READ_LOCAL_NAME |
|
||||
+ BTUSB_NO_AUTOSUSPEND },
|
||||
+
|
||||
{ } /* Terminating entry */
|
||||
};
|
||||
@@ -1125,10 +1142,10 @@ index 830fefb342c6..f13155f049c4 100644
|
||||
{ USB_DEVICE(0x1286, 0x2046), .driver_info = BTUSB_MARVELL },
|
||||
{ USB_DEVICE(0x1286, 0x204e), .driver_info = BTUSB_MARVELL },
|
||||
+ { USB_DEVICE(0x1286, 0x2059), .driver_info = BTUSB_MARVELL |
|
||||
+ BTUSB_IFNUM_0 |
|
||||
+ BTUSB_BROKEN_LE_DEFAULT_PHY |
|
||||
+ BTUSB_BROKEN_READ_LOCAL_NAME |
|
||||
+ BTUSB_NO_AUTOSUSPEND },
|
||||
+ BTUSB_IFNUM_0 |
|
||||
+ BTUSB_BROKEN_LE_DEFAULT_PHY |
|
||||
+ BTUSB_BROKEN_READ_LOCAL_NAME |
|
||||
+ BTUSB_NO_AUTOSUSPEND },
|
||||
|
||||
/* Intel Bluetooth devices */
|
||||
{ USB_DEVICE(0x8087, 0x0025), .driver_info = BTUSB_INTEL_COMBINED },
|
||||
@@ -3409,18 +3426,20 @@ index b63cd0c310bc..495b2714838b 100644
|
||||
|
||||
diff --git a/drivers/ps5/Makefile b/drivers/ps5/Makefile
|
||||
new file mode 100644
|
||||
index 000000000000..ccb2740e3375
|
||||
index 000000000000..b4b42394aed9
|
||||
--- /dev/null
|
||||
+++ b/drivers/ps5/Makefile
|
||||
@@ -0,0 +1,2 @@
|
||||
+obj-y += spcie.o tpcie.o hdmi.o mp1.o buzzer.o svm.o vmenter.o
|
||||
+obj-y += spcie.o tpcie.o hdmi.o mp1.o buzzer.o svm.o vmenter.o fan.o
|
||||
+obj-y += led/
|
||||
diff --git a/drivers/ps5/autoservo_param.h b/drivers/ps5/autoservo_param.h
|
||||
new file mode 100644
|
||||
index 000000000000..d2c25e461bf7
|
||||
index 000000000000..612aee5b273a
|
||||
--- /dev/null
|
||||
+++ b/drivers/ps5/autoservo_param.h
|
||||
@@ -0,0 +1,1902 @@
|
||||
@@ -0,0 +1,1904 @@
|
||||
+/* SPDX-License-Identifier: GPL-2.0-only */
|
||||
+
|
||||
+#ifndef _AUTOSERVO_PARAM_H
|
||||
+#define _AUTOSERVO_PARAM_H
|
||||
+
|
||||
@@ -5620,12 +5639,388 @@ index 000000000000..f48ad6f92534
|
||||
+MODULE_AUTHOR("Armandas Kvietkus");
|
||||
+MODULE_DESCRIPTION("PlayStation 5 chassis piezo buzzer");
|
||||
+MODULE_LICENSE("GPL");
|
||||
diff --git a/drivers/ps5/fan.c b/drivers/ps5/fan.c
|
||||
new file mode 100644
|
||||
index 000000000000..e68819f9e32a
|
||||
--- /dev/null
|
||||
+++ b/drivers/ps5/fan.c
|
||||
@@ -0,0 +1,368 @@
|
||||
+// SPDX-License-Identifier: GPL-2.0-only
|
||||
+
|
||||
+#include <linux/module.h>
|
||||
+#include <linux/platform_device.h>
|
||||
+#include <linux/slab.h>
|
||||
+#include <linux/err.h>
|
||||
+#include <linux/unaligned.h>
|
||||
+#include <linux/ps5.h>
|
||||
+#include <linux/io.h>
|
||||
+#include "ps5-fan.h"
|
||||
+#include "autoservo_param.h"
|
||||
+
|
||||
+#define PS5_FAN_BOOT_TARGET_TEMP 80
|
||||
+
|
||||
+#define GDDR6_SAMSUNG 0x01
|
||||
+#define GDDR6_HYNIX 0x06
|
||||
+#define GDDR6_MICRON 0x0f
|
||||
+
|
||||
+#define BOARD_MASK_A 0xffffffffffffff00
|
||||
+#define BOARD_MASK_B 0xffffffffff00ff00
|
||||
+
|
||||
+#define BOARD_SANCARLO_1 0x2001010104010400
|
||||
+#define BOARD_SANCARLO_2 0x2001010104010500
|
||||
+#define BOARD_A_EIGER_1 0x3002010104010400
|
||||
+#define BOARD_A_EIGER_2 0x3002010104010500
|
||||
+#define BOARD_A_DENALI_1 0x3002010104030400
|
||||
+#define BOARD_A_DENALI_2 0x3002010104030500
|
||||
+#define BOARD_B_EIGER_DENALI_1 0x3002020101000400
|
||||
+#define BOARD_B_EIGER_DENALI_2 0x3002020101000500
|
||||
+#define BOARD_D_EIGER_DENALI_1 0x3002040101000400
|
||||
+#define BOARD_D_EIGER_DENALI_2 0x3002040101000500
|
||||
+
|
||||
+static void bootparam_get_config_board_id(u64 *board_id)
|
||||
+{
|
||||
+ void __iomem *bootparam = ioremap(0x9b000, 0x2000);
|
||||
+ *board_id = readq(bootparam + 0x328);
|
||||
+ iounmap(bootparam);
|
||||
+}
|
||||
+
|
||||
+static void bootparam_get_config_gddr6_id(u16 *gddr6_id)
|
||||
+{
|
||||
+ void __iomem *bootparam = ioremap(0x9b000, 0x2000);
|
||||
+ *gddr6_id = readw(bootparam + 0x1184);
|
||||
+ iounmap(bootparam);
|
||||
+}
|
||||
+
|
||||
+int icc_fan_update_param(const u8 *param)
|
||||
+{
|
||||
+ u8 buf[ICC_MSG_MAX_SIZE] = {};
|
||||
+ struct icc_msg *msg = (struct icc_msg *)buf;
|
||||
+
|
||||
+ msg->service_id = ICC_SERVICE_ID_FAN;
|
||||
+ msg->msg_type = 0xe;
|
||||
+ msg->length = sizeof(*msg) + 0x6ae;
|
||||
+ memcpy(msg->data, param, 0x6ae);
|
||||
+
|
||||
+ return icc_query(buf, buf);
|
||||
+}
|
||||
+EXPORT_SYMBOL(icc_fan_update_param);
|
||||
+
|
||||
+int icc_fan_update_autoservo_param(void)
|
||||
+{
|
||||
+ u64 board_id, board_mask_a, board_mask_b;
|
||||
+ u16 gddr6_id;
|
||||
+ u8 gddr6_vendor, gddr6_revision;
|
||||
+ const char *board_name = NULL;
|
||||
+ const char *gddr6_name = NULL;
|
||||
+ const u8 *param = NULL;
|
||||
+ int ret;
|
||||
+
|
||||
+ bootparam_get_config_board_id(&board_id);
|
||||
+ board_id = be64_to_cpu(board_id);
|
||||
+ board_mask_a = board_id & BOARD_MASK_A;
|
||||
+ board_mask_b = board_id & BOARD_MASK_B;
|
||||
+
|
||||
+ bootparam_get_config_gddr6_id(&gddr6_id);
|
||||
+ gddr6_vendor = gddr6_id & 0xf;
|
||||
+ gddr6_revision = gddr6_id >> 4;
|
||||
+
|
||||
+ if (board_mask_a == BOARD_SANCARLO_1 || board_mask_a == BOARD_SANCARLO_2) {
|
||||
+ board_name = "Sancarlo";
|
||||
+ param = autoservo_param_sancarlo;
|
||||
+ } else if (board_mask_a == BOARD_A_EIGER_1 || board_mask_a == BOARD_A_EIGER_2) {
|
||||
+ board_name = "A-Eiger";
|
||||
+ switch (gddr6_vendor) {
|
||||
+ case GDDR6_SAMSUNG:
|
||||
+ gddr6_name = "Samsung";
|
||||
+ param = autoservo_param_a_eiger_samsung;
|
||||
+ break;
|
||||
+ case GDDR6_HYNIX:
|
||||
+ gddr6_name = "Hynix";
|
||||
+ param = autoservo_param_a_eiger_hynix;
|
||||
+ break;
|
||||
+ case GDDR6_MICRON:
|
||||
+ gddr6_name = "Micron";
|
||||
+ param = autoservo_param_a_eiger_micron;
|
||||
+ break;
|
||||
+ default:
|
||||
+ pr_info("FanServo: %s Unknown Vendor 0x%x\n", board_name, gddr6_vendor);
|
||||
+ goto not_updated;
|
||||
+ }
|
||||
+ } else if (board_mask_a == BOARD_A_DENALI_1 || board_mask_a == BOARD_A_DENALI_2) {
|
||||
+ board_name = "A-Denali";
|
||||
+ switch (gddr6_vendor) {
|
||||
+ case GDDR6_SAMSUNG:
|
||||
+ gddr6_name = "Samsung";
|
||||
+ param = autoservo_param_a_denali_samsung;
|
||||
+ break;
|
||||
+ case GDDR6_HYNIX:
|
||||
+ gddr6_name = "Hynix";
|
||||
+ param = autoservo_param_a_denali_hynix;
|
||||
+ break;
|
||||
+ case GDDR6_MICRON:
|
||||
+ gddr6_name = "Micron";
|
||||
+ param = autoservo_param_a_denali_micron;
|
||||
+ break;
|
||||
+ default:
|
||||
+ pr_info("FanServo: %s Unknown Vendor 0x%x\n", board_name, gddr6_vendor);
|
||||
+ goto not_updated;
|
||||
+ }
|
||||
+ } else if (board_mask_b == BOARD_B_EIGER_DENALI_1 || board_mask_b == BOARD_B_EIGER_DENALI_2) {
|
||||
+ board_name = "B-Eiger/Denali";
|
||||
+ if (gddr6_vendor == GDDR6_SAMSUNG && gddr6_revision == 8) {
|
||||
+ gddr6_name = "Samsung D1x";
|
||||
+ param = autoservo_param_b_eiger_denali_samsung_d1x;
|
||||
+ } else if (gddr6_vendor == GDDR6_SAMSUNG && gddr6_revision == 9) {
|
||||
+ gddr6_name = "Samsung D1z";
|
||||
+ param = NULL;
|
||||
+ } else if (gddr6_vendor == GDDR6_HYNIX && gddr6_revision == 0) {
|
||||
+ gddr6_name = "Hynix 1x";
|
||||
+ param = autoservo_param_b_eiger_denali_hynix_1x_micron_120s;
|
||||
+ } else if (gddr6_vendor == GDDR6_HYNIX && gddr6_revision == 1) {
|
||||
+ gddr6_name = "Hynix 1y";
|
||||
+ param = autoservo_param_b_eiger_denali_hynix_1y_micron_130s;
|
||||
+ } else if (gddr6_vendor == GDDR6_MICRON && gddr6_revision == 0) {
|
||||
+ gddr6_name = "Micron 120s";
|
||||
+ param = autoservo_param_b_eiger_denali_hynix_1x_micron_120s;
|
||||
+ } else if (gddr6_vendor == GDDR6_MICRON && gddr6_revision == 1) {
|
||||
+ gddr6_name = "Micron 130s";
|
||||
+ param = autoservo_param_b_eiger_denali_hynix_1y_micron_130s;
|
||||
+ } else {
|
||||
+ pr_info("FanServo: %s Unknown Vendor/Revision 0x%x/0x%x\n", board_name, gddr6_vendor, gddr6_revision);
|
||||
+ goto not_updated;
|
||||
+ }
|
||||
+ } else if (board_mask_b == BOARD_D_EIGER_DENALI_1 || board_mask_b == BOARD_D_EIGER_DENALI_2) {
|
||||
+ board_name = "D-Eiger/Denali";
|
||||
+ if (gddr6_vendor == GDDR6_SAMSUNG && gddr6_revision == 9) {
|
||||
+ gddr6_name = "Samsung D1z";
|
||||
+ param = autoservo_param_d_eiger_denali_samsung_d1z;
|
||||
+ } else if (gddr6_vendor == GDDR6_HYNIX && gddr6_revision == 1) {
|
||||
+ gddr6_name = "Hynix 1y";
|
||||
+ param = autoservo_param_d_eiger_denali_hynix_1y;
|
||||
+ } else if (gddr6_vendor == GDDR6_MICRON && gddr6_revision == 1) {
|
||||
+ gddr6_name = "Micron 130s";
|
||||
+ param = autoservo_param_d_eiger_denali_micron_130s_y31j;
|
||||
+ } else if (gddr6_vendor == GDDR6_MICRON && gddr6_revision == 2) {
|
||||
+ gddr6_name = "Micron Y31J";
|
||||
+ param = autoservo_param_d_eiger_denali_micron_130s_y31j;
|
||||
+ } else {
|
||||
+ pr_info("FanServo: %s Unknown Vendor/Revision 0x%x/0x%x\n", board_name, gddr6_vendor, gddr6_revision);
|
||||
+ goto not_updated;
|
||||
+ }
|
||||
+ } else {
|
||||
+ pr_info("FanServo: 0x%016llX\n", board_id);
|
||||
+ goto not_updated;
|
||||
+ }
|
||||
+
|
||||
+ if (gddr6_name)
|
||||
+ pr_info("FanServo: %s %s\n", board_name, gddr6_name);
|
||||
+ else
|
||||
+ pr_info("FanServo: %s\n", board_name);
|
||||
+
|
||||
+ if (!param)
|
||||
+ goto not_updated;
|
||||
+
|
||||
+ ret = icc_fan_update_param(param);
|
||||
+ if (ret)
|
||||
+ pr_err("Error: %s: %d\n", __func__, ret);
|
||||
+
|
||||
+ return ret;
|
||||
+
|
||||
+not_updated:
|
||||
+ pr_info("FanServo: Not update\n");
|
||||
+ return 0;
|
||||
+}
|
||||
+EXPORT_SYMBOL(icc_fan_update_autoservo_param);
|
||||
+
|
||||
+static int icc_fan_txn(u8 svc, u16 mt, u16 len,
|
||||
+ const u8 *data, size_t dlen,
|
||||
+ u8 *reply_out, size_t rlen)
|
||||
+{
|
||||
+ u8 *buf;
|
||||
+ struct icc_msg *msg;
|
||||
+ int ret;
|
||||
+
|
||||
+ buf = kzalloc(ICC_MSG_MAX_SIZE, GFP_KERNEL);
|
||||
+ if (!buf)
|
||||
+ return -ENOMEM;
|
||||
+ msg = (struct icc_msg *)buf;
|
||||
+
|
||||
+ msg->service_id = svc;
|
||||
+ msg->msg_type = mt;
|
||||
+ msg->length = len;
|
||||
+ if (data && dlen)
|
||||
+ memcpy(msg->data, data, dlen);
|
||||
+
|
||||
+ ret = icc_query(buf, buf);
|
||||
+ if (!ret && reply_out && rlen)
|
||||
+ memcpy(reply_out, msg->data, rlen);
|
||||
+
|
||||
+ kfree(buf);
|
||||
+ return ret;
|
||||
+}
|
||||
+
|
||||
+static int icc_fan_get_curset(u8 zone, u32 out[PS5_CURSET_COUNT])
|
||||
+{
|
||||
+ u8 req[ICC_MSG_MAX_SIZE - sizeof(struct icc_msg)] = {};
|
||||
+ u8 reply[ICC_MSG_MIN_SIZE] = {};
|
||||
+ int ret, i;
|
||||
+
|
||||
+ req[PS5_FAN_ZONE_OFF] = zone;
|
||||
+
|
||||
+ ret = icc_fan_txn(ICC_SERVICE_ID_FAN, PS5_FAN_MT_CURSET_GET,
|
||||
+ PS5_FAN_CURSET_GET_LEN, req, sizeof(req),
|
||||
+ reply, sizeof(reply));
|
||||
+ if (ret)
|
||||
+ return ret;
|
||||
+
|
||||
+ for (i = 0; i < PS5_CURSET_COUNT; i++)
|
||||
+ out[i] = get_unaligned_le32(reply +
|
||||
+ PS5_FAN_CURSET_GET_OFF + i * 4);
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+static int icc_fan_set_curset(u8 zone, u8 config, const u32 in[PS5_CURSET_COUNT])
|
||||
+{
|
||||
+ u8 req[ICC_MSG_MAX_SIZE - sizeof(struct icc_msg)] = {};
|
||||
+ int i;
|
||||
+
|
||||
+ req[PS5_FAN_ZONE_OFF] = zone;
|
||||
+ req[PS5_FAN_CONFIG_OFF] = config;
|
||||
+ for (i = 0; i < PS5_CURSET_COUNT; i++)
|
||||
+ put_unaligned_le32(in[i], req + PS5_FAN_CURSET_SET_OFF + i * 4);
|
||||
+
|
||||
+ return icc_fan_txn(ICC_SERVICE_ID_FAN, PS5_FAN_MT_CURSET_SET,
|
||||
+ PS5_FAN_CURSET_SET_LEN, req, sizeof(req), NULL, 0);
|
||||
+}
|
||||
+
|
||||
+static DEFINE_MUTEX(fan_lock);
|
||||
+
|
||||
+static int fan_get_target_temp(u8 zone, u16 *celsius)
|
||||
+{
|
||||
+ u32 cs[PS5_CURSET_COUNT];
|
||||
+ int ret;
|
||||
+
|
||||
+ mutex_lock(&fan_lock);
|
||||
+ ret = icc_fan_get_curset(zone, cs);
|
||||
+ mutex_unlock(&fan_lock);
|
||||
+ if (ret)
|
||||
+ return ret;
|
||||
+
|
||||
+ *celsius = cs[PS5_CURSET_TARGETTEMP] >> PS5_TARGETTEMP_SHIFT;
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+static int fan_set_target_temp(u8 zone, u8 config, u16 celsius)
|
||||
+{
|
||||
+ u32 cs[PS5_CURSET_COUNT];
|
||||
+ int ret;
|
||||
+
|
||||
+ mutex_lock(&fan_lock);
|
||||
+ ret = icc_fan_get_curset(zone, cs);
|
||||
+ if (!ret) {
|
||||
+ cs[PS5_CURSET_TARGETTEMP] = (u32)celsius << PS5_TARGETTEMP_SHIFT;
|
||||
+ ret = icc_fan_set_curset(zone, config, cs);
|
||||
+ }
|
||||
+ mutex_unlock(&fan_lock);
|
||||
+ return ret;
|
||||
+}
|
||||
+
|
||||
+static ssize_t target_temp_show(struct device *dev,
|
||||
+ struct device_attribute *attr, char *buf)
|
||||
+{
|
||||
+ u16 c;
|
||||
+ int ret = fan_get_target_temp(PS5_ZONE_MAINSOC, &c);
|
||||
+
|
||||
+ if (ret)
|
||||
+ return ret;
|
||||
+ return sysfs_emit(buf, "%u\n", c);
|
||||
+}
|
||||
+
|
||||
+static ssize_t target_temp_store(struct device *dev,
|
||||
+ struct device_attribute *attr,
|
||||
+ const char *buf, size_t count)
|
||||
+{
|
||||
+ u16 c;
|
||||
+ int ret;
|
||||
+
|
||||
+ if (kstrtou16(buf, 10, &c))
|
||||
+ return -EINVAL;
|
||||
+ if (c > 100)
|
||||
+ return -ERANGE;
|
||||
+
|
||||
+ ret = fan_set_target_temp(PS5_ZONE_MAINSOC, 0, c);
|
||||
+ return ret ? ret : count;
|
||||
+}
|
||||
+static DEVICE_ATTR_RW(target_temp);
|
||||
+
|
||||
+static struct attribute *ps5_fan_attrs[] = {
|
||||
+ &dev_attr_target_temp.attr,
|
||||
+ NULL,
|
||||
+};
|
||||
+ATTRIBUTE_GROUPS(ps5_fan);
|
||||
+
|
||||
+static int ps5_fan_probe(struct platform_device *pdev)
|
||||
+{
|
||||
+ int ret = icc_fan_update_autoservo_param();
|
||||
+
|
||||
+ if (ret)
|
||||
+ dev_warn(&pdev->dev, "autoservo param load failed: %d\n", ret);
|
||||
+
|
||||
+ ret = fan_set_target_temp(PS5_ZONE_MAINSOC, 0, PS5_FAN_BOOT_TARGET_TEMP);
|
||||
+ if (ret)
|
||||
+ dev_warn(&pdev->dev, "boot target temp set failed: %d\n", ret);
|
||||
+
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+static struct platform_driver ps5_fan_driver = {
|
||||
+ .probe = ps5_fan_probe,
|
||||
+ .driver = {
|
||||
+ .name = "ps5-fan",
|
||||
+ .dev_groups = ps5_fan_groups,
|
||||
+ },
|
||||
+};
|
||||
+
|
||||
+static struct platform_device *ps5_fan_pdev;
|
||||
+
|
||||
+static int __init ps5_fan_init(void)
|
||||
+{
|
||||
+ int ret = platform_driver_register(&ps5_fan_driver);
|
||||
+
|
||||
+ if (ret)
|
||||
+ return ret;
|
||||
+
|
||||
+ ps5_fan_pdev = platform_device_register_simple("ps5-fan", -1, NULL, 0);
|
||||
+ if (IS_ERR(ps5_fan_pdev)) {
|
||||
+ ret = PTR_ERR(ps5_fan_pdev);
|
||||
+ platform_driver_unregister(&ps5_fan_driver);
|
||||
+ ps5_fan_pdev = NULL;
|
||||
+ return ret;
|
||||
+ }
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+static void __exit ps5_fan_exit(void)
|
||||
+{
|
||||
+ if (ps5_fan_pdev)
|
||||
+ platform_device_unregister(ps5_fan_pdev);
|
||||
+ platform_driver_unregister(&ps5_fan_driver);
|
||||
+}
|
||||
+
|
||||
+module_init(ps5_fan_init);
|
||||
+module_exit(ps5_fan_exit);
|
||||
+
|
||||
+MODULE_LICENSE("GPL");
|
||||
+MODULE_DESCRIPTION("PS5 fan driver");
|
||||
+MODULE_ALIAS("platform:ps5-fan");
|
||||
diff --git a/drivers/ps5/hdmi.c b/drivers/ps5/hdmi.c
|
||||
new file mode 100644
|
||||
index 000000000000..8f094490d677
|
||||
index 000000000000..67871f238abe
|
||||
--- /dev/null
|
||||
+++ b/drivers/ps5/hdmi.c
|
||||
@@ -0,0 +1,1237 @@
|
||||
@@ -0,0 +1,1239 @@
|
||||
+// SPDX-License-Identifier: GPL-2.0-only
|
||||
+
|
||||
+#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
|
||||
+
|
||||
+#include <linux/module.h>
|
||||
@@ -7380,10 +7775,12 @@ index 000000000000..a234788e9990
|
||||
+#endif
|
||||
diff --git a/drivers/ps5/mp1.c b/drivers/ps5/mp1.c
|
||||
new file mode 100644
|
||||
index 000000000000..4af890c842a7
|
||||
index 000000000000..3bd1375a444c
|
||||
--- /dev/null
|
||||
+++ b/drivers/ps5/mp1.c
|
||||
@@ -0,0 +1,488 @@
|
||||
@@ -0,0 +1,490 @@
|
||||
+// SPDX-License-Identifier: GPL-2.0-only
|
||||
+
|
||||
+#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
|
||||
+
|
||||
+#include <linux/module.h>
|
||||
@@ -7872,12 +8269,73 @@ index 000000000000..4af890c842a7
|
||||
+MODULE_AUTHOR("Andy Nguyen");
|
||||
+MODULE_DESCRIPTION("PlayStation 5 MP1 SMU driver");
|
||||
+MODULE_LICENSE("GPL");
|
||||
diff --git a/drivers/ps5/ps5-fan.h b/drivers/ps5/ps5-fan.h
|
||||
new file mode 100644
|
||||
index 000000000000..5ea1519823c3
|
||||
--- /dev/null
|
||||
+++ b/drivers/ps5/ps5-fan.h
|
||||
@@ -0,0 +1,53 @@
|
||||
+/* SPDX-License-Identifier: GPL-2.0-only */
|
||||
+#ifndef _PS5_FAN_H
|
||||
+#define _PS5_FAN_H
|
||||
+
|
||||
+#include <linux/ps5.h>
|
||||
+
|
||||
+#define PS5_FAN_MT_MODE_SET 0x02
|
||||
+#define PS5_FAN_MT_MODE_GET 0x03
|
||||
+#define PS5_FAN_MT_CURSET_SET 0x06
|
||||
+#define PS5_FAN_MT_CURSET_GET 0x07
|
||||
+
|
||||
+#define PS5_FAN_CURSET_SET_LEN 0x40
|
||||
+#define PS5_FAN_CURSET_GET_LEN ICC_MSG_MIN_SIZE
|
||||
+
|
||||
+enum ps5_fan_zone {
|
||||
+ PS5_ZONE_MAINSOC = 0,
|
||||
+ PS5_ZONE_LOCAL1 = 1,
|
||||
+ PS5_ZONE_LOCAL2 = 2,
|
||||
+ PS5_ZONE_LOCAL3 = 3,
|
||||
+ PS5_ZONE_COUNT = 4,
|
||||
+};
|
||||
+
|
||||
+enum ps5_fan_mode {
|
||||
+ PS5_FAN_MODE_AUTO = 1,
|
||||
+ PS5_FAN_MODE_MAXIMUM = 2,
|
||||
+ PS5_FAN_MODE_MINIMUM = 3,
|
||||
+ PS5_FAN_MODE_MANUAL = 4,
|
||||
+ PS5_FAN_MODE_SP1 = 5,
|
||||
+};
|
||||
+#define PS5_FAN_MODE_MIN PS5_FAN_MODE_AUTO
|
||||
+#define PS5_FAN_MODE_MAX PS5_FAN_MODE_SP1
|
||||
+
|
||||
+enum ps5_curset_id {
|
||||
+ PS5_CURSET_TARGETTEMP = 0,
|
||||
+ PS5_CURSET_PGAIN = 1,
|
||||
+ PS5_CURSET_IGAIN = 2,
|
||||
+ PS5_CURSET_ILIMIT = 3,
|
||||
+ PS5_CURSET_ULIMIT = 4,
|
||||
+ PS5_CURSET_DLIMIT = 5,
|
||||
+ PS5_CURSET_COUNT = 6,
|
||||
+};
|
||||
+
|
||||
+#define PS5_FAN_ZONE_OFF 0
|
||||
+#define PS5_FAN_MODE_OFF 1
|
||||
+#define PS5_FAN_SETTING_OFF 1
|
||||
+#define PS5_FAN_CONFIG_OFF 1
|
||||
+#define PS5_FAN_CURSET_OFF 0x04
|
||||
+#define PS5_FAN_CURSET_GET_OFF PS5_FAN_CURSET_OFF
|
||||
+#define PS5_FAN_CURSET_SET_OFF PS5_FAN_CURSET_OFF
|
||||
+
|
||||
+#define PS5_TARGETTEMP_SHIFT 8
|
||||
+
|
||||
+#endif /* _PS5_FAN_H */
|
||||
diff --git a/drivers/ps5/spcie.c b/drivers/ps5/spcie.c
|
||||
new file mode 100644
|
||||
index 000000000000..e02c074ee0b1
|
||||
index 000000000000..547b1457ac62
|
||||
--- /dev/null
|
||||
+++ b/drivers/ps5/spcie.c
|
||||
@@ -0,0 +1,1149 @@
|
||||
@@ -0,0 +1,974 @@
|
||||
+// SPDX-License-Identifier: GPL-2.0-only
|
||||
+
|
||||
+#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
|
||||
+
|
||||
+#include <linux/module.h>
|
||||
@@ -7888,7 +8346,6 @@ index 000000000000..e02c074ee0b1
|
||||
+#include <linux/dmi.h>
|
||||
+#include <linux/delay.h>
|
||||
+#include <linux/kfifo.h>
|
||||
+#include "autoservo_param.h"
|
||||
+
|
||||
+#define PCI_DEVICE_ID_SPCIE 0x9107
|
||||
+#define SPCIE_SUBFUNC_ICC 12
|
||||
@@ -7920,24 +8377,6 @@ index 000000000000..e02c074ee0b1
|
||||
+
|
||||
+#define ICC_FAN_CHANGE_SERVO_PATTERN _IOW(ICC_IOC_MAGIC, 1, u8)
|
||||
+
|
||||
+#define GDDR6_SAMSUNG 0x01
|
||||
+#define GDDR6_HYNIX 0x06
|
||||
+#define GDDR6_MICRON 0x0f
|
||||
+
|
||||
+#define BOARD_MASK_A 0xffffffffffffff00
|
||||
+#define BOARD_MASK_B 0xffffffffff00ff00
|
||||
+
|
||||
+#define BOARD_SANCARLO_1 0x2001010104010400
|
||||
+#define BOARD_SANCARLO_2 0x2001010104010500
|
||||
+#define BOARD_A_EIGER_1 0x3002010104010400
|
||||
+#define BOARD_A_EIGER_2 0x3002010104010500
|
||||
+#define BOARD_A_DENALI_1 0x3002010104030400
|
||||
+#define BOARD_A_DENALI_2 0x3002010104030500
|
||||
+#define BOARD_B_EIGER_DENALI_1 0x3002020101000400
|
||||
+#define BOARD_B_EIGER_DENALI_2 0x3002020101000500
|
||||
+#define BOARD_D_EIGER_DENALI_1 0x3002040101000400
|
||||
+#define BOARD_D_EIGER_DENALI_2 0x3002040101000500
|
||||
+
|
||||
+struct spcie_dev;
|
||||
+
|
||||
+struct spcie_icc_dev {
|
||||
@@ -7997,20 +8436,6 @@ index 000000000000..e02c074ee0b1
|
||||
+ 0x00
|
||||
+};
|
||||
+
|
||||
+static void bootparam_get_config_board_id(u64 *board_id)
|
||||
+{
|
||||
+ void __iomem *bootparam = ioremap(0x9b000, 0x2000);
|
||||
+ *board_id = readq(bootparam + 0x328);
|
||||
+ iounmap(bootparam);
|
||||
+}
|
||||
+
|
||||
+static void bootparam_get_config_gddr6_id(u16 *gddr6_id)
|
||||
+{
|
||||
+ void __iomem *bootparam = ioremap(0x9b000, 0x2000);
|
||||
+ *gddr6_id = readw(bootparam + 0x1184);
|
||||
+ iounmap(bootparam);
|
||||
+}
|
||||
+
|
||||
+static u16 icc_checksum(struct icc_msg *msg)
|
||||
+{
|
||||
+ u16 i;
|
||||
@@ -8376,147 +8801,6 @@ index 000000000000..e02c074ee0b1
|
||||
+}
|
||||
+EXPORT_SYMBOL(icc_fan_change_servo_pattern);
|
||||
+
|
||||
+int icc_fan_update_param(const u8 *param)
|
||||
+{
|
||||
+ u8 buf[ICC_MSG_MAX_SIZE] = {};
|
||||
+ struct icc_msg *msg = (struct icc_msg *)buf;
|
||||
+
|
||||
+ msg->service_id = ICC_SERVICE_ID_FAN;
|
||||
+ msg->msg_type = 0xe;
|
||||
+ msg->length = sizeof(*msg) + 0x6ae;
|
||||
+ memcpy(msg->data, param, 0x6ae);
|
||||
+
|
||||
+ return icc_query(buf, buf);
|
||||
+}
|
||||
+EXPORT_SYMBOL(icc_fan_update_param);
|
||||
+
|
||||
+int icc_fan_update_autoservo_param(void)
|
||||
+{
|
||||
+ u64 board_id, board_mask_a, board_mask_b;
|
||||
+ u16 gddr6_id;
|
||||
+ u8 gddr6_vendor, gddr6_revision;
|
||||
+ const char *board_name = NULL;
|
||||
+ const char *gddr6_name = NULL;
|
||||
+ const u8 *param = NULL;
|
||||
+ int ret;
|
||||
+
|
||||
+ bootparam_get_config_board_id(&board_id);
|
||||
+ board_id = be64_to_cpu(board_id);
|
||||
+ board_mask_a = board_id & BOARD_MASK_A;
|
||||
+ board_mask_b = board_id & BOARD_MASK_B;
|
||||
+
|
||||
+ bootparam_get_config_gddr6_id(&gddr6_id);
|
||||
+ gddr6_vendor = gddr6_id & 0xf;
|
||||
+ gddr6_revision = gddr6_id >> 4;
|
||||
+
|
||||
+ if (board_mask_a == BOARD_SANCARLO_1 || board_mask_a == BOARD_SANCARLO_2) {
|
||||
+ board_name = "Sancarlo";
|
||||
+ param = autoservo_param_sancarlo;
|
||||
+ } else if (board_mask_a == BOARD_A_EIGER_1 || board_mask_a == BOARD_A_EIGER_2) {
|
||||
+ board_name = "A-Eiger";
|
||||
+ switch (gddr6_vendor) {
|
||||
+ case GDDR6_SAMSUNG:
|
||||
+ gddr6_name = "Samsung";
|
||||
+ param = autoservo_param_a_eiger_samsung;
|
||||
+ break;
|
||||
+ case GDDR6_HYNIX:
|
||||
+ gddr6_name = "Hynix";
|
||||
+ param = autoservo_param_a_eiger_hynix;
|
||||
+ break;
|
||||
+ case GDDR6_MICRON:
|
||||
+ gddr6_name = "Micron";
|
||||
+ param = autoservo_param_a_eiger_micron;
|
||||
+ break;
|
||||
+ default:
|
||||
+ pr_info("FanServo: %s Unknown Vendor 0x%x\n", board_name, gddr6_vendor);
|
||||
+ goto not_updated;
|
||||
+ }
|
||||
+ } else if (board_mask_a == BOARD_A_DENALI_1 || board_mask_a == BOARD_A_DENALI_2) {
|
||||
+ board_name = "A-Denali";
|
||||
+ switch (gddr6_vendor) {
|
||||
+ case GDDR6_SAMSUNG:
|
||||
+ gddr6_name = "Samsung";
|
||||
+ param = autoservo_param_a_denali_samsung;
|
||||
+ break;
|
||||
+ case GDDR6_HYNIX:
|
||||
+ gddr6_name = "Hynix";
|
||||
+ param = autoservo_param_a_denali_hynix;
|
||||
+ break;
|
||||
+ case GDDR6_MICRON:
|
||||
+ gddr6_name = "Micron";
|
||||
+ param = autoservo_param_a_denali_micron;
|
||||
+ break;
|
||||
+ default:
|
||||
+ pr_info("FanServo: %s Unknown Vendor 0x%x\n", board_name, gddr6_vendor);
|
||||
+ goto not_updated;
|
||||
+ }
|
||||
+ } else if (board_mask_b == BOARD_B_EIGER_DENALI_1 || board_mask_b == BOARD_B_EIGER_DENALI_2) {
|
||||
+ board_name = "B-Eiger/Denali";
|
||||
+ if (gddr6_vendor == GDDR6_SAMSUNG && gddr6_revision == 8) {
|
||||
+ gddr6_name = "Samsung D1x";
|
||||
+ param = autoservo_param_b_eiger_denali_samsung_d1x;
|
||||
+ } else if (gddr6_vendor == GDDR6_SAMSUNG && gddr6_revision == 9) {
|
||||
+ gddr6_name = "Samsung D1z";
|
||||
+ param = NULL;
|
||||
+ } else if (gddr6_vendor == GDDR6_HYNIX && gddr6_revision == 0) {
|
||||
+ gddr6_name = "Hynix 1x";
|
||||
+ param = autoservo_param_b_eiger_denali_hynix_1x_micron_120s;
|
||||
+ } else if (gddr6_vendor == GDDR6_HYNIX && gddr6_revision == 1) {
|
||||
+ gddr6_name = "Hynix 1y";
|
||||
+ param = autoservo_param_b_eiger_denali_hynix_1y_micron_130s;
|
||||
+ } else if (gddr6_vendor == GDDR6_MICRON && gddr6_revision == 0) {
|
||||
+ gddr6_name = "Micron 120s";
|
||||
+ param = autoservo_param_b_eiger_denali_hynix_1x_micron_120s;
|
||||
+ } else if (gddr6_vendor == GDDR6_MICRON && gddr6_revision == 1) {
|
||||
+ gddr6_name = "Micron 130s";
|
||||
+ param = autoservo_param_b_eiger_denali_hynix_1y_micron_130s;
|
||||
+ } else {
|
||||
+ pr_info("FanServo: %s Unknown Vendor/Revision 0x%x/0x%x\n", board_name, gddr6_vendor, gddr6_revision);
|
||||
+ goto not_updated;
|
||||
+ }
|
||||
+ } else if (board_mask_b == BOARD_D_EIGER_DENALI_1 || board_mask_b == BOARD_D_EIGER_DENALI_2) {
|
||||
+ board_name = "D-Eiger/Denali";
|
||||
+ if (gddr6_vendor == GDDR6_SAMSUNG && gddr6_revision == 9) {
|
||||
+ gddr6_name = "Samsung D1z";
|
||||
+ param = autoservo_param_d_eiger_denali_samsung_d1z;
|
||||
+ } else if (gddr6_vendor == GDDR6_HYNIX && gddr6_revision == 1) {
|
||||
+ gddr6_name = "Hynix 1y";
|
||||
+ param = autoservo_param_d_eiger_denali_hynix_1y;
|
||||
+ } else if (gddr6_vendor == GDDR6_MICRON && gddr6_revision == 1) {
|
||||
+ gddr6_name = "Micron 130s";
|
||||
+ param = autoservo_param_d_eiger_denali_micron_130s_y31j;
|
||||
+ } else if (gddr6_vendor == GDDR6_MICRON && gddr6_revision == 2) {
|
||||
+ gddr6_name = "Micron Y31J";
|
||||
+ param = autoservo_param_d_eiger_denali_micron_130s_y31j;
|
||||
+ } else {
|
||||
+ pr_info("FanServo: %s Unknown Vendor/Revision 0x%x/0x%x\n", board_name, gddr6_vendor, gddr6_revision);
|
||||
+ goto not_updated;
|
||||
+ }
|
||||
+ } else {
|
||||
+ pr_info("FanServo: 0x%016llX\n", board_id);
|
||||
+ goto not_updated;
|
||||
+ }
|
||||
+
|
||||
+ if (gddr6_name)
|
||||
+ pr_info("FanServo: %s %s\n", board_name, gddr6_name);
|
||||
+ else
|
||||
+ pr_info("FanServo: %s\n", board_name);
|
||||
+
|
||||
+ if (!param)
|
||||
+ goto not_updated;
|
||||
+
|
||||
+ ret = icc_fan_update_param(param);
|
||||
+ if (ret)
|
||||
+ pr_err("Error: %s: %d\n", __func__, ret);
|
||||
+
|
||||
+ return ret;
|
||||
+
|
||||
+not_updated:
|
||||
+ pr_info("FanServo: Not update\n");
|
||||
+ return 0;
|
||||
+}
|
||||
+EXPORT_SYMBOL(icc_fan_update_autoservo_param);
|
||||
+
|
||||
+static void button_notification_handler(struct icc_msg *msg)
|
||||
+{
|
||||
+ if (msg->msg_type == 0x8010) { // power button down
|
||||
@@ -8709,9 +8993,6 @@ index 000000000000..e02c074ee0b1
|
||||
+ icc_button_enable_all_notifications(1);
|
||||
+ icc_thermal_enable_notification(1);
|
||||
+
|
||||
+ /* Update autoservo param */
|
||||
+ icc_fan_update_autoservo_param();
|
||||
+
|
||||
+ /* Set LED to white dim */
|
||||
+ icc_indicator_set_led_white(0);
|
||||
+
|
||||
@@ -9029,10 +9310,12 @@ index 000000000000..e02c074ee0b1
|
||||
+MODULE_LICENSE("GPL");
|
||||
diff --git a/drivers/ps5/svm.c b/drivers/ps5/svm.c
|
||||
new file mode 100644
|
||||
index 000000000000..3fd58e9a6609
|
||||
index 000000000000..b9e7def39ef7
|
||||
--- /dev/null
|
||||
+++ b/drivers/ps5/svm.c
|
||||
@@ -0,0 +1,169 @@
|
||||
@@ -0,0 +1,171 @@
|
||||
+// SPDX-License-Identifier: GPL-2.0-only
|
||||
+
|
||||
+#include <linux/module.h>
|
||||
+#include <linux/ps5.h>
|
||||
+
|
||||
@@ -9204,10 +9487,12 @@ index 000000000000..3fd58e9a6609
|
||||
+EXPORT_SYMBOL(svm_execute_guest);
|
||||
diff --git a/drivers/ps5/tpcie.c b/drivers/ps5/tpcie.c
|
||||
new file mode 100644
|
||||
index 000000000000..23de43ea4b00
|
||||
index 000000000000..7e933c30fc3e
|
||||
--- /dev/null
|
||||
+++ b/drivers/ps5/tpcie.c
|
||||
@@ -0,0 +1,303 @@
|
||||
@@ -0,0 +1,305 @@
|
||||
+// SPDX-License-Identifier: GPL-2.0-only
|
||||
+
|
||||
+#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
|
||||
+
|
||||
+#include <linux/console.h>
|
||||
@@ -9513,10 +9798,12 @@ index 000000000000..23de43ea4b00
|
||||
+MODULE_LICENSE("GPL");
|
||||
diff --git a/drivers/ps5/vmenter.S b/drivers/ps5/vmenter.S
|
||||
new file mode 100644
|
||||
index 000000000000..f5348c0d7e82
|
||||
index 000000000000..e3fd6f3e59b6
|
||||
--- /dev/null
|
||||
+++ b/drivers/ps5/vmenter.S
|
||||
@@ -0,0 +1,30 @@
|
||||
@@ -0,0 +1,32 @@
|
||||
+/* SPDX-License-Identifier: GPL-2.0-only */
|
||||
+
|
||||
+#include <linux/linkage.h>
|
||||
+#include <asm/asm.h>
|
||||
+
|
||||
@@ -10296,10 +10583,12 @@ index c8700e6a694d..7d0afd378c4e 100644
|
||||
extern void dmi_setup(void);
|
||||
diff --git a/include/linux/ps5.h b/include/linux/ps5.h
|
||||
new file mode 100644
|
||||
index 000000000000..24adcd953ab3
|
||||
index 000000000000..75a2d6dace5d
|
||||
--- /dev/null
|
||||
+++ b/include/linux/ps5.h
|
||||
@@ -0,0 +1,95 @@
|
||||
@@ -0,0 +1,97 @@
|
||||
+/* SPDX-License-Identifier: GPL-2.0-only */
|
||||
+
|
||||
+#ifndef _LINUX_PS5_H
|
||||
+#define _LINUX_PS5_H
|
||||
+
|
||||
|
||||
Reference in New Issue
Block a user